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

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