Skip to content

Commit 7fc3536

Browse files
committed
Roland PG-1000: Complete driver implementation + internal layout
1 parent cc81e50 commit 7fc3536

File tree

9 files changed

+1448
-86
lines changed

9 files changed

+1448
-86
lines changed

src/devices/cpu/upd7810/upd7810.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -813,6 +813,12 @@ void upd7801_device::write_pc(uint8_t data)
813813
m_pc_out_cb(data);
814814
}
815815

816+
void upd7810_device::write_smh(uint8_t data)
817+
{
818+
if (!BIT(SMH, 2) && BIT(data, 2)) IRR |= INTFST;
819+
SMH = data;
820+
}
821+
816822
void upd7810_device::upd7810_take_irq()
817823
{
818824
uint16_t vector = 0;

src/devices/cpu/upd7810/upd7810.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ class upd7810_device : public cpu_device
202202
virtual void configure_ops();
203203
virtual uint8_t read_pc();
204204
virtual void write_pc(uint8_t data);
205+
void write_smh(uint8_t data);
205206

206207
static const struct opcode_s s_op48[256];
207208
static const struct opcode_s s_op4C[256];

src/devices/cpu/upd7810/upd7810_opcodes.cpp

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,7 +1013,7 @@ void upd7810_device::MOV_ANM_A()
10131013
/* 4d c9: 0100 1101 1100 1001 */
10141014
void upd7810_device::MOV_SMH_A()
10151015
{
1016-
SMH = A;
1016+
write_smh(A);
10171017
}
10181018

10191019
/* 4d ca: 0100 1101 1100 1010 */
@@ -4093,7 +4093,10 @@ void upd7810_device::MVI_ANM_xx()
40934093
/* 64 81: 0110 0100 1000 0001 xxxx xxxx */
40944094
void upd7810_device::MVI_SMH_xx()
40954095
{
4096-
RDOPARG( SMH );
4096+
uint8_t imm;
4097+
4098+
RDOPARG( imm );
4099+
write_smh(imm);
40974100
}
40984101

40994102
/* 64 83: 0110 0100 1000 0011 xxxx xxxx */
@@ -4125,7 +4128,7 @@ void upd7810_device::ANI_SMH_xx()
41254128
uint8_t imm;
41264129

41274130
RDOPARG( imm );
4128-
SMH &= imm;
4131+
write_smh(SMH & imm);
41294132
SET_Z(SMH);
41304133
}
41314134

@@ -4169,7 +4172,7 @@ void upd7810_device::XRI_SMH_xx()
41694172
uint8_t imm;
41704173

41714174
RDOPARG( imm );
4172-
SMH ^= imm;
4175+
write_smh(SMH ^ imm);
41734176
SET_Z(SMH);
41744177
}
41754178

@@ -4213,7 +4216,7 @@ void upd7810_device::ORI_SMH_xx()
42134216
uint8_t imm;
42144217

42154218
RDOPARG( imm );
4216-
SMH |= imm;
4219+
write_smh(SMH | imm);
42174220
SET_Z(SMH);
42184221
}
42194222

@@ -4263,7 +4266,7 @@ void upd7810_device::ADINC_SMH_xx()
42634266
tmp = SMH + imm;
42644267

42654268
ZHC_ADD( tmp, SMH, 0 );
4266-
SMH = tmp;
4269+
write_smh(tmp);
42674270
SKIP_NC;
42684271
}
42694272

@@ -4371,7 +4374,7 @@ void upd7810_device::SUINB_SMH_xx()
43714374
RDOPARG( imm );
43724375
tmp = SMH - imm;
43734376
ZHC_SUB( tmp, SMH, 0 );
4374-
SMH = tmp;
4377+
write_smh(tmp);
43754378
SKIP_NC;
43764379
}
43774380

@@ -4469,7 +4472,7 @@ void upd7810_device::ADI_SMH_xx()
44694472
tmp = SMH + imm;
44704473

44714474
ZHC_ADD( tmp, SMH, 0 );
4472-
SMH = tmp;
4475+
write_smh(tmp);
44734476
}
44744477

44754478
/* 64 c3: 0110 0100 1100 0011 xxxx xxxx */
@@ -4562,7 +4565,7 @@ void upd7810_device::ACI_SMH_xx()
45624565
tmp = SMH + imm + (PSW & CY);
45634566

45644567
ZHC_ADD( tmp, SMH, (PSW & CY) );
4565-
SMH = tmp;
4568+
write_smh(tmp);
45664569
}
45674570

45684571
/* 64 d3: 0110 0100 1101 0011 xxxx xxxx */
@@ -4653,7 +4656,7 @@ void upd7810_device::SUI_SMH_xx()
46534656
RDOPARG( imm );
46544657
tmp = SMH - imm;
46554658
ZHC_SUB( tmp, SMH, 0 );
4656-
SMH = tmp;
4659+
write_smh(tmp);
46574660
}
46584661

46594662
/* 64 e3: 0110 0100 1110 0011 xxxx xxxx */
@@ -4746,7 +4749,7 @@ void upd7810_device::SBI_SMH_xx()
47464749
RDOPARG( imm );
47474750
tmp = SMH - imm - (PSW & CY);
47484751
ZHC_SUB( tmp, SMH, (PSW & CY) );
4749-
SMH = tmp;
4752+
write_smh(tmp);
47504753
}
47514754

47524755
/* 64 f3: 0110 0100 1111 0011 xxxx xxxx */
@@ -8746,7 +8749,7 @@ void upd7810_device::SETB()
87468749
MKL |= (1 << bit);
87478750
break;
87488751
case 0x19: /* SMH */
8749-
SMH |= (1 << bit);
8752+
write_smh(SMH | (1 << bit));
87508753
break;
87518754
case 0x1b: /* EOM */
87528755
EOM |= (1 << bit);
@@ -8796,7 +8799,7 @@ void upd7810_device::CLR()
87968799
MKL &= ~(1 << bit);
87978800
break;
87988801
case 0x19: /* SMH */
8799-
SMH &= ~(1 << bit);
8802+
write_smh(SMH & ~(1 << bit));
88008803
break;
88018804
case 0x1b: /* EOM */
88028805
EOM &= ~(1 << bit);

0 commit comments

Comments
 (0)