home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-11-01 | 6.0 KB | 309 lines | [TEXT/CWIE] |
-
- // Emulation des DAA-Befehls
- // ------------------------
-
- cmd_daa:
-
- do_info_daa
-
- // check for (ir+n) operand
- move.b -4(ip),d0
- cmp.b #0xFD,d0
- beq.s daaIY
- cmp.b #0xDD,d0
- bne.s daa00
- // possibly (IX+n)
- move.b -2(ip),core // offset
- ext.w core
- add.w IX,core
- bra.s daaXY
- // possibly (IY+n)
- daaIY: move.b -2(ip),core // offset
- ext.w core
- add.w IY,core
- daaXY: move.l core,a0
- move.b (a0),db // operand of (ir+n) operation
- move.b -3(ip),d0 // (hl) opcode
- cmp.b #0x86,d0
- beq add_daa // add a,(ir+n)
- cmp.b #0x8E,d0
- beq adc_daa // adc a,(ir+n)
- cmp.b #0x96,d0
- beq sub_daa // sub a,(ir+n)
- cmp.b #0x9E,d0
- beq sbc_daa // sbc a,(ir+n)
- // bra daa00 // invane...
-
-
- // get previous instruction and do first opcode check
- daa00: move.b -2(ip),db // previous instr. / operand of prev. instr.
- bpl.s daa30 // 0x00....0x7F: neg,cpl,inc,dec only
- cmp.b #0xa0,db
- bge daaXX // 0xA0....0xFF: no apropriate instructions
-
- // perform DAA correction on previous instruction
- sub.b #0x80,db
- // lea daa_tab(db.l*2),a0
- lea daa_tab(db.l),a0
- adda.l db,a0
- adda.w (a0),a0
- jmp (a0)
-
- daa_tab: dc.w daa80, daa81, daa82, daa83, daa84, daa85, daa86, daa87
- dc.w daa88, daa89, daa8a, daa8b, daa8c, daa8d, daa8e, daa8f
- dc.w daa90, daa91, daa92, daa93, daa94, daa95, daa96, daa97
- dc.w daa98, daa99, daa9a, daa9b, daa9c, daa9d, daa9e, daa9f
-
-
- // ----- neg a • cpl a • inc a • dec a -------------------------------------------
- // separate dispatcher to save space ...
-
- daa30: cmp.b #0x2f,db
- beq.s daa2f
- cmp.b #0x3c,db
- beq.s daa3c
- cmp.b #0x3d,db
- beq.s daa3d
- cmp.b #0x44,db
- beq.s daa44
- // bra daaXX
-
-
- // ----- No proper instruction code at location ip-2 --------------------------------
- // assume it's an operand to instruction at location ip-3
-
- daaXX: move.b -3(ip),d0 // get opcode
- move.b -2(ip),db // operand
- cmp.b #0xC6,d0
- beq add_daa // add a,n
- cmp.b #0xCE,d0
- beq adc_daa // adc a,n
- cmp.b #0xD6,d0
- beq sub_daa // sub a,n
- cmp.b #0xDE,d0
- beq sbc_daa // sbc a,n
- bra exit_illinstr1 // unable to perform DAA correction!
-
-
- daa2f: // cpl a
- not.b a // zurück
- moveq #1,d0
- lsr #1,d0 // Z setzen, X setzen
- nbcd.b a // BCD operation durchführen
- bra.s daaxit
-
- daa3c: // inc a
- subq.b #1,a // zurück
- moveq #1,d1 // BCD: 1
- sub d0,d0 // clear Z und X
- abcd.b d1,a // BCD Operation
- bra.s daaxit
-
- daa3d: // dec a
- addq.b #1,a // zurück
- moveq #1,d1 // BCD: 1
- sub d0,d0 // clear Z und X
- sbcd.b d1,a // BCD Operation
- bra.s daaxit
-
- daa44: // 0xED44: neg a
- cmp.b #0xED,-3(ip)
- bne.s daaXX
- neg.b a // binär operation rückgängig machen
- sub d0,d0 // Z setzen, X löschen
- nbcd.b a // BCD operation durchführen
- bra.s daaxit
-
-
- // ----- add a,r -------------------------------------------------------
- // Das Register wird wieder abgezogen und dann mit abcd addiert
-
- daa80: // add a,b
- move.b RB,db
- add_daa: sub.b db,a // zurück
- sub d0,d0 // clear Z und X
- abcd.b db,a // BCD again
- // exit with flag register update
- daaxit: move ccr,f // flags from last operation
- daaxit2: bclr #1,f // assume: PO
- btst #1,(logflags,a.w)
- beq nxtcmnd // PO
- bset #1,f // PE
- m_next
-
- daa81: // add a,c
- move.b RC,db
- bra.s add_daa
-
- daa82: // add a,d
- move.b RD,db
- bra.s add_daa
-
- daa83: // add a,e
- move.b RE,db
- bra.s add_daa
-
- daa84: // add a,h
- move.b RH,db
- bra.s add_daa
-
- daa85: // add a,l
- move.b RL,db
- bra.s add_daa
-
- daa86: // add a,(hl)
- movea.l AHL,a0
- move.b (a0),db
- bra.s add_daa
-
- daa87: // add a,a
- lsr.b #1,f // altes Bit 7 -> X
- roxr.b #1,a // X -> Bit 7
- sub d0,d0 // Z setzen, X löschen
- abcd.b a,a // BCD again
- bra.s daaxit
-
-
- // ----- adc a,r -----------------------------------------------------
- // Das Register wird wieder subtrahiert und nachher mit abcd erneut addiert
- // Falls die untere Ziffer von Register a nicht $0 ist, wird dazu vorher
- // Register a decrementiert und das X Flag gesetzt
-
- daa88: // adc a,b
- move.b RB,db
- adc_daa: sub.b db,a
- moveq #0x0f,d0
- and.b a,d0 // lower digit
- beq.s adc0 // ziffer ist 0 -> don't dec & no CY
- subq.b #1,a // dec a
- moveq #1,d0 // -> set CY
- adc0: lsr.b #1,d0 // Z setzen, X setzen/löschen
- abcd.b db,a // BCD again
- bra.s daaxit
-
- daa89: // adc a,c
- move.b RC,db
- bra.s adc_daa
-
- daa8a: // adc a,d
- move.b RC,db
- bra.s adc_daa
-
- daa8b: // adc a,e
- move.b RC,db
- bra.s adc_daa
-
- daa8c: // adc a,h
- move.b RC,db
- bra.s adc_daa
-
- daa8d: // adc a,l
- move.b RC,db
- bra.s adc_daa
-
- daa8e: // adc a,(hl)
- movea.l AHL,a0
- move.b (a0),db
- bra.s adc_daa
-
- daa8f: // adc a,a
- lsr.b #1,f // altes Bit 7 -> X
- roxr.b #1,a // X -> Bit 7 und Bit 0 == altes CY -> X
- cmp d0,d0 // Z setzen und X bewahren
- abcd.b a,a // BCD again
- bra daaxit
-
-
- // ----- sub a,r ----------------------------------------------------
- // Das Register wird wieder addiert und dann mit sbcd subtrahiert
-
- daa90: // sub a,b
- move.b RB,db
- sub_daa: add.b db,a // zurück
- sub d0,d0 // clear Z und X
- sbcd.b db,a // BCD again
- bra daaxit
-
- daa91: // sub a,c
- move.b RC,db
- bra.s sub_daa
-
- daa92: // sub a,d
- move.b RD,db
- bra.s sub_daa
-
- daa93: // sub a,e
- move.b RE,db
- bra.s sub_daa
-
- daa94: // sub a,h
- move.b RH,db
- bra.s sub_daa
-
- daa95: // sub a,l
- move.b RL,db
- bra.s sub_daa
-
- daa96: // sub a,(hl)
- movea.l AHL,a0
- move.b (a0),db
- bra.s sub_daa
-
- daa97: // sub a,a
- bra daaxit2 // macht keinen unterschied !
-
-
- // ----- sbc a,r ----------------------------------------------------
- // Das Register wird wieder addiert und dann mit sbcd subtrahiert
-
- daa98: // sbc a,b
- move.b RB,db
- sbc_daa: add.b db,a // zurück
- moveq #0x0f,d0
- and.b a,d0
- beq.s sbc0 // SBCD mit CY=1
- moveq #0,d0
- bra.s sbc1 // SBCD mit CY=0
- sbc0: addq.b #1,a
- moveq #1,d0
- sbc1: lsr.b #1,d0 // Z setzen und X setzen/löschen
- sbcd db,a
- bra daaxit
-
- daa99: // sbc a,c
- move.b RC,db
- bra.s sbc_daa
-
- daa9a: // sbc a,d
- move.b RD,db
- bra.s sbc_daa
-
- daa9b: // sbc a,e
- move.b RE,db
- bra.s sbc_daa
-
- daa9c: // sbc a,h
- move.b RH,db
- bra.s sbc_daa
-
- daa9d: // sbc a,l
- move.b RL,db
- bra.s sbc_daa
-
- daa9e: // sbc a,(hl)
- movea.l AHL,a0
- move.b (a0),db
- bra.s sbc_daa
-
- daa9f: // sbc a,a
- tst.b a
- beq daaxit2 // null ist null
- move.b #0x99,a
- bra daaxit
-
-
-
-
-
-
-