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

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