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

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