trunk/src/mame/drivers/mw18w.c
r26561 | r26562 | |
7 | 7 | TODO: |
8 | 8 | - needs extensive interactive artwork |
9 | 9 | - discrete sound |
10 | | - identify lamps |
11 | 10 | |
12 | 11 | To diagnose game, turn on service mode and: |
13 | 12 | - test RAM/ROM, leds, lamps: reset with shifter in neutral |
r26561 | r26562 | |
28 | 27 | public: |
29 | 28 | mw18w_state(const machine_config &mconfig, device_type type, const char *tag) |
30 | 29 | : driver_device(mconfig, type, tag), |
31 | | m_maincpu(*this, "maincpu"), |
32 | | m_lamp_timer(*this, "lamp_timer") |
| 30 | m_maincpu(*this, "maincpu") |
33 | 31 | { } |
34 | 32 | |
35 | 33 | required_device<cpu_device> m_maincpu; |
36 | | required_device<timer_device> m_lamp_timer; |
37 | | |
38 | | int m_lamps_on[8][5]; |
39 | | |
40 | 34 | DECLARE_WRITE8_MEMBER(mw18w_sound0_w); |
41 | 35 | DECLARE_WRITE8_MEMBER(mw18w_sound1_w); |
42 | 36 | DECLARE_WRITE8_MEMBER(mw18w_lamps_w); |
43 | 37 | DECLARE_WRITE8_MEMBER(mw18w_led_display_w); |
44 | 38 | DECLARE_WRITE8_MEMBER(mw18w_irq0_clear_w); |
45 | 39 | DECLARE_CUSTOM_INPUT_MEMBER(mw18w_sensors_r); |
46 | | TIMER_DEVICE_CALLBACK_MEMBER(mw18w_update_lamps); |
47 | | |
48 | | virtual void machine_start(); |
49 | 40 | }; |
50 | 41 | |
51 | 42 | |
r26561 | r26562 | |
86 | 77 | |
87 | 78 | // refresh lamp status |
88 | 79 | for (int i = 0; i < 5; i++) |
89 | | if (rows >> i & 1) m_lamps_on[col][i] = 100; |
| 80 | output_set_lamp_value(col * 10 + i, rows >> i & 1); |
| 81 | |
| 82 | /* lamps info: |
| 83 | |
| 84 | 00: upper right load zone |
| 85 | 01: lower right load zone |
| 86 | 02: lost cargo |
| 87 | 03: hi score |
| 88 | 04: right crash |
| 89 | |
| 90 | 10: 2 pos. load lost sequence |
| 91 | 11: 3 pos. load lost sequence |
| 92 | 12: 4 pos. load lost sequence |
| 93 | 13: 5 pos. load lost sequence |
| 94 | 14: 6 pos. load lost sequence |
| 95 | |
| 96 | 20: down shift |
| 97 | 21: pick up cargo |
| 98 | 22: ahead |
| 99 | 23: 1 pos. load lost sequence |
| 100 | 24: go |
| 101 | |
| 102 | 30: right man arm body |
| 103 | 31: right man arm down |
| 104 | 32: right man arm up |
| 105 | 33: not used |
| 106 | 34: not used |
| 107 | |
| 108 | 40: left man arm up |
| 109 | 41: left man body |
| 110 | 42: left man arm down |
| 111 | 43: left crash |
| 112 | 44: not used |
| 113 | |
| 114 | 50: 1 cargo |
| 115 | 51: 3 cargo |
| 116 | 52: 5 cargo |
| 117 | 53: 7 cargo |
| 118 | 54: not used |
| 119 | |
| 120 | 60: 2 cargo |
| 121 | 61: 4 cargo |
| 122 | 62: 6 cargo |
| 123 | 63: 8 cargo |
| 124 | 64: not used |
| 125 | |
| 126 | 70: upper left load zone |
| 127 | 71: lower left load zone |
| 128 | 72: extended play |
| 129 | 73: credit |
| 130 | 74: game over |
| 131 | |
| 132 | (80: backdrop dim) |
| 133 | |
| 134 | */ |
90 | 135 | } |
91 | 136 | |
92 | 137 | WRITE8_MEMBER(mw18w_state::mw18w_led_display_w) |
r26561 | r26562 | |
219 | 264 | |
220 | 265 | ***************************************************************************/ |
221 | 266 | |
222 | | TIMER_DEVICE_CALLBACK_MEMBER(mw18w_state::mw18w_update_lamps) |
223 | | { |
224 | | // arbitrary timer to update and output lamp matrix |
225 | | for (int col = 0; col < 8; col++) |
226 | | { |
227 | | for (int row = 0; row < 5; row++) |
228 | | { |
229 | | if (m_lamps_on[col][row]) m_lamps_on[col][row]--; |
230 | | output_set_lamp_value(col * 10 + row, m_lamps_on[col][row] != 0); |
231 | | } |
232 | | } |
233 | | |
234 | | /* lamps info: |
235 | | |
236 | | 00: upper right load zone |
237 | | 01: lower right load zone |
238 | | 02: lost cargo |
239 | | 03: hi score |
240 | | 04: right crash |
241 | | |
242 | | 10: 2 pos. load lost sequence |
243 | | 11: 3 pos. load lost sequence |
244 | | 12: 4 pos. load lost sequence |
245 | | 13: 5 pos. load lost sequence |
246 | | 14: 6 pos. load lost sequence |
247 | | |
248 | | 20: down shift |
249 | | 21: pick up cargo |
250 | | 22: ahead |
251 | | 23: 1 pos. load lost sequence |
252 | | 24: go |
253 | | |
254 | | 30: right man arm body |
255 | | 31: right man arm down |
256 | | 32: right man arm up |
257 | | 33: not used |
258 | | 34: not used |
259 | | |
260 | | 40: left man arm up |
261 | | 41: left man body |
262 | | 42: left man arm down |
263 | | 43: left crash |
264 | | 44: not used |
265 | | |
266 | | 50: 1 cargo |
267 | | 51: 3 cargo |
268 | | 52: 5 cargo |
269 | | 53: 7 cargo |
270 | | 54: not used |
271 | | |
272 | | 60: 2 cargo |
273 | | 61: 4 cargo |
274 | | 62: 6 cargo |
275 | | 63: 8 cargo |
276 | | 64: not used |
277 | | |
278 | | 70: upper left load zone |
279 | | 71: lower left load zone |
280 | | 72: extended play |
281 | | 73: credit |
282 | | 74: game over |
283 | | |
284 | | (80: backdrop dim) |
285 | | |
286 | | */ |
287 | | } |
288 | | |
289 | | void mw18w_state::machine_start() |
290 | | { |
291 | | // init lamp matrix |
292 | | for (int row = 0; row < 5; row++) |
293 | | for (int col = 0; col < 8; col++) |
294 | | m_lamps_on[col][row] = 0; |
295 | | |
296 | | save_item(NAME(m_lamps_on)); |
297 | | } |
298 | | |
299 | 267 | static MACHINE_CONFIG_START( mw18w, mw18w_state ) |
300 | 268 | |
301 | 269 | /* basic machine hardware */ |
r26561 | r26562 | |
304 | 272 | MCFG_CPU_PROGRAM_MAP(mw18w_map) |
305 | 273 | MCFG_CPU_IO_MAP(mw18w_portmap) |
306 | 274 | |
307 | | MCFG_TIMER_DRIVER_ADD_PERIODIC("lamp_timer", mw18w_state, mw18w_update_lamps, attotime::from_hz(500)) // capacitors, frequency is a simple guess (/100) |
308 | | |
309 | 275 | /* no video! */ |
310 | 276 | |
311 | 277 | /* sound hardware */ |