trunk/src/mess/drivers/pve500.c
| r31085 | r31086 | |
| 16 | 16 | |
| 17 | 17 | #include "emu.h" |
| 18 | 18 | #include "cpu/z80/tmpz84c015.h" |
| 19 | #include "sound/beep.h" |
| 20 | #include "bus/rs232/rs232.h" /* actually meant to be RS422 ports */ |
| 19 | 21 | #include "pve500.lh" |
| 20 | 22 | |
| 21 | 23 | #define IO_EXPANDER_PORTA 0 |
| r31085 | r31086 | |
| 31 | 33 | : driver_device(mconfig, type, tag) |
| 32 | 34 | , m_maincpu(*this, "maincpu") |
| 33 | 35 | , m_subcpu(*this, "subcpu") |
| 36 | , m_buzzer(*this, "buzzer") |
| 34 | 37 | { } |
| 35 | 38 | |
| 36 | 39 | DECLARE_WRITE8_MEMBER(dualport_ram_left_w); |
| 37 | 40 | DECLARE_WRITE8_MEMBER(dualport_ram_right_w); |
| 38 | 41 | DECLARE_READ8_MEMBER(dualport_ram_left_r); |
| 39 | 42 | DECLARE_READ8_MEMBER(dualport_ram_right_r); |
| 43 | DECLARE_WRITE_LINE_MEMBER(GPI_w); |
| 44 | DECLARE_WRITE_LINE_MEMBER(buzzer_w); |
| 45 | DECLARE_WRITE_LINE_MEMBER(external_monitor_w); |
| 40 | 46 | |
| 41 | 47 | DECLARE_WRITE8_MEMBER(io_expander_w); |
| 42 | 48 | DECLARE_READ8_MEMBER(io_expander_r); |
| r31085 | r31086 | |
| 49 | 55 | virtual void machine_reset(); |
| 50 | 56 | required_device<tmpz84c015_device> m_maincpu; |
| 51 | 57 | required_device<tmpz84c015_device> m_subcpu; |
| 58 | required_device<beep_device> m_buzzer; |
| 52 | 59 | UINT8 io_SEL, io_LD, io_LE, io_SC, io_KY; |
| 53 | 60 | }; |
| 54 | 61 | |
| 62 | WRITE_LINE_MEMBER( pve500_state::GPI_w ) |
| 63 | { |
| 64 | /* TODO: Implement-me */ |
| 65 | } |
| 55 | 66 | |
| 67 | WRITE_LINE_MEMBER( pve500_state::buzzer_w ) |
| 68 | { |
| 69 | m_buzzer->set_state(state); |
| 70 | } |
| 71 | |
| 72 | WRITE_LINE_MEMBER( pve500_state::external_monitor_w ) |
| 73 | { |
| 74 | /* TODO: Implement-me */ |
| 75 | } |
| 76 | |
| 56 | 77 | static const z80_daisy_config maincpu_daisy_chain[] = |
| 57 | 78 | { |
| 58 | 79 | TMPZ84C015_DAISY_INTERNAL, |
| r31085 | r31086 | |
| 61 | 82 | { NULL } |
| 62 | 83 | }; |
| 63 | 84 | |
| 85 | static const z80_daisy_config subcpu_daisy_chain[] = |
| 86 | { |
| 87 | TMPZ84C015_DAISY_INTERNAL, |
| 88 | { NULL } |
| 89 | }; |
| 64 | 90 | |
| 91 | |
| 65 | 92 | static ADDRESS_MAP_START(maincpu_io, AS_IO, 8, pve500_state) |
| 66 | 93 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 67 | 94 | AM_RANGE(0x00, 0x03) AM_DEVREADWRITE("external_sio", z80sio0_device, cd_ba_r, cd_ba_w) |
| r31085 | r31086 | |
| 76 | 103 | AM_RANGE (0xE000, 0xE7FF) AM_MIRROR(0x1800) AM_RAM AM_SHARE("sharedram") // ICF5: 2kbytes of RAM shared between the two CPUs |
| 77 | 104 | ADDRESS_MAP_END |
| 78 | 105 | |
| 106 | static ADDRESS_MAP_START(subcpu_io, AS_IO, 8, pve500_state) |
| 107 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 108 | ADDRESS_MAP_END |
| 109 | |
| 79 | 110 | static ADDRESS_MAP_START(subcpu_prg, AS_PROGRAM, 8, pve500_state) |
| 80 | 111 | AM_RANGE (0x0000, 0x7FFF) AM_ROM // ICG5: 32kbytes EEPROM |
| 81 | 112 | AM_RANGE (0x8000, 0xBFFF) AM_MIRROR(0x3FF8) AM_READWRITE(io_expander_r, io_expander_w) // ICG3: I/O Expander |
| r31085 | r31086 | |
| 191 | 222 | |
| 192 | 223 | void pve500_state::machine_reset() |
| 193 | 224 | { |
| 225 | /* Setup beep */ |
| 226 | m_buzzer->set_state(0); |
| 227 | m_buzzer->set_frequency(3750); //CLK2 coming out of IC D4 (frequency divider circuitry) |
| 194 | 228 | } |
| 195 | 229 | |
| 196 | 230 | READ8_MEMBER(pve500_state::dualport_ram_left_r) |
| 197 | 231 | { |
| 198 | | //printf("dualport_ram: Left READ\n"); |
| 232 | printf("dualport_ram: Left READ\n"); |
| 199 | 233 | m_subcpu->trg1(1); //(INT_Right) |
| 200 | 234 | return dualport_7FE_data; |
| 201 | 235 | } |
| 202 | 236 | |
| 203 | 237 | WRITE8_MEMBER(pve500_state::dualport_ram_left_w) |
| 204 | 238 | { |
| 205 | | //printf("dualport_ram: Left WRITE\n"); |
| 239 | printf("dualport_ram: Left WRITE\n"); |
| 206 | 240 | dualport_7FF_data = data; |
| 207 | 241 | m_subcpu->trg1(0); //(INT_Right) |
| 208 | 242 | } |
| 209 | 243 | |
| 210 | 244 | READ8_MEMBER(pve500_state::dualport_ram_right_r) |
| 211 | 245 | { |
| 212 | | //printf("dualport_ram: Right READ\n"); |
| 246 | printf("dualport_ram: Right READ\n"); |
| 213 | 247 | m_maincpu->trg1(1); //(INT_Left) |
| 214 | 248 | return dualport_7FF_data; |
| 215 | 249 | } |
| 216 | 250 | |
| 217 | 251 | WRITE8_MEMBER(pve500_state::dualport_ram_right_w) |
| 218 | 252 | { |
| 219 | | //printf("dualport_ram: Right WRITE\n"); |
| 253 | printf("dualport_ram: Right WRITE\n"); |
| 220 | 254 | dualport_7FE_data = data; |
| 221 | 255 | m_maincpu->trg1(0); //(INT_Left) |
| 222 | 256 | } |
| 223 | 257 | |
| 224 | 258 | READ8_MEMBER(pve500_state::io_expander_r) |
| 225 | 259 | { |
| 260 | printf("READ IO_EXPANDER_PORT%c\n", 'A'+offset); |
| 226 | 261 | switch (offset){ |
| 227 | 262 | case IO_EXPANDER_PORTA: |
| 228 | 263 | return io_SC; |
| r31085 | r31086 | |
| 250 | 285 | |
| 251 | 286 | WRITE8_MEMBER(pve500_state::io_expander_w) |
| 252 | 287 | { |
| 253 | | //printf("io_expander_w: offset=%d data=%02X\n", offset, data); |
| 254 | 288 | switch (offset){ |
| 255 | 289 | case IO_EXPANDER_PORTA: |
| 290 | printf("io_expander_w: PORTA (io_SC=%02X)\n", data); |
| 256 | 291 | io_SC = data; |
| 257 | 292 | break; |
| 258 | 293 | case IO_EXPANDER_PORTB: |
| 294 | printf("io_expander_w: PORTB (io_LE=%02X)\n", data); |
| 259 | 295 | io_LE = data; |
| 260 | 296 | break; |
| 261 | 297 | case IO_EXPANDER_PORTC: |
| 298 | printf("io_expander_w: PORTC (io_KY=%02X)\n", data); |
| 262 | 299 | io_KY = data; |
| 263 | 300 | break; |
| 264 | 301 | case IO_EXPANDER_PORTD: |
| 302 | printf("io_expander_w: PORTD (io_LD=%02X)\n", data); |
| 265 | 303 | io_LD = data; |
| 266 | 304 | break; |
| 267 | 305 | case IO_EXPANDER_PORTE: |
| 268 | 306 | io_SEL = data; |
| 307 | printf("io_expander_w PORTE (io_SEL=%02X)\n", data); |
| 269 | 308 | for (int i=0; i<4; i++){ |
| 270 | 309 | if (io_SEL & (1 << i)){ |
| 271 | 310 | for (int j=0; j<8; j++){ |
| 272 | 311 | if (io_SC & (1<<j)){ |
| 273 | 312 | output_set_digit_value(8*i + j, BITSWAP8(io_LD & 0x7F, 7, 0, 1, 2, 3, 4, 5, 6)); |
| 274 | | //printf("io_expander_w PORTE data=%02X\n", data); |
| 275 | 313 | } |
| 276 | 314 | } |
| 277 | 315 | } |
| r31085 | r31086 | |
| 283 | 321 | } |
| 284 | 322 | |
| 285 | 323 | static MACHINE_CONFIG_START( pve500, pve500_state ) |
| 324 | /* Main CPU */ |
| 286 | 325 | MCFG_CPU_ADD("maincpu", TMPZ84C015, XTAL_12MHz / 2) /* TMPZ84C015BF-6 */ |
| 287 | 326 | MCFG_CPU_PROGRAM_MAP(maincpu_prg) |
| 288 | 327 | MCFG_CPU_IO_MAP(maincpu_io) |
| 289 | 328 | MCFG_CPU_CONFIG(maincpu_daisy_chain) |
| 329 | MCFG_TMPZ84C015_OUT_DTRA_CB(WRITELINE(pve500_state, GPI_w)) |
| 330 | MCFG_TMPZ84C015_OUT_DTRB_CB(WRITELINE(pve500_state, buzzer_w)) |
| 331 | MCFG_TMPZ84C015_OUT_TXDA_CB(DEVWRITELINE("recorder", rs232_port_device, write_txd)) |
| 332 | MCFG_TMPZ84C015_OUT_TXDB_CB(DEVWRITELINE("player1", rs232_port_device, write_txd)) |
| 290 | 333 | |
| 291 | 334 | MCFG_DEVICE_ADD("external_ctc", Z80CTC, XTAL_12MHz / 2) |
| 292 | 335 | MCFG_Z80CTC_INTR_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) |
| 293 | 336 | |
| 294 | 337 | MCFG_Z80SIO0_ADD("external_sio", XTAL_12MHz / 2, 0, 0, 0, 0) |
| 295 | 338 | MCFG_Z80DART_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) |
| 339 | MCFG_Z80DART_OUT_TXDA_CB(DEVWRITELINE("player2", rs232_port_device, write_txd)) |
| 340 | MCFG_Z80DART_OUT_TXDB_CB(DEVWRITELINE("edl_inout", rs232_port_device, write_txd)) |
| 296 | 341 | |
| 342 | /* Secondary CPU */ |
| 297 | 343 | MCFG_CPU_ADD("subcpu", TMPZ84C015, XTAL_12MHz / 2) /* TMPZ84C015BF-6 */ |
| 298 | 344 | MCFG_CPU_PROGRAM_MAP(subcpu_prg) |
| 345 | MCFG_CPU_IO_MAP(subcpu_io) |
| 346 | MCFG_CPU_CONFIG(subcpu_daisy_chain) |
| 347 | MCFG_TMPZ84C015_OUT_DTRB_CB(WRITELINE(pve500_state, external_monitor_w)) |
| 348 | MCFG_TMPZ84C015_OUT_TXDA_CB(DEVWRITELINE("switcher", rs232_port_device, write_txd)) |
| 349 | MCFG_TMPZ84C015_OUT_TXDB_CB(DEVWRITELINE("serial_mixer", rs232_port_device, write_txd)) |
| 299 | 350 | |
| 351 | /* FIX-ME: These are actually RS422 ports (except EDL IN/OUT which is indeed an RS232 port)*/ |
| 352 | MCFG_RS232_PORT_ADD("recorder", default_rs232_devices, NULL) |
| 353 | MCFG_RS232_RXD_HANDLER(DEVWRITELINE("maincpu:tmpz84c015_sio", z80dart_device, rxa_w)) |
| 354 | |
| 355 | MCFG_RS232_PORT_ADD("player1", default_rs232_devices, NULL) |
| 356 | MCFG_RS232_RXD_HANDLER(DEVWRITELINE("maincpu:tmpz84c015_sio", z80dart_device, rxb_w)) |
| 357 | |
| 358 | MCFG_RS232_PORT_ADD("player2", default_rs232_devices, NULL) |
| 359 | MCFG_RS232_RXD_HANDLER(DEVWRITELINE("external_sio", z80dart_device, rxa_w)) |
| 360 | |
| 361 | MCFG_RS232_PORT_ADD("edl_inout", default_rs232_devices, NULL) |
| 362 | MCFG_RS232_RXD_HANDLER(DEVWRITELINE("external_sio", z80dart_device, rxb_w)) |
| 363 | |
| 364 | MCFG_RS232_PORT_ADD("switcher", default_rs232_devices, NULL) |
| 365 | MCFG_RS232_RXD_HANDLER(DEVWRITELINE("subcpu:tmpz84c015_sio", z80dart_device, rxa_w)) |
| 366 | |
| 367 | MCFG_RS232_PORT_ADD("serial_mixer", default_rs232_devices, NULL) |
| 368 | MCFG_RS232_RXD_HANDLER(DEVWRITELINE("subcpu:tmpz84c015_sio", z80dart_device, rxb_w)) |
| 369 | |
| 300 | 370 | /* TODO: |
| 301 | 371 | -> There are a few LEDs and a sequence of 7-seg displays with atotal of 27 digits |
| 302 | | -> Sound hardware consists of a buzzer connected to a signal of the maincpu SIO and a logic-gate that attaches/detaches it from the |
| 303 | | system clock Which apparently means you can only beep the buzzer to a certain predefined tone or keep it mute. |
| 304 | 372 | */ |
| 305 | 373 | |
| 306 | 374 | /* video hardware */ |
| 307 | 375 | MCFG_DEFAULT_LAYOUT(layout_pve500) |
| 308 | 376 | |
| 377 | /* audio hardware */ |
| 378 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 379 | MCFG_SOUND_ADD("buzzer", BEEP, 0) |
| 380 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) |
| 381 | |
| 309 | 382 | MACHINE_CONFIG_END |
| 310 | 383 | |
| 311 | 384 | ROM_START( pve500 ) |
| r31085 | r31086 | |
| 317 | 390 | ROM_END |
| 318 | 391 | |
| 319 | 392 | /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ |
| 320 | | COMP( 1995, pve500, 0, 0, pve500, pve500, pve500_state, pve500, "SONY", "PVE-500", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND) |
| 393 | COMP( 1995, pve500, 0, 0, pve500, pve500, pve500_state, pve500, "SONY", "PVE-500", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS) |