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

fusecloop/create_compressed_loop.c: add v4 support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Dec 25 15:56:57 2021 +0000 (2021-12-25)
parents 530dacfd6585
children e4805f18eb64
rev   line source
pascal@19515 1 ;***************************************************************
pascal@19515 2 ;****** This file is distributed under GPL
pascal@19515 3 ;***************************************************************
pascal@19515 4 ideal
pascal@24034 5 %PAGESIZE 255
pascal@19515 6 %crefref
pascal@19515 7 %noincl
pascal@19515 8 %nomacs
pascal@24019 9
pascal@24019 10 include "common.inc"
pascal@24019 11
pascal@19636 12 ifdef NO386
pascal@19636 13 p8086
pascal@19636 14 else
pascal@19515 15 p386
pascal@19636 16 endif
pascal@19515 17
pascal@19515 18 group DGROUP _TEXT,_DATA,_BSS
pascal@19515 19 assume cs:DGROUP,ds:DGROUP
pascal@19515 20
pascal@19515 21 segment _DATA byte public use16 'DATA'
pascal@19515 22
pascal@23996 23 loaderr db "Load failure",0
pascal@23983 24 msg_hang db "Himem broken",0
pascal@24019 25 ifdef VCPI
pascal@22668 26 vcpi_alloc_err db "VCPI"
pascal@24019 27 endif
pascal@22668 28 global overflow:byte
pascal@22668 29 overflow db "/"
pascal@23996 30 msg_malloc db "Out of memory"
pascal@23996 31 isorootofs dd 16*2048
pascal@19515 32
pascal@19515 33 ends _DATA
pascal@19515 34
pascal@19515 35 segment _BSS byte public use16 'BSS'
pascal@19515 36
pascal@24022 37 ifdef ISO9660
pascal@24022 38 global _buf2k:byte
pascal@24022 39 label _buf2k byte
pascal@24022 40 db 2048 dup (?)
pascal@24022 41 endif
pascal@24022 42 global _buf4k:byte
pascal@24022 43 label _buf4k byte
pascal@24022 44 db 4096 dup (?)
pascal@19515 45
pascal@19515 46 ends _BSS
pascal@19515 47
pascal@19515 48 segment _TEXT byte public use16 'CODE'
pascal@19515 49
pascal@24034 50 ;***************************************************************
pascal@24034 51
pascal@24034 52 struc data_himem ;struct data_himem {
pascal@24034 53 first dd ? ; 0 u32 first; *must* be the first one assume zero'd in bss
pascal@24162 54 cacheidx dw ? ; 4 int cacheidx; byte * assume zero'd in bss
pascal@24034 55 pageidx dw ? ; 6 int pageidx; byte * assume zero'd in bss
pascal@24034 56 cache dd 1024 dup(?) ; 8 int cache;
pascal@24034 57 page dd 1024 dup(?) ;4104 int page;
pascal@24034 58 ends data_himem ;};
pascal@24034 59
pascal@24034 60 include "himem.inc"
pascal@24034 61
pascal@19538 62
pascal@24019 63 ifdef NO386
pascal@20146 64 p8086
pascal@24019 65 endif
pascal@20146 66
pascal@24019 67 ifndef ISO9660
pascal@24019 68 ;***************************************************************
pascal@24162 69 ;_fastcall int:C open(bx:const char* name, const flags=O_RDONLY);
pascal@24162 70 ;_fastcall int:C openargs(bx:const char* name, const flags=O_RDONLY);
pascal@24019 71 ;***************************************************************
pascal@24019 72 global openargs:near ; openargs(bx)
pascal@24019 73 openargs:
pascal@24019 74 cmp [byte bx],'@'
pascal@24019 75 jne fail
pascal@24019 76 inc bx
pascal@24019 77
pascal@24019 78 global @open$qpxzc:near
pascal@24019 79 @open$qpxzc:
pascal@24019 80 endif
pascal@23996 81 opendos:
pascal@23996 82 ifdef LONG_FILENAME
pascal@23996 83 mov ax,716Ch
pascal@23996 84 push bx si
pascal@23996 85 mov si,bx
pascal@23996 86 xor bx,bx ; R/O
pascal@23996 87 cwd ; action = open
pascal@23996 88 stc
pascal@23996 89 int 21h
pascal@23996 90 pop si dx
pascal@24162 91 jnc @@openok
pascal@23996 92 else
pascal@24022 93 mov dx,bx ; open(DS:DX=filename,al=access,cl=attributes)
pascal@23996 94 endif
pascal@24162 95 mov ax,3d00h ; read-only+compatibility
pascal@23996 96 call dos
pascal@24019 97 ifdef ISO9660
pascal@24162 98 jc @@openret
pascal@24162 99 @@openok:
pascal@23984 100 xchg ax,bx
pascal@23996 101 mov ax,4202h
pascal@23996 102 cwd
pascal@23996 103 xor cx,cx
pascal@23996 104 int 21h
pascal@23996 105 mov [word _isostate.filesize],ax
pascal@23996 106 mov [(word _isostate.filesize)+2],dx
pascal@23984 107 xchg ax,bx
pascal@23996 108 ;xor cx,cx
pascal@23996 109 cwd
pascal@23996 110 call seeksetpos0 ; filepos = 0
pascal@24019 111 else
pascal@24162 112 @@openok:
pascal@24019 113 endif
pascal@23996 114 xchg ax,bx ; fd
pascal@24162 115 @@openret:
pascal@23996 116 ret
pascal@20146 117
pascal@24019 118 ifdef ISO9660
pascal@24022 119
pascal@24022 120 include "isostate.inc"
pascal@24022 121 extrn _isostate:isostate
pascal@24022 122
pascal@19538 123 ;***************************************************************
pascal@24162 124 ;_fastcall int:C open(bx:const char* name, const flags=O_RDONLY);
pascal@24162 125 ;_fastcall int:C openargs(bx:const char* name, const flags=O_RDONLY);
pascal@19515 126 ;***************************************************************
pascal@20538 127 global openargs:near ; openargs(bx)
pascal@20538 128 openargs:
pascal@20538 129 cmp [byte bx],'@'
pascal@20538 130 jne fail
pascal@20538 131 inc bx
pascal@20538 132
pascal@20528 133 global @open$qpxzc:near
pascal@23996 134 @open$qpxzc:
pascal@23996 135 mov ax,[_isostate.fd]
pascal@23996 136 or ax,ax
pascal@24162 137 jz opendos
pascal@23996 138 ifdef ISOHOOK
pascal@23996 139 cmp [byte bx],'!'
pascal@23996 140 je @readmenu$qv
pascal@23996 141 endif
pascal@23996 142 extrn @_isoopen$qv:near
pascal@23996 143 mov [word _isostate.filename2open],bx
pascal@23996 144 jmp @_isoopen$qv ; filepos = 0
pascal@24019 145 endif
pascal@19515 146
pascal@19515 147
pascal@19515 148 ;***************************************************************
pascal@20632 149 ;_fastcall int fileexist(bx:const char* name);
pascal@20632 150 ;***************************************************************
pascal@20632 151 global @fileexist$qpxzc:near
pascal@20632 152 @fileexist$qpxzc:
pascal@20632 153 call @open$qpxzc
pascal@24162 154 jc failifc
pascal@20632 155
pascal@20632 156 ;***************************************************************
pascal@20630 157 ;_fastcall int close(ax:int fd);
pascal@19515 158 ;***************************************************************
pascal@20528 159 global @close$qi:near
pascal@20528 160 proc @close$qi near
pascal@19515 161
pascal@20540 162 global close:near ; close(ax)
pascal@19515 163 close:
pascal@24022 164 mov bh,3Eh ; close(BX:handle)
pascal@24019 165 ifdef ISO9660
pascal@23996 166 mov cx,[_isostate.fd]
pascal@23996 167 jcxz dosbx
pascal@24162 168 ret
pascal@24162 169 else
pascal@24162 170 jmp dosbx
pascal@24019 171 endif
pascal@19515 172
pascal@20528 173 endp @close$qi
pascal@19515 174
pascal@19515 175
pascal@19515 176 ;***************************************************************
pascal@23996 177 ;_fastcall int readrm(si:struct himem *m, ax:int sz);
pascal@19515 178 ;***************************************************************
pascal@20751 179 global @readrm$qp11image_himemi:near
pascal@20751 180 @readrm$qp11image_himemi:
pascal@20751 181 xchg ax,dx ; sz
pascal@23996 182 mov ax,[si] ; fd
pascal@23996 183 mov bx,[si-2] ; data
pascal@20528 184 proc @read$qipvi near
pascal@19515 185
pascal@24162 186 @read$dxbxax: ; dx:size bx:data ax:fd
pascal@20538 187 xchg ax,bx ; fd
pascal@24162 188 @read$dxaxbx: ; dx:size ax:data bx:fd
pascal@20538 189 xchg ax,dx ; data
pascal@20538 190 xchg ax,cx ; sz
pascal@20528 191 global @read$cxdxbx:near
pascal@24162 192 @read$cxdxbx: ; cx:size dx:data bx:fd
pascal@24019 193 ifdef ISO9660
pascal@23996 194 push bx
pascal@23996 195 mov bx,offset _isostate.filepos
pascal@23996 196 push cx
pascal@24162 197 les cx,[bx-4] ; filesize
pascal@23996 198 sub cx,[bx] ; filepos
pascal@24162 199 mov ax,es
pascal@23996 200 sbb ax,[bx+2]
pascal@23996 201 pop ax
pascal@24162 202 ;jb fail ; filepos > filesize ???
pascal@24162 203 jne @@axok
pascal@23996 204 cmp cx,ax
pascal@23996 205 jb @@cxok
pascal@23996 206 @@axok:
pascal@23996 207 xchg ax,cx
pascal@23996 208 @@cxok:
pascal@23996 209 add [bx],cx
pascal@23996 210 adc [(word bx)+2],0
pascal@23996 211 pop bx
pascal@24019 212 endif
pascal@23996 213 readfd:
pascal@24022 214 mov ah,3Fh ; read(BX=handle,DS:DX=to,CX=count)
pascal@23996 215 ;jcxz fail
pascal@21628 216 dos:
pascal@21628 217 int 21h
pascal@24162 218 jnc @@doret
pascal@21628 219 fail:
pascal@21628 220 stc
pascal@21628 221 failifc:
pascal@21628 222 sbb ax,ax ; ax=-1 CF
pascal@24162 223 @@doret:
pascal@21628 224 ret
pascal@19515 225
pascal@20528 226 endp @read$qipvi
pascal@19515 227
pascal@19515 228 ;***************************************************************
pascal@22632 229 ;_fastcall long rewind(ax:int fd);
pascal@19515 230 ;***************************************************************
pascal@19899 231
pascal@22632 232 global @rewind$qi:near ; fd=ax
pascal@22632 233 proc @rewind$qi near
pascal@20542 234
pascal@23996 235 rewind:
pascal@24019 236 ifdef ISO9660
pascal@23996 237 mov bx,offset _isostate.fileofs
pascal@23996 238 jmp lseek
pascal@24019 239 else
pascal@24019 240 mov bl,0
pascal@24019 241 lseek0:
pascal@24019 242 xor cx,cx
pascal@24019 243 xor dx,dx
pascal@24019 244 jmp lseek
pascal@24019 245 endif
pascal@19515 246
pascal@22632 247 endp @rewind$qi
pascal@19825 248
pascal@23996 249
pascal@23996 250 ifdef ISOHOOK
pascal@23996 251 ;***************************************************************
pascal@24015 252 ;_fastcall int:bx readmenu(void);
pascal@23996 253 ;***************************************************************
pascal@23996 254 proc @readmenu$qv near
pascal@23996 255
pascal@24022 256 mov dx,20
pascal@23996 257 xor cx,cx
pascal@23996 258 call seeksetpos0 ; filepos = 0
pascal@24022 259 mov dx,offset _isostate.fileofs
pascal@24022 260 mov cl,8
pascal@24022 261 push dx
pascal@24022 262 call readfd ; // read x->fileofs & x->filesize
pascal@24022 263 pop bx
pascal@23996 264 ; x->fileofs = 0x7FF0 - (x->filesize &= 0xFFFF);
pascal@24152 265 mov ax,7FF0h ; old way : up to md5 signature
pascal@24152 266 @@oldway:
pascal@24152 267 xor ax,6FF0h ; new way : between Apple partitions = up to 1000h
pascal@24153 268 neg [word bx+4] ; fix x->filesize
pascal@24152 269 js @@oldway
pascal@23996 270 cwd
pascal@23996 271 mov [word bx+6],dx
pascal@23996 272 sub ax,[bx+4]
pascal@23996 273 mov [word bx+2],dx
pascal@23996 274 mov [bx],ax
pascal@23996 275 call isolseek ; filepos = 0
pascal@23996 276 xchg ax,bx ; fd
pascal@23996 277 ret
pascal@23996 278
pascal@23996 279 endp @readmenu$qv
pascal@23996 280 endif
pascal@23996 281
pascal@19825 282 ;***************************************************************
pascal@22749 283 ;_fastcall void isolseek(bx:const unsigned long *offset);
pascal@19825 284 ;***************************************************************
pascal@20528 285 global @isolseek$qpxul:near
pascal@20528 286 proc @isolseek$qpxul near
pascal@19825 287
pascal@24019 288 ifdef ISO9660
pascal@20534 289 isolseek:
pascal@20632 290 mov ax,[_isostate.fd]
pascal@23996 291 lseek:
pascal@21984 292 les dx,[dword bx]
pascal@21984 293 mov cx,es
pascal@23996 294 seeksetpos0:
pascal@23996 295 xor bx,bx
pascal@23996 296 mov [word _isostate.filepos],bx
pascal@23996 297 mov [(word _isostate.filepos)+2],bx
pascal@24019 298 else
pascal@24019 299 lseek:
pascal@24019 300 endif
pascal@23996 301 mov bh,42h ; bx=fd cx:dx=offset al=whence
pascal@23996 302 dosbx:
pascal@23996 303 xchg ax,bx
pascal@24015 304 jmp dos ; bx = fd
pascal@20534 305
pascal@20538 306 endp @isolseek$qpxul
pascal@20534 307
pascal@24019 308 ifdef ISO9660
pascal@20534 309 ;***************************************************************
pascal@20630 310 ;_fastcall int isoreadsector(bx:const unsigned long *offset);
pascal@23996 311 ;_fastcall int isoreadrootsector(void);
pascal@20534 312 ;***************************************************************
pascal@23996 313 global @isoreadrootsector$qv:near
pascal@23996 314 @isoreadrootsector$qv:
pascal@23996 315 mov bx,offset isorootofs
pascal@20534 316 global @isoreadsector$qpxul:near
pascal@20534 317 proc @isoreadsector$qpxul near
pascal@20534 318
pascal@23996 319 call isolseek ; filepos = 0
pascal@24162 320 jc failifc
pascal@24022 321 mov cx,2048
pascal@24022 322 mov dx,offset _buf2k
pascal@24022 323 jmp readfd ; read(fd,buf2k,2048)
pascal@20534 324
pascal@20534 325 endp @isoreadsector$qpxul
pascal@24019 326 endif
pascal@20534 327
pascal@21628 328
pascal@24019 329 ifdef ISO9660
pascal@23999 330 ifdef ISOHOOK
pascal@21628 331 ;***************************************************************
pascal@24034 332 ;_fastcall int strhead(ax:const char* a, bx:const char* b);
pascal@21628 333 ;***************************************************************
pascal@23996 334 global @strhead$qpxzct1:near
pascal@23996 335 proc @strhead$qpxzct1 near
pascal@21628 336
pascal@23996 337 @@loop:
pascal@24034 338 mov dh,[bx] ; dh = *b++
pascal@23996 339 inc bx
pascal@23996 340 xchg ax,bx
pascal@24034 341 or dh,dh ; clear C
pascal@24034 342 jz failifc ; return 0, bx=a tail, dh=0
pascal@24034 343 xor dh,[bx] ; dh -= *a++
pascal@23996 344 jne fail ; return -1
pascal@23996 345 inc bx
pascal@24034 346 xchg ax,bx
pascal@23996 347 jmp @@loop
pascal@21628 348
pascal@23996 349 endp @strhead$qpxzct1
pascal@21628 350
pascal@21628 351
pascal@21628 352 ;***************************************************************
pascal@24034 353 ;_fastcall int strcmp(ax:const char* a, bx:const char* b);
pascal@21628 354 ;***************************************************************
pascal@23996 355 global @strcmp$qpxzct1:near
pascal@23996 356 proc @strcmp$qpxzct1 near
pascal@21628 357
pascal@23996 358 call @strhead$qpxzct1
pascal@24162 359 or dh,[bx] ; clear C
pascal@23996 360 jne fail ; return -1
pascal@24034 361 jmp failifc ; return 0, dh=0
pascal@21628 362
pascal@23996 363 endp @strcmp$qpxzct1
pascal@21628 364
pascal@23999 365 else
pascal@23999 366
pascal@23999 367 ;***************************************************************
pascal@23999 368 ;_fastcall int strcmp(bx:const char* a, ax:const char* b);
pascal@23999 369 ;***************************************************************
pascal@23999 370 global @strcmp$qpxzct1:near
pascal@23999 371 proc @strcmp$qpxzct1 near
pascal@23999 372
pascal@23999 373 @@loop:
pascal@23999 374 xchg ax,bx
pascal@23999 375 mov dl,[bx] ; dl = *b++
pascal@23999 376 inc bx
pascal@23999 377 xchg ax,bx
pascal@23999 378 xor dl,[bx] ; dl ^= *a++
pascal@24022 379 ifndef RAW_ISO9660
pascal@24020 380 ifndef ROCKRIDGE
pascal@24020 381 and dl,0dfh ; case insensitive
pascal@24020 382 endif
pascal@24022 383 endif
pascal@23999 384 jne fail ; return -1
pascal@23999 385 inc bx
pascal@23999 386 or dl,dl ; clear C
pascal@23999 387 jz failifc ; return 0
pascal@23999 388 jmp @@loop
pascal@23999 389
pascal@23999 390 endp @strcmp$qpxzct1
pascal@23999 391 endif
pascal@24019 392 endif
pascal@19515 393
pascal@20751 394 ;***************************************************************
pascal@24034 395 ;_fastcall char* malloc_or_die(ax:unsigned size);
pascal@24034 396 ;***************************************************************
pascal@24034 397 xchg_heap_top:
pascal@24034 398 xchg ax,[bx]
pascal@24034 399 ret
pascal@24034 400
pascal@24034 401 proc @malloc_or_die$qui near
pascal@24034 402
pascal@24034 403 malloc_or_die: ; ax = malloc_or_die(ax)
pascal@24034 404 extrn _heap_top
pascal@24034 405 mov bx,offset _heap_top
pascal@24034 406 add ax,[bx]
pascal@24034 407 jnc xchg_heap_top
pascal@24034 408 mov bx,offset msg_malloc
pascal@24034 409
pascal@24034 410 endp @malloc_or_die$qui
pascal@24034 411
pascal@24034 412
pascal@24034 413 ;***************************************************************
pascal@24034 414 ;_fastcall int die(bx:const char* msg);
pascal@24034 415 ;int exit(ax:int status);
pascal@24034 416 ;int abort(void);
pascal@24034 417 ;***************************************************************
pascal@24034 418 global @die$qpxzc:near
pascal@24034 419 proc @die$qpxzc near
pascal@24034 420 @die$qpxzc:
pascal@24034 421 global die:near ; die(bx)
pascal@24034 422 die:
pascal@24034 423 call puts
pascal@24034 424 global @exit$qv:near
pascal@24034 425 @exit$qv:
pascal@24034 426 _exit:
pascal@24034 427 extrn _imgs:image_himem
pascal@24034 428 mov cx,[(word _imgs.buf)+2] ; no_exit ?
pascal@24034 429 mov ah,4Ch
pascal@24034 430 jcxz do_int21h
pascal@24034 431 mov bx, offset msg_hang
pascal@24034 432 call puts
pascal@24034 433 ; global _abort:near
pascal@24034 434 _abort:
pascal@24034 435 cli
pascal@24034 436 hlt
pascal@24034 437 jmp _abort
pascal@24034 438
pascal@24034 439 endp @die$qpxzc
pascal@24034 440
pascal@24034 441 ;***************************************************************
pascal@24162 442 ;_fastcall void puts(bx:const char* s):
pascal@24034 443 ;***************************************************************
pascal@24162 444 global @puts$qpxzc:near
pascal@24034 445
pascal@24162 446 ; global puts:near ; puts(bx)
pascal@24162 447 @putsz:
pascal@24162 448 call @putc
pascal@24162 449 @puts$qpxzc:
pascal@24162 450 puts:
pascal@24162 451 mov dl,[bx]
pascal@24162 452 inc bx
pascal@24162 453 or dl,dl
pascal@24162 454 jne @putsz
pascal@24162 455 mov dl,10
pascal@24162 456 @putc:
pascal@24162 457 cmp dl,10
pascal@24162 458 jne @putcz
pascal@24162 459 call @putcz2
pascal@24162 460 @putcz2:
pascal@24162 461 xor dl,7 ; 10^13 1010^1101
pascal@24162 462 @putcz:
pascal@24162 463 mov ah,2
pascal@24162 464 do_int21h:
pascal@24162 465 int 21h
pascal@24162 466 ret
pascal@24034 467
pascal@24034 468 ;***************************************************************
pascal@24034 469 ;static long next_chunk(struct image_himem *si);
pascal@24034 470 ;***************************************************************
pascal@24034 471 proc next_chunk near
pascal@24034 472
pascal@24034 473 ifndef NO_CLOSE
pascal@24034 474 mov ax,[(image_himem si).fd]
pascal@24034 475 call close
pascal@24034 476 endif
pascal@24034 477 ifndef NO386
pascal@24034 478 xor eax,eax
pascal@24034 479 else
pascal@24034 480 xor ax,ax
pascal@24034 481 cwd
pascal@24034 482 endif
pascal@24034 483 mov [(image_himem si).fd],ax
pascal@24034 484 mov bx,[(image_himem si).state]
pascal@24034 485 cmp al,[bx] ; ""
pascal@24034 486 jz @@end
pascal@24034 487 push di
pascal@24034 488 @@scan:
pascal@24034 489 mov al,[bx]
pascal@24034 490 mov di,bx
pascal@24034 491 or al,al
pascal@24034 492 jz @@eos
pascal@24162 493 inc bx
pascal@24034 494 sub al,','
pascal@24034 495 jnz @@scan
pascal@24034 496 @@eos:
pascal@24034 497 xchg [(image_himem si).state],bx ; set start of string
pascal@24034 498 mov [current_file],bx
pascal@24034 499 xchg [di],ax ; set temp eos (ax == 0)
pascal@24034 500 push ax
pascal@24034 501 call @open$qpxzc
pascal@24034 502 pop [word di] ; restore string
pascal@24034 503 pop di
pascal@24034 504 jnc @@opened
pascal@24034 505 loadfailure:
pascal@24034 506 ;***************************************************************
pascal@24034 507 ;_fastcall void loadfailure(void);
pascal@24034 508 ;***************************************************************
pascal@24034 509 global @loadfailure$qv:near
pascal@24034 510 @loadfailure$qv:
pascal@24034 511 mov bx,0
pascal@24034 512 org $-2
pascal@24034 513 current_file dw ?
pascal@24034 514 call puts
pascal@24034 515 mov bx,offset loaderr
pascal@24034 516 jmpdie:
pascal@24034 517 jmp die
pascal@24034 518 @@opened:
pascal@24034 519 mov [(image_himem si).fd],ax
pascal@24034 520 ifndef NO_CLOSE
pascal@24034 521 mov [(image_himem si).fd2close],ax
pascal@24034 522 endif
pascal@24034 523 ifdef ISO9660
pascal@24034 524 ifndef NO386
pascal@24034 525 mov eax,[_isostate.filesize]
pascal@24034 526 else
pascal@24034 527 les ax,[_isostate.filesize]
pascal@24034 528 mov dx,es
pascal@24034 529 endif
pascal@24034 530 else
pascal@24034 531 mov bl,02h ; SEEK_END
pascal@24034 532 call lseek0
pascal@24034 533 ifndef NO386
pascal@24034 534 push eax
pascal@24034 535 mov ax,[(image_himem si).fd]
pascal@24034 536 call rewind
pascal@24034 537 pop eax
pascal@24034 538 else
pascal@24034 539 push ax
pascal@24034 540 push dx
pascal@24034 541 mov ax,[(image_himem si).fd]
pascal@24034 542 call rewind
pascal@24034 543 pop dx
pascal@24034 544 pop ax
pascal@24034 545 endif
pascal@24034 546 endif
pascal@24034 547 @@end:
pascal@24034 548 ifndef NO386
pascal@24034 549 mov [(image_himem si).chunk_size],eax
pascal@24034 550 else
pascal@24034 551 mov [word (image_himem si).chunk_size],ax
pascal@24034 552 mov [word ((image_himem si).chunk_size)+2],dx
pascal@24034 553 endif
pascal@24034 554 ret
pascal@24034 555
pascal@24034 556 endp next_chunk
pascal@24034 557
pascal@24162 558 ifdef VCPI
pascal@24162 559 p386
pascal@24162 560 ;***************************************************************
pascal@24162 561 ;_fastcall u32* malloc_bufv_or_die(si:struct image_himem *m);
pascal@24162 562 ;***************************************************************
pascal@24162 563 global @malloc_bufv_or_die$qp11image_himem:near
pascal@24162 564 proc @malloc_bufv_or_die$qp11image_himem near
pascal@24162 565
pascal@24162 566 p386
pascal@24162 567 ;mov ecx,[(image_himem si).size]
pascal@24162 568 ;shr ecx,20 ; pages index size = size >> 20
pascal@24162 569 ;mov ax,cx
pascal@24162 570 ;add ax,size data_himem-4096
pascal@24162 571 mov ax,size data_himem
pascal@24162 572 call malloc_or_die
pascal@24162 573 ;mov cx,4096+4095 ; cnt = 1+(m->size+PAGE_MASK)/PAGE_SIZE;
pascal@24162 574 mov ecx,4096+4095 ; cnt = 1+(m->size+PAGE_MASK)/PAGE_SIZE;
pascal@24162 575 add ecx,[(image_himem si).size]
pascal@24162 576 shr ecx,12
pascal@24162 577 mov [(image_himem si).bufv],ax ; update m->bufv
pascal@24162 578 xchg ax,di
pascal@24162 579 @@vcpi_alloc:
pascal@24162 580 mov ax,0DE04h ; allocate a 4K page => EDX
pascal@24162 581 int 67h
pascal@24162 582 or ah,ah
pascal@24162 583 mov bx,offset vcpi_alloc_err
pascal@24162 584 jnz jmpdie
pascal@24162 585 ; for (i = cnt-1; i >= 0; i--)
pascal@24162 586 ; if (edx < pm.fallback+pm.size) again
pascal@24162 587 mov bx,offset _imgs.fallback+size image_himem
pascal@24162 588 mov eax,[bx-2+6-size image_himem] ; pm.size
pascal@24162 589 add eax,[bx-2+2-size image_himem]
pascal@24162 590 cmp eax,edx ; pm.fallback+pm.size <= edx ?
pascal@24162 591 ja @@vcpi_alloc
pascal@24162 592 mov eax,ecx
pascal@24162 593 dec eax
pascal@24162 594 shl eax,12 ; i*_4k
pascal@24162 595 ; if (edx >= initrd.fallback+i*_4k && edx < initrd.fallback+initrd.size) again
pascal@24162 596 add eax,[bx-2+2] ; +initrd.fallback
pascal@24162 597 cmp eax,edx ; initrd.fallback+i*_4k > edx ?
pascal@24162 598 ja @@initrdok
pascal@24162 599 mov eax,[bx-2+6] ; initrd.size
pascal@24162 600 add eax,[bx-2+2] ; +initrd.fallback
pascal@24162 601 cmp eax,edx ; initrd.fallback+initrd.size > edx ?
pascal@24162 602 ja @@vcpi_alloc
pascal@24162 603 @@initrdok:
pascal@24162 604 cmp [(data_himem di).first],0 ; zero'd in bss
pascal@24162 605 jne @@notfirst
pascal@24162 606 mov [(data_himem di).first],edx
pascal@24162 607 @@notfirst:
pascal@24162 608 mov bx,[(data_himem di).cacheidx] ; zero'd in bss
pascal@24162 609 cmp bh,10h
pascal@24162 610 jae @@nextpage
pascal@24162 611 add [(data_himem di).cacheidx],4
pascal@24162 612 mov [(data_himem bx+di).cache],edx ; cache[cacheidx++] = edx
pascal@24162 613 loopd @@vcpi_alloc
pascal@24162 614 mov [(data_himem bx+di).cache],ecx ; last is 0
pascal@24162 615 @@nextpage:
pascal@24162 616 and [(data_himem di).cacheidx],0
pascal@24162 617 mov bx,[(data_himem di).pageidx] ; zero'd in bss
pascal@24162 618 mov [(data_himem bx+di).page],edx
pascal@24162 619 add [(data_himem di).pageidx],4
pascal@24162 620 push cx
pascal@24162 621 lea cx,[(data_himem di).cache]
pascal@24162 622 ifdef NO386
pascal@24162 623 push edx
pascal@24162 624 pop ax ; to es:ax
pascal@24162 625 pop es
pascal@24162 626 endif
pascal@24162 627 call storepage ; storepage(edx/es:ax,cx)
pascal@24162 628 pop cx
pascal@24162 629 or ecx,ecx ; clear C
pascal@24162 630 jnz @@vcpi_alloc
pascal@24162 631
pascal@24162 632 endp @malloc_bufv_or_die$qp11image_himem
pascal@24162 633
pascal@24162 634 ;***************************************************************
pascal@24162 635 ;_fastcall void reset_bufv(di:u32 *p);
pascal@24162 636 ;***************************************************************
pascal@24162 637 global @reset_bufv$qpul:near
pascal@24162 638 proc @reset_bufv$qpul near
pascal@24162 639
pascal@24162 640 mov [curdata],di
pascal@24162 641 and [dword (data_himem di).cacheidx],0 ; and pageidx=0
pascal@24162 642 ret
pascal@24162 643
pascal@24162 644 endp @reset_bufv$qpul
pascal@24162 645 p8086
pascal@24162 646 endif
pascal@24162 647
pascal@24162 648 ;===============================================================
pascal@24162 649
pascal@24162 650 ;***************************************************************
pascal@24162 651 ;_fastcall void open_image(si:struct image_himem *m, ax:const char *name);
pascal@24162 652 ;***************************************************************
pascal@24162 653
pascal@24162 654 global @open_image$qp11image_himempxzc:near
pascal@24162 655 proc @open_image$qp11image_himempxzc near
pascal@24162 656
pascal@24162 657 mov [(image_himem si).state],ax
pascal@24162 658 push ax
pascal@24162 659 @@next:
pascal@24162 660 call next_chunk
pascal@24162 661 ifndef NO386
pascal@24162 662 add eax,3
pascal@24162 663 and al,0FCh
pascal@24162 664 add [(image_himem si).size],eax ; m->size += m->chunk_size size zero'd in bss
pascal@24162 665 or eax,eax
pascal@24162 666 else
pascal@24162 667 add ax,3
pascal@24162 668 adc dx,0
pascal@24162 669 and al,0FCh
pascal@24162 670 add [word (image_himem si).size],ax ; m->size += m->chunk_size size zero'd in bss
pascal@24162 671 adc [word ((image_himem si).size)+2],dx
pascal@24162 672 or ax,dx
pascal@24162 673 endif
pascal@24162 674 jnz @@next
pascal@24162 675 pop [(image_himem si).state]
pascal@24162 676
pascal@24162 677 endp @open_image$qp11image_himempxzc
pascal@24162 678
pascal@24162 679 ;===============================================================
pascal@24034 680
pascal@24034 681 ;***************************************************************
pascal@24034 682 ;_fastcall int read_image(si:struct image_himem *m);
pascal@24034 683 ;***************************************************************
pascal@24034 684 global @read_image$qp11image_himem:near
pascal@24034 685 proc @read_image$qp11image_himem near
pascal@24034 686
pascal@24034 687 push di
pascal@24034 688 xor di,di
pascal@24034 689 @@loop:
pascal@24034 690 ifndef NO386
pascal@24034 691 xor ecx,ecx
pascal@24034 692 mov ch,4096/256
pascal@24034 693 sub cx,di
pascal@24034 694 mov eax,[(image_himem si).chunk_size]
pascal@24034 695 cmp ecx,eax
pascal@24034 696 jb @@szok
pascal@24034 697 else
pascal@24034 698 mov cx,4096
pascal@24034 699 sub cx,di
pascal@24034 700 mov ax,[word (image_himem si).chunk_size]
pascal@24034 701 cmp cx,ax
pascal@24034 702 jb @@szok
pascal@24034 703 cmp [word ((image_himem si).chunk_size)+2],0 ; hi m->chunk_size
pascal@24034 704 jne @@szok
pascal@24034 705 endif
pascal@24034 706 xchg ax,cx
pascal@24034 707 @@szok:
pascal@24162 708 jcxz @@image_done
pascal@24034 709 lea dx,[di+_buf4k]
pascal@24034 710 mov bx,[(image_himem si).fd]
pascal@24034 711 call @read$cxdxbx
pascal@24162 712 jb @@image_done
pascal@24034 713 add di,ax
pascal@24034 714 ifndef NO386
pascal@24034 715 cwde ; ax < 8000h
pascal@24034 716 cdq
pascal@24034 717 sub [(image_himem si).chunk_size],eax
pascal@24034 718 else
pascal@24034 719 cwd ; ax < 8000h
pascal@24034 720 sub [word (image_himem si).chunk_size],ax
pascal@24034 721 sbb [word ((image_himem si).chunk_size)+2],dx
pascal@24034 722 endif
pascal@24034 723 @@fill:
pascal@24034 724 test al,3
pascal@24034 725 je @@filled
pascal@24034 726 mov [di+_buf4k],dl
pascal@24034 727 inc di
pascal@24034 728 inc ax
pascal@24034 729 jmp @@fill
pascal@24034 730 @@filled:
pascal@24034 731 ifndef NO386
pascal@24034 732 sub [(image_himem si).remaining],eax
pascal@24034 733 or edx,[word (image_himem si).chunk_size]
pascal@24034 734 else
pascal@24034 735 sub [word (image_himem si).remaining],ax
pascal@24034 736 sbb [word ((image_himem si).remaining)+2],dx
pascal@24034 737 mov ax,[word (image_himem si).chunk_size]
pascal@24034 738 or ax,[word ((image_himem si).chunk_size)+2]
pascal@24034 739 endif
pascal@24034 740 jnz @@same_chunk
pascal@24034 741 call next_chunk
pascal@24034 742 @@same_chunk:
pascal@24034 743 jmp @@loop
pascal@24162 744 @@image_done:
pascal@24034 745 xchg ax,di
pascal@24034 746 pop di
pascal@24034 747 ret
pascal@24034 748
pascal@24034 749 endp @read_image$qp11image_himem
pascal@24034 750
pascal@24162 751 ;===============================================================
pascal@24162 752
pascal@24034 753 ;***************************************************************
pascal@23996 754 ;_fastcall const char **argstr(bx:const char *s, ax:const char keywords[], dx:const char **var);
pascal@23993 755 ;_fastcall unsigned long *argnum(bx:char *s, ax:const char keywords[], dx:unsigned long *var);
pascal@20751 756 ;***************************************************************
pascal@20751 757 global @argstr$qpxzcxt1ppxzc:near
pascal@20751 758 proc @argstr$qpxzcxt1ppxzc near
pascal@20751 759
pascal@21569 760 mov cl,2
pascal@21569 761 db 0a9h ; test ax,#
pascal@20751 762 global @argnum$qpzcxpxzcpul:near
pascal@20751 763 @argnum$qpzcxpxzcpul:
pascal@21569 764 mov cl,4
pascal@23993 765 push bx
pascal@21569 766 xchg ax,bx ; keywords -> bx
pascal@21569 767 xchg ax,cx ; s -> cx
pascal@21569 768 cbw ; argstr:0002 argnum:0004
pascal@21569 769 xchg ax,dx ; vars -> ax
pascal@20751 770 push si di
pascal@21569 771 xchg ax,di ; vars => di
pascal@20751 772 dec bx
pascal@20751 773 sub di,dx
pascal@23797 774 @@loop:
pascal@24067 775 add di,dx
pascal@20751 776 mov si,cx ; s
pascal@20751 777 @@match:
pascal@21569 778 lodsb ; *s++
pascal@23999 779 or al,20h ; locase
pascal@24014 780 cmp al,'/' ; 2f
pascal@24014 781 jne @@notopt
pascal@24014 782 mov al,'-'
pascal@24014 783 @@notopt:
pascal@24014 784 inc bx ; keywords++
pascal@20751 785 cmp al,[bx]
pascal@20751 786 je @@match
pascal@24014 787 cmp [byte bx],dh
pascal@24014 788 je @@lastal
pascal@24014 789 cmp [byte bx],'|'
pascal@24014 790 je @@testal
pascal@24014 791 jl @@notsw ; } ~ <del>
pascal@24067 792 ;mov dl,1
pascal@24014 793 cmp al,20h ; EOS or 20h
pascal@24014 794 jne @@loop ; assume [bx] = '|'
pascal@24014 795 @@notsw:
pascal@24015 796 mov al,-1
pascal@20751 797 jne @@notopt
pascal@24067 798 jmp @@setnum2
pascal@23797 799 @@testal:
pascal@24015 800 cmp al,-1
pascal@24014 801 jz @@loop
pascal@24014 802 @@lastal:
pascal@24015 803 cmp al,'='
pascal@23996 804 xchg ax,cx ; return s if failure
pascal@23797 805 jne @@nokeyword
pascal@20751 806 dec dx
pascal@20751 807 dec dx
pascal@20751 808 je @@done
pascal@24015 809 @strtol$qpxzc:
pascal@24015 810 ifndef NO386
pascal@24015 811 xor ecx,ecx
pascal@24015 812 xor ebx,ebx
pascal@24015 813 else
pascal@24015 814 xor bx,bx
pascal@24015 815 xor cx,cx
pascal@24015 816 xor dx,dx
pascal@24015 817 endif
pascal@24015 818 lodsb
pascal@24015 819 or al,20h
pascal@24015 820 cmp al,'a'
pascal@24015 821 jb @@notvga
pascal@24015 822 sub al,'o'
pascal@24015 823 @@vgaloop:
pascal@24015 824 dec cx
pascal@24015 825 add al,6
pascal@24015 826 jnb @@vgaloop ; vga=normal,extended,ask
pascal@24015 827 @@vga:
pascal@24015 828 xchg ax,cx
pascal@24015 829 ;cwd
pascal@24015 830 jmp @@end
pascal@24015 831 @@endstrtol:
pascal@24015 832 mov cl,10
pascal@24015 833 cmp al,'k'-'a'+10
pascal@24015 834 je @@shift
pascal@24015 835 mov cl,20
pascal@24015 836 cmp al,'m'-'a'+10
pascal@24015 837 je @@shift
pascal@24015 838 mov cl,30
pascal@24015 839 cmp al,'g'-'a'+10
pascal@24015 840 ifndef NO386
pascal@24015 841 jne @@noshift
pascal@24015 842 @@shift:
pascal@24015 843 shl ebx,cl
pascal@24015 844 @@noshift:
pascal@24015 845 popf
pascal@24015 846 jnc @@end2
pascal@24015 847 neg ebx
pascal@24015 848 @@end2:
pascal@24015 849 push ebx
pascal@24015 850 pop ax
pascal@24015 851 pop dx
pascal@24015 852 else
pascal@24015 853 @@shift:
pascal@24015 854 xchg ax,bx
pascal@24015 855 jne @@noshift
pascal@24015 856 extrn N_LXLSH@:near
pascal@24015 857 call N_LXLSH@
pascal@24015 858 @@noshift:
pascal@24015 859 popf
pascal@24015 860 jne @@end
pascal@24015 861 not dx
pascal@24015 862 neg ax
pascal@24015 863 jne @@end
pascal@24015 864 inc dx
pascal@24019 865 endif
pascal@24015 866 @@end:
pascal@23999 867 @@setnum:
pascal@24067 868 mov [di+2],dx
pascal@24067 869 @@setnum2:
pascal@23993 870 xchg ax,si
pascal@20751 871 @@done:
pascal@24067 872 or [di],si
pascal@23993 873 xchg ax,di
pascal@20751 874 @@nokeyword:
pascal@23993 875 pop di si bx
pascal@20751 876 ret
pascal@20751 877
pascal@24015 878 @@notvga:
pascal@24015 879 mov cl,10 ; radix
pascal@24015 880 cmp al,'-'
pascal@24015 881 jne @@radixkeep
pascal@24015 882 lodsb
pascal@24015 883 @@radixkeep:
pascal@24015 884 pushf
pascal@24015 885 cmp al,'0'
pascal@24015 886 jne @@radixok
pascal@24015 887 mov cl,8
pascal@24015 888 lodsb
pascal@24015 889 or al,20h
pascal@24015 890 cmp al,'x'
pascal@24015 891 jne @@radixok
pascal@24015 892 mov cl,16
pascal@24015 893 @@strtollp:
pascal@24015 894 lodsb
pascal@24015 895 @@radixok:
pascal@24015 896 or al,20h
pascal@24015 897 sub al,'0'
pascal@24015 898 jb @@endstrtol
pascal@24015 899 cmp al,9
pascal@24015 900 jbe @@digitok
pascal@24015 901 cmp al,'a'-'0'
pascal@24015 902 jb @@endstrtol
pascal@24015 903 sub al,'a'-'0'-10
pascal@24015 904 @@digitok:
pascal@24015 905 cmp al,cl
pascal@24015 906 jae @@endstrtol
pascal@24015 907 cbw
pascal@24015 908 ifndef NO386
pascal@24015 909 cwde
pascal@24015 910 xchg eax,ebx
pascal@24015 911 mul ecx
pascal@24015 912 add ebx,eax
pascal@24015 913 else
pascal@24015 914 push ax
pascal@24015 915 xchg ax,dx
pascal@24015 916 mul cx
pascal@24015 917 xchg ax,bx
pascal@24015 918 mul cx
pascal@24015 919 add dx,bx
pascal@24015 920 pop bx
pascal@24015 921 add bx,ax
pascal@24015 922 adc dx,0
pascal@24015 923 endif
pascal@24015 924 jmp @@strtollp
pascal@24015 925
pascal@20751 926 endp @argstr$qpxzcxt1ppxzc
pascal@20751 927
pascal@24162 928 ;===============================================================
pascal@24162 929
pascal@24162 930 ifdef VCPI
pascal@24162 931 p386
pascal@24162 932 ;***************************************************************
pascal@24162 933 ;u32* di=prev_bufv();
pascal@24162 934 ;u32* di=prev_bufv();
pascal@24162 935 ;***************************************************************
pascal@24162 936 global _prev_bufv:near
pascal@24162 937 global _next_bufv:near
pascal@24162 938 proc _prev_bufv near
pascal@24162 939
pascal@24162 940 mov al,-4
pascal@24162 941 db 0A9h ; test ax,imm
pascal@24162 942 _next_bufv:
pascal@24162 943 mov al,4
pascal@24162 944 cbw
pascal@24162 945 push si
pascal@24162 946 mov bx,0
pascal@24162 947 org $-2
pascal@24162 948 curdata dw ?
pascal@24162 949 add ax,[(data_himem bx).cacheidx] ; -4/+4
pascal@24162 950 mov si,0fffh
pascal@24162 951 and si,ax
pascal@24162 952 mov [(data_himem bx).cacheidx],si
pascal@24162 953 xor ecx,ecx
pascal@24162 954 sar ax,12-2
pascal@24163 955 test al,4
pascal@24162 956 jz @@gotpage ; neither -4 nor 4 ?
pascal@24162 957 add [(data_himem bx).pageidx],ax
pascal@24162 958 mov di,[(data_himem bx).pageidx]
pascal@24162 959 lea di,[(data_himem bx+di).page]
pascal@24162 960 mov edx,ds
pascal@24162 961 shl edx,4
pascal@24162 962 lea cx,[(data_himem bx).cache]
pascal@24162 963 add edx,ecx
pascal@24162 964 mov eax,[di]
pascal@24162 965 or eax,eax
pascal@24162 966 jz @@ret
pascal@24162 967 mov cx,4096 ; get page
pascal@24162 968 call memcpy_imagez ; memcpy_imagez(edx,eax,ecx)
pascal@24162 969 @@gotpage:
pascal@24162 970 lea ax,[(data_himem bx+si).cache]
pascal@24162 971 or si,[(data_himem bx).pageidx] ; !pageidx && !cacheidx
pascal@24162 972 jnz @@notfirst2
pascal@24162 973 xchg ax,bx ; &first
pascal@24162 974 @@notfirst2:
pascal@24162 975 xchg ax,di
pascal@24162 976 @@ret:
pascal@24162 977 pop si
pascal@24162 978 ret
pascal@24162 979
pascal@24162 980 endp _prev_bufv
pascal@24162 981 endif
pascal@24162 982
pascal@24162 983 ;===============================================================
pascal@24162 984
pascal@24162 985 ifdef NO386
pascal@24162 986 p8086
pascal@24162 987 endif
pascal@24162 988
pascal@24162 989 ;***************************************************************
pascal@24162 990 ;_fastcall void memcpy_image_initrd(si:struct image_himem *m);
pascal@24162 991 ;_fastcall void memcpy_image_kernel(si:struct image_himem *m);
pascal@24162 992 ;_fastcall void memcpy_image(bx:struct image_himem *m);
pascal@24162 993 ;***************************************************************
pascal@24162 994 global @memcpy_image_initrd$qv:near
pascal@24162 995 @memcpy_image_initrd$qv:
pascal@24162 996 lea bx,[si+size image_himem]
pascal@24162 997 db 0A9h ; test ax,imm
pascal@24162 998 global @memcpy_image_kernel$qv:near
pascal@24162 999 @memcpy_image_kernel$qv:
pascal@24162 1000 mov bx,si
pascal@24162 1001 proc @memcpy_image$qp11image_himem near
pascal@24162 1002
pascal@24162 1003 ifndef NO386
pascal@24162 1004 mov edx,[(image_himem bx).fallback]
pascal@24162 1005 mov eax,[(image_himem bx).buf]
pascal@24162 1006 cmp eax,edx ; if (m->fallback != m->buf)
pascal@24162 1007 jz @@skip ; memcpy32(m->fallback,0,m->buf,m->size)
pascal@24162 1008 mov ecx,[(image_himem bx).size]
pascal@24162 1009 else
pascal@24162 1010 les cx,[((image_himem bx).buf)]
pascal@24162 1011 mov dx,es
pascal@24162 1012 les ax,[((image_himem bx).fallback)]
pascal@24162 1013 ;cmp ax,cx ; if (m->fallback != m->buf)
pascal@24162 1014 ;jnz @@do
pascal@24162 1015 ;cmp dx,[word ((image_himem bx).fallback)+2]
pascal@24162 1016 ;jz @@skip ; memcpy32(m->fallback,0,m->buf,m->size)
pascal@24162 1017 @@do:
pascal@24162 1018 push [((image_himem bx).size)]
pascal@24162 1019 xor bx,bx
pascal@24162 1020 call_memcpy32: ; call_memcpy32(to=es:ax,fromseg=bx,fromofs=dx:cx,size)
pascal@24162 1021 push dx ; [word ((image_himem bx).buf)+2]
pascal@24162 1022 push cx ; [word ((image_himem bx).buf)]
pascal@24162 1023 push bx
pascal@24162 1024 push es ; push es:ax
pascal@24162 1025 push ax
pascal@24162 1026 jmp @@memcpy
pascal@24162 1027 endif
pascal@24162 1028 memcpy_imagez: ; memcpy_imagez(edx,eax,ecx)
pascal@24162 1029 p386
pascal@24162 1030 push ecx
pascal@24162 1031 push eax
pascal@24162 1032 push 0
pascal@24162 1033 ifndef NO386
pascal@24162 1034 call_memcpy32: ; call_memcpy32(to=edx,fromseg,fromofs,size)
pascal@24162 1035 endif
pascal@24162 1036 push edx
pascal@24162 1037 ifdef NO386
pascal@24162 1038 p8086
pascal@24162 1039 endif
pascal@24162 1040 @@memcpy:
pascal@24162 1041 extrn memcpy32:near
pascal@24162 1042 call near memcpy32
pascal@24162 1043 @@skip:
pascal@24162 1044 ret
pascal@24162 1045
pascal@24162 1046 global movedend:near
pascal@24162 1047 movedend:
pascal@24162 1048
pascal@24162 1049 endp @memcpy_image$qp11image_himem
pascal@24162 1050
pascal@24162 1051 ;***************************************************************
pascal@24162 1052 ;_fastcall void storepage(di:u32 *dst);
pascal@24162 1053 ;***************************************************************
pascal@24162 1054 global @storepage$qpul:near
pascal@24162 1055 proc @storepage$qpul near
pascal@24162 1056
pascal@24162 1057 ifndef NO386
pascal@24162 1058 mov edx,[di]
pascal@24162 1059 else
pascal@24162 1060 les ax,[dword di]
pascal@24162 1061 endif
pascal@24162 1062 mov cx,offset _buf4k
pascal@24162 1063 storepage: ; storepage(edx,cx)
pascal@24162 1064 ifndef NO386
pascal@24162 1065 push 0
pascal@24162 1066 push 4096
pascal@24162 1067 push 0
pascal@24162 1068 push cx
pascal@24162 1069 push ds ; call_memcpy32(to=edx,fromseg,fromofs,size)
pascal@24162 1070 else
pascal@24162 1071 xor dx,dx
pascal@24162 1072 push dx ; 0
pascal@24162 1073 mov bx,4096
pascal@24162 1074 push bx ; 4096
pascal@24162 1075 mov bx,ds ; call_memcpy32(to=es:ax,fromseg=bx,fromofs=dx:cx,size)
pascal@24162 1076 endif
pascal@24162 1077 jmp call_memcpy32
pascal@24162 1078
pascal@24162 1079 endp @storepage$qpul
pascal@24162 1080
pascal@24162 1081 ;===============================================================
pascal@24162 1082
pascal@24162 1083 ;***************************************************************
pascal@24162 1084 ;_fastcall void strcatb(bx:const char* a, ax:const char* b);
pascal@24162 1085 ;***************************************************************
pascal@24162 1086 global @strcatb$qpxzct1:near
pascal@24162 1087 proc @strcatb$qpxzct1 near
pascal@24162 1088
pascal@24162 1089 push si
pascal@24162 1090 xchg ax,si ; b
pascal@24162 1091 dec bx
pascal@24162 1092 @@catlp:
pascal@24162 1093 inc bx
pascal@24162 1094 cmp [byte bx],0 ; a=bx
pascal@24162 1095 jne @@catlp
pascal@24162 1096 db 0b8h,20h ; mov ax,??20h
pascal@24162 1097 @@cpylp:
pascal@24162 1098 lodsb
pascal@24162 1099 mov [bx],al
pascal@24162 1100 inc bx
pascal@24162 1101 or al,al
pascal@24162 1102 jne @@cpylp
pascal@24162 1103 pop si
pascal@24162 1104 ret
pascal@24162 1105
pascal@24162 1106 endp @strcatb$qpxzct1
pascal@24162 1107
pascal@19515 1108
pascal@19515 1109 ends _TEXT
pascal@19515 1110
pascal@19515 1111 end
pascal@19515 1112
pascal@19515 1113 ;###### END OF FILE ############################################
pascal@19825 1114