wok annotate linld/stuff/src/CRTL.ASM @ rev 20630

Up firefox-official (64.0), again
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Jan 03 12:04:23 2019 +0100 (2019-01-03)
parents cb4579b9835b
children ab907169f156
rev   line source
pascal@19515 1 ;***************************************************************
pascal@19515 2 ;****** This file is distributed under GPL
pascal@19515 3 ;***************************************************************
pascal@19515 4 ideal
pascal@19515 5 %crefref
pascal@19515 6 %noincl
pascal@19515 7 %nomacs
pascal@19636 8 ifdef NO386
pascal@19636 9 p8086
pascal@19636 10 else
pascal@19515 11 p386
pascal@19636 12 endif
pascal@19515 13
pascal@19515 14 group DGROUP _TEXT,_DATA,_BSS
pascal@19515 15 assume cs:DGROUP,ds:DGROUP
pascal@19515 16
pascal@19515 17 segment _DATA byte public use16 'DATA'
pascal@19515 18
pascal@20451 19 global _heap_top
pascal@20451 20 extrn _bss_end
pascal@19546 21 _heap_top dw _bss_end
pascal@19546 22 msg_hang db "High mem corrupted - not exiting to DOS"
pascal@20527 23 msg_lf db 10,0
pascal@20451 24 vcpi_alloc_err db "VCPI "
pascal@20451 25 msg_malloc db "malloc error",0
pascal@19825 26 ifdef EXTRA
pascal@19825 27 tazboot_cmd db "tazboot.cmd",0
pascal@19825 28 endif
pascal@19515 29
pascal@19515 30 ends _DATA
pascal@19515 31
pascal@19515 32 segment _BSS byte public use16 'BSS'
pascal@19515 33
pascal@20538 34 _xfer_buf db 4096 dup (?)
pascal@19515 35 global _no_exit:byte
pascal@19515 36 _no_exit db ?
pascal@19515 37 filecnt db ? ; in fact 0 minus file count...
pascal@19515 38 nextfilename dw ?
pascal@19571 39 ifdef LARGE_IMAGES
pascal@19571 40 curdata dw ?
pascal@19571 41 endif
pascal@19825 42 ifdef EXTRA
pascal@19825 43 ultoabuf db 12 dup (?)
pascal@19825 44 endif
pascal@19515 45
pascal@19515 46 ends _BSS
pascal@19515 47
pascal@19515 48 segment _TEXT byte public use16 'CODE'
pascal@19515 49
pascal@19515 50 ;***************************************************************
pascal@20630 51 ;_fastcall void strcpy(bx:const char* a, ax:const char* b);
pascal@20630 52 ;_fastcall void strcat(bx:const char* a, ax:const char* b);
pascal@20630 53 ;_fastcall void strcatb(bx:const char* a, ax:const char* b);
pascal@19538 54 ;***************************************************************
pascal@20528 55 global @strcatb$qpxzct1:near
pascal@20528 56 proc @strcatb$qpxzct1 near
pascal@19538 57
pascal@19826 58 ifdef EXTRA
pascal@20142 59 mov cl,7Fh
pascal@20539 60 db 0bah ; mov dx,imm opcode
pascal@20528 61 global @strcat$qpxzct1:near
pascal@20528 62 @strcat$qpxzct1:
pascal@20142 63 mov cl,80h
pascal@20539 64 db 0bah ; mov dx,imm opcode
pascal@20528 65 global @strcpy$qpxzct1:near
pascal@20528 66 @strcpy$qpxzct1:
pascal@20142 67 xor cx,cx
pascal@19826 68 endif
pascal@19538 69 push si
pascal@20630 70 xchg ax,bx ; b
pascal@20630 71 xchg ax,si ; a
pascal@19826 72 ifdef EXTRA
pascal@20142 73 jcxz @@nocat
pascal@19826 74 endif
pascal@19538 75 @@catlp:
pascal@20630 76 lodsb ; a=si
pascal@20527 77 or al,al
pascal@19538 78 jne @@catlp
pascal@19538 79 dec si
pascal@19826 80 ifdef EXTRA
pascal@20630 81 cmp bx,si
pascal@20630 82 adc al,cl ; set S when bx != si or cl = 80
pascal@20142 83 mov al,20h
pascal@20142 84 jns @@cpyhead
pascal@19826 85 endif
pascal@19538 86 @@nocat:
pascal@19538 87 @@cpylp:
pascal@20142 88 mov al,[bx]
pascal@20142 89 inc bx
pascal@20142 90 @@cpyhead:
pascal@19538 91 mov [si],al
pascal@19538 92 inc si
pascal@20527 93 or al,al
pascal@19538 94 jne @@cpylp
pascal@20142 95 strfound:
pascal@20142 96 xchg ax,dx
pascal@20142 97 strend:
pascal@19538 98 pop si
pascal@20142 99 ret
pascal@19538 100
pascal@20528 101 endp @strcatb$qpxzct1
pascal@19538 102
pascal@19538 103
pascal@20146 104 ifdef EXTRA
pascal@20146 105 p8086
pascal@20146 106 ;***************************************************************
pascal@20630 107 ;_fastcall char strstr(bx:const char* a, ax:const char* b);
pascal@20146 108 ;***************************************************************
pascal@20528 109 global @strstr$qpxzct1:near
pascal@20528 110 proc @strstr$qpxzct1 near
pascal@20146 111
pascal@20538 112 xchg ax,cx ; b
pascal@20538 113 mov dx,bx ; a
pascal@20146 114 push si
pascal@20146 115 @@loop:
pascal@20146 116 xor ax,ax
pascal@20146 117 mov si,dx
pascal@20146 118 cmp [si],al ; *a
pascal@20146 119 jz strend ; return ax = NULL
pascal@20146 120 mov bx,cx
pascal@20146 121 @@match:
pascal@20146 122 or ah,[bx] ; *b
pascal@20146 123 jz strfound
pascal@20146 124 inc bx
pascal@20146 125 lodsb
pascal@20146 126 sub ah,al
pascal@20146 127 jz @@match
pascal@20146 128 inc dx
pascal@20146 129 jmp @@loop
pascal@20146 130
pascal@20528 131 endp @strstr$qpxzct1
pascal@20146 132
pascal@20146 133
pascal@20146 134 ;***************************************************************
pascal@20630 135 ;_fastcall int strcmp(bx:const char* a, ax:const char* b);
pascal@20146 136 ;***************************************************************
pascal@20528 137 global @strcmp$qpxzct1:near
pascal@20528 138 proc @strcmp$qpxzct1 near
pascal@20146 139
pascal@20146 140 push si
pascal@20146 141 xchg ax,si
pascal@20146 142 dec bx
pascal@20146 143 @@lp:
pascal@20146 144 inc bx
pascal@20146 145 lodsb
pascal@20146 146 sub al,[bx]
pascal@20146 147 jnz @@out
pascal@20630 148 or al,[bx]
pascal@20146 149 jnz @@lp
pascal@20146 150 @@out:
pascal@20146 151 cbw
pascal@20146 152 pop si
pascal@20146 153 ret
pascal@20146 154
pascal@20528 155 endp @strcmp$qpxzct1
pascal@20146 156 endif
pascal@20146 157
pascal@20146 158
pascal@19538 159 ;***************************************************************
pascal@20630 160 ;_fastcall void puts(bx:const char* s):
pascal@19515 161 ;***************************************************************
pascal@20528 162 global @puts$qpxzc:near
pascal@20528 163 proc @puts$qpxzc near
pascal@19515 164
pascal@20486 165 ; global puts:near ; puts(bx)
pascal@19515 166 puts:
pascal@20510 167 call @@putsz
pascal@20527 168 mov bx,offset msg_lf
pascal@20527 169 mov dl,13
pascal@20510 170 @@putcz:
pascal@20160 171 mov ah,2
pascal@20146 172 int 21h
pascal@20510 173 @@putsz:
pascal@20160 174 mov dl,[bx]
pascal@20146 175 inc bx
pascal@20160 176 or dl,dl
pascal@20510 177 jne @@putcz ; ZF=1 (for malloc failure)
pascal@19538 178 ret
pascal@19515 179
pascal@20528 180 endp @puts$qpxzc
pascal@19515 181
pascal@19515 182
pascal@19515 183 ;***************************************************************
pascal@20630 184 ;_fastcall int fileattr(bx:const char* name);
pascal@19538 185 ;***************************************************************
pascal@20528 186 global @fileattr$qpxzc:near
pascal@20528 187 proc @fileattr$qpxzc near
pascal@19538 188
pascal@19538 189 mov ax,4300h
pascal@20538 190 call dos_filename
pascal@19538 191 xchg ax,cx
pascal@19538 192 jmp chkc
pascal@19538 193
pascal@20528 194 endp @fileattr$qpxzc
pascal@19538 195
pascal@19538 196
pascal@19538 197 ;***************************************************************
pascal@20630 198 ;_fastcall int open(bx:const char* name, int flags=O_RDONLY);
pascal@19515 199 ;***************************************************************
pascal@20538 200 global openargs:near ; openargs(bx)
pascal@20538 201 openargs:
pascal@20538 202 cmp [byte bx],'@'
pascal@20538 203 stc
pascal@20538 204 jne fail
pascal@20538 205 inc bx
pascal@20538 206
pascal@20528 207 global @open$qpxzc:near
pascal@20528 208 proc @open$qpxzc near
pascal@19515 209
pascal@19546 210 global open:near ; open(bx)
pascal@19515 211 open:
pascal@20630 212 ifdef LONG_FILENAME
pascal@20630 213 mov ax,716Ch
pascal@20630 214 push bx si di
pascal@20630 215 mov di,di ; alias hint
pascal@20630 216 mov si,bx
pascal@20630 217 xor bx,bx ; R/O
pascal@20630 218 xor cx,cx ; attributes
pascal@20630 219 cwd ; action = open
pascal@20630 220 int 21h
pascal@20630 221 pop di si bx
pascal@20630 222 jnc doret
pascal@20630 223 endif
pascal@20538 224 mov ax,3d00h ; read-only+compatibility
pascal@20538 225 ;mov cl,0 ; attribute mask
pascal@20538 226 dos_filename:
pascal@19515 227 mov dx,bx
pascal@19515 228 dos:
pascal@19515 229 int 21h
pascal@19538 230 chkc:
pascal@19515 231 jnc doret
pascal@19515 232 fail:
pascal@19515 233 sbb ax,ax ; ax=-1 CF
pascal@19515 234 cwd
pascal@19515 235 doret:
pascal@19515 236 ifndef NO386
pascal@19538 237 push dx ; see next_chunk:lseek
pascal@19538 238 push ax
pascal@19538 239 pop eax
pascal@19515 240 endif
pascal@19515 241 ret
pascal@19515 242
pascal@20528 243 endp @open$qpxzc
pascal@19515 244
pascal@19515 245
pascal@19515 246 ;***************************************************************
pascal@20630 247 ;_fastcall int close(ax:int fd);
pascal@19515 248 ;***************************************************************
pascal@20528 249 global @close$qi:near
pascal@20528 250 proc @close$qi near
pascal@19515 251
pascal@20540 252 global close:near ; close(ax)
pascal@19515 253 close:
pascal@20540 254 xchg ax,bx
pascal@19515 255 mov ah,3Eh
pascal@19515 256 or bx,bx
pascal@19515 257 jnz dos
pascal@19515 258 ret
pascal@19515 259
pascal@20528 260 endp @close$qi
pascal@19515 261
pascal@19515 262
pascal@19515 263 ;***************************************************************
pascal@20630 264 ;_fastcall int read(ax:int fd, bx:void* data, dx:int sz);
pascal@20630 265 ;_fastcall int write(ax:int fd, bx:const void* data, dx:int sz);
pascal@19515 266 ;***************************************************************
pascal@20528 267 global @read$qipvi:near
pascal@20528 268 proc @read$qipvi near
pascal@19515 269
pascal@20146 270 ifdef WRITE
pascal@19580 271 stc
pascal@19634 272 db 0B0h ; mov al,im
pascal@20528 273 global @write$qipvi:near
pascal@20528 274 @write$qipvi:
pascal@19580 275 clc
pascal@20146 276 endif
pascal@20538 277 xchg ax,bx ; fd
pascal@20538 278 xchg ax,dx ; data
pascal@20538 279 xchg ax,cx ; sz
pascal@20146 280 ifdef WRITE
pascal@19580 281 mov ah,40h
pascal@19580 282 sbb ah,0
pascal@20146 283 else
pascal@20528 284 global @read$cxdxbx:near
pascal@20528 285 @read$cxdxbx:
pascal@20146 286 mov ah,3Fh
pascal@20146 287 endif
pascal@19515 288 jcxz fail
pascal@19515 289 jmp dos
pascal@19515 290
pascal@20528 291 endp @read$qipvi
pascal@19515 292
pascal@19515 293 ;***************************************************************
pascal@20630 294 ;_fastcall long lseekset(ax:int fd, dx:unsigned whence);
pascal@20630 295 ;_fastcall long lseekcur(ax:int fd, dx:int whence);
pascal@19515 296 ;***************************************************************
pascal@19899 297
pascal@20548 298 global @lseekcur$qii:near ; fd=ax whence=dx
pascal@20542 299 proc @lseekcur$qii near
pascal@20542 300
pascal@20542 301 xchg ax,bx
pascal@20542 302 xchg ax,dx
pascal@20542 303 cwd
pascal@20542 304 xchg ax,dx
pascal@20542 305 xchg ax,cx
pascal@20542 306 mov al,1
pascal@20542 307 jmp lseek
pascal@20542 308 ifdef EXTRA
pascal@20538 309 global @lseekset$qiui:near
pascal@20542 310 @lseekset$qiui:
pascal@20542 311 mov bl,0
pascal@20542 312 jmp lseek0x
pascal@19571 313 lseekset:
pascal@20542 314 mov bl,0
pascal@20542 315 jmp lseekx
pascal@20542 316 endif
pascal@20542 317 rewind: ; rewind(ax)
pascal@20542 318 mov bl,0
pascal@19571 319 lseek0: ; lseek0(bx,ax=dir)
pascal@20542 320 xor dx,dx
pascal@20542 321 lseek0x:
pascal@19571 322 xor cx,cx
pascal@20542 323 lseekx:
pascal@20542 324 xchg ax,bx
pascal@20542 325 lseek:
pascal@20548 326 mov ah,42h ; bx=fd cx:dx=offset al=whence
pascal@19515 327 jmp dos
pascal@19515 328
pascal@20542 329 endp @lseekcur$qii
pascal@19825 330
pascal@20538 331 ifdef EXTRA
pascal@20538 332
pascal@20534 333 ;typedef unsigned dirsizetype;
pascal@20534 334 struc isostate ; struct isostate {
pascal@20534 335 fd dw ? ; 0 int fd;
pascal@20534 336 filemod dw ? ; 2 unsigned short filemod;
pascal@20534 337 fileofs dd ? ; 4 unsigned long fileofs;
pascal@20534 338 filesize dd ? ; 8 unsigned long filesize;
pascal@20534 339 filename dw ? ;12 char *filename;
pascal@20534 340 curdirsize dw ? ;14 dirsizetype curdirsize;
pascal@20534 341 dirsize dw ? ;16 dirsizetype dirsize;
pascal@20534 342 curdirofs dd ? ;18 unsigned long curdirofs;
pascal@20534 343 dirofs dd ? ;22 unsigned long dirofs;
pascal@20534 344 curpos dw ? ;26 unsigned curpos;
pascal@20534 345 buffer db 2560 dup(?) ;28 char buffer[2048+512];
pascal@20534 346 ends ; } isostate;
pascal@19825 347 ;***************************************************************
pascal@20630 348 ;_fastcall long isolseek(bx:const unsigned long *offset);
pascal@19825 349 ;***************************************************************
pascal@20528 350 global @isolseek$qpxul:near
pascal@20528 351 proc @isolseek$qpxul near
pascal@19825 352
pascal@20534 353 isolseek:
pascal@19825 354 mov dx,[bx]
pascal@19825 355 mov cx,[bx+2]
pascal@19825 356 extrn _isostate:isostate
pascal@20548 357 mov ax,[_isostate.fd]
pascal@20538 358 jmp lseekset
pascal@20534 359
pascal@20538 360 endp @isolseek$qpxul
pascal@20534 361
pascal@20534 362 ;***************************************************************
pascal@20630 363 ;_fastcall int isoreadsector(bx:const unsigned long *offset);
pascal@20534 364 ;***************************************************************
pascal@20534 365 global @isoreadsector$qpxul:near
pascal@20534 366 proc @isoreadsector$qpxul near
pascal@20534 367
pascal@20534 368 call isolseek
pascal@20528 369 and ax,dx
pascal@20528 370 inc ax
pascal@20534 371 jz @@fail
pascal@20534 372 mov cx,2560
pascal@20534 373 mov dx,offset _isostate.buffer
pascal@20534 374 mov bx,[_isostate.fd]
pascal@20534 375 call @read$cxdxbx ; read(fd,buffer,2560)
pascal@20534 376 @@fail:
pascal@20534 377 cmp ax,2048
pascal@20534 378 sbb ax,ax
pascal@20528 379 ret
pascal@20534 380
pascal@20534 381 endp @isoreadsector$qpxul
pascal@20534 382
pascal@19825 383 endif
pascal@19515 384
pascal@19515 385
pascal@19515 386 ;***************************************************************
pascal@20630 387 ;_fastcall int strhead(bx:const char* a, ax:const char* b);
pascal@19515 388 ;***************************************************************
pascal@20528 389 global @strhead$qpxzct1:near
pascal@20528 390 proc @strhead$qpxzct1 near
pascal@19515 391
pascal@19515 392 @@loop:
pascal@19634 393 xchg ax,bx
pascal@19515 394 mov cl,[bx] ; cl = *b++
pascal@19515 395 inc bx
pascal@19515 396 or cl,cl ; clear C
pascal@19515 397 jz fail ; return 0
pascal@19515 398 xchg ax,bx
pascal@19515 399 xor cl,[bx] ; cl -= *a++
pascal@19634 400 inc bx
pascal@19515 401 and cl,0dfh ; case insensitive
pascal@19634 402 jz @@loop
pascal@19634 403 ret ; return b (is not 0)
pascal@19515 404
pascal@20528 405 endp @strhead$qpxzct1
pascal@19515 406
pascal@19515 407
pascal@19515 408 ;***************************************************************
pascal@20630 409 ;_fastcall char* malloc_or_die(ax:unsigned size);
pascal@19515 410 ;***************************************************************
pascal@20528 411 global @malloc_or_die$qui:near
pascal@20528 412 proc @malloc_or_die$qui near
pascal@19515 413
pascal@20540 414 xchg ax,cx ; size
pascal@19515 415 global malloc_or_die:near ; malloc_or_die(cx)
pascal@19515 416 malloc_or_die:
pascal@20510 417 mov ax,[_heap_top] ; return value
pascal@20510 418 mov bx,sp
pascal@20510 419 add bh,-14h ; MIN_STACK=_1k+PAGE_SIZE
pascal@20510 420 sub bx,ax ; can't overflow
pascal@20510 421 cmp bx,cx
pascal@20456 422 mov bx,offset msg_malloc
pascal@20510 423 jb die
pascal@20510 424 add [_heap_top],cx ; _BEG has zero'd heap
pascal@19515 425 ret
pascal@19515 426
pascal@20528 427 endp @malloc_or_die$qui
pascal@19515 428
pascal@19515 429
pascal@19515 430 ;***************************************************************
pascal@20630 431 ;_fastcall int die(bx:const char* msg);
pascal@19538 432 ;int exit();
pascal@19515 433 ;int abort();
pascal@19515 434 ;***************************************************************
pascal@20528 435 global @die$qpxzc:near
pascal@20528 436 proc @die$qpxzc near
pascal@20528 437 @die$qpxzc:
pascal@19515 438 global die:near ; die(bx)
pascal@19515 439 die:
pascal@19515 440 call puts
pascal@20486 441 ; global _exit:near
pascal@19538 442 _exit:
pascal@19515 443 mov al,[_no_exit]
pascal@20527 444 or al,al
pascal@19515 445 jne @@hang
pascal@19515 446 extrn exit:near
pascal@19515 447 inc ax
pascal@19515 448 jmp near exit
pascal@19515 449 @@hang:
pascal@19515 450 mov bx, offset msg_hang
pascal@19515 451 call puts
pascal@20486 452 ; global _abort:near
pascal@19515 453 _abort:
pascal@19515 454 cli
pascal@19515 455 @@stop:
pascal@19515 456 hlt
pascal@19515 457 jmp @@stop
pascal@19515 458
pascal@20528 459 endp @die$qpxzc
pascal@19515 460
pascal@19546 461 struc image_himem ;struct image_himem {
pascal@19546 462 fd dw ? ; 0 int fd;
pascal@19546 463 fallback dd ? ; 2 u32 fallback;
pascal@19546 464 size dd ? ; 6 u32 size;
pascal@19546 465 remaining dd ? ;10 u32 remaining;
pascal@19546 466 buf dd ? ;14 u32 buf;
pascal@19546 467 bufv dw ? ;18 u32 *bufv;
pascal@19546 468 errmsg dw ? ;20 char *errmsg;
pascal@19546 469 chunk_size dd ? ;22 u32 chunk_size;
pascal@19546 470 next_chunk dw ? ;26 void (*next_chunk)(struct image_himem *);
pascal@19546 471 state dw ? ;28 u16 state;
pascal@19546 472 fd2close dw ? ;30 u16 fd2close;
pascal@19546 473 ends ;};
pascal@19515 474
pascal@19636 475 ;***************************************************************
pascal@20630 476 ;static long next_chunk(struct image_himem *di);
pascal@19636 477 ;***************************************************************
pascal@19636 478 proc next_chunk near
pascal@19636 479
pascal@19636 480 push si
pascal@20540 481 mov ax,[(image_himem di).fd]
pascal@19636 482 call close
pascal@19636 483 ifndef NO386
pascal@19636 484 xor eax,eax
pascal@19636 485 else
pascal@19636 486 xor ax,ax
pascal@20485 487 cwd
pascal@19636 488 endif
pascal@19636 489 mov [(image_himem di).fd],ax
pascal@19636 490 mov bx,[(image_himem di).state]
pascal@19636 491 cmp al,[bx] ; ""
pascal@19636 492 jz @@end
pascal@19636 493 mov si,bx
pascal@19636 494 @@scan:
pascal@19636 495 lodsb
pascal@19636 496 mov cx,si
pascal@19636 497 cmp al,','
pascal@19636 498 jz @@eos
pascal@20527 499 or al,al
pascal@19636 500 jnz @@scan
pascal@19636 501 dec cx
pascal@19636 502 @@eos:
pascal@19636 503 mov [(image_himem di).state],cx
pascal@19636 504 dec si
pascal@19636 505 push [word si]
pascal@20485 506 mov [byte si],ah ; set temp eos
pascal@19636 507 call open
pascal@19636 508 pop [word si] ; restore string
pascal@19636 509 jc @@die
pascal@19636 510 mov [(image_himem di).fd],ax
pascal@19636 511 mov [(image_himem di).fd2close],ax
pascal@20542 512 mov bl,02h ; SEEK_END
pascal@19636 513 call lseek0
pascal@19636 514 @@die:
pascal@19636 515 mov bx,[(image_himem di).errmsg]
pascal@19636 516 jc die
pascal@19636 517 ifndef NO386
pascal@19636 518 push eax
pascal@20548 519 mov ax,[(image_himem di).fd]
pascal@19636 520 call rewind
pascal@19636 521 pop eax
pascal@19636 522 @@end:
pascal@19636 523 mov [(image_himem di).chunk_size],eax
pascal@19636 524 else
pascal@19636 525 push ax
pascal@19636 526 push dx
pascal@20548 527 mov ax,[(image_himem di).fd]
pascal@19636 528 call rewind
pascal@19636 529 pop dx
pascal@19636 530 pop ax
pascal@19636 531 @@end:
pascal@19636 532 mov [word (image_himem di).chunk_size],ax
pascal@19636 533 mov [word ((image_himem di).chunk_size)+2],dx
pascal@19636 534 endif
pascal@19636 535 pop si
pascal@19636 536 ret
pascal@19636 537
pascal@19636 538 endp next_chunk
pascal@19636 539
pascal@19636 540
pascal@19571 541 ifdef LARGE_IMAGES
pascal@19571 542 struc data_himem ;struct data_himem {
pascal@19571 543 first dd ? ; 0 u32 first;
pascal@19571 544 cacheidx dw ? ; 4 int cacheidx;
pascal@19571 545 pageidx dw ? ; 6 int pageidx;
pascal@19571 546 cache dd 1024 dup(?) ; 8 int cache;
pascal@19571 547 page dd 1024 dup(?) ;4104 int page;
pascal@19571 548 ends ;}; // size=8200
pascal@19571 549 endif
pascal@19571 550
pascal@19515 551 ;***************************************************************
pascal@20630 552 ;_fastcall u32* malloc_bufv_or_die(bx:struct image_himem *m);
pascal@19538 553 ;***************************************************************
pascal@20528 554 global @malloc_bufv_or_die$qp11image_himem:near
pascal@20528 555 proc @malloc_bufv_or_die$qp11image_himem near
pascal@19538 556
pascal@19636 557 p386
pascal@19538 558 push si
pascal@20538 559 mov si,bx
pascal@19571 560 ifdef LARGE_IMAGES
pascal@20527 561 movzx ecx,[word ((image_himem si).size) + 2]
pascal@19571 562 shr cx,4 ; pages index size = size >> 20
pascal@19571 563 add cx,8+4096+8
pascal@19571 564 call malloc_or_die
pascal@20527 565 mov cx,4096+4095 ; cnt = 1+(m->size+PAGE_MASK)/PAGE_SIZE;
pascal@19571 566 add ecx,[(image_himem si).size]
pascal@19571 567 shr ecx,12
pascal@19571 568 mov [curdata],ax
pascal@19571 569 else
pascal@19546 570 mov ecx,[(image_himem si).size]
pascal@19538 571 dec ecx
pascal@19538 572 shr ecx,12
pascal@19538 573 inc cx ; cnt = (m->size+PAGE_MASK)/PAGE_SIZE;
pascal@19538 574 push cx
pascal@19538 575 inc cx ; cnt+1
pascal@19538 576 shl cx,2 ; bufv => vcpi => vm86
pascal@19538 577 ; our malloc zeroes allocated mem: bufv[cnt]=0;
pascal@19538 578 ; Allocate pages, storing addrs in addrbuf
pascal@19538 579 call malloc_or_die
pascal@19571 580 pop cx
pascal@19571 581 push ax
pascal@19571 582 endif
pascal@19546 583 mov [(image_himem si).bufv],ax
pascal@19571 584 xchg ax,si
pascal@19538 585 @@vcpi_alloc:
pascal@19538 586 xor edx,edx
pascal@19538 587 mov ax,0DE04h
pascal@19538 588 int 67h
pascal@19538 589 or ah,ah
pascal@19538 590 mov bx,offset vcpi_alloc_err
pascal@19571 591 jnz die
pascal@19571 592 ; for (i = cnt-1; i >= 0; i--)
pascal@19571 593 ifdef LARGE_IMAGES
pascal@19571 594 mov eax,ecx
pascal@19571 595 dec eax
pascal@19571 596 else
pascal@19571 597 mov ax,cx
pascal@19571 598 dec ax
pascal@19571 599 cwde
pascal@19571 600 endif
pascal@19571 601 shl eax,12 ; i*_4k
pascal@19571 602 ; if (edx < pm.fallback+i*_4k && edx >= pm.fallback) again
pascal@19899 603 extrn _imgs
pascal@19899 604 mov bx,offset _imgs+2
pascal@19571 605 push eax
pascal@19571 606 add eax,[bx-2+2]
pascal@19571 607 cmp eax,edx ; pm.fallback+i*_4k <= edx ?
pascal@19571 608 pop eax ; i*_4k
pascal@19571 609 jbe @@pmok
pascal@19571 610 cmp edx,[bx-2+2] ; edx >= pm.fallback ?
pascal@19571 611 jae @@vcpi_alloc
pascal@19571 612 @@pmok:
pascal@19571 613 ; if (edx >= initrd.fallback+i*_4k && edx < initrd.fallback+initrd.size) again
pascal@19899 614 extrn _imgs
pascal@19899 615 mov bx,offset _imgs+32+2
pascal@19571 616 add eax,[bx-2+2] ; +initrd.fallback
pascal@19571 617 cmp eax,edx ; initrd.fallback+i*_4k > edx ?
pascal@19571 618 ja @@initrdok
pascal@19571 619 mov eax,[bx-2+6] ; initrd.size
pascal@19571 620 add eax,[bx-2+2] ; +initrd.fallback
pascal@19571 621 cmp eax,edx ; initrd.fallback+initrd.size > edx ?
pascal@19571 622 @@jnc_vcpi_alloc:
pascal@19571 623 ja @@vcpi_alloc
pascal@19571 624 @@initrdok:
pascal@19571 625 ifdef LARGE_IMAGES
pascal@19571 626 cmp [(data_himem si).first],0
pascal@19571 627 jne @@notfirst
pascal@19571 628 mov [(data_himem si).first],edx
pascal@19571 629 @@notfirst:
pascal@19571 630 mov bx,[(data_himem si).cacheidx]
pascal@19571 631 cmp bh,4
pascal@19571 632 jae @@nextpage
pascal@19571 633 shl bx,2
pascal@19571 634 inc [(data_himem si).cacheidx]
pascal@19571 635 mov [(data_himem bx+si).cache],edx
pascal@19571 636 loopd @@vcpi_alloc
pascal@19571 637 mov [(data_himem bx+si).cache],ecx ; last is 0
pascal@19571 638 @@nextpage:
pascal@19571 639 and [(data_himem si).cacheidx],0
pascal@19571 640 mov bx,[(data_himem si).pageidx]
pascal@19571 641 mov [(data_himem bx+si).page],edx
pascal@19571 642 add [(data_himem si).pageidx],4
pascal@19571 643 push cx
pascal@19571 644 lea cx,[(data_himem si).cache]
pascal@19571 645 ifdef NO386
pascal@19571 646 push edx
pascal@19571 647 pop dx
pascal@19571 648 pop ax
pascal@19571 649 endif
pascal@19571 650 call storepage ; storepage(edx,cx)
pascal@19571 651 pop cx
pascal@19571 652 or ecx,ecx ; clear C
pascal@19571 653 jnz @@jnc_vcpi_alloc
pascal@19571 654 mov [dword (data_himem si).cacheidx],ecx
pascal@19571 655 xchg ax,si
pascal@19571 656 else
pascal@19571 657 mov [si],edx
pascal@19571 658 lodsd ; si=+4
pascal@19538 659 loop @@vcpi_alloc
pascal@19538 660 pop ax
pascal@19571 661 endif
pascal@19538 662 pop si
pascal@19538 663 ret
pascal@19636 664 ifdef NO386
pascal@19636 665 p8086
pascal@19636 666 endif
pascal@19538 667
pascal@20528 668 endp @malloc_bufv_or_die$qp11image_himem
pascal@19538 669
pascal@19538 670
pascal@19538 671 ;***************************************************************
pascal@20630 672 ;_fastcall void memcpy_image(bx:struct image_himem *m);
pascal@19515 673 ;***************************************************************
pascal@20528 674 global @memcpy_image$qp11image_himem:near
pascal@20528 675 proc @memcpy_image$qp11image_himem near
pascal@19515 676
pascal@19571 677 ifndef NO386
pascal@19571 678 mov edx,[(image_himem bx).fallback]
pascal@19571 679 mov eax,[(image_himem bx).buf]
pascal@19571 680 cmp eax,edx ; if (m->fallback != m->buf)
pascal@19571 681 jz @@skip ; memcpy32(m->fallback,0,m->buf,m->size)
pascal@19571 682 ifdef LARGE_IMAGES
pascal@19571 683 mov ecx,[(image_himem bx).size]
pascal@20146 684 memcpy_imagez: ; memcpy_imagez(edx,eax,ecx)
pascal@19571 685 push ecx
pascal@19571 686 else
pascal@19571 687 push [(image_himem bx).size]
pascal@19571 688 endif
pascal@19571 689 push eax
pascal@19571 690 push 0
pascal@19571 691 call_memcpy32:
pascal@19571 692 push edx
pascal@19571 693 else
pascal@19571 694 mov ax,[word ((image_himem bx).fallback)]
pascal@19571 695 mov dx,[word ((image_himem bx).fallback)+2]
pascal@19571 696 mov cx,[word ((image_himem bx).buf)]
pascal@19571 697 cmp ax,cx ; if (m->fallback != m->buf)
pascal@19571 698 jnz @@do
pascal@19571 699 cmp dx,[word ((image_himem bx).buf)+2]
pascal@19571 700 jz @@skip ; memcpy32(m->fallback,0,m->buf,m->size)
pascal@19571 701 @@do:
pascal@19571 702 push [word ((image_himem bx).size)+2]
pascal@19571 703 push [word ((image_himem bx).size)]
pascal@19571 704 push [word ((image_himem bx).buf)+2]
pascal@19571 705 push cx
pascal@19571 706 xor cx,cx
pascal@19571 707 push cx
pascal@19571 708 call_memcpy32:
pascal@19571 709 push dx
pascal@19571 710 push ax
pascal@19571 711 ifdef LARGE_IMAGES
pascal@19571 712 jmp @@memcpy
pascal@20146 713 memcpy_imagez: ; memcpy_imagez(edx,eax,ecx)
pascal@19636 714 p386
pascal@19571 715 push ecx
pascal@19571 716 push eax
pascal@19571 717 push 0
pascal@19571 718 push edx
pascal@19636 719 ifdef NO386
pascal@19636 720 p8086
pascal@19636 721 endif
pascal@19571 722 endif
pascal@19571 723 endif
pascal@19571 724 @@memcpy:
pascal@20528 725 extrn memcpy32:near
pascal@20528 726 call near memcpy32
pascal@19571 727 @@skip:
pascal@19571 728 ret
pascal@19571 729
pascal@20528 730 endp @memcpy_image$qp11image_himem
pascal@19571 731
pascal@19571 732 ;***************************************************************
pascal@20630 733 ;_fastcall void storepage(bx:u32 *dst);
pascal@19571 734 ;***************************************************************
pascal@20538 735 global @storepage$qpul:near
pascal@20538 736 proc @storepage$qpul near
pascal@19571 737
pascal@19571 738 ifndef NO386
pascal@19571 739 mov edx,[bx]
pascal@19571 740 else
pascal@19571 741 mov ax,[bx]
pascal@19571 742 mov dx,[bx+2]
pascal@19571 743 endif
pascal@20538 744 mov cx,offset _xfer_buf
pascal@20146 745 storepage: ; storepage(edx,cx)
pascal@19571 746 ifndef NO386
pascal@19571 747 push 0
pascal@19571 748 push 4096
pascal@19571 749 push 0
pascal@19571 750 else
pascal@19571 751 xor bx,bx
pascal@19571 752 push bx
pascal@19571 753 mov bh,4096/256
pascal@19571 754 push bx
pascal@19571 755 xor bx,bx
pascal@19571 756 push bx
pascal@19571 757 endif
pascal@19571 758 push cx
pascal@19571 759 push ds
pascal@19571 760 jmp call_memcpy32
pascal@19571 761
pascal@20538 762 endp @storepage$qpul
pascal@19571 763
pascal@19571 764
pascal@19571 765 ifdef LARGE_IMAGES
pascal@19636 766 p386
pascal@19571 767 ;***************************************************************
pascal@20630 768 ;_fastcall void reset_bufv(bx:u32 *p);
pascal@19571 769 ;***************************************************************
pascal@20528 770 global @reset_bufv$qpul:near
pascal@20528 771 proc @reset_bufv$qpul near
pascal@19571 772
pascal@20524 773 mov [curdata],bx
pascal@19571 774 and [dword (data_himem bx).cacheidx],0
pascal@19571 775 ret
pascal@19571 776
pascal@20528 777 endp @reset_bufv$qpul
pascal@19571 778
pascal@19571 779 ;***************************************************************
pascal@19571 780 ;u32* prev_bufv();
pascal@19571 781 ;u32* prev_bufv();
pascal@19571 782 ;***************************************************************
pascal@19571 783 global _prev_bufv:near
pascal@19571 784 global _next_bufv:near
pascal@19571 785 proc _prev_bufv near
pascal@19571 786
pascal@19571 787 stc
pascal@19571 788 db 73h ; jnc
pascal@19571 789 _next_bufv:
pascal@19571 790 clc
pascal@20528 791 push si
pascal@20528 792 mov si,[curdata]
pascal@19571 793 sbb ax,ax
pascal@20527 794 cmc
pascal@20527 795 adc ax,[(data_himem si).cacheidx] ; -1/+1
pascal@19571 796 xor ecx,ecx
pascal@19571 797 test ax,0fc00h
pascal@19571 798 jz @@gotpage
pascal@19571 799 push ax ; FFFF / 0400
pascal@19571 800 sar ax,8 ; FFFC / 0004
pascal@19571 801 and al,0fch
pascal@19571 802 add [(data_himem si).pageidx],ax
pascal@19571 803 mov bx,[(data_himem si).pageidx]
pascal@19571 804 lea bx,[(data_himem bx+si).page]
pascal@19571 805 mov edx,ds
pascal@19571 806 shl edx,4
pascal@19571 807 lea cx,[(data_himem si).cache]
pascal@19571 808 add edx,ecx
pascal@19571 809 mov eax,[bx]
pascal@19571 810 or eax,eax
pascal@19571 811 jnz @@pageok
pascal@19571 812 pop ax
pascal@19571 813 xchg ax,bx
pascal@19571 814 pop si
pascal@19571 815 ret
pascal@19571 816 @@pageok:
pascal@19571 817 mov cx,4096
pascal@19571 818 call memcpy_imagez ; get page
pascal@19571 819 pop ax ; FFFF / 0400
pascal@19571 820 cbw
pascal@19571 821 shr ax,6 ; 03FF / 0000
pascal@19571 822 @@gotpage:
pascal@19571 823 mov [(data_himem si).cacheidx],ax
pascal@19571 824 shl ax,2
pascal@19571 825 xchg ax,bx
pascal@19571 826 lea ax,[(data_himem bx+si).cache]
pascal@19571 827 or bx,[(data_himem si).pageidx] ; !pageidx && !cacheidx
pascal@19571 828 jnz @@notfirst2
pascal@19571 829 xchg ax,si ; &first
pascal@19571 830 @@notfirst2:
pascal@19571 831 pop si
pascal@19571 832 ret
pascal@19571 833
pascal@19571 834 endp _prev_bufv
pascal@19571 835 endif
pascal@19571 836
pascal@20146 837 ifdef NO386
pascal@20146 838 p8086
pascal@20146 839 endif
pascal@19571 840
pascal@19571 841 ;***************************************************************
pascal@20630 842 ;_fastcall void open_image(bx:const char *name, ax:struct image_himem *m);
pascal@19515 843 ;***************************************************************
pascal@20528 844 global @open_image$qpxzcp11image_himem:near
pascal@20528 845 proc @open_image$qpxzcp11image_himem near
pascal@19515 846
pascal@20484 847 push di
pascal@20485 848 xchg ax,di
pascal@20538 849 ifdef EXTRA
pascal@20538 850 cmp [(image_himem di).fd],0 ; iso image/kernel ?
pascal@20538 851 jnz @@alreadydone
pascal@20538 852 endif
pascal@20484 853 mov [(image_himem di).state],bx
pascal@20484 854 push bx
pascal@20534 855 ifdef EXTRA
pascal@20538 856 cmp [(image_himem di).next_chunk],0 ; iso image/initrd ?
pascal@20538 857 jnz @@next
pascal@20534 858 endif
pascal@20534 859 mov [(image_himem di).next_chunk],offset next_chunk
pascal@19515 860 @@next:
pascal@19546 861 call [(image_himem di).next_chunk] ; m->next_chunk()
pascal@19515 862 ifndef NO386
pascal@19515 863 add eax,3
pascal@19515 864 and al,0FCh
pascal@19546 865 add [(image_himem di).size],eax ; m->size += m->chunk_size
pascal@19515 866 or eax,eax
pascal@19515 867 else
pascal@19515 868 add ax,3
pascal@19515 869 adc dx,0
pascal@19515 870 and al,0FCh
pascal@19546 871 add [word (image_himem di).size],ax ; m->size += m->chunk_size
pascal@19546 872 adc [word ((image_himem di).size)+2],dx
pascal@20520 873 or ax,dx
pascal@19515 874 endif
pascal@20520 875 jnz @@next
pascal@20484 876 pop [(image_himem di).state]
pascal@19546 877 call [(image_himem di).next_chunk] ; m->next_chunk()
pascal@20538 878 @@alreadydone:
pascal@20484 879 pop di
pascal@19515 880 ret
pascal@19515 881
pascal@20528 882 endp @open_image$qpxzcp11image_himem
pascal@19515 883
pascal@19515 884
pascal@19515 885 ;***************************************************************
pascal@20630 886 ;_fastcall int read_image(bx:struct image_himem *m);
pascal@19515 887 ;***************************************************************
pascal@20538 888 global @read_image$qp11image_himem:near
pascal@20538 889 proc @read_image$qp11image_himem near
pascal@19515 890
pascal@20539 891 push si di
pascal@20538 892 mov di,bx
pascal@20539 893 mov si,4096
pascal@20539 894 push si ; original size
pascal@19515 895 @@loop:
pascal@19538 896 ifndef NO386
pascal@20539 897 movzx ecx,si
pascal@19546 898 mov eax,[(image_himem di).chunk_size]
pascal@19538 899 cmp ecx,eax
pascal@19538 900 jb @@szok
pascal@19538 901 else
pascal@20539 902 mov cx,si
pascal@19546 903 mov ax,[word (image_himem di).chunk_size]
pascal@19538 904 cmp cx,ax
pascal@19515 905 jb @@szok
pascal@19546 906 cmp [word ((image_himem di).chunk_size)+2],0 ; hi m->chunk_size
pascal@19515 907 jne @@szok
pascal@20484 908 endif
pascal@19515 909 xchg ax,cx
pascal@19515 910 @@szok:
pascal@19538 911 jcxz image_done
pascal@20539 912 mov dx,offset _xfer_buf
pascal@20538 913 mov bx,[di]
pascal@20528 914 call @read$cxdxbx
pascal@19538 915 jc image_done
pascal@19515 916 xor cx,cx
pascal@20539 917 cwd ; ax < 8000h
pascal@19538 918 ifndef NO386
pascal@19538 919 cwde ; ax < 8000h
pascal@19546 920 sub [(image_himem di).chunk_size],eax
pascal@20541 921 xchg eax,ebx
pascal@19538 922 else
pascal@19546 923 sub [word (image_himem di).chunk_size],ax
pascal@20539 924 xchg ax,bx
pascal@19546 925 sbb [word ((image_himem di).chunk_size)+2],dx
pascal@19538 926 jnz @@fill
pascal@19546 927 cmp [word (image_himem di).chunk_size],dx
pascal@19538 928 endif
pascal@19538 929 jnz @@fill
pascal@20539 930 dec cx
pascal@19515 931 @@fill:
pascal@20539 932 test bl,3
pascal@19515 933 je @@filled
pascal@20539 934 mov [bx+_xfer_buf],dh
pascal@20539 935 inc bx
pascal@19515 936 jmp @@fill
pascal@19515 937 @@filled:
pascal@19538 938 ifndef NO386
pascal@20541 939 sub [(image_himem di).remaining],ebx
pascal@19538 940 else
pascal@20539 941 sub [word (image_himem di).remaining],bx
pascal@19546 942 sbb [word ((image_himem di).remaining)+2],dx
pascal@19538 943 endif
pascal@20541 944 sub si,bx
pascal@19538 945 pushf
pascal@20539 946 and cx,[(image_himem di).next_chunk]
pascal@20484 947 jcxz @@same_chunk
pascal@20539 948 call cx
pascal@19538 949 @@same_chunk:
pascal@19538 950 popf
pascal@19538 951 jnz @@loop
pascal@20484 952 image_done:
pascal@20528 953 pop ax ; original size
pascal@20539 954 sub ax,si
pascal@20539 955 pop di si
pascal@20538 956 ret
pascal@19515 957
pascal@20538 958 endp @read_image$qp11image_himem
pascal@19515 959
pascal@19515 960
pascal@19515 961 ;***************************************************************
pascal@20528 962 ;pascal unsigned long strtol(const char *s);
pascal@19515 963 ;***************************************************************
pascal@20528 964 global @strtol$qpxzc:near
pascal@20528 965 proc @strtol$qpxzc near
pascal@19515 966
pascal@20538 967 pop ax
pascal@20538 968 pop bx ; s
pascal@19515 969 push ax
pascal@20528 970 ifndef NO386
pascal@19515 971 xor ebx,ebx
pascal@19515 972 push si
pascal@19634 973 jcxz @@end
pascal@19515 974 mov si,cx
pascal@19515 975 xor ecx,ecx
pascal@19515 976 xor eax,eax
pascal@19515 977 lodsb
pascal@19634 978 mov dx,ax
pascal@19634 979 or al,20h
pascal@19634 980 cmp al,'n' ; vga=normal
pascal@19538 981 je @@vga
pascal@19538 982 dec cx
pascal@19634 983 cmp al,'e' ; vga=extended
pascal@19538 984 je @@vga
pascal@19538 985 dec cx
pascal@19634 986 cmp al,'a' ; vga=ask
pascal@19538 987 jne @@notvga
pascal@19538 988 @@vga:
pascal@19538 989 dec cx
pascal@19538 990 xchg ax,cx
pascal@19538 991 cwd
pascal@19634 992 jmp @@popsiret
pascal@19538 993 @@notvga:
pascal@19538 994 mov cx,10 ; radix
pascal@19634 995 xchg ax,dx
pascal@19515 996 cmp al,'+'
pascal@19515 997 je @@radixskip
pascal@19515 998 cmp al,'-'
pascal@19515 999 clc
pascal@19515 1000 jne @@radixkeep
pascal@19515 1001 stc
pascal@19515 1002 @@radixskip:
pascal@19515 1003 lodsb
pascal@19515 1004 @@radixkeep:
pascal@19515 1005 pushf
pascal@19515 1006 cmp al,'0'
pascal@19515 1007 jne @@radixok
pascal@19515 1008 mov cl,8
pascal@19515 1009 lodsb
pascal@19634 1010 or al,20h
pascal@19634 1011 cmp al,'x'
pascal@19515 1012 jne @@radixok
pascal@19515 1013 mov cl,16
pascal@19515 1014 @@strtollp:
pascal@19515 1015 lodsb
pascal@19515 1016 @@radixok:
pascal@19634 1017 or al,20h
pascal@19515 1018 sub al,'0'
pascal@19515 1019 jb @@endstrtol
pascal@19515 1020 cmp al,9
pascal@19515 1021 jbe @@digitok
pascal@19515 1022 cmp al,'a'-'0'
pascal@19515 1023 jb @@endstrtol
pascal@19515 1024 sub al,'a'-'0'-10
pascal@19515 1025 @@digitok:
pascal@19515 1026 cmp al,cl
pascal@19515 1027 jae @@endstrtol
pascal@19515 1028 xchg eax,ebx
pascal@19515 1029 mul ecx
pascal@19515 1030 add eax,ebx
pascal@19515 1031 xchg eax,ebx
pascal@19515 1032 jmp @@strtollp
pascal@19515 1033 @@endstrtol:
pascal@19515 1034 mov cl,10
pascal@19515 1035 cmp al,'k'-'a'+10
pascal@19515 1036 je @@shift
pascal@19515 1037 mov cl,20
pascal@19515 1038 cmp al,'m'-'a'+10
pascal@19515 1039 je @@shift
pascal@19515 1040 mov cl,30
pascal@19515 1041 cmp al,'g'-'a'+10
pascal@19515 1042 jne @@noshift
pascal@19515 1043 @@shift:
pascal@19515 1044 shl ebx,cl
pascal@19515 1045 @@noshift:
pascal@19515 1046 popf
pascal@19515 1047 jnc @@end
pascal@19515 1048 neg ebx
pascal@19515 1049 @@end:
pascal@19515 1050 push ebx
pascal@19515 1051 pop ax
pascal@19515 1052 pop dx
pascal@19634 1053 @@popsiret:
pascal@19515 1054 pop si
pascal@19515 1055 else
pascal@19515 1056 push si
pascal@19515 1057 push di
pascal@19515 1058 xor ax,ax
pascal@19515 1059 cwd
pascal@19634 1060 jcxz @@goend
pascal@19515 1061 xchg ax,di
pascal@19515 1062 mov si,cx
pascal@19538 1063 lodsb
pascal@19634 1064 mov bx,ax
pascal@19634 1065 or al,20h
pascal@19538 1066 mov cx,-1
pascal@19634 1067 cmp al,'n' ; vga=normal
pascal@19538 1068 je @@vga
pascal@19538 1069 dec cx
pascal@19634 1070 cmp al,'e' ; vga=extended
pascal@19538 1071 je @@vga
pascal@19538 1072 dec cx
pascal@19634 1073 cmp al,'a' ; vga=ask
pascal@19538 1074 jne @@notvga
pascal@19538 1075 @@vga:
pascal@19538 1076 xchg ax,cx
pascal@19538 1077 @@goend:
pascal@19634 1078 jmp @@popdisiret
pascal@19538 1079 @@notvga:
pascal@19515 1080 mov cx,10 ; radix
pascal@19634 1081 xchg ax,bx
pascal@19515 1082 cmp al,'+'
pascal@19515 1083 je @@radixskip
pascal@19515 1084 cmp al,'-'
pascal@19515 1085 clc
pascal@19515 1086 jne @@radixkeep
pascal@19515 1087 stc
pascal@19515 1088 @@radixskip:
pascal@19515 1089 lodsb
pascal@19515 1090 @@radixkeep:
pascal@19515 1091 pushf
pascal@19515 1092 cmp al,'0'
pascal@19515 1093 jne @@radixok
pascal@19515 1094 mov cl,8
pascal@19515 1095 lodsb
pascal@20146 1096 or al,20h
pascal@19634 1097 cmp al,'x'
pascal@19515 1098 jne @@radixok
pascal@19515 1099 mov cl,16
pascal@19515 1100 @@strtollp:
pascal@19515 1101 lodsb
pascal@19515 1102 @@radixok:
pascal@19634 1103 or al,20h
pascal@19515 1104 sub al,'0'
pascal@19515 1105 jb @@endstrtol
pascal@19515 1106 cmp al,9
pascal@19515 1107 jbe @@digitok
pascal@19515 1108 cmp al,'a'-'0'
pascal@19515 1109 jb @@endstrtol
pascal@19515 1110 sub al,'a'-'0'-10
pascal@19515 1111 @@digitok:
pascal@19515 1112 cmp al,cl
pascal@19515 1113 jae @@endstrtol
pascal@19515 1114
pascal@19515 1115 push ax
pascal@19515 1116 push si
pascal@19515 1117 push dx
pascal@19515 1118 xchg ax,di
pascal@19515 1119 mul cx
pascal@19515 1120 xchg ax,di
pascal@19515 1121 xchg ax,dx
pascal@19515 1122 xchg ax,si
pascal@19515 1123 pop ax
pascal@19515 1124 mul cx
pascal@19515 1125 add ax,si
pascal@19515 1126 pop si
pascal@19515 1127 xchg ax,dx
pascal@19515 1128 pop ax
pascal@19515 1129 mov ah,0
pascal@19515 1130 add di,ax
pascal@19515 1131 adc dx,0
pascal@19515 1132
pascal@19515 1133 jmp @@strtollp
pascal@19515 1134 @@endstrtol:
pascal@19515 1135 mov cl,10
pascal@19515 1136 cmp al,'k'-'a'+10
pascal@19515 1137 je @@shift
pascal@19515 1138 mov cl,20
pascal@19515 1139 cmp al,'m'-'a'+10
pascal@19515 1140 je @@shift
pascal@19515 1141 mov cl,30
pascal@19515 1142 cmp al,'g'-'a'+10
pascal@19515 1143 jne @@noshift
pascal@19515 1144 @@shift:
pascal@19515 1145 rcl di,1
pascal@19515 1146 shl dx,1
pascal@19515 1147 loop @@shift
pascal@19515 1148 @@noshift:
pascal@19515 1149 popf
pascal@19515 1150 jnc @@end
pascal@19515 1151 not dx
pascal@19515 1152 neg di
pascal@19515 1153 jne @@end
pascal@19515 1154 inc dx
pascal@19515 1155 @@end:
pascal@19515 1156 xchg ax,di
pascal@19634 1157 @@popdisiret:
pascal@19515 1158 pop di
pascal@19515 1159 pop si
pascal@19515 1160 endif
pascal@20528 1161 strtol_ret:
pascal@19515 1162 ret
pascal@19515 1163
pascal@20528 1164 endp @strtol$qpxzc
pascal@19515 1165
pascal@19515 1166
pascal@19515 1167 ifdef NO386
pascal@19515 1168 ;***************************************************************
pascal@19515 1169 ;u16 topseg();
pascal@19515 1170 ;***************************************************************
pascal@19515 1171 global _topseg:near
pascal@19515 1172 proc _topseg near
pascal@19515 1173
pascal@19515 1174 int 12h
pascal@19515 1175 jnc @@max640k
pascal@19515 1176 mov ax,640 ; 9000
pascal@19515 1177 @@max640k:
pascal@19634 1178 dec ax
pascal@19515 1179 and al,0C0h
pascal@19515 1180 mov cl,6
pascal@19515 1181 shl ax,cl
pascal@19515 1182 ret
pascal@19515 1183
pascal@19515 1184 endp _topseg
pascal@19515 1185 endif
pascal@19515 1186
pascal@19825 1187 ifdef EXTRA
pascal@19825 1188 p8086
pascal@19825 1189 ;***************************************************************
pascal@19825 1190 ;char *progname(void)
pascal@19825 1191 ;***************************************************************
pascal@19825 1192 global _progname:near
pascal@19825 1193 proc _progname near
pascal@19825 1194
pascal@19825 1195 push si di es
pascal@19825 1196 mov ah,30h
pascal@19825 1197 int 21h
pascal@19875 1198 xor di,di
pascal@19825 1199 cmp al,3
pascal@19874 1200 mov ax,di
pascal@19825 1201 jb @@skip
pascal@19873 1202 ;mov es,[cs:2Ch]
pascal@19874 1203 mov es,[di+2Ch]
pascal@20146 1204 mov cx,sp ; big enough
pascal@19870 1205 @@loop:
pascal@19825 1206 repne
pascal@19825 1207 scasb
pascal@19825 1208 scasb
pascal@19870 1209 jne @@loop
pascal@19870 1210 inc di
pascal@19870 1211 inc di
pascal@19870 1212 mov si,di ; progname @es:di
pascal@19870 1213 repne
pascal@19870 1214 scasb
pascal@19870 1215 mov cx,di
pascal@19874 1216 sub cx,si ; progname len
pascal@19870 1217 call malloc_or_die ; keep cx
pascal@19870 1218 mov di,ax
pascal@19825 1219 push ds
pascal@19825 1220 push es
pascal@19825 1221 pop ds
pascal@19825 1222 pop es
pascal@19870 1223 rep
pascal@19870 1224 movsb
pascal@19870 1225 push es
pascal@19825 1226 pop ds
pascal@19825 1227 @@skip:
pascal@19825 1228 pop es di si
pascal@19825 1229 ret
pascal@19825 1230
pascal@19825 1231 endp _progname
pascal@19825 1232
pascal@19825 1233
pascal@19825 1234 ;***************************************************************
pascal@20630 1235 ;_fastcall void chdirname(bx:char *path)
pascal@19825 1236 ;***************************************************************
pascal@20528 1237 global @chdirname$qpzc:near
pascal@20528 1238 proc @chdirname$qpzc near
pascal@19825 1239
pascal@20146 1240 cmp [byte bx+1],3Ah ; ':'
pascal@19825 1241 jne @@nodisk
pascal@19875 1242 mov dl,20h
pascal@19875 1243 or dl,[bx]
pascal@19825 1244 sub dl,61h
pascal@19825 1245 mov ah,0Eh
pascal@19825 1246 int 21h
pascal@19825 1247 inc bx
pascal@19825 1248 inc bx
pascal@19825 1249 @@nodisk:
pascal@19825 1250 xor cx,cx
pascal@19825 1251 @@next:
pascal@19825 1252 mov al,[bx]
pascal@19825 1253 cmp al,5Ch
pascal@19825 1254 jne @@tsteos
pascal@19875 1255 mov dx,bx
pascal@19875 1256 inc cx
pascal@19825 1257 @@tsteos:
pascal@19825 1258 inc bx
pascal@19825 1259 or al,al
pascal@19825 1260 jnz @@next
pascal@19825 1261 jcxz @@end
pascal@19875 1262 mov bx,dx
pascal@19825 1263 push [word bx]
pascal@19825 1264 mov [bx],al
pascal@20630 1265 ifdef LONG_FILENAME
pascal@19875 1266 stc
pascal@20146 1267 mov ax,713Bh ; chdir long filename (ds:dx)
pascal@19875 1268 int 21h
pascal@20630 1269 jnc @@chdirdone
pascal@20630 1270 endif
pascal@20146 1271 mov ah,3Bh ; chdir(ds:dx)
pascal@19875 1272 int 21h
pascal@20510 1273 @@chdirdone:
pascal@19825 1274 pop [word bx]
pascal@19825 1275 @@end:
pascal@19825 1276 ret
pascal@19825 1277
pascal@20528 1278 endp @chdirname$qpzc
pascal@19825 1279
pascal@19825 1280
pascal@19825 1281 ;***************************************************************
pascal@20630 1282 ;_fastcall char *ultoa(axdx:unsigned long n);
pascal@19825 1283 ;***************************************************************
pascal@20528 1284 global @ultoa$qul:near
pascal@20528 1285 proc @ultoa$qul near
pascal@19825 1286
pascal@20538 1287 xchg ax,cx
pascal@20538 1288 xchg ax,dx ; AX:CX = n
pascal@19825 1289 push si
pascal@19825 1290 mov si,10
pascal@19825 1291 mov bx,offset ultoabuf+11
pascal@19825 1292 @@loop:
pascal@19825 1293 dec bx
pascal@19825 1294 xor dx,dx
pascal@19825 1295 div si ; DX:AX = 0000:hi(n)
pascal@19825 1296 xchg ax,cx ; CX = hi(n)/10
pascal@19825 1297 div si ; DX:AX = hi(n)%10:lo(n)
pascal@19825 1298 xchg ax,cx ; CX = lo(n/10)
pascal@20528 1299 ; AX = hi(n)/10 = hi(n/10)
pascal@20528 1300 mov [byte bx],'0'
pascal@20528 1301 add [bx],dl ; DL = n%10
pascal@20528 1302 mov dx,ax
pascal@20528 1303 or dx,cx
pascal@19825 1304 jnz @@loop
pascal@19825 1305 xchg ax,bx
pascal@19825 1306 pop si
pascal@19825 1307 ret
pascal@19825 1308
pascal@20528 1309 endp @ultoa$qul
pascal@19825 1310
pascal@19825 1311
pascal@19825 1312 ;***************************************************************
pascal@20630 1313 ;_fastcall unsigned long kver2ul(bx:char *kernel_version);
pascal@19825 1314 ;***************************************************************
pascal@20528 1315 global @kver2ul$qpzc:near
pascal@20528 1316 proc @kver2ul$qpzc near
pascal@19825 1317
pascal@20146 1318 push si
pascal@20538 1319 mov si,bx
pascal@20146 1320 xor bx,bx
pascal@20146 1321 mov cx,304h
pascal@19825 1322 @@number:
pascal@19825 1323 xor ax,ax
pascal@20146 1324 cwd
pascal@19825 1325 @@digit:
pascal@19825 1326 shl al,cl
pascal@19825 1327 shl ax,cl
pascal@19825 1328 lodsb
pascal@19825 1329 sub al,30h
pascal@19825 1330 cmp al,9
pascal@19825 1331 jbe @@digit
pascal@20146 1332 mov dl,bh
pascal@20146 1333 mov bh,bl
pascal@20146 1334 mov bl,ah
pascal@20146 1335 dec ch
pascal@20146 1336 jnz @@number
pascal@20146 1337 xchg ax,bx
pascal@20146 1338 pop si
pascal@19825 1339 kver2ulret:
pascal@19825 1340 ret
pascal@19825 1341
pascal@20528 1342 endp @kver2ul$qpzc
pascal@19825 1343
pascal@20528 1344 endif
pascal@19825 1345
pascal@19825 1346 ;***************************************************************
pascal@19825 1347 ;void try_default_args();
pascal@19825 1348 ;***************************************************************
pascal@20528 1349 ifdef EXTRA
pascal@20528 1350
pascal@19825 1351 global _try_default_args:near
pascal@19825 1352 proc _try_default_args near
pascal@19825 1353
pascal@19825 1354 mov bx,offset tazboot_cmd
pascal@19825 1355 call open
pascal@19825 1356 jc kver2ulret
pascal@19825 1357 mov cx,4096
pascal@19825 1358 mov di,[_heap_top]
pascal@19825 1359 extrn read_cmdline:near
pascal@19825 1360 jmp near read_cmdline ; read_cmdline(ax,di,cx)
pascal@19825 1361
pascal@19825 1362 endp _try_default_args
pascal@19825 1363
pascal@20528 1364 endif
pascal@19825 1365
pascal@19515 1366 ends _TEXT
pascal@19515 1367
pascal@19515 1368 end
pascal@19515 1369
pascal@19515 1370 ;###### END OF FILE ############################################
pascal@19825 1371