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

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