11// license:BSD-3-Clause
2- // copyright-holders:
2+ // copyright-holders: Angelo Salese
33/* *************************************************************************************************
44
55Brainchild PLS-1000 "Personal Learning System"
6+ BIOS (at least) "developed by Logix, Inc"
67
78TODO:
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
5155protected:
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
6573u32 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
82112static 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 )
93130INPUT_PORTS_END
94131
95132void 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