mirror of
https://github.com/holub/mame
synced 2025-06-06 04:43:45 +03:00
hp64k: slot selection & lower 32k RAM added (working?)
This commit is contained in:
parent
6360c43ba7
commit
da5de0d3d9
@ -30,7 +30,7 @@ class hp64k_state : public driver_device
|
|||||||
public:
|
public:
|
||||||
hp64k_state(const machine_config &mconfig, device_type type, const char *tag);
|
hp64k_state(const machine_config &mconfig, device_type type, const char *tag);
|
||||||
|
|
||||||
//virtual void driver_start();
|
virtual void driver_start();
|
||||||
//virtual void machine_start();
|
//virtual void machine_start();
|
||||||
virtual void video_start();
|
virtual void video_start();
|
||||||
virtual void machine_reset();
|
virtual void machine_reset();
|
||||||
@ -54,6 +54,10 @@ public:
|
|||||||
TIMER_DEVICE_CALLBACK_MEMBER(hp64k_line_sync);
|
TIMER_DEVICE_CALLBACK_MEMBER(hp64k_line_sync);
|
||||||
DECLARE_READ16_MEMBER(hp64k_deltat_r);
|
DECLARE_READ16_MEMBER(hp64k_deltat_r);
|
||||||
DECLARE_WRITE16_MEMBER(hp64k_deltat_w);
|
DECLARE_WRITE16_MEMBER(hp64k_deltat_w);
|
||||||
|
|
||||||
|
DECLARE_READ16_MEMBER(hp64k_slot_r);
|
||||||
|
DECLARE_WRITE16_MEMBER(hp64k_slot_w);
|
||||||
|
DECLARE_WRITE16_MEMBER(hp64k_slot_sel_w);
|
||||||
private:
|
private:
|
||||||
required_device<hp_5061_3011_cpu_device> m_cpu;
|
required_device<hp_5061_3011_cpu_device> m_cpu;
|
||||||
required_device<i8275_device> m_crtc;
|
required_device<i8275_device> m_crtc;
|
||||||
@ -79,10 +83,16 @@ private:
|
|||||||
UINT8 m_kb_row_col;
|
UINT8 m_kb_row_col;
|
||||||
bool m_kb_scan_on;
|
bool m_kb_scan_on;
|
||||||
bool m_kb_pressed;
|
bool m_kb_pressed;
|
||||||
|
|
||||||
|
// Slot selection
|
||||||
|
std::vector<UINT16> m_low32k_ram;
|
||||||
|
UINT8 m_slot_select;
|
||||||
|
UINT8 m_slot_map;
|
||||||
};
|
};
|
||||||
|
|
||||||
static ADDRESS_MAP_START(cpu_mem_map , AS_PROGRAM , 16 , hp64k_state)
|
static ADDRESS_MAP_START(cpu_mem_map , AS_PROGRAM , 16 , hp64k_state)
|
||||||
AM_RANGE(0x0000 , 0x3fff) AM_ROM
|
AM_RANGE(0x0000 , 0x3fff) AM_ROM
|
||||||
|
AM_RANGE(0x4000 , 0x7fff) AM_READWRITE(hp64k_slot_r , hp64k_slot_w)
|
||||||
AM_RANGE(0x8000 , 0x8001) AM_WRITE(hp64k_crtc_w)
|
AM_RANGE(0x8000 , 0x8001) AM_WRITE(hp64k_crtc_w)
|
||||||
AM_RANGE(0x8002 , 0xffff) AM_RAM
|
AM_RANGE(0x8002 , 0xffff) AM_RAM
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
@ -97,6 +107,9 @@ static ADDRESS_MAP_START(cpu_io_map , AS_IO , 16 , hp64k_state)
|
|||||||
// PA = 7, IC = 2
|
// PA = 7, IC = 2
|
||||||
// Rear-panel switches
|
// Rear-panel switches
|
||||||
AM_RANGE(HP_MAKE_IOADDR(7 , 2) , HP_MAKE_IOADDR(7 , 2)) AM_READ(hp64k_rear_sw_r)
|
AM_RANGE(HP_MAKE_IOADDR(7 , 2) , HP_MAKE_IOADDR(7 , 2)) AM_READ(hp64k_rear_sw_r)
|
||||||
|
// PA = 10, IC = [0..3]
|
||||||
|
// Slot selection
|
||||||
|
AM_RANGE(HP_MAKE_IOADDR(10 , 0) , HP_MAKE_IOADDR(10 , 3)) AM_WRITE(hp64k_slot_sel_w)
|
||||||
// PA = 12, IC = [0..3]
|
// PA = 12, IC = [0..3]
|
||||||
// Interrupt mask
|
// Interrupt mask
|
||||||
AM_RANGE(HP_MAKE_IOADDR(12 , 0) , HP_MAKE_IOADDR(12 , 3)) AM_WRITE(hp64k_irl_mask_w)
|
AM_RANGE(HP_MAKE_IOADDR(12 , 0) , HP_MAKE_IOADDR(12 , 3)) AM_WRITE(hp64k_irl_mask_w)
|
||||||
@ -114,6 +127,12 @@ hp64k_state::hp64k_state(const machine_config &mconfig, device_type type, const
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hp64k_state::driver_start()
|
||||||
|
{
|
||||||
|
// 32kW for lower RAM
|
||||||
|
m_low32k_ram.resize(0x8000);
|
||||||
|
}
|
||||||
|
|
||||||
void hp64k_state::video_start()
|
void hp64k_state::video_start()
|
||||||
{
|
{
|
||||||
m_chargen = memregion("chargen")->base();
|
m_chargen = memregion("chargen")->base();
|
||||||
@ -129,6 +148,8 @@ void hp64k_state::machine_reset()
|
|||||||
memset(&m_kb_state[ 0 ] , 0 , sizeof(m_kb_state));
|
memset(&m_kb_state[ 0 ] , 0 , sizeof(m_kb_state));
|
||||||
m_kb_row_col = 0;
|
m_kb_row_col = 0;
|
||||||
m_kb_scan_on = true;
|
m_kb_scan_on = true;
|
||||||
|
m_slot_select = 0;
|
||||||
|
m_slot_map = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT8 hp64k_state::hp64k_crtc_filter(UINT8 data)
|
UINT8 hp64k_state::hp64k_crtc_filter(UINT8 data)
|
||||||
@ -304,6 +325,52 @@ WRITE16_MEMBER(hp64k_state::hp64k_deltat_w)
|
|||||||
hp64k_update_irl();
|
hp64k_update_irl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
READ16_MEMBER(hp64k_state::hp64k_slot_r)
|
||||||
|
{
|
||||||
|
if (m_slot_select == 0x0a) {
|
||||||
|
// Slot 10 selected
|
||||||
|
// On this (fictional) slot is allocated the lower 32KW of RAM
|
||||||
|
|
||||||
|
switch (m_slot_map) {
|
||||||
|
case 0:
|
||||||
|
// IDEN
|
||||||
|
// ID of 32KW RAM expansion
|
||||||
|
return 0x402;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
// MAP1
|
||||||
|
// Lower half of RAM
|
||||||
|
return m_low32k_ram[ offset ];
|
||||||
|
|
||||||
|
default:
|
||||||
|
// MAP2&3
|
||||||
|
// Upper half of RAM
|
||||||
|
return m_low32k_ram[ offset + 0x4000 ];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE16_MEMBER(hp64k_state::hp64k_slot_w)
|
||||||
|
{
|
||||||
|
if (m_slot_select == 0x0a && m_slot_map != 0) {
|
||||||
|
if (m_slot_map != 1) {
|
||||||
|
// MAP2&3
|
||||||
|
offset += 0x4000;
|
||||||
|
}
|
||||||
|
logerror("slot_w %u %04x %04x\n" , offset , data , mem_mask);
|
||||||
|
m_low32k_ram[ offset ] &= ~mem_mask;
|
||||||
|
m_low32k_ram[ offset ] |= (data & mem_mask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE16_MEMBER(hp64k_state::hp64k_slot_sel_w)
|
||||||
|
{
|
||||||
|
m_slot_map = (UINT8)offset;
|
||||||
|
m_slot_select = (UINT8)((data >> 8) & 0x3f);
|
||||||
|
}
|
||||||
|
|
||||||
static INPUT_PORTS_START(hp64k)
|
static INPUT_PORTS_START(hp64k)
|
||||||
// Keyboard is arranged in a 8 x 16 matrix. Of the 128 possible positions, only 77 are used.
|
// Keyboard is arranged in a 8 x 16 matrix. Of the 128 possible positions, only 77 are used.
|
||||||
// For key arrangement on the matrix, see [1] pg 334
|
// For key arrangement on the matrix, see [1] pg 334
|
||||||
|
Loading…
Reference in New Issue
Block a user