home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-11-01 | 13.1 KB | 473 lines | [TEXT/CWIE] |
-
- /* ----- 0xCB Command Dispatcher -------------------------------------------------
- Z80 Emulator
- Copyright (C) 1994 G.Woigk
-
- This file is part of Mac Spectacle and it is free software
- See application.c for details
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- */
-
- cmd_CB:
-
- // ----- get next byte of instruction
- move.b (ip)+,db
-
-
- // ----- exact T cycle handling -------------------------------------
- more4 // most CB commands take up 8 (4+4) T cycles
- // only instructions (hl) take more
-
-
- // ----- increment r register ---------------------------------------
- #if EXACT_R
- addq.b #1,r
- #endif
-
-
- // ----- debugger related testings ----------------------------------
- #if CMD_PROFILE || cmd_firstuse
- movea.l cnt_cb,a0
- // addq.l #1,(a0,db.l*4)
- lsl #2,db
- addq.l #1,(a0,db.l)
- lsr #2,db
- #if cmd_firstuse
- bne.s cmdp2
- }; Do_1st_Instr ( ip-1 ); asm {
- cmdp2:
- #endif
- #endif
-
-
- // ----- execute instruction ----------------------------------------
- dc.w 0x41FB, 0x4A06 // lea *+$08(D4.l*2),A0
- adda.w (a0),a0
- jmp (a0)
-
- cb_tab: dc.w cb_00, cb_01, cb_02, cb_03, cb_04, cb_05, cb_06, cb_07
- dc.w cb_08, cb_09, cb_0a, cb_0b, cb_0c, cb_0d, cb_0e, cb_0f
- dc.w cb_10, cb_11, cb_12, cb_13, cb_14, cb_15, cb_16, cb_17
- dc.w cb_18, cb_19, cb_1a, cb_1b, cb_1c, cb_1d, cb_1e, cb_1f
- dc.w cb_20, cb_21, cb_22, cb_23, cb_24, cb_25, cb_26, cb_27
- dc.w cb_28, cb_29, cb_2a, cb_2b, cb_2c, cb_2d, cb_2e, cb_2f
- dc.w cb_30, cb_31, cb_32, cb_33, cb_34, cb_35, cb_36, cb_37
- dc.w cb_38, cb_39, cb_3a, cb_3b, cb_3c, cb_3d, cb_3e, cb_3f
- dc.w cb_40, cb_41, cb_42, cb_43, cb_44, cb_45, bit0hl, cb_47
- dc.w cb_48, cb_49, cb_4a, cb_4b, cb_4c, cb_4d, bit1hl, cb_4f
- dc.w cb_50, cb_51, cb_52, cb_53, cb_54, cb_55, bit2hl, cb_57
- dc.w cb_58, cb_59, cb_5a, cb_5b, cb_5c, cb_5d, bit3hl, cb_5f
- dc.w cb_60, cb_61, cb_62, cb_63, cb_64, cb_65, bit4hl, cb_67
- dc.w cb_68, cb_69, cb_6a, cb_6b, cb_6c, cb_6d, bit5hl, cb_6f
- dc.w cb_70, cb_71, cb_72, cb_73, cb_74, cb_75, bit6hl, cb_77
- dc.w cb_78, cb_79, cb_7a, cb_7b, cb_7c, cb_7d, bit7hl, cb_7f
- dc.w cb_80, cb_81, cb_82, cb_83, cb_84, cb_85, res0hl, cb_87
- dc.w cb_88, cb_89, cb_8a, cb_8b, cb_8c, cb_8d, res1hl, cb_8f
- dc.w cb_90, cb_91, cb_92, cb_93, cb_94, cb_95, res2hl, cb_97
- dc.w cb_98, cb_99, cb_9a, cb_9b, cb_9c, cb_9d, res3hl, cb_9f
- dc.w cb_a0, cb_a1, cb_a2, cb_a3, cb_a4, cb_a5, res4hl, cb_a7
- dc.w cb_a8, cb_a9, cb_aa, cb_ab, cb_ac, cb_ad, res5hl, cb_af
- dc.w cb_b0, cb_b1, cb_b2, cb_b3, cb_b4, cb_b5, res6hl, cb_b7
- dc.w cb_b8, cb_b9, cb_ba, cb_bb, cb_bc, cb_bd, res7hl, cb_bf
- dc.w cb_c0, cb_c1, cb_c2, cb_c3, cb_c4, cb_c5, set0hl, cb_c7
- dc.w cb_c8, cb_c9, cb_ca, cb_cb, cb_cc, cb_cd, set1hl, cb_cf
- dc.w cb_d0, cb_d1, cb_d2, cb_d3, cb_d4, cb_d5, set2hl, cb_d7
- dc.w cb_d8, cb_d9, cb_da, cb_db, cb_dc, cb_dd, set3hl, cb_df
- dc.w cb_e0, cb_e1, cb_e2, cb_e3, cb_e4, cb_e5, set4hl, cb_e7
- dc.w cb_e8, cb_e9, cb_ea, cb_eb, cb_ec, cb_ed, set5hl, cb_ef
- dc.w cb_f0, cb_f1, cb_f2, cb_f3, cb_f4, cb_f5, set6hl, cb_f7
- dc.w cb_f8, cb_f9, cb_fa, cb_fb, cb_fc, cb_fd, set7hl, cb_ff
-
-
- // -------------------------------------- rlc r -> %SZ---P-C ------------------
- cb_00: lea RB,a0; bra.s rlc
- cb_01: lea RC,a0; bra.s rlc
- cb_02: lea RD,a0; bra.s rlc
- cb_03: lea RE,a0; bra.s rlc
- cb_04: lea RH,a0; bra.s rlc
- cb_05: lea RL,a0
- rlc: move.b (a0),db
- rol.b #1,db
- move ccr,f // S, Z und C stimmen
- or.b (logflags,db.l),f // P hinzufügen
- move.b db,(a0)
- m_next
-
- cb_06: movea.l AHL,a0 // 15 T cycles: 4+4+7
- rlcx: more7 // rlc (hl)
- move.b (a0),db
- rol.b #1,db
- move ccr,f // S, Z und C stimmen
- or.b (logflags,db.l),f // P hinzufügen
- store_db
-
- cb_07: rol.b #1,a // rlc a
- move ccr,f
- or.b (logflags,a.w),f
- m_next
-
- // ---------------------------------- rrc r -------------------------
- cb_08: lea RB,a0; bra.s rrc
- cb_09: lea RC,a0; bra.s rrc
- cb_0a: lea RD,a0; bra.s rrc
- cb_0b: lea RE,a0; bra.s rrc
- cb_0c: lea RH,a0; bra.s rrc
- cb_0d: lea RL,a0
- rrc: move.b (a0),db
- ror.b #1,db
- move ccr,f // S, Z und C stimmen
- or.b (logflags,db.l),f // P hinzufügen
- move.b db,(a0)
- m_next
-
- cb_0e: move.l AHL,a0 // 15 T cycles: 4+4+7
- rrcx: more7 // rrc (hl)
- move.b (a0),db
- ror.b #1,db
- move ccr,f // S, Z und C stimmen
- or.b (logflags,db.l),f // P hinzufügen
- store_db
-
- cb_0f: ror.b #1,a // rrc a
- move ccr,f
- or.b (logflags,a.w),f
- m_next
-
- // -------------------------------------RL r --------------------
- cb_10: lea RB,a0; bra.s rlr
- cb_11: lea RC,a0; bra.s rlr
- cb_12: lea RD,a0; bra.s rlr
- cb_13: lea RE,a0; bra.s rlr
- cb_14: lea RH,a0; bra.s rlr
- cb_15: lea RL,a0
- rlr: move.b (a0),db
- lsr.b #1,f
- roxl.b #1,db
- move ccr,f
- or.b (logflags,db.l),f
- move.b db,(a0)
- m_next
-
- cb_16: move.l AHL,a0 // 15 T cycles: 4+4+7
- rlx: more7 // RL (hl)
- move.b (a0),db
- lsr.b #1,f
- roxl.b #1,db
- move ccr,f
- or.b (logflags,db.l),f
- store_db
-
- cb_17: lsr.b #1,f // RL a
- roxl.b #1,a
- move ccr,f
- or.b (logflags,a.w),f
- m_next
-
- // ---------------------------------------- rr r ------------------------------
- cb_18: lea RB,a0; bra.s rr
- cb_19: lea RC,a0; bra.s rr
- cb_1a: lea RD,a0; bra.s rr
- cb_1b: lea RE,a0; bra.s rr
- cb_1c: lea RH,a0; bra.s rr
- cb_1d: lea RL,a0
- rr: move.b (a0),db
- lsr.b #1,f
- roxr.b #1,db
- move ccr,f
- or.b (logflags,db.l),f
- move.b db,(a0)
- m_next
-
- cb_1e: movea.l AHL,a0
- rrx: more7 // rr (hl)
- move.b (a0),db
- lsr.b #1,f
- roxr.b #1,db
- move ccr,f
- or.b (logflags,db.l),f
- store_db
-
- cb_1f: lsr.b #1,f // rr a
- roxr.b #1,a
- move ccr,f
- or.b (logflags,a.w),f
- m_next
-
- // ------------------------------------------ sla r ---------------
- cb_20: lea RB,a0; bra.s sla
- cb_21: lea RC,a0; bra.s sla
- cb_22: lea RD,a0; bra.s sla
- cb_23: lea RE,a0; bra.s sla
- cb_24: lea RH,a0; bra.s sla
- cb_25: lea RL,a0
- sla: move.b (a0),db
- lsl.b #1,db
- move ccr,f
- or.b (logflags,db.l),f
- move.b db,(a0)
- m_next
-
- cb_26: movea.l AHL,a0
- slax: more7 // sla (hl)
- move.b (a0),db
- lsl.b #1,db
- move ccr,f
- or.b (logflags,db.l),f
- store_db
-
- cb_27: lsl.b #1,a // sla a
- move ccr,f
- or.b (logflags,a.w),f
- m_next
-
- // -------------------------------------- sra r --------------------------
- cb_28: lea RB,a0; bra.s sra
- cb_29: lea RC,a0; bra.s sra
- cb_2a: lea RD,a0; bra.s sra
- cb_2b: lea RE,a0; bra.s sra
- cb_2c: lea RH,a0; bra.s sra
- cb_2d: lea RL,a0
- sra: move.b (a0),db
- asr.b #1,db
- move ccr,f
- and.w #1,f
- or.b (logflags,db.l),f
- move.b db,(a0)
- m_next
-
- cb_2e: movea.l AHL,a0
- srax: more7 // sra (hl)
- move.b (a0),db
- asr.b #1,db
- move ccr,f
- and.w #1,f
- or.b (logflags,db.l),f
- store_db
-
- cb_2f: asr.b #1,a // sra a
- move ccr,f
- and.w #1,f
- or.b (logflags,a.w),f
- m_next
-
- // --------------------------------------- sll r (illegal) ------------------------
- cb_30: lea RB,a0; bra.s sll
- cb_31: lea RC,a0; bra.s sll
- cb_32: lea RD,a0; bra.s sll
- cb_33: lea RE,a0; bra.s sll
- cb_34: lea RH,a0; bra.s sll
- cb_35: lea RL,a0
- sll: move.b (a0),db
- or.b #0x10,ccr // set X
- roxl.b #1,db
- move ccr,f
- or.b (logflags,db.l),f
- move.b db,(a0)
- do_info_illegals2
- m_next
-
- cb_36: do_info_illegals2 // sll (hl)
- movea.l AHL,a0
- sllx: more7 // 15 T cycles: 4+4+7
- move.b (a0),db
- or.b #0x10,ccr // set X
- roxl.b #1,db
- move ccr,f
- or.b (logflags,db.l),f
- store_db
-
- cb_37: do_info_illegals2 // sll a
- or.b #0x10,ccr
- roxl.b #1,a
- move ccr,f
- or.b (logflags,a.w),f
- m_next
-
- // ---------------------------------------------- srl r ---------------------
- cb_38: lea RB,a0; bra.s srl
- cb_39: lea RC,a0; bra.s srl
- cb_3a: lea RD,a0; bra.s srl
- cb_3b: lea RE,a0; bra.s srl
- cb_3c: lea RH,a0; bra.s srl
- cb_3d: lea RL,a0
- srl: move.b (a0),db
- lsr.b #1,db
- move ccr,f
- or.b (logflags,db.l),f
- move.b db,(a0)
- m_next
-
- cb_3e: movea.l AHL,a0
- srlx: more7 // srl (hl)
- move.b (a0),db
- lsr.b #1,db
- move ccr,f
- or.b (logflags,db.l),f
- store_db
-
- cb_3f: lsr.b #1,a // srl a
- move ccr,f
- or.b (logflags,a.w),f
- m_next
-
-
- // ------------------------------------------- bit n, r --------------------
-
- #if exact_bit // then get S and V bit from target byte
- #define add_sv(R) and #1,f /* C */ ;\
- move.b R,db ;\
- moveq #0x0A,d1 /* S,V */;\
- lea m68flags,a1 ;\
- and.b (a1,db.l),d1 ;\
- add.b d1,f
- #else
- #define add_sv(R) and #1,f
- #endif
-
- #define bit(N,R) add_sv(R); ;\
- btst N,R ;\
- bne nxtcmnd ;\
- addq.b #4,f ;\
- m_next
-
-
- #if exact_xy_bit // then we must return via loop!
- #define bitx(N) more4; ;\
- add_sv((a0)); ;\
- move f,ccr ;\
- btst N,(a0) ;\
- move ccr,f ;\
- m_next
- #else
- #define bitx(N) more4; ;\
- add_sv((a0)); ;\
- btst N,(a0) ;\
- bne nxtcmnd ;\
- addq.b #4,f ;\
- m_next
- #endif
-
- // entry for (hl) // entry for (ir+dis)
- bit0hl: movea.l AHL,a0; bit0x: bitx(#0)
- bit1hl: movea.l AHL,a0; bit1x: bitx(#1)
- bit2hl: movea.l AHL,a0; bit2x: bitx(#2)
- bit3hl: movea.l AHL,a0; bit3x: bitx(#3)
- bit4hl: movea.l AHL,a0; bit4x: bitx(#4)
- bit5hl: movea.l AHL,a0; bit5x: bitx(#5)
- bit6hl: movea.l AHL,a0; bit6x: bitx(#6)
- bit7hl: movea.l AHL,a0; bit7x: bitx(#7)
-
- cb_40: bit(#0,RB) ; cb_41: bit(#0,RC); cb_42: bit(#0,RD); cb_43: bit(#0,RE)
- cb_44: bit(#0,RH) ; cb_45: bit(#0,RL); cb_47: bit(#0,a)
- cb_48: bit(#1,RB) ; cb_49: bit(#1,RC); cb_4a: bit(#1,RD) ; cb_4b: bit(#1,RE)
- cb_4c: bit(#1,RH) ; cb_4d: bit(#1,RL); cb_4f: bit(#1,a)
- cb_50: bit(#2,RB) ; cb_51: bit(#2,RC) ; cb_52: bit(#2,RD) ; cb_53: bit(#2,RE)
- cb_54: bit(#2,RH) ; cb_55: bit(#2,RL); cb_57: bit(#2,a)
- cb_58: bit(#3,RB) ; cb_59: bit(#3,RC) ; cb_5a: bit(#3,RD) ; cb_5b: bit(#3,RE)
- cb_5c: bit(#3,RH) ; cb_5d: bit(#3,RL); cb_5f: bit(#3,a)
- cb_60: bit(#4,RB) ; cb_61: bit(#4,RC); cb_62: bit(#4,RD) ; cb_63: bit(#4,RE)
- cb_64: bit(#4,RH) ; cb_65: bit(#4,RL); cb_67: bit(#4,a)
- cb_68: bit(#5,RB) ; cb_69: bit(#5,RC) ; cb_6a: bit(#5,RD) ; cb_6b: bit(#5,RE)
- cb_6c: bit(#5,RH) ; cb_6d: bit(#5,RL); cb_6f: bit(#5,a)
- cb_70: bit(#6,RB) ; cb_71: bit(#6,RC) ; cb_72: bit(#6,RD) ; cb_73: bit(#6,RE)
- cb_74: bit(#6,RH) ; cb_75: bit(#6,RL); cb_77: bit(#6,a)
- cb_78: bit(#7,RB) ; cb_79: bit(#7,RC) ; cb_7a: bit(#7,RD) ; cb_7b: bit(#7,RE)
- cb_7c: bit(#7,RH) ; cb_7d: bit(#7,RL); cb_7f: bit(#7,a)
-
-
- // ------------------------------------- res n,r -------------------------
-
- #define res(N,R) bclr N,R; m_next
-
- #if rom_protection
- #define resx(N) more7 ;\
- move.b (a0),db ;\
- bclr N,db ;\
- store_db
- #else
- #define resx(N) more7 ;\
- bclr N,(a0) ;\
- m_next
- #endif
-
- // entry for (hl) // entry for (ir+dis)
- res0hl: movea.l AHL,a0; res0x: resx(#0)
- res1hl: movea.l AHL,a0; res1x: resx(#1)
- res2hl: movea.l AHL,a0; res2x: resx(#2)
- res3hl: movea.l AHL,a0; res3x: resx(#3)
- res4hl: movea.l AHL,a0; res4x: resx(#4)
- res5hl: movea.l AHL,a0; res5x: resx(#5)
- res6hl: movea.l AHL,a0; res6x: resx(#6)
- res7hl: movea.l AHL,a0; res7x: resx(#7)
-
- cb_80: res(#0,RB); cb_81: res(#0,RC); cb_82: res(#0,RD); cb_83: res(#0,RE)
- cb_84: res(#0,RH); cb_85: res(#0,RL); cb_87: res(#0,a)
- cb_88: res(#1,RB); cb_89: res(#1,RC); cb_8a: res(#1,RD); cb_8b: res(#1,RE)
- cb_8c: res(#1,RH); cb_8d: res(#1,RL); cb_8f: res(#1,a)
- cb_90: res(#2,RB); cb_91: res(#2,RC); cb_92: res(#2,RD); cb_93: res(#2,RE)
- cb_94: res(#2,RH); cb_95: res(#2,RL); cb_97: res(#2,a)
- cb_98: res(#3,RB); cb_99: res(#3,RC); cb_9a: res(#3,RD); cb_9b: res(#3,RE)
- cb_9c: res(#3,RH); cb_9d: res(#3,RL); cb_9f: res(#3,a)
- cb_a0: res(#4,RB); cb_a1: res(#4,RC); cb_a2: res(#4,RD); cb_a3: res(#4,RE)
- cb_a4: res(#4,RH); cb_a5: res(#4,RL); cb_a7: res(#4,a)
- cb_a8: res(#5,RB); cb_a9: res(#5,RC); cb_aa: res(#5,RD); cb_ab: res(#5,RE)
- cb_ac: res(#5,RH); cb_ad: res(#5,RL); cb_af: res(#5,a)
- cb_b0: res(#6,RB); cb_b1: res(#6,RC); cb_b2: res(#6,RD); cb_b3: res(#6,RE)
- cb_b4: res(#6,RH); cb_b5: res(#6,RL); cb_b7: res(#6,a)
- cb_b8: res(#7,RB); cb_b9: res(#7,RC); cb_ba: res(#7,RD); cb_bb: res(#7,RE)
- cb_bc: res(#7,RH); cb_bd: res(#7,RL); cb_bf: res(#7,a)
-
-
- // -------------------------------------------- set N,R -------------------------
-
- #define set(N,R) bset N,R; m_next
-
- #if rom_protection
- #define setx(N) more7 ;\
- move.b (a0),db ;\
- bset N,db ;\
- store_db
- #else
- #define setx(N) more7 ;\
- bset N,(a0) ;\
- m_next
- #endif
-
- set0hl: movea.l AHL,a0; set0x: setx(#0)
- set1hl: movea.l AHL,a0; set1x: setx(#1)
- set2hl: movea.l AHL,a0; set2x: setx(#2)
- set3hl: movea.l AHL,a0; set3x: setx(#3)
- set4hl: movea.l AHL,a0; set4x: setx(#4)
- set5hl: movea.l AHL,a0; set5x: setx(#5)
- set6hl: movea.l AHL,a0; set6x: setx(#6)
- set7hl: movea.l AHL,a0; set7x: setx(#7)
-
- cb_c0: set(#0,RB); cb_c1: set(#0,RC); cb_c2: set(#0,RD); cb_c3: set(#0,RE)
- cb_c4: set(#0,RH); cb_c5: set(#0,RL); cb_c7: set(#0,a)
- cb_c8: set(#1,RB); cb_c9: set(#1,RC); cb_ca: set(#1,RD); cb_cb: set(#1,RE)
- cb_cc: set(#1,RH); cb_cd: set(#1,RL); cb_cf: set(#1,a)
- cb_d0: set(#2,RB); cb_d1: set(#2,RC); cb_d2: set(#2,RD); cb_d3: set(#2,RE)
- cb_d4: set(#2,RH); cb_d5: set(#2,RL); cb_d7: set(#2,a)
- cb_d8: set(#3,RB); cb_d9: set(#3,RC); cb_da: set(#3,RD); cb_db: set(#3,RE)
- cb_dc: set(#3,RH); cb_dd: set(#3,RL); cb_df: set(#3,a)
- cb_e0: set(#4,RB); cb_e1: set(#4,RC); cb_e2: set(#4,RD); cb_e3: set(#4,RE)
- cb_e4: set(#4,RH); cb_e5: set(#4,RL); cb_e7: set(#4,a)
- cb_e8: set(#5,RB); cb_e9: set(#5,RC); cb_ea: set(#5,RD); cb_eb: set(#5,RE)
- cb_ec: set(#5,RH); cb_ed: set(#5,RL); cb_ef: set(#5,a)
- cb_f0: set(#6,RB); cb_f1: set(#6,RC); cb_f2: set(#6,RD); cb_f3: set(#6,RE)
- cb_f4: set(#6,RH); cb_f5: set(#6,RL); cb_f7: set(#6,a)
- cb_f8: set(#7,RB); cb_f9: set(#7,RC); cb_fa: set(#7,RD); cb_fb: set(#7,RE)
- cb_fc: set(#7,RH); cb_fd: set(#7,RL); cb_ff: set(#7,a)
-
- #undef bit
- #undef bitx
- #undef set
- #undef setx
- #undef res
- #undef resx
- #undef add_sv
-
-