3433 lines
108 KiB
Plaintext
3433 lines
108 KiB
Plaintext
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/adi.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00000 .define .adi
|
||
00001
|
||
00002 .text
|
||
00003 .adi:
|
||
00004 pop bx
|
||
00005 cmp cx,#2
|
||
00006 jne 1f
|
||
00007 pop cx
|
||
00008 add ax,cx
|
||
00009 jmp (bx)
|
||
00010 1:
|
||
00011 cmp cx,#4
|
||
00012 jne 9f
|
||
00013 pop dx
|
||
00014 pop cx
|
||
00015 add ax,cx
|
||
00016 pop cx
|
||
00017 adc dx,cx
|
||
00018 push dx
|
||
00019 jmp (bx)
|
||
00020 9:
|
||
00021 .extern .trpilin
|
||
00022 push bx
|
||
00023 jmp .trpilin
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/and.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00100 .define .and
|
||
00101
|
||
00102 ! #bytes in cx
|
||
00103 ! save di; it might be a register variable
|
||
00104
|
||
00105 .text
|
||
00106 .and:
|
||
00107 pop bx ! return address
|
||
00108 mov dx,di
|
||
00109 mov di,sp
|
||
00110 add di,cx
|
||
00111 sar cx,#1
|
||
00112 1:
|
||
00113 pop ax
|
||
00114 and ax,(di)
|
||
00115 stos
|
||
00116 loop 1b
|
||
00117 mov di,dx
|
||
00118 jmp (bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/blm.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00200 .define .blm
|
||
00201 .text
|
||
00202
|
||
00203 ! cx: count in words
|
||
00204 .blm:
|
||
00205 mov bx,sp
|
||
00206 mov ax,si
|
||
00207 mov dx,di
|
||
00208 mov di,2(bx)
|
||
00209 mov si,4(bx)
|
||
00210 rep
|
||
00211 mov
|
||
00212 mov si,ax
|
||
00213 mov di,dx
|
||
00214 ret 4
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/cii.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00300 .define .cii
|
||
00301
|
||
00302 .text
|
||
00303 .cii:
|
||
00304 pop bx ! return address
|
||
00305 ! pop cx, dest. size
|
||
00306 ! pop dx, src. size
|
||
00307 ! ax is first word of source
|
||
00308 cmp dx,#1
|
||
00309 jne 2f
|
||
00310 cbw
|
||
00311 mov dx,#2
|
||
00312 2:
|
||
00313 cmp dx,cx
|
||
00314 je 8f
|
||
00315 cmp dx,#2
|
||
00316 je 1f
|
||
00317 cmp dx,#4
|
||
00318 jne 9f
|
||
00319 cmp cx,#2
|
||
00320 jne 9f
|
||
00321 pop dx
|
||
00322 8:
|
||
00323 jmp (bx)
|
||
00324 1:
|
||
00325 cmp cx,#4
|
||
00326 jne 9f
|
||
00327 cwd
|
||
00328 push dx
|
||
00329 jmp (bx)
|
||
00330 9:
|
||
00331 push ax ! push low source
|
||
00332 EILLINS = 18
|
||
00333 .extern .fat
|
||
00334 mov ax,#EILLINS
|
||
00335 push ax
|
||
00336 jmp .fat
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/cmi4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00400 .define .cmi4
|
||
00401
|
||
00402 .text
|
||
00403 .cmi4:
|
||
00404 pop bx ! return address
|
||
00405 pop cx
|
||
00406 pop dx
|
||
00407 pop ax
|
||
00408 push si
|
||
00409 mov si,sp
|
||
00410 xchg bx,2(si)
|
||
00411 pop si
|
||
00412 cmp bx,dx
|
||
00413 jg 1f
|
||
00414 jl 2f
|
||
00415 cmp ax,cx
|
||
00416 ja 1f
|
||
00417 je 3f
|
||
00418 2:
|
||
00419 mov ax,#-1
|
||
00420 ret
|
||
00421 3:
|
||
00422 xor ax,ax
|
||
00423 ret
|
||
00424 1:
|
||
00425 mov ax,#1
|
||
00426 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/cms.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00500 .define .cms
|
||
00501
|
||
00502 ! #bytes in cx
|
||
00503 .text
|
||
00504 .cms:
|
||
00505 pop bx ! return address
|
||
00506 mov dx,sp
|
||
00507 push si
|
||
00508 push di
|
||
00509 mov si,dx
|
||
00510 add dx,cx
|
||
00511 mov di,dx
|
||
00512 add dx,cx
|
||
00513 sar cx,#1
|
||
00514 repe
|
||
00515 cmp
|
||
00516 je 1f
|
||
00517 inc cx
|
||
00518 1:
|
||
00519 pop di
|
||
00520 pop si
|
||
00521 mov sp,dx
|
||
00522 jmp (bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/cmu4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00600 .define .cmu4
|
||
00601
|
||
00602 .text
|
||
00603 .cmu4:
|
||
00604 pop bx ! return address
|
||
00605 pop cx
|
||
00606 pop dx
|
||
00607 pop ax
|
||
00608 push si
|
||
00609 mov si,sp
|
||
00610 xchg bx,2(si)
|
||
00611 pop si
|
||
00612 cmp bx,dx
|
||
00613 ja 1f
|
||
00614 jb 2f
|
||
00615 cmp ax,cx
|
||
00616 ja 1f
|
||
00617 je 3f
|
||
00618 2:
|
||
00619 mov ax,#-1
|
||
00620 ret
|
||
00621 3:
|
||
00622 xor ax,ax
|
||
00623 ret
|
||
00624 1:
|
||
00625 mov ax,#1
|
||
00626 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/com.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00700 .define .com
|
||
00701
|
||
00702 ! #bytes in cx
|
||
00703 .text
|
||
00704 .com:
|
||
00705 mov bx,sp
|
||
00706 inc bx
|
||
00707 inc bx
|
||
00708 sar cx,#1
|
||
00709 1:
|
||
00710 not (bx)
|
||
00711 inc bx
|
||
00712 inc bx
|
||
00713 loop 1b
|
||
00714 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/csa2.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00800 .define .csa2
|
||
00801
|
||
00802 .text
|
||
00803 .csa2:
|
||
00804 ! bx, descriptor address
|
||
00805 ! ax, index
|
||
00806 mov dx,(bx) ! default
|
||
00807 sub ax,2(bx)
|
||
00808 cmp ax,4(bx)
|
||
00809 ja 1f
|
||
00810 sal ax,#1
|
||
00811 add bx,ax
|
||
00812 mov bx,6(bx)
|
||
00813 test bx,bx
|
||
00814 jnz 2f
|
||
00815 1:
|
||
00816 mov bx,dx
|
||
00817 test bx,bx
|
||
00818 jnz 2f
|
||
00819 ECASE = 20
|
||
00820 .extern .fat
|
||
00821 mov ax,#ECASE
|
||
00822 push ax
|
||
00823 jmp .fat
|
||
00824 2:
|
||
00825 jmp (bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/csa4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00900 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
00901 .define .csa4
|
||
00902
|
||
00903 .sect .text
|
||
00904 .csa4:
|
||
00905 ! bx, descriptor address
|
||
00906 ! ax, dx: index
|
||
00907 mov cx,(bx) ! default
|
||
00908 sub ax,2(bx)
|
||
00909 ! ignore high order word; if non-zero, the
|
||
00910 ! case descriptor would not fit anyway
|
||
00911 cmp ax,6(bx)
|
||
00912 ja 1f
|
||
00913 2:
|
||
00914 sal ax,#1
|
||
00915 add bx,ax
|
||
00916 mov bx,10(bx)
|
||
00917 test bx,bx
|
||
00918 jnz 2f
|
||
00919 1:
|
||
00920 mov bx,cx
|
||
00921 test bx,bx
|
||
00922 jnz 2f
|
||
00923 ECASE = 20
|
||
00924 .extern .fat
|
||
00925 mov ax,#ECASE
|
||
00926 push ax
|
||
00927 jmp .fat
|
||
00928 2:
|
||
00929 jmp (bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/csb2.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01000 .define .csb2
|
||
01001
|
||
01002 .text
|
||
01003 .csb2:
|
||
01004 !bx, descriptor address
|
||
01005 !ax, index
|
||
01006 mov dx,(bx)
|
||
01007 mov cx,2(bx)
|
||
01008 1:
|
||
01009 add bx,#4
|
||
01010 dec cx
|
||
01011 jl 4f
|
||
01012 cmp ax,(bx)
|
||
01013 jne 1b
|
||
01014 mov bx,2(bx)
|
||
01015 2:
|
||
01016 test bx,bx
|
||
01017 jnz 3f
|
||
01018 ECASE = 20
|
||
01019 .extern .fat
|
||
01020 mov ax,#ECASE
|
||
01021 push ax
|
||
01022 jmp .fat
|
||
01023 3:
|
||
01024 jmp (bx)
|
||
01025 4:
|
||
01026 mov bx,dx
|
||
01027 jmp 2b
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/csb4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01100 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
01101 .define .csb4
|
||
01102
|
||
01103 .sect .text
|
||
01104 .csb4:
|
||
01105 !bx: descriptor address
|
||
01106 !ax, dx: index
|
||
01107 push (bx) ! default
|
||
01108 mov cx,2(bx) ! count (ignore high order word, the descriptor
|
||
01109 ! would not fit anyway)
|
||
01110 1:
|
||
01111 add bx,#6
|
||
01112 dec cx
|
||
01113 jl 4f
|
||
01114 cmp ax,(bx)
|
||
01115 jne 1b
|
||
01116 cmp dx,2(bx)
|
||
01117 jne 1b
|
||
01118 pop bx
|
||
01119 mov bx,4(bx)
|
||
01120 2:
|
||
01121 test bx,bx
|
||
01122 jnz 3f
|
||
01123 ECASE = 20
|
||
01124 .extern .fat
|
||
01125 mov ax,#ECASE
|
||
01126 push ax
|
||
01127 jmp .fat
|
||
01128 3:
|
||
01129 jmp (bx)
|
||
01130 4:
|
||
01131 pop bx
|
||
01132 jmp 2b
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/cuu.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01200 .define .ciu
|
||
01201 .define .cui
|
||
01202 .define .cuu
|
||
01203
|
||
01204 .text
|
||
01205 .ciu:
|
||
01206 .cui:
|
||
01207 .cuu:
|
||
01208 pop bx ! return address
|
||
01209 ! pop cx, dest. size
|
||
01210 ! pop dx, source size
|
||
01211 ! ax is low word of source
|
||
01212 cmp dx,cx
|
||
01213 je 8f
|
||
01214 cmp dx,#2
|
||
01215 je 1f
|
||
01216 cmp dx,#4
|
||
01217 jne 9f
|
||
01218 cmp cx,#2
|
||
01219 jne 9f
|
||
01220 pop dx
|
||
01221 8:
|
||
01222 jmp (bx)
|
||
01223 1:
|
||
01224 cmp cx,#4
|
||
01225 jne 9f
|
||
01226 xor dx,dx
|
||
01227 push dx
|
||
01228 jmp (bx)
|
||
01229 9:
|
||
01230 push ax ! to help debugging ?
|
||
01231 EILLINS = 18
|
||
01232 .extern .fat
|
||
01233 mov ax,#EILLINS
|
||
01234 push ax
|
||
01235 jmp .fat
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/dup.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01300 .define .dup
|
||
01301
|
||
01302 ! #bytes in cx
|
||
01303 .text
|
||
01304 .dup:
|
||
01305 pop bx ! return address
|
||
01306 mov ax,si
|
||
01307 mov dx,di
|
||
01308 mov si,sp
|
||
01309 sub sp,cx
|
||
01310 mov di,sp
|
||
01311 sar cx,#1
|
||
01312 rep
|
||
01313 mov
|
||
01314 mov si,ax
|
||
01315 mov di,dx
|
||
01316 jmp (bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/dvi4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01400 .define .dvi4
|
||
01401
|
||
01402 yl=6
|
||
01403 yh=8
|
||
01404 xl=10
|
||
01405 xh=12
|
||
01406
|
||
01407 .text
|
||
01408 .dvi4:
|
||
01409 push si
|
||
01410 push di
|
||
01411 mov si,sp ! copy of sp
|
||
01412 mov bx,yl(si)
|
||
01413 mov ax,yh(si)
|
||
01414 cwd
|
||
01415 mov di,dx
|
||
01416 cmp dx,ax
|
||
01417 jne 7f
|
||
01418 and dx,dx
|
||
01419 jge 1f
|
||
01420 neg bx
|
||
01421 je 7f
|
||
01422 1:
|
||
01423 xor dx,dx
|
||
01424 mov cx,xl(si)
|
||
01425 mov ax,xh(si)
|
||
01426 and ax,ax
|
||
01427 jge 2f
|
||
01428 neg ax
|
||
01429 neg cx
|
||
01430 sbb ax,dx
|
||
01431 not di
|
||
01432 2:
|
||
01433 div bx
|
||
01434 xchg ax,cx
|
||
01435 div bx ! cx = high abs(result), ax=low abs(result)
|
||
01436 9:
|
||
01437 and di,di
|
||
01438 jge 1f
|
||
01439 neg cx
|
||
01440 neg ax
|
||
01441 sbb cx,#0
|
||
01442 1:
|
||
01443 ! cx is high order result
|
||
01444 ! ax is low order result
|
||
01445 mov dx,cx
|
||
01446 pop di
|
||
01447 pop si
|
||
01448 ret 8 ! result in ax/dx
|
||
01449
|
||
01450 7:
|
||
01451 push dx ! sign of y
|
||
01452 mov di,ax
|
||
01453 xor bx,bx
|
||
01454 and di,di
|
||
01455 jge 1f
|
||
01456 neg di
|
||
01457 neg yl(si)
|
||
01458 sbb di,bx
|
||
01459 1:
|
||
01460 mov ax,xl(si)
|
||
01461 mov dx,xh(si)
|
||
01462 and dx,dx
|
||
01463 jge 1f
|
||
01464 neg dx
|
||
01465 neg ax
|
||
01466 sbb dx,bx
|
||
01467 not -2(si)
|
||
01468 1:
|
||
01469 mov cx,#16
|
||
01470 1:
|
||
01471 shl ax,#1
|
||
01472 rcl dx,#1
|
||
01473 rcl bx,#1
|
||
01474 cmp di,bx
|
||
01475 ja 3f
|
||
01476 jb 2f
|
||
01477 cmp yl(si),dx
|
||
01478 jbe 2f
|
||
01479 3:
|
||
01480 loop 1b
|
||
01481 jmp 1f
|
||
01482 2:
|
||
01483 sub dx,yl(si)
|
||
01484 sbb bx,di
|
||
01485 inc ax
|
||
01486 loop 1b
|
||
01487 1:
|
||
01488 pop di ! di=sign of result,ax= result
|
||
01489 jmp 9b
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/dvu4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01500 .define .dvu4
|
||
01501
|
||
01502 yl=6
|
||
01503 yh=8
|
||
01504 xl=10
|
||
01505 xh=12
|
||
01506
|
||
01507 .text
|
||
01508 .dvu4:
|
||
01509 push si
|
||
01510 push di
|
||
01511 mov si,sp ! copy of sp
|
||
01512 mov bx,yl(si)
|
||
01513 mov ax,yh(si)
|
||
01514 or ax,ax
|
||
01515 jne 7f
|
||
01516 xor dx,dx
|
||
01517 mov cx,xl(si)
|
||
01518 mov ax,xh(si)
|
||
01519 div bx
|
||
01520 xchg ax,cx
|
||
01521 div bx
|
||
01522 9:
|
||
01523 ! cx is high order result
|
||
01524 ! ax is low order result
|
||
01525 mov dx,cx
|
||
01526 pop di
|
||
01527 pop si
|
||
01528 ret 8 ! result in ax/dx
|
||
01529
|
||
01530 7:
|
||
01531 mov di,ax
|
||
01532 xor bx,bx
|
||
01533 mov ax,xl(si)
|
||
01534 mov dx,xh(si)
|
||
01535 mov cx,#16
|
||
01536 1:
|
||
01537 shl ax,#1
|
||
01538 rcl dx,#1
|
||
01539 rcl bx,#1
|
||
01540 cmp di,bx
|
||
01541 ja 3f
|
||
01542 jb 2f
|
||
01543 cmp yl(si),dx
|
||
01544 jbe 2f
|
||
01545 3:
|
||
01546 loop 1b
|
||
01547 jmp 9b
|
||
01548 2:
|
||
01549 sub dx,yl(si)
|
||
01550 sbb bx,di
|
||
01551 inc ax
|
||
01552 loop 1b
|
||
01553 jmp 9b
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/error.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01600 .define .error
|
||
01601 .define .Xtrp
|
||
01602
|
||
01603 ! ax is trap number
|
||
01604 ! all registers must be saved
|
||
01605 ! because return is possible
|
||
01606 ! May only be called with error no's <16
|
||
01607 .text
|
||
01608 .error:
|
||
01609 push bp
|
||
01610 push si
|
||
01611 push di
|
||
01612 push dx
|
||
01613 push cx
|
||
01614 push bx
|
||
01615 push ax
|
||
01616 mov cx,ax
|
||
01617 mov bx,#1
|
||
01618 sal bx,cl
|
||
01619 .extern .ignmask
|
||
01620 .extern .trp
|
||
01621 test bx,.ignmask
|
||
01622 jne 2f
|
||
01623 call .trp
|
||
01624 2:
|
||
01625 pop ax
|
||
01626 pop bx
|
||
01627 pop cx
|
||
01628 pop dx
|
||
01629 pop di
|
||
01630 pop si
|
||
01631 pop bp
|
||
01632 ret
|
||
01633
|
||
01634 .Xtrp:
|
||
01635 cmp ax,#16
|
||
01636 jge 1f
|
||
01637 call .error
|
||
01638 ret
|
||
01639 1:
|
||
01640 jmp .trp
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/exg.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01700 .define .exg
|
||
01701
|
||
01702 ! #bytes in cx
|
||
01703 .text
|
||
01704 .exg:
|
||
01705 push di
|
||
01706 mov sp,di
|
||
01707 add di,#4
|
||
01708 mov bx,di
|
||
01709 add bx,cx
|
||
01710 sar cx,#1
|
||
01711 1:
|
||
01712 mov ax,(bx)
|
||
01713 xchg ax,(di)
|
||
01714 mov (bx),ax
|
||
01715 add di,#2
|
||
01716 add bx,#2
|
||
01717 loop 1b
|
||
01718 2:
|
||
01719 pop di
|
||
01720 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/fat.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01800 .define .fat
|
||
01801 .text
|
||
01802
|
||
01803 .fat:
|
||
01804 .extern .trp
|
||
01805 .extern .stop
|
||
01806 call .trp
|
||
01807 call .stop
|
||
01808 ! no return
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/fp8087.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01900 .define .adf4, .adf8, .sbf4, .sbf8, .mlf4, .mlf8, .dvf4, .dvf8
|
||
01901 .define .ngf4, .ngf8, .fif4, .fif8, .fef4, .fef8
|
||
01902 .define .cif4, .cif8, .cuf4, .cuf8, .cfi, .cfu, .cff4, .cff8
|
||
01903 .define .cmf4, .cmf8
|
||
01904 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
01905
|
||
01906 ! $Header: fp8087.s,v 1.2 89/11/28 12:51:35 ceriel Exp $
|
||
01907
|
||
01908 ! Implement interface to floating point package for Intel 8087
|
||
01909
|
||
01910 .sect .rom
|
||
01911 one:
|
||
01912 .data2 1
|
||
01913 two:
|
||
01914 .data2 2
|
||
01915 bigmin:
|
||
01916 .data2 0, -32768
|
||
01917
|
||
01918 .sect .text
|
||
01919 .adf4:
|
||
01920 mov bx,sp
|
||
01921 wait
|
||
01922 flds 2(bx)
|
||
01923 wait
|
||
01924 fadds 6(bx)
|
||
01925 wait
|
||
01926 fstps 6(bx)
|
||
01927 wait
|
||
01928 ret
|
||
01929 .adf8:
|
||
01930 mov bx,sp
|
||
01931 wait
|
||
01932 fldd 2(bx)
|
||
01933 wait
|
||
01934 faddd 10(bx)
|
||
01935 wait
|
||
01936 fstpd 10(bx)
|
||
01937 wait
|
||
01938 ret
|
||
01939
|
||
01940 .sbf4:
|
||
01941 mov bx,sp
|
||
01942 wait
|
||
01943 flds 6(bx)
|
||
01944 wait
|
||
01945 fsubs 2(bx)
|
||
01946 wait
|
||
01947 fstps 6(bx)
|
||
01948 wait
|
||
01949 ret
|
||
01950
|
||
01951 .sbf8:
|
||
01952 mov bx,sp
|
||
01953 wait
|
||
01954 fldd 10(bx)
|
||
01955 wait
|
||
01956 fsubd 2(bx)
|
||
01957 wait
|
||
01958 fstpd 10(bx)
|
||
01959 wait
|
||
01960 ret
|
||
01961
|
||
01962 .mlf4:
|
||
01963 mov bx,sp
|
||
01964 wait
|
||
01965 flds 2(bx)
|
||
01966 wait
|
||
01967 fmuls 6(bx)
|
||
01968 wait
|
||
01969 fstps 6(bx)
|
||
01970 wait
|
||
01971 ret
|
||
01972 .mlf8:
|
||
01973 mov bx,sp
|
||
01974 wait
|
||
01975 fldd 2(bx)
|
||
01976 wait
|
||
01977 fmuld 10(bx)
|
||
01978 wait
|
||
01979 fstpd 10(bx)
|
||
01980 wait
|
||
01981 ret
|
||
01982
|
||
01983 .dvf4:
|
||
01984 mov bx,sp
|
||
01985 wait
|
||
01986 flds 6(bx)
|
||
01987 wait
|
||
01988 fdivs 2(bx)
|
||
01989 wait
|
||
01990 fstps 6(bx)
|
||
01991 wait
|
||
01992 ret
|
||
01993
|
||
01994 .dvf8:
|
||
01995 mov bx,sp
|
||
01996 wait
|
||
01997 fldd 10(bx)
|
||
01998 wait
|
||
01999 fdivd 2(bx)
|
||
02000 wait
|
||
02001 fstpd 10(bx)
|
||
02002 wait
|
||
02003 ret
|
||
02004
|
||
02005 .ngf4:
|
||
02006 mov bx,sp
|
||
02007 wait
|
||
02008 flds 2(bx)
|
||
02009 wait
|
||
02010 fchs
|
||
02011 wait
|
||
02012 fstps 2(bx)
|
||
02013 wait
|
||
02014 ret
|
||
02015
|
||
02016 .ngf8:
|
||
02017 mov bx,sp
|
||
02018 wait
|
||
02019 fldd 2(bx)
|
||
02020 wait
|
||
02021 fchs
|
||
02022 wait
|
||
02023 fstpd 2(bx)
|
||
02024 wait
|
||
02025 ret
|
||
02026
|
||
02027 .fif4:
|
||
02028 mov bx,sp
|
||
02029 push bx ! make room for FP status word
|
||
02030 wait
|
||
02031 flds 4(bx)
|
||
02032 wait
|
||
02033 fmuls 8(bx) ! multiply
|
||
02034 wait
|
||
02035 fld st ! copy result
|
||
02036 wait
|
||
02037 ftst ! test sign; handle negative separately
|
||
02038 wait
|
||
02039 fstsw -2(bx)
|
||
02040 wait
|
||
02041 mov ax,-2(bx)
|
||
02042 sahf ! result of test in condition codes
|
||
02043 jb 1f
|
||
02044 frndint ! this one rounds (?)
|
||
02045 wait
|
||
02046 fcom st(1) ! compare with original; if <=, then OK
|
||
02047 wait
|
||
02048 fstsw -2(bx)
|
||
02049 wait
|
||
02050 mov ax,-2(bx)
|
||
02051 sahf
|
||
02052 jbe 2f
|
||
02053 fisubs one ! else subtract 1
|
||
02054 wait
|
||
02055 jmp 2f
|
||
02056 1: ! here, negative case
|
||
02057 frndint ! this one rounds (?)
|
||
02058 wait
|
||
02059 fcom st(1) ! compare with original; if >=, then OK
|
||
02060 wait
|
||
02061 fstsw -2(bx)
|
||
02062 wait
|
||
02063 mov ax,-2(bx)
|
||
02064 sahf
|
||
02065 jae 2f
|
||
02066 fiadds one ! else add 1
|
||
02067 wait
|
||
02068 2:
|
||
02069 fsub st(1),st ! subtract integer part
|
||
02070 wait
|
||
02071 mov bx,2(bx)
|
||
02072 fstps (bx)
|
||
02073 wait
|
||
02074 fstps 4(bx)
|
||
02075 wait
|
||
02076 pop bx
|
||
02077 ret
|
||
02078
|
||
02079 .fif8:
|
||
02080 mov bx,sp
|
||
02081 push bx ! make room for FP status word
|
||
02082 wait
|
||
02083 fldd 4(bx)
|
||
02084 wait
|
||
02085 fmuld 12(bx) ! multiply
|
||
02086 wait
|
||
02087 fld st ! and copy result
|
||
02088 wait
|
||
02089 ftst ! test sign; handle negative separately
|
||
02090 wait
|
||
02091 fstsw -2(bx)
|
||
02092 wait
|
||
02093 mov ax,-2(bx)
|
||
02094 sahf ! result of test in condition codes
|
||
02095 jb 1f
|
||
02096 frndint ! this one rounds (?)
|
||
02097 wait
|
||
02098 fcom st(1) ! compare with original; if <=, then OK
|
||
02099 wait
|
||
02100 fstsw -2(bx)
|
||
02101 wait
|
||
02102 mov ax,-2(bx)
|
||
02103 sahf
|
||
02104 jbe 2f
|
||
02105 fisubs one ! else subtract 1
|
||
02106 wait
|
||
02107 jmp 2f
|
||
02108 1: ! here, negative case
|
||
02109 frndint ! this one rounds (?)
|
||
02110 wait
|
||
02111 fcom st(1) ! compare with original; if >=, then OK
|
||
02112 wait
|
||
02113 fstsw -2(bx)
|
||
02114 wait
|
||
02115 mov ax,-2(bx)
|
||
02116 sahf
|
||
02117 jae 2f
|
||
02118 fiadds one ! else add 1
|
||
02119 wait
|
||
02120 2:
|
||
02121 fsub st(1),st ! subtract integer part
|
||
02122 mov bx,2(bx)
|
||
02123 fstpd (bx)
|
||
02124 wait
|
||
02125 fstpd 8(bx)
|
||
02126 wait
|
||
02127 pop bx
|
||
02128 ret
|
||
02129
|
||
02130 .fef4:
|
||
02131 ! this could be simpler, if only the
|
||
02132 ! fxtract instruction was emulated properly
|
||
02133 mov bx,sp
|
||
02134 mov ax,6(bx)
|
||
02135 and ax,#077600
|
||
02136 je 1f ! zero exponent
|
||
02137 mov cx,#7
|
||
02138 shr ax,cl
|
||
02139 sub ax,#126
|
||
02140 mov cx,ax ! exponent in cx
|
||
02141 mov ax,6(bx)
|
||
02142 and ax,#0100177
|
||
02143 or ax,#0037400 ! load -1 exponent
|
||
02144 mov dx,4(bx)
|
||
02145 mov bx,2(bx)
|
||
02146 mov 4(bx),ax
|
||
02147 mov 2(bx),dx
|
||
02148 mov (bx),cx
|
||
02149 ret
|
||
02150 1: ! we get here on zero exp
|
||
02151 mov ax,6(bx)
|
||
02152 and ax,#0177
|
||
02153 or ax,4(bx)
|
||
02154 jne 1f ! zero result
|
||
02155 xor ax,ax
|
||
02156 mov bx,2(bx)
|
||
02157 mov (bx),ax
|
||
02158 mov 2(bx),ax
|
||
02159 mov 4(bx),ax
|
||
02160 ret
|
||
02161 1: ! otherwise unnormalized number
|
||
02162 mov cx,6(bx)
|
||
02163 and cx,#0100177
|
||
02164 mov dx,cx
|
||
02165 and cx,#0x8000
|
||
02166 mov ax,#-125
|
||
02167 2:
|
||
02168 test dx,#0x80
|
||
02169 jne 1f
|
||
02170 dec ax
|
||
02171 shl 4(bx),#1
|
||
02172 rcl dx,#1
|
||
02173 or dx,cx
|
||
02174 jmp 2b
|
||
02175 1:
|
||
02176 mov cx,4(bx)
|
||
02177 mov bx,2(bx)
|
||
02178 mov (bx),ax
|
||
02179 mov 2(bx),cx
|
||
02180 and dx,#0100177
|
||
02181 or dx,#0037400 ! load -1 exponent
|
||
02182 mov 4(bx),dx
|
||
02183 ret
|
||
02184
|
||
02185 .fef8:
|
||
02186 ! this could be simpler, if only the
|
||
02187 ! fxtract instruction was emulated properly
|
||
02188 mov bx,sp
|
||
02189 mov ax,10(bx)
|
||
02190 and ax,#077760
|
||
02191 je 1f ! zero exponent
|
||
02192 mov cx,#4
|
||
02193 shr ax,cl
|
||
02194 sub ax,#1022
|
||
02195 mov cx,ax ! exponent in cx
|
||
02196 mov ax,10(bx)
|
||
02197 and ax,#0100017
|
||
02198 or ax,#0037740 ! load -1 exponent
|
||
02199 push 8(bx)
|
||
02200 push 6(bx)
|
||
02201 push 4(bx)
|
||
02202 mov bx,2(bx)
|
||
02203 pop 2(bx)
|
||
02204 pop 4(bx)
|
||
02205 pop 6(bx)
|
||
02206 mov 8(bx),ax
|
||
02207 mov (bx),cx
|
||
02208 ret
|
||
02209 1: ! we get here on zero exp
|
||
02210 mov ax,10(bx)
|
||
02211 and ax,#017
|
||
02212 or ax,8(bx)
|
||
02213 or ax,6(bx)
|
||
02214 or ax,4(bx)
|
||
02215 jne 1f ! zero result
|
||
02216 xor ax,ax
|
||
02217 mov bx,2(bx)
|
||
02218 mov (bx),ax
|
||
02219 mov 2(bx),ax
|
||
02220 mov 4(bx),ax
|
||
02221 mov 6(bx),ax
|
||
02222 mov 8(bx),ax
|
||
02223 ret
|
||
02224 1: ! otherwise unnormalized number
|
||
02225 mov cx,10(bx)
|
||
02226 and cx,#0100017
|
||
02227 mov dx,cx
|
||
02228 and cx,#0x8000
|
||
02229 mov ax,#-1021
|
||
02230 2:
|
||
02231 test dx,#0x10
|
||
02232 jne 1f
|
||
02233 dec ax
|
||
02234 shl 4(bx),#1
|
||
02235 rcl 6(bx),#1
|
||
02236 rcl 8(bx),#1
|
||
02237 rcl dx,#1
|
||
02238 or dx,cx
|
||
02239 jmp 2b
|
||
02240 1:
|
||
02241 and dx,#0100017
|
||
02242 or dx,#0037740 ! load -1 exponent
|
||
02243 mov cx,8(bx)
|
||
02244 push 6(bx)
|
||
02245 push 4(bx)
|
||
02246 mov bx,2(bx)
|
||
02247 mov (bx),ax
|
||
02248 mov 8(bx),dx
|
||
02249 mov 6(bx),cx
|
||
02250 pop 2(bx)
|
||
02251 pop 4(bx)
|
||
02252 ret
|
||
02253
|
||
02254 .cif4:
|
||
02255 mov bx,sp
|
||
02256 cmp 2(bx),#2
|
||
02257 jne 1f
|
||
02258 wait
|
||
02259 filds 4(bx)
|
||
02260 wait
|
||
02261 fstps 2(bx)
|
||
02262 wait
|
||
02263 ret
|
||
02264 1:
|
||
02265 wait
|
||
02266 fildl 4(bx)
|
||
02267 wait
|
||
02268 fstps 4(bx)
|
||
02269 wait
|
||
02270 ret
|
||
02271
|
||
02272 .cif8:
|
||
02273 mov bx,sp
|
||
02274 cmp 2(bx),#2
|
||
02275 jne 1f
|
||
02276 wait
|
||
02277 filds 4(bx)
|
||
02278 wait
|
||
02279 fstpd 2(bx)
|
||
02280 wait
|
||
02281 ret
|
||
02282 1:
|
||
02283 wait
|
||
02284 fildl 4(bx)
|
||
02285 wait
|
||
02286 fstpd 2(bx)
|
||
02287 wait
|
||
02288 ret
|
||
02289
|
||
02290 .cuf4:
|
||
02291 mov bx,sp
|
||
02292 cmp 2(bx),#2
|
||
02293 jne 1f
|
||
02294 mov ax,4(bx)
|
||
02295 mov 2(bx),ax
|
||
02296 mov 4(bx),#0
|
||
02297 wait
|
||
02298 fildl 2(bx)
|
||
02299 wait
|
||
02300 fstps 2(bx)
|
||
02301 wait
|
||
02302 ret
|
||
02303 1:
|
||
02304 wait
|
||
02305 fildl 4(bx)
|
||
02306 wait
|
||
02307 cmp 6(bx),#0
|
||
02308 jge 1f
|
||
02309 2:
|
||
02310 wait
|
||
02311 fisubl bigmin
|
||
02312 wait
|
||
02313 fisubl bigmin
|
||
02314 1:
|
||
02315 wait
|
||
02316 fstps 4(bx)
|
||
02317 wait
|
||
02318 ret
|
||
02319
|
||
02320 .cuf8:
|
||
02321 mov bx,sp
|
||
02322 cmp 2(bx),#2
|
||
02323 jne 1f
|
||
02324 mov 6(bx),#0
|
||
02325 1:
|
||
02326 wait
|
||
02327 fildl 4(bx)
|
||
02328 wait
|
||
02329 cmp 6(bx),#0
|
||
02330 jge 1f
|
||
02331 2:
|
||
02332 wait
|
||
02333 fisubl bigmin
|
||
02334 wait
|
||
02335 fisubl bigmin
|
||
02336 1:
|
||
02337 wait
|
||
02338 fstpd 2(bx)
|
||
02339 wait
|
||
02340 ret
|
||
02341
|
||
02342 .cfi:
|
||
02343 mov bx,sp
|
||
02344 push bx
|
||
02345 wait
|
||
02346 fstcw -2(bx)
|
||
02347 wait
|
||
02348 mov dx,-2(bx)
|
||
02349 or -2(bx),#0xc00 ! truncating mode
|
||
02350 wait
|
||
02351 fldcw -2(bx)
|
||
02352 pop ax
|
||
02353 cmp 4(bx),#4
|
||
02354 jne 2f
|
||
02355 ! loc 4 loc ? cfi
|
||
02356 wait
|
||
02357 flds 6(bx)
|
||
02358 wait
|
||
02359 fistpl 6(bx)
|
||
02360 wait
|
||
02361 cmp 2(bx),#2
|
||
02362 jne 1f
|
||
02363 mov ax,6(bx)
|
||
02364 1:
|
||
02365 mov 4(bx),dx
|
||
02366 wait
|
||
02367 fldcw 4(bx)
|
||
02368 wait
|
||
02369 ret
|
||
02370 2:
|
||
02371 ! loc 8 loc ? cfi
|
||
02372 wait
|
||
02373 fldd 6(bx)
|
||
02374 wait
|
||
02375 fistpl 10(bx)
|
||
02376 wait
|
||
02377 cmp 2(bx),#2
|
||
02378 jne 1b
|
||
02379 mov ax,10(bx)
|
||
02380 jmp 1b
|
||
02381
|
||
02382 .cfu:
|
||
02383 mov bx,sp
|
||
02384 push bx
|
||
02385 wait
|
||
02386 fstcw -2(bx)
|
||
02387 wait
|
||
02388 mov dx,-2(bx)
|
||
02389 and -2(bx),#0xf3ff
|
||
02390 or -2(bx),#0x400 ! to -infinity
|
||
02391 wait
|
||
02392 fldcw -2(bx)
|
||
02393 wait
|
||
02394 pop ax
|
||
02395 cmp 4(bx),#4
|
||
02396 jne 2f
|
||
02397 ! loc 4 loc ? cfu
|
||
02398 flds 6(bx)
|
||
02399 wait
|
||
02400 fabs ! ???
|
||
02401 wait
|
||
02402 fiaddl bigmin
|
||
02403 fistpl 6(bx)
|
||
02404 wait
|
||
02405 mov ax,8(bx)
|
||
02406 sub ax,bigmin+2
|
||
02407 mov 8(bx),ax
|
||
02408 cmp 2(bx),#2
|
||
02409 jne 1f
|
||
02410 mov ax,6(bx)
|
||
02411 1:
|
||
02412 mov 4(bx),dx
|
||
02413 wait
|
||
02414 fldcw 4(bx)
|
||
02415 wait
|
||
02416 ret
|
||
02417 2:
|
||
02418 wait
|
||
02419 ! loc 8 loc ? cfu
|
||
02420 fldd 6(bx)
|
||
02421 wait
|
||
02422 fabs ! ???
|
||
02423 wait
|
||
02424 fiaddl bigmin
|
||
02425 fistpl 10(bx)
|
||
02426 wait
|
||
02427 mov ax,12(bx)
|
||
02428 sub ax,bigmin+2
|
||
02429 mov 12(bx),ax
|
||
02430 cmp 2(bx),#2
|
||
02431 jne 1b
|
||
02432 mov ax,10(bx)
|
||
02433 jmp 1b
|
||
02434
|
||
02435 .cff4:
|
||
02436 mov bx,sp
|
||
02437 wait
|
||
02438 fldd 2(bx)
|
||
02439 wait
|
||
02440 fstcw 2(bx)
|
||
02441 wait
|
||
02442 mov dx,2(bx)
|
||
02443 and 2(bx),#0xf3ff ! set to rounding mode
|
||
02444 wait
|
||
02445 fldcw 2(bx)
|
||
02446 wait
|
||
02447 fstps 6(bx)
|
||
02448 mov 2(bx),dx
|
||
02449 wait
|
||
02450 fldcw 2(bx)
|
||
02451 wait
|
||
02452 ret
|
||
02453
|
||
02454 .cff8:
|
||
02455 mov bx,sp
|
||
02456 wait
|
||
02457 flds 2(bx)
|
||
02458 wait
|
||
02459 fstpd 2(bx)
|
||
02460 wait
|
||
02461 ret
|
||
02462
|
||
02463 .cmf4:
|
||
02464 mov bx,sp
|
||
02465 push bx ! room for 8087 status word
|
||
02466 xor cx,cx
|
||
02467 wait
|
||
02468 flds 6(bx)
|
||
02469 wait
|
||
02470 flds 2(bx)
|
||
02471 wait
|
||
02472 fcompp ! compare and pop operands
|
||
02473 wait
|
||
02474 fstsw -2(bx)
|
||
02475 wait
|
||
02476 mov ax,-2(bx)
|
||
02477 sahf
|
||
02478 je 1f
|
||
02479 jb 2f
|
||
02480 dec cx
|
||
02481 jmp 1f
|
||
02482 2:
|
||
02483 inc cx
|
||
02484 1:
|
||
02485 mov ax,cx
|
||
02486 pop bx
|
||
02487 ret
|
||
02488
|
||
02489
|
||
02490 .cmf8:
|
||
02491 mov bx,sp
|
||
02492 push bx ! room for 8087 status word
|
||
02493 xor cx,cx
|
||
02494 wait
|
||
02495 fldd 10(bx)
|
||
02496 wait
|
||
02497 fldd 2(bx)
|
||
02498 wait
|
||
02499 fcompp ! compare and pop operands
|
||
02500 wait
|
||
02501 fstsw -2(bx)
|
||
02502 wait
|
||
02503 mov ax,-2(bx)
|
||
02504 sahf
|
||
02505 je 1f
|
||
02506 jb 2f
|
||
02507 dec cx
|
||
02508 jmp 1f
|
||
02509 2:
|
||
02510 inc cx
|
||
02511 1:
|
||
02512 mov ax,cx
|
||
02513 pop bx
|
||
02514 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/gto.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
02600 .define .gto
|
||
02601 .text
|
||
02602
|
||
02603 .gto:
|
||
02604 mov bp,4(bx)
|
||
02605 mov sp,2(bx)
|
||
02606 jmp @(bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/iaar.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
02700 .define .iaar
|
||
02701 .text
|
||
02702
|
||
02703 .iaar:
|
||
02704 pop cx
|
||
02705 pop dx
|
||
02706 cmp dx,#2
|
||
02707 .extern .unknown
|
||
02708 jne .unknown
|
||
02709 pop bx ! descriptor address
|
||
02710 pop ax ! index
|
||
02711 sub ax,(bx)
|
||
02712 mul 4(bx)
|
||
02713 pop bx ! array base
|
||
02714 add bx,ax
|
||
02715 push cx
|
||
02716 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/ilar.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
02800 .define .ilar
|
||
02801 .text
|
||
02802
|
||
02803 .ilar:
|
||
02804 pop cx
|
||
02805 pop dx
|
||
02806 .extern .unknown
|
||
02807 cmp dx,#2
|
||
02808 jne .unknown
|
||
02809 pop bx ! descriptor address
|
||
02810 pop ax ! index
|
||
02811 push cx
|
||
02812 .extern .lar2
|
||
02813 jmp .lar2
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/inn.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
02900 .define .inn
|
||
02901 .text
|
||
02902
|
||
02903 ! #bytes in cx
|
||
02904 ! bit # in ax
|
||
02905 .inn:
|
||
02906 xor dx,dx
|
||
02907 mov bx,#8
|
||
02908 div bx
|
||
02909 mov bx,sp
|
||
02910 add bx,#2
|
||
02911 add bx,ax
|
||
02912 cmp ax,cx
|
||
02913 jae 1f
|
||
02914 movb al,(bx)
|
||
02915 mov bx,dx
|
||
02916 testb al,bits(bx)
|
||
02917 jz 1f
|
||
02918 mov ax,#1
|
||
02919 jmp 2f
|
||
02920 1:
|
||
02921 xor ax,ax
|
||
02922 2:
|
||
02923 pop bx
|
||
02924 add sp,cx
|
||
02925 ! ax is result
|
||
02926 jmp (bx)
|
||
02927
|
||
02928 .data
|
||
02929 bits:
|
||
02930 .data1 1,2,4,8,16,32,64,128
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/ior.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03000 .define .ior
|
||
03001 .text
|
||
03002
|
||
03003 ! #bytes in cx
|
||
03004 .ior:
|
||
03005 pop bx ! return address
|
||
03006 mov dx,di
|
||
03007 mov di,sp
|
||
03008 add di,cx
|
||
03009 sar cx,#1
|
||
03010 1:
|
||
03011 pop ax
|
||
03012 or ax,(di)
|
||
03013 stos
|
||
03014 loop 1b
|
||
03015 mov di,dx
|
||
03016 jmp (bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/isar.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03100 .define .isar
|
||
03101 .text
|
||
03102
|
||
03103 .isar:
|
||
03104 pop cx
|
||
03105 pop ax
|
||
03106 cmp ax,#2
|
||
03107 .extern .unknown
|
||
03108 jne .unknown
|
||
03109 pop bx ! descriptor address
|
||
03110 pop ax ! index
|
||
03111 push cx
|
||
03112 .extern .sar2
|
||
03113 jmp .sar2
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/lar2.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03200 .define .lar2
|
||
03201 .text
|
||
03202
|
||
03203 .lar2:
|
||
03204 ! bx, descriptor address
|
||
03205 ! ax, index
|
||
03206 pop cx
|
||
03207 pop dx ! base address
|
||
03208 push cx
|
||
03209 push si
|
||
03210 mov si,dx
|
||
03211 sub ax,(bx)
|
||
03212 mov cx,4(bx)
|
||
03213 imul cx
|
||
03214 add si,ax
|
||
03215 sar cx,#1
|
||
03216 jnb 1f
|
||
03217 xorb ah,ah
|
||
03218 lodsb
|
||
03219 pop si
|
||
03220 pop bx
|
||
03221 push ax
|
||
03222 jmp (bx)
|
||
03223 1:
|
||
03224 pop dx ! saved si
|
||
03225 mov ax,4(bx)
|
||
03226 pop bx ! return address
|
||
03227 sub sp,ax
|
||
03228 mov ax,di ! save di
|
||
03229 mov di,sp
|
||
03230 rep
|
||
03231 mov
|
||
03232 mov di,ax
|
||
03233 mov si,dx
|
||
03234 jmp (bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/lfr6.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03300 .define .lfr6
|
||
03301 .text
|
||
03302 .extern .retarea
|
||
03303
|
||
03304 .lfr6:
|
||
03305 pop bx
|
||
03306 push .retarea+4
|
||
03307 push .retarea+2
|
||
03308 push .retarea
|
||
03309 jmp (bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/lfr8.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03400 .define .lfr8
|
||
03401 .text
|
||
03402 .extern .retarea
|
||
03403
|
||
03404 .lfr8:
|
||
03405 pop bx
|
||
03406 push .retarea+6
|
||
03407 push .retarea+4
|
||
03408 push .retarea+2
|
||
03409 push .retarea
|
||
03410 jmp (bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/loi.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03500 .define .loi
|
||
03501 .define .los
|
||
03502 .text
|
||
03503
|
||
03504 ! #bytes in cx
|
||
03505 ! address in bx
|
||
03506 ! save si/di. they might be register variables
|
||
03507 .los:
|
||
03508 mov dx,si
|
||
03509 mov si,bx
|
||
03510 pop bx
|
||
03511 mov ax,cx
|
||
03512 sar cx,#1
|
||
03513 jnb 1f
|
||
03514 xorb ah,ah
|
||
03515 lodsb
|
||
03516 mov si,dx
|
||
03517 push ax
|
||
03518 jmp (bx)
|
||
03519 1:
|
||
03520 sub sp,ax
|
||
03521 jmp 1f
|
||
03522
|
||
03523 .loi:
|
||
03524 ! only called with size > 4
|
||
03525 mov dx,si
|
||
03526 mov si,bx
|
||
03527 pop bx
|
||
03528 sub sp,cx
|
||
03529 sar cx,#1
|
||
03530 1:
|
||
03531 mov ax,di
|
||
03532 mov di,sp
|
||
03533 rep
|
||
03534 mov
|
||
03535 mov si,dx
|
||
03536 mov di,ax
|
||
03537 jmp (bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/mli4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03600 .define .mli4
|
||
03601 .text
|
||
03602
|
||
03603 yl=2
|
||
03604 yh=4
|
||
03605 ! x * y
|
||
03606 ! xl in ax
|
||
03607 ! xh in dx
|
||
03608
|
||
03609 .mli4:
|
||
03610 mov bx,sp
|
||
03611 push dx
|
||
03612 mov cx,ax
|
||
03613 mul yh(bx) ! xl*yh
|
||
03614 pop dx
|
||
03615 push ax
|
||
03616 mov ax,dx
|
||
03617 mul yl(bx) ! xh * yl
|
||
03618 pop dx
|
||
03619 add dx,ax ! xh*yl+xl*yh
|
||
03620 mov ax,cx
|
||
03621 mov cx,dx
|
||
03622 mul yl(bx) ! xl*yl
|
||
03623 add dx,cx
|
||
03624 ret 4
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/mon.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03700 .define .mon
|
||
03701 .text
|
||
03702
|
||
03703 .mon:
|
||
03704 .extern .stop
|
||
03705 call .stop
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/nop.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03800 .define .nop
|
||
03801 .text
|
||
03802 .nop:
|
||
03803 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/rck.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03900 .define .rck
|
||
03901 .text
|
||
03902
|
||
03903 ! descriptor address in bx
|
||
03904 ! value in ax, must be left there
|
||
03905 .rck:
|
||
03906 cmp ax,(bx)
|
||
03907 jl 2f
|
||
03908 cmp ax,2(bx)
|
||
03909 jg 2f
|
||
03910 ret
|
||
03911 2:
|
||
03912 push ax
|
||
03913 ERANGE = 1
|
||
03914 .extern .error
|
||
03915 mov ax,#ERANGE
|
||
03916 call .error
|
||
03917 pop ax
|
||
03918 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/ret6.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04000 .define .ret6
|
||
04001 .text
|
||
04002 .extern .retarea
|
||
04003
|
||
04004 .ret6:
|
||
04005 pop bx
|
||
04006 pop .retarea
|
||
04007 pop .retarea+2
|
||
04008 pop .retarea+4
|
||
04009 jmp (bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/ret8.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04100 .define .ret8
|
||
04101 .text
|
||
04102 .extern .retarea
|
||
04103
|
||
04104 .ret8:
|
||
04105 pop bx
|
||
04106 pop .retarea
|
||
04107 pop .retarea+2
|
||
04108 pop .retarea+4
|
||
04109 pop .retarea+6
|
||
04110 jmp (bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/retarea.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04200 .define .retarea
|
||
04201
|
||
04202 .bss
|
||
04203 .retarea:
|
||
04204 .zerow 8/2
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/return.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04300 .define .sdret, .dsret, .sret, .dret, .cret
|
||
04301 .text
|
||
04302
|
||
04303 .dsret:
|
||
04304 pop di
|
||
04305 .sret:
|
||
04306 pop si
|
||
04307 .cret:
|
||
04308 mov sp,bp
|
||
04309 pop bp
|
||
04310 ret
|
||
04311
|
||
04312 .sdret:
|
||
04313 pop si
|
||
04314 .dret:
|
||
04315 pop di
|
||
04316 jmp .cret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/rmi4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04400 .define .rmi4
|
||
04401 .text
|
||
04402
|
||
04403 yl=6
|
||
04404 yh=8
|
||
04405 xl=10
|
||
04406 xh=12
|
||
04407
|
||
04408 .rmi4:
|
||
04409 push si
|
||
04410 push di
|
||
04411 mov si,sp ! copy of sp
|
||
04412 mov bx,yl(si)
|
||
04413 mov ax,yh(si)
|
||
04414 cwd
|
||
04415 cmp dx,ax
|
||
04416 jne 7f
|
||
04417 and dx,dx
|
||
04418 jge 1f
|
||
04419 neg bx
|
||
04420 je 7f
|
||
04421 1:
|
||
04422 xor dx,dx
|
||
04423 mov cx,xl(si)
|
||
04424 mov ax,xh(si)
|
||
04425 and ax,ax
|
||
04426 jge 2f
|
||
04427 neg ax
|
||
04428 neg cx
|
||
04429 sbb ax,dx
|
||
04430 2:
|
||
04431 div bx
|
||
04432 xchg ax,cx
|
||
04433 div bx ! dx= result(low), 0=result(high)
|
||
04434 xor bx,bx
|
||
04435 9:
|
||
04436 cmp xh(si),#0
|
||
04437 jge 1f
|
||
04438 neg bx
|
||
04439 neg dx
|
||
04440 sbb bx,#0
|
||
04441 1:
|
||
04442 ! bx is high order result
|
||
04443 ! dx is low order result
|
||
04444 mov ax,dx
|
||
04445 mov dx,bx ! result in ax/dx
|
||
04446 pop di
|
||
04447 pop si
|
||
04448 ret 8
|
||
04449
|
||
04450 7:
|
||
04451 mov di,ax
|
||
04452 xor bx,bx
|
||
04453 and di,di
|
||
04454 jge 1f
|
||
04455 neg di
|
||
04456 neg yl(si)
|
||
04457 sbb di,bx
|
||
04458 1:
|
||
04459 mov ax,xl(si)
|
||
04460 mov dx,xh(si)
|
||
04461 and dx,dx
|
||
04462 jge 1f
|
||
04463 neg dx
|
||
04464 neg ax
|
||
04465 sbb dx,bx
|
||
04466 1:
|
||
04467 mov cx,#16
|
||
04468 1:
|
||
04469 shl ax,#1
|
||
04470 rcl dx,#1
|
||
04471 rcl bx,#1
|
||
04472 cmp di,bx
|
||
04473 ja 3f
|
||
04474 jb 2f
|
||
04475 cmp yl(si),dx
|
||
04476 jbe 2f
|
||
04477 3:
|
||
04478 loop 1b
|
||
04479 ! dx=result(low), bx=result(high)
|
||
04480 jmp 9b
|
||
04481 2:
|
||
04482 sub dx,yl(si)
|
||
04483 sbb bx,di
|
||
04484 inc ax
|
||
04485 loop 1b
|
||
04486 1:
|
||
04487 ! dx=result(low), bx=result(high)
|
||
04488 jmp 9b
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/rmu4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04500 .define .rmu4
|
||
04501 .text
|
||
04502
|
||
04503 yl=6
|
||
04504 yh=8
|
||
04505 xl=10
|
||
04506 xh=12
|
||
04507
|
||
04508 .rmu4:
|
||
04509 push si
|
||
04510 push di
|
||
04511 mov si,sp ! copy of sp
|
||
04512 mov bx,yl(si)
|
||
04513 mov ax,yh(si)
|
||
04514 or ax,ax
|
||
04515 jne 7f
|
||
04516 1:
|
||
04517 xor dx,dx
|
||
04518 mov cx,xl(si)
|
||
04519 mov ax,xh(si)
|
||
04520 2:
|
||
04521 div bx
|
||
04522 xchg ax,cx
|
||
04523 div bx
|
||
04524 xor bx,bx
|
||
04525 9:
|
||
04526 ! bx is high order result
|
||
04527 ! dx is low order result
|
||
04528 mov ax,dx
|
||
04529 mov dx,bx
|
||
04530 pop di
|
||
04531 pop si
|
||
04532 ret 8 ! result in ax/dx
|
||
04533
|
||
04534 7:
|
||
04535 mov di,ax
|
||
04536 xor bx,bx
|
||
04537 mov ax,xl(si)
|
||
04538 mov dx,xh(si)
|
||
04539 mov cx,#16
|
||
04540 1:
|
||
04541 shl ax,#1
|
||
04542 rcl dx,#1
|
||
04543 rcl bx,#1
|
||
04544 cmp di,bx
|
||
04545 ja 3f
|
||
04546 jb 2f
|
||
04547 cmp yl(si),dx
|
||
04548 jbe 2f
|
||
04549 3:
|
||
04550 loop 1b
|
||
04551 ! dx=result(low), bx=result(high)
|
||
04552 jmp 9b
|
||
04553 2:
|
||
04554 sub dx,yl(si)
|
||
04555 sbb bx,di
|
||
04556 inc ax
|
||
04557 loop 1b
|
||
04558 1:
|
||
04559 ! dx=result(low), bx=result(high)
|
||
04560 jmp 9b
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/sar2.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04600 .define .sar2
|
||
04601 .text
|
||
04602
|
||
04603 .sar2:
|
||
04604 ! bx, descriptor address
|
||
04605 ! ax, index
|
||
04606 pop cx
|
||
04607 pop dx ! base address
|
||
04608 push cx
|
||
04609 xchg di,dx ! di = base address, dx is saved di
|
||
04610 sub ax,(bx)
|
||
04611 mov cx,4(bx)
|
||
04612 push dx
|
||
04613 imul cx
|
||
04614 pop dx
|
||
04615 add di,ax
|
||
04616 sar cx,#1
|
||
04617 jnb 1f
|
||
04618 pop bx
|
||
04619 pop ax
|
||
04620 stosb
|
||
04621 mov di,dx
|
||
04622 jmp (bx)
|
||
04623 1:
|
||
04624 pop bx
|
||
04625 mov ax,si
|
||
04626 mov si,sp
|
||
04627 rep
|
||
04628 mov
|
||
04629 mov sp,si
|
||
04630 mov si,ax
|
||
04631 mov di,dx
|
||
04632 jmp (bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/sbi.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04700 .define .sbi
|
||
04701 .text
|
||
04702
|
||
04703 ! #bytes in cx , top of stack in ax
|
||
04704 .sbi:
|
||
04705 pop bx ! return subress
|
||
04706 cmp cx,#2
|
||
04707 jne 1f
|
||
04708 pop cx
|
||
04709 sub ax,cx
|
||
04710 neg ax
|
||
04711 jmp (bx)
|
||
04712 1:
|
||
04713 cmp cx,#4
|
||
04714 jne 9f
|
||
04715 pop dx
|
||
04716 pop cx
|
||
04717 sub cx,ax
|
||
04718 mov ax,cx
|
||
04719 pop cx
|
||
04720 sbb cx,dx
|
||
04721 push cx
|
||
04722 jmp (bx)
|
||
04723 9:
|
||
04724 .extern .trpilin
|
||
04725 push bx
|
||
04726 jmp .trpilin
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/set.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04800 .define .set
|
||
04801 .text
|
||
04802
|
||
04803 ! #bytes in cx
|
||
04804 ! bit # in ax
|
||
04805 .set:
|
||
04806 pop bx ! return address
|
||
04807 xor dx,dx
|
||
04808 !ifdef create set
|
||
04809 sub sp,cx
|
||
04810 push bx
|
||
04811 push di
|
||
04812 mov bx,sp
|
||
04813 xor di,di
|
||
04814 sar cx,#1
|
||
04815 1:
|
||
04816 mov 4(bx)(di),dx
|
||
04817 inc di
|
||
04818 inc di
|
||
04819 loop 1b
|
||
04820 !endif
|
||
04821 mov bx,#8
|
||
04822 div bx
|
||
04823 cmp ax,di
|
||
04824 jae 2f
|
||
04825 mov di,dx
|
||
04826 movb dl,bits(di)
|
||
04827 mov di,sp
|
||
04828 add di,ax
|
||
04829 orb 4(di),dl
|
||
04830 pop di
|
||
04831 ret
|
||
04832 2:
|
||
04833 ESET = 2
|
||
04834 .extern .error
|
||
04835 pop di
|
||
04836 mov ax,#ESET
|
||
04837 call .error
|
||
04838 ret
|
||
04839
|
||
04840 .data
|
||
04841 bits:
|
||
04842 .data1 1,2,4,8,16,32,64,128
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/stb.c
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04900 /*
|
||
04901 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||
04902 * See the copyright notice in the ACK home directory, in the file "Copyright".
|
||
04903 */
|
||
04904 /* $Header: stb.c,v 1.1 89/02/07 11:01:46 ceriel Exp $ */
|
||
04905 /* library routine for copying structs */
|
||
04906
|
||
04907 #include <ansi.h>
|
||
04908
|
||
04909 _PROTOTYPE(int __stb, (int n, char *f, char *t ));
|
||
04910 __stb(n, f, t)
|
||
04911 register int n;
|
||
04912 register char *f, *t;
|
||
04913 {
|
||
04914 if (n > 0)
|
||
04915 do
|
||
04916 *t++ = *f++;
|
||
04917 while (--n);
|
||
04918 }
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/sti.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05000 .define .sti
|
||
05001 .define .sts
|
||
05002 .text
|
||
05003
|
||
05004 ! #bytes in cx
|
||
05005 ! address in bx
|
||
05006 ! save di/si. they might be register variables
|
||
05007 .sts:
|
||
05008 mov dx,di ! save di
|
||
05009 mov di,bx
|
||
05010 pop bx ! return address
|
||
05011 sar cx,#1
|
||
05012 jnb 1f
|
||
05013 pop ax
|
||
05014 stosb
|
||
05015 mov di,dx
|
||
05016 jmp (bx)
|
||
05017 .sti:
|
||
05018 ! only called with count > 4
|
||
05019 mov dx,di
|
||
05020 mov di,bx
|
||
05021 pop bx
|
||
05022 sar cx,#1
|
||
05023 1:
|
||
05024 mov ax,si
|
||
05025 mov si,sp
|
||
05026 rep
|
||
05027 mov
|
||
05028 mov sp,si
|
||
05029 mov di,dx
|
||
05030 mov si,ax
|
||
05031 jmp (bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/stop.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05100 .define .stop
|
||
05101 .text
|
||
05102 .stop:
|
||
05103 call __exit
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/strhp.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05200 .define .strhp
|
||
05201 .text
|
||
05202 .extern .reghp, .limhp, .fat
|
||
05203 EHEAP = 17
|
||
05204
|
||
05205 .strhp:
|
||
05206 pop bx
|
||
05207 pop ax
|
||
05208 mov .reghp,ax
|
||
05209 cmp ax,.limhp
|
||
05210 jb 1f
|
||
05211 add ax,#01000
|
||
05212 and ax,#0177000
|
||
05213 mov .limhp,ax
|
||
05214 cmp ax,sp
|
||
05215 jae 2f
|
||
05216 1:
|
||
05217 jmp (bx)
|
||
05218 2:
|
||
05219 mov ax,#EHEAP
|
||
05220 jmp .fat
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/trp.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05300 .define .trpdivz
|
||
05301 .define .trpilin
|
||
05302 .define .trpcase
|
||
05303 .define .trprang
|
||
05304 .define .trpset
|
||
05305 .define .trpnofp
|
||
05306 .define .trpheap
|
||
05307 .define .trp
|
||
05308
|
||
05309 .bss
|
||
05310 .M: .zerow 24/2
|
||
05311
|
||
05312 .text
|
||
05313 .extern .trpdivz
|
||
05314 .extern .trpilin
|
||
05315 .extern .trpcase
|
||
05316 .extern .trprang
|
||
05317 .extern .trpset
|
||
05318 .extern .trpnofp
|
||
05319 .extern .trpheap
|
||
05320 .extern .trp
|
||
05321
|
||
05322 .trpdivz:
|
||
05323 mov ax,#6
|
||
05324 mov dx,#.Mdivz
|
||
05325 jmp .Trp
|
||
05326 .trpilin:
|
||
05327 mov ax,#18
|
||
05328 mov dx,#.Milin
|
||
05329 jmp .Trp
|
||
05330 .trpcase:
|
||
05331 mov ax,#20
|
||
05332 mov dx,#.Mcase
|
||
05333 jmp .Trp
|
||
05334 .trprang:
|
||
05335 mov ax,#1
|
||
05336 mov dx,#.Mrang
|
||
05337 jmp .Trp
|
||
05338 .trpset:
|
||
05339 mov ax,#2
|
||
05340 mov dx,#.Mset
|
||
05341 jmp .Trp
|
||
05342 .trpnofp:
|
||
05343 mov ax,#18
|
||
05344 mov dx,#.Mnofp
|
||
05345 jmp .Trp
|
||
05346 .trpheap:
|
||
05347 mov ax,#17
|
||
05348 mov dx,#.Mheap
|
||
05349 jmp .Trp
|
||
05350
|
||
05351 .Trp:
|
||
05352 xor bx,bx
|
||
05353 .extern .trppc
|
||
05354 xchg bx,.trppc
|
||
05355 test bx,bx
|
||
05356 jz 2f
|
||
05357 push ax
|
||
05358 call (bx)
|
||
05359 pop ax
|
||
05360 ret
|
||
05361 2:
|
||
05362 mov bx,#22
|
||
05363 push bx
|
||
05364 push dx
|
||
05365 mov ax,#2
|
||
05366 push ax
|
||
05367 call .Write
|
||
05368 call __exit
|
||
05369
|
||
05370 .trp:
|
||
05371 mov dx,ax
|
||
05372 cmp dx,#21
|
||
05373 jae 1f
|
||
05374 sal dx,#1
|
||
05375 mov bx,#.Mtable
|
||
05376 add bx,dx
|
||
05377 mov bx,(bx)
|
||
05378 test bx,bx
|
||
05379 jz 1f
|
||
05380 mov dx,bx
|
||
05381 jmp 2f
|
||
05382 1:
|
||
05383 mov bx,#.Mtrp+14
|
||
05384 mov cx,#6
|
||
05385 mov dx,ax
|
||
05386 1:
|
||
05387 and dx,#7
|
||
05388 add dx,'0'
|
||
05389 movb (bx),dl
|
||
05390 dec bx
|
||
05391 sar dx,#1
|
||
05392 sar dx,#1
|
||
05393 sar dx,#1
|
||
05394 loop 1b
|
||
05395 mov dx,#.Mtrp
|
||
05396 2:
|
||
05397 jmp .Trp
|
||
05398
|
||
05399 .Write:
|
||
05400 push bp
|
||
05401 mov bp,sp
|
||
05402 mov .M+2,#4
|
||
05403 mov bx,4(bp)
|
||
05404 mov .M+4,bx
|
||
05405 mov bx,8(bp)
|
||
05406 mov .M+6,bx
|
||
05407 mov bx,6(bp)
|
||
05408 mov .M+10,bx
|
||
05409 mov ax,#.M
|
||
05410 push ax
|
||
05411 mov ax,#1
|
||
05412 push ax
|
||
05413
|
||
05414 mov ax,#1
|
||
05415 mov bx,#.M
|
||
05416 mov cx,#3
|
||
05417 int 32
|
||
05418 mov sp,bp
|
||
05419 pop bp
|
||
05420 ret
|
||
05421
|
||
05422
|
||
05423 .data
|
||
05424 .Mtable:
|
||
05425 .data2 0, .Mrang, .Mset, 0, 0, 0, .Mdivz, 0
|
||
05426 .data2 0, 0, 0, 0, 0, 0, 0, 0
|
||
05427 .data2 0, .Mheap, .Milin, .Milin, .Mcase
|
||
05428
|
||
05429 .Mdivz: .asciz "Error: Division by 0 \n"
|
||
05430 .Milin: .asciz "Illegal EM instruct'n\n"
|
||
05431 .Mcase: .asciz "Err in EM case instr \n"
|
||
05432 .Mrang: .asciz "Variable out of range\n"
|
||
05433 .Mset: .asciz "Err in EM set instr \n"
|
||
05434 .Mnofp: .asciz "Floating pt not impl.\n"
|
||
05435 .Mheap: .asciz "Heap overflow \n"
|
||
05436
|
||
05437 .Mtrp: .asciz "EM trap 0000000 octal\n"
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/unknown.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05500 .define .unknown
|
||
05501 .text
|
||
05502 .extern .fat
|
||
05503 EILLINS = 18
|
||
05504
|
||
05505 .unknown:
|
||
05506 mov ax,#EILLINS
|
||
05507 push ax
|
||
05508 jmp .fat
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/vars.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05600 .define .reghp, .limhp, .ignmask, .trppc
|
||
05601 .extern .reghp, .limhp, .ignmask, .trppc
|
||
05602
|
||
05603 .data
|
||
05604 .reghp:
|
||
05605 .data2 endbss
|
||
05606 .limhp:
|
||
05607 .data2 endbss
|
||
05608 .ignmask:
|
||
05609 .data2 1336
|
||
05610 .trppc:
|
||
05611 .data2 0
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/em/xor.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05700 .define .xor
|
||
05701 .text
|
||
05702
|
||
05703 ! #bytes in cx
|
||
05704 .xor:
|
||
05705 pop bx ! return address
|
||
05706 mov dx,di
|
||
05707 mov di,sp
|
||
05708 add di,cx
|
||
05709 sar cx,#1
|
||
05710 1:
|
||
05711 pop ax
|
||
05712 xor ax,(di)
|
||
05713 stos
|
||
05714 loop 1b
|
||
05715 mov di,dx
|
||
05716 jmp (bx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/misc/alloca.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05800 #
|
||
05801 ! alloca() - allocate space on the stack Author: Kees J. Bot
|
||
05802 ! 26 Jan 1994
|
||
05803
|
||
05804 #if __ACK__ /* BCC can't do alloca(), register saving is wrong. */
|
||
05805
|
||
05806 .text
|
||
05807 .define _alloca
|
||
05808 _alloca:
|
||
05809 pop cx ! Return address
|
||
05810 pop ax ! Bytes to allocate
|
||
05811 add ax, #2*2+1 ! Add space for two saved register variables
|
||
05812 andb al, #0xFE ! Align
|
||
05813 mov bx, sp ! Keep current sp
|
||
05814 sub sp, ax ! Lower stack
|
||
05815 mov ax, sp ! Return value
|
||
05816 push 2(bx) ! Push what is probably the saved si
|
||
05817 push (bx) ! Saved di
|
||
05818 ! Now ACK can still do:
|
||
05819 ! pop di; pop si; mov sp, bp; pop bp; ret
|
||
05820 push ax ! Dummy argument
|
||
05821 jmp (cx)
|
||
05822 #endif
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/misc/getprocessor.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05900 ! getprocessor() - determine processor type Author: Kees J. Bot
|
||
05901 ! 26 Jan 1994
|
||
05902
|
||
05903 .text
|
||
05904
|
||
05905 o32 = 0x66 ! 32 bit operand size prefix
|
||
05906
|
||
05907 ! int getprocessor(void);
|
||
05908 ! Return 86, 186, 286, 386, 486, 586, ...
|
||
05909
|
||
05910 .define _getprocessor
|
||
05911
|
||
05912 _getprocessor:
|
||
05913 push bp
|
||
05914 mov bp, sp
|
||
05915 push sp ! see if pushed sp == sp
|
||
05916 pop ax
|
||
05917 cmp ax, sp
|
||
05918 jz new_processor
|
||
05919 mov cx, #0x0120 ! see if shifts are mod 32
|
||
05920 shlb ch, cl ! zero tells if 86
|
||
05921 mov ax, #86
|
||
05922 jz got_processor
|
||
05923 mov ax, #186
|
||
05924 jmp got_processor
|
||
05925
|
||
05926 new_processor: ! see if high bits are set in saved GDT
|
||
05927 sub sp, #6 ! space for GDT ptr
|
||
05928 .data1 0x0F ! Prefix for 286 instruction: sgdt -6(bp)
|
||
05929 add -6(bp), ax ! save 3 word GDT ptr (This is NOT an add!)
|
||
05930 cmpb -1(bp), #0 ! top byte of GDT ptr is zero only for 386
|
||
05931 mov ax, #286
|
||
05932 jnz got_processor
|
||
05933
|
||
05934 ! 386, 486, 586
|
||
05935 and sp, #0xFFFC ! Align stack to avoid AC fault (needed?)
|
||
05936 mov cx, #0x0004 ! Try to flip the AC bit introduced on the 486
|
||
05937 call flip
|
||
05938 mov ax, #386 ! 386 if it didn't react to "flipping"
|
||
05939 jz got_processor
|
||
05940 mov cx, #0x0020 ! Try to flip the ID bit introduced on the 586
|
||
05941 call flip
|
||
05942 mov ax, #486 ! 486 if it didn't react
|
||
05943 jz got_processor
|
||
05944 .data1 o32
|
||
05945 pushf
|
||
05946 .data1 o32
|
||
05947 pusha ! Save the world
|
||
05948 .data1 o32
|
||
05949 xor ax, ax
|
||
05950 inc ax ! eax = 1
|
||
05951 .data1 0x0F, 0xA2 ! CPUID instruction tells the processor type
|
||
05952 andb ah, #0x0F ! Extract the family (5, 6, ...)
|
||
05953 movb al, ah
|
||
05954 movb ah, #100
|
||
05955 mulb ah ! 500, 600, ...
|
||
05956 add ax, #86 ! 586, 686, ...
|
||
05957 mov bx, sp
|
||
05958 mov 7*4(bx), ax ! Pass ax through
|
||
05959 .data1 o32
|
||
05960 popa
|
||
05961 .data1 o32
|
||
05962 popf
|
||
05963
|
||
05964 got_processor:
|
||
05965 mov sp, bp
|
||
05966 pop bp
|
||
05967 ret
|
||
05968
|
||
05969 flip:
|
||
05970 push bx ! Save bx and realign stack to multiple of 4
|
||
05971 .data1 o32 ! About to operate on a 32 bit object
|
||
05972 pushf ! Push eflags
|
||
05973 pop ax
|
||
05974 pop dx ! dx:ax = eflags
|
||
05975 mov bx, dx ! Save original eflags (high word only)
|
||
05976 xor dx, cx ! Flip the bit to test
|
||
05977 push dx
|
||
05978 push ax ! Push modified eflags value
|
||
05979 .data1 o32
|
||
05980 popf ! Load modified eflags register
|
||
05981 .data1 o32
|
||
05982 pushf
|
||
05983 pop ax
|
||
05984 pop dx ! Get it again
|
||
05985 push bx
|
||
05986 push ax
|
||
05987 .data1 o32
|
||
05988 popf ! Restore original eflags register
|
||
05989 xor dx, bx ! See if the bit changed
|
||
05990 test dx, cx
|
||
05991 pop bx ! Restore bx
|
||
05992 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/misc/iolib.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06000 ! Some I/O related routines like:
|
||
06001 ! unsigned char inb(int port);
|
||
06002 ! unsigned short inw(int port);
|
||
06003 ! void outb(int port, int value);
|
||
06004 ! void outw(int port, int value);
|
||
06005 ! void rep_inb(int port, unsigned char *buf, size_t count);
|
||
06006 ! void rep_inw(int port, unsigned short *buf, size_t count);
|
||
06007 ! void rep_outb(int port, unsigned char *buf, size_t count);
|
||
06008 ! void rep_outw(int port, unsigned short *buf, size_t count);
|
||
06009 ! void intr_enable(void);
|
||
06010 ! void intr_disable(void);
|
||
06011
|
||
06012 .text
|
||
06013 .define _inb
|
||
06014 _inb:
|
||
06015 push bp
|
||
06016 mov bp, sp
|
||
06017 mov dx, 4(bp) ! port
|
||
06018 inb dx ! read 1 byte
|
||
06019 xorb ah, ah
|
||
06020 pop bp
|
||
06021 ret
|
||
06022
|
||
06023 .define _inw
|
||
06024 _inw:
|
||
06025 push bp
|
||
06026 mov bp, sp
|
||
06027 mov dx, 4(bp) ! port
|
||
06028 in dx ! read 1 word
|
||
06029 pop bp
|
||
06030 ret
|
||
06031
|
||
06032 .define _outb
|
||
06033 _outb:
|
||
06034 push bp
|
||
06035 mov bp, sp
|
||
06036 mov dx, 4(bp) ! port
|
||
06037 mov ax, 4+2(bp) ! value
|
||
06038 outb dx ! output 1 byte
|
||
06039 pop bp
|
||
06040 ret
|
||
06041
|
||
06042 .define _outw
|
||
06043 _outw:
|
||
06044 push bp
|
||
06045 mov bp, sp
|
||
06046 mov dx, 4(bp) ! port
|
||
06047 mov ax, 4+2(bp) ! value
|
||
06048 out dx ! output 1 word
|
||
06049 pop bp
|
||
06050 ret
|
||
06051
|
||
06052 .define _rep_inb
|
||
06053 _rep_inb:
|
||
06054 push bp
|
||
06055 mov bp, sp
|
||
06056 push di
|
||
06057 mov dx, 4(bp) ! port
|
||
06058 mov di, 6(bp) ! buf
|
||
06059 mov cx, 8(bp) ! byte count
|
||
06060 rep inb dx ! input many bytes
|
||
06061 pop di
|
||
06062 pop bp
|
||
06063 ret
|
||
06064
|
||
06065 .define _rep_inw
|
||
06066 _rep_inw:
|
||
06067 push bp
|
||
06068 mov bp, sp
|
||
06069 push di
|
||
06070 mov dx, 4(bp) ! port
|
||
06071 mov di, 6(bp) ! buf
|
||
06072 mov cx, 8(bp) ! byte count
|
||
06073 shr cx, #1 ! word count
|
||
06074 rep in dx ! input many words
|
||
06075 pop di
|
||
06076 pop bp
|
||
06077 ret
|
||
06078
|
||
06079 .define _rep_outb
|
||
06080 _rep_outb:
|
||
06081 push bp
|
||
06082 mov bp, sp
|
||
06083 push si
|
||
06084 mov dx, 4(bp) ! port
|
||
06085 mov si, 6(bp) ! buf
|
||
06086 mov cx, 8(bp) ! byte count
|
||
06087 rep outb dx ! output many bytes
|
||
06088 pop si
|
||
06089 pop bp
|
||
06090 ret
|
||
06091
|
||
06092 .define _rep_outw
|
||
06093 _rep_outw:
|
||
06094 push bp
|
||
06095 mov bp, sp
|
||
06096 push si
|
||
06097 mov dx, 4(bp) ! port
|
||
06098 mov si, 6(bp) ! buf
|
||
06099 mov cx, 8(bp) ! byte count
|
||
06100 shr cx, #1 ! word count
|
||
06101 rep out dx ! output many words
|
||
06102 pop si
|
||
06103 pop bp
|
||
06104 ret
|
||
06105
|
||
06106 .define _intr_disable
|
||
06107 _intr_disable:
|
||
06108 push bp
|
||
06109 mov bp, sp
|
||
06110 cli
|
||
06111 pop bp
|
||
06112 ret
|
||
06113
|
||
06114 .define _intr_enable
|
||
06115 _intr_enable:
|
||
06116 push bp
|
||
06117 mov bp, sp
|
||
06118 sti
|
||
06119 pop bp
|
||
06120 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/rts/__sigreturn.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06200 ! This routine is the low-level code for returning from signals.
|
||
06201 ! It calls __sigreturn, which is the normal "system call" routine.
|
||
06202 ! Both ___sigreturn and __sigreturn are needed.
|
||
06203 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
06204 .sect .text
|
||
06205 .define ___sigreturn
|
||
06206 .extern __sigreturn
|
||
06207 ___sigreturn:
|
||
06208 add sp, #8
|
||
06209 jmp __sigreturn
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/rts/_sendrec.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06300 .define __send, __receive, __sendrec
|
||
06301
|
||
06302 ! See ../h/com.h for C definitions
|
||
06303 SEND = 1
|
||
06304 RECEIVE = 2
|
||
06305 BOTH = 3
|
||
06306 SYSVEC = 32
|
||
06307
|
||
06308 !*========================================================================*
|
||
06309 ! _send and _receive *
|
||
06310 !*========================================================================*
|
||
06311 ! _send(), _receive(), _sendrec() all save bp, but destroy ax, bx, and cx.
|
||
06312 .extern __send, __receive, __sendrec
|
||
06313 __send: mov cx,*SEND ! _send(dest, ptr)
|
||
06314 jmp L0
|
||
06315
|
||
06316 __receive:
|
||
06317 mov cx,*RECEIVE ! _receive(src, ptr)
|
||
06318 jmp L0
|
||
06319
|
||
06320 __sendrec:
|
||
06321 mov cx,*BOTH ! _sendrec(srcdest, ptr)
|
||
06322 jmp L0
|
||
06323
|
||
06324 L0: push bp ! save bp
|
||
06325 mov bp,sp ! can't index off sp
|
||
06326 mov ax,4(bp) ! ax = dest-src
|
||
06327 mov bx,6(bp) ! bx = message pointer
|
||
06328 int SYSVEC ! trap to the kernel
|
||
06329 pop bp ! restore bp
|
||
06330 ret ! return
|
||
06331
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/rts/brksize.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06400 .define __brksize
|
||
06401 .data
|
||
06402 .extern endbss, __brksize
|
||
06403 __brksize: .data2 endbss
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/rts/ncrtso.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06500 ! This is the C run-time start-off routine. It's job is to take the
|
||
06501 ! arguments as put on the stack by EXEC, and to parse them and set them up the
|
||
06502 ! way _main expects them.
|
||
06503 ! It also initializes _environ when this variable isn't defined by the
|
||
06504 ! programmer. The detection of whether _environ belong to us is rather
|
||
06505 ! simplistic. We simply check for some magic value, but there is no other
|
||
06506 ! way.
|
||
06507
|
||
06508 .extern _main, _exit, crtso, __penvp
|
||
06509 .extern begtext, begdata, begbss, endtext, enddata, endbss
|
||
06510 .text
|
||
06511 begtext:
|
||
06512 crtso: mov bx,sp
|
||
06513 mov cx,(bx)
|
||
06514 add bx,*2
|
||
06515 mov ax,cx
|
||
06516 inc ax
|
||
06517 shl ax,#1
|
||
06518 add ax,bx
|
||
06519 mov __penvp,ax ! save envp in __envp
|
||
06520
|
||
06521 ! Test whether address of environ < address of end.
|
||
06522 ! This is done for separate I&D systems.
|
||
06523 mov dx,#_environ
|
||
06524 cmp dx,#__end
|
||
06525 jae 1f
|
||
06526 cmp _environ,#21331 ! is it our _environ?
|
||
06527 jne 1f
|
||
06528 mov _environ,ax
|
||
06529 1:
|
||
06530 push ax ! push environ
|
||
06531 push bx ! push argv
|
||
06532 push cx ! push argc
|
||
06533 xor bp,bp ! clear bp for traceback of core files
|
||
06534 call _main
|
||
06535 add sp,*6
|
||
06536 push ax ! push exit status
|
||
06537 call _exit
|
||
06538
|
||
06539 .data
|
||
06540 begdata:
|
||
06541 __penvp: .data2 0
|
||
06542 .bss
|
||
06543 begbss:
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/rts/setjmp.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06600 .sect .text; .sect .data; .sect .bss
|
||
06601 .sect .bss
|
||
06602 .comm _gtobuf, 12
|
||
06603 .extern ___setjmp
|
||
06604 .extern _sigprocmask
|
||
06605 .extern __longjerr
|
||
06606 .extern __sigjmp
|
||
06607 .extern _printf, _exit
|
||
06608 .extern .blm, .sti, .cret
|
||
06609 .sect .text
|
||
06610 !
|
||
06611 ! Warning: this code depends on the C language declaration of
|
||
06612 ! jmp_buf in <setjmp.h>, and on the definitions of the flags
|
||
06613 ! SC_ONSTACK, SC_SIGCONTEXT, and SC_NOREGLOCALS in <sys/sigcontext.h>.
|
||
06614 SC_SIGCONTEXT=2
|
||
06615 SC_NOREGLOCALS=4
|
||
06616 !
|
||
06617 ! ___setjmp is called with two arguments. The third argument is pushed
|
||
06618 ! by compiler generated code transparently to the caller.
|
||
06619 !
|
||
06620 ! ___setjmp(jmp_buf, savemask, retaddr)
|
||
06621 !
|
||
06622 ___setjmp:
|
||
06623 push bp
|
||
06624 mov bp,sp
|
||
06625
|
||
06626 push 0(bp) ! frame pointer
|
||
06627 lea ax, 4(bp)
|
||
06628 push ax ! stack pointer
|
||
06629 push 8(bp) ! program counter
|
||
06630
|
||
06631 xor ax, ax
|
||
06632 push ax ! signal mask high
|
||
06633 push ax ! signal mask low
|
||
06634 mov ax,#SC_NOREGLOCALS ! flags (4 is SC_NOREGLOCALS)
|
||
06635 push ax
|
||
06636
|
||
06637 mov ax, 6(bp) ! get the savemask arg
|
||
06638 cmp ax, #0
|
||
06639 je nosigstate ! don't save signal state
|
||
06640
|
||
06641 or -12(bp), #SC_SIGCONTEXT ! flags |= SC_SIGCONTEXT
|
||
06642
|
||
06643 lea ax, -10(bp)
|
||
06644 push ax
|
||
06645 push #0
|
||
06646 push #0
|
||
06647 call _sigprocmask ! fill in signal mask
|
||
06648 add sp, #6
|
||
06649
|
||
06650 nosigstate:
|
||
06651 mov bx, 4(bp) ! jmp_buf
|
||
06652 mov cx, #12 ! sizeof(jmp_buf)
|
||
06653 call .sti ! sp = src addr, bx = dest addr, cx = count
|
||
06654 xor ax, ax
|
||
06655 jmp .cret
|
||
06656
|
||
06657 .extern __longjmp
|
||
06658 __longjmp:
|
||
06659 push bp
|
||
06660 mov bp, sp
|
||
06661
|
||
06662 ! Copy the jmp_buf to the gtobuf.
|
||
06663 push 4(bp) ! src address
|
||
06664 mov ax, #_gtobuf
|
||
06665 push ax ! dst address
|
||
06666 mov cx, #6 ! word count
|
||
06667 call .blm ! block move
|
||
06668
|
||
06669 ! Check that this jmp_buf has no saved registers.
|
||
06670 mov ax, _gtobuf ! get flags
|
||
06671 test ax, #4
|
||
06672 je __longjerr
|
||
06673
|
||
06674 ! Set up the value to return in ax.
|
||
06675 mov ax, 6(bp) ! value to return
|
||
06676 or ax, ax
|
||
06677 jne nonzero
|
||
06678 mov ax, #1
|
||
06679 nonzero:
|
||
06680 mov bx, #_gtobuf
|
||
06681 mov bp, 10(bx)
|
||
06682 mov sp, 8(bx)
|
||
06683 jmp @6(bx)
|
||
06684
|
||
06685 .extern _longjmp
|
||
06686 _longjmp:
|
||
06687 push bp
|
||
06688 mov bp, sp
|
||
06689
|
||
06690 ! Check that this is a jmp_buf with no saved regs and with signal context info.
|
||
06691 mov bx, 4(bp) ! pointer to jmp_buf
|
||
06692 mov ax, 0(bx) ! get the flags
|
||
06693 test ax, #4 ! check for no saved registers
|
||
06694 je __longjerr
|
||
06695 test ax, #2 ! check for signal context
|
||
06696 je __longjerr
|
||
06697
|
||
06698 ! Compute the value to return
|
||
06699 mov ax, 6(bp) ! proposed value to return
|
||
06700 or ax, ax
|
||
06701 jne nonzero1
|
||
06702 mov ax, #1
|
||
06703 nonzero1:
|
||
06704
|
||
06705 ! Call _sigjmp to restore the old signal context.
|
||
06706 push ax
|
||
06707 push 4(bp)
|
||
06708 call __sigjmp
|
||
06709 add sp, #4
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/_memmove.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06800 ! _memmove() Author: Kees J. Bot
|
||
06801 ! 27 Jan 1994
|
||
06802 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
06803
|
||
06804 ! void *_memmove(void *s1, const void *s2, size_t n)
|
||
06805 ! Copy a chunk of memory. Handle overlap.
|
||
06806 !
|
||
06807 .sect .text
|
||
06808 .define __memmove, __memcpy
|
||
06809 __memmove:
|
||
06810 push bp
|
||
06811 mov bp, sp
|
||
06812 push si
|
||
06813 push di
|
||
06814 mov di, 4(bp) ! String s1
|
||
06815 mov si, 6(bp) ! String s2
|
||
06816 mov cx, 8(bp) ! Length
|
||
06817 mov ax, di
|
||
06818 sub ax, si
|
||
06819 cmp ax, cx
|
||
06820 jb downwards ! if (s2 - s1) < n then copy downwards
|
||
06821 __memcpy:
|
||
06822 cld ! Clear direction bit: upwards
|
||
06823 cmp cx, #16
|
||
06824 jb upbyte ! Don't bother being smart with short arrays
|
||
06825 mov ax, si
|
||
06826 or ax, di
|
||
06827 testb al, #1
|
||
06828 jnz upbyte ! Bit 0 set, use byte copy
|
||
06829 upword: shr cx, #1
|
||
06830 rep movs ! Copy words
|
||
06831 adc cx, cx ! One more byte?
|
||
06832 upbyte:
|
||
06833 rep movsb ! Copy bytes
|
||
06834 done: mov ax, 4(bp) ! Absolutely noone cares about this value
|
||
06835 pop di
|
||
06836 pop si
|
||
06837 pop bp
|
||
06838 ret
|
||
06839
|
||
06840 ! Handle bad overlap by copying downwards, don't bother to do word copies.
|
||
06841 downwards:
|
||
06842 std ! Set direction bit: downwards
|
||
06843 add si, cx
|
||
06844 dec si
|
||
06845 add di, cx
|
||
06846 dec di
|
||
06847 rep movsb ! Copy bytes
|
||
06848 cld
|
||
06849 jmp done
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/_strncat.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06900 ! _strncat() Author: Kees J. Bot
|
||
06901 ! 27 Jan 1994
|
||
06902 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
06903
|
||
06904 ! char *_strncat(char *s1, const char *s2, size_t dx)
|
||
06905 ! Append string s2 to s1.
|
||
06906 !
|
||
06907 .sect .text
|
||
06908 .define __strncat
|
||
06909 __strncat:
|
||
06910 push bp
|
||
06911 mov bp, sp
|
||
06912 push si
|
||
06913 push di
|
||
06914 mov di, 4(bp) ! String s1
|
||
06915 mov cx, #-1
|
||
06916 xorb al, al ! Null byte
|
||
06917 cld
|
||
06918 repne scasb ! Look for the zero byte in s1
|
||
06919 dec di ! Back one up (and clear 'Z' flag)
|
||
06920 push di ! Save end of s1
|
||
06921 mov di, 6(bp) ! di = string s2
|
||
06922 mov cx, dx ! Maximum count
|
||
06923 repne scasb ! Look for the end of s2
|
||
06924 jne no0
|
||
06925 inc cx ! Exclude null byte
|
||
06926 no0: sub dx, cx ! Number of bytes in s2
|
||
06927 mov cx, dx
|
||
06928 mov si, 6(bp) ! si = string s2
|
||
06929 pop di ! di = end of string s1
|
||
06930 rep movsb ! Copy bytes
|
||
06931 stosb ! Add a terminating null
|
||
06932 mov ax, 4(bp) ! Return s1
|
||
06933 pop di
|
||
06934 pop si
|
||
06935 pop bp
|
||
06936 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/_strncmp.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07000 ! strncmp() Author: Kees J. Bot
|
||
07001 ! 27 Jan 1994
|
||
07002 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07003
|
||
07004 ! int strncmp(const char *s1, const char *s2, size_t cx)
|
||
07005 ! Compare two strings.
|
||
07006 !
|
||
07007 .sect .text
|
||
07008 .define __strncmp
|
||
07009 __strncmp:
|
||
07010 push bp
|
||
07011 mov bp, sp
|
||
07012 push si
|
||
07013 push di
|
||
07014 xor ax, ax ! Prepare return value
|
||
07015 test cx, cx ! Max length is zero?
|
||
07016 je equal
|
||
07017 mov si, 4(bp) ! si = string s1
|
||
07018 mov di, 6(bp) ! di = string s2
|
||
07019 cld
|
||
07020 compare:
|
||
07021 cmpsb ! Compare two bytes
|
||
07022 jne unequal
|
||
07023 cmpb -1(si), #0 ! End of string?
|
||
07024 je equal
|
||
07025 dec cx ! Length limit reached?
|
||
07026 jne compare
|
||
07027 jmp equal
|
||
07028 unequal:
|
||
07029 ja after
|
||
07030 sub ax, #2 ! if (s1 < s2) ax -= 2;
|
||
07031 after: inc ax ! ax++, now it's -1 or 1
|
||
07032 equal: pop di
|
||
07033 pop si
|
||
07034 pop bp
|
||
07035 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/_strncpy.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07100 ! _strncpy() Author: Kees J. Bot
|
||
07101 ! 27 Jan 1994
|
||
07102 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07103
|
||
07104 ! char *_strncpy(char *s1, const char *s2, size_t cx)
|
||
07105 ! Copy string s2 to s1.
|
||
07106 !
|
||
07107 .sect .text
|
||
07108 .define __strncpy
|
||
07109 __strncpy:
|
||
07110 mov di, 6(bp) ! di = string s2
|
||
07111 xorb al, al ! Look for a zero byte
|
||
07112 mov dx, cx ! Save maximum count
|
||
07113 cld
|
||
07114 repne scasb ! Look for end of s2
|
||
07115 sub dx, cx ! Number of bytes in s2 including null
|
||
07116 xchg cx, dx
|
||
07117 mov si, 6(bp) ! si = string s2
|
||
07118 mov di, 4(bp) ! di = string s1
|
||
07119 rep movsb ! Copy bytes
|
||
07120 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/_strnlen.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07200 ! _strnlen() Author: Kees J. Bot
|
||
07201 ! 27 Jan 1994
|
||
07202 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07203
|
||
07204 ! size_t _strnlen(const char *s, size_t cx)
|
||
07205 ! Return the length of a string.
|
||
07206 !
|
||
07207 .sect .text
|
||
07208 .define __strnlen
|
||
07209 __strnlen:
|
||
07210 push bp
|
||
07211 mov bp, sp
|
||
07212 push di
|
||
07213 mov di, 4(bp) ! di = string
|
||
07214 xorb al, al ! Look for a zero byte
|
||
07215 mov dx, cx ! Save maximum count
|
||
07216 cmpb cl, #1 ! 'Z' bit must be clear if cx = 0
|
||
07217 cld
|
||
07218 repne scasb ! Look for zero
|
||
07219 jne no0
|
||
07220 inc cx ! Don't count zero byte
|
||
07221 no0: mov ax, dx
|
||
07222 sub ax, cx ! Compute bytes scanned
|
||
07223 pop di
|
||
07224 pop bp
|
||
07225 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/bcmp.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07300 ! bcmp() Author: Kees J. Bot
|
||
07301 ! 27 Jan 1994
|
||
07302 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07303
|
||
07304 ! int bcmp(const void *s1, const void *s2, size_t n)
|
||
07305 ! Compare two chunks of memory.
|
||
07306 ! This is a BSD routine that escaped from the kernel. Don't use.
|
||
07307 ! (Alas it is not without some use, it reports the number of bytes
|
||
07308 ! after the bytes that are equal. So it can't be simply replaced.)
|
||
07309 !
|
||
07310 .sect .text
|
||
07311 .define _bcmp
|
||
07312 _bcmp:
|
||
07313 push bp
|
||
07314 mov bp, sp
|
||
07315 push 8(bp)
|
||
07316 push 6(bp)
|
||
07317 push 4(bp)
|
||
07318 call _memcmp ! Let memcmp do the work
|
||
07319 mov sp, bp
|
||
07320 test ax, ax
|
||
07321 jz equal
|
||
07322 sub dx, 4(bp) ! Memcmp was nice enough to leave "si" in dx
|
||
07323 dec dx ! Number of bytes that are equal
|
||
07324 mov ax, 8(bp)
|
||
07325 sub ax, dx ! Number of bytes that are unequal
|
||
07326 equal: pop bp
|
||
07327 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/bcopy.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07400 ! bcopy() Author: Kees J. Bot
|
||
07401 ! 27 Jan 1994
|
||
07402 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07403
|
||
07404 ! void bcopy(const void *s1, void *s2, size_t n)
|
||
07405 ! Copy a chunk of memory. Handle overlap.
|
||
07406 ! This is a BSD routine that escaped from the kernel. Don't use.
|
||
07407 !
|
||
07408 .sect .text
|
||
07409 .define _bcopy
|
||
07410 .extern __memmove
|
||
07411 _bcopy:
|
||
07412 pop cx
|
||
07413 pop ax
|
||
07414 pop dx ! Pop return address and arguments
|
||
07415 push ax
|
||
07416 push dx ! Arguments reversed
|
||
07417 push cx
|
||
07418 jmp __memmove ! Call the proper routine
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/bzero.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07500 ! bzero() Author: Kees J. Bot
|
||
07501 ! 27 Jan 1994
|
||
07502 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07503
|
||
07504 ! void bzero(void *s, size_t n)
|
||
07505 ! Set a chunk of memory to zero.
|
||
07506 ! This is a BSD routine that escaped from the kernel. Don't use.
|
||
07507 !
|
||
07508 .sect .text
|
||
07509 .define _bzero
|
||
07510 _bzero:
|
||
07511 push bp
|
||
07512 mov bp, sp
|
||
07513 push 6(bp) ! Size
|
||
07514 xor ax, ax
|
||
07515 push ax ! Zero
|
||
07516 push 4(bp) ! String
|
||
07517 call _memset ! Call the proper routine
|
||
07518 mov sp, bp
|
||
07519 pop bp
|
||
07520 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/index.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07600 ! index() Author: Kees J. Bot
|
||
07601 ! 27 Jan 1994
|
||
07602 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07603
|
||
07604 ! char *index(const char *s, int c)
|
||
07605 ! Look for a character in a string. Has suffered from a hostile
|
||
07606 ! takeover by strchr().
|
||
07607 !
|
||
07608 .sect .text
|
||
07609 .define _index
|
||
07610 _index:
|
||
07611 jmp _strchr
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/memchr.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07700 ! memchr() Author: Kees J. Bot
|
||
07701 ! 27 Jan 1994
|
||
07702 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07703
|
||
07704 ! void *memchr(const void *s, int c, size_t n)
|
||
07705 ! Look for a character in a chunk of memory.
|
||
07706 !
|
||
07707 .sect .text
|
||
07708 .define _memchr
|
||
07709 _memchr:
|
||
07710 push bp
|
||
07711 mov bp, sp
|
||
07712 push di
|
||
07713 mov di, 4(bp) ! di = string
|
||
07714 movb al, 6(bp) ! The character to look for
|
||
07715 mov cx, 8(bp) ! Length
|
||
07716 cmpb cl, #1 ! 'Z' bit must be clear if cx = 0
|
||
07717 cld
|
||
07718 repne scasb
|
||
07719 jne failure
|
||
07720 lea ax, -1(di) ! Found
|
||
07721 pop di
|
||
07722 pop bp
|
||
07723 ret
|
||
07724 failure:xor ax, ax
|
||
07725 pop di
|
||
07726 pop bp
|
||
07727 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/memcmp.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07800 ! memcmp() Author: Kees J. Bot
|
||
07801 ! 27 Jan 1994
|
||
07802 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07803
|
||
07804 ! int memcmp(const void *s1, const void *s2, size_t n)
|
||
07805 ! Compare two chunks of memory.
|
||
07806 !
|
||
07807 .sect .text
|
||
07808 .define _memcmp
|
||
07809 _memcmp:
|
||
07810 cld
|
||
07811 push bp
|
||
07812 mov bp, sp
|
||
07813 push si
|
||
07814 push di
|
||
07815 xor ax, ax ! Prepare return value
|
||
07816 mov si, 4(bp) ! String s1
|
||
07817 mov di, 6(bp) ! String s2
|
||
07818 mov cx, 8(bp) ! Length
|
||
07819 cmp cx, #16
|
||
07820 jb cbyte ! Don't bother being smart with short arrays
|
||
07821 mov dx, si
|
||
07822 or dx, di
|
||
07823 andb dl, #1
|
||
07824 jnz cbyte ! Bit 0 set, use byte compare
|
||
07825 cword: sar cx, #1
|
||
07826 adcb dl, dl ! Save carry
|
||
07827 repe cmps ! Compare words
|
||
07828 mov cx, #2 ! Recompare the last word
|
||
07829 sub si, cx
|
||
07830 sub di, cx
|
||
07831 addb cl, dl ! One more byte?
|
||
07832 cbyte: test cx, cx ! Set 'Z' flag if cx = 0
|
||
07833 last:
|
||
07834 repe cmpsb ! Look for the first differing byte
|
||
07835 je equal
|
||
07836 ja after
|
||
07837 sub ax, #2 ! if (s1 < s2) ax -= 2;
|
||
07838 after: inc ax ! ax++, now it's -1 or 1
|
||
07839 equal: mov dx, si ! For bcmp() to play with
|
||
07840 pop di
|
||
07841 pop si
|
||
07842 pop bp
|
||
07843 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/memcpy.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07900 ! memcpy() Author: Kees J. Bot
|
||
07901 ! 27 Jan 1994
|
||
07902 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07903
|
||
07904 ! void *memcpy(void *s1, const void *s2, size_t n)
|
||
07905 ! Copy a chunk of memory.
|
||
07906 ! This routine need not handle overlap, so it does not handle overlap.
|
||
07907 ! One could simply call __memmove, the cost of the overlap check is
|
||
07908 ! negligible, but you are dealing with a programmer who believes that
|
||
07909 ! if anything can go wrong, it should go wrong.
|
||
07910 !
|
||
07911 .sect .text
|
||
07912 .define _memcpy
|
||
07913 _memcpy:
|
||
07914 push bp
|
||
07915 mov bp, sp
|
||
07916 push si
|
||
07917 push di
|
||
07918 mov di, 4(bp) ! String s1
|
||
07919 mov si, 6(bp) ! String s2
|
||
07920 mov cx, 8(bp) ! Length
|
||
07921 ! No overlap check here
|
||
07922 jmp __memcpy ! Call the part of __memmove that copies up
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/memmove.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08000 ! memmove() Author: Kees J. Bot
|
||
08001 ! 27 Jan 1994
|
||
08002 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08003
|
||
08004 ! void *memmove(void *s1, const void *s2, size_t n)
|
||
08005 ! Copy a chunk of memory. Handle overlap.
|
||
08006 !
|
||
08007 .sect .text
|
||
08008 .define _memmove
|
||
08009 _memmove:
|
||
08010 jmp __memmove ! Call common code
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/memset.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08100 ! memset() Author: Kees J. Bot
|
||
08101 ! 27 Jan 1994
|
||
08102 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08103
|
||
08104 ! void *memset(void *s, int c, size_t n)
|
||
08105 ! Set a chunk of memory to the same byte value.
|
||
08106 !
|
||
08107 .sect .text
|
||
08108 .define _memset
|
||
08109 _memset:
|
||
08110 push bp
|
||
08111 mov bp, sp
|
||
08112 push di
|
||
08113 mov di, 4(bp) ! The string
|
||
08114 movb al, 6(bp) ! The fill byte
|
||
08115 mov cx, 8(bp) ! Length
|
||
08116 cld
|
||
08117 cmp cx, #16
|
||
08118 jb sbyte ! Don't bother being smart with short arrays
|
||
08119 test di, #1
|
||
08120 jnz sbyte ! Bit 0 set, use byte store
|
||
08121 sword: movb ah, al ! One byte to two bytes
|
||
08122 sar cx, #1
|
||
08123 rep stos ! Store words
|
||
08124 adc cx, cx ! One more byte?
|
||
08125 sbyte:
|
||
08126 rep stosb ! Store bytes
|
||
08127 done: mov ax, 4(bp) ! Return some value you have no need for
|
||
08128 pop di
|
||
08129 pop bp
|
||
08130 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/rindex.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08200 ! rindex() Author: Kees J. Bot
|
||
08201 ! 27 Jan 1994
|
||
08202 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08203
|
||
08204 ! char *rindex(const char *s, int c)
|
||
08205 ! Look for the last occurrence a character in a string. Has suffered
|
||
08206 ! from a hostile takeover by strrchr().
|
||
08207 !
|
||
08208 .sect .text
|
||
08209 .define _rindex
|
||
08210 _rindex:
|
||
08211 jmp _strrchr
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/strcat.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08300 ! strcat() Author: Kees J. Bot
|
||
08301 ! 27 Jan 1994
|
||
08302 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08303
|
||
08304 ! char *strcat(char *s1, const char *s2)
|
||
08305 ! Append string s2 to s1.
|
||
08306 !
|
||
08307 .sect .text
|
||
08308 .define _strcat
|
||
08309 _strcat:
|
||
08310 mov dx, #-1 ! Unlimited length
|
||
08311 jmp __strncat ! Common code
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/strchr.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08400 ! strchr() Author: Kees J. Bot
|
||
08401 ! 27 Jan 1994
|
||
08402 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08403
|
||
08404 ! char *strchr(const char *s, int c)
|
||
08405 ! Look for a character in a string.
|
||
08406 !
|
||
08407 .sect .text
|
||
08408 .define _strchr
|
||
08409 _strchr:
|
||
08410 push bp
|
||
08411 mov bp, sp
|
||
08412 push di
|
||
08413 cld
|
||
08414 mov di, 4(bp) ! di = string
|
||
08415 mov dx, #16 ! Look at small chunks of the string
|
||
08416 next: shl dx, #1 ! Chunks become bigger each time
|
||
08417 mov cx, dx
|
||
08418 xorb al, al ! Look for the zero at the end
|
||
08419 repne scasb
|
||
08420 pushf ! Remember the flags
|
||
08421 sub cx, dx
|
||
08422 neg cx ! Some or all of the chunk
|
||
08423 sub di, cx ! Step back
|
||
08424 movb al, 6(bp) ! The character to look for
|
||
08425 repne scasb
|
||
08426 je found
|
||
08427 popf ! Did we find the end of string earlier?
|
||
08428 jne next ! No, try again
|
||
08429 xor ax, ax ! Return NULL
|
||
08430 pop di
|
||
08431 pop bp
|
||
08432 ret
|
||
08433 found: pop ax ! Get rid of those flags
|
||
08434 lea ax, -1(di) ! Address of byte found
|
||
08435 pop di
|
||
08436 pop bp
|
||
08437 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/strcmp.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08500 ! strcmp() Author: Kees J. Bot
|
||
08501 ! 27 Jan 1994
|
||
08502 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08503
|
||
08504 ! int strcmp(const char *s1, const char *s2)
|
||
08505 ! Compare two strings.
|
||
08506 !
|
||
08507 .sect .text
|
||
08508 .define _strcmp
|
||
08509 _strcmp:
|
||
08510 mov cx, #-1 ! Unlimited length
|
||
08511 jmp __strncmp ! Common code
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/strcpy.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08600 ! strcpy() Author: Kees J. Bot
|
||
08601 ! 27 Jan 1994
|
||
08602 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08603
|
||
08604 ! char *strcpy(char *s1, const char *s2)
|
||
08605 ! Copy string s2 to s1.
|
||
08606 !
|
||
08607 .sect .text
|
||
08608 .define _strcpy
|
||
08609 _strcpy:
|
||
08610 push bp
|
||
08611 mov bp, sp
|
||
08612 push si
|
||
08613 push di
|
||
08614 mov cx, #-1 ! Unlimited length
|
||
08615 call __strncpy ! Common code
|
||
08616 mov ax, 4(bp) ! Return s1
|
||
08617 pop di
|
||
08618 pop si
|
||
08619 pop bp
|
||
08620 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/strlen.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08700 ! strlen() Author: Kees J. Bot
|
||
08701 ! 27 Jan 1994
|
||
08702 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08703
|
||
08704 ! size_t strlen(const char *s)
|
||
08705 ! Return the length of a string.
|
||
08706 !
|
||
08707 .sect .text
|
||
08708 .define _strlen
|
||
08709 _strlen:
|
||
08710 mov cx, #-1 ! Unlimited length
|
||
08711 jmp __strnlen ! Common code
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/strncat.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08800 ! strncat() Author: Kees J. Bot
|
||
08801 ! 27 Jan 1994
|
||
08802 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08803
|
||
08804 ! size_t strncat(char *s1, const char *s2, size_t n)
|
||
08805 ! Append string s2 to s1.
|
||
08806 !
|
||
08807 .sect .text
|
||
08808 .define _strncat
|
||
08809 _strncat:
|
||
08810 mov bx, sp
|
||
08811 mov dx, 6(bx) ! Maximum length
|
||
08812 jmp __strncat ! Common code
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/strncmp.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08900 ! strncmp() Author: Kees J. Bot
|
||
08901 ! 27 Jan 1994
|
||
08902 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08903
|
||
08904 ! int strncmp(const char *s1, const char *s2, size_t n)
|
||
08905 ! Compare two strings.
|
||
08906 !
|
||
08907 .sect .text
|
||
08908 .define _strncmp
|
||
08909 _strncmp:
|
||
08910 mov bx, sp
|
||
08911 mov cx, 6(bx) ! Maximum length
|
||
08912 jmp __strncmp ! Common code
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/strncpy.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
09000 ! strncpy() Author: Kees J. Bot
|
||
09001 ! 27 Jan 1994
|
||
09002 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
09003
|
||
09004 ! char *strncpy(char *s1, const char *s2, size_t n)
|
||
09005 ! Copy string s2 to s1.
|
||
09006 !
|
||
09007 .sect .text
|
||
09008 .define _strncpy
|
||
09009 _strncpy:
|
||
09010 push bp
|
||
09011 mov bp, sp
|
||
09012 push si
|
||
09013 push di
|
||
09014 mov cx, 8(bp) ! Maximum length
|
||
09015 call __strncpy ! Common code
|
||
09016 mov cx, dx ! Number of bytes not copied
|
||
09017 rep stosb ! strncpy always copies n bytes by null padding
|
||
09018 mov ax, 4(bp) ! Return s1
|
||
09019 pop di
|
||
09020 pop si
|
||
09021 pop bp
|
||
09022 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/strnlen.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
09100 ! strnlen() Author: Kees J. Bot
|
||
09101 ! 27 Jan 1994
|
||
09102 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
09103
|
||
09104 ! size_t strnlen(const char *s, size_t n)
|
||
09105 ! Return the length of a string.
|
||
09106 !
|
||
09107 .sect .text
|
||
09108 .define _strnlen
|
||
09109 _strnlen:
|
||
09110 mov bx, sp
|
||
09111 mov cx, 4(bx) ! Maximum length
|
||
09112 jmp __strnlen ! Common code
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i86/string/strrchr.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
09200 ! strrchr() Author: Kees J. Bot
|
||
09201 ! 27 Jan 1994
|
||
09202 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
09203
|
||
09204 ! char *strrchr(const char *s, int c)
|
||
09205 ! Look for the last occurrence a character in a string.
|
||
09206 !
|
||
09207 .sect .text
|
||
09208 .define _strrchr
|
||
09209 _strrchr:
|
||
09210 push bp
|
||
09211 mov bp, sp
|
||
09212 push di
|
||
09213 mov di, 4(bp) ! di = string
|
||
09214 mov cx, #-1
|
||
09215 xorb al, al
|
||
09216 cld
|
||
09217 repne scasb ! Look for the end of the string
|
||
09218 not cx ! -1 - cx = Length of the string + null
|
||
09219 dec di ! Put di back on the zero byte
|
||
09220 movb al, 6(bp) ! The character to look for
|
||
09221 std ! Downwards search
|
||
09222 repne scasb
|
||
09223 cld ! Direction bit back to default
|
||
09224 jne failure
|
||
09225 lea ax, 1(di) ! Found it
|
||
09226 pop di
|
||
09227 pop bp
|
||
09228 ret
|
||
09229 failure:xor ax, ax ! Not there
|
||
09230 pop di
|
||
09231 pop bp
|
||
09232 ret
|
||
|
||
|