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

Openssh (8.5p1)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Apr 08 09:21:26 2021 +0000 (2021-04-08)
parents 217c02cbbe8d
children 06547d8cf241
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@23996 539 mov ax,7FF0h
pascal@23996 540 cwd
pascal@23996 541 mov [word bx+6],dx
pascal@23996 542 sub ax,[bx+4]
pascal@23996 543 mov [word bx+2],dx
pascal@23996 544 mov [bx],ax
pascal@23996 545 call isolseek ; filepos = 0
pascal@23996 546 xchg ax,bx ; fd
pascal@23996 547 ret
pascal@23996 548
pascal@23996 549 endp @readmenu$qv
pascal@23996 550 endif
pascal@23996 551
pascal@19825 552 ;***************************************************************
pascal@22749 553 ;_fastcall void isolseek(bx:const unsigned long *offset);
pascal@19825 554 ;***************************************************************
pascal@20528 555 global @isolseek$qpxul:near
pascal@20528 556 proc @isolseek$qpxul near
pascal@19825 557
pascal@24019 558 ifdef ISO9660
pascal@20534 559 isolseek:
pascal@20632 560 mov ax,[_isostate.fd]
pascal@23996 561 lseek:
pascal@21984 562 les dx,[dword bx]
pascal@21984 563 mov cx,es
pascal@23996 564 seeksetpos0:
pascal@23996 565 xor bx,bx
pascal@23996 566 mov [word _isostate.filepos],bx
pascal@23996 567 mov [(word _isostate.filepos)+2],bx
pascal@24019 568 else
pascal@24019 569 lseek:
pascal@24019 570 endif
pascal@23996 571 mov bh,42h ; bx=fd cx:dx=offset al=whence
pascal@23996 572 dosbx:
pascal@23996 573 xchg ax,bx
pascal@24015 574 jmp dos ; bx = fd
pascal@20534 575
pascal@20538 576 endp @isolseek$qpxul
pascal@20534 577
pascal@24019 578 ifdef ISO9660
pascal@20534 579 ;***************************************************************
pascal@20630 580 ;_fastcall int isoreadsector(bx:const unsigned long *offset);
pascal@23996 581 ;_fastcall int isoreadrootsector(void);
pascal@20534 582 ;***************************************************************
pascal@23996 583 global @isoreadrootsector$qv:near
pascal@23996 584 @isoreadrootsector$qv:
pascal@23996 585 mov bx,offset isorootofs
pascal@20534 586 global @isoreadsector$qpxul:near
pascal@20534 587 proc @isoreadsector$qpxul near
pascal@20534 588
pascal@23996 589 call isolseek ; filepos = 0
pascal@22749 590 jc fail
pascal@24022 591 mov cx,2048
pascal@24022 592 mov dx,offset _buf2k
pascal@24022 593 jmp readfd ; read(fd,buf2k,2048)
pascal@20534 594
pascal@20534 595 endp @isoreadsector$qpxul
pascal@24019 596 endif
pascal@20534 597
pascal@21628 598
pascal@24019 599 ifdef ISO9660
pascal@23999 600 ifdef ISOHOOK
pascal@21628 601 ;***************************************************************
pascal@24034 602 ;_fastcall int strhead(ax:const char* a, bx:const char* b);
pascal@21628 603 ;***************************************************************
pascal@23996 604 global @strhead$qpxzct1:near
pascal@23996 605 proc @strhead$qpxzct1 near
pascal@21628 606
pascal@23996 607 @@loop:
pascal@24034 608 mov dh,[bx] ; dh = *b++
pascal@23996 609 inc bx
pascal@23996 610 xchg ax,bx
pascal@24034 611 or dh,dh ; clear C
pascal@24034 612 jz failifc ; return 0, bx=a tail, dh=0
pascal@24034 613 xor dh,[bx] ; dh -= *a++
pascal@23996 614 jne fail ; return -1
pascal@23996 615 inc bx
pascal@24034 616 xchg ax,bx
pascal@23996 617 jmp @@loop
pascal@21628 618
pascal@23996 619 endp @strhead$qpxzct1
pascal@21628 620
pascal@21628 621
pascal@21628 622 ;***************************************************************
pascal@24034 623 ;_fastcall int strcmp(ax:const char* a, bx:const char* b);
pascal@21628 624 ;***************************************************************
pascal@23996 625 global @strcmp$qpxzct1:near
pascal@23996 626 proc @strcmp$qpxzct1 near
pascal@21628 627
pascal@23996 628 call @strhead$qpxzct1
pascal@23996 629 jne fail ; return -1
pascal@24034 630 xor dh,[bx] ; clear C
pascal@23996 631 jne fail ; return -1
pascal@24034 632 jmp failifc ; return 0, dh=0
pascal@21628 633
pascal@23996 634 endp @strcmp$qpxzct1
pascal@21628 635
pascal@23999 636 else
pascal@23999 637
pascal@23999 638 ;***************************************************************
pascal@23999 639 ;_fastcall int strcmp(bx:const char* a, ax:const char* b);
pascal@23999 640 ;***************************************************************
pascal@23999 641 global @strcmp$qpxzct1:near
pascal@23999 642 proc @strcmp$qpxzct1 near
pascal@23999 643
pascal@23999 644 @@loop:
pascal@23999 645 xchg ax,bx
pascal@23999 646 mov dl,[bx] ; dl = *b++
pascal@23999 647 inc bx
pascal@23999 648 xchg ax,bx
pascal@23999 649 xor dl,[bx] ; dl ^= *a++
pascal@24022 650 ifndef RAW_ISO9660
pascal@24020 651 ifndef ROCKRIDGE
pascal@24020 652 and dl,0dfh ; case insensitive
pascal@24020 653 endif
pascal@24022 654 endif
pascal@23999 655 jne fail ; return -1
pascal@23999 656 inc bx
pascal@23999 657 or dl,dl ; clear C
pascal@23999 658 jz failifc ; return 0
pascal@23999 659 jmp @@loop
pascal@23999 660
pascal@23999 661 endp @strcmp$qpxzct1
pascal@23999 662 endif
pascal@24019 663 endif
pascal@19515 664
pascal@20751 665 ;***************************************************************
pascal@24034 666 ;_fastcall void puts(bx:const char* s):
pascal@24034 667 ;***************************************************************
pascal@24034 668 global @puts$qpxzc:near
pascal@24034 669
pascal@24034 670 ; global puts:near ; puts(bx)
pascal@24034 671 @putsz:
pascal@24034 672 call @putc
pascal@24034 673 @puts$qpxzc:
pascal@24034 674 puts:
pascal@24034 675 mov dl,[bx]
pascal@24034 676 inc bx
pascal@24034 677 or dl,dl
pascal@24034 678 jne @putsz
pascal@24034 679 mov dl,10
pascal@24034 680 @putc:
pascal@24034 681 cmp dl,10
pascal@24034 682 jne @putcz
pascal@24034 683 call @putcz2
pascal@24034 684 @putcz2:
pascal@24034 685 xor dl,7 ; 10^13 1010^1101
pascal@24034 686 @putcz:
pascal@24034 687 mov ah,2
pascal@24034 688 do_int21h:
pascal@24034 689 int 21h
pascal@24034 690 ret
pascal@24034 691
pascal@24034 692
pascal@24034 693 ;***************************************************************
pascal@24034 694 ;_fastcall char* malloc_or_die(ax:unsigned size);
pascal@24034 695 ;***************************************************************
pascal@24034 696 xchg_heap_top:
pascal@24034 697 xchg ax,[bx]
pascal@24034 698 ret
pascal@24034 699
pascal@24034 700 proc @malloc_or_die$qui near
pascal@24034 701
pascal@24034 702 malloc_or_die: ; ax = malloc_or_die(ax)
pascal@24034 703 extrn _heap_top
pascal@24034 704 mov bx,offset _heap_top
pascal@24034 705 add ax,[bx]
pascal@24034 706 jnc xchg_heap_top
pascal@24034 707 mov bx,offset msg_malloc
pascal@24034 708
pascal@24034 709 endp @malloc_or_die$qui
pascal@24034 710
pascal@24034 711
pascal@24034 712 ;***************************************************************
pascal@24034 713 ;_fastcall int die(bx:const char* msg);
pascal@24034 714 ;int exit(ax:int status);
pascal@24034 715 ;int abort(void);
pascal@24034 716 ;***************************************************************
pascal@24034 717 global @die$qpxzc:near
pascal@24034 718 proc @die$qpxzc near
pascal@24034 719 @die$qpxzc:
pascal@24034 720 global die:near ; die(bx)
pascal@24034 721 die:
pascal@24034 722 call puts
pascal@24034 723 global @exit$qv:near
pascal@24034 724 @exit$qv:
pascal@24034 725 _exit:
pascal@24034 726 extrn _imgs:image_himem
pascal@24034 727 mov cx,[(word _imgs.buf)+2] ; no_exit ?
pascal@24034 728 mov ah,4Ch
pascal@24034 729 jcxz do_int21h
pascal@24034 730 mov bx, offset msg_hang
pascal@24034 731 call puts
pascal@24034 732 ; global _abort:near
pascal@24034 733 _abort:
pascal@24034 734 cli
pascal@24034 735 hlt
pascal@24034 736 jmp _abort
pascal@24034 737
pascal@24034 738 endp @die$qpxzc
pascal@24034 739
pascal@24034 740 ;***************************************************************
pascal@24034 741 ;_fastcall void open_image(si:struct image_himem *m, ax:const char *name);
pascal@24034 742 ;***************************************************************
pascal@24034 743
pascal@24034 744 global @open_image$qp11image_himempxzc:near
pascal@24034 745 proc @open_image$qp11image_himempxzc near
pascal@24034 746
pascal@24034 747 mov [(image_himem si).state],ax
pascal@24034 748 push ax
pascal@24034 749 @@next:
pascal@24034 750 call next_chunk
pascal@24034 751 ifndef NO386
pascal@24034 752 add eax,3
pascal@24034 753 and al,0FCh
pascal@24034 754 add [(image_himem si).size],eax ; m->size += m->chunk_size size zero'd in bss
pascal@24034 755 or eax,eax
pascal@24034 756 else
pascal@24034 757 add ax,3
pascal@24034 758 adc dx,0
pascal@24034 759 and al,0FCh
pascal@24034 760 add [word (image_himem si).size],ax ; m->size += m->chunk_size size zero'd in bss
pascal@24034 761 adc [word ((image_himem si).size)+2],dx
pascal@24034 762 or ax,dx
pascal@24034 763 endif
pascal@24034 764 jnz @@next
pascal@24034 765 pop [(image_himem si).state]
pascal@24034 766
pascal@24034 767 endp @open_image$qp11image_himempxzc
pascal@24034 768
pascal@24034 769
pascal@24034 770 ;***************************************************************
pascal@24034 771 ;static long next_chunk(struct image_himem *si);
pascal@24034 772 ;***************************************************************
pascal@24034 773 proc next_chunk near
pascal@24034 774
pascal@24034 775 ifndef NO_CLOSE
pascal@24034 776 mov ax,[(image_himem si).fd]
pascal@24034 777 call close
pascal@24034 778 endif
pascal@24034 779 ifndef NO386
pascal@24034 780 xor eax,eax
pascal@24034 781 else
pascal@24034 782 xor ax,ax
pascal@24034 783 cwd
pascal@24034 784 endif
pascal@24034 785 mov [(image_himem si).fd],ax
pascal@24034 786 mov bx,[(image_himem si).state]
pascal@24034 787 cmp al,[bx] ; ""
pascal@24034 788 jz @@end
pascal@24034 789 dec bx
pascal@24034 790 push di
pascal@24034 791 @@scan:
pascal@24034 792 inc bx
pascal@24034 793 mov al,[bx]
pascal@24034 794 mov di,bx
pascal@24034 795 or al,al
pascal@24034 796 jz @@eos
pascal@24034 797 sub al,','
pascal@24034 798 jnz @@scan
pascal@24034 799 inc bx
pascal@24034 800 @@eos:
pascal@24034 801 xchg [(image_himem si).state],bx ; set start of string
pascal@24034 802 mov [current_file],bx
pascal@24034 803 xchg [di],ax ; set temp eos (ax == 0)
pascal@24034 804 push ax
pascal@24034 805 call @open$qpxzc
pascal@24034 806 pop [word di] ; restore string
pascal@24034 807 pop di
pascal@24034 808 jnc @@opened
pascal@24034 809 loadfailure:
pascal@24034 810 ;***************************************************************
pascal@24034 811 ;_fastcall void loadfailure(void);
pascal@24034 812 ;***************************************************************
pascal@24034 813 global @loadfailure$qv:near
pascal@24034 814 @loadfailure$qv:
pascal@24034 815 mov bx,0
pascal@24034 816 org $-2
pascal@24034 817 current_file dw ?
pascal@24034 818 call puts
pascal@24034 819 mov bx,offset loaderr
pascal@24034 820 jmpdie:
pascal@24034 821 jmp die
pascal@24034 822 @@opened:
pascal@24034 823 mov [(image_himem si).fd],ax
pascal@24034 824 ifndef NO_CLOSE
pascal@24034 825 mov [(image_himem si).fd2close],ax
pascal@24034 826 endif
pascal@24034 827 ifdef ISO9660
pascal@24034 828 ifndef NO386
pascal@24034 829 mov eax,[_isostate.filesize]
pascal@24034 830 else
pascal@24034 831 les ax,[_isostate.filesize]
pascal@24034 832 mov dx,es
pascal@24034 833 endif
pascal@24034 834 else
pascal@24034 835 mov bl,02h ; SEEK_END
pascal@24034 836 call lseek0
pascal@24034 837 ifndef NO386
pascal@24034 838 push eax
pascal@24034 839 mov ax,[(image_himem si).fd]
pascal@24034 840 call rewind
pascal@24034 841 pop eax
pascal@24034 842 else
pascal@24034 843 push ax
pascal@24034 844 push dx
pascal@24034 845 mov ax,[(image_himem si).fd]
pascal@24034 846 call rewind
pascal@24034 847 pop dx
pascal@24034 848 pop ax
pascal@24034 849 endif
pascal@24034 850 endif
pascal@24034 851 @@end:
pascal@24034 852 ifndef NO386
pascal@24034 853 mov [(image_himem si).chunk_size],eax
pascal@24034 854 else
pascal@24034 855 mov [word (image_himem si).chunk_size],ax
pascal@24034 856 mov [word ((image_himem si).chunk_size)+2],dx
pascal@24034 857 endif
pascal@24034 858 ret
pascal@24034 859
pascal@24034 860 endp next_chunk
pascal@24034 861
pascal@24034 862
pascal@24034 863 ;***************************************************************
pascal@24034 864 ;_fastcall int read_image(si:struct image_himem *m);
pascal@24034 865 ;***************************************************************
pascal@24034 866 global @read_image$qp11image_himem:near
pascal@24034 867 proc @read_image$qp11image_himem near
pascal@24034 868
pascal@24034 869 push di
pascal@24034 870 xor di,di
pascal@24034 871 @@loop:
pascal@24034 872 ifndef NO386
pascal@24034 873 xor ecx,ecx
pascal@24034 874 mov ch,4096/256
pascal@24034 875 sub cx,di
pascal@24034 876 mov eax,[(image_himem si).chunk_size]
pascal@24034 877 cmp ecx,eax
pascal@24034 878 jb @@szok
pascal@24034 879 else
pascal@24034 880 mov cx,4096
pascal@24034 881 sub cx,di
pascal@24034 882 mov ax,[word (image_himem si).chunk_size]
pascal@24034 883 cmp cx,ax
pascal@24034 884 jb @@szok
pascal@24034 885 cmp [word ((image_himem si).chunk_size)+2],0 ; hi m->chunk_size
pascal@24034 886 jne @@szok
pascal@24034 887 endif
pascal@24034 888 xchg ax,cx
pascal@24034 889 @@szok:
pascal@24034 890 jcxz image_done
pascal@24034 891 lea dx,[di+_buf4k]
pascal@24034 892 mov bx,[(image_himem si).fd]
pascal@24034 893 call @read$cxdxbx
pascal@24034 894 jb image_done
pascal@24034 895 add di,ax
pascal@24034 896 ifndef NO386
pascal@24034 897 cwde ; ax < 8000h
pascal@24034 898 cdq
pascal@24034 899 sub [(image_himem si).chunk_size],eax
pascal@24034 900 else
pascal@24034 901 cwd ; ax < 8000h
pascal@24034 902 sub [word (image_himem si).chunk_size],ax
pascal@24034 903 sbb [word ((image_himem si).chunk_size)+2],dx
pascal@24034 904 endif
pascal@24034 905 @@fill:
pascal@24034 906 test al,3
pascal@24034 907 je @@filled
pascal@24034 908 mov [di+_buf4k],dl
pascal@24034 909 inc di
pascal@24034 910 inc ax
pascal@24034 911 jmp @@fill
pascal@24034 912 @@filled:
pascal@24034 913 ifndef NO386
pascal@24034 914 sub [(image_himem si).remaining],eax
pascal@24034 915 or edx,[word (image_himem si).chunk_size]
pascal@24034 916 else
pascal@24034 917 sub [word (image_himem si).remaining],ax
pascal@24034 918 sbb [word ((image_himem si).remaining)+2],dx
pascal@24034 919 mov ax,[word (image_himem si).chunk_size]
pascal@24034 920 or ax,[word ((image_himem si).chunk_size)+2]
pascal@24034 921 endif
pascal@24034 922 jnz @@same_chunk
pascal@24034 923 call next_chunk
pascal@24034 924 @@same_chunk:
pascal@24034 925 jmp @@loop
pascal@24034 926 image_done:
pascal@24034 927 xchg ax,di
pascal@24034 928 pop di
pascal@24034 929 ret
pascal@24034 930
pascal@24034 931 endp @read_image$qp11image_himem
pascal@24034 932
pascal@24034 933 ;***************************************************************
pascal@23996 934 ;_fastcall const char **argstr(bx:const char *s, ax:const char keywords[], dx:const char **var);
pascal@23993 935 ;_fastcall unsigned long *argnum(bx:char *s, ax:const char keywords[], dx:unsigned long *var);
pascal@20751 936 ;***************************************************************
pascal@20751 937 global @argstr$qpxzcxt1ppxzc:near
pascal@20751 938 proc @argstr$qpxzcxt1ppxzc near
pascal@20751 939
pascal@21569 940 mov cl,2
pascal@21569 941 db 0a9h ; test ax,#
pascal@20751 942 global @argnum$qpzcxpxzcpul:near
pascal@20751 943 @argnum$qpzcxpxzcpul:
pascal@21569 944 mov cl,4
pascal@23993 945 push bx
pascal@21569 946 xchg ax,bx ; keywords -> bx
pascal@21569 947 xchg ax,cx ; s -> cx
pascal@21569 948 cbw ; argstr:0002 argnum:0004
pascal@21569 949 xchg ax,dx ; vars -> ax
pascal@20751 950 push si di
pascal@21569 951 xchg ax,di ; vars => di
pascal@20751 952 dec bx
pascal@20751 953 sub di,dx
pascal@23797 954 @@loop:
pascal@20751 955 mov si,cx ; s
pascal@20751 956 add di,dx
pascal@20751 957 @@match:
pascal@21569 958 lodsb ; *s++
pascal@23999 959 or al,20h ; locase
pascal@24014 960 cmp al,'/' ; 2f
pascal@24014 961 jne @@notopt
pascal@24014 962 mov al,'-'
pascal@24014 963 @@notopt:
pascal@24014 964 inc bx ; keywords++
pascal@20751 965 cmp al,[bx]
pascal@20751 966 je @@match
pascal@24014 967 cmp [byte bx],dh
pascal@24014 968 je @@lastal
pascal@24014 969 cmp [byte bx],'|'
pascal@24014 970 je @@testal
pascal@24014 971 jl @@notsw ; } ~ <del>
pascal@24014 972 cmp al,20h ; EOS or 20h
pascal@24014 973 jne @@loop ; assume [bx] = '|'
pascal@24014 974 @@notsw:
pascal@24015 975 mov al,-1
pascal@20751 976 jne @@notopt
pascal@24014 977 jmp @@setnum
pascal@23797 978 @@testal:
pascal@24015 979 cmp al,-1
pascal@24014 980 jz @@loop
pascal@24014 981 @@lastal:
pascal@24015 982 cmp al,'='
pascal@23996 983 xchg ax,cx ; return s if failure
pascal@23797 984 jne @@nokeyword
pascal@20751 985 dec dx
pascal@20751 986 dec dx
pascal@20751 987 je @@done
pascal@24015 988 @strtol$qpxzc:
pascal@24015 989 ifndef NO386
pascal@24015 990 xor ecx,ecx
pascal@24015 991 xor ebx,ebx
pascal@24015 992 else
pascal@24015 993 xor bx,bx
pascal@24015 994 xor cx,cx
pascal@24015 995 xor dx,dx
pascal@24015 996 endif
pascal@24015 997 lodsb
pascal@24015 998 or al,20h
pascal@24015 999 cmp al,'a'
pascal@24015 1000 jb @@notvga
pascal@24015 1001 sub al,'o'
pascal@24015 1002 @@vgaloop:
pascal@24015 1003 dec cx
pascal@24015 1004 add al,6
pascal@24015 1005 jnb @@vgaloop ; vga=normal,extended,ask
pascal@24015 1006 @@vga:
pascal@24015 1007 xchg ax,cx
pascal@24015 1008 ;cwd
pascal@24015 1009 jmp @@end
pascal@24015 1010 @@endstrtol:
pascal@24015 1011 mov cl,10
pascal@24015 1012 cmp al,'k'-'a'+10
pascal@24015 1013 je @@shift
pascal@24015 1014 mov cl,20
pascal@24015 1015 cmp al,'m'-'a'+10
pascal@24015 1016 je @@shift
pascal@24015 1017 mov cl,30
pascal@24015 1018 cmp al,'g'-'a'+10
pascal@24015 1019 ifndef NO386
pascal@24015 1020 jne @@noshift
pascal@24015 1021 @@shift:
pascal@24015 1022 shl ebx,cl
pascal@24015 1023 @@noshift:
pascal@24015 1024 popf
pascal@24015 1025 jnc @@end2
pascal@24015 1026 neg ebx
pascal@24015 1027 @@end2:
pascal@24015 1028 push ebx
pascal@24015 1029 pop ax
pascal@24015 1030 pop dx
pascal@24015 1031 else
pascal@24015 1032 @@shift:
pascal@24015 1033 xchg ax,bx
pascal@24015 1034 jne @@noshift
pascal@24015 1035 extrn N_LXLSH@:near
pascal@24015 1036 call N_LXLSH@
pascal@24015 1037 @@noshift:
pascal@24015 1038 popf
pascal@24015 1039 jne @@end
pascal@24015 1040 not dx
pascal@24015 1041 neg ax
pascal@24015 1042 jne @@end
pascal@24015 1043 inc dx
pascal@24019 1044 endif
pascal@24015 1045 @@end:
pascal@23999 1046 @@setnum:
pascal@23993 1047 xchg ax,si
pascal@20751 1048 mov [di+2],dx
pascal@20751 1049 @@done:
pascal@23993 1050 mov [di],si
pascal@23993 1051 xchg ax,di
pascal@20751 1052 @@nokeyword:
pascal@23993 1053 pop di si bx
pascal@20751 1054 ret
pascal@20751 1055
pascal@24015 1056 @@notvga:
pascal@24015 1057 mov cl,10 ; radix
pascal@24015 1058 cmp al,'-'
pascal@24015 1059 jne @@radixkeep
pascal@24015 1060 lodsb
pascal@24015 1061 @@radixkeep:
pascal@24015 1062 pushf
pascal@24015 1063 cmp al,'0'
pascal@24015 1064 jne @@radixok
pascal@24015 1065 mov cl,8
pascal@24015 1066 lodsb
pascal@24015 1067 or al,20h
pascal@24015 1068 cmp al,'x'
pascal@24015 1069 jne @@radixok
pascal@24015 1070 mov cl,16
pascal@24015 1071 @@strtollp:
pascal@24015 1072 lodsb
pascal@24015 1073 @@radixok:
pascal@24015 1074 or al,20h
pascal@24015 1075 sub al,'0'
pascal@24015 1076 jb @@endstrtol
pascal@24015 1077 cmp al,9
pascal@24015 1078 jbe @@digitok
pascal@24015 1079 cmp al,'a'-'0'
pascal@24015 1080 jb @@endstrtol
pascal@24015 1081 sub al,'a'-'0'-10
pascal@24015 1082 @@digitok:
pascal@24015 1083 cmp al,cl
pascal@24015 1084 jae @@endstrtol
pascal@24015 1085 cbw
pascal@24015 1086 ifndef NO386
pascal@24015 1087 cwde
pascal@24015 1088 xchg eax,ebx
pascal@24015 1089 mul ecx
pascal@24015 1090 add ebx,eax
pascal@24015 1091 else
pascal@24015 1092 push ax
pascal@24015 1093 xchg ax,dx
pascal@24015 1094 mul cx
pascal@24015 1095 xchg ax,bx
pascal@24015 1096 mul cx
pascal@24015 1097 add dx,bx
pascal@24015 1098 pop bx
pascal@24015 1099 add bx,ax
pascal@24015 1100 adc dx,0
pascal@24015 1101 endif
pascal@24015 1102 jmp @@strtollp
pascal@24015 1103
pascal@20751 1104 endp @argstr$qpxzcxt1ppxzc
pascal@20751 1105
pascal@19515 1106
pascal@19515 1107 ends _TEXT
pascal@19515 1108
pascal@19515 1109 end
pascal@19515 1110
pascal@19515 1111 ;###### END OF FILE ############################################
pascal@19825 1112