Skip to content

Commit 4a90f00

Browse files
committed
brainchild/pls1000.cpp: hookup key matrix and right buttons
1 parent 52322dd commit 4a90f00

File tree

1 file changed

+57
-16
lines changed

1 file changed

+57
-16
lines changed

src/mame/brainchild/pls1000.cpp

Lines changed: 57 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
// license:BSD-3-Clause
2-
// copyright-holders:
2+
// copyright-holders: Angelo Salese
33
/**************************************************************************************************
44
55
Brainchild PLS-1000 "Personal Learning System"
6+
BIOS (at least) "developed by Logix, Inc"
67
78
TODO:
8-
- I/O;
9-
- Stuck on cart loading;
9+
- Trace remaining I/Os;
10+
- Samples inputs thru the same irq 4 used for RTC cfr. PC=649a
11+
- How to enter test mode? There are strings in BIOS at 0x9690
1012
- DAC1BIT usage is assumed;
1113
1214
===================================================================================================
@@ -43,10 +45,12 @@ class pls1000_state : public driver_device
4345
, m_lcdctrl(*this, "lcdctrl")
4446
, m_screen(*this, "screen")
4547
, m_cart(*this, "cart")
46-
, m_in_portd(*this, "PORTD")
48+
, m_in_left(*this, "LEFT")
49+
, m_in_right(*this, "RIGHT")
4750
{ }
4851

4952
void pls1000(machine_config &config);
53+
DECLARE_INPUT_CHANGED_MEMBER(button_check);
5054

5155
protected:
5256
void main_map(address_map &map) ATTR_COLD;
@@ -56,10 +60,14 @@ class pls1000_state : public driver_device
5660
required_device<mc68328_lcd_device> m_lcdctrl;
5761
required_device<screen_device> m_screen;
5862
required_device<generic_slot_device> m_cart;
59-
required_ioport m_in_portd;
63+
required_ioport m_in_left;
64+
required_ioport m_in_right;
6065

6166
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
67+
template <unsigned N> void kbd_select_w(int state);
68+
u8 kbd_r();
6269

70+
u8 m_kbd_select;
6371
};
6472

6573
u32 pls1000_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
@@ -75,12 +83,34 @@ void pls1000_state::main_map(address_map &map)
7583
map(0x800000, 0x83ffff).r(m_cart, FUNC(generic_slot_device::read16_rom));
7684
}
7785

86+
u8 pls1000_state::kbd_r()
87+
{
88+
switch(m_kbd_select)
89+
{
90+
case 1:
91+
return m_in_left->read();
92+
case 2:
93+
return m_in_right->read();
94+
}
95+
96+
return m_in_left->read() | m_in_right->read();
97+
}
98+
99+
template <unsigned N>
100+
void pls1000_state::kbd_select_w(int state)
101+
{
102+
m_kbd_select &= ~(1 << N);
103+
if (state)
104+
m_kbd_select |= (1 << N);
105+
m_kbd_select &= 3;
106+
}
107+
78108
// two columns on console sides:
79109
// A-B-C-D-E then "Explain" in orange text on left side
80110
// page right-page left-scroll up-scroll down-asterisk (*) then "Menu" in orange text on right side
81111

82112
static INPUT_PORTS_START( pls1000 )
83-
PORT_START("PORTD")
113+
PORT_START("LEFT")
84114
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("A")
85115
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("B")
86116
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("C")
@@ -89,7 +119,14 @@ static INPUT_PORTS_START( pls1000 )
89119
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Explain")
90120
PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_UNUSED )
91121

92-
// TODO: right column
122+
PORT_START("RIGHT")
123+
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Page Right")
124+
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Page Left")
125+
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("Scroll Up")
126+
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("Scroll Down")
127+
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON11 ) PORT_NAME("*")
128+
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON12 ) PORT_NAME("Menu")
129+
PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_UNUSED )
93130
INPUT_PORTS_END
94131

95132
void pls1000_state::pls1000(machine_config &config)
@@ -98,16 +135,20 @@ void pls1000_state::pls1000(machine_config &config)
98135
MC68328(config, m_maincpu, 32768*506); // MC68328PV16VA
99136
m_maincpu->set_addrmap(AS_PROGRAM, &pls1000_state::main_map);
100137

101-
m_maincpu->in_port_d<0>().set_ioport(m_in_portd).bit(0);
102-
m_maincpu->in_port_d<1>().set_ioport(m_in_portd).bit(1);
103-
m_maincpu->in_port_d<2>().set_ioport(m_in_portd).bit(2);
104-
m_maincpu->in_port_d<3>().set_ioport(m_in_portd).bit(3);
105-
m_maincpu->in_port_d<4>().set_ioport(m_in_portd).bit(4);
106-
m_maincpu->in_port_d<5>().set_ioport(m_in_portd).bit(5);
107-
m_maincpu->in_port_d<6>().set_ioport(m_in_portd).bit(6);
108-
m_maincpu->in_port_d<7>().set_ioport(m_in_portd).bit(7);
138+
m_maincpu->in_port_d<0>().set(FUNC(pls1000_state::kbd_r)).bit(0);
139+
m_maincpu->in_port_d<1>().set(FUNC(pls1000_state::kbd_r)).bit(1);
140+
m_maincpu->in_port_d<2>().set(FUNC(pls1000_state::kbd_r)).bit(2);
141+
m_maincpu->in_port_d<3>().set(FUNC(pls1000_state::kbd_r)).bit(3);
142+
m_maincpu->in_port_d<4>().set(FUNC(pls1000_state::kbd_r)).bit(4);
143+
m_maincpu->in_port_d<5>().set(FUNC(pls1000_state::kbd_r)).bit(5);
144+
m_maincpu->in_port_d<6>().set(FUNC(pls1000_state::kbd_r)).bit(6);
145+
m_maincpu->in_port_d<7>().set(FUNC(pls1000_state::kbd_r)).bit(7);
146+
147+
// m_maincpu->in_port_f<2> used for something
148+
m_maincpu->in_port_f<3>().set_constant(0); // battery low if '1', checked periodically
109149

110-
// TODO: other I/O ports (J r/w at startup)
150+
m_maincpu->out_port_j<0>().set(FUNC(pls1000_state::kbd_select_w<0>));
151+
m_maincpu->out_port_j<1>().set(FUNC(pls1000_state::kbd_select_w<1>));
111152

112153
m_maincpu->out_flm().set(m_lcdctrl, FUNC(mc68328_lcd_device::flm_w));
113154
m_maincpu->out_llp().set(m_lcdctrl, FUNC(mc68328_lcd_device::llp_w));

0 commit comments

Comments
 (0)