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

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