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

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