summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2012-04-08 13:04:57 +0000
committer Angelo Salese <angelosa@users.noreply.github.com>2012-04-08 13:04:57 +0000
commit8d66a9445a44da9438637aa17f3cd421564c8f5a (patch)
treeb509be0c219f1927350e6a4a5a1092c5b9e66bb3 /src/emu
parent86b2abfdbb2bd494dc39da7beb015edc0dbe7835 (diff)
misc sc4/68307 updates + prelim peripheral hookups, allows most sc4 sets to run their sound rom checks
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/cpu/m68000/68307bus.c15
-rw-r--r--src/emu/cpu/m68000/68307bus.h2
-rw-r--r--src/emu/cpu/m68000/68307ser.c47
-rw-r--r--src/emu/cpu/m68000/68307ser.h12
-rw-r--r--src/emu/cpu/m68000/68307sim.c96
-rw-r--r--src/emu/cpu/m68000/68307sim.h2
-rw-r--r--src/emu/cpu/m68000/68307tmu.c49
-rw-r--r--src/emu/cpu/m68000/m68000.h7
-rw-r--r--src/emu/cpu/m68000/m68kcpu.c48
-rw-r--r--src/emu/sound/ymz280b.c2
10 files changed, 223 insertions, 57 deletions
diff --git a/src/emu/cpu/m68000/68307bus.c b/src/emu/cpu/m68000/68307bus.c
index 1cbb5dc1337..f1ec4925609 100644
--- a/src/emu/cpu/m68000/68307bus.c
+++ b/src/emu/cpu/m68000/68307bus.c
@@ -13,10 +13,21 @@ READ16_HANDLER( m68307_internal_mbus_r )
if (mbus)
{
int pc = cpu_get_pc(&space->device());
- logerror("%08x m68307_internal_mbus_r %08x, (%04x)\n", pc, offset*2,mem_mask);
+
+
+ switch (offset<<1)
+ {
+ case m68307BUS_MBSR:
+ logerror("%08x m68307_internal_mbus_r %08x, (%04x) (MBSR - Status Register)\n", pc, offset*2,mem_mask);
+ return space->machine().rand();
+
+ default:
+ logerror("%08x m68307_internal_mbus_r %08x, (%04x)\n", pc, offset*2,mem_mask);
+ return 0x0000;
+ }
}
- return 0x0000;
+ return 0xffff;
}
WRITE16_HANDLER( m68307_internal_mbus_w )
diff --git a/src/emu/cpu/m68000/68307bus.h b/src/emu/cpu/m68000/68307bus.h
index 20af5f7e65f..201aabe01f4 100644
--- a/src/emu/cpu/m68000/68307bus.h
+++ b/src/emu/cpu/m68000/68307bus.h
@@ -1,4 +1,6 @@
+#define m68307BUS_MBSR (0x06)
+
READ16_HANDLER( m68307_internal_mbus_r );
WRITE16_HANDLER( m68307_internal_mbus_w );
diff --git a/src/emu/cpu/m68000/68307ser.c b/src/emu/cpu/m68000/68307ser.c
index a7ff81b772a..4b11e027609 100644
--- a/src/emu/cpu/m68000/68307ser.c
+++ b/src/emu/cpu/m68000/68307ser.c
@@ -13,7 +13,25 @@ READ16_HANDLER( m68307_internal_serial_r )
if (serial)
{
int pc = cpu_get_pc(&space->device());
- logerror("%08x m68307_internal_serial_r %08x, (%04x)\n", pc, offset*2,mem_mask);
+
+ switch (offset<<1)
+ {
+ case m68307SER_USR_UCSR:
+ logerror("%08x m68307_internal_serial_r %08x, (%04x) (USR - Status Register)\n", pc, offset*2,mem_mask);
+ return space->machine().rand();
+
+ case m68307SER_URB_UTB:
+ logerror("%08x m68307_internal_serial_r %08x, (%04x) (URB - Recieve Buffer)\n", pc, offset*2,mem_mask);
+ return 0xff;//space->machine().rand();
+
+ case m68307SER_UISR_UIMR:
+ logerror("%08x m68307_internal_serial_r %08x, (%04x) (UISR - Interrupt Status Register)\n", pc, offset*2,mem_mask);
+ return space->machine().rand() & 0x87;
+
+ default:
+ logerror("%08x m68307_internal_serial_r %08x, (%04x)\n", pc, offset*2,mem_mask);
+ break;
+ }
}
return 0x0000;
@@ -25,10 +43,33 @@ WRITE16_HANDLER( m68307_internal_serial_w )
m68307_serial* serial = m68k->m68307SERIAL;
assert(serial != NULL);
+ int pc = cpu_get_pc(&space->device());
+
if (serial)
{
- int pc = cpu_get_pc(&space->device());
- logerror("%08x m68307_internal_serial_w %08x, %04x (%04x)\n", pc, offset*2,data,mem_mask);
+ switch (offset<<1)
+ {
+ case m68307SER_USR_UCSR:
+ logerror("%08x m68307_internal_serial_r %08x, (%04x) (UCSR - Clock Select Register)\n", pc, offset*2,mem_mask);
+ break;
+
+ case m68307SER_URB_UTB:
+ logerror("%08x m68307_internal_serial_w %08x, %04x (%04x) (UTB - Transmit Buffer)\n", pc, offset*2,data,mem_mask);
+ break;
+
+ case m68307SER_UISR_UIMR:
+ logerror("%08x m68307_internal_serial_w %08x, %04x (%04x) (UIMR - Interrupt Mask Register)\n", pc, offset*2,data,mem_mask);
+ break;
+
+ case m68307SER_UIVR:
+ logerror("%08x m68307_internal_serial_w %08x, %04x (%04x) (UIVR - Interrupt Vector Register)\n", pc, offset*2,data,mem_mask);
+ COMBINE_DATA(&serial->m_uivr);
+ break;
+
+ default:
+ logerror("%08x m68307_internal_serial_w %08x, %04x (%04x)\n", pc, offset*2,data,mem_mask);
+ }
+
}
}
diff --git a/src/emu/cpu/m68000/68307ser.h b/src/emu/cpu/m68000/68307ser.h
index fbcb13a7164..27fbbf33382 100644
--- a/src/emu/cpu/m68000/68307ser.h
+++ b/src/emu/cpu/m68000/68307ser.h
@@ -1,10 +1,20 @@
+#define m68307SER_USR_UCSR (0x02)
+#define m68307SER_URB_UTB (0x06)
+
+#define m68307SER_UISR_UIMR (0x0a)
+
+#define m68307SER_UIVR (0x18)
+
READ16_HANDLER( m68307_internal_serial_r );
WRITE16_HANDLER( m68307_internal_serial_w );
class m68307_serial
{
- public: void reset(void);
+ public:
+ void reset(void);
+ UINT16 m_uivr;
+
};
diff --git a/src/emu/cpu/m68000/68307sim.c b/src/emu/cpu/m68000/68307sim.c
index 413a3b958f3..32500eacc69 100644
--- a/src/emu/cpu/m68000/68307sim.c
+++ b/src/emu/cpu/m68000/68307sim.c
@@ -11,12 +11,16 @@ READ16_HANDLER( m68307_internal_sim_r )
assert(sim != NULL);
int pc = cpu_get_pc(&space->device());
- logerror("%08x m68307_internal_sim_r %08x, (%04x)\n", pc, offset*2,mem_mask);
if (sim)
{
switch (offset<<1)
{
+ case m68307SIM_PADAT: return sim->read_padat(space, mem_mask);
+ case m68307SIM_PBDAT: return sim->read_pbdat(space, mem_mask);
+
+ case m68307SIM_LICR2: return (sim->m_licr2);
+
case m68307SIM_BR0: return (sim->m_br[0]);
case m68307SIM_OR0: return (sim->m_or[0]);
case m68307SIM_BR1: return (sim->m_br[1]);
@@ -25,6 +29,11 @@ READ16_HANDLER( m68307_internal_sim_r )
case m68307SIM_OR2: return (sim->m_or[2]);
case m68307SIM_BR3: return (sim->m_br[3]);
case m68307SIM_OR3: return (sim->m_or[3]);
+
+ default:
+ logerror("%08x m68307_internal_sim_r %08x, (%04x)\n", pc, offset*2,mem_mask);
+ return 0xff;
+
}
}
@@ -32,11 +41,6 @@ READ16_HANDLER( m68307_internal_sim_r )
return 0x0000;
}
- m68307_porta_read_callback m_m68307_porta_r;
- m68307_porta_write_callback m_m68307_porta_w;
- m68307_portb_read_callback m_m68307_portb_r;
- m68307_portb_write_callback m_m68307_portb_w;
-
WRITE16_HANDLER( m68307_internal_sim_w )
{
m68ki_cpu_core *m68k = m68k_get_safe_token(&space->device());
@@ -145,6 +149,33 @@ void m68307_sim::write_paddr(UINT16 data, UINT16 mem_mask)
COMBINE_DATA(&m_paddr);
}
+
+UINT16 m68307_sim::read_padat(address_space *space, UINT16 mem_mask)
+{
+ int pc = cpu_get_pc(&space->device());
+ m68ki_cpu_core *m68k = m68k_get_safe_token(&space->device());
+
+ if (m68k->m_m68307_porta_r)
+ {
+ // for general purpose bits, if configured as 'output' then anything output gets latched
+ // and anything configured as input is read from the port
+ UINT8 outputbits = m_paddr;
+ UINT8 inputbits = ~m_paddr;
+ UINT8 indat = m68k->m_m68307_porta_r(space, 0) & inputbits;
+ UINT8 outdat = m_padat & outputbits;
+
+ // dedicated bits behave in a different way.. todo
+ UINT8 general_purpose_bits = ~m_pacnt;
+ return ((indat | outdat) & general_purpose_bits);
+ }
+ else
+ {
+ logerror("%08x m68307_internal_sim_r (%04x) (Port A (8-bit) Data Register - PADAT)\n", pc, mem_mask);
+ }
+ return 0xffff;
+}
+
+
void m68307_sim::write_padat(address_space *space, UINT16 data, UINT16 mem_mask)
{
int pc = cpu_get_pc(&space->device());
@@ -171,6 +202,32 @@ void m68307_sim::write_pbddr(UINT16 data, UINT16 mem_mask)
COMBINE_DATA(&m_pbddr);
}
+UINT16 m68307_sim::read_pbdat(address_space *space, UINT16 mem_mask)
+{
+ int pc = cpu_get_pc(&space->device());
+ m68ki_cpu_core *m68k = m68k_get_safe_token(&space->device());
+
+ if (m68k->m_m68307_portb_r)
+ {
+ // for general purpose bits, if configured as 'output' then anything output gets latched
+ // and anything configured as input is read from the port
+ UINT16 outputbits = m_pbddr;
+ UINT16 inputbits = ~m_pbddr;
+ UINT16 indat = m68k->m_m68307_portb_r(space, 0, mem_mask) & inputbits;
+ UINT16 outdat = m_pbdat & outputbits;
+
+ // dedicated bits behave in a different way.. todo
+ UINT16 general_purpose_bits = ~m_pbcnt;
+ return ((indat | outdat) & general_purpose_bits);
+ }
+ else
+ {
+ logerror("%08x m68307_internal_sim_r (%04x) (Port B (16-bit) Data Register - PBDAT)\n", pc, mem_mask);
+ }
+ return 0xffff;
+}
+
+
void m68307_sim::write_pbdat(address_space *space, UINT16 data, UINT16 mem_mask)
{
int pc = cpu_get_pc(&space->device());
@@ -206,17 +263,24 @@ void m68307_sim::write_licr1(UINT16 data, UINT16 mem_mask)
void m68307_sim::write_licr2(UINT16 data, UINT16 mem_mask)
{
COMBINE_DATA(&m_licr2);
- data = m_licr2;
- logerror("m_licr2 value %04x : Details :\n", data);
- logerror("int8ipl %01x\n", (data>>0)&7);
- logerror("pir8 %01x\n", (data>>3)&1);
- logerror("int7ipl %01x\n", (data>>4)&7);
- logerror("pir7 %01x\n", (data>>7)&1);
- logerror("int6ipl %01x\n", (data>>8)&7);
- logerror("pir6 %01x\n", (data>>11)&1);
- logerror("int5ipl %01x\n", (data>>12)&7);
- logerror("pir5 %01x\n", (data>>15)&1);
+ UINT16 newdata = m_licr2;
+ logerror("m_licr2 value %04x : Details :\n", newdata);
+ logerror("int8ipl %01x\n", (newdata>>0)&7);
+ logerror("pir8 %01x\n", (newdata>>3)&1);
+ logerror("int7ipl %01x\n", (newdata>>4)&7);
+ logerror("pir7 %01x\n", (newdata>>7)&1);
+ logerror("int6ipl %01x\n", (newdata>>8)&7);
+ logerror("pir6 %01x\n", (newdata>>11)&1);
+ logerror("int5ipl %01x\n", (newdata>>12)&7);
+ logerror("pir5 %01x\n", (newdata>>15)&1);
logerror("\n");
+
+ if (data & 0x0008) m_licr2 = m_licr2 & ~0x0008;
+ if (data & 0x0080) m_licr2 = m_licr2 & ~0x0080;
+ if (data & 0x0800) m_licr2 = m_licr2 & ~0x0800;
+ if (data & 0x8000) m_licr2 = m_licr2 & ~0x8000;
+
+
}
diff --git a/src/emu/cpu/m68000/68307sim.h b/src/emu/cpu/m68000/68307sim.h
index 5b12bd77326..76b26391288 100644
--- a/src/emu/cpu/m68000/68307sim.h
+++ b/src/emu/cpu/m68000/68307sim.h
@@ -51,10 +51,12 @@ class m68307_sim
void write_pacnt(UINT16 data, UINT16 mem_mask);
void write_paddr(UINT16 data, UINT16 mem_mask);
+ UINT16 read_padat(address_space *space, UINT16 mem_mask);
void write_padat(address_space *space, UINT16 data, UINT16 mem_mask);
void write_pbcnt(UINT16 data, UINT16 mem_mask);
void write_pbddr(UINT16 data, UINT16 mem_mask);
+ UINT16 read_pbdat(address_space *space, UINT16 mem_mask);
void write_pbdat(address_space *space, UINT16 data, UINT16 mem_mask);
diff --git a/src/emu/cpu/m68000/68307tmu.c b/src/emu/cpu/m68000/68307tmu.c
index 96a7947f3ec..74370482e79 100644
--- a/src/emu/cpu/m68000/68307tmu.c
+++ b/src/emu/cpu/m68000/68307tmu.c
@@ -97,40 +97,32 @@ WRITE16_HANDLER( m68307_internal_timer_w )
}
}
-
-// printf("%d\n", (UINT32)m68k->device->total_cycles());
-
}
static TIMER_CALLBACK( m68307_timer0_callback )
{
-// printf("timer0\n");
-
legacy_cpu_device *dev = (legacy_cpu_device *)ptr;
m68ki_cpu_core* m68k = m68k_get_safe_token(dev);
-
-
-
- int prioritylevel = (m68k->m68307SIM->m_picr & 0x7000)>>12;
- int vector = (m68k->m68307SIM->m_pivr & 0x00f0) | 0xa;
-
-
-
m68307_single_timer* tptr = &m68k->m68307TIMER->singletimer[0];
tptr->regs[m68307TIMER_TMR] |= 0x2;
- m68307_set_interrupt(dev, prioritylevel, vector);
-
+
+ m68307_timer0_interrupt(dev);
- tptr->mametimer->adjust(m68k->device->cycles_to_attotime(100000));
+ tptr->mametimer->adjust(m68k->device->cycles_to_attotime(20000));
}
static TIMER_CALLBACK( m68307_timer1_callback )
{
-// int prioritylevel = (m68k->m68307SIM->m_picr & 0x0700)>>8;
-// int vector = (m68k->m68307SIM->m_pivr & 0x00f0) | 0xb;
+ legacy_cpu_device *dev = (legacy_cpu_device *)ptr;
+ m68ki_cpu_core* m68k = m68k_get_safe_token(dev);
+ m68307_single_timer* tptr = &m68k->m68307TIMER->singletimer[1];
+ tptr->regs[m68307TIMER_TMR] |= 0x2;
+
+ m68307_timer1_interrupt(dev);
+
+ tptr->mametimer->adjust(m68k->device->cycles_to_attotime(20000));
- printf("timer1\n");
}
static TIMER_CALLBACK( m68307_wd_timer_callback )
@@ -140,12 +132,6 @@ static TIMER_CALLBACK( m68307_wd_timer_callback )
void m68307_timer::init(legacy_cpu_device *device)
{
-
- //m68ki_cpu_core *m68k;
-
- //m68k = m68k_get_safe_token(device);
-
-
m68307_single_timer* tptr;
tptr = &singletimer[0];
@@ -163,21 +149,16 @@ void m68307_timer::init(legacy_cpu_device *device)
UINT16 m68307_timer::read_tcn(UINT16 mem_mask, int which)
{
-// return 0;
- return 0x411d;
-// return 0x3a98;
+ // we should return the current timer value by
+ // calculating what it should be based on the time
+ // since it was last set
+ return 0x3a98;
}
void m68307_timer::write_ter(UINT16 data, UINT16 mem_mask, int which)
{
-// m68ki_cpu_core* m68k = m68k_get_safe_token(parent);
m68307_single_timer* tptr = &singletimer[which];
-
-// UINT16 ter = tptr->regs[m68307TIMER_TMR;
if (data & 0x2) tptr->regs[m68307TIMER_TMR] &= ~0x2;
-
-// COMBINE_DATA(&tptr->regs[m68307TIMER_TMR]);
-
}
void m68307_timer::write_tmr(UINT16 data, UINT16 mem_mask, int which)
diff --git a/src/emu/cpu/m68000/m68000.h b/src/emu/cpu/m68000/m68000.h
index 3def75ccd79..90e870fe70f 100644
--- a/src/emu/cpu/m68000/m68000.h
+++ b/src/emu/cpu/m68000/m68000.h
@@ -143,6 +143,13 @@ UINT16 m68k_get_fc(device_t *device);
void m68307_set_port_callbacks(device_t *device, m68307_porta_read_callback porta_r, m68307_porta_write_callback m_m68307_porta_w, m68307_portb_read_callback portb_r, m68307_portb_write_callback m_m68307_portb_w);
UINT16 m68307_get_cs(device_t *device, offs_t address);
void m68307_set_interrupt(device_t *device, int level, int vector);
+void m68307_timer0_interrupt(legacy_cpu_device *cpudev);
+void m68307_timer1_interrupt(legacy_cpu_device *cpudev);
+void m68307_serial_interrupt(legacy_cpu_device *cpudev);
+void m68307_mbus_interrupt(legacy_cpu_device *cpudev);
+void m68307_licr2_interrupt(legacy_cpu_device *cpudev);
+
+
typedef int (*instruction_hook_t)(device_t *device, offs_t curpc);
void m68k_set_instruction_hook(device_t *device, instruction_hook_t ihook);
diff --git a/src/emu/cpu/m68000/m68kcpu.c b/src/emu/cpu/m68000/m68kcpu.c
index 2b763af8e5a..38c1750e134 100644
--- a/src/emu/cpu/m68000/m68kcpu.c
+++ b/src/emu/cpu/m68000/m68kcpu.c
@@ -1930,11 +1930,59 @@ CPU_GET_INFO( m68301 )
}
}
+
+
+
void m68307_set_interrupt(device_t *device, int level, int vector)
{
device_set_input_line_and_vector(device, level, HOLD_LINE, vector);
}
+void m68307_timer0_interrupt(legacy_cpu_device *cpudev)
+{
+ m68ki_cpu_core* m68k = m68k_get_safe_token(cpudev);
+ int prioritylevel = (m68k->m68307SIM->m_picr & 0x7000)>>12;
+ int vector = (m68k->m68307SIM->m_pivr & 0x00f0) | 0xa;
+ m68307_set_interrupt(cpudev, prioritylevel, vector);
+}
+
+void m68307_timer1_interrupt(legacy_cpu_device *cpudev)
+{
+ m68ki_cpu_core* m68k = m68k_get_safe_token(cpudev);
+ int prioritylevel = (m68k->m68307SIM->m_picr & 0x0700)>>8;
+ int vector = (m68k->m68307SIM->m_pivr & 0x00f0) | 0xb;
+ m68307_set_interrupt(cpudev, prioritylevel, vector);
+}
+
+void m68307_serial_interrupt(legacy_cpu_device *cpudev)
+{
+ m68ki_cpu_core* m68k = m68k_get_safe_token(cpudev);
+ int prioritylevel = (m68k->m68307SIM->m_picr & 0x0070)>>4;
+ int vector = (m68k->m68307SERIAL->m_uivr);
+ m68307_set_interrupt(cpudev, prioritylevel, vector);
+}
+
+void m68307_mbus_interrupt(legacy_cpu_device *cpudev)
+{
+ m68ki_cpu_core* m68k = m68k_get_safe_token(cpudev);
+ int prioritylevel = (m68k->m68307SIM->m_picr & 0x0007)>>0;
+ int vector = (m68k->m68307SIM->m_pivr & 0x00f0) | 0xd;
+ m68307_set_interrupt(cpudev, prioritylevel, vector);
+}
+
+void m68307_licr2_interrupt(legacy_cpu_device *cpudev)
+{
+ m68ki_cpu_core* m68k = m68k_get_safe_token(cpudev);
+ int prioritylevel = (m68k->m68307SIM->m_licr2 & 0x0007)>>0;
+ int vector = (m68k->m68307SIM->m_pivr & 0x00f0) | 0x9;
+ m68k->m68307SIM->m_licr2 |= 0x8;
+
+
+ m68307_set_interrupt(cpudev, prioritylevel, vector);
+}
+
+
+
static CPU_INIT( m68307 )
{
m68ki_cpu_core *m68k = m68k_get_safe_token(device);
diff --git a/src/emu/sound/ymz280b.c b/src/emu/sound/ymz280b.c
index fca87ea115c..37d956673d0 100644
--- a/src/emu/sound/ymz280b.c
+++ b/src/emu/sound/ymz280b.c
@@ -1017,7 +1017,7 @@ READ8_DEVICE_HANDLER( ymz280b_r )
{
/* read from external memory */
UINT8 result;
- if (chip->ext_ram_read.isnull())
+ if (!chip->ext_ram_read.isnull())
result = chip->ext_ram_read(chip->rom_readback_addr);
else
result = ymz280b_read_memory(chip->region_base, chip->region_size, chip->rom_readback_addr);