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

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