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

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