trunk/src/mess/drivers/alphasma.c
| r20349 | r20350 | |
| 2 | 2 | |
| 3 | 3 | AlphaSmart Pro |
| 4 | 4 | |
| 5 | | 08/28/2012 Skeleton driver |
| 5 | driver by Sandro Ronco |
| 6 | 6 | |
| 7 | 7 | TODO: |
| 8 | | - define video HW capabilities |
| 9 | | - "Addr. Bus RAM error" string read, presumably memory mapped RAM at 0x8000 |
| 10 | | is actually a r/w bank register. |
| 8 | - finish keyboard mapping |
| 9 | - ADB and PS/2 |
| 10 | - charset ROM is wrong |
| 11 | 11 | |
| 12 | 12 | ****************************************************************************/ |
| 13 | 13 | |
| r20349 | r20350 | |
| 22 | 22 | alphasmart_state(const machine_config &mconfig, device_type type, const char *tag) |
| 23 | 23 | : driver_device(mconfig, type, tag), |
| 24 | 24 | m_maincpu(*this, "maincpu"), |
| 25 | | m_lcdc(*this, "hd44780"), |
| 25 | m_lcdc0(*this, "ks0066_0"), |
| 26 | m_lcdc1(*this, "ks0066_1"), |
| 26 | 27 | m_rambank(*this, "rambank") |
| 27 | 28 | { } |
| 28 | 29 | |
| 29 | 30 | required_device<cpu_device> m_maincpu; |
| 30 | | required_device<hd44780_device> m_lcdc; |
| 31 | required_device<hd44780_device> m_lcdc0; |
| 32 | required_device<hd44780_device> m_lcdc1; |
| 31 | 33 | required_memory_bank m_rambank; |
| 32 | 34 | |
| 33 | 35 | DECLARE_WRITE8_MEMBER(vram_w); |
| r20349 | r20350 | |
| 35 | 37 | virtual void machine_start(); |
| 36 | 38 | virtual void machine_reset(); |
| 37 | 39 | virtual void palette_init(); |
| 40 | virtual UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 38 | 41 | |
| 42 | DECLARE_INPUT_CHANGED_MEMBER(kb_irq); |
| 43 | DECLARE_READ8_MEMBER(kb_r); |
| 44 | DECLARE_WRITE8_MEMBER(kb_matrixl_w); |
| 45 | DECLARE_WRITE8_MEMBER(kb_matrixh_w); |
| 39 | 46 | DECLARE_READ8_MEMBER(port_a_r); |
| 40 | 47 | DECLARE_WRITE8_MEMBER(port_a_w); |
| 41 | 48 | DECLARE_READ8_MEMBER(port_d_r); |
| 42 | 49 | DECLARE_WRITE8_MEMBER(port_d_w); |
| 43 | 50 | |
| 44 | 51 | private: |
| 45 | | UINT8 m_port_a; |
| 52 | UINT8 m_matrix[2]; |
| 53 | UINT8 m_port_a; |
| 54 | UINT8 m_port_d; |
| 55 | bitmap_ind16 * m_tmp_bitmap; |
| 46 | 56 | }; |
| 47 | 57 | |
| 58 | INPUT_CHANGED_MEMBER(alphasmart_state::kb_irq) |
| 59 | { |
| 60 | m_maincpu->set_input_line(MC68HC11_IRQ_LINE, HOLD_LINE); |
| 61 | } |
| 62 | |
| 63 | READ8_MEMBER(alphasmart_state::kb_r) |
| 64 | { |
| 65 | static const char *const portnames[] = |
| 66 | { |
| 67 | "COL0", "COL1", "COL2", "COL3", "COL4", "COL5", "COL6", "COL7", |
| 68 | "COL8", "COL9", "COLA", "COLB", "COLC", "COLD", "COLE", "COLF" |
| 69 | }; |
| 70 | |
| 71 | UINT16 matrix = (m_matrix[1]<<8) | m_matrix[0]; |
| 72 | UINT8 data = 0xff; |
| 73 | |
| 74 | for(int i=0; i<16; i++) |
| 75 | if (!(matrix & (1<<i))) |
| 76 | data &= ioport(portnames[i])->read(); |
| 77 | |
| 78 | return data; |
| 79 | } |
| 80 | |
| 81 | WRITE8_MEMBER(alphasmart_state::kb_matrixl_w) |
| 82 | { |
| 83 | m_matrix[0] = data; |
| 84 | } |
| 85 | |
| 86 | WRITE8_MEMBER(alphasmart_state::kb_matrixh_w) |
| 87 | { |
| 88 | m_matrix[1] = data; |
| 89 | } |
| 90 | |
| 48 | 91 | READ8_MEMBER(alphasmart_state::port_a_r) |
| 49 | 92 | { |
| 50 | | return m_port_a; |
| 93 | return (m_port_a & 0xfd) | (ioport("BATTERY")->read() << 1); |
| 51 | 94 | } |
| 52 | 95 | |
| 53 | 96 | WRITE8_MEMBER(alphasmart_state::port_a_w) |
| 54 | 97 | { |
| 98 | if ((m_matrix[1] & 0x04)) |
| 99 | { |
| 100 | UINT8 lcdc_data = 0; |
| 101 | |
| 102 | if ((m_port_a ^ data) & 0x80) |
| 103 | { |
| 104 | if ((m_matrix[1] & 0x02)) |
| 105 | lcdc_data |= m_lcdc0->data_read(space, 0); |
| 106 | else |
| 107 | lcdc_data |= m_lcdc0->control_read(space, 0); |
| 108 | } |
| 109 | if ((m_port_a ^ data) & 0x20) |
| 110 | { |
| 111 | if ((m_matrix[1] & 0x02)) |
| 112 | lcdc_data |= m_lcdc1->data_read(space, 0); |
| 113 | else |
| 114 | lcdc_data |= m_lcdc1->control_read(space, 0); |
| 115 | } |
| 116 | |
| 117 | m_port_d = (m_port_d & 0xc3) | (lcdc_data>>2); |
| 118 | } |
| 119 | else |
| 120 | { |
| 121 | UINT8 lcdc_data = (m_port_d<<2) & 0xf0; |
| 122 | |
| 123 | if ((m_port_a ^ data) & data & 0x80) |
| 124 | { |
| 125 | if ((m_matrix[1] & 0x02)) |
| 126 | m_lcdc0->data_write(space, 0, lcdc_data); |
| 127 | else |
| 128 | m_lcdc0->control_write(space, 0, lcdc_data); |
| 129 | } |
| 130 | if ((m_port_a ^ data) & data & 0x20) |
| 131 | { |
| 132 | if ((m_matrix[1] & 0x02)) |
| 133 | m_lcdc1->data_write(space, 0, lcdc_data); |
| 134 | else |
| 135 | m_lcdc1->control_write(space, 0, lcdc_data); |
| 136 | } |
| 137 | } |
| 138 | |
| 55 | 139 | m_rambank->set_entry(((data>>3) & 0x01) | ((data>>4) & 0x02)); |
| 56 | 140 | m_port_a = data; |
| 57 | 141 | } |
| 58 | 142 | |
| 59 | 143 | READ8_MEMBER(alphasmart_state::port_d_r) |
| 60 | 144 | { |
| 61 | | return 0; |
| 145 | return m_port_d; |
| 62 | 146 | } |
| 63 | 147 | |
| 64 | 148 | WRITE8_MEMBER(alphasmart_state::port_d_w) |
| 65 | 149 | { |
| 66 | | |
| 150 | m_port_d = data; |
| 67 | 151 | } |
| 68 | 152 | |
| 69 | 153 | |
| 70 | 154 | static ADDRESS_MAP_START(alphasmart_mem, AS_PROGRAM, 8, alphasmart_state) |
| 71 | 155 | ADDRESS_MAP_UNMAP_HIGH |
| 72 | 156 | AM_RANGE( 0x0000, 0x7fff ) AM_RAMBANK("rambank") |
| 157 | AM_RANGE( 0x8000, 0x8000 ) AM_READWRITE(kb_r, kb_matrixh_w) |
| 158 | AM_RANGE( 0xc000, 0xc000 ) AM_WRITE(kb_matrixl_w) |
| 73 | 159 | AM_RANGE( 0x8000, 0xffff ) AM_ROM AM_REGION("maincpu", 0) |
| 74 | 160 | ADDRESS_MAP_END |
| 75 | 161 | |
| 76 | 162 | static ADDRESS_MAP_START(alphasmart_io, AS_IO, 8, alphasmart_state) |
| 77 | | // AM_RANGE(MC68HC11_IO_PORTA, MC68HC11_IO_PORTA) AM_DEVREADWRITE("hd44780", hd44780_device, control_read, control_write) |
| 78 | | // AM_RANGE(MC68HC11_IO_PORTD, MC68HC11_IO_PORTD) AM_DEVREADWRITE("hd44780", hd44780_device, data_read, data_write) |
| 79 | 163 | AM_RANGE( MC68HC11_IO_PORTA, MC68HC11_IO_PORTA ) AM_READWRITE(port_a_r, port_a_w) |
| 80 | 164 | AM_RANGE( MC68HC11_IO_PORTD, MC68HC11_IO_PORTD ) AM_READWRITE(port_d_r, port_d_w) |
| 81 | 165 | ADDRESS_MAP_END |
| 82 | 166 | |
| 83 | 167 | /* Input ports */ |
| 84 | 168 | static INPUT_PORTS_START( alphasmart ) |
| 169 | PORT_START("COL0") |
| 170 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 171 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 172 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 173 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 174 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 175 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 176 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 177 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 178 | PORT_START("COL1") |
| 179 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 180 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 181 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 182 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 183 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 184 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 185 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 186 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 187 | PORT_START("COL2") |
| 188 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 189 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 190 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 191 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 192 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 193 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 194 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 195 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 196 | PORT_START("COL3") |
| 197 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 198 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('\"') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 199 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 200 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 201 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 202 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 203 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 204 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 205 | PORT_START("COL4") |
| 206 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 207 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 208 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 209 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 210 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 211 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 212 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 213 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 214 | PORT_START("COL5") |
| 215 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 216 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 217 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 218 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 219 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 220 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 221 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 222 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 223 | PORT_START("COL6") |
| 224 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 225 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LWIN) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Left Command") PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 226 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 227 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RWIN) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Right Command") PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL)// |
| 228 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 229 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL) PORT_NAME("COLlear File") PORT_CHAR(UCHAR_MAMEKEY(F9)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 230 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(HOME)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 231 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 232 | PORT_START("COL7") |
| 233 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 234 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 235 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 236 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 237 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 238 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 239 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 240 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 241 | PORT_START("COL8") |
| 242 | PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 243 | PORT_START("COL9") |
| 244 | PORT_BIT(0xf0, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_NAME("Left Alt/Option") PORT_CHAR(UCHAR_MAMEKEY(LALT)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 245 | PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RALT) PORT_NAME("Right Alt/Option") PORT_CHAR(UCHAR_MAMEKEY(LALT)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 246 | PORT_START("COLA") |
| 247 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 248 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 249 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 250 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 251 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 252 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 253 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 254 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 255 | PORT_START("COLB") |
| 256 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 257 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 258 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Backspace") PORT_CHAR(UCHAR_MAMEKEY(BACKSPACE)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 259 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 260 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 261 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 262 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 263 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Return") PORT_CHAR(13) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 264 | PORT_START("COLC") |
| 265 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 266 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 267 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 268 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 269 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 270 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 271 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 272 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 273 | PORT_START("COLD") |
| 274 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 275 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 276 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 277 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 278 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 279 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 280 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 281 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 282 | PORT_START("COLE") |
| 283 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 284 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 285 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 286 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) |
| 287 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 288 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 289 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 290 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 291 | PORT_START("COLF") |
| 292 | PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 293 | PORT_BIT(0xf0, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_MAMEKEY(RSHIFT)) PORT_CHANGED_MEMBER(DEVICE_SELF, alphasmart_state, kb_irq, NULL) |
| 294 | |
| 295 | PORT_START("BATTERY") |
| 296 | PORT_CONFNAME(0x01, 0x01, "Battery status") |
| 297 | PORT_CONFSETTING (0x00, DEF_STR(Low)) |
| 298 | PORT_CONFSETTING (0x01, DEF_STR(Normal)) |
| 85 | 299 | INPUT_PORTS_END |
| 86 | 300 | |
| 87 | 301 | void alphasmart_state::palette_init() |
| r20349 | r20350 | |
| 90 | 304 | palette_set_color(machine(), 1, MAKE_RGB(92, 83, 88)); |
| 91 | 305 | } |
| 92 | 306 | |
| 307 | UINT32 alphasmart_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 308 | { |
| 309 | m_lcdc0->screen_update(screen, *m_tmp_bitmap, cliprect); |
| 310 | copybitmap(bitmap, *m_tmp_bitmap, 0, 0, 0, 0, cliprect); |
| 311 | m_lcdc1->screen_update(screen, *m_tmp_bitmap, cliprect); |
| 312 | copybitmap(bitmap, *m_tmp_bitmap, 0, 0, 0, 18,cliprect); |
| 313 | return 0; |
| 314 | } |
| 315 | |
| 93 | 316 | void alphasmart_state::machine_start() |
| 94 | 317 | { |
| 95 | 318 | m_rambank->configure_entries(0, 4, (UINT8*)(*memregion("mainram")), 0x8000); |
| 319 | m_tmp_bitmap = auto_bitmap_ind16_alloc(machine(), 6*40, 9*4); |
| 96 | 320 | } |
| 97 | 321 | |
| 98 | 322 | void alphasmart_state::machine_reset() |
| 99 | 323 | { |
| 100 | 324 | m_rambank->set_entry(0); |
| 325 | m_matrix[0] = m_matrix[1] = 0; |
| 326 | m_port_a = 0; |
| 327 | m_port_d = 0; |
| 101 | 328 | } |
| 102 | 329 | |
| 103 | 330 | static const hc11_config alphasmart_hc11_config = |
| r20349 | r20350 | |
| 109 | 336 | |
| 110 | 337 | static HD44780_INTERFACE( alphasmart_4line_display ) |
| 111 | 338 | { |
| 112 | | 4, // number of lines |
| 113 | | 16, // chars for line |
| 339 | 2, // number of lines |
| 340 | 40, // chars for line |
| 114 | 341 | NULL // pixel update callback |
| 115 | 342 | }; |
| 116 | 343 | |
| r20349 | r20350 | |
| 120 | 347 | MCFG_CPU_PROGRAM_MAP(alphasmart_mem) |
| 121 | 348 | MCFG_CPU_IO_MAP(alphasmart_io) |
| 122 | 349 | MCFG_CPU_CONFIG(alphasmart_hc11_config) |
| 123 | | // MCFG_CPU_PERIODIC_INT_DRIVER(alphasmart_state, irq0_line_hold, 50) |
| 124 | 350 | |
| 125 | | MCFG_HD44780_ADD("hd44780", alphasmart_4line_display) |
| 351 | MCFG_HD44780_ADD("ks0066_0", alphasmart_4line_display) |
| 352 | MCFG_HD44780_ADD("ks0066_1", alphasmart_4line_display) |
| 126 | 353 | |
| 127 | 354 | /* video hardware */ |
| 128 | 355 | MCFG_SCREEN_ADD("screen", LCD) |
| 129 | 356 | MCFG_SCREEN_REFRESH_RATE(50) |
| 130 | 357 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ |
| 131 | | MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update) |
| 358 | MCFG_SCREEN_UPDATE_DRIVER(alphasmart_state, screen_update) |
| 132 | 359 | MCFG_SCREEN_SIZE(6*40, 9*4) |
| 133 | 360 | MCFG_SCREEN_VISIBLE_AREA(0, (6*40)-1, 0, (9*4)-1) |
| 134 | 361 | MCFG_PALETTE_LENGTH(2) |
| r20349 | r20350 | |
| 142 | 369 | |
| 143 | 370 | ROM_REGION( 0x20000, "mainram", ROMREGION_ERASE ) |
| 144 | 371 | |
| 145 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 372 | ROM_REGION( 0x0860, "ks0066_0", ROMREGION_ERASE ) |
| 146 | 373 | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 374 | |
| 375 | ROM_REGION( 0x0860, "ks0066_1", ROMREGION_ERASE ) |
| 376 | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 147 | 377 | ROM_END |
| 148 | 378 | |
| 149 | 379 | |