trunk/src/mess/drivers/elecbowl.c
| r245451 | r245452 | |
| 5 | 5 | ** subclass of hh_tms1k_state (includes/hh_tms1k.h, drivers/hh_tms1k.c) ** |
| 6 | 6 | |
| 7 | 7 | Marx Series 300 Electronic Bowling Game |
| 8 | Main board: |
| 8 | 9 | * TMS1100NLL MP3403 DBS 7836 SINGAPORE |
| 10 | * 4*SN75492 quad segment driver, 2*SN74259 8-line demultiplexer, |
| 11 | 2*CD4043 quad r/s input latch |
| 12 | * 5 7seg LEDs, 15 lamps(10 lamps projected to bowling pins reflection), |
| 13 | 1bit-sound with crude volume control |
| 14 | * edge connector to sensor board, inputs, ...? |
| 9 | 15 | |
| 10 | | 10 lamps for bowling pins + 3 more bulbs, and 7segs for frame number and |
| 11 | | scores. Board size is 10-12" by 6-8". |
| 16 | lamp translation table: SN74259.u5(mux 1) goes to MESS output lamp5x, |
| 17 | SN74259.u6(mux 2) goes to MESS output lamp6x. u1-u3 are SN75492 ICs, |
| 18 | where other: u1 A2 is N/C, u3 A1 is from O2 and goes to digits seg C. |
| 12 | 19 | |
| 13 | | some clues: |
| 14 | | - it's from 1978 |
| 15 | | - Merlin is MP3404, Amaze-A-Tron is MP3405, this one is MP3403 |
| 16 | | - it plays some short jingles (you need to be lucky with button mashing) |
| 20 | u5 Q0 -> u1 A4 -> L2 (pin #2) u6 Q0 -> u3 A4 -> L1 (pin #1) |
| 21 | u5 Q1 -> u1 A5 -> L4 (pin #4) u6 Q1 -> u3 A5 -> L5 (pin #5) |
| 22 | u5 Q2 -> u1 A6 -> L7 (pin #7) u6 Q2 -> u2 A3 -> L11 (player 1) |
| 23 | u5 Q3 -> u1 A1 -> L8 (pin #8) u6 Q3 -> u2 A2 -> L12 (player 2) |
| 24 | u5 Q4 -> u3 A2 -> L3 (pin #3) u6 Q4 -> u2 A1 -> L15 (?) |
| 25 | u5 Q5 -> u2 A6 -> L6 (pin #6) u6 Q5 -> u3 A6 -> L14 (?) |
| 26 | u5 Q6 -> u2 A5 -> L10 (pin #10) u6 Q6 -> u1 A3 -> L13 (spare) |
| 27 | u5 Q7 -> u2 A4 -> L9 (pin #9) u6 Q7 -> u3 A3 -> digit 4 B+C |
| 17 | 28 | |
| 18 | 29 | ***************************************************************************/ |
| 19 | 30 | |
| r245451 | r245452 | |
| 28 | 39 | : hh_tms1k_state(mconfig, type, tag) |
| 29 | 40 | { } |
| 30 | 41 | |
| 42 | void prepare_display(); |
| 31 | 43 | DECLARE_WRITE16_MEMBER(write_r); |
| 32 | 44 | DECLARE_WRITE16_MEMBER(write_o); |
| 33 | 45 | DECLARE_READ8_MEMBER(read_k); |
| 34 | | |
| 35 | | protected: |
| 36 | | virtual void machine_start(); |
| 37 | 46 | }; |
| 38 | 47 | |
| 39 | 48 | |
| 40 | 49 | /*************************************************************************** |
| 41 | 50 | |
| 51 | Display |
| 52 | |
| 53 | ***************************************************************************/ |
| 54 | |
| 55 | void elecbowl_state::prepare_display() |
| 56 | { |
| 57 | // standard 7segs |
| 58 | for (int y = 0; y < 4; y++) |
| 59 | { |
| 60 | m_display_segmask[y] = 0x7f; |
| 61 | m_display_state[y] = (m_r >> (y + 4) & 1) ? m_o : 0; |
| 62 | } |
| 63 | |
| 64 | // lamp muxes |
| 65 | UINT8 d = m_r >> 1 & 1; |
| 66 | m_display_state[5] = (m_r & 1) ? (d << (m_o & 7)) : 0; |
| 67 | m_display_state[6] = (m_r >> 2 & 1) ? (d << (m_o & 7)) : 0; |
| 68 | |
| 69 | // digit 4 is from u6 Q7 |
| 70 | m_display_segmask[4] = 6; |
| 71 | m_display_state[4] = (m_display_state[6] & 0x80) ? 6 : 0; |
| 72 | |
| 73 | set_display_size(8, 7); |
| 74 | display_update(); |
| 75 | } |
| 76 | |
| 77 | |
| 78 | |
| 79 | /*************************************************************************** |
| 80 | |
| 42 | 81 | I/O |
| 43 | 82 | |
| 44 | 83 | ***************************************************************************/ |
| 45 | 84 | |
| 46 | 85 | WRITE16_MEMBER(elecbowl_state::write_r) |
| 47 | 86 | { |
| 48 | | // R4-R7: input mux |
| 49 | | m_inp_mux = data >> 4 & 0xf; |
| 87 | // R5-R7,R10: input mux |
| 88 | m_inp_mux = (data >> 5 & 7) | (data >> 7 & 8); |
| 50 | 89 | |
| 51 | 90 | // R9: speaker out |
| 91 | // R3,R8: speaker volume.. |
| 52 | 92 | m_speaker->level_w(data >> 9 & 1); |
| 53 | 93 | |
| 54 | | // R10: maybe a switch or other button row? |
| 55 | | // others: ? |
| 94 | // R4-R7: select digit |
| 95 | // R0,R2: lamp muxes enable |
| 96 | // R1: lamp muxes state |
| 97 | m_r = data; |
| 98 | prepare_display(); |
| 56 | 99 | } |
| 57 | 100 | |
| 58 | 101 | WRITE16_MEMBER(elecbowl_state::write_o) |
| 59 | 102 | { |
| 60 | | // ? |
| 103 | // O0-O2: lamp mux |
| 104 | // O0-O6: digit segments A-G |
| 105 | // O7: N/C |
| 106 | //if (data & 0x80) printf("%X ",data&0x7f); |
| 107 | |
| 108 | m_o = data & 0x7f; |
| 109 | prepare_display(); |
| 61 | 110 | } |
| 62 | 111 | |
| 63 | 112 | READ8_MEMBER(elecbowl_state::read_k) |
| r245451 | r245452 | |
| 74 | 123 | ***************************************************************************/ |
| 75 | 124 | |
| 76 | 125 | static INPUT_PORTS_START( elecbowl ) |
| 77 | | PORT_START("IN.0") // R4 |
| 126 | PORT_START("IN.0") // R5 |
| 78 | 127 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) |
| 79 | 128 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) |
| 80 | 129 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) |
| 81 | 130 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) |
| 82 | 131 | |
| 83 | | PORT_START("IN.1") // R5 |
| 132 | PORT_START("IN.1") // R6 |
| 84 | 133 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) |
| 85 | 134 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) |
| 86 | 135 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) |
| 87 | | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) |
| 136 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) // reset/newgame? |
| 88 | 137 | |
| 89 | | PORT_START("IN.2") // R6 |
| 138 | PORT_START("IN.2") // R7 |
| 90 | 139 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) |
| 91 | 140 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) |
| 92 | 141 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) |
| 93 | | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) // reset/newgame? |
| 142 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) |
| 94 | 143 | |
| 95 | | PORT_START("IN.3") // R7 |
| 144 | PORT_START("IN.3") // R10 |
| 96 | 145 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) |
| 97 | 146 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) |
| 98 | 147 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) |
| r245451 | r245452 | |
| 107 | 156 | |
| 108 | 157 | ***************************************************************************/ |
| 109 | 158 | |
| 110 | | void elecbowl_state::machine_start() |
| 111 | | { |
| 112 | | hh_tms1k_state::machine_start(); |
| 113 | | } |
| 114 | | |
| 115 | | |
| 159 | // output PLA is not dumped |
| 116 | 160 | static const UINT16 elecbowl_output_pla[0x20] = |
| 117 | 161 | { |
| 118 | | /* O output PLA configuration currently unknown */ |
| 119 | | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, |
| 120 | | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, |
| 121 | | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, |
| 122 | | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f |
| 162 | lA+lB+lC+lD+lE+lF, // 0 |
| 163 | lB+lC, // 1 |
| 164 | lA+lB+lG+lE+lD, // 2 |
| 165 | lA+lB+lG+lC+lD, // 3 |
| 166 | lF+lB+lG+lC, // 4 |
| 167 | lA+lF+lG+lC+lD, // 5 |
| 168 | lA+lF+lG+lC+lD+lE, // 6 |
| 169 | lA+lB+lC, // 7 |
| 170 | lA+lB+lC+lD+lE+lF+lG, // 8 |
| 171 | lA+lB+lG+lF+lC+lD, // 9 |
| 172 | |
| 173 | 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, |
| 174 | 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, |
| 175 | 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f |
| 123 | 176 | }; |
| 124 | 177 | |
| 125 | 178 | static MACHINE_CONFIG_START( elecbowl, elecbowl_state ) |
| 126 | 179 | |
| 127 | 180 | /* basic machine hardware */ |
| 128 | | MCFG_CPU_ADD("maincpu", TMS1100, 300000) // approximation - unknown freq |
| 181 | MCFG_CPU_ADD("maincpu", TMS1100, 350000) // RC osc. R=33K, C=100pf -> ~350kHz |
| 129 | 182 | MCFG_TMS1XXX_OUTPUT_PLA(elecbowl_output_pla) |
| 130 | 183 | MCFG_TMS1XXX_READ_K_CB(READ8(elecbowl_state, read_k)) |
| 131 | 184 | MCFG_TMS1XXX_WRITE_R_CB(WRITE16(elecbowl_state, write_r)) |
| 132 | 185 | MCFG_TMS1XXX_WRITE_O_CB(WRITE16(elecbowl_state, write_o)) |
| 133 | 186 | |
| 187 | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1)) |
| 134 | 188 | MCFG_DEFAULT_LAYOUT(layout_elecbowl) |
| 135 | 189 | |
| 136 | 190 | /* no video! */ |
| r245451 | r245452 | |
| 151 | 205 | |
| 152 | 206 | ROM_START( elecbowl ) |
| 153 | 207 | ROM_REGION( 0x0800, "maincpu", 0 ) |
| 154 | | ROM_LOAD( "mp3403", 0x0000, 0x0800, CRC(9eabaa7d) SHA1(b1f54587ed7f2bbf3a5d49075c807296384c2b06) ) |
| 208 | ROM_LOAD( "mp3403.u9", 0x0000, 0x0800, CRC(9eabaa7d) SHA1(b1f54587ed7f2bbf3a5d49075c807296384c2b06) ) |
| 155 | 209 | |
| 156 | 210 | ROM_REGION( 867, "maincpu:mpla", 0 ) |
| 157 | 211 | ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified |
| r245451 | r245452 | |
| 160 | 214 | ROM_END |
| 161 | 215 | |
| 162 | 216 | |
| 163 | | CONS( 1978, elecbowl, 0, 0, elecbowl, elecbowl, driver_device, 0, "Marx", "Electronic Bowling (Marx)", GAME_SUPPORTS_SAVE | GAME_MECHANICAL | GAME_NOT_WORKING ) |
| 217 | CONS( 1978, elecbowl, 0, 0, elecbowl, elecbowl, driver_device, 0, "Marx", "Electronic Bowling (Marx)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_SOUND | GAME_MECHANICAL | GAME_NOT_WORKING ) |