diff options
author | 2013-01-04 13:18:27 +0000 | |
---|---|---|
committer | 2013-01-04 13:18:27 +0000 | |
commit | 2187a8afa73212d6807031e2120467f0a600f17f (patch) | |
tree | a5bb40598b53c18c417741dc3b2998bb1d433268 /src/emu/cpu | |
parent | e8738c6a899d8ad0ef5aa205041ca9735c04fd24 (diff) |
(mess) D-110: Preliminary driver [Lord_Nightmare, O. Galibert]
Diffstat (limited to 'src/emu/cpu')
-rw-r--r-- | src/emu/cpu/mcs96/i8x9x.c | 4 | ||||
-rw-r--r-- | src/emu/cpu/mcs96/i8xc196.h | 9 | ||||
-rw-r--r-- | src/emu/cpu/mcs96/mcs96.c | 60 | ||||
-rw-r--r-- | src/emu/cpu/mcs96/mcs96.h | 7 | ||||
-rw-r--r-- | src/emu/cpu/mcs96/mcs96ops.lst | 64 |
5 files changed, 134 insertions, 10 deletions
diff --git a/src/emu/cpu/mcs96/i8x9x.c b/src/emu/cpu/mcs96/i8x9x.c index 886f2da7887..74921d2aa34 100644 --- a/src/emu/cpu/mcs96/i8x9x.c +++ b/src/emu/cpu/mcs96/i8x9x.c @@ -81,7 +81,7 @@ void i8x9x_device::commit_hso_cam() { for(int i=0; i<8; i++) if(!hso_info[i].active) { - if(hso_command != 0x18) + if(hso_command != 0x18 && hso_command != 0x19) logerror("%s: hso cam %02x %04x in slot %d (%04x)\n", tag(), hso_command, hso_time, i, PPC); hso_info[i].active = true; hso_info[i].command = hso_command; @@ -347,7 +347,7 @@ void i8x9x_device::internal_update(UINT64 current_time) UINT16 t = hso_info[i].time; if(((cmd & 0x40) && t == current_timer2) || (!(cmd & 0x40) && t == current_timer1)) { - if(cmd != 0x18) + if(cmd != 0x18 && cmd != 0x19) logerror("%s: hso cam %02x %04x in slot %d triggered\n", tag(), cmd, t, i); trigger_cam(i, current_time); diff --git a/src/emu/cpu/mcs96/i8xc196.h b/src/emu/cpu/mcs96/i8xc196.h index de509ba0b7e..7a7fcd2b77d 100644 --- a/src/emu/cpu/mcs96/i8xc196.h +++ b/src/emu/cpu/mcs96/i8xc196.h @@ -61,13 +61,14 @@ public: #define O(o) void o ## _196_full(); void o ## _196_partial() O(bmov_direct_2); - O(cmpl_direct_2); O(bmovi_direct_2); - O(pop_indirect_1); - O(pop_indexed_1); + O(cmpl_direct_2); O(djnzw_rrel8); - O(pusha_none); O(idlpd_none); + O(pop_indexed_1); + O(pop_indirect_1); + O(popa_none); + O(pusha_none); #undef O }; diff --git a/src/emu/cpu/mcs96/mcs96.c b/src/emu/cpu/mcs96/mcs96.c index 849163fb2e3..224cd944e27 100644 --- a/src/emu/cpu/mcs96/mcs96.c +++ b/src/emu/cpu/mcs96/mcs96.c @@ -692,6 +692,66 @@ UINT16 mcs96_device::do_sub(UINT16 v1, UINT16 v2) return diff; } +UINT8 mcs96_device::do_addcb(UINT8 v1, UINT8 v2) +{ + UINT16 sum = v1+v2+(PSW & F_C ? 1 : 0); + PSW &= ~(F_Z|F_N|F_C|F_V); + if(!UINT8(sum)) + PSW |= F_Z; + else if(INT8(sum) < 0) + PSW |= F_N; + if(~(v1^v2) & (v1^sum) & 0x80) + PSW |= F_V|F_VT; + if(sum & 0xff00) + PSW |= F_C; + return sum; +} + +UINT16 mcs96_device::do_addc(UINT16 v1, UINT16 v2) +{ + UINT32 sum = v1+v2+(PSW & F_C ? 1 : 0); + PSW &= ~(F_Z|F_N|F_C|F_V); + if(!UINT16(sum)) + PSW |= F_Z; + else if(INT16(sum) < 0) + PSW |= F_N; + if(~(v1^v2) & (v1^sum) & 0x8000) + PSW |= F_V|F_VT; + if(sum & 0xffff0000) + PSW |= F_C; + return sum; +} + +UINT8 mcs96_device::do_subcb(UINT8 v1, UINT8 v2) +{ + UINT16 diff = v1 - v2 - (PSW & F_C ? 0 : 1); + PSW &= ~(F_N|F_V|F_Z|F_C); + if(!UINT8(diff)) + PSW |= F_Z; + else if(INT8(diff) < 0) + PSW |= F_N; + if((v1^v2) & (v1^diff) & 0x80) + PSW |= F_V; + if(!(diff & 0xff00)) + PSW |= F_C; + return diff; +} + +UINT16 mcs96_device::do_subc(UINT16 v1, UINT16 v2) +{ + UINT32 diff = v1 - v2 - (PSW & F_C ? 0 : 1); + PSW &= ~(F_N|F_V|F_Z|F_C); + if(!UINT16(diff)) + PSW |= F_Z; + else if(INT16(diff) < 0) + PSW |= F_N; + if((v1^v2) & (v1^diff) & 0x8000) + PSW |= F_V; + if(!(diff & 0xffff0000)) + PSW |= F_C; + return diff; +} + void mcs96_device::set_nz8(UINT8 v) { PSW &= ~(F_N|F_V|F_Z|F_C); diff --git a/src/emu/cpu/mcs96/mcs96.h b/src/emu/cpu/mcs96/mcs96.h index a1a1b0aa175..570a48f78a7 100644 --- a/src/emu/cpu/mcs96/mcs96.h +++ b/src/emu/cpu/mcs96/mcs96.h @@ -163,6 +163,11 @@ protected: UINT8 do_subb(UINT8 v1, UINT8 v2); UINT16 do_sub(UINT16 v1, UINT16 v2); + UINT8 do_addcb(UINT8 v1, UINT8 v2); + UINT16 do_addc(UINT16 v1, UINT16 v2); + UINT8 do_subcb(UINT8 v1, UINT8 v2); + UINT16 do_subc(UINT16 v1, UINT16 v2); + void set_nz8(UINT8 v); void set_nz16(UINT16 v); @@ -233,10 +238,8 @@ protected: O(or_direct_2); O(or_immed_2w); O(or_indexed_2); O(or_indirect_2); O(orb_direct_2); O(orb_immed_2b); O(orb_indexed_2); O(orb_indirect_2); O(pop_direct_1); O(pop_indexed_1); O(pop_indirect_1); - O(popa_none); O(popf_none); O(push_direct_1); O(push_immed_1w); O(push_indexed_1); O(push_indirect_1); - O(pusha_none); O(pushf_none); O(ret_none); O(rst_none); diff --git a/src/emu/cpu/mcs96/mcs96ops.lst b/src/emu/cpu/mcs96/mcs96ops.lst index bef886451f6..0eefa2e2d92 100644 --- a/src/emu/cpu/mcs96/mcs96ops.lst +++ b/src/emu/cpu/mcs96/mcs96ops.lst @@ -1218,7 +1218,7 @@ fe8f div indexed_2 9a cmpb indirect_2 TMP = any_r8(OP1); do_subb(reg_r8(OP2), TMP); - post_indirect 2 6 7 // +5 when external + post_indirect 1 6 7 // +5 when external 9b cmpb indexed_2 TMP = any_r8(OP1); @@ -1352,20 +1352,50 @@ a3 ld indexed_2 post_indexed 6 7 // +5 when external a4 addc direct_2 + TMP = reg_r16(OP1); + TMP = do_addc(reg_r16(OP2), TMP); + reg_w16(OP2, TMP); + next(4); a5 addc immed_2w + TMP = do_addc(reg_r16(OP2), OP1); + reg_w16(OP2, TMP); + next(5); a6 addc indirect_2 + TMP = any_r16(OP1); + TMP = do_addc(reg_r16(OP2), TMP); + reg_w16(OP2, TMP); + post_indirect 2 6 7 // +5 when external a7 addc indexed_2 + TMP = any_r16(OP1); + TMP = do_addc(reg_r16(OP2), TMP); + reg_w16(OP2, TMP); + post_indexed 6 7 // +5 when external a8 subc direct_2 + TMP = reg_r16(OP1); + TMP = do_subc(reg_r16(OP2), TMP); + reg_w16(OP2, TMP); + next(4); a9 subc immed_2w + TMP = do_subc(reg_r16(OP2), OP1); + reg_w16(OP2, TMP); + next(5); aa subc indirect_2 + TMP = any_r16(OP1); + TMP = do_subc(reg_r16(OP2), TMP); + reg_w16(OP2, TMP); + post_indirect 2 6 7 // +5 when external ab subc indexed_2 + TMP = any_r16(OP1); + TMP = do_subc(reg_r16(OP2), TMP); + reg_w16(OP2, TMP); + post_indexed 6 7 // +5 when external ac ldbze direct_2 reg_w16(OP2, UINT8(reg_r8(OP1))); @@ -1400,20 +1430,50 @@ b3 ldb indexed_2 post_indexed 6 7 // +5 when external b4 addcb direct_2 + TMP = reg_r8(OP1); + TMP = do_addcb(reg_r8(OP2), TMP); + reg_w8(OP2, TMP); + next(4); b5 addcb immed_2w + TMP = do_addcb(reg_r8(OP2), OP1); + reg_w8(OP2, TMP); + next(4); b6 addcb indirect_2 + TMP = any_r8(OP1); + TMP = do_addcb(reg_r8(OP2), TMP); + reg_w8(OP2, TMP); + post_indirect 1 6 7 // +5 when external b7 addcb indexed_2 + TMP = any_r8(OP1); + TMP = do_addcb(reg_r8(OP2), TMP); + reg_w8(OP2, TMP); + post_indexed 6 7 // +5 when external b8 subcb direct_2 + TMP = reg_r8(OP1); + TMP = do_subcb(reg_r8(OP2), TMP); + reg_w8(OP2, TMP); + next(4); b9 subcb immed_2w + TMP = do_subcb(reg_r8(OP2), OP1); + reg_w8(OP2, TMP); + next(4); ba subcb indirect_2 + TMP = any_r8(OP1); + TMP = do_subcb(reg_r8(OP2), TMP); + reg_w8(OP2, TMP); + post_indirect 1 6 7 // +5 when external bb subcb indexed_2 + TMP = any_r8(OP1); + TMP = do_subcb(reg_r8(OP2), TMP); + reg_w8(OP2, TMP); + post_indexed 6 7 // +5 when external bc ldbse direct_2 reg_w16(OP2, INT8(reg_r8(OP1))); @@ -1727,7 +1787,7 @@ f3 popf none f4 pusha none 196 -f5 popa none +f5 popa none 196 f6 idlpd none 196 |