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

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