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

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