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

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