src/mess/video/aim65.c
| r14135 | r14136 | |
| 91 | 91 | } |
| 92 | 92 | |
| 93 | 93 | |
| 94 | | WRITE8_MEMBER( aim65_state::aim65_printer_data_a ) |
| 94 | WRITE8_MEMBER( aim65_state::aim65_pa_w ) |
| 95 | 95 | { |
| 96 | // All bits are for printer data (not emulated) |
| 96 | 97 | #if 0 |
| 97 | 98 | if (m_flag_a == 0) |
| 98 | 99 | { |
| r14135 | r14136 | |
| 102 | 103 | #endif |
| 103 | 104 | } |
| 104 | 105 | |
| 105 | | WRITE8_MEMBER( aim65_state::aim65_printer_data_b ) |
| 106 | WRITE8_MEMBER( aim65_state::aim65_pb_w ) |
| 106 | 107 | { |
| 108 | /* |
| 109 | d7 = cass out (both decks) |
| 110 | d5 = cass2 motor |
| 111 | d4 = cass1 motor |
| 112 | d2 = tty out (not emulated) |
| 113 | d0/1 = printer data (not emulated) |
| 114 | */ |
| 115 | |
| 116 | UINT8 bits = data ^ m_pb_save; |
| 117 | m_pb_save = data; |
| 118 | |
| 119 | if (BIT(bits, 7)) |
| 120 | { |
| 121 | m_cass1->output(BIT(data, 7) ? -1.0 : +1.0); |
| 122 | m_cass2->output(BIT(data, 7) ? -1.0 : +1.0); |
| 123 | } |
| 124 | |
| 125 | if (BIT(bits, 5)) |
| 126 | { |
| 127 | if (BIT(data, 5)) |
| 128 | m_cass2->change_state(CASSETTE_MOTOR_DISABLED,CASSETTE_MASK_MOTOR); |
| 129 | else |
| 130 | m_cass2->change_state(CASSETTE_MOTOR_ENABLED,CASSETTE_MASK_MOTOR); |
| 131 | } |
| 132 | |
| 133 | if (BIT(bits, 4)) |
| 134 | { |
| 135 | if (BIT(data, 4)) |
| 136 | m_cass1->change_state(CASSETTE_MOTOR_DISABLED,CASSETTE_MASK_MOTOR); |
| 137 | else |
| 138 | m_cass1->change_state(CASSETTE_MOTOR_ENABLED,CASSETTE_MASK_MOTOR); |
| 139 | } |
| 140 | |
| 141 | |
| 107 | 142 | #if 0 |
| 108 | 143 | data &= 0x03; |
| 109 | 144 | |
| r14135 | r14136 | |
| 132 | 167 | state->m_flag_a = 0; |
| 133 | 168 | state->m_flag_b = 0; |
| 134 | 169 | state->m_printer_level = 0; |
| 170 | state->m_pb_save = 0; |
| 135 | 171 | } |
| 136 | 172 | |
| 137 | 173 | |
| r14135 | r14136 | |
| 168 | 204 | return 0; |
| 169 | 205 | } |
| 170 | 206 | #endif |
| 207 | |
| 208 | |
| 209 | READ8_MEMBER( aim65_state::aim65_pb_r ) |
| 210 | { |
| 211 | /* |
| 212 | d7 = cassette in (deck 1) |
| 213 | d6 = tty in (not emulated) |
| 214 | d3 = kb/tty switch |
| 215 | */ |
| 216 | |
| 217 | UINT8 data = input_port_read(machine(), "switches"); |
| 218 | data |= (m_cass1->input() > +0.03) ? 0x80 : 0; |
| 219 | data |= 0x40; // TTY must be H if not used. |
| 220 | data |= m_pb_save & 0x37; |
| 221 | return data; |
| 222 | } |
| 223 | |
src/mess/includes/aim65.h
| r14135 | r14136 | |
| 15 | 15 | #include "machine/6522via.h" |
| 16 | 16 | #include "machine/6532riot.h" |
| 17 | 17 | #include "machine/6821pia.h" |
| 18 | #include "machine/ram.h" |
| 18 | 19 | #include "imagedev/cartslot.h" |
| 19 | | #include "machine/ram.h" |
| 20 | #include "imagedev/cassette.h" |
| 21 | #include "sound/wave.h" |
| 20 | 22 | |
| 23 | |
| 21 | 24 | /** R6502 Clock. |
| 22 | 25 | * |
| 23 | 26 | * The R6502 on AIM65 operates at 1 MHz. The frequency reference is a 4 MHz |
| r14135 | r14136 | |
| 31 | 34 | { |
| 32 | 35 | public: |
| 33 | 36 | aim65_state(const machine_config &mconfig, device_type type, const char *tag) |
| 34 | | : driver_device(mconfig, type, tag) { } |
| 37 | : driver_device(mconfig, type, tag), |
| 38 | m_maincpu(*this, "maincpu"), |
| 39 | m_cass1(*this, CASSETTE_TAG), |
| 40 | m_cass2(*this, CASSETTE2_TAG) |
| 41 | { } |
| 35 | 42 | |
| 36 | 43 | DECLARE_WRITE8_MEMBER(aim65_pia_a_w); |
| 37 | 44 | DECLARE_WRITE8_MEMBER(aim65_pia_b_w); |
| 38 | 45 | DECLARE_READ8_MEMBER(aim65_riot_b_r); |
| 39 | 46 | DECLARE_WRITE8_MEMBER(aim65_riot_a_w); |
| 40 | | DECLARE_WRITE8_MEMBER(aim65_printer_data_a); |
| 41 | | DECLARE_WRITE8_MEMBER(aim65_printer_data_b); |
| 47 | DECLARE_WRITE8_MEMBER(aim65_pa_w); |
| 48 | DECLARE_WRITE8_MEMBER(aim65_pb_w); |
| 42 | 49 | DECLARE_WRITE8_MEMBER(aim65_printer_on); |
| 50 | DECLARE_READ8_MEMBER(aim65_pb_r); |
| 43 | 51 | UINT8 m_pia_a; |
| 44 | 52 | UINT8 m_pia_b; |
| 45 | 53 | UINT8 m_riot_port_a; |
| 54 | UINT8 m_pb_save; |
| 46 | 55 | emu_timer *m_print_timer; |
| 47 | 56 | int m_printer_x; |
| 48 | 57 | int m_printer_y; |
| r14135 | r14136 | |
| 50 | 59 | bool m_flag_a; |
| 51 | 60 | bool m_flag_b; |
| 52 | 61 | bool m_printer_level; |
| 62 | |
| 63 | required_device<cpu_device> m_maincpu; |
| 64 | required_device<cassette_image_device> m_cass1; |
| 65 | required_device<cassette_image_device> m_cass2; |
| 53 | 66 | }; |
| 54 | 67 | |
| 55 | 68 | |
src/mess/drivers/aim65.c
| r14135 | r14136 | |
| 5 | 5 | |
| 6 | 6 | ToDo: |
| 7 | 7 | - Printer. Tried to implement this but it was not working, currently disabled. |
| 8 | | - Dual tape interface |
| 8 | - Dual tape interface (done, but see bugs below) |
| 9 | 9 | - Implement punchtape reader/writer and TTY keyboard |
| 10 | 10 | - Front panel Reset switch (switch S1) |
| 11 | 11 | - Front panel Run/Step switch (switch S2) |
| 12 | 12 | |
| 13 | Bugs |
| 14 | - Cassette should output data on PB7, but the bit stays High. |
| 15 | - At the end of saving, both motors sometimes get turned on! |
| 16 | - CA2 should switch the cassette circuits between input and output. |
| 17 | It goes High on Read (correct) but doesn't go Low for Write. |
| 18 | - Read of CA1 is to check the printer, but it never happens. |
| 19 | - Write to CB1 should occur to activate printer's Start line, but it |
| 20 | also never happens. |
| 21 | - The common factor is the 6522, maybe it has problems.. |
| 22 | |
| 13 | 23 | ******************************************************************************/ |
| 14 | 24 | #define ADDRESS_MAP_MODERN |
| 15 | 25 | |
| r14135 | r14136 | |
| 133 | 143 | DEVICE INTERFACES |
| 134 | 144 | ***************************************************************************/ |
| 135 | 145 | |
| 146 | |
| 136 | 147 | /* Riot interface Z33 */ |
| 137 | 148 | static const riot6532_interface aim65_riot_interface = |
| 138 | 149 | { |
| r14135 | r14136 | |
| 146 | 157 | /* system via interface Z32 */ |
| 147 | 158 | static const via6522_interface aim65_system_via = |
| 148 | 159 | { |
| 149 | | DEVCB_NULL, |
| 150 | | DEVCB_INPUT_PORT("switches"), |
| 151 | | DEVCB_NULL, |
| 152 | | DEVCB_NULL, |
| 153 | | DEVCB_NULL, |
| 154 | | DEVCB_NULL, |
| 155 | | DEVCB_DRIVER_MEMBER(aim65_state, aim65_printer_data_a), |
| 156 | | DEVCB_DRIVER_MEMBER(aim65_state, aim65_printer_data_b), |
| 157 | | DEVCB_NULL, |
| 158 | | DEVCB_NULL, |
| 159 | | DEVCB_NULL, |
| 160 | | DEVCB_DRIVER_MEMBER(aim65_state, aim65_printer_on), |
| 161 | | DEVCB_CPU_INPUT_LINE("maincpu", M6502_IRQ_LINE) |
| 160 | DEVCB_NULL, // in port A |
| 161 | DEVCB_DRIVER_MEMBER(aim65_state, aim65_pb_r), // in port B |
| 162 | DEVCB_NULL, // in CA1 printer ready? |
| 163 | DEVCB_NULL, // in CB1 |
| 164 | DEVCB_NULL, // in CA2 |
| 165 | DEVCB_NULL, // in CB2 |
| 166 | DEVCB_DRIVER_MEMBER(aim65_state, aim65_pa_w), // out port A |
| 167 | DEVCB_DRIVER_MEMBER(aim65_state, aim65_pb_w), // out port B |
| 168 | DEVCB_NULL, // out CA1 |
| 169 | DEVCB_NULL, // out CB1 printer start |
| 170 | DEVCB_NULL, // out CA2 cass control (H=in) |
| 171 | DEVCB_DRIVER_MEMBER(aim65_state, aim65_printer_on), // out CB2 |
| 172 | DEVCB_CPU_INPUT_LINE("maincpu", M6502_IRQ_LINE) //IRQ |
| 162 | 173 | }; |
| 163 | 174 | |
| 164 | 175 | /* user via interface Z1 */ |
| r14135 | r14136 | |
| 196 | 207 | DEVCB_NULL |
| 197 | 208 | }; |
| 198 | 209 | |
| 210 | // Deck 1 can play and record |
| 211 | static const cassette_interface aim65_1_cassette_interface = |
| 212 | { |
| 213 | cassette_default_formats, |
| 214 | NULL, |
| 215 | (cassette_state)(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED), |
| 216 | NULL, |
| 217 | NULL |
| 218 | }; |
| 199 | 219 | |
| 220 | // Deck 2 can only record |
| 221 | static const cassette_interface aim65_2_cassette_interface = |
| 222 | { |
| 223 | cassette_default_formats, |
| 224 | NULL, |
| 225 | (cassette_state)(CASSETTE_RECORD | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED), |
| 226 | NULL, |
| 227 | NULL |
| 228 | }; |
| 229 | |
| 230 | |
| 200 | 231 | /*************************************************************************** |
| 201 | 232 | MACHINE DRIVERS |
| 202 | 233 | ***************************************************************************/ |
| r14135 | r14136 | |
| 219 | 250 | |
| 220 | 251 | MCFG_VIDEO_START(aim65) |
| 221 | 252 | |
| 253 | /* Sound - wave sound only */ |
| 254 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 255 | MCFG_SOUND_WAVE_ADD(WAVE_TAG, CASSETTE_TAG) |
| 256 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 257 | |
| 222 | 258 | /* other devices */ |
| 223 | 259 | MCFG_RIOT6532_ADD("riot", AIM65_CLOCK, aim65_riot_interface) |
| 224 | 260 | MCFG_VIA6522_ADD("via6522_0", 0, aim65_system_via) |
| 225 | 261 | MCFG_VIA6522_ADD("via6522_1", 0, aim65_user_via) |
| 226 | 262 | MCFG_PIA6821_ADD("pia6821", aim65_pia_config) |
| 227 | 263 | |
| 264 | MCFG_CASSETTE_ADD( CASSETTE_TAG, aim65_1_cassette_interface ) |
| 265 | MCFG_CASSETTE_ADD( CASSETTE2_TAG, aim65_2_cassette_interface ) |
| 266 | |
| 228 | 267 | MCFG_CARTSLOT_ADD("cart1") |
| 229 | 268 | MCFG_CARTSLOT_EXTENSION_LIST("z26") |
| 230 | 269 | MCFG_CARTSLOT_NOT_MANDATORY |