src/mess/machine/pet.c
| r7160 | r7161 | |
| 40 | 40 | static emu_timer *datasette1_timer; |
| 41 | 41 | static emu_timer *datasette2_timer; |
| 42 | 42 | |
| 43 | | |
| 44 | | static READ8_HANDLER( pet_mc6845_register_r ) |
| 45 | | { |
| 46 | | const device_config *devconf = devtag_get_device(space->machine, "crtc"); |
| 47 | | return mc6845_register_r(devconf, offset); |
| 48 | | } |
| 49 | | |
| 50 | | static WRITE8_HANDLER( pet_mc6845_register_w ) |
| 51 | | { |
| 52 | | const device_config *devconf = devtag_get_device(space->machine, "crtc"); |
| 53 | | mc6845_register_w(devconf, offset, data); |
| 54 | | } |
| 55 | | |
| 56 | | static WRITE8_HANDLER( pet_mc6845_address_w ) |
| 57 | | { |
| 58 | | const device_config *devconf = devtag_get_device(space->machine, "crtc"); |
| 59 | | mc6845_address_w(devconf, offset, data); |
| 60 | | } |
| 61 | | |
| 62 | 43 | /* pia at 0xe810 |
| 63 | 44 | port a |
| 64 | 45 | 7 sense input (low for diagnostics) |
| r7160 | r7161 | |
| 73 | 54 | cb1 video sync in |
| 74 | 55 | cb2 cassette 1 motor out |
| 75 | 56 | */ |
| 76 | | static READ8_DEVICE_HANDLER( pet_pia0_port_a_read ) |
| 57 | static READ8_DEVICE_HANDLER( pia0_pa_r ) |
| 77 | 58 | { |
| 78 | 59 | /* |
| 79 | 60 | |
| r7160 | r7161 | |
| 111 | 92 | return data; |
| 112 | 93 | } |
| 113 | 94 | |
| 114 | | static WRITE8_DEVICE_HANDLER( pet_pia0_port_a_write ) |
| 95 | static WRITE8_DEVICE_HANDLER( pia0_pa_w ) |
| 115 | 96 | { |
| 116 | 97 | /* |
| 117 | 98 | |
| r7160 | r7161 | |
| 128 | 109 | |
| 129 | 110 | */ |
| 130 | 111 | |
| 112 | /* key */ |
| 131 | 113 | pet_keyline_select = data & 0x0f; |
| 132 | 114 | } |
| 133 | 115 | |
| r7160 | r7161 | |
| 166 | 148 | } |
| 167 | 149 | |
| 168 | 150 | /* Keyboard handling for business keyboard */ |
| 169 | | static READ8_DEVICE_HANDLER( petb_pia0_port_b_read ) |
| 151 | static READ8_DEVICE_HANDLER( petb_kin_r ) |
| 170 | 152 | { |
| 171 | 153 | UINT8 data = 0xff; |
| 172 | 154 | pet_state *state = (pet_state *)device->machine->driver_data; |
| r7160 | r7161 | |
| 196 | 178 | } |
| 197 | 179 | |
| 198 | 180 | /* NOT WORKING - Just placeholder */ |
| 199 | | static READ8_DEVICE_HANDLER( cass_1_r ) |
| 181 | static READ8_DEVICE_HANDLER( cass1_r ) |
| 200 | 182 | { |
| 201 | 183 | // cassette 1 read |
| 202 | 184 | return (cassette_input(devtag_get_device(device->machine, "cassette1")) > +0.0) ? 1 : 0; |
| r7160 | r7161 | |
| 209 | 191 | ieee488_eoi_w(ieeebus, device, data); |
| 210 | 192 | } |
| 211 | 193 | |
| 212 | | static WRITE8_DEVICE_HANDLER( cass_motor_1_w ) |
| 194 | static WRITE8_DEVICE_HANDLER( cass1_motor_w ) |
| 213 | 195 | { |
| 214 | 196 | if (!data) |
| 215 | 197 | { |
| r7160 | r7161 | |
| 223 | 205 | } |
| 224 | 206 | } |
| 225 | 207 | |
| 208 | static WRITE_LINE_DEVICE_HANDLER( pia0_irq_w ) |
| 209 | { |
| 210 | pet_state *driver_state = (pet_state *)device->machine->driver_data; |
| 211 | |
| 212 | driver_state->pia0_irq = state; |
| 213 | int level = (driver_state->pia0_irq | driver_state->pia1_irq | driver_state->via_irq) ? ASSERT_LINE : CLEAR_LINE; |
| 214 | |
| 215 | cpu_set_input_line(device->machine->firstcpu, INPUT_LINE_IRQ0, level); |
| 216 | } |
| 217 | |
| 218 | const pia6821_interface pet_pia0 = |
| 219 | { |
| 220 | DEVCB_HANDLER(pia0_pa_r), /* in_a_func */ |
| 221 | DEVCB_HANDLER(kin_r), /* in_b_func */ |
| 222 | DEVCB_HANDLER(cass1_r), /* in_ca1_func */ |
| 223 | DEVCB_NULL, /* in_cb1_func */ |
| 224 | DEVCB_NULL, /* in_ca2_func */ |
| 225 | DEVCB_NULL, /* in_cb2_func */ |
| 226 | DEVCB_HANDLER(pia0_pa_w), /* out_a_func */ |
| 227 | DEVCB_NULL, /* out_b_func */ |
| 228 | DEVCB_HANDLER(eoi_w), /* out_ca2_func */ |
| 229 | DEVCB_HANDLER(cass1_motor_w), /* out_cb2_func */ |
| 230 | DEVCB_LINE(pia0_irq_w), /* irq_a_func */ |
| 231 | DEVCB_LINE(pia0_irq_w) /* irq_b_func */ |
| 232 | }; |
| 233 | |
| 234 | const pia6821_interface petb_pia0 = |
| 235 | { |
| 236 | DEVCB_HANDLER(pia0_pa_r), /* in_a_func */ |
| 237 | DEVCB_HANDLER(petb_kin_r), /* in_b_func */ |
| 238 | DEVCB_HANDLER(cass1_r), /* in_ca1_func */ |
| 239 | DEVCB_NULL, /* in_cb1_func */ |
| 240 | DEVCB_NULL, /* in_ca2_func */ |
| 241 | DEVCB_NULL, /* in_cb2_func */ |
| 242 | DEVCB_HANDLER(pia0_pa_w), /* out_a_func */ |
| 243 | DEVCB_NULL, /* out_b_func */ |
| 244 | DEVCB_HANDLER(eoi_w), /* out_ca2_func */ |
| 245 | DEVCB_HANDLER(cass1_motor_w), /* out_cb2_func */ |
| 246 | DEVCB_LINE(pia0_irq_w), /* irq_a_func */ |
| 247 | DEVCB_LINE(pia0_irq_w) /* irq_b_func */ |
| 248 | }; |
| 249 | |
| 226 | 250 | /* pia at 0xe820 (ieee488) |
| 227 | 251 | port a data in |
| 228 | 252 | port b data out |
| r7160 | r7161 | |
| 268 | 292 | ieee488_dav_w(ieeebus, device, data); |
| 269 | 293 | } |
| 270 | 294 | |
| 271 | | static WRITE_LINE_DEVICE_HANDLER( pia0_irq_w ) |
| 272 | | { |
| 273 | | pet_state *driver_state = (pet_state *)device->machine->driver_data; |
| 274 | | |
| 275 | | driver_state->pia0_irq = state; |
| 276 | | int level = (driver_state->pia0_irq | driver_state->pia1_irq | driver_state->via_irq) ? ASSERT_LINE : CLEAR_LINE; |
| 277 | | |
| 278 | | cpu_set_input_line(device->machine->firstcpu, INPUT_LINE_IRQ0, level); |
| 279 | | } |
| 280 | | |
| 281 | 295 | static WRITE_LINE_DEVICE_HANDLER( pia1_irq_w ) |
| 282 | 296 | { |
| 283 | 297 | pet_state *driver_state = (pet_state *)device->machine->driver_data; |
| r7160 | r7161 | |
| 288 | 302 | cpu_set_input_line(device->machine->firstcpu, INPUT_LINE_IRQ0, level); |
| 289 | 303 | } |
| 290 | 304 | |
| 291 | | const pia6821_interface pet_pia0 = |
| 292 | | { |
| 293 | | DEVCB_HANDLER(pet_pia0_port_a_read), /* in_a_func */ |
| 294 | | DEVCB_HANDLER(kin_r), /* in_b_func */ |
| 295 | | DEVCB_HANDLER(cass_1_r), /* in_ca1_func */ |
| 296 | | DEVCB_NULL, /* in_cb1_func */ |
| 297 | | DEVCB_NULL, /* in_ca2_func */ |
| 298 | | DEVCB_NULL, /* in_cb2_func */ |
| 299 | | DEVCB_HANDLER(pet_pia0_port_a_write), /* out_a_func */ |
| 300 | | DEVCB_NULL, /* out_b_func */ |
| 301 | | DEVCB_HANDLER(eoi_w), /* out_ca2_func */ |
| 302 | | DEVCB_HANDLER(cass_motor_1_w), /* out_cb2_func */ |
| 303 | | DEVCB_LINE(pia0_irq_w), /* irq_a_func */ |
| 304 | | DEVCB_LINE(pia0_irq_w) /* irq_b_func */ |
| 305 | | }; |
| 306 | | |
| 307 | | const pia6821_interface petb_pia0 = |
| 308 | | { |
| 309 | | DEVCB_HANDLER(pet_pia0_port_a_read), /* in_a_func */ |
| 310 | | DEVCB_HANDLER(petb_pia0_port_b_read), /* in_b_func */ |
| 311 | | DEVCB_HANDLER(cass_1_r), /* in_ca1_func */ |
| 312 | | DEVCB_NULL, /* in_cb1_func */ |
| 313 | | DEVCB_NULL, /* in_ca2_func */ |
| 314 | | DEVCB_NULL, /* in_cb2_func */ |
| 315 | | DEVCB_HANDLER(pet_pia0_port_a_write), /* out_a_func */ |
| 316 | | DEVCB_NULL, /* out_b_func */ |
| 317 | | DEVCB_HANDLER(eoi_w), /* out_ca2_func */ |
| 318 | | DEVCB_HANDLER(cass_motor_1_w), /* out_cb2_func */ |
| 319 | | DEVCB_LINE(pia1_irq_w), /* irq_a_func */ |
| 320 | | DEVCB_LINE(pia1_irq_w) /* irq_b_func */ |
| 321 | | }; |
| 322 | | |
| 323 | 305 | const pia6821_interface pet_pia1 = |
| 324 | 306 | { |
| 325 | 307 | DEVCB_DEVICE_HANDLER("ieee_bus", ieee488_dio_r),/* in_a_func */ |
| r7160 | r7161 | |
| 336 | 318 | DEVCB_LINE(pia1_irq_w) /* irq_b_func */ |
| 337 | 319 | }; |
| 338 | 320 | |
| 339 | | static WRITE_LINE_DEVICE_HANDLER( gb_w ) |
| 340 | | { |
| 341 | | DBG_LOG(device->machine, 1, "address line", ("%d\n", state)); |
| 342 | | if (state) pet_font |= 1; |
| 343 | | else pet_font &= ~1; |
| 344 | | } |
| 345 | | |
| 346 | 321 | /* userport, cassettes, rest ieee488 |
| 347 | 322 | ca1 userport |
| 348 | 323 | ca2 character rom address line 11 |
| r7160 | r7161 | |
| 441 | 416 | } |
| 442 | 417 | } |
| 443 | 418 | |
| 419 | static WRITE_LINE_DEVICE_HANDLER( gb_w ) |
| 420 | { |
| 421 | DBG_LOG(device->machine, 1, "address line", ("%d\n", state)); |
| 422 | if (state) pet_font |= 1; |
| 423 | else pet_font &= ~1; |
| 424 | } |
| 425 | |
| 444 | 426 | static WRITE_LINE_DEVICE_HANDLER( via_irq_w ) |
| 445 | 427 | { |
| 446 | 428 | pet_state *driver_state = (pet_state *)device->machine->driver_data; |
| r7160 | r7161 | |
| 478 | 460 | const device_config *via_0 = devtag_get_device(space->machine, "via6522_0"); |
| 479 | 461 | const device_config *pia_0 = devtag_get_device(space->machine, "pia_0"); |
| 480 | 462 | const device_config *pia_1 = devtag_get_device(space->machine, "pia_1"); |
| 463 | const device_config *mc6845 = devtag_get_device(space->machine, "crtc"); |
| 481 | 464 | |
| 482 | 465 | if (offset < 0x10) ; |
| 483 | 466 | else if (offset < 0x14) pia6821_w(pia_0, offset & 3, data); |
| r7160 | r7161 | |
| 486 | 469 | else if (offset < 0x40) ; |
| 487 | 470 | else if (offset < 0x50) via_w(via_0, offset & 0xf, data); |
| 488 | 471 | else if (offset < 0x80) ; |
| 489 | | else if (offset == 0x80) pet_mc6845_address_w(space, offset, data); |
| 490 | | else if (offset == 0x81) pet_mc6845_register_w(space, offset, data); |
| 472 | else if (offset == 0x80) mc6845_address_w(mc6845, 0, data); |
| 473 | else if (offset == 0x81) mc6845_register_w(mc6845, 0, data); |
| 491 | 474 | } |
| 492 | 475 | |
| 493 | 476 | static READ8_HANDLER( cbm8096_io_r ) |
| r7160 | r7161 | |
| 495 | 478 | const device_config *via_0 = devtag_get_device(space->machine, "via6522_0"); |
| 496 | 479 | const device_config *pia_0 = devtag_get_device(space->machine, "pia_0"); |
| 497 | 480 | const device_config *pia_1 = devtag_get_device(space->machine, "pia_1"); |
| 481 | const device_config *mc6845 = devtag_get_device(space->machine, "crtc"); |
| 498 | 482 | |
| 499 | 483 | int data = 0xff; |
| 500 | 484 | if (offset < 0x10) ; |
| r7160 | r7161 | |
| 504 | 488 | else if (offset < 0x40) ; |
| 505 | 489 | else if (offset < 0x50) data = via_r(via_0, offset & 0xf); |
| 506 | 490 | else if (offset < 0x80) ; |
| 507 | | else if (offset == 0x81) data = pet_mc6845_register_r(space, offset); |
| 491 | else if (offset == 0x81) data = mc6845_register_r(mc6845, 0); |
| 508 | 492 | return data; |
| 509 | 493 | } |
| 510 | 494 | |