trunk/src/mess/drivers/ravens.c
| r22539 | r22540 | |
| 10 | 10 | 2013-04-23 Skeleton driver. |
| 11 | 11 | |
| 12 | 12 | |
| 13 | No instructions, no schematics - it's all guesswork. |
| 14 | |
| 15 | |
| 13 | 16 | Version 0.9 |
| 14 | 17 | ----------- |
| 15 | 18 | Hardware: |
| r22539 | r22540 | |
| 23 | 26 | |
| 24 | 27 | There is a cassette interface.. |
| 25 | 28 | |
| 29 | The buttons are labelled CMD, RUN, GOTO, RST, F, MON, PC, NXT but at |
| 30 | this time not all buttons are identified. |
| 31 | |
| 32 | What is known: |
| 33 | - Press NXT to read memory. Press NXT again to read the next address. |
| 34 | - Press PC and it says PCxxxx |
| 35 | - Press CMD, it says CND=, you can choose one of these: |
| 36 | -- A displays value of a register. Press A again to see more registers. |
| 37 | -- B sets a breakpoint |
| 38 | -- C clears a breakpoint |
| 39 | -- D dumps blocks to tape |
| 40 | -- E examine tape file |
| 41 | -- F fetch (load) from tape |
| 42 | |
| 26 | 43 | ToDo: |
| 27 | | - Everything |
| 44 | - Fix display of 8 round leds |
| 45 | - Cassette |
| 28 | 46 | |
| 29 | 47 | Version V2.0 |
| 30 | 48 | ------------ |
| r22539 | r22540 | |
| 32 | 50 | The pushbuttons and LEDs appear to have been done away with. |
| 33 | 51 | |
| 34 | 52 | Commands (must be in uppercase): |
| 35 | | A ? |
| 36 | | B ? |
| 37 | | C ? |
| 53 | A Examine memory; press C to alter memory |
| 54 | B Set breakpoint? |
| 55 | C View breakpoint? |
| 38 | 56 | D Dump to screen |
| 39 | 57 | E Execute |
| 40 | 58 | I ? |
| r22539 | r22540 | |
| 42 | 60 | R ? |
| 43 | 61 | V ? |
| 44 | 62 | |
| 63 | ToDo: |
| 64 | - Cassette |
| 65 | |
| 45 | 66 | ****************************************************************************/ |
| 46 | 67 | |
| 47 | 68 | #include "emu.h" |
| 48 | 69 | #include "cpu/s2650/s2650.h" |
| 49 | | //#include "sound/speaker.h" |
| 50 | 70 | #include "machine/terminal.h" |
| 51 | 71 | #include "ravens.lh" |
| 52 | 72 | |
| r22539 | r22540 | |
| 56 | 76 | public: |
| 57 | 77 | ravens_state(const machine_config &mconfig, device_type type, const char *tag) |
| 58 | 78 | : driver_device(mconfig, type, tag), |
| 59 | | m_maincpu(*this, "maincpu") |
| 60 | | // , m_speaker(*this, "speaker") |
| 61 | | , m_terminal(*this, TERMINAL_TAG) |
| 79 | m_maincpu(*this, "maincpu"), |
| 80 | m_terminal(*this, TERMINAL_TAG) |
| 62 | 81 | { } |
| 63 | 82 | |
| 64 | 83 | DECLARE_READ8_MEMBER(port07_r); |
| 65 | 84 | DECLARE_READ8_MEMBER(port17_r); |
| 85 | DECLARE_WRITE8_MEMBER(port1b_w); |
| 86 | DECLARE_WRITE8_MEMBER(port1c_w); |
| 87 | DECLARE_WRITE8_MEMBER(display_w); |
| 66 | 88 | DECLARE_WRITE8_MEMBER(leds_w); |
| 67 | 89 | DECLARE_WRITE8_MEMBER(kbd_put); |
| 68 | | // UINT8 m_last_key; |
| 90 | DECLARE_MACHINE_RESET(ravens2); |
| 91 | UINT8 m_term_char; |
| 69 | 92 | UINT8 m_term_data; |
| 70 | | // bool m_speaker_state; |
| 71 | 93 | required_device<cpu_device> m_maincpu; |
| 72 | | // required_device<speaker_sound_device> m_speaker; |
| 73 | 94 | optional_device<generic_terminal_device> m_terminal; |
| 74 | 95 | }; |
| 75 | 96 | |
| 76 | | WRITE8_MEMBER( ravens_state::leds_w ) |
| 97 | WRITE8_MEMBER( ravens_state::display_w ) |
| 77 | 98 | { |
| 78 | 99 | output_set_digit_value(offset, data); |
| 79 | 100 | } |
| 80 | 101 | |
| 81 | | //WRITE8_MEMBER( ravens_state::port06_w ) |
| 82 | | //{ |
| 83 | | // m_speaker_state ^=1; |
| 84 | | // speaker_level_w(m_speaker, m_speaker_state); |
| 85 | | //} |
| 102 | WRITE8_MEMBER( ravens_state::leds_w ) |
| 103 | { |
| 104 | output_set_digit_value(6, data); |
| 105 | } |
| 86 | 106 | |
| 87 | 107 | READ8_MEMBER( ravens_state::port07_r ) |
| 88 | 108 | { |
| r22539 | r22540 | |
| 93 | 113 | |
| 94 | 114 | READ8_MEMBER( ravens_state::port17_r ) |
| 95 | 115 | { |
| 96 | | UINT8 keyin, i, data = 0x80; |
| 116 | UINT8 keyin, i; |
| 97 | 117 | |
| 98 | 118 | keyin = ioport("X0")->read(); |
| 99 | 119 | if (keyin != 0xff) |
| 100 | 120 | for (i = 0; i < 8; i++) |
| 101 | 121 | if BIT(~keyin, i) |
| 102 | | return i; |
| 122 | return i | 0x80; |
| 103 | 123 | |
| 104 | 124 | keyin = ioport("X1")->read(); |
| 105 | 125 | if (keyin != 0xff) |
| 106 | 126 | for (i = 0; i < 8; i++) |
| 107 | 127 | if BIT(~keyin, i) |
| 108 | | return i | 8; |
| 128 | return i | 0x88; |
| 109 | 129 | |
| 110 | 130 | keyin = ioport("X2")->read(); |
| 131 | if (!BIT(keyin, 0)) |
| 132 | machine().firstcpu->reset(); |
| 111 | 133 | if (keyin != 0xff) |
| 112 | 134 | for (i = 0; i < 8; i++) |
| 113 | 135 | if BIT(~keyin, i) |
| 114 | | return i<<4; |
| 136 | return (i<<4) | 0x80; |
| 115 | 137 | |
| 116 | | keyin = ioport("X3")->read(); |
| 117 | | if (keyin != 0xff) |
| 118 | | for (i = 0; i < 8; i++) |
| 119 | | if BIT(~keyin, i) |
| 120 | | return (i | 8)<<4; |
| 138 | return 0; |
| 139 | } |
| 121 | 140 | |
| 122 | | // if (data == m_last_key) |
| 123 | | // data &= 0x7f; |
| 124 | | // else |
| 125 | | // m_last_key = data; |
| 141 | WRITE8_MEMBER( ravens_state::port1b_w ) |
| 142 | { |
| 143 | if (BIT(data, 7)) |
| 144 | return; |
| 145 | else |
| 146 | if ((data == 0x08 && m_term_char == 0x20)) |
| 147 | data = 0x0c; // FormFeed |
| 148 | else |
| 149 | if ((data == 0x0a && m_term_char == 0x20)) |
| 150 | data = 0x0a; // LineFeed |
| 151 | else |
| 152 | if ((data == 0x01 && m_term_char == 0xc2)) |
| 153 | data = 0x0d; // CarriageReturn |
| 154 | else |
| 155 | data = m_term_char; |
| 126 | 156 | |
| 127 | | return data; |
| 157 | m_terminal->write(space, 0, data); |
| 128 | 158 | } |
| 129 | 159 | |
| 160 | WRITE8_MEMBER( ravens_state::port1c_w ) |
| 161 | { |
| 162 | m_term_char = data; |
| 163 | } |
| 164 | |
| 165 | MACHINE_RESET_MEMBER( ravens_state, ravens2 ) |
| 166 | { |
| 167 | m_term_data = 0x80; |
| 168 | output_set_digit_value(6, 0); |
| 169 | } |
| 170 | |
| 171 | |
| 130 | 172 | static ADDRESS_MAP_START( ravens_mem, AS_PROGRAM, 8, ravens_state ) |
| 131 | 173 | ADDRESS_MAP_UNMAP_HIGH |
| 132 | 174 | AM_RANGE( 0x0000, 0x07ff) AM_ROM |
| r22539 | r22540 | |
| 135 | 177 | |
| 136 | 178 | static ADDRESS_MAP_START( ravens_io, AS_IO, 8, ravens_state ) |
| 137 | 179 | ADDRESS_MAP_UNMAP_HIGH |
| 138 | | AM_RANGE(0x10, 0x15) AM_WRITE(leds_w) // 6-led display |
| 139 | | // AM_RANGE(0x06, 0x06) AM_WRITE(port06_w) // speaker (NOT a keyclick) |
| 180 | AM_RANGE(0x09, 0x09) AM_WRITE(leds_w) // LED output port |
| 181 | AM_RANGE(0x10, 0x15) AM_WRITE(display_w) // 6-led display |
| 140 | 182 | AM_RANGE(0x17, 0x17) AM_READ(port17_r) // pushbuttons |
| 141 | 183 | //AM_RANGE(S2650_SENSE_PORT, S2650_FO_PORT) AM_READWRITE(ravens_cass_in,ravens_cass_out) |
| 142 | 184 | AM_RANGE(0x102, 0x103) AM_NOP // stops error log filling up while using debug |
| r22539 | r22540 | |
| 144 | 186 | |
| 145 | 187 | static ADDRESS_MAP_START( ravens2_io, AS_IO, 8, ravens_state ) |
| 146 | 188 | ADDRESS_MAP_UNMAP_HIGH |
| 147 | | AM_RANGE(0x07, 0x07) AM_READ(port07_r) // pushbuttons |
| 148 | | AM_RANGE(0x1b, 0x1b) AM_WRITENOP // signals a character is being sent to terminal, we dont need |
| 149 | | AM_RANGE(0x1c, 0x1c) AM_DEVWRITE(TERMINAL_TAG, generic_terminal_device, write) |
| 189 | AM_RANGE(0x07, 0x07) AM_READ(port07_r) |
| 190 | AM_RANGE(0x1b, 0x1b) AM_WRITE(port1b_w) |
| 191 | AM_RANGE(0x1c, 0x1c) AM_WRITE(port1c_w) |
| 150 | 192 | //AM_RANGE(S2650_SENSE_PORT, S2650_FO_PORT) AM_READWRITE(ravens_cass_in,ravens_cass_out) |
| 151 | 193 | AM_RANGE(0x102, 0x103) AM_NOP // stops error log filling up while using debug |
| 152 | 194 | ADDRESS_MAP_END |
| r22539 | r22540 | |
| 174 | 216 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F') |
| 175 | 217 | |
| 176 | 218 | PORT_START("X2") |
| 177 | | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("NXT") PORT_CODE(KEYCODE_UP) PORT_CHAR('^') |
| 178 | | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ADR") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') |
| 179 | | PORT_BIT(0xCF, IP_ACTIVE_LOW, IPT_UNUSED) |
| 180 | | |
| 181 | | PORT_START("X3") |
| 182 | | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') |
| 183 | | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('W') |
| 219 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RST") PORT_CODE(KEYCODE_F3) |
| 220 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("NXT") PORT_CODE(KEYCODE_UP) PORT_CHAR('^') |
| 221 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RUN") PORT_CODE(KEYCODE_X) PORT_CHAR('X') |
| 222 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("PC") PORT_CODE(KEYCODE_P) PORT_CHAR('P') |
| 223 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("???") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') |
| 224 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("???") PORT_CODE(KEYCODE_U) PORT_CHAR('U') |
| 225 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CMD") PORT_CODE(KEYCODE_M) PORT_CHAR('M') |
| 226 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("???") PORT_CODE(KEYCODE_O) PORT_CHAR('O') |
| 184 | 227 | INPUT_PORTS_END |
| 185 | 228 | |
| 186 | 229 | WRITE8_MEMBER( ravens_state::kbd_put ) |
| 187 | 230 | { |
| 231 | if (data > 0x60) data -= 0x20; // fold to uppercase |
| 188 | 232 | m_term_data = data; |
| 189 | 233 | } |
| 190 | 234 | |
| r22539 | r22540 | |
| 201 | 245 | |
| 202 | 246 | /* video hardware */ |
| 203 | 247 | MCFG_DEFAULT_LAYOUT(layout_ravens) |
| 204 | | |
| 205 | | /* sound hardware */ |
| 206 | | // MCFG_SPEAKER_STANDARD_MONO("mono") |
| 207 | | // MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) |
| 208 | | // MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
| 209 | 248 | MACHINE_CONFIG_END |
| 210 | 249 | |
| 211 | 250 | static MACHINE_CONFIG_START( ravens2, ravens_state ) |
| r22539 | r22540 | |
| 213 | 252 | MCFG_CPU_ADD("maincpu",S2650, XTAL_1MHz) // frequency is unknown |
| 214 | 253 | MCFG_CPU_PROGRAM_MAP(ravens_mem) |
| 215 | 254 | MCFG_CPU_IO_MAP(ravens2_io) |
| 255 | MCFG_MACHINE_RESET_OVERRIDE(ravens_state, ravens2) |
| 216 | 256 | |
| 217 | 257 | /* video hardware */ |
| 218 | 258 | MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf) |
| 219 | | |
| 220 | | /* sound hardware */ |
| 221 | | // MCFG_SPEAKER_STANDARD_MONO("mono") |
| 222 | | // MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) |
| 223 | | // MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
| 224 | 259 | MACHINE_CONFIG_END |
| 225 | 260 | |
| 226 | 261 | /* ROM definition */ |
| r22539 | r22540 | |
| 237 | 272 | /* Driver */ |
| 238 | 273 | |
| 239 | 274 | /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ |
| 240 | | COMP( 1985, ravens, 0, 0, ravens, ravens, driver_device, 0, "Joseph Glagla and Dieter Feiler", "Ravensburger Selbstbaucomputer V0.9", GAME_NOT_WORKING | GAME_NO_SOUND_HW ) |
| 241 | | COMP( 1985, ravens2, ravens, 0, ravens2, ravens, driver_device, 0, "Joseph Glagla and Dieter Feiler", "Ravensburger Selbstbaucomputer V2.0", GAME_NOT_WORKING | GAME_NO_SOUND_HW ) |
| 275 | COMP( 1985, ravens, 0, 0, ravens, ravens, driver_device, 0, "Joseph Glagla and Dieter Feiler", "Ravensburger Selbstbaucomputer V0.9", GAME_NOT_WORKING | GAME_NO_SOUND_HW ) |
| 276 | COMP( 1985, ravens2, ravens, 0, ravens2, ravens, driver_device, 0, "Joseph Glagla and Dieter Feiler", "Ravensburger Selbstbaucomputer V2.0", GAME_NOT_WORKING | GAME_NO_SOUND_HW ) |