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

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