1: / fp1 -- floating point simulator 2: 3: rti = 2 4: bpt = 3 5: 6: m.ext = 200 / long mode bit 7: m.lngi = 100 / long integer mode 8: 9: .globl fptrap 10: .globl ac0, ac1, ac2, ac3 11: 12: fptrap: 13: dec reenter 14: bge 1f 15: 4 / reentered! 16: 1: 17: mov (sp)+,spc 18: mov (sp)+,sps 19: mov r0,sr0 20: mov $sr1,r0 21: mov r1,(r0)+ 22: mov r2,(r0)+ 23: mov r3,(r0)+ 24: mov r4,(r0)+ 25: mov r5,(r0)+ 26: mov sp,(r0)+ 27: sub $8,sp / room for double push 28: mov (r0),r5 / pc 29: clr trapins 30: mov -(r5),r5 / trapped instruction 31: mov r5,r4 32: bic $7777,r4 33: cmp r4,$170000 34: beq 1f 35: jmp badins 36: 1: 37: bic $100000,fpsr / clear fp error 38: bic $170000,r5 39: mov r5,r4 40: bit $7000,r4 41: bne class3 42: bit $700,r4 43: bne class2 44: cmp r4,$12 45: blos 1f 46: jmp badins 47: 1: 48: asl r4 49: jmp *1f(r4) 50: 51: .data 52: 1: 53: i.cfcc / 170000 54: i.setf / 170001 55: i.seti / 170002 56: badins 57: badins 58: badins 59: badins 60: badins 61: badins 62: i.setd / 170011 63: i.setl / 170012 64: .text 65: 66: class2: 67: cmp r5,$400 68: bge 1f 69: jsr r1,fsrc; mod0rx; mod242 70: br 2f 71: 1: 72: jsr r1,fsrc; mod0f; mod24f 73: 2: 74: mov r3,r5 75: asl r4 76: asl r4 77: clrb r4 78: swab r4 79: asl r4 80: jsr pc,*1f(r4) 81: jmp sret 82: 83: .data 84: 1: 85: badins / 1700xx 86: i.ldfps / 1701xx 87: i.stfps / 1702xx 88: badins / 1703xx - stst 89: i.clrx / 1704xx 90: i.tstx / 1705xx 91: i.absx / 1706xx 92: i.negx / 1707xx 93: .text 94: 95: class3: 96: cmp r5,$5000 97: blt 1f 98: mov r5,r2 99: clrb r2 100: cmp r2,$6400 101: blt 2f 102: sub $1400,r2 103: 2: 104: cmp r2,$5000 105: bne 2f 106: jsr r1,fsrc; mod0rx; mod242 107: br 3f 108: 2: 109: cmp r2,$5400 110: bne 2f 111: jsr r1,fsrc; mod0ra; mod24i 112: br 3f 113: 2: 114: jsr r1,fsrc; mod0f; mod24d 115: br 3f 116: 1: 117: jsr r1,fsrc; mod0f; mod24f 118: 3: 119: jsr pc,freg 120: mov r2,r5 121: clrb r4 122: swab r4 123: asl r4 124: jsr pc,*1f(r4) 125: br sret 126: 127: .data 128: 1: 129: badins / 1700xx 130: badins / 1704xx 131: i.mulx / 1710xx 132: i.modx / 1714xx 133: i.addx / 1720xx 134: i.ldx / 1724xx 135: i.subx / 1730xx 136: i.cmpx / 1734xx 137: i.stx / 1740xx 138: i.divx / 1744xx 139: i.stexp / 1750xx 140: i.stcxj / 1754xx 141: i.stcxy / 1760xx 142: i.ldexp / 1764xx 143: i.ldcjx / 1770xx 144: i.ldcyx / 1774xx 145: .text 146: 147: i.cfcc: 148: mov fpsr,r0 149: bic $!17,r0 150: mov r0,sps 151: br ret 152: 153: i.setf: 154: bic $m.ext,fpsr 155: br ret 156: 157: i.setd: 158: bis $m.ext,fpsr 159: br ret 160: 161: i.seti: 162: bic $m.lngi,fpsr 163: br ret 164: 165: i.setl: 166: bis $m.lngi,fpsr 167: br ret 168: 169: badins: 170: inc trapins 171: br ret 172: 173: sret: 174: mov $fpsr,r0 175: bic $17,(r0) 176: tst (r5) 177: bpl 1f 178: bis $10,(r0) 179: br ret 180: 1: 181: bne ret 182: bis $4,(r0) 183: 184: ret: 185: mov $sr1,r0 186: mov (r0)+,r1 187: mov (r0)+,r2 188: mov (r0)+,r3 189: mov (r0)+,r4 190: mov (r0)+,r5 191: mov (r0)+,sp 192: mov sr0,r0 193: mov sps,-(sp) 194: mov spc,-(sp) 195: tst trapins 196: bne 1f 197: inc reenter 198: rti 199: 1: 200: bpt 201: 202: freg: 203: mov r5,r2 204: bic $!300,r2 205: asr r2 206: asr r2 207: asr r2 208: add $ac0,r2 209: rts pc 210: 211: fsrc: 212: mov r5,r3 213: bic $!7,r3 / register 214: asl r3 215: add $sr0,r3 216: mov r5,r0 217: bic $!70,r0 / mode 218: asr r0 219: asr r0 220: jmp *1f(r0) 221: 222: .data 223: 1: 224: mod0 225: mod1 226: mod2 227: mod3 228: mod4 229: mod5 230: mod6 231: mod7 232: .text 233: 234: mod24f: 235: mov $4,r0 236: bit $m.ext,fpsr 237: beq 1f 238: add $4,r0 239: 1: 240: rts pc 241: 242: mod24d: 243: mov $8,r0 244: bit $m.ext,fpsr 245: beq 1f 246: sub $4,r0 247: 1: 248: rts pc 249: 250: mod242: 251: mov $2,r0 252: rts pc 253: 254: mod24i: 255: mov $2,r0 256: bit $m.lngi,fpsr 257: beq 1f 258: add $2,r0 259: 1: 260: rts pc 261: 262: mod0: 263: jmp *(r1)+ 264: 265: mod0f: 266: sub $sr0,r3 / get fp ac 267: cmp r3,$6*2 268: bhis badi1 269: asl r3 270: asl r3 271: add $ac0,r3 272: tst (r1)+ 273: rts r1 274: 275: mod0ra: 276: bit $m.lngi,fpsr 277: bne badi1 278: 279: mod0r: 280: cmp r3,$ssp 281: bhis badi1 282: mod0rx: 283: tst (r1)+ 284: rts r1 285: 286: mod1: 287: cmp r3,$spc 288: beq badi1 289: mov (r3),r3 290: br check 291: 292: mod2: 293: mov (r3),-(sp) 294: jsr pc,*2(r1) 295: cmp r3,$spc 296: bne 1f 297: mov $2,r0 298: mov *(r3),pctmp 299: mov $pctmp,(sp) 300: 1: 301: add r0,(r3) 302: mov (sp)+,r3 303: br check 304: 305: mod3: 306: mov *(r3),-(sp) 307: add $2,(r3) 308: mov (sp)+,r3 309: br check 310: 311: mod4: 312: cmp r3,$spc / test pc 313: beq badi1 314: jsr pc,*2(r1) 315: sub r0,(r3) 316: mov (r3),r3 317: br check 318: 319: mod5: 320: cmp r3,$spc 321: beq badi1 322: sub $2,(r3) 323: mov *(r3),r3 324: br check 325: 326: mod6: 327: mov *spc,-(sp) 328: add $2,spc 329: add (r3),(sp) 330: mov (sp)+,r3 331: br check 332: 333: mod7: 334: jsr r1,mod6; ..; .. 335: mov (r3),r3 336: br check 337: 338: badi1: 339: jmp badins 340: 341: check: 342: bit $1,r3 343: bne badi1 344: cmp (r1)+,(r1)+ 345: rts r1 346: 347: setab: 348: mov $asign,r0 349: jsr pc,seta 350: mov r3,r2 351: mov $bsign,r0 352: 353: seta: 354: clr (r0) 355: mov (r2)+,r1 356: mov r1,-(sp) 357: beq 1f 358: blt 2f 359: inc (r0)+ 360: br 3f 361: 2: 362: dec (r0)+ 363: 3: 364: bic $!177,r1 365: bis $200,r1 366: br 2f 367: 1: 368: clr (r0)+ 369: 2: 370: mov r1,(r0)+ 371: mov (r2)+,(r0)+ 372: bit $m.ext,fpsr 373: beq 2f 374: mov (r2)+,(r0)+ 375: mov (r2)+,(r0)+ 376: br 3f 377: 2: 378: clr (r0)+ 379: clr (r0)+ 380: 3: 381: mov (sp)+,r1 382: asl r1 383: clrb r1 384: swab r1 385: sub $200,r1 386: mov r1,(r0)+ / exp 387: rts pc 388: 389: norm: 390: mov $areg,r0 391: mov (r0)+,r1 392: mov r1,-(sp) 393: mov (r0)+,r2 394: bis r2,(sp) 395: mov (r0)+,r3 396: bis r3,(sp) 397: mov (r0)+,r4 398: bis r4,(sp)+ 399: bne 1f 400: clr asign 401: rts pc 402: 1: 403: bit $!377,r1 404: beq 1f 405: clc 406: ror r1 407: ror r2 408: ror r3 409: ror r4 410: inc (r0) 411: br 1b 412: 1: 413: bit $200,r1 414: bne 1f 415: asl r4 416: rol r3 417: rol r2 418: rol r1 419: dec (r0) 420: br 1b 421: 1: 422: mov r4,-(r0) 423: mov r3,-(r0) 424: mov r2,-(r0) 425: mov r1,-(r0) 426: rts pc