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

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