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

linld: fix iso9660/64
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Mar 06 18:15:05 2021 +0000 (2021-03-06)
parents 61df94a0fa43
children 217c02cbbe8d
rev   line source
pascal@19515 1 ;***************************************************************
pascal@19515 2 ;****** This file is distributed under GPL
pascal@19515 3 ;***************************************************************
pascal@19515 4 ideal
pascal@21984 5 %PAGESIZE 1000
pascal@19515 6 %crefref
pascal@19515 7 %noincl
pascal@19515 8 %nomacs
pascal@24019 9
pascal@24019 10 include "common.inc"
pascal@24019 11
pascal@19636 12 ifdef NO386
pascal@19636 13 p8086
pascal@19636 14 else
pascal@19515 15 p386
pascal@19636 16 endif
pascal@19515 17
pascal@19515 18 group DGROUP _TEXT,_DATA,_BSS
pascal@19515 19 assume cs:DGROUP,ds:DGROUP
pascal@19515 20
pascal@19515 21 segment _DATA byte public use16 'DATA'
pascal@19515 22
pascal@23996 23 loaderr db "Load failure",0
pascal@23983 24 msg_hang db "Himem broken",0
pascal@24019 25 ifdef VCPI
pascal@22668 26 vcpi_alloc_err db "VCPI"
pascal@24019 27 endif
pascal@22668 28 global overflow:byte
pascal@22668 29 overflow db "/"
pascal@23996 30 msg_malloc db "Out of memory"
pascal@23996 31 isorootofs dd 16*2048
pascal@19515 32
pascal@19515 33 ends _DATA
pascal@19515 34
pascal@19515 35 segment _BSS byte public use16 'BSS'
pascal@19515 36
pascal@24019 37 ifdef ISO9660
pascal@23797 38 include "isostate.inc"
pascal@21747 39 public _isostate
pascal@21747 40 _isostate isostate <?>
pascal@21754 41 org $-7
pascal@24019 42 endif
pascal@24015 43 global buf4k:byte
pascal@24015 44 label buf4k byte
pascal@20538 45 _xfer_buf db 4096 dup (?)
pascal@19515 46 filecnt db ? ; in fact 0 minus file count...
pascal@19515 47 nextfilename dw ?
pascal@19515 48
pascal@19515 49 ends _BSS
pascal@19515 50
pascal@19515 51 segment _TEXT byte public use16 'CODE'
pascal@19515 52
pascal@19515 53 ;***************************************************************
pascal@20630 54 ;_fastcall void strcatb(bx:const char* a, ax:const char* b);
pascal@19538 55 ;***************************************************************
pascal@20528 56 global @strcatb$qpxzct1:near
pascal@20528 57 proc @strcatb$qpxzct1 near
pascal@19538 58
pascal@19538 59 push si
pascal@20794 60 xchg ax,si ; b
pascal@20794 61 dec bx
pascal@19538 62 @@catlp:
pascal@20794 63 inc bx
pascal@20794 64 cmp [byte bx],0 ; a=bx
pascal@19538 65 jne @@catlp
pascal@20794 66 db 0b8h,20h ; mov ax,??20h
pascal@19538 67 @@cpylp:
pascal@20794 68 lodsb
pascal@20794 69 mov [bx],al
pascal@20142 70 inc bx
pascal@20527 71 or al,al
pascal@19538 72 jne @@cpylp
pascal@19538 73 pop si
pascal@24015 74 catret:
pascal@20142 75 ret
pascal@19538 76
pascal@20528 77 endp @strcatb$qpxzct1
pascal@19538 78
pascal@19538 79
pascal@24019 80 ifdef NO386
pascal@20146 81 p8086
pascal@24019 82 endif
pascal@20146 83
pascal@24019 84 ifndef ISO9660
pascal@24019 85 ;***************************************************************
pascal@24019 86 ;_fastcall int:C open(bx:const char* name, int flags=O_RDONLY);
pascal@24019 87 ;_fastcall int:C openargs(bx:const char* name, int flags=O_RDONLY);
pascal@24019 88 ;***************************************************************
pascal@24019 89 global openargs:near ; openargs(bx)
pascal@24019 90 openargs:
pascal@24019 91 cmp [byte bx],'@'
pascal@24019 92 jne fail
pascal@24019 93 inc bx
pascal@24019 94
pascal@24019 95 global @open$qpxzc:near
pascal@24019 96 @open$qpxzc:
pascal@24019 97 endif
pascal@23996 98 opendos:
pascal@23996 99 ifdef LONG_FILENAME
pascal@24015 100 ;xchg ax,cx ; attributes
pascal@23996 101 mov ax,716Ch
pascal@23996 102 push bx si
pascal@23996 103 mov si,bx
pascal@23996 104 xor bx,bx ; R/O
pascal@23996 105 cwd ; action = open
pascal@23996 106 stc
pascal@23996 107 int 21h
pascal@23996 108 pop si dx
pascal@23996 109 jnc openok
pascal@23996 110 mov ax,3d00h ; read-only+compatibility
pascal@23996 111 else
pascal@23996 112 mov ah,3dh ; read-only+compatibility
pascal@23996 113 mov dx,bx
pascal@23996 114 endif
pascal@23996 115 ;mov cl,0 ; attribute mask
pascal@23996 116 call dos
pascal@24019 117 ifdef ISO9660
pascal@24015 118 jc catret
pascal@23996 119 openok:
pascal@23984 120 xchg ax,bx
pascal@23996 121 mov ax,4202h
pascal@23996 122 cwd
pascal@23996 123 xor cx,cx
pascal@23996 124 int 21h
pascal@23996 125 mov [word _isostate.filesize],ax
pascal@23996 126 mov [(word _isostate.filesize)+2],dx
pascal@23984 127 xchg ax,bx
pascal@23996 128 ;xor cx,cx
pascal@23996 129 cwd
pascal@23996 130 call seeksetpos0 ; filepos = 0
pascal@24019 131 else
pascal@24019 132 openok:
pascal@24019 133 endif
pascal@23996 134 xchg ax,bx ; fd
pascal@23996 135 ret
pascal@20146 136
pascal@24019 137 ifdef ISO9660
pascal@19538 138 ;***************************************************************
pascal@24019 139 ;_fastcall int:C open(bx:const char* name, int flags=O_RDONLY);
pascal@24019 140 ;_fastcall int:C openargs(bx:const char* name, int flags=O_RDONLY);
pascal@19515 141 ;***************************************************************
pascal@20538 142 global openargs:near ; openargs(bx)
pascal@20538 143 openargs:
pascal@20538 144 cmp [byte bx],'@'
pascal@20538 145 jne fail
pascal@20538 146 inc bx
pascal@20538 147
pascal@20528 148 global @open$qpxzc:near
pascal@23996 149 @open$qpxzc:
pascal@24015 150 ifdef LONG_FILENAME
pascal@24015 151 mov cx,[_isostate.fd]
pascal@24015 152 jcxz opendos
pascal@24015 153 xchg ax,cx
pascal@24015 154 else
pascal@23996 155 mov ax,[_isostate.fd]
pascal@23996 156 or ax,ax
pascal@23996 157 je opendos
pascal@24015 158 endif
pascal@23996 159 ifdef ISOHOOK
pascal@23996 160 cmp [byte bx],'!'
pascal@23996 161 je @readmenu$qv
pascal@23996 162 endif
pascal@23996 163 extrn @_isoopen$qv:near
pascal@23996 164 mov [word _isostate.filename2open],bx
pascal@23996 165 jmp @_isoopen$qv ; filepos = 0
pascal@24019 166 endif
pascal@19515 167
pascal@19515 168
pascal@19515 169 ;***************************************************************
pascal@20632 170 ;_fastcall int fileexist(bx:const char* name);
pascal@20632 171 ;***************************************************************
pascal@20632 172 global @fileexist$qpxzc:near
pascal@20632 173 @fileexist$qpxzc:
pascal@20632 174 call @open$qpxzc
pascal@20632 175 jc fail
pascal@20632 176
pascal@20632 177 ;***************************************************************
pascal@20630 178 ;_fastcall int close(ax:int fd);
pascal@19515 179 ;***************************************************************
pascal@20528 180 global @close$qi:near
pascal@20528 181 proc @close$qi near
pascal@19515 182
pascal@20540 183 global close:near ; close(ax)
pascal@19515 184 close:
pascal@23985 185 mov bh,3Eh
pascal@24019 186 ifdef ISO9660
pascal@23996 187 mov cx,[_isostate.fd]
pascal@23996 188 jcxz dosbx
pascal@24019 189 endif
pascal@23996 190 jmp fail
pascal@19515 191
pascal@20528 192 endp @close$qi
pascal@19515 193
pascal@19515 194
pascal@19515 195 ;***************************************************************
pascal@23996 196 ;_fastcall int readrm(si:struct himem *m, ax:int sz);
pascal@19515 197 ;***************************************************************
pascal@20751 198 global @readrm$qp11image_himemi:near
pascal@20751 199 @readrm$qp11image_himemi:
pascal@20751 200 xchg ax,dx ; sz
pascal@23996 201 mov ax,[si] ; fd
pascal@23996 202 mov bx,[si-2] ; data
pascal@20528 203 proc @read$qipvi near
pascal@19515 204
pascal@20632 205 @read$dxbxax:
pascal@20538 206 xchg ax,bx ; fd
pascal@23996 207 @read$dxaxbx:
pascal@20538 208 xchg ax,dx ; data
pascal@20538 209 xchg ax,cx ; sz
pascal@20528 210 global @read$cxdxbx:near
pascal@20528 211 @read$cxdxbx:
pascal@24019 212 ifdef ISO9660
pascal@23996 213 push bx
pascal@23996 214 mov bx,offset _isostate.filepos
pascal@23996 215 push cx
pascal@23996 216 mov cx,[bx-4] ; filesize
pascal@23996 217 sub cx,[bx] ; filepos
pascal@23996 218 mov ax,[bx-2]
pascal@23996 219 sbb ax,[bx+2]
pascal@23996 220 pop ax
pascal@23996 221 ja @@axok
pascal@23996 222 ;je @@rem
pascal@23996 223 ;xor ax,ax
pascal@23996 224 @@rem:
pascal@23996 225 cmp cx,ax
pascal@23996 226 jb @@cxok
pascal@23996 227 @@axok:
pascal@23996 228 xchg ax,cx
pascal@23996 229 @@cxok:
pascal@23996 230 add [bx],cx
pascal@23996 231 adc [(word bx)+2],0
pascal@23996 232 pop bx
pascal@24019 233 endif
pascal@23996 234 readfd:
pascal@20146 235 mov ah,3Fh
pascal@23996 236 ;jcxz fail
pascal@21628 237 dos:
pascal@21628 238 int 21h
pascal@21628 239 jnc doret
pascal@21628 240 fail:
pascal@21628 241 stc
pascal@21628 242 failifc:
pascal@21628 243 sbb ax,ax ; ax=-1 CF
pascal@21628 244 doret:
pascal@21628 245 ret
pascal@19515 246
pascal@20528 247 endp @read$qipvi
pascal@19515 248
pascal@19515 249 ;***************************************************************
pascal@22632 250 ;_fastcall long rewind(ax:int fd);
pascal@19515 251 ;***************************************************************
pascal@19899 252
pascal@22632 253 global @rewind$qi:near ; fd=ax
pascal@22632 254 proc @rewind$qi near
pascal@20542 255
pascal@23996 256 rewind:
pascal@24019 257 ifdef ISO9660
pascal@23996 258 mov bx,offset _isostate.fileofs
pascal@23996 259 jmp lseek
pascal@24019 260 else
pascal@24019 261 mov bl,0
pascal@24019 262 lseek0:
pascal@24019 263 xor cx,cx
pascal@24019 264 xor dx,dx
pascal@24019 265 jmp lseek
pascal@24019 266 endif
pascal@19515 267
pascal@22632 268 endp @rewind$qi
pascal@19825 269
pascal@23996 270
pascal@23996 271 ifdef ISOHOOK
pascal@23996 272 ;***************************************************************
pascal@24015 273 ;_fastcall int:bx readmenu(void);
pascal@23996 274 ;***************************************************************
pascal@23996 275 proc @readmenu$qv near
pascal@23996 276
pascal@23996 277 mov dx,18
pascal@23996 278 xor cx,cx
pascal@23996 279 call seeksetpos0 ; filepos = 0
pascal@23996 280 mov dx,offset _isostate.filemod
pascal@23996 281 ; //magic = x->filemod;
pascal@23996 282 mov cl,10
pascal@23996 283 call readfd ; // read x->filemod + x->fileofs & x->filesize
pascal@23996 284 mov bx,offset _isostate.fileofs
pascal@23996 285 ; x->fileofs = 0x7FF0 - (x->filesize &= 0xFFFF);
pascal@23996 286 mov ax,7FF0h
pascal@23996 287 cwd
pascal@23996 288 mov [word bx+6],dx
pascal@23996 289 sub ax,[bx+4]
pascal@23996 290 mov [word bx+2],dx
pascal@23996 291 mov [bx],ax
pascal@23996 292 call isolseek ; filepos = 0
pascal@23996 293 xchg ax,bx ; fd
pascal@23996 294 ret
pascal@23996 295
pascal@23996 296 endp @readmenu$qv
pascal@23996 297 endif
pascal@23996 298
pascal@19825 299 ;***************************************************************
pascal@22749 300 ;_fastcall void isolseek(bx:const unsigned long *offset);
pascal@19825 301 ;***************************************************************
pascal@20528 302 global @isolseek$qpxul:near
pascal@20528 303 proc @isolseek$qpxul near
pascal@19825 304
pascal@24019 305 ifdef ISO9660
pascal@20534 306 isolseek:
pascal@20632 307 mov ax,[_isostate.fd]
pascal@23996 308 lseek:
pascal@21984 309 les dx,[dword bx]
pascal@21984 310 mov cx,es
pascal@23996 311 seeksetpos0:
pascal@23996 312 xor bx,bx
pascal@23996 313 mov [word _isostate.filepos],bx
pascal@23996 314 mov [(word _isostate.filepos)+2],bx
pascal@24019 315 else
pascal@24019 316 lseek:
pascal@24019 317 endif
pascal@23996 318 mov bh,42h ; bx=fd cx:dx=offset al=whence
pascal@23996 319 dosbx:
pascal@23996 320 xchg ax,bx
pascal@24015 321 jmp dos ; bx = fd
pascal@20534 322
pascal@20538 323 endp @isolseek$qpxul
pascal@20534 324
pascal@24019 325 ifdef ISO9660
pascal@20534 326 ;***************************************************************
pascal@20630 327 ;_fastcall int isoreadsector(bx:const unsigned long *offset);
pascal@23996 328 ;_fastcall int isoreadrootsector(void);
pascal@20534 329 ;***************************************************************
pascal@23996 330 global @isoreadrootsector$qv:near
pascal@23996 331 @isoreadrootsector$qv:
pascal@23996 332 mov bx,offset isorootofs
pascal@20534 333 global @isoreadsector$qpxul:near
pascal@20534 334 proc @isoreadsector$qpxul near
pascal@20534 335
pascal@23996 336 call isolseek ; filepos = 0
pascal@22749 337 jc fail
pascal@23996 338 mov dh,10
pascal@23996 339 mov ax,offset _isostate.buffer
pascal@23996 340 jmp @read$dxaxbx ; read(fd,buffer,2560+)
pascal@20534 341
pascal@20534 342 endp @isoreadsector$qpxul
pascal@24019 343 endif
pascal@20534 344
pascal@21628 345
pascal@24019 346 ifdef ISO9660
pascal@23999 347 ifdef ISOHOOK
pascal@21628 348 ;***************************************************************
pascal@23996 349 ;_fastcall int strhead(bx:const char* a, ax:const char* b);
pascal@21628 350 ;***************************************************************
pascal@23996 351 global @strhead$qpxzct1:near
pascal@23996 352 proc @strhead$qpxzct1 near
pascal@21628 353
pascal@23996 354 @@loop:
pascal@23996 355 xchg ax,bx
pascal@23996 356 mov dl,[bx] ; dl = *b++
pascal@23996 357 inc bx
pascal@23996 358 xchg ax,bx
pascal@23996 359 or dl,dl ; clear C
pascal@24020 360 jz failifc ; return 0, bx=a tail
pascal@23996 361 xor dl,[bx] ; dl -= *a++
pascal@23996 362 jne fail ; return -1
pascal@23996 363 inc bx
pascal@23996 364 jmp @@loop
pascal@21628 365
pascal@23996 366 endp @strhead$qpxzct1
pascal@21628 367
pascal@21628 368
pascal@21628 369 ;***************************************************************
pascal@23996 370 ;_fastcall int strcmp(bx:const char* a, ax:const char* b);
pascal@21628 371 ;***************************************************************
pascal@23996 372 global @strcmp$qpxzct1:near
pascal@23996 373 proc @strcmp$qpxzct1 near
pascal@21628 374
pascal@23996 375 call @strhead$qpxzct1
pascal@23996 376 jne fail ; return -1
pascal@23996 377 xor dl,[bx] ; clear C
pascal@23996 378 jne fail ; return -1
pascal@23996 379 jmp failifc ; return 0
pascal@21628 380
pascal@23996 381 endp @strcmp$qpxzct1
pascal@21628 382
pascal@23999 383 else
pascal@23999 384
pascal@23999 385 ;***************************************************************
pascal@23999 386 ;_fastcall int strcmp(bx:const char* a, ax:const char* b);
pascal@23999 387 ;***************************************************************
pascal@23999 388 global @strcmp$qpxzct1:near
pascal@23999 389 proc @strcmp$qpxzct1 near
pascal@23999 390
pascal@23999 391 @@loop:
pascal@23999 392 xchg ax,bx
pascal@23999 393 mov dl,[bx] ; dl = *b++
pascal@23999 394 inc bx
pascal@23999 395 xchg ax,bx
pascal@23999 396 xor dl,[bx] ; dl ^= *a++
pascal@24020 397 ifndef ROCKRIDGE
pascal@24020 398 and dl,0dfh ; case insensitive
pascal@24020 399 endif
pascal@23999 400 jne fail ; return -1
pascal@23999 401 inc bx
pascal@23999 402 or dl,dl ; clear C
pascal@23999 403 jz failifc ; return 0
pascal@23999 404 jmp @@loop
pascal@23999 405
pascal@23999 406 endp @strcmp$qpxzct1
pascal@23999 407 endif
pascal@24019 408 endif
pascal@19515 409
pascal@20751 410 ;***************************************************************
pascal@23996 411 ;_fastcall const char **argstr(bx:const char *s, ax:const char keywords[], dx:const char **var);
pascal@23993 412 ;_fastcall unsigned long *argnum(bx:char *s, ax:const char keywords[], dx:unsigned long *var);
pascal@20751 413 ;***************************************************************
pascal@20751 414 global @argstr$qpxzcxt1ppxzc:near
pascal@20751 415 proc @argstr$qpxzcxt1ppxzc near
pascal@20751 416
pascal@21569 417 mov cl,2
pascal@21569 418 db 0a9h ; test ax,#
pascal@20751 419 global @argnum$qpzcxpxzcpul:near
pascal@20751 420 @argnum$qpzcxpxzcpul:
pascal@21569 421 mov cl,4
pascal@23993 422 push bx
pascal@21569 423 xchg ax,bx ; keywords -> bx
pascal@21569 424 xchg ax,cx ; s -> cx
pascal@21569 425 cbw ; argstr:0002 argnum:0004
pascal@21569 426 xchg ax,dx ; vars -> ax
pascal@20751 427 push si di
pascal@21569 428 xchg ax,di ; vars => di
pascal@20751 429 dec bx
pascal@20751 430 sub di,dx
pascal@23797 431 @@loop:
pascal@20751 432 mov si,cx ; s
pascal@20751 433 add di,dx
pascal@20751 434 @@match:
pascal@21569 435 lodsb ; *s++
pascal@23999 436 or al,20h ; locase
pascal@24014 437 cmp al,'/' ; 2f
pascal@24014 438 jne @@notopt
pascal@24014 439 mov al,'-'
pascal@24014 440 @@notopt:
pascal@24014 441 inc bx ; keywords++
pascal@20751 442 cmp al,[bx]
pascal@20751 443 je @@match
pascal@24014 444 cmp [byte bx],dh
pascal@24014 445 je @@lastal
pascal@24014 446 cmp [byte bx],'|'
pascal@24014 447 je @@testal
pascal@24014 448 jl @@notsw ; } ~ <del>
pascal@24014 449 cmp al,20h ; EOS or 20h
pascal@24014 450 jne @@loop ; assume [bx] = '|'
pascal@24014 451 @@notsw:
pascal@24015 452 mov al,-1
pascal@20751 453 jne @@notopt
pascal@24014 454 jmp @@setnum
pascal@23797 455 @@testal:
pascal@24015 456 cmp al,-1
pascal@24014 457 jz @@loop
pascal@24014 458 @@lastal:
pascal@24015 459 cmp al,'='
pascal@23996 460 xchg ax,cx ; return s if failure
pascal@23797 461 jne @@nokeyword
pascal@20751 462 dec dx
pascal@20751 463 dec dx
pascal@20751 464 je @@done
pascal@24015 465 @strtol$qpxzc:
pascal@24015 466 ifndef NO386
pascal@24015 467 xor ecx,ecx
pascal@24015 468 xor ebx,ebx
pascal@24015 469 else
pascal@24015 470 xor bx,bx
pascal@24015 471 xor cx,cx
pascal@24015 472 xor dx,dx
pascal@24015 473 endif
pascal@24015 474 lodsb
pascal@24015 475 or al,20h
pascal@24015 476 cmp al,'a'
pascal@24015 477 jb @@notvga
pascal@24015 478 sub al,'o'
pascal@24015 479 @@vgaloop:
pascal@24015 480 dec cx
pascal@24015 481 add al,6
pascal@24015 482 jnb @@vgaloop ; vga=normal,extended,ask
pascal@24015 483 @@vga:
pascal@24015 484 xchg ax,cx
pascal@24015 485 ;cwd
pascal@24015 486 jmp @@end
pascal@24015 487 @@endstrtol:
pascal@24015 488 mov cl,10
pascal@24015 489 cmp al,'k'-'a'+10
pascal@24015 490 je @@shift
pascal@24015 491 mov cl,20
pascal@24015 492 cmp al,'m'-'a'+10
pascal@24015 493 je @@shift
pascal@24015 494 mov cl,30
pascal@24015 495 cmp al,'g'-'a'+10
pascal@24015 496 ifndef NO386
pascal@24015 497 jne @@noshift
pascal@24015 498 @@shift:
pascal@24015 499 shl ebx,cl
pascal@24015 500 @@noshift:
pascal@24015 501 popf
pascal@24015 502 jnc @@end2
pascal@24015 503 neg ebx
pascal@24015 504 @@end2:
pascal@24015 505 push ebx
pascal@24015 506 pop ax
pascal@24015 507 pop dx
pascal@24015 508 else
pascal@24015 509 @@shift:
pascal@24015 510 xchg ax,bx
pascal@24015 511 jne @@noshift
pascal@24015 512 extrn N_LXLSH@:near
pascal@24015 513 call N_LXLSH@
pascal@24015 514 @@noshift:
pascal@24015 515 popf
pascal@24015 516 jne @@end
pascal@24015 517 not dx
pascal@24015 518 neg ax
pascal@24015 519 jne @@end
pascal@24015 520 inc dx
pascal@24019 521 endif
pascal@24015 522 @@end:
pascal@23999 523 @@setnum:
pascal@23993 524 xchg ax,si
pascal@20751 525 mov [di+2],dx
pascal@20751 526 @@done:
pascal@23993 527 mov [di],si
pascal@23993 528 xchg ax,di
pascal@20751 529 @@nokeyword:
pascal@23993 530 pop di si bx
pascal@20751 531 ret
pascal@20751 532
pascal@24015 533 @@notvga:
pascal@24015 534 mov cl,10 ; radix
pascal@24015 535 cmp al,'-'
pascal@24015 536 jne @@radixkeep
pascal@24015 537 lodsb
pascal@24015 538 @@radixkeep:
pascal@24015 539 pushf
pascal@24015 540 cmp al,'0'
pascal@24015 541 jne @@radixok
pascal@24015 542 mov cl,8
pascal@24015 543 lodsb
pascal@24015 544 or al,20h
pascal@24015 545 cmp al,'x'
pascal@24015 546 jne @@radixok
pascal@24015 547 mov cl,16
pascal@24015 548 @@strtollp:
pascal@24015 549 lodsb
pascal@24015 550 @@radixok:
pascal@24015 551 or al,20h
pascal@24015 552 sub al,'0'
pascal@24015 553 jb @@endstrtol
pascal@24015 554 cmp al,9
pascal@24015 555 jbe @@digitok
pascal@24015 556 cmp al,'a'-'0'
pascal@24015 557 jb @@endstrtol
pascal@24015 558 sub al,'a'-'0'-10
pascal@24015 559 @@digitok:
pascal@24015 560 cmp al,cl
pascal@24015 561 jae @@endstrtol
pascal@24015 562 cbw
pascal@24015 563 ifndef NO386
pascal@24015 564 cwde
pascal@24015 565 xchg eax,ebx
pascal@24015 566 mul ecx
pascal@24015 567 add ebx,eax
pascal@24015 568 else
pascal@24015 569 push ax
pascal@24015 570 xchg ax,dx
pascal@24015 571 mul cx
pascal@24015 572 xchg ax,bx
pascal@24015 573 mul cx
pascal@24015 574 add dx,bx
pascal@24015 575 pop bx
pascal@24015 576 add bx,ax
pascal@24015 577 adc dx,0
pascal@24015 578 endif
pascal@24015 579 jmp @@strtollp
pascal@24015 580
pascal@20751 581 endp @argstr$qpxzcxt1ppxzc
pascal@20751 582
pascal@23996 583 ;***************************************************************
pascal@23996 584 ;_fastcall void puts(bx:const char* s):
pascal@23996 585 ;***************************************************************
pascal@23996 586 global @puts$qpxzc:near
pascal@20751 587
pascal@23996 588 ; global puts:near ; puts(bx)
pascal@23996 589 @putsz:
pascal@23996 590 call @putc
pascal@23996 591 @puts$qpxzc:
pascal@23996 592 puts:
pascal@23996 593 mov dl,[bx]
pascal@23996 594 inc bx
pascal@23996 595 or dl,dl
pascal@23996 596 jne @putsz
pascal@23996 597 mov dl,10
pascal@23996 598 @putc:
pascal@23996 599 cmp dl,10
pascal@23996 600 jne @putcz
pascal@23996 601 call @putcz2
pascal@23996 602 @putcz2:
pascal@23996 603 xor dl,7 ; 10^13 1010^1101
pascal@23996 604 @putcz:
pascal@23996 605 mov ah,2
pascal@23996 606 do_int21h:
pascal@23996 607 int 21h
pascal@23996 608 ret
pascal@19515 609
pascal@19515 610
pascal@22152 611 include "himem.inc"
pascal@22152 612
pascal@19515 613 ;***************************************************************
pascal@20630 614 ;_fastcall char* malloc_or_die(ax:unsigned size);
pascal@19515 615 ;***************************************************************
pascal@21757 616 xchg_heap_top:
pascal@22668 617 xchg ax,[bx]
pascal@21757 618 ret
pascal@21757 619
pascal@20528 620 proc @malloc_or_die$qui near
pascal@19515 621
pascal@23996 622 malloc_or_die: ; ax = malloc_or_die(ax)
pascal@22668 623 extrn _heap_top
pascal@22668 624 mov bx,offset _heap_top
pascal@22668 625 add ax,[bx]
pascal@22668 626 jnc xchg_heap_top
pascal@20456 627 mov bx,offset msg_malloc
pascal@19515 628
pascal@20528 629 endp @malloc_or_die$qui
pascal@19515 630
pascal@19515 631
pascal@19515 632 ;***************************************************************
pascal@20630 633 ;_fastcall int die(bx:const char* msg);
pascal@22152 634 ;int exit(ax:int status);
pascal@22152 635 ;int abort(void);
pascal@19515 636 ;***************************************************************
pascal@20528 637 global @die$qpxzc:near
pascal@20528 638 proc @die$qpxzc near
pascal@20528 639 @die$qpxzc:
pascal@19515 640 global die:near ; die(bx)
pascal@19515 641 die:
pascal@19515 642 call puts
pascal@21984 643 global @exit$qv:near
pascal@21984 644 @exit$qv:
pascal@19538 645 _exit:
pascal@22152 646 extrn _imgs:image_himem
pascal@22152 647 mov cx,[(word _imgs.buf)+2] ; no_exit ?
pascal@21757 648 mov ah,4Ch
pascal@22152 649 jcxz do_int21h
pascal@19515 650 mov bx, offset msg_hang
pascal@19515 651 call puts
pascal@20486 652 ; global _abort:near
pascal@19515 653 _abort:
pascal@19515 654 cli
pascal@19515 655 hlt
pascal@20778 656 jmp _abort
pascal@19515 657
pascal@20528 658 endp @die$qpxzc
pascal@19515 659
pascal@22152 660 ;***************************************************************
pascal@23996 661 ;_fastcall void open_image(si:struct image_himem *m, ax:const char *name);
pascal@22152 662 ;***************************************************************
pascal@22152 663
pascal@23996 664 global @open_image$qp11image_himempxzc:near
pascal@23996 665 proc @open_image$qp11image_himempxzc near
pascal@23996 666
pascal@23996 667 mov [(image_himem si).state],ax
pascal@23996 668 push ax
pascal@23996 669 @@next:
pascal@23996 670 call next_chunk
pascal@23996 671 ifndef NO386
pascal@23996 672 add eax,3
pascal@23996 673 and al,0FCh
pascal@23996 674 add [(image_himem si).size],eax ; m->size += m->chunk_size
pascal@23996 675 or eax,eax
pascal@23996 676 else
pascal@23996 677 add ax,3
pascal@23996 678 adc dx,0
pascal@23996 679 and al,0FCh
pascal@23996 680 add [word (image_himem si).size],ax ; m->size += m->chunk_size
pascal@23996 681 adc [word ((image_himem si).size)+2],dx
pascal@23996 682 or ax,dx
pascal@23996 683 endif
pascal@23996 684 jnz @@next
pascal@23996 685 pop [(image_himem si).state]
pascal@23996 686
pascal@23996 687 endp @open_image$qp11image_himempxzc
pascal@22152 688
pascal@19515 689
pascal@19636 690 ;***************************************************************
pascal@23996 691 ;static long next_chunk(struct image_himem *si);
pascal@19636 692 ;***************************************************************
pascal@19636 693 proc next_chunk near
pascal@19636 694
pascal@23996 695 ifndef NO_CLOSE
pascal@23996 696 mov ax,[(image_himem si).fd]
pascal@19636 697 call close
pascal@23996 698 endif
pascal@19636 699 ifndef NO386
pascal@19636 700 xor eax,eax
pascal@19636 701 else
pascal@19636 702 xor ax,ax
pascal@20485 703 cwd
pascal@19636 704 endif
pascal@23996 705 mov [(image_himem si).fd],ax
pascal@23996 706 mov bx,[(image_himem si).state]
pascal@19636 707 cmp al,[bx] ; ""
pascal@19636 708 jz @@end
pascal@23996 709 dec bx
pascal@23996 710 push di
pascal@19636 711 @@scan:
pascal@23996 712 inc bx
pascal@23996 713 mov al,[bx]
pascal@23996 714 mov di,bx
pascal@23996 715 or al,al
pascal@19636 716 jz @@eos
pascal@23996 717 sub al,','
pascal@19636 718 jnz @@scan
pascal@23996 719 inc bx
pascal@19636 720 @@eos:
pascal@23996 721 xchg [(image_himem si).state],bx ; set start of string
pascal@23996 722 mov [current_file],bx
pascal@23996 723 xchg [di],ax ; set temp eos (ax == 0)
pascal@23996 724 push ax
pascal@23996 725 call @open$qpxzc
pascal@23996 726 pop [word di] ; restore string
pascal@23996 727 pop di
pascal@23996 728 jnc @@opened
pascal@23996 729 loadfailure:
pascal@23996 730 ;***************************************************************
pascal@23996 731 ;_fastcall void loadfailure(void);
pascal@23996 732 ;***************************************************************
pascal@23996 733 global @loadfailure$qv:near
pascal@23996 734 @loadfailure$qv:
pascal@23996 735 mov bx,0
pascal@23996 736 org $-2
pascal@23996 737 current_file dw ?
pascal@23996 738 call puts
pascal@23996 739 mov bx,offset loaderr
pascal@23996 740 jmpdie:
pascal@23996 741 jmp die
pascal@23996 742 @@opened:
pascal@23996 743 mov [(image_himem si).fd],ax
pascal@23996 744 ifndef NO_CLOSE
pascal@23996 745 mov [(image_himem si).fd2close],ax
pascal@23996 746 endif
pascal@24019 747 ifdef ISO9660
pascal@19636 748 ifndef NO386
pascal@23996 749 mov eax,[_isostate.filesize]
pascal@19636 750 else
pascal@23996 751 mov ax,[word _isostate.filesize]
pascal@23996 752 mov dx,[(word _isostate.filesize)+2]
pascal@19636 753 endif
pascal@24019 754 else
pascal@24019 755 mov bl,02h ; SEEK_END
pascal@24019 756 call lseek0
pascal@24019 757 ifndef NO386
pascal@24019 758 push eax
pascal@24019 759 mov ax,[(image_himem si).fd]
pascal@24019 760 call rewind
pascal@24019 761 pop eax
pascal@24019 762 else
pascal@24019 763 push ax
pascal@24019 764 push dx
pascal@24019 765 mov ax,[(image_himem si).fd]
pascal@24019 766 call rewind
pascal@24019 767 pop dx
pascal@24019 768 pop ax
pascal@24020 769 endif
pascal@24020 770 endif
pascal@24019 771 @@end:
pascal@24020 772 ifndef NO386
pascal@24020 773 mov [(image_himem si).chunk_size],eax
pascal@24020 774 else
pascal@24019 775 mov [word (image_himem si).chunk_size],ax
pascal@24019 776 mov [word ((image_himem si).chunk_size)+2],dx
pascal@24019 777 endif
pascal@19636 778 ret
pascal@19636 779
pascal@19636 780 endp next_chunk
pascal@19636 781
pascal@24019 782 ifdef VCPI
pascal@23996 783 ;***************************************************************
pascal@19636 784
pascal@19571 785 struc data_himem ;struct data_himem {
pascal@24013 786 first dd ? ; 0 u32 first; *must* be the first one
pascal@24013 787 cacheidx dw ? ; 4 int cacheidx; quad *
pascal@24013 788 pageidx dw ? ; 6 int pageidx; byte *
pascal@19571 789 cache dd 1024 dup(?) ; 8 int cache;
pascal@19571 790 page dd 1024 dup(?) ;4104 int page;
pascal@24013 791 ends data_himem ;};
pascal@19571 792
pascal@19515 793 ;***************************************************************
pascal@23992 794 ;_fastcall u32* malloc_bufv_or_die(si:struct image_himem *m);
pascal@19538 795 ;***************************************************************
pascal@20528 796 global @malloc_bufv_or_die$qp11image_himem:near
pascal@20528 797 proc @malloc_bufv_or_die$qp11image_himem near
pascal@19538 798
pascal@19636 799 p386
pascal@19538 800 push si
pascal@24013 801 ;mov ecx,[(image_himem si).size]
pascal@24013 802 ;shr ecx,20 ; pages index size = size >> 20
pascal@24013 803 ;mov ax,cx
pascal@24013 804 ;add ax,size data_himem-4096
pascal@24013 805 mov ax,size data_himem
pascal@19571 806 call malloc_or_die
pascal@24013 807 ;mov cx,4096+4095 ; cnt = 1+(m->size+PAGE_MASK)/PAGE_SIZE;
pascal@24013 808 mov ecx,4096+4095 ; cnt = 1+(m->size+PAGE_MASK)/PAGE_SIZE;
pascal@19571 809 add ecx,[(image_himem si).size]
pascal@19571 810 shr ecx,12
pascal@19571 811 mov [curdata],ax
pascal@24013 812 mov [(image_himem si).bufv],ax ; update m->bufv
pascal@19571 813 xchg ax,si
pascal@19538 814 @@vcpi_alloc:
pascal@23996 815 mov ax,0DE04h ; allocate a 4K page => EDX
pascal@19538 816 int 67h
pascal@19538 817 or ah,ah
pascal@19538 818 mov bx,offset vcpi_alloc_err
pascal@23996 819 jnz jmpdie
pascal@19571 820 ; for (i = cnt-1; i >= 0; i--)
pascal@24015 821 ; if (edx < pm.fallback+pm.size) again
pascal@24015 822 mov bx,offset _imgs.fallback+size image_himem
pascal@24015 823 mov eax,[bx-2+6-size image_himem] ; pm.size
pascal@24015 824 add eax,[bx-2+2-size image_himem]
pascal@24015 825 cmp eax,edx ; pm.fallback+pm.size <= edx ?
pascal@24015 826 ja @@vcpi_alloc
pascal@19571 827 mov eax,ecx
pascal@19571 828 dec eax
pascal@19571 829 shl eax,12 ; i*_4k
pascal@19571 830 ; if (edx >= initrd.fallback+i*_4k && edx < initrd.fallback+initrd.size) again
pascal@24015 831 add eax,[bx-2+2] ; +initrd.fallback
pascal@19571 832 cmp eax,edx ; initrd.fallback+i*_4k > edx ?
pascal@19571 833 ja @@initrdok
pascal@24015 834 mov eax,[bx-2+6] ; initrd.size
pascal@24015 835 add eax,[bx-2+2] ; +initrd.fallback
pascal@19571 836 cmp eax,edx ; initrd.fallback+initrd.size > edx ?
pascal@24013 837 @@ja_vcpi_alloc:
pascal@19571 838 ja @@vcpi_alloc
pascal@19571 839 @@initrdok:
pascal@19571 840 cmp [(data_himem si).first],0
pascal@19571 841 jne @@notfirst
pascal@19571 842 mov [(data_himem si).first],edx
pascal@19571 843 @@notfirst:
pascal@19571 844 mov bx,[(data_himem si).cacheidx]
pascal@19571 845 cmp bh,4
pascal@19571 846 jae @@nextpage
pascal@19571 847 shl bx,2
pascal@19571 848 inc [(data_himem si).cacheidx]
pascal@24013 849 mov [(data_himem bx+si).cache],edx ; cache[cacheidx++] = edx
pascal@19571 850 loopd @@vcpi_alloc
pascal@19571 851 mov [(data_himem bx+si).cache],ecx ; last is 0
pascal@19571 852 @@nextpage:
pascal@19571 853 and [(data_himem si).cacheidx],0
pascal@19571 854 mov bx,[(data_himem si).pageidx]
pascal@19571 855 mov [(data_himem bx+si).page],edx
pascal@19571 856 add [(data_himem si).pageidx],4
pascal@19571 857 push cx
pascal@19571 858 lea cx,[(data_himem si).cache]
pascal@19571 859 ifdef NO386
pascal@19571 860 push edx
pascal@24015 861 pop ax ; to es:ax
pascal@24015 862 pop es
pascal@19571 863 endif
pascal@24015 864 call storepage ; storepage(edx/es:ax,cx)
pascal@19571 865 pop cx
pascal@19571 866 or ecx,ecx ; clear C
pascal@24013 867 jnz @@ja_vcpi_alloc
pascal@19571 868 mov [dword (data_himem si).cacheidx],ecx
pascal@19571 869 xchg ax,si
pascal@19538 870 pop si
pascal@19538 871 ret
pascal@19636 872 ifdef NO386
pascal@19636 873 p8086
pascal@19636 874 endif
pascal@19538 875
pascal@20528 876 endp @malloc_bufv_or_die$qp11image_himem
pascal@24019 877 endif
pascal@19538 878
pascal@19538 879
pascal@19538 880 ;***************************************************************
pascal@24013 881 ;_fastcall void memcpy_image_initrd(si:struct image_himem *m);
pascal@24013 882 ;_fastcall void memcpy_image_kernel(si:struct image_himem *m);
pascal@20630 883 ;_fastcall void memcpy_image(bx:struct image_himem *m);
pascal@19515 884 ;***************************************************************
pascal@24013 885 global @memcpy_image_initrd$qv:near
pascal@24013 886 @memcpy_image_initrd$qv:
pascal@24013 887 lea bx,[si+size image_himem]
pascal@23992 888 db 0A9h ; test ax,imm
pascal@24013 889 global @memcpy_image_kernel$qv:near
pascal@24013 890 @memcpy_image_kernel$qv:
pascal@23992 891 mov bx,si
pascal@20528 892 proc @memcpy_image$qp11image_himem near
pascal@19515 893
pascal@19571 894 ifndef NO386
pascal@19571 895 mov edx,[(image_himem bx).fallback]
pascal@19571 896 mov eax,[(image_himem bx).buf]
pascal@19571 897 cmp eax,edx ; if (m->fallback != m->buf)
pascal@19571 898 jz @@skip ; memcpy32(m->fallback,0,m->buf,m->size)
pascal@19571 899 mov ecx,[(image_himem bx).size]
pascal@19571 900 else
pascal@24015 901 les cx,[((image_himem bx).buf)]
pascal@21984 902 mov dx,es
pascal@24015 903 les ax,[((image_himem bx).fallback)]
pascal@19571 904 cmp ax,cx ; if (m->fallback != m->buf)
pascal@19571 905 jnz @@do
pascal@24015 906 cmp dx,[word ((image_himem bx).fallback)+2]
pascal@19571 907 jz @@skip ; memcpy32(m->fallback,0,m->buf,m->size)
pascal@19571 908 @@do:
pascal@24015 909 push [((image_himem bx).size)]
pascal@24015 910 xor bx,bx
pascal@24015 911 call_memcpy32: ; call_memcpy32(to=es:ax,fromseg=bx,fromofs=dx:cx,size)
pascal@24015 912 push dx ; [word ((image_himem bx).buf)+2]
pascal@24013 913 push cx ; [word ((image_himem bx).buf)]
pascal@24015 914 push bx
pascal@24015 915 push es ; push es:ax
pascal@19571 916 push ax
pascal@19571 917 jmp @@memcpy
pascal@24015 918 endif
pascal@20146 919 memcpy_imagez: ; memcpy_imagez(edx,eax,ecx)
pascal@19636 920 p386
pascal@19571 921 push ecx
pascal@19571 922 push eax
pascal@19571 923 push 0
pascal@24015 924 ifndef NO386
pascal@24015 925 call_memcpy32: ; call_memcpy32(to=edx,fromseg,fromofs,size)
pascal@24015 926 endif
pascal@19571 927 push edx
pascal@19636 928 ifdef NO386
pascal@19636 929 p8086
pascal@19636 930 endif
pascal@19571 931 @@memcpy:
pascal@20528 932 extrn memcpy32:near
pascal@20528 933 call near memcpy32
pascal@19571 934 @@skip:
pascal@19571 935 ret
pascal@19571 936
pascal@20528 937 endp @memcpy_image$qp11image_himem
pascal@19571 938
pascal@19571 939 ;***************************************************************
pascal@23992 940 ;_fastcall void storepage(di:u32 *dst);
pascal@19571 941 ;***************************************************************
pascal@20538 942 global @storepage$qpul:near
pascal@20538 943 proc @storepage$qpul near
pascal@19571 944
pascal@19571 945 ifndef NO386
pascal@23992 946 mov edx,[di]
pascal@19571 947 else
pascal@23992 948 les ax,[dword di]
pascal@19571 949 endif
pascal@20538 950 mov cx,offset _xfer_buf
pascal@20146 951 storepage: ; storepage(edx,cx)
pascal@19571 952 ifndef NO386
pascal@19571 953 push 0
pascal@19571 954 push 4096
pascal@19571 955 push 0
pascal@24015 956 push cx
pascal@24015 957 push ds ; call_memcpy32(to=edx,fromseg,fromofs,size)
pascal@19571 958 else
pascal@24015 959 xor dx,dx
pascal@24015 960 push dx ; 0
pascal@24015 961 mov bx,4096
pascal@24015 962 push bx ; 4096
pascal@24015 963 mov bx,ds ; call_memcpy32(to=es:ax,fromseg=bx,fromofs=dx:cx,size)
pascal@19571 964 endif
pascal@19571 965 jmp call_memcpy32
pascal@19571 966
pascal@20538 967 endp @storepage$qpul
pascal@19571 968
pascal@24019 969 ifdef VCPI
pascal@19636 970 p386
pascal@19571 971 ;***************************************************************
pascal@23992 972 ;_fastcall void reset_bufv(di:u32 *p);
pascal@19571 973 ;***************************************************************
pascal@20528 974 global @reset_bufv$qpul:near
pascal@20528 975 proc @reset_bufv$qpul near
pascal@19571 976
pascal@23992 977 mov [curdata],di
pascal@24013 978 and [dword (data_himem di).cacheidx],0 ; and pageidx=0
pascal@19571 979 ret
pascal@19571 980
pascal@20528 981 endp @reset_bufv$qpul
pascal@19571 982
pascal@19571 983 ;***************************************************************
pascal@23992 984 ;u32* di=prev_bufv();
pascal@23992 985 ;u32* di=prev_bufv();
pascal@19571 986 ;***************************************************************
pascal@19571 987 global _prev_bufv:near
pascal@19571 988 global _next_bufv:near
pascal@19571 989 proc _prev_bufv near
pascal@19571 990
pascal@19571 991 stc
pascal@19571 992 db 73h ; jnc
pascal@19571 993 _next_bufv:
pascal@19571 994 clc
pascal@24013 995 push si
pascal@23992 996 mov bx,0
pascal@22176 997 org $-2
pascal@22176 998 curdata dw ?
pascal@19571 999 sbb ax,ax
pascal@20527 1000 cmc
pascal@23992 1001 adc ax,[(data_himem bx).cacheidx] ; -1/+1
pascal@24013 1002 mov si,3ffh
pascal@24013 1003 and si,ax
pascal@24013 1004 mov [(data_himem bx).cacheidx],si
pascal@24013 1005 shl si,2
pascal@19571 1006 xor ecx,ecx
pascal@19571 1007 test ax,0fc00h
pascal@24013 1008 jz @@gotpage ; FFFF / 0400
pascal@24013 1009 xchg al,ah ; FFFC / 0004
pascal@19571 1010 and al,0fch
pascal@23992 1011 add [(data_himem bx).pageidx],ax
pascal@23992 1012 mov di,[(data_himem bx).pageidx]
pascal@23992 1013 lea di,[(data_himem bx+di).page]
pascal@19571 1014 mov edx,ds
pascal@19571 1015 shl edx,4
pascal@23992 1016 lea cx,[(data_himem bx).cache]
pascal@19571 1017 add edx,ecx
pascal@23992 1018 mov eax,[di]
pascal@19571 1019 or eax,eax
pascal@24013 1020 jz @@ret
pascal@24013 1021 mov cx,4096 ; get page
pascal@24013 1022 call memcpy_imagez ; memcpy_imagez(edx,eax,ecx)
pascal@19571 1023 @@gotpage:
pascal@24013 1024 lea ax,[(data_himem bx+si).cache]
pascal@24013 1025 or si,[(data_himem bx).pageidx] ; !pageidx && !cacheidx
pascal@19571 1026 jnz @@notfirst2
pascal@23992 1027 xchg ax,bx ; &first
pascal@19571 1028 @@notfirst2:
pascal@23992 1029 xchg ax,di
pascal@24013 1030 @@ret:
pascal@24013 1031 pop si
pascal@19571 1032 ret
pascal@19571 1033
pascal@19571 1034 endp _prev_bufv
pascal@24019 1035 endif
pascal@19571 1036
pascal@20146 1037 ifdef NO386
pascal@20146 1038 p8086
pascal@20146 1039 endif
pascal@19571 1040
pascal@19571 1041 ;***************************************************************
pascal@23996 1042 ;_fastcall int read_image(si:struct image_himem *m);
pascal@19515 1043 ;***************************************************************
pascal@20538 1044 global @read_image$qp11image_himem:near
pascal@20538 1045 proc @read_image$qp11image_himem near
pascal@19515 1046
pascal@23996 1047 push di
pascal@24020 1048 xor di,di
pascal@19515 1049 @@loop:
pascal@19538 1050 ifndef NO386
pascal@24020 1051 xor ecx,ecx
pascal@24020 1052 mov ch,4096/256
pascal@24020 1053 sub cx,di
pascal@23996 1054 mov eax,[(image_himem si).chunk_size]
pascal@19538 1055 cmp ecx,eax
pascal@19538 1056 jb @@szok
pascal@19538 1057 else
pascal@24020 1058 mov cx,4096
pascal@24020 1059 sub cx,di
pascal@23996 1060 mov ax,[word (image_himem si).chunk_size]
pascal@19538 1061 cmp cx,ax
pascal@19515 1062 jb @@szok
pascal@23996 1063 cmp [word ((image_himem si).chunk_size)+2],0 ; hi m->chunk_size
pascal@19515 1064 jne @@szok
pascal@20484 1065 endif
pascal@19515 1066 xchg ax,cx
pascal@19515 1067 @@szok:
pascal@19538 1068 jcxz image_done
pascal@24020 1069 lea dx,[di+_xfer_buf]
pascal@24020 1070 mov bx,[(image_himem si).fd]
pascal@20528 1071 call @read$cxdxbx
pascal@23806 1072 jb image_done
pascal@24020 1073 add di,ax
pascal@19538 1074 ifndef NO386
pascal@19538 1075 cwde ; ax < 8000h
pascal@24020 1076 cdq
pascal@23996 1077 sub [(image_himem si).chunk_size],eax
pascal@19538 1078 else
pascal@24020 1079 cwd ; ax < 8000h
pascal@23996 1080 sub [word (image_himem si).chunk_size],ax
pascal@23996 1081 sbb [word ((image_himem si).chunk_size)+2],dx
pascal@19538 1082 endif
pascal@19515 1083 @@fill:
pascal@24020 1084 test al,3
pascal@19515 1085 je @@filled
pascal@24020 1086 mov [di+_xfer_buf],dl
pascal@24020 1087 inc di
pascal@24020 1088 inc ax
pascal@19515 1089 jmp @@fill
pascal@19515 1090 @@filled:
pascal@19538 1091 ifndef NO386
pascal@24020 1092 sub [(image_himem si).remaining],eax
pascal@24020 1093 or edx,[word (image_himem si).chunk_size]
pascal@19538 1094 else
pascal@24020 1095 sub [word (image_himem si).remaining],ax
pascal@23996 1096 sbb [word ((image_himem si).remaining)+2],dx
pascal@24020 1097 mov ax,[word (image_himem si).chunk_size]
pascal@24020 1098 or ax,[word ((image_himem si).chunk_size)+2]
pascal@19538 1099 endif
pascal@24020 1100 jnz @@same_chunk
pascal@20778 1101 call next_chunk
pascal@19538 1102 @@same_chunk:
pascal@24020 1103 jmp @@loop
pascal@20484 1104 image_done:
pascal@24020 1105 xchg ax,di
pascal@23996 1106 pop di
pascal@20538 1107 ret
pascal@19515 1108
pascal@20538 1109 endp @read_image$qp11image_himem
pascal@19515 1110
pascal@19515 1111
pascal@19515 1112 ends _TEXT
pascal@19515 1113
pascal@19515 1114 end
pascal@19515 1115
pascal@19515 1116 ;###### END OF FILE ############################################
pascal@19825 1117