summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu/cop400/410ops.c
diff options
context:
space:
mode:
author Curt Coder <curtcoder@mail.com>2008-04-02 14:36:50 +0000
committer Curt Coder <curtcoder@mail.com>2008-04-02 14:36:50 +0000
commit12589d9abd05aaec947239deb7e6454285a40d94 (patch)
tree9a9deb5ff0746425e0e35197a54cf26837c2d1c6 /src/emu/cpu/cop400/410ops.c
parent9c0447a59785552c64e778e0c5fe0af09941214b (diff)
More COP400 fixes:
- fixed serial timer - fixed clocks - fixed COP410 RMB3, XAD instructions - general cleanup
Diffstat (limited to 'src/emu/cpu/cop400/410ops.c')
-rw-r--r--src/emu/cpu/cop400/410ops.c319
1 files changed, 132 insertions, 187 deletions
diff --git a/src/emu/cpu/cop400/410ops.c b/src/emu/cpu/cop400/410ops.c
index 1aecfc99be1..3e1aeef34d3 100644
--- a/src/emu/cpu/cop400/410ops.c
+++ b/src/emu/cpu/cop400/410ops.c
@@ -33,9 +33,6 @@
#define skip R.skip
#define skipLBI R.skipLBI
-#define READ_M RAM_R(B)
-#define WRITE_M(VAL) RAM_W(B,VAL)
-
#define IN_G() IN(COP400_PORT_G)
#define IN_L() IN(COP400_PORT_L)
#define IN_SI() IN(COP400_PORT_SIO)
@@ -55,7 +52,7 @@
static TIMER_CALLBACK(cop410_serial_tick)
{
int cpunum = param;
-
+
cpuintrf_push_context(cpunum);
if (BIT(EN, 0))
@@ -69,11 +66,7 @@ static TIMER_CALLBACK(cop410_serial_tick)
if (R.last_si && !si)
{
SIO--;
-
- if (SIO == 0)
- {
- SIO = 15;
- }
+ SIO &= 0x0f;
}
R.last_si = si;
@@ -148,7 +141,7 @@ INSTRUCTION(illegal)
/*
Mnemonic: ASC
-
+
Hex Code: 30
Binary: 0 0 1 1 0 0 0 0
@@ -180,7 +173,7 @@ INSTRUCTION(asc)
/*
Mnemonic: ADD
-
+
Hex Code: 31
Binary: 0 0 1 1 0 0 0 1
@@ -192,13 +185,13 @@ INSTRUCTION(asc)
INSTRUCTION(add)
{
- A = (A + RAM_R(B)) & 0x0F;
+ A = (A + RAM_R(B)) & 0x0F;
}
/*
Mnemonic: AISC
-
+
Operand: y
Hex Code: 5-
Binary: 0 1 0 1 y3 y2 y1 y0
@@ -227,7 +220,7 @@ INSTRUCTION(aisc)
/*
Mnemonic: CLRA
-
+
Hex Code: 00
Binary: 0 0 0 0 0 0 0 0
@@ -245,7 +238,7 @@ INSTRUCTION(clra)
/*
Mnemonic: COMP
-
+
Hex Code: 40
Binary: 0 1 0 0 0 0 0 0
@@ -263,7 +256,7 @@ INSTRUCTION(comp)
/*
Mnemonic: NOP
-
+
Hex Code: 44
Binary: 0 1 0 0 0 1 0 0
@@ -279,7 +272,7 @@ INSTRUCTION(nop)
/*
Mnemonic: RC
-
+
Hex Code: 32
Binary: 0 0 1 1 0 0 1 0
@@ -297,7 +290,7 @@ INSTRUCTION(rc)
/*
Mnemonic: SC
-
+
Hex Code: 22
Binary: 0 0 1 0 0 0 1 0
@@ -315,19 +308,19 @@ INSTRUCTION(sc)
/*
Mnemonic: XOR
-
+
Hex Code: 02
Binary: 0 0 0 0 0 0 1 0
Data Flow: A ^ RAM(B) -> A
- Description:
+ Description: Exclusive-OR RAM with A
*/
INSTRUCTION(xor)
{
- A = RAM_R(B) ^ A;
+ A = A ^ RAM_R(B);
}
/* Transfer-of-Control Instructions */
@@ -335,7 +328,7 @@ INSTRUCTION(xor)
/*
Mnemonic: JID
-
+
Hex Code: FF
Binary: 1 1 1 1 1 1 1 1
@@ -347,14 +340,14 @@ INSTRUCTION(xor)
INSTRUCTION(jid)
{
- UINT16 addr = (PC & 0x300) | (A << 4) | READ_M;
+ UINT16 addr = (PC & 0x300) | (A << 4) | RAM_R(B);
PC = (PC & 0x300) | ROM(addr);
}
/*
Mnemonic: JMP
-
+
Operand: a
Hex Code: 6- --
Binary: 0 1 1 0 0 0 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0
@@ -367,13 +360,15 @@ INSTRUCTION(jid)
INSTRUCTION(jmp)
{
- PC = ((opcode & 0x03) << 8) | ROM(PC);
+ UINT16 a = ((opcode & 0x03) << 8) | ROM(PC);
+
+ PC = a;
}
/*
Mnemonic: JP
-
+
Operand: a
Hex Code: --
Binary: 1 a6 a5 a4 a3 a2 a1 a0
@@ -392,30 +387,31 @@ INSTRUCTION(jmp)
INSTRUCTION(jp)
{
- UINT8 op = ROM(prevPC);
+ UINT4 page = PC >> 6;
- if (((PC & 0x3E0) >= 0x80) && ((PC & 0x3E0) < 0x100)) //JP pages 2,3
+ if (page == 2 || page == 3)
+ {
+ UINT8 a = opcode & 0x7f;
+ PC = (PC & 0x380) | a;
+ }
+ else if ((opcode & 0xc0) == 0xc0)
{
- PC = (UINT16)((PC & 0x380) | (op & 0x7F));
+ UINT8 a = opcode & 0x3f;
+ PC = (PC & 0x3c0) | a;
}
else
{
- if ((op & 0xC0) == 0xC0) //JP other pages
- {
- PC = (UINT16)((PC & 0x3C0) | (op & 0x3F));
- }
- else //JSRP
- {
- PUSH((UINT16)(PC));
- PC = (UINT16)(0x80 | (op & 0x3F));
- }
+ // JSRP
+ UINT8 a = opcode & 0x3f;
+ PUSH(PC + 1);
+ PC = 0x80 | a;
}
}
/*
Mnemonic: JSR
-
+
Operand: a
Hex Code: 6- --
Binary: 0 1 1 0 1 0 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0
@@ -427,21 +423,18 @@ INSTRUCTION(jp)
*/
-INLINE void JSR(UINT8 a8)
+INSTRUCTION(jsr)
{
+ UINT16 a = ((opcode & 0x03) << 8) | ROM(PC);
+
PUSH(PC + 1);
- PC = (a8 << 8) | ROM(PC);
+ PC = a;
}
-INSTRUCTION(jsr0) { JSR(0); }
-INSTRUCTION(jsr1) { JSR(1); }
-INSTRUCTION(jsr2) { JSR(2); }
-INSTRUCTION(jsr3) { JSR(3); }
-
/*
Mnemonic: RET
-
+
Hex Code: 48
Binary: 0 1 0 0 1 0 0 0
@@ -459,7 +452,7 @@ INSTRUCTION(ret)
/*
Mnemonic: RETSK
-
+
Hex Code: 49
Binary: 0 1 0 0 1 0 0 1
@@ -482,7 +475,7 @@ INSTRUCTION(retsk)
/*
Mnemonic: CAMQ
-
+
Hex Code: 33 3C
Binary: 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 0
@@ -495,13 +488,13 @@ INSTRUCTION(retsk)
INSTRUCTION(camq)
{
- WRITE_Q((A << 4) | READ_M);
+ WRITE_Q((A << 4) | RAM_R(B));
}
/*
Mnemonic: LD
-
+
Operand: r
Hex Code: -5
Binary: 0 0 r1 r0 0 1 0 1
@@ -513,21 +506,18 @@ INSTRUCTION(camq)
*/
-INLINE void LD(UINT8 r)
+INSTRUCTION(ld)
{
+ UINT8 r = opcode & 0x30;
+
A = RAM_R(B);
- B = B ^ (r << 4);
+ B = B ^ r;
}
-INSTRUCTION(ld0) { LD(0); }
-INSTRUCTION(ld1) { LD(1); }
-INSTRUCTION(ld2) { LD(2); }
-INSTRUCTION(ld3) { LD(3); }
-
/*
Mnemonic: LQID
-
+
Hex Code: BF
Binary: 1 0 1 1 1 1 1 1
@@ -541,7 +531,7 @@ INSTRUCTION(ld3) { LD(3); }
INSTRUCTION(lqid)
{
PUSH(PC + 1);
- PC = (UINT16)((PC & 0x300) | (A << 4) | READ_M);
+ PC = (PC & 0x300) | (A << 4) | RAM_R(B);
WRITE_Q(ROM(PC));
POP();
}
@@ -549,7 +539,7 @@ INSTRUCTION(lqid)
/*
Mnemonic: RMB
-
+
Operand: 0
1
2
@@ -582,7 +572,7 @@ INSTRUCTION(rmb3) { RAM_W(B, RAM_R(B) & 0x7); }
/*
Mnemonic: SMB
-
+
Operand: 0
1
2
@@ -615,7 +605,7 @@ INSTRUCTION(smb3) { RAM_W(B, RAM_R(B) | 0x8); }
/*
Mnemonic: STII
-
+
Operand: y
Hex Code: 7-
Binary: 0 1 1 1 y3 y2 y1 y0
@@ -633,15 +623,15 @@ INSTRUCTION(stii)
UINT16 Bd;
RAM_W(B, y);
- Bd = (B & 0x0f) + 1;
- if (Bd > 15) Bd = 0;
+
+ Bd = ((B & 0x0f) + 1) & 0x0f;
B = (B & 0x30) + Bd;
}
/*
Mnemonic: X
-
+
Operand: r
Hex Code: -6
Binary: 0 0 r1 r0 0 1 1 0
@@ -655,24 +645,24 @@ INSTRUCTION(stii)
INSTRUCTION(x)
{
- UINT4 r = (opcode >> 4) & 0x03;
+ UINT4 r = opcode & 0x30;
UINT8 t = RAM_R(B);
RAM_W(B, A);
A = t;
- B = B ^ (r << 4);
+ B = B ^ r;
}
/*
Mnemonic: XAD
-
+
Operand: r,d
Hex Code: 23 --
Binary: 0 0 1 0 0 0 1 1 1 0 r1 r0 d3 d2 d1 d0
- Data Flow: RAM(r,d) -> A
+ Data Flow: RAM(r,d) <-> A
Description: Exchange A with RAM pointed to directly by r,d
@@ -680,16 +670,18 @@ INSTRUCTION(x)
INSTRUCTION(xad)
{
- UINT8 addr = ROM(PC++) & 0x3f;
+ UINT8 rd = opcode & 0x3f;
UINT8 t = A;
- A = RAM_R(addr);
- RAM_W(addr, t);
+
+ A = RAM_R(rd);
+
+ RAM_W(rd, t);
}
/*
Mnemonic: XDS
-
+
Operand: r
Hex Code: -7
Binary: 0 0 r1 r0 0 1 1 1
@@ -706,24 +698,25 @@ INSTRUCTION(xad)
INSTRUCTION(xds)
{
- UINT8 t, Bd, Br;
- UINT4 r = (opcode >> 4) & 0x03;
+ UINT8 t, Bd;
+ UINT4 r = opcode & 0x30;
t = RAM_R(B);
RAM_W(B, A);
A = t;
- Br = (UINT8)((B & 0x30) ^ (r << 4));
- Bd = (UINT8)((B & 0x0F) - 1);
- B = (UINT8)(Br | (Bd & 0x0F));
+ Bd = ((B & 0x0f) - 1) & 0x0f;
+ B = (B & 0x30) | Bd;
+
+ B = B ^ r;
- if (Bd == 0xFF) skip = 1;
+ if (Bd == 0x0f) skip = 1;
}
/*
Mnemonic: XIS
-
+
Operand: r
Hex Code: -4
Binary: 0 0 r1 r0 0 1 0 0
@@ -740,18 +733,19 @@ INSTRUCTION(xds)
INSTRUCTION(xis)
{
- UINT8 t, Bd, Br;
- UINT4 r = (opcode >> 4) & 0x03;
+ UINT8 t, Bd;
+ UINT4 r = opcode & 0x30;
t = RAM_R(B);
RAM_W(B, A);
A = t;
- Br = (UINT8)((B & 0x30) ^ (r << 4));
- Bd = (UINT8)((B & 0x0F) + 1);
- B = (UINT8)(Br | (Bd & 0x0F));
+ Bd = ((B & 0x0f) + 1) & 0x0f;
+ B = (B & 0x30) | Bd;
+
+ B = B ^ r;
- if (Bd == 0x10) skip = 1;
+ if (Bd == 0x00) skip = 1;
}
/* Register Reference Instructions */
@@ -759,7 +753,7 @@ INSTRUCTION(xis)
/*
Mnemonic: CAB
-
+
Hex Code: 50
Binary: 0 1 0 1 0 0 0 0 0
@@ -777,7 +771,7 @@ INSTRUCTION(cab)
/*
Mnemonic: CBA
-
+
Hex Code: 4E
Binary: 0 1 0 0 1 1 1 0
@@ -795,7 +789,7 @@ INSTRUCTION(cba)
/*
Mnemonic: LBI
-
+
Operand: r,d
Hex Code: --
33 --
@@ -811,84 +805,24 @@ INSTRUCTION(cba)
*/
-INLINE void LBI(UINT8 r, UINT8 d)
+INSTRUCTION(lbi)
{
- B = (r << 4) | d;
+ if (opcode & 0x80)
+ {
+ B = opcode & 0x3f;
+ }
+ else
+ {
+ B = (opcode & 0x30) | (((opcode & 0x0f) + 1) & 0x0f);
+ }
+
skipLBI = 1;
}
-INSTRUCTION(lbi0_0) { LBI(0,0); }
-INSTRUCTION(lbi0_1) { LBI(0,1); }
-INSTRUCTION(lbi0_2) { LBI(0,2); }
-INSTRUCTION(lbi0_3) { LBI(0,3); }
-INSTRUCTION(lbi0_4) { LBI(0,4); }
-INSTRUCTION(lbi0_5) { LBI(0,5); }
-INSTRUCTION(lbi0_6) { LBI(0,6); }
-INSTRUCTION(lbi0_7) { LBI(0,7); }
-INSTRUCTION(lbi0_8) { LBI(0,8); }
-INSTRUCTION(lbi0_9) { LBI(0,9); }
-INSTRUCTION(lbi0_10) { LBI(0,10); }
-INSTRUCTION(lbi0_11) { LBI(0,11); }
-INSTRUCTION(lbi0_12) { LBI(0,12); }
-INSTRUCTION(lbi0_13) { LBI(0,13); }
-INSTRUCTION(lbi0_14) { LBI(0,14); }
-INSTRUCTION(lbi0_15) { LBI(0,15); }
-
-INSTRUCTION(lbi1_0) { LBI(1,0); }
-INSTRUCTION(lbi1_1) { LBI(1,1); }
-INSTRUCTION(lbi1_2) { LBI(1,2); }
-INSTRUCTION(lbi1_3) { LBI(1,3); }
-INSTRUCTION(lbi1_4) { LBI(1,4); }
-INSTRUCTION(lbi1_5) { LBI(1,5); }
-INSTRUCTION(lbi1_6) { LBI(1,6); }
-INSTRUCTION(lbi1_7) { LBI(1,7); }
-INSTRUCTION(lbi1_8) { LBI(1,8); }
-INSTRUCTION(lbi1_9) { LBI(1,9); }
-INSTRUCTION(lbi1_10) { LBI(1,10); }
-INSTRUCTION(lbi1_11) { LBI(1,11); }
-INSTRUCTION(lbi1_12) { LBI(1,12); }
-INSTRUCTION(lbi1_13) { LBI(1,13); }
-INSTRUCTION(lbi1_14) { LBI(1,14); }
-INSTRUCTION(lbi1_15) { LBI(1,15); }
-
-INSTRUCTION(lbi2_0) { LBI(2,0); }
-INSTRUCTION(lbi2_1) { LBI(2,1); }
-INSTRUCTION(lbi2_2) { LBI(2,2); }
-INSTRUCTION(lbi2_3) { LBI(2,3); }
-INSTRUCTION(lbi2_4) { LBI(2,4); }
-INSTRUCTION(lbi2_5) { LBI(2,5); }
-INSTRUCTION(lbi2_6) { LBI(2,6); }
-INSTRUCTION(lbi2_7) { LBI(2,7); }
-INSTRUCTION(lbi2_8) { LBI(2,8); }
-INSTRUCTION(lbi2_9) { LBI(2,9); }
-INSTRUCTION(lbi2_10) { LBI(2,10); }
-INSTRUCTION(lbi2_11) { LBI(2,11); }
-INSTRUCTION(lbi2_12) { LBI(2,12); }
-INSTRUCTION(lbi2_13) { LBI(2,13); }
-INSTRUCTION(lbi2_14) { LBI(2,14); }
-INSTRUCTION(lbi2_15) { LBI(2,15); }
-
-INSTRUCTION(lbi3_0) { LBI(3,0); }
-INSTRUCTION(lbi3_1) { LBI(3,1); }
-INSTRUCTION(lbi3_2) { LBI(3,2); }
-INSTRUCTION(lbi3_3) { LBI(3,3); }
-INSTRUCTION(lbi3_4) { LBI(3,4); }
-INSTRUCTION(lbi3_5) { LBI(3,5); }
-INSTRUCTION(lbi3_6) { LBI(3,6); }
-INSTRUCTION(lbi3_7) { LBI(3,7); }
-INSTRUCTION(lbi3_8) { LBI(3,8); }
-INSTRUCTION(lbi3_9) { LBI(3,9); }
-INSTRUCTION(lbi3_10) { LBI(3,10); }
-INSTRUCTION(lbi3_11) { LBI(3,11); }
-INSTRUCTION(lbi3_12) { LBI(3,12); }
-INSTRUCTION(lbi3_13) { LBI(3,13); }
-INSTRUCTION(lbi3_14) { LBI(3,14); }
-INSTRUCTION(lbi3_15) { LBI(3,15); }
-
/*
Mnemonic: LEI
-
+
Operand: y
Hex Code: 33 6-
Binary: 0 0 1 1 0 0 1 1 0 1 1 0 y3 y2 y1 y0
@@ -916,7 +850,7 @@ INSTRUCTION(lei)
/*
Mnemonic: SKC
-
+
Hex Code: 20
Binary: 0 0 1 0 0 0 0 0
@@ -928,13 +862,13 @@ INSTRUCTION(lei)
INSTRUCTION(skc)
{
- if (C == 1) skip = 1;
+ if (C == 1) skip = 1;
}
/*
Mnemonic: SKE
-
+
Hex Code: 21
Binary: 0 0 1 0 0 0 0 1
@@ -952,7 +886,7 @@ INSTRUCTION(ske)
/*
Mnemonic: SKGZ
-
+
Hex Code: 33 21
Binary: 00 0 1 1 0 0 1 1 0 0 1 0 0 0 0 1
@@ -970,13 +904,13 @@ INSTRUCTION(skgz)
/*
Mnemonic: SKGBZ
-
+
Hex Code: 33 01
33 11
33 03
33 13
-
- Binary:
+
+ Binary:
Skip Conditions: G0 = 0
G1 = 0
@@ -987,21 +921,26 @@ INSTRUCTION(skgz)
*/
-INSTRUCTION(skgbz0) { if (!BIT(IN_G(), 0)) skip = 1; }
-INSTRUCTION(skgbz1) { if (!BIT(IN_G(), 1)) skip = 1; }
-INSTRUCTION(skgbz2) { if (!BIT(IN_G(), 2)) skip = 1; }
-INSTRUCTION(skgbz3) { if (!BIT(IN_G(), 3)) skip = 1; }
+INLINE void skgbz(int bit)
+{
+ if (!BIT(IN_G(), bit)) skip = 1;
+}
+
+INSTRUCTION(skgbz0) { skgbz(0); }
+INSTRUCTION(skgbz1) { skgbz(1); }
+INSTRUCTION(skgbz2) { skgbz(2); }
+INSTRUCTION(skgbz3) { skgbz(3); }
/*
Mnemonic: SKMBZ
-
+
Hex Code: 01
11
03
13
- Binary:
+ Binary:
Skip Conditions: RAM(B)0 = 0
RAM(B)0 = 1
@@ -1012,19 +951,24 @@ INSTRUCTION(skgbz3) { if (!BIT(IN_G(), 3)) skip = 1; }
*/
-INSTRUCTION(skmbz0) { if (!BIT(RAM_R(B), 0)) skip = 1; }
-INSTRUCTION(skmbz1) { if (!BIT(RAM_R(B), 1)) skip = 1; }
-INSTRUCTION(skmbz2) { if (!BIT(RAM_R(B), 2)) skip = 1; }
-INSTRUCTION(skmbz3) { if (!BIT(RAM_R(B), 3)) skip = 1; }
+INLINE void skmbz(int bit)
+{
+ if (!BIT(RAM_R(B), bit)) skip = 1;
+}
+
+INSTRUCTION(skmbz0) { skmbz(0); }
+INSTRUCTION(skmbz1) { skmbz(1); }
+INSTRUCTION(skmbz2) { skmbz(2); }
+INSTRUCTION(skmbz3) { skmbz(3); }
/* Input/Output Instructions */
/*
Mnemonic: ING
-
+
Hex Code: 33 2A
- Binary:
+ Binary:
Data Flow: G -> A
@@ -1040,9 +984,9 @@ INSTRUCTION(ing)
/*
Mnemonic: INL
-
+
Hex Code: 33 2E
- Binary:
+ Binary:
Data Flow: L7:4 -> RAM(B)
L3:0 -> A
@@ -1054,6 +998,7 @@ INSTRUCTION(ing)
INSTRUCTION(inl)
{
UINT8 L = IN_L();
+
RAM_W(B, L >> 4);
A = L & 0xF;
}
@@ -1061,9 +1006,9 @@ INSTRUCTION(inl)
/*
Mnemonic: OBD
-
+
Hex Code: 33 3E
- Binary:
+ Binary:
Data Flow: Bd -> D
@@ -1079,9 +1024,9 @@ INSTRUCTION(obd)
/*
Mnemonic: OMG
-
+
Hex Code: 33 3A
- Binary:
+ Binary:
Data Flow: RAM(B) -> G
@@ -1097,7 +1042,7 @@ INSTRUCTION(omg)
/*
Mnemonic: XAS
-
+
Hex Code: 4F
Binary: 0 1 0 0 1 1 1 1