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

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