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

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