mirror of
https://github.com/holub/mame
synced 2025-07-03 09:06:08 +03:00
itt3030: better z80/i8741 comms, key matrix is still apparently wrong (nw)
This commit is contained in:
parent
69b3c067d3
commit
ec9913a33e
@ -239,7 +239,7 @@ public:
|
||||
|
||||
// devices
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<i8041_device> m_kbdmcu;
|
||||
required_device<i8741_device> m_kbdmcu;
|
||||
required_device<ram_device> m_ram;
|
||||
required_device<crt5027_device> m_crtc;
|
||||
required_device<address_map_bank_device> m_48kbank;
|
||||
@ -266,17 +266,15 @@ protected:
|
||||
public:
|
||||
|
||||
DECLARE_READ8_MEMBER(vsync_r);
|
||||
DECLARE_READ8_MEMBER(i8078_r);
|
||||
DECLARE_WRITE8_MEMBER(i8078_w);
|
||||
DECLARE_WRITE8_MEMBER( beep_w );
|
||||
DECLARE_WRITE8_MEMBER(bank_w);
|
||||
DECLARE_READ8_MEMBER(bankl_r);
|
||||
DECLARE_WRITE8_MEMBER(bankl_w);
|
||||
DECLARE_READ8_MEMBER(bankh_r);
|
||||
DECLARE_WRITE8_MEMBER(bankh_w);
|
||||
DECLARE_READ8_MEMBER(kbd_fifo_r);
|
||||
DECLARE_READ8_MEMBER(kbd_matrix_r);
|
||||
DECLARE_WRITE8_MEMBER(kbd_matrix_w);
|
||||
DECLARE_WRITE8_MEMBER(kbd_port2_w);
|
||||
DECLARE_READ8_MEMBER(fdc_r);
|
||||
DECLARE_WRITE8_MEMBER(fdc_w);
|
||||
DECLARE_READ8_MEMBER(fdc_stat_r);
|
||||
@ -290,7 +288,7 @@ public:
|
||||
private:
|
||||
UINT8 m_unk;
|
||||
UINT8 m_bank;
|
||||
UINT8 m_kbdrow, m_kbdcol, m_kbdclk, m_kbdread;
|
||||
UINT8 m_kbdrow, m_kbdcol, m_kbdclk, m_kbdread, m_kbdport2;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
floppy_image_device *m_curfloppy;
|
||||
@ -321,44 +319,6 @@ READ8_MEMBER(itt3030_state::vsync_r)
|
||||
return ret;
|
||||
}
|
||||
|
||||
// TODO: make this a correct device once we figure out how everything goes together in this system
|
||||
READ8_MEMBER(itt3030_state::i8078_r)
|
||||
{
|
||||
if (offset)
|
||||
{
|
||||
// printf("Read 8078 status\n");
|
||||
if (!m_keyskip)
|
||||
{
|
||||
return 0x10;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// printf("Read 8078 data\n");
|
||||
if (!m_keyskip)
|
||||
{
|
||||
m_keyskip = true; // don't keep reporting the 'b' key, just the once to trick the boot ROM
|
||||
return 0x0c;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(itt3030_state::i8078_w)
|
||||
{
|
||||
#if 0
|
||||
if (offset)
|
||||
{
|
||||
printf("%02x to 8078 command\n", data);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("%02x to 8078 data\n", data);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( itt3030_state::beep_w )
|
||||
{
|
||||
m_beep->set_state(data&0x32);
|
||||
@ -540,20 +500,14 @@ ADDRESS_MAP_END
|
||||
static ADDRESS_MAP_START( itt3030_io, AS_IO, 8, itt3030_state )
|
||||
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
||||
AM_RANGE(0x20, 0x26) AM_DEVREADWRITE("crt5027", crt5027_device, read, write)
|
||||
AM_RANGE(0x30, 0x31) AM_READWRITE(i8078_r, i8078_w)
|
||||
AM_RANGE(0x30, 0x31) AM_DEVREADWRITE("kbdmcu", i8741_device, upi41_master_r, upi41_master_w)
|
||||
AM_RANGE(0x32, 0x32) AM_WRITE(beep_w)
|
||||
AM_RANGE(0x35, 0x35) AM_READ(vsync_r)
|
||||
AM_RANGE(0x40, 0x40) AM_READ(kbd_fifo_r)
|
||||
AM_RANGE(0x50, 0x53) AM_READWRITE(fdc_r, fdc_w)
|
||||
AM_RANGE(0x54, 0x54) AM_READWRITE(fdc_stat_r, fdc_cmd_w)
|
||||
AM_RANGE(0xf6, 0xf6) AM_WRITE(bank_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
READ8_MEMBER(itt3030_state::kbd_fifo_r)
|
||||
{
|
||||
return m_kbdmcu->upi41_master_r(space, 0); // offset 0 is data, 1 is status
|
||||
}
|
||||
|
||||
READ8_MEMBER(itt3030_state::kbd_matrix_r)
|
||||
{
|
||||
return m_kbdread;
|
||||
@ -563,30 +517,38 @@ WRITE8_MEMBER(itt3030_state::kbd_matrix_w)
|
||||
{
|
||||
ioport_port *ports[16] = { m_keyrow1, m_keyrow2, m_keyrow3, m_keyrow4, m_keyrow5, m_keyrow6, m_keyrow7, m_keyrow8, m_keyrow9,
|
||||
m_keyrow10, m_keyrow11, m_keyrow12, m_keyrow13, m_keyrow14, m_keyrow15, m_keyrow16 };
|
||||
int col_masks[8] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80 };
|
||||
int rd_masks[8] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80 };
|
||||
int tmp_read;
|
||||
|
||||
m_kbdrow = data & 0xf;
|
||||
m_kbdcol = (data >> 4) & 0x7;
|
||||
m_kbdrow = data & 0x7; // keyboard input line multiplex
|
||||
m_kbdcol = (data >> 3) & 0xf; // keyboard col select
|
||||
|
||||
// printf("matrix_w: %02x (col %d row %d clk %d)\n", data, m_kbdcol, m_kbdrow, (data & 0x80) ? 1 : 0);
|
||||
|
||||
if ((data & 0x80) && (!m_kbdclk))
|
||||
{
|
||||
tmp_read = ports[m_kbdrow]->read() & col_masks[m_kbdcol];
|
||||
tmp_read = ports[m_kbdcol]->read() & rd_masks[m_kbdrow];
|
||||
m_kbdread = (tmp_read != 0) ? 1 : 0;
|
||||
}
|
||||
|
||||
m_kbdclk = (data & 0x80) ? 1 : 0;
|
||||
}
|
||||
|
||||
// Schematics say:
|
||||
// bit 2 is UPI-41 host IRQ to Z80
|
||||
WRITE8_MEMBER(itt3030_state::kbd_port2_w)
|
||||
{
|
||||
m_kbdport2 = data;
|
||||
}
|
||||
|
||||
// Schematics + i8278 datasheet says:
|
||||
// Port 1 goes to the keyboard matrix.
|
||||
// bits 0-3 select matrix rows, bits 4-6 choose column to read, bit 7 clocks the process (rising edge strobes the row, falling edge reads the data)
|
||||
// bits 0-2 select bit to read back, bits 3-6 choose column to read from, bit 7 clocks the process (rising edge strobes the row, falling edge reads the data)
|
||||
// T0 is the key matrix return
|
||||
// Port 2 bit 2 is shown as "IRQ" on the schematics, and the code does a lot with it as well (debug?)
|
||||
// pin 23 is the UPI-41 host IRQ line, it's unknown how it's connected to the Z80
|
||||
static ADDRESS_MAP_START( kbdmcu_io, AS_IO, 8, itt3030_state )
|
||||
AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(kbd_matrix_r)
|
||||
AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_WRITE(kbd_matrix_w)
|
||||
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_NOP AM_WRITENOP
|
||||
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_NOP AM_WRITE(kbd_port2_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static INPUT_PORTS_START( itt3030 )
|
||||
@ -755,7 +717,7 @@ static MACHINE_CONFIG_START( itt3030, itt3030_state )
|
||||
MCFG_CPU_PROGRAM_MAP(itt3030_map)
|
||||
MCFG_CPU_IO_MAP(itt3030_io)
|
||||
|
||||
MCFG_CPU_ADD("kbdmcu", I8041, XTAL_6MHz)
|
||||
MCFG_CPU_ADD("kbdmcu", I8741, XTAL_6MHz)
|
||||
MCFG_CPU_IO_MAP(kbdmcu_io)
|
||||
|
||||
/* video hardware */
|
||||
|
Loading…
Reference in New Issue
Block a user