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

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