3149 lines
106 KiB
Plaintext
3149 lines
106 KiB
Plaintext
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/byte_order.h
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00000 #define CHAR_UNSIGNED 0
|
||
00001 #define MSB_AT_LOW_ADDRESS 0
|
||
00002 #define MSW_AT_LOW_ADDRESS 0
|
||
00003 #define FL_MSB_AT_LOW_ADDRESS 0
|
||
00004 #define FL_MSW_AT_LOW_ADDRESS 0
|
||
00005 #define FL_MSL_AT_LOW_ADDRESS 0
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_adf4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00100 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
00101 .define .adf4
|
||
00102
|
||
00103 .sect .text
|
||
00104 .adf4:
|
||
00105 mov bx,sp
|
||
00106 flds 4(bx)
|
||
00107 fadds 8(bx)
|
||
00108 fstps 8(bx)
|
||
00109 wait
|
||
00110 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_adf8.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00200 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
00201 .define .adf8
|
||
00202
|
||
00203 .sect .text
|
||
00204 .adf8:
|
||
00205 mov bx,sp
|
||
00206 fldd 4(bx)
|
||
00207 faddd 12(bx)
|
||
00208 fstpd 12(bx)
|
||
00209 wait
|
||
00210 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_adi.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00300 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
00301 .define .adi
|
||
00302
|
||
00303 ! #bytes in ecx , top of stack in eax
|
||
00304 .sect .text
|
||
00305 .adi:
|
||
00306 pop ebx ! return address
|
||
00307 cmp ecx,4
|
||
00308 jne 9f
|
||
00309 pop ecx
|
||
00310 add eax,ecx
|
||
00311 jmp ebx
|
||
00312 9:
|
||
00313 .extern EODDZ
|
||
00314 .extern .trp
|
||
00315 mov eax,EODDZ
|
||
00316 push ebx
|
||
00317 jmp .trp
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_and.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00400 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
00401 .define .and
|
||
00402
|
||
00403 ! #bytes in ecx
|
||
00404 ! save edi; it might be a register variable
|
||
00405
|
||
00406 .sect .text
|
||
00407 .and:
|
||
00408 pop ebx ! return address
|
||
00409 mov edx,edi
|
||
00410 mov edi,esp
|
||
00411 add edi,ecx
|
||
00412 sar ecx,2
|
||
00413 1:
|
||
00414 pop eax
|
||
00415 and eax,(edi)
|
||
00416 stos
|
||
00417 loop 1b
|
||
00418 mov edi,edx
|
||
00419 jmp ebx
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_blm.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00500 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
00501 .sect .text
|
||
00502 .define .blm
|
||
00503
|
||
00504 ! ecx: count in words
|
||
00505 .blm:
|
||
00506 mov ebx,esp
|
||
00507 mov eax,esi
|
||
00508 mov edx,edi
|
||
00509 mov edi,4(ebx)
|
||
00510 mov esi,8(ebx)
|
||
00511 rep movs
|
||
00512 mov esi,eax
|
||
00513 mov edi,edx
|
||
00514 ret 8
|
||
00515
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_cff4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00600 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
00601 .define .cff4
|
||
00602
|
||
00603 .sect .text
|
||
00604 .cff4:
|
||
00605 mov bx,sp
|
||
00606 fldd 4(bx)
|
||
00607 fstcw 4(bx)
|
||
00608 wait
|
||
00609 mov dx,4(bx)
|
||
00610 and 4(bx),0xf3ff ! set to rounding mode
|
||
00611 wait
|
||
00612 fldcw 4(bx)
|
||
00613 fstps 8(bx)
|
||
00614 mov 4(bx),dx
|
||
00615 wait
|
||
00616 fldcw 4(bx)
|
||
00617 wait
|
||
00618 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_cff8.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00700 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
00701 .define .cff8
|
||
00702
|
||
00703 .sect .text
|
||
00704 .cff8:
|
||
00705 mov bx,sp
|
||
00706 flds 4(bx)
|
||
00707 fstpd 4(bx)
|
||
00708 wait
|
||
00709 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_cfi.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00800 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
00801 .define .cfi
|
||
00802
|
||
00803 .sect .text
|
||
00804 .cfi:
|
||
00805 mov bx,sp
|
||
00806 fstcw 4(bx)
|
||
00807 wait
|
||
00808 mov dx,4(bx)
|
||
00809 or 4(bx),0xc00 ! truncating mode
|
||
00810 wait
|
||
00811 fldcw 4(bx)
|
||
00812 cmp 8(bx),4
|
||
00813 jne 2f
|
||
00814 ! loc 4 loc ? cfi
|
||
00815 flds 12(bx)
|
||
00816 fistpl 12(bx)
|
||
00817 1:
|
||
00818 mov 4(bx),dx
|
||
00819 wait
|
||
00820 fldcw 4(bx)
|
||
00821 ret
|
||
00822 2:
|
||
00823 ! loc 8 loc ? cfi
|
||
00824 fldd 12(bx)
|
||
00825 fistpl 16(bx)
|
||
00826 jmp 1b
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_cfu.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
00900 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
00901 .define .cfu
|
||
00902
|
||
00903 .sect .text
|
||
00904 .cfu:
|
||
00905 mov bx,sp
|
||
00906 fstcw 4(bx)
|
||
00907 wait
|
||
00908 mov dx,4(bx)
|
||
00909 or 4(bx),0xc00 ! truncating mode
|
||
00910 wait
|
||
00911 fldcw 4(bx)
|
||
00912 cmp 8(bx),4
|
||
00913 jne 2f
|
||
00914 ! loc 4 loc ? cfu
|
||
00915 flds 12(bx)
|
||
00916 fabs ! ???
|
||
00917 fiaddl (bigmin)
|
||
00918 fistpl 12(bx)
|
||
00919 wait
|
||
00920 mov ax,12(bx)
|
||
00921 sub ax,(bigmin)
|
||
00922 mov 12(bx),ax
|
||
00923 1:
|
||
00924 mov 4(bx),dx
|
||
00925 wait
|
||
00926 fldcw 4(bx)
|
||
00927 ret
|
||
00928 2:
|
||
00929 ! loc 8 loc ? cfu
|
||
00930 fldd 12(bx)
|
||
00931 fabs ! ???
|
||
00932 fiaddl (bigmin)
|
||
00933 fistpl 16(bx)
|
||
00934 mov ax,16(bx)
|
||
00935 sub ax,(bigmin)
|
||
00936 mov 16(bx),ax
|
||
00937 jmp 1b
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_cif4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01000 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
01001 .define .cif4
|
||
01002
|
||
01003 .sect .text
|
||
01004 .cif4:
|
||
01005 mov bx,sp
|
||
01006 fildl 8(bx)
|
||
01007 fstps 8(bx)
|
||
01008 wait
|
||
01009 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_cif8.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01100 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
01101 .define .cif8
|
||
01102
|
||
01103 .sect .text
|
||
01104 .cif8:
|
||
01105 mov bx,sp
|
||
01106 fildl 8(bx)
|
||
01107 fstpd 4(bx)
|
||
01108 wait
|
||
01109 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_cii.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01200 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
01201 .define .cii
|
||
01202
|
||
01203 .sect .text
|
||
01204 .cii:
|
||
01205 pop ebx ! return address
|
||
01206 ! pop ecx, dest. size
|
||
01207 ! pop edx, src. size
|
||
01208 ! eax is source
|
||
01209 cmp edx,1
|
||
01210 jne 2f
|
||
01211 movsxb eax,al
|
||
01212 mov edx,4
|
||
01213 jmp 1f
|
||
01214 2:
|
||
01215 cmp edx,2
|
||
01216 jne 1f
|
||
01217 cwde ! convert from 2 to 4 bytes
|
||
01218 mov edx,4
|
||
01219 1:
|
||
01220 cmp edx,ecx
|
||
01221 jne 9f
|
||
01222 cmp edx,4
|
||
01223 jne 9f
|
||
01224 jmp ebx
|
||
01225 9:
|
||
01226 .extern EILLINS
|
||
01227 .extern .fat
|
||
01228 mov eax,EILLINS
|
||
01229 push eax
|
||
01230 jmp .fat
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_cmf4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01300 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
01301 .define .cmf4
|
||
01302
|
||
01303 .sect .text
|
||
01304 .cmf4:
|
||
01305 mov bx,sp
|
||
01306 xor cx,cx
|
||
01307 flds 8(bx)
|
||
01308 flds 4(bx)
|
||
01309 fcompp ! compare and pop operands
|
||
01310 fstsw ax
|
||
01311 wait
|
||
01312 sahf
|
||
01313 je 1f
|
||
01314 jb 2f
|
||
01315 dec cx
|
||
01316 jmp 1f
|
||
01317 2:
|
||
01318 inc cx
|
||
01319 1:
|
||
01320 mov ax,cx
|
||
01321 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_cmf8.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01400 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
01401 .define .cmf8
|
||
01402
|
||
01403 .sect .text
|
||
01404 .cmf8:
|
||
01405 mov bx,sp
|
||
01406 xor cx,cx
|
||
01407 fldd 12(bx)
|
||
01408 fldd 4(bx)
|
||
01409 fcompp ! compare and pop operands
|
||
01410 fstsw ax
|
||
01411 wait
|
||
01412 sahf
|
||
01413 je 1f
|
||
01414 jb 2f
|
||
01415 dec cx
|
||
01416 jmp 1f
|
||
01417 2:
|
||
01418 inc cx
|
||
01419 1:
|
||
01420 mov ax,cx
|
||
01421 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_cms.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01500 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
01501 .define .cms
|
||
01502
|
||
01503 ! #bytes in ecx
|
||
01504 .sect .text
|
||
01505 .cms:
|
||
01506 pop ebx ! return address
|
||
01507 mov edx,esp
|
||
01508 push esi
|
||
01509 push edi
|
||
01510 mov esi,edx
|
||
01511 add edx,ecx
|
||
01512 mov edi,edx
|
||
01513 add edx,ecx
|
||
01514 sar ecx,2
|
||
01515 repe cmps
|
||
01516 je 1f
|
||
01517 inc ecx
|
||
01518 1:
|
||
01519 pop edi
|
||
01520 pop esi
|
||
01521 mov esp,edx
|
||
01522 jmp ebx
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_com.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01600 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
01601 .define .com
|
||
01602
|
||
01603 ! #bytes in ecx
|
||
01604 .sect .text
|
||
01605 .com:
|
||
01606 mov ebx,esp
|
||
01607 add ebx,4
|
||
01608 sar ecx,2
|
||
01609 1:
|
||
01610 not (ebx)
|
||
01611 add ebx,4
|
||
01612 loop 1b
|
||
01613 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_csa4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01700 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
01701 .define .csa4
|
||
01702
|
||
01703 .sect .text
|
||
01704 .csa4:
|
||
01705 ! ebx, descriptor address
|
||
01706 ! eax, index
|
||
01707 mov edx,(ebx) ! default
|
||
01708 sub eax,4(ebx)
|
||
01709 cmp eax,8(ebx)
|
||
01710 ja 1f
|
||
01711 sal eax,2
|
||
01712 add ebx,eax
|
||
01713 mov ebx,12(ebx)
|
||
01714 test ebx,ebx
|
||
01715 jnz 2f
|
||
01716 1:
|
||
01717 mov ebx,edx
|
||
01718 test ebx,ebx
|
||
01719 jnz 2f
|
||
01720 .extern ECASE
|
||
01721 .extern .fat
|
||
01722 mov eax,ECASE
|
||
01723 push eax
|
||
01724 jmp .fat
|
||
01725 2:
|
||
01726 jmp ebx
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_csb4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01800 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
01801 .define .csb4
|
||
01802
|
||
01803 .sect .text
|
||
01804 .csb4:
|
||
01805 !ebx, descriptor address
|
||
01806 !eax, index
|
||
01807 mov edx,(ebx)
|
||
01808 mov ecx,4(ebx)
|
||
01809 1:
|
||
01810 add ebx,8
|
||
01811 dec ecx
|
||
01812 jl 4f
|
||
01813 cmp eax,(ebx)
|
||
01814 jne 1b
|
||
01815 mov ebx,4(ebx)
|
||
01816 2:
|
||
01817 test ebx,ebx
|
||
01818 jnz 3f
|
||
01819 .extern ECASE
|
||
01820 .extern .fat
|
||
01821 mov eax,ECASE
|
||
01822 push eax
|
||
01823 jmp .fat
|
||
01824 3:
|
||
01825 jmp ebx
|
||
01826 4:
|
||
01827 mov ebx,edx
|
||
01828 jmp 2b
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_cuf4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
01900 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
01901 .define .cuf4
|
||
01902
|
||
01903 .sect .text
|
||
01904 .cuf4:
|
||
01905 mov bx,sp
|
||
01906 fildl 8(bx)
|
||
01907 cmp 8(bx),0
|
||
01908 jge 1f
|
||
01909 fisubl (bigmin)
|
||
01910 fisubl (bigmin)
|
||
01911 1:
|
||
01912 fstps 8(bx)
|
||
01913 wait
|
||
01914 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_cuf8.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
02000 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
02001 .define .cuf8
|
||
02002
|
||
02003 .sect .text
|
||
02004 .cuf8:
|
||
02005 mov bx,sp
|
||
02006 fildl 8(bx)
|
||
02007 cmp 8(bx),0
|
||
02008 jge 1f
|
||
02009 fisubl (bigmin)
|
||
02010 fisubl (bigmin)
|
||
02011 1:
|
||
02012 fstpd 4(bx)
|
||
02013 wait
|
||
02014 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_cuu.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
02100 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
02101 .define .ciu
|
||
02102 .define .cui
|
||
02103 .define .cuu
|
||
02104
|
||
02105 .sect .text
|
||
02106 .ciu:
|
||
02107 .cui:
|
||
02108 .cuu:
|
||
02109 pop ebx ! return address
|
||
02110 ! pop ecx, dest. size
|
||
02111 ! pop edx, source size
|
||
02112 ! eax is source
|
||
02113 cmp edx,ecx
|
||
02114 jne 8f
|
||
02115 jmp ebx
|
||
02116 8:
|
||
02117 .extern EILLINS
|
||
02118 .extern .fat
|
||
02119 mov eax,EILLINS
|
||
02120 push eax
|
||
02121 jmp .fat
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_dup.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
02200 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
02201 .define .dup
|
||
02202
|
||
02203 ! #bytes in ecx
|
||
02204 .sect .text
|
||
02205 .dup:
|
||
02206 pop ebx ! return address
|
||
02207 mov eax,esi
|
||
02208 mov edx,edi
|
||
02209 mov esi,esp
|
||
02210 sub esp,ecx
|
||
02211 mov edi,esp
|
||
02212 sar ecx,2
|
||
02213 rep movs
|
||
02214 mov esi,eax
|
||
02215 mov edi,edx
|
||
02216 jmp ebx
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_dvf4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
02300 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
02301 .define .dvf4
|
||
02302
|
||
02303 .sect .text
|
||
02304 .dvf4:
|
||
02305 mov bx,sp
|
||
02306 flds 8(bx)
|
||
02307 fdivs 4(bx)
|
||
02308 fstps 8(bx)
|
||
02309 wait
|
||
02310 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_dvf8.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
02400 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
02401 .define .dvf8
|
||
02402
|
||
02403 .sect .text
|
||
02404 .dvf8:
|
||
02405 mov bx,sp
|
||
02406 fldd 12(bx)
|
||
02407 fdivd 4(bx)
|
||
02408 fstpd 12(bx)
|
||
02409 wait
|
||
02410 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_dvi.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
02500 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
02501 .define .dvi
|
||
02502
|
||
02503 ! #bytes in eax
|
||
02504 .sect .text
|
||
02505 .dvi:
|
||
02506 pop ebx ! return address
|
||
02507 cmp eax,4
|
||
02508 jne 1f
|
||
02509 pop eax
|
||
02510 cwd
|
||
02511 pop ecx
|
||
02512 idiv ecx
|
||
02513 push eax
|
||
02514 jmp ebx
|
||
02515 1:
|
||
02516 .extern EODDZ
|
||
02517 .extern .trp
|
||
02518 mov eax,EODDZ
|
||
02519 push ebx
|
||
02520 jmp .trp
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_dvu.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
02600 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
02601 .define .dvu
|
||
02602
|
||
02603 ! #bytes in eax
|
||
02604 .sect .text
|
||
02605 .dvu:
|
||
02606 pop ebx ! return address
|
||
02607 cmp eax,4
|
||
02608 jne 1f
|
||
02609 pop eax
|
||
02610 xor edx,edx
|
||
02611 pop ecx
|
||
02612 div ecx
|
||
02613 push eax
|
||
02614 jmp ebx
|
||
02615 1:
|
||
02616 .extern EODDZ
|
||
02617 .extern .trp
|
||
02618 mov eax,EODDZ
|
||
02619 push ebx
|
||
02620 jmp .trp
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_error.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
02700 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
02701 .define .error
|
||
02702 .define .Xtrp
|
||
02703
|
||
02704 ! eax is trap number
|
||
02705 ! all registers must be saved
|
||
02706 ! because return is possible
|
||
02707 ! May only be called with error no's <16
|
||
02708 .sect .text
|
||
02709 .error:
|
||
02710 mov ecx,eax
|
||
02711 mov ebx,1
|
||
02712 sal ebx,cl
|
||
02713 .extern .ignmask
|
||
02714 .extern .trp
|
||
02715 test ebx,(.ignmask)
|
||
02716 jne 2f
|
||
02717 call .trp
|
||
02718 2:
|
||
02719 ret
|
||
02720
|
||
02721 .Xtrp:
|
||
02722 pusha
|
||
02723 cmp eax,16
|
||
02724 jge 1f
|
||
02725 call .error
|
||
02726 popa
|
||
02727 ret
|
||
02728 1:
|
||
02729 call .trp
|
||
02730 popa
|
||
02731 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_exg.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
02800 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
02801 .define .exg
|
||
02802
|
||
02803 ! #bytes in ecx
|
||
02804 .sect .text
|
||
02805 .exg:
|
||
02806 push edi
|
||
02807 mov edi,esp
|
||
02808 add edi,8
|
||
02809 mov ebx,edi
|
||
02810 add ebx,ecx
|
||
02811 sar ecx,2
|
||
02812 1:
|
||
02813 mov eax,(ebx)
|
||
02814 xchg eax,(edi)
|
||
02815 mov (ebx),eax
|
||
02816 add edi,4
|
||
02817 add ebx,4
|
||
02818 loop 1b
|
||
02819 2:
|
||
02820 pop edi
|
||
02821 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_fat.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
02900 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
02901 .sect .text
|
||
02902 .define .fat
|
||
02903
|
||
02904 .fat:
|
||
02905 .extern .trp
|
||
02906 .extern .stop
|
||
02907 call .trp
|
||
02908 call .stop
|
||
02909 ! no return
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_fef4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03000 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
03001 .define .fef4
|
||
03002
|
||
03003 .sect .text
|
||
03004 .fef4:
|
||
03005 ! this could be simpler, if only the
|
||
03006 ! fxtract instruction was emulated properly
|
||
03007 mov bx,sp
|
||
03008 mov ax,8(bx)
|
||
03009 and ax,0x7f800000
|
||
03010 je 1f ! zero exponent
|
||
03011 shr ax,23
|
||
03012 sub ax,126
|
||
03013 mov cx,ax ! exponent in cx
|
||
03014 mov ax,8(bx)
|
||
03015 and ax,0x807fffff
|
||
03016 or ax,0x3f000000 ! load -1 exponent
|
||
03017 mov bx,4(bx)
|
||
03018 mov 4(bx),ax
|
||
03019 mov (bx),cx
|
||
03020 ret
|
||
03021 1: ! we get here on zero exp
|
||
03022 mov ax,8(bx)
|
||
03023 and ax,0x007fffff
|
||
03024 jne 1f ! zero result
|
||
03025 mov bx,4(bx)
|
||
03026 mov (bx),ax
|
||
03027 mov 4(bx),ax
|
||
03028 ret
|
||
03029 1: ! otherwise unnormalized number
|
||
03030 mov cx,8(bx)
|
||
03031 and cx,0x807fffff
|
||
03032 mov dx,cx
|
||
03033 and cx,0x80000000
|
||
03034 mov ax,-125
|
||
03035 2:
|
||
03036 test dx,0x800000
|
||
03037 jne 1f
|
||
03038 dec ax
|
||
03039 shl dx,1
|
||
03040 or dx,cx
|
||
03041 jmp 2b
|
||
03042 1:
|
||
03043 mov bx,4(bx)
|
||
03044 mov (bx),ax
|
||
03045 and dx,0x807fffff
|
||
03046 or dx,0x3f000000 ! load -1 exponent
|
||
03047 mov 4(bx),dx
|
||
03048 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_fef8.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03100 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
03101 .define .fef8
|
||
03102
|
||
03103 .sect .text
|
||
03104 .fef8:
|
||
03105 ! this could be simpler, if only the
|
||
03106 ! fxtract instruction was emulated properly
|
||
03107 mov bx,sp
|
||
03108 mov ax,12(bx)
|
||
03109 and ax,0x7ff00000
|
||
03110 je 1f ! zero exponent
|
||
03111 shr ax,20
|
||
03112 sub ax,1022
|
||
03113 mov cx,ax ! exponent in cx
|
||
03114 mov ax,12(bx)
|
||
03115 and ax,0x800fffff
|
||
03116 or ax,0x3fe00000 ! load -1 exponent
|
||
03117 mov dx,8(bx)
|
||
03118 mov bx,4(bx)
|
||
03119 mov 4(bx),dx
|
||
03120 mov 8(bx),ax
|
||
03121 mov (bx),cx
|
||
03122 ret
|
||
03123 1: ! we get here on zero exp
|
||
03124 mov ax,12(bx)
|
||
03125 and ax,0xfffff
|
||
03126 or ax,8(bx)
|
||
03127 jne 1f ! zero result
|
||
03128 mov bx,4(bx)
|
||
03129 mov (bx),ax
|
||
03130 mov 4(bx),ax
|
||
03131 mov 8(bx),ax
|
||
03132 ret
|
||
03133 1: ! otherwise unnormalized number
|
||
03134 mov cx,12(bx)
|
||
03135 and cx,0x800fffff
|
||
03136 mov dx,cx
|
||
03137 and cx,0x80000000
|
||
03138 mov ax,-1021
|
||
03139 2:
|
||
03140 test dx,0x100000
|
||
03141 jne 1f
|
||
03142 dec ax
|
||
03143 shl 8(bx),1
|
||
03144 rcl dx,1
|
||
03145 or dx,cx
|
||
03146 jmp 2b
|
||
03147 1:
|
||
03148 and dx,0x800fffff
|
||
03149 or dx,0x3fe00000 ! load -1 exponent
|
||
03150 mov cx,8(bx)
|
||
03151 mov bx,4(bx)
|
||
03152 mov (bx),ax
|
||
03153 mov 8(bx),dx
|
||
03154 mov 4(bx),cx
|
||
03155 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_fif4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03200 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
03201 .define .fif4
|
||
03202
|
||
03203 .sect .text
|
||
03204 .fif4:
|
||
03205 mov bx,sp
|
||
03206 flds 8(bx)
|
||
03207 fmuls 12(bx) ! multiply
|
||
03208 fld st ! copy result
|
||
03209 ftst ! test sign; handle negative separately
|
||
03210 fstsw ax
|
||
03211 wait
|
||
03212 sahf ! result of test in condition codes
|
||
03213 jb 1f
|
||
03214 frndint ! this one rounds (?)
|
||
03215 fcom st(1) ! compare with original; if <=, then OK
|
||
03216 fstsw ax
|
||
03217 wait
|
||
03218 sahf
|
||
03219 jbe 2f
|
||
03220 fisubs (one) ! else subtract 1
|
||
03221 jmp 2f
|
||
03222 1: ! here, negative case
|
||
03223 frndint ! this one rounds (?)
|
||
03224 fcom st(1) ! compare with original; if >=, then OK
|
||
03225 fstsw ax
|
||
03226 wait
|
||
03227 sahf
|
||
03228 jae 2f
|
||
03229 fiadds (one) ! else add 1
|
||
03230 2:
|
||
03231 fsub st(1),st ! subtract integer part
|
||
03232 mov bx,4(bx)
|
||
03233 fstps (bx)
|
||
03234 fstps 4(bx)
|
||
03235 wait
|
||
03236 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_fif8.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03300 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
03301 .define .fif8
|
||
03302
|
||
03303 .sect .text
|
||
03304 .fif8:
|
||
03305 mov bx,sp
|
||
03306 fldd 8(bx)
|
||
03307 fmuld 16(bx) ! multiply
|
||
03308 fld st ! and copy result
|
||
03309 ftst ! test sign; handle negative separately
|
||
03310 fstsw ax
|
||
03311 wait
|
||
03312 sahf ! result of test in condition codes
|
||
03313 jb 1f
|
||
03314 frndint ! this one rounds (?)
|
||
03315 fcom st(1) ! compare with original; if <=, then OK
|
||
03316 fstsw ax
|
||
03317 wait
|
||
03318 sahf
|
||
03319 jbe 2f
|
||
03320 fisubs (one) ! else subtract 1
|
||
03321 jmp 2f
|
||
03322 1: ! here, negative case
|
||
03323 frndint ! this one rounds (?)
|
||
03324 fcom st(1) ! compare with original; if >=, then OK
|
||
03325 fstsw ax
|
||
03326 wait
|
||
03327 sahf
|
||
03328 jae 2f
|
||
03329 fiadds (one) ! else add 1
|
||
03330 2:
|
||
03331 fsub st(1),st ! subtract integer part
|
||
03332 mov bx,4(bx)
|
||
03333 fstpd (bx)
|
||
03334 fstpd 8(bx)
|
||
03335 wait
|
||
03336 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_fp8087.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03400 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
03401 .define one, bigmin
|
||
03402
|
||
03403 .sect .rom
|
||
03404 one:
|
||
03405 .data2 1
|
||
03406 two:
|
||
03407 .data2 2
|
||
03408 bigmin:
|
||
03409 .data4 -2147483648
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_gto.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03500 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
03501 .sect .text
|
||
03502 .define .gto
|
||
03503
|
||
03504 .gto:
|
||
03505 mov ebp,8(ebx)
|
||
03506 mov esp,4(ebx)
|
||
03507 jmp (ebx)
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_iaar.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03600 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
03601 .sect .text
|
||
03602 .define .iaar
|
||
03603
|
||
03604 .iaar:
|
||
03605 pop ecx
|
||
03606 pop edx
|
||
03607 cmp edx,4
|
||
03608 .extern .unknown
|
||
03609 jne .unknown
|
||
03610 pop ebx ! descriptor address
|
||
03611 pop eax ! index
|
||
03612 sub eax,(ebx)
|
||
03613 mul 8(ebx)
|
||
03614 pop ebx ! array base
|
||
03615 add ebx,eax
|
||
03616 push ecx
|
||
03617 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_ilar.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03700 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
03701 .sect .text
|
||
03702 .define .ilar
|
||
03703
|
||
03704 .ilar:
|
||
03705 pop ecx
|
||
03706 pop edx
|
||
03707 .extern .unknown
|
||
03708 cmp edx,4
|
||
03709 jne .unknown
|
||
03710 pop ebx ! descriptor address
|
||
03711 pop eax ! index
|
||
03712 push ecx
|
||
03713 .extern .lar4
|
||
03714 jmp .lar4
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_inn.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03800 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
03801 .sect .text
|
||
03802 .define .inn
|
||
03803
|
||
03804 ! #bytes in ecx
|
||
03805 ! bit # in eax
|
||
03806 .inn:
|
||
03807 xor edx,edx
|
||
03808 mov ebx,8
|
||
03809 div ebx
|
||
03810 mov ebx,esp
|
||
03811 add ebx,4
|
||
03812 add ebx,eax
|
||
03813 cmp eax,ecx
|
||
03814 jae 1f
|
||
03815 movb al,(ebx)
|
||
03816 mov ebx,edx
|
||
03817 testb al,bits(ebx)
|
||
03818 jz 1f
|
||
03819 mov eax,1
|
||
03820 jmp 2f
|
||
03821 1:
|
||
03822 xor eax,eax
|
||
03823 2:
|
||
03824 pop ebx
|
||
03825 add esp,ecx
|
||
03826 ! eax is result
|
||
03827 jmp ebx
|
||
03828
|
||
03829 .sect .rom
|
||
03830 bits:
|
||
03831 .data1 1,2,4,8,16,32,64,128
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_ior.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
03900 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
03901 .sect .text
|
||
03902 .define .ior
|
||
03903
|
||
03904 ! #bytes in ecx
|
||
03905 .ior:
|
||
03906 pop ebx ! return address
|
||
03907 mov edx,edi
|
||
03908 mov edi,esp
|
||
03909 add edi,ecx
|
||
03910 sar ecx,2
|
||
03911 1:
|
||
03912 pop eax
|
||
03913 or eax,(edi)
|
||
03914 stos
|
||
03915 loop 1b
|
||
03916 mov edi,edx
|
||
03917 jmp ebx
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_isar.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04000 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
04001 .sect .text
|
||
04002 .define .isar
|
||
04003
|
||
04004 .isar:
|
||
04005 pop ecx
|
||
04006 pop eax
|
||
04007 cmp eax,4
|
||
04008 .extern .unknown
|
||
04009 jne .unknown
|
||
04010 pop ebx ! descriptor address
|
||
04011 pop eax ! index
|
||
04012 push ecx
|
||
04013 .extern .sar4
|
||
04014 jmp .sar4
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_lar4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04100 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
04101 .sect .text
|
||
04102 .define .lar4
|
||
04103
|
||
04104 .lar4:
|
||
04105 ! ebx, descriptor address
|
||
04106 ! eax, index
|
||
04107 sub eax,(ebx)
|
||
04108 mov ecx,8(ebx)
|
||
04109 imul ecx
|
||
04110 pop ebx
|
||
04111 pop edx ! base address
|
||
04112 add edx,eax
|
||
04113 sar ecx,1
|
||
04114 jnb 1f
|
||
04115 xor eax,eax
|
||
04116 movb al,(edx)
|
||
04117 push eax
|
||
04118 jmp ebx
|
||
04119 1:
|
||
04120 sar ecx,1
|
||
04121 jnb 1f
|
||
04122 xor eax,eax
|
||
04123 o16 mov ax,(edx)
|
||
04124 push eax
|
||
04125 jmp ebx
|
||
04126 1:
|
||
04127 xchg edx,esi ! saved esi
|
||
04128 mov eax,ecx
|
||
04129 sal eax,2
|
||
04130 sub esp,eax
|
||
04131 mov eax,edi ! save edi
|
||
04132 mov edi,esp
|
||
04133 rep movs
|
||
04134 mov edi,eax
|
||
04135 mov esi,edx
|
||
04136 jmp ebx
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_loi.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04200 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
04201 .sect .text
|
||
04202 .define .loi
|
||
04203 .define .los
|
||
04204
|
||
04205 ! #bytes in ecx
|
||
04206 ! address in ebx
|
||
04207 ! save esi/edi. they might be register variables
|
||
04208 .los:
|
||
04209 pop edx
|
||
04210 mov eax,ecx
|
||
04211 sar ecx,1
|
||
04212 jnb 1f
|
||
04213 movsxb eax,(ebx)
|
||
04214 push eax
|
||
04215 jmp edx
|
||
04216 1:
|
||
04217 sar ecx,1
|
||
04218 jnb 1f
|
||
04219 movsx eax,(ebx)
|
||
04220 push eax
|
||
04221 jmp edx
|
||
04222 1:
|
||
04223 push edx
|
||
04224 mov edx,esi
|
||
04225 mov esi,ebx
|
||
04226 pop ebx
|
||
04227 sub esp,eax
|
||
04228 jmp 1f
|
||
04229
|
||
04230 .loi:
|
||
04231 ! only called with size >= 4
|
||
04232 mov edx,esi
|
||
04233 mov esi,ebx
|
||
04234 pop ebx
|
||
04235 sub esp,ecx
|
||
04236 sar ecx,2
|
||
04237 1:
|
||
04238 mov eax,edi
|
||
04239 mov edi,esp
|
||
04240 rep movs
|
||
04241 mov esi,edx
|
||
04242 mov edi,eax
|
||
04243 jmp ebx
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_mlf4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04300 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
04301 .define .mlf4
|
||
04302
|
||
04303 .sect .text
|
||
04304 .mlf4:
|
||
04305 mov bx,sp
|
||
04306 flds 4(bx)
|
||
04307 fmuls 8(bx)
|
||
04308 fstps 8(bx)
|
||
04309 wait
|
||
04310 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_mlf8.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04400 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
04401 .define .mlf8
|
||
04402
|
||
04403 .sect .text
|
||
04404 .mlf8:
|
||
04405 mov bx,sp
|
||
04406 fldd 4(bx)
|
||
04407 fmuld 12(bx)
|
||
04408 fstpd 12(bx)
|
||
04409 wait
|
||
04410 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_mli.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04500 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
04501 .sect .text
|
||
04502 .define .mli
|
||
04503
|
||
04504 ! #bytes in eax
|
||
04505 .mli:
|
||
04506 pop ebx ! return address
|
||
04507 cmp eax,4
|
||
04508 jne 1f
|
||
04509 pop eax
|
||
04510 pop ecx
|
||
04511 mul ecx
|
||
04512 push eax
|
||
04513 jmp ebx
|
||
04514 1:
|
||
04515 .extern EODDZ
|
||
04516 .extern .trp
|
||
04517 mov eax,EODDZ
|
||
04518 push ebx
|
||
04519 jmp .trp
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_mon.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04600 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
04601 .sect .text
|
||
04602 .define .mon
|
||
04603
|
||
04604 .mon:
|
||
04605 .extern .stop
|
||
04606 call .stop
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_ngf4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04700 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
04701 .define .ngf4
|
||
04702
|
||
04703 .sect .text
|
||
04704 .ngf4:
|
||
04705 mov bx,sp
|
||
04706 flds 4(bx)
|
||
04707 fchs
|
||
04708 fstps 4(bx)
|
||
04709 wait
|
||
04710 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_ngf8.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04800 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
04801 .define .ngf8
|
||
04802
|
||
04803 .sect .text
|
||
04804 .ngf8:
|
||
04805 mov bx,sp
|
||
04806 fldd 4(bx)
|
||
04807 fchs
|
||
04808 fstpd 4(bx)
|
||
04809 wait
|
||
04810 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_ngi.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
04900 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
04901 .sect .text
|
||
04902 .define .ngi
|
||
04903
|
||
04904 ! #bytes in eax
|
||
04905 .ngi:
|
||
04906 pop ebx ! return address
|
||
04907 cmp eax,4
|
||
04908 jne 1f
|
||
04909 pop ecx
|
||
04910 neg ecx
|
||
04911 push ecx
|
||
04912 jmp ebx
|
||
04913 1:
|
||
04914 .extern EODDZ
|
||
04915 .extern .trp
|
||
04916 mov eax,EODDZ
|
||
04917 push ebx
|
||
04918 jmp .trp
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_nop.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05000 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
05001 .sect .text
|
||
05002 .define .nop
|
||
05003 .extern printd, printc, hol0
|
||
05004
|
||
05005 .nop:
|
||
05006 mov eax,(hol0)
|
||
05007 call printd
|
||
05008 movb al,'\n'
|
||
05009 jmp printc
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_print.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05100 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
05101 .sect .text
|
||
05102 .define printc,printd,prints
|
||
05103
|
||
05104 ! argument in eax
|
||
05105 ! uses ebx
|
||
05106 prints:
|
||
05107 xchg eax,ebx
|
||
05108 1:
|
||
05109 movb al,(ebx)
|
||
05110 inc ebx
|
||
05111 testb al,al
|
||
05112 jz 2f
|
||
05113 call printc
|
||
05114 jmp 1b
|
||
05115 2:
|
||
05116 ret
|
||
05117
|
||
05118 ! argument in eax
|
||
05119 ! uses ecx and edx
|
||
05120 printd:
|
||
05121 xor edx,edx
|
||
05122 mov ecx,10
|
||
05123 div ecx
|
||
05124 test eax,eax
|
||
05125 jz 1f
|
||
05126 push edx
|
||
05127 call printd
|
||
05128 pop edx
|
||
05129 1:
|
||
05130 xchg eax,edx
|
||
05131 addb al,'0'
|
||
05132
|
||
05133 ! argument in eax
|
||
05134 printc:
|
||
05135 push eax
|
||
05136 mov ebx,esp
|
||
05137 mov eax,1
|
||
05138 push eax
|
||
05139 push ebx
|
||
05140 push eax
|
||
05141 call __write
|
||
05142 pop ebx
|
||
05143 pop ebx
|
||
05144 pop ebx
|
||
05145 pop ebx
|
||
05146 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_rck.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05200 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
05201 .sect .text
|
||
05202 .define .rck
|
||
05203
|
||
05204 ! descriptor address in ebx
|
||
05205 ! value in eax, must be left there
|
||
05206 .rck:
|
||
05207 cmp eax,(ebx)
|
||
05208 jl 2f
|
||
05209 cmp eax,4(ebx)
|
||
05210 jg 2f
|
||
05211 ret
|
||
05212 2:
|
||
05213 push eax
|
||
05214 .extern ERANGE
|
||
05215 .extern .error
|
||
05216 mov eax,ERANGE
|
||
05217 call .error
|
||
05218 pop eax
|
||
05219 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_rmi.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05300 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
05301 .sect .text
|
||
05302 .define .rmi
|
||
05303
|
||
05304 ! #bytes in eax
|
||
05305 .rmi:
|
||
05306 pop ebx ! return address
|
||
05307 cmp eax,4
|
||
05308 jne 1f
|
||
05309 pop eax
|
||
05310 cwd
|
||
05311 pop ecx
|
||
05312 idiv ecx
|
||
05313 push edx
|
||
05314 jmp ebx
|
||
05315 1:
|
||
05316 .extern EODDZ
|
||
05317 .extern .trp
|
||
05318 mov eax,EODDZ
|
||
05319 push ebx
|
||
05320 jmp .trp
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_rmu.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05400 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
05401 .sect .text
|
||
05402 .define .rmu
|
||
05403
|
||
05404 ! #bytes in eax
|
||
05405 .rmu:
|
||
05406 pop ebx ! return address
|
||
05407 cmp eax,4
|
||
05408 jne 1f
|
||
05409 pop eax
|
||
05410 xor edx,edx
|
||
05411 pop ecx
|
||
05412 idiv ecx
|
||
05413 push edx
|
||
05414 jmp ebx
|
||
05415 1:
|
||
05416 .extern EODDZ
|
||
05417 .extern .trp
|
||
05418 mov eax,EODDZ
|
||
05419 push ebx
|
||
05420 jmp .trp
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_rol.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05500 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
05501 .sect .text
|
||
05502 .define .rol
|
||
05503
|
||
05504 ! #bytes in eax
|
||
05505 .rol:
|
||
05506 pop edx ! return address
|
||
05507 cmp eax,4
|
||
05508 jne 1f
|
||
05509 pop eax
|
||
05510 pop ecx
|
||
05511 rol eax,cl
|
||
05512 push eax
|
||
05513 jmp edx
|
||
05514 1:
|
||
05515 .extern EODDZ
|
||
05516 .extern .trp
|
||
05517 mov eax,EODDZ
|
||
05518 push edx
|
||
05519 jmp .trp
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_ror.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05600 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
05601 .sect .text
|
||
05602 .define .ror
|
||
05603
|
||
05604 ! #bytes in eax
|
||
05605 .ror:
|
||
05606 pop edx ! return address
|
||
05607 cmp eax,4
|
||
05608 jne 1f
|
||
05609 pop eax
|
||
05610 pop ecx
|
||
05611 ror eax,cl
|
||
05612 push eax
|
||
05613 jmp edx
|
||
05614 1:
|
||
05615 .extern EODDZ
|
||
05616 .extern .trp
|
||
05617 mov eax,EODDZ
|
||
05618 push edx
|
||
05619 jmp .trp
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_sar4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05700 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
05701 .sect .text
|
||
05702 .define .sar4
|
||
05703
|
||
05704 .sar4:
|
||
05705 ! ebx, descriptor address
|
||
05706 ! eax, index
|
||
05707 sub eax,(ebx)
|
||
05708 mov ecx,8(ebx)
|
||
05709 imul ecx
|
||
05710 pop ebx
|
||
05711 pop edx ! base address
|
||
05712 add edx,eax
|
||
05713 sar ecx,1
|
||
05714 jnb 1f
|
||
05715 pop eax
|
||
05716 movb (edx),al
|
||
05717 jmp ebx
|
||
05718 1:
|
||
05719 sar ecx,1
|
||
05720 jnb 1f
|
||
05721 pop eax
|
||
05722 o16 mov (edx),ax
|
||
05723 jmp ebx
|
||
05724 1:
|
||
05725 xchg edi,edx ! edi = base address, edx is saved edi
|
||
05726 mov eax,esi
|
||
05727 mov esi,esp
|
||
05728 rep movs
|
||
05729 mov esp,esi
|
||
05730 mov esi,eax
|
||
05731 mov edi,edx
|
||
05732 jmp ebx
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_sbf4.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05800 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
05801 .define .sbf4
|
||
05802
|
||
05803 .sect .text
|
||
05804 .sbf4:
|
||
05805 mov bx,sp
|
||
05806 flds 8(bx)
|
||
05807 fsubs 4(bx)
|
||
05808 fstps 8(bx)
|
||
05809 wait
|
||
05810 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_sbf8.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
05900 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
05901 .define .sbf8
|
||
05902
|
||
05903 .sect .text
|
||
05904 .sbf8:
|
||
05905 mov bx,sp
|
||
05906 fldd 12(bx)
|
||
05907 fsubd 4(bx)
|
||
05908 fstpd 12(bx)
|
||
05909 wait
|
||
05910 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_sbi.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06000 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
06001 .sect .text
|
||
06002 .define .sbi
|
||
06003
|
||
06004 ! #bytes in ecx , top of stack in eax
|
||
06005 .sbi:
|
||
06006 pop ebx ! return subress
|
||
06007 cmp ecx,4
|
||
06008 jne 1f
|
||
06009 pop ecx
|
||
06010 sub eax,ecx
|
||
06011 neg eax
|
||
06012 jmp ebx
|
||
06013 1:
|
||
06014 .extern EODDZ
|
||
06015 .extern .trp
|
||
06016 mov eax,EODDZ
|
||
06017 push ebx
|
||
06018 jmp .trp
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_set.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06100 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
06101 .sect .text
|
||
06102 .define .set
|
||
06103
|
||
06104 ! #bytes in ecx
|
||
06105 ! bit # in eax
|
||
06106 .set:
|
||
06107 pop ebx ! return address
|
||
06108 xor edx,edx
|
||
06109 !ifdef create set
|
||
06110 sub esp,ecx
|
||
06111 push ebx
|
||
06112 push edi
|
||
06113 mov ebx,esp
|
||
06114 xor edi,edi
|
||
06115 sar ecx,2
|
||
06116 1:
|
||
06117 mov 8(ebx)(edi),edx
|
||
06118 add edi,4
|
||
06119 loop 1b
|
||
06120 !endif
|
||
06121 mov ebx,8
|
||
06122 div ebx
|
||
06123 cmp eax,edi
|
||
06124 jae 2f
|
||
06125 mov edi,edx
|
||
06126 movb dl,bits(edi)
|
||
06127 mov edi,esp
|
||
06128 add edi,eax
|
||
06129 orb 8(edi),dl
|
||
06130 pop edi
|
||
06131 ret
|
||
06132 2:
|
||
06133 .extern ESET
|
||
06134 .extern .trp
|
||
06135 pop edi
|
||
06136 mov eax,ESET
|
||
06137 jmp .trp
|
||
06138
|
||
06139 .sect .rom
|
||
06140 bits:
|
||
06141 .data1 1,2,4,8,16,32,64,128
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_sli.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06200 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
06201 .sect .text
|
||
06202 .define .sli
|
||
06203
|
||
06204 ! #bytes in eax
|
||
06205 .sli:
|
||
06206 pop edx ! return address
|
||
06207 cmp eax,4
|
||
06208 jne 1f
|
||
06209 pop eax
|
||
06210 pop ecx
|
||
06211 sal eax,cl
|
||
06212 push eax
|
||
06213 jmp edx
|
||
06214 1:
|
||
06215 .extern EODDZ
|
||
06216 .extern .trp
|
||
06217 mov eax,EODDZ
|
||
06218 push edx
|
||
06219 jmp .trp
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_sri.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06300 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
06301 .sect .text
|
||
06302 .define .sri
|
||
06303
|
||
06304 ! #bytes in eax
|
||
06305 .sri:
|
||
06306 pop edx ! return address
|
||
06307 cmp eax,4
|
||
06308 jne 1f
|
||
06309 pop eax
|
||
06310 pop ecx
|
||
06311 sar eax,cl
|
||
06312 push eax
|
||
06313 jmp edx
|
||
06314 1:
|
||
06315 .extern EODDZ
|
||
06316 .extern .trp
|
||
06317 mov eax,EODDZ
|
||
06318 push edx
|
||
06319 jmp .trp
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_sti.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06400 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
06401 .sect .text
|
||
06402 .define .sti
|
||
06403 .define .sts
|
||
06404
|
||
06405 ! #bytes in ecx
|
||
06406 ! address in ebx
|
||
06407 ! save edi/esi. they might be register variables
|
||
06408 .sts:
|
||
06409 pop edx
|
||
06410 sar ecx,1
|
||
06411 jnb 1f
|
||
06412 pop eax
|
||
06413 movb (ebx),al
|
||
06414 jmp edx
|
||
06415 1:
|
||
06416 sar ecx,1
|
||
06417 jnb 1f
|
||
06418 pop eax
|
||
06419 o16 mov (ebx),ax
|
||
06420 jmp edx
|
||
06421 1:
|
||
06422 push edx
|
||
06423 mov edx,edi
|
||
06424 mov edi,ebx
|
||
06425 pop ebx
|
||
06426 jmp 1f
|
||
06427 .sti:
|
||
06428 ! only called with count >> 4
|
||
06429 mov edx,edi
|
||
06430 mov edi,ebx
|
||
06431 pop ebx
|
||
06432 sar ecx,2
|
||
06433 1:
|
||
06434 mov eax,esi
|
||
06435 mov esi,esp
|
||
06436 rep movs
|
||
06437 mov esp,esi
|
||
06438 mov edi,edx
|
||
06439 mov esi,eax
|
||
06440 jmp ebx
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_stop.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06500 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
06501 .sect .text
|
||
06502 .define .stop
|
||
06503 .stop:
|
||
06504 jmp ___exit
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_strhp.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06600 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
06601 .sect .text
|
||
06602 .define .strhp
|
||
06603 .extern .reghp, .limhp, EHEAP, .trp
|
||
06604
|
||
06605 .strhp:
|
||
06606 pop ebx
|
||
06607 pop eax
|
||
06608 mov (.reghp),eax
|
||
06609 cmp eax,(.limhp)
|
||
06610 jb 1f
|
||
06611 add eax,02000
|
||
06612 and eax,~0777
|
||
06613 push ebx
|
||
06614 push eax
|
||
06615 call __brk
|
||
06616 pop ecx
|
||
06617 pop ebx
|
||
06618 cmp eax,-1
|
||
06619 je 2f
|
||
06620 1:
|
||
06621 mov (.limhp),ecx
|
||
06622 jmp ebx
|
||
06623 2:
|
||
06624 mov eax,EHEAP
|
||
06625 push ebx
|
||
06626 jmp .trp
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_trp.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06700 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
06701 .sect .text
|
||
06702 .define .trp
|
||
06703 .extern .trppc, .stop
|
||
06704
|
||
06705 ! eax is trap number
|
||
06706 .trp:
|
||
06707 xor ebx,ebx
|
||
06708 xchg ebx,(.trppc)
|
||
06709 test ebx,ebx
|
||
06710 jz 2f
|
||
06711 push eax
|
||
06712 call ebx
|
||
06713 pop eax
|
||
06714 ret
|
||
06715 2:
|
||
06716 push eax
|
||
06717 call .stop
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_unknown.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06800 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
06801 .sect .text
|
||
06802 .define .unknown
|
||
06803 .extern EILLINS, .fat
|
||
06804
|
||
06805 .unknown:
|
||
06806 mov eax,EILLINS
|
||
06807 push eax
|
||
06808 jmp .fat
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/em/em_xor.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
06900 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
06901 .sect .text
|
||
06902 .define .xor
|
||
06903
|
||
06904 ! #bytes in ecx
|
||
06905 .xor:
|
||
06906 pop ebx ! return address
|
||
06907 mov edx,edi
|
||
06908 mov edi,esp
|
||
06909 add edi,ecx
|
||
06910 sar ecx,2
|
||
06911 1:
|
||
06912 pop eax
|
||
06913 xor eax,(edi)
|
||
06914 stos
|
||
06915 loop 1b
|
||
06916 mov edi,edx
|
||
06917 jmp ebx
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/head/em_abs.h
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07000 /* $Header: em_abs.h,v 1.3 87/03/10 08:58:45 ceriel Exp $ */
|
||
07001 /*
|
||
07002 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||
07003 * See the copyright notice in the ACK home directory, in the file "Copyright".
|
||
07004 */
|
||
07005 #define LINO_AD 0
|
||
07006 #define FILN_AD 4
|
||
07007
|
||
07008 #define LINO (*(int *)(_hol0()+LINO_AD))
|
||
07009 #define FILN (*(char **)(_hol0()+FILN_AD))
|
||
07010
|
||
07011 #define EARRAY 0
|
||
07012 #define ERANGE 1
|
||
07013 #define ESET 2
|
||
07014 #define EIOVFL 3
|
||
07015 #define EFOVFL 4
|
||
07016 #define EFUNFL 5
|
||
07017 #define EIDIVZ 6
|
||
07018 #define EFDIVZ 7
|
||
07019 #define EIUND 8
|
||
07020 #define EFUND 9
|
||
07021 #define ECONV 10
|
||
07022
|
||
07023 #define ESTACK 16
|
||
07024 #define EHEAP 17
|
||
07025 #define EILLINS 18
|
||
07026 #define EODDZ 19
|
||
07027 #define ECASE 20
|
||
07028 #define EMEMFLT 21
|
||
07029 #define EBADPTR 22
|
||
07030 #define EBADPC 23
|
||
07031 #define EBADLAE 24
|
||
07032 #define EBADMON 25
|
||
07033 #define EBADLIN 26
|
||
07034 #define EBADGTO 27
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/head/em_head.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07100 #
|
||
07101 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07102 .define ERANGE,ESET,EHEAP,ECASE,EILLINS,EIDIVZ,EODDZ
|
||
07103 .define .trppc, .ignmask
|
||
07104
|
||
07105 ERANGE = 1
|
||
07106 ESET = 2
|
||
07107 EIDIVZ = 6
|
||
07108 EHEAP = 17
|
||
07109 EILLINS = 18
|
||
07110 EODDZ = 19
|
||
07111 ECASE = 20
|
||
07112
|
||
07113 #include <em_abs.h>
|
||
07114
|
||
07115 .sect .data
|
||
07116 .trppc:
|
||
07117 .data4 0
|
||
07118 .ignmask:
|
||
07119 .data4 EIOVFL | EIUND | ECONV | EFOVFL | EFUNFL
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/misc/alloca.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07200 #
|
||
07201 ! alloca() - allocate space on the stack Author: Kees J. Bot
|
||
07202 ! 2 Dec 1993
|
||
07203 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07204
|
||
07205 .sect .text
|
||
07206 .align 16
|
||
07207 .define _alloca
|
||
07208 _alloca:
|
||
07209 #if __ACK__
|
||
07210 pop ecx ! Return address
|
||
07211 pop eax ! Bytes to allocate
|
||
07212 add eax, 2*4+3 ! Add space for two saved register variables
|
||
07213 andb al, 0xFC ! Align
|
||
07214 mov ebx, esp ! Keep current esp
|
||
07215 sub esp, eax ! Lower stack
|
||
07216 mov eax, esp ! Return value
|
||
07217 push 4(ebx) ! Push what is probably the saved esi
|
||
07218 push (ebx) ! Saved edi
|
||
07219 ! Now ACK can still do:
|
||
07220 ! pop edi; pop esi; leave; ret
|
||
07221 push eax ! Dummy argument
|
||
07222 jmp ecx
|
||
07223 #else
|
||
07224 pop ecx ! Return address
|
||
07225 pop eax ! Bytes to allocate
|
||
07226 add eax, 3
|
||
07227 andb al, 0xFC ! Align
|
||
07228 sub esp, eax ! Lower stack
|
||
07229 mov eax, esp ! Return value
|
||
07230 push eax ! Dummy argument
|
||
07231 jmp ecx
|
||
07232 #endif
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/misc/getprocessor.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07300 ! getprocessor() - determine processor type Author: Kees J. Bot
|
||
07301 ! 26 Jan 1994
|
||
07302
|
||
07303 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07304 .sect .text
|
||
07305
|
||
07306 ! int getprocessor(void);
|
||
07307 ! Return 386, 486, 586, ...
|
||
07308
|
||
07309 .define _getprocessor
|
||
07310
|
||
07311 _getprocessor:
|
||
07312 push ebp
|
||
07313 mov ebp, esp
|
||
07314 and esp, 0xFFFFFFFC ! Align stack to avoid AC fault
|
||
07315 mov ecx, 0x00040000 ! Try to flip the AC bit introduced on the 486
|
||
07316 call flip
|
||
07317 mov eax, 386 ! 386 if it didn't react to "flipping"
|
||
07318 jz gotprocessor
|
||
07319 mov ecx, 0x00200000 ! Try to flip the ID bit introduced on the 586
|
||
07320 call flip
|
||
07321 mov eax, 486 ! 486 if it didn't react
|
||
07322 jz gotprocessor
|
||
07323 pushf
|
||
07324 pusha ! Save the world
|
||
07325 mov eax, 1
|
||
07326 .data1 0x0F, 0xA2 ! CPUID instruction tells the processor type
|
||
07327 andb ah, 0x0F ! Extract the family (5, 6, ...)
|
||
07328 movzxb eax, ah
|
||
07329 imul eax, 100 ! 500, 600, ...
|
||
07330 add eax, 86 ! 586, 686, ...
|
||
07331 mov 7*4(esp), eax ! Pass eax through
|
||
07332 popa
|
||
07333 popf
|
||
07334 gotprocessor:
|
||
07335 leave
|
||
07336 ret
|
||
07337
|
||
07338 flip:
|
||
07339 pushf ! Push eflags
|
||
07340 pop eax ! eax = eflags
|
||
07341 mov edx, eax ! Save original eflags
|
||
07342 xor eax, ecx ! Flip the bit to test
|
||
07343 push eax ! Push modified eflags value
|
||
07344 popf ! Load modified eflags register
|
||
07345 pushf
|
||
07346 pop eax ! Get it again
|
||
07347 push edx
|
||
07348 popf ! Restore original eflags register
|
||
07349 xor eax, edx ! See if the bit changed
|
||
07350 test eax, ecx
|
||
07351 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/misc/iolib.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07400 ! Some I/O related routines like:
|
||
07401 ! unsigned char inb(int port);
|
||
07402 ! unsigned short inw(int port);
|
||
07403 ! void outb(int port, int value);
|
||
07404 ! void outw(int port, int value);
|
||
07405 ! void rep_inb(int port, unsigned char *buf, size_t count);
|
||
07406 ! void rep_inw(int port, unsigned short *buf, size_t count);
|
||
07407 ! void rep_outb(int port, unsigned char *buf, size_t count);
|
||
07408 ! void rep_outw(int port, unsigned short *buf, size_t count);
|
||
07409 ! void intr_enable(void);
|
||
07410 ! void intr_disable(void);
|
||
07411
|
||
07412 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07413
|
||
07414 .sect .text
|
||
07415 .define _inb
|
||
07416 _inb:
|
||
07417 push ebp
|
||
07418 mov ebp, esp
|
||
07419 mov edx, 8(ebp) ! port
|
||
07420 xor eax, eax
|
||
07421 inb dx ! read 1 byte
|
||
07422 pop ebp
|
||
07423 ret
|
||
07424
|
||
07425 .define _inw
|
||
07426 _inw:
|
||
07427 push ebp
|
||
07428 mov ebp, esp
|
||
07429 mov edx, 8(ebp) ! port
|
||
07430 xor eax, eax
|
||
07431 o16 in dx ! read 1 word
|
||
07432 pop ebp
|
||
07433 ret
|
||
07434
|
||
07435 .define _outb
|
||
07436 _outb:
|
||
07437 push ebp
|
||
07438 mov ebp, esp
|
||
07439 mov edx, 8(ebp) ! port
|
||
07440 mov eax, 8+4(ebp) ! value
|
||
07441 outb dx ! output 1 byte
|
||
07442 pop ebp
|
||
07443 ret
|
||
07444
|
||
07445 .define _outw
|
||
07446 _outw:
|
||
07447 push ebp
|
||
07448 mov ebp, esp
|
||
07449 mov edx, 8(ebp) ! port
|
||
07450 mov eax, 8+4(ebp) ! value
|
||
07451 o16 out dx ! output 1 word
|
||
07452 pop ebp
|
||
07453 ret
|
||
07454
|
||
07455 .define _rep_inb
|
||
07456 _rep_inb:
|
||
07457 push ebp
|
||
07458 mov ebp, esp
|
||
07459 push edi
|
||
07460 mov edx, 8(ebp) ! port
|
||
07461 mov edi, 12(ebp) ! buf
|
||
07462 mov ecx, 16(ebp) ! byte count
|
||
07463 rep
|
||
07464 inb dx ! input many bytes
|
||
07465 pop edi
|
||
07466 pop ebp
|
||
07467 ret
|
||
07468
|
||
07469 .define _rep_inw
|
||
07470 _rep_inw:
|
||
07471 push ebp
|
||
07472 mov ebp, esp
|
||
07473 push edi
|
||
07474 mov edx, 8(ebp) ! port
|
||
07475 mov edi, 12(ebp) ! buf
|
||
07476 mov ecx, 16(ebp) ! byte count
|
||
07477 shr ecx, 1 ! word count
|
||
07478 rep
|
||
07479 o16 in dx ! input many words
|
||
07480 pop edi
|
||
07481 pop ebp
|
||
07482 ret
|
||
07483
|
||
07484 .define _rep_outb
|
||
07485 _rep_outb:
|
||
07486 push ebp
|
||
07487 mov ebp, esp
|
||
07488 push esi
|
||
07489 mov edx, 8(ebp) ! port
|
||
07490 mov esi, 12(ebp) ! buf
|
||
07491 mov ecx, 16(ebp) ! byte count
|
||
07492 rep
|
||
07493 outb dx ! output many bytes
|
||
07494 pop esi
|
||
07495 pop ebp
|
||
07496 ret
|
||
07497
|
||
07498 .define _rep_outw
|
||
07499 _rep_outw:
|
||
07500 push ebp
|
||
07501 mov ebp, esp
|
||
07502 push esi
|
||
07503 mov edx, 8(ebp) ! port
|
||
07504 mov esi, 12(ebp) ! buf
|
||
07505 mov ecx, 16(ebp) ! byte count
|
||
07506 shr ecx, 1 ! word count
|
||
07507 rep
|
||
07508 o16 out dx ! output many words
|
||
07509 pop esi
|
||
07510 pop ebp
|
||
07511 ret
|
||
07512
|
||
07513 .define _intr_disable
|
||
07514 _intr_disable:
|
||
07515 push ebp
|
||
07516 mov ebp, esp
|
||
07517 cli
|
||
07518 pop ebp
|
||
07519 ret
|
||
07520
|
||
07521 .define _intr_enable
|
||
07522 _intr_enable:
|
||
07523 push ebp
|
||
07524 mov ebp, esp
|
||
07525 sti
|
||
07526 pop ebp
|
||
07527 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/rts/__sigreturn.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07600 ! This routine is the low-level code for returning from signals.
|
||
07601 ! It calls __sigreturn, which is the normal "system call" routine.
|
||
07602 ! Both ___sigreturn and __sigreturn are needed.
|
||
07603 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07604 .sect .text
|
||
07605 .define ___sigreturn
|
||
07606 .extern __sigreturn
|
||
07607 ___sigreturn:
|
||
07608 add esp, 16
|
||
07609 jmp __sigreturn
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/rts/_sendrec.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07700 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07701 .define __send, __receive, __sendrec
|
||
07702
|
||
07703 ! See ../h/com.h for C definitions
|
||
07704 SEND = 1
|
||
07705 RECEIVE = 2
|
||
07706 BOTH = 3
|
||
07707 SYSVEC = 33
|
||
07708
|
||
07709 SRCDEST = 8
|
||
07710 MESSAGE = 12
|
||
07711
|
||
07712 !*========================================================================*
|
||
07713 ! _send and _receive *
|
||
07714 !*========================================================================*
|
||
07715 ! _send(), _receive(), _sendrec() all save ebp, but destroy eax and ecx.
|
||
07716 .define __send, __receive, __sendrec
|
||
07717 .sect .text
|
||
07718 __send:
|
||
07719 push ebp
|
||
07720 mov ebp, esp
|
||
07721 push ebx
|
||
07722 mov eax, SRCDEST(ebp) ! eax = dest-src
|
||
07723 mov ebx, MESSAGE(ebp) ! ebx = message pointer
|
||
07724 mov ecx, SEND ! _send(dest, ptr)
|
||
07725 int SYSVEC ! trap to the kernel
|
||
07726 pop ebx
|
||
07727 pop ebp
|
||
07728 ret
|
||
07729
|
||
07730 __receive:
|
||
07731 push ebp
|
||
07732 mov ebp, esp
|
||
07733 push ebx
|
||
07734 mov eax, SRCDEST(ebp) ! eax = dest-src
|
||
07735 mov ebx, MESSAGE(ebp) ! ebx = message pointer
|
||
07736 mov ecx, RECEIVE ! _receive(src, ptr)
|
||
07737 int SYSVEC ! trap to the kernel
|
||
07738 pop ebx
|
||
07739 pop ebp
|
||
07740 ret
|
||
07741
|
||
07742 __sendrec:
|
||
07743 push ebp
|
||
07744 mov ebp, esp
|
||
07745 push ebx
|
||
07746 mov eax, SRCDEST(ebp) ! eax = dest-src
|
||
07747 mov ebx, MESSAGE(ebp) ! ebx = message pointer
|
||
07748 mov ecx, BOTH ! _sendrec(srcdest, ptr)
|
||
07749 int SYSVEC ! trap to the kernel
|
||
07750 pop ebx
|
||
07751 pop ebp
|
||
07752 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/rts/brksize.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07800 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07801 .define __brksize
|
||
07802 .sect .data
|
||
07803 .extern endbss, __brksize
|
||
07804 __brksize: .data4 endbss
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/rts/crtso.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
07900 ! This is the C run-time start-off routine. It's job is to take the
|
||
07901 ! arguments as put on the stack by EXEC, and to parse them and set them up the
|
||
07902 ! way _main expects them.
|
||
07903 ! It also initializes _environ when this variable isn't defined by the
|
||
07904 ! programmer. The detection of whether _environ belong to us is rather
|
||
07905 ! simplistic. We simply check for some magic value, but there is no other
|
||
07906 ! way.
|
||
07907
|
||
07908 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
07909
|
||
07910 .define begtext, begdata, begbss
|
||
07911 .sect .text
|
||
07912 begtext:
|
||
07913 .sect .rom
|
||
07914 begrom:
|
||
07915 .sect .data
|
||
07916 begdata:
|
||
07917 .sect .bss
|
||
07918 begbss:
|
||
07919
|
||
07920 .define crtso, ___main, __penvp, __fpu_present
|
||
07921 .extern _main, _exit
|
||
07922 .sect .text
|
||
07923 crtso:
|
||
07924 xor ebp, ebp ! clear for backtrace of core files
|
||
07925 mov eax, (esp) ! argc
|
||
07926 lea edx, 4(esp) ! argv
|
||
07927 lea ecx, 8(esp)(eax*4) ! envp
|
||
07928
|
||
07929 mov (__penvp), ecx ! save envp in __envp
|
||
07930
|
||
07931 ! Test whether address of environ < address of end.
|
||
07932 ! This is done for separate I&D systems.
|
||
07933 mov ebx, _environ
|
||
07934 cmp ebx, __end
|
||
07935 jae 0f
|
||
07936 cmp (_environ), 0x53535353 ! is it our _environ?
|
||
07937 jne 0f
|
||
07938 mov (_environ), ecx
|
||
07939 0:
|
||
07940 push ecx ! push environ
|
||
07941 push edx ! push argv
|
||
07942 push eax ! push argc
|
||
07943
|
||
07944 ! Test the EM bit of the MSW to determine if an FPU is present and
|
||
07945 ! set __fpu_present if one is found.
|
||
07946 smsw ax
|
||
07947 testb al, 0x4 ! EM bit in MSW
|
||
07948 setz al ! True if not set
|
||
07949 movb (__fpu_present), al
|
||
07950
|
||
07951 call _main ! main(argc, argv, envp)
|
||
07952
|
||
07953 push eax ! push exit status
|
||
07954 call _exit
|
||
07955
|
||
07956 hlt ! force a trap if exit fails
|
||
07957
|
||
07958 ___main: ! for GCC
|
||
07959 ret
|
||
07960
|
||
07961 .sect .rom
|
||
07962 .data4 0 ! Common I&D: *NULL == 0
|
||
07963 .sect .bss
|
||
07964 .comm __penvp, 4 ! Environment vector
|
||
07965 .comm __fpu_present, 4 ! FPU present flag
|
||
07966
|
||
07967 .extern endtext ! Force loading of end labels.
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/rts/setjmp.e
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08000 #
|
||
08001 mes 2,_EM_WSIZE,_EM_PSIZE
|
||
08002 ;
|
||
08003 ; layout of a setjmp buffer:
|
||
08004 ;
|
||
08005 ; -----------------
|
||
08006 ; | flag | (!0 when blocked signals saved (POSIX))
|
||
08007 ; -----------------
|
||
08008 ; | signal mask/set | (for Berkeley 4.[2-] / POSIX)
|
||
08009 ; -----------------
|
||
08010 ; | |
|
||
08011 ; | GTO descriptor |
|
||
08012 ; | (SP, LB, PC) |
|
||
08013 ; | |
|
||
08014 ; -----------------
|
||
08015 ;
|
||
08016 ; setjmp saves the signalmask, PC, SP, and LB of caller, and creates a
|
||
08017 ; GTO descriptor from this.
|
||
08018 ; The big problem here is how to get the return address, i.e. the PC of
|
||
08019 ; the caller; This problem is solved by the front-end, which must pass
|
||
08020 ; it as an extra parameter to setjmp.
|
||
08021
|
||
08022 ; a GTO descriptor must be in the global data area
|
||
08023 gtobuf
|
||
08024 bss 3*_EM_PSIZE,0,0
|
||
08025
|
||
08026 inp $fill_ret_area
|
||
08027 exp $__setjmp
|
||
08028 pro $__setjmp,0
|
||
08029 #if defined(_POSIX_SOURCE)
|
||
08030 ; save mask of currently blocked signals.
|
||
08031 ; longjmp must restore this mask
|
||
08032 lol _EM_PSIZE ; the flag integer at offset _EM_PSIZE
|
||
08033 lal 0
|
||
08034 loi _EM_PSIZE
|
||
08035 stf 3*_EM_PSIZE+_EM_LSIZE
|
||
08036 lol _EM_PSIZE ; the flag integer at offset _EM_PSIZE
|
||
08037 zeq *1
|
||
08038 lal 0
|
||
08039 loi _EM_PSIZE
|
||
08040 adp 3*_EM_PSIZE
|
||
08041 cal $__newsigset
|
||
08042 asp _EM_PSIZE
|
||
08043 1
|
||
08044 #elif defined(__BSD4_2)
|
||
08045 loc 0
|
||
08046 cal $sigblock
|
||
08047 asp _EM_WSIZE
|
||
08048 lfr _EM_WSIZE
|
||
08049 lal 0
|
||
08050 loi _EM_PSIZE
|
||
08051 stf 3*_EM_PSIZE
|
||
08052 #endif
|
||
08053 ; create GTO descriptor for longjmp
|
||
08054 lxl 0
|
||
08055 dch ; Local Base of caller
|
||
08056 lxa 0 ; Stackpointer of caller
|
||
08057 lal _EM_PSIZE+_EM_WSIZE
|
||
08058 loi _EM_PSIZE ; Return address of caller
|
||
08059 lal 0
|
||
08060 loi _EM_PSIZE ; address of jmpbuf
|
||
08061 sti 3*_EM_PSIZE ; LB, SP, and PC stored in jmpbuf
|
||
08062 loc 0
|
||
08063 ret _EM_WSIZE ; setjmp must return 0
|
||
08064 end 0
|
||
08065
|
||
08066 pro $fill_ret_area,0
|
||
08067 ; put argument in function result area
|
||
08068 lol 0
|
||
08069 ret _EM_WSIZE
|
||
08070 end 0
|
||
08071
|
||
08072 exp $longjmp
|
||
08073 pro $longjmp,?
|
||
08074 #if defined(_POSIX_SOURCE)
|
||
08075 ; restore blocked mask
|
||
08076 lal 0
|
||
08077 loi _EM_PSIZE
|
||
08078 lof 3*_EM_PSIZE+_EM_LSIZE
|
||
08079 zeq *2
|
||
08080 lal 0
|
||
08081 loi _EM_PSIZE
|
||
08082 adp 3*_EM_PSIZE
|
||
08083 cal $__oldsigset
|
||
08084 asp _EM_PSIZE
|
||
08085 2
|
||
08086 #elif defined(__BSD4_2)
|
||
08087 ; restore signal mask
|
||
08088 lal 0
|
||
08089 loi _EM_PSIZE
|
||
08090 lof 3*_EM_PSIZE
|
||
08091 cal $_sigsetmask
|
||
08092 asp _EM_WSIZE
|
||
08093 lfr _EM_WSIZE
|
||
08094 asp _EM_WSIZE
|
||
08095 #endif
|
||
08096 lal 0
|
||
08097 loi _EM_PSIZE ; address of jmpbuf
|
||
08098 lae gtobuf
|
||
08099 blm 3*_EM_PSIZE ; fill GTO descriptor from jmpbuf
|
||
08100 lol _EM_PSIZE ; second parameter of longjmp: the return value
|
||
08101 dup _EM_WSIZE
|
||
08102 zne *3
|
||
08103 ; of course, longjmp may not return 0!
|
||
08104 inc
|
||
08105 3
|
||
08106 ; put return value in function result area
|
||
08107 cal $fill_ret_area
|
||
08108 asp _EM_WSIZE
|
||
08109 gto gtobuf ; there we go ...
|
||
08110 ; ASP and GTO do not damage function result area
|
||
08111 end 0
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/_memmove.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08200 ! _memmove() Author: Kees J. Bot
|
||
08201 ! 2 Jan 1994
|
||
08202 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08203
|
||
08204 ! void *_memmove(void *s1, const void *s2, size_t n)
|
||
08205 ! Copy a chunk of memory. Handle overlap.
|
||
08206 !
|
||
08207 .sect .text
|
||
08208 .define __memmove, __memcpy
|
||
08209 .align 16
|
||
08210 __memmove:
|
||
08211 push ebp
|
||
08212 mov ebp, esp
|
||
08213 push esi
|
||
08214 push edi
|
||
08215 mov edi, 8(ebp) ! String s1
|
||
08216 mov esi, 12(ebp) ! String s2
|
||
08217 mov ecx, 16(ebp) ! Length
|
||
08218 mov eax, edi
|
||
08219 sub eax, esi
|
||
08220 cmp eax, ecx
|
||
08221 jb downwards ! if (s2 - s1) < n then copy downwards
|
||
08222 __memcpy:
|
||
08223 cld ! Clear direction bit: upwards
|
||
08224 cmp ecx, 16
|
||
08225 jb upbyte ! Don't bother being smart with short arrays
|
||
08226 mov eax, esi
|
||
08227 or eax, edi
|
||
08228 testb al, 1
|
||
08229 jnz upbyte ! Bit 0 set, use byte copy
|
||
08230 testb al, 2
|
||
08231 jnz upword ! Bit 1 set, use word copy
|
||
08232 uplword:shrd eax, ecx, 2 ! Save low 2 bits of ecx in eax
|
||
08233 shr ecx, 2
|
||
08234 rep
|
||
08235 movs ! Copy longwords.
|
||
08236 shld ecx, eax, 2 ! Restore excess count
|
||
08237 upword: shr ecx, 1
|
||
08238 rep
|
||
08239 o16 movs ! Copy words
|
||
08240 adc ecx, ecx ! One more byte?
|
||
08241 upbyte: rep
|
||
08242 movsb ! Copy bytes
|
||
08243 done: mov eax, 8(ebp) ! Absolutely noone cares about this value
|
||
08244 pop edi
|
||
08245 pop esi
|
||
08246 pop ebp
|
||
08247 ret
|
||
08248
|
||
08249 ! Handle bad overlap by copying downwards, don't bother to do word copies.
|
||
08250 downwards:
|
||
08251 std ! Set direction bit: downwards
|
||
08252 lea esi, -1(esi)(ecx*1)
|
||
08253 lea edi, -1(edi)(ecx*1)
|
||
08254 rep
|
||
08255 movsb ! Copy bytes
|
||
08256 cld
|
||
08257 jmp done
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/_strncat.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08300 ! _strncat() Author: Kees J. Bot
|
||
08301 ! 1 Jan 1994
|
||
08302 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08303
|
||
08304 ! char *_strncat(char *s1, const char *s2, size_t edx)
|
||
08305 ! Append string s2 to s1.
|
||
08306 !
|
||
08307 .sect .text
|
||
08308 .define __strncat
|
||
08309 .align 16
|
||
08310 __strncat:
|
||
08311 push ebp
|
||
08312 mov ebp, esp
|
||
08313 push esi
|
||
08314 push edi
|
||
08315 mov edi, 8(ebp) ! String s1
|
||
08316 mov ecx, -1
|
||
08317 xorb al, al ! Null byte
|
||
08318 cld
|
||
08319 repne
|
||
08320 scasb ! Look for the zero byte in s1
|
||
08321 dec edi ! Back one up (and clear 'Z' flag)
|
||
08322 push edi ! Save end of s1
|
||
08323 mov edi, 12(ebp) ! edi = string s2
|
||
08324 mov ecx, edx ! Maximum count
|
||
08325 repne
|
||
08326 scasb ! Look for the end of s2
|
||
08327 jne no0
|
||
08328 inc ecx ! Exclude null byte
|
||
08329 no0: sub edx, ecx ! Number of bytes in s2
|
||
08330 mov ecx, edx
|
||
08331 mov esi, 12(ebp) ! esi = string s2
|
||
08332 pop edi ! edi = end of string s1
|
||
08333 rep
|
||
08334 movsb ! Copy bytes
|
||
08335 stosb ! Add a terminating null
|
||
08336 mov eax, 8(ebp) ! Return s1
|
||
08337 pop edi
|
||
08338 pop esi
|
||
08339 pop ebp
|
||
08340 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/_strncmp.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08400 ! strncmp() Author: Kees J. Bot
|
||
08401 ! 1 Jan 1994
|
||
08402 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08403
|
||
08404 ! int strncmp(const char *s1, const char *s2, size_t ecx)
|
||
08405 ! Compare two strings.
|
||
08406 !
|
||
08407 .sect .text
|
||
08408 .define __strncmp
|
||
08409 .align 16
|
||
08410 __strncmp:
|
||
08411 push ebp
|
||
08412 mov ebp, esp
|
||
08413 push esi
|
||
08414 push edi
|
||
08415 test ecx, ecx ! Max length is zero?
|
||
08416 je done
|
||
08417 mov esi, 8(ebp) ! esi = string s1
|
||
08418 mov edi, 12(ebp) ! edi = string s2
|
||
08419 cld
|
||
08420 compare:
|
||
08421 cmpsb ! Compare two bytes
|
||
08422 jne done
|
||
08423 cmpb -1(esi), 0 ! End of string?
|
||
08424 je done
|
||
08425 dec ecx ! Length limit reached?
|
||
08426 jne compare
|
||
08427 done: seta al ! al = (s1 > s2)
|
||
08428 setb ah ! ah = (s1 < s2)
|
||
08429 subb al, ah
|
||
08430 movsxb eax, al ! eax = (s1 > s2) - (s1 < s2), i.e. -1, 0, 1
|
||
08431 pop edi
|
||
08432 pop esi
|
||
08433 pop ebp
|
||
08434 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/_strncpy.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08500 ! _strncpy() Author: Kees J. Bot
|
||
08501 ! 1 Jan 1994
|
||
08502 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08503
|
||
08504 ! char *_strncpy(char *s1, const char *s2, size_t ecx)
|
||
08505 ! Copy string s2 to s1.
|
||
08506 !
|
||
08507 .sect .text
|
||
08508 .define __strncpy
|
||
08509 .align 16
|
||
08510 __strncpy:
|
||
08511 mov edi, 12(ebp) ! edi = string s2
|
||
08512 xorb al, al ! Look for a zero byte
|
||
08513 mov edx, ecx ! Save maximum count
|
||
08514 cld
|
||
08515 repne
|
||
08516 scasb ! Look for end of s2
|
||
08517 sub edx, ecx ! Number of bytes in s2 including null
|
||
08518 xchg ecx, edx
|
||
08519 mov esi, 12(ebp) ! esi = string s2
|
||
08520 mov edi, 8(ebp) ! edi = string s1
|
||
08521 rep
|
||
08522 movsb ! Copy bytes
|
||
08523 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/_strnlen.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08600 ! _strnlen() Author: Kees J. Bot
|
||
08601 ! 1 Jan 1994
|
||
08602 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08603
|
||
08604 ! size_t _strnlen(const char *s, size_t ecx)
|
||
08605 ! Return the length of a string.
|
||
08606 !
|
||
08607 .sect .text
|
||
08608 .define __strnlen
|
||
08609 .align 16
|
||
08610 __strnlen:
|
||
08611 push ebp
|
||
08612 mov ebp, esp
|
||
08613 push edi
|
||
08614 mov edi, 8(ebp) ! edi = string
|
||
08615 xorb al, al ! Look for a zero byte
|
||
08616 mov edx, ecx ! Save maximum count
|
||
08617 cmpb cl, 1 ! 'Z' bit must be clear if ecx = 0
|
||
08618 cld
|
||
08619 repne
|
||
08620 scasb ! Look for zero
|
||
08621 jne no0
|
||
08622 inc ecx ! Don't count zero byte
|
||
08623 no0: mov eax, edx
|
||
08624 sub eax, ecx ! Compute bytes scanned
|
||
08625 pop edi
|
||
08626 pop ebp
|
||
08627 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/bcmp.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08700 ! bcmp() Author: Kees J. Bot
|
||
08701 ! 2 Jan 1994
|
||
08702 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08703
|
||
08704 ! int bcmp(const void *s1, const void *s2, size_t n)
|
||
08705 ! Compare two chunks of memory.
|
||
08706 ! This is a BSD routine that escaped from the kernel. Don't use.
|
||
08707 ! (Alas it is not without some use, it reports the number of bytes
|
||
08708 ! after the bytes that are equal. So it can't be simply replaced.)
|
||
08709 !
|
||
08710 .sect .text
|
||
08711 .define _bcmp
|
||
08712 .align 16
|
||
08713 _bcmp:
|
||
08714 push ebp
|
||
08715 mov ebp, esp
|
||
08716 push 16(ebp)
|
||
08717 push 12(ebp)
|
||
08718 push 8(ebp)
|
||
08719 call _memcmp ! Let memcmp do the work
|
||
08720 test eax, eax
|
||
08721 jz equal
|
||
08722 sub edx, 8(ebp) ! Memcmp was nice enough to leave "esi" in edx
|
||
08723 dec edx ! Number of bytes that are equal
|
||
08724 mov eax, 16(ebp)
|
||
08725 sub eax, edx ! Number of bytes that are unequal
|
||
08726 equal: leave
|
||
08727 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/bcopy.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08800 ! bcopy() Author: Kees J. Bot
|
||
08801 ! 2 Jan 1994
|
||
08802 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08803
|
||
08804 ! void bcopy(const void *s1, void *s2, size_t n)
|
||
08805 ! Copy a chunk of memory. Handle overlap.
|
||
08806 ! This is a BSD routine that escaped from the kernel. Don't use.
|
||
08807 !
|
||
08808 .sect .text
|
||
08809 .define _bcopy
|
||
08810 .align 16
|
||
08811 _bcopy:
|
||
08812 mov eax, 4(esp) ! Exchange string arguments
|
||
08813 xchg eax, 8(esp)
|
||
08814 mov 4(esp), eax
|
||
08815 jmp __memmove ! Call the proper routine
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/bzero.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
08900 ! bzero() Author: Kees J. Bot
|
||
08901 ! 2 Jan 1994
|
||
08902 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
08903
|
||
08904 ! void bzero(void *s, size_t n)
|
||
08905 ! Set a chunk of memory to zero.
|
||
08906 ! This is a BSD routine that escaped from the kernel. Don't use.
|
||
08907 !
|
||
08908 .sect .text
|
||
08909 .define _bzero
|
||
08910 .align 16
|
||
08911 _bzero:
|
||
08912 push ebp
|
||
08913 mov ebp, esp
|
||
08914 push 12(ebp) ! Size
|
||
08915 push 0 ! Zero
|
||
08916 push 8(ebp) ! String
|
||
08917 call _memset ! Call the proper routine
|
||
08918 leave
|
||
08919 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/index.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
09000 ! index() Author: Kees J. Bot
|
||
09001 ! 2 Jan 1994
|
||
09002 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
09003
|
||
09004 ! char *index(const char *s, int c)
|
||
09005 ! Look for a character in a string. Has suffered from a hostile
|
||
09006 ! takeover by strchr().
|
||
09007 !
|
||
09008 .sect .text
|
||
09009 .define _index
|
||
09010 .align 16
|
||
09011 _index:
|
||
09012 jmp _strchr
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/memchr.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
09100 ! memchr() Author: Kees J. Bot
|
||
09101 ! 2 Jan 1994
|
||
09102 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
09103
|
||
09104 ! void *memchr(const void *s, int c, size_t n)
|
||
09105 ! Look for a character in a chunk of memory.
|
||
09106 !
|
||
09107 .sect .text
|
||
09108 .define _memchr
|
||
09109 .align 16
|
||
09110 _memchr:
|
||
09111 push ebp
|
||
09112 mov ebp, esp
|
||
09113 push edi
|
||
09114 mov edi, 8(ebp) ! edi = string
|
||
09115 movb al, 12(ebp) ! The character to look for
|
||
09116 mov ecx, 16(ebp) ! Length
|
||
09117 cmpb cl, 1 ! 'Z' bit must be clear if ecx = 0
|
||
09118 cld
|
||
09119 repne
|
||
09120 scasb
|
||
09121 jne failure
|
||
09122 lea eax, -1(edi) ! Found
|
||
09123 pop edi
|
||
09124 pop ebp
|
||
09125 ret
|
||
09126 failure:xor eax, eax
|
||
09127 pop edi
|
||
09128 pop ebp
|
||
09129 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/memcmp.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
09200 ! memcmp() Author: Kees J. Bot
|
||
09201 ! 2 Jan 1994
|
||
09202 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
09203
|
||
09204 ! int memcmp(const void *s1, const void *s2, size_t n)
|
||
09205 ! Compare two chunks of memory.
|
||
09206 !
|
||
09207 .sect .text
|
||
09208 .define _memcmp
|
||
09209 .align 16
|
||
09210 _memcmp:
|
||
09211 cld
|
||
09212 push ebp
|
||
09213 mov ebp, esp
|
||
09214 push esi
|
||
09215 push edi
|
||
09216 mov esi, 8(ebp) ! String s1
|
||
09217 mov edi, 12(ebp) ! String s2
|
||
09218 mov ecx, 16(ebp) ! Length
|
||
09219 cmp ecx, 16
|
||
09220 jb cbyte ! Don't bother being smart with short arrays
|
||
09221 mov eax, esi
|
||
09222 or eax, edi
|
||
09223 testb al, 1
|
||
09224 jnz cbyte ! Bit 0 set, use byte compare
|
||
09225 testb al, 2
|
||
09226 jnz cword ! Bit 1 set, use word compare
|
||
09227 clword: shrd eax, ecx, 2 ! Save low two bits of ecx in eax
|
||
09228 shr ecx, 2
|
||
09229 repe
|
||
09230 cmps ! Compare longwords
|
||
09231 sub esi, 4
|
||
09232 sub edi, 4
|
||
09233 inc ecx ! Recompare the last longword
|
||
09234 shld ecx, eax, 2 ! And any excess bytes
|
||
09235 jmp last
|
||
09236 cword: shrd eax, ecx, 1 ! Save low bit of ecx in eax
|
||
09237 shr ecx, 1
|
||
09238 repe
|
||
09239 o16 cmps ! Compare words
|
||
09240 sub esi, 2
|
||
09241 sub edi, 2
|
||
09242 inc ecx ! Recompare the last word
|
||
09243 shld ecx, eax, 1 ! And one more byte?
|
||
09244 cbyte: test ecx, ecx ! Set 'Z' flag if ecx = 0
|
||
09245 last: repe
|
||
09246 cmpsb ! Look for the first differing byte
|
||
09247 seta al ! al = (s1 > s2)
|
||
09248 setb ah ! ah = (s1 < s2)
|
||
09249 subb al, ah
|
||
09250 movsxb eax, al ! eax = (s1 > s2) - (s1 < s2), i.e. -1, 0, 1
|
||
09251 mov edx, esi ! For bcmp() to play with
|
||
09252 pop edi
|
||
09253 pop esi
|
||
09254 pop ebp
|
||
09255 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/memcpy.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
09300 ! memcpy() Author: Kees J. Bot
|
||
09301 ! 2 Jan 1994
|
||
09302 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
09303
|
||
09304 ! void *memcpy(void *s1, const void *s2, size_t n)
|
||
09305 ! Copy a chunk of memory.
|
||
09306 ! This routine need not handle overlap, so it does not handle overlap.
|
||
09307 ! One could simply call __memmove, the cost of the overlap check is
|
||
09308 ! negligible, but you are dealing with a programmer who believes that
|
||
09309 ! if anything can go wrong, it should go wrong.
|
||
09310 !
|
||
09311 .sect .text
|
||
09312 .define _memcpy
|
||
09313 .align 16
|
||
09314 _memcpy:
|
||
09315 push ebp
|
||
09316 mov ebp, esp
|
||
09317 push esi
|
||
09318 push edi
|
||
09319 mov edi, 8(ebp) ! String s1
|
||
09320 mov esi, 12(ebp) ! String s2
|
||
09321 mov ecx, 16(ebp) ! Length
|
||
09322 ! No overlap check here
|
||
09323 jmp __memcpy ! Call the part of __memmove that copies up
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/memmove.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
09400 ! memmove() Author: Kees J. Bot
|
||
09401 ! 2 Jan 1994
|
||
09402 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
09403
|
||
09404 ! void *memmove(void *s1, const void *s2, size_t n)
|
||
09405 ! Copy a chunk of memory. Handle overlap.
|
||
09406 !
|
||
09407 .sect .text
|
||
09408 .define _memmove
|
||
09409 .align 16
|
||
09410 _memmove:
|
||
09411 jmp __memmove ! Call common code
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/memset.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
09500 ! memset() Author: Kees J. Bot
|
||
09501 ! 2 Jan 1994
|
||
09502 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
09503
|
||
09504 ! void *memset(void *s, int c, size_t n)
|
||
09505 ! Set a chunk of memory to the same byte value.
|
||
09506 !
|
||
09507 .sect .text
|
||
09508 .define _memset
|
||
09509 .align 16
|
||
09510 _memset:
|
||
09511 push ebp
|
||
09512 mov ebp, esp
|
||
09513 push edi
|
||
09514 mov edi, 8(ebp) ! The string
|
||
09515 movzxb eax, 12(ebp) ! The fill byte
|
||
09516 mov ecx, 16(ebp) ! Length
|
||
09517 cld
|
||
09518 cmp ecx, 16
|
||
09519 jb sbyte ! Don't bother being smart with short arrays
|
||
09520 test edi, 1
|
||
09521 jnz sbyte ! Bit 0 set, use byte store
|
||
09522 test edi, 2
|
||
09523 jnz sword ! Bit 1 set, use word store
|
||
09524 slword: movb ah, al
|
||
09525 mov edx, eax
|
||
09526 sal edx, 16
|
||
09527 or eax, edx ! One byte to four bytes
|
||
09528 shrd edx, ecx, 2 ! Save low two bits of ecx in edx
|
||
09529 shr ecx, 2
|
||
09530 rep
|
||
09531 stos ! Store longwords.
|
||
09532 shld ecx, edx, 2 ! Restore low two bits
|
||
09533 sword: movb ah, al ! One byte to two bytes
|
||
09534 shr ecx, 1
|
||
09535 rep
|
||
09536 o16 stos ! Store words
|
||
09537 adc ecx, ecx ! One more byte?
|
||
09538 sbyte: rep
|
||
09539 stosb ! Store bytes
|
||
09540 done: mov eax, 8(ebp) ! Return some value you have no need for
|
||
09541 pop edi
|
||
09542 pop ebp
|
||
09543 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/rindex.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
09600 ! rindex() Author: Kees J. Bot
|
||
09601 ! 2 Jan 1994
|
||
09602 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
09603
|
||
09604 ! char *rindex(const char *s, int c)
|
||
09605 ! Look for the last occurrence a character in a string. Has suffered
|
||
09606 ! from a hostile takeover by strrchr().
|
||
09607 !
|
||
09608 .sect .text
|
||
09609 .define _rindex
|
||
09610 .align 16
|
||
09611 _rindex:
|
||
09612 jmp _strrchr
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/strcat.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
09700 ! strcat() Author: Kees J. Bot
|
||
09701 ! 1 Jan 1994
|
||
09702 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
09703
|
||
09704 ! char *strcat(char *s1, const char *s2)
|
||
09705 ! Append string s2 to s1.
|
||
09706 !
|
||
09707 .sect .text
|
||
09708 .define _strcat
|
||
09709 .align 16
|
||
09710 _strcat:
|
||
09711 mov edx, -1 ! Unlimited length
|
||
09712 jmp __strncat ! Common code
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/strchr.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
09800 ! strchr() Author: Kees J. Bot
|
||
09801 ! 1 Jan 1994
|
||
09802 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
09803
|
||
09804 ! char *strchr(const char *s, int c)
|
||
09805 ! Look for a character in a string.
|
||
09806 !
|
||
09807 .sect .text
|
||
09808 .define _strchr
|
||
09809 .align 16
|
||
09810 _strchr:
|
||
09811 push ebp
|
||
09812 mov ebp, esp
|
||
09813 push edi
|
||
09814 cld
|
||
09815 mov edi, 8(ebp) ! edi = string
|
||
09816 mov edx, 16 ! Look at small chunks of the string
|
||
09817 next: shl edx, 1 ! Chunks become bigger each time
|
||
09818 mov ecx, edx
|
||
09819 xorb al, al ! Look for the zero at the end
|
||
09820 repne
|
||
09821 scasb
|
||
09822 pushf ! Remember the flags
|
||
09823 sub ecx, edx
|
||
09824 neg ecx ! Some or all of the chunk
|
||
09825 sub edi, ecx ! Step back
|
||
09826 movb al, 12(ebp) ! The character to look for
|
||
09827 repne
|
||
09828 scasb
|
||
09829 je found
|
||
09830 popf ! Did we find the end of string earlier?
|
||
09831 jne next ! No, try again
|
||
09832 xor eax, eax ! Return NULL
|
||
09833 pop edi
|
||
09834 pop ebp
|
||
09835 ret
|
||
09836 found: pop eax ! Get rid of those flags
|
||
09837 lea eax, -1(edi) ! Address of byte found
|
||
09838 pop edi
|
||
09839 pop ebp
|
||
09840 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/strcmp.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
09900 ! strcmp() Author: Kees J. Bot
|
||
09901 ! 1 Jan 1994
|
||
09902 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
09903
|
||
09904 ! int strcmp(const char *s1, const char *s2)
|
||
09905 ! Compare two strings.
|
||
09906 !
|
||
09907 .sect .text
|
||
09908 .define _strcmp
|
||
09909 .align 16
|
||
09910 _strcmp:
|
||
09911 mov ecx, -1 ! Unlimited length
|
||
09912 jmp __strncmp ! Common code
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/strcpy.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
10000 ! strcpy() Author: Kees J. Bot
|
||
10001 ! 1 Jan 1994
|
||
10002 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
10003
|
||
10004 ! char *strcpy(char *s1, const char *s2)
|
||
10005 ! Copy string s2 to s1.
|
||
10006 !
|
||
10007 .sect .text
|
||
10008 .define _strcpy
|
||
10009 .align 16
|
||
10010 _strcpy:
|
||
10011 push ebp
|
||
10012 mov ebp, esp
|
||
10013 push esi
|
||
10014 push edi
|
||
10015 mov ecx, -1 ! Unlimited length
|
||
10016 call __strncpy ! Common code
|
||
10017 mov eax, 8(ebp) ! Return s1
|
||
10018 pop edi
|
||
10019 pop esi
|
||
10020 pop ebp
|
||
10021 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/strlen.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
10100 ! strlen() Author: Kees J. Bot
|
||
10101 ! 1 Jan 1994
|
||
10102 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
10103
|
||
10104 ! size_t strlen(const char *s)
|
||
10105 ! Return the length of a string.
|
||
10106 !
|
||
10107 .sect .text
|
||
10108 .define _strlen
|
||
10109 .align 16
|
||
10110 _strlen:
|
||
10111 mov ecx, -1 ! Unlimited length
|
||
10112 jmp __strnlen ! Common code
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/strncat.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
10200 ! strncat() Author: Kees J. Bot
|
||
10201 ! 1 Jan 1994
|
||
10202 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
10203
|
||
10204 ! size_t strncat(char *s1, const char *s2, size_t n)
|
||
10205 ! Append string s2 to s1.
|
||
10206 !
|
||
10207 .sect .text
|
||
10208 .define _strncat
|
||
10209 .align 16
|
||
10210 _strncat:
|
||
10211 mov edx, 12(esp) ! Maximum length
|
||
10212 jmp __strncat ! Common code
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/strncmp.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
10300 ! strncmp() Author: Kees J. Bot
|
||
10301 ! 1 Jan 1994
|
||
10302 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
10303
|
||
10304 ! int strncmp(const char *s1, const char *s2, size_t n)
|
||
10305 ! Compare two strings.
|
||
10306 !
|
||
10307 .sect .text
|
||
10308 .define _strncmp
|
||
10309 .align 16
|
||
10310 _strncmp:
|
||
10311 mov ecx, 12(esp) ! Maximum length
|
||
10312 jmp __strncmp ! Common code
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/strncpy.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
10400 ! strncpy() Author: Kees J. Bot
|
||
10401 ! 1 Jan 1994
|
||
10402 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
10403
|
||
10404 ! char *strncpy(char *s1, const char *s2, size_t n)
|
||
10405 ! Copy string s2 to s1.
|
||
10406 !
|
||
10407 .sect .text
|
||
10408 .define _strncpy
|
||
10409 .align 16
|
||
10410 _strncpy:
|
||
10411 push ebp
|
||
10412 mov ebp, esp
|
||
10413 push esi
|
||
10414 push edi
|
||
10415 mov ecx, 16(ebp) ! Maximum length
|
||
10416 call __strncpy ! Common code
|
||
10417 mov ecx, edx ! Number of bytes not copied
|
||
10418 rep
|
||
10419 stosb ! strncpy always copies n bytes by null padding
|
||
10420 mov eax, 8(ebp) ! Return s1
|
||
10421 pop edi
|
||
10422 pop esi
|
||
10423 pop ebp
|
||
10424 ret
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/strnlen.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
10500 ! strnlen() Author: Kees J. Bot
|
||
10501 ! 1 Jan 1994
|
||
10502 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
10503
|
||
10504 ! size_t strnlen(const char *s, size_t n)
|
||
10505 ! Return the length of a string.
|
||
10506 !
|
||
10507 .sect .text
|
||
10508 .define _strnlen
|
||
10509 .align 16
|
||
10510 _strnlen:
|
||
10511 mov ecx, 8(esp) ! Maximum length
|
||
10512 jmp __strnlen ! Common code
|
||
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
src/lib/i386/string/strrchr.s
|
||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
10600 ! strrchr() Author: Kees J. Bot
|
||
10601 ! 2 Jan 1994
|
||
10602 .sect .text; .sect .rom; .sect .data; .sect .bss
|
||
10603
|
||
10604 ! char *strrchr(const char *s, int c)
|
||
10605 ! Look for the last occurrence a character in a string.
|
||
10606 !
|
||
10607 .sect .text
|
||
10608 .define _strrchr
|
||
10609 .align 16
|
||
10610 _strrchr:
|
||
10611 push ebp
|
||
10612 mov ebp, esp
|
||
10613 push edi
|
||
10614 mov edi, 8(ebp) ! edi = string
|
||
10615 mov ecx, -1
|
||
10616 xorb al, al
|
||
10617 cld
|
||
10618 repne
|
||
10619 scasb ! Look for the end of the string
|
||
10620 not ecx ! -1 - ecx = Length of the string + null
|
||
10621 dec edi ! Put edi back on the zero byte
|
||
10622 movb al, 12(ebp) ! The character to look for
|
||
10623 std ! Downwards search
|
||
10624 repne
|
||
10625 scasb
|
||
10626 cld ! Direction bit back to default
|
||
10627 jne failure
|
||
10628 lea eax, 1(edi) ! Found it
|
||
10629 pop edi
|
||
10630 pop ebp
|
||
10631 ret
|
||
10632 failure:xor eax, eax ! Not there
|
||
10633 pop edi
|
||
10634 pop ebp
|
||
10635 ret
|
||
|
||
|