trunk/src/mess/drivers/pet.c
| r20581 | r20582 | |
| 653 | 653 | DEVCB_NULL |
| 654 | 654 | }; |
| 655 | 655 | |
| 656 | //------------------------------------------------- |
| 657 | // PET_DATASSETTE_PORT_INTERFACE( datassette_intf ) |
| 658 | //------------------------------------------------- |
| 656 | 659 | |
| 660 | static PET_DATASSETTE_PORT_INTERFACE( datassette_intf ) |
| 661 | { |
| 662 | DEVCB_DEVICE_LINE_MEMBER("pia_0", pia6821_device, cb1_w) |
| 663 | }; |
| 664 | |
| 665 | //------------------------------------------------- |
| 666 | // PET_DATASSETTE_PORT_INTERFACE( datassette2_intf ) |
| 667 | //------------------------------------------------- |
| 668 | |
| 669 | static PET_DATASSETTE_PORT_INTERFACE( datassette2_intf ) |
| 670 | { |
| 671 | DEVCB_DEVICE_LINE_MEMBER("via6522_0", via6522_device, write_cb1) |
| 672 | }; |
| 673 | |
| 674 | |
| 657 | 675 | /************************************* |
| 658 | 676 | * |
| 659 | 677 | * Machine driver |
| r20581 | r20582 | |
| 679 | 697 | MCFG_PALETTE_LENGTH(ARRAY_LENGTH(pet_palette) / 3) |
| 680 | 698 | |
| 681 | 699 | /* cassette */ |
| 682 | | MCFG_CASSETTE_ADD( CASSETTE_TAG, cbm_cassette_interface ) |
| 683 | | MCFG_CASSETTE_ADD( CASSETTE2_TAG, cbm_cassette_interface ) |
| 700 | MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, "c1530", NULL) |
| 701 | MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT2_TAG, datassette2_intf, cbm_datassette_devices, NULL, NULL) |
| 684 | 702 | |
| 685 | 703 | /* via */ |
| 686 | 704 | MCFG_VIA6522_ADD( "via6522_0", 0, pet_via) |
trunk/src/mess/machine/pet.c
| r20581 | r20582 | |
| 15 | 15 | #include "includes/pet.h" |
| 16 | 16 | |
| 17 | 17 | #include "imagedev/cartslot.h" |
| 18 | | #include "imagedev/cassette.h" |
| 19 | 18 | #include "machine/ram.h" |
| 20 | 19 | |
| 21 | 20 | #define VERBOSE_LEVEL 0 |
| r20581 | r20582 | |
| 68 | 67 | data |= m_keyline_select; |
| 69 | 68 | |
| 70 | 69 | /* #1 cassette switch */ |
| 71 | | data |= ((machine().device<cassette_image_device>(CASSETTE_TAG)->get_state() & CASSETTE_MASK_UISTATE) == CASSETTE_STOPPED) << 4; |
| 70 | data |= m_cassette->sense_r() << 4; |
| 72 | 71 | |
| 73 | 72 | /* #2 cassette switch */ |
| 74 | | data |= ((machine().device<cassette_image_device>(CASSETTE2_TAG)->get_state() & CASSETTE_MASK_UISTATE) == CASSETTE_STOPPED) << 5; |
| 73 | data |= m_cassette2->sense_r() << 5; |
| 75 | 74 | |
| 76 | 75 | /* end or identify in */ |
| 77 | 76 | data |= m_ieee->eoi_r() << 6; |
| r20581 | r20582 | |
| 169 | 168 | READ8_MEMBER(pet_state::cass1_r) |
| 170 | 169 | { |
| 171 | 170 | // cassette 1 read |
| 172 | | return (machine().device<cassette_image_device>(CASSETTE_TAG)->input() > +0.0) ? 1 : 0; |
| 171 | return m_cassette->read(); |
| 173 | 172 | } |
| 174 | 173 | |
| 175 | 174 | WRITE8_MEMBER(pet_state::cass1_motor_w) |
| 176 | 175 | { |
| 177 | | if (!data) |
| 178 | | { |
| 179 | | machine().device<cassette_image_device>(CASSETTE_TAG)->change_state(CASSETTE_MOTOR_ENABLED,CASSETTE_MASK_MOTOR); |
| 180 | | m_datasette1_timer->adjust(attotime::zero, 0, attotime::from_hz(48000)); // I put 48000 because I was given some .wav with this freq |
| 181 | | } |
| 182 | | else |
| 183 | | { |
| 184 | | machine().device<cassette_image_device>(CASSETTE_TAG)->change_state(CASSETTE_MOTOR_DISABLED ,CASSETTE_MASK_MOTOR); |
| 185 | | m_datasette1_timer->reset(); |
| 186 | | } |
| 176 | m_cassette->motor_w(data); |
| 187 | 177 | } |
| 188 | 178 | |
| 189 | 179 | WRITE_LINE_MEMBER(pet_state::pia0_irq_w) |
| r20581 | r20582 | |
| 238 | 228 | WRITE_LINE_MEMBER(pet_state::pia1_irq_w) |
| 239 | 229 | { |
| 240 | 230 | m_pia1_irq = state; |
| 241 | | int level = (m_pia0_irq | m_pia1_irq | m_via_irq) ? ASSERT_LINE : CLEAR_LINE; |
| 231 | int level = (m_pia0_irq || m_pia1_irq || m_via_irq) ? ASSERT_LINE : CLEAR_LINE; |
| 242 | 232 | |
| 243 | 233 | machine().firstcpu->set_input_line(INPUT_LINE_IRQ0, level); |
| 244 | 234 | } |
| r20581 | r20582 | |
| 311 | 301 | |
| 312 | 302 | READ_LINE_MEMBER(pet_state::cass2_r) |
| 313 | 303 | { |
| 314 | | // cassette 2 read |
| 315 | | return (machine().device<cassette_image_device>(CASSETTE2_TAG)->input() > +0.0) ? 1 : 0; |
| 304 | return m_cassette2->read(); |
| 316 | 305 | } |
| 317 | 306 | |
| 318 | 307 | WRITE8_MEMBER(pet_state::via_pb_w) |
| r20581 | r20582 | |
| 339 | 328 | m_ieee->atn_w(BIT(data, 2)); |
| 340 | 329 | |
| 341 | 330 | /* cassette write */ |
| 342 | | machine().device<cassette_image_device>(CASSETTE_TAG)->output(BIT(data, 3) ? -(0x5a9e >> 1) : +(0x5a9e >> 1)); |
| 343 | | machine().device<cassette_image_device>(CASSETTE2_TAG)->output(BIT(data, 3) ? -(0x5a9e >> 1) : +(0x5a9e >> 1)); |
| 331 | m_cassette->write(BIT(data, 3)); |
| 332 | m_cassette2->write(BIT(data, 3)); |
| 344 | 333 | |
| 345 | 334 | /* #2 cassette motor */ |
| 346 | | if (BIT(data, 4)) |
| 347 | | { |
| 348 | | machine().device<cassette_image_device>(CASSETTE2_TAG)->change_state(CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR); |
| 349 | | m_datasette2_timer->adjust(attotime::zero, 0, attotime::from_hz(48000)); // I put 48000 because I was given some .wav with this freq |
| 350 | | } |
| 351 | | else |
| 352 | | { |
| 353 | | machine().device<cassette_image_device>(CASSETTE2_TAG)->change_state(CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR); |
| 354 | | m_datasette2_timer->reset(); |
| 355 | | } |
| 335 | m_cassette2->motor_w(BIT(data, 4)); |
| 356 | 336 | } |
| 357 | 337 | |
| 358 | 338 | WRITE_LINE_MEMBER(pet_state::gb_w) |
| r20581 | r20582 | |
| 612 | 592 | } |
| 613 | 593 | |
| 614 | 594 | |
| 615 | | TIMER_CALLBACK_MEMBER(pet_state::pet_tape1_timer) |
| 616 | | { |
| 617 | | pia6821_device *pia_0 = machine().device<pia6821_device>("pia_0"); |
| 618 | | // cassette 1 |
| 619 | | UINT8 data = (machine().device<cassette_image_device>(CASSETTE_TAG)->input() > +0.0) ? 1 : 0; |
| 620 | | pia_0->ca1_w(data); |
| 621 | | } |
| 622 | | |
| 623 | | TIMER_CALLBACK_MEMBER(pet_state::pet_tape2_timer) |
| 624 | | { |
| 625 | | via6522_device *via_0 = machine().device<via6522_device>("via6522_0"); |
| 626 | | // cassette 2 |
| 627 | | UINT8 data = (machine().device<cassette_image_device>(CASSETTE2_TAG)->input() > +0.0) ? 1 : 0; |
| 628 | | via_0->write_cb1(data); |
| 629 | | } |
| 630 | | |
| 631 | | |
| 632 | 595 | static void pet_common_driver_init( running_machine &machine ) |
| 633 | 596 | { |
| 634 | 597 | int i; |
| r20581 | r20582 | |
| 656 | 619 | |
| 657 | 620 | /* pet clock */ |
| 658 | 621 | machine.scheduler().timer_pulse(attotime::from_msec(10), timer_expired_delegate(FUNC(pet_state::pet_interrupt),state)); |
| 659 | | |
| 660 | | /* datasette */ |
| 661 | | state->m_datasette1_timer = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(pet_state::pet_tape1_timer),state)); |
| 662 | | state->m_datasette2_timer = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(pet_state::pet_tape2_timer),state)); |
| 663 | 622 | } |
| 664 | 623 | |
| 665 | 624 | |
trunk/src/mess/includes/pet.h
| r20581 | r20582 | |
| 12 | 12 | #include "machine/6522via.h" |
| 13 | 13 | #include "machine/ieee488.h" |
| 14 | 14 | #include "imagedev/cartslot.h" |
| 15 | #include "machine/petcass.h" |
| 15 | 16 | |
| 16 | 17 | struct spet_t |
| 17 | 18 | { |
| r20581 | r20582 | |
| 26 | 27 | pet_state(const machine_config &mconfig, device_type type, const char *tag) |
| 27 | 28 | : driver_device(mconfig, type, tag), |
| 28 | 29 | m_ieee(*this, IEEE488_TAG), |
| 30 | m_cassette(*this, PET_DATASSETTE_PORT_TAG), |
| 31 | m_cassette2(*this, PET_DATASSETTE_PORT2_TAG), |
| 29 | 32 | m_videoram(*this, "videoram"), |
| 30 | | m_memory(*this, "memory"){ } |
| 33 | m_memory(*this, "memory") |
| 34 | { } |
| 31 | 35 | |
| 32 | 36 | required_device<ieee488_device> m_ieee; |
| 37 | required_device<pet_datassette_port_device> m_cassette; |
| 38 | required_device<pet_datassette_port_device> m_cassette2; |
| 33 | 39 | |
| 34 | 40 | int m_pet_basic1; /* basic version 1 for quickloader */ |
| 35 | 41 | int m_superpet; |
| r20581 | r20582 | |
| 44 | 50 | UINT8 *m_supermemory; |
| 45 | 51 | UINT8 *m_pet80_bank1_base; |
| 46 | 52 | int m_keyline_select; |
| 47 | | emu_timer *m_datasette1_timer; |
| 48 | | emu_timer *m_datasette2_timer; |
| 49 | 53 | spet_t m_spet; |
| 50 | 54 | int m_pia_level; |
| 51 | 55 | DECLARE_DRIVER_INIT(superpet); |
| r20581 | r20582 | |
| 58 | 62 | UINT32 screen_update_pet(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 59 | 63 | INTERRUPT_GEN_MEMBER(pet_frame_interrupt); |
| 60 | 64 | TIMER_CALLBACK_MEMBER(pet_interrupt); |
| 61 | | TIMER_CALLBACK_MEMBER(pet_tape1_timer); |
| 62 | | TIMER_CALLBACK_MEMBER(pet_tape2_timer); |
| 63 | 65 | DECLARE_READ8_MEMBER(pia0_pa_r); |
| 64 | 66 | DECLARE_WRITE8_MEMBER(pia0_pa_w); |
| 65 | 67 | DECLARE_READ8_MEMBER(kin_r); |