trunk/src/mess/drivers/cbm2.c
| r21093 | r21094 | |
| 1888 | 1888 | // rs232_port_interface rs232_intf |
| 1889 | 1889 | //------------------------------------------------- |
| 1890 | 1890 | |
| 1891 | | static SLOT_INTERFACE_START( rs232_devices ) |
| 1892 | | SLOT_INTERFACE_END |
| 1893 | | |
| 1894 | 1891 | static const rs232_port_interface rs232_intf = |
| 1895 | 1892 | { |
| 1893 | DEVCB_DEVICE_LINE_MEMBER(MOS6551A_TAG, mos6551_device, rxd_w), |
| 1894 | DEVCB_DEVICE_LINE_MEMBER(MOS6551A_TAG, mos6551_device, dcd_w), |
| 1895 | DEVCB_DEVICE_LINE_MEMBER(MOS6551A_TAG, mos6551_device, dsr_w), |
| 1896 | 1896 | DEVCB_NULL, |
| 1897 | | DEVCB_NULL, |
| 1898 | | DEVCB_NULL, |
| 1899 | | DEVCB_NULL, |
| 1900 | | DEVCB_NULL |
| 1897 | DEVCB_DEVICE_LINE_MEMBER(MOS6551A_TAG, mos6551_device, cts_w) |
| 1901 | 1898 | }; |
| 1902 | 1899 | |
| 1903 | 1900 | |
| r21093 | r21094 | |
| 2148 | 2145 | MCFG_TPI6525_ADD(MOS6525_1_TAG, p500_tpi1_intf) |
| 2149 | 2146 | MCFG_TPI6525_ADD(MOS6525_2_TAG, p500_tpi2_intf) |
| 2150 | 2147 | MCFG_MOS6551_ADD(MOS6551A_TAG, XTAL_1_8432MHz, DEVWRITELINE(MOS6525_1_TAG, tpi6525_device, i4_w)) |
| 2148 | MCFG_MOS6551_RXD_TXD_CALLBACKS(NULL, DEVWRITELINE(RS232_TAG, rs232_port_device, tx)) |
| 2151 | 2149 | MCFG_MOS6526_ADD(MOS6526_TAG, VIC6567_CLOCK, 60, DEVWRITELINE(MOS6525_1_TAG, tpi6525_device, i2_w)) |
| 2152 | 2150 | MCFG_MOS6526_SERIAL_CALLBACKS(DEVWRITELINE(CBM2_USER_PORT_TAG, cbm2_user_port_device, cnt_w), DEVWRITELINE(CBM2_USER_PORT_TAG, cbm2_user_port_device, sp_w)) |
| 2153 | 2151 | MCFG_MOS6526_PORT_A_CALLBACKS(DEVREAD8(DEVICE_SELF, cbm2_state, cia_pa_r), DEVWRITE8(DEVICE_SELF, cbm2_state, cia_pa_w)) |
| r21093 | r21094 | |
| 2162 | 2160 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, NULL, NULL) |
| 2163 | 2161 | MCFG_CBM2_EXPANSION_SLOT_ADD(CBM2_EXPANSION_SLOT_TAG, VIC6567_CLOCK, cbm2_expansion_cards, NULL, NULL) |
| 2164 | 2162 | MCFG_CBM2_USER_PORT_ADD(CBM2_USER_PORT_TAG, p500_user_intf, cbm2_user_port_cards, NULL, NULL) |
| 2165 | | MCFG_RS232_PORT_ADD(RS232_TAG, rs232_intf, rs232_devices, NULL, NULL) |
| 2163 | MCFG_RS232_PORT_ADD(RS232_TAG, rs232_intf, default_rs232_devices, NULL, NULL) |
| 2166 | 2164 | MCFG_QUICKLOAD_ADD("quickload", p500, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS) |
| 2167 | 2165 | |
| 2168 | 2166 | // internal ram |
| r21093 | r21094 | |
| 2204 | 2202 | MCFG_TPI6525_ADD(MOS6525_1_TAG, p500_tpi1_intf) |
| 2205 | 2203 | MCFG_TPI6525_ADD(MOS6525_2_TAG, p500_tpi2_intf) |
| 2206 | 2204 | MCFG_MOS6551_ADD(MOS6551A_TAG, XTAL_1_8432MHz, DEVWRITELINE(MOS6525_1_TAG, tpi6525_device, i4_w)) |
| 2205 | MCFG_MOS6551_RXD_TXD_CALLBACKS(NULL, DEVWRITELINE(RS232_TAG, rs232_port_device, tx)) |
| 2207 | 2206 | MCFG_MOS6526_ADD(MOS6526_TAG, VIC6569_CLOCK, 50, DEVWRITELINE(MOS6525_1_TAG, tpi6525_device, i2_w)) |
| 2208 | 2207 | MCFG_MOS6526_SERIAL_CALLBACKS(DEVWRITELINE(CBM2_USER_PORT_TAG, cbm2_user_port_device, cnt_w), DEVWRITELINE(CBM2_USER_PORT_TAG, cbm2_user_port_device, sp_w)) |
| 2209 | 2208 | MCFG_MOS6526_PORT_A_CALLBACKS(DEVREAD8(DEVICE_SELF, cbm2_state, cia_pa_r), DEVWRITE8(DEVICE_SELF, cbm2_state, cia_pa_w)) |
| r21093 | r21094 | |
| 2218 | 2217 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, NULL, NULL) |
| 2219 | 2218 | MCFG_CBM2_EXPANSION_SLOT_ADD(CBM2_EXPANSION_SLOT_TAG, VIC6569_CLOCK, cbm2_expansion_cards, NULL, NULL) |
| 2220 | 2219 | MCFG_CBM2_USER_PORT_ADD(CBM2_USER_PORT_TAG, p500_user_intf, cbm2_user_port_cards, NULL, NULL) |
| 2221 | | MCFG_RS232_PORT_ADD(RS232_TAG, rs232_intf, rs232_devices, NULL, NULL) |
| 2220 | MCFG_RS232_PORT_ADD(RS232_TAG, rs232_intf, default_rs232_devices, NULL, NULL) |
| 2222 | 2221 | MCFG_QUICKLOAD_ADD("quickload", p500, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS) |
| 2223 | 2222 | |
| 2224 | 2223 | // internal ram |
| r21093 | r21094 | |
| 2267 | 2266 | MCFG_TPI6525_ADD(MOS6525_1_TAG, tpi1_intf) |
| 2268 | 2267 | MCFG_TPI6525_ADD(MOS6525_2_TAG, tpi2_intf) |
| 2269 | 2268 | MCFG_MOS6551_ADD(MOS6551A_TAG, XTAL_1_8432MHz, DEVWRITELINE(MOS6525_1_TAG, tpi6525_device, i4_w)) |
| 2269 | MCFG_MOS6551_RXD_TXD_CALLBACKS(NULL, DEVWRITELINE(RS232_TAG, rs232_port_device, tx)) |
| 2270 | 2270 | MCFG_MOS6526_ADD(MOS6526_TAG, XTAL_18MHz/9, 60, DEVWRITELINE(MOS6525_1_TAG, tpi6525_device, i2_w)) |
| 2271 | 2271 | MCFG_MOS6526_SERIAL_CALLBACKS(DEVWRITELINE(CBM2_USER_PORT_TAG, cbm2_user_port_device, cnt_w), DEVWRITELINE(CBM2_USER_PORT_TAG, cbm2_user_port_device, sp_w)) |
| 2272 | 2272 | MCFG_MOS6526_PORT_A_CALLBACKS(DEVREAD8(DEVICE_SELF, cbm2_state, cia_pa_r), DEVWRITE8(DEVICE_SELF, cbm2_state, cia_pa_w)) |
| r21093 | r21094 | |
| 2280 | 2280 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, NULL, NULL) |
| 2281 | 2281 | MCFG_CBM2_EXPANSION_SLOT_ADD(CBM2_EXPANSION_SLOT_TAG, XTAL_18MHz/9, cbm2_expansion_cards, NULL, NULL) |
| 2282 | 2282 | MCFG_CBM2_USER_PORT_ADD(CBM2_USER_PORT_TAG, user_intf, cbm2_user_port_cards, NULL, NULL) |
| 2283 | | MCFG_RS232_PORT_ADD(RS232_TAG, rs232_intf, rs232_devices, NULL, NULL) |
| 2283 | MCFG_RS232_PORT_ADD(RS232_TAG, rs232_intf, default_rs232_devices, NULL, NULL) |
| 2284 | 2284 | MCFG_QUICKLOAD_ADD("quickload", cbmb, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS) |
| 2285 | 2285 | |
| 2286 | 2286 | // software list |
trunk/src/mess/drivers/c64.c
| r21093 | r21094 | |
| 47 | 47 | //int rdy = m_exp_dma && m_vic_ba; |
| 48 | 48 | |
| 49 | 49 | m_maincpu->set_input_line(M6510_IRQ_LINE, irq); |
| 50 | | m_maincpu->set_input_line(INPUT_LINE_NMI, nmi); |
| 50 | m_maincpu->set_input_line(M6510_NMI_LINE, nmi); |
| 51 | 51 | } |
| 52 | 52 | |
| 53 | 53 | |
| r21093 | r21094 | |
| 947 | 947 | // C64_EXPANSION_INTERFACE( expansion_intf ) |
| 948 | 948 | //------------------------------------------------- |
| 949 | 949 | |
| 950 | | READ8_MEMBER( c64_state::exp_dma_cd_r ) |
| 951 | | { |
| 952 | | return m_maincpu->space(AS_PROGRAM).read_byte(offset); |
| 953 | | } |
| 954 | | |
| 955 | | WRITE8_MEMBER( c64_state::exp_dma_cd_w ) |
| 956 | | { |
| 957 | | m_maincpu->space(AS_PROGRAM).write_byte(offset, data); |
| 958 | | } |
| 959 | | |
| 960 | 950 | WRITE_LINE_MEMBER( c64_state::exp_irq_w ) |
| 961 | 951 | { |
| 962 | 952 | m_exp_irq = state; |
| r21093 | r21094 | |
| 1107 | 1097 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, "joy", NULL) |
| 1108 | 1098 | MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, VIC6567_CLOCK, c64_expansion_cards, NULL, NULL) |
| 1109 | 1099 | MCFG_C64_EXPANSION_SLOT_IRQ_CALLBACKS(DEVWRITELINE(DEVICE_SELF, c64_state, exp_irq_w), DEVWRITELINE(DEVICE_SELF, c64_state, exp_nmi_w), DEVWRITELINE(DEVICE_SELF, c64_state, exp_reset_w)) |
| 1110 | | MCFG_C64_EXPANSION_SLOT_DMA_CALLBACKS(DEVREAD8(DEVICE_SELF, c64_state, exp_dma_cd_r), DEVWRITE8(DEVICE_SELF, c64_state, exp_dma_cd_w), DEVWRITELINE(DEVICE_SELF, c64_state, exp_dma_w)) |
| 1100 | MCFG_C64_EXPANSION_SLOT_DMA_CALLBACKS(DEVREAD8(DEVICE_SELF, c64_state, read), DEVWRITE8(DEVICE_SELF, c64_state, write), DEVWRITELINE(DEVICE_SELF, c64_state, exp_dma_w)) |
| 1111 | 1101 | MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL) |
| 1112 | 1102 | MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS) |
| 1113 | 1103 | |
| r21093 | r21094 | |
| 1218 | 1208 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, "joy", NULL) |
| 1219 | 1209 | MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, VIC6569_CLOCK, c64_expansion_cards, NULL, NULL) |
| 1220 | 1210 | MCFG_C64_EXPANSION_SLOT_IRQ_CALLBACKS(DEVWRITELINE(DEVICE_SELF, c64_state, exp_irq_w), DEVWRITELINE(DEVICE_SELF, c64_state, exp_nmi_w), DEVWRITELINE(DEVICE_SELF, c64_state, exp_reset_w)) |
| 1221 | | MCFG_C64_EXPANSION_SLOT_DMA_CALLBACKS(DEVREAD8(DEVICE_SELF, c64_state, exp_dma_cd_r), DEVWRITE8(DEVICE_SELF, c64_state, exp_dma_cd_w), DEVWRITELINE(DEVICE_SELF, c64_state, exp_dma_w)) |
| 1211 | MCFG_C64_EXPANSION_SLOT_DMA_CALLBACKS(DEVREAD8(DEVICE_SELF, c64_state, read), DEVWRITE8(DEVICE_SELF, c64_state, write), DEVWRITELINE(DEVICE_SELF, c64_state, exp_dma_w)) |
| 1222 | 1212 | MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL) |
| 1223 | 1213 | MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS) |
| 1224 | 1214 | |
| r21093 | r21094 | |
| 1307 | 1297 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, "joy", NULL) |
| 1308 | 1298 | MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, VIC6569_CLOCK, c64_expansion_cards, NULL, NULL) |
| 1309 | 1299 | MCFG_C64_EXPANSION_SLOT_IRQ_CALLBACKS(DEVWRITELINE(DEVICE_SELF, c64_state, exp_irq_w), DEVWRITELINE(DEVICE_SELF, c64_state, exp_nmi_w), DEVWRITELINE(DEVICE_SELF, c64_state, exp_reset_w)) |
| 1310 | | MCFG_C64_EXPANSION_SLOT_DMA_CALLBACKS(DEVREAD8(DEVICE_SELF, c64_state, exp_dma_cd_r), DEVWRITE8(DEVICE_SELF, c64_state, exp_dma_cd_w), DEVWRITELINE(DEVICE_SELF, c64_state, exp_dma_w)) |
| 1300 | MCFG_C64_EXPANSION_SLOT_DMA_CALLBACKS(DEVREAD8(DEVICE_SELF, c64_state, read), DEVWRITE8(DEVICE_SELF, c64_state, write), DEVWRITELINE(DEVICE_SELF, c64_state, exp_dma_w)) |
| 1311 | 1301 | MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL) |
| 1312 | 1302 | MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS) |
| 1313 | 1303 | |
trunk/src/mess/drivers/vic20.c
| r21093 | r21094 | |
| 1 | 1 | /* |
| 2 | | |
| 3 | | [CBM systems which belong to this driver (info to be moved to sysinfo.dat soon)] |
| 4 | | (most of the informations are taken from http://www.zimmers.net/cbmpics/ ) |
| 5 | | |
| 6 | | |
| 7 | | * VIC-1001 (1981, Japan) |
| 8 | | |
| 9 | | The first model released was the Japanese one. It featured support for the |
| 10 | | Japanese katakana character. |
| 11 | | |
| 12 | | CPU: MOS Technology 6502 (1.01 MHz) |
| 13 | | RAM: 5 kilobytes (Expanded to 21k though an external 16k unit) |
| 14 | | ROM: 20 kilobytes |
| 15 | | Video: MOS Technology 6560 "VIC"(Text: 22 columns, 23 rows; Hires: 176x184 |
| 16 | | pixels bitmapped; 8 text colors, 16 background colors) |
| 17 | | Sound: MOS Technology 6560 "VIC" (3 voices -square wave-, noise and volume) |
| 18 | | Ports: 6522 VIA x2 (1 Joystick/Mouse port; CBM Serial port; 'Cartridge / |
| 19 | | Game / Expansion' port; CBM Monitor port; CBM 'USER' port; Power and |
| 20 | | reset switches; Power connector) |
| 21 | | Keyboard: Full-sized QWERTY 66 key (8 programmable function keys; 2 sets of |
| 22 | | Keyboardable graphic characters; 2 key direction cursor-pad) |
| 23 | | |
| 24 | | |
| 25 | | * VIC 20 (1981) |
| 26 | | |
| 27 | | This system was the first computer to sell more than one million units |
| 28 | | worldwide. It was sold both in Europe and in the US. In Germany the |
| 29 | | computer was renamed as VC 20 (apparently, it stands for 'VolksComputer' |
| 30 | | |
| 31 | | CPU: MOS Technology 6502A (1.01 MHz) |
| 32 | | RAM: 5 kilobytes (Expanded to 32k) |
| 33 | | ROM: 20 kilobytes |
| 34 | | Video: MOS Technology 6560 "VIC"(Text: 22 columns, 23 rows; Hires: 176x184 |
| 35 | | pixels bitmapped; 8 text colors, 16 background colors) |
| 36 | | Sound: MOS Technology 6560 "VIC" (3 voices -square wave-, noise and volume) |
| 37 | | Ports: 6522 VIA x2 (1 Joystick/Mouse port; CBM Serial port; 'Cartridge / |
| 38 | | Game / Expansion' port; CBM Monitor port; CBM 'USER' port; Power and |
| 39 | | reset switches; Power connector) |
| 40 | | Keyboard: Full-sized QWERTY 66 key (8 programmable function keys; 2 sets of |
| 41 | | Keyboardable graphic characters; 2 key direction cursor-pad) |
| 42 | | |
| 43 | | |
| 44 | | * VIC 21 (1983) |
| 45 | | |
| 46 | | It consists of a VIC 20 with built-in RAM expansion, to reach a RAM |
| 47 | | capability of 21 kilobytes. |
| 48 | | |
| 49 | | |
| 50 | | * VIC 20CR |
| 51 | | |
| 52 | | CR stands for Cost Reduced, as it consisted of a board with only 2 (larger) |
| 53 | | block of RAM instead of 8. |
| 54 | | |
| 55 | | ******************************************************************************* |
| 56 | | |
| 57 | 2 | TODO: |
| 58 | 3 | |
| 59 | 4 | - C1540 is not working currently |
| 60 | | - access violation in mos6560.c |
| 61 | | * In the Chips (Japan, USA).60 |
| 62 | | * K-Star Patrol (Europe).60 |
| 63 | | * Seafox (Japan, USA).60 |
| 64 | 5 | - mos6560_port_r/w should respond at 0x1000-0x100f |
| 65 | 6 | - VIC21 (built in 21K ram) |
| 66 | 7 | |
| r21093 | r21094 | |
| 119 | 60 | case IO0: |
| 120 | 61 | if (BIT(offset, 4)) |
| 121 | 62 | { |
| 122 | | data = m_via0->read(space, offset & 0x0f); |
| 63 | data = m_via1->read(space, offset & 0x0f); |
| 123 | 64 | } |
| 124 | 65 | else if (BIT(offset, 5)) |
| 125 | 66 | { |
| 126 | | data = m_via1->read(space, offset & 0x0f); |
| 67 | data = m_via2->read(space, offset & 0x0f); |
| 127 | 68 | } |
| 128 | 69 | else if (offset >= 0x9000 && offset < 0x9010) |
| 129 | 70 | { |
| r21093 | r21094 | |
| 194 | 135 | case IO0: |
| 195 | 136 | if (BIT(offset, 4)) |
| 196 | 137 | { |
| 197 | | m_via0->write(space, offset & 0x0f, data); |
| 138 | m_via1->write(space, offset & 0x0f, data); |
| 198 | 139 | } |
| 199 | 140 | else if (BIT(offset, 5)) |
| 200 | 141 | { |
| 201 | | m_via1->write(space, offset & 0x0f, data); |
| 142 | m_via2->write(space, offset & 0x0f, data); |
| 202 | 143 | } |
| 203 | 144 | else if (offset >= 0x9000 && offset < 0x9010) |
| 204 | 145 | { |
| r21093 | r21094 | |
| 383 | 324 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') |
| 384 | 325 | |
| 385 | 326 | PORT_START( "RESTORE" ) |
| 386 | | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RESTORE") PORT_CODE(KEYCODE_PRTSCR) PORT_WRITE_LINE_DEVICE_MEMBER(M6522_0_TAG, via6522_device, write_ca1) |
| 327 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RESTORE") PORT_CODE(KEYCODE_PRTSCR) PORT_WRITE_LINE_DEVICE_MEMBER(M6522_1_TAG, via6522_device, write_ca1) |
| 387 | 328 | |
| 388 | 329 | PORT_START( "LOCK" ) |
| 389 | 330 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHIFT LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) |
| r21093 | r21094 | |
| 438 | 379 | //************************************************************************** |
| 439 | 380 | |
| 440 | 381 | //------------------------------------------------- |
| 441 | | // via6522_interface via0_intf |
| 382 | // via6522_interface via1_intf |
| 442 | 383 | //------------------------------------------------- |
| 443 | 384 | |
| 444 | | READ8_MEMBER( vic20_state::via0_pa_r ) |
| 385 | READ8_MEMBER( vic20_state::via1_pa_r ) |
| 445 | 386 | { |
| 446 | 387 | /* |
| 447 | 388 | |
| r21093 | r21094 | |
| 480 | 421 | return data; |
| 481 | 422 | } |
| 482 | 423 | |
| 483 | | WRITE8_MEMBER( vic20_state::via0_pa_w ) |
| 424 | WRITE8_MEMBER( vic20_state::via1_pa_w ) |
| 484 | 425 | { |
| 485 | 426 | /* |
| 486 | 427 | |
| r21093 | r21094 | |
| 504 | 445 | m_iec->atn_w(!BIT(data, 7)); |
| 505 | 446 | } |
| 506 | 447 | |
| 507 | | READ_LINE_MEMBER( vic20_state::via0_ca1_r ) |
| 448 | READ_LINE_MEMBER( vic20_state::via1_ca1_r ) |
| 508 | 449 | { |
| 509 | 450 | return m_restore->read(); |
| 510 | 451 | } |
| 511 | 452 | |
| 512 | | static const via6522_interface via0_intf = |
| 453 | static const via6522_interface via1_intf = |
| 513 | 454 | { |
| 514 | | DEVCB_DRIVER_MEMBER(vic20_state, via0_pa_r), |
| 455 | DEVCB_DRIVER_MEMBER(vic20_state, via1_pa_r), |
| 515 | 456 | DEVCB_DEVICE_MEMBER(VIC20_USER_PORT_TAG, vic20_user_port_device, pb_r), |
| 516 | | DEVCB_DRIVER_LINE_MEMBER(vic20_state, via0_ca1_r), |
| 457 | DEVCB_DRIVER_LINE_MEMBER(vic20_state, via1_ca1_r), |
| 517 | 458 | DEVCB_NULL, |
| 518 | 459 | DEVCB_NULL, |
| 519 | 460 | DEVCB_NULL, |
| 520 | | DEVCB_DRIVER_MEMBER(vic20_state, via0_pa_w), |
| 461 | DEVCB_DRIVER_MEMBER(vic20_state, via1_pa_w), |
| 521 | 462 | DEVCB_DEVICE_MEMBER(VIC20_USER_PORT_TAG, vic20_user_port_device, pb_w), |
| 522 | 463 | DEVCB_NULL, |
| 523 | 464 | DEVCB_DEVICE_LINE_MEMBER(VIC20_USER_PORT_TAG, vic20_user_port_device, cb1_w), |
| r21093 | r21094 | |
| 528 | 469 | |
| 529 | 470 | |
| 530 | 471 | //------------------------------------------------- |
| 531 | | // via6522_interface via1_intf |
| 472 | // via6522_interface via2_intf |
| 532 | 473 | //------------------------------------------------- |
| 533 | 474 | |
| 534 | | READ8_MEMBER( vic20_state::via1_pa_r ) |
| 475 | READ8_MEMBER( vic20_state::via2_pa_r ) |
| 535 | 476 | { |
| 536 | 477 | /* |
| 537 | 478 | |
| r21093 | r21094 | |
| 562 | 503 | return data; |
| 563 | 504 | } |
| 564 | 505 | |
| 565 | | READ8_MEMBER( vic20_state::via1_pb_r ) |
| 506 | READ8_MEMBER( vic20_state::via2_pb_r ) |
| 566 | 507 | { |
| 567 | 508 | /* |
| 568 | 509 | |
| r21093 | r21094 | |
| 589 | 530 | return data; |
| 590 | 531 | } |
| 591 | 532 | |
| 592 | | WRITE8_MEMBER( vic20_state::via1_pb_w ) |
| 533 | WRITE8_MEMBER( vic20_state::via2_pb_w ) |
| 593 | 534 | { |
| 594 | 535 | /* |
| 595 | 536 | |
| r21093 | r21094 | |
| 613 | 554 | m_key_col = data; |
| 614 | 555 | } |
| 615 | 556 | |
| 616 | | WRITE_LINE_MEMBER( vic20_state::via1_ca2_w ) |
| 557 | WRITE_LINE_MEMBER( vic20_state::via2_ca2_w ) |
| 617 | 558 | { |
| 618 | 559 | // serial clock out |
| 619 | 560 | m_iec->clk_w(!state); |
| 620 | 561 | } |
| 621 | 562 | |
| 622 | | WRITE_LINE_MEMBER( vic20_state::via1_cb2_w ) |
| 563 | WRITE_LINE_MEMBER( vic20_state::via2_cb2_w ) |
| 623 | 564 | { |
| 624 | 565 | // serial data out |
| 625 | 566 | m_iec->data_w(!state); |
| 626 | 567 | } |
| 627 | 568 | |
| 628 | | static const via6522_interface via1_intf = |
| 569 | static const via6522_interface via2_intf = |
| 629 | 570 | { |
| 630 | | DEVCB_DRIVER_MEMBER(vic20_state, via1_pa_r), |
| 631 | | DEVCB_DRIVER_MEMBER(vic20_state, via1_pb_r), |
| 571 | DEVCB_DRIVER_MEMBER(vic20_state, via2_pa_r), |
| 572 | DEVCB_DRIVER_MEMBER(vic20_state, via2_pb_r), |
| 632 | 573 | DEVCB_DEVICE_LINE_MEMBER(PET_DATASSETTE_PORT_TAG, pet_datassette_port_device, read), |
| 633 | 574 | DEVCB_NULL, |
| 634 | 575 | DEVCB_NULL, |
| 635 | 576 | DEVCB_NULL, |
| 636 | 577 | |
| 637 | 578 | DEVCB_NULL, |
| 638 | | DEVCB_DRIVER_MEMBER(vic20_state, via1_pb_w), |
| 579 | DEVCB_DRIVER_MEMBER(vic20_state, via2_pb_w), |
| 639 | 580 | DEVCB_NULL, |
| 640 | 581 | DEVCB_NULL, |
| 641 | | DEVCB_DRIVER_LINE_MEMBER(vic20_state, via1_ca2_w), |
| 642 | | DEVCB_DRIVER_LINE_MEMBER(vic20_state, via1_cb2_w), |
| 582 | DEVCB_DRIVER_LINE_MEMBER(vic20_state, via2_ca2_w), |
| 583 | DEVCB_DRIVER_LINE_MEMBER(vic20_state, via2_cb2_w), |
| 643 | 584 | |
| 644 | 585 | DEVCB_CPU_INPUT_LINE(M6502_TAG, M6502_IRQ_LINE) |
| 645 | 586 | }; |
| r21093 | r21094 | |
| 657 | 598 | } |
| 658 | 599 | } |
| 659 | 600 | |
| 660 | | static VIC20_EXPANSION_INTERFACE( expansion_intf ) |
| 661 | | { |
| 662 | | DEVCB_CPU_INPUT_LINE(M6502_TAG, INPUT_LINE_IRQ0), |
| 663 | | DEVCB_CPU_INPUT_LINE(M6502_TAG, INPUT_LINE_NMI), |
| 664 | | DEVCB_DRIVER_LINE_MEMBER(vic20_state, exp_reset_w) |
| 665 | | }; |
| 666 | 601 | |
| 667 | | |
| 668 | 602 | //------------------------------------------------- |
| 669 | 603 | // VIC20_USER_PORT_INTERFACE( user_intf ) |
| 670 | 604 | //------------------------------------------------- |
| r21093 | r21094 | |
| 672 | 606 | static VIC20_USER_PORT_INTERFACE( user_intf ) |
| 673 | 607 | { |
| 674 | 608 | DEVCB_DEVICE_LINE_MEMBER(M6560_TAG, mos6560_device, lp_w), |
| 675 | | DEVCB_DEVICE_LINE_MEMBER(M6522_0_TAG, via6522_device, write_cb1), |
| 676 | | DEVCB_DEVICE_LINE_MEMBER(M6522_0_TAG, via6522_device, write_cb2), |
| 609 | DEVCB_DEVICE_LINE_MEMBER(M6522_1_TAG, via6522_device, write_cb1), |
| 610 | DEVCB_DEVICE_LINE_MEMBER(M6522_1_TAG, via6522_device, write_cb2), |
| 677 | 611 | DEVCB_DRIVER_LINE_MEMBER(vic20_state, exp_reset_w) |
| 678 | 612 | }; |
| 679 | 613 | |
| r21093 | r21094 | |
| 712 | 646 | m_maincpu->reset(); |
| 713 | 647 | |
| 714 | 648 | m_vic->reset(); |
| 715 | | m_via0->reset(); |
| 716 | 649 | m_via1->reset(); |
| 650 | m_via2->reset(); |
| 717 | 651 | |
| 718 | 652 | m_iec->reset(); |
| 719 | 653 | m_exp->reset(); |
| r21093 | r21094 | |
| 732 | 666 | |
| 733 | 667 | static MACHINE_CONFIG_START( vic20, vic20_state ) |
| 734 | 668 | // devices |
| 735 | | MCFG_VIA6522_ADD(M6522_0_TAG, 0, via0_intf) |
| 736 | 669 | MCFG_VIA6522_ADD(M6522_1_TAG, 0, via1_intf) |
| 737 | | MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, cbm_datassette_devices, "c1530", NULL, DEVWRITELINE(M6522_1_TAG, via6522_device, write_ca1)) |
| 670 | MCFG_VIA6522_ADD(M6522_2_TAG, 0, via2_intf) |
| 671 | MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, cbm_datassette_devices, "c1530", NULL, DEVWRITELINE(M6522_2_TAG, via6522_device, write_ca1)) |
| 738 | 672 | MCFG_CBM_IEC_ADD("c1541") |
| 739 | | MCFG_CBM_IEC_BUS_SRQ_CALLBACK(DEVWRITELINE(M6522_1_TAG, via6522_device, write_cb1)) |
| 673 | MCFG_CBM_IEC_BUS_SRQ_CALLBACK(DEVWRITELINE(M6522_2_TAG, via6522_device, write_cb1)) |
| 740 | 674 | MCFG_VIC20_USER_PORT_ADD(VIC20_USER_PORT_TAG, user_intf, vic20_user_port_cards, NULL, NULL) |
| 741 | 675 | MCFG_QUICKLOAD_ADD("quickload", cbm_vc20, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS) |
| 742 | 676 | |
| r21093 | r21094 | |
| 766 | 700 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 767 | 701 | |
| 768 | 702 | // devices |
| 769 | | MCFG_VIC20_EXPANSION_SLOT_ADD(VIC20_EXPANSION_SLOT_TAG, MOS6560_CLOCK, expansion_intf, vic20_expansion_cards, NULL, NULL) |
| 703 | MCFG_VIC20_EXPANSION_SLOT_ADD(VIC20_EXPANSION_SLOT_TAG, MOS6560_CLOCK, vic20_expansion_cards, NULL, NULL) |
| 704 | MCFG_VIC20_EXPANSION_SLOT_IRQ_CALLBACKS(INPUTLINE(M6502_TAG, M6502_IRQ_LINE), INPUTLINE(M6502_TAG, M6502_NMI_LINE), DEVWRITELINE(DEVICE_SELF, vic20_state, exp_reset_w)) |
| 770 | 705 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, "joy", NULL) |
| 771 | 706 | MCFG_VCS_CONTROL_PORT_TRIGGER_HANDLER(DEVWRITELINE(M6560_TAG, mos6560_device, lp_w)) |
| 772 | 707 | |
| r21093 | r21094 | |
| 792 | 727 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 793 | 728 | |
| 794 | 729 | // devices |
| 795 | | MCFG_VIC20_EXPANSION_SLOT_ADD(VIC20_EXPANSION_SLOT_TAG, MOS6561_CLOCK, expansion_intf, vic20_expansion_cards, NULL, NULL) |
| 730 | MCFG_VIC20_EXPANSION_SLOT_ADD(VIC20_EXPANSION_SLOT_TAG, MOS6561_CLOCK, vic20_expansion_cards, NULL, NULL) |
| 731 | MCFG_VIC20_EXPANSION_SLOT_IRQ_CALLBACKS(INPUTLINE(M6502_TAG, M6502_IRQ_LINE), INPUTLINE(M6502_TAG, M6502_NMI_LINE), DEVWRITELINE(DEVICE_SELF, vic20_state, exp_reset_w)) |
| 796 | 732 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, "joy", NULL) |
| 797 | 733 | MCFG_VCS_CONTROL_PORT_TRIGGER_HANDLER(DEVWRITELINE(M6561_TAG, mos6561_device, lp_w)) |
| 798 | 734 | |
trunk/src/mess/drivers/plus4.c
| r21093 | r21094 | |
| 641 | 641 | // PLUS4_EXPANSION_INTERFACE( expansion_intf ) |
| 642 | 642 | //------------------------------------------------- |
| 643 | 643 | |
| 644 | | READ8_MEMBER( plus4_state::exp_dma_r ) |
| 645 | | { |
| 646 | | return m_maincpu->space(AS_PROGRAM).read_byte(offset); |
| 647 | | } |
| 648 | | |
| 649 | | WRITE8_MEMBER( plus4_state::exp_dma_w ) |
| 650 | | { |
| 651 | | m_maincpu->space(AS_PROGRAM).write_byte(offset, data); |
| 652 | | } |
| 653 | | |
| 654 | 644 | WRITE_LINE_MEMBER( plus4_state::exp_irq_w ) |
| 655 | 645 | { |
| 656 | 646 | m_exp_irq = state; |
| r21093 | r21094 | |
| 658 | 648 | check_interrupts(); |
| 659 | 649 | } |
| 660 | 650 | |
| 661 | | static PLUS4_EXPANSION_INTERFACE( expansion_intf ) |
| 662 | | { |
| 663 | | DEVCB_DRIVER_MEMBER(plus4_state, exp_dma_r), |
| 664 | | DEVCB_DRIVER_MEMBER(plus4_state, exp_dma_w), |
| 665 | | DEVCB_DRIVER_LINE_MEMBER(plus4_state, exp_irq_w), |
| 666 | | DEVCB_CPU_INPUT_LINE(MOS7501_TAG, INPUT_LINE_HALT) |
| 667 | | }; |
| 668 | 651 | |
| 669 | 652 | |
| 670 | | |
| 671 | 653 | //************************************************************************** |
| 672 | 654 | // MACHINE INITIALIZATION |
| 673 | 655 | //************************************************************************** |
| r21093 | r21094 | |
| 754 | 736 | MCFG_CBM_IEC_BUS_ATN_CALLBACK(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, atn_w)) |
| 755 | 737 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL, NULL) |
| 756 | 738 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, "joy", NULL) |
| 757 | | MCFG_PLUS4_EXPANSION_SLOT_ADD(PLUS4_EXPANSION_SLOT_TAG, XTAL_14_31818MHz/16, expansion_intf, plus4_expansion_cards, "c1551", NULL) |
| 739 | MCFG_PLUS4_EXPANSION_SLOT_ADD(PLUS4_EXPANSION_SLOT_TAG, XTAL_14_31818MHz/16, plus4_expansion_cards, "c1551", NULL, DEVWRITELINE(DEVICE_SELF, plus4_state, exp_irq_w)) |
| 740 | MCFG_PLUS4_EXPANSION_SLOT_DMA_CALLBACKS(DEVREAD8(DEVICE_SELF, plus4_state, read), DEVWRITE8(DEVICE_SELF, plus4_state, write), INPUTLINE(MOS7501_TAG, INPUT_LINE_HALT)) |
| 758 | 741 | MCFG_PLUS4_USER_PORT_ADD(PLUS4_USER_PORT_TAG, plus4_user_port_cards, NULL, NULL) |
| 759 | 742 | MCFG_QUICKLOAD_ADD("quickload", cbm_c16, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS) |
| 760 | 743 | |
| r21093 | r21094 | |
| 799 | 782 | MCFG_CBM_IEC_BUS_ATN_CALLBACK(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, atn_w)) |
| 800 | 783 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL, NULL) |
| 801 | 784 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, "joy", NULL) |
| 802 | | MCFG_PLUS4_EXPANSION_SLOT_ADD(PLUS4_EXPANSION_SLOT_TAG, XTAL_17_73447MHz/20, expansion_intf, plus4_expansion_cards, "c1551", NULL) |
| 785 | MCFG_PLUS4_EXPANSION_SLOT_ADD(PLUS4_EXPANSION_SLOT_TAG, XTAL_17_73447MHz/20, plus4_expansion_cards, "c1551", NULL, DEVWRITELINE(DEVICE_SELF, plus4_state, exp_irq_w)) |
| 786 | MCFG_PLUS4_EXPANSION_SLOT_DMA_CALLBACKS(DEVREAD8(DEVICE_SELF, plus4_state, read), DEVWRITE8(DEVICE_SELF, plus4_state, write), INPUTLINE(MOS7501_TAG, INPUT_LINE_HALT)) |
| 803 | 787 | MCFG_PLUS4_USER_PORT_ADD(PLUS4_USER_PORT_TAG, plus4_user_port_cards, NULL, NULL) |
| 804 | 788 | MCFG_QUICKLOAD_ADD("quickload", cbm_c16, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS) |
| 805 | 789 | |
trunk/src/mess/machine/vic1010.c
| r21093 | r21094 | |
| 19 | 19 | |
| 20 | 20 | |
| 21 | 21 | //------------------------------------------------- |
| 22 | | // VIC20_EXPANSION_INTERFACE( expansion_intf ) |
| 23 | | //------------------------------------------------- |
| 24 | | |
| 25 | | WRITE_LINE_MEMBER( vic1010_device::irq_w ) |
| 26 | | { |
| 27 | | m_slot->irq_w(state); |
| 28 | | } |
| 29 | | |
| 30 | | WRITE_LINE_MEMBER( vic1010_device::nmi_w ) |
| 31 | | { |
| 32 | | m_slot->nmi_w(state); |
| 33 | | } |
| 34 | | |
| 35 | | WRITE_LINE_MEMBER( vic1010_device::res_w ) |
| 36 | | { |
| 37 | | m_slot->res_w(state); |
| 38 | | } |
| 39 | | |
| 40 | | static VIC20_EXPANSION_INTERFACE( expansion_intf ) |
| 41 | | { |
| 42 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vic1010_device, irq_w), |
| 43 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vic1010_device, nmi_w), |
| 44 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vic1010_device, res_w) |
| 45 | | }; |
| 46 | | |
| 47 | | |
| 48 | | //------------------------------------------------- |
| 49 | 22 | // MACHINE_DRIVER( vic1010 ) |
| 50 | 23 | //------------------------------------------------- |
| 51 | 24 | |
| 52 | 25 | static MACHINE_CONFIG_FRAGMENT( vic1010 ) |
| 53 | | MCFG_VIC20_EXPANSION_SLOT_ADD("slot1", 0, expansion_intf, vic20_expansion_cards, NULL, NULL) |
| 54 | | MCFG_VIC20_EXPANSION_SLOT_ADD("slot2", 0, expansion_intf, vic20_expansion_cards, NULL, NULL) |
| 55 | | MCFG_VIC20_EXPANSION_SLOT_ADD("slot3", 0, expansion_intf, vic20_expansion_cards, NULL, NULL) |
| 56 | | MCFG_VIC20_EXPANSION_SLOT_ADD("slot4", 0, expansion_intf, vic20_expansion_cards, NULL, NULL) |
| 57 | | MCFG_VIC20_EXPANSION_SLOT_ADD("slot5", 0, expansion_intf, vic20_expansion_cards, NULL, NULL) |
| 58 | | MCFG_VIC20_EXPANSION_SLOT_ADD("slot6", 0, expansion_intf, vic20_expansion_cards, NULL, NULL) |
| 26 | MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot1") |
| 27 | MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot2") |
| 28 | MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot3") |
| 29 | MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot4") |
| 30 | MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot5") |
| 31 | MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot6") |
| 59 | 32 | MACHINE_CONFIG_END |
| 60 | 33 | |
| 61 | 34 | |
| r21093 | r21094 | |
| 81 | 54 | |
| 82 | 55 | vic1010_device::vic1010_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 83 | 56 | : device_t(mconfig, VIC1010, "VIC1010", tag, owner, clock), |
| 84 | | device_vic20_expansion_card_interface(mconfig, *this) |
| 57 | device_vic20_expansion_card_interface(mconfig, *this), |
| 58 | m_slot1(*this, "slot1"), |
| 59 | m_slot2(*this, "slot2"), |
| 60 | m_slot3(*this, "slot3"), |
| 61 | m_slot4(*this, "slot4"), |
| 62 | m_slot5(*this, "slot5"), |
| 63 | m_slot6(*this, "slot6") |
| 85 | 64 | { |
| 86 | 65 | } |
| 87 | 66 | |
| r21093 | r21094 | |
| 93 | 72 | void vic1010_device::device_start() |
| 94 | 73 | { |
| 95 | 74 | // find devices |
| 96 | | m_expansion_slot[0] = dynamic_cast<vic20_expansion_slot_device *>(subdevice("slot1")); |
| 97 | | m_expansion_slot[1] = dynamic_cast<vic20_expansion_slot_device *>(subdevice("slot2")); |
| 98 | | m_expansion_slot[2] = dynamic_cast<vic20_expansion_slot_device *>(subdevice("slot3")); |
| 99 | | m_expansion_slot[3] = dynamic_cast<vic20_expansion_slot_device *>(subdevice("slot4")); |
| 100 | | m_expansion_slot[4] = dynamic_cast<vic20_expansion_slot_device *>(subdevice("slot5")); |
| 101 | | m_expansion_slot[5] = dynamic_cast<vic20_expansion_slot_device *>(subdevice("slot6")); |
| 75 | m_expansion_slot[0] = m_slot1; |
| 76 | m_expansion_slot[1] = m_slot2; |
| 77 | m_expansion_slot[2] = m_slot3; |
| 78 | m_expansion_slot[3] = m_slot4; |
| 79 | m_expansion_slot[4] = m_slot5; |
| 80 | m_expansion_slot[5] = m_slot6; |
| 102 | 81 | } |
| 103 | 82 | |
| 104 | 83 | |
| 105 | 84 | //------------------------------------------------- |
| 85 | // device_reset - device-specific reset |
| 86 | //------------------------------------------------- |
| 87 | |
| 88 | void vic1010_device::device_reset() |
| 89 | { |
| 90 | for (int i = 0; i < MAX_SLOTS; i++) |
| 91 | { |
| 92 | m_expansion_slot[i]->reset(); |
| 93 | } |
| 94 | } |
| 95 | |
| 96 | |
| 97 | //------------------------------------------------- |
| 106 | 98 | // vic20_cd_r - cartridge data read |
| 107 | 99 | //------------------------------------------------- |
| 108 | 100 | |
| r21093 | r21094 | |
| 133 | 125 | m_expansion_slot[i]->cd_w(space, offset, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3); |
| 134 | 126 | } |
| 135 | 127 | } |
| 136 | | |
| 137 | | |
| 138 | | //------------------------------------------------- |
| 139 | | // vic20_res_w - reset write |
| 140 | | //------------------------------------------------- |
| 141 | | |
| 142 | | void vic1010_device::vic20_res_w(int state) |
| 143 | | { |
| 144 | | for (int i = 0; i < MAX_SLOTS; i++) |
| 145 | | { |
| 146 | | m_expansion_slot[i]->reset(); |
| 147 | | } |
| 148 | | } |
trunk/src/mess/machine/c64_vic1011.c
| r0 | r21094 | |
| 1 | /********************************************************************** |
| 2 | |
| 3 | Commodore VIC-1011A/B RS-232C Adapter emulation |
| 4 | |
| 5 | Copyright MESS Team. |
| 6 | Visit http://mamedev.org for licensing and usage restrictions. |
| 7 | |
| 8 | **********************************************************************/ |
| 9 | |
| 10 | #include "c64_vic1011.h" |
| 11 | |
| 12 | |
| 13 | |
| 14 | //************************************************************************** |
| 15 | // MACROS/CONSTANTS |
| 16 | //************************************************************************** |
| 17 | |
| 18 | #define RS232_TAG "rs232" |
| 19 | |
| 20 | |
| 21 | |
| 22 | //************************************************************************** |
| 23 | // DEVICE DEFINITIONS |
| 24 | //************************************************************************** |
| 25 | |
| 26 | const device_type C64_VIC1011 = &device_creator<c64_vic1011_device>; |
| 27 | |
| 28 | |
| 29 | //------------------------------------------------- |
| 30 | // rs232_port_interface rs232_intf |
| 31 | //------------------------------------------------- |
| 32 | |
| 33 | static const rs232_port_interface rs232_intf = |
| 34 | { |
| 35 | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c64_vic1011_device, rxd_w), |
| 36 | DEVCB_NULL, |
| 37 | DEVCB_NULL, |
| 38 | DEVCB_NULL, |
| 39 | DEVCB_NULL |
| 40 | }; |
| 41 | |
| 42 | |
| 43 | //------------------------------------------------- |
| 44 | // MACHINE_DRIVER( vic1011 ) |
| 45 | //------------------------------------------------- |
| 46 | |
| 47 | static MACHINE_CONFIG_FRAGMENT( vic1011 ) |
| 48 | MCFG_RS232_PORT_ADD(RS232_TAG, rs232_intf, default_rs232_devices, NULL, NULL) |
| 49 | MACHINE_CONFIG_END |
| 50 | |
| 51 | |
| 52 | //------------------------------------------------- |
| 53 | // machine_config_additions - device-specific |
| 54 | // machine configurations |
| 55 | //------------------------------------------------- |
| 56 | |
| 57 | machine_config_constructor c64_vic1011_device::device_mconfig_additions() const |
| 58 | { |
| 59 | return MACHINE_CONFIG_NAME( vic1011 ); |
| 60 | } |
| 61 | |
| 62 | |
| 63 | |
| 64 | //************************************************************************** |
| 65 | // LIVE DEVICE |
| 66 | //************************************************************************** |
| 67 | |
| 68 | //------------------------------------------------- |
| 69 | // c64_vic1011_device - constructor |
| 70 | //------------------------------------------------- |
| 71 | |
| 72 | c64_vic1011_device::c64_vic1011_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 73 | : device_t(mconfig, C64_VIC1011, "C64 VIC1011", tag, owner, clock), |
| 74 | device_c64_user_port_interface(mconfig, *this), |
| 75 | m_rs232(*this, RS232_TAG) |
| 76 | { |
| 77 | } |
| 78 | |
| 79 | |
| 80 | //------------------------------------------------- |
| 81 | // device_start - device-specific startup |
| 82 | //------------------------------------------------- |
| 83 | |
| 84 | void c64_vic1011_device::device_start() |
| 85 | { |
| 86 | } |
| 87 | |
| 88 | |
| 89 | //------------------------------------------------- |
| 90 | // c64_pb_r - port B read |
| 91 | //------------------------------------------------- |
| 92 | |
| 93 | UINT8 c64_vic1011_device::c64_pb_r(address_space &space, offs_t offset) |
| 94 | { |
| 95 | /* |
| 96 | |
| 97 | bit description |
| 98 | |
| 99 | 0 Sin |
| 100 | 1 |
| 101 | 2 |
| 102 | 3 |
| 103 | 4 DCDin |
| 104 | 5 |
| 105 | 6 CTS |
| 106 | 7 DSR |
| 107 | |
| 108 | */ |
| 109 | |
| 110 | UINT8 data = 0; |
| 111 | |
| 112 | data |= !m_rs232->rx(); |
| 113 | data |= m_rs232->dcd_r() << 4; |
| 114 | data |= m_rs232->cts_r() << 6; |
| 115 | data |= m_rs232->dsr_r() << 7; |
| 116 | |
| 117 | return data; |
| 118 | } |
| 119 | |
| 120 | |
| 121 | //------------------------------------------------- |
| 122 | // c64_pb_w - port B write |
| 123 | //------------------------------------------------- |
| 124 | |
| 125 | void c64_vic1011_device::c64_pb_w(address_space &space, offs_t offset, UINT8 data) |
| 126 | { |
| 127 | /* |
| 128 | |
| 129 | bit description |
| 130 | |
| 131 | 0 |
| 132 | 1 RTS |
| 133 | 2 DTR |
| 134 | 3 |
| 135 | 4 |
| 136 | 5 DCDout |
| 137 | 6 |
| 138 | 7 |
| 139 | |
| 140 | */ |
| 141 | |
| 142 | m_rs232->rts_w(BIT(data, 1)); |
| 143 | m_rs232->dtr_w(BIT(data, 2)); |
| 144 | } |
| 145 | |
| 146 | |
| 147 | //------------------------------------------------- |
| 148 | // c64_pa2_w - PA2 write |
| 149 | //------------------------------------------------- |
| 150 | |
| 151 | void c64_vic1011_device::c64_pa2_w(int state) |
| 152 | { |
| 153 | m_rs232->tx(!state); |
| 154 | } |
| 155 | |
| 156 | |
| 157 | //------------------------------------------------- |
| 158 | // rxd_w - |
| 159 | //------------------------------------------------- |
| 160 | |
| 161 | WRITE_LINE_MEMBER( c64_vic1011_device::rxd_w ) |
| 162 | { |
| 163 | m_slot->cia_flag2_w(!state); |
| 164 | } |
trunk/src/mess/machine/vic1011.c
| r0 | r21094 | |
| 1 | /********************************************************************** |
| 2 | |
| 3 | Commodore VIC-1011A/B RS-232C Adapter emulation |
| 4 | |
| 5 | Copyright MESS Team. |
| 6 | Visit http://mamedev.org for licensing and usage restrictions. |
| 7 | |
| 8 | **********************************************************************/ |
| 9 | |
| 10 | #include "vic1011.h" |
| 11 | |
| 12 | |
| 13 | |
| 14 | //************************************************************************** |
| 15 | // MACROS/CONSTANTS |
| 16 | //************************************************************************** |
| 17 | |
| 18 | #define RS232_TAG "rs232" |
| 19 | |
| 20 | |
| 21 | |
| 22 | //************************************************************************** |
| 23 | // DEVICE DEFINITIONS |
| 24 | //************************************************************************** |
| 25 | |
| 26 | const device_type VIC1011 = &device_creator<vic1011_device>; |
| 27 | |
| 28 | |
| 29 | //------------------------------------------------- |
| 30 | // rs232_port_interface rs232_intf |
| 31 | //------------------------------------------------- |
| 32 | |
| 33 | static const rs232_port_interface rs232_intf = |
| 34 | { |
| 35 | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, vic1011_device, rxd_w), |
| 36 | DEVCB_NULL, |
| 37 | DEVCB_NULL, |
| 38 | DEVCB_NULL, |
| 39 | DEVCB_NULL |
| 40 | }; |
| 41 | |
| 42 | |
| 43 | //------------------------------------------------- |
| 44 | // MACHINE_DRIVER( vic1011 ) |
| 45 | //------------------------------------------------- |
| 46 | |
| 47 | static MACHINE_CONFIG_FRAGMENT( vic1011 ) |
| 48 | MCFG_RS232_PORT_ADD(RS232_TAG, rs232_intf, default_rs232_devices, NULL, NULL) |
| 49 | MACHINE_CONFIG_END |
| 50 | |
| 51 | |
| 52 | //------------------------------------------------- |
| 53 | // machine_config_additions - device-specific |
| 54 | // machine configurations |
| 55 | //------------------------------------------------- |
| 56 | |
| 57 | machine_config_constructor vic1011_device::device_mconfig_additions() const |
| 58 | { |
| 59 | return MACHINE_CONFIG_NAME( vic1011 ); |
| 60 | } |
| 61 | |
| 62 | |
| 63 | |
| 64 | //************************************************************************** |
| 65 | // LIVE DEVICE |
| 66 | //************************************************************************** |
| 67 | |
| 68 | //------------------------------------------------- |
| 69 | // vic1011_device - constructor |
| 70 | //------------------------------------------------- |
| 71 | |
| 72 | vic1011_device::vic1011_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 73 | : device_t(mconfig, VIC1011, "VIC1011", tag, owner, clock), |
| 74 | device_vic20_user_port_interface(mconfig, *this), |
| 75 | m_rs232(*this, RS232_TAG) |
| 76 | { |
| 77 | } |
| 78 | |
| 79 | |
| 80 | //------------------------------------------------- |
| 81 | // device_start - device-specific startup |
| 82 | //------------------------------------------------- |
| 83 | |
| 84 | void vic1011_device::device_start() |
| 85 | { |
| 86 | } |
| 87 | |
| 88 | |
| 89 | //------------------------------------------------- |
| 90 | // vic20_pb_r - port B read |
| 91 | //------------------------------------------------- |
| 92 | |
| 93 | UINT8 vic1011_device::vic20_pb_r(address_space &space, offs_t offset) |
| 94 | { |
| 95 | /* |
| 96 | |
| 97 | bit description |
| 98 | |
| 99 | 0 Sin |
| 100 | 1 |
| 101 | 2 |
| 102 | 3 |
| 103 | 4 DCDin |
| 104 | 5 |
| 105 | 6 CTS |
| 106 | 7 DSR |
| 107 | |
| 108 | */ |
| 109 | |
| 110 | UINT8 data = 0; |
| 111 | |
| 112 | data |= !m_rs232->rx(); |
| 113 | data |= m_rs232->dcd_r() << 4; |
| 114 | data |= m_rs232->cts_r() << 6; |
| 115 | data |= m_rs232->dsr_r() << 7; |
| 116 | |
| 117 | return data; |
| 118 | } |
| 119 | |
| 120 | |
| 121 | //------------------------------------------------- |
| 122 | // vic20_pb_w - port B write |
| 123 | //------------------------------------------------- |
| 124 | |
| 125 | void vic1011_device::vic20_pb_w(address_space &space, offs_t offset, UINT8 data) |
| 126 | { |
| 127 | /* |
| 128 | |
| 129 | bit description |
| 130 | |
| 131 | 0 |
| 132 | 1 RTS |
| 133 | 2 DTR |
| 134 | 3 |
| 135 | 4 |
| 136 | 5 DCDout |
| 137 | 6 |
| 138 | 7 |
| 139 | |
| 140 | */ |
| 141 | |
| 142 | m_rs232->rts_w(BIT(data, 1)); |
| 143 | m_rs232->dtr_w(BIT(data, 2)); |
| 144 | } |
| 145 | |
| 146 | |
| 147 | //------------------------------------------------- |
| 148 | // vic20_cb2_w - CB2 write |
| 149 | //------------------------------------------------- |
| 150 | |
| 151 | void vic1011_device::vic20_cb2_w(int state) |
| 152 | { |
| 153 | m_rs232->tx(!state); |
| 154 | } |
| 155 | |
| 156 | |
| 157 | //------------------------------------------------- |
| 158 | // rxd_w - |
| 159 | //------------------------------------------------- |
| 160 | |
| 161 | WRITE_LINE_MEMBER( vic1011_device::rxd_w ) |
| 162 | { |
| 163 | m_slot->via_cb1_w(!state); |
| 164 | } |
trunk/src/mess/machine/vic10exp.c
| r21093 | r21094 | |
| 108 | 108 | vic10_expansion_slot_device::vic10_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 109 | 109 | device_t(mconfig, VIC10_EXPANSION_SLOT, "VIC-10 expansion port", tag, owner, clock), |
| 110 | 110 | device_slot_interface(mconfig, *this), |
| 111 | | device_image_interface(mconfig, *this) |
| 111 | device_image_interface(mconfig, *this), |
| 112 | m_write_irq(*this), |
| 113 | m_write_res(*this), |
| 114 | m_write_cnt(*this), |
| 115 | m_write_sp(*this) |
| 112 | 116 | { |
| 113 | 117 | } |
| 114 | 118 | |
| 115 | 119 | |
| 116 | 120 | //------------------------------------------------- |
| 117 | | // device_config_complete - perform any |
| 118 | | // operations now that the configuration is |
| 119 | | // complete |
| 120 | | //------------------------------------------------- |
| 121 | | |
| 122 | | void vic10_expansion_slot_device::device_config_complete() |
| 123 | | { |
| 124 | | // inherit a copy of the static data |
| 125 | | const vic10_expansion_slot_interface *intf = reinterpret_cast<const vic10_expansion_slot_interface *>(static_config()); |
| 126 | | if (intf != NULL) |
| 127 | | { |
| 128 | | *static_cast<vic10_expansion_slot_interface *>(this) = *intf; |
| 129 | | } |
| 130 | | |
| 131 | | // or initialize to defaults if none provided |
| 132 | | else |
| 133 | | { |
| 134 | | memset(&m_out_irq_cb, 0, sizeof(m_out_irq_cb)); |
| 135 | | memset(&m_out_sp_cb, 0, sizeof(m_out_sp_cb)); |
| 136 | | memset(&m_out_cnt_cb, 0, sizeof(m_out_cnt_cb)); |
| 137 | | memset(&m_out_res_cb, 0, sizeof(m_out_res_cb)); |
| 138 | | } |
| 139 | | |
| 140 | | // set brief and instance name |
| 141 | | update_names(); |
| 142 | | } |
| 143 | | |
| 144 | | |
| 145 | | //------------------------------------------------- |
| 146 | 121 | // device_start - device-specific startup |
| 147 | 122 | //------------------------------------------------- |
| 148 | 123 | |
| r21093 | r21094 | |
| 151 | 126 | m_card = dynamic_cast<device_vic10_expansion_card_interface *>(get_card_device()); |
| 152 | 127 | |
| 153 | 128 | // resolve callbacks |
| 154 | | m_out_irq_func.resolve(m_out_irq_cb, *this); |
| 155 | | m_out_sp_func.resolve(m_out_sp_cb, *this); |
| 156 | | m_out_cnt_func.resolve(m_out_cnt_cb, *this); |
| 157 | | m_out_res_func.resolve(m_out_res_cb, *this); |
| 129 | m_write_irq.resolve_safe(); |
| 130 | m_write_res.resolve_safe(); |
| 131 | m_write_cnt.resolve_safe(); |
| 132 | m_write_sp.resolve_safe(); |
| 158 | 133 | |
| 159 | 134 | // inherit bus clock |
| 160 | 135 | if (clock() == 0) |
| r21093 | r21094 | |
| 300 | 275 | |
| 301 | 276 | READ_LINE_MEMBER( vic10_expansion_slot_device::p0_r ) { int state = 0; if (m_card != NULL) state = m_card->vic10_p0_r(); return state; } |
| 302 | 277 | WRITE_LINE_MEMBER( vic10_expansion_slot_device::p0_w ) { if (m_card != NULL) m_card->vic10_p0_w(state); } |
| 303 | | WRITE_LINE_MEMBER( vic10_expansion_slot_device::irq_w ) { m_out_irq_func(state); } |
| 304 | | WRITE_LINE_MEMBER( vic10_expansion_slot_device::sp_w ) { m_out_sp_func(state); if (m_card != NULL) m_card->vic10_sp_w(state); } |
| 305 | | WRITE_LINE_MEMBER( vic10_expansion_slot_device::cnt_w ) { m_out_cnt_func(state); if (m_card != NULL) m_card->vic10_cnt_w(state); } |
| 306 | | WRITE_LINE_MEMBER( vic10_expansion_slot_device::res_w ) { m_out_res_func(state); } |
trunk/src/mess/machine/vic10exp.h
| r21093 | r21094 | |
| 54 | 54 | // INTERFACE CONFIGURATION MACROS |
| 55 | 55 | //************************************************************************** |
| 56 | 56 | |
| 57 | | #define VIC10_EXPANSION_INTERFACE(_name) \ |
| 58 | | const vic10_expansion_slot_interface (_name) = |
| 59 | | |
| 60 | | |
| 61 | | #define MCFG_VIC10_EXPANSION_SLOT_ADD(_tag, _clock, _config, _slot_intf, _def_slot, _def_inp) \ |
| 57 | #define MCFG_VIC10_EXPANSION_SLOT_ADD(_tag, _clock, _slot_intf, _def_slot, _def_inp) \ |
| 62 | 58 | MCFG_DEVICE_ADD(_tag, VIC10_EXPANSION_SLOT, _clock) \ |
| 63 | | MCFG_DEVICE_CONFIG(_config) \ |
| 64 | 59 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _def_inp, false) |
| 65 | 60 | |
| 66 | 61 | |
| 62 | #define MCFG_VIC10_EXPANSION_SLOT_IRQ_CALLBACKS(_irq, _res) \ |
| 63 | downcast<vic10_expansion_slot_device *>(device)->set_irq_callbacks(DEVCB2_##_irq, DEVCB2_##_res); |
| 67 | 64 | |
| 65 | #define MCFG_VIC10_EXPANSION_SLOT_SERIAL_CALLBACKS(_cnt, _sp) \ |
| 66 | downcast<vic10_expansion_slot_device *>(device)->set_serial_callbacks(DEVCB2_##_cnt, DEVCB2_##_sp); |
| 67 | |
| 68 | |
| 69 | |
| 68 | 70 | //************************************************************************** |
| 69 | 71 | // TYPE DEFINITIONS |
| 70 | 72 | //************************************************************************** |
| 71 | 73 | |
| 72 | | // ======================> vic10_expansion_slot_interface |
| 73 | | |
| 74 | | struct vic10_expansion_slot_interface |
| 75 | | { |
| 76 | | devcb_write_line m_out_irq_cb; |
| 77 | | devcb_write_line m_out_sp_cb; |
| 78 | | devcb_write_line m_out_cnt_cb; |
| 79 | | devcb_write_line m_out_res_cb; |
| 80 | | }; |
| 81 | | |
| 82 | | |
| 83 | 74 | // ======================> vic10_expansion_slot_device |
| 84 | 75 | |
| 85 | 76 | class device_vic10_expansion_card_interface; |
| 86 | 77 | |
| 87 | 78 | class vic10_expansion_slot_device : public device_t, |
| 88 | | public vic10_expansion_slot_interface, |
| 89 | 79 | public device_slot_interface, |
| 90 | 80 | public device_image_interface |
| 91 | 81 | { |
| r21093 | r21094 | |
| 93 | 83 | // construction/destruction |
| 94 | 84 | vic10_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 95 | 85 | |
| 86 | template<class _irq, class _res> void set_irq_callbacks(_irq irq, _res res) { |
| 87 | m_write_irq.set_callback(irq); |
| 88 | m_write_res.set_callback(res); |
| 89 | } |
| 90 | |
| 91 | template<class _cnt, class _sp> void set_serial_callbacks(_cnt cnt, _sp sp) { |
| 92 | m_write_cnt.set_callback(cnt); |
| 93 | m_write_sp.set_callback(sp); |
| 94 | } |
| 95 | |
| 96 | 96 | // computer interface |
| 97 | 97 | UINT8 cd_r(address_space &space, offs_t offset, UINT8 data, int lorom, int uprom, int exram); |
| 98 | 98 | void cd_w(address_space &space, offs_t offset, UINT8 data, int lorom, int uprom, int exram); |
| r21093 | r21094 | |
| 100 | 100 | DECLARE_WRITE_LINE_MEMBER( p0_w ); |
| 101 | 101 | |
| 102 | 102 | // cartridge interface |
| 103 | | DECLARE_WRITE_LINE_MEMBER( irq_w ); |
| 104 | | DECLARE_WRITE_LINE_MEMBER( sp_w ); |
| 105 | | DECLARE_WRITE_LINE_MEMBER( cnt_w ); |
| 106 | | DECLARE_WRITE_LINE_MEMBER( res_w ); |
| 103 | DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_write_irq(state); } |
| 104 | DECLARE_WRITE_LINE_MEMBER( res_w ) { m_write_res(state); } |
| 105 | DECLARE_WRITE_LINE_MEMBER( cnt_w ) { m_write_cnt(state); } |
| 106 | DECLARE_WRITE_LINE_MEMBER( sp_w ) { m_write_sp(state); } |
| 107 | 107 | |
| 108 | 108 | protected: |
| 109 | 109 | // device-level overrides |
| 110 | | virtual void device_config_complete(); |
| 110 | virtual void device_config_complete() { update_names(); } |
| 111 | 111 | virtual void device_start(); |
| 112 | 112 | virtual void device_reset(); |
| 113 | 113 | |
| r21093 | r21094 | |
| 129 | 129 | // slot interface overrides |
| 130 | 130 | virtual const char * get_default_card_software(const machine_config &config, emu_options &options); |
| 131 | 131 | |
| 132 | | devcb_resolved_write_line m_out_irq_func; |
| 133 | | devcb_resolved_write_line m_out_sp_func; |
| 134 | | devcb_resolved_write_line m_out_cnt_func; |
| 135 | | devcb_resolved_write_line m_out_res_func; |
| 132 | devcb2_write_line m_write_irq; |
| 133 | devcb2_write_line m_write_res; |
| 134 | devcb2_write_line m_write_cnt; |
| 135 | devcb2_write_line m_write_sp; |
| 136 | 136 | |
| 137 | 137 | device_vic10_expansion_card_interface *m_card; |
| 138 | 138 | }; |
trunk/src/mess/machine/plus4exp.h
| r21093 | r21094 | |
| 56 | 56 | // INTERFACE CONFIGURATION MACROS |
| 57 | 57 | //************************************************************************** |
| 58 | 58 | |
| 59 | | #define PLUS4_EXPANSION_INTERFACE(_name) \ |
| 60 | | const plus4_expansion_slot_interface (_name) = |
| 61 | | |
| 62 | | |
| 63 | | #define MCFG_PLUS4_EXPANSION_SLOT_ADD(_tag, _clock, _config, _slot_intf, _def_slot, _def_inp) \ |
| 59 | #define MCFG_PLUS4_EXPANSION_SLOT_ADD(_tag, _clock, _slot_intf, _def_slot, _def_inp, _irq) \ |
| 64 | 60 | MCFG_DEVICE_ADD(_tag, PLUS4_EXPANSION_SLOT, _clock) \ |
| 65 | | MCFG_DEVICE_CONFIG(_config) \ |
| 61 | downcast<plus4_expansion_slot_device *>(device)->set_irq_callback(DEVCB2_##_irq); \ |
| 66 | 62 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _def_inp, false) |
| 67 | 63 | |
| 64 | #define MCFG_PLUS4_PASSTHRU_EXPANSION_SLOT_ADD() \ |
| 65 | MCFG_PLUS4_EXPANSION_SLOT_ADD(PLUS4_EXPANSION_SLOT_TAG, 0, plus4_expansion_cards, NULL, NULL, DEVWRITELINE(DEVICE_SELF_OWNER, plus4_expansion_slot_device, irq_w)) \ |
| 66 | MCFG_PLUS4_EXPANSION_SLOT_DMA_CALLBACKS(DEVREAD8(DEVICE_SELF_OWNER, plus4_expansion_slot_device, dma_cd_r), DEVWRITE8(DEVICE_SELF_OWNER, plus4_expansion_slot_device, dma_cd_w), DEVWRITELINE(DEVICE_SELF_OWNER, plus4_expansion_slot_device, aec_w)) |
| 68 | 67 | |
| 69 | 68 | |
| 69 | #define MCFG_PLUS4_EXPANSION_SLOT_DMA_CALLBACKS(_read, _write, _aec) \ |
| 70 | downcast<plus4_expansion_slot_device *>(device)->set_dma_callbacks(DEVCB2_##_read, DEVCB2_##_write, DEVCB2_##_aec); |
| 71 | |
| 72 | |
| 73 | |
| 70 | 74 | //************************************************************************** |
| 71 | 75 | // TYPE DEFINITIONS |
| 72 | 76 | //************************************************************************** |
| 73 | 77 | |
| 74 | | // ======================> plus4_expansion_slot_interface |
| 75 | | |
| 76 | | struct plus4_expansion_slot_interface |
| 77 | | { |
| 78 | | devcb_read8 m_in_dma_cd_cb; |
| 79 | | devcb_write8 m_out_dma_cd_cb; |
| 80 | | devcb_write_line m_out_irq_cb; |
| 81 | | devcb_write_line m_out_aec_cb; |
| 82 | | }; |
| 83 | | |
| 84 | | |
| 85 | 78 | // ======================> plus4_expansion_slot_device |
| 86 | 79 | |
| 87 | 80 | class device_plus4_expansion_card_interface; |
| 88 | 81 | |
| 89 | 82 | class plus4_expansion_slot_device : public device_t, |
| 90 | | public plus4_expansion_slot_interface, |
| 91 | 83 | public device_slot_interface, |
| 92 | 84 | public device_image_interface |
| 93 | 85 | { |
| r21093 | r21094 | |
| 95 | 87 | // construction/destruction |
| 96 | 88 | plus4_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 97 | 89 | |
| 90 | template<class _irq> void set_irq_callback(_irq irq) { m_write_irq.set_callback(irq); } |
| 91 | |
| 92 | template<class _read, class _write, class _aec> void set_dma_callbacks(_read read, _write write, _aec aec) { |
| 93 | m_read_dma_cd.set_callback(read); |
| 94 | m_write_dma_cd.set_callback(write); |
| 95 | m_write_aec.set_callback(aec); |
| 96 | } |
| 97 | |
| 98 | 98 | // computer interface |
| 99 | 99 | UINT8 cd_r(address_space &space, offs_t offset, UINT8 data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h); |
| 100 | 100 | void cd_w(address_space &space, offs_t offset, UINT8 data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h); |
| 101 | | UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 102 | 101 | |
| 103 | 102 | // cartridge interface |
| 104 | | DECLARE_READ8_MEMBER( dma_cd_r ) { return m_in_dma_cd_func(offset); } |
| 105 | | DECLARE_WRITE8_MEMBER( dma_cd_w ) { m_out_dma_cd_func(offset, data); } |
| 106 | | DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_out_irq_func(state); } |
| 107 | | DECLARE_WRITE_LINE_MEMBER( aec_w ) { m_out_aec_func(state); } |
| 103 | DECLARE_READ8_MEMBER( dma_cd_r ) { return m_read_dma_cd(offset); } |
| 104 | DECLARE_WRITE8_MEMBER( dma_cd_w ) { m_write_dma_cd(offset, data); } |
| 105 | DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_write_irq(state); } |
| 106 | DECLARE_WRITE_LINE_MEMBER( aec_w ) { m_write_aec(state); } |
| 108 | 107 | int phi2() { return clock(); } |
| 109 | 108 | |
| 110 | 109 | protected: |
| 111 | 110 | // device-level overrides |
| 112 | | virtual void device_config_complete(); |
| 111 | virtual void device_config_complete() { update_names(); } |
| 113 | 112 | virtual void device_start(); |
| 114 | 113 | virtual void device_reset(); |
| 115 | 114 | |
| r21093 | r21094 | |
| 131 | 130 | // slot interface overrides |
| 132 | 131 | virtual const char * get_default_card_software(const machine_config &config, emu_options &options); |
| 133 | 132 | |
| 134 | | devcb_resolved_read8 m_in_dma_cd_func; |
| 135 | | devcb_resolved_write8 m_out_dma_cd_func; |
| 136 | | devcb_resolved_write_line m_out_irq_func; |
| 137 | | devcb_resolved_write_line m_out_aec_func; |
| 133 | devcb2_write_line m_write_irq; |
| 134 | devcb2_read8 m_read_dma_cd; |
| 135 | devcb2_write8 m_write_dma_cd; |
| 136 | devcb2_write_line m_write_aec; |
| 138 | 137 | |
| 139 | 138 | device_plus4_expansion_card_interface *m_card; |
| 140 | 139 | }; |
trunk/src/mess/machine/cbm2exp.c
| r21093 | r21094 | |
| 165 | 165 | |
| 166 | 166 | |
| 167 | 167 | //------------------------------------------------- |
| 168 | | // cbm2_expansion_slot_device - destructor |
| 169 | | //------------------------------------------------- |
| 170 | | |
| 171 | | cbm2_expansion_slot_device::~cbm2_expansion_slot_device() |
| 172 | | { |
| 173 | | } |
| 174 | | |
| 175 | | |
| 176 | | //------------------------------------------------- |
| 177 | | // device_config_complete - perform any |
| 178 | | // operations now that the configuration is |
| 179 | | // complete |
| 180 | | //------------------------------------------------- |
| 181 | | |
| 182 | | void cbm2_expansion_slot_device::device_config_complete() |
| 183 | | { |
| 184 | | // set brief and instance name |
| 185 | | update_names(); |
| 186 | | } |
| 187 | | |
| 188 | | |
| 189 | | //------------------------------------------------- |
| 190 | 168 | // device_start - device-specific startup |
| 191 | 169 | //------------------------------------------------- |
| 192 | 170 | |
| 193 | 171 | void cbm2_expansion_slot_device::device_start() |
| 194 | 172 | { |
| 195 | | m_cart = dynamic_cast<device_cbm2_expansion_card_interface *>(get_card_device()); |
| 173 | m_card = dynamic_cast<device_cbm2_expansion_card_interface *>(get_card_device()); |
| 196 | 174 | |
| 197 | 175 | // inherit bus clock |
| 198 | 176 | if (clock() == 0) |
| r21093 | r21094 | |
| 221 | 199 | { |
| 222 | 200 | size_t size = 0; |
| 223 | 201 | |
| 224 | | if (m_cart) |
| 202 | if (m_card) |
| 225 | 203 | { |
| 226 | 204 | if (software_entry() == NULL) |
| 227 | 205 | { |
| r21093 | r21094 | |
| 229 | 207 | |
| 230 | 208 | if (!mame_stricmp(filetype(), "20")) |
| 231 | 209 | { |
| 232 | | fread(m_cart->cbm2_bank1_pointer(machine(), size), size); |
| 210 | fread(m_card->cbm2_bank1_pointer(machine(), size), size); |
| 233 | 211 | } |
| 234 | 212 | else if (!mame_stricmp(filetype(), "40")) |
| 235 | 213 | { |
| 236 | | fread(m_cart->cbm2_bank2_pointer(machine(), size), size); |
| 214 | fread(m_card->cbm2_bank2_pointer(machine(), size), size); |
| 237 | 215 | } |
| 238 | 216 | else if (!mame_stricmp(filetype(), "60")) |
| 239 | 217 | { |
| 240 | | fread(m_cart->cbm2_bank3_pointer(machine(), size), size); |
| 218 | fread(m_card->cbm2_bank3_pointer(machine(), size), size); |
| 241 | 219 | } |
| 242 | 220 | } |
| 243 | 221 | else |
| 244 | 222 | { |
| 245 | 223 | size = get_software_region_length("bank1"); |
| 246 | | if (size) memcpy(m_cart->cbm2_bank1_pointer(machine(), size), get_software_region("bank1"), size); |
| 224 | if (size) memcpy(m_card->cbm2_bank1_pointer(machine(), size), get_software_region("bank1"), size); |
| 247 | 225 | |
| 248 | 226 | size = get_software_region_length("bank2"); |
| 249 | | if (size) memcpy(m_cart->cbm2_bank2_pointer(machine(), size), get_software_region("bank2"), size); |
| 227 | if (size) memcpy(m_card->cbm2_bank2_pointer(machine(), size), get_software_region("bank2"), size); |
| 250 | 228 | |
| 251 | 229 | size = get_software_region_length("bank3"); |
| 252 | | if (size) memcpy(m_cart->cbm2_bank3_pointer(machine(), size), get_software_region("bank3"), size); |
| 230 | if (size) memcpy(m_card->cbm2_bank3_pointer(machine(), size), get_software_region("bank3"), size); |
| 253 | 231 | |
| 254 | 232 | size = get_software_region_length("ram"); |
| 255 | | if (size) memset(m_cart->cbm2_ram_pointer(machine(), size), 0, size); |
| 233 | if (size) memset(m_card->cbm2_ram_pointer(machine(), size), 0, size); |
| 256 | 234 | |
| 257 | 235 | size = get_software_region_length("nvram"); |
| 258 | | if (size) memset(m_cart->cbm2_nvram_pointer(machine(), size), 0, size); |
| 236 | if (size) memset(m_card->cbm2_nvram_pointer(machine(), size), 0, size); |
| 259 | 237 | } |
| 260 | 238 | } |
| 261 | 239 | |
| r21093 | r21094 | |
| 291 | 269 | |
| 292 | 270 | UINT8 cbm2_expansion_slot_device::read(address_space &space, offs_t offset, UINT8 data, int csbank1, int csbank2, int csbank3) |
| 293 | 271 | { |
| 294 | | if (m_cart != NULL) |
| 272 | if (m_card != NULL) |
| 295 | 273 | { |
| 296 | | data = m_cart->cbm2_bd_r(space, offset, data, csbank1, csbank2, csbank3); |
| 274 | data = m_card->cbm2_bd_r(space, offset, data, csbank1, csbank2, csbank3); |
| 297 | 275 | } |
| 298 | 276 | |
| 299 | 277 | return data; |
| r21093 | r21094 | |
| 306 | 284 | |
| 307 | 285 | void cbm2_expansion_slot_device::write(address_space &space, offs_t offset, UINT8 data, int csbank1, int csbank2, int csbank3) |
| 308 | 286 | { |
| 309 | | if (m_cart != NULL) |
| 287 | if (m_card != NULL) |
| 310 | 288 | { |
| 311 | | m_cart->cbm2_bd_w(space, offset, data, csbank1, csbank2, csbank3); |
| 289 | m_card->cbm2_bd_w(space, offset, data, csbank1, csbank2, csbank3); |
| 312 | 290 | } |
| 313 | 291 | } |
| 314 | | |
| 315 | | |
| 316 | | //------------------------------------------------- |
| 317 | | // phi2 - system clock frequency |
| 318 | | //------------------------------------------------- |
| 319 | | |
| 320 | | int cbm2_expansion_slot_device::phi2() |
| 321 | | { |
| 322 | | return clock(); |
| 323 | | } |
trunk/src/mess/machine/vic20exp.c
| r21093 | r21094 | |
| 22 | 22 | const device_type VIC20_EXPANSION_SLOT = &device_creator<vic20_expansion_slot_device>; |
| 23 | 23 | |
| 24 | 24 | |
| 25 | |
| 25 | 26 | //************************************************************************** |
| 26 | 27 | // DEVICE VIC20_EXPANSION CARD INTERFACE |
| 27 | 28 | //************************************************************************** |
| r21093 | r21094 | |
| 158 | 159 | vic20_expansion_slot_device::vic20_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 159 | 160 | device_t(mconfig, VIC20_EXPANSION_SLOT, "VIC-20 expansion port", tag, owner, clock), |
| 160 | 161 | device_slot_interface(mconfig, *this), |
| 161 | | device_image_interface(mconfig, *this) |
| 162 | device_image_interface(mconfig, *this), |
| 163 | m_write_irq(*this), |
| 164 | m_write_nmi(*this), |
| 165 | m_write_res(*this) |
| 162 | 166 | { |
| 163 | 167 | } |
| 164 | 168 | |
| 165 | 169 | |
| 166 | 170 | //------------------------------------------------- |
| 167 | | // device_config_complete - perform any |
| 168 | | // operations now that the configuration is |
| 169 | | // complete |
| 170 | | //------------------------------------------------- |
| 171 | | |
| 172 | | void vic20_expansion_slot_device::device_config_complete() |
| 173 | | { |
| 174 | | // inherit a copy of the static data |
| 175 | | const vic20_expansion_slot_interface *intf = reinterpret_cast<const vic20_expansion_slot_interface *>(static_config()); |
| 176 | | if (intf != NULL) |
| 177 | | { |
| 178 | | *static_cast<vic20_expansion_slot_interface *>(this) = *intf; |
| 179 | | } |
| 180 | | |
| 181 | | // or initialize to defaults if none provided |
| 182 | | else |
| 183 | | { |
| 184 | | memset(&m_out_irq_cb, 0, sizeof(m_out_irq_cb)); |
| 185 | | memset(&m_out_nmi_cb, 0, sizeof(m_out_nmi_cb)); |
| 186 | | memset(&m_out_res_cb, 0, sizeof(m_out_res_cb)); |
| 187 | | } |
| 188 | | |
| 189 | | // set brief and instance name |
| 190 | | update_names(); |
| 191 | | } |
| 192 | | |
| 193 | | |
| 194 | | //------------------------------------------------- |
| 195 | 171 | // device_start - device-specific startup |
| 196 | 172 | //------------------------------------------------- |
| 197 | 173 | |
| r21093 | r21094 | |
| 200 | 176 | m_card = dynamic_cast<device_vic20_expansion_card_interface *>(get_card_device()); |
| 201 | 177 | |
| 202 | 178 | // resolve callbacks |
| 203 | | m_out_irq_func.resolve(m_out_irq_cb, *this); |
| 204 | | m_out_nmi_func.resolve(m_out_nmi_cb, *this); |
| 205 | | m_out_res_func.resolve(m_out_res_cb, *this); |
| 179 | m_write_irq.resolve_safe(); |
| 180 | m_write_nmi.resolve_safe(); |
| 181 | m_write_res.resolve_safe(); |
| 206 | 182 | |
| 207 | 183 | // inherit bus clock |
| 208 | 184 | if (clock() == 0) |
| r21093 | r21094 | |
| 339 | 315 | m_card->vic20_cd_w(space, offset, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3); |
| 340 | 316 | } |
| 341 | 317 | } |
| 342 | | |
| 343 | | WRITE_LINE_MEMBER( vic20_expansion_slot_device::irq_w ) { m_out_irq_func(state); } |
| 344 | | WRITE_LINE_MEMBER( vic20_expansion_slot_device::nmi_w ) { m_out_nmi_func(state); } |
| 345 | | WRITE_LINE_MEMBER( vic20_expansion_slot_device::res_w ) { m_out_res_func(state); } |
trunk/src/mess/machine/vic20exp.h
| r21093 | r21094 | |
| 53 | 53 | // INTERFACE CONFIGURATION MACROS |
| 54 | 54 | //************************************************************************** |
| 55 | 55 | |
| 56 | | #define VIC20_EXPANSION_INTERFACE(_name) \ |
| 57 | | const vic20_expansion_slot_interface (_name) = |
| 58 | | |
| 59 | | |
| 60 | | #define MCFG_VIC20_EXPANSION_SLOT_ADD(_tag, _clock, _config, _slot_intf, _def_slot, _def_inp) \ |
| 56 | #define MCFG_VIC20_EXPANSION_SLOT_ADD(_tag, _clock, _slot_intf, _def_slot, _def_inp) \ |
| 61 | 57 | MCFG_DEVICE_ADD(_tag, VIC20_EXPANSION_SLOT, _clock) \ |
| 62 | | MCFG_DEVICE_CONFIG(_config) \ |
| 63 | 58 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _def_inp, false) |
| 64 | 59 | |
| 60 | #define MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD(_tag) \ |
| 61 | MCFG_VIC20_EXPANSION_SLOT_ADD(_tag, 0, vic20_expansion_cards, NULL, NULL) \ |
| 62 | MCFG_VIC20_EXPANSION_SLOT_IRQ_CALLBACKS(DEVWRITELINE(DEVICE_SELF_OWNER, vic20_expansion_slot_device, irq_w), DEVWRITELINE(DEVICE_SELF_OWNER, vic20_expansion_slot_device, nmi_w), DEVWRITELINE(DEVICE_SELF_OWNER, vic20_expansion_slot_device, res_w)) |
| 65 | 63 | |
| 66 | 64 | |
| 65 | #define MCFG_VIC20_EXPANSION_SLOT_IRQ_CALLBACKS(_irq, _nmi, _res) \ |
| 66 | downcast<vic20_expansion_slot_device *>(device)->set_irq_callbacks(DEVCB2_##_irq, DEVCB2_##_nmi, DEVCB2_##_res); |
| 67 | |
| 68 | |
| 69 | |
| 67 | 70 | //************************************************************************** |
| 68 | 71 | // TYPE DEFINITIONS |
| 69 | 72 | //************************************************************************** |
| 70 | 73 | |
| 71 | | // ======================> vic20_expansion_slot_interface |
| 72 | | |
| 73 | | struct vic20_expansion_slot_interface |
| 74 | | { |
| 75 | | devcb_write_line m_out_irq_cb; |
| 76 | | devcb_write_line m_out_nmi_cb; |
| 77 | | devcb_write_line m_out_res_cb; |
| 78 | | }; |
| 79 | | |
| 80 | | |
| 81 | 74 | // ======================> vic20_expansion_slot_device |
| 82 | 75 | |
| 83 | 76 | class device_vic20_expansion_card_interface; |
| 84 | 77 | |
| 85 | 78 | class vic20_expansion_slot_device : public device_t, |
| 86 | | public vic20_expansion_slot_interface, |
| 87 | 79 | public device_slot_interface, |
| 88 | 80 | public device_image_interface |
| 89 | 81 | { |
| r21093 | r21094 | |
| 91 | 83 | // construction/destruction |
| 92 | 84 | vic20_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 93 | 85 | |
| 86 | template<class _irq, class _nmi, class _res> void set_irq_callbacks(_irq irq, _nmi nmi, _res res) { |
| 87 | m_write_irq.set_callback(irq); |
| 88 | m_write_nmi.set_callback(nmi); |
| 89 | m_write_res.set_callback(res); |
| 90 | } |
| 91 | |
| 94 | 92 | // computer interface |
| 95 | 93 | UINT8 cd_r(address_space &space, offs_t offset, UINT8 data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3); |
| 96 | 94 | void cd_w(address_space &space, offs_t offset, UINT8 data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3); |
| 97 | 95 | |
| 98 | 96 | // cartridge interface |
| 99 | | DECLARE_WRITE_LINE_MEMBER( irq_w ); |
| 100 | | DECLARE_WRITE_LINE_MEMBER( nmi_w ); |
| 101 | | DECLARE_WRITE_LINE_MEMBER( res_w ); |
| 97 | DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_write_irq(state); } |
| 98 | DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_write_nmi(state); } |
| 99 | DECLARE_WRITE_LINE_MEMBER( res_w ) { m_write_res(state); } |
| 102 | 100 | |
| 103 | 101 | protected: |
| 104 | 102 | // device-level overrides |
| 105 | | virtual void device_config_complete(); |
| 103 | virtual void device_config_complete() { update_names(); } |
| 106 | 104 | virtual void device_start(); |
| 107 | 105 | virtual void device_reset(); |
| 108 | 106 | |
| r21093 | r21094 | |
| 124 | 122 | // slot interface overrides |
| 125 | 123 | virtual const char * get_default_card_software(const machine_config &config, emu_options &options); |
| 126 | 124 | |
| 127 | | devcb_resolved_write_line m_out_irq_func; |
| 128 | | devcb_resolved_write_line m_out_nmi_func; |
| 129 | | devcb_resolved_write_line m_out_res_func; |
| 125 | devcb2_write_line m_write_irq; |
| 126 | devcb2_write_line m_write_nmi; |
| 127 | devcb2_write_line m_write_res; |
| 130 | 128 | |
| 131 | 129 | device_vic20_expansion_card_interface *m_card; |
| 132 | 130 | }; |
| r21093 | r21094 | |
| 156 | 154 | // runtime |
| 157 | 155 | virtual UINT8 vic20_cd_r(address_space &space, offs_t offset, UINT8 data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) { return data; }; |
| 158 | 156 | virtual void vic20_cd_w(address_space &space, offs_t offset, UINT8 data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) { }; |
| 159 | | virtual void vic20_res_w(int state) { }; |
| 160 | 157 | |
| 161 | 158 | vic20_expansion_slot_device *m_slot; |
| 162 | 159 | |
trunk/src/mess/machine/vic20user.c
| r21093 | r21094 | |
| 60 | 60 | |
| 61 | 61 | |
| 62 | 62 | //------------------------------------------------- |
| 63 | | // vic20_user_port_device - destructor |
| 64 | | //------------------------------------------------- |
| 65 | | |
| 66 | | vic20_user_port_device::~vic20_user_port_device() |
| 67 | | { |
| 68 | | } |
| 69 | | |
| 70 | | |
| 71 | | //------------------------------------------------- |
| 72 | 63 | // device_config_complete - perform any |
| 73 | 64 | // operations now that the configuration is |
| 74 | 65 | // complete |
| r21093 | r21094 | |
| 99 | 90 | |
| 100 | 91 | void vic20_user_port_device::device_start() |
| 101 | 92 | { |
| 102 | | m_cart = dynamic_cast<device_vic20_user_port_interface *>(get_card_device()); |
| 93 | m_card = dynamic_cast<device_vic20_user_port_interface *>(get_card_device()); |
| 103 | 94 | |
| 104 | 95 | // resolve callbacks |
| 105 | 96 | m_out_light_pen_func.resolve(m_out_light_pen_cb, *this); |
| r21093 | r21094 | |
| 115 | 106 | |
| 116 | 107 | void vic20_user_port_device::device_reset() |
| 117 | 108 | { |
| 118 | | port_reset_w(ASSERT_LINE); |
| 119 | | port_reset_w(CLEAR_LINE); |
| 109 | if (get_card_device()) |
| 110 | { |
| 111 | get_card_device()->reset(); |
| 112 | } |
| 120 | 113 | } |
| 121 | 114 | |
| 122 | 115 | |
| 123 | | READ8_MEMBER( vic20_user_port_device::pb_r ) { UINT8 data = 0xff; if (m_cart != NULL) data = m_cart->vic20_pb_r(space, offset); return data; } |
| 124 | | WRITE8_MEMBER( vic20_user_port_device::pb_w ) { if (m_cart != NULL) m_cart->vic20_pb_w(space, offset, data); } |
| 125 | | READ_LINE_MEMBER( vic20_user_port_device::joy0_r ) { int state = 1; if (m_cart != NULL) state = m_cart->vic20_joy0_r(); return state; } |
| 126 | | READ_LINE_MEMBER( vic20_user_port_device::joy1_r ) { int state = 1; if (m_cart != NULL) state = m_cart->vic20_joy1_r(); return state; } |
| 127 | | READ_LINE_MEMBER( vic20_user_port_device::joy2_r ) { int state = 1; if (m_cart != NULL) state = m_cart->vic20_joy2_r(); return state; } |
| 128 | | READ_LINE_MEMBER( vic20_user_port_device::light_pen_r ) { int state = 1; if (m_cart != NULL) state = m_cart->vic20_light_pen_r(); return state; } |
| 129 | | READ_LINE_MEMBER( vic20_user_port_device::cassette_switch_r ) { int state = 1; if (m_cart != NULL) state = m_cart->vic20_cassette_switch_r(); return state; } |
| 130 | | WRITE_LINE_MEMBER( vic20_user_port_device::cb1_w ) { if (m_cart != NULL) m_cart->vic20_cb1_w(state); } |
| 131 | | WRITE_LINE_MEMBER( vic20_user_port_device::cb2_w ) { if (m_cart != NULL) m_cart->vic20_cb2_w(state); } |
| 132 | | WRITE_LINE_MEMBER( vic20_user_port_device::atn_w ) { if (m_cart != NULL) m_cart->vic20_atn_w(state); } |
| 133 | | WRITE_LINE_MEMBER( vic20_user_port_device::port_reset_w ) { if (m_cart != NULL) m_cart->vic20_reset_w(state); } |
| 134 | | |
| 135 | | WRITE_LINE_MEMBER( vic20_user_port_device::light_pen_w ) { m_out_light_pen_func(state); } |
| 136 | | WRITE_LINE_MEMBER( vic20_user_port_device::via_cb1_w ) { m_out_cb1_func(state); } |
| 137 | | WRITE_LINE_MEMBER( vic20_user_port_device::via_cb2_w ) { m_out_cb2_func(state); } |
| 138 | | WRITE_LINE_MEMBER( vic20_user_port_device::reset_w ) { m_out_reset_func(state); } |
| 116 | READ8_MEMBER( vic20_user_port_device::pb_r ) { UINT8 data = 0xff; if (m_card != NULL) data = m_card->vic20_pb_r(space, offset); return data; } |
| 117 | WRITE8_MEMBER( vic20_user_port_device::pb_w ) { if (m_card != NULL) m_card->vic20_pb_w(space, offset, data); } |
| 118 | READ_LINE_MEMBER( vic20_user_port_device::joy0_r ) { int state = 1; if (m_card != NULL) state = m_card->vic20_joy0_r(); return state; } |
| 119 | READ_LINE_MEMBER( vic20_user_port_device::joy1_r ) { int state = 1; if (m_card != NULL) state = m_card->vic20_joy1_r(); return state; } |
| 120 | READ_LINE_MEMBER( vic20_user_port_device::joy2_r ) { int state = 1; if (m_card != NULL) state = m_card->vic20_joy2_r(); return state; } |
| 121 | READ_LINE_MEMBER( vic20_user_port_device::light_pen_r ) { int state = 1; if (m_card != NULL) state = m_card->vic20_light_pen_r(); return state; } |
| 122 | READ_LINE_MEMBER( vic20_user_port_device::cassette_switch_r ) { int state = 1; if (m_card != NULL) state = m_card->vic20_cassette_switch_r(); return state; } |
| 123 | WRITE_LINE_MEMBER( vic20_user_port_device::cb1_w ) { if (m_card != NULL) m_card->vic20_cb1_w(state); } |
| 124 | WRITE_LINE_MEMBER( vic20_user_port_device::cb2_w ) { if (m_card != NULL) m_card->vic20_cb2_w(state); } |
| 125 | WRITE_LINE_MEMBER( vic20_user_port_device::atn_w ) { if (m_card != NULL) m_card->vic20_atn_w(state); } |