📄 emumainalib.s
字号:
#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 epsub jmp rounde fsubrx: #ST(i) = ST(i) - ST #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 epsubr jmp rounde fdivx: #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 epdiv jmp rounde fdivrx: #ST(i) = ST(i) / ST #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 epdivr jmp rounde fldenv_: #load environmentfrstor_: #restore the HW status movl %eax,%esi movl $h_ctrl,%edi movl $3,%ecx .byte 0x36 #from ss: repz movsl .byte 0x36 #from ss: lodsl #instruction pointer movl %eax,s_iptr addl $4,%esi .byte 0x36 #from ss: lodsl #operand pointer movl %eax,s_memp addl $4,%esi movb h_stat+1,%al shlb $2,%al andl $0x0e0,%eax movl %eax,s_fpsp cmpb $0x2c,%dl jnz rst5 movl s_fpsp,%edi addl $s_stk,%edi movl $8,%ecx lds2: movl %esi,%eax pushl %ecx call eptoep #PUTEP movl %eax,(%edi) movl %edx,4(%edi) movl %ecx,8(%edi) popl %ecx addl $10,%esi movl %edi,%eax subl $s_stk,%eax addb $32,%al addl $s_stk,%eax movl %eax,%edi loop lds2 rst5: movw h_ctrl,%ax notl %eax andw h_stat,%ax testb $0x3f,%al jz rst7 orw $0x8080,h_stat rst7: movl $8,%ecx #prepare to loop over all 8 tags movw h_tag,%ax movl $s_stk+0x0e0,%edi ltt3: rolw $2,%ax movb %al,%dl andb $3,%dl movb %dl,10(%edi) subl $32,%edi loop ltt3 ret fstenv_: #store environmentfsave_: #save HW block pushl %es #flat model assumes target is stack movw %ss,%cx movw %cx,%es pushl %eax movl $8,%ecx #prepare to loop over all 8 tags movl $s_stk,%edi stt3: movb 10(%edi),%bl #concatenate tags shrdw $2,%bx,%ax addl $32,%edi loop stt3 movw %ax,h_tag #store new tags popl %edi call stfpsp movl $h_ctrl,%esi movsl movsl movsl movl s_iptr,%eax #instruction pointer stosl orl %eax,%eax jz stp5 movw %cs,%ax stp5: stosl movl s_memp,%eax #operand pointer stosl orl %eax,%eax jz stp7 movw %es,%ax stp7: stosl popl %es cmpb $0x2e,%dl jnz sts9 movl $8,%ecx movl s_fpsp,%eax sts2: addl $s_stk,%eax movl (%eax),%esi movl 4(%eax),%edx movl 8(%eax),%ebx subl $s_stk,%eax movl %esi,(%edi) movl %edx,4(%edi) addl %ebx,%ebx rcrw $1,%bx movw %bx,8(%edi) addl $10,%edi addb $32,%al loop sts2 finit_: #initialize hardware block xorl %eax,%eax movl $0x037f,h_ctrl movl %eax,h_stat movl $0xffff,h_tag movl %eax,s_iptr movl %eax,s_memp movl $s_stk,%eax movl $0,s_fpsp movl $8,%ecx fin4: movb $3,10(%eax) addl $32,%eax loop fin4 sts9: ret .globl fstsw_fstsw_: #fetch HW status word movl %eax,%edi call stfpsp movw h_stat,%ax stosw ret ffree_: #change tag to empty #SAVEIN movl %esi,s_iptr #STIX ebx movl s_fpsp,%eax shll $5,%ebx addb %bl,%al addl $s_stk,%eax xchgl %edi,%eax movb $3,10(%edi) ret fsts: #ST(i) = ST #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 #PUTEP movl %eax,(%edi) movl %edx,4(%edi) movl %ecx,8(%edi) ret faddpx: #ST(i) = ST + ST(i) and pop #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 call rounde #STPOP movl s_fpsp,%eax addl $s_stk,%eax movb $3,10(%eax) addb $32,s_fpsp ret fmulpx: #ST(i) = ST * ST(i) and pop #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 call rounde #STPOP movl s_fpsp,%eax addl $s_stk,%eax movb $3,10(%eax) addb $32,s_fpsp ret fcompps: #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 epcomp 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 fsubpx: #ST(i) = ST - ST(i) and pop #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 epsub call rounde #STPOP movl s_fpsp,%eax addl $s_stk,%eax movb $3,10(%eax) addb $32,s_fpsp ret fsubrpx: #ST(i) = ST(i) - ST and pop #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 epsubr call rounde #STPOP movl s_fpsp,%eax addl $s_stk,%eax movb $3,10(%eax) addb $32,s_fpsp ret fdivpx: #ST(i) = ST/ST(i) and pop #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 epdivr call rounde #STPOP movl s_fpsp,%eax addl $s_stk,%eax movb $3,10(%eax) addb $32,s_fpsp ret fdivrpx: #ST(i) = ST(i)/ST and pop #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 epdiv call rounde #STPOP movl s_fpsp,%eax addl $s_stk,%eax movb $3,10(%eax) addb $32,s_fpsp ret fistw: #fetch 16-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 eptowi movw %ax,(%esi) ret fistpw: #fetch 16-bit integer, pop #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 eptowi movw %ax,(%esi) #STPOPq movb $3,10(%edi) addb $32,s_fpsp ret fbldp: #push 10-byte packed-decimal integer #SAVEII movl %esi,s_iptr movl %eax,s_memp andb $0x0fd,h_stat+1 call pdtoep #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 fildl: #push 64-bit integer andb $0x0fd,h_stat+1 call litoep #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 fbstpp: #pop into 10-byte packed-decimal integer #SAVEII movl %esi,s_iptr movl %eax,s_memp #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx movl s_memp,%edi call eptopd #STPOP movl s_fpsp,%eax addl $s_stk,%eax movb $3,10(%eax) addb $32,s_fpsp ret fistpl: #pop into 64-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 eptoli movl %eax,(%esi) movl %edx,4(%esi) #STPOPq movb $3,10(%edi) addb $32,s_fpsp ret fstswax_: #status word -> ax call stfpsp movw h_stat,%ax movw %ax,s_ax(%ebp) ret fsincos_: #make ST into sin(ST), push cos(ST) #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx call reduct pushl %edi #STPUSH xchgl %edi,%ebx movl s_fpsp,%ebx subb $32,%bl xchgl %edi,%ebx cmpb $3,s_stk+10(%edi) jz LL2 call stackof LL2: movl %edi,s_fpsp addl $s_stk,%edi #PUTEP movl %eax,(%edi) movl %edx,4(%edi) movl %ecx,8(%edi) popl %edi testl $0x30000,%ecx jnz sco11 pushl %ebx call epsin popl %ebx #PUTEP movl %eax,(%edi) movl %edx,4(%edi) movl %ecx,8(%edi) #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx call epcos sco9: #PUTEP movl %eax,(%edi) movl %edx,4(%edi) movl %ecx,8(%edi) ret sco11: testl $0x50000,%ecx jz sco9 #PUTEP movl %eax,(%edi) movl %edx,4(%edi) movl %ecx,8(%edi) movl $0x3fff,%ecx movl $0x80000000,%edx xorl %eax,%eax #STTOP movl s_fpsp,%edi addl $s_stk,%edi jmp sco9 fsin_: #make ST into sin(ST) #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx call reduct testl $0x30000,%ecx jnz sin9 call epsin sin9: #PUTEP movl %eax,(%edi) movl %edx,4(%edi) movl %ecx,8(%edi) ret fcos_: #make ST into cos(ST) #STTOP movl s_fpsp,%edi addl $s_stk,%edi #GETEP movl (%edi),%eax movl 4(%edi),%edx movl 8(%edi),%ecx call reduct testl $0x30000,%ecx jnz cos11 call epcos cos9: #PUTEP movl %eax,(%edi) movl %edx,4(%edi) movl %ecx,8(%edi) ret cos11: testl $0x50000,%ecx jz cos9 movl $0x3fff,%ecx movl $0x80000000,%edx xorl %eax,%eax jmp cos9 NONE_: #SAVEIN movl %esi,s_iptr ret # stack overflow handlerstackof: orw $stacko,h_stat #stack overflow call exproc orb $2,h_stat+1 movl $0x80027fff,%ecx movl $0xc0000000,%edx xorl %eax,%eax subb $32,s_fpsp movl s_fpsp,%ebx addl $s_stk,%ebx movl %eax,(%ebx) movl %edx,4(%ebx) movl %ecx,8(%ebx) ret # store floating-point stack pointer into the status wordstfpsp: movb s_fpsp,%al shrb $2,%al movb h_stat+1,%ah andb $0x0c7,%ah orb %ah,%al movb %al,h_stat+1 ret #intrn endp#emuseg ends# END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -