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 */ |