trunk/src/mame/drivers/didact.cpp
r253023 | r253024 | |
41 | 41 | * |____________________________________________________________________________________________________________| |______ | _|||_ |___________________________________| |
42 | 42 | * |
43 | 43 | * _____________________________________________________________________________________________ ___________________________________________________________________________ |
44 | | * |The Didact Mikrodator 6802 CPU board by Lars Björklund 1983 ( ) | |The Didact Mikrodator 6802 TB16 board by Lars Björklund 1983 | |
| 44 | * |The Didact Mikrodator 6802 CPU board by Lars Bjorklund 1983 ( ) | |The Didact Mikrodator 6802 TB16 board by Lars Bj??rklund 1983 | |
45 | 45 | * | +----= | | +-|||||||-+ ______ | |
46 | 46 | * | | = | | CA2 Tx |terminal | | () | | |
47 | 47 | * | | = | | PA7 Rx +---------+ +----------+ C1nF,<=R18k| | | |
r253023 | r253024 | |
77 | 77 | * |
78 | 78 | * History of Didact |
79 | 79 | *------------------ |
80 | | * Didact Läromedelsproduktion was started in Linköping in Sweden by Anders Andersson, Arne Kullbjer and |
81 | | * Lars Björklund. They constructed a series of microcomputers for educational purposes such as "Mikrodator 6802", |
| 80 | * Didact Laromedelsproduktion was started in Linkoping in Sweden by Anders Andersson, Arne Kullbjer and |
| 81 | * Lars Bjorklund. They constructed a series of microcomputers for educational purposes such as "Mikrodator 6802", |
82 | 82 | * Esselte 100 and the Candela computer for the swedish schools to educate the students in assembly programming |
83 | 83 | * and BASIC for electro mechanical applications such as stepper motors, simple process control, buttons |
84 | 84 | * and LED:s. Didact designs were marketed by Esselte Studium to the swedish schools. The Candela computer |
r253023 | r253024 | |
92 | 92 | * http://elektronikforumet.com/forum/download/file.php?id=63988&mode=view |
93 | 93 | * http://elektronikforumet.com/forum/viewtopic.php?f=2&t=79576&start=150#p1203915 |
94 | 94 | * |
95 | | * TODO: |
| 95 | * TODO: |
96 | 96 | * Didact designs: mp68a, md6802, md6802v3, Esselte 100, Candela |
97 | 97 | * -------------------------------------------------------------------------- |
98 | 98 | * - Add PCB layouts OK OK |
r253023 | r253024 | |
110 | 110 | #include "emu.h" |
111 | 111 | #include "cpu/m6800/m6800.h" |
112 | 112 | #include "machine/6821pia.h" // For all boards |
113 | | #include "video/dm9368.h" // For the mp68a |
| 113 | #include "video/dm9368.h" // For the mp68a |
114 | 114 | #include "machine/74145.h" // For the md6802 |
115 | 115 | // Generated artwork includes |
116 | 116 | #include "mp68a.lh" |
r253023 | r253024 | |
132 | 132 | /* Didact base class */ |
133 | 133 | class didact_state : public driver_device |
134 | 134 | { |
135 | | public: |
| 135 | public: |
136 | 136 | didact_state(const machine_config &mconfig, device_type type, const char * tag) |
137 | | : driver_device(mconfig, type, tag) |
| 137 | : driver_device(mconfig, type, tag) |
138 | 138 | ,m_io_line0(*this, "LINE0") |
139 | 139 | ,m_io_line1(*this, "LINE1") |
140 | 140 | ,m_io_line2(*this, "LINE2") |
r253023 | r253024 | |
166 | 166 | /* Esselte 100 driver class */ |
167 | 167 | class e100_state : public didact_state |
168 | 168 | { |
169 | | public: |
| 169 | public: |
170 | 170 | e100_state(const machine_config &mconfig, device_type type, const char * tag) |
171 | | : didact_state(mconfig, type, tag), |
| 171 | : didact_state(mconfig, type, tag), |
172 | 172 | m_maincpu(*this, "maincpu"), |
173 | 173 | m_pia1(*this, "pia1"), |
174 | 174 | m_pia2(*this, "pia2") |
175 | | { } |
| 175 | { } |
176 | 176 | required_device<m6802_cpu_device> m_maincpu; |
177 | 177 | virtual void machine_reset() override { m_maincpu->reset(); LOG(("--->%s()\n", FUNCNAME)); }; |
178 | 178 | protected: |
r253023 | r253024 | |
183 | 183 | /* Mikrodator 6802 driver class */ |
184 | 184 | class md6802_state : public didact_state |
185 | 185 | { |
186 | | public: |
| 186 | public: |
187 | 187 | md6802_state(const machine_config &mconfig, device_type type, const char * tag) |
188 | | : didact_state(mconfig, type, tag) |
| 188 | : didact_state(mconfig, type, tag) |
189 | 189 | ,m_maincpu(*this, "maincpu") |
190 | 190 | ,m_tb16_74145(*this, "tb16_74145") |
191 | 191 | ,m_segments(0) |
192 | 192 | ,m_pia1(*this, "pia1") |
193 | 193 | ,m_pia2(*this, "pia2") |
194 | | { } |
| 194 | { } |
195 | 195 | required_device<m6802_cpu_device> m_maincpu; |
196 | 196 | required_device<ttl74145_device> m_tb16_74145; |
197 | 197 | UINT8 m_segments; |
r253023 | r253024 | |
228 | 228 | LOG(("%s()-->%02x %02x %02x %02x modified by %02x displaying %02x\n", FUNCNAME, m_line0, m_line1, m_line2, m_line3, m_shift, ls145)); |
229 | 229 | #endif |
230 | 230 | |
231 | | // Mask out those rows that has a button pressed |
| 231 | // Mask out those rows that has a button pressed |
232 | 232 | pa &= ~(((~m_line0 & ls145 ) != 0) ? 1 : 0); |
233 | 233 | pa &= ~(((~m_line1 & ls145 ) != 0) ? 2 : 0); |
234 | 234 | pa &= ~(((~m_line2 & ls145 ) != 0) ? 4 : 0); |
r253023 | r253024 | |
236 | 236 | |
237 | 237 | if (m_shift) |
238 | 238 | { |
239 | | pa &= 0x7f; // Clear shift bit if button being pressed (PA7) to ground (internal pullup) |
| 239 | pa &= 0x7f; // Clear shift bit if button being pressed (PA7) to ground (internal pullup) |
240 | 240 | LOG( ("SHIFT is pressed\n") ); |
241 | 241 | } |
242 | 242 | |
r253023 | r253024 | |
253 | 253 | { |
254 | 254 | UINT8 digit_nbr; |
255 | 255 | |
256 | | // LOG(("--->%s(%02x)\n", FUNCNAME, data)); |
| 256 | // LOG(("--->%s(%02x)\n", FUNCNAME, data)); |
257 | 257 | |
258 | 258 | digit_nbr = (data >> 4) & 0x07; |
259 | | m_tb16_74145->write( digit_nbr ); |
| 259 | m_tb16_74145->write( digit_nbr ); |
260 | 260 | if (digit_nbr < 6) |
261 | 261 | { |
262 | 262 | output().set_digit_value( digit_nbr, m_segments); |
r253023 | r253024 | |
266 | 266 | /* PIA 2 Port B is all outputs to drive the display so it is very unlikelly that this function is called */ |
267 | 267 | READ8_MEMBER( md6802_state::pia2_kbB_r ) |
268 | 268 | { |
269 | | LOG( ("Warning, trying to read from Port B designated to drive the display, please check why\n") ); |
270 | | logerror("Warning, trying to read from Port B designated to drive the display, please check why\n"); |
| 269 | LOG( ("Warning, trying to read from Port B designated to drive the display, please check why\n") ); |
| 270 | logerror("Warning, trying to read from Port B designated to drive the display, please check why\n"); |
271 | 271 | return 0; |
272 | 272 | } |
273 | 273 | |
274 | 274 | /* Port B is fully used ouputting the segment pattern to the display */ |
275 | 275 | WRITE8_MEMBER( md6802_state::pia2_kbB_w ) |
276 | 276 | { |
277 | | // LOG(("--->%s(%02x)\n", FUNCNAME, data)); |
| 277 | // LOG(("--->%s(%02x)\n", FUNCNAME, data)); |
278 | 278 | |
279 | 279 | /* Store the segment pattern but do not lit up the digit here, done by pulling the correct cathode low on Port A */ |
280 | 280 | m_segments = BITSWAP8(data, 0, 4, 5, 3, 2, 1, 7, 6); |
r253023 | r253024 | |
299 | 299 | { |
300 | 300 | LOG(("--->%s()\n", FUNCNAME)); |
301 | 301 | m_led = 1; |
302 | | m_maincpu->reset(); |
| 302 | m_maincpu->reset(); |
303 | 303 | } |
304 | 304 | |
305 | 305 | /* Didact mp68a driver class */ |
r253023 | r253024 | |
310 | 310 | #define PIA6820 PIA6821 |
311 | 311 | class mp68a_state : public didact_state |
312 | 312 | { |
313 | | public: |
| 313 | public: |
314 | 314 | mp68a_state(const machine_config &mconfig, device_type type, const char * tag) |
315 | | : didact_state(mconfig, type, tag) |
| 315 | : didact_state(mconfig, type, tag) |
316 | 316 | ,m_maincpu(*this, "maincpu") |
317 | 317 | ,m_digit0(*this, "digit0") |
318 | 318 | ,m_digit1(*this, "digit1") |
r253023 | r253024 | |
322 | 322 | ,m_digit5(*this, "digit5") |
323 | 323 | ,m_pia1(*this, "pia1") |
324 | 324 | ,m_pia2(*this, "pia2") |
325 | | { } |
| 325 | { } |
326 | 326 | |
327 | 327 | required_device<m6800_cpu_device> m_maincpu; |
328 | 328 | |
r253023 | r253024 | |
367 | 367 | but we are using data read from the port. */ |
368 | 368 | digit_nbr = (data >> 4) & 0x07; |
369 | 369 | |
370 | | /* There is actually only one 9368 and a 74145 to drive the cathode of the right digit low */ |
371 | | /* This can be emulated by prentending there are one 9368 per digit, at least for now */ |
| 370 | /* There is actually only one 9368 and a 74145 to drive the cathode of the right digit low */ |
| 371 | /* This can be emulated by prentending there are one 9368 per digit, at least for now */ |
372 | 372 | switch (digit_nbr) |
373 | 373 | { |
374 | 374 | case 0: m_digit0->a_w(data & 0x0f); break; |
r253023 | r253024 | |
406 | 406 | while (a012 > 0 && !(line & (1 << --a012))); |
407 | 407 | } |
408 | 408 | |
409 | | pb = a012; // A0-A2 -> PB0-PB3 |
| 409 | pb = a012; // A0-A2 -> PB0-PB3 |
410 | 410 | |
411 | 411 | if (m_shift) |
412 | 412 | { |
413 | | pb |= 0x80; // Set shift bit (PB7) |
| 413 | pb |= 0x80; // Set shift bit (PB7) |
414 | 414 | m_shift = 0; // Reset flip flop |
415 | 415 | output().set_led_value(m_led, m_shift); |
416 | 416 | LOG( ("SHIFT is released\n") ); |
r253023 | r253024 | |
489 | 489 | |
490 | 490 | static INPUT_PORTS_START( md6802 ) |
491 | 491 | PORT_START("LINE0") /* KEY ROW 0 */ |
492 | | PORT_BIT(0x01, 0x01, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') |
493 | | PORT_BIT(0x02, 0x02, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1') |
494 | | PORT_BIT(0x04, 0x04, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2') |
495 | | PORT_BIT(0x08, 0x08, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3') |
| 492 | PORT_BIT(0x01, 0x01, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') |
| 493 | PORT_BIT(0x02, 0x02, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1') |
| 494 | PORT_BIT(0x04, 0x04, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2') |
| 495 | PORT_BIT(0x08, 0x08, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3') |
496 | 496 | PORT_BIT(0xf0, 0x00, IPT_UNUSED ) |
497 | 497 | |
498 | 498 | PORT_START("LINE1") /* KEY ROW 1 */ |
499 | | PORT_BIT(0x01, 0x01, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') |
500 | | PORT_BIT(0x02, 0x02, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5') |
501 | | PORT_BIT(0x04, 0x04, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CHAR('6') |
502 | | PORT_BIT(0x08, 0x08, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7') |
| 499 | PORT_BIT(0x01, 0x01, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') |
| 500 | PORT_BIT(0x02, 0x02, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5') |
| 501 | PORT_BIT(0x04, 0x04, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CHAR('6') |
| 502 | PORT_BIT(0x08, 0x08, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7') |
503 | 503 | PORT_BIT(0xf0, 0x00, IPT_UNUSED ) |
504 | 504 | |
505 | 505 | PORT_START("LINE2") /* KEY ROW 2 */ |
506 | | PORT_BIT(0x01, 0x01, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8') |
507 | | PORT_BIT(0x02, 0x02, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9') |
508 | | PORT_BIT(0x04, 0x04, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A') |
509 | | PORT_BIT(0x08, 0x08, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B') |
| 506 | PORT_BIT(0x01, 0x01, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8') |
| 507 | PORT_BIT(0x02, 0x02, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9') |
| 508 | PORT_BIT(0x04, 0x04, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A') |
| 509 | PORT_BIT(0x08, 0x08, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B') |
510 | 510 | PORT_BIT(0xf0, 0x00, IPT_UNUSED ) |
511 | 511 | |
512 | 512 | PORT_START("LINE3") /* KEY ROW 3 */ |
513 | | PORT_BIT(0x01, 0x01, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C') |
514 | | PORT_BIT(0x02, 0x02, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D') |
515 | | PORT_BIT(0x04, 0x04, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E') |
516 | | PORT_BIT(0x08, 0x08, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F') |
| 513 | PORT_BIT(0x01, 0x01, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C') |
| 514 | PORT_BIT(0x02, 0x02, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D') |
| 515 | PORT_BIT(0x04, 0x04, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E') |
| 516 | PORT_BIT(0x08, 0x08, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F') |
517 | 517 | PORT_BIT(0xf0, 0x00, IPT_UNUSED ) |
518 | 518 | |
519 | 519 | PORT_START("LINE4") /* Special KEY ROW for reset and Shift/'*' keys */ |
r253023 | r253024 | |
524 | 524 | |
525 | 525 | static INPUT_PORTS_START( mp68a ) |
526 | 526 | PORT_START("LINE0") /* KEY ROW 0 */ |
527 | | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C') |
528 | | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D') |
529 | | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E') |
530 | | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F') |
| 527 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C') |
| 528 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D') |
| 529 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E') |
| 530 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F') |
531 | 531 | PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) |
532 | 532 | |
533 | 533 | PORT_START("LINE1") /* KEY ROW 1 */ |
534 | | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8') |
535 | | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9') |
536 | | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A') |
537 | | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B') |
| 534 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8') |
| 535 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9') |
| 536 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A') |
| 537 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B') |
538 | 538 | PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED ) |
539 | 539 | |
540 | 540 | PORT_START("LINE2") /* KEY ROW 2 */ |
541 | | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') |
542 | | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5') |
543 | | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CHAR('6') |
544 | | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7') |
| 541 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') |
| 542 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5') |
| 543 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CHAR('6') |
| 544 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7') |
545 | 545 | PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) |
546 | 546 | |
547 | 547 | PORT_START("LINE3") /* KEY ROW 3 */ |
548 | | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') |
549 | | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1') |
550 | | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2') |
551 | | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3') |
| 548 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') |
| 549 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1') |
| 550 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2') |
| 551 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3') |
552 | 552 | PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED ) |
553 | 553 | |
554 | 554 | PORT_START("LINE4") /* Special KEY ROW for reset and Shift/'*' keys */ |
r253023 | r253024 | |
559 | 559 | |
560 | 560 | TIMER_DEVICE_CALLBACK_MEMBER(didact_state::scan_artwork) |
561 | 561 | { |
562 | | // LOG(("--->%s()\n", FUNCNAME)); |
| 562 | // LOG(("--->%s()\n", FUNCNAME)); |
563 | 563 | |
564 | 564 | // Poll the artwork Reset key |
565 | 565 | if ( (m_io_line4->read() & 0x04) ) |
r253023 | r253024 | |
567 | 567 | LOG( ("RESET is pressed, resetting the CPU\n") ); |
568 | 568 | m_shift = 0; |
569 | 569 | output().set_led_value(m_led, m_shift); // For mp68a only |
570 | | if (m_reset == 0) |
| 570 | if (m_reset == 0) |
571 | 571 | { |
572 | 572 | machine_reset(); |
573 | 573 | } |
574 | 574 | m_reset = 1; // Inhibit multiple resets |
575 | 575 | } |
576 | 576 | |
577 | | // Poll the artwork SHIFT/* key |
| 577 | // Poll the artwork SHIFT/* key |
578 | 578 | else if ( (m_io_line4->read() & 0x08) ) |
579 | 579 | { |
580 | 580 | LOG( ("%s", !m_shift ? "SHIFT is set\n" : "") ); |
r253023 | r253024 | |
631 | 631 | MACHINE_CONFIG_END |
632 | 632 | |
633 | 633 | static MACHINE_CONFIG_START( mp68a, mp68a_state ) |
634 | | // Clock source is based on a N9602N Dual Retriggerable Resettable Monostable Multivibrator oscillator at aprox 505KHz. |
| 634 | // Clock source is based on a N9602N Dual Retriggerable Resettable Monostable Multivibrator oscillator at aprox 505KHz. |
635 | 635 | // Trimpot seems broken/stuck at 5K Ohm thu. ROM code 1Ms delay loops suggest 1MHz+ |
636 | | MCFG_CPU_ADD("maincpu", M6800, 505000) |
| 636 | MCFG_CPU_ADD("maincpu", M6800, 505000) |
637 | 637 | MCFG_CPU_PROGRAM_MAP(mp68a_map) |
638 | 638 | MCFG_DEFAULT_LAYOUT(layout_mp68a) |
639 | 639 | |
r253023 | r253024 | |
646 | 646 | /* --init----------------------- */ |
647 | 647 | /* 0x0BAF 0x601 (Control A) = 0x30 - CA2 is low and enable DDRA */ |
648 | 648 | /* 0x0BB1 0x603 (Control B) = 0x30 - CB2 is low and enable DDRB */ |
649 | | /* 0x0BB5 0x600 (DDR A) = 0xFF - Port A all outputs and set to 0 (zero) */ |
650 | | /* 0x0BB9 0x602 (DDR B) = 0x50 - Port B two outputs and set to 0 (zero) */ |
| 649 | /* 0x0BB5 0x600 (DDR A) = 0xFF - Port A all outputs and set to 0 (zero) */ |
| 650 | /* 0x0BB9 0x602 (DDR B) = 0x50 - Port B two outputs and set to 0 (zero) */ |
651 | 651 | /* 0x0BBD 0x601 (Control A) = 0x34 - CA2 is low and lock DDRA */ |
652 | 652 | /* 0x0BBF 0x603 (Control B) = 0x34 - CB2 is low and lock DDRB */ |
653 | | /* 0x0BC3 0x602 (Port B) = 0x40 - Turn on display via RBI* on */ |
| 653 | /* 0x0BC3 0x602 (Port B) = 0x40 - Turn on display via RBI* on */ |
654 | 654 | /* --execution-wait for key loop-- */ |
655 | | /* 0x086B Update display sequnc, see below */ |
656 | | /* 0x0826 CB1 read = 0x603 (Control B) - is a key presssed? */ |
| 655 | /* 0x086B Update display sequnc, see below */ |
| 656 | /* 0x0826 CB1 read = 0x603 (Control B) - is a key presssed? */ |
657 | 657 | MCFG_PIA_WRITEPA_HANDLER(WRITE8(mp68a_state, pia2_kbA_w)) |
658 | 658 | MCFG_PIA_READPA_HANDLER(READ8(mp68a_state, pia2_kbA_r)) |
659 | 659 | MCFG_PIA_WRITEPB_HANDLER(WRITE8(mp68a_state, pia2_kbB_w)) |
r253023 | r253024 | |
663 | 663 | MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6800_cpu_device, irq_line)) /* Not used by ROM. Combined trace to CPU IRQ with IRQA */ |
664 | 664 | |
665 | 665 | /* Display - sequence outputting all '0':s at start */ |
666 | | /* 0x086B 0x600 (Port A) = 0x00 */ |
667 | | /* 0x086B 0x600 (Port A) = 0x70 */ |
668 | | /* 0x086B 0x600 (Port A) = 0x10 */ |
669 | | /* 0x086B 0x600 (Port A) = 0x70 */ |
670 | | /* 0x086B 0x600 (Port A) = 0x20 */ |
671 | | /* 0x086B 0x600 (Port A) = 0x70 */ |
672 | | /* 0x086B 0x600 (Port A) = 0x30 */ |
673 | | /* 0x086B 0x600 (Port A) = 0x70 */ |
674 | | /* 0x086B 0x600 (Port A) = 0x40 */ |
675 | | /* 0x086B 0x600 (Port A) = 0x70 */ |
676 | | /* 0x086B 0x600 (Port A) = 0x50 */ |
677 | | /* 0x086B 0x600 (Port A) = 0x70 */ |
| 666 | /* 0x086B 0x600 (Port A) = 0x00 */ |
| 667 | /* 0x086B 0x600 (Port A) = 0x70 */ |
| 668 | /* 0x086B 0x600 (Port A) = 0x10 */ |
| 669 | /* 0x086B 0x600 (Port A) = 0x70 */ |
| 670 | /* 0x086B 0x600 (Port A) = 0x20 */ |
| 671 | /* 0x086B 0x600 (Port A) = 0x70 */ |
| 672 | /* 0x086B 0x600 (Port A) = 0x30 */ |
| 673 | /* 0x086B 0x600 (Port A) = 0x70 */ |
| 674 | /* 0x086B 0x600 (Port A) = 0x40 */ |
| 675 | /* 0x086B 0x600 (Port A) = 0x70 */ |
| 676 | /* 0x086B 0x600 (Port A) = 0x50 */ |
| 677 | /* 0x086B 0x600 (Port A) = 0x70 */ |
678 | 678 | MCFG_DEVICE_ADD("digit0", DM9368, 0) |
679 | 679 | MCFG_OUTPUT_INDEX(0) |
680 | 680 | MCFG_DEVICE_ADD("digit1", DM9368, 0) |
r253023 | r253024 | |
715 | 715 | ROM_END |
716 | 716 | |
717 | 717 | // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS |
718 | | COMP( 1979, mp68a, 0, 0, mp68a, mp68a, driver_device, 0, "Didact AB", "mp68a", MACHINE_NO_SOUND_HW ) |
719 | | COMP( 1982, e100, 0, 0, e100, e100, driver_device, 0, "Didact AB", "Esselte 100", MACHINE_IS_SKELETON ) |
720 | | COMP( 1983, md6802, 0, 0, md6802, md6802, driver_device, 0, "Didact AB", "Mikrodator 6802", MACHINE_NO_SOUND_HW ) |
| 718 | COMP( 1979, mp68a, 0, 0, mp68a, mp68a, driver_device, 0, "Didact AB", "mp68a", MACHINE_NO_SOUND_HW ) |
| 719 | COMP( 1982, e100, 0, 0, e100, e100, driver_device, 0, "Didact AB", "Esselte 100", MACHINE_IS_SKELETON ) |
| 720 | COMP( 1983, md6802, 0, 0, md6802, md6802, driver_device, 0, "Didact AB", "Mikrodator 6802", MACHINE_NO_SOUND_HW ) |
trunk/src/mame/drivers/fastinvaders.cpp
r253023 | r253024 | |
36 | 36 | required_device<cpu_device> m_maincpu; |
37 | 37 | required_device<gfxdecode_device> m_gfxdecode; |
38 | 38 | required_shared_ptr<UINT8> m_videoram; |
39 | | |
| 39 | |
40 | 40 | optional_device<i8275_device> m_crtc8275; |
41 | 41 | optional_device<mc6845_device> m_crtc6845; |
42 | 42 | required_device<pic8259_device> m_pic8259; |
r253023 | r253024 | |
52 | 52 | UINT8 m_scudi; |
53 | 53 | UINT8 m_cannone; |
54 | 54 | UINT8 m_riga_inf; |
55 | | |
| 55 | |
56 | 56 | UINT8 m_irq0; |
57 | 57 | UINT8 m_irq1; |
58 | 58 | UINT8 m_irq2; |
r253023 | r253024 | |
61 | 61 | UINT8 m_irq5; |
62 | 62 | UINT8 m_irq6; |
63 | 63 | UINT8 m_irq7; |
64 | | |
65 | | |
| 64 | |
| 65 | |
66 | 66 | UINT8 m_start2_value; |
67 | 67 | UINT8 m_dma1; |
68 | 68 | UINT8 m_io_40; |
69 | 69 | UINT8 m_hsync; |
70 | | |
| 70 | |
71 | 71 | DECLARE_WRITE8_MEMBER(io_40_w); |
72 | | |
| 72 | |
73 | 73 | DECLARE_READ8_MEMBER(io_60_r); |
74 | 74 | DECLARE_WRITE8_MEMBER(io_70_w); |
75 | 75 | DECLARE_WRITE8_MEMBER(io_90_w); |
r253023 | r253024 | |
79 | 79 | DECLARE_WRITE8_MEMBER(io_d0_w); |
80 | 80 | DECLARE_WRITE8_MEMBER(io_e0_w); |
81 | 81 | DECLARE_WRITE8_MEMBER(io_f0_w); |
82 | | |
83 | | |
84 | | DECLARE_INPUT_CHANGED_MEMBER(coin_inserted); |
85 | | DECLARE_INPUT_CHANGED_MEMBER(start); |
86 | | DECLARE_INPUT_CHANGED_MEMBER(start2); |
87 | | DECLARE_INPUT_CHANGED_MEMBER(tilt); |
88 | | DECLARE_INPUT_CHANGED_MEMBER(in0); |
89 | | DECLARE_INPUT_CHANGED_MEMBER(in1); |
90 | | DECLARE_INPUT_CHANGED_MEMBER(in2); |
91 | | DECLARE_INPUT_CHANGED_MEMBER(in3); |
92 | | DECLARE_INPUT_CHANGED_MEMBER(in4); |
93 | | DECLARE_INPUT_CHANGED_MEMBER(in5); |
94 | | DECLARE_INPUT_CHANGED_MEMBER(in6); |
95 | | |
| 82 | |
| 83 | |
| 84 | DECLARE_INPUT_CHANGED_MEMBER(coin_inserted); |
| 85 | DECLARE_INPUT_CHANGED_MEMBER(start); |
| 86 | DECLARE_INPUT_CHANGED_MEMBER(start2); |
| 87 | DECLARE_INPUT_CHANGED_MEMBER(tilt); |
| 88 | DECLARE_INPUT_CHANGED_MEMBER(in0); |
| 89 | DECLARE_INPUT_CHANGED_MEMBER(in1); |
| 90 | DECLARE_INPUT_CHANGED_MEMBER(in2); |
| 91 | DECLARE_INPUT_CHANGED_MEMBER(in3); |
| 92 | DECLARE_INPUT_CHANGED_MEMBER(in4); |
| 93 | DECLARE_INPUT_CHANGED_MEMBER(in5); |
| 94 | DECLARE_INPUT_CHANGED_MEMBER(in6); |
| 95 | |
96 | 96 | DECLARE_READ_LINE_MEMBER(sid_read); |
97 | 97 | |
98 | | |
| 98 | |
99 | 99 | virtual void video_start() override; |
100 | 100 | |
101 | 101 | TIMER_DEVICE_CALLBACK_MEMBER(scanline_timer); |
r253023 | r253024 | |
107 | 107 | DECLARE_WRITE8_MEMBER(dark_1_clr); |
108 | 108 | DECLARE_WRITE8_MEMBER(dark_2_clr); |
109 | 109 | UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
110 | | |
111 | | |
| 110 | |
| 111 | |
112 | 112 | DECLARE_DRIVER_INIT(fi6845); |
113 | | |
| 113 | |
114 | 114 | }; |
115 | 115 | |
116 | 116 | |
117 | 117 | TIMER_DEVICE_CALLBACK_MEMBER(fastinvaders_state::scanline_timer) |
118 | 118 | { |
119 | | /* int scanline = param; |
| 119 | /* int scanline = param; |
120 | 120 | |
121 | 121 | |
122 | 122 | |
123 | 123 | |
124 | | if(scanline == 16){ |
125 | | //logerror("scanline\n"); |
126 | | m_dma8257->dreq1_w(0x01); |
127 | | m_dma8257->hlda_w(1); |
128 | | } |
129 | | */ |
| 124 | if(scanline == 16){ |
| 125 | //logerror("scanline\n"); |
| 126 | m_dma8257->dreq1_w(0x01); |
| 127 | m_dma8257->hlda_w(1); |
| 128 | } |
| 129 | */ |
130 | 130 | } |
131 | 131 | |
132 | 132 | TIMER_DEVICE_CALLBACK_MEMBER(fastinvaders_state::count_ar) |
133 | 133 | { |
134 | 134 | if (m_ar<255){ |
135 | | |
136 | 135 | m_riga_sup= ((m_prom[m_ar]&0x08)>>3)&0x01; |
137 | | m_scudi= ((m_prom[m_ar]&0x04)>>2)&0x01; |
138 | | m_cannone= ((m_prom[m_ar]&0x02)>>1)&0x01; |
| 136 | m_scudi= ((m_prom[m_ar]&0x04)>>2)&0x01; |
| 137 | m_cannone= ((m_prom[m_ar]&0x02)>>1)&0x01; |
139 | 138 | m_riga_inf= ((m_prom[m_ar]&0x01))&0x01; |
140 | 139 | //logerror("m_ar = %02X m_riga_sup %02X, m_scudi %02X, m_cannone %02X, m_riga_inf %02X\n",m_ar,m_riga_sup,m_scudi,m_cannone,m_riga_inf); |
141 | | |
| 140 | |
142 | 141 | if(m_riga_sup==0x01){ |
143 | 142 | if(((m_prom[m_ar-1]&0x08)>>3)==0x01){ |
144 | | //logerror(" DMA1 \n"); |
| 143 | //logerror(" DMA1 \n"); |
145 | 144 | //logerror("m_prom[m_ar]=%d m_prom[m_ar-1]= %d ar = %d r_s %d, sc %d, ca %d, ri %d\n",m_prom[m_ar],m_prom[m_ar-1],m_ar,m_riga_sup,m_scudi,m_cannone,m_riga_inf); |
146 | 145 | m_dma8257->dreq1_w(0x01); |
147 | 146 | m_dma8257->hlda_w(1); |
r253023 | r253024 | |
151 | 150 | } |
152 | 151 | m_ar++; |
153 | 152 | } |
154 | | |
| 153 | |
155 | 154 | if (m_av<255){ |
156 | 155 | m_av++; |
157 | 156 | //logerror("m_av=%02X\n",m_av); |
158 | 157 | if (m_av == m_io_40){ |
159 | 158 | if (m_hsync==1){ |
160 | | logerror(" DMA2 \n"); |
| 159 | logerror(" DMA2 \n"); |
161 | 160 | m_dma8257->dreq2_w(0x01); |
162 | 161 | m_dma8257->hlda_w(1); |
163 | 162 | //m_pic8259->ir3_w(HOLD_LINE); |
164 | 163 | } |
165 | | |
| 164 | |
166 | 165 | } |
167 | | } |
| 166 | } |
168 | 167 | } |
169 | 168 | |
170 | 169 | WRITE8_MEMBER(fastinvaders_state::dark_1_clr) |
r253023 | r253024 | |
176 | 175 | if(!data){ |
177 | 176 | m_dma1=0; |
178 | 177 | } |
179 | | |
| 178 | |
180 | 179 | //logerror("dma 1 clr\n"); |
181 | 180 | //m_maincpu->set_input_line(I8085_RST75_LINE, ASSERT_LINE); |
182 | 181 | //m_maincpu->set_input_line(I8085_RST75_LINE, CLEAR_LINE); |
r253023 | r253024 | |
190 | 189 | if(data){ |
191 | 190 | m_dma8257->dreq2_w(0x00); |
192 | 191 | } |
193 | | /* if(!data){ |
194 | | m_dma1=0; |
195 | | } |
196 | | */ |
| 192 | /* if(!data){ |
| 193 | m_dma1=0; |
| 194 | } |
| 195 | */ |
197 | 196 | } |
198 | 197 | |
199 | 198 | /*************************************************************************** |
r253023 | r253024 | |
231 | 230 | ); |
232 | 231 | |
233 | 232 | count++; |
234 | | |
| 233 | |
235 | 234 | } |
236 | 235 | |
237 | 236 | } |
r253023 | r253024 | |
256 | 255 | { |
257 | 256 | UINT8 tmp=0; |
258 | 257 | //0x60 ds6 input bit 0 DX or SX |
259 | | // bit 1 DX or SX |
260 | | // bit 2-7 dip switch |
| 258 | // bit 1 DX or SX |
| 259 | // bit 2-7 dip switch |
261 | 260 | |
262 | 261 | tmp=ioport("IN1")->read()&0x03; |
263 | 262 | tmp=tmp | (ioport("DSW1")->read()&0xfc); |
r253023 | r253024 | |
269 | 268 | |
270 | 269 | WRITE8_MEMBER(fastinvaders_state::io_70_w) |
271 | 270 | { |
272 | | //bit 0 rest55 clear |
| 271 | //bit 0 rest55 clear |
273 | 272 | //bit 1 rest65 clear |
274 | 273 | //bit 2 trap clear |
275 | | //bit 3 coin counter |
| 274 | //bit 3 coin counter |
276 | 275 | |
277 | 276 | //bit 4 irq0 clear |
278 | | //bit 5 8085 reset |
279 | | //bit 6 TODO |
280 | | //bit 7 both used TODO |
| 277 | //bit 5 8085 reset |
| 278 | //bit 6 TODO |
| 279 | //bit 7 both used TODO |
281 | 280 | |
282 | 281 | //IRQ clear |
283 | 282 | if (data&0x01){ |
r253023 | r253024 | |
285 | 284 | m_maincpu->set_input_line(I8085_RST55_LINE, CLEAR_LINE); |
286 | 285 | } |
287 | 286 | if (data&0x02){ |
288 | | |
289 | 287 | if (m_rest65){ |
290 | 288 | //logerror("clear"); |
291 | 289 | m_rest65=0; |
292 | 290 | m_maincpu->set_input_line(I8085_RST65_LINE, CLEAR_LINE); |
293 | 291 | } |
294 | | } |
| 292 | } |
295 | 293 | if (data&0x04){ |
296 | 294 | m_trap=0; |
297 | 295 | m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); |
298 | | } |
| 296 | } |
299 | 297 | if (data&0x10){ |
300 | 298 | m_irq0=0; |
301 | 299 | m_pic8259->ir0_w(CLEAR_LINE); |
302 | | } |
| 300 | } |
303 | 301 | |
304 | 302 | //self reset |
305 | 303 | if (data&0x20){ |
306 | 304 | logerror("RESET!!!!!\n"); |
307 | | } |
| 305 | } |
308 | 306 | |
309 | | |
| 307 | |
310 | 308 | //coin counter |
311 | | // if (data&0x08){ |
312 | | // coin_counter_w(machine(), offset,0x01); |
313 | | // } |
| 309 | // if (data&0x08){ |
| 310 | // coin_counter_w(machine(), offset,0x01); |
| 311 | // } |
314 | 312 | |
315 | 313 | } |
316 | 314 | |
r253023 | r253024 | |
355 | 353 | { |
356 | 354 | UINT8 tmp= m_start2_value ? ASSERT_LINE : CLEAR_LINE; |
357 | 355 | m_start2_value=0; |
358 | | return tmp; |
| 356 | return tmp; |
359 | 357 | } |
360 | 358 | |
361 | 359 | INPUT_CHANGED_MEMBER(fastinvaders_state::tilt) |
r253023 | r253024 | |
420 | 418 | INPUT_CHANGED_MEMBER(fastinvaders_state::in4) |
421 | 419 | { |
422 | 420 | m_irq4=1; |
423 | | if (newval) |
| 421 | if (newval) |
424 | 422 | m_pic8259->ir4_w(HOLD_LINE); |
425 | 423 | } |
426 | 424 | |
r253023 | r253024 | |
434 | 432 | INPUT_CHANGED_MEMBER(fastinvaders_state::in6) |
435 | 433 | { |
436 | 434 | m_irq6=1; |
437 | | if (newval) |
| 435 | if (newval) |
438 | 436 | m_pic8259->ir6_w(HOLD_LINE); |
439 | 437 | } |
440 | 438 | |
r253023 | r253024 | |
447 | 445 | if (!state){ |
448 | 446 | m_dma8257->dreq0_w(0x01); |
449 | 447 | m_dma8257->hlda_w(1); |
450 | | |
| 448 | |
451 | 449 | m_maincpu->set_input_line(I8085_RST75_LINE, ASSERT_LINE); |
452 | 450 | m_maincpu->set_input_line(I8085_RST75_LINE, CLEAR_LINE); |
453 | 451 | //machine().scheduler().abort_timeslice(); // transfer occurs immediately |
r253023 | r253024 | |
456 | 454 | } |
457 | 455 | |
458 | 456 | if (state){ |
459 | | |
460 | | } |
| 457 | } |
461 | 458 | } |
462 | 459 | |
463 | 460 | DECLARE_WRITE_LINE_MEMBER( fastinvaders_state::hsync) |
r253023 | r253024 | |
470 | 467 | |
471 | 468 | if (state){ |
472 | 469 | m_hsync=1; |
473 | | } |
| 470 | } |
474 | 471 | } |
475 | 472 | |
476 | 473 | |
r253023 | r253024 | |
503 | 500 | ***************************************************************************/ |
504 | 501 | |
505 | 502 | static ADDRESS_MAP_START( fastinvaders_map, AS_PROGRAM, 8, fastinvaders_state ) |
506 | | //AM_RANGE(0x0000, 0x1fff) AM_ROM AM_MIRROR(0x8000) |
507 | | AM_RANGE(0x0000, 0x27ff) AM_ROM AM_MIRROR(0x8000) |
| 503 | //AM_RANGE(0x0000, 0x1fff) AM_ROM AM_MIRROR(0x8000) |
| 504 | AM_RANGE(0x0000, 0x27ff) AM_ROM AM_MIRROR(0x8000) |
508 | 505 | AM_RANGE(0x2800, 0x2fff) AM_RAM AM_MIRROR(0x8000) AM_SHARE("videoram") |
509 | 506 | AM_RANGE(0x3000, 0x33ff) AM_RAM AM_MIRROR(0x8000) |
510 | 507 | ADDRESS_MAP_END |
r253023 | r253024 | |
517 | 514 | AM_RANGE(0x20, 0x20) AM_DEVWRITE("6845", mc6845_device, address_w) |
518 | 515 | AM_RANGE(0x21, 0x21) AM_DEVREADWRITE("6845", mc6845_device, register_r, register_w) |
519 | 516 | AM_RANGE(0x30, 0x33) AM_DEVREADWRITE("pic8259", pic8259_device, read, write) |
520 | | AM_RANGE(0x40, 0x4f) AM_WRITE(io_40_w) //ds4 //latch |
521 | | //AM_RANGE(0x50, 0x50) AM_READ(io_50_r) //ds5 //latch |
| 517 | AM_RANGE(0x40, 0x4f) AM_WRITE(io_40_w) //ds4 //latch |
| 518 | //AM_RANGE(0x50, 0x50) AM_READ(io_50_r) //ds5 //latch |
522 | 519 | AM_RANGE(0x60, 0x60) AM_READ(io_60_r) |
523 | | AM_RANGE(0x70, 0x70) AM_WRITE(io_70_w) //ds7 rest55,rest65,trap, irq0 clear |
524 | | AM_RANGE(0x80, 0x80) AM_NOP //ds8 write here a LOT ????? |
525 | | AM_RANGE(0x90, 0x90) AM_WRITE(io_90_w) //ds9 sound command |
526 | | AM_RANGE(0xa0, 0xa0) AM_WRITE(io_a0_w) //ds10 irq1 clear |
527 | | AM_RANGE(0xb0, 0xb0) AM_WRITE(io_b0_w) //ds11 irq2 clear |
528 | | AM_RANGE(0xc0, 0xc0) AM_WRITE(io_c0_w) //ds12 irq3 clear |
529 | | AM_RANGE(0xd0, 0xd0) AM_WRITE(io_d0_w) //ds13 irq5 clear |
530 | | AM_RANGE(0xe0, 0xe0) AM_WRITE(io_e0_w) //ds14 irq4 clear |
531 | | AM_RANGE(0xf0, 0xf0) AM_WRITE(io_f0_w) //ds15 irq6 clear |
532 | | |
| 520 | AM_RANGE(0x70, 0x70) AM_WRITE(io_70_w) //ds7 rest55,rest65,trap, irq0 clear |
| 521 | AM_RANGE(0x80, 0x80) AM_NOP //ds8 write here a LOT ????? |
| 522 | AM_RANGE(0x90, 0x90) AM_WRITE(io_90_w) //ds9 sound command |
| 523 | AM_RANGE(0xa0, 0xa0) AM_WRITE(io_a0_w) //ds10 irq1 clear |
| 524 | AM_RANGE(0xb0, 0xb0) AM_WRITE(io_b0_w) //ds11 irq2 clear |
| 525 | AM_RANGE(0xc0, 0xc0) AM_WRITE(io_c0_w) //ds12 irq3 clear |
| 526 | AM_RANGE(0xd0, 0xd0) AM_WRITE(io_d0_w) //ds13 irq5 clear |
| 527 | AM_RANGE(0xe0, 0xe0) AM_WRITE(io_e0_w) //ds14 irq4 clear |
| 528 | AM_RANGE(0xf0, 0xf0) AM_WRITE(io_f0_w) //ds15 irq6 clear |
| 529 | |
533 | 530 | AM_IMPORT_FROM(fastinvaders_io_base) |
534 | 531 | ADDRESS_MAP_END |
535 | 532 | |
536 | 533 | |
537 | 534 | static ADDRESS_MAP_START( fastinvaders_8275_io, AS_IO, 8, fastinvaders_state ) |
538 | | AM_RANGE( 0x20, 0x21 ) AM_DEVREADWRITE("8275", i8275_device, read, write) |
539 | | |
540 | | AM_RANGE(0x10, 0x1f) AM_DEVREADWRITE("dma8257", i8257_device, read, write) |
| 535 | AM_RANGE( 0x20, 0x21 ) AM_DEVREADWRITE("8275", i8275_device, read, write) |
| 536 | |
| 537 | AM_RANGE(0x10, 0x1f) AM_DEVREADWRITE("dma8257", i8257_device, read, write) |
541 | 538 | AM_RANGE(0x30, 0x33) AM_DEVREADWRITE("pic8259", pic8259_device, read, write) |
542 | | AM_RANGE(0x40, 0x4f) AM_WRITE(io_40_w) //ds4 //latch |
543 | | //AM_RANGE(0x50, 0x50) AM_READ(io_50_r) //ds5 //latch |
| 539 | AM_RANGE(0x40, 0x4f) AM_WRITE(io_40_w) //ds4 //latch |
| 540 | //AM_RANGE(0x50, 0x50) AM_READ(io_50_r) //ds5 //latch |
544 | 541 | AM_RANGE(0x60, 0x60) AM_READ(io_60_r) |
545 | | AM_RANGE(0x70, 0x70) AM_WRITE(io_70_w) //ds7 rest55,rest65,trap, irq0 clear |
546 | | AM_RANGE(0x80, 0x80) AM_NOP //write here a LOT |
547 | | //AM_RANGE(0x80, 0x80) AM_WRITE(io_80_w) //ds8 ???? |
548 | | AM_RANGE(0x90, 0x90) AM_WRITE(io_90_w) //ds9 sound command |
549 | | AM_RANGE(0xa0, 0xa0) AM_WRITE(io_a0_w) //ds10 irq1 clear |
550 | | AM_RANGE(0xb0, 0xb0) AM_WRITE(io_b0_w) //ds11 irq2 clear |
551 | | AM_RANGE(0xc0, 0xc0) AM_WRITE(io_c0_w) //ds12 irq3 clear |
552 | | AM_RANGE(0xd0, 0xd0) AM_WRITE(io_d0_w) //ds13 irq5 clear |
553 | | AM_RANGE(0xe0, 0xe0) AM_WRITE(io_e0_w) //ds14 irq4 clear |
554 | | AM_RANGE(0xf0, 0xf0) AM_WRITE(io_f0_w) //ds15 irq6 clear |
| 542 | AM_RANGE(0x70, 0x70) AM_WRITE(io_70_w) //ds7 rest55,rest65,trap, irq0 clear |
| 543 | AM_RANGE(0x80, 0x80) AM_NOP //write here a LOT |
| 544 | //AM_RANGE(0x80, 0x80) AM_WRITE(io_80_w) //ds8 ???? |
| 545 | AM_RANGE(0x90, 0x90) AM_WRITE(io_90_w) //ds9 sound command |
| 546 | AM_RANGE(0xa0, 0xa0) AM_WRITE(io_a0_w) //ds10 irq1 clear |
| 547 | AM_RANGE(0xb0, 0xb0) AM_WRITE(io_b0_w) //ds11 irq2 clear |
| 548 | AM_RANGE(0xc0, 0xc0) AM_WRITE(io_c0_w) //ds12 irq3 clear |
| 549 | AM_RANGE(0xd0, 0xd0) AM_WRITE(io_d0_w) //ds13 irq5 clear |
| 550 | AM_RANGE(0xe0, 0xe0) AM_WRITE(io_e0_w) //ds14 irq4 clear |
| 551 | AM_RANGE(0xf0, 0xf0) AM_WRITE(io_f0_w) //ds15 irq6 clear |
555 | 552 | AM_IMPORT_FROM(fastinvaders_io_base) |
556 | 553 | ADDRESS_MAP_END |
557 | 554 | |
r253023 | r253024 | |
565 | 562 | |
566 | 563 | static INPUT_PORTS_START( fastinvaders ) |
567 | 564 | |
568 | | PORT_START("COIN") /* FAKE async input */ |
569 | | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state, coin_inserted, 0) //I8085_RST65_LINE |
570 | | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state, start, 0) //I8085_RST55_LINE |
571 | | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state, start2, 0) //I8085_RST55_LINE |
572 | | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Z) PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,in0, 0) // int0, sparo |
573 | | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_X) PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,tilt, 0) //INPUT_LINE_NMI tilt |
574 | | |
| 565 | PORT_START("COIN") /* FAKE async input */ |
| 566 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state, coin_inserted, 0) //I8085_RST65_LINE |
| 567 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state, start, 0) //I8085_RST55_LINE |
| 568 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state, start2, 0) //I8085_RST55_LINE |
| 569 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Z) PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,in0, 0) // int0, sparo |
| 570 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_X) PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,tilt, 0) //INPUT_LINE_NMI tilt |
575 | 571 | |
| 572 | |
576 | 573 | PORT_START("IN0") |
577 | | |
| 574 | |
578 | 575 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_S) PORT_NAME("1") PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,in1, 0) |
579 | 576 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_D) PORT_NAME("2") PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,in2, 0) |
580 | 577 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_F) PORT_NAME("3") PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,in3, 0) |
581 | 578 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_G) PORT_NAME("4") PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,in4, 0) |
582 | 579 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_H) PORT_NAME("5") PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,in5, 0) |
583 | 580 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_J) PORT_NAME("6") PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,in6, 0) |
584 | | |
585 | | |
586 | | PORT_START("IN1") //0x60 io port |
| 581 | |
| 582 | |
| 583 | PORT_START("IN1") //0x60 io port |
587 | 584 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL |
588 | 585 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL |
589 | 586 | |
590 | | |
591 | | PORT_START("DSW1") //0x60 io port |
| 587 | |
| 588 | PORT_START("DSW1") //0x60 io port |
592 | 589 | PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) |
593 | 590 | PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) |
594 | 591 | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
r253023 | r253024 | |
598 | 595 | PORT_DIPNAME( 0xf0, 0x80, "Ships/lives number" ) |
599 | 596 | PORT_DIPSETTING( 0x10, "1 Ship" ) |
600 | 597 | PORT_DIPSETTING( 0x20, "2 Ships" ) |
601 | | PORT_DIPSETTING( 0x30, "3 Ships" ) |
| 598 | PORT_DIPSETTING( 0x30, "3 Ships" ) |
602 | 599 | PORT_DIPSETTING( 0x40, "4 Ships" ) |
603 | | PORT_DIPSETTING( 0x50, "5 Ships" ) |
604 | | PORT_DIPSETTING( 0x60, "6 Ships" ) |
605 | | PORT_DIPSETTING( 0x70, "7 Ships" ) |
606 | | PORT_DIPSETTING( 0x80, "8 Ships" ) |
607 | | PORT_DIPSETTING( 0x90, "9 Ships" ) |
608 | | |
| 600 | PORT_DIPSETTING( 0x50, "5 Ships" ) |
| 601 | PORT_DIPSETTING( 0x60, "6 Ships" ) |
| 602 | PORT_DIPSETTING( 0x70, "7 Ships" ) |
| 603 | PORT_DIPSETTING( 0x80, "8 Ships" ) |
| 604 | PORT_DIPSETTING( 0x90, "9 Ships" ) |
609 | 605 | |
610 | | |
| 606 | |
| 607 | |
611 | 608 | INPUT_PORTS_END |
612 | 609 | |
613 | 610 | |
r253023 | r253024 | |
637 | 634 | /* basic machine hardware */ |
638 | 635 | MCFG_CPU_ADD("maincpu", I8085A, 6144100/2 ) // 6144100 Xtal /2 internaly |
639 | 636 | MCFG_CPU_PROGRAM_MAP(fastinvaders_map) |
640 | | // MCFG_CPU_IO_MAP(fastinvaders_io_map) |
641 | | // MCFG_CPU_VBLANK_INT_DRIVER("screen", fastinvaders_state, irq0_line_hold) |
642 | | MCFG_I8085A_SID(READLINE(fastinvaders_state, sid_read)) |
| 637 | // MCFG_CPU_IO_MAP(fastinvaders_io_map) |
| 638 | // MCFG_CPU_VBLANK_INT_DRIVER("screen", fastinvaders_state, irq0_line_hold) |
| 639 | MCFG_I8085A_SID(READLINE(fastinvaders_state, sid_read)) |
643 | 640 | MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259", pic8259_device, inta_cb) |
644 | 641 | MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", fastinvaders_state, scanline_timer, "screen", 0, 1) |
645 | | |
| 642 | |
646 | 643 | MCFG_PIC8259_ADD( "pic8259", INPUTLINE("maincpu", 0), VCC, NULL) |
647 | 644 | |
648 | 645 | MCFG_DEVICE_ADD("dma8257", I8257, 6144100) |
r253023 | r253024 | |
650 | 647 | MCFG_I8257_OUT_MEMW_CB(WRITE8(fastinvaders_state, memory_write_byte)) |
651 | 648 | MCFG_I8257_OUT_DACK_1_CB(WRITE8(fastinvaders_state, dark_1_clr)) |
652 | 649 | MCFG_I8257_OUT_DACK_2_CB(WRITE8(fastinvaders_state, dark_2_clr)) |
653 | | |
654 | | |
| 650 | |
| 651 | |
655 | 652 | MCFG_TIMER_DRIVER_ADD_PERIODIC("count_ar", fastinvaders_state, count_ar, attotime::from_hz(11500000/2)) |
656 | | |
| 653 | |
657 | 654 | /* video hardware */ |
658 | 655 | MCFG_SCREEN_ADD("screen", RASTER) |
659 | 656 | MCFG_SCREEN_REFRESH_RATE(60) |
660 | 657 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) |
661 | | MCFG_SCREEN_SIZE(64*16, 32*16) |
662 | | MCFG_SCREEN_VISIBLE_AREA(0*16, 40*16-1, 0*14, 19*14-1) |
| 658 | MCFG_SCREEN_SIZE(64*16, 32*16) |
| 659 | MCFG_SCREEN_VISIBLE_AREA(0*16, 40*16-1, 0*14, 19*14-1) |
663 | 660 | MCFG_SCREEN_UPDATE_DRIVER(fastinvaders_state, screen_update) |
664 | 661 | MCFG_SCREEN_PALETTE("palette") |
665 | 662 | |
r253023 | r253024 | |
673 | 670 | static MACHINE_CONFIG_DERIVED( fastinvaders_8275, fastinvaders ) |
674 | 671 | MCFG_CPU_MODIFY("maincpu" ) // guess |
675 | 672 | MCFG_CPU_IO_MAP(fastinvaders_8275_io) |
676 | | |
| 673 | |
677 | 674 | MCFG_DEVICE_ADD("8275", I8275, 10000000 ) /* guess */ // does not configure a very useful resolution(!) |
678 | 675 | MCFG_I8275_CHARACTER_WIDTH(16) |
679 | | // MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(apogee_state, display_pixels) |
680 | | // MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma8257",i8257_device, dreq2_w)) |
| 676 | // MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(apogee_state, display_pixels) |
| 677 | // MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma8257",i8257_device, dreq2_w)) |
681 | 678 | MACHINE_CONFIG_END |
682 | 679 | |
683 | 680 | static MACHINE_CONFIG_DERIVED( fastinvaders_6845, fastinvaders ) |
r253023 | r253024 | |
736 | 733 | ROM_LOAD( "R2.2A", 0x2400, 0x0200, CRC(f446ef0d) SHA1(2be337c1197d14e5ffc33ea05b5262f1ea17d442) ) |
737 | 734 | ROM_LOAD( "R2.2B", 0x2600, 0x0200, CRC(b97e35a3) SHA1(0878a83c7f9f0645749fdfb1ff372d0e04833c9e) ) |
738 | 735 | |
739 | | |
| 736 | |
740 | 737 | ROM_REGION( 0x0c00, "gfx1", 0 ) |
741 | 738 | ROM_LOAD( "C2.1F", 0x0000, 0x0200, CRC(9feca88a) SHA1(14a8c46eb51eed01b7b537a9931cd092cec2019f) ) |
742 | 739 | ROM_LOAD( "C2.1G", 0x0200, 0x0200, CRC(79fc3963) SHA1(25651d1031895a01a2a4751b355ff1200a899ac5) ) |
r253023 | r253024 | |
744 | 741 | ROM_LOAD( "C2.2F", 0x0600, 0x0200, CRC(3bb16f55) SHA1(b1cc1e2346acd0e5c84861b414b4677871079844) ) |
745 | 742 | ROM_LOAD( "C2.2G", 0x0800, 0x0200, CRC(19828c47) SHA1(f215ce55be32b3564e1b7cc19500d38a93117051) ) |
746 | 743 | ROM_LOAD( "C2.2H", 0x0a00, 0x0200, CRC(284ae4eb) SHA1(6e28fcd9d481d37f47728f22f6048b29266f4346) ) |
747 | | |
| 744 | |
748 | 745 | ROM_REGION( 0x0100, "prom", 0 ) |
749 | 746 | ROM_LOAD( "93427.bin", 0x0000, 0x0100, CRC(f59c8573) SHA1(5aed4866abe1690fd0f088af1cfd99b3c85afe9a) ) |
750 | 747 | ROM_END |
r253023 | r253024 | |
774 | 771 | ROM_LOAD( "C1.1A", 0x0600, 0x0200, CRC(3bb16f55) SHA1(b1cc1e2346acd0e5c84861b414b4677871079844) ) |
775 | 772 | ROM_LOAD( "C1.2A", 0x0800, 0x0200, CRC(19828c47) SHA1(f215ce55be32b3564e1b7cc19500d38a93117051) ) |
776 | 773 | ROM_LOAD( "C1.3A", 0x0a00, 0x0200, CRC(284ae4eb) SHA1(6e28fcd9d481d37f47728f22f6048b29266f4346) ) |
777 | | |
| 774 | |
778 | 775 | ROM_REGION( 0x0100, "prom", 0 ) |
779 | 776 | ROM_LOAD( "93427.bin", 0x0000, 0x0100, CRC(f59c8573) SHA1(5aed4866abe1690fd0f088af1cfd99b3c85afe9a) ) |
780 | 777 | ROM_END |
781 | 778 | |
782 | | /* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS*/ |
| 779 | /* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS*/ |
783 | 780 | GAME( 1979, fi6845, 0, fastinvaders_6845, fastinvaders, fastinvaders_state, fi6845, ROT270, "Fiberglass", "Fast Invaders (6845 version)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) |
784 | | GAME( 1979, fi8275, fi6845, fastinvaders_8275, fastinvaders, fastinvaders_state,fi6845, ROT270, "Fiberglass", "Fast Invaders (8275 version)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) |
| | No newline at end of file |
| 781 | GAME( 1979, fi8275, fi6845, fastinvaders_8275, fastinvaders, fastinvaders_state,fi6845, ROT270, "Fiberglass", "Fast Invaders (8275 version)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) |
trunk/src/mame/drivers/gkigt.cpp
r253023 | r253024 | |
45 | 45 | MULTIMEDIA LITE boards: |
46 | 46 | Multimedia Lite 1 - uses up to 4MB on EPROMs to store sound |
47 | 47 | Multimedia Lite 2 - uses up to 16MB of SIMM to store sound |
48 | | |
| 48 | |
49 | 49 | Boards contain: |
50 | 50 | Custom programmed Cypress CY37032-125JC CPLD |
51 | 51 | 32 Macrocells |
r253023 | r253024 | |
108 | 108 | { |
109 | 109 | return rand(); |
110 | 110 | }; |
111 | | |
112 | 111 | |
| 112 | |
113 | 113 | }; |
114 | 114 | |
115 | 115 | static INPUT_PORTS_START( igt_gameking ) |
r253023 | r253024 | |
140 | 140 | AM_RANGE(0x00000000, 0x0007ffff) AM_ROM |
141 | 141 | AM_RANGE(0x08000000, 0x081fffff) AM_ROM AM_REGION("game", 0) |
142 | 142 | |
143 | | AM_RANGE(0x10000000, 0x1000001f) AM_RAM |
| 143 | AM_RANGE(0x10000000, 0x1000001f) AM_RAM |
144 | 144 | AM_RANGE(0x10000020, 0x1000021f) AM_RAM // strange range to test, correct or CPU issue? |
145 | | AM_RANGE(0x10000220, 0x1003ffff) AM_RAM |
| 145 | AM_RANGE(0x10000220, 0x1003ffff) AM_RAM |
146 | 146 | |
147 | 147 | AM_RANGE(0x28010008, 0x2801000b) AM_READ(igt_gk_28010008_r) |
148 | 148 | AM_RANGE(0x28030000, 0x28030003) AM_READ(igt_gk_28030000_r) |
149 | 149 | |
150 | | |
151 | 150 | |
| 151 | |
152 | 152 | ADDRESS_MAP_END |
153 | 153 | |
154 | 154 | static const gfx_layout igt_gameking_layout = |
r253023 | r253024 | |
174 | 174 | /* basic machine hardware */ |
175 | 175 | MCFG_CPU_ADD("maincpu", I960, 20000000) // ?? Mhz |
176 | 176 | MCFG_CPU_PROGRAM_MAP(igt_gameking_mem) |
177 | | |
178 | 177 | |
| 178 | |
179 | 179 | MCFG_GFXDECODE_ADD("gfxdecode", "palette", igt_gameking) |
180 | 180 | |
181 | 181 | MCFG_SCREEN_ADD("screen", RASTER) |
r253023 | r253024 | |
201 | 201 | |
202 | 202 | ROM_START( gkigt4 ) |
203 | 203 | ROM_REGION( 0x80000, "maincpu", 0 ) |
204 | | ROM_LOAD( "M0000527 BASE (1-4002).bin", 0x00000, 0x80000, CRC(73981260) SHA1(24b42ae2796034815d35294efe0ac3d5c33100bd) ) |
| 204 | ROM_LOAD( "M0000527 BASE (1-4002).bin", 0x00000, 0x80000, CRC(73981260) SHA1(24b42ae2796034815d35294efe0ac3d5c33100bd) ) |
205 | 205 | |
206 | 206 | ROM_REGION32_LE( 0x200000, "game", 0 ) |
207 | | ROM_LOAD16_BYTE( "G0001777 GME1 1 of 2 (2-80).bin", 0x000000, 0x100000, CRC(99d5829d) SHA1(b2ec16f35503ba6a0a41221fb3f52c5d2223ad79) ) |
208 | | ROM_LOAD16_BYTE( "G0001777 GME2 2 of 2 (2-80).bin", 0x000001, 0x100000, CRC(3b7dfcc0) SHA1(2aeb35125c4320ba3198c44418c90fa6fd6270a9) ) |
| 207 | ROM_LOAD16_BYTE( "G0001777 GME1 1 of 2 (2-80).bin", 0x000000, 0x100000, CRC(99d5829d) SHA1(b2ec16f35503ba6a0a41221fb3f52c5d2223ad79) ) |
| 208 | ROM_LOAD16_BYTE( "G0001777 GME2 2 of 2 (2-80).bin", 0x000001, 0x100000, CRC(3b7dfcc0) SHA1(2aeb35125c4320ba3198c44418c90fa6fd6270a9) ) |
209 | 209 | |
210 | 210 | ROM_REGION( 0x100000, "cg", 0 ) |
211 | | ROM_LOAD16_BYTE( "C0000330 CG1 1 of 4 (2-40).bin", 0x000000, 0x80000, CRC(b92b8aa4) SHA1(05a1feac4012a73777eb28ab6e66e1dcadb9430f) ) |
212 | | ROM_LOAD16_BYTE( "C0000330 CG2 2 of 4 (2-40).bin", 0x000001, 0x80000, CRC(4e0560b5) SHA1(109f0bd47cfb0ed593fc34c5904bc639b0097d12)) |
| 211 | ROM_LOAD16_BYTE( "C0000330 CG1 1 of 4 (2-40).bin", 0x000000, 0x80000, CRC(b92b8aa4) SHA1(05a1feac4012a73777eb28ab6e66e1dcadb9430f) ) |
| 212 | ROM_LOAD16_BYTE( "C0000330 CG2 2 of 4 (2-40).bin", 0x000001, 0x80000, CRC(4e0560b5) SHA1(109f0bd47cfb0ed593fc34c5904bc639b0097d12)) |
213 | 213 | |
214 | 214 | ROM_REGION( 0x200000, "plx", 0 ) |
215 | | ROM_LOAD16_BYTE( "C0000330 PLX1 3 of 4 (2-80).bin", 0x000000, 0x100000, CRC(806ec7d4) SHA1(b9263f942b3d7101797bf87ad18cfddac9582791) ) |
216 | | ROM_LOAD16_BYTE( "C0000330 PLX2 4 of 4 (2-80).bin", 0x000001, 0x100000, CRC(c4ce5dc5) SHA1(cc5d090e88551550787b87d80aafe18ee1661dd7) ) |
| 215 | ROM_LOAD16_BYTE( "C0000330 PLX1 3 of 4 (2-80).bin", 0x000000, 0x100000, CRC(806ec7d4) SHA1(b9263f942b3d7101797bf87ad18cfddac9582791) ) |
| 216 | ROM_LOAD16_BYTE( "C0000330 PLX2 4 of 4 (2-80).bin", 0x000001, 0x100000, CRC(c4ce5dc5) SHA1(cc5d090e88551550787b87d80aafe18ee1661dd7) ) |
217 | 217 | |
218 | 218 | ROM_REGION( 0x200000, "snd", 0 ) |
219 | | ROM_LOAD( "SWC00046 SND1 1 of 2 (2-80).rom1", 0x000000, 0x100000, CRC(8213aeac) SHA1(4beff02fed64e607270e0e8e322a96f112bd2093) ) |
220 | | ROM_LOAD( "SWC00046 SND2 2 of 2 (2-80).rom2", 0x100000, 0x100000, CRC(a7ef9b46) SHA1(031373fb8e39c4ed828a58bb63a9395a205c6b6b) ) |
| 219 | ROM_LOAD( "SWC00046 SND1 1 of 2 (2-80).rom1", 0x000000, 0x100000, CRC(8213aeac) SHA1(4beff02fed64e607270e0e8e322a96f112bd2093) ) |
| 220 | ROM_LOAD( "SWC00046 SND2 2 of 2 (2-80).rom2", 0x100000, 0x100000, CRC(a7ef9b46) SHA1(031373fb8e39c4ed828a58bb63a9395a205c6b6b) ) |
221 | 221 | ROM_END |
222 | 222 | |
223 | 223 | |
224 | 224 | |
225 | 225 | ROM_START( gkigt4ms ) |
226 | 226 | ROM_REGION( 0x80000, "maincpu", 0 ) |
227 | | ROM_LOAD( "M000526 BASE (1-4002) MS.u39", 0x00000, 0x80000, CRC(4d095df5) SHA1(bd0cdc4c1b07ef2723ba22b14abaf581b017f190) ) |
| 227 | ROM_LOAD( "M000526 BASE (1-4002) MS.u39", 0x00000, 0x80000, CRC(4d095df5) SHA1(bd0cdc4c1b07ef2723ba22b14abaf581b017f190) ) |
228 | 228 | |
229 | 229 | ROM_REGION32_LE( 0x200000, "game", 0 ) // same as gkigt4 |
230 | | ROM_LOAD16_BYTE( "G0001777 GME1 1 of 2 (2-80).bin", 0x000000, 0x100000, CRC(99d5829d) SHA1(b2ec16f35503ba6a0a41221fb3f52c5d2223ad79) ) |
231 | | ROM_LOAD16_BYTE( "G0001777 GME2 2 of 2 (2-80).bin", 0x000001, 0x100000, CRC(3b7dfcc0) SHA1(2aeb35125c4320ba3198c44418c90fa6fd6270a9) ) |
| 230 | ROM_LOAD16_BYTE( "G0001777 GME1 1 of 2 (2-80).bin", 0x000000, 0x100000, CRC(99d5829d) SHA1(b2ec16f35503ba6a0a41221fb3f52c5d2223ad79) ) |
| 231 | ROM_LOAD16_BYTE( "G0001777 GME2 2 of 2 (2-80).bin", 0x000001, 0x100000, CRC(3b7dfcc0) SHA1(2aeb35125c4320ba3198c44418c90fa6fd6270a9) ) |
232 | 232 | |
233 | 233 | ROM_REGION( 0x100000, "cg", 0 ) |
234 | | ROM_LOAD16_BYTE( "C000351 CG1 1 of 4 (2-40) MS.u30", 0x000000, 0x80000, CRC(2e841b28) SHA1(492b54e092b0d4028fd8edcb981bd1fd25dca47d) ) |
235 | | ROM_LOAD16_BYTE( "C000351 CG2 2 of 4 (2-40) MS.u53", 0x000001, 0x80000, CRC(673fc86c) SHA1(4d844330c5602d725253b4f78781fa9e213b8556) ) |
| 234 | ROM_LOAD16_BYTE( "C000351 CG1 1 of 4 (2-40) MS.u30", 0x000000, 0x80000, CRC(2e841b28) SHA1(492b54e092b0d4028fd8edcb981bd1fd25dca47d) ) |
| 235 | ROM_LOAD16_BYTE( "C000351 CG2 2 of 4 (2-40) MS.u53", 0x000001, 0x80000, CRC(673fc86c) SHA1(4d844330c5602d725253b4f78781fa9e213b8556) ) |
236 | 236 | |
237 | 237 | ROM_REGION( 0x200000, "plx", 0 ) |
238 | | ROM_LOAD16_BYTE( "C000351 PXL1 3 of 4 (2-80) MS.u14", 0x000000, 0x100000, CRC(438fb625) SHA1(369c860dffa323c2e9be155da1989252f6b0e694) ) |
239 | | ROM_LOAD16_BYTE( "C000351 PXL2 4 of 4 (2-80) MS.u37", 0x000001, 0x100000, CRC(22ec9c65) SHA1(bd944ae79faa8ceb73ed8f6f244fce6ff543ccd1) ) |
| 238 | ROM_LOAD16_BYTE( "C000351 PXL1 3 of 4 (2-80) MS.u14", 0x000000, 0x100000, CRC(438fb625) SHA1(369c860dffa323c2e9be155da1989252f6b0e694) ) |
| 239 | ROM_LOAD16_BYTE( "C000351 PXL2 4 of 4 (2-80) MS.u37", 0x000001, 0x100000, CRC(22ec9c65) SHA1(bd944ae79faa8ceb73ed8f6f244fce6ff543ccd1) ) |
240 | 240 | |
241 | 241 | ROM_REGION( 0x200000, "snd", 0 ) // same as gkigt4 |
242 | | ROM_LOAD( "SWC00046 SND1 1 of 2 (2-80).rom1", 0x000000, 0x100000, CRC(8213aeac) SHA1(4beff02fed64e607270e0e8e322a96f112bd2093) ) |
243 | | ROM_LOAD( "SWC00046 SND2 2 of 2 (2-80).rom2", 0x100000, 0x100000, CRC(a7ef9b46) SHA1(031373fb8e39c4ed828a58bb63a9395a205c6b6b) ) |
| 242 | ROM_LOAD( "SWC00046 SND1 1 of 2 (2-80).rom1", 0x000000, 0x100000, CRC(8213aeac) SHA1(4beff02fed64e607270e0e8e322a96f112bd2093) ) |
| 243 | ROM_LOAD( "SWC00046 SND2 2 of 2 (2-80).rom2", 0x100000, 0x100000, CRC(a7ef9b46) SHA1(031373fb8e39c4ed828a58bb63a9395a205c6b6b) ) |
244 | 244 | ROM_END |
245 | 245 | |
246 | 246 | ROM_START( gkigt43 ) |
247 | 247 | ROM_REGION( 0x80000, "maincpu", 0 ) |
248 | | ROM_LOAD( "M0000837 BASE (1-4002).bin", 0x00000, 0x80000, CRC(98841e5c) SHA1(3b04bc9bc170cfcc6145dc601a63bd1394a62897) ) |
| 248 | ROM_LOAD( "M0000837 BASE (1-4002).bin", 0x00000, 0x80000, CRC(98841e5c) SHA1(3b04bc9bc170cfcc6145dc601a63bd1394a62897) ) |
249 | 249 | |
250 | 250 | ROM_REGION32_LE( 0x200000, "game", 0 ) |
251 | | ROM_LOAD16_BYTE( "G0002142 GME1 1 of 2 (2-80).bin", 0x000000, 0x100000, CRC(704ef406) SHA1(3f8f719342874243d479011372786a9b6b14f5b1) ) |
252 | | ROM_LOAD16_BYTE( "G0002142 GME2 2 of 2 (2-80).bin", 0x000001, 0x100000, CRC(3a576a75) SHA1(d2de1b61808412fb2fe68400387dcdcb7910a770) ) |
| 251 | ROM_LOAD16_BYTE( "G0002142 GME1 1 of 2 (2-80).bin", 0x000000, 0x100000, CRC(704ef406) SHA1(3f8f719342874243d479011372786a9b6b14f5b1) ) |
| 252 | ROM_LOAD16_BYTE( "G0002142 GME2 2 of 2 (2-80).bin", 0x000001, 0x100000, CRC(3a576a75) SHA1(d2de1b61808412fb2fe68400387dcdcb7910a770) ) |
253 | 253 | |
254 | 254 | ROM_REGION( 0x100000, "cg", 0 ) |
255 | | ROM_LOAD16_BYTE( "C0000793 CG1 1 of 4 (2-40).bin", 0x000000, 0x80000, CRC(582137cc) SHA1(66686a2332a3844f816cf7e988a346f5f593d8f6) ) |
256 | | ROM_LOAD16_BYTE( "C0000793 CG2 2 of 4 (2-40).bin", 0x000001, 0x80000, CRC(5e0b6310) SHA1(4bf718dc9859e8c10c9dca967185c57738249319) ) |
| 255 | ROM_LOAD16_BYTE( "C0000793 CG1 1 of 4 (2-40).bin", 0x000000, 0x80000, CRC(582137cc) SHA1(66686a2332a3844f816cf7e988a346f5f593d8f6) ) |
| 256 | ROM_LOAD16_BYTE( "C0000793 CG2 2 of 4 (2-40).bin", 0x000001, 0x80000, CRC(5e0b6310) SHA1(4bf718dc9859e8c10c9dca967185c57738249319) ) |
257 | 257 | |
258 | 258 | ROM_REGION( 0x200000, "plx", 0 ) |
259 | | ROM_LOAD16_BYTE( "C0000793 PLX1 3 of 4 (2-80).bin", 0x000000, 0x100000, CRC(6327a76e) SHA1(01ad5747788389d3d9d71a1c37472d33db3ba5fb) ) |
260 | | ROM_LOAD16_BYTE( "C0000793 PLX2 4 of 4 (2-80).bin", 0x000001, 0x100000, CRC(5a400e90) SHA1(c01be47d03e9ec418d0e4e1293fcf2c890301430) ) |
| 259 | ROM_LOAD16_BYTE( "C0000793 PLX1 3 of 4 (2-80).bin", 0x000000, 0x100000, CRC(6327a76e) SHA1(01ad5747788389d3d9d71a1c37472d33db3ba5fb) ) |
| 260 | ROM_LOAD16_BYTE( "C0000793 PLX2 4 of 4 (2-80).bin", 0x000001, 0x100000, CRC(5a400e90) SHA1(c01be47d03e9ec418d0e4e1293fcf2c890301430) ) |
261 | 261 | |
262 | 262 | ROM_REGION( 0x200000, "snd", 0 ) // same as gkigt4 |
263 | | ROM_LOAD( "SWC00046 SND1 1 of 2 (2-80).rom1", 0x000000, 0x100000, CRC(8213aeac) SHA1(4beff02fed64e607270e0e8e322a96f112bd2093) ) |
264 | | ROM_LOAD( "SWC00046 SND2 2 of 2 (2-80).rom2", 0x100000, 0x100000, CRC(a7ef9b46) SHA1(031373fb8e39c4ed828a58bb63a9395a205c6b6b) ) |
| 263 | ROM_LOAD( "SWC00046 SND1 1 of 2 (2-80).rom1", 0x000000, 0x100000, CRC(8213aeac) SHA1(4beff02fed64e607270e0e8e322a96f112bd2093) ) |
| 264 | ROM_LOAD( "SWC00046 SND2 2 of 2 (2-80).rom2", 0x100000, 0x100000, CRC(a7ef9b46) SHA1(031373fb8e39c4ed828a58bb63a9395a205c6b6b) ) |
265 | 265 | ROM_END |
266 | 266 | |
267 | 267 | ROM_START( gkigt43n ) |
268 | 268 | ROM_REGION( 0x80000, "maincpu", 0 ) |
269 | | ROM_LOAD( "M0000811 BASE (1-4002) NJ.bin", 0x00000, 0x80000, CRC(4c659923) SHA1(4624179320cb284516980e2d3caea6fd45c3f967) ) |
| 269 | ROM_LOAD( "M0000811 BASE (1-4002) NJ.bin", 0x00000, 0x80000, CRC(4c659923) SHA1(4624179320cb284516980e2d3caea6fd45c3f967) ) |
270 | 270 | |
271 | 271 | ROM_REGION32_LE( 0x200000, "game", 0 ) |
272 | | ROM_LOAD16_BYTE( "G0001624 GME1 1 of 2 (2-80) NJ.bin", 0x000000, 0x100000, CRC(4aa4139b) SHA1(c3e13c84cc13d44de90a03d0b5d45f46d4f794ce) ) |
273 | | ROM_LOAD16_BYTE( "G0001624 GME2 2 of 2 (2-80) NJ.bin", 0x000001, 0x100000, CRC(5b3bb8bf) SHA1(271131f06944074bedab7fe7c80fce1e2136c385) ) |
| 272 | ROM_LOAD16_BYTE( "G0001624 GME1 1 of 2 (2-80) NJ.bin", 0x000000, 0x100000, CRC(4aa4139b) SHA1(c3e13c84cc13d44de90a03d0b5d45f46d4f794ce) ) |
| 273 | ROM_LOAD16_BYTE( "G0001624 GME2 2 of 2 (2-80) NJ.bin", 0x000001, 0x100000, CRC(5b3bb8bf) SHA1(271131f06944074bedab7fe7c80fce1e2136c385) ) |
274 | 274 | |
275 | 275 | ROM_REGION( 0x100000, "cg", 0 ) |
276 | | ROM_LOAD16_BYTE( "C0000770 CG1 1 of 4 (2-40) NJ.bin", 0x000000, 0x80000, CRC(35847c45) SHA1(9f6192a9cb43df1a32d13d09248f10d62cd5ad3c) ) |
277 | | ROM_LOAD16_BYTE( "C0000770 CG2 2 of 4 (2-40) NJ.bin", 0x000001, 0x80000, CRC(2207af01) SHA1(6f59d624fbbae56af081f2a2f4eb3f7a6e6c0ec1) ) |
| 276 | ROM_LOAD16_BYTE( "C0000770 CG1 1 of 4 (2-40) NJ.bin", 0x000000, 0x80000, CRC(35847c45) SHA1(9f6192a9cb43df1a32d13d09248f10d62cd5ad3c) ) |
| 277 | ROM_LOAD16_BYTE( "C0000770 CG2 2 of 4 (2-40) NJ.bin", 0x000001, 0x80000, CRC(2207af01) SHA1(6f59d624fbbae56af081f2a2f4eb3f7a6e6c0ec1) ) |
278 | 278 | |
279 | 279 | ROM_REGION( 0x200000, "plx", 0 ) |
280 | | ROM_LOAD16_BYTE( "C0000770 PLX1 3 of 4 (2-80) NJ.bin", 0x000000, 0x100000, CRC(d1e673cd) SHA1(22d0234e3efb5238d60c9aab4ffc171f28f5abac) ) |
281 | | ROM_LOAD16_BYTE( "C0000770 PLX2 4 of 4 (2-80) NJ.bin", 0x000001, 0x100000, CRC(d99074f3) SHA1(a5829761f558f8e543a1442128c0ae3520d42318) ) |
| 280 | ROM_LOAD16_BYTE( "C0000770 PLX1 3 of 4 (2-80) NJ.bin", 0x000000, 0x100000, CRC(d1e673cd) SHA1(22d0234e3efb5238d60c9aab4ffc171f28f5abac) ) |
| 281 | ROM_LOAD16_BYTE( "C0000770 PLX2 4 of 4 (2-80) NJ.bin", 0x000001, 0x100000, CRC(d99074f3) SHA1(a5829761f558f8e543a1442128c0ae3520d42318) ) |
282 | 282 | |
283 | 283 | ROM_REGION( 0x200000, "snd", 0 ) // same as gkigt4 |
284 | | ROM_LOAD( "SWC00046 SND1 1 of 2 (2-80).rom1", 0x000000, 0x100000, CRC(8213aeac) SHA1(4beff02fed64e607270e0e8e322a96f112bd2093) ) |
285 | | ROM_LOAD( "SWC00046 SND2 2 of 2 (2-80).rom2", 0x100000, 0x100000, CRC(a7ef9b46) SHA1(031373fb8e39c4ed828a58bb63a9395a205c6b6b) ) |
| 284 | ROM_LOAD( "SWC00046 SND1 1 of 2 (2-80).rom1", 0x000000, 0x100000, CRC(8213aeac) SHA1(4beff02fed64e607270e0e8e322a96f112bd2093) ) |
| 285 | ROM_LOAD( "SWC00046 SND2 2 of 2 (2-80).rom2", 0x100000, 0x100000, CRC(a7ef9b46) SHA1(031373fb8e39c4ed828a58bb63a9395a205c6b6b) ) |
286 | 286 | ROM_END |
287 | 287 | |
288 | 288 | ROM_START( gkigtez ) |
289 | 289 | ROM_REGION( 0x80000, "maincpu", 0 ) // same as gkigt4ms |
290 | | ROM_LOAD( "M000526 BASE (1-4002) MS.u39", 0x00000, 0x80000, CRC(4d095df5) SHA1(bd0cdc4c1b07ef2723ba22b14abaf581b017f190) ) |
| 290 | ROM_LOAD( "M000526 BASE (1-4002) MS.u39", 0x00000, 0x80000, CRC(4d095df5) SHA1(bd0cdc4c1b07ef2723ba22b14abaf581b017f190) ) |
291 | 291 | |
292 | 292 | ROM_REGION32_LE( 0x200000, "game", 0 ) |
293 | | ROM_LOAD16_BYTE( "G0002955 GME1 1 of 2 (2-80) MS.u13", 0x000000, 0x100000, CRC(472c04a1) SHA1(00b7784d254390475c9aa1beac1700c42514cbed) ) |
294 | | ROM_LOAD16_BYTE( "G0002955 GME2 2 of 2 (2-80) MS.u36", 0x000001, 0x100000, CRC(16903e65) SHA1(eb01c0f88212e8e35c35f897f17e12e859255270) ) |
| 293 | ROM_LOAD16_BYTE( "G0002955 GME1 1 of 2 (2-80) MS.u13", 0x000000, 0x100000, CRC(472c04a1) SHA1(00b7784d254390475c9aa1beac1700c42514cbed) ) |
| 294 | ROM_LOAD16_BYTE( "G0002955 GME2 2 of 2 (2-80) MS.u36", 0x000001, 0x100000, CRC(16903e65) SHA1(eb01c0f88212e8e35c35f897f17e12e859255270) ) |
295 | 295 | |
296 | 296 | ROM_REGION( 0x100000, "cg", 0 ) // same as gkigt4ms |
297 | | ROM_LOAD16_BYTE( "C000351 CG1 1 of 4 (2-40) MS.u30", 0x000000, 0x80000, CRC(2e841b28) SHA1(492b54e092b0d4028fd8edcb981bd1fd25dca47d) ) |
298 | | ROM_LOAD16_BYTE( "C000351 CG2 2 of 4 (2-40) MS.u53", 0x000001, 0x80000, CRC(673fc86c) SHA1(4d844330c5602d725253b4f78781fa9e213b8556) ) |
| 297 | ROM_LOAD16_BYTE( "C000351 CG1 1 of 4 (2-40) MS.u30", 0x000000, 0x80000, CRC(2e841b28) SHA1(492b54e092b0d4028fd8edcb981bd1fd25dca47d) ) |
| 298 | ROM_LOAD16_BYTE( "C000351 CG2 2 of 4 (2-40) MS.u53", 0x000001, 0x80000, CRC(673fc86c) SHA1(4d844330c5602d725253b4f78781fa9e213b8556) ) |
299 | 299 | |
300 | 300 | ROM_REGION( 0x200000, "plx", 0 ) // same as gkigt4ms |
301 | | ROM_LOAD16_BYTE( "C000351 PXL1 3 of 4 (2-80) MS.u14", 0x000000, 0x100000, CRC(438fb625) SHA1(369c860dffa323c2e9be155da1989252f6b0e694) ) |
302 | | ROM_LOAD16_BYTE( "C000351 PXL2 4 of 4 (2-80) MS.u37", 0x000001, 0x100000, CRC(22ec9c65) SHA1(bd944ae79faa8ceb73ed8f6f244fce6ff543ccd1) ) |
| 301 | ROM_LOAD16_BYTE( "C000351 PXL1 3 of 4 (2-80) MS.u14", 0x000000, 0x100000, CRC(438fb625) SHA1(369c860dffa323c2e9be155da1989252f6b0e694) ) |
| 302 | ROM_LOAD16_BYTE( "C000351 PXL2 4 of 4 (2-80) MS.u37", 0x000001, 0x100000, CRC(22ec9c65) SHA1(bd944ae79faa8ceb73ed8f6f244fce6ff543ccd1) ) |
303 | 303 | |
304 | 304 | ROM_REGION( 0x200000, "snd", 0 ) // same as gkigt4 |
305 | | ROM_LOAD( "SWC00046 SND1 1 of 2 (2-80).rom1", 0x000000, 0x100000, CRC(8213aeac) SHA1(4beff02fed64e607270e0e8e322a96f112bd2093) ) |
306 | | ROM_LOAD( "SWC00046 SND2 2 of 2 (2-80).rom2", 0x100000, 0x100000, CRC(a7ef9b46) SHA1(031373fb8e39c4ed828a58bb63a9395a205c6b6b) ) |
| 305 | ROM_LOAD( "SWC00046 SND1 1 of 2 (2-80).rom1", 0x000000, 0x100000, CRC(8213aeac) SHA1(4beff02fed64e607270e0e8e322a96f112bd2093) ) |
| 306 | ROM_LOAD( "SWC00046 SND2 2 of 2 (2-80).rom2", 0x100000, 0x100000, CRC(a7ef9b46) SHA1(031373fb8e39c4ed828a58bb63a9395a205c6b6b) ) |
307 | 307 | ROM_END |
308 | 308 | |
309 | 309 | ROM_START( gkigt5p ) |
310 | 310 | ROM_REGION( 0x80000, "maincpu", 0 ) |
311 | | ROM_LOAD( "M0000761 BASE (1-4002).bin", 0x00000, 0x80000, CRC(efac4e4f) SHA1(0cf5b3eead66a791701a504330d9154e8f4d657d) ) |
| 311 | ROM_LOAD( "M0000761 BASE (1-4002).bin", 0x00000, 0x80000, CRC(efac4e4f) SHA1(0cf5b3eead66a791701a504330d9154e8f4d657d) ) |
312 | 312 | |
313 | 313 | ROM_REGION32_LE( 0x200000, "game", 0 ) |
314 | | ROM_LOAD16_BYTE( "G0001783 GME1 1 of 2 (2-80).bin", 0x000000, 0x100000, CRC(f6672841) SHA1(1f8fe98b931e7fd67e5cd56e193c44acabcb7c0a) ) |
315 | | ROM_LOAD16_BYTE( "G0001783 GME1 2 of 2 (2-80).bin", 0x000001, 0x100000, CRC(639de8c0) SHA1(ad4fb79f12bf19b4b39691cda9f5e61f32fa2dd5) ) |
| 314 | ROM_LOAD16_BYTE( "G0001783 GME1 1 of 2 (2-80).bin", 0x000000, 0x100000, CRC(f6672841) SHA1(1f8fe98b931e7fd67e5cd56e193c44acabcb7c0a) ) |
| 315 | ROM_LOAD16_BYTE( "G0001783 GME1 2 of 2 (2-80).bin", 0x000001, 0x100000, CRC(639de8c0) SHA1(ad4fb79f12bf19b4b39691cda9f5e61f32fa2dd5) ) |
316 | 316 | |
317 | 317 | ROM_REGION( 0x100000, "cg", 0 ) |
318 | | ROM_LOAD16_BYTE( "C0000517 CG1 1 of 4 (2-40).bin", 0x000000, 0x80000, CRC(26db44c9) SHA1(8afe145d1fb7535c651d78b23872b71c2c946509) ) |
319 | | ROM_LOAD16_BYTE( "C0000517 CG2 2 of 4 (2-40).bin", 0x000001, 0x80000, CRC(3554ba38) SHA1(6e0b8506943559dbee4cfa7c9e4b60590c6529fb) ) |
| 318 | ROM_LOAD16_BYTE( "C0000517 CG1 1 of 4 (2-40).bin", 0x000000, 0x80000, CRC(26db44c9) SHA1(8afe145d1fb7535c651d78b23872b71c2c946509) ) |
| 319 | ROM_LOAD16_BYTE( "C0000517 CG2 2 of 4 (2-40).bin", 0x000001, 0x80000, CRC(3554ba38) SHA1(6e0b8506943559dbee4cfa7c9e4b60590c6529fb) ) |
320 | 320 | |
321 | 321 | ROM_REGION( 0x200000, "plx", 0 ) |
322 | | ROM_LOAD16_BYTE( "C0000517 PLX1 3 of 4 (2-80).bin", 0x000000, 0x100000, CRC(956ba40c) SHA1(7d8ae934ef663ea6b3f342455d1e8c70a1ca4581) ) |
323 | | ROM_LOAD16_BYTE( "C0000517 PLX2 4 of 4 (2-80).bin", 0x000001, 0x100000, CRC(dff43975) SHA1(e1ca212e4e51175bcbab2af447863605f74ba77f) ) |
| 322 | ROM_LOAD16_BYTE( "C0000517 PLX1 3 of 4 (2-80).bin", 0x000000, 0x100000, CRC(956ba40c) SHA1(7d8ae934ef663ea6b3f342455d1e8c70a1ca4581) ) |
| 323 | ROM_LOAD16_BYTE( "C0000517 PLX2 4 of 4 (2-80).bin", 0x000001, 0x100000, CRC(dff43975) SHA1(e1ca212e4e51175bcbab2af447863605f74ba77f) ) |
324 | 324 | |
325 | 325 | ROM_REGION( 0x200000, "snd", 0 ) // same as gkigt4 |
326 | | ROM_LOAD( "SWC00046 SND1 1 of 2 (2-80).rom1", 0x000000, 0x100000, CRC(8213aeac) SHA1(4beff02fed64e607270e0e8e322a96f112bd2093) ) |
327 | | ROM_LOAD( "SWC00046 SND2 2 of 2 (2-80).rom2", 0x100000, 0x100000, CRC(a7ef9b46) SHA1(031373fb8e39c4ed828a58bb63a9395a205c6b6b) ) |
| 326 | ROM_LOAD( "SWC00046 SND1 1 of 2 (2-80).rom1", 0x000000, 0x100000, CRC(8213aeac) SHA1(4beff02fed64e607270e0e8e322a96f112bd2093) ) |
| 327 | ROM_LOAD( "SWC00046 SND2 2 of 2 (2-80).rom2", 0x100000, 0x100000, CRC(a7ef9b46) SHA1(031373fb8e39c4ed828a58bb63a9395a205c6b6b) ) |
328 | 328 | ROM_END |
329 | 329 | |
330 | 330 | |
331 | 331 | ROM_START( igtsc ) |
332 | 332 | ROM_REGION( 0x80000, "maincpu", 0 ) |
333 | | ROM_LOAD( "I0000838 BASE (1-4002).bin", 0x00000, 0x80000, CRC(7b66f0d5) SHA1(a13e7fa4062668ff7acb15e58025eeb401754898) ) |
| 333 | ROM_LOAD( "I0000838 BASE (1-4002).bin", 0x00000, 0x80000, CRC(7b66f0d5) SHA1(a13e7fa4062668ff7acb15e58025eeb401754898) ) |
334 | 334 | |
335 | 335 | ROM_REGION32_LE( 0x200000, "game", 0 ) |
336 | | ROM_LOAD16_BYTE( "G0001175 GME1 1 of 2 (2-80).bin", 0x000000, 0x100000, CRC(674e0172) SHA1(e7bfe13781988b9193f22ad93502e303ba9427eb) ) |
337 | | ROM_LOAD16_BYTE( "G0001175 GME2 2 of 2 (2-80).bin", 0x000001, 0x100000, CRC(db76db22) SHA1(e389b11a05f0ef0dcee303ba91578f4cd56beba0) ) |
| 336 | ROM_LOAD16_BYTE( "G0001175 GME1 1 of 2 (2-80).bin", 0x000000, 0x100000, CRC(674e0172) SHA1(e7bfe13781988b9193f22ad93502e303ba9427eb) ) |
| 337 | ROM_LOAD16_BYTE( "G0001175 GME2 2 of 2 (2-80).bin", 0x000001, 0x100000, CRC(db76db22) SHA1(e389b11a05f0ef0dcee303ba91578f4cd56beba0) ) |
338 | 338 | |
339 | 339 | // all these SIMM files are bad dumps, they never contains the byte value 0x0d (uploaded in ASCII mode with carriage return stripped out?) |
340 | 340 | ROM_REGION( 0x0800000, "cg", 0 ) |
r253023 | r253024 | |
353 | 353 | |
354 | 354 | ROM_START( gkkey ) |
355 | 355 | ROM_REGION( 0x80000, "maincpu", 0 ) |
356 | | ROM_LOAD( "KEY00017 (1-4002).bin", 0x00000, 0x80000, CRC(1579739f) SHA1(7b6257d17f74599a4ada3014d02a2e7c6686ab3f) ) |
357 | | ROM_LOAD( "KEY00028 (1-4002).bin", 0x00000, 0x80000, CRC(bf06b98b) SHA1(5c46afb560bb5c0f7540b714c0dea851c6b18fe6) ) |
| 356 | ROM_LOAD( "KEY00017 (1-4002).bin", 0x00000, 0x80000, CRC(1579739f) SHA1(7b6257d17f74599a4ada3014d02a2e7c6686ab3f) ) |
| 357 | ROM_LOAD( "KEY00028 (1-4002).bin", 0x00000, 0x80000, CRC(bf06b98b) SHA1(5c46afb560bb5c0f7540b714c0dea851c6b18fe6) ) |
358 | 358 | |
359 | 359 | ROM_REGION( 0x80000, "miscbad", 0 ) |
360 | 360 | // these are also bad dumps, again they never contains the byte value 0x0d (uploaded in ASCII mode with carriage return stripped out?) |
r253023 | r253024 | |
377 | 377 | GAME( 2003, gkigt5p, gkigt4, igt_gameking, igt_gameking, driver_device, 0, ROT0, "IGT", "Game King (Triple-Five Play)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) |
378 | 378 | GAME( 2003, igtsc, 0, igt_gameking, igt_gameking, driver_device, 0, ROT0, "IGT", "Super Cherry", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // SIMM dumps are bad. |
379 | 379 | GAME( 2003, gkkey, 0, igt_gameking, igt_gameking, driver_device, 0, ROT0, "IGT", "Game King (Set Chips)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // only 2 are good dumps |
380 | | |
trunk/src/mame/drivers/marywu.cpp
r253023 | r253024 | |
1 | 1 | // license:GPL2+ |
2 | 2 | // copyright-holders:Felipe Sanches |
3 | 3 | /************************************************************************* |
4 | | |
| 4 | |
5 | 5 | This is a driver for a gambling board with a yet unknown name. |
6 | 6 | The PCB is labeled with: WU- MARY-1A |
7 | 7 | And there's a text string in the ROM that says: "Music by: SunKiss Chen" |
r253023 | r253024 | |
25 | 25 | class marywu_state : public driver_device |
26 | 26 | { |
27 | 27 | public: |
28 | | marywu_state(const machine_config &mconfig, device_type type, const char *tag) |
29 | | : driver_device(mconfig, type, tag) |
30 | | { } |
| 28 | marywu_state(const machine_config &mconfig, device_type type, const char *tag) |
| 29 | : driver_device(mconfig, type, tag) |
| 30 | { } |
31 | 31 | |
32 | | DECLARE_WRITE8_MEMBER(display_7seg_data_w); |
33 | | DECLARE_WRITE8_MEMBER(multiplex_7seg_w); |
34 | | DECLARE_WRITE8_MEMBER(ay1_port_a_w); |
35 | | DECLARE_WRITE8_MEMBER(ay1_port_b_w); |
36 | | DECLARE_WRITE8_MEMBER(ay2_port_a_w); |
37 | | DECLARE_WRITE8_MEMBER(ay2_port_b_w); |
38 | | DECLARE_READ8_MEMBER(keyboard_r); |
39 | | DECLARE_READ8_MEMBER(port_r); |
| 32 | DECLARE_WRITE8_MEMBER(display_7seg_data_w); |
| 33 | DECLARE_WRITE8_MEMBER(multiplex_7seg_w); |
| 34 | DECLARE_WRITE8_MEMBER(ay1_port_a_w); |
| 35 | DECLARE_WRITE8_MEMBER(ay1_port_b_w); |
| 36 | DECLARE_WRITE8_MEMBER(ay2_port_a_w); |
| 37 | DECLARE_WRITE8_MEMBER(ay2_port_b_w); |
| 38 | DECLARE_READ8_MEMBER(keyboard_r); |
| 39 | DECLARE_READ8_MEMBER(port_r); |
40 | 40 | private: |
41 | | uint8_t m_selected_7seg_module; |
| 41 | uint8_t m_selected_7seg_module; |
42 | 42 | }; |
43 | 43 | |
44 | 44 | static INPUT_PORTS_START( marywu ) |
45 | | PORT_START("KEYS1") |
46 | | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) |
47 | | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) |
48 | | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) |
49 | | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) |
50 | | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) |
51 | | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) |
52 | | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) |
53 | | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) |
| 45 | PORT_START("KEYS1") |
| 46 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) |
| 47 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) |
| 48 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) |
| 49 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) |
| 50 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) |
| 51 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) |
| 52 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) |
| 53 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) |
54 | 54 | |
55 | | PORT_START("KEYS2") |
56 | | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) |
57 | | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) |
58 | | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) |
59 | | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) |
60 | | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) |
61 | | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) |
62 | | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) |
63 | | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) |
| 55 | PORT_START("KEYS2") |
| 56 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) |
| 57 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) |
| 58 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) |
| 59 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) |
| 60 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) |
| 61 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) |
| 62 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) |
| 63 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) |
64 | 64 | |
65 | | PORT_START("DSW") |
66 | | PORT_DIPNAME( 0x01, 0x01, "Unknown bit #0" ) PORT_DIPLOCATION("DSW:0") |
67 | | PORT_DIPSETTING(0x01, DEF_STR( On ) ) |
68 | | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
69 | | PORT_DIPNAME( 0x02, 0x02, "Unknown bit #1" ) PORT_DIPLOCATION("DSW:1") |
70 | | PORT_DIPSETTING(0x02, DEF_STR( On ) ) |
71 | | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
72 | | PORT_DIPNAME( 0x04, 0x04, "Unknown bit #2" ) PORT_DIPLOCATION("DSW:2") |
73 | | PORT_DIPSETTING(0x04, DEF_STR( On ) ) |
74 | | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
75 | | PORT_DIPNAME( 0x08, 0x08, "Unknown bit #3" ) PORT_DIPLOCATION("DSW:3") |
76 | | PORT_DIPSETTING(0x08, DEF_STR( On ) ) |
77 | | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
78 | | PORT_DIPNAME( 0x10, 0x10, "Unknown bit #4" ) PORT_DIPLOCATION("DSW:4") |
79 | | PORT_DIPSETTING(0x10, DEF_STR( On ) ) |
80 | | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
81 | | PORT_DIPNAME( 0x20, 0x20, "Unknown bit #5" ) PORT_DIPLOCATION("DSW:5") |
82 | | PORT_DIPSETTING(0x20, DEF_STR( On ) ) |
83 | | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
84 | | PORT_DIPNAME( 0x40, 0x40, "Unknown bit #6" ) PORT_DIPLOCATION("DSW:6") |
85 | | PORT_DIPSETTING(0x40, DEF_STR( On ) ) |
86 | | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
87 | | PORT_DIPNAME( 0x80, 0x80, "Unknown bit #7" ) PORT_DIPLOCATION("DSW:7") |
88 | | PORT_DIPSETTING(0x80, DEF_STR( On ) ) |
89 | | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
| 65 | PORT_START("DSW") |
| 66 | PORT_DIPNAME( 0x01, 0x01, "Unknown bit #0" ) PORT_DIPLOCATION("DSW:0") |
| 67 | PORT_DIPSETTING(0x01, DEF_STR( On ) ) |
| 68 | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
| 69 | PORT_DIPNAME( 0x02, 0x02, "Unknown bit #1" ) PORT_DIPLOCATION("DSW:1") |
| 70 | PORT_DIPSETTING(0x02, DEF_STR( On ) ) |
| 71 | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
| 72 | PORT_DIPNAME( 0x04, 0x04, "Unknown bit #2" ) PORT_DIPLOCATION("DSW:2") |
| 73 | PORT_DIPSETTING(0x04, DEF_STR( On ) ) |
| 74 | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
| 75 | PORT_DIPNAME( 0x08, 0x08, "Unknown bit #3" ) PORT_DIPLOCATION("DSW:3") |
| 76 | PORT_DIPSETTING(0x08, DEF_STR( On ) ) |
| 77 | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
| 78 | PORT_DIPNAME( 0x10, 0x10, "Unknown bit #4" ) PORT_DIPLOCATION("DSW:4") |
| 79 | PORT_DIPSETTING(0x10, DEF_STR( On ) ) |
| 80 | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
| 81 | PORT_DIPNAME( 0x20, 0x20, "Unknown bit #5" ) PORT_DIPLOCATION("DSW:5") |
| 82 | PORT_DIPSETTING(0x20, DEF_STR( On ) ) |
| 83 | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
| 84 | PORT_DIPNAME( 0x40, 0x40, "Unknown bit #6" ) PORT_DIPLOCATION("DSW:6") |
| 85 | PORT_DIPSETTING(0x40, DEF_STR( On ) ) |
| 86 | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
| 87 | PORT_DIPNAME( 0x80, 0x80, "Unknown bit #7" ) PORT_DIPLOCATION("DSW:7") |
| 88 | PORT_DIPSETTING(0x80, DEF_STR( On ) ) |
| 89 | PORT_DIPSETTING(0x00, DEF_STR( Off ) ) |
90 | 90 | |
91 | | PORT_START("PUSHBUTTONS") |
92 | | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) |
93 | | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
94 | | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) |
95 | | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
96 | | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) |
97 | | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) |
98 | | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) |
99 | | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) |
| 91 | PORT_START("PUSHBUTTONS") |
| 92 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 93 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 94 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 95 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 96 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) |
| 97 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) |
| 98 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) |
| 99 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) |
100 | 100 | INPUT_PORTS_END |
101 | 101 | |
102 | 102 | WRITE8_MEMBER( marywu_state::ay1_port_a_w ) |
103 | 103 | { |
104 | | for (uint8_t i=0; i<8; i++){ |
105 | | output().set_led_value(i, (data & (1 << i)) ? 1 : 0); |
106 | | } |
| 104 | for (uint8_t i=0; i<8; i++){ |
| 105 | output().set_led_value(i, (data & (1 << i)) ? 1 : 0); |
| 106 | } |
107 | 107 | } |
108 | 108 | |
109 | 109 | WRITE8_MEMBER( marywu_state::ay1_port_b_w ) |
110 | 110 | { |
111 | | for (uint8_t i=0; i<8; i++){ |
112 | | output().set_led_value(i+8, (data & (1 << i)) ? 1 : 0); |
113 | | } |
| 111 | for (uint8_t i=0; i<8; i++){ |
| 112 | output().set_led_value(i+8, (data & (1 << i)) ? 1 : 0); |
| 113 | } |
114 | 114 | } |
115 | 115 | |
116 | 116 | WRITE8_MEMBER( marywu_state::ay2_port_a_w ) |
117 | 117 | { |
118 | | for (uint8_t i=0; i<8; i++){ |
119 | | output().set_led_value(i+16, (data & (1 << i)) ? 1 : 0); |
120 | | } |
| 118 | for (uint8_t i=0; i<8; i++){ |
| 119 | output().set_led_value(i+16, (data & (1 << i)) ? 1 : 0); |
| 120 | } |
121 | 121 | } |
122 | 122 | |
123 | 123 | WRITE8_MEMBER( marywu_state::ay2_port_b_w ) |
124 | 124 | { |
125 | | for (uint8_t i=0; i<6; i++){ |
126 | | /* we only have 30 LEDs. The last 2 bits in this port are unused. */ |
127 | | output().set_led_value(i+24, (data & (1 << i)) ? 1 : 0); |
128 | | } |
| 125 | for (uint8_t i=0; i<6; i++){ |
| 126 | /* we only have 30 LEDs. The last 2 bits in this port are unused. */ |
| 127 | output().set_led_value(i+24, (data & (1 << i)) ? 1 : 0); |
| 128 | } |
129 | 129 | } |
130 | 130 | |
131 | 131 | WRITE8_MEMBER( marywu_state::multiplex_7seg_w ) |
132 | 132 | { |
133 | | m_selected_7seg_module = data; |
| 133 | m_selected_7seg_module = data; |
134 | 134 | } |
135 | 135 | |
136 | 136 | READ8_MEMBER( marywu_state::port_r ) |
137 | 137 | { |
138 | 138 | //TODO: figure out what each bit is mapped to in the 80c31 ports P1 and P3 |
139 | | switch(offset){ |
140 | | //case 1: |
141 | | // return (1 << 6); |
| 139 | switch(offset){ |
| 140 | //case 1: |
| 141 | // return (1 << 6); |
142 | 142 | default: |
143 | 143 | return 0x00; |
144 | | } |
| 144 | } |
145 | 145 | } |
146 | 146 | |
147 | 147 | READ8_MEMBER( marywu_state::keyboard_r ) |
148 | 148 | { |
149 | | switch(m_selected_7seg_module % 8){ |
| 149 | switch(m_selected_7seg_module % 8){ |
150 | 150 | case 0: return ioport("KEYS1")->read(); |
151 | | case 1: return ioport("KEYS2")->read(); |
152 | | case 2: return ioport("DSW")->read(); |
153 | | case 3: return ioport("PUSHBUTTONS")->read(); |
| 151 | case 1: return ioport("KEYS2")->read(); |
| 152 | case 2: return ioport("DSW")->read(); |
| 153 | case 3: return ioport("PUSHBUTTONS")->read(); |
154 | 154 | default: |
155 | | return 0x00; |
156 | | } |
| 155 | return 0x00; |
| 156 | } |
157 | 157 | } |
158 | 158 | |
159 | 159 | WRITE8_MEMBER( marywu_state::display_7seg_data_w ) |
160 | 160 | { |
161 | | static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0, 0, 0, 0, 0, 0 }; // HEF4511BP (7 seg display driver) |
| 161 | static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0, 0, 0, 0, 0, 0 }; // HEF4511BP (7 seg display driver) |
162 | 162 | |
163 | | output().set_digit_value(2 * m_selected_7seg_module + 0, patterns[data & 0x0F]); |
164 | | output().set_digit_value(2 * m_selected_7seg_module + 1, patterns[(data >> 4) & 0x0F]); |
| 163 | output().set_digit_value(2 * m_selected_7seg_module + 0, patterns[data & 0x0F]); |
| 164 | output().set_digit_value(2 * m_selected_7seg_module + 1, patterns[(data >> 4) & 0x0F]); |
165 | 165 | } |
166 | 166 | |
167 | 167 | static ADDRESS_MAP_START( program_map, AS_PROGRAM, 8, marywu_state ) |
168 | | AM_RANGE(0x0000, 0x7fff) AM_ROM |
| 168 | AM_RANGE(0x0000, 0x7fff) AM_ROM |
169 | 169 | ADDRESS_MAP_END |
170 | 170 | |
171 | 171 | static ADDRESS_MAP_START( io_map, AS_IO, 8, marywu_state ) |
172 | | AM_RANGE(0x8000, 0x87ff) AM_MIRROR(0x0100) AM_RAM /* HM6116: 2kbytes of Static RAM */ |
173 | | AM_RANGE(0xb000, 0xb000) AM_MIRROR(0x0ffe) AM_DEVREADWRITE("i8279", i8279_device, data_r, data_w) |
174 | | AM_RANGE(0xb001, 0xb001) AM_MIRROR(0x0ffe) AM_DEVREADWRITE("i8279", i8279_device, status_r, cmd_w) |
175 | | AM_RANGE(0x9000, 0x9000) AM_MIRROR(0x0ffc) AM_DEVWRITE("ay1", ay8910_device, data_address_w) |
176 | | AM_RANGE(0x9001, 0x9001) AM_MIRROR(0x0ffc) AM_DEVREADWRITE("ay1", ay8910_device, data_r, data_w) |
177 | | AM_RANGE(0x9002, 0x9002) AM_MIRROR(0x0ffc) AM_DEVWRITE("ay2", ay8910_device, data_address_w) |
178 | | AM_RANGE(0x9003, 0x9003) AM_MIRROR(0x0ffc) AM_DEVREADWRITE("ay2", ay8910_device, data_r, data_w) |
179 | | AM_RANGE(0xf000, 0xf000) AM_NOP /* TODO: Investigate this. There's something going on at this address range. */ |
180 | | AM_RANGE(MCS51_PORT_P0, MCS51_PORT_P3) AM_READ(port_r) |
| 172 | AM_RANGE(0x8000, 0x87ff) AM_MIRROR(0x0100) AM_RAM /* HM6116: 2kbytes of Static RAM */ |
| 173 | AM_RANGE(0xb000, 0xb000) AM_MIRROR(0x0ffe) AM_DEVREADWRITE("i8279", i8279_device, data_r, data_w) |
| 174 | AM_RANGE(0xb001, 0xb001) AM_MIRROR(0x0ffe) AM_DEVREADWRITE("i8279", i8279_device, status_r, cmd_w) |
| 175 | AM_RANGE(0x9000, 0x9000) AM_MIRROR(0x0ffc) AM_DEVWRITE("ay1", ay8910_device, data_address_w) |
| 176 | AM_RANGE(0x9001, 0x9001) AM_MIRROR(0x0ffc) AM_DEVREADWRITE("ay1", ay8910_device, data_r, data_w) |
| 177 | AM_RANGE(0x9002, 0x9002) AM_MIRROR(0x0ffc) AM_DEVWRITE("ay2", ay8910_device, data_address_w) |
| 178 | AM_RANGE(0x9003, 0x9003) AM_MIRROR(0x0ffc) AM_DEVREADWRITE("ay2", ay8910_device, data_r, data_w) |
| 179 | AM_RANGE(0xf000, 0xf000) AM_NOP /* TODO: Investigate this. There's something going on at this address range. */ |
| 180 | AM_RANGE(MCS51_PORT_P0, MCS51_PORT_P3) AM_READ(port_r) |
181 | 181 | ADDRESS_MAP_END |
182 | 182 | |
183 | 183 | static MACHINE_CONFIG_START( marywu , marywu_state ) |
184 | | /* basic machine hardware */ |
185 | | MCFG_CPU_ADD("maincpu", I80C31, XTAL_10_738635MHz) //actual CPU is a Winbond w78c31b-24 |
186 | | MCFG_CPU_PROGRAM_MAP(program_map) |
187 | | MCFG_CPU_IO_MAP(io_map) |
| 184 | /* basic machine hardware */ |
| 185 | MCFG_CPU_ADD("maincpu", I80C31, XTAL_10_738635MHz) //actual CPU is a Winbond w78c31b-24 |
| 186 | MCFG_CPU_PROGRAM_MAP(program_map) |
| 187 | MCFG_CPU_IO_MAP(io_map) |
188 | 188 | |
189 | | /* Keyboard & display interface */ |
190 | | MCFG_DEVICE_ADD("i8279", I8279, XTAL_10_738635MHz) /* should it be perhaps a fraction of the XTAL clock ? */ |
191 | | MCFG_I8279_OUT_SL_CB(WRITE8(marywu_state, multiplex_7seg_w)) // select block of 7seg modules by multiplexing the SL scan lines |
192 | | MCFG_I8279_IN_RL_CB(READ8(marywu_state, keyboard_r)) // keyboard Return Lines |
193 | | MCFG_I8279_OUT_DISP_CB(WRITE8(marywu_state, display_7seg_data_w)) |
| 189 | /* Keyboard & display interface */ |
| 190 | MCFG_DEVICE_ADD("i8279", I8279, XTAL_10_738635MHz) /* should it be perhaps a fraction of the XTAL clock ? */ |
| 191 | MCFG_I8279_OUT_SL_CB(WRITE8(marywu_state, multiplex_7seg_w)) // select block of 7seg modules by multiplexing the SL scan lines |
| 192 | MCFG_I8279_IN_RL_CB(READ8(marywu_state, keyboard_r)) // keyboard Return Lines |
| 193 | MCFG_I8279_OUT_DISP_CB(WRITE8(marywu_state, display_7seg_data_w)) |
194 | 194 | |
195 | | /* Video */ |
196 | | MCFG_DEFAULT_LAYOUT(layout_marywu) |
| 195 | /* Video */ |
| 196 | MCFG_DEFAULT_LAYOUT(layout_marywu) |
197 | 197 | |
198 | | /* sound hardware */ |
199 | | MCFG_SPEAKER_STANDARD_MONO("mono") |
200 | | MCFG_SOUND_ADD("ay1", AY8910, XTAL_10_738635MHz) /* should it be perhaps a fraction of the XTAL clock ? */ |
201 | | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) |
202 | | MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(marywu_state, ay1_port_a_w)) |
203 | | MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(marywu_state, ay1_port_b_w)) |
204 | | |
205 | | MCFG_SOUND_ADD("ay2", AY8910, XTAL_10_738635MHz) /* should it be perhaps a fraction of the XTAL clock ? */ |
206 | | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) |
207 | | MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(marywu_state, ay2_port_a_w)) |
208 | | MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(marywu_state, ay2_port_b_w)) |
| 198 | /* sound hardware */ |
| 199 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 200 | MCFG_SOUND_ADD("ay1", AY8910, XTAL_10_738635MHz) /* should it be perhaps a fraction of the XTAL clock ? */ |
| 201 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) |
| 202 | MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(marywu_state, ay1_port_a_w)) |
| 203 | MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(marywu_state, ay1_port_b_w)) |
| 204 | |
| 205 | MCFG_SOUND_ADD("ay2", AY8910, XTAL_10_738635MHz) /* should it be perhaps a fraction of the XTAL clock ? */ |
| 206 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) |
| 207 | MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(marywu_state, ay2_port_a_w)) |
| 208 | MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(marywu_state, ay2_port_b_w)) |
209 | 209 | MACHINE_CONFIG_END |
210 | 210 | |
211 | 211 | ROM_START( marywu ) |
212 | 212 | ROM_REGION( 0x8000, "maincpu", 0 ) |
213 | | ROM_LOAD( "marywu_sunkiss_chen.rom", 0x0000, 0x8000, CRC(11f67c7d) SHA1(9c1fd1a5cc6e2b0d675f0217aa8ff21c30609a0c) ) |
| 213 | ROM_LOAD( "marywu_sunkiss_chen.rom", 0x0000, 0x8000, CRC(11f67c7d) SHA1(9c1fd1a5cc6e2b0d675f0217aa8ff21c30609a0c) ) |
214 | 214 | ROM_END |
215 | 215 | |
216 | 216 | /* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS */ |
trunk/src/mame/drivers/nokia_3310.cpp
r253023 | r253024 | |
1 | 1 | // license:BSD-3-Clause |
2 | 2 | // copyright-holders:Sandro Ronco |
3 | 3 | /* |
4 | | Driver for Nokia phones based on Texas Instrument MAD2WD1 (ARM7TDMI + DSP) |
| 4 | Driver for Nokia phones based on Texas Instrument MAD2WD1 (ARM7TDMI + DSP) |
5 | 5 | |
6 | | Driver based on documentations found here: |
7 | | http://nokix.sourceforge.net/help/blacksphere/sub_050main.htm |
8 | | http://tudor.rdslink.ro/MADos/ |
| 6 | Driver based on documentations found here: |
| 7 | http://nokix.sourceforge.net/help/blacksphere/sub_050main.htm |
| 8 | http://tudor.rdslink.ro/MADos/ |
9 | 9 | |
10 | 10 | */ |
11 | 11 | |
r253023 | r253024 | |
19 | 19 | #include "debugger.h" |
20 | 20 | |
21 | 21 | |
22 | | #define LOG_MAD2_REGISTER_ACCESS (0) |
23 | | #define LOG_CCONT_REGISTER_ACCESS (0) |
| 22 | #define LOG_MAD2_REGISTER_ACCESS (0) |
| 23 | #define LOG_CCONT_REGISTER_ACCESS (0) |
24 | 24 | |
25 | 25 | |
26 | 26 | class noki3310_state : public driver_device |
r253023 | r253024 | |
56 | 56 | TIMER_CALLBACK_MEMBER(timer_watchdog); |
57 | 57 | TIMER_CALLBACK_MEMBER(timer_fiq8); |
58 | 58 | |
59 | | DECLARE_READ16_MEMBER(ram_r) { return m_ram[offset] & mem_mask; } |
60 | | DECLARE_WRITE16_MEMBER(ram_w) { COMBINE_DATA(&m_ram[offset]); } |
| 59 | DECLARE_READ16_MEMBER(ram_r) { return m_ram[offset] & mem_mask; } |
| 60 | DECLARE_WRITE16_MEMBER(ram_w) { COMBINE_DATA(&m_ram[offset]); } |
61 | 61 | DECLARE_READ16_MEMBER(dsp_ram_r); |
62 | 62 | DECLARE_WRITE16_MEMBER(dsp_ram_w); |
63 | 63 | DECLARE_INPUT_CHANGED_MEMBER(key_irq); |
r253023 | r253024 | |
72 | 72 | |
73 | 73 | std::unique_ptr<UINT16[]> m_ram; |
74 | 74 | std::unique_ptr<UINT16[]> m_dsp_ram; |
75 | | UINT8 m_power_on; |
76 | | UINT16 m_fiq_status; |
77 | | UINT16 m_irq_status; |
78 | | UINT16 m_timer1_counter; |
79 | | UINT16 m_timer0_counter; |
| 75 | UINT8 m_power_on; |
| 76 | UINT16 m_fiq_status; |
| 77 | UINT16 m_irq_status; |
| 78 | UINT16 m_timer1_counter; |
| 79 | UINT16 m_timer0_counter; |
80 | 80 | |
81 | | emu_timer * m_timer0; |
82 | | emu_timer * m_timer1; |
83 | | emu_timer * m_timer_watchdog; |
84 | | emu_timer * m_timer_fiq8; |
| 81 | emu_timer * m_timer0; |
| 82 | emu_timer * m_timer1; |
| 83 | emu_timer * m_timer_watchdog; |
| 84 | emu_timer * m_timer_fiq8; |
85 | 85 | |
86 | 86 | // CCONT |
87 | 87 | struct nokia_ccont |
88 | 88 | { |
89 | | bool dc; |
90 | | UINT8 cmd; |
91 | | UINT8 watchdog; |
92 | | UINT8 regs[0x10]; |
| 89 | bool dc; |
| 90 | UINT8 cmd; |
| 91 | UINT8 watchdog; |
| 92 | UINT8 regs[0x10]; |
93 | 93 | } m_ccont; |
94 | 94 | |
95 | | UINT8 m_mad2_regs[0x100]; |
| 95 | UINT8 m_mad2_regs[0x100]; |
96 | 96 | }; |
97 | 97 | |
98 | 98 | |
r253023 | r253024 | |
101 | 101 | { |
102 | 102 | switch(offset) |
103 | 103 | { |
104 | | case 0x00: return "[CTSI] DCT3 ASIC version Primary hardware version (r)"; |
105 | | case 0x01: return "[CTSI] MCU reset control register (rw)"; |
106 | | case 0x02: return "[CTSI] DSP reset control register (rw)"; |
107 | | case 0x03: return "[CTSI] ASIC watchdog write register (w)"; |
108 | | case 0x04: return "[CTSI] Sleep clock counter (MSB) (r)"; |
109 | | case 0x05: return "[CTSI] Sleep clock counter (LSB) (r)"; |
110 | | case 0x06: return "[CTSI] ? (sleep) clock destination (LSB) (r)"; |
111 | | case 0x07: return "[CTSI] ? (sleep) clock destination (MSB) (r)"; |
112 | | case 0x08: return "[CTSI] FIQ lines active (rw)"; |
113 | | case 0x09: return "[CTSI] IRQ lines active (rw)"; |
114 | | case 0x0A: return "[CTSI] FIQ lines mask (rw)"; |
115 | | case 0x0B: return "[CTSI] IRQ lines mask (rw)"; |
116 | | case 0x0C: return "[CTSI] Interrupt control register (rw)"; |
117 | | case 0x0D: return "[CTSI] Clock control register (rw)"; |
118 | | case 0x0E: return "[CTSI] Interrupt trigger register (r)"; |
119 | | case 0x0F: return "[CTSI] Programmable timer clock divider (rw)"; |
120 | | case 0x10: return "[CTSI] Programmable timer counter (MSB) (r)"; |
121 | | case 0x11: return "[CTSI] Programmable timer counter (LSB) (r)"; |
122 | | case 0x12: return "[CTSI] Programmable timer destination (MSB) (rw)"; |
123 | | case 0x13: return "[CTSI] Programmable timer destination (LSB) (rw)"; |
124 | | case 0x15: return "[PUP] PUP control (rw)"; |
125 | | case 0x16: return "[PUP] FIQ 8 (timer?) interrupt control (rw)"; |
126 | | case 0x18: return "[PUP] MBUS control (rw)"; |
127 | | case 0x19: return "[PUP] MBUS status (rw)"; |
128 | | case 0x1A: return "[PUP] MBUS RX/TX (rw)"; |
129 | | case 0x1B: return "[PUP] Vibrator (w)"; |
130 | | case 0x1C: return "[PUP] Buzzer clock divider (w)"; |
131 | | case 0x1E: return "[PUP] Buzzer volume (w)"; |
132 | | case 0x20: return "[PUP] McuGenIO signal lines (rw)"; |
133 | | case 0x22: return "[PUP] ? (?)"; |
134 | | case 0x24: return "[PUP] McuGenIO I/O direction (rw)"; |
135 | | case 0x28: return "[UIF/KBGPIO] Keyboard ROW signal lines (rw)"; |
136 | | case 0x29: return "[UIF/KBGPIO] Keyboard ROW ?? (rw)"; |
137 | | case 0x2A: return "[UIF/KBGPIO] Keyboard COL signal lines (rw)"; |
138 | | case 0x2B: return "[UIF/KBGPIO] Keyboard COL ?? (rw)"; |
139 | | case 0x2C: return "[UIF/GENSIO] CCont write (w)"; |
140 | | case 0x2D: return "[UIF/GENSIO] GENSIO start transaction (w)"; |
141 | | case 0x2E: return "[UIF/GENSIO] LCD data write (w)"; |
142 | | case 0x32: return "[UIF] CTRL I/O 2 (rw)"; |
143 | | case 0x33: return "[UIF] CTRL I/O 3 (rw)"; |
144 | | case 0x36: return "[SIMI] SIM UART TxD (w)"; |
145 | | case 0x37: return "[SIMI] SIM UART RxD (r)"; |
146 | | case 0x38: return "[SIMI] SIM UART Interrupt Identification (r)"; |
147 | | case 0x39: return "[SIMI] SIM Control (rw)"; |
148 | | case 0x3A: return "[SIMI] SIM Clock Control (rw)"; |
149 | | case 0x3B: return "[SIMI] SIM UART TxD Low Water Mark (?)"; |
150 | | case 0x3C: return "[SIMI] SIM UART RxD queue fill (r)"; |
151 | | case 0x3D: return "[SIMI] SIM RxD flags (?)"; |
152 | | case 0x3E: return "[SIMI] SIM TxD flags (?)"; |
153 | | case 0x3F: return "[SIMI] SIM UART TxD queue fill (r)"; |
154 | | case 0x68: return "[UIF/KBGPIO] Keyboard ROW ?? 2 (rw)"; |
155 | | case 0x69: return "[UIF/KBGPIO] Keyboard ROW interrupt (rw)"; |
156 | | case 0x6A: return "[UIF/KBGPIO] Keyboard COL ?? 2 (rw)"; |
157 | | case 0x6B: return "[UIF/KBGPIO] Keyboard COL interrupt mask (rw)"; |
158 | | case 0x6C: return "[UIF/GENSIO] CCont read (r)"; |
159 | | case 0x6D: return "[UIF/GENSIO] GENSIO status (r)"; |
160 | | case 0x6E: return "[UIF/GENSIO] LCD command write (w)"; |
161 | | case 0x6F: return "[UIF/GENSIO] GENSIO ?? (3/SELECT1) (?)"; |
162 | | case 0x70: return "[UIF] CTRL I/O 0 I/O direction (1) (rw)"; |
163 | | case 0x71: return "[UIF] CTRL I/O 1 I/O direction (1) (rw)"; |
164 | | case 0x72: return "[UIF] CTRL I/O 2 I/O direction (1) (rw)"; |
165 | | case 0x73: return "[UIF] CTRL I/O 3 I/O direction (1) (rw)"; |
166 | | case 0xA8: return "[UIF/KBGPIO] Keyboard ROW I/O direction (rw)"; |
167 | | case 0xA9: return "[UIF/KBGPIO] Keyboard ROW ?? 3 (rw)"; |
168 | | case 0xAA: return "[UIF/KBGPIO] Keyboard COL I/O direction 0=in 1=out (rw)"; |
169 | | case 0xAB: return "[UIF/KBGPIO] Keyboard COL ?? 3 (rw)"; |
170 | | case 0xAD: return "[UIF/GENSIO] GENSIO ?? (1/SELECT2) (?)"; |
171 | | case 0xAE: return "[UIF/GENSIO] GENSIO ?? (2/SELECT2) (?)"; |
172 | | case 0xAF: return "[UIF/GENSIO] GENSIO ?? (3/SELECT2) (?)"; |
173 | | case 0xB0: return "[UIF] CTRL I/O 0 I/O direction (2) (rw)"; |
174 | | case 0xB1: return "[UIF] CTRL I/O 1 I/O direction (2) (rw)"; |
175 | | case 0xB2: return "[UIF] CTRL I/O 2 I/O direction (2) (rw)"; |
176 | | case 0xB3: return "[UIF] CTRL I/O 3 I/O direction (2) (rw)"; |
177 | | case 0xED: return "[UIF/GENSIO] GENSIO ?? (1/SELECT3) (?)"; |
178 | | case 0xEE: return "[UIF/GENSIO] GENSIO ?? (2/SELECT3) (?)"; |
179 | | case 0xEF: return "[UIF/GENSIO] GENSIO ?? (3/SELECT3) (?)"; |
180 | | case 0xF0: return "[UIF] CTRL I/O 0 input (r)"; |
181 | | case 0xF1: return "[UIF] CTRL I/O 1 input (r)"; |
182 | | case 0xF2: return "[UIF] CTRL I/O 2 input (r)"; |
183 | | case 0xF3: return "[UIF] CTRL I/O 3 input (r)"; |
184 | | default: return "<Unknown>"; |
| 104 | case 0x00: return "[CTSI] DCT3 ASIC version Primary hardware version (r)"; |
| 105 | case 0x01: return "[CTSI] MCU reset control register (rw)"; |
| 106 | case 0x02: return "[CTSI] DSP reset control register (rw)"; |
| 107 | case 0x03: return "[CTSI] ASIC watchdog write register (w)"; |
| 108 | case 0x04: return "[CTSI] Sleep clock counter (MSB) (r)"; |
| 109 | case 0x05: return "[CTSI] Sleep clock counter (LSB) (r)"; |
| 110 | case 0x06: return "[CTSI] ? (sleep) clock destination (LSB) (r)"; |
| 111 | case 0x07: return "[CTSI] ? (sleep) clock destination (MSB) (r)"; |
| 112 | case 0x08: return "[CTSI] FIQ lines active (rw)"; |
| 113 | case 0x09: return "[CTSI] IRQ lines active (rw)"; |
| 114 | case 0x0A: return "[CTSI] FIQ lines mask (rw)"; |
| 115 | case 0x0B: return "[CTSI] IRQ lines mask (rw)"; |
| 116 | case 0x0C: return "[CTSI] Interrupt control register (rw)"; |
| 117 | case 0x0D: return "[CTSI] Clock control register (rw)"; |
| 118 | case 0x0E: return "[CTSI] Interrupt trigger register (r)"; |
| 119 | case 0x0F: return "[CTSI] Programmable timer clock divider (rw)"; |
| 120 | case 0x10: return "[CTSI] Programmable timer counter (MSB) (r)"; |
| 121 | case 0x11: return "[CTSI] Programmable timer counter (LSB) (r)"; |
| 122 | case 0x12: return "[CTSI] Programmable timer destination (MSB) (rw)"; |
| 123 | case 0x13: return "[CTSI] Programmable timer destination (LSB) (rw)"; |
| 124 | case 0x15: return "[PUP] PUP control (rw)"; |
| 125 | case 0x16: return "[PUP] FIQ 8 (timer?) interrupt control (rw)"; |
| 126 | case 0x18: return "[PUP] MBUS control (rw)"; |
| 127 | case 0x19: return "[PUP] MBUS status (rw)"; |
| 128 | case 0x1A: return "[PUP] MBUS RX/TX (rw)"; |
| 129 | case 0x1B: return "[PUP] Vibrator (w)"; |
| 130 | case 0x1C: return "[PUP] Buzzer clock divider (w)"; |
| 131 | case 0x1E: return "[PUP] Buzzer volume (w)"; |
| 132 | case 0x20: return "[PUP] McuGenIO signal lines (rw)"; |
| 133 | case 0x22: return "[PUP] ? (?)"; |
| 134 | case 0x24: return "[PUP] McuGenIO I/O direction (rw)"; |
| 135 | case 0x28: return "[UIF/KBGPIO] Keyboard ROW signal lines (rw)"; |
| 136 | case 0x29: return "[UIF/KBGPIO] Keyboard ROW ?? (rw)"; |
| 137 | case 0x2A: return "[UIF/KBGPIO] Keyboard COL signal lines (rw)"; |
| 138 | case 0x2B: return "[UIF/KBGPIO] Keyboard COL ?? (rw)"; |
| 139 | case 0x2C: return "[UIF/GENSIO] CCont write (w)"; |
| 140 | case 0x2D: return "[UIF/GENSIO] GENSIO start transaction (w)"; |
| 141 | case 0x2E: return "[UIF/GENSIO] LCD data write (w)"; |
| 142 | case 0x32: return "[UIF] CTRL I/O 2 (rw)"; |
| 143 | case 0x33: return "[UIF] CTRL I/O 3 (rw)"; |
| 144 | case 0x36: return "[SIMI] SIM UART TxD (w)"; |
| 145 | case 0x37: return "[SIMI] SIM UART RxD (r)"; |
| 146 | case 0x38: return "[SIMI] SIM UART Interrupt Identification (r)"; |
| 147 | case 0x39: return "[SIMI] SIM Control (rw)"; |
| 148 | case 0x3A: return "[SIMI] SIM Clock Control (rw)"; |
| 149 | case 0x3B: return "[SIMI] SIM UART TxD Low Water Mark (?)"; |
| 150 | case 0x3C: return "[SIMI] SIM UART RxD queue fill (r)"; |
| 151 | case 0x3D: return "[SIMI] SIM RxD flags (?)"; |
| 152 | case 0x3E: return "[SIMI] SIM TxD flags (?)"; |
| 153 | case 0x3F: return "[SIMI] SIM UART TxD queue fill (r)"; |
| 154 | case 0x68: return "[UIF/KBGPIO] Keyboard ROW ?? 2 (rw)"; |
| 155 | case 0x69: return "[UIF/KBGPIO] Keyboard ROW interrupt (rw)"; |
| 156 | case 0x6A: return "[UIF/KBGPIO] Keyboard COL ?? 2 (rw)"; |
| 157 | case 0x6B: return "[UIF/KBGPIO] Keyboard COL interrupt mask (rw)"; |
| 158 | case 0x6C: return "[UIF/GENSIO] CCont read (r)"; |
| 159 | case 0x6D: return "[UIF/GENSIO] GENSIO status (r)"; |
| 160 | case 0x6E: return "[UIF/GENSIO] LCD command write (w)"; |
| 161 | case 0x6F: return "[UIF/GENSIO] GENSIO ?? (3/SELECT1) (?)"; |
| 162 | case 0x70: return "[UIF] CTRL I/O 0 I/O direction (1) (rw)"; |
| 163 | case 0x71: return "[UIF] CTRL I/O 1 I/O direction (1) (rw)"; |
| 164 | case 0x72: return "[UIF] CTRL I/O 2 I/O direction (1) (rw)"; |
| 165 | case 0x73: return "[UIF] CTRL I/O 3 I/O direction (1) (rw)"; |
| 166 | case 0xA8: return "[UIF/KBGPIO] Keyboard ROW I/O direction (rw)"; |
| 167 | case 0xA9: return "[UIF/KBGPIO] Keyboard ROW ?? 3 (rw)"; |
| 168 | case 0xAA: return "[UIF/KBGPIO] Keyboard COL I/O direction 0=in 1=out (rw)"; |
| 169 | case 0xAB: return "[UIF/KBGPIO] Keyboard COL ?? 3 (rw)"; |
| 170 | case 0xAD: return "[UIF/GENSIO] GENSIO ?? (1/SELECT2) (?)"; |
| 171 | case 0xAE: return "[UIF/GENSIO] GENSIO ?? (2/SELECT2) (?)"; |
| 172 | case 0xAF: return "[UIF/GENSIO] GENSIO ?? (3/SELECT2) (?)"; |
| 173 | case 0xB0: return "[UIF] CTRL I/O 0 I/O direction (2) (rw)"; |
| 174 | case 0xB1: return "[UIF] CTRL I/O 1 I/O direction (2) (rw)"; |
| 175 | case 0xB2: return "[UIF] CTRL I/O 2 I/O direction (2) (rw)"; |
| 176 | case 0xB3: return "[UIF] CTRL I/O 3 I/O direction (2) (rw)"; |
| 177 | case 0xED: return "[UIF/GENSIO] GENSIO ?? (1/SELECT3) (?)"; |
| 178 | case 0xEE: return "[UIF/GENSIO] GENSIO ?? (2/SELECT3) (?)"; |
| 179 | case 0xEF: return "[UIF/GENSIO] GENSIO ?? (3/SELECT3) (?)"; |
| 180 | case 0xF0: return "[UIF] CTRL I/O 0 input (r)"; |
| 181 | case 0xF1: return "[UIF] CTRL I/O 1 input (r)"; |
| 182 | case 0xF2: return "[UIF] CTRL I/O 2 input (r)"; |
| 183 | case 0xF3: return "[UIF] CTRL I/O 3 input (r)"; |
| 184 | default: return "<Unknown>"; |
185 | 185 | } |
186 | 186 | } |
187 | 187 | #endif |
r253023 | r253024 | |
191 | 191 | { |
192 | 192 | switch(offset) |
193 | 193 | { |
194 | | case 0x0: return "Control register (w)"; |
195 | | case 0x1: return "PWM (charger) (w)"; |
196 | | case 0x2: return "A/D read (LSB) (r)"; |
197 | | case 0x3: return "A/D read (MSB) (rw)"; |
198 | | case 0x4: return "?"; |
199 | | case 0x5: return "Watchdog (WDReg) (w)"; |
200 | | case 0x6: return "RTC enabled (w)"; |
201 | | case 0x7: return "RTC second (rw)"; |
202 | | case 0x8: return "RTC minute (r)"; |
203 | | case 0x9: return "RTC hour (r)"; |
204 | | case 0xA: return "RTC day (rw)"; |
205 | | case 0xB: return "RTC alarm minute (rw)"; |
206 | | case 0xC: return "RTC alarm hour (rw)"; |
207 | | case 0xD: return "RTC calibration value (rw)"; |
208 | | case 0xE: return "Interrupt lines (rw)"; |
209 | | case 0xF: return "Interrupt mask (rw)"; |
210 | | default: return "<Unknown>"; |
| 194 | case 0x0: return "Control register (w)"; |
| 195 | case 0x1: return "PWM (charger) (w)"; |
| 196 | case 0x2: return "A/D read (LSB) (r)"; |
| 197 | case 0x3: return "A/D read (MSB) (rw)"; |
| 198 | case 0x4: return "?"; |
| 199 | case 0x5: return "Watchdog (WDReg) (w)"; |
| 200 | case 0x6: return "RTC enabled (w)"; |
| 201 | case 0x7: return "RTC second (rw)"; |
| 202 | case 0x8: return "RTC minute (r)"; |
| 203 | case 0x9: return "RTC hour (r)"; |
| 204 | case 0xA: return "RTC day (rw)"; |
| 205 | case 0xB: return "RTC alarm minute (rw)"; |
| 206 | case 0xC: return "RTC alarm hour (rw)"; |
| 207 | case 0xD: return "RTC calibration value (rw)"; |
| 208 | case 0xE: return "Interrupt lines (rw)"; |
| 209 | case 0xF: return "Interrupt mask (rw)"; |
| 210 | default: return "<Unknown>"; |
211 | 211 | } |
212 | 212 | } |
213 | 213 | #endif |
r253023 | r253024 | |
215 | 215 | void noki3310_state::machine_start() |
216 | 216 | { |
217 | 217 | m_ram = std::make_unique<UINT16[]>(0x40000); |
218 | | m_dsp_ram = std::make_unique<UINT16[]>(0x800); // DSP shared RAM |
| 218 | m_dsp_ram = std::make_unique<UINT16[]>(0x800); // DSP shared RAM |
219 | 219 | |
220 | 220 | // allocate timers |
221 | 221 | m_timer0 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(noki3310_state::timer0), this)); |
r253023 | r253024 | |
231 | 231 | m_maincpu->set_state_int(ARM7_R15, 0x200040); |
232 | 232 | |
233 | 233 | memset(m_mad2_regs, 0, 0x100); |
234 | | m_mad2_regs[0x01] = 0x01; // power-on flag |
235 | | m_mad2_regs[0x0c] = 0x0a; // disable FIQ and IRQ |
236 | | m_mad2_regs[0x03] = 0xff; // disable MAD2 watchdog |
237 | | m_ccont.watchdog = 0; // disable CCONT watchdog |
| 234 | m_mad2_regs[0x01] = 0x01; // power-on flag |
| 235 | m_mad2_regs[0x0c] = 0x0a; // disable FIQ and IRQ |
| 236 | m_mad2_regs[0x03] = 0xff; // disable MAD2 watchdog |
| 237 | m_ccont.watchdog = 0; // disable CCONT watchdog |
238 | 238 | m_ccont.dc = false; |
239 | 239 | |
240 | 240 | m_fiq_status = 0; |
r253023 | r253024 | |
242 | 242 | m_timer1_counter = 0; |
243 | 243 | m_timer0_counter = 0; |
244 | 244 | |
245 | | m_timer0->adjust(attotime::from_hz(33055 / (255 + 1)), 0, attotime::from_hz(33055 / (255 + 1))); // programmable through port 0x0f |
| 245 | m_timer0->adjust(attotime::from_hz(33055 / (255 + 1)), 0, attotime::from_hz(33055 / (255 + 1))); // programmable through port 0x0f |
246 | 246 | m_timer1->adjust(attotime::from_hz(1057), 0, attotime::from_hz(1057)); |
247 | 247 | m_timer_watchdog->adjust(attotime::from_hz(1), 0, attotime::from_hz(1)); |
248 | 248 | m_timer_fiq8->adjust(attotime::from_hz(1000), 0, attotime::from_hz(1000)); |
r253023 | r253024 | |
256 | 256 | |
257 | 257 | void noki3310_state::assert_fiq(int num) |
258 | 258 | { |
259 | | if ((m_mad2_regs[0x0c] & 0x01) == 0) // check if FIQ is globally enabled |
| 259 | if ((m_mad2_regs[0x0c] & 0x01) == 0) // check if FIQ is globally enabled |
260 | 260 | return; |
261 | 261 | |
262 | 262 | if (num < 8) |
r253023 | r253024 | |
277 | 277 | |
278 | 278 | void noki3310_state::assert_irq(int num) |
279 | 279 | { |
280 | | if ((m_mad2_regs[0x0c] & 0x04) == 0) // check if IRQ is globally enabled |
| 280 | if ((m_mad2_regs[0x0c] & 0x04) == 0) // check if IRQ is globally enabled |
281 | 281 | return; |
282 | 282 | |
283 | 283 | if (num < 8) |
r253023 | r253024 | |
327 | 327 | |
328 | 328 | switch(addr) |
329 | 329 | { |
330 | | case 0x0: // ADC |
| 330 | case 0x0: // ADC |
331 | 331 | { |
332 | 332 | UINT16 ad_id = (data >> 4) & 0x07; |
333 | 333 | UINT16 ad_value = 0; |
334 | 334 | switch(ad_id) |
335 | 335 | { |
336 | | case 0: ad_value = 0x000; break; // Accessory Detect |
337 | | case 1: ad_value = 0x3ff; break; // Received signal strength |
338 | | case 2: ad_value = 0x3ff; break; // Battery voltage |
339 | | case 3: ad_value = 0x280; break; // Battery type |
340 | | case 4: ad_value = 0x000; break; // Battery temperature |
341 | | case 5: ad_value = 0x000; break; // Charger voltage |
342 | | case 6: ad_value = 0x000; break; // VCX0 (Voltage controlled oscilator) temperature |
343 | | case 7: ad_value = 0x000; break; // Charging current |
| 336 | case 0: ad_value = 0x000; break; // Accessory Detect |
| 337 | case 1: ad_value = 0x3ff; break; // Received signal strength |
| 338 | case 2: ad_value = 0x3ff; break; // Battery voltage |
| 339 | case 3: ad_value = 0x280; break; // Battery type |
| 340 | case 4: ad_value = 0x000; break; // Battery temperature |
| 341 | case 5: ad_value = 0x000; break; // Charger voltage |
| 342 | case 6: ad_value = 0x000; break; // VCX0 (Voltage controlled oscilator) temperature |
| 343 | case 7: ad_value = 0x000; break; // Charging current |
344 | 344 | } |
345 | 345 | |
346 | 346 | m_ccont.regs[addr] = data; |
r253023 | r253024 | |
348 | 348 | m_ccont.regs[3] = ((ad_value >> 8) & 0x03); |
349 | 349 | break; |
350 | 350 | } |
351 | | case 0x5: // CCONT watchdog |
| 351 | case 0x5: // CCONT watchdog |
352 | 352 | if (data == 0x20) |
353 | 353 | m_ccont.regs[addr] = data; |
354 | 354 | else if (data == 0x31) |
r253023 | r253024 | |
382 | 382 | |
383 | 383 | switch(addr) |
384 | 384 | { |
385 | | case 0x3: data = 0xb0 | (m_ccont.regs[addr] & 0x03); break; |
386 | | case 0x7: data = systime.local_time.second; break; |
387 | | case 0x8: data = systime.local_time.minute; break; |
388 | | case 0x9: data = systime.local_time.hour; break; |
389 | | case 0xa: data = systime.local_time.mday; break; |
390 | | case 0xe: data |= 0x01; break; |
| 385 | case 0x3: data = 0xb0 | (m_ccont.regs[addr] & 0x03); break; |
| 386 | case 0x7: data = systime.local_time.second; break; |
| 387 | case 0x8: data = systime.local_time.minute; break; |
| 388 | case 0x9: data = systime.local_time.hour; break; |
| 389 | case 0xa: data = systime.local_time.mday; break; |
| 390 | case 0xe: data |= 0x01; break; |
391 | 391 | } |
392 | 392 | |
393 | 393 | m_ccont.dc = !m_ccont.dc; |
r253023 | r253024 | |
460 | 460 | { |
461 | 461 | m_maincpu->reset(); |
462 | 462 | machine_reset(); |
463 | | m_mad2_regs[0x01] |= 0x02; // Last reset was by watchdog |
| 463 | m_mad2_regs[0x01] |= 0x02; // Last reset was by watchdog |
464 | 464 | } |
465 | 465 | } |
466 | 466 | } |
r253023 | r253024 | |
468 | 468 | READ16_MEMBER(noki3310_state::dsp_ram_r) |
469 | 469 | { |
470 | 470 | // HACK: avoid hangs when ARM try to communicate with the DSP |
471 | | if (offset <= 0x004 >> 1) return 0x01; |
472 | | if (offset == 0x0e0 >> 1) return 0x00; |
473 | | if (offset == 0x0fe >> 1) return 0x01; |
474 | | if (offset == 0x100 >> 1) return 0x01; |
| 471 | if (offset <= 0x004 >> 1) return 0x01; |
| 472 | if (offset == 0x0e0 >> 1) return 0x00; |
| 473 | if (offset == 0x0fe >> 1) return 0x01; |
| 474 | if (offset == 0x100 >> 1) return 0x01; |
475 | 475 | |
476 | 476 | return m_dsp_ram[offset & 0x7ff]; |
477 | 477 | } |
r253023 | r253024 | |
488 | 488 | switch(offset) |
489 | 489 | { |
490 | 490 | case 0x00: |
491 | | data = 0x40; // ASIC version |
| 491 | data = 0x40; // ASIC version |
492 | 492 | break; |
493 | 493 | case 0x04: |
494 | 494 | data = m_timer1_counter >> 8; |
r253023 | r253024 | |
535 | 535 | data = nokia_ccont_r(); |
536 | 536 | break; |
537 | 537 | case 0x6d: |
538 | | data = 0x07; // GENSIO ready |
| 538 | data = 0x07; // GENSIO ready |
539 | 539 | break; |
540 | 540 | } |
541 | 541 | |
r253023 | r253024 | |
553 | 553 | { |
554 | 554 | case 0x02: |
555 | 555 | //printf("DSP %s\n", data & 1 ? "RUN" : "HOLD"); |
556 | | //if (data & 0x01) debugger_break(machine()); |
| 556 | //if (data & 0x01) debugger_break(machine()); |
557 | 557 | break; |
558 | 558 | case 0x08: |
559 | 559 | ack_fiq(data); |
r253023 | r253024 | |
624 | 624 | |
625 | 625 | static ADDRESS_MAP_START( noki3310_map, AS_PROGRAM, 32, noki3310_state ) |
626 | 626 | ADDRESS_MAP_GLOBAL_MASK(0x00ffffff) |
627 | | AM_RANGE(0x00000000, 0x0000ffff) AM_MIRROR(0x80000) AM_READWRITE16(ram_r, ram_w, 0xffffffff) // boot ROM / RAM |
628 | | AM_RANGE(0x00010000, 0x00010fff) AM_MIRROR(0x8f000) AM_READWRITE16(dsp_ram_r, dsp_ram_w, 0xffffffff) // DSP shared memory |
629 | | AM_RANGE(0x00020000, 0x000200ff) AM_MIRROR(0x8ff00) AM_READWRITE8(mad2_io_r, mad2_io_w, 0xffffffff) // IO (Primary I/O range, configures peripherals) |
630 | | AM_RANGE(0x00030000, 0x00030003) AM_MIRROR(0x8fffc) AM_READWRITE8(mad2_dspif_r, mad2_dspif_w, 0xffffffff) // DSPIF (API control register) |
631 | | AM_RANGE(0x00040000, 0x00040003) AM_MIRROR(0x8fffc) AM_READWRITE8(mad2_mcuif_r, mad2_mcuif_w, 0xffffffff) // MCUIF (Secondary I/O range, configures memory ranges) |
632 | | AM_RANGE(0x00100000, 0x0017ffff) AM_READWRITE16(ram_r, ram_w, 0xffffffff) // RAMSelX |
633 | | AM_RANGE(0x00200000, 0x005fffff) AM_DEVREADWRITE16("flash", intelfsh16_device, read, write, 0xffffffff) // ROM1SelX |
634 | | AM_RANGE(0x00600000, 0x009fffff) AM_UNMAP // ROM2SelX |
635 | | AM_RANGE(0x00a00000, 0x00dfffff) AM_UNMAP // EEPROMSelX |
636 | | AM_RANGE(0x00e00000, 0x00ffffff) AM_UNMAP // Reserved |
| 627 | AM_RANGE(0x00000000, 0x0000ffff) AM_MIRROR(0x80000) AM_READWRITE16(ram_r, ram_w, 0xffffffff) // boot ROM / RAM |
| 628 | AM_RANGE(0x00010000, 0x00010fff) AM_MIRROR(0x8f000) AM_READWRITE16(dsp_ram_r, dsp_ram_w, 0xffffffff) // DSP shared memory |
| 629 | AM_RANGE(0x00020000, 0x000200ff) AM_MIRROR(0x8ff00) AM_READWRITE8(mad2_io_r, mad2_io_w, 0xffffffff) // IO (Primary I/O range, configures peripherals) |
| 630 | AM_RANGE(0x00030000, 0x00030003) AM_MIRROR(0x8fffc) AM_READWRITE8(mad2_dspif_r, mad2_dspif_w, 0xffffffff) // DSPIF (API control register) |
| 631 | AM_RANGE(0x00040000, 0x00040003) AM_MIRROR(0x8fffc) AM_READWRITE8(mad2_mcuif_r, mad2_mcuif_w, 0xffffffff) // MCUIF (Secondary I/O range, configures memory ranges) |
| 632 | AM_RANGE(0x00100000, 0x0017ffff) AM_READWRITE16(ram_r, ram_w, 0xffffffff) // RAMSelX |
| 633 | AM_RANGE(0x00200000, 0x005fffff) AM_DEVREADWRITE16("flash", intelfsh16_device, read, write, 0xffffffff) // ROM1SelX |
| 634 | AM_RANGE(0x00600000, 0x009fffff) AM_UNMAP // ROM2SelX |
| 635 | AM_RANGE(0x00a00000, 0x00dfffff) AM_UNMAP // EEPROMSelX |
| 636 | AM_RANGE(0x00e00000, 0x00ffffff) AM_UNMAP // Reserved |
637 | 637 | ADDRESS_MAP_END |
638 | 638 | |
639 | 639 | |
640 | 640 | INPUT_CHANGED_MEMBER( noki3310_state::key_irq ) |
641 | 641 | { |
642 | | if (!newval) // TODO: COL/ROW IRQ mask |
| 642 | if (!newval) // TODO: COL/ROW IRQ mask |
643 | 643 | assert_irq(0); |
644 | 644 | } |
645 | 645 | |
646 | 646 | static INPUT_PORTS_START( noki3310 ) |
647 | 647 | PORT_START("COL.0") |
648 | 648 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) |
649 | | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
650 | | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 649 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 650 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
651 | 651 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) |
652 | | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 652 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
653 | 653 | |
654 | 654 | PORT_START("COL.1") |
655 | 655 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) |
656 | | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 656 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
657 | 657 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) |
658 | | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
659 | | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 658 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 659 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
660 | 660 | |
661 | 661 | PORT_START("COL.2") |
662 | 662 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) |
663 | 663 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) |
664 | | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
665 | | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
666 | | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 664 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 665 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 666 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
667 | 667 | |
668 | 668 | PORT_START("COL.3") |
669 | 669 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) |
670 | 670 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) |
671 | | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
672 | | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
673 | | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 671 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 672 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 673 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
674 | 674 | |
675 | 675 | PORT_START("COL.4") |
676 | 676 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) |
677 | | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
678 | | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
679 | | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
680 | | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 677 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 678 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 679 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 680 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
681 | 681 | |
682 | 682 | PORT_START("PWR") |
683 | | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SPACE) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
| 683 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SPACE) PORT_CHANGED_MEMBER(DEVICE_SELF, noki3310_state, key_irq, 0) |
684 | 684 | PORT_BIT( 0x1d, IP_ACTIVE_LOW, IPT_UNUSED ) |
685 | 685 | INPUT_PORTS_END |
686 | 686 | |
r253023 | r253024 | |
688 | 688 | static MACHINE_CONFIG_START( noki3310, noki3310_state ) |
689 | 689 | |
690 | 690 | /* basic machine hardware */ |
691 | | MCFG_CPU_ADD("maincpu", ARM7_BE, 26000000 / 2) // MAD2WD1 13 MHz, clock internally supplied to ARM core can be divided by 2, in sleep mode a 32768 Hz clock is used |
| 691 | MCFG_CPU_ADD("maincpu", ARM7_BE, 26000000 / 2) // MAD2WD1 13 MHz, clock internally supplied to ARM core can be divided by 2, in sleep mode a 32768 Hz clock is used |
692 | 692 | MCFG_CPU_PROGRAM_MAP(noki3310_map) |
693 | 693 | |
694 | 694 | /* video hardware */ |
r253023 | r253024 | |
719 | 719 | static MACHINE_CONFIG_DERIVED( noki3410, noki3330 ) |
720 | 720 | |
721 | 721 | MCFG_SCREEN_MODIFY("screen") |
722 | | MCFG_SCREEN_SIZE(96, 65) // Philips OM6206 |
| 722 | MCFG_SCREEN_SIZE(96, 65) // Philips OM6206 |
723 | 723 | |
724 | 724 | MACHINE_CONFIG_END |
725 | 725 | |
726 | 726 | static MACHINE_CONFIG_DERIVED( noki7110, noki3330 ) |
727 | 727 | |
728 | 728 | MCFG_SCREEN_MODIFY("screen") |
729 | | MCFG_SCREEN_SIZE(96, 65) // Epson SED1565 |
| 729 | MCFG_SCREEN_SIZE(96, 65) // Epson SED1565 |
730 | 730 | |
731 | 731 | MACHINE_CONFIG_END |
732 | 732 | |
r253023 | r253024 | |
740 | 740 | |
741 | 741 | // MAD2 internal ROMS |
742 | 742 | #define MAD2_INTERNAL_ROMS \ |
743 | | ROM_REGION16_BE(0x10000, "boot_rom", ROMREGION_ERASE00 ) \ |
744 | | ROM_LOAD("boot_rom", 0x00000, 0x10000, NO_DUMP) \ |
| 743 | ROM_REGION16_BE(0x10000, "boot_rom", ROMREGION_ERASE00 ) \ |
| 744 | ROM_LOAD("boot_rom", 0x00000, 0x10000, NO_DUMP) \ |
745 | 745 | \ |
746 | | ROM_REGION16_BE(0x20000, "dsp", ROMREGION_ERASE00 ) \ |
747 | | ROM_LOAD("dsp_prom" , 0x00000, 0xc000, NO_DUMP) \ |
748 | | ROM_LOAD("dsp_drom" , 0x0c000, 0x4000, NO_DUMP) \ |
749 | | ROM_LOAD("dsp_pdrom", 0x10000, 0x1000, NO_DUMP) \ |
| 746 | ROM_REGION16_BE(0x20000, "dsp", ROMREGION_ERASE00 ) \ |
| 747 | ROM_LOAD("dsp_prom" , 0x00000, 0xc000, NO_DUMP) \ |
| 748 | ROM_LOAD("dsp_drom" , 0x0c000, 0x4000, NO_DUMP) \ |
| 749 | ROM_LOAD("dsp_pdrom", 0x10000, 0x1000, NO_DUMP) |
750 | 750 | |
751 | | |
752 | 751 | ROM_START( noki3210 ) |
753 | 752 | MAD2_INTERNAL_ROMS |
754 | 753 | |
755 | 754 | ROM_REGION16_BE(0x200000, "flash", ROMREGION_ERASEFF ) |
756 | | ROM_SYSTEM_BIOS(0, "600", "v6.00") // A 03-10-2000 |
| 755 | ROM_SYSTEM_BIOS(0, "600", "v6.00") // A 03-10-2000 |
757 | 756 | ROMX_LOAD("3210F600A.fls", 0x000000, 0x200000, CRC(6a978478) SHA1(6bdec2ec76aca15bc12b621be4402e455562454b), ROM_BIOS(1)) |
758 | 757 | |
759 | 758 | ROM_REGION16_BE(0x04000, "eeprom", 0 ) |
r253023 | r253024 | |
764 | 763 | MAD2_INTERNAL_ROMS |
765 | 764 | |
766 | 765 | ROM_REGION16_BE(0x200000, "flash", ROMREGION_ERASEFF ) |
767 | | ROM_SYSTEM_BIOS(0, "607", "v6.07") // C 17-06-2003 |
768 | | ROM_SYSTEM_BIOS(1, "579", "v5.79") // N 11-11-2002 |
769 | | ROM_SYSTEM_BIOS(2, "513", "v5.13") // C 11-01-2002 |
| 766 | ROM_SYSTEM_BIOS(0, "607", "v6.07") // C 17-06-2003 |
| 767 | ROM_SYSTEM_BIOS(1, "579", "v5.79") // N 11-11-2002 |
| 768 | ROM_SYSTEM_BIOS(2, "513", "v5.13") // C 11-01-2002 |
770 | 769 | ROMX_LOAD("3310_607_PPM_C.fls", 0x000000, 0x200000, CRC(5743f6ba) SHA1(0e80b5f1698909c9850be770c1289566582aa77a), ROM_BIOS(1)) |
771 | 770 | ROMX_LOAD("3310 NR1 v5.79.fls", 0x000000, 0x200000, CRC(26b4f0df) SHA1(649de05ed88205a080693b918cd1295ac691dff1), ROM_BIOS(2)) |
772 | 771 | ROMX_LOAD("3310 v. 5.13 C.fls", 0x000000, 0x1d0000, CRC(0f66d256) SHA1(04d8dabe2c454d6a1161f352d85c69c409895000), ROM_BIOS(3)) |
r253023 | r253024 | |
782 | 781 | MAD2_INTERNAL_ROMS |
783 | 782 | |
784 | 783 | ROM_REGION16_BE(0x0400000, "flash", ROMREGION_ERASEFF ) |
785 | | ROM_SYSTEM_BIOS(0, "450", "v4.50") // C 12-10-2001 |
| 784 | ROM_SYSTEM_BIOS(0, "450", "v4.50") // C 12-10-2001 |
786 | 785 | ROMX_LOAD("3330F450C.fls", 0x000000, 0x350000, CRC(259313e7) SHA1(88bcc39d9358fd8a8562fe3a0280f0ce82f5897f), ROM_BIOS(1)) |
787 | 786 | ROM_LOAD("3330 virgin eeprom 005F0000.fls", 0x3f0000, 0x010000, CRC(23459c10) SHA1(68481effb39d90a1639e8f261009c66e97d3e668)) |
788 | 787 | ROM_END |
r253023 | r253024 | |
791 | 790 | MAD2_INTERNAL_ROMS |
792 | 791 | |
793 | 792 | ROM_REGION16_BE(0x0400000, "flash", ROMREGION_ERASEFF ) |
794 | | ROM_SYSTEM_BIOS(0, "506", "v5.06") // C 29-11-2002 |
| 793 | ROM_SYSTEM_BIOS(0, "506", "v5.06") // C 29-11-2002 |
795 | 794 | ROMX_LOAD("3410_5-06c.fls", 0x000000, 0x370000, CRC(1483e094) SHA1(ef26026297c779de7b01923a364ded822e720c38), ROM_BIOS(1)) |
796 | 795 | ROM_END |
797 | 796 | |
r253023 | r253024 | |
799 | 798 | MAD2_INTERNAL_ROMS |
800 | 799 | |
801 | 800 | ROM_REGION16_BE(0x0400000, "flash", ROMREGION_ERASEFF ) |
802 | | ROM_SYSTEM_BIOS(0, "540", "v5.40") // C 11-10-2003 |
803 | | ROM_SYSTEM_BIOS(1, "525", "v5.25") // C 26-02-2003 |
804 | | ROM_SYSTEM_BIOS(2, "520", "v5.20") // C 12-08-2002 |
| 801 | ROM_SYSTEM_BIOS(0, "540", "v5.40") // C 11-10-2003 |
| 802 | ROM_SYSTEM_BIOS(1, "525", "v5.25") // C 26-02-2003 |
| 803 | ROM_SYSTEM_BIOS(2, "520", "v5.20") // C 12-08-2002 |
805 | 804 | ROMX_LOAD("5210_5.40_PPM_C.FLS", 0x000000, 0x380000, CRC(e37d5beb) SHA1(726f000780dd67750b7d2859687f846ce17a1bf7), ROM_BIOS(1)) |
806 | 805 | ROMX_LOAD("5210_5.25_PPM_C.FLS", 0x000000, 0x380000, CRC(13bba458) SHA1(3b5244244743fba48f9061e158f95fc46b86446e), ROM_BIOS(2)) |
807 | 806 | ROMX_LOAD("5210_520_C.fls", 0x000000, 0x380000, CRC(38648cd3) SHA1(9210e15e6bd780f86c467bec33ef54d6393abe5a), ROM_BIOS(3)) |
r253023 | r253024 | |
811 | 810 | MAD2_INTERNAL_ROMS |
812 | 811 | |
813 | 812 | ROM_REGION16_BE(0x0400000, "flash", ROMREGION_ERASEFF ) |
814 | | ROM_SYSTEM_BIOS(0, "556", "v5.56") // C 25-01-2002 |
| 813 | ROM_SYSTEM_BIOS(0, "556", "v5.56") // C 25-01-2002 |
815 | 814 | ROMX_LOAD("6210_556C.fls", 0x000000, 0x3a0000, CRC(203fb962) SHA1(3d9ea319503e78ec69b60d72cda23e461e118ea9), ROM_BIOS(1)) |
816 | 815 | ROM_LOAD("6210 virgin eeprom 005FA000.fls", 0x3fa000, 0x006000, CRC(3c6d3437) SHA1(b3a527ede1be87bd715fb3741a81eef5bd422efa)) |
817 | 816 | ROM_END |
r253023 | r253024 | |
820 | 819 | MAD2_INTERNAL_ROMS |
821 | 820 | |
822 | 821 | ROM_REGION16_BE(0x0400000, "flash", ROMREGION_ERASEFF ) |
823 | | ROM_SYSTEM_BIOS(0, "503", "v5.03") // C 06-12-2001 |
| 822 | ROM_SYSTEM_BIOS(0, "503", "v5.03") // C 06-12-2001 |
824 | 823 | ROMX_LOAD("6250-503mcuPPMC.fls", 0x000000, 0x3a0000, CRC(8dffb91b) SHA1(95607ce39c383bda75f1e6aeae67a214b787b0a1), ROM_BIOS(1)) |
825 | 824 | ROM_LOAD("6250 virgin eeprom 005FA000.fls", 0x3fa000, 0x006000, CRC(6087ce70) SHA1(57c29c8387caf864603d94a22bfb63ace427b7f9)) |
826 | 825 | ROM_END |
r253023 | r253024 | |
829 | 828 | MAD2_INTERNAL_ROMS |
830 | 829 | |
831 | 830 | ROM_REGION16_BE(0x0400000, "flash", ROMREGION_ERASEFF ) |
832 | | ROM_SYSTEM_BIOS(0, "501", "v5.01") // C 08-12-2000 |
| 831 | ROM_SYSTEM_BIOS(0, "501", "v5.01") // C 08-12-2000 |
833 | 832 | ROMX_LOAD("7110F501_ppmC.fls", 0x000000, 0x390000, CRC(919ac753) SHA1(53af8324919f455ba8199d2c05f7a921cfb811d5), ROM_BIOS(1)) |
834 | 833 | ROM_LOAD("7110 virgin eeprom 005FA000.fls", 0x3fa000, 0x006000, CRC(78e7d8c1) SHA1(8b4dd782fc9d1306268ba63124ee463ac646912b)) |
835 | 834 | ROM_END |
r253023 | r253024 | |
838 | 837 | MAD2_INTERNAL_ROMS |
839 | 838 | |
840 | 839 | ROM_REGION16_BE(0x200000, "flash", ROMREGION_ERASEFF ) |
841 | | ROM_SYSTEM_BIOS(0, "531", "v5.31") // C 08-03-2002 |
| 840 | ROM_SYSTEM_BIOS(0, "531", "v5.31") // C 08-03-2002 |
842 | 841 | ROMX_LOAD("8210_5.31PPM_C.FLS", 0x000000, 0x1d0000, CRC(927022b1) SHA1(c1a0fe95cedb89a92b19654208cc4855e1a4988e), ROM_BIOS(1)) |
843 | 842 | ROM_LOAD("8210 virgin eeprom 003D0000.fls", 0x1d0000, 0x030000, CRC(37fddeea) SHA1(1c01ad3948ff9919890498a84f31052369d93e1d)) |
844 | 843 | ROM_END |
r253023 | r253024 | |
847 | 846 | MAD2_INTERNAL_ROMS |
848 | 847 | |
849 | 848 | ROM_REGION16_BE(0x200000, "flash", ROMREGION_ERASEFF ) |
850 | | ROM_SYSTEM_BIOS(0, "502", "v5.02") // K 28-01-2002 |
| 849 | ROM_SYSTEM_BIOS(0, "502", "v5.02") // K 28-01-2002 |
851 | 850 | ROMX_LOAD("8250-502mcuPPMK.fls", 0x000000, 0x1d0000, CRC(2c58e48b) SHA1(f26c98ffcfffbbd5714889e10cfa41c5f6dd2529), ROM_BIOS(1)) |
852 | 851 | ROM_LOAD("8250 virgin eeprom 003D0000.fls", 0x1d0000, 0x030000, CRC(7ca585e0) SHA1(a974fb5fddcd0438ac4aaf32b431f1453e8d923c)) |
853 | 852 | ROM_END |
r253023 | r253024 | |
856 | 855 | MAD2_INTERNAL_ROMS |
857 | 856 | |
858 | 857 | ROM_REGION16_BE(0x200000, "flash", ROMREGION_ERASEFF ) |
859 | | ROM_SYSTEM_BIOS(0, "531", "v5.31") // C 08-03-2002 |
| 858 | ROM_SYSTEM_BIOS(0, "531", "v5.31") // C 08-03-2002 |
860 | 859 | ROMX_LOAD("8850v531.fls", 0x000000, 0x1d0000, CRC(8864fcb3) SHA1(9f966787403b68a09530680ad911302403eb1521), ROM_BIOS(1)) |
861 | 860 | ROM_LOAD("8850 virgin eeprom 003D0000.fls", 0x1d0000, 0x030000, CRC(4823f27e) SHA1(b09455302d98fbedf35072c9ecfd7721a04924b0)) |
862 | 861 | ROM_END |
r253023 | r253024 | |
865 | 864 | MAD2_INTERNAL_ROMS |
866 | 865 | |
867 | 866 | ROM_REGION16_BE(0x200000, "flash", ROMREGION_ERASEFF ) |
868 | | ROM_SYSTEM_BIOS(0, "1220", "v12.20") // C 19-03-2001 |
| 867 | ROM_SYSTEM_BIOS(0, "1220", "v12.20") // C 19-03-2001 |
869 | 868 | ROMX_LOAD("8890_12.20_ppmC.FLS", 0x000000, 0x1d0000, CRC(77206f78) SHA1(a214a0d69760ecd8eeca0b9d82f95c94bdfe70ed), ROM_BIOS(1)) |
870 | 869 | ROM_LOAD("8890 virgin eeprom 003D0000.fls", 0x1d0000, 0x030000, CRC(1d8ef3b5) SHA1(cc0924cfd4c0ce796fca157c640fc3183c2b5f2c)) |
871 | 870 | ROM_END |
trunk/src/mame/drivers/spc1500.cpp
r253023 | r253024 | |
7 | 7 | 2015-12-16 preliminary driver initialized |
8 | 8 | 2015-12-18 cassette tape supported |
9 | 9 | 2015-12-26 80/40 column mode supported |
10 | | 2015-12-28 double access mode supported for I/O |
| 10 | 2015-12-28 double access mode supported for I/O |
11 | 11 | 2016-01-02 Korean character input method and display enabled |
12 | | 2016-01-03 user defined char (PCG, Programmable Character Generator) support |
13 | | 2016-01-05 detection of color palette initialization |
| 12 | 2016-01-03 user defined char (PCG, Programmable Character Generator) support |
| 13 | 2016-01-05 detection of color palette initialization |
14 | 14 | 2016-01-06 80x16 mode graphic mode support |
15 | 15 | 2016-01-10 double character support |
16 | 16 | 2016-01-12 PCG adressing improved |
17 | 17 | 2016-01-13 Cassette tape motor improved |
18 | | |
| 18 | |
19 | 19 | TODO: |
20 | 20 | - Verify PCG ram read for Korean character (english character is fine) |
21 | 21 | - Support floppy disk drive with SD-1500A controller card |
22 | | |
| 22 | |
23 | 23 | ****************************************************************************/ |
24 | 24 | |
25 | 25 | /* |
r253023 | r253024 | |
32 | 32 | * Market price 365,000 won ($430) on 04-01-1987 |
33 | 33 | |
34 | 34 | Hardware Specification |
35 | | |
| 35 | |
36 | 36 | 1) SPC-1500 |
37 | 37 | RAM 122KB |
38 | 38 | - Main Memory: 64KB |
r253023 | r253024 | |
59 | 59 | Two external power connector for FDD connection |
60 | 60 | - DIP switch settings for the screen |
61 | 61 | - Volume control |
62 | | |
| 62 | |
63 | 63 | 2) SPC-1500A |
64 | 64 | July 1987 Release |
65 | 65 | RF modulator only remove the product from an existing model |
66 | | |
| 66 | |
67 | 67 | 3) SPC-1500V |
68 | 68 | This product can not confirm the release date because of PCB level modification. |
69 | 69 | It equiped SPC-1500V VLSI chip embedded products and removed a lot of TTLs and the memory expansion card. |
70 | 70 | - IOCS ROM Version: 1.6 |
71 | 71 | - Two internal 50-pin expension slots |
72 | | |
| 72 | |
73 | 73 | Firmware |
74 | | |
| 74 | |
75 | 75 | IOCS ROM |
76 | 76 | The various versions with 32KB of capacity existed to date has confirmed the final version number 1.8 |
77 | 77 | - Version 1.3: |
r253023 | r253024 | |
79 | 79 | - Version 1.5: |
80 | 80 | - Version 1.6: |
81 | 81 | - Version 1.8: supports a variety of peripherals such as external hard disk, FM-Sound, RS-232C from Static soft (C) |
82 | | various memu appears on the initial screen. |
83 | | |
| 82 | various memu appears on the initial screen. |
| 83 | |
84 | 84 | BASIC ROM |
85 | 85 | Capacity and the final version number of the currently identified 32KB 1.3 |
86 | | |
| 86 | |
87 | 87 | English ROM |
88 | 88 | The final version of the verification of the capacity 8KB SS150-1222 |
89 | 89 | The character set of a 8x8 size, and are stored with the size 8x16 8x16 is a part of the size of the font data are written differently and 8x8. |
90 | | |
| 90 | |
91 | 91 | Hangul ROM |
92 | 92 | 8KB each is divided by a consonant and consonant and neutral. |
93 | 93 | - Inital (Choseong) SS151-1223: 8 types of intial character (actual 6 types) |
94 | 94 | - Middle (Jungseong) SS152-1224: 2 types of middle character |
95 | 95 | - Final (Jongseong) SS153-1225: 2 types of final character |
96 | | |
| 96 | |
97 | 97 | Periperials - Monitor |
98 | 98 | - , high-resolution monitor SM, color monitor model was to distinguish it from CD. |
99 | | |
| 99 | |
100 | 100 | 1) MD-1255H (Low resolution monitors MD) |
101 | 101 | - 12 inches Composite 15.734KHz / 60Hz |
102 | 102 | - N displayed after the model name in the model is non - CRT scanning products |
103 | 103 | - Stand adopted: if you put the rest on the bottom that can be placed slightly tilted back. |
104 | | |
| 104 | |
105 | 105 | 2) MD-9052H (Low resolution monitors MD) |
106 | 106 | - 9 inches Composite 15.734KHz / 60Hz |
107 | | - N from model name means 'anti-glare' |
| 107 | - N from model name means 'anti-glare' |
108 | 108 | - All parts except for the appearance and size is the same as the CRT 1255H. |
109 | | |
| 109 | |
110 | 110 | 3) MD-2563 (color monitor SM) |
111 | 111 | 4) SM-1439A (high-resolution monitor SM) |
112 | 112 | 5) SM-1422 (high-resolution monitor SM) |
r253023 | r253024 | |
115 | 115 | - High-resolution monochrome monitor |
116 | 116 | 7) SM-1231A (high-resolution monitor SM) |
117 | 117 | - The other part is other than the appearance of the stand is attached to the same as the model SM-1231 |
118 | | |
119 | | 8) CD-1451D (color monitor SM) |
| 118 | |
| 119 | 8) CD-1451D (color monitor SM) |
120 | 120 | - Composite color monitors |
121 | 121 | 9) CD-1462X (color monitor SM) |
122 | 122 | 10)CD-1464W (color monitor SM) |
123 | | 11)CW-4644 |
124 | | |
| 123 | 11)CW-4644 |
| 124 | |
125 | 125 | FDD (floppy disk drive) |
126 | | |
| 126 | |
127 | 127 | 1) SD-1500A |
128 | 128 | - 5.25 "floppy drive for 2D composed of external disk drives diskettes |
129 | | 2) SD-1500B |
| 129 | 2) SD-1500B |
130 | 130 | - Dual external disk drives |
131 | 131 | - The two models are idential except the number of FDD. They need the expension controller card named by SFC-1500. |
132 | 132 | - IBM PC XT compatible FDD can be quipped. SFD-5x0 model is a genuine FDD from Samsung Electronics. |
133 | 133 | |
134 | 134 | HDD (Hard Disk Drive) |
135 | | |
| 135 | |
136 | 136 | 1) STH-20 |
137 | 137 | - External hard disk drive set having a capacity of 20MB SCSI controller and the way |
138 | 138 | - The controller had not solved alone but the controller can be used to mount another hard disk products. |
139 | 139 | - Release price: 450,000 won ($530). |
140 | | |
| 140 | |
141 | 141 | Joysticks |
142 | | - Joystick was limited to 1 as possible (The PCB was designed by supporting two joysticks. |
143 | | |
| 142 | - Joystick was limited to 1 as possible (The PCB was designed by supporting two joysticks. |
| 143 | |
144 | 144 | 1) SJ-1500 |
145 | 145 | - Release price: 8,000 won ($9.4) |
146 | 146 | - SPC-1000A, MSX-compatible |
147 | | |
| 147 | |
148 | 148 | Printer |
149 | | |
| 149 | |
150 | 150 | 1) SP-510S |
151 | 151 | - Bitmap image output method Hangul support |
152 | 152 | - Recommanded 80 columns dot-matrix printer |
r253023 | r253024 | |
157 | 157 | 5) SP-570B |
158 | 158 | |
159 | 159 | Expansion Cards |
160 | | |
| 160 | |
161 | 161 | 1) SFC-1500 |
162 | 162 | - External FDD capacity of the floppy disk controller 5.25 inches / 320KB can connect up to two. |
163 | | |
| 163 | |
164 | 164 | 2) Multi-controller |
165 | 165 | - Floppy disk controllers and hard disk controllers on the same PCB. |
166 | | |
| 166 | |
167 | 167 | 3) ST-PAC |
168 | 168 | - FM sound card can play with up to 9 simultaneous sound or 5 simultaneous sound and 5 drum tones at the same time (FM-PAC compatible MSX) |
169 | 169 | - Line output and speaker output volume, tone adjustment built-in volume |
170 | | - it can be used as a synthesizer by connecting the ST-KEY2 product |
| 170 | - it can be used as a synthesizer by connecting the ST-KEY2 product |
171 | 171 | - Release price: 60,000won ($71) |
172 | | |
| 172 | |
173 | 173 | SPC-1500 VDP card |
174 | | - MSX game support |
| 174 | - MSX game support |
175 | 175 | - Release price: 35,000won ($41) with composite output only |
176 | 176 | - Release price: 60,000won ($71) with composite and RGB outputs simultaneously |
177 | | |
| 177 | |
178 | 178 | VDP UNIT I |
179 | 179 | - Composite video output with built-in card expansion card using the same video chip and MSX (static soft) |
180 | 180 | - Release price: 40,000won ($47). |
181 | | |
| 181 | |
182 | 182 | VDP UNIT II |
183 | 183 | - Expansion using the same video chip and video card with built-in card MSX with an RGB output (static soft) |
184 | 184 | - Release price: 55,000won ($59). |
185 | | |
| 185 | |
186 | 186 | LAN card (SAMNET-K) |
187 | 187 | - It uses serial communication instead of an Ethernet network card has a way with two serial ports. |
188 | 188 | - There are two kinds of host card without a DIP switch and the DIP switch is in the client card. |
189 | 189 | - It was mainly supplied to the teacher / student in an educational institution. |
190 | | |
| 190 | |
191 | 191 | Super Pack Card |
192 | 192 | - Expansion cards that enable the external expansion slot, etc. |
193 | | |
| 193 | |
194 | 194 | RS-232C card |
195 | | - At least 300bps, an external modem connected to the serial communication card that supports up to 19,200bps |
196 | | additionally available communications services using the PSTN network (general switched telephone network) |
197 | | and may also be connected to a 9-pin serial mouse. |
198 | | - Support for common serial communications functions, |
| 195 | - At least 300bps, an external modem connected to the serial communication card that supports up to 19,200bps |
| 196 | additionally available communications services using the PSTN network (general switched telephone network) |
| 197 | and may also be connected to a 9-pin serial mouse. |
| 198 | - Support for common serial communications functions, |
199 | 199 | and if IOCS ROM version 1.8 or higher to connect an external modem to the PC communication card is available. |
200 | | - When used in this communication program is super soft static net programs (XMODEM protocol, FS 220-6 compatible |
| 200 | - When used in this communication program is super soft static net programs (XMODEM protocol, FS 220-6 compatible |
201 | 201 | and supporting Samsung/Sambo combination korean character code, and an 8-bit code completion support Hangul) is used. |
202 | 202 | - Release price: 60,000won ($71). |
203 | | |
| 203 | |
204 | 204 | SS-1 ROM pack unit |
205 | 205 | - The VDP unit containing 1 cartridge slot card and ROM pack |
206 | 206 | - ROM pack was not compatible with original MSX ROM pack |
207 | 207 | - Release price: 49,900won ($58) |
208 | | |
| 208 | |
209 | 209 | Super Pack |
210 | 210 | - External ROM cartrige from Static Soft (C) |
211 | 211 | - 1 cartridge slot and 3 expansion slots (up to five expansion slots available) |
212 | 212 | - It is available to use the MSX ROM packs without any modification with the static soft VDP card |
213 | 213 | - Release price: 60,000won ($71) |
214 | | |
| 214 | |
215 | 215 | ST-KEY2 |
216 | 216 | - For synthesizer external keyboard |
217 | | |
| 217 | |
218 | 218 | * Compatiblity with X1 series of Sharp Electronics |
219 | 219 | - Almost the key components is the same as X1 models of Sharp Electronics and except for the keyboard input. |
220 | 220 | - To port the X1 software to SPC-1500, Text attribute, keyboard input and DMA related code should be modified |
221 | | |
| 221 | |
222 | 222 | */ |
223 | 223 | |
224 | 224 | #include "emu.h" |
r253023 | r253024 | |
247 | 247 | , m_pcgram(*this, "pcgram") |
248 | 248 | , m_io_kb(*this, "LINE") |
249 | 249 | , m_io_joy(*this, "JOY") |
250 | | , m_dipsw(*this, "DIP_SWITCH") |
| 250 | , m_dipsw(*this, "DIP_SWITCH") |
251 | 251 | , m_centronics(*this, "centronics") |
252 | 252 | , m_pio(*this, "ppi8255") |
253 | 253 | , m_sound(*this, "ay8910") |
254 | 254 | , m_palette(*this, "palette") |
255 | 255 | , m_timer(nullptr) |
256 | 256 | {} |
257 | | DECLARE_READ8_MEMBER(psga_r); |
| 257 | DECLARE_READ8_MEMBER(psga_r); |
258 | 258 | DECLARE_READ8_MEMBER(porta_r); |
259 | 259 | DECLARE_WRITE_LINE_MEMBER( centronics_busy_w ) { m_centronics_busy = state; } |
260 | 260 | DECLARE_READ8_MEMBER(mc6845_videoram_r); |
r253023 | r253024 | |
281 | 281 | DECLARE_READ8_MEMBER(io_r); |
282 | 282 | DECLARE_PALETTE_INIT(spc); |
283 | 283 | DECLARE_VIDEO_START(spc); |
284 | | MC6845_UPDATE_ROW(crtc_update_row); |
| 284 | MC6845_UPDATE_ROW(crtc_update_row); |
285 | 285 | MC6845_RECONFIGURE(crtc_reconfig); |
286 | 286 | TIMER_DEVICE_CALLBACK_MEMBER(timer); |
287 | 287 | private: |
r253023 | r253024 | |
315 | 315 | required_device<centronics_device> m_centronics; |
316 | 316 | required_device<i8255_device> m_pio; |
317 | 317 | required_device<ay8910_device> m_sound; |
318 | | required_device<palette_device> m_palette; |
319 | | UINT8 *m_font; |
| 318 | required_device<palette_device> m_palette; |
| 319 | UINT8 *m_font; |
320 | 320 | UINT8 m_priority; |
321 | 321 | emu_timer *m_timer; |
322 | 322 | void get_pcg_addr(); |
r253023 | r253024 | |
338 | 338 | if (m_ipl) |
339 | 339 | membank("bank1")->set_entry(0); |
340 | 340 | else |
341 | | membank("bank1")->set_entry(1); |
| 341 | membank("bank1")->set_entry(1); |
342 | 342 | } |
343 | 343 | |
344 | 344 | WRITE8_MEMBER( spc1500_state::ramsel) |
r253023 | r253024 | |
349 | 349 | |
350 | 350 | WRITE8_MEMBER( spc1500_state::portb_w) |
351 | 351 | { |
352 | | // m_ipl = data & (1 << 1); |
| 352 | // m_ipl = data & (1 << 1); |
353 | 353 | } |
354 | 354 | |
355 | 355 | WRITE8_MEMBER( spc1500_state::psgb_w) |
r253023 | r253024 | |
381 | 381 | READ8_MEMBER( spc1500_state::portb_r) |
382 | 382 | { |
383 | 383 | UINT8 data = 0; |
384 | | data |= ((m_cass->get_state() & CASSETTE_MASK_UISTATE) == CASSETTE_STOPPED || ((m_cass->get_state() & CASSETTE_MASK_MOTOR) == CASSETTE_MOTOR_DISABLED)); |
385 | | data |= (m_dipsw->read() & 1) << 4; |
386 | | data |= (m_cass->input() > 0.0038)<<1; |
387 | | data |= m_vdg->vsync_r()<<7; |
388 | | data &= ~((m_centronics_busy==0)<<3); |
389 | | return data; |
| 384 | data |= ((m_cass->get_state() & CASSETTE_MASK_UISTATE) == CASSETTE_STOPPED || ((m_cass->get_state() & CASSETTE_MASK_MOTOR) == CASSETTE_MOTOR_DISABLED)); |
| 385 | data |= (m_dipsw->read() & 1) << 4; |
| 386 | data |= (m_cass->input() > 0.0038)<<1; |
| 387 | data |= m_vdg->vsync_r()<<7; |
| 388 | data &= ~((m_centronics_busy==0)<<3); |
| 389 | return data; |
390 | 390 | } |
391 | 391 | |
392 | 392 | WRITE8_MEMBER( spc1500_state::crtc_w) |
r253023 | r253024 | |
444 | 444 | m_pcg_offset[0] = 0; |
445 | 445 | m_pcg_offset[1] = 0; |
446 | 446 | m_pcg_offset[2] = 0; |
447 | | } |
| 447 | } |
448 | 448 | } |
449 | 449 | |
450 | 450 | WRITE8_MEMBER( spc1500_state::pcg_w) |
r253023 | r253024 | |
506 | 506 | |
507 | 507 | VIDEO_START_MEMBER(spc1500_state, spc) |
508 | 508 | { |
509 | | |
510 | 509 | } |
511 | 510 | |
512 | 511 | MC6845_RECONFIGURE(spc1500_state::crtc_reconfig) |
513 | 512 | { |
514 | | // printf("reconfig. w:%d, h:%d, %f (%d,%d,%d,%d)\n", width, height, (float)frame_period, visarea.left(), visarea.top(), visarea.right(), visarea.bottom()); |
515 | | // printf("register. m_vert_disp:%d, m_horiz_disp:%d, m_max_ras_addr:%d, m_vert_char_total:%d\n", m_crtc_vreg[6], m_crtc_vreg[1], m_crtc_vreg[9], m_crtc_vreg[0x4]); |
| 513 | // printf("reconfig. w:%d, h:%d, %f (%d,%d,%d,%d)\n", width, height, (float)frame_period, visarea.left(), visarea.top(), visarea.right(), visarea.bottom()); |
| 514 | // printf("register. m_vert_disp:%d, m_horiz_disp:%d, m_max_ras_addr:%d, m_vert_char_total:%d\n", m_crtc_vreg[6], m_crtc_vreg[1], m_crtc_vreg[9], m_crtc_vreg[0x4]); |
516 | 515 | } |
517 | 516 | |
518 | 517 | MC6845_UPDATE_ROW(spc1500_state::crtc_update_row) |
r253023 | r253024 | |
524 | 523 | int j; |
525 | 524 | int h1, h2, h3; |
526 | 525 | UINT32 *p = &bitmap.pix32(y); |
527 | | |
| 526 | |
528 | 527 | unsigned char cho[] ={1,1,1,1,1,1,1,1,0,0,1,1,1,3,5,5,0,0,5,3,3,5,5,5,0,0,3,3,5,1}; |
529 | 528 | unsigned char jong[]={0,0,0,1,1,1,1,1,0,0,1,1,1,2,2,2,0,0,2,2,2,2,2,2,0,0,2,2,1,1}; |
530 | 529 | bool inv = false; |
r253023 | r253024 | |
564 | 563 | hfnt = hfnt & ((*pf << 8) | (*(pf+16))); |
565 | 564 | pf = &m_font[0x6000+(h3 * 32) + (jong[h2]-1) * 16 * 2 * 32 + n]; |
566 | 565 | hfnt = hfnt & ((*pf << 8) | (*(pf+16))); |
567 | | } |
| 566 | } |
568 | 567 | else |
569 | 568 | { |
570 | 569 | ascii = *(pv+0x1001); |
r253023 | r253024 | |
639 | 638 | if (offset < 0x1e00) { romsel(space, offset, data);} else |
640 | 639 | if (offset < 0x1f00) { ramsel(space, offset, data);} else |
641 | 640 | if (offset < 0x2000) {} else |
642 | | if (offset < 0x10000) |
643 | | { |
644 | | if (offset < 0x4000) |
| 641 | if (offset < 0x10000) |
| 642 | { |
| 643 | if (offset < 0x4000) |
645 | 644 | { |
646 | 645 | offset &= 0xf7ff; |
647 | 646 | m_p_videoram[offset-0x1800] = m_p_videoram[offset-0x2000] = data; |
648 | 647 | } |
649 | 648 | else |
650 | | m_p_videoram[offset-0x2000] = data; |
| 649 | m_p_videoram[offset-0x2000] = data; |
651 | 650 | }; |
652 | 651 | } |
653 | 652 | } |
r253023 | r253024 | |
655 | 654 | READ8_MEMBER( spc1500_state::io_r) |
656 | 655 | { |
657 | 656 | m_double_mode = false; |
658 | | if (offset < 0x1000) {} else |
| 657 | if (offset < 0x1000) {} else |
659 | 658 | if (offset < 0x1400) {} else |
660 | 659 | if (offset < 0x1800) { return pcg_r(space, offset); } else |
661 | 660 | if (offset < 0x1900) { return crtc_r(space, offset); } else |
r253023 | r253024 | |
663 | 662 | if (offset < 0x1b00) { return m_pio->read(space, offset); } else |
664 | 663 | if (offset < 0x1c00) { return m_sound->data_r(space, offset); } else |
665 | 664 | if (offset < 0x2000) {} else |
666 | | if (offset < 0x10000){ |
| 665 | if (offset < 0x10000){ |
667 | 666 | if (offset < 0x4000) |
668 | 667 | offset &= 0xf7ff; |
669 | 668 | return m_p_videoram[offset - 0x2000]; } |
r253023 | r253024 | |
680 | 679 | #if 0 |
681 | 680 | static ADDRESS_MAP_START( spc1500_io , AS_IO, 8, spc1500_state ) |
682 | 681 | ADDRESS_MAP_UNMAP_HIGH |
683 | | // AM_RANGE(0x0000, 0x03ff) AM_DEVREADWRITE("userio", user_device, userio_r, userio_w) |
684 | | // AM_RANGE(0x0400, 0x05ff) AM_DEVREADWRITE("lanio", lan_device, lanio_r, lanio_w) |
685 | | // AM_RANGE(0x0600, 0x07ff) AM_DEVREADWRITE("rs232c", rs232c_device, rs232c_r, rs232c_w) |
686 | | // AM_RANGE(0x0800, 0x09ff) AM_DEVREADWRITE("fdcx", fdcx_device, fdcx_r, fdcx_w) |
687 | | // AM_RANGE(0x0a00, 0x0bff) AM_DEVREADWRITE("userio", user_device, userio_r, userio_w) |
688 | | // AM_RANGE(0x0c00, 0x0dff) AM_DEVREADWRITE("fdc", fdc_device, fdc_r, fdc_w) |
689 | | // AM_RANGE(0x0e00, 0x0fff) AM_DEVREADWRITE("extram", extram_device, extram_r, extram_w) |
| 682 | // AM_RANGE(0x0000, 0x03ff) AM_DEVREADWRITE("userio", user_device, userio_r, userio_w) |
| 683 | // AM_RANGE(0x0400, 0x05ff) AM_DEVREADWRITE("lanio", lan_device, lanio_r, lanio_w) |
| 684 | // AM_RANGE(0x0600, 0x07ff) AM_DEVREADWRITE("rs232c", rs232c_device, rs232c_r, rs232c_w) |
| 685 | // AM_RANGE(0x0800, 0x09ff) AM_DEVREADWRITE("fdcx", fdcx_device, fdcx_r, fdcx_w) |
| 686 | // AM_RANGE(0x0a00, 0x0bff) AM_DEVREADWRITE("userio", user_device, userio_r, userio_w) |
| 687 | // AM_RANGE(0x0c00, 0x0dff) AM_DEVREADWRITE("fdc", fdc_device, fdc_r, fdc_w) |
| 688 | // AM_RANGE(0x0e00, 0x0fff) AM_DEVREADWRITE("extram", extram_device, extram_r, extram_w) |
690 | 689 | AM_RANGE(0x1000, 0x10ff) AM_WRITE(paletb_w) |
691 | 690 | AM_RANGE(0x1100, 0x11ff) AM_WRITE(paletr_w) |
692 | 691 | AM_RANGE(0x1200, 0x12ff) AM_WRITE(paletg_w) |
r253023 | r253024 | |
696 | 695 | AM_RANGE(0x1600, 0x16ff) AM_READWRITE(pcgr_r, pcgr_w) |
697 | 696 | AM_RANGE(0x1700, 0x17ff) AM_WRITE(pcgg_w) |
698 | 697 | AM_RANGE(0x1800, 0x18ff) AM_READWRITE(crtc_r, crtc_w) |
699 | | // AM_RANGE(0x1800, 0x1800) AM_DEVWRITE("mc6845", mc6845_device, address_w) |
700 | | // AM_RANGE(0x1801, 0x1801) AM_DEVREADWRITE("mc6845", mc6845_device, register_r, register_w) |
701 | | // AM_RANGE(0x1800, 0x1801) AM_READWRITE(crtc_r, crtc_w) |
| 698 | // AM_RANGE(0x1800, 0x1800) AM_DEVWRITE("mc6845", mc6845_device, address_w) |
| 699 | // AM_RANGE(0x1801, 0x1801) AM_DEVREADWRITE("mc6845", mc6845_device, register_r, register_w) |
| 700 | // AM_RANGE(0x1800, 0x1801) AM_READWRITE(crtc_r, crtc_w) |
702 | 701 | AM_RANGE(0x1900, 0x1909) AM_READ(keyboard_r) |
703 | | AM_RANGE(0x1a00, 0x1a03) AM_DEVREADWRITE("ppi8255", i8255_device, read, write) |
| 702 | AM_RANGE(0x1a00, 0x1a03) AM_DEVREADWRITE("ppi8255", i8255_device, read, write) |
704 | 703 | AM_RANGE(0x1b00, 0x1bff) AM_DEVREADWRITE("ay8910", ay8910_device, data_r, data_w) |
705 | 704 | AM_RANGE(0x1c00, 0x1cff) AM_DEVWRITE("ay8910", ay8910_device, address_w) |
706 | 705 | AM_RANGE(0x1d00, 0x1d00) AM_WRITE(romsel) |
707 | 706 | AM_RANGE(0x1e00, 0x1e00) AM_WRITE(ramsel) |
708 | 707 | AM_RANGE(0x2000, 0xffff) AM_RAM AM_SHARE("videoram") |
709 | 708 | ADDRESS_MAP_END |
710 | | #endif |
| 709 | #endif |
711 | 710 | |
712 | 711 | /* Input ports */ |
713 | 712 | static INPUT_PORTS_START( spc1500 ) |
714 | 713 | |
715 | | PORT_START("DIP_SWITCH") |
716 | | PORT_DIPNAME( 0x01, 0x00, "40/80" ) |
717 | | PORT_DIPSETTING( 0x00, "40COL" ) |
718 | | PORT_DIPSETTING( 0x01, "80COL" ) |
719 | | PORT_DIPNAME( 0x02, 0x02, "Language" ) |
720 | | PORT_DIPSETTING( 0x02, "Korean" ) |
721 | | PORT_DIPSETTING( 0x00, "English" ) |
| 714 | PORT_START("DIP_SWITCH") |
| 715 | PORT_DIPNAME( 0x01, 0x00, "40/80" ) |
| 716 | PORT_DIPSETTING( 0x00, "40COL" ) |
| 717 | PORT_DIPSETTING( 0x01, "80COL" ) |
| 718 | PORT_DIPNAME( 0x02, 0x02, "Language" ) |
| 719 | PORT_DIPSETTING( 0x02, "Korean" ) |
| 720 | PORT_DIPSETTING( 0x00, "English" ) |
722 | 721 | PORT_DIPNAME( 0x04, 0x00, "V-Res" ) |
723 | | PORT_DIPSETTING( 0x04, "400" ) |
| 722 | PORT_DIPSETTING( 0x04, "400" ) |
724 | 723 | PORT_DIPSETTING( 0x00, "200" ) |
725 | 724 | PORT_DIPNAME( 0x08, 0x08, "X1" ) |
726 | | PORT_DIPSETTING( 0x08, "Compatible Mode" ) |
| 725 | PORT_DIPSETTING( 0x08, "Compatible Mode" ) |
727 | 726 | PORT_DIPSETTING( 0x00, "Non Compatible" ) |
728 | | |
| 727 | |
729 | 728 | PORT_START("LINE.0") |
730 | | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 729 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) |
731 | 730 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_RSHIFT) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) |
732 | 731 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_RCONTROL) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) |
733 | | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 732 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED) |
734 | 733 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_PAUSE) |
735 | 734 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\\ |") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') PORT_CHAR(0x1c) |
736 | 735 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Graph") PORT_CODE(KEYCODE_LALT) |
737 | 736 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) |
738 | 737 | |
739 | 738 | PORT_START("LINE.1") |
740 | | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("= +") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') |
| 739 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("= +") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') |
741 | 740 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT) |
742 | 741 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') |
743 | 742 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) |
r253023 | r253024 | |
768 | 767 | |
769 | 768 | PORT_START("LINE.4") |
770 | 769 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Del Ins") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) PORT_CHAR(8) |
771 | | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) |
| 770 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) |
772 | 771 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') |
773 | 772 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Home") PORT_CODE(KEYCODE_HOME) |
774 | 773 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(0x0e) |
r253023 | r253024 | |
777 | 776 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4 $") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') |
778 | 777 | |
779 | 778 | PORT_START("LINE.5") |
780 | | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 779 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) |
781 | 780 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) |
782 | | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 781 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED) |
783 | 782 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED) |
784 | 783 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') PORT_CHAR(0x0d) |
785 | 784 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') PORT_CHAR(0x07) |
r253023 | r253024 | |
787 | 786 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5 %") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') |
788 | 787 | |
789 | 788 | PORT_START("LINE.6") |
790 | | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 789 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) |
791 | 790 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) |
792 | 791 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("[ {") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') PORT_CHAR(0x1b) |
793 | 792 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(0x18) |
r253023 | r253024 | |
797 | 796 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6 ^") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') |
798 | 797 | |
799 | 798 | PORT_START("LINE.7") |
800 | | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 799 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) |
801 | 800 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) |
802 | | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 801 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED) |
803 | 802 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR(0x10) |
804 | 803 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') |
805 | 804 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') PORT_CHAR(0x0a) |
r253023 | r253024 | |
807 | 806 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7 &") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') |
808 | 807 | |
809 | 808 | PORT_START("LINE.8") |
810 | | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 809 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) |
811 | 810 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) |
812 | | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 811 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED) |
813 | 812 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\' \"") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('\"') |
814 | 813 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') |
815 | 814 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') PORT_CHAR(0x0b) |
r253023 | r253024 | |
817 | 816 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8 *") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') |
818 | 817 | |
819 | 818 | PORT_START("LINE.9") |
820 | | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Hangul") PORT_CODE(KEYCODE_RALT) |
| 819 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Hangul") PORT_CODE(KEYCODE_RALT) |
821 | 820 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) |
822 | 821 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("- _") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') |
823 | 822 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0 )") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') |
r253023 | r253024 | |
834 | 833 | PORT_BIT(0x10, IP_ACTIVE_HIGH,IPT_UNUSED) // DIP SW2 for Korean/English |
835 | 834 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) |
836 | 835 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) |
837 | | PORT_BIT(0x80, IP_ACTIVE_HIGH,IPT_UNUSED) // DIP SW3 for 200/400 line |
| 836 | PORT_BIT(0x80, IP_ACTIVE_HIGH,IPT_UNUSED) // DIP SW3 for 200/400 line |
838 | 837 | INPUT_PORTS_END |
839 | 838 | |
840 | 839 | static ADDRESS_MAP_START(spc1500_mem, AS_PROGRAM, 8, spc1500_state ) |
841 | 840 | ADDRESS_MAP_UNMAP_HIGH |
842 | | AM_RANGE(0x0000, 0x7fff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank2") |
| 841 | AM_RANGE(0x0000, 0x7fff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank2") |
843 | 842 | AM_RANGE(0x8000, 0xffff) AM_READWRITE_BANK("bank4") |
844 | 843 | ADDRESS_MAP_END |
845 | 844 | |
r253023 | r253024 | |
848 | 847 | UINT8 *mem_basic = memregion("basic")->base(); |
849 | 848 | UINT8 *mem_ipl = memregion("ipl")->base(); |
850 | 849 | m_p_ram = m_ram->pointer(); |
851 | | m_font = memregion("font1")->base(); |
| 850 | m_font = memregion("font1")->base(); |
852 | 851 | // configure and intialize banks 1 (read banks) |
853 | 852 | membank("bank1")->configure_entry(0, mem_ipl); |
854 | 853 | membank("bank1")->configure_entry(1, mem_basic); |
r253023 | r253024 | |
859 | 858 | set_address_space(AS_IO, m_maincpu->space(AS_IO)); |
860 | 859 | // intialize banks 2, 3, 4 (write banks) |
861 | 860 | membank("bank2")->set_base(m_p_ram); |
862 | | membank("bank4")->set_base(m_p_ram + 0x8000); |
| 861 | membank("bank4")->set_base(m_p_ram + 0x8000); |
863 | 862 | m_timer = timer_alloc(0); |
864 | 863 | m_timer->adjust(attotime::zero); |
865 | 864 | } |
r253023 | r253024 | |
867 | 866 | void spc1500_state::machine_reset() |
868 | 867 | { |
869 | 868 | m_motor = false; |
870 | | m_time = machine().scheduler().time(); |
| 869 | m_time = machine().scheduler().time(); |
871 | 870 | m_double_mode = false; |
872 | 871 | memset(&m_paltbl[0], 1, 8); |
873 | 872 | m_char_count = 0; |
r253023 | r253024 | |
904 | 903 | MCFG_CPU_PERIODIC_INT_DRIVER(spc1500_state, irq0_line_hold, 60) |
905 | 904 | |
906 | 905 | /* video hardware */ |
907 | | |
| 906 | |
908 | 907 | MCFG_SCREEN_ADD("screen", RASTER) |
909 | 908 | MCFG_SCREEN_REFRESH_RATE(60) |
910 | 909 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ |
911 | 910 | MCFG_SCREEN_SIZE(640, 400) |
912 | 911 | MCFG_SCREEN_VISIBLE_AREA(0,640-1,0,400-1) |
913 | 912 | MCFG_SCREEN_UPDATE_DEVICE("mc6845", mc6845_device, screen_update ) |
914 | | MCFG_PALETTE_ADD("palette", 8) |
| 913 | MCFG_PALETTE_ADD("palette", 8) |
915 | 914 | MCFG_PALETTE_INIT_OWNER(spc1500_state, spc) |
916 | 915 | MCFG_MC6845_ADD("mc6845", MC6845, "screen", (VDP_CLOCK/48)) //unknown divider |
917 | 916 | MCFG_MC6845_SHOW_BORDER_AREA(false) |
918 | 917 | MCFG_MC6845_CHAR_WIDTH(8) |
919 | 918 | MCFG_MC6845_UPDATE_ROW_CB(spc1500_state, crtc_update_row) |
920 | 919 | MCFG_MC6845_RECONFIGURE_CB(spc1500_state, crtc_reconfig) |
921 | | MCFG_VIDEO_START_OVERRIDE(spc1500_state, spc) |
922 | | |
| 920 | MCFG_VIDEO_START_OVERRIDE(spc1500_state, spc) |
| 921 | |
923 | 922 | MCFG_DEVICE_ADD("ppi8255", I8255, 0) |
924 | 923 | MCFG_I8255_OUT_PORTA_CB(DEVWRITE8("cent_data_out", output_latch_device, write)) |
925 | 924 | MCFG_I8255_IN_PORTB_CB(READ8(spc1500_state, portb_r)) |
926 | 925 | MCFG_I8255_OUT_PORTB_CB(WRITE8(spc1500_state, portb_w)) |
927 | 926 | MCFG_I8255_OUT_PORTC_CB(WRITE8(spc1500_state, portc_w)) |
928 | | |
| 927 | |
929 | 928 | MCFG_TIMER_DRIVER_ADD_PERIODIC("1hz", spc1500_state, timer, attotime::from_hz(1)) |
930 | | |
| 929 | |
931 | 930 | /* sound hardware */ |
932 | 931 | MCFG_SPEAKER_STANDARD_MONO("mono") |
933 | 932 | MCFG_SOUND_ADD("ay8910", AY8910, XTAL_4MHz / 2) |
r253023 | r253024 | |
959 | 958 | ROM_LOAD("ipl.rom", 0x0000, 0x8000, CRC(80d0704a) SHA1(01e4cbe8baad72effbbe01addd477c5b0ec85c16)) |
960 | 959 | ROM_REGION(0x8000, "basic", ROMREGION_ERASEFF) |
961 | 960 | ROM_LOAD("basic.rom", 0x0000, 0x8000, CRC(f48328e1) SHA1(fb874ea7d20078726682f2d0e03ea0d1f8bdbb07)) |
962 | | ROM_REGION(0x8000, "font1", 0) |
| 961 | ROM_REGION(0x8000, "font1", 0) |
963 | 962 | ROM_LOAD( "ss150fnt.bin", 0x0000, 0x2000, CRC(affdc5c0) SHA1(2a93582fcccf9e40b99ae238ce585d189afe9a5a) ) |
964 | 963 | ROM_LOAD( "ss151fnt.bin", 0x2000, 0x2000, CRC(83c2eb8d) SHA1(2adf7816206dc74b9f0d32cb3b56cbab31fa6044) ) |
965 | 964 | ROM_LOAD( "ss152fnt.bin", 0x4000, 0x2000, CRC(f4a5a590) SHA1(c9a02756107083bf602ae7c90cfe29b8b964e0df) ) |
966 | 965 | ROM_LOAD( "ss153fnt.bin", 0x6000, 0x2000, CRC(8677d5fa) SHA1(34bfacc855c3846744cd586c150c72e5cbe948b0) ) |
967 | | |
| 966 | |
968 | 967 | ROM_END |
969 | 968 | |
970 | 969 | |
trunk/src/mame/drivers/tourvis.cpp
r253023 | r253024 | |
24 | 24 | Ballistix |
25 | 25 | Be Ball |
26 | 26 | Bomberman |
27 | | Chōzetsurinjin Beraboh Man (Super Foolish Man) |
| 27 | Chozetsurinjin Beraboh Man (Super Foolish Man) |
28 | 28 | Chuka Taisen |
29 | 29 | Columns |
30 | 30 | Coryoon |
r253023 | r253024 | |
471 | 471 | |
472 | 472 | |
473 | 473 | |
474 | | /* 1943 Kai */ |
| 474 | /* 1943 Kai */ |
475 | 475 | ROM_START(tv1943) |
476 | 476 | ROM_REGION( 0x100000, "maincpu", 0 ) |
477 | 477 | ROM_LOAD( "tourv_1943_kia.bin", 0x00000, 0x100000, CRC(de4672ab) SHA1(2da1ee082bfb920c632a95014208f11fb48c58e1) ) |
r253023 | r253024 | |
479 | 479 | TOURVISION_BIOS |
480 | 480 | ROM_END |
481 | 481 | |
482 | | /* Aero Blasters - Hudson / Kaneko */ |
| 482 | /* Aero Blasters - Hudson / Kaneko */ |
483 | 483 | ROM_START(tvablast) |
484 | 484 | ROM_REGION( 0x100000, "maincpu", 0 ) |
485 | 485 | ROM_LOAD( "tourv_ablast.bin", 0x00000, 0x100000, CRC(9302f6d0) SHA1(76ef27a6d639514ed261b9d65f37217f2989d1c0) ) |
r253023 | r253024 | |
487 | 487 | TOURVISION_BIOS |
488 | 488 | ROM_END |
489 | 489 | |
490 | | /* After Burner */ |
| 490 | /* After Burner */ |
491 | 491 | ROM_START(tvaburn) |
492 | 492 | ROM_REGION( 0x100000, "maincpu", 0 ) |
493 | 493 | ROM_LOAD( "tourv_afterburner.bin", 0x00000, 0x100000, CRC(5ce31322) SHA1(08918d443891bd70f1b0b0c739522b764b16bc96) ) |
r253023 | r253024 | |
495 | 495 | TOURVISION_BIOS |
496 | 496 | ROM_END |
497 | 497 | |
498 | | /* Armed-F */ |
| 498 | /* Armed-F */ |
499 | 499 | ROM_START(tvarmedf) |
500 | 500 | ROM_REGION( 0x100000, "maincpu", 0 ) |
501 | 501 | ROM_LOAD( "tourv_armed-f.bin", 0x00000, 0x100000, CRC(056617f5) SHA1(d10eb80b8436b8d217170309647104181cca750a) ) |
r253023 | r253024 | |
503 | 503 | TOURVISION_BIOS |
504 | 504 | ROM_END |
505 | 505 | |
506 | | /* Ballistix */ |
| 506 | /* Ballistix */ |
507 | 507 | ROM_START(tvbalstx) |
508 | 508 | ROM_REGION( 0x100000, "maincpu", 0 ) |
509 | 509 | ROM_LOAD( "tourv_ballistix.bin", 0x00000, 0x100000, CRC(9d32ed98) SHA1(404cc3695940a7fdc802ac166ec564a858a894d0) ) |
r253023 | r253024 | |
511 | 511 | TOURVISION_BIOS |
512 | 512 | ROM_END |
513 | 513 | |
514 | | /* Be Ball */ |
| 514 | /* Be Ball */ |
515 | 515 | ROM_START(tvbeball) |
516 | 516 | ROM_REGION( 0x100000, "maincpu", 0 ) |
517 | 517 | ROM_LOAD( "tourv_be_ball.bin", 0x00000, 0x100000, CRC(4b1e2861) SHA1(bea449543284bb6f4b33b1fb4156cd18a782ad6a) ) |
r253023 | r253024 | |
519 | 519 | TOURVISION_BIOS |
520 | 520 | ROM_END |
521 | 521 | |
522 | | /* Bomberman */ |
| 522 | /* Bomberman */ |
523 | 523 | ROM_START(tvbomber) |
524 | 524 | ROM_REGION( 0x100000, "maincpu", 0 ) |
525 | 525 | ROM_LOAD( "tourv_bomberman.bin", 0x00000, 0x100000, CRC(cfcabe78) SHA1(bdd1766fad43c6c76e1b0d6e8b4f0ba3363442d6) ) |
r253023 | r253024 | |
527 | 527 | TOURVISION_BIOS |
528 | 528 | ROM_END |
529 | 529 | |
530 | | /* Chōzetsurinjin Beraboh Man (Super Foolist Man) */ |
| 530 | /* Chozetsurinjin Beraboh Man (Super Foolist Man) */ |
531 | 531 | ROM_START(tvbrabho) |
532 | 532 | ROM_REGION( 0x100000, "maincpu", 0 ) |
533 | 533 | ROM_LOAD( "tourv_chozetsurinjin_beraboh_man.bin", 0x00000, 0x100000, CRC(1f80cf04) SHA1(121bfb9ba4de4d047b08442d900b7f351210dd48) ) |
r253023 | r253024 | |
535 | 535 | TOURVISION_BIOS |
536 | 536 | ROM_END |
537 | 537 | |
538 | | /* Chuka Taisen */ |
| 538 | /* Chuka Taisen */ |
539 | 539 | ROM_START(tvtaisen) |
540 | 540 | ROM_REGION( 0x100000, "maincpu", 0 ) |
541 | 541 | ROM_LOAD( "tourv_chuka_taisen.bin", 0x00000, 0x100000, CRC(3b9e9185) SHA1(96f9f82a9fa6ee2b92c0294e71d47886e27fdc06) ) |
r253023 | r253024 | |
551 | 551 | TOURVISION_BIOS |
552 | 552 | ROM_END |
553 | 553 | |
554 | | /* Coryoon */ |
| 554 | /* Coryoon */ |
555 | 555 | ROM_START(tvcoryon) |
556 | 556 | ROM_REGION( 0x100000, "maincpu", 0 ) |
557 | 557 | ROM_LOAD( "tourv_corycoon.bin", 0x00000, 0x100000, CRC(c377db91) SHA1(1585d886f775ed361b2558839e544660533e9297) ) |
r253023 | r253024 | |
559 | 559 | TOURVISION_BIOS |
560 | 560 | ROM_END |
561 | 561 | |
562 | | /* Daisenpu */ |
| 562 | /* Daisenpu */ |
563 | 563 | ROM_START(tvdsenpu) |
564 | 564 | ROM_REGION( 0x100000, "maincpu", 0 ) |
565 | 565 | ROM_LOAD( "tourv_daisenpu.bin", 0x00000, 0x100000, CRC(5a8cef75) SHA1(00f27127114e4f5bf69c81212e66948caaec755d) ) |
r253023 | r253024 | |
567 | 567 | TOURVISION_BIOS |
568 | 568 | ROM_END |
569 | 569 | |
570 | | /* Dead Moon */ |
| 570 | /* Dead Moon */ |
571 | 571 | ROM_START(tvdmoon) |
572 | 572 | ROM_REGION( 0x100000, "maincpu", 0 ) |
573 | 573 | ROM_LOAD( "tourv_dead_moon.bin", 0x00000, 0x100000, CRC(b54793c1) SHA1(8899947092d9a02f3be61ac9c293642e83a015ec) ) |
r253023 | r253024 | |
575 | 575 | TOURVISION_BIOS |
576 | 576 | ROM_END |
577 | 577 | |
578 | | /* Devil Crash */ |
| 578 | /* Devil Crash */ |
579 | 579 | ROM_START(tvdevilc) |
580 | 580 | ROM_REGION( 0x100000, "maincpu", 0 ) |
581 | 581 | ROM_LOAD( "tourv_devil_crash.bin", 0x00000, 0x100000, CRC(c163e5c1) SHA1(2134b3943df87af556694dbe6c77b30723f9175a) ) |
r253023 | r253024 | |
583 | 583 | TOURVISION_BIOS |
584 | 584 | ROM_END |
585 | 585 | |
586 | | /* Dodge Ball */ |
| 586 | /* Dodge Ball */ |
587 | 587 | ROM_START(tvdodgeb) |
588 | 588 | ROM_REGION( 0x100000, "maincpu", 0 ) |
589 | 589 | ROM_LOAD( "tourv_dodge_ball.bin", 0x00000, 0x100000, CRC(7a12cf72) SHA1(c477bc5dae4e82a89766052f185afb73ca2234f3) ) |
r253023 | r253024 | |
591 | 591 | TOURVISION_BIOS |
592 | 592 | ROM_END |
593 | 593 | |
594 | | /* Doraemon Meikyuu Daisakusen */ |
| 594 | /* Doraemon Meikyuu Daisakusen */ |
595 | 595 | ROM_START(tvdormon) |
596 | 596 | ROM_REGION( 0x100000, "maincpu", 0 ) |
597 | 597 | ROM_LOAD( "tourv_doreamon.bin", 0x00000, 0x100000, CRC(22e8b5ba) SHA1(f21101358df8625c39a5078b9f1b1a0215470bed) ) |
r253023 | r253024 | |
599 | 599 | TOURVISION_BIOS |
600 | 600 | ROM_END |
601 | 601 | |
602 | | /* Dragon Spirit */ |
| 602 | /* Dragon Spirit */ |
603 | 603 | ROM_START(tvdrgnst) |
604 | 604 | ROM_REGION( 0x100000, "maincpu", 0 ) |
605 | 605 | ROM_LOAD( "tourv_dragon_spirit.bin", 0x00000, 0x100000, CRC(5733951f) SHA1(0256b4c343a3ad1ca625c316a470cc91a5254e8e) ) |
r253023 | r253024 | |
620 | 620 | TOURVISION_BIOS |
621 | 621 | ROM_END |
622 | 622 | |
623 | | /* Final Blaster */ |
| 623 | /* Final Blaster */ |
624 | 624 | ROM_START(tvfblast) |
625 | 625 | ROM_REGION( 0x100000, "maincpu", 0 ) |
626 | 626 | ROM_LOAD( "tourv_final_blaster.bin", 0x00000, 0x100000, CRC(f5f7483c) SHA1(3933719bdd7a0c73cdad76de78d80463112b475a) ) |
r253023 | r253024 | |
636 | 636 | TOURVISION_BIOS |
637 | 637 | ROM_END |
638 | 638 | |
639 | | /* Final Match Tennis */ |
| 639 | /* Final Match Tennis */ |
640 | 640 | ROM_START(tvftenis) |
641 | 641 | ROM_REGION( 0x100000, "maincpu", 0 ) |
642 | 642 | ROM_LOAD( "tourv_final_match_tennis.bin", 0x00000, 0x100000, CRC(f83ed70f) SHA1(f566bd7a806c11f3d33ba0a976e36026a131e6fd) ) |
r253023 | r253024 | |
660 | 660 | TOURVISION_BIOS |
661 | 661 | ROM_END |
662 | 662 | |
663 | | /* Gunhed */ |
| 663 | /* Gunhed */ |
664 | 664 | ROM_START(tvgunhed) |
665 | 665 | ROM_REGION( 0x100000, "maincpu", 0 ) |
666 | 666 | ROM_LOAD( "tourv_gunhed.bin", 0x00000, 0x100000, CRC(9baace99) SHA1(ab676ba72a80314e8cba3810789041d3cc6298f9) ) |
r253023 | r253024 | |
668 | 668 | TOURVISION_BIOS |
669 | 669 | ROM_END |
670 | 670 | |
671 | | /* Hana Taka Daka (Super Long Nose Goblin) */ |
| 671 | /* Hana Taka Daka (Super Long Nose Goblin) */ |
672 | 672 | ROM_START(tvhtdaka) |
673 | 673 | ROM_REGION( 0x100000, "maincpu", 0 ) |
674 | 674 | ROM_LOAD( "tourv_hana_taka_daka.bin", 0x00000, 0x100000, CRC(0fbfda5c) SHA1(02b2ce93ee5e2aaa11c8640ced15258d0d844e6f) ) |
r253023 | r253024 | |
684 | 684 | TOURVISION_BIOS |
685 | 685 | ROM_END |
686 | 686 | |
687 | | /* jinmu Densho */ |
| 687 | /* jinmu Densho */ |
688 | 688 | ROM_START(tvdensho) |
689 | 689 | ROM_REGION( 0x100000, "maincpu", 0 ) |
690 | 690 | ROM_LOAD( "tourv_dinmu_densho.bin", 0x00000, 0x100000, CRC(411a8643) SHA1(46258042dcf6510404ebccaf47034421928f72a8) ) |
r253023 | r253024 | |
692 | 692 | TOURVISION_BIOS |
693 | 693 | ROM_END |
694 | 694 | |
695 | | /* Kiki Kaikai */ |
| 695 | /* Kiki Kaikai */ |
696 | 696 | ROM_START(tvkaikai) |
697 | 697 | ROM_REGION( 0x100000, "maincpu", 0 ) |
698 | 698 | ROM_LOAD( "tourv_kiki_kaikai.bin", 0x00000, 0x100000, CRC(2bdd93f9) SHA1(9b08606865abb8cc8fa17a22becae34b172ff81a) ) |
r253023 | r253024 | |
700 | 700 | TOURVISION_BIOS |
701 | 701 | ROM_END |
702 | 702 | |
703 | | /* Ledgnd of Hero Tonma */ |
| 703 | /* Ledgnd of Hero Tonma */ |
704 | 704 | ROM_START(tvtonma) |
705 | 705 | ROM_REGION( 0x100000, "maincpu", 0 ) |
706 | 706 | ROM_LOAD( "tourv_legend_of_hero_tonma.bin", 0x00000, 0x100000, CRC(e7c2efe3) SHA1(5767bdfa5600b1586e49c17cebd0fd7ef2c5426c) ) |
r253023 | r253024 | |
716 | 716 | TOURVISION_BIOS |
717 | 717 | ROM_END |
718 | 718 | |
719 | | /* Mizubaku Daibouken Liquid Kids */ |
| 719 | /* Mizubaku Daibouken Liquid Kids */ |
720 | 720 | ROM_START(tvlqkids) |
721 | 721 | ROM_REGION( 0x100000, "maincpu", 0 ) |
722 | 722 | ROM_LOAD( "tourv_liquid_kids.bin", 0x00000, 0x100000, CRC(23a8636d) SHA1(752e03dcf8617b5a39cd250f4db1fe13cd13b761) ) |
r253023 | r253024 | |
724 | 724 | TOURVISION_BIOS |
725 | 725 | ROM_END |
726 | 726 | |
727 | | /* Mr Heli */ |
| 727 | /* Mr Heli */ |
728 | 728 | ROM_START(tvmrheli) |
729 | 729 | ROM_REGION( 0x100000, "maincpu", 0 ) |
730 | 730 | ROM_LOAD( "tourv_mr_heli.bin", 0x00000, 0x100000, CRC(bf197c7a) SHA1(048f91f8ab86220a39ab146e531081950eaf1138) ) |
r253023 | r253024 | |
732 | 732 | TOURVISION_BIOS |
733 | 733 | ROM_END |
734 | 734 | |
735 | | /* Ninja Ryukenden */ |
| 735 | /* Ninja Ryukenden */ |
736 | 736 | ROM_START(tvninjar) |
737 | 737 | ROM_REGION( 0x100000, "maincpu", 0 ) |
738 | 738 | ROM_LOAD( "tourv_ninja_ryukenden.bin", 0x00000, 0x100000, CRC(d9cc00ca) SHA1(42d914d338d7d0073b5cc98a4e85729e86bbfad1) ) |
r253023 | r253024 | |
740 | 740 | TOURVISION_BIOS |
741 | 741 | ROM_END |
742 | 742 | |
743 | | /* Operation Wolf */ |
| 743 | /* Operation Wolf */ |
744 | 744 | ROM_START(tvopwolf) |
745 | 745 | ROM_REGION( 0x100000, "maincpu", 0 ) |
746 | 746 | ROM_LOAD( "tourv_operation_wolf.bin", 0x00000, 0x100000, CRC(d4a755a9) SHA1(cd236ba0c3439ba2356cb270f56a41a52e0d6dc6) ) |
r253023 | r253024 | |
748 | 748 | TOURVISION_BIOS |
749 | 749 | ROM_END |
750 | 750 | |
751 | | /* Override */ |
| 751 | /* Override */ |
752 | 752 | ROM_START(tvovride) |
753 | 753 | ROM_REGION( 0x100000, "maincpu", 0 ) |
754 | 754 | ROM_LOAD( "tourv_override.bin", 0x00000, 0x100000, CRC(4dbbf4ef) SHA1(180a68f87a881db1d01ffa3566e0d2e28303d09e) ) |
r253023 | r253024 | |
756 | 756 | TOURVISION_BIOS |
757 | 757 | ROM_END |
758 | 758 | |
759 | | /* Pac-Land */ |
| 759 | /* Pac-Land */ |
760 | 760 | ROM_START(tvpaclnd) |
761 | 761 | ROM_REGION( 0x100000, "maincpu", 0 ) |
762 | 762 | ROM_LOAD( "tourv_pac-land.bin", 0x00000, 0x100000, CRC(32aee4e2) SHA1(900a918e73aaa1dc5752f851ebd85217e736109b) ) |
r253023 | r253024 | |
764 | 764 | TOURVISION_BIOS |
765 | 765 | ROM_END |
766 | 766 | |
767 | | /* PC Genjin Punkic Cyborg */ |
| 767 | /* PC Genjin Punkic Cyborg */ |
768 | 768 | ROM_START(tvpcybrg) |
769 | 769 | ROM_REGION( 0x100000, "maincpu", 0 ) |
770 | 770 | ROM_LOAD( "tourv_pc_genijin_punkic_cyborg.bin", 0x00000, 0x100000, CRC(5dfdc8fd) SHA1(e4e263cf7c102837c7d669d27894085f3369dd9b) ) |
r253023 | r253024 | |
788 | 788 | TOURVISION_BIOS |
789 | 789 | ROM_END |
790 | 790 | |
791 | | /* Power Drift */ |
| 791 | /* Power Drift */ |
792 | 792 | ROM_START(tvpdrift) |
793 | 793 | ROM_REGION( 0x100000, "maincpu", 0 ) |
794 | 794 | ROM_LOAD( "tourv_power_drift.bin", 0x00000, 0x100000, CRC(eb2fdf0b) SHA1(da2191dd6e9d186c10c1c4d415254b8d7c456159) ) |
r253023 | r253024 | |
811 | 811 | TOURVISION_BIOS |
812 | 812 | ROM_END |
813 | 813 | |
814 | | /* Pro Yakyuu World Stadium '91 */ |
| 814 | /* Pro Yakyuu World Stadium '91 */ |
815 | 815 | ROM_START(tvpros91) |
816 | 816 | ROM_REGION( 0x100000, "maincpu", 0 ) |
817 | 817 | ROM_LOAD( "tourv_pro_yakyuu_world_stadium_91.bin", 0x00000, 0x100000, CRC(2a5f1283) SHA1(e5044e397e6ccbc5c5741fa3f073697b60116325) ) |
r253023 | r253024 | |
819 | 819 | TOURVISION_BIOS |
820 | 820 | ROM_END |
821 | 821 | |
822 | | /* Psycho Chaser */ |
| 822 | /* Psycho Chaser */ |
823 | 823 | ROM_START(tvpchasr) |
824 | 824 | ROM_REGION( 0x100000, "maincpu", 0 ) |
825 | 825 | ROM_LOAD( "tourv_pyscho_chaser.bin", 0x00000, 0x100000, CRC(e0b65280) SHA1(83248975e9bea62e67b5314c663d372c12b08416) ) |
r253023 | r253024 | |
827 | 827 | TOURVISION_BIOS |
828 | 828 | ROM_END |
829 | 829 | |
830 | | /* Puzzle Boy */ |
| 830 | /* Puzzle Boy */ |
831 | 831 | ROM_START(tvpzlboy) |
832 | 832 | ROM_REGION( 0x100000, "maincpu", 0 ) |
833 | 833 | ROM_LOAD( "tourv_puzzle_boy.bin", 0x00000, 0x100000, CRC(0dd96cda) SHA1(652ce8b06f2aef69698d4372ff67b86362655de5) ) |
r253023 | r253024 | |
835 | 835 | TOURVISION_BIOS |
836 | 836 | ROM_END |
837 | 837 | |
838 | | /* Raiden */ |
| 838 | /* Raiden */ |
839 | 839 | ROM_START(tvraiden) |
840 | 840 | ROM_REGION( 0x100000, "maincpu", 0 ) |
841 | 841 | ROM_LOAD( "tourv_raiden.bin", 0x00000, 0x100000, CRC(b99a85b6) SHA1(5c8b103c5a7bfeba20dcc490204d672b55e36452) ) |
r253023 | r253024 | |
856 | 856 | TOURVISION_BIOS |
857 | 857 | ROM_END |
858 | 858 | |
859 | | /* R-Type II */ |
| 859 | /* R-Type II */ |
860 | 860 | ROM_START(tvrtype2) |
861 | 861 | ROM_REGION( 0x100000, "maincpu", 0 ) |
862 | 862 | ROM_LOAD( "tourv_r-type_ii.bin", 0x00000, 0x100000, CRC(b03bfd7a) SHA1(cc8cec1fc4bae3937d0ed60468ff703d07ce9d0c) ) |
r253023 | r253024 | |
864 | 864 | TOURVISION_BIOS |
865 | 865 | ROM_END |
866 | 866 | |
867 | | /* Saiga No Nindou - Ninja Spirit */ |
| 867 | /* Saiga No Nindou - Ninja Spirit */ |
868 | 868 | ROM_START(tvninjas) |
869 | 869 | ROM_REGION( 0x100000, "maincpu", 0 ) |
870 | 870 | ROM_LOAD( "tourv_saiga_no_nindou.bin", 0x00000, 0x100000, CRC(87894514) SHA1(6845c29247f9dd805b7cd8cb046e88526e853a11) ) |
r253023 | r253024 | |
872 | 872 | TOURVISION_BIOS |
873 | 873 | ROM_END |
874 | 874 | |
875 | | /* Salamander */ |
| 875 | /* Salamander */ |
876 | 876 | ROM_START(tvslmndr) |
877 | 877 | ROM_REGION( 0x100000, "maincpu", 0 ) |
878 | 878 | ROM_LOAD( "tourv_salamander.bin", 0x00000, 0x100000, CRC(ae8bcdf1) SHA1(3cc48fa594ab5ce1573c61861ec8e927163b6abb) ) |
r253023 | r253024 | |
880 | 880 | TOURVISION_BIOS |
881 | 881 | ROM_END |
882 | 882 | |
883 | | /* Shinobi */ |
| 883 | /* Shinobi */ |
884 | 884 | ROM_START(tvshnobi) |
885 | 885 | ROM_REGION( 0x100000, "maincpu", 0 ) |
886 | 886 | ROM_LOAD( "tourv_shinobi.bin", 0x00000, 0x100000, CRC(091a2b01) SHA1(aac2d5fadc74f837b73f662456f8a308413de57a) ) |
r253023 | r253024 | |
888 | 888 | TOURVISION_BIOS |
889 | 889 | ROM_END |
890 | 890 | |
891 | | /* Side arms */ |
| 891 | /* Side arms */ |
892 | 892 | ROM_START(tvsdarms) |
893 | 893 | ROM_REGION( 0x100000, "maincpu", 0 ) |
894 | 894 | ROM_LOAD( "tourv_side_arms.bin", 0x00000, 0x100000, CRC(04256267) SHA1(a4ff8f19fa528fc8a7aae5ad7e0c574dc52c3388) ) |
r253023 | r253024 | |
896 | 896 | TOURVISION_BIOS |
897 | 897 | ROM_END |
898 | 898 | |
899 | | /* Skweek */ |
| 899 | /* Skweek */ |
900 | 900 | ROM_START(tvskweek) |
901 | 901 | ROM_REGION( 0x100000, "maincpu", 0 ) |
902 | 902 | ROM_LOAD( "tourv_skweek.bin", 0x00000, 0x100000, CRC(b2a86ecc) SHA1(c1b113132ca6be1b0f3f16f31cc5ba894bee7e91) ) |
r253023 | r253024 | |
904 | 904 | TOURVISION_BIOS |
905 | 905 | ROM_END |
906 | 906 | |
907 | | /* Son Son II */ |
| 907 | /* Son Son II */ |
908 | 908 | ROM_START(tvsson2) |
909 | 909 | ROM_REGION( 0x100000, "maincpu", 0 ) |
910 | 910 | ROM_LOAD( "tourv_son_son_ii.bin", 0x00000, 0x100000, CRC(8fb484cd) SHA1(553838dcb3524fe0b620ea60e926a57cc371068d) ) |
r253023 | r253024 | |
943 | 943 | TOURVISION_BIOS |
944 | 944 | ROM_END |
945 | 945 | |
946 | | /* Tatsujin */ |
| 946 | /* Tatsujin */ |
947 | 947 | ROM_START(tvtsujin) |
948 | 948 | ROM_REGION( 0x100000, "maincpu", 0 ) |
949 | 949 | ROM_LOAD( "tourv_tatsujin.bin", 0x00000, 0x100000, CRC(023adbcc) SHA1(bef7d03fff2e74970a0747c12d31ec8661703deb) ) |
r253023 | r253024 | |
951 | 951 | TOURVISION_BIOS |
952 | 952 | ROM_END |
953 | 953 | |
954 | | /* Terra Cresta II */ |
| 954 | /* Terra Cresta II */ |
955 | 955 | ROM_START(tvtcrst2) |
956 | 956 | ROM_REGION( 0x100000, "maincpu", 0 ) |
957 | 957 | ROM_LOAD( "tourv_terra_cresta_ii.bin", 0x00000, 0x100000, CRC(8e7bb390) SHA1(af13afe006313b0db1273782c977efdad6100291) ) |
r253023 | r253024 | |
974 | 974 | TOURVISION_BIOS |
975 | 975 | ROM_END |
976 | 976 | |
977 | | /* Toy Shop Boys */ |
| 977 | /* Toy Shop Boys */ |
978 | 978 | ROM_START(tvtsboys) |
979 | 979 | ROM_REGION( 0x100000, "maincpu", 0 ) |
980 | 980 | ROM_LOAD( "tourv_toy_shop_boys.bin", 0x00000, 0x100000, CRC(a9ed3440) SHA1(c519744cc16dad7a1455e359020ce95f4ac0b51a) ) |
r253023 | r253024 | |
997 | 997 | TOURVISION_BIOS |
998 | 998 | ROM_END |
999 | 999 | |
1000 | | /* Veigues */ |
| 1000 | /* Veigues */ |
1001 | 1001 | ROM_START(tveigues) |
1002 | 1002 | ROM_REGION( 0x100000, "maincpu", 0 ) |
1003 | 1003 | ROM_LOAD( "tourv_veigues.bin", 0x00000, 0x100000, CRC(64ef8be7) SHA1(634191a181cbccbed8cf7a86e4f074691ba9b715) ) |
r253023 | r253024 | |
1013 | 1013 | TOURVISION_BIOS |
1014 | 1014 | ROM_END |
1015 | 1015 | |
1016 | | /* Winning Shot */ |
| 1016 | /* Winning Shot */ |
1017 | 1017 | ROM_START(tvwnshot) |
1018 | 1018 | ROM_REGION( 0x100000, "maincpu", 0 ) |
1019 | 1019 | ROM_LOAD( "tourv_winning_shot.bin", 0x00000, 0x100000, CRC(7196b2ca) SHA1(a1ae2e875541ad39751a95629d614d2c913b8c02) ) |
r253023 | r253024 | |
1021 | 1021 | TOURVISION_BIOS |
1022 | 1022 | ROM_END |
1023 | 1023 | |
1024 | | /* W-Ring */ |
| 1024 | /* W-Ring */ |
1025 | 1025 | ROM_START(tvwring) |
1026 | 1026 | ROM_REGION( 0x100000, "maincpu", 0 ) |
1027 | 1027 | ROM_LOAD( "tourv_w-ring.bin", 0x00000, 0x100000, CRC(609dc08d) SHA1(191b8751fc5b8700c7d9dae23d194016fe84586c) ) |
r253023 | r253024 | |
1029 | 1029 | TOURVISION_BIOS |
1030 | 1030 | ROM_END |
1031 | 1031 | |
1032 | | /* Xevious */ |
| 1032 | /* Xevious */ |
1033 | 1033 | ROM_START(tvxvious) |
1034 | 1034 | ROM_REGION( 0x100000, "maincpu", 0 ) |
1035 | 1035 | ROM_LOAD( "tourv_xevious.bin", 0x00000, 0x100000, CRC(3c0fb5a9) SHA1(1fd9ff582da83e1b9fee569da4db4de15e912f62) ) |
r253023 | r253024 | |
1061 | 1061 | GAME( 1990, tvarmedf, tourvis, tourvision, tourvision, pce_common_state, pce_common, ROT0, "bootleg (Tourvision) / Nichibutsu / Big Don", "Armed-F (Tourvision PCE bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) |
1062 | 1062 | GAME( 1990, tvbeball, tourvis, tourvision, tourvision, pce_common_state, pce_common, ROT0, "bootleg (Tourvision) / Hudson Soft", "Be Ball (Tourvision PCE bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) |
1063 | 1063 | GAME( 1990, tvbomber, tourvis, tourvision, tourvision, pce_common_state, pce_common, ROT0, "bootleg (Tourvision) / Hudson Soft", "Bomberman (Tourvision PCE bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) |
1064 | | GAME( 1990, tvbrabho, tourvis, tourvision, tourvision, pce_common_state, pce_common, ROT0, "bootleg (Tourvision) / Namco / Namcot", "Chōzetsurinjin Beraboh Man (Tourvision PCE bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) |
| 1064 | GAME( 1990, tvbrabho, tourvis, tourvision, tourvision, pce_common_state, pce_common, ROT0, "bootleg (Tourvision) / Namco / Namcot", "Ch??zetsurinjin Beraboh Man (Tourvision PCE bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) |
1065 | 1065 | GAME( 1990, tvdsenpu, tourvis, tourvision, tourvision, pce_common_state, pce_common, ROT0, "bootleg (Tourvision) / Toaplan / Nec Avenue", "Daisenpu (Tourvision PCE bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) |
1066 | 1066 | GAME( 1990, tvdevilc, tourvis, tourvision, tourvision, pce_common_state, pce_common, ROT0, "bootleg (Tourvision) / Naxat / Red", "Devil Crash (Tourvision PCE bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) |
1067 | 1067 | GAME( 1990, tvdodgeb, tourvis, tourvision, tourvision, pce_common_state, pce_common, ROT0, "bootleg (Tourvision) / Technos Japan Corp / Naxat Soft", "Dodge Ball (Tourvision PCE bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) |
trunk/src/osd/modules/sound/xaudio2_sound.cpp
r253023 | r253024 | |
51 | 51 | |
52 | 52 | // Check HRESULT result and log if error, then take an optional action on failure |
53 | 53 | #define HR_LOG( CALL, LOGFN, ONFAIL ) do { \ |
54 | | result = CALL; \ |
55 | | if (FAILED(result)) { \ |
56 | | LOGFN(#CALL " failed with error 0x%X\n", (unsigned int)result); \ |
57 | | ONFAIL; } \ |
| 54 | result = CALL; \ |
| 55 | if (FAILED(result)) { \ |
| 56 | LOGFN(#CALL " failed with error 0x%X\n", (unsigned int)result); \ |
| 57 | ONFAIL; } \ |
58 | 58 | } while (0) |
59 | 59 | |
60 | 60 | // Variant of HR_LOG to log using osd_printf_error |
r253023 | r253024 | |
91 | 91 | // A stucture to hold a pointer and the count of bytes of the data it points to |
92 | 92 | struct xaudio2_buffer |
93 | 93 | { |
94 | | std::unique_ptr<BYTE[]> AudioData; |
95 | | DWORD AudioSize; |
| 94 | std::unique_ptr<BYTE[]> AudioData; |
| 95 | DWORD AudioSize; |
96 | 96 | }; |
97 | 97 | |
98 | 98 | // Custom deleter with overloads to free smart pointer types used in the implementations |
99 | 99 | struct xaudio2_custom_deleter |
100 | 100 | { |
101 | 101 | public: |
102 | | void operator()(IXAudio2* obj) const |
103 | | { |
104 | | if (obj != nullptr) |
105 | | { |
106 | | obj->Release(); |
107 | | } |
108 | | } |
| 102 | void operator()(IXAudio2* obj) const |
| 103 | { |
| 104 | if (obj != nullptr) |
| 105 | { |
| 106 | obj->Release(); |
| 107 | } |
| 108 | } |
109 | 109 | |
110 | | void operator()(IXAudio2MasteringVoice* obj) const |
111 | | { |
112 | | if (obj != nullptr) |
113 | | { |
114 | | obj->DestroyVoice(); |
115 | | } |
116 | | } |
| 110 | void operator()(IXAudio2MasteringVoice* obj) const |
| 111 | { |
| 112 | if (obj != nullptr) |
| 113 | { |
| 114 | obj->DestroyVoice(); |
| 115 | } |
| 116 | } |
117 | 117 | |
118 | | void operator()(IXAudio2SourceVoice* obj) const |
119 | | { |
120 | | if (obj != nullptr) |
121 | | { |
122 | | obj->Stop(0); |
123 | | obj->FlushSourceBuffers(); |
124 | | obj->DestroyVoice(); |
125 | | } |
126 | | } |
| 118 | void operator()(IXAudio2SourceVoice* obj) const |
| 119 | { |
| 120 | if (obj != nullptr) |
| 121 | { |
| 122 | obj->Stop(0); |
| 123 | obj->FlushSourceBuffers(); |
| 124 | obj->DestroyVoice(); |
| 125 | } |
| 126 | } |
127 | 127 | |
128 | | void operator()(osd_lock* obj) const |
129 | | { |
130 | | if (obj != nullptr) |
131 | | { |
132 | | osd_lock_free(obj); |
133 | | } |
134 | | } |
| 128 | void operator()(osd_lock* obj) const |
| 129 | { |
| 130 | if (obj != nullptr) |
| 131 | { |
| 132 | osd_lock_free(obj); |
| 133 | } |
| 134 | } |
135 | 135 | }; |
136 | 136 | |
137 | 137 | // Typedefs for smart pointers used with customer deleters |
r253023 | r253024 | |
151 | 151 | class osd_scoped_lock |
152 | 152 | { |
153 | 153 | private: |
154 | | osd_lock * m_lock; |
| 154 | osd_lock * m_lock; |
155 | 155 | public: |
156 | | osd_scoped_lock(osd_lock* lock) |
157 | | { |
158 | | m_lock = lock; |
159 | | osd_lock_acquire(m_lock); |
160 | | } |
| 156 | osd_scoped_lock(osd_lock* lock) |
| 157 | { |
| 158 | m_lock = lock; |
| 159 | osd_lock_acquire(m_lock); |
| 160 | } |
161 | 161 | |
162 | | ~osd_scoped_lock() |
163 | | { |
164 | | if (m_lock != nullptr) |
165 | | { |
166 | | osd_lock_release(m_lock); |
167 | | } |
168 | | } |
| 162 | ~osd_scoped_lock() |
| 163 | { |
| 164 | if (m_lock != nullptr) |
| 165 | { |
| 166 | osd_lock_release(m_lock); |
| 167 | } |
| 168 | } |
169 | 169 | }; |
170 | 170 | |
171 | 171 | // Provides a pool of buffers |
172 | 172 | class bufferpool |
173 | 173 | { |
174 | 174 | private: |
175 | | int m_initial; |
176 | | int m_buffersize; |
177 | | std::queue<std::unique_ptr<BYTE[]>> m_queue; |
| 175 | int m_initial; |
| 176 | int m_buffersize; |
| 177 | std::queue<std::unique_ptr<BYTE[]>> m_queue; |
178 | 178 | |
179 | 179 | public: |
180 | | // constructor |
181 | | bufferpool(int capacity, int bufferSize) : |
182 | | m_initial(capacity), |
183 | | m_buffersize(bufferSize) |
184 | | { |
185 | | for (int i = 0; i < m_initial; i++) |
186 | | { |
187 | | auto newBuffer = std::make_unique<BYTE[]>(m_buffersize); |
188 | | memset(newBuffer.get(), 0, m_buffersize); |
189 | | m_queue.push(std::move(newBuffer)); |
190 | | } |
191 | | } |
| 180 | // constructor |
| 181 | bufferpool(int capacity, int bufferSize) : |
| 182 | m_initial(capacity), |
| 183 | m_buffersize(bufferSize) |
| 184 | { |
| 185 | for (int i = 0; i < m_initial; i++) |
| 186 | { |
| 187 | auto newBuffer = std::make_unique<BYTE[]>(m_buffersize); |
| 188 | memset(newBuffer.get(), 0, m_buffersize); |
| 189 | m_queue.push(std::move(newBuffer)); |
| 190 | } |
| 191 | } |
192 | 192 | |
193 | | // get next buffer element from the pool |
194 | | BYTE* next() |
195 | | { |
196 | | BYTE* next_buffer; |
197 | | if (!m_queue.empty()) |
198 | | { |
199 | | next_buffer = m_queue.front().release(); |
200 | | m_queue.pop(); |
201 | | } |
202 | | else |
203 | | { |
204 | | next_buffer = new BYTE[m_buffersize]; |
205 | | memset(next_buffer, 0, m_buffersize); |
206 | | } |
| 193 | // get next buffer element from the pool |
| 194 | BYTE* next() |
| 195 | { |
| 196 | BYTE* next_buffer; |
| 197 | if (!m_queue.empty()) |
| 198 | { |
| 199 | next_buffer = m_queue.front().release(); |
| 200 | m_queue.pop(); |
| 201 | } |
| 202 | else |
| 203 | { |
| 204 | next_buffer = new BYTE[m_buffersize]; |
| 205 | memset(next_buffer, 0, m_buffersize); |
| 206 | } |
207 | 207 | |
208 | | return next_buffer; |
209 | | } |
| 208 | return next_buffer; |
| 209 | } |
210 | 210 | |
211 | | // release element, make it available back in the pool |
212 | | void return_to_pool(BYTE* buffer) |
213 | | { |
214 | | auto returned_buf = std::unique_ptr<BYTE[]>(buffer); |
215 | | memset(returned_buf.get(), 0, m_buffersize); |
216 | | m_queue.push(std::move(returned_buf)); |
217 | | } |
| 211 | // release element, make it available back in the pool |
| 212 | void return_to_pool(BYTE* buffer) |
| 213 | { |
| 214 | auto returned_buf = std::unique_ptr<BYTE[]>(buffer); |
| 215 | memset(returned_buf.get(), 0, m_buffersize); |
| 216 | m_queue.push(std::move(returned_buf)); |
| 217 | } |
218 | 218 | }; |
219 | 219 | |
220 | 220 | //============================================================ |
r253023 | r253024 | |
225 | 225 | class sound_xaudio2 : public osd_module, public sound_module, public IXAudio2VoiceCallback |
226 | 226 | { |
227 | 227 | private: |
228 | | xaudio2_ptr m_xAudio2; |
229 | | mastering_voice_ptr m_masterVoice; |
230 | | src_voice_ptr m_sourceVoice; |
231 | | DWORD m_sample_bytes; |
232 | | std::unique_ptr<BYTE[]> m_buffer; |
233 | | DWORD m_buffer_size; |
234 | | DWORD m_buffer_count; |
235 | | DWORD m_writepos; |
236 | | osd_lock_ptr m_buffer_lock; |
237 | | HANDLE m_hEventBufferCompleted; |
238 | | HANDLE m_hEventDataAvailable; |
239 | | HANDLE m_hEventExiting; |
240 | | std::thread m_audioThread; |
241 | | std::queue<xaudio2_buffer> m_queue; |
242 | | std::unique_ptr<bufferpool> m_buffer_pool; |
243 | | HMODULE m_xaudio2_module; |
244 | | PFN_XAUDIO2CREATE m_pfnxaudio2create; |
245 | | UINT32 m_overflows; |
246 | | UINT32 m_underflows; |
247 | | BOOL m_in_underflow; |
| 228 | xaudio2_ptr m_xAudio2; |
| 229 | mastering_voice_ptr m_masterVoice; |
| 230 | src_voice_ptr m_sourceVoice; |
| 231 | DWORD m_sample_bytes; |
| 232 | std::unique_ptr<BYTE[]> m_buffer; |
| 233 | DWORD m_buffer_size; |
| 234 | DWORD m_buffer_count; |
| 235 | DWORD m_writepos; |
| 236 | osd_lock_ptr m_buffer_lock; |
| 237 | HANDLE m_hEventBufferCompleted; |
| 238 | HANDLE m_hEventDataAvailable; |
| 239 | HANDLE m_hEventExiting; |
| 240 | std::thread m_audioThread; |
| 241 | std::queue<xaudio2_buffer> m_queue; |
| 242 | std::unique_ptr<bufferpool> m_buffer_pool; |
| 243 | HMODULE m_xaudio2_module; |
| 244 | PFN_XAUDIO2CREATE m_pfnxaudio2create; |
| 245 | UINT32 m_overflows; |
| 246 | UINT32 m_underflows; |
| 247 | BOOL m_in_underflow; |
248 | 248 | |
249 | 249 | public: |
250 | | sound_xaudio2() : |
251 | | osd_module(OSD_SOUND_PROVIDER, "xaudio2"), |
252 | | sound_module(), |
253 | | m_xAudio2(nullptr), |
254 | | m_masterVoice(nullptr), |
255 | | m_sourceVoice(nullptr), |
256 | | m_sample_bytes(0), |
257 | | m_buffer(nullptr), |
258 | | m_buffer_size(0), |
259 | | m_buffer_count(0), |
260 | | m_writepos(0), |
261 | | m_buffer_lock(osd_lock_alloc()), |
262 | | m_hEventBufferCompleted(NULL), |
263 | | m_hEventDataAvailable(NULL), |
264 | | m_hEventExiting(NULL), |
265 | | m_buffer_pool(nullptr), |
266 | | m_xaudio2_module(NULL), |
267 | | m_pfnxaudio2create(nullptr), |
268 | | m_overflows(0), |
269 | | m_underflows(0), |
270 | | m_in_underflow(FALSE) |
271 | | { |
272 | | } |
| 250 | sound_xaudio2() : |
| 251 | osd_module(OSD_SOUND_PROVIDER, "xaudio2"), |
| 252 | sound_module(), |
| 253 | m_xAudio2(nullptr), |
| 254 | m_masterVoice(nullptr), |
| 255 | m_sourceVoice(nullptr), |
| 256 | m_sample_bytes(0), |
| 257 | m_buffer(nullptr), |
| 258 | m_buffer_size(0), |
| 259 | m_buffer_count(0), |
| 260 | m_writepos(0), |
| 261 | m_buffer_lock(osd_lock_alloc()), |
| 262 | m_hEventBufferCompleted(NULL), |
| 263 | m_hEventDataAvailable(NULL), |
| 264 | m_hEventExiting(NULL), |
| 265 | m_buffer_pool(nullptr), |
| 266 | m_xaudio2_module(NULL), |
| 267 | m_pfnxaudio2create(nullptr), |
| 268 | m_overflows(0), |
| 269 | m_underflows(0), |
| 270 | m_in_underflow(FALSE) |
| 271 | { |
| 272 | } |
273 | 273 | |
274 | | virtual int init(osd_options const &options) override; |
275 | | virtual void exit() override; |
| 274 | virtual int init(osd_options const &options) override; |
| 275 | virtual void exit() override; |
276 | 276 | |
277 | | // sound_module |
278 | | virtual void update_audio_stream(bool is_throttled, INT16 const *buffer, int samples_this_frame) override; |
279 | | virtual void set_mastervolume(int attenuation) override; |
| 277 | // sound_module |
| 278 | virtual void update_audio_stream(bool is_throttled, INT16 const *buffer, int samples_this_frame) override; |
| 279 | virtual void set_mastervolume(int attenuation) override; |
280 | 280 | |
281 | | // Xaudio callbacks |
282 | | void OnVoiceProcessingPassStart(UINT32 bytes_required) override; |
283 | | void OnVoiceProcessingPassEnd() override {} |
284 | | void OnStreamEnd() override {} |
285 | | void OnBufferStart(void* pBufferContext) override {} |
286 | | void OnLoopEnd(void* pBufferContext) override {} |
287 | | void OnVoiceError(void* pBufferContext, HRESULT error) override {} |
288 | | void OnBufferEnd(void *pBufferContext) override; |
289 | | |
| 281 | // Xaudio callbacks |
| 282 | void OnVoiceProcessingPassStart(UINT32 bytes_required) override; |
| 283 | void OnVoiceProcessingPassEnd() override {} |
| 284 | void OnStreamEnd() override {} |
| 285 | void OnBufferStart(void* pBufferContext) override {} |
| 286 | void OnLoopEnd(void* pBufferContext) override {} |
| 287 | void OnVoiceError(void* pBufferContext, HRESULT error) override {} |
| 288 | void OnBufferEnd(void *pBufferContext) override; |
| 289 | |
290 | 290 | private: |
291 | | void create_buffers(const WAVEFORMATEX &format); |
292 | | HRESULT create_voices(const WAVEFORMATEX &format); |
293 | | void process_audio(); |
294 | | void submit_buffer(std::unique_ptr<BYTE[]> audioData, DWORD audioLength); |
295 | | void submit_needed(); |
296 | | HRESULT xaudio2_create(IXAudio2 ** xaudio2_interface); |
297 | | void roll_buffer(); |
298 | | BOOL submit_next_queued(); |
| 291 | void create_buffers(const WAVEFORMATEX &format); |
| 292 | HRESULT create_voices(const WAVEFORMATEX &format); |
| 293 | void process_audio(); |
| 294 | void submit_buffer(std::unique_ptr<BYTE[]> audioData, DWORD audioLength); |
| 295 | void submit_needed(); |
| 296 | HRESULT xaudio2_create(IXAudio2 ** xaudio2_interface); |
| 297 | void roll_buffer(); |
| 298 | BOOL submit_next_queued(); |
299 | 299 | }; |
300 | 300 | |
301 | 301 | //============================================================ |
r253023 | r253024 | |
304 | 304 | |
305 | 305 | int sound_xaudio2::init(osd_options const &options) |
306 | 306 | { |
307 | | HRESULT result = S_OK; |
| 307 | HRESULT result = S_OK; |
308 | 308 | |
309 | | // Create the IXAudio2 object |
310 | | IXAudio2 *temp_xaudio2 = nullptr; |
311 | | HR_RET1(xaudio2_create(&temp_xaudio2)); |
312 | | m_xAudio2 = xaudio2_ptr(temp_xaudio2); |
| 309 | // Create the IXAudio2 object |
| 310 | IXAudio2 *temp_xaudio2 = nullptr; |
| 311 | HR_RET1(xaudio2_create(&temp_xaudio2)); |
| 312 | m_xAudio2 = xaudio2_ptr(temp_xaudio2); |
313 | 313 | |
314 | | // make a format description for what we want |
315 | | WAVEFORMATEX format = { 0 }; |
316 | | format.wBitsPerSample = 16; |
317 | | format.wFormatTag = WAVE_FORMAT_PCM; |
318 | | format.nChannels = 2; |
319 | | format.nSamplesPerSec = sample_rate(); |
320 | | format.nBlockAlign = format.wBitsPerSample * format.nChannels / 8; |
321 | | format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign; |
| 314 | // make a format description for what we want |
| 315 | WAVEFORMATEX format = { 0 }; |
| 316 | format.wBitsPerSample = 16; |
| 317 | format.wFormatTag = WAVE_FORMAT_PCM; |
| 318 | format.nChannels = 2; |
| 319 | format.nSamplesPerSec = sample_rate(); |
| 320 | format.nBlockAlign = format.wBitsPerSample * format.nChannels / 8; |
| 321 | format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign; |
322 | 322 | |
323 | | m_sample_bytes = format.nBlockAlign; |
| 323 | m_sample_bytes = format.nBlockAlign; |
324 | 324 | |
325 | 325 | #if defined(_DEBUG) |
326 | | XAUDIO2_DEBUG_CONFIGURATION debugConfig = { 0 }; |
327 | | debugConfig.TraceMask = XAUDIO2_LOG_WARNINGS | XAUDIO2_LOG_TIMING | XAUDIO2_LOG_STREAMING; |
328 | | debugConfig.LogFunctionName = TRUE; |
329 | | m_xAudio2->SetDebugConfiguration(&debugConfig); |
| 326 | XAUDIO2_DEBUG_CONFIGURATION debugConfig = { 0 }; |
| 327 | debugConfig.TraceMask = XAUDIO2_LOG_WARNINGS | XAUDIO2_LOG_TIMING | XAUDIO2_LOG_STREAMING; |
| 328 | debugConfig.LogFunctionName = TRUE; |
| 329 | m_xAudio2->SetDebugConfiguration(&debugConfig); |
330 | 330 | #endif |
331 | 331 | |
332 | | // Create the buffers |
333 | | create_buffers(format); |
| 332 | // Create the buffers |
| 333 | create_buffers(format); |
334 | 334 | |
335 | | // Initialize our events |
336 | | m_hEventBufferCompleted = CreateEvent(NULL, FALSE, FALSE, NULL); |
337 | | m_hEventDataAvailable = CreateEvent(NULL, FALSE, FALSE, NULL); |
338 | | m_hEventExiting = CreateEvent(NULL, FALSE, FALSE, NULL); |
| 335 | // Initialize our events |
| 336 | m_hEventBufferCompleted = CreateEvent(NULL, FALSE, FALSE, NULL); |
| 337 | m_hEventDataAvailable = CreateEvent(NULL, FALSE, FALSE, NULL); |
| 338 | m_hEventExiting = CreateEvent(NULL, FALSE, FALSE, NULL); |
339 | 339 | |
340 | | // create the voices and start them |
341 | | HR_RET1(create_voices(format)); |
342 | | HR_RET1(m_sourceVoice->Start()); |
| 340 | // create the voices and start them |
| 341 | HR_RET1(create_voices(format)); |
| 342 | HR_RET1(m_sourceVoice->Start()); |
343 | 343 | |
344 | | // Start the thread listening |
345 | | m_audioThread = std::thread([](sound_xaudio2* self) { self->process_audio(); }, this); |
| 344 | // Start the thread listening |
| 345 | m_audioThread = std::thread([](sound_xaudio2* self) { self->process_audio(); }, this); |
346 | 346 | |
347 | | osd_printf_verbose("Sound: XAudio2 initialized\n"); |
| 347 | osd_printf_verbose("Sound: XAudio2 initialized\n"); |
348 | 348 | |
349 | | return 0; |
| 349 | return 0; |
350 | 350 | } |
351 | 351 | |
352 | 352 | //============================================================ |
r253023 | r253024 | |
355 | 355 | |
356 | 356 | void sound_xaudio2::exit() |
357 | 357 | { |
358 | | // Wait on processing thread to end |
359 | | SetEvent(m_hEventExiting); |
360 | | m_audioThread.join(); |
| 358 | // Wait on processing thread to end |
| 359 | SetEvent(m_hEventExiting); |
| 360 | m_audioThread.join(); |
361 | 361 | |
362 | | CloseHandle(m_hEventBufferCompleted); |
363 | | CloseHandle(m_hEventDataAvailable); |
364 | | CloseHandle(m_hEventExiting); |
| 362 | CloseHandle(m_hEventBufferCompleted); |
| 363 | CloseHandle(m_hEventDataAvailable); |
| 364 | CloseHandle(m_hEventExiting); |
365 | 365 | |
366 | | m_sourceVoice.reset(); |
367 | | m_masterVoice.reset(); |
368 | | m_xAudio2.reset(); |
369 | | m_buffer.reset(); |
370 | | m_buffer_pool.reset(); |
| 366 | m_sourceVoice.reset(); |
| 367 | m_masterVoice.reset(); |
| 368 | m_xAudio2.reset(); |
| 369 | m_buffer.reset(); |
| 370 | m_buffer_pool.reset(); |
371 | 371 | |
372 | | if (m_overflows != 0 || m_underflows != 0) |
373 | | osd_printf_verbose("Sound: overflows=%u, underflows=%u\n", m_overflows, m_underflows); |
| 372 | if (m_overflows != 0 || m_underflows != 0) |
| 373 | osd_printf_verbose("Sound: overflows=%u, underflows=%u\n", m_overflows, m_underflows); |
374 | 374 | |
375 | | osd_printf_verbose("Sound: XAudio2 deinitialized\n"); |
| 375 | osd_printf_verbose("Sound: XAudio2 deinitialized\n"); |
376 | 376 | } |
377 | 377 | |
378 | 378 | //============================================================ |
r253023 | r253024 | |
380 | 380 | //============================================================ |
381 | 381 | |
382 | 382 | void sound_xaudio2::update_audio_stream( |
383 | | bool is_throttled, |
384 | | INT16 const *buffer, |
385 | | int samples_this_frame) |
| 383 | bool is_throttled, |
| 384 | INT16 const *buffer, |
| 385 | int samples_this_frame) |
386 | 386 | { |
387 | | if ((sample_rate() == 0) || !m_buffer) |
388 | | return; |
| 387 | if ((sample_rate() == 0) || !m_buffer) |
| 388 | return; |
389 | 389 | |
390 | | UINT32 const bytes_this_frame = samples_this_frame * m_sample_bytes; |
| 390 | UINT32 const bytes_this_frame = samples_this_frame * m_sample_bytes; |
391 | 391 | |
392 | | osd_scoped_lock scope_lock(m_buffer_lock.get()); |
| 392 | osd_scoped_lock scope_lock(m_buffer_lock.get()); |
393 | 393 | |
394 | | UINT32 bytes_left = bytes_this_frame; |
| 394 | UINT32 bytes_left = bytes_this_frame; |
395 | 395 | |
396 | | while (bytes_left > 0) |
397 | | { |
398 | | UINT32 chunk = MIN(m_buffer_size, bytes_left); |
| 396 | while (bytes_left > 0) |
| 397 | { |
| 398 | UINT32 chunk = MIN(m_buffer_size, bytes_left); |
399 | 399 | |
400 | | // Roll the buffer if needed |
401 | | if (m_writepos + chunk >= m_buffer_size) |
402 | | { |
403 | | roll_buffer(); |
404 | | } |
| 400 | // Roll the buffer if needed |
| 401 | if (m_writepos + chunk >= m_buffer_size) |
| 402 | { |
| 403 | roll_buffer(); |
| 404 | } |
405 | 405 | |
406 | | // Copy in the data |
407 | | memcpy(m_buffer.get() + m_writepos, buffer, chunk); |
408 | | m_writepos += chunk; |
409 | | bytes_left -= chunk; |
410 | | } |
| 406 | // Copy in the data |
| 407 | memcpy(m_buffer.get() + m_writepos, buffer, chunk); |
| 408 | m_writepos += chunk; |
| 409 | bytes_left -= chunk; |
| 410 | } |
411 | 411 | |
412 | | // Signal data available |
413 | | SetEvent(m_hEventDataAvailable); |
| 412 | // Signal data available |
| 413 | SetEvent(m_hEventDataAvailable); |
414 | 414 | } |
415 | 415 | |
416 | 416 | //============================================================ |
r253023 | r253024 | |
419 | 419 | |
420 | 420 | void sound_xaudio2::set_mastervolume(int attenuation) |
421 | 421 | { |
422 | | assert(m_sourceVoice); |
423 | | |
424 | | HRESULT result; |
425 | | |
426 | | // clamp the attenuation to 0-32 range |
427 | | attenuation = MAX(MIN(attenuation, 0), -32); |
| 422 | assert(m_sourceVoice); |
428 | 423 | |
429 | | // Ranges from 1.0 to XAUDIO2_MAX_VOLUME_LEVEL indicate additional gain |
430 | | // Ranges from 0 to 1.0 indicate a reduced volume level |
431 | | // 0 indicates silence |
432 | | // We only support a reduction from 1.0, so we generate values in the range 0.0 to 1.0 |
433 | | float scaledVolume = (32.0f + attenuation) / 32.0f; |
434 | | |
435 | | // set the master volume |
436 | | HR_RETV(m_sourceVoice->SetVolume(scaledVolume)); |
| 424 | HRESULT result; |
| 425 | |
| 426 | // clamp the attenuation to 0-32 range |
| 427 | attenuation = MAX(MIN(attenuation, 0), -32); |
| 428 | |
| 429 | // Ranges from 1.0 to XAUDIO2_MAX_VOLUME_LEVEL indicate additional gain |
| 430 | // Ranges from 0 to 1.0 indicate a reduced volume level |
| 431 | // 0 indicates silence |
| 432 | // We only support a reduction from 1.0, so we generate values in the range 0.0 to 1.0 |
| 433 | float scaledVolume = (32.0f + attenuation) / 32.0f; |
| 434 | |
| 435 | // set the master volume |
| 436 | HR_RETV(m_sourceVoice->SetVolume(scaledVolume)); |
437 | 437 | } |
438 | 438 | |
439 | 439 | //============================================================ |
r253023 | r253024 | |
443 | 443 | // The XAudio2 voice callback triggered when a buffer finishes playing |
444 | 444 | void sound_xaudio2::OnBufferEnd(void *pBufferContext) |
445 | 445 | { |
446 | | BYTE* completed_buffer = (BYTE*)pBufferContext; |
447 | | if (completed_buffer != nullptr) |
448 | | { |
449 | | auto scoped_lock = osd_scoped_lock(m_buffer_lock.get()); |
450 | | m_buffer_pool->return_to_pool(completed_buffer); |
451 | | } |
| 446 | BYTE* completed_buffer = (BYTE*)pBufferContext; |
| 447 | if (completed_buffer != nullptr) |
| 448 | { |
| 449 | auto scoped_lock = osd_scoped_lock(m_buffer_lock.get()); |
| 450 | m_buffer_pool->return_to_pool(completed_buffer); |
| 451 | } |
452 | 452 | |
453 | | SetEvent(m_hEventBufferCompleted); |
| 453 | SetEvent(m_hEventBufferCompleted); |
454 | 454 | } |
455 | 455 | |
456 | 456 | //============================================================ |
r253023 | r253024 | |
460 | 460 | // The XAudio2 voice callback triggered on every pass |
461 | 461 | void sound_xaudio2::OnVoiceProcessingPassStart(UINT32 bytes_required) |
462 | 462 | { |
463 | | if (bytes_required == 0) |
464 | | { |
465 | | // Reset underflow indicator if we're caught up |
466 | | if (m_in_underflow) m_in_underflow = FALSE; |
| 463 | if (bytes_required == 0) |
| 464 | { |
| 465 | // Reset underflow indicator if we're caught up |
| 466 | if (m_in_underflow) m_in_underflow = FALSE; |
467 | 467 | |
468 | | return; |
469 | | } |
| 468 | return; |
| 469 | } |
470 | 470 | |
471 | | // Since there are bytes required, we're going to be in underflow |
472 | | if (!m_in_underflow) |
473 | | { |
474 | | m_underflows++; |
475 | | m_in_underflow = TRUE; |
476 | | } |
| 471 | // Since there are bytes required, we're going to be in underflow |
| 472 | if (!m_in_underflow) |
| 473 | { |
| 474 | m_underflows++; |
| 475 | m_in_underflow = TRUE; |
| 476 | } |
477 | 477 | } |
478 | 478 | |
479 | 479 | //============================================================ |
r253023 | r253024 | |
483 | 483 | // Dynamically loads the XAudio2 DLL and calls the exported XAudio2Create() |
484 | 484 | HRESULT sound_xaudio2::xaudio2_create(IXAudio2 ** ppxaudio2_interface) |
485 | 485 | { |
486 | | HRESULT result; |
| 486 | HRESULT result; |
487 | 487 | |
488 | | if (nullptr == m_pfnxaudio2create) |
489 | | { |
490 | | if (nullptr == m_xaudio2_module) |
491 | | { |
492 | | m_xaudio2_module = LoadLibrary(XAUDIO2_DLL); |
493 | | if (nullptr == m_xaudio2_module) |
494 | | { |
495 | | osd_printf_error("Failed to load module '%S', error: 0x%X\n", XAUDIO2_DLL, (unsigned int)GetLastError()); |
496 | | HR_RETHR(E_FAIL); |
497 | | } |
498 | | } |
| 488 | if (nullptr == m_pfnxaudio2create) |
| 489 | { |
| 490 | if (nullptr == m_xaudio2_module) |
| 491 | { |
| 492 | m_xaudio2_module = LoadLibrary(XAUDIO2_DLL); |
| 493 | if (nullptr == m_xaudio2_module) |
| 494 | { |
| 495 | osd_printf_error("Failed to load module '%S', error: 0x%X\n", XAUDIO2_DLL, (unsigned int)GetLastError()); |
| 496 | HR_RETHR(E_FAIL); |
| 497 | } |
| 498 | } |
499 | 499 | |
500 | | m_pfnxaudio2create = (PFN_XAUDIO2CREATE)GetProcAddress(m_xaudio2_module, "XAudio2Create"); |
501 | | if (nullptr == m_pfnxaudio2create) |
502 | | { |
503 | | osd_printf_error("Failed to get adddress of exported function XAudio2Create, error: 0x%X\n", (unsigned int)GetLastError()); |
504 | | HR_RETHR(E_FAIL); |
505 | | } |
506 | | } |
| 500 | m_pfnxaudio2create = (PFN_XAUDIO2CREATE)GetProcAddress(m_xaudio2_module, "XAudio2Create"); |
| 501 | if (nullptr == m_pfnxaudio2create) |
| 502 | { |
| 503 | osd_printf_error("Failed to get adddress of exported function XAudio2Create, error: 0x%X\n", (unsigned int)GetLastError()); |
| 504 | HR_RETHR(E_FAIL); |
| 505 | } |
| 506 | } |
507 | 507 | |
508 | | HR_RETHR(m_pfnxaudio2create(ppxaudio2_interface, 0, XAUDIO2_DEFAULT_PROCESSOR)); |
| 508 | HR_RETHR(m_pfnxaudio2create(ppxaudio2_interface, 0, XAUDIO2_DEFAULT_PROCESSOR)); |
509 | 509 | |
510 | | return S_OK; |
| 510 | return S_OK; |
511 | 511 | } |
512 | 512 | |
513 | 513 | //============================================================ |
r253023 | r253024 | |
516 | 516 | |
517 | 517 | void sound_xaudio2::create_buffers(const WAVEFORMATEX &format) |
518 | 518 | { |
519 | | // Compute the buffer size |
520 | | // buffer size is equal to the bytes we need to hold in memory per X tenths of a second where X is audio_latency |
521 | | float audio_latency_in_seconds = m_audio_latency / 10.0f; |
522 | | UINT32 format_bytes_per_second = format.nSamplesPerSec * format.nBlockAlign; |
523 | | UINT32 total_buffer_size = format_bytes_per_second * audio_latency_in_seconds; |
| 519 | // Compute the buffer size |
| 520 | // buffer size is equal to the bytes we need to hold in memory per X tenths of a second where X is audio_latency |
| 521 | float audio_latency_in_seconds = m_audio_latency / 10.0f; |
| 522 | UINT32 format_bytes_per_second = format.nSamplesPerSec * format.nBlockAlign; |
| 523 | UINT32 total_buffer_size = format_bytes_per_second * audio_latency_in_seconds; |
524 | 524 | |
525 | | // We want to be able to submit buffers every X milliseconds |
526 | | // I want to divide these up into "packets" so figure out how many buffers we need |
527 | | m_buffer_count = (audio_latency_in_seconds * 1000.0f) / SUBMIT_FREQUENCY_TARGET_MS; |
| 525 | // We want to be able to submit buffers every X milliseconds |
| 526 | // I want to divide these up into "packets" so figure out how many buffers we need |
| 527 | m_buffer_count = (audio_latency_in_seconds * 1000.0f) / SUBMIT_FREQUENCY_TARGET_MS; |
528 | 528 | |
529 | | // Now record the size of the individual buffers |
530 | | m_buffer_size = MAX(1024, total_buffer_size / m_buffer_count); |
| 529 | // Now record the size of the individual buffers |
| 530 | m_buffer_size = MAX(1024, total_buffer_size / m_buffer_count); |
531 | 531 | |
532 | | // Make the buffer a multiple of the format size bytes (rounding up) |
533 | | UINT32 remainder = m_buffer_size % format.nBlockAlign; |
534 | | if (remainder != 0) |
535 | | m_buffer_size += format.nBlockAlign - remainder; |
| 532 | // Make the buffer a multiple of the format size bytes (rounding up) |
| 533 | UINT32 remainder = m_buffer_size % format.nBlockAlign; |
| 534 | if (remainder != 0) |
| 535 | m_buffer_size += format.nBlockAlign - remainder; |
536 | 536 | |
537 | | // get our initial buffer pool and our first buffer |
538 | | m_buffer_pool = std::make_unique<bufferpool>(m_buffer_count + 1, m_buffer_size); |
539 | | m_buffer = std::unique_ptr<BYTE[]>(m_buffer_pool->next()); |
| 537 | // get our initial buffer pool and our first buffer |
| 538 | m_buffer_pool = std::make_unique<bufferpool>(m_buffer_count + 1, m_buffer_size); |
| 539 | m_buffer = std::unique_ptr<BYTE[]>(m_buffer_pool->next()); |
540 | 540 | |
541 | | osd_printf_verbose( |
542 | | "Sound: XAudio2 created initial buffers. total size: %u, count %u, size each %u\n", |
543 | | (unsigned int)total_buffer_size, |
544 | | (unsigned int)m_buffer_count, |
545 | | (unsigned int)m_buffer_size); |
| 541 | osd_printf_verbose( |
| 542 | "Sound: XAudio2 created initial buffers. total size: %u, count %u, size each %u\n", |
| 543 | (unsigned int)total_buffer_size, |
| 544 | (unsigned int)m_buffer_count, |
| 545 | (unsigned int)m_buffer_size); |
546 | 546 | |
547 | | // reset buffer states |
548 | | m_writepos = 0; |
549 | | m_overflows = 0; |
550 | | m_underflows = 0; |
| 547 | // reset buffer states |
| 548 | m_writepos = 0; |
| 549 | m_overflows = 0; |
| 550 | m_underflows = 0; |
551 | 551 | } |
552 | 552 | |
553 | 553 | //============================================================ |
r253023 | r253024 | |
556 | 556 | |
557 | 557 | HRESULT sound_xaudio2::create_voices(const WAVEFORMATEX &format) |
558 | 558 | { |
559 | | assert(m_xAudio2); |
560 | | assert(!m_masterVoice); |
561 | | HRESULT result; |
| 559 | assert(m_xAudio2); |
| 560 | assert(!m_masterVoice); |
| 561 | HRESULT result; |
562 | 562 | |
563 | | IXAudio2MasteringVoice *temp_master_voice = nullptr; |
564 | | HR_RET1( |
565 | | m_xAudio2->CreateMasteringVoice( |
566 | | &temp_master_voice, |
567 | | format.nChannels, |
568 | | sample_rate())); |
| 563 | IXAudio2MasteringVoice *temp_master_voice = nullptr; |
| 564 | HR_RET1( |
| 565 | m_xAudio2->CreateMasteringVoice( |
| 566 | &temp_master_voice, |
| 567 | format.nChannels, |
| 568 | sample_rate())); |
569 | 569 | |
570 | | m_masterVoice = mastering_voice_ptr(temp_master_voice); |
| 570 | m_masterVoice = mastering_voice_ptr(temp_master_voice); |
571 | 571 | |
572 | | // create the source voice |
573 | | IXAudio2SourceVoice *temp_source_voice = nullptr; |
574 | | HR_RET1(m_xAudio2->CreateSourceVoice( |
575 | | &temp_source_voice, |
576 | | &format, |
577 | | XAUDIO2_VOICE_NOSRC | XAUDIO2_VOICE_NOPITCH, |
578 | | 1.0, |
579 | | this)); |
| 572 | // create the source voice |
| 573 | IXAudio2SourceVoice *temp_source_voice = nullptr; |
| 574 | HR_RET1(m_xAudio2->CreateSourceVoice( |
| 575 | &temp_source_voice, |
| 576 | &format, |
| 577 | XAUDIO2_VOICE_NOSRC | XAUDIO2_VOICE_NOPITCH, |
| 578 | 1.0, |
| 579 | this)); |
580 | 580 | |
581 | | m_sourceVoice = src_voice_ptr(temp_source_voice); |
| 581 | m_sourceVoice = src_voice_ptr(temp_source_voice); |
582 | 582 | |
583 | | return S_OK; |
| 583 | return S_OK; |
584 | 584 | } |
585 | 585 | |
586 | 586 | //============================================================ |
r253023 | r253024 | |
590 | 590 | // submits audio events on another thread in a loop |
591 | 591 | void sound_xaudio2::process_audio() |
592 | 592 | { |
593 | | BOOL exiting = FALSE; |
594 | | HANDLE hEvents[] = { m_hEventBufferCompleted, m_hEventDataAvailable, m_hEventExiting }; |
595 | | while (!exiting) |
596 | | { |
597 | | DWORD wait_result = WaitForMultipleObjects(3, hEvents, FALSE, INFINITE); |
598 | | switch (wait_result) |
599 | | { |
600 | | // Buffer is complete or new data is available |
601 | | case 0: |
602 | | case 1: |
603 | | submit_needed(); |
604 | | break; |
605 | | case 2: |
606 | | // exiting |
607 | | exiting = TRUE; |
608 | | break; |
609 | | } |
610 | | } |
| 593 | BOOL exiting = FALSE; |
| 594 | HANDLE hEvents[] = { m_hEventBufferCompleted, m_hEventDataAvailable, m_hEventExiting }; |
| 595 | while (!exiting) |
| 596 | { |
| 597 | DWORD wait_result = WaitForMultipleObjects(3, hEvents, FALSE, INFINITE); |
| 598 | switch (wait_result) |
| 599 | { |
| 600 | // Buffer is complete or new data is available |
| 601 | case 0: |
| 602 | case 1: |
| 603 | submit_needed(); |
| 604 | break; |
| 605 | case 2: |
| 606 | // exiting |
| 607 | exiting = TRUE; |
| 608 | break; |
| 609 | } |
| 610 | } |
611 | 611 | } |
612 | 612 | |
613 | 613 | //============================================================ |
614 | 614 | // submit_needed |
615 | 615 | //============================================================ |
616 | 616 | |
617 | | // Submits any buffers that have currently been queued, |
| 617 | // Submits any buffers that have currently been queued, |
618 | 618 | // assuming they are needed based on current queue depth |
619 | 619 | void sound_xaudio2::submit_needed() |
620 | 620 | { |
621 | | XAUDIO2_VOICE_STATE state; |
622 | | m_sourceVoice->GetState(&state, XAUDIO2_VOICE_NOSAMPLESPLAYED); |
| 621 | XAUDIO2_VOICE_STATE state; |
| 622 | m_sourceVoice->GetState(&state, XAUDIO2_VOICE_NOSAMPLESPLAYED); |
623 | 623 | |
624 | | // If we have a buffer on the queue, no reason to submit |
625 | | if (state.BuffersQueued >= 1) |
626 | | return; |
| 624 | // If we have a buffer on the queue, no reason to submit |
| 625 | if (state.BuffersQueued >= 1) |
| 626 | return; |
627 | 627 | |
628 | | osd_scoped_lock lock_scope(m_buffer_lock.get()); |
| 628 | osd_scoped_lock lock_scope(m_buffer_lock.get()); |
629 | 629 | |
630 | | // Roll the buffer |
631 | | roll_buffer(); |
| 630 | // Roll the buffer |
| 631 | roll_buffer(); |
632 | 632 | |
633 | | // Submit the next buffer |
634 | | submit_next_queued(); |
| 633 | // Submit the next buffer |
| 634 | submit_next_queued(); |
635 | 635 | } |
636 | 636 | |
637 | 637 | //============================================================ |
r253023 | r253024 | |
640 | 640 | |
641 | 641 | void sound_xaudio2::submit_buffer(std::unique_ptr<BYTE[]> audioData, DWORD audioLength) |
642 | 642 | { |
643 | | assert(audioLength != 0); |
| 643 | assert(audioLength != 0); |
644 | 644 | |
645 | | XAUDIO2_BUFFER buf = { 0 }; |
646 | | buf.AudioBytes = audioLength; |
647 | | buf.pAudioData = audioData.get(); |
648 | | buf.PlayBegin = 0; |
649 | | buf.PlayLength = audioLength / m_sample_bytes; |
650 | | buf.Flags = XAUDIO2_END_OF_STREAM; |
651 | | buf.pContext = audioData.get(); |
| 645 | XAUDIO2_BUFFER buf = { 0 }; |
| 646 | buf.AudioBytes = audioLength; |
| 647 | buf.pAudioData = audioData.get(); |
| 648 | buf.PlayBegin = 0; |
| 649 | buf.PlayLength = audioLength / m_sample_bytes; |
| 650 | buf.Flags = XAUDIO2_END_OF_STREAM; |
| 651 | buf.pContext = audioData.get(); |
652 | 652 | |
653 | | HRESULT result; |
654 | | if (FAILED(result = m_sourceVoice->SubmitSourceBuffer(&buf))) |
655 | | { |
656 | | osd_printf_verbose("Sound: XAudio2 failed to submit source buffer (non-fatal). Error: 0x%X\n", (unsigned int)result); |
657 | | m_buffer_pool->return_to_pool(audioData.release()); |
658 | | return; |
659 | | } |
| 653 | HRESULT result; |
| 654 | if (FAILED(result = m_sourceVoice->SubmitSourceBuffer(&buf))) |
| 655 | { |
| 656 | osd_printf_verbose("Sound: XAudio2 failed to submit source buffer (non-fatal). Error: 0x%X\n", (unsigned int)result); |
| 657 | m_buffer_pool->return_to_pool(audioData.release()); |
| 658 | return; |
| 659 | } |
660 | 660 | |
661 | | // If we succeeded, relinquish the buffer allocation to the XAudio2 runtime |
662 | | // The buffer will be freed on the OnBufferCompleted callback |
663 | | audioData.release(); |
| 661 | // If we succeeded, relinquish the buffer allocation to the XAudio2 runtime |
| 662 | // The buffer will be freed on the OnBufferCompleted callback |
| 663 | audioData.release(); |
664 | 664 | } |
665 | 665 | |
666 | 666 | //============================================================ |
r253023 | r253024 | |
669 | 669 | |
670 | 670 | BOOL sound_xaudio2::submit_next_queued() |
671 | 671 | { |
672 | | if (!m_queue.empty()) |
673 | | { |
674 | | // Get a reference to the buffer |
675 | | auto buf = &m_queue.front(); |
| 672 | if (!m_queue.empty()) |
| 673 | { |
| 674 | // Get a reference to the buffer |
| 675 | auto buf = &m_queue.front(); |
676 | 676 | |
677 | | // submit the buffer data |
678 | | submit_buffer(std::move(buf->AudioData), buf->AudioSize); |
| 677 | // submit the buffer data |
| 678 | submit_buffer(std::move(buf->AudioData), buf->AudioSize); |
679 | 679 | |
680 | | // Remove it from the queue |
681 | | assert(buf->AudioSize > 0); |
682 | | m_queue.pop(); |
| 680 | // Remove it from the queue |
| 681 | assert(buf->AudioSize > 0); |
| 682 | m_queue.pop(); |
683 | 683 | |
684 | | return !m_queue.empty(); |
685 | | } |
| 684 | return !m_queue.empty(); |
| 685 | } |
686 | 686 | |
687 | | // queue was already empty |
688 | | return FALSE; |
| 687 | // queue was already empty |
| 688 | return FALSE; |
689 | 689 | } |
690 | 690 | |
691 | 691 | //============================================================ |
r253023 | r253024 | |
695 | 695 | // Queues the current buffer, and gets a new write buffer |
696 | 696 | void sound_xaudio2::roll_buffer() |
697 | 697 | { |
698 | | // Don't queue a buffer if it is empty |
699 | | if (m_writepos == 0) |
700 | | return; |
| 698 | // Don't queue a buffer if it is empty |
| 699 | if (m_writepos == 0) |
| 700 | return; |
701 | 701 | |
702 | | // Queue the current buffer |
703 | | xaudio2_buffer buf; |
704 | | buf.AudioData = std::move(m_buffer); |
705 | | buf.AudioSize = m_writepos; |
706 | | m_queue.push(std::move(buf)); |
| 702 | // Queue the current buffer |
| 703 | xaudio2_buffer buf; |
| 704 | buf.AudioData = std::move(m_buffer); |
| 705 | buf.AudioSize = m_writepos; |
| 706 | m_queue.push(std::move(buf)); |
707 | 707 | |
708 | | // Get a new buffer |
709 | | m_buffer = std::unique_ptr<BYTE[]>(m_buffer_pool->next()); |
710 | | m_writepos = 0; |
| 708 | // Get a new buffer |
| 709 | m_buffer = std::unique_ptr<BYTE[]>(m_buffer_pool->next()); |
| 710 | m_writepos = 0; |
711 | 711 | |
712 | | // We only want to keep a maximum number of buffers at any given time |
713 | | // so remove any from queue greater than MAX_QUEUED_BUFFERS |
714 | | if (m_queue.size() > m_buffer_count) |
715 | | { |
716 | | xaudio2_buffer *next_buffer = &m_queue.front(); |
| 712 | // We only want to keep a maximum number of buffers at any given time |
| 713 | // so remove any from queue greater than MAX_QUEUED_BUFFERS |
| 714 | if (m_queue.size() > m_buffer_count) |
| 715 | { |
| 716 | xaudio2_buffer *next_buffer = &m_queue.front(); |
717 | 717 | |
718 | | // return the oldest buffer to the pool, and remove it from queue |
719 | | m_buffer_pool->return_to_pool(next_buffer->AudioData.release()); |
720 | | m_queue.pop(); |
| 718 | // return the oldest buffer to the pool, and remove it from queue |
| 719 | m_buffer_pool->return_to_pool(next_buffer->AudioData.release()); |
| 720 | m_queue.pop(); |
721 | 721 | |
722 | | m_overflows++; |
723 | | } |
| 722 | m_overflows++; |
| 723 | } |
724 | 724 | } |
725 | 725 | |
726 | 726 | |
r253023 | r253024 | |
728 | 728 | MODULE_NOT_SUPPORTED(sound_xaudio2, OSD_SOUND_PROVIDER, "xaudio2") |
729 | 729 | #endif |
730 | 730 | |
731 | | MODULE_DEFINITION(SOUND_XAUDIO2, sound_xaudio2) |
| | No newline at end of file |
| 731 | MODULE_DEFINITION(SOUND_XAUDIO2, sound_xaudio2) |