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

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