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

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