trunk/src/mame/drivers/techno.c
| r17748 | r17749 | |
| 4 | 4 | Technoplay "2-2C 8008 LS" (68000 CPU) |
| 5 | 5 | Schematic and PinMAME used as references |
| 6 | 6 | |
| 7 | ToDo: |
| 8 | - Once game starts, nothing responds |
| 9 | - No sound due to missing roms |
| 10 | - Battery backup to be added |
| 11 | |
| 7 | 12 | ***********************************************************************************/ |
| 8 | 13 | |
| 9 | 14 | |
| 10 | 15 | #include "emu.h" |
| 11 | 16 | #include "cpu/m68000/m68000.h" |
| 12 | 17 | #include "techno.lh" |
| 13 | | // schematic says 8MHz but it goes too fast |
| 14 | | #define TECHNO_MAINCLK 4e6 |
| 15 | 18 | |
| 19 | #define TECHNO_MAINCLK 8e6 |
| 20 | |
| 16 | 21 | class techno_state : public driver_device |
| 17 | 22 | { |
| 18 | 23 | public: |
| r17748 | r17749 | |
| 32 | 37 | DECLARE_WRITE16_MEMBER(sol1_w); |
| 33 | 38 | DECLARE_WRITE16_MEMBER(sol2_w); |
| 34 | 39 | DECLARE_WRITE16_MEMBER(sound_w); |
| 35 | | UINT16 m_digit_1; |
| 36 | | UINT16 m_digit_2; |
| 37 | | UINT16 m_segment_1; |
| 38 | | UINT16 m_segment_2; |
| 40 | UINT16 m_digit; |
| 39 | 41 | UINT8 m_vector; |
| 40 | 42 | protected: |
| 41 | 43 | |
| r17748 | r17749 | |
| 46 | 48 | virtual void machine_reset(); |
| 47 | 49 | private: |
| 48 | 50 | bool m_digwait; |
| 49 | | public: |
| 50 | | DECLARE_DRIVER_INIT(techno); |
| 51 | UINT8 m_keyrow; |
| 51 | 52 | }; |
| 52 | 53 | |
| 53 | 54 | |
| r17748 | r17749 | |
| 76 | 77 | |
| 77 | 78 | WRITE16_MEMBER( techno_state::disp1_w ) |
| 78 | 79 | { |
| 79 | | m_segment_1 = BITSWAP16(data, 12, 10, 8, 14, 13, 9, 11, 15, 7, 6, 5, 4, 3, 2, 1, 0); |
| 80 | | output_set_digit_value(m_digit_1, m_segment_1); |
| 80 | output_set_digit_value(m_digit, BITSWAP16(data, 12, 10, 8, 14, 13, 9, 11, 15, 7, 6, 5, 4, 3, 2, 1, 0)); |
| 81 | 81 | } |
| 82 | 82 | |
| 83 | 83 | WRITE16_MEMBER( techno_state::disp2_w ) |
| 84 | 84 | { |
| 85 | | m_segment_2 = BITSWAP16(data, 12, 10, 8, 14, 13, 9, 11, 15, 7, 6, 5, 4, 3, 2, 1, 0); |
| 86 | | output_set_digit_value(m_digit_1+30, m_segment_2); |
| 85 | output_set_digit_value(m_digit+30, BITSWAP16(data, 12, 10, 8, 14, 13, 9, 11, 15, 7, 6, 5, 4, 3, 2, 1, 0)); |
| 87 | 86 | } |
| 88 | 87 | |
| 89 | 88 | WRITE16_MEMBER( techno_state::sound_w ) |
| 90 | 89 | { |
| 90 | /* |
| 91 | d0..d7 : to sound board |
| 92 | d8 : strobe to display board |
| 93 | d9 : reset (unknown purpose) |
| 94 | d10 : data clock to display board |
| 95 | d11-d15: AUX outputs |
| 96 | */ |
| 97 | |
| 98 | // this code derived from PinMAME |
| 91 | 99 | if (m_digwait) |
| 92 | | m_digit_1 = (m_digit_1+1) % 16; |
| 100 | m_digit = (m_digit+1) % 16; |
| 93 | 101 | |
| 94 | 102 | if (BIT(data, 10)) |
| 95 | 103 | { |
| 96 | 104 | m_digwait = 1; |
| 97 | | m_digit_1 = 0; |
| 105 | m_digit = 0; |
| 98 | 106 | } |
| 99 | 107 | } |
| 100 | 108 | |
| 101 | 109 | // lamps & keymatrix |
| 102 | 110 | WRITE16_MEMBER( techno_state::lamp1_w ) |
| 103 | 111 | { |
| 112 | // Work out key row |
| 113 | for (int i = 8; i < 16; i++) |
| 114 | if (BIT(data, i)) |
| 115 | m_keyrow = i-8; |
| 104 | 116 | } |
| 105 | 117 | |
| 106 | 118 | // more lamps |
| r17748 | r17749 | |
| 126 | 138 | // inputs |
| 127 | 139 | READ16_MEMBER( techno_state::key_r ) |
| 128 | 140 | { |
| 129 | | return 0; |
| 141 | char kbdrow[6]; |
| 142 | sprintf(kbdrow,"X%X",m_keyrow); |
| 143 | return ioport(kbdrow)->read(); |
| 130 | 144 | } |
| 131 | 145 | |
| 132 | 146 | // unknown |
| r17748 | r17749 | |
| 138 | 152 | // feedback from sound board, and some AUX inputs |
| 139 | 153 | READ16_MEMBER( techno_state::sound_r ) |
| 140 | 154 | { |
| 141 | | return 0xffff; |
| 155 | return 0; |
| 142 | 156 | } |
| 143 | 157 | |
| 144 | 158 | static INPUT_PORTS_START( techno ) |
| 159 | PORT_START("X0") |
| 160 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Letter select+") PORT_CODE(KEYCODE_F5) |
| 161 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN3 ) |
| 162 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN2 ) |
| 163 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 ) |
| 164 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_SERVICE ) |
| 165 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_TILT2 ) |
| 166 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Test-") PORT_CODE(KEYCODE_F7) |
| 167 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Test+") PORT_CODE(KEYCODE_F8) |
| 168 | PORT_START("X1") |
| 169 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fix top target right") |
| 170 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Horizontal rail right") |
| 171 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 172 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Mini Post") PORT_CODE(KEYCODE_I) |
| 173 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 174 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_TILT ) |
| 175 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START ) |
| 176 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Letter select+") PORT_CODE(KEYCODE_F6) |
| 177 | PORT_START("X2") |
| 178 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 179 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Inner Canal Left") PORT_CODE(KEYCODE_O) |
| 180 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Exit Canal Right") PORT_CODE(KEYCODE_OPENBRACE) |
| 181 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Ball 1") |
| 182 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Ball 2") |
| 183 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Ball 3") |
| 184 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Ball 4") |
| 185 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Out Hole") PORT_CODE(KEYCODE_X) |
| 186 | PORT_START("X3") |
| 187 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Top Bumper") PORT_CODE(KEYCODE_Q) |
| 188 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bottom Bumper") PORT_CODE(KEYCODE_W) |
| 189 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Top Right Kicker") PORT_CODE(KEYCODE_E) |
| 190 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Right Kicker") PORT_CODE(KEYCODE_R) |
| 191 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Left Kicker") PORT_CODE(KEYCODE_Y) |
| 192 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Exit Canal Left") PORT_CODE(KEYCODE_U) |
| 193 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Inner Canal Right") PORT_CODE(KEYCODE_I) |
| 194 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 195 | PORT_START("X4") |
| 196 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fix left target bottom") PORT_CODE(KEYCODE_A) |
| 197 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Left rollover") PORT_CODE(KEYCODE_S) |
| 198 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Barrier 1 Target") PORT_CODE(KEYCODE_D) |
| 199 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 200 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Barrier 2 Target") PORT_CODE(KEYCODE_F) |
| 201 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 202 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Barrier 3 Target") PORT_CODE(KEYCODE_G) |
| 203 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Left Bumper") PORT_CODE(KEYCODE_H) |
| 204 | PORT_START("X5") |
| 205 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fix right target top") PORT_CODE(KEYCODE_J) |
| 206 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fix right target middle-top") PORT_CODE(KEYCODE_K) |
| 207 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Spinning Target") PORT_CODE(KEYCODE_L) |
| 208 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fixed contact") PORT_CODE(KEYCODE_COLON) |
| 209 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Special Target") PORT_CODE(KEYCODE_QUOTE) |
| 210 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 211 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fix left target top") PORT_CODE(KEYCODE_CLOSEBRACE) |
| 212 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fix left target centre") PORT_CODE(KEYCODE_BACKSLASH) |
| 213 | PORT_START("X6") |
| 214 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fix top left target left") PORT_CODE(KEYCODE_Z) |
| 215 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Ball 1 Bridge") |
| 216 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Ball 2 Bridge") |
| 217 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Ball 3 Bridge") |
| 218 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Ball 4 Bridge") |
| 219 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 220 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fix right target middle-bottom") PORT_CODE(KEYCODE_C) |
| 221 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fix right target bottom") PORT_CODE(KEYCODE_V) |
| 222 | PORT_START("X7") |
| 223 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fix top target middle-right") PORT_CODE(KEYCODE_B) |
| 224 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fix top target middle-left") PORT_CODE(KEYCODE_N) |
| 225 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fix top target Left") PORT_CODE(KEYCODE_M) |
| 226 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Horizontal Rail Left") PORT_CODE(KEYCODE_COMMA) |
| 227 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Chopper Exit") PORT_CODE(KEYCODE_STOP) |
| 228 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Chopper Entry") PORT_CODE(KEYCODE_SLASH) |
| 229 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fix top left target right") PORT_CODE(KEYCODE_MINUS) |
| 230 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fix top left target middle") PORT_CODE(KEYCODE_EQUALS) |
| 145 | 231 | INPUT_PORTS_END |
| 146 | 232 | |
| 147 | 233 | static INTERRUPT_GEN( techno_intgen ) |
| r17748 | r17749 | |
| 158 | 244 | void techno_state::machine_reset() |
| 159 | 245 | { |
| 160 | 246 | m_vector = 0x88; |
| 247 | m_digit = 0; |
| 161 | 248 | } |
| 162 | 249 | |
| 163 | | DRIVER_INIT_MEMBER(techno_state,techno) |
| 164 | | { |
| 165 | | } |
| 166 | | |
| 167 | 250 | static MACHINE_CONFIG_START( techno, techno_state ) |
| 168 | 251 | /* basic machine hardware */ |
| 169 | 252 | MCFG_CPU_ADD("maincpu", M68000, TECHNO_MAINCLK) |
| r17748 | r17749 | |
| 185 | 268 | // 5 x 27256 roms are undumped |
| 186 | 269 | ROM_END |
| 187 | 270 | |
| 188 | | GAME(1987, xforce, 0, techno, techno, techno_state, techno, ROT0, "Tecnoplay", "X Force", GAME_IS_SKELETON_MECHANICAL) |
| 271 | GAME(1987, xforce, 0, techno, techno, driver_device, 0, ROT0, "Tecnoplay", "X Force", GAME_MECHANICAL | GAME_NO_SOUND | GAME_IMPERFECT_KEYBOARD) |