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

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