src/mess/drivers/homelab.c
| r15485 | r15486 | |
| 13 | 13 | sync pulse. |
| 14 | 14 | |
| 15 | 15 | ToDO: |
| 16 | | - homelab2 - No cursor; Can't press same key twice in a row |
| 17 | | - homelab3 etc - sound, cassout. Need a dump of the TM188 prom. |
| 16 | - homelab2 - sound, cassette |
| 17 | Note that rom code 0x40-48 is meaningless garbage, |
| 18 | had to patch to stop it crashing. Need a new dump. |
| 19 | - homelab3 etc - sound, cassout. Need a dump of the TM188. |
| 18 | 20 | - Brailab4 - had to patch, to stop stack getting wiped out. |
| 19 | 21 | currently reads keys and outputs noise. Needs |
| 20 | 22 | unknown speech device and maybe other devices. |
| r15485 | r15486 | |
| 24 | 26 | The bios never talks to it. Not fitted to homelab2. |
| 25 | 27 | Official port numbers are 3C-3F. |
| 26 | 28 | |
| 29 | TM188 is (it seems) equivalent to 27S19, TBP18S030N, 6331-1, 74S288, 82S123, |
| 30 | MB7051 - fuse programmed prom. |
| 31 | |
| 27 | 32 | ****************************************************************************/ |
| 28 | 33 | |
| 29 | 34 | #include "emu.h" |
| r15485 | r15486 | |
| 48 | 53 | m_p_videoram(*this, "videoram"){ } |
| 49 | 54 | |
| 50 | 55 | DECLARE_READ8_MEMBER(key_r); |
| 56 | DECLARE_WRITE8_MEMBER(cass_w); |
| 57 | DECLARE_READ8_MEMBER(cass2_r); |
| 51 | 58 | DECLARE_READ8_MEMBER(exxx_r); |
| 52 | 59 | DECLARE_READ8_MEMBER(io_r); |
| 53 | 60 | DECLARE_WRITE8_MEMBER(io_w); |
| 54 | | DECLARE_CUSTOM_INPUT_MEMBER(cass_r); |
| 61 | DECLARE_CUSTOM_INPUT_MEMBER(cass3_r); |
| 55 | 62 | const UINT8 *m_p_chargen; |
| 56 | 63 | //virtual void machine_reset(); |
| 57 | 64 | //virtual void machine_start(); |
| 58 | 65 | virtual void video_start(); |
| 59 | 66 | required_device<cpu_device> m_maincpu; |
| 60 | | optional_device<device_t> m_speaker; |
| 61 | | optional_device<cassette_image_device> m_cass; |
| 67 | required_device<device_t> m_speaker; |
| 68 | required_device<cassette_image_device> m_cass; |
| 62 | 69 | optional_shared_ptr<const UINT8> m_p_videoram; |
| 63 | 70 | private: |
| 64 | 71 | }; |
| 65 | 72 | |
| 66 | 73 | |
| 74 | static INTERRUPT_GEN( homelab_frame ) |
| 75 | { |
| 76 | homelab_state *state = device->machine().driver_data<homelab_state>(); |
| 77 | device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, ASSERT_LINE); |
| 78 | } |
| 79 | |
| 67 | 80 | READ8_MEMBER( homelab_state::key_r ) // offset 27F-2FE |
| 68 | 81 | { |
| 82 | if (offset == 0x38) // 0x3838 |
| 83 | { |
| 84 | device_set_input_line(m_maincpu, INPUT_LINE_NMI, CLEAR_LINE); |
| 85 | return 0; |
| 86 | } |
| 87 | |
| 69 | 88 | UINT8 i,data = 0xff; |
| 70 | 89 | char kbdrow[8]; |
| 71 | 90 | |
| r15485 | r15486 | |
| 94 | 113 | m_cass->output(state ? -1.0 : +1.0); |
| 95 | 114 | } |
| 96 | 115 | |
| 97 | | CUSTOM_INPUT_MEMBER( homelab_state::cass_r ) |
| 116 | READ8_MEMBER( homelab_state::cass2_r ) |
| 98 | 117 | { |
| 99 | 118 | return (m_cass->input() > 0.03); |
| 100 | 119 | } |
| 101 | 120 | |
| 121 | WRITE8_MEMBER( homelab_state::cass_w ) |
| 122 | { |
| 123 | if (offset == 0x73f) // 0x3f3f |
| 124 | speaker_level_w(m_speaker, 1); |
| 125 | else |
| 126 | if (offset == 0x139) // 0x3939 |
| 127 | speaker_level_w(m_speaker, 0); |
| 128 | else |
| 129 | if (offset == 0x400) // 0x3c00 |
| 130 | m_cass->output(BIT(data, 0) ? -1.0 : +1.0); // FIXME |
| 131 | } |
| 102 | 132 | |
| 133 | CUSTOM_INPUT_MEMBER( homelab_state::cass3_r ) |
| 134 | { |
| 135 | return (m_cass->input() > 0.03); |
| 136 | } |
| 137 | |
| 138 | |
| 103 | 139 | READ8_MEMBER( homelab_state::exxx_r ) |
| 104 | 140 | { |
| 105 | 141 | // keys E800-E813 but E810-E813 are not connected |
| r15485 | r15486 | |
| 126 | 162 | AM_RANGE( 0x2000, 0x27ff ) AM_ROM // ROM 5 |
| 127 | 163 | AM_RANGE( 0x2800, 0x2fff ) AM_ROM // ROM 6 |
| 128 | 164 | AM_RANGE( 0x3000, 0x37ff ) AM_ROM // Empty |
| 129 | | AM_RANGE( 0x3800, 0x3fff ) AM_READ(key_r) AM_WRITENOP |
| 165 | AM_RANGE( 0x3800, 0x3fff ) AM_READWRITE(key_r,cass_w) |
| 130 | 166 | AM_RANGE( 0x4000, 0x7fff ) AM_RAM |
| 131 | | AM_RANGE( 0xc000, 0xc3ff ) AM_RAM AM_SHARE("videoram") AM_MIRROR(0x3c00) // Video RAM 1K |
| 167 | AM_RANGE( 0xc000, 0xc3ff ) AM_RAM AM_SHARE("videoram") // Video RAM 1K |
| 168 | AM_RANGE( 0xe000, 0xe0ff ) AM_READ(cass2_r) |
| 132 | 169 | ADDRESS_MAP_END |
| 133 | 170 | |
| 134 | 171 | static ADDRESS_MAP_START(homelab3_mem, AS_PROGRAM, 8, homelab_state) |
| r15485 | r15486 | |
| 253 | 290 | PORT_BIT(0xf0, IP_ACTIVE_LOW, IPT_UNUSED) |
| 254 | 291 | |
| 255 | 292 | PORT_START("X3") |
| 256 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homelab_state, cass_r, " ") |
| 293 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homelab_state, cass3_r, " ") |
| 257 | 294 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) |
| 258 | 295 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) |
| 259 | 296 | PORT_BIT(0xf8, IP_ACTIVE_LOW, IPT_UNUSED) |
| r15485 | r15486 | |
| 440 | 477 | /* Machine driver */ |
| 441 | 478 | static MACHINE_CONFIG_START( homelab, homelab_state ) |
| 442 | 479 | /* basic machine hardware */ |
| 443 | | MCFG_CPU_ADD("maincpu", Z80, 3000000) |
| 480 | MCFG_CPU_ADD("maincpu", Z80, XTAL_8MHz / 2) |
| 444 | 481 | MCFG_CPU_PROGRAM_MAP(homelab2_mem) |
| 482 | MCFG_CPU_VBLANK_INT("screen", homelab_frame) |
| 445 | 483 | |
| 446 | 484 | /* video hardware */ |
| 447 | 485 | MCFG_SCREEN_ADD("screen", RASTER) |
| r15485 | r15486 | |
| 453 | 491 | MCFG_GFXDECODE(homelab) |
| 454 | 492 | MCFG_PALETTE_LENGTH(2) |
| 455 | 493 | MCFG_PALETTE_INIT(monochrome_green) |
| 494 | |
| 495 | /* sound hardware */ |
| 496 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 497 | MCFG_SOUND_ADD(SPEAKER_TAG, SPEAKER_SOUND, 0) |
| 498 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) |
| 499 | MCFG_SOUND_WAVE_ADD(WAVE_TAG, CASSETTE_TAG) |
| 500 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 501 | |
| 502 | MCFG_CASSETTE_ADD( CASSETTE_TAG, default_cassette_interface ) |
| 456 | 503 | MACHINE_CONFIG_END |
| 457 | 504 | |
| 458 | | static MACHINE_CONFIG_DERIVED( homelab3, homelab ) |
| 505 | static MACHINE_CONFIG_START( homelab3, homelab_state ) |
| 459 | 506 | /* basic machine hardware */ |
| 460 | | MCFG_CPU_MODIFY("maincpu") |
| 507 | MCFG_CPU_ADD("maincpu", Z80, XTAL_12MHz / 4) |
| 461 | 508 | MCFG_CPU_PROGRAM_MAP(homelab3_mem) |
| 462 | 509 | MCFG_CPU_IO_MAP(homelab3_io) |
| 463 | 510 | |
| 464 | | MCFG_SCREEN_MODIFY("screen") |
| 511 | /* video hardware */ |
| 512 | MCFG_SCREEN_ADD("screen", RASTER) |
| 513 | MCFG_SCREEN_REFRESH_RATE(50) |
| 514 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) |
| 465 | 515 | MCFG_SCREEN_SIZE(64*8, 32*8) |
| 466 | 516 | MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 32*8-1) |
| 467 | 517 | MCFG_SCREEN_UPDATE_STATIC( homelab3 ) |
| 518 | MCFG_GFXDECODE(homelab) |
| 519 | MCFG_PALETTE_LENGTH(2) |
| 520 | MCFG_PALETTE_INIT(monochrome_green) |
| 468 | 521 | |
| 469 | 522 | /* sound hardware */ |
| 470 | 523 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| r15485 | r15486 | |
| 491 | 544 | ROM_LOAD( "hl2_2.rom", 0x0800, 0x0800, CRC(696AF3C1) SHA1(b53bc6ae2b75975618fc90e7181fa5d21409fce1)) |
| 492 | 545 | ROM_LOAD( "hl2_3.rom", 0x1000, 0x0800, CRC(69E57E8C) SHA1(e98510abb715dbf513e1b29fb6b09ab54e9483b7)) |
| 493 | 546 | ROM_LOAD( "hl2_4.rom", 0x1800, 0x0800, CRC(97CBBE74) SHA1(34f0bad41302b059322018abc3d1c2336ecfbea8)) |
| 494 | | ROM_LOAD( "hl2_m.rom", 0x2000, 0x0800, CRC(10040235) SHA1(e121dfb97cc8ea99193a9396a9f7af08585e0ff0) ) |
| 547 | ROM_LOAD( "hl2_m.rom", 0x2000, 0x0800, BAD_DUMP CRC(10040235) SHA1(e121dfb97cc8ea99193a9396a9f7af08585e0ff0) ) |
| 548 | ROM_FILL(0x46, 1, 0x18) // fix bad code |
| 549 | ROM_FILL(0x47, 1, 0x0E) |
| 495 | 550 | |
| 496 | 551 | ROM_REGION(0x0800, "chargen",0) |
| 497 | 552 | ROM_LOAD ("hl2.chr", 0x0000, 0x0800, CRC(2E669D40) SHA1(639dd82ed29985dc69830aca3b904b6acc8fe54a)) |