LIB86.TXT
资源名称:os_source.zip [点击查看]
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:108k
源码类别:
操作系统开发
开发平台:
C/C++
- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 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'nn"
- 05431 .Mcase: .asciz "Err in EM case instr n"
- 05432 .Mrang: .asciz "Variable out of rangen"
- 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 octaln"
- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 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