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

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