wok-current annotate linld/stuff/src/CRTL.ASM @ rev 20632

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