trunk/src/mess/includes/einstein.h
| r20506 | r20507 | |
| 7 | 7 | #ifndef EINSTEIN_H_ |
| 8 | 8 | #define EINSTEIN_H_ |
| 9 | 9 | |
| 10 | #include "emu.h" |
| 10 | 11 | #include "video/mc6845.h" |
| 11 | 12 | #include "cpu/z80/z80daisy.h" |
| 12 | 13 | #include "machine/wd_fdc.h" |
| 13 | 14 | #include "machine/z80ctc.h" |
| 15 | #include "video/tms9928a.h" |
| 16 | #include "machine/ram.h" |
| 17 | #include "machine/i8251.h" |
| 18 | #include "machine/ctronics.h" |
| 14 | 19 | |
| 15 | 20 | /*************************************************************************** |
| 16 | 21 | CONSTANTS |
| r20506 | r20507 | |
| 43 | 48 | { |
| 44 | 49 | public: |
| 45 | 50 | einstein_state(const machine_config &mconfig, device_type type, const char *tag) |
| 46 | | : driver_device(mconfig, type, tag), |
| 47 | | m_fdc(*this, IC_I042) |
| 48 | | { } |
| 51 | : driver_device(mconfig, type, tag) |
| 52 | , m_fdc(*this, IC_I042) |
| 53 | , m_color_screen(*this, "screen") |
| 54 | , m_ctc(*this, IC_I058) |
| 55 | , m_tms9929a(*this, "tms9929a") |
| 56 | , m_region_gfx1(*this, "gfx1") |
| 57 | , m_mc6845(*this, "crtc") |
| 58 | , m_crtc_screen(*this, "80column") |
| 59 | , m_uart(*this, IC_I060) |
| 60 | , m_ram(*this, RAM_TAG) |
| 61 | , m_centronics(*this, "centronics") |
| 62 | , m_region_bios(*this, "bios") |
| 63 | , m_bank1(*this, "bank1") |
| 64 | , m_bank2(*this, "bank2") |
| 65 | , m_bank3(*this, "bank3") |
| 66 | , m_line0(*this, "LINE0") |
| 67 | , m_line1(*this, "LINE1") |
| 68 | , m_line2(*this, "LINE2") |
| 69 | , m_line3(*this, "LINE3") |
| 70 | , m_line4(*this, "LINE4") |
| 71 | , m_line5(*this, "LINE5") |
| 72 | , m_line6(*this, "LINE6") |
| 73 | , m_line7(*this, "LINE7") |
| 74 | , m_extra(*this, "EXTRA") |
| 75 | , m_buttons(*this, "BUTTONS") |
| 76 | , m_config(*this, "config") |
| 77 | , m_80column_dips(*this, "80column_dips") |
| 78 | { } |
| 49 | 79 | |
| 50 | 80 | required_device<wd1770_t> m_fdc; |
| 51 | | device_t *m_color_screen; |
| 52 | | z80ctc_device *m_ctc; |
| 81 | required_device<screen_device> m_color_screen; |
| 82 | required_device<z80ctc_device> m_ctc; |
| 83 | required_device<tms9929a_device> m_tms9929a; |
| 84 | optional_memory_region m_region_gfx1; |
| 53 | 85 | |
| 54 | 86 | int m_rom_enabled; |
| 55 | 87 | int m_interrupt; |
| r20506 | r20507 | |
| 61 | 93 | UINT8 m_keyboard_data; |
| 62 | 94 | |
| 63 | 95 | /* 80 column device */ |
| 64 | | mc6845_device *m_mc6845; |
| 65 | | screen_device *m_crtc_screen; |
| 96 | optional_device<mc6845_device> m_mc6845; |
| 97 | optional_device<screen_device> m_crtc_screen; |
| 66 | 98 | UINT8 *m_crtc_ram; |
| 67 | 99 | UINT8 m_de; |
| 68 | 100 | |
| r20506 | r20507 | |
| 88 | 120 | DECLARE_WRITE8_MEMBER(einstein_drsel_w); |
| 89 | 121 | DECLARE_WRITE_LINE_MEMBER(einstein_serial_transmit_clock); |
| 90 | 122 | DECLARE_WRITE_LINE_MEMBER(einstein_serial_receive_clock); |
| 123 | |
| 124 | protected: |
| 125 | required_device<i8251_device> m_uart; |
| 126 | required_device<ram_device> m_ram; |
| 127 | required_device<centronics_device> m_centronics; |
| 128 | required_memory_region m_region_bios; |
| 129 | required_memory_bank m_bank1; |
| 130 | required_memory_bank m_bank2; |
| 131 | required_memory_bank m_bank3; |
| 132 | required_ioport m_line0; |
| 133 | required_ioport m_line1; |
| 134 | required_ioport m_line2; |
| 135 | required_ioport m_line3; |
| 136 | required_ioport m_line4; |
| 137 | required_ioport m_line5; |
| 138 | required_ioport m_line6; |
| 139 | required_ioport m_line7; |
| 140 | required_ioport m_extra; |
| 141 | required_ioport m_buttons; |
| 142 | required_ioport m_config; |
| 143 | optional_ioport m_80column_dips; |
| 144 | |
| 145 | void einstein_scan_keyboard(); |
| 146 | void einstein_page_rom(); |
| 91 | 147 | }; |
| 92 | 148 | |
| 93 | 149 | |
trunk/src/mess/drivers/einstein.c
| r20506 | r20507 | |
| 55 | 55 | ******************************************************************************/ |
| 56 | 56 | |
| 57 | 57 | #include "emu.h" |
| 58 | | #include "machine/z80ctc.h" |
| 59 | 58 | #include "machine/z80pio.h" |
| 60 | 59 | #include "machine/z80sio.h" |
| 61 | | #include "video/tms9928a.h" |
| 62 | 60 | #include "cpu/z80/z80.h" |
| 63 | 61 | #include "cpu/z80/z80daisy.h" |
| 64 | | #include "machine/wd_fdc.h" |
| 65 | 62 | #include "formats/dsk_dsk.h" |
| 66 | | #include "machine/ctronics.h" |
| 67 | | #include "machine/i8251.h" |
| 68 | 63 | #include "sound/ay8910.h" |
| 69 | | #include "video/mc6845.h" |
| 70 | 64 | #include "rendlay.h" |
| 71 | | #include "machine/ram.h" |
| 72 | 65 | #include "includes/einstein.h" |
| 73 | 66 | |
| 74 | 67 | #define VERBOSE_KEYBOARD 0 |
| r20506 | r20507 | |
| 108 | 101 | { |
| 109 | 102 | einstein_state *einstein = device->machine().driver_data<einstein_state>(); |
| 110 | 103 | const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); |
| 111 | | UINT8 *data = device->machine().root_device().memregion("gfx1")->base(); |
| 104 | UINT8 *data = einstein->m_region_gfx1->base(); |
| 112 | 105 | UINT8 char_code, data_byte; |
| 113 | 106 | int i, x; |
| 114 | 107 | |
| r20506 | r20507 | |
| 143 | 136 | UINT8 result = 0; |
| 144 | 137 | |
| 145 | 138 | result |= m_de; |
| 146 | | result |= ioport("80column_dips")->read() & 0x06; |
| 139 | result |= m_80column_dips->read() & 0x06; |
| 147 | 140 | |
| 148 | 141 | return result; |
| 149 | 142 | } |
| r20506 | r20507 | |
| 166 | 159 | ***************************************************************************/ |
| 167 | 160 | |
| 168 | 161 | /* refresh keyboard data. It is refreshed when the keyboard line is written */ |
| 169 | | static void einstein_scan_keyboard(running_machine &machine) |
| 162 | void einstein_state::einstein_scan_keyboard() |
| 170 | 163 | { |
| 171 | | einstein_state *einstein = machine.driver_data<einstein_state>(); |
| 172 | 164 | UINT8 data = 0xff; |
| 173 | 165 | |
| 174 | | if (!BIT(einstein->m_keyboard_line, 0)) data &= machine.root_device().ioport("LINE0")->read(); |
| 175 | | if (!BIT(einstein->m_keyboard_line, 1)) data &= machine.root_device().ioport("LINE1")->read(); |
| 176 | | if (!BIT(einstein->m_keyboard_line, 2)) data &= machine.root_device().ioport("LINE2")->read(); |
| 177 | | if (!BIT(einstein->m_keyboard_line, 3)) data &= machine.root_device().ioport("LINE3")->read(); |
| 178 | | if (!BIT(einstein->m_keyboard_line, 4)) data &= machine.root_device().ioport("LINE4")->read(); |
| 179 | | if (!BIT(einstein->m_keyboard_line, 5)) data &= machine.root_device().ioport("LINE5")->read(); |
| 180 | | if (!BIT(einstein->m_keyboard_line, 6)) data &= machine.root_device().ioport("LINE6")->read(); |
| 181 | | if (!BIT(einstein->m_keyboard_line, 7)) data &= machine.root_device().ioport("LINE7")->read(); |
| 166 | if (!BIT(m_keyboard_line, 0)) data &= m_line0->read(); |
| 167 | if (!BIT(m_keyboard_line, 1)) data &= m_line1->read(); |
| 168 | if (!BIT(m_keyboard_line, 2)) data &= m_line2->read(); |
| 169 | if (!BIT(m_keyboard_line, 3)) data &= m_line3->read(); |
| 170 | if (!BIT(m_keyboard_line, 4)) data &= m_line4->read(); |
| 171 | if (!BIT(m_keyboard_line, 5)) data &= m_line5->read(); |
| 172 | if (!BIT(m_keyboard_line, 6)) data &= m_line6->read(); |
| 173 | if (!BIT(m_keyboard_line, 7)) data &= m_line7->read(); |
| 182 | 174 | |
| 183 | | einstein->m_keyboard_data = data; |
| 175 | m_keyboard_data = data; |
| 184 | 176 | } |
| 185 | 177 | |
| 186 | 178 | TIMER_DEVICE_CALLBACK_MEMBER(einstein_state::einstein_keyboard_timer_callback) |
| 187 | 179 | { |
| 188 | 180 | /* re-scan keyboard */ |
| 189 | | einstein_scan_keyboard(machine()); |
| 181 | einstein_scan_keyboard(); |
| 190 | 182 | |
| 191 | 183 | /* if /fire1 or /fire2 is 0, signal a fire interrupt */ |
| 192 | | if ((machine().root_device().ioport("BUTTONS")->read() & 0x03) != 0) |
| 184 | if ((m_buttons->read() & 0x03) != 0) |
| 193 | 185 | { |
| 194 | 186 | m_interrupt |= EINSTEIN_FIRE_INT; |
| 195 | 187 | } |
| r20506 | r20507 | |
| 210 | 202 | m_keyboard_line = data; |
| 211 | 203 | |
| 212 | 204 | /* re-scan the keyboard */ |
| 213 | | einstein_scan_keyboard(machine()); |
| 205 | einstein_scan_keyboard(); |
| 214 | 206 | } |
| 215 | 207 | |
| 216 | 208 | READ8_MEMBER(einstein_state::einstein_keyboard_data_read) |
| 217 | 209 | { |
| 218 | 210 | /* re-scan the keyboard */ |
| 219 | | einstein_scan_keyboard(machine()); |
| 211 | einstein_scan_keyboard(); |
| 220 | 212 | |
| 221 | 213 | if (VERBOSE_KEYBOARD) |
| 222 | 214 | logerror("einstein_keyboard_data_read: %02x\n", m_keyboard_data); |
| r20506 | r20507 | |
| 246 | 238 | } |
| 247 | 239 | |
| 248 | 240 | /* double sided drive connected? */ |
| 249 | | if (machine().root_device().ioport("config")->read() & data) |
| 241 | if (m_config->read() & data) |
| 250 | 242 | { |
| 251 | 243 | /* bit 4 selects the side then */ |
| 252 | 244 | //floppy->ss_w(BIT(data, 4)); |
| r20506 | r20507 | |
| 277 | 269 | |
| 278 | 270 | WRITE_LINE_MEMBER(einstein_state::einstein_serial_transmit_clock) |
| 279 | 271 | { |
| 280 | | i8251_device *uart = machine().device<i8251_device>(IC_I060); |
| 281 | | uart->transmit_clock(); |
| 272 | m_uart->transmit_clock(); |
| 282 | 273 | } |
| 283 | 274 | |
| 284 | 275 | WRITE_LINE_MEMBER(einstein_state::einstein_serial_receive_clock) |
| 285 | 276 | { |
| 286 | | i8251_device *uart = machine().device<i8251_device>(IC_I060); |
| 287 | | uart->receive_clock(); |
| 277 | m_uart->receive_clock(); |
| 288 | 278 | } |
| 289 | 279 | |
| 290 | 280 | |
| r20506 | r20507 | |
| 292 | 282 | MEMORY BANKING |
| 293 | 283 | ***************************************************************************/ |
| 294 | 284 | |
| 295 | | static void einstein_page_rom(running_machine &machine) |
| 285 | void einstein_state::einstein_page_rom() |
| 296 | 286 | { |
| 297 | | einstein_state *state = machine.driver_data<einstein_state>(); |
| 298 | | state->membank("bank1")->set_base(state->m_rom_enabled ? machine.root_device().memregion("bios")->base() : machine.device<ram_device>(RAM_TAG)->pointer()); |
| 287 | m_bank1->set_base(m_rom_enabled ? m_region_bios->base() : m_ram->pointer()); |
| 299 | 288 | } |
| 300 | 289 | |
| 301 | 290 | /* writing to this port is a simple trigger, and switches between RAM and ROM */ |
| 302 | 291 | WRITE8_MEMBER(einstein_state::einstein_rom_w) |
| 303 | 292 | { |
| 304 | 293 | m_rom_enabled ^= 1; |
| 305 | | einstein_page_rom(machine()); |
| 294 | einstein_page_rom(); |
| 306 | 295 | } |
| 307 | 296 | |
| 308 | 297 | |
| r20506 | r20507 | |
| 312 | 301 | |
| 313 | 302 | READ8_MEMBER(einstein_state::einstein_kybintmsk_r) |
| 314 | 303 | { |
| 315 | | centronics_device *centronics = machine().device<centronics_device>("centronics"); |
| 316 | 304 | UINT8 data = 0; |
| 317 | 305 | |
| 318 | 306 | /* clear key int. a read of this I/O port will do this or a reset */ |
| 319 | 307 | m_interrupt &= ~EINSTEIN_KEY_INT; |
| 320 | 308 | |
| 321 | 309 | /* bit 0 and 1: fire buttons on the joysticks */ |
| 322 | | data |= ioport("BUTTONS")->read(); |
| 310 | data |= m_buttons->read(); |
| 323 | 311 | |
| 324 | 312 | /* bit 2 to 4: printer status */ |
| 325 | | data |= centronics->busy_r() << 2; |
| 326 | | data |= centronics->pe_r() << 3; |
| 327 | | data |= centronics->fault_r() << 4; |
| 313 | data |= m_centronics->busy_r() << 2; |
| 314 | data |= m_centronics->pe_r() << 3; |
| 315 | data |= m_centronics->fault_r() << 4; |
| 328 | 316 | |
| 329 | 317 | /* bit 5 to 7: graph, control and shift key */ |
| 330 | | data |= ioport("EXTRA")->read(); |
| 318 | data |= m_extra->read(); |
| 331 | 319 | |
| 332 | 320 | if(VERBOSE_KEYBOARD) |
| 333 | 321 | logerror("%s: einstein_kybintmsk_r %02x\n", machine().describe_context(), data); |
| r20506 | r20507 | |
| 407 | 395 | void einstein_state::machine_reset() |
| 408 | 396 | { |
| 409 | 397 | //device_t *floppy; |
| 410 | | //UINT8 config = machine().root_device().ioport("config")->read(); |
| 398 | //UINT8 config = m_config->read(); |
| 411 | 399 | |
| 412 | | /* save pointers to our devices */ |
| 413 | | m_color_screen = machine().device("screen"); |
| 414 | | m_ctc = machine().device<z80ctc_device>(IC_I058); |
| 415 | | |
| 416 | 400 | /* initialize memory mapping */ |
| 417 | | membank("bank2")->set_base(machine().device<ram_device>(RAM_TAG)->pointer()); |
| 418 | | membank("bank3")->set_base(machine().device<ram_device>(RAM_TAG)->pointer() + 0x8000); |
| 401 | m_bank2->set_base(m_ram->pointer()); |
| 402 | m_bank3->set_base(m_ram->pointer() + 0x8000); |
| 419 | 403 | m_rom_enabled = 1; |
| 420 | | einstein_page_rom(machine()); |
| 404 | einstein_page_rom(); |
| 421 | 405 | |
| 422 | 406 | /* a reset causes the fire int, adc int, keyboard int mask |
| 423 | 407 | to be set to 1, which causes all these to be DISABLED */ |
| r20506 | r20507 | |
| 444 | 428 | /* call standard initialization first */ |
| 445 | 429 | einstein_state::machine_reset(); |
| 446 | 430 | |
| 447 | | /* get 80 column specific devices */ |
| 448 | | m_mc6845 = machine().device<mc6845_device>("crtc"); |
| 449 | | m_crtc_screen = machine().device<screen_device>("80column"); |
| 450 | | |
| 451 | 431 | /* 80 column card palette */ |
| 452 | 432 | palette_set_color(machine(), TMS9928A_PALETTE_SIZE, RGB_BLACK); |
| 453 | 433 | palette_set_color(machine(), TMS9928A_PALETTE_SIZE + 1, MAKE_RGB(0, 224, 0)); |
| r20506 | r20507 | |
| 468 | 448 | { |
| 469 | 449 | if (&screen == m_color_screen) |
| 470 | 450 | { |
| 471 | | tms9929a_device *tms9929a = machine().device<tms9929a_device>( "tms9929a" ); |
| 472 | | bitmap_rgb32 &src = tms9929a->get_bitmap(); |
| 451 | bitmap_rgb32 &src = m_tms9929a->get_bitmap(); |
| 473 | 452 | for (int y = cliprect.min_y; y <= cliprect.max_y; y++) |
| 474 | 453 | for (int x = cliprect.min_x; x <= cliprect.max_x; x++) |
| 475 | 454 | bitmap.pix32(y, x) = src.pix32(y, x); |