diff options
| author | 2012-04-08 13:04:57 +0000 | |
|---|---|---|
| committer | 2012-04-08 13:04:57 +0000 | |
| commit | 8d66a9445a44da9438637aa17f3cd421564c8f5a (patch) | |
| tree | b509be0c219f1927350e6a4a5a1092c5b9e66bb3 /src/emu | |
| parent | 86b2abfdbb2bd494dc39da7beb015edc0dbe7835 (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.c | 15 | ||||
| -rw-r--r-- | src/emu/cpu/m68000/68307bus.h | 2 | ||||
| -rw-r--r-- | src/emu/cpu/m68000/68307ser.c | 47 | ||||
| -rw-r--r-- | src/emu/cpu/m68000/68307ser.h | 12 | ||||
| -rw-r--r-- | src/emu/cpu/m68000/68307sim.c | 96 | ||||
| -rw-r--r-- | src/emu/cpu/m68000/68307sim.h | 2 | ||||
| -rw-r--r-- | src/emu/cpu/m68000/68307tmu.c | 49 | ||||
| -rw-r--r-- | src/emu/cpu/m68000/m68000.h | 7 | ||||
| -rw-r--r-- | src/emu/cpu/m68000/m68kcpu.c | 48 | ||||
| -rw-r--r-- | src/emu/sound/ymz280b.c | 2 |
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); |
