trunk/src/mame/drivers/fidel6502.cpp
| r252937 | r252938 | |
| 6 | 6 | See drivers/fidelz80.cpp for hardware description |
| 7 | 7 | |
| 8 | 8 | TODO: |
| 9 | | - speech doesn't work |
| 9 | - x |
| 10 | 10 | |
| 11 | 11 | ******************************************************************************/ |
| 12 | 12 | |
| 13 | 13 | #include "emu.h" |
| 14 | 14 | #include "cpu/m6502/m6502.h" |
| 15 | 15 | #include "machine/6821pia.h" |
| 16 | #include "sound/speaker.h" |
| 16 | 17 | |
| 17 | 18 | #include "includes/fidelz80.h" |
| 18 | 19 | |
| 20 | // internal artwork |
| 21 | extern const char layout_fidel_vsc[]; // same layout as fidelz80/vsc |
| 19 | 22 | |
| 20 | 23 | |
| 21 | | // same layout of Sensory Chess Challenger |
| 22 | | //extern const char layout_vsc[]; |
| 23 | | |
| 24 | 24 | class fidel6502_state : public fidelz80base_state |
| 25 | 25 | { |
| 26 | 26 | public: |
| 27 | 27 | fidel6502_state(const machine_config &mconfig, device_type type, const char *tag) |
| 28 | 28 | : fidelz80base_state(mconfig, type, tag), |
| 29 | | m_6821pia(*this, "6821pia") |
| 29 | m_6821pia(*this, "6821pia"), |
| 30 | m_speaker(*this, "speaker") |
| 30 | 31 | { } |
| 31 | 32 | |
| 32 | 33 | // devices/pointers |
| 33 | 34 | optional_device<pia6821_device> m_6821pia; |
| 35 | optional_device<speaker_sound_device> m_speaker; |
| 34 | 36 | |
| 35 | | UINT16 input_read(int index); |
| 36 | | DECLARE_WRITE8_MEMBER( pia0_pa_w ); |
| 37 | | DECLARE_WRITE8_MEMBER( pia0_pb_w ); |
| 38 | | DECLARE_READ8_MEMBER( pia0_pb_r ); |
| 39 | | DECLARE_WRITE_LINE_MEMBER( pia0_ca2_w ); |
| 40 | | DECLARE_WRITE8_MEMBER( pia1_pa_w ); |
| 41 | | DECLARE_WRITE8_MEMBER( pia1_pb_w ); |
| 42 | | DECLARE_READ8_MEMBER( pia1_pa_r ); |
| 43 | | DECLARE_WRITE_LINE_MEMBER( pia1_ca2_w ); |
| 44 | | DECLARE_WRITE_LINE_MEMBER( pia1_cb2_w ); |
| 45 | | DECLARE_READ_LINE_MEMBER( pia1_ca1_r ); |
| 46 | | DECLARE_READ_LINE_MEMBER( pia1_cb1_r ); |
| 37 | // model CSC |
| 38 | void csc_prepare_display(); |
| 39 | DECLARE_READ8_MEMBER(csc_speech_r); |
| 40 | DECLARE_WRITE8_MEMBER(csc_pia0_pa_w); |
| 41 | DECLARE_WRITE8_MEMBER(csc_pia0_pb_w); |
| 42 | DECLARE_READ8_MEMBER(csc_pia0_pb_r); |
| 43 | DECLARE_WRITE_LINE_MEMBER(csc_pia0_ca2_w); |
| 44 | DECLARE_WRITE8_MEMBER(csc_pia1_pa_w); |
| 45 | DECLARE_WRITE8_MEMBER(csc_pia1_pb_w); |
| 46 | DECLARE_READ8_MEMBER(csc_pia1_pa_r); |
| 47 | DECLARE_WRITE_LINE_MEMBER(csc_pia1_ca2_w); |
| 48 | DECLARE_WRITE_LINE_MEMBER(csc_pia1_cb2_w); |
| 49 | DECLARE_READ_LINE_MEMBER(csc_pia1_ca1_r); |
| 50 | DECLARE_READ_LINE_MEMBER(csc_pia1_cb1_r); |
| 47 | 51 | |
| 48 | | UINT8 m_selector; |
| 49 | 52 | TIMER_DEVICE_CALLBACK_MEMBER(irq_timer); |
| 50 | 53 | |
| 51 | 54 | protected: |
| r252937 | r252938 | |
| 54 | 57 | |
| 55 | 58 | |
| 56 | 59 | |
| 60 | // Devices, I/O |
| 57 | 61 | |
| 62 | /****************************************************************************** |
| 63 | CSC |
| 64 | ******************************************************************************/ |
| 58 | 65 | |
| 59 | | UINT16 fidel6502_state::input_read(int index) |
| 66 | // misc handlers |
| 67 | |
| 68 | void fidel6502_state::csc_prepare_display() |
| 60 | 69 | { |
| 61 | | static const char *const col_tag[] = |
| 70 | // 7442 output, also update input mux (9 is unused) |
| 71 | m_inp_mux = (1 << m_led_select) & 0x1ff; |
| 72 | |
| 73 | // 4 7seg leds + H |
| 74 | for (int i = 0; i < 4; i++) |
| 62 | 75 | { |
| 63 | | "IN.0", "IN.1", "IN.2", "IN.3", "IN.4", |
| 64 | | "IN.5", "IN.6", "IN.7", "IN.8" |
| 65 | | }; |
| 76 | m_display_segmask[i] = 0x7f; |
| 77 | m_display_state[i] = (m_inp_mux >> i & 1) ? m_7seg_data : 0; |
| 78 | } |
| 79 | |
| 80 | // 8*8 chessboard leds |
| 81 | for (int i = 0; i < 8; i++) |
| 82 | m_display_state[i+4] = (m_inp_mux >> i & 1) ? m_led_data : 0; |
| 66 | 83 | |
| 67 | | return ioport(col_tag[index])->read(); |
| 84 | set_display_size(8, 12); |
| 85 | display_update(); |
| 68 | 86 | } |
| 69 | 87 | |
| 70 | | |
| 71 | | WRITE8_MEMBER( fidel6502_state::pia0_pa_w ) |
| 88 | READ8_MEMBER(fidel6502_state::csc_speech_r) |
| 72 | 89 | { |
| 73 | | UINT8 out_digit = BITSWAP8(data,0,1,5,6,7,2,3,4 ); |
| 90 | return m_speech_rom[m_speech_bank << 12 | offset]; |
| 91 | } |
| 74 | 92 | |
| 75 | | switch (m_selector) |
| 76 | | { |
| 77 | | case 0: |
| 78 | | output().set_digit_value(0, out_digit & 0x7f); |
| 79 | | output().set_value("pm_led", BIT(out_digit, 7)); |
| 80 | | break; |
| 81 | | case 1: |
| 82 | | output().set_digit_value(1, out_digit & 0x7f); |
| 83 | | break; |
| 84 | | case 2: |
| 85 | | output().set_digit_value(2, out_digit & 0x7f); |
| 86 | | output().set_value("up_dot", BIT(out_digit, 7)); |
| 87 | | break; |
| 88 | | case 3: |
| 89 | | output().set_digit_value(3, out_digit & 0x7f); |
| 90 | | output().set_value("low_dot", BIT(out_digit, 7)); |
| 91 | | break; |
| 92 | | } |
| 93 | 93 | |
| 94 | | // m_speech->data_w(space, 0, data & 0x3f); |
| 94 | // 6821 PIA 0 |
| 95 | 95 | |
| 96 | | // for avoid the digit flashing |
| 97 | | m_selector |= 0x80; |
| 96 | WRITE8_MEMBER(fidel6502_state::csc_pia0_pa_w) |
| 97 | { |
| 98 | // d0-d5: TSI C0-C5 |
| 99 | m_speech->data_w(space, 0, data & 0x3f); |
| 100 | |
| 101 | // d0-d7: data for the 4 7seg leds, bits are ABFGHCDE (H is extra led) |
| 102 | m_7seg_data = BITSWAP8(data,0,1,5,6,7,2,3,4); |
| 103 | csc_prepare_display(); |
| 98 | 104 | } |
| 99 | 105 | |
| 100 | | WRITE8_MEMBER( fidel6502_state::pia0_pb_w ) |
| 106 | WRITE8_MEMBER(fidel6502_state::csc_pia0_pb_w) |
| 101 | 107 | { |
| 102 | | // m_speech->start_w(BIT(data, 1)); |
| 108 | // d0: speech ROM A12 |
| 109 | m_speech->force_update(); // update stream to now |
| 110 | m_speech_bank = data & 1; |
| 111 | |
| 112 | // d1: TSI START line |
| 113 | m_speech->start_w(data >> 1 & 1); |
| 114 | |
| 115 | // d4: tone line |
| 116 | m_speaker->level_w(data >> 4 & 1); |
| 103 | 117 | } |
| 104 | 118 | |
| 105 | | READ8_MEMBER( fidel6502_state::pia0_pb_r ) |
| 119 | READ8_MEMBER(fidel6502_state::csc_pia0_pb_r) |
| 106 | 120 | { |
| 121 | // d2: printer? |
| 107 | 122 | UINT8 data = 0x04; |
| 108 | 123 | |
| 109 | | if(m_speech->busy_r()) |
| 124 | // d3: TSI BUSY line |
| 125 | if (m_speech->busy_r()) |
| 110 | 126 | data |= 0x08; |
| 111 | 127 | |
| 112 | | if (m_selector<9) |
| 113 | | if (input_read(m_selector) & 0x100) |
| 114 | | data |= 0x20; |
| 128 | // d5: button row 8 (active low) |
| 129 | if (!(read_inputs(9) & 0x100)) |
| 130 | data |= 0x20; |
| 131 | |
| 132 | // d6,d7: language switches |
| 133 | data|=0xc0; |
| 115 | 134 | |
| 116 | 135 | return data; |
| 117 | 136 | } |
| 118 | 137 | |
| 119 | | WRITE_LINE_MEMBER( fidel6502_state::pia0_ca2_w ) |
| 138 | WRITE_LINE_MEMBER(fidel6502_state::csc_pia0_ca2_w) |
| 120 | 139 | { |
| 140 | // printer? |
| 121 | 141 | } |
| 122 | 142 | |
| 123 | | WRITE8_MEMBER( fidel6502_state::pia1_pa_w ) |
| 143 | |
| 144 | // 6821 PIA 1 |
| 145 | |
| 146 | READ8_MEMBER(fidel6502_state::csc_pia1_pa_r) |
| 124 | 147 | { |
| 125 | | m_selector = (m_selector & 0x0c) | ((data>>6) & 0x03); |
| 148 | // d0-d5: button row 0-5 (active low) |
| 149 | return (read_inputs(9) & 0x3f) ^ 0xff; |
| 126 | 150 | } |
| 127 | 151 | |
| 128 | | WRITE8_MEMBER( fidel6502_state::pia1_pb_w ) |
| 152 | WRITE8_MEMBER(fidel6502_state::csc_pia1_pa_w) |
| 129 | 153 | { |
| 130 | | static const char *const row_tag[] = |
| 131 | | { |
| 132 | | "led_a", "led_b", "led_c", "led_d", |
| 133 | | "led_e", "led_f", "led_g", "led_h" |
| 134 | | }; |
| 135 | | |
| 136 | | if (m_selector < 8) |
| 137 | | for (int i=0; i<8; i++) |
| 138 | | output().set_indexed_value(row_tag[m_selector], i+1, BIT(data, 7-i)); |
| 154 | // d6,d7: 7442 A0,A1 |
| 155 | m_led_select = (m_led_select & ~3) | (data >> 6 & 3); |
| 156 | csc_prepare_display(); |
| 139 | 157 | } |
| 140 | 158 | |
| 141 | | READ8_MEMBER( fidel6502_state::pia1_pa_r ) |
| 159 | WRITE8_MEMBER(fidel6502_state::csc_pia1_pb_w) |
| 142 | 160 | { |
| 143 | | UINT8 data = 0xff; |
| 144 | | |
| 145 | | if (m_selector<9) |
| 146 | | data = input_read(m_selector); |
| 147 | | |
| 148 | | return data & 0x3f; |
| 161 | // d0-d7: led row data |
| 162 | m_led_data = data; |
| 163 | csc_prepare_display(); |
| 149 | 164 | } |
| 150 | 165 | |
| 151 | | WRITE_LINE_MEMBER( fidel6502_state::pia1_ca2_w ) |
| 166 | READ_LINE_MEMBER(fidel6502_state::csc_pia1_ca1_r) |
| 152 | 167 | { |
| 153 | | m_selector = (m_selector & 0x07) | (state ? 8 : 0); |
| 168 | // button row 6 (active low) |
| 169 | return ~read_inputs(9) >> 6 & 1; |
| 154 | 170 | } |
| 155 | 171 | |
| 156 | | WRITE_LINE_MEMBER( fidel6502_state::pia1_cb2_w ) |
| 172 | READ_LINE_MEMBER(fidel6502_state::csc_pia1_cb1_r) |
| 157 | 173 | { |
| 158 | | m_selector = (m_selector & 0x0b) | (state ? 4 : 0); |
| 174 | // button row 7 (active low) |
| 175 | return ~read_inputs(9) >> 7 & 1; |
| 159 | 176 | } |
| 160 | 177 | |
| 161 | | READ_LINE_MEMBER( fidel6502_state::pia1_ca1_r ) |
| 178 | WRITE_LINE_MEMBER(fidel6502_state::csc_pia1_cb2_w) |
| 162 | 179 | { |
| 163 | | int data = 0x01; |
| 164 | | |
| 165 | | if (m_selector<9) |
| 166 | | data = BIT(input_read(m_selector), 6); |
| 167 | | |
| 168 | | return data; |
| 180 | // 7442 A2 |
| 181 | m_led_select = (m_led_select & ~4) | (state ? 4 : 0); |
| 182 | csc_prepare_display(); |
| 169 | 183 | } |
| 170 | 184 | |
| 171 | | READ_LINE_MEMBER( fidel6502_state::pia1_cb1_r ) |
| 185 | WRITE_LINE_MEMBER(fidel6502_state::csc_pia1_ca2_w) |
| 172 | 186 | { |
| 173 | | int data = 0x01; |
| 187 | // 7442 A3 |
| 188 | m_led_select = (m_led_select & ~8) | (state ? 8 : 0); |
| 189 | csc_prepare_display(); |
| 190 | } |
| 174 | 191 | |
| 175 | | if (m_selector<9) |
| 176 | | data = BIT(input_read(m_selector),7); |
| 177 | 192 | |
| 178 | | return data; |
| 179 | | } |
| 180 | 193 | |
| 181 | 194 | |
| 182 | 195 | TIMER_DEVICE_CALLBACK_MEMBER(fidel6502_state::irq_timer) |
| r252937 | r252938 | |
| 184 | 197 | m_maincpu->set_input_line(M6502_IRQ_LINE, HOLD_LINE); |
| 185 | 198 | } |
| 186 | 199 | |
| 187 | | /* Address maps */ |
| 188 | | static ADDRESS_MAP_START(csc_mem, AS_PROGRAM, 8, fidel6502_state) |
| 200 | /****************************************************************************** |
| 201 | Address Maps |
| 202 | ******************************************************************************/ |
| 203 | |
| 204 | static ADDRESS_MAP_START( csc_map, AS_PROGRAM, 8, fidel6502_state ) |
| 189 | 205 | ADDRESS_MAP_UNMAP_HIGH |
| 190 | | AM_RANGE( 0x0000, 0x07ff) AM_RAM AM_MIRROR(0x4000) //2K RAM |
| 191 | | AM_RANGE( 0x0800, 0x0bff) AM_RAM AM_MIRROR(0x4400) //1K RAM |
| 206 | AM_RANGE( 0x0000, 0x07ff) AM_RAM AM_MIRROR(0x4000) |
| 207 | AM_RANGE( 0x0800, 0x0bff) AM_RAM AM_MIRROR(0x4400) |
| 192 | 208 | AM_RANGE( 0x1000, 0x1003) AM_DEVREADWRITE("pia0", pia6821_device, read, write) AM_MIRROR(0x47fc) |
| 193 | 209 | AM_RANGE( 0x1800, 0x1803) AM_DEVREADWRITE("pia1", pia6821_device, read, write) AM_MIRROR(0x47fc) |
| 194 | | AM_RANGE( 0x2000, 0x3fff) AM_ROM AM_MIRROR(0x4000) |
| 195 | | AM_RANGE( 0x8000, 0x9fff) AM_NOP |
| 210 | AM_RANGE( 0x2000, 0x3fff) AM_ROM AM_MIRROR(0x4000) |
| 196 | 211 | AM_RANGE( 0xa000, 0xffff) AM_ROM |
| 197 | 212 | ADDRESS_MAP_END |
| 198 | 213 | |
| 199 | | /* Input ports */ |
| 214 | |
| 215 | |
| 216 | /****************************************************************************** |
| 217 | Input Ports |
| 218 | ******************************************************************************/ |
| 219 | |
| 200 | 220 | static INPUT_PORTS_START( csc ) |
| 201 | 221 | PORT_START("IN.0") |
| 202 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 203 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 204 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 205 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 206 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 207 | | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 208 | | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 209 | | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 210 | | PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Speak") PORT_CODE(KEYCODE_SPACE) |
| 222 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 223 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 224 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 225 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 226 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 227 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 228 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 229 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 230 | PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Speak") PORT_CODE(KEYCODE_SPACE) |
| 211 | 231 | |
| 212 | 232 | PORT_START("IN.1") |
| 213 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 214 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 215 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 216 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 217 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 218 | | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 219 | | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 220 | | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 221 | | PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("RV") PORT_CODE(KEYCODE_V) |
| 233 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 234 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 235 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 236 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 237 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 238 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 239 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 240 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 241 | PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RV") PORT_CODE(KEYCODE_V) |
| 222 | 242 | |
| 223 | 243 | PORT_START("IN.2") |
| 224 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 225 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 226 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 227 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 228 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 229 | | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 230 | | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 231 | | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 232 | | PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("TM") PORT_CODE(KEYCODE_T) |
| 244 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 245 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 246 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 247 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 248 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 249 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 250 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 251 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 252 | PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("TM") PORT_CODE(KEYCODE_T) |
| 233 | 253 | |
| 234 | 254 | PORT_START("IN.3") |
| 235 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 236 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 237 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 238 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 239 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 240 | | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 241 | | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 242 | | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 243 | | PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L) |
| 255 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 256 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 257 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 258 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 259 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 260 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 261 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 262 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 263 | PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L) // level |
| 244 | 264 | |
| 245 | 265 | PORT_START("IN.4") |
| 246 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 247 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 248 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 249 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 250 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 251 | | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 252 | | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 253 | | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 254 | | PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M) |
| 266 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 267 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 268 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 269 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 270 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 271 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 272 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 273 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 274 | PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M) |
| 255 | 275 | |
| 256 | 276 | PORT_START("IN.5") |
| 257 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 258 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 259 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 260 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 261 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 262 | | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 263 | | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 264 | | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 265 | | PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("ST") PORT_CODE(KEYCODE_S) |
| 277 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 278 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 279 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 280 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 281 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 282 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 283 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 284 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 285 | PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ST") PORT_CODE(KEYCODE_S) |
| 266 | 286 | |
| 267 | 287 | PORT_START("IN.6") |
| 268 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 269 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 270 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 271 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 272 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 273 | | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 274 | | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 275 | | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 276 | | PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_UNUSED) PORT_UNUSED |
| 288 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 289 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 290 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 291 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 292 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 293 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 294 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 295 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 296 | PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_UNUSED) |
| 277 | 297 | |
| 278 | 298 | PORT_START("IN.7") |
| 279 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 280 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 281 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 282 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 283 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 284 | | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 285 | | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 286 | | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) |
| 287 | | PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_UNUSED) PORT_UNUSED |
| 299 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 300 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 301 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 302 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 303 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 304 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 305 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 306 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 307 | PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_UNUSED) |
| 288 | 308 | |
| 289 | 309 | PORT_START("IN.8") |
| 290 | | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Pawn") PORT_CODE(KEYCODE_1) |
| 291 | | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Rook") PORT_CODE(KEYCODE_2) |
| 292 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Knight") PORT_CODE(KEYCODE_3) |
| 293 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Bishop") PORT_CODE(KEYCODE_4) |
| 294 | | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Queen") PORT_CODE(KEYCODE_5) |
| 295 | | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("King") PORT_CODE(KEYCODE_6) |
| 296 | | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) |
| 297 | | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) |
| 298 | | PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_UNUSED) PORT_UNUSED |
| 310 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Pawn") PORT_CODE(KEYCODE_1) |
| 311 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Rook") PORT_CODE(KEYCODE_2) |
| 312 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Knight") PORT_CODE(KEYCODE_3) |
| 313 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Bishop") PORT_CODE(KEYCODE_4) |
| 314 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Queen") PORT_CODE(KEYCODE_5) |
| 315 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("King") PORT_CODE(KEYCODE_6) |
| 316 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) // clear |
| 317 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) // reset |
| 318 | PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_UNUSED) PORT_UNUSED |
| 299 | 319 | INPUT_PORTS_END |
| 300 | 320 | |
| 301 | 321 | |
| 302 | 322 | void fidel6502_state::machine_start() |
| 303 | 323 | { |
| 304 | 324 | fidelz80base_state::machine_start(); |
| 305 | | save_item(NAME(m_selector)); |
| 306 | 325 | } |
| 307 | 326 | |
| 308 | | /* Machine driver */ |
| 327 | |
| 328 | /****************************************************************************** |
| 329 | Machine Drivers |
| 330 | ******************************************************************************/ |
| 331 | |
| 309 | 332 | static MACHINE_CONFIG_START( csc, fidel6502_state ) |
| 333 | |
| 310 | 334 | /* basic machine hardware */ |
| 311 | 335 | MCFG_CPU_ADD("maincpu", M6502, 3900000/2) |
| 312 | | MCFG_CPU_PROGRAM_MAP(csc_mem) |
| 336 | MCFG_CPU_PROGRAM_MAP(csc_map) |
| 313 | 337 | |
| 314 | | //MCFG_DEFAULT_LAYOUT(layout_vsc) |
| 315 | 338 | |
| 316 | 339 | MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer", fidel6502_state, irq_timer, attotime::from_hz(38400/64)) |
| 317 | 340 | |
| 318 | 341 | MCFG_DEVICE_ADD("pia0", PIA6821, 0) |
| 319 | | MCFG_PIA_READPB_HANDLER(READ8(fidel6502_state, pia0_pb_r)) |
| 320 | | MCFG_PIA_WRITEPA_HANDLER(WRITE8(fidel6502_state, pia0_pa_w)) |
| 321 | | MCFG_PIA_WRITEPB_HANDLER(WRITE8(fidel6502_state, pia0_pb_w)) |
| 322 | | MCFG_PIA_CA2_HANDLER(WRITELINE(fidel6502_state, pia0_ca2_w)) |
| 342 | MCFG_PIA_READPB_HANDLER(READ8(fidel6502_state, csc_pia0_pb_r)) |
| 343 | MCFG_PIA_WRITEPA_HANDLER(WRITE8(fidel6502_state, csc_pia0_pa_w)) |
| 344 | MCFG_PIA_WRITEPB_HANDLER(WRITE8(fidel6502_state, csc_pia0_pb_w)) |
| 345 | MCFG_PIA_CA2_HANDLER(WRITELINE(fidel6502_state, csc_pia0_ca2_w)) |
| 323 | 346 | |
| 324 | 347 | MCFG_DEVICE_ADD("pia1", PIA6821, 0) |
| 325 | | MCFG_PIA_READPA_HANDLER(READ8(fidel6502_state, pia1_pa_r)) |
| 326 | | MCFG_PIA_READCA1_HANDLER(READLINE(fidel6502_state, pia1_ca1_r)) |
| 327 | | MCFG_PIA_READCB1_HANDLER(READLINE(fidel6502_state, pia1_cb1_r)) |
| 328 | | MCFG_PIA_WRITEPA_HANDLER(WRITE8(fidel6502_state, pia1_pa_w)) |
| 329 | | MCFG_PIA_WRITEPB_HANDLER(WRITE8(fidel6502_state, pia1_pb_w)) |
| 330 | | MCFG_PIA_CA2_HANDLER(WRITELINE(fidel6502_state, pia1_ca2_w)) |
| 331 | | MCFG_PIA_CB2_HANDLER(WRITELINE(fidel6502_state, pia1_cb2_w)) |
| 348 | MCFG_PIA_READPA_HANDLER(READ8(fidel6502_state, csc_pia1_pa_r)) |
| 349 | MCFG_PIA_READCA1_HANDLER(READLINE(fidel6502_state, csc_pia1_ca1_r)) |
| 350 | MCFG_PIA_READCB1_HANDLER(READLINE(fidel6502_state, csc_pia1_cb1_r)) |
| 351 | MCFG_PIA_WRITEPA_HANDLER(WRITE8(fidel6502_state, csc_pia1_pa_w)) |
| 352 | MCFG_PIA_WRITEPB_HANDLER(WRITE8(fidel6502_state, csc_pia1_pb_w)) |
| 353 | MCFG_PIA_CA2_HANDLER(WRITELINE(fidel6502_state, csc_pia1_ca2_w)) |
| 354 | MCFG_PIA_CB2_HANDLER(WRITELINE(fidel6502_state, csc_pia1_cb2_w)) |
| 332 | 355 | |
| 356 | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1)) |
| 357 | MCFG_DEFAULT_LAYOUT(layout_fidel_vsc) |
| 358 | |
| 333 | 359 | /* sound hardware */ |
| 334 | 360 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 335 | | MCFG_SOUND_ADD("speech", S14001A, 25000) // around 25khz |
| 361 | MCFG_SOUND_ADD("speech", S14001A, 25000) // R/C circuit, around 25khz |
| 362 | MCFG_S14001A_EXT_READ_HANDLER(READ8(fidel6502_state, csc_speech_r)) |
| 336 | 363 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75) |
| 364 | |
| 365 | MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) |
| 366 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 337 | 367 | MACHINE_CONFIG_END |
| 338 | 368 | |
| 339 | | /* ROM definition */ |
| 340 | | ROM_START(csc) |
| 341 | | ROM_REGION(0x10000, "maincpu", 0) |
| 342 | | ROM_LOAD("101-64109.bin", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341)) |
| 343 | | ROM_LOAD("1025a03.bin", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c)) |
| 344 | | ROM_LOAD("1025a02.bin", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0)) |
| 345 | | ROM_LOAD("1025a01.bin", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b)) |
| 369 | /****************************************************************************** |
| 370 | ROM Definitions |
| 371 | ******************************************************************************/ |
| 346 | 372 | |
| 347 | | ROM_LOAD("74s474.bin", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456)) |
| 373 | ROM_START( csc ) |
| 374 | ROM_REGION( 0x10000, "maincpu", 0 ) |
| 375 | ROM_LOAD("101-64109.bin", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) |
| 376 | ROM_LOAD("1025a03.bin", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) ) |
| 377 | ROM_LOAD("1025a02.bin", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) ) |
| 378 | ROM_LOAD("1025a01.bin", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) ) |
| 379 | ROM_LOAD("74s474.bin", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) ) |
| 348 | 380 | |
| 349 | | ROM_REGION(0x2000, "speech", 0) |
| 350 | | ROM_LOAD("101-32107.bin", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d)) |
| 381 | ROM_REGION( 0x2000, "speech", 0 ) |
| 382 | ROM_LOAD("101-32107.bin", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) |
| 383 | ROM_RELOAD( 0x1000, 0x1000) |
| 351 | 384 | ROM_END |
| 352 | 385 | |
| 353 | 386 | ROM_START( fexcelv ) |
| r252937 | r252938 | |
| 358 | 391 | ROM_LOAD("101-1081a01.ic2", 0x0000, 0x8000, CRC(c8ae1607) SHA1(6491ce6be60ed77f3dd931c0ca17616f13af943e) ) |
| 359 | 392 | ROM_END |
| 360 | 393 | |
| 361 | | /* Driver */ |
| 394 | /****************************************************************************** |
| 395 | Drivers |
| 396 | ******************************************************************************/ |
| 362 | 397 | |
| 363 | | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 364 | | COMP( 1981, csc, 0, 0, csc, csc, driver_device, 0, "Fidelity Electronics", "Champion Sensory Chess Challenger", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK) |
| 398 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY, FULLNAME, FLAGS */ |
| 399 | COMP( 1981, csc, 0, 0, csc, csc, driver_device, 0, "Fidelity Electronics", "Champion Sensory Chess Challenger", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) |
| 365 | 400 | |
| 366 | 401 | COMP( 1987, fexcelv, 0, 0, csc, csc, driver_device, 0, "Fidelity Electronics", "Voice Excellence", MACHINE_NOT_WORKING ) |
trunk/src/mame/drivers/fidelz80.cpp
| r252937 | r252938 | |
| 5 | 5 | Fidelity Electronics Z80 based board driver |
| 6 | 6 | for 6502 based boards, see drivers/fidel6502.cpp |
| 7 | 7 | |
| 8 | | All detailed RE work done by Kevin 'kevtris' Horton |
| 8 | Detailed RE work done by Kevin 'kevtris' Horton, except where noted |
| 9 | 9 | |
| 10 | 10 | TODO: |
| 11 | 11 | - Figure out why it says the first speech line twice; it shouldn't? |
| r252937 | r252938 | |
| 235 | 235 | PROG - I/O expander |
| 236 | 236 | |
| 237 | 237 | T0 - optical card sensor (high = bright/reflective, low = dark/non reflective) |
| 238 | | T1 - connects to inverter, then nothing |
| 238 | T1 - connects to inverter, then nothing? |
| 239 | 239 | |
| 240 | 240 | |
| 241 | 241 | D8243C I/O expander: |
| r252937 | r252938 | |
| 332 | 332 | PIA 0: |
| 333 | 333 | ------ |
| 334 | 334 | |
| 335 | | PA0 - 7seg segments H, TSI A0 |
| 336 | | PA1 - 7seg segments G, TSI A1 |
| 335 | PA0 - 7seg segments E, TSI A0 |
| 336 | PA1 - 7seg segments D, TSI A1 |
| 337 | 337 | PA2 - 7seg segments C, TSI A2 |
| 338 | | PA3 - 7seg segments B, TSI A3 |
| 339 | | PA4 - 7seg segments A, TSI A4 |
| 338 | PA3 - 7seg segments H, TSI A3 |
| 339 | PA4 - 7seg segments G, TSI A4 |
| 340 | 340 | PA5 - 7seg segments F, TSI A5 |
| 341 | | PA6 - 7seg segments E |
| 342 | | PA7 - 7seg segments D |
| 341 | PA6 - 7seg segments B |
| 342 | PA7 - 7seg segments A |
| 343 | 343 | |
| 344 | 344 | PB0 - A12 on speech ROM (if used... not used on this model, ROM is 4K) |
| 345 | 345 | PB1 - START line on S14001A |
| 346 | 346 | PB2 - white wire |
| 347 | 347 | PB3 - BUSY line from S14001A |
| 348 | 348 | PB4 - Tone line (toggle to make a tone in the speaker) |
| 349 | | PB5 - button column I |
| 349 | PB5 - button row 9 |
| 350 | 350 | PB6 - selection jumper (resistor to 5V) |
| 351 | 351 | PB7 - selection jumper (resistor to ground) |
| 352 | 352 | |
| r252937 | r252938 | |
| 568 | 568 | PA.7 - button row 8 |
| 569 | 569 | |
| 570 | 570 | PB.0 - button column I |
| 571 | | PB.1 - button row 9 |
| 571 | PB.1 - button column J |
| 572 | 572 | PB.2 - Tone line (toggle to make tone in the speaker) |
| 573 | 573 | PB.3 - violet wire |
| 574 | 574 | PB.4 - white wire (and TSI BUSY line) |
| r252937 | r252938 | |
| 863 | 863 | // Devices, I/O |
| 864 | 864 | |
| 865 | 865 | /****************************************************************************** |
| 866 | | I8255 Device, for VCC/UVC |
| 866 | CC10 and VCC/UVC |
| 867 | 867 | ******************************************************************************/ |
| 868 | 868 | |
| 869 | // misc handlers |
| 870 | |
| 869 | 871 | void fidelz80_state::vcc_prepare_display() |
| 870 | 872 | { |
| 871 | 873 | // 4 7seg leds |
| r252937 | r252938 | |
| 882 | 884 | return m_speech_rom[m_speech_bank << 12 | offset]; |
| 883 | 885 | } |
| 884 | 886 | |
| 887 | |
| 888 | // I8255 PPI |
| 889 | |
| 885 | 890 | WRITE8_MEMBER(fidelz80_state::vcc_ppi_porta_w) |
| 886 | 891 | { |
| 887 | 892 | // d0-d6: digit segment data, bits are xABCDEFG |
| r252937 | r252938 | |
| 918 | 923 | |
| 919 | 924 | READ8_MEMBER(fidelz80_state::vcc_ppi_portc_r) |
| 920 | 925 | { |
| 921 | | // d0-d3: multiplexed inputs (inverted), also language switches |
| 926 | // d0-d3: multiplexed inputs (active low), also language switches |
| 922 | 927 | UINT8 lan = (~m_led_select & 0x40) ? m_inp_matrix[4]->read() : 0; |
| 923 | 928 | return ~(lan | read_inputs(4)) & 0xf; |
| 924 | 929 | } |
| r252937 | r252938 | |
| 929 | 934 | m_inp_mux = ~data >> 4 & 0xf; |
| 930 | 935 | } |
| 931 | 936 | |
| 937 | |
| 932 | 938 | // CC10-specific (no speech chip, 1-bit beeper instead) |
| 933 | 939 | |
| 934 | 940 | TIMER_DEVICE_CALLBACK_MEMBER(fidelz80_state::beeper_off_callback) |
| r252937 | r252938 | |
| 951 | 957 | } |
| 952 | 958 | |
| 953 | 959 | |
| 960 | |
| 954 | 961 | /****************************************************************************** |
| 955 | | I8255 Device, for VSC |
| 962 | VSC |
| 956 | 963 | ******************************************************************************/ |
| 957 | 964 | |
| 965 | // misc handlers |
| 966 | |
| 958 | 967 | void fidelz80_state::vsc_prepare_display() |
| 959 | 968 | { |
| 960 | 969 | // 4 7seg leds + H |
| r252937 | r252938 | |
| 972 | 981 | display_update(); |
| 973 | 982 | } |
| 974 | 983 | |
| 984 | |
| 985 | // I8255 PPI |
| 986 | |
| 975 | 987 | WRITE8_MEMBER(fidelz80_state::vsc_ppi_porta_w) |
| 976 | 988 | { |
| 977 | 989 | // d0-d5: TSI C0-C5 |
| r252937 | r252938 | |
| 999 | 1011 | } |
| 1000 | 1012 | |
| 1001 | 1013 | |
| 1002 | | /****************************************************************************** |
| 1003 | | Z80 PIO Device, for VSC |
| 1004 | | ******************************************************************************/ |
| 1014 | // Z80 PIO |
| 1005 | 1015 | |
| 1006 | 1016 | READ8_MEMBER(fidelz80_state::vsc_pio_porta_r) |
| 1007 | 1017 | { |
| r252937 | r252938 | |
| 1032 | 1042 | } |
| 1033 | 1043 | |
| 1034 | 1044 | |
| 1045 | |
| 1035 | 1046 | /****************************************************************************** |
| 1036 | | I8243 I/O Expander Device, for VBRC |
| 1047 | VBRC |
| 1037 | 1048 | ******************************************************************************/ |
| 1038 | 1049 | |
| 1050 | // misc handlers |
| 1051 | |
| 1039 | 1052 | void fidelz80_state::vbrc_prepare_display() |
| 1040 | 1053 | { |
| 1041 | 1054 | // 14seg led segments, d15 is extra led, d14 is unused (tone on prototype?) |
| r252937 | r252938 | |
| 1046 | 1059 | display_matrix(16, 8, outdata, m_led_select); |
| 1047 | 1060 | } |
| 1048 | 1061 | |
| 1062 | |
| 1063 | // I8243 I/O expander |
| 1064 | |
| 1049 | 1065 | WRITE8_MEMBER(fidelz80_state::vbrc_ioexp_port_w) |
| 1050 | 1066 | { |
| 1051 | 1067 | // P4-P7: digit segment data |
| r252937 | r252938 | |
| 1054 | 1070 | } |
| 1055 | 1071 | |
| 1056 | 1072 | |
| 1057 | | /****************************************************************************** |
| 1058 | | I8041 MCU, for VBRC |
| 1059 | | ******************************************************************************/ |
| 1073 | // I8041 MCU |
| 1060 | 1074 | |
| 1061 | 1075 | WRITE8_MEMBER(fidelz80_state::vbrc_mcu_p1_w) |
| 1062 | 1076 | { |
| r252937 | r252938 | |
| 1068 | 1082 | READ8_MEMBER(fidelz80_state::vbrc_mcu_p2_r) |
| 1069 | 1083 | { |
| 1070 | 1084 | // d0-d3: I8243 P2 |
| 1071 | | // d4-d7: multiplexed inputs (inverted) |
| 1085 | // d4-d7: multiplexed inputs (active low) |
| 1072 | 1086 | return (m_i8243->i8243_p2_r(space, offset) & 0x0f) | (read_inputs(8) << 4 ^ 0xf0); |
| 1073 | 1087 | } |
| 1074 | 1088 | |
| r252937 | r252938 | |
| 1187 | 1201 | static INPUT_PORTS_START( fidelz80 ) |
| 1188 | 1202 | PORT_START("IN.0") |
| 1189 | 1203 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 1190 | | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_V) |
| 1204 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L) |
| 1191 | 1205 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_A) |
| 1192 | 1206 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_E) |
| 1193 | 1207 | |
| r252937 | r252938 | |
| 1316 | 1330 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("King") PORT_CODE(KEYCODE_6) |
| 1317 | 1331 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) |
| 1318 | 1332 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) |
| 1319 | | PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 1320 | 1333 | |
| 1321 | 1334 | PORT_START("IN.9") // buttons beside the display |
| 1322 | 1335 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("TM") PORT_CODE(KEYCODE_T) |
| r252937 | r252938 | |
| 1401 | 1414 | MCFG_I8255_IN_PORTC_CB(READ8(fidelz80_state, vcc_ppi_portc_r)) |
| 1402 | 1415 | MCFG_I8255_OUT_PORTC_CB(WRITE8(fidelz80_state, vcc_ppi_portc_w)) |
| 1403 | 1416 | |
| 1404 | | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80_state, display_decay_tick, attotime::from_msec(1)) |
| 1417 | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1)) |
| 1405 | 1418 | MCFG_DEFAULT_LAYOUT(layout_fidel_cc) |
| 1406 | 1419 | |
| 1407 | 1420 | /* sound hardware */ |
| r252937 | r252938 | |
| 1425 | 1438 | MCFG_I8255_IN_PORTC_CB(READ8(fidelz80_state, vcc_ppi_portc_r)) |
| 1426 | 1439 | MCFG_I8255_OUT_PORTC_CB(WRITE8(fidelz80_state, vcc_ppi_portc_w)) |
| 1427 | 1440 | |
| 1428 | | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80_state, display_decay_tick, attotime::from_msec(1)) |
| 1441 | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1)) |
| 1429 | 1442 | MCFG_DEFAULT_LAYOUT(layout_fidel_vcc) |
| 1430 | 1443 | |
| 1431 | 1444 | /* sound hardware */ |
| r252937 | r252938 | |
| 1441 | 1454 | MCFG_CPU_ADD("maincpu", Z80, XTAL_4MHz) |
| 1442 | 1455 | MCFG_CPU_PROGRAM_MAP(vsc_map) |
| 1443 | 1456 | MCFG_CPU_IO_MAP(vsc_io) |
| 1444 | | MCFG_CPU_PERIODIC_INT_DRIVER(fidelz80_state, nmi_line_pulse, 600) // 555 timer, approx 600hz |
| 1457 | MCFG_CPU_PERIODIC_INT_DRIVER(fidelz80base_state, nmi_line_pulse, 600) // 555 timer, approx 600hz |
| 1445 | 1458 | |
| 1446 | 1459 | MCFG_DEVICE_ADD("ppi8255", I8255, 0) |
| 1447 | 1460 | MCFG_I8255_OUT_PORTA_CB(WRITE8(fidelz80_state, vsc_ppi_porta_w)) |
| r252937 | r252938 | |
| 1453 | 1466 | MCFG_Z80PIO_IN_PB_CB(READ8(fidelz80_state, vsc_pio_portb_r)) |
| 1454 | 1467 | MCFG_Z80PIO_OUT_PB_CB(WRITE8(fidelz80_state, vsc_pio_portb_w)) |
| 1455 | 1468 | |
| 1456 | | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80_state, display_decay_tick, attotime::from_msec(1)) |
| 1469 | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1)) |
| 1457 | 1470 | MCFG_DEFAULT_LAYOUT(layout_fidel_vsc) |
| 1458 | 1471 | |
| 1459 | 1472 | /* sound hardware */ |
| r252937 | r252938 | |
| 1478 | 1491 | |
| 1479 | 1492 | MCFG_I8243_ADD("i8243", NOOP, WRITE8(fidelz80_state, vbrc_ioexp_port_w)) |
| 1480 | 1493 | |
| 1481 | | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80_state, display_decay_tick, attotime::from_msec(1)) |
| 1494 | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1)) |
| 1482 | 1495 | MCFG_DEFAULT_LAYOUT(layout_fidel_vbrc) |
| 1483 | 1496 | |
| 1484 | 1497 | /* sound hardware */ |