/
8080bw.c
executable file
·4794 lines (3949 loc) · 240 KB
/
8080bw.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
// license:MAME
// copyright-holders:Michael Strutts,Nicola Salmoria,Tormod Tjaberg,Mirko Buffoni,Lee Taylor,Valerio Verrando,Marco Cassili,Zsolt Vasvari,Aaron Giles,Jonathan Gevaryahu,hap,Robbbert,MISSING_OTHERS
/*****************************************************************************
8080bw.c
Michael Strutts, Nicola Salmoria, Tormod Tjaberg, Mirko Buffoni
Lee Taylor, Valerio Verrando, Marco Cassili, Zsolt Vasvari, and others
Much information about Space Invaders PCBs and other Taito and Midway
sets and hardware contributed by Andrew Welburn
Notes:
-----
- Space Invaders Deluxe still says Space Invaders Part II,
because according to KLOV, Midway was only allowed to make minor
modifications of the Taito code.
- DIP settings/locations verified from manual for:
sitv, sicv, invadpt2, lrescue, invasion, invrvnge
- The Taito Space invaders hardware comes on at least five board types;
The Taito manufactured ones are:
* The "L-shaped" PCB set, Upright, B&W only
* Three pcbs in a stack, often called the '3 layer pcb set' (most common)
* Two pcbs in a stack, with the function of two of the three pcb stack
pcbs combined.
* In general, discounting revision specific differences, the pcbs are
arranged in a stack, connected end-to-end by ribbon cables and folded
such that the middle pcb (of 3 pcb stack) or the bottom pcb (of 2 pcb
stack) is upside down.
* Keep in mind specific differences on the pcbs (especially the TVN pcbs
vs the others) sometimes prevent exchanging 'equivalent' pcbs between stacks.
* L-shaped pcb set details:
* One large, square board with ROM, RAM, CPU, Video circuitry on it.
* One smaller pcb with audio/io/shifter circuitry on it, plugged into
the main pcb at a right angle (hence the entire pcb set is 'L-shaped')
* Does not have the capability of any sort of electronic color overlay.
* 3 layer pcb set details:
* This pcb set came in 3 versions: TVN, CVN, PVN; see below for differences.
* Top pcb: Audio/IO/Shifter pcb
- discrete audio and sn76477, and volume knobs
- data shifter, using either ~11 74xx chips, AM25S10s, Fujitsu MB14221
or Fujitsu MB14241 chips, which all do the same thing.
- has the dipswitches
- has the main "G" edge connector for the wiring harness
- has the gating circuitry for the color overlay
(these are not present and/or populated on some TVN pcbs)
- despite there being at least six versions of this pcb, the discrete
audio section is identical in all of them.
* Middle pcb: CPU/RAM/Color overlay pcb
- has DRAMS on it
- has the 8080 CPU on it
- has the two PROMS for color overlay on it (one for each player flip)
(these are not populated on TVN pcbs and the related circuitry is not
present and/or populated on some TVN pcbs)
* Bottom pcb: Power/Video/ROM pcb
- has the game roms on it
- has the main B&W video generation logic on it
- has the larger connection to the PSU, and B&W composite output "T" connector
* 2 layer pcb set details:
* This pcb set came in one version: PVN, and is entirely exchangeable
with the 3 layer PVN pcb set.
* Top pcb is same as 3 layer pcb set
* Bottom pcb combines the function of the Middle and Bottom pcbs
of the 3 layer set.
* The different pcb set versions are noted by a different version code on
a paper sticker on the pcb; The code will be of the format mVNnnnnn where
m is a letter and nnnnn is a number.
Codes:
* TVNxxxxx (3 layer pcbset) - B&W only, used on "T.T Space Invaders"
cocktail with 'blended' single-sheet gel color overlay.
***TODO: this overlay is not supported yet!
Several revisions (at least 5 rom, 3 cpu, 3 audio) of each pcb exist
for this set.
Does support flipscreen.
Does not have the color overlay circuitry nor places for it on the pcbs.
(Later TVNxxxxx are actually rebadged CVNxxxxx, see below)
Came from factory with one of the SV or TV romsets.
Capable of running TV, SV or CV romsets.
This pcb set is probably the oldest one and was designed at Taito.
* SVNxxxxx? (L-shaped pcbset) - B&W only, used on "Space Invaders" Upright
with 3-separate-sheets-of-gel 'strips' color overlay.
***TODO: this overlay might not be supported properly yet!
Does not support flipscreen, was intended for upright cabinets only.
Audio PCB daughterboard has part number SVN00001 or SVN00003.
Came from factory with one of the 6x 0x400 or 4x 0x800 romsets
Capable of running TV, SV or CV romsets.
This is probably the second-oldest pcb set and may have been made to
allow closer physical interchangability with Midway's m8080bw hardware,
which had a similar board shape?
* CVNxxxxx (3 layer pcbset) - Color, used on "T.T Space Invaders Color"
cocktail with electronic color overlay.
Does support flipscreen.
Note that later TVNxxxxx pcbsets are actually 'rebadged' CVNxxxxx
pcbsets with the color overlay circuitry unpopulated, and can be
'upgraded' to CVNxxxxx by adding a few components and proms.
Came from factory with one of the CV romsets.
Capable of running TV, SV or CV romsets.
* PVNxxxxx (2&3 layer pcbsets) - Color, used on "T.T Space Invaders Part
II" cocktail with electronic color overlay.
Several revisions (at least 3 rom, 1 cpu, 2 audio) of each pcb exist
for this set.
Came from factory with UV (2708) or PV (2716) romsets.
Capable of running TV, SV, CV, UV or PV romsets.
* The following Romsets are known, ROUGHLY from oldest to newest:
SV01, SV02, SV03, SV04, SV05, SV06 - undumped (rev 1), If this exists at all this would be the very first japan release of space invaders (Andy W may call this 'SV0'?)
SV01, SV02, SV10, SV04, SV09, SV06 - sisv2 (rev 2) (Andy W calls this 'SV1', and the midway 'invaders' set is based on this romset)
SV0H, SV02, SV10, SV04, SV09, SV06 - sisv3 (rev 3) (Andy W calls this 'SV2')
SV0H, SV11, SV12, SV04, SV13, SV14 - sisv (rev 4, 5-digit scoring) (Andy W calls this 'SV3') (this set is likely newer than the TV0x sets)
TV01, TV02, TV03, TV04 - sitv1 (rev 1)
TV0H, TV02, TV03, TV04 - sitv (rev 2 with bug fixes)
CV03, CV04, CV05, CV06 w/proms - undumped (but may be the same as one of the sisv sets with the roms combined to 2716 size)
CV17, CV18, CV19, CV20 w/proms - sicv
UV1, UV2, UV3, UV4, UV5, UV6, UV7, UV8, UV9, UV10 w/proms - undumped (probably same as pvxx set just split differently)
PV01, PV02, PV03, PV04, PV05 w/proms - invadpt2
Note: SV0H and TV0H are called in taito documentation "SV01-1" and "TV01-1" most likely due to someone along the line mistaking the '1-1' for an H or vice versa when writing the documentation or creating the labels.
- Midway PCB sets: (cursory descripton)
* All Midway Space Invaders games ([Space Invader Upright], [Space Invader Cocktail],
[Deluxe Space Invaders Upright], [Deluxe Space Invaders Cocktail], and [Space Invaders II])
use the same m8080bw mainboard, with no emulation-relevant differences between revisions.
* [Space Invaders II] from Midway (only produced as a cocktail) uses
an extra sound board for the simultaneous 2 player head-to-head sounds.
- Taito-USA-made 'trimline' PCBS do not match the taito japan-made pcbs either.
To Do:
-----
- Midway PCB sets
* The discrete components, particularly for the shot sound, differ
between Taito and Midway audio daughterboards.
+ Figure out the difference between the Taito and Midway discrete
boards and emulate them both properly.
+ Figure out what the current discrete setup is trying to emulate.
* Remove Space Invaders 'invaders' set from mw8080bw.c, it does not belong
there at all
- Space Chaser (schaser)
1. Schematic has SX2 & 4 swapped by mistake.
2. Dipswitch 4 we have listed as "Easy/Hard", however the manual says
it should not be used. The Hard position displays many bugs.
3. Confirmation of these on a real machine (schaserb set) have been
received from the owner of the PCB.
"Hi Rob,
I seem to get the same bugs as you with Dip4 set to off. Score starts at 9000,
2 missiles on first level etc.. It makes no mention of dip4 adjusting the hardness
in the manual, are you guys sure that's what it was intended for "in the factory"?
However you were correct in thinking the schematics were wrong. My multimeter found
the following:
15k resistor - pin 7
39k - pin 10
82k - pin 12
It looks like they have Sx2 and Sx4 the wrong way round on a latter page of the schematics."
Thanks to Andy Raven for getting this information.
4. The "Hard" mode bug can be fixed with a single byte patch: ROM_FILL( 0x47e5, 1, 0xc3)
5. I have seen real machines with Hard mode set, that worked properly, thus there
must be yet another romset still waiting to be found.
6. Strange bug; sometimes the missile sound continues into and past the
music/explosion. This didn't happen on the real machines I played.
- Space Chaser (schasercv)
These cheats exist in this game:
1. Hold down 2P DOWN (the F key) while it says INSERT COIN. Then
insert a coin and play. You will have 2 extra ships.
2. In the Hard difficulty setting, you normally start at level 4.
Hold down the 1P START (the 1 key) while it says INSERT COIN.
Then insert a coin and play. You will start at level 5.
- Space War (Sanritsu)
* I seem to recall that the flashing ufo had its own sample
sound, a sort of rattling noise. Unable to find evidence
of this (so far).
- Steel Worker, Space Combat
Holding down the coin button causes the credits to rapidly increase.
- Solfight
On the stage with rolling balls, lots of random dashes appear.
*****************************************************************************/
#include "emu.h"
#include "cpu/m6800/m6800.h"
#include "cpu/i8085/i8085.h"
#include "sound/ay8910.h"
#include "sound/speaker.h"
#include "includes/8080bw.h"
#include "attackfc.lh"
#include "cosmicm.lh"
#include "galactic.lh"
#include "gunchamp.lh"
#include "shuttlei.lh"
#include "spacecom.lh"
/*******************************************************/
/* */
/* Games with additional sound / video hardware */
/* */
/*******************************************************/
MACHINE_START_MEMBER(_8080bw_state,extra_8080bw)
{
MACHINE_START_CALL_MEMBER(extra_8080bw_sh);
MACHINE_START_CALL_MEMBER(extra_8080bw_vh);
MACHINE_START_CALL_MEMBER(mw8080bw);
}
/*******************************************************/
/* */
/* Space Invaders CV Version (Taito) */
/* */
/*******************************************************/
static INPUT_PORTS_START( sicv )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x70, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, mw8080bw_state,invaders_in1_control_r, NULL)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("IN2")
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2")
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x01, "4" )
PORT_DIPSETTING( 0x02, "5" )
PORT_DIPSETTING( 0x03, "6" )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_TILT ) PORT_DIPLOCATION("SW1:3")
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:4")
PORT_DIPSETTING( 0x08, "1000" )
PORT_DIPSETTING( 0x00, "1500" )
/* SW1:5,6,7: In OFF, PL2 can have no control of joystick, going auto left/right and other problems like no laser gun.
Be sure these are always ON */
PORT_BIT( 0x70, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, mw8080bw_state,invaders_in2_control_r, NULL) PORT_DIPLOCATION("SW1:5,6,7") /* Labeled as "FACTORY" */
PORT_DIPNAME( 0x80, 0x00, "Coin Info" ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
/* Dummy controls port, P1 */
INVADERS_CONTROL_PORT_P1
/* Dummy controls port, P2 */
INVADERS_CONTROL_PORT_P2
/* Dummy port for cocktail mode */
INVADERS_CAB_TYPE_PORT
INPUT_PORTS_END
/*******************************************************/
/* */
/* Space Invaders TV Version (Taito) */
/* */
/*******************************************************/
/* same as the CV version with a test mode switch */
static INPUT_PORTS_START( sitv )
PORT_INCLUDE( sicv )
PORT_MODIFY("IN0")
PORT_SERVICE( 0x01, IP_ACTIVE_LOW )
PORT_MODIFY("IN1")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
/*******************************************************/
/* */
/* Alien Invasion */
/* */
/*******************************************************/
static INPUT_PORTS_START( alieninv )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x70, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, mw8080bw_state,invaders_in1_control_r, NULL)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("IN2")
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x00, "2" )
PORT_DIPSETTING( 0x01, "3" )
PORT_DIPNAME( 0x02, 0x02, "Pence Coinage" ) PORT_DIPLOCATION("SW1:2")
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_DIPLOCATION("SW1:3") /* Pence Coin */
PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW1:4" ) /* Not bonus */
PORT_BIT( 0x70, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, mw8080bw_state,invaders_in2_control_r, NULL) PORT_DIPLOCATION("SW1:5,6,7")
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x00, "2C/1C 50p/3C (+ Bonus Life)" )
PORT_DIPSETTING( 0x80, "1C/1C 50p/5C" )
/* Dummy controls port, P1 */
INVADERS_CONTROL_PORT_P1
/* Dummy controls port, P2 */
INVADERS_CONTROL_PORT_P2
/* Dummy port for cocktail mode */
INVADERS_CAB_TYPE_PORT
INPUT_PORTS_END
/*******************************************************/
/* */
/* Space Invaders Model Racing */
/* */
/*******************************************************/
static INPUT_PORTS_START( invadrmr )
PORT_INCLUDE( sicv )
PORT_MODIFY("IN2")
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:4")
PORT_DIPSETTING( 0x00, "1500" )
PORT_DIPSETTING( 0x08, "3000" ) /* This is different to invaders */
INPUT_PORTS_END
/*******************************************************/
/* */
/* Midway "Space Invaders Part II" */
/* */
/*******************************************************/
static ADDRESS_MAP_START( invadpt2_io_map, AS_IO, 8, _8080bw_state )
AM_RANGE(0x00, 0x00) AM_READ_PORT("IN0")
AM_RANGE(0x01, 0x01) AM_READ_PORT("IN1")
AM_RANGE(0x02, 0x02) AM_READ_PORT("IN2") AM_DEVWRITE("mb14241", mb14241_device, shift_count_w)
AM_RANGE(0x03, 0x03) AM_DEVREAD("mb14241", mb14241_device, shift_result_r) AM_WRITE(invadpt2_sh_port_1_w)
AM_RANGE(0x04, 0x04) AM_DEVWRITE("mb14241", mb14241_device, shift_data_w)
AM_RANGE(0x05, 0x05) AM_WRITE(invadpt2_sh_port_2_w)
AM_RANGE(0x06, 0x06) AM_WRITE(watchdog_reset_w)
ADDRESS_MAP_END
static INPUT_PORTS_START( invadpt2 )
PORT_INCLUDE( sicv )
PORT_MODIFY("IN0")
// Name Reset - if name of high scorer was rude, owner can press this button
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Name Reset") PORT_CODE(KEYCODE_F1)
PORT_MODIFY("IN1")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_MODIFY("IN2")
PORT_DIPNAME( 0x01, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x01, "4" )
/* SW1:2 doesn't seem to work? */
PORT_DIPNAME( 0x02, 0x00, "Rotate Images" ) PORT_DIPLOCATION("SW1:2") /* "When ON, the images on screen will be rotated. Default is ON." */
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x00, "Preset Mode" ) PORT_DIPLOCATION("SW1:4") /* Preset Mode: "Switch for checking, when OFF checking can be done." */
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
INPUT_PORTS_END
/* same as regular invaders, but with a color board added */
static MACHINE_CONFIG_DERIVED_CLASS( invadpt2, mw8080bw_root, _8080bw_state )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(invadpt2_io_map)
MCFG_MACHINE_START_OVERRIDE(_8080bw_state,extra_8080bw)
/* 60 Hz signal clocks two LS161. Ripple carry will */
/* reset circuit, if LS161 not cleared before. */
MCFG_WATCHDOG_VBLANK_INIT(255)
/* add shifter */
MCFG_MB14241_ADD("mb14241")
/* video hardware */
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(_8080bw_state, screen_update_invadpt2)
/* sound hardware */
MCFG_FRAGMENT_ADD(invaders_samples_audio)
MACHINE_CONFIG_END
/*******************************************************/
/* */
/* Space Ranger */
/* */
/*******************************************************/
static ADDRESS_MAP_START( spacerng_io_map, AS_IO, 8, _8080bw_state )
AM_RANGE(0x00, 0x00) AM_READ_PORT("IN0")
AM_RANGE(0x01, 0x01) AM_READ_PORT("IN1")
AM_RANGE(0x02, 0x02) AM_READ_PORT("IN2") AM_DEVWRITE("mb14241", mb14241_device, shift_count_w)
AM_RANGE(0x03, 0x03) AM_DEVREAD("mb14241", mb14241_device, shift_result_r) AM_WRITE(invadpt2_sh_port_1_w)
AM_RANGE(0x04, 0x04) AM_DEVWRITE("mb14241", mb14241_device, shift_data_w)
AM_RANGE(0x05, 0x05) AM_WRITE(spacerng_sh_port_2_w)
AM_RANGE(0x06, 0x06) AM_WRITE(watchdog_reset_w)
ADDRESS_MAP_END
static MACHINE_CONFIG_DERIVED_CLASS( spacerng, invadpt2, _8080bw_state )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(spacerng_io_map)
MACHINE_CONFIG_END
/*******************************************************/
/* */
/* Space Wars (Sanritsu) */
/* */
/*******************************************************/
static ADDRESS_MAP_START( spcewars_io_map, AS_IO, 8, _8080bw_state )
AM_RANGE(0x00, 0x00) AM_READ_PORT("IN0")
AM_RANGE(0x01, 0x01) AM_READ_PORT("IN1")
AM_RANGE(0x02, 0x02) AM_READ_PORT("IN2") AM_DEVWRITE("mb14241", mb14241_device, shift_count_w)
AM_RANGE(0x03, 0x03) AM_DEVREAD("mb14241", mb14241_device, shift_result_r) AM_WRITE(spcewars_sh_port_w)
AM_RANGE(0x04, 0x04) AM_DEVWRITE("mb14241", mb14241_device, shift_data_w)
AM_RANGE(0x05, 0x05) AM_WRITE(invadpt2_sh_port_2_w)
ADDRESS_MAP_END
static INPUT_PORTS_START( spcewars )
PORT_INCLUDE( sicv )
PORT_MODIFY("IN1")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_MODIFY("IN2")
PORT_DIPNAME( 0x01, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x01, "4" )
PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x00, "SW1:2" )
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:4")
PORT_DIPSETTING( 0x00, "1500" )
PORT_DIPSETTING( 0x08, "2000" )
INPUT_PORTS_END
static MACHINE_CONFIG_DERIVED_CLASS( spcewars, mw8080bw_root, _8080bw_state )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(spcewars_io_map)
MCFG_MACHINE_START_OVERRIDE(_8080bw_state,extra_8080bw)
/* add shifter */
MCFG_MB14241_ADD("mb14241")
/* sound hardware */
MCFG_FRAGMENT_ADD(invaders_samples_audio)
/* extra audio channel */
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
/* video hardware */
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(_8080bw_state, screen_update_invaders)
MACHINE_CONFIG_END
/*******************************************************/
/* */
/* Astro Sidam? */
/* */
/*******************************************************/
static ADDRESS_MAP_START( astropal_io_map, AS_IO, 8, _8080bw_state )
ADDRESS_MAP_GLOBAL_MASK(0x7)
AM_RANGE(0x00, 0x00) AM_MIRROR(0x04) AM_READ_PORT("IN0")
AM_RANGE(0x01, 0x01) AM_MIRROR(0x04) AM_READ_PORT("IN1")
AM_RANGE(0x03, 0x03) AM_MIRROR(0x04) AM_READ_PORT("IN3")
AM_RANGE(0x03, 0x03) AM_WRITE(invaders_audio_1_w)
AM_RANGE(0x05, 0x05) AM_WRITE(invaders_audio_2_w)
AM_RANGE(0x06, 0x06) AM_WRITE(watchdog_reset_w)
ADDRESS_MAP_END
static INPUT_PORTS_START( astropal )
PORT_START("IN0")
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) )
PORT_DIPSETTING( 0x00, "2" )
PORT_DIPSETTING( 0x01, "3" )
PORT_DIPSETTING( 0x02, "4" )
PORT_DIPSETTING( 0x03, "5" )
PORT_BIT( 0xfc, IP_ACTIVE_LOW, IPT_UNUSED ) /* never read */
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
/* PORT_START("IN2") - never read */
PORT_START("IN3")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 )
/* Dummy port for cocktail mode (not used) */
PORT_START(INVADERS_CAB_TYPE_PORT_TAG)
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
INPUT_PORTS_END
static MACHINE_CONFIG_DERIVED_CLASS( astropal, invaders, _8080bw_state )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(astropal_io_map)
MACHINE_CONFIG_END
/*******************************************************/
/* */
/* Cosmo */
/* */
/*******************************************************/
static ADDRESS_MAP_START( cosmo_map, AS_PROGRAM, 8, _8080bw_state )
AM_RANGE(0x0000, 0x1fff) AM_ROM
AM_RANGE(0x2000, 0x3fff) AM_RAM AM_SHARE("main_ram")
AM_RANGE(0x4000, 0x57ff) AM_ROM
AM_RANGE(0x5c00, 0x5fff) AM_RAM AM_SHARE("colorram")
ADDRESS_MAP_END
/* at least one of these MWA8_NOPs must be sound related */
static ADDRESS_MAP_START( cosmo_io_map, AS_IO, 8, _8080bw_state )
AM_RANGE(0x00, 0x00) AM_READ_PORT("IN0") AM_WRITENOP
AM_RANGE(0x01, 0x01) AM_READ_PORT("IN1") AM_WRITENOP
AM_RANGE(0x02, 0x02) AM_READ_PORT("IN2") AM_WRITENOP
AM_RANGE(0x03, 0x03) AM_WRITE(invadpt2_sh_port_1_w)
AM_RANGE(0x05, 0x05) AM_WRITE(cosmo_sh_port_2_w)
AM_RANGE(0x06, 0x06) AM_WRITE(watchdog_reset_w)
AM_RANGE(0x07, 0x07) AM_WRITENOP
ADDRESS_MAP_END
static INPUT_PORTS_START( cosmo )
PORT_INCLUDE( sicv )
PORT_MODIFY("IN1")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_MODIFY("IN2")
PORT_DIPNAME( 0x01, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x01, "5" )
PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x00, "SW1:2" )
PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x00, "SW1:3" )
PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x00, "SW1:4" )
PORT_DIPUNKNOWN_DIPLOC( 0x80, 0x80, "SW1:8" ) /* must be HIGH normally or the joystick won't work */
INPUT_PORTS_END
static MACHINE_CONFIG_DERIVED_CLASS( cosmo, mw8080bw_root, _8080bw_state )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(cosmo_map)
MCFG_CPU_IO_MAP(cosmo_io_map)
MCFG_MACHINE_START_OVERRIDE(_8080bw_state,extra_8080bw)
/* video hardware */
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(_8080bw_state, screen_update_cosmo)
/* sound hardware */
MCFG_FRAGMENT_ADD(invaders_samples_audio)
MACHINE_CONFIG_END
/*******************************************************/
/* */
/* bootleg "Super Earth Invasion" */
/* */
/*******************************************************/
static INPUT_PORTS_START( searthin )
PORT_INCLUDE( sicv )
PORT_MODIFY("IN1")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_MODIFY("IN2")
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x00, "2" )
PORT_DIPSETTING( 0x01, "3" )
PORT_DIPNAME( 0x02, 0x02, "Pence Coinage" ) PORT_DIPLOCATION("SW1:2")
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_DIPLOCATION("SW1:3") /* Pence Coin */
PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW1:4" ) /* Not bonus */
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x00, "2C/1C 50p/3C (+ Bonus Life)" )
PORT_DIPSETTING( 0x80, "1C/1C 50p/5C" )
INPUT_PORTS_END
/*******************************************************/
/* */
/* bootleg "Super Invaders (Zenitone-Microsec)" */
/* */
/*******************************************************/
static INPUT_PORTS_START( sinvzen )
PORT_INCLUDE( sicv )
PORT_MODIFY("IN2")
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
INPUT_PORTS_END
/*******************************************************/
/* */
/* bootleg "Space Attack II" */
/* */
/*******************************************************/
static INPUT_PORTS_START( spaceat2 )
PORT_INCLUDE( sicv )
PORT_MODIFY("IN2")
PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x00, "SW1:5" )
PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x00, "SW1:6" )
PORT_DIPUNKNOWN_DIPLOC( 0x40, 0x00, "SW1:7" )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
/* Dummy port for cocktail mode (not used) */
PORT_MODIFY(INVADERS_CAB_TYPE_PORT_TAG)
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
INPUT_PORTS_END
/*******************************************************/
/* */
/* bootleg "Space Combat", 1979 */
/* 8080A + 18MHz XTAL, SN76477, 10MHz XTAL */
/* 8*8116 2KB RAM(!), 8*1KB ROM, maybe some PROMs */
/* */
/* Preliminary emulation. PCB was working fine, but */
/* it's not certain that this is a good dump */
/* */
/* TODO: */
/* - dip settings/locs need confirming */
/* - it doesn't have a mb14241 video shifter? */
/* - using space invaders audio as placeholder until */
/* more is known about the sound hw */
/* - always in cocktail mode but flipscreen not found */
/* */
/*******************************************************/
static INPUT_PORTS_START( spacecom )
PORT_START("IN0") // 5-pos dipsw at ic79 (row F)
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x00, DEF_STR( Lives ) )
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x04, "5" )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) )
PORT_DIPSETTING( 0x00, "2500" ) // not confirmed
PORT_DIPSETTING( 0x08, "1500" )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(2)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(2)
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 )
PORT_SERVICE( 0x08, IP_ACTIVE_HIGH )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY
PORT_START("IN2")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
PORT_BIT( 0xfe, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // unused?
PORT_START(CABINET_PORT_TAG) /* Dummy port for cocktail mode */
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
static ADDRESS_MAP_START( spacecom_map, AS_PROGRAM, 8, _8080bw_state )
AM_RANGE(0x0000, 0x1fff) AM_ROM
AM_RANGE(0x2000, 0x3fff) AM_RAM AM_SHARE("main_ram") // other RAM not hooked up?
ADDRESS_MAP_END
static ADDRESS_MAP_START( spacecom_io_map, AS_IO, 8, _8080bw_state )
AM_RANGE(0x41, 0x41) AM_READ_PORT("IN0")
AM_RANGE(0x42, 0x42) AM_READ_PORT("IN1") AM_WRITE(invaders_audio_1_w)
AM_RANGE(0x44, 0x44) AM_READ_PORT("IN2") AM_WRITE(invaders_audio_2_w)
ADDRESS_MAP_END
MACHINE_CONFIG_START( spacecom, _8080bw_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8080A, XTAL_18MHz / 10) // divider guessed
// TODO: move irq handling away from mw8080.c, this game runs on custom hardware
MCFG_CPU_PROGRAM_MAP(spacecom_map)
MCFG_CPU_IO_MAP(spacecom_io_map)
MCFG_MACHINE_START_OVERRIDE(mw8080bw_state, mw8080bw)
MCFG_MACHINE_RESET_OVERRIDE(mw8080bw_state, mw8080bw)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
MCFG_SCREEN_SIZE(32*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
MCFG_SCREEN_UPDATE_DRIVER(_8080bw_state, screen_update_spacecom)
/* sound hardware */
MCFG_FRAGMENT_ADD(invaders_audio)
MACHINE_CONFIG_END
DRIVER_INIT_MEMBER(_8080bw_state, spacecom)
{
UINT8 *ROM = memregion("maincpu")->base();
// bad byte: should be push a at RST 10h
ROM[0x10] = 0xf5;
}
/*******************************************************/
/* */
/* Zenitone Microsec "Invaders Revenge" */
/* */
/*******************************************************/
READ8_MEMBER(_8080bw_state::invrvnge_02_r)
{
UINT8 data = ioport("IN2")->read();
if (m_flip_screen) return data;
return (data & 0x8f) | (ioport("IN1")->read() & 0x70);
}
static ADDRESS_MAP_START( invrvnge_io_map, AS_IO, 8, _8080bw_state )
AM_RANGE(0x00, 0x00) AM_READ_PORT("IN0")
AM_RANGE(0x01, 0x01) AM_READ_PORT("IN1")
AM_RANGE(0x02, 0x02) AM_READ(invrvnge_02_r) AM_DEVWRITE("mb14241", mb14241_device, shift_count_w)
AM_RANGE(0x03, 0x03) AM_DEVREAD("mb14241", mb14241_device, shift_result_r) AM_WRITE(invrvnge_sh_port_1_w)
AM_RANGE(0x04, 0x04) AM_DEVWRITE("mb14241", mb14241_device, shift_data_w)
AM_RANGE(0x05, 0x05) AM_WRITE(invrvnge_sh_port_2_w)
AM_RANGE(0x06, 0x06) AM_WRITE(watchdog_reset_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( invrvnge_sound_map, AS_PROGRAM, 8, _8080bw_state )
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x0000, 0xffff) AM_ROM // dummy prg map, TODO: decrypt ROM
ADDRESS_MAP_END
static INPUT_PORTS_START( invrvnge )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_DIPNAME( 0x06, 0x06, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:5,6")
PORT_DIPSETTING( 0x00, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x02, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x04, DEF_STR( Harder ) )
PORT_DIPSETTING( 0x06, DEF_STR( Hardest ) )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // must be low or game won't boot [code: 0x1a9-1af]
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_DIPNAME( 0x80, 0x80, "Fuel Destroyed by Comet" ) PORT_DIPLOCATION("SW1:7")
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x80, "6" )
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("IN2")
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2")
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x01, "4" )
PORT_DIPSETTING( 0x02, "5" )
PORT_DIPSETTING( 0x03, "6" )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_TILT )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:4")
PORT_DIPSETTING( 0x00, "1500" )
PORT_DIPSETTING( 0x08, "2000" )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(2)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(2)
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) ) // 1 play 10p, 2 play 20p, 6 play 50p
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) // 1 play 20p, 2 play 40p, 3 play 50p
/* Dummy port for cocktail mode */
INVADERS_CAB_TYPE_PORT
INPUT_PORTS_END
static MACHINE_CONFIG_DERIVED_CLASS( invrvnge, mw8080bw_root, _8080bw_state )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(invrvnge_io_map)
MCFG_CPU_ADD("audiocpu", M6808, XTAL_4MHz/2) // MC6808P
MCFG_CPU_PROGRAM_MAP(invrvnge_sound_map)
/* add shifter */
MCFG_MB14241_ADD("mb14241")
MCFG_MACHINE_START_OVERRIDE(_8080bw_state,extra_8080bw)
/* video hardware */
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(_8080bw_state, screen_update_invadpt2)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ay1", AY8910, XTAL_4MHz/2)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
MACHINE_CONFIG_END
/*******************************************************/
/* */
/* Taito "Space Laser" */
/* */
/*******************************************************/
static INPUT_PORTS_START( spclaser )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) /* This is not 2 Player ??? */
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
// TODO: figure out where dipswitch is read, it's not IN0 or IN2 in the current implementation.
// ROM disassembly doesn't show any dipswitch reads on portmapped I/O, maybe the manual is for a different ROM set? (that we don't have the dump for)
#if 0
// these are the settings according to Gameplan Intruder manual
PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2")
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x01, "4" )
PORT_DIPSETTING( 0x02, "5" )
PORT_DIPSETTING( 0x03, "6" )
PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW1:3" )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:4")
PORT_DIPSETTING( 0x08, "1000" )
PORT_DIPSETTING( 0x00, "1500" )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_DIPNAME( 0x80, 0x80, "Display Coinage" ) PORT_DIPLOCATION("SW:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
#endif
PORT_START("IN2")
PORT_DIPUNKNOWN_DIPLOC( 0x01, 0x00, "SW1:1" )
PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x00, "SW1:2" )
PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x00, "SW1:3" )
PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x00, "SW1:4" )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(2)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(2)
PORT_DIPNAME( 0x80, 0x00, DEF_STR(Coinage) ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x00, "1 Coin/1 Or 2 Players" )
PORT_DIPSETTING( 0x80, "1 Coin/1 Player 2 Coins/2 Players" ) /* Irrelevant, causes bugs */
/* Dummy port for cocktail mode (not used) */
PORT_START(CABINET_PORT_TAG)
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
INPUT_PORTS_END
/*******************************************************/
/* */
/* Taito "Galaxy Wars" */
/* */
/*******************************************************/
static INPUT_PORTS_START( galxwars )
PORT_INCLUDE( sicv )
PORT_MODIFY("IN0")
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* must be IP_ACTIVE_LOW for Universal Sets */
PORT_MODIFY("IN1")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_MODIFY("IN2")
PORT_DIPNAME( 0x03, 0x01, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2")
PORT_DIPSETTING( 0x00, "2" )
PORT_DIPSETTING( 0x01, "3" )
PORT_DIPSETTING( 0x02, "4" )
PORT_DIPSETTING( 0x03, "5" )
PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x00, "SW1:3" )
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:4")
PORT_DIPSETTING( 0x00, "3000" )
PORT_DIPSETTING( 0x08, "5000" )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
INPUT_PORTS_END