+/ fp1 -- floating point simulator
+
+rti = 2
+bpt = 3
+
+m.ext = 200 / long mode bit
+m.lngi = 100 / long integer mode
+
+.globl fptrap
+.globl ac0, ac1, ac2, ac3
+
+fptrap:
+ dec reenter
+ bge 1f
+ 4 / reentered!
+1:
+ mov (sp)+,spc
+ mov (sp)+,sps
+ mov r0,sr0
+ mov $sr1,r0
+ mov r1,(r0)+
+ mov r2,(r0)+
+ mov r3,(r0)+
+ mov r4,(r0)+
+ mov r5,(r0)+
+ mov sp,(r0)+
+ mov (r0),r5 / pc
+ mov -(r5),r5 / trapped instruction
+
+again:
+ sub $8,sp / room for double push
+ clr trapins
+ mov r5,r4
+ bic $7777,r4
+ cmp r4,$170000
+ beq 1f
+ jmp badins
+1:
+ bic $100000,fpsr / clear fp error
+ bic $170000,r5
+ mov r5,r4
+ bit $7000,r4
+ bne class3
+ bit $700,r4
+ bne class2
+ cmp r4,$12
+ blos 1f
+ jmp badins
+1:
+ asl r4
+ jmp *1f(r4)
+
+ .data
+1:
+ i.cfcc / 170000
+ i.setf / 170001
+ i.seti / 170002
+ badins
+ badins
+ badins
+ badins
+ badins
+ badins
+ i.setd / 170011
+ i.setl / 170012
+ .text
+
+class2:
+ cmp r5,$400
+ bge 1f
+ jsr r1,fsrc; mod0rx; mod242
+ br 2f
+1:
+ jsr r1,fsrc; mod0f; mod24f
+2:
+ mov r3,r5
+ asl r4
+ asl r4
+ clrb r4
+ swab r4
+ asl r4
+ jsr pc,*1f(r4)
+ jmp sret
+
+ .data
+1:
+ badins / 1700xx
+ i.ldfps / 1701xx
+ i.stfps / 1702xx
+ badins / 1703xx - stst
+ i.clrx / 1704xx
+ i.tstx / 1705xx
+ i.absx / 1706xx
+ i.negx / 1707xx
+ .text
+
+class3:
+ cmp r5,$5000
+ blt 1f
+ mov r5,r2
+ clrb r2
+ cmp r2,$6400
+ blt 2f
+ sub $1400,r2
+2:
+ cmp r2,$5000
+ bne 2f
+ jsr r1,fsrc; mod0rx; mod242
+ br 3f
+2:
+ cmp r2,$5400
+ bne 2f
+ jsr r1,fsrc; mod0ra; mod24i
+ br 3f
+2:
+ jsr r1,fsrc; mod0f; mod24d
+ br 3f
+1:
+ jsr r1,fsrc; mod0f; mod24f
+3:
+ jsr pc,freg
+ mov r2,r5
+ clrb r4
+ swab r4
+ asl r4
+ jsr pc,*1f(r4)
+ br sret
+
+ .data
+1:
+ badins / 1700xx
+ badins / 1704xx
+ i.mulx / 1710xx
+ i.modx / 1714xx
+ i.addx / 1720xx
+ i.ldx / 1724xx
+ i.subx / 1730xx
+ i.cmpx / 1734xx
+ i.stx / 1740xx
+ i.divx / 1744xx
+ i.stexp / 1750xx
+ i.stcxj / 1754xx
+ i.stcxy / 1760xx
+ i.ldexp / 1764xx
+ i.ldcjx / 1770xx
+ i.ldcyx / 1774xx
+ .text
+
+i.cfcc:
+ mov fpsr,r0
+ bic $!17,r0
+ mov r0,sps
+ br ret
+
+i.setf:
+ bic $m.ext,fpsr
+ br ret
+
+i.setd:
+ bis $m.ext,fpsr
+ br ret
+
+i.seti:
+ bic $m.lngi,fpsr
+ br ret
+
+i.setl:
+ bis $m.lngi,fpsr
+ br ret
+
+badins:
+ inc trapins
+ br ret1
+
+sret:
+ mov $fpsr,r0
+ bic $17,(r0)
+ tstb 1(r5)
+ bpl 1f
+ bis $10,(r0)
+ br ret
+1:
+ bne ret
+ bis $4,(r0)
+
+ret:
+ mov ssp,sp
+ mov *spc,r5
+ cmp r5,$170000
+ blo ret1
+ add $2,spc
+ jbr again / if another fp, save trap
+
+ret1:
+ mov $sr1,r0
+ mov (r0)+,r1
+ mov (r0)+,r2
+ mov (r0)+,r3
+ mov (r0)+,r4
+ mov (r0)+,r5
+ mov (r0)+,sp
+ mov sr0,r0
+ mov sps,-(sp)
+ mov spc,-(sp)
+ tst trapins
+ bne 1f
+ inc reenter
+ rti
+1:
+ bpt
+
+freg:
+ mov r5,r2
+ bic $!300,r2
+ asr r2
+ asr r2
+ asr r2
+ add $ac0,r2
+ rts pc
+
+fsrc:
+ mov r5,r3
+ bic $!7,r3 / register
+ asl r3
+ add $sr0,r3
+ mov r5,r0
+ bic $!70,r0 / mode
+ asr r0
+ asr r0
+ jmp *1f(r0)
+
+ .data
+1:
+ mod0
+ mod1
+ mod2
+ mod3
+ mod4
+ mod5
+ mod6
+ mod7
+ .text
+
+mod24f:
+ mov $4,r0
+ bit $m.ext,fpsr
+ beq 1f
+ add $4,r0
+1:
+ rts pc
+
+mod24d:
+ mov $8,r0
+ bit $m.ext,fpsr
+ beq 1f
+ sub $4,r0
+1:
+ rts pc
+
+mod242:
+ mov $2,r0
+ rts pc
+
+mod24i:
+ mov $2,r0
+ bit $m.lngi,fpsr
+ beq 1f
+ add $2,r0
+1:
+ rts pc
+
+mod0:
+ jmp *(r1)+
+
+mod0f:
+ sub $sr0,r3 / get fp ac
+ cmp r3,$6*2
+ bhis badi1
+ asl r3
+ asl r3
+ add $ac0,r3
+ tst (r1)+
+ rts r1
+
+mod0ra:
+ bit $m.lngi,fpsr
+ bne badi1
+
+mod0r:
+ cmp r3,$ssp
+ bhis badi1
+mod0rx:
+ tst (r1)+
+ rts r1
+
+mod1:
+ cmp r3,$spc
+ beq badi1
+ mov (r3),r3
+ br check
+
+mod2:
+ mov (r3),-(sp)
+ jsr pc,*2(r1)
+ cmp r3,$spc
+ bne 1f
+ mov $2,r0
+ mov *(r3),pctmp
+ mov $pctmp,(sp)
+1:
+ add r0,(r3)
+ mov (sp)+,r3
+ br check
+
+mod3:
+ mov *(r3),-(sp)
+ add $2,(r3)
+ mov (sp)+,r3
+ br check
+
+mod4:
+ cmp r3,$spc / test pc
+ beq badi1
+ jsr pc,*2(r1)
+ sub r0,(r3)
+ mov (r3),r3
+ br check
+
+mod5:
+ cmp r3,$spc
+ beq badi1
+ sub $2,(r3)
+ mov *(r3),r3
+ br check
+
+mod6:
+ mov *spc,-(sp)
+ add $2,spc
+ add (r3),(sp)
+ mov (sp)+,r3
+ br check
+
+mod7:
+ jsr r1,mod6; ..; ..
+ mov (r3),r3
+ br check
+
+badi1:
+ jmp badins
+
+check:
+ bit $1,r3
+ bne badi1
+ cmp (r1)+,(r1)+
+ rts r1
+
+setab:
+ mov $asign,r0
+ jsr pc,seta
+ mov r3,r2
+ mov $bsign,r0
+
+seta:
+ clr (r0)
+ mov (r2)+,r1
+ mov r1,-(sp)
+ beq 1f
+ blt 2f
+ inc (r0)+
+ br 3f
+2:
+ dec (r0)+
+3:
+ bic $!177,r1
+ bis $200,r1
+ br 2f
+1:
+ clr (r0)+
+2:
+ mov r1,(r0)+
+ mov (r2)+,(r0)+
+ bit $m.ext,fpsr
+ beq 2f
+ mov (r2)+,(r0)+
+ mov (r2)+,(r0)+
+ br 3f
+2:
+ clr (r0)+
+ clr (r0)+
+3:
+ mov (sp)+,r1
+ asl r1
+ clrb r1
+ swab r1
+ sub $200,r1
+ mov r1,(r0)+ / exp
+ rts pc
+
+norm:
+ mov $areg,r0
+ mov (r0)+,r1
+ mov r1,-(sp)
+ mov (r0)+,r2
+ bis r2,(sp)
+ mov (r0)+,r3
+ bis r3,(sp)
+ mov (r0)+,r4
+ bis r4,(sp)+
+ bne 1f
+ clr asign
+ rts pc
+1:
+ bit $!377,r1
+ beq 1f
+ clc
+ ror r1
+ ror r2
+ ror r3
+ ror r4
+ inc (r0)
+ br 1b
+1:
+ bit $200,r1
+ bne 1f
+ asl r4
+ rol r3
+ rol r2
+ rol r1
+ dec (r0)
+ br 1b
+1:
+ mov r4,-(r0)
+ mov r3,-(r0)
+ mov r2,-(r0)
+ mov r1,-(r0)
+ rts pc
+