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

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