src/mess/drivers/exp85.c
| r9928 | r9929 | |
| 10 | 10 | |
| 11 | 11 | TODO: |
| 12 | 12 | |
| 13 | | - needs a terminal, or a dump of the hexadecimal keyboard monitor ROM |
| 14 | | - serial input/output at SID/SOD pins |
| 13 | - dump of the hexadecimal keyboard monitor ROM |
| 15 | 14 | - disable ROM mirror after boot |
| 16 | 15 | - RAM expansions |
| 17 | 16 | |
| 18 | 17 | */ |
| 19 | 18 | |
| 19 | #define ADDRESS_MAP_MODERN |
| 20 | |
| 20 | 21 | #include "emu.h" |
| 21 | 22 | #include "includes/exp85.h" |
| 22 | 23 | #include "cpu/i8085/i8085.h" |
| 23 | 24 | #include "imagedev/cassette.h" |
| 24 | 25 | #include "machine/i8155.h" |
| 25 | 26 | #include "machine/i8355.h" |
| 27 | #include "machine/terminal.h" |
| 26 | 28 | #include "sound/speaker.h" |
| 27 | 29 | #include "machine/ram.h" |
| 28 | 30 | |
| 29 | 31 | /* Memory Maps */ |
| 30 | 32 | |
| 31 | | static ADDRESS_MAP_START( exp85_mem, ADDRESS_SPACE_PROGRAM, 8 ) |
| 33 | static ADDRESS_MAP_START( exp85_mem, ADDRESS_SPACE_PROGRAM, 8, exp85_state ) |
| 32 | 34 | ADDRESS_MAP_UNMAP_HIGH |
| 33 | 35 | AM_RANGE(0x0000, 0x07ff) AM_ROMBANK("bank1") |
| 34 | 36 | AM_RANGE(0xc000, 0xdfff) AM_ROM |
| r9928 | r9929 | |
| 36 | 38 | AM_RANGE(0xf800, 0xf8ff) AM_RAM |
| 37 | 39 | ADDRESS_MAP_END |
| 38 | 40 | |
| 39 | | static ADDRESS_MAP_START( exp85_io, ADDRESS_SPACE_IO, 8 ) |
| 41 | static ADDRESS_MAP_START( exp85_io, ADDRESS_SPACE_IO, 8, exp85_state ) |
| 40 | 42 | ADDRESS_MAP_UNMAP_HIGH |
| 41 | | AM_RANGE(0xf0, 0xf3) AM_DEVREADWRITE_MODERN(I8355_TAG, i8355_device, io_r, io_w) |
| 42 | | AM_RANGE(0xf8, 0xfd) AM_DEVREADWRITE_MODERN(I8155_TAG, i8155_device, io_r, io_w) |
| 43 | AM_RANGE(0xf0, 0xf3) AM_DEVREADWRITE(I8355_TAG, i8355_device, io_r, io_w) |
| 44 | AM_RANGE(0xf8, 0xfd) AM_DEVREADWRITE(I8155_TAG, i8155_device, io_r, io_w) |
| 43 | 45 | // AM_RANGE(0xfe, 0xff) AM_DEVREADWRITE(I8279_TAG, i8279_r, i8279_w) |
| 44 | 46 | ADDRESS_MAP_END |
| 45 | 47 | |
| r9928 | r9929 | |
| 56 | 58 | } |
| 57 | 59 | |
| 58 | 60 | static INPUT_PORTS_START( exp85 ) |
| 61 | PORT_INCLUDE(generic_terminal) |
| 62 | |
| 59 | 63 | PORT_START("SPECIAL") |
| 60 | 64 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("R") PORT_CODE(KEYCODE_F1) PORT_CHANGED(trigger_reset, 0) |
| 61 | 65 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("I") PORT_CODE(KEYCODE_F2) PORT_CHANGED(trigger_rst75, 0) |
| 62 | 66 | INPUT_PORTS_END |
| 63 | 67 | |
| 64 | | /* Video */ |
| 65 | | |
| 66 | | static VIDEO_START( exp85 ) |
| 67 | | { |
| 68 | | } |
| 69 | | |
| 70 | | static VIDEO_UPDATE( exp85 ) |
| 71 | | { |
| 72 | | return 0; |
| 73 | | } |
| 74 | | |
| 75 | 68 | /* 8155 Interface */ |
| 76 | 69 | |
| 77 | 70 | static I8155_INTERFACE( i8155_intf ) |
| r9928 | r9929 | |
| 87 | 80 | |
| 88 | 81 | /* 8355 Interface */ |
| 89 | 82 | |
| 90 | | static READ8_DEVICE_HANDLER( i8355_a_r ) |
| 83 | READ8_MEMBER( exp85_state::i8355_a_r ) |
| 91 | 84 | { |
| 92 | 85 | /* |
| 93 | 86 | |
| r9928 | r9929 | |
| 107 | 100 | return 0x02; |
| 108 | 101 | } |
| 109 | 102 | |
| 110 | | static WRITE8_DEVICE_HANDLER( i8355_a_w ) |
| 103 | WRITE8_MEMBER( exp85_state::i8355_a_w ) |
| 111 | 104 | { |
| 112 | 105 | /* |
| 113 | 106 | |
| r9928 | r9929 | |
| 124 | 117 | |
| 125 | 118 | */ |
| 126 | 119 | |
| 127 | | exp85_state *state = device->machine->driver_data<exp85_state>(); |
| 128 | | |
| 129 | 120 | /* tape control */ |
| 130 | | state->tape_control = BIT(data, 0); |
| 121 | m_tape_control = BIT(data, 0); |
| 131 | 122 | |
| 132 | 123 | /* speaker output */ |
| 133 | | speaker_level_w(state->speaker, !BIT(data, 7)); |
| 124 | speaker_level_w(m_speaker, !BIT(data, 7)); |
| 134 | 125 | } |
| 135 | 126 | |
| 136 | 127 | static I8355_INTERFACE( i8355_intf ) |
| 137 | 128 | { |
| 138 | | DEVCB_HANDLER(i8355_a_r), /* port A read */ |
| 139 | | DEVCB_HANDLER(i8355_a_w), /* port A write */ |
| 140 | | DEVCB_NULL, /* port B read */ |
| 141 | | DEVCB_NULL, /* port B write */ |
| 129 | DEVCB_DRIVER_MEMBER(exp85_state, i8355_a_r), |
| 130 | DEVCB_DRIVER_MEMBER(exp85_state, i8355_a_w), |
| 131 | DEVCB_NULL, |
| 132 | DEVCB_NULL |
| 142 | 133 | }; |
| 143 | 134 | |
| 144 | 135 | /* I8085A Interface */ |
| 145 | 136 | |
| 146 | | static WRITE_LINE_DEVICE_HANDLER( exp85_sod_w ) |
| 137 | READ_LINE_MEMBER( exp85_state::sid_r ) |
| 147 | 138 | { |
| 148 | | exp85_state *driver_state = device->machine->driver_data<exp85_state>(); |
| 149 | | |
| 150 | | cassette_output(driver_state->cassette, state ? -1.0 : +1.0); |
| 151 | | } |
| 152 | | |
| 153 | | static READ_LINE_DEVICE_HANDLER( exp85_sid_r ) |
| 154 | | { |
| 155 | | exp85_state *driver_state = device->machine->driver_data<exp85_state>(); |
| 156 | | |
| 157 | 139 | int data = 1; |
| 158 | 140 | |
| 159 | | if (driver_state->tape_control) |
| 141 | if (m_tape_control) |
| 160 | 142 | { |
| 161 | | data = cassette_input(driver_state->cassette) > +1.0; |
| 143 | data = cassette_input(m_cassette) > +1.0; |
| 162 | 144 | } |
| 145 | else |
| 146 | { |
| 147 | data = terminal_serial_r(m_terminal); |
| 148 | } |
| 163 | 149 | |
| 164 | 150 | return data; |
| 165 | 151 | } |
| 166 | 152 | |
| 153 | WRITE_LINE_MEMBER( exp85_state::sod_w ) |
| 154 | { |
| 155 | if (m_tape_control) |
| 156 | { |
| 157 | cassette_output(m_cassette, state ? -1.0 : +1.0); |
| 158 | } |
| 159 | else |
| 160 | { |
| 161 | terminal_serial_w(m_terminal, state); |
| 162 | } |
| 163 | } |
| 164 | |
| 167 | 165 | static I8085_CONFIG( exp85_i8085_config ) |
| 168 | 166 | { |
| 169 | | DEVCB_NULL, /* STATUS changed callback */ |
| 170 | | DEVCB_NULL, /* INTE changed callback */ |
| 171 | | DEVCB_LINE(exp85_sid_r), /* SID changed callback (I8085A only) */ |
| 172 | | DEVCB_LINE(exp85_sod_w) /* SOD changed callback (I8085A only) */ |
| 167 | DEVCB_NULL, |
| 168 | DEVCB_NULL, |
| 169 | DEVCB_DRIVER_LINE_MEMBER(exp85_state, sid_r), |
| 170 | DEVCB_DRIVER_LINE_MEMBER(exp85_state, sod_w) |
| 173 | 171 | }; |
| 174 | 172 | |
| 173 | /* Terminal Interface */ |
| 174 | |
| 175 | static GENERIC_TERMINAL_INTERFACE( terminal_intf ) |
| 176 | { |
| 177 | DEVCB_NULL |
| 178 | }; |
| 179 | |
| 175 | 180 | /* Machine Initialization */ |
| 176 | 181 | |
| 177 | | static MACHINE_START( exp85 ) |
| 182 | void exp85_state::machine_start() |
| 178 | 183 | { |
| 179 | | exp85_state *state = machine->driver_data<exp85_state>(); |
| 180 | | address_space *program = cputag_get_address_space(machine, I8085A_TAG, ADDRESS_SPACE_PROGRAM); |
| 184 | address_space *program = cpu_get_address_space(m_maincpu, ADDRESS_SPACE_PROGRAM); |
| 181 | 185 | |
| 182 | 186 | /* setup memory banking */ |
| 183 | 187 | memory_install_read_bank(program, 0x0000, 0x07ff, 0, 0, "bank1"); |
| r9928 | r9929 | |
| 185 | 189 | memory_configure_bank(machine, "bank1", 0, 1, machine->region(I8085A_TAG)->base() + 0xf000, 0); |
| 186 | 190 | memory_configure_bank(machine, "bank1", 1, 1, machine->region(I8085A_TAG)->base(), 0); |
| 187 | 191 | memory_set_bank(machine, "bank1", 0); |
| 188 | | |
| 189 | | /* find devices */ |
| 190 | | state->speaker = machine->device(SPEAKER_TAG); |
| 191 | | state->cassette = machine->device(CASSETTE_TAG); |
| 192 | 192 | } |
| 193 | 193 | |
| 194 | 194 | /* Machine Driver */ |
| r9928 | r9929 | |
| 208 | 208 | MCFG_CPU_IO_MAP(exp85_io) |
| 209 | 209 | MCFG_CPU_CONFIG(exp85_i8085_config) |
| 210 | 210 | |
| 211 | | MCFG_MACHINE_START(exp85) |
| 212 | | |
| 213 | 211 | /* video hardware */ |
| 214 | | MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) |
| 215 | | MCFG_SCREEN_REFRESH_RATE(50) |
| 216 | | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ |
| 217 | | MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) |
| 218 | | MCFG_SCREEN_SIZE(640, 480) |
| 219 | | MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) |
| 212 | MCFG_FRAGMENT_ADD( generic_terminal ) |
| 220 | 213 | |
| 221 | | MCFG_PALETTE_LENGTH(2) |
| 222 | | MCFG_PALETTE_INIT(black_and_white) |
| 223 | | |
| 224 | | MCFG_VIDEO_START(exp85) |
| 225 | | MCFG_VIDEO_UPDATE(exp85) |
| 226 | | |
| 227 | 214 | /* sound hardware */ |
| 228 | 215 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 229 | 216 | MCFG_SOUND_ADD(SPEAKER_TAG, SPEAKER_SOUND, 0) |
| r9928 | r9929 | |
| 232 | 219 | /* devices */ |
| 233 | 220 | MCFG_I8155_ADD(I8155_TAG, XTAL_6_144MHz/2, i8155_intf) |
| 234 | 221 | MCFG_I8355_ADD(I8355_TAG, XTAL_6_144MHz/2, i8355_intf) |
| 235 | | |
| 236 | 222 | MCFG_CASSETTE_ADD(CASSETTE_TAG, exp85_cassette_config) |
| 223 | MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf) |
| 237 | 224 | |
| 238 | 225 | /* internal ram */ |
| 239 | 226 | MCFG_RAM_ADD(RAM_TAG) |
| r9928 | r9929 | |
| 251 | 238 | ROM_LOAD( "d000.bin", 0xd000, 0x0800, CRC(c10c4a22) SHA1(30588ba0b27a775d85f8c581ad54400c8521225d) ) |
| 252 | 239 | ROM_LOAD( "d800.bin", 0xd800, 0x0800, CRC(dfa43ef4) SHA1(56a7e7a64928bdd1d5f0519023d1594cacef49b3) ) |
| 253 | 240 | ROM_SYSTEM_BIOS( 0, "eia", "EIA Terminal" ) |
| 254 | | ROMX_LOAD( "eia.u105", 0xf000, 0x0800, CRC(1a99d0d9) SHA1(57b6d48e71257bc4ef2d3dddc9b30edf6c1db766), ROM_BIOS(1) ) |
| 241 | ROMX_LOAD( "ex 85.u105", 0xf000, 0x0800, CRC(1a99d0d9) SHA1(57b6d48e71257bc4ef2d3dddc9b30edf6c1db766), ROM_BIOS(1) ) |
| 255 | 242 | ROM_SYSTEM_BIOS( 1, "hex", "Hex Keyboard" ) |
| 256 | | ROMX_LOAD( "hex.u105", 0xf000, 0x0800, NO_DUMP, ROM_BIOS(2) ) |
| 243 | ROMX_LOAD( "1kbd.u105", 0xf000, 0x0800, NO_DUMP, ROM_BIOS(2) ) |
| 257 | 244 | |
| 258 | 245 | ROM_REGION( 0x800, I8355_TAG, ROMREGION_ERASE00 ) |
| 259 | 246 | /* ROM_DEFAULT_BIOS("terminal") |