📄 emumainalib.s
字号:
fldsi: #push from memory andb $0x0fd,h_stat+1 call sitoep #STPUSHP movl s_fpsp,%ebx subb $32,%bl cmpb $3,s_stk+10(%ebx) jnz stackof movl %ebx,s_fpsp addl $s_stk,%ebx movl %eax,(%ebx) movl %edx,4(%ebx) movl %ecx,8(%ebx) ret fldwi: #push from memory andb $0x0fd,h_stat+1 call witoep #STPUSHP movl s_fpsp,%ebx subb $32,%bl cmpb $3,s_stk+10(%ebx) jnz stackof movl %ebx,s_fpsp addl $s_stk,%ebx movl %eax,(%ebx) movl %edx,4(%ebx) movl %ecx,8(%ebx) ret fstf: #fetch as single-precision #SAVEIX movl %eax,s_memp xchgl %esi,%eax movl %eax,s_iptr #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx call eptofp movl %eax,(%esi) ret fstpf: #pop as single-precision #SAVEIX movl %eax,s_memp xchgl %esi,%eax movl %eax,s_iptr #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx call eptofp movl %eax,(%esi) #STPOPq movb $3,10(%edi) addb $32,s_fpsp ret fldcwc: #load control word movw (%eax),%ax andw $0x1f7f,%ax orb $0x40,%al movw %ax,h_ctrl ret fstcwc: #store control word movl %eax,%edi movw h_ctrl,%ax stosw ret flds: #ST = ST(i) #SAVEIN movl %esi,s_iptr andb $0x0fd,h_stat+1 #STIX ebx movl s_fpsp,%eax shll $5,%ebx addb %bl,%al addl $s_stk,%eax xchgl %edi,%eax #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx #STPUSHP movl s_fpsp,%ebx subb $32,%bl cmpb $3,s_stk+10(%ebx) jnz stackof movl %ebx,s_fpsp addl $s_stk,%ebx movl %eax,(%ebx) movl %edx,4(%ebx) movl %ecx,8(%ebx) ret fxchs: #exchange ST and ST(i) #SAVEIN movl %esi,s_iptr andb $0x0fd,h_stat+1 movl s_fpsp,%eax addl $s_stk,%eax movl (%eax),%edi movl 4(%eax),%edx movl 8(%eax),%ecx subl $s_stk,%eax shll $5,%ebx addb %bl,%al addl $s_stk,%eax xchgl %edi,(%eax) xchgl %edx,4(%eax) xchgl %ecx,8(%eax) subl $s_stk,%eax subb %bl,%al addl $s_stk,%eax movl %edi,(%eax) movl %edx,4(%eax) movl %ecx,8(%eax) ret fnop_: #no operation #SAVEIN movl %esi,s_iptr ret fstps: #ST(i) = ST and pop #SAVEIN movl %esi,s_iptr andb $0x0fd,h_stat+1 movl s_fpsp,%eax addl $s_stk,%eax movl %eax,%edi movl (%eax),%esi movl 4(%eax),%edx movl 8(%eax),%ecx shll $5,%ebx subl $s_stk,%eax addb %bl,%al addl $s_stk,%eax movl %esi,(%eax) movl %edx,4(%eax) movl %ecx,8(%eax) #STPOPq movb $3,10(%edi) addb $32,s_fpsp ret fucoms: #ST - ST(i) -> codes #SAVEIN movl %esi,s_iptr #GETEPS ebx movl s_fpsp,%eax movl %eax,%edi addl $s_stk,%edi shll $5,%ebx addb %bl,%al addl $s_stk,%eax movl 8(%eax),%ecx movl 4(%eax),%edx movl (%eax),%eax jmp epcomu fucomps: #ST - ST(i) -> codes, pop #SAVEIN movl %esi,s_iptr #GETEPS ebx movl s_fpsp,%eax movl %eax,%edi addl $s_stk,%edi shll $5,%ebx addb %bl,%al addl $s_stk,%eax movl 8(%eax),%ecx movl 4(%eax),%edx movl (%eax),%eax call epcomu #STPOPq movb $3,10(%edi) addb $32,s_fpsp ret is1t: .long fchs_,fabs_,NONE_,NONE_,ftst_,fxam_,NONE_,NONE_is1: #SAVEIN movl %esi,s_iptr jmp *%cs:is1t(,%ebx,4) fchs_: #ST = -ST andb $0x0fd,h_stat+1 #STTOP movl s_fpsp,%edi addl $s_stk,%edi xorb $0x80,11(%edi) ret fabs_: #ST = |ST| andb $0x0fd,h_stat+1 #STTOP movl s_fpsp,%edi addl $s_stk,%edi andb $0x7f,11(%edi) ret ftst_: #set codes according to ST #STTOP movl s_fpsp,%edi addl $s_stk,%edi movl $0x00010000,%ecx xorl %eax,%eax xorl %edx,%edx jmp epcomp fxam_: #set codes according to ST andb $0x0b8,h_stat+1 movl s_fpsp,%edi addl $s_stk,%edi cmpb $3,10(%edi) jz fxa9 #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx call epexam orb %al,h_stat+1 fxa9: ret is8t: .long ld1,ldl2t,ldl2e,ldpi,ldlg2,ldln2,ldz,NONE_ is8: #SAVEIN movl %esi,s_iptr andb $0x0fd,h_stat+1 call *%cs:is8t(,%ebx,4) #STPUSHP movl s_fpsp,%ebx subb $32,%bl cmpb $3,s_stk+10(%ebx) jnz stackof movl %ebx,s_fpsp addl $s_stk,%ebx movl %eax,(%ebx) movl %edx,4(%ebx) movl %ecx,8(%ebx) ret ld1: #load 1 xorl %eax,%eax movl $0x80000000,%edx movl $0x00003fff,%ecx ret ldl2t: #load log2(10) movl $0xcd1b8afe,%eax movl $0xd49a784b,%edx movl $0x00004000,%ecx movb h_ctrl+1,%bh andb $0x0c,%bh cmpb $0x08,%bh jnz ldc3 incl %eax ldc3: ret ldl2e: #load log2(e) movl $0x5c17f0bb,%eax movl $0xb8aa3b29,%edx movl $0x00003fff,%ecx testb $0x04,h_ctrl+1 jnz ldc5 incl %eax ldc5: ret ldpi: #load pi movl $0x2168c234,%eax movl $0xc90fdaa2,%edx movl $0x00004000,%ecx testb $0x04,h_ctrl+1 jnz ldp5 incl %eax ldp5: ret ldlg2: #load log10(2) movl $0xfbcff798,%eax movl $0x9a209a84,%edx movl $0x00003ffd,%ecx testb $0x04,h_ctrl+1 jnz ldc9 incl %eax ldc9: ret ldln2: #load ln(2) movl $0xd1cf79ab,%eax movl $0xb17217f7,%edx movl $0x00003ffe,%ecx testb $0x04,h_ctrl+1 jnz ldc11 incl %eax ldc11: ret ldz: #load 0 xorl %eax,%eax xorl %edx,%edx movl $0x00010000,%ecx ret is2t: .long f2xm1_,fyl2x_,fptan_,fpatan_,fxtract_,fprem_,fdecstp_,fincstp_ is2: #SAVEIN movl %esi,s_iptr jmp *%cs:is2t(,%ebx,4) f2xm1_: #ST = (2^ST) - 1 #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx call epf2xm1 #PUTEP movl %eax,(%edi) movl %edx,4(%edi) movl %ecx,8(%edi) ret fyl2x_: #calculate log2(ST) * ST(1), pop once #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx call eplog #STPOPq movb $3,10(%edi) addb $32,s_fpsp #STTOP movl s_fpsp,%edi addl $s_stk,%edi call epmul jmp rounde fptan_: #make ST into tan(ST) #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx call reduct movl %edi,%esi #STPUSH xchgl %edi,%ebx movl s_fpsp,%ebx subb $32,%bl xchgl %edi,%ebx cmpb $3,s_stk+10(%edi) jz LL1 call stackof LL1: movl %edi,s_fpsp addl $s_stk,%edi pushl %edi movl %esi,%edi testl $0x30000,%ecx jnz tan11 call eptan tan5: #PUTEP movl %eax,(%edi) movl %edx,4(%edi) movl %ecx,8(%edi) movl $tBIAS,%ecx movl $0x80000000,%edx xorl %eax,%eax tan6: popl %edi #PUTEP movl %eax,(%edi) movl %edx,4(%edi) movl %ecx,8(%edi) ret tan11: testl $0x50000,%ecx jnz tan5 #PUTEP movl %eax,(%edi) movl %edx,4(%edi) movl %ecx,8(%edi) call getqn jmp tan6 fpatan_: #arctangent of ST(1)/ST, pop stack #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx #STIX1 movl s_fpsp,%ebx addb $32,%bl addl $s_stk,%ebx xchgl %edi,%ebx call epatan #PUTEP movl %eax,(%edi) movl %edx,4(%edi) movl %ecx,8(%edi) #STPOP movl s_fpsp,%eax addl $s_stk,%eax movb $3,10(%eax) addb $32,s_fpsp ret fxtract_: #extract exponent and mantissa andb $0x0fd,h_stat+1 #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx call xtract #STPUSHP movl s_fpsp,%ebx subb $32,%bl cmpb $3,s_stk+10(%ebx) jnz stackof movl %ebx,s_fpsp addl $s_stk,%ebx movl %eax,(%ebx) movl %edx,4(%ebx) movl %ecx,8(%ebx) ret fdecstp_: #decrement stack pointer subb $32,s_fpsp ret fincstp_: #increment stack pointer addb $32,s_fpsp ret is3t: .long fprem_,fyl2xp1_,fsqrt_,fsincos_,frndint_,fscale_,fsin_,fcos_ is3: #SAVEIN movl %esi,s_iptr jmp *%cs:is3t(,%ebx,4) fprem_: # ST = ST / ST(1) Intel/IEEE remainder #STIX1q movl s_fpsp,%eax addb $32,%al addl $s_stk,%eax xchgl %edi,%eax #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx #STTOP movl s_fpsp,%edi addl $s_stk,%edi call eprem #PUTEP movl %eax,(%edi) movl %edx,4(%edi) movl %ecx,8(%edi) ret fyl2xp1_: #calculate log2(ST+1) * ST(1), pop once #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx call eplog1 #STPOPq movb $3,10(%edi) addb $32,s_fpsp #STTOP movl s_fpsp,%edi addl $s_stk,%edi call epmul jmp rounde frndint_: #round ST to integer #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx call eptown #PUTEP movl %eax,(%edi) movl %edx,4(%edi) movl %ecx,8(%edi) ret fscale_: #add ST(1) to exponent of ST movl s_fpsp,%eax addl $s_stk,%eax movl %eax,%edi subl $s_stk,%eax addb $32,%al addl $s_stk,%eax movl 8(%eax),%ecx movl 4(%eax),%edx movl (%eax),%eax call scale jmp roundx fucompps: #ST - ST(1) -> codes, pop twice #SAVEIN movl %esi,s_iptr #STIX1q movl s_fpsp,%eax addb $32,%al addl $s_stk,%eax xchgl %edi,%eax #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx #STTOP movl s_fpsp,%edi addl $s_stk,%edi call epcomu movl %edi,%eax movb $3,10(%eax) subl $s_stk,%eax addb $32,%al addl $s_stk,%eax movb $3,10(%eax) addb $64,s_fpsp ret fisti: #fetch into 32-bit integer #SAVEIX movl %eax,s_memp xchgl %esi,%eax movl %eax,s_iptr #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx call eptosi movl %eax,(%esi) ret fistpi: #pop into 32-bit integer #SAVEIX movl %eax,s_memp xchgl %esi,%eax movl %eax,s_iptr #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx call eptosi movl %eax,(%esi) #STPOPq movb $3,10(%edi) addb $32,s_fpsp ret flde: #push EP from memory #SAVEII movl %esi,s_iptr movl %eax,s_memp andb $0x0fd,h_stat+1 call eptoep #STPUSHP movl s_fpsp,%ebx subb $32,%bl cmpb $3,s_stk+10(%ebx) jnz stackof movl %ebx,s_fpsp addl $s_stk,%ebx movl %eax,(%ebx) movl %edx,4(%ebx) movl %ecx,8(%ebx) ret fstpe: #fetch as extended-precision #SAVEIX movl %eax,s_memp xchgl %esi,%eax movl %eax,s_iptr andb $0x0fd,h_stat+1 #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx shldl $16,%ecx,%ebx cmpb $3,%bl jnz stpe5 call getqn stpe5: movl %eax,(%esi) movl %edx,4(%esi) addl %ecx,%ecx rcrw $1,%cx movw %cx,8(%esi) #STPOPq movb $3,10(%edi) addb $32,s_fpsp ret is5t: .long NONE_,NONE_,fclex_,finit_,NONE_,NONE_,NONE_,NONE_ is5: jmp *%cs:is5t(,%ebx,4) fclex_: #clear error status flags andw $0x7f00,h_stat ret faddx: #ST(i) = ST + ST(i) #SAVEIN movl %esi,s_iptr #GETEPX ebx movl s_fpsp,%eax addl $s_stk,%eax movl (%eax),%edi movl 4(%eax),%edx movl 8(%eax),%ecx subl $s_stk,%eax shll $5,%ebx addb %bl,%al addl $s_stk,%eax xchgl %edi,%eax call epadd jmp rounde fmulx: #ST(i) = ST * ST(i) #SAVEIN movl %esi,s_iptr #GETEPX ebx movl s_fpsp,%eax addl $s_stk,%eax movl (%eax),%edi movl 4(%eax),%edx movl 8(%eax),%ecx subl $s_stk,%eax shll $5,%ebx addb %bl,%al addl $s_stk,%eax xchgl %edi,%eax call epmul jmp rounde fsubx: #ST(i) = ST - ST(i)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -