trunk/src/mess/drivers/hh_tms1k.c
| r244642 | r244643 | |
| 5 | 5 | This driver is a collection of simple dedicated handheld and tabletop |
| 6 | 6 | toys based around the TMS1000 MCU series. Anything more complex or clearly |
| 7 | 7 | part of a series is (or will be) in its own driver. |
| 8 | |
| 9 | Let's use this driver for a list of known devices and their serials, |
| 10 | excluding TI's own products (see for example ticalc1x.c, tispeak.c) |
| 8 | 11 | |
| 12 | serial device etc. |
| 13 | -------------------------------------------------------------------- |
| 14 | @MP0904A TMS0970 1977, Milton Bradley Comp IV |
| 15 | @MP0905B TMS0970 1977, Parker Brothers Codename Sector |
| 16 | @MP0914 TMS1000 1979, Entex Baseball |
| 17 | @MP1030 TMS1100 1980, APF Mathemagician |
| 18 | @MP3226 TMS1000 1978, Milton Bradley Simon |
| 19 | @MP3403 TMS1100 1978, unknown |
| 20 | @MP3404 TMS1100 1978, Parker Brothers Merlin |
| 21 | @MP3405 TMS1100 1979, Coleco Amaze-A-Tron |
| 22 | @MP3438A TMS1100 1979, Kenner Star Wars Electronic Battle Command |
| 23 | MP3450A TMS1100 1979, MicroVision cartridge: Blockbuster |
| 24 | MP3454 TMS1100 1979, MicroVision cartridge: Star Trek Phaser Strike |
| 25 | MP3455 TMS1100 1980, MicroVision cartridge: Pinball |
| 26 | MP3457 TMS1100 1979, MicroVision cartridge: Mindbuster |
| 27 | MP3474 TMS1100 1979, MicroVision cartridge: Vegas Slots |
| 28 | MP3475 TMS1100 1979, MicroVision cartridge: Bowling |
| 29 | MP3479 TMS1100 1980, MicroVision cartridge: Baseball |
| 30 | MP3481 TMS1100 1979, MicroVision cartridge: Connect Four |
| 31 | MP3496 TMS1100 1980, MicroVision cartridge: Sea Duel |
| 32 | @MP6100A TMS0980 1979, Ideal Electronic Detective |
| 33 | @MP6101B TMS0980 1979, Parker Brothers Stop Thief |
| 34 | @MP7313 TMS1400 1980, Parker Brothers Bank Shot |
| 35 | @MP7314 TMS1400 1980, Parker Brothers Split Second |
| 36 | *MP7332 TMS1400 1981, Milton Bradley Dark Tower |
| 37 | @MP7334 TMS1400 1981, Coleco Total Control 4 |
| 9 | 38 | |
| 39 | inconsistent: |
| 40 | |
| 41 | M34009 TMS1100 1981, MicroVision cartridge: Alien Raiders |
| 42 | M34017 TMS1100 1981, MicroVision cartridge: Cosmic Hunter |
| 43 | M34047 TMS1100 1982, MicroVision cartridge: Super Blockbuster |
| 44 | |
| 45 | CD7282SL TMS1100 1981, Tandy-12 (serial is similar to TI Speak & Spell series?) |
| 46 | |
| 47 | (* denotes not yet emulated by MESS, @ denotes it's in this driver) |
| 48 | |
| 10 | 49 | ***************************************************************************/ |
| 11 | 50 | |
| 12 | 51 | #include "emu.h" |
| 13 | 52 | #include "cpu/tms0980/tms0980.h" |
| 14 | 53 | #include "sound/speaker.h" |
| 15 | 54 | |
| 55 | // internal artwork |
| 16 | 56 | #include "amaztron.lh" |
| 17 | 57 | #include "bankshot.lh" |
| 18 | 58 | #include "cnsector.lh" |
| 19 | | #include "ebball.lh" |
| 20 | 59 | #include "elecdet.lh" |
| 21 | 60 | #include "comp4.lh" |
| 22 | 61 | #include "mathmagi.lh" |
| 23 | | #include "merlin.lh" |
| 24 | | #include "simon.lh" |
| 62 | #include "merlin.lh" // clickable |
| 63 | #include "simon.lh" // clickable |
| 25 | 64 | #include "splitsec.lh" |
| 26 | 65 | #include "starwbc.lh" |
| 27 | 66 | #include "stopthie.lh" |
| 28 | | #include "tandy12.lh" |
| 67 | #include "tandy12.lh" // clickable |
| 29 | 68 | #include "tc4.lh" |
| 30 | 69 | |
| 70 | // test-layouts - use external artwork |
| 71 | #include "ebball.lh" |
| 31 | 72 | |
| 73 | |
| 32 | 74 | class hh_tms1k_state : public driver_device |
| 33 | 75 | { |
| 34 | 76 | public: |
| r244642 | r244643 | |
| 72 | 114 | |
| 73 | 115 | TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); |
| 74 | 116 | void display_update(); |
| 117 | void display_matrix(int maxx, int maxy, UINT32 setx, UINT32 sety); |
| 75 | 118 | |
| 76 | 119 | // game-specific handlers |
| 77 | 120 | void mathmagi_display(); |
| r244642 | r244643 | |
| 89 | 132 | DECLARE_WRITE16_MEMBER(tc4_write_r); |
| 90 | 133 | DECLARE_WRITE16_MEMBER(tc4_write_o); |
| 91 | 134 | |
| 135 | void ebball_display(); |
| 136 | DECLARE_READ8_MEMBER(ebball_read_k); |
| 137 | DECLARE_WRITE16_MEMBER(ebball_write_r); |
| 138 | DECLARE_WRITE16_MEMBER(ebball_write_o); |
| 139 | |
| 92 | 140 | DECLARE_READ8_MEMBER(elecdet_read_k); |
| 93 | 141 | DECLARE_WRITE16_MEMBER(elecdet_write_r); |
| 94 | 142 | DECLARE_WRITE16_MEMBER(elecdet_write_o); |
| r244642 | r244643 | |
| 118 | 166 | DECLARE_WRITE16_MEMBER(stopthief_write_r); |
| 119 | 167 | DECLARE_WRITE16_MEMBER(stopthief_write_o); |
| 120 | 168 | |
| 121 | | void bankshot_display(); |
| 122 | 169 | DECLARE_READ8_MEMBER(bankshot_read_k); |
| 123 | 170 | DECLARE_WRITE16_MEMBER(bankshot_write_r); |
| 124 | 171 | DECLARE_WRITE16_MEMBER(bankshot_write_o); |
| 125 | 172 | |
| 126 | | void splitsec_display(); |
| 127 | 173 | DECLARE_READ8_MEMBER(splitsec_read_k); |
| 128 | 174 | DECLARE_WRITE16_MEMBER(splitsec_write_r); |
| 129 | 175 | DECLARE_WRITE16_MEMBER(splitsec_write_o); |
| r244642 | r244643 | |
| 139 | 185 | }; |
| 140 | 186 | |
| 141 | 187 | |
| 188 | // machine_start/reset |
| 189 | |
| 142 | 190 | void hh_tms1k_state::machine_start() |
| 143 | 191 | { |
| 144 | 192 | // zerofill |
| r244642 | r244643 | |
| 168 | 216 | save_item(NAME(m_power_on)); |
| 169 | 217 | } |
| 170 | 218 | |
| 171 | | |
| 172 | 219 | void hh_tms1k_state::machine_reset() |
| 173 | 220 | { |
| 174 | 221 | m_power_on = true; |
| 175 | 222 | } |
| 176 | 223 | |
| 224 | |
| 225 | |
| 177 | 226 | /*************************************************************************** |
| 178 | 227 | |
| 179 | 228 | Helper Functions |
| r244642 | r244643 | |
| 243 | 292 | display_update(); |
| 244 | 293 | } |
| 245 | 294 | |
| 295 | void hh_tms1k_state::display_matrix(int maxx, int maxy, UINT32 setx, UINT32 sety) |
| 296 | { |
| 297 | m_display_maxx = maxx; |
| 298 | m_display_maxy = maxy; |
| 246 | 299 | |
| 300 | // update current state |
| 301 | for (int y = 0; y < maxy; y++) |
| 302 | m_display_state[y] = (sety >> y & 1) ? setx : 0; |
| 303 | |
| 304 | display_update(); |
| 305 | } |
| 306 | |
| 307 | |
| 247 | 308 | UINT8 hh_tms1k_state::read_inputs(int columns) |
| 248 | 309 | { |
| 249 | | UINT8 k = 0; |
| 310 | UINT8 ret = 0; |
| 250 | 311 | |
| 251 | 312 | // read selected input rows |
| 252 | 313 | for (int i = 0; i < columns; i++) |
| 253 | 314 | if (m_inp_mux >> i & 1) |
| 254 | | k |= m_inp_matrix[i]->read(); |
| 315 | ret |= m_inp_matrix[i]->read(); |
| 255 | 316 | |
| 256 | | return k; |
| 317 | return ret; |
| 257 | 318 | } |
| 258 | 319 | |
| 259 | | INPUT_CHANGED_MEMBER(hh_tms1k_state::tms0980_power_button) |
| 260 | | { |
| 261 | | m_power_on = (bool)(FPTR)param; |
| 262 | | m_maincpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE); |
| 263 | | } |
| 264 | 320 | |
| 321 | // devices with a TMS0980 can auto power-off |
| 322 | |
| 265 | 323 | WRITE_LINE_MEMBER(hh_tms1k_state::tms0980_auto_power_off) |
| 266 | 324 | { |
| 267 | | // TMS0980 auto power-off opcode |
| 268 | 325 | if (state) |
| 269 | 326 | { |
| 270 | 327 | m_power_on = false; |
| r244642 | r244643 | |
| 272 | 329 | } |
| 273 | 330 | } |
| 274 | 331 | |
| 332 | INPUT_CHANGED_MEMBER(hh_tms1k_state::tms0980_power_button) |
| 333 | { |
| 334 | m_power_on = (bool)(FPTR)param; |
| 335 | m_maincpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE); |
| 336 | } |
| 337 | |
| 338 | |
| 339 | |
| 275 | 340 | /*************************************************************************** |
| 276 | 341 | |
| 277 | 342 | Minidrivers (I/O, Inputs, Machine Config) |
| r244642 | r244643 | |
| 331 | 396 | return read_inputs(6); |
| 332 | 397 | } |
| 333 | 398 | |
| 334 | | |
| 335 | 399 | WRITE16_MEMBER(hh_tms1k_state::mathmagi_write_r) |
| 336 | 400 | { |
| 337 | 401 | // R3,R5-R7,R9,R10: input mux |
| r244642 | r244643 | |
| 350 | 414 | m_o = data; |
| 351 | 415 | } |
| 352 | 416 | |
| 417 | |
| 353 | 418 | /* physical button layout and labels is like this: |
| 354 | 419 | |
| 355 | 420 | ON ONE [SEL] [NXT] [?] [/] |
| r244642 | r244643 | |
| 399 | 464 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 400 | 465 | INPUT_PORTS_END |
| 401 | 466 | |
| 467 | // output PLA is not dumped |
| 402 | 468 | static const UINT16 mathmagi_output_pla[0x20] = |
| 403 | 469 | { |
| 404 | 470 | lA+lB+lC+lD+lE+lF, // 0 |
| r244642 | r244643 | |
| 435 | 501 | lA+lF+lE+lD+lC // G |
| 436 | 502 | }; |
| 437 | 503 | |
| 438 | | |
| 439 | 504 | static MACHINE_CONFIG_START( mathmagi, hh_tms1k_state ) |
| 440 | 505 | |
| 441 | 506 | /* basic machine hardware */ |
| r244642 | r244643 | |
| 626 | 691 | void hh_tms1k_state::tc4_display() |
| 627 | 692 | { |
| 628 | 693 | m_display_wait = 50; |
| 629 | | m_display_maxy = 10; |
| 630 | | m_display_maxx = 9; |
| 631 | 694 | |
| 632 | 695 | // R5,7,8,9 are 7segs |
| 633 | | for (int y = 0; y < m_display_maxy; y++) |
| 696 | for (int y = 0; y < 10; y++) |
| 634 | 697 | if (y >= 5 && y <= 9 && y != 6) |
| 635 | 698 | m_7seg_mask[y] = 0x7f; |
| 636 | 699 | |
| 637 | 700 | // update current state (note: R6 as extra column!) |
| 638 | | for (int y = 0; y < m_display_maxy; y++) |
| 639 | | m_display_state[y] = (m_r >> y & 1) ? (m_o | (m_r << 2 & 0x100)) : 0; |
| 640 | | |
| 641 | | display_update(); |
| 701 | display_matrix(9, 10, (m_o | (m_r << 2 & 0x100)), m_r); |
| 642 | 702 | } |
| 643 | 703 | |
| 644 | 704 | READ8_MEMBER(hh_tms1k_state::tc4_read_k) |
| r244642 | r244643 | |
| 662 | 722 | m_inp_mux = data & 0x23f; |
| 663 | 723 | |
| 664 | 724 | // R6: led column 8 |
| 665 | | // +other: select leds |
| 725 | // +other columns |
| 666 | 726 | m_r = data; |
| 667 | 727 | tc4_display(); |
| 668 | 728 | } |
| 669 | 729 | |
| 670 | 730 | WRITE16_MEMBER(hh_tms1k_state::tc4_write_o) |
| 671 | 731 | { |
| 672 | | // O0-O7: leds/7segment |
| 732 | // O0-O7: led row |
| 673 | 733 | m_o = data; |
| 674 | 734 | tc4_display(); |
| 675 | 735 | } |
| r244642 | r244643 | |
| 745 | 805 | Entex Baseball |
| 746 | 806 | * TMS1000NLP MP0914 (die labeled MP0914A) |
| 747 | 807 | |
| 808 | NOTE!: MESS external artwork is recommended |
| 809 | |
| 810 | lamp translation table: led LDzz from game PCB = MESS lampyx: |
| 811 | |
| 812 | LD0 = - LD10 = lamp12 LD20 = lamp42 LD30 = lamp60 |
| 813 | LD1 = lamp23 LD11 = lamp4 LD21 = lamp41 LD31 = lamp61 |
| 814 | LD2 = lamp0 LD12 = lamp15 LD22 = lamp40 LD32 = lamp62 |
| 815 | LD3 = lamp1 LD13 = lamp22 LD23 = lamp43 LD33 = lamp70 |
| 816 | LD4 = lamp2 LD14 = lamp33 LD24 = lamp53 LD34 = lamp71 |
| 817 | LD5 = lamp10 LD15 = lamp32 LD25 = lamp52 |
| 818 | LD6 = lamp13 LD16 = lamp21 LD26 = lamp51 |
| 819 | LD7 = lamp11 LD17 = lamp31 LD27 = lamp50 |
| 820 | LD8 = lamp3 LD18 = lamp30 LD28 = lamp72 |
| 821 | LD9 = lamp14 LD19 = lamp20 LD29 = lamp73 |
| 822 | |
| 748 | 823 | ***************************************************************************/ |
| 749 | 824 | |
| 750 | | // inputs |
| 825 | void hh_tms1k_state::ebball_display() |
| 826 | { |
| 827 | // R8 is a 7seg |
| 828 | m_7seg_mask[8] = 0x7f; |
| 829 | |
| 830 | display_matrix(7, 9, m_o, m_r); |
| 831 | } |
| 832 | |
| 833 | READ8_MEMBER(hh_tms1k_state::ebball_read_k) |
| 834 | { |
| 835 | // note: K8(Vss row) is always on |
| 836 | return m_inp_matrix[5]->read() | read_inputs(5); |
| 837 | } |
| 838 | |
| 839 | WRITE16_MEMBER(hh_tms1k_state::ebball_write_r) |
| 840 | { |
| 841 | // R1-R5: input mux |
| 842 | m_inp_mux = data >> 1 & 0x1f; |
| 843 | |
| 844 | // R9: speaker out |
| 845 | m_speaker->level_w(data >> 9 & 1); |
| 846 | |
| 847 | // R0-R8: led columns |
| 848 | m_r = data; |
| 849 | ebball_display(); |
| 850 | } |
| 851 | |
| 852 | WRITE16_MEMBER(hh_tms1k_state::ebball_write_o) |
| 853 | { |
| 854 | // O0-O6: led row |
| 855 | // O7: N/C |
| 856 | m_o = data; |
| 857 | ebball_display(); |
| 858 | } |
| 859 | |
| 751 | 860 | static INPUT_PORTS_START( ebball ) |
| 861 | PORT_START("IN.0") // R1 |
| 862 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) |
| 863 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) |
| 864 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) |
| 865 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 866 | |
| 867 | PORT_START("IN.1") // R2 |
| 868 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) |
| 869 | PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 870 | |
| 871 | PORT_START("IN.2") // R3 |
| 872 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) |
| 873 | PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 874 | |
| 875 | PORT_START("IN.3") // R4 |
| 876 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) |
| 877 | PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 878 | |
| 879 | PORT_START("IN.4") // R5 |
| 880 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON7 ) |
| 881 | PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 882 | |
| 883 | PORT_START("IN.5") // Vss! |
| 884 | PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 885 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON8 ) |
| 752 | 886 | INPUT_PORTS_END |
| 753 | 887 | |
| 754 | | // machine config |
| 755 | 888 | static MACHINE_CONFIG_START( ebball, hh_tms1k_state ) |
| 756 | 889 | |
| 757 | 890 | /* basic machine hardware */ |
| 758 | 891 | MCFG_CPU_ADD("maincpu", TMS1000, 350000) // RC osc. R=43K, C=47pf -> ~350kHz |
| 892 | MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, ebball_read_k)) |
| 893 | MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, ebball_write_r)) |
| 894 | MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, ebball_write_o)) |
| 759 | 895 | |
| 896 | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1)) |
| 760 | 897 | MCFG_DEFAULT_LAYOUT(layout_ebball) |
| 761 | 898 | |
| 762 | 899 | /* no video! */ |
| r244642 | r244643 | |
| 795 | 932 | |
| 796 | 933 | WRITE16_MEMBER(hh_tms1k_state::elecdet_write_r) |
| 797 | 934 | { |
| 798 | | m_display_maxy = 7; |
| 799 | | m_display_maxx = 7; |
| 935 | // R7,R8: speaker on |
| 936 | m_speaker->level_w((data & 0x180 && m_o & 0x80) ? 1 : 0); |
| 800 | 937 | |
| 801 | 938 | // R0-R6: select digit |
| 802 | | UINT8 o = BITSWAP8(m_o,7,5,2,1,4,0,6,3); |
| 803 | | for (int y = 0; y < m_display_maxy; y++) |
| 804 | | { |
| 939 | for (int y = 0; y < 7; y++) |
| 805 | 940 | m_7seg_mask[y] = 0x7f; |
| 806 | | m_display_state[y] = (data >> y & 1) ? o : 0; |
| 807 | | } |
| 808 | 941 | |
| 809 | | display_update(); |
| 810 | | |
| 811 | | // R7,R8: speaker on |
| 812 | | m_speaker->level_w((data & 0x180 && m_o & 0x80) ? 1 : 0); |
| 942 | display_matrix(7, 7, BITSWAP8(m_o,7,5,2,1,4,0,6,3), data); |
| 813 | 943 | } |
| 814 | 944 | |
| 815 | 945 | WRITE16_MEMBER(hh_tms1k_state::elecdet_write_o) |
| r244642 | r244643 | |
| 833 | 963 | */ |
| 834 | 964 | |
| 835 | 965 | static INPUT_PORTS_START( elecdet ) |
| 836 | | PORT_START("IN.0") // O0 pin18 |
| 966 | PORT_START("IN.0") // O0 |
| 837 | 967 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") |
| 838 | 968 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 839 | 969 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") |
| 840 | 970 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Private Question") |
| 841 | 971 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") |
| 842 | 972 | |
| 843 | | PORT_START("IN.1") // O1 pin17 |
| 973 | PORT_START("IN.1") // O1 |
| 844 | 974 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 845 | 975 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 846 | 976 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") |
| 847 | 977 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") |
| 848 | 978 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 849 | 979 | |
| 850 | | PORT_START("IN.2") // O4 pin14 |
| 980 | PORT_START("IN.2") // O4 |
| 851 | 981 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") |
| 852 | 982 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 853 | 983 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") |
| 854 | 984 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("I Accuse") |
| 855 | 985 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") |
| 856 | 986 | |
| 857 | | PORT_START("IN.3") // O6 pin12 |
| 987 | PORT_START("IN.3") // O6 |
| 858 | 988 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") |
| 859 | 989 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 860 | 990 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") |
| r244642 | r244643 | |
| 908 | 1038 | |
| 909 | 1039 | void hh_tms1k_state::starwbc_display() |
| 910 | 1040 | { |
| 911 | | m_display_maxy = 10; |
| 912 | | m_display_maxx = 8; |
| 913 | | |
| 914 | | UINT8 o = (m_o << 4 & 0xf0) | (m_o >> 4 & 0x0f); |
| 915 | | for (int y = 0; y < m_display_maxy; y+=2) |
| 916 | | { |
| 917 | | m_display_state[y] = (m_r >> y & 1) ? o : 0; |
| 918 | | |
| 919 | | // R6,R8 are 7segs |
| 920 | | if (y == 6 || y == 8) |
| 921 | | m_7seg_mask[y] = 0x7f; |
| 922 | | } |
| 923 | | |
| 924 | | display_update(); |
| 1041 | // R6,R8 are 7segs |
| 1042 | m_7seg_mask[6] = m_7seg_mask[8] = 0x7f; |
| 1043 | |
| 1044 | display_matrix(8, 10, m_o, m_r); |
| 925 | 1045 | } |
| 926 | 1046 | |
| 927 | 1047 | READ8_MEMBER(hh_tms1k_state::starwbc_read_k) |
| r244642 | r244643 | |
| 934 | 1054 | // R0,R1,R3,R5,R7: input mux |
| 935 | 1055 | m_inp_mux = (data & 3) | (data >> 1 & 4) | (data >> 2 & 8) | (data >> 3 & 0x10); |
| 936 | 1056 | |
| 937 | | // R9: piezo speaker |
| 1057 | // R9: speaker out |
| 938 | 1058 | m_speaker->level_w(data >> 9 & 1); |
| 939 | 1059 | |
| 940 | | // R0,R2,R4,R6,R8: leds |
| 941 | | m_r = data; |
| 1060 | // R0,R2,R4,R6,R8: led columns |
| 1061 | m_r = data & 0x155; |
| 942 | 1062 | starwbc_display(); |
| 943 | 1063 | } |
| 944 | 1064 | |
| 945 | 1065 | WRITE16_MEMBER(hh_tms1k_state::starwbc_write_o) |
| 946 | 1066 | { |
| 947 | | // O0-O7: leds state |
| 948 | | m_o = data; |
| 1067 | // O0-O7: led row |
| 1068 | m_o = (data << 4 & 0xf0) | (data >> 4 & 0x0f); |
| 949 | 1069 | starwbc_display(); |
| 950 | 1070 | } |
| 951 | 1071 | |
| 952 | 1072 | |
| 953 | | |
| 954 | 1073 | /* physical button layout and labels is like this: |
| 955 | 1074 | |
| 956 | 1075 | (reconnnaissance=yellow) (tactical reaction=green) |
| r244642 | r244643 | |
| 996 | 1115 | static MACHINE_CONFIG_START( starwbc, hh_tms1k_state ) |
| 997 | 1116 | |
| 998 | 1117 | /* basic machine hardware */ |
| 999 | | MCFG_CPU_ADD("maincpu", TMS1100, 300000) // RC osc. R=51K, C=47pf -> ~300kHz |
| 1118 | MCFG_CPU_ADD("maincpu", TMS1100, 325000) // RC osc. R=51K, C=47pf -> ~325kHz |
| 1000 | 1119 | MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, starwbc_read_k)) |
| 1001 | 1120 | MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, starwbc_write_r)) |
| 1002 | 1121 | MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, starwbc_write_o)) |
| r244642 | r244643 | |
| 1029 | 1148 | Refer to the official manual for more information. |
| 1030 | 1149 | |
| 1031 | 1150 | |
| 1032 | | TODO: |
| 1033 | | - MCU clock is unknown |
| 1034 | | |
| 1035 | 1151 | ***************************************************************************/ |
| 1036 | 1152 | |
| 1037 | 1153 | READ8_MEMBER(hh_tms1k_state::comp4_read_k) |
| r244642 | r244643 | |
| 1047 | 1163 | // R2 R7 |
| 1048 | 1164 | // R1 R6 |
| 1049 | 1165 | // R0 R5 |
| 1050 | | m_display_maxx = 11; |
| 1051 | | m_display_state[0] = data; |
| 1052 | | display_update(); |
| 1166 | m_r = data; |
| 1167 | display_matrix(11, 1, m_r, m_o); |
| 1053 | 1168 | } |
| 1054 | 1169 | |
| 1055 | 1170 | WRITE16_MEMBER(hh_tms1k_state::comp4_write_o) |
| 1056 | 1171 | { |
| 1057 | | // O0: leds common (always writes 1) |
| 1058 | 1172 | // O1-O3: input mux |
| 1173 | m_inp_mux = data >> 1 & 7; |
| 1174 | |
| 1175 | // O0: leds common |
| 1059 | 1176 | // other bits: N/C |
| 1060 | | m_inp_mux = data >> 1 & 7; |
| 1177 | m_o = data; |
| 1178 | display_matrix(11, 1, m_r, m_o); |
| 1061 | 1179 | } |
| 1062 | 1180 | |
| 1063 | 1181 | |
| r244642 | r244643 | |
| 1105 | 1223 | Milton Bradley Simon, created by Ralph Baer |
| 1106 | 1224 | |
| 1107 | 1225 | Revision A hardware: |
| 1108 | | * TMS1000 (has internal ROM), DS75494 lamp driver |
| 1226 | * TMS1000 (die labeled MP3226), DS75494 lamp driver |
| 1109 | 1227 | |
| 1110 | 1228 | Newer revisions have a smaller 16-pin MB4850 chip instead of the TMS1000. |
| 1111 | 1229 | This one has been decapped too, but we couldn't find an internal ROM. |
| r244642 | r244643 | |
| 1129 | 1247 | // R5 -> 75494 IN3 -> red lamp |
| 1130 | 1248 | // R6 -> 75494 IN5 -> yellow lamp |
| 1131 | 1249 | // R7 -> 75494 IN2 -> blue lamp |
| 1132 | | m_display_maxx = 4; |
| 1133 | | m_display_state[0] = data >> 4 & 0xf; |
| 1134 | | display_update(); |
| 1250 | display_matrix(4, 1, data >> 4, 1); |
| 1135 | 1251 | |
| 1136 | 1252 | // R8 -> 75494 IN0 -> speaker |
| 1137 | 1253 | m_speaker->level_w(data >> 8 & 1); |
| r244642 | r244643 | |
| 1338 | 1454 | R7 R8 R9 |
| 1339 | 1455 | R10 |
| 1340 | 1456 | */ |
| 1341 | | m_display_maxx = 11; |
| 1342 | | m_display_state[0] = data; |
| 1343 | | display_update(); |
| 1457 | display_matrix(11, 1, data, 1); |
| 1344 | 1458 | } |
| 1345 | 1459 | |
| 1346 | 1460 | WRITE16_MEMBER(hh_tms1k_state::merlin_write_o) |
| r244642 | r244643 | |
| 1537 | 1651 | |
| 1538 | 1652 | ***************************************************************************/ |
| 1539 | 1653 | |
| 1540 | | void hh_tms1k_state::bankshot_display() |
| 1541 | | { |
| 1542 | | m_display_maxy = 11; |
| 1543 | | m_display_maxx = 7; |
| 1544 | | |
| 1545 | | // update current state |
| 1546 | | for (int y = 0; y < m_display_maxy; y++) |
| 1547 | | m_display_state[y] = (m_r >> y & 1) ? m_o : 0; |
| 1548 | | |
| 1549 | | display_update(); |
| 1550 | | } |
| 1551 | | |
| 1552 | 1654 | READ8_MEMBER(hh_tms1k_state::bankshot_read_k) |
| 1553 | 1655 | { |
| 1554 | 1656 | return read_inputs(2); |
| 1555 | 1657 | } |
| 1556 | 1658 | |
| 1557 | | |
| 1558 | 1659 | WRITE16_MEMBER(hh_tms1k_state::bankshot_write_r) |
| 1559 | 1660 | { |
| 1560 | 1661 | // R0: speaker out |
| r244642 | r244643 | |
| 1563 | 1664 | // R2,R3: input mux |
| 1564 | 1665 | m_inp_mux = data >> 2 & 3; |
| 1565 | 1666 | |
| 1566 | | // R2-R10: led rows |
| 1667 | // R2-R10: led columns |
| 1567 | 1668 | m_r = data & ~3; |
| 1568 | | bankshot_display(); |
| 1669 | display_matrix(7, 11, m_o, m_r); |
| 1569 | 1670 | } |
| 1570 | 1671 | |
| 1571 | 1672 | WRITE16_MEMBER(hh_tms1k_state::bankshot_write_o) |
| 1572 | 1673 | { |
| 1573 | | // O0-O6: led columns |
| 1674 | // O0-O6: led row |
| 1574 | 1675 | // O7: N/C |
| 1575 | 1676 | m_o = data; |
| 1576 | | bankshot_display(); |
| 1677 | display_matrix(7, 11, m_o, m_r); |
| 1577 | 1678 | } |
| 1578 | 1679 | |
| 1579 | 1680 | |
| r244642 | r244643 | |
| 1643 | 1744 | |
| 1644 | 1745 | *: higher number indicates higher difficulty |
| 1645 | 1746 | |
| 1646 | | ***************************************************************************/ |
| 1747 | display layout, where number xy is lamp R(x),O(y) |
| 1647 | 1748 | |
| 1648 | | |
| 1649 | | /* display layout, where number xy is lamp R(x),O(y) |
| 1650 | | |
| 1651 | 1749 | 00 02 04 |
| 1652 | 1750 | 10 01 12 03 14 05 16 |
| 1653 | 1751 | 11 13 15 |
| r244642 | r244643 | |
| 1659 | 1757 | 71 73 75 |
| 1660 | 1758 | 50 60 52 62 54 64 56 |
| 1661 | 1759 | 70 72 74 |
| 1662 | | */ |
| 1663 | 1760 | |
| 1664 | | void hh_tms1k_state::splitsec_display() |
| 1665 | | { |
| 1666 | | m_display_maxy = 8; |
| 1667 | | m_display_maxx = 7; |
| 1668 | | |
| 1669 | | // update current state |
| 1670 | | for (int y = 0; y < m_display_maxy; y++) |
| 1671 | | m_display_state[y] = (m_r >> y & 1) ? m_o : 0; |
| 1672 | | |
| 1673 | | display_update(); |
| 1674 | | } |
| 1761 | ***************************************************************************/ |
| 1675 | 1762 | |
| 1676 | 1763 | READ8_MEMBER(hh_tms1k_state::splitsec_read_k) |
| 1677 | 1764 | { |
| r244642 | r244643 | |
| 1686 | 1773 | // R9,R10: input mux |
| 1687 | 1774 | m_inp_mux = data >> 9 & 3; |
| 1688 | 1775 | |
| 1689 | | // R0-R7: led rows |
| 1776 | // R0-R7: led columns |
| 1690 | 1777 | m_r = data; |
| 1691 | | display_update(); |
| 1778 | display_matrix(7, 8, m_o, m_r); |
| 1692 | 1779 | } |
| 1693 | 1780 | |
| 1694 | 1781 | WRITE16_MEMBER(hh_tms1k_state::splitsec_write_o) |
| 1695 | 1782 | { |
| 1696 | | // O0-O6: led columns |
| 1783 | // O0-O6: led row |
| 1697 | 1784 | // O7: N/C |
| 1698 | 1785 | m_o = data; |
| 1699 | | splitsec_display(); |
| 1786 | display_matrix(7, 8, m_o, m_r); |
| 1700 | 1787 | } |
| 1701 | 1788 | |
| 1702 | 1789 | static INPUT_PORTS_START( splitsec ) |
| r244642 | r244643 | |
| 1708 | 1795 | |
| 1709 | 1796 | PORT_START("IN.1") // R10 |
| 1710 | 1797 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY |
| 1711 | | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Select") |
| 1712 | | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Start") |
| 1798 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SELECT ) |
| 1799 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) |
| 1713 | 1800 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 1714 | 1801 | INPUT_PORTS_END |
| 1715 | 1802 | |
| r244642 | r244643 | |
| 1766 | 1853 | |
| 1767 | 1854 | void hh_tms1k_state::tandy12_display() |
| 1768 | 1855 | { |
| 1769 | | m_display_maxx = 13; |
| 1770 | | |
| 1771 | 1856 | // O0-O7: button lamps 1-8, R0-R3: button lamps 9-12 |
| 1772 | | m_display_state[0] = (m_o << 1 & 0x1fe) | (m_r << 9 & 0x1e00); |
| 1773 | | display_update(); |
| 1857 | display_matrix(13, 1, (m_o << 1 & 0x1fe) | (m_r << 9 & 0x1e00), 1); |
| 1774 | 1858 | } |
| 1775 | 1859 | |
| 1776 | 1860 | READ8_MEMBER(hh_tms1k_state::tandy12_read_k) |
| r244642 | r244643 | |
| 1997 | 2081 | |
| 1998 | 2082 | ROM_START( amaztron ) |
| 1999 | 2083 | ROM_REGION( 0x0800, "maincpu", 0 ) |
| 2000 | | ROM_LOAD( "tms1100nll_mp3405", 0x0000, 0x0800, CRC(9cbc0009) SHA1(17772681271b59280687492f37fa0859998f041d) ) |
| 2084 | ROM_LOAD( "mp3405", 0x0000, 0x0800, CRC(9cbc0009) SHA1(17772681271b59280687492f37fa0859998f041d) ) |
| 2001 | 2085 | |
| 2002 | 2086 | ROM_REGION( 867, "maincpu:mpla", 0 ) |
| 2003 | 2087 | ROM_LOAD( "tms1100_amaztron_mpla.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) |
| r244642 | r244643 | |
| 2010 | 2094 | |
| 2011 | 2095 | ROM_START( tc4 ) |
| 2012 | 2096 | ROM_REGION( 0x1000, "maincpu", 0 ) |
| 2013 | | ROM_LOAD( "tms1400nll_mp7334", 0x0000, 0x1000, CRC(923f3821) SHA1(a9ae342d7ff8dae1dedcd1e4984bcfae68586581) ) |
| 2097 | ROM_LOAD( "mp7334", 0x0000, 0x1000, CRC(923f3821) SHA1(a9ae342d7ff8dae1dedcd1e4984bcfae68586581) ) |
| 2014 | 2098 | |
| 2015 | 2099 | ROM_REGION( 867, "maincpu:mpla", 0 ) |
| 2016 | 2100 | ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) |
| r244642 | r244643 | |
| 2032 | 2116 | |
| 2033 | 2117 | ROM_START( elecdet ) |
| 2034 | 2118 | ROM_REGION( 0x1000, "maincpu", 0 ) |
| 2035 | | ROM_LOAD( "tms0980nll_mp6100a", 0x0000, 0x1000, CRC(6f396bb8) SHA1(1f104d4ca9bee0d4572be4779b7551dfe20c4f04) ) |
| 2119 | ROM_LOAD( "mp6100a", 0x0000, 0x1000, CRC(6f396bb8) SHA1(1f104d4ca9bee0d4572be4779b7551dfe20c4f04) ) |
| 2036 | 2120 | |
| 2037 | 2121 | ROM_REGION( 1246, "maincpu:ipla", 0 ) |
| 2038 | 2122 | ROM_LOAD( "tms0980_default_ipla.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) |
| r244642 | r244643 | |
| 2120 | 2204 | |
| 2121 | 2205 | ROM_START( stopthie ) |
| 2122 | 2206 | ROM_REGION( 0x1000, "maincpu", 0 ) |
| 2123 | | ROM_LOAD( "tms0980nll_mp6101b", 0x0000, 0x1000, CRC(8bde5bb4) SHA1(8c318fcce67acc24c7ae361f575f28ec6f94665a) ) |
| 2207 | ROM_LOAD( "mp6101b", 0x0000, 0x1000, CRC(8bde5bb4) SHA1(8c318fcce67acc24c7ae361f575f28ec6f94665a) ) |
| 2124 | 2208 | |
| 2125 | 2209 | ROM_REGION( 1246, "maincpu:ipla", 0 ) |
| 2126 | 2210 | ROM_LOAD( "tms0980_default_ipla.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) |
| r244642 | r244643 | |
| 2148 | 2232 | |
| 2149 | 2233 | ROM_START( bankshot ) |
| 2150 | 2234 | ROM_REGION( 0x1000, "maincpu", 0 ) |
| 2151 | | ROM_LOAD( "tms1400nll_mp7313", 0x0000, 0x1000, CRC(7a5016a9) SHA1(a8730dc8a282ffaa3d89e675f371d43eb39f39b4) ) |
| 2235 | ROM_LOAD( "mp7313", 0x0000, 0x1000, CRC(7a5016a9) SHA1(a8730dc8a282ffaa3d89e675f371d43eb39f39b4) ) |
| 2152 | 2236 | |
| 2153 | 2237 | ROM_REGION( 867, "maincpu:mpla", 0 ) |
| 2154 | 2238 | ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) |
| r244642 | r244643 | |
| 2159 | 2243 | |
| 2160 | 2244 | ROM_START( splitsec ) |
| 2161 | 2245 | ROM_REGION( 0x1000, "maincpu", 0 ) |
| 2162 | | ROM_LOAD( "tms1400nll_mp7314", 0x0000, 0x1000, CRC(e94b2098) SHA1(f0fc1f56a829252185592a2508740354c50bedf8) ) |
| 2246 | ROM_LOAD( "mp7314", 0x0000, 0x1000, CRC(e94b2098) SHA1(f0fc1f56a829252185592a2508740354c50bedf8) ) |
| 2163 | 2247 | |
| 2164 | 2248 | ROM_REGION( 867, "maincpu:mpla", 0 ) |
| 2165 | 2249 | ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) |
| r244642 | r244643 | |
| 2180 | 2264 | |
| 2181 | 2265 | ROM_START( unk3403 ) |
| 2182 | 2266 | ROM_REGION( 0x0800, "maincpu", 0 ) |
| 2183 | | ROM_LOAD( "tms1100nll_mp3403", 0x0000, 0x0800, CRC(9eabaa7d) SHA1(b1f54587ed7f2bbf3a5d49075c807296384c2b06) ) |
| 2267 | ROM_LOAD( "mp3403", 0x0000, 0x0800, CRC(9eabaa7d) SHA1(b1f54587ed7f2bbf3a5d49075c807296384c2b06) ) |
| 2184 | 2268 | |
| 2185 | 2269 | ROM_REGION( 867, "maincpu:mpla", 0 ) |
| 2186 | 2270 | ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified |