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

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