summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2013-01-04 13:18:27 +0000
committer Olivier Galibert <galibert@pobox.com>2013-01-04 13:18:27 +0000
commit2187a8afa73212d6807031e2120467f0a600f17f (patch)
treea5bb40598b53c18c417741dc3b2998bb1d433268 /src/emu/cpu
parente8738c6a899d8ad0ef5aa205041ca9735c04fd24 (diff)
(mess) D-110: Preliminary driver [Lord_Nightmare, O. Galibert]
Diffstat (limited to 'src/emu/cpu')
-rw-r--r--src/emu/cpu/mcs96/i8x9x.c4
-rw-r--r--src/emu/cpu/mcs96/i8xc196.h9
-rw-r--r--src/emu/cpu/mcs96/mcs96.c60
-rw-r--r--src/emu/cpu/mcs96/mcs96.h7
-rw-r--r--src/emu/cpu/mcs96/mcs96ops.lst64
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