40
40
#include " speaker.h"
41
41
42
42
#include " multibyte.h"
43
-
43
+ # include < algorithm >
44
44
45
45
namespace {
46
46
@@ -49,61 +49,58 @@ class spy_state : public driver_device
49
49
public:
50
50
spy_state (const machine_config &mconfig, device_type type, const char *tag) :
51
51
driver_device (mconfig, type, tag),
52
- m_rombank (*this , " rombank" ),
53
- m_ram (*this , " ram" ),
54
52
m_maincpu (*this , " maincpu" ),
55
53
m_audiocpu (*this , " audiocpu" ),
56
- m_k007232_1 (*this , " k007232_1" ),
57
- m_k007232_2 (*this , " k007232_2" ),
54
+ m_k007232 (*this , " k007232_%u" , 1U ),
58
55
m_k052109 (*this , " k052109" ),
59
56
m_k051960 (*this , " k051960" ),
60
- m_palette (*this , " palette" )
57
+ m_palette (*this , " palette" ),
58
+ m_pmcram (*this , " pmcram" ),
59
+ m_rombank (*this , " rombank" ),
60
+ m_ram_view (*this , " ram_view" )
61
61
{ }
62
62
63
63
void spy (machine_config &config);
64
64
65
- private:
66
- /* memory pointers */
67
- required_memory_bank m_rombank;
68
- required_shared_ptr<uint8_t > m_ram;
69
- uint8_t m_pmcram[0x800 ]{};
70
- std::vector<uint8_t > m_paletteram{};
71
-
72
- /* misc */
73
- int m_rambank = 0 ;
74
- int m_pmcbank = 0 ;
75
- uint8_t m_pmcpc = 0 ;
76
- bool m_video_enable = false ;
77
- int m_old_3f90 = 0 ;
65
+ protected:
66
+ virtual void machine_start () override ATTR_COLD;
67
+ virtual void machine_reset () override ATTR_COLD;
78
68
69
+ private:
79
70
/* devices */
80
71
required_device<cpu_device> m_maincpu;
81
72
required_device<cpu_device> m_audiocpu;
82
- required_device<k007232_device> m_k007232_1;
83
- required_device<k007232_device> m_k007232_2;
73
+ required_device_array<k007232_device, 2 > m_k007232;
84
74
required_device<k052109_device> m_k052109;
85
75
required_device<k051960_device> m_k051960;
86
76
required_device<palette_device> m_palette;
87
77
88
- uint8_t spy_bankedram1_r (offs_t offset);
89
- void spy_bankedram1_w (offs_t offset, uint8_t data);
78
+ /* memory pointers */
79
+ required_shared_ptr<uint8_t > m_pmcram;
80
+ required_memory_bank m_rombank;
81
+ memory_view m_ram_view;
82
+
83
+ /* misc */
84
+ uint8_t m_rambank = 0 ;
85
+ bool m_pmcbank = false ;
86
+ uint8_t m_pmcpc = 0 ;
87
+ bool m_video_enable = false ;
88
+ int32_t m_old_3f90 = -1 ;
89
+
90
90
void bankswitch_w (uint8_t data);
91
91
void spy_3f90_w (uint8_t data);
92
- void spy_sh_irqtrigger_w (uint8_t data);
92
+ void sh_irqtrigger_w (uint8_t data);
93
93
void sound_bank_w (uint8_t data);
94
94
uint8_t k052109_051960_r (offs_t offset);
95
95
void k052109_051960_w (offs_t offset, uint8_t data);
96
- virtual void machine_start () override ATTR_COLD;
97
- virtual void machine_reset () override ATTR_COLD;
98
96
uint32_t screen_update_spy (screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
99
97
void pmc_run ();
100
- void volume_callback0 (uint8_t data);
101
- void volume_callback1 (uint8_t data);
98
+ template <unsigned Chip> void volume_callback (uint8_t data);
102
99
K052109_CB_MEMBER (tile_callback);
103
100
K051960_CB_MEMBER (sprite_callback);
104
101
105
- void spy_map (address_map &map) ATTR_COLD;
106
- void spy_sound_map (address_map &map) ATTR_COLD;
102
+ void main_map (address_map &map) ATTR_COLD;
103
+ void sound_map (address_map &map) ATTR_COLD;
107
104
};
108
105
109
106
@@ -168,51 +165,6 @@ uint32_t spy_state::screen_update_spy(screen_device &screen, bitmap_ind16 &bitma
168
165
return 0 ;
169
166
}
170
167
171
- uint8_t spy_state::spy_bankedram1_r (offs_t offset)
172
- {
173
- if (m_rambank & 1 )
174
- {
175
- return m_paletteram[offset];
176
- }
177
- else if (m_rambank & 2 )
178
- {
179
- if (m_pmcbank)
180
- {
181
- // logerror("%04x read pmcram %04x\n",m_maincpu->pc(), offset);
182
- return m_pmcram[offset];
183
- }
184
- else
185
- {
186
- return 0 ; // PMC internal RAM can't be read back
187
- }
188
- }
189
- else
190
- return m_ram[offset];
191
- }
192
-
193
- void spy_state::spy_bankedram1_w (offs_t offset, uint8_t data)
194
- {
195
- if (m_rambank & 1 )
196
- {
197
- m_palette->write8 (offset,data);
198
- }
199
- else if (m_rambank & 2 )
200
- {
201
- if (m_pmcbank)
202
- {
203
- // logerror("%04x pmcram %04x = %02x\n", m_maincpu->pc(), offset, data);
204
- m_pmcram[offset] = data;
205
- }
206
- else
207
- {
208
- // Set initial PMC PC
209
- m_pmcpc = data & 0x3f ;
210
- }
211
- }
212
- else
213
- m_ram[offset] = data;
214
- }
215
-
216
168
/*
217
169
This is the 052591 PMC code loaded at startup, it contains both projection and collision check programs.
218
170
See https://github.com/furrtek/SiliconRE/tree/master/Konami/052591 for details
@@ -292,12 +244,12 @@ Collision check routine:
292
244
void spy_state::bankswitch_w (uint8_t data)
293
245
{
294
246
/* bit 0 = RAM bank */
295
- if (( data & 1 ) == 0 )
247
+ if (BIT (~ data, 0 ) )
296
248
popmessage (" bankswitch RAM bank 0" );
297
249
298
250
/* bit 1-4 = ROM bank */
299
251
int bank;
300
- if (data & 0x10 )
252
+ if (BIT ( data, 4 ) )
301
253
bank = 8 + ((data & 0x06 ) >> 1 );
302
254
else
303
255
bank = (data & 0x0e ) >> 1 ;
@@ -314,10 +266,8 @@ void spy_state::pmc_run()
314
266
{
315
267
// Projection program
316
268
// Basically divides a list of 16-bit words by a constant, results are 8.8 fixed point
317
- uint16_t loopend, nearplane;
318
-
319
- loopend = get_u16be (&m_pmcram[0 ]);
320
- nearplane = get_u16be (&m_pmcram[2 ]);
269
+ uint16_t loopend = get_u16be (&m_pmcram[0 ]);
270
+ uint16_t nearplane = get_u16be (&m_pmcram[2 ]);
321
271
322
272
// fail safe
323
273
if (loopend > MAX_SPRITES)
@@ -430,23 +380,27 @@ void spy_state::spy_3f90_w(uint8_t data)
430
380
********************************************************************/
431
381
432
382
/* bits 0/1 = coin counters */
433
- machine ().bookkeeping ().coin_counter_w (0 , data & 0x01 );
434
- machine ().bookkeeping ().coin_counter_w (1 , data & 0x02 );
383
+ machine ().bookkeeping ().coin_counter_w (0 , BIT ( data, 0 ) );
384
+ machine ().bookkeeping ().coin_counter_w (1 , BIT ( data, 1 ) );
435
385
436
386
/* bit 2 = enable char ROM reading through the video RAM */
437
- m_k052109->set_rmrd_line ((data & 0x04 ) ? ASSERT_LINE : CLEAR_LINE );
387
+ m_k052109->set_rmrd_line (BIT (data, 2 ) );
438
388
439
389
/* bit 3 = disable video */
440
- m_video_enable = !( data & 0x08 );
390
+ m_video_enable = BIT (~ data, 3 );
441
391
442
392
/* bit 4 = read RAM at 0000 (if set) else read color palette RAM */
443
393
/* bit 5 = PMCBK */
444
394
m_rambank = (data & 0x30 ) >> 4 ;
445
395
/* bit 7 = PMC-BK */
446
- m_pmcbank = (data & 0x80 ) >> 7 ;
396
+ m_pmcbank = BIT (data, 7 );
397
+ if (m_rambank == 0 )
398
+ m_ram_view.disable ();
399
+ else
400
+ m_ram_view.select (BIT (m_rambank, 0 ) ? 0 : (m_pmcbank ? 2 : 1 ));
447
401
448
402
/* bit 6 = PMC-START */
449
- if ((data & 0x40 ) && !( m_old_3f90 & 0x40 ))
403
+ if (BIT (data, 6 ) && BIT (~ m_old_3f90, 6 ))
450
404
{
451
405
pmc_run ();
452
406
m_maincpu->set_input_line (M6809_FIRQ_LINE, HOLD_LINE);
@@ -456,15 +410,15 @@ void spy_state::spy_3f90_w(uint8_t data)
456
410
}
457
411
458
412
459
- void spy_state::spy_sh_irqtrigger_w (uint8_t data)
413
+ void spy_state::sh_irqtrigger_w (uint8_t data)
460
414
{
461
415
m_audiocpu->set_input_line_and_vector (0 , HOLD_LINE, 0xff ); // Z80
462
416
}
463
417
464
418
void spy_state::sound_bank_w (uint8_t data)
465
419
{
466
- m_k007232_1 ->set_bank (BIT (data, 0 , 2 ), BIT (data, 2 , 2 ));
467
- m_k007232_2 ->set_bank (BIT (data, 4 , 2 ), BIT (data, 6 , 2 ));
420
+ m_k007232[ 0 ] ->set_bank (BIT (data, 0 , 2 ), BIT (data, 2 , 2 ));
421
+ m_k007232[ 1 ] ->set_bank (BIT (data, 4 , 2 ), BIT (data, 6 , 2 ));
468
422
}
469
423
470
424
@@ -493,32 +447,38 @@ void spy_state::k052109_051960_w(offs_t offset, uint8_t data)
493
447
m_k051960->k051960_w (offset - 0x3c00 , data);
494
448
}
495
449
496
- void spy_state::spy_map (address_map &map)
450
+ void spy_state::main_map (address_map &map)
497
451
{
498
- map (0x0000 , 0x07ff ).rw (FUNC (spy_state::spy_bankedram1_r), FUNC (spy_state::spy_bankedram1_w)).share (" ram" );
499
- map (0x0800 , 0x1aff ).ram ();
452
+ map (0x0000 , 0x1aff ).ram ();
453
+ map (0x0000 , 0x07ff ).view (m_ram_view);
454
+ m_ram_view[0 ](0x0000 , 0x07ff ).ram ().w (m_palette, FUNC (palette_device::write8)).share (" palette" );
455
+ // PMC internal RAM can't be read back
456
+ m_ram_view[1 ](0x0000 , 0x07ff ).lrw8 (NAME ([]() { return 0 ; }), NAME ([this ](uint8_t data) { m_pmcpc = data & 0x3f ; }));
457
+ m_ram_view[2 ](0x0000 , 0x07ff ).ram ().share (m_pmcram);
500
458
map (0x2000 , 0x5fff ).rw (FUNC (spy_state::k052109_051960_r), FUNC (spy_state::k052109_051960_w));
501
459
map (0x3f80 , 0x3f80 ).w (FUNC (spy_state::bankswitch_w));
502
460
map (0x3f90 , 0x3f90 ).w (FUNC (spy_state::spy_3f90_w));
503
461
map (0x3fa0 , 0x3fa0 ).w (" watchdog" , FUNC (watchdog_timer_device::reset_w));
504
462
map (0x3fb0 , 0x3fb0 ).w (" soundlatch" , FUNC (generic_latch_8_device::write ));
505
- map (0x3fc0 , 0x3fc0 ).w (FUNC (spy_state::spy_sh_irqtrigger_w ));
463
+ map (0x3fc0 , 0x3fc0 ).w (FUNC (spy_state::sh_irqtrigger_w ));
506
464
map (0x3fd0 , 0x3fd0 ).portr (" SYSTEM" );
507
465
map (0x3fd1 , 0x3fd1 ).portr (" P1" );
508
466
map (0x3fd2 , 0x3fd2 ).portr (" P2" );
509
467
map (0x3fd3 , 0x3fd3 ).portr (" DSW1" );
510
468
map (0x3fe0 , 0x3fe0 ).portr (" DSW2" );
469
+ // map(0x7c00, 0x7c00) writes 0x12, unknown usage
470
+ // map(0x7f80, 0x7f80) writes 0x01, unknown usage
511
471
map (0x6000 , 0x7fff ).bankr (m_rombank);
512
472
map (0x8000 , 0xffff ).rom ();
513
473
}
514
474
515
- void spy_state::spy_sound_map (address_map &map)
475
+ void spy_state::sound_map (address_map &map)
516
476
{
517
477
map (0x0000 , 0x7fff ).rom ();
518
478
map (0x8000 , 0x87ff ).ram ();
519
479
map (0x9000 , 0x9000 ).w (FUNC (spy_state::sound_bank_w));
520
- map (0xa000 , 0xa00d ).rw (m_k007232_1 , FUNC (k007232_device::read ), FUNC (k007232_device::write ));
521
- map (0xb000 , 0xb00d ).rw (m_k007232_2 , FUNC (k007232_device::read ), FUNC (k007232_device::write ));
480
+ map (0xa000 , 0xa00d ).rw (m_k007232[ 0 ] , FUNC (k007232_device::read ), FUNC (k007232_device::write ));
481
+ map (0xb000 , 0xb00d ).rw (m_k007232[ 1 ] , FUNC (k007232_device::read ), FUNC (k007232_device::write ));
522
482
map (0xc000 , 0xc001 ).rw (" ymsnd" , FUNC (ym3812_device::read ), FUNC (ym3812_device::write ));
523
483
map (0xd000 , 0xd000 ).r (" soundlatch" , FUNC (generic_latch_8_device::read ));
524
484
}
@@ -572,17 +532,11 @@ static INPUT_PORTS_START( spy )
572
532
INPUT_PORTS_END
573
533
574
534
575
-
576
- void spy_state::volume_callback0(uint8_t data)
577
- {
578
- m_k007232_1->set_volume (0 , (data >> 4 ) * 0x11 , 0 );
579
- m_k007232_1->set_volume (1 , 0 , (data & 0x0f ) * 0x11 );
580
- }
581
-
582
- void spy_state::volume_callback1 (uint8_t data)
535
+ template <unsigned Chip>
536
+ void spy_state::volume_callback(uint8_t data)
583
537
{
584
- m_k007232_2 ->set_volume (0 , (data >> 4 ) * 0x11 , 0 );
585
- m_k007232_2 ->set_volume (1 , 0 , (data & 0x0f ) * 0x11 );
538
+ m_k007232[Chip] ->set_volume (0 , (data >> 4 ) * 0x11 , 0 );
539
+ m_k007232[Chip] ->set_volume (1 , 0 , (data & 0x0f ) * 0x11 );
586
540
}
587
541
588
542
@@ -592,37 +546,33 @@ void spy_state::machine_start()
592
546
593
547
m_rombank->configure_entries (0 , 12 , &ROM[0x10000 ], 0x2000 );
594
548
595
- m_paletteram.resize (0x800 );
596
- m_palette->basemem ().set (m_paletteram, ENDIANNESS_BIG, 2 );
597
-
598
- memset (m_pmcram, 0 , sizeof (m_pmcram));
549
+ std::fill_n (&m_pmcram[0 ], m_pmcram.length (), 0 );
599
550
600
- save_item (NAME (m_paletteram));
601
551
save_item (NAME (m_rambank));
602
552
save_item (NAME (m_pmcbank));
603
553
save_item (NAME (m_pmcpc));
604
554
save_item (NAME (m_video_enable));
605
555
save_item (NAME (m_old_3f90));
606
- save_item (NAME (m_pmcram));
607
556
}
608
557
609
558
void spy_state::machine_reset ()
610
559
{
611
560
m_rambank = 0 ;
612
- m_pmcbank = 0 ;
561
+ m_pmcbank = false ;
613
562
m_pmcpc = 0 ;
614
563
m_video_enable = false ;
615
564
m_old_3f90 = -1 ;
565
+ m_ram_view.disable ();
616
566
}
617
567
618
568
void spy_state::spy (machine_config &config)
619
569
{
620
570
/* basic machine hardware */
621
571
MC6809E (config, m_maincpu, XTAL (24'000'000 ) / 8 ); // 3 MHz? (divided by 051961)
622
- m_maincpu->set_addrmap (AS_PROGRAM, &spy_state::spy_map );
572
+ m_maincpu->set_addrmap (AS_PROGRAM, &spy_state::main_map );
623
573
624
574
Z80 (config, m_audiocpu, XTAL (3'579'545 ));
625
- m_audiocpu->set_addrmap (AS_PROGRAM, &spy_state::spy_sound_map ); /* nmi by the sound chip */
575
+ m_audiocpu->set_addrmap (AS_PROGRAM, &spy_state::sound_map ); /* nmi by the sound chip */
626
576
627
577
WATCHDOG_TIMER (config, " watchdog" );
628
578
@@ -658,15 +608,13 @@ void spy_state::spy(machine_config &config)
658
608
ymsnd.irq_handler ().set_inputline (m_audiocpu, INPUT_LINE_NMI);
659
609
ymsnd.add_route (ALL_OUTPUTS, " mono" , 1.0 );
660
610
661
- K007232 (config, m_k007232_1, 3579545 );
662
- m_k007232_1->port_write ().set (FUNC (spy_state::volume_callback0));
663
- m_k007232_1->add_route (0 , " mono" , 0.20 );
664
- m_k007232_1->add_route (1 , " mono" , 0.20 );
611
+ K007232 (config, m_k007232[0 ], 3579545 );
612
+ m_k007232[0 ]->port_write ().set (FUNC (spy_state::volume_callback<0 >));
613
+ m_k007232[0 ]->add_route (ALL_OUTPUTS, " mono" , 0.20 );
665
614
666
- K007232 (config, m_k007232_2, 3579545 );
667
- m_k007232_2->port_write ().set (FUNC (spy_state::volume_callback1));
668
- m_k007232_2->add_route (0 , " mono" , 0.20 );
669
- m_k007232_2->add_route (1 , " mono" , 0.20 );
615
+ K007232 (config, m_k007232[1 ], 3579545 );
616
+ m_k007232[1 ]->port_write ().set (FUNC (spy_state::volume_callback<1 >));
617
+ m_k007232[1 ]->add_route (ALL_OUTPUTS, " mono" , 0.20 );
670
618
}
671
619
672
620
@@ -677,12 +625,12 @@ void spy_state::spy(machine_config &config)
677
625
***************************************************************************/
678
626
679
627
ROM_START ( spy )
680
- ROM_REGION ( 0x28000 , " maincpu" , 0 ) /* code + banked roms + space for banked ram */
628
+ ROM_REGION ( 0x28000 , " maincpu" , ROMREGION_ERASE00 ) /* code + banked roms + space for banked ram */
681
629
ROM_LOAD ( " 857n03.bin" , 0x10000 , 0x10000 , CRC(97993b38) SHA1(0afd561bc85fcbfe30f2d16807424ceec7188ce7) )
682
630
ROM_LOAD ( " 857n02.bin" , 0x20000 , 0x08000 , CRC(31a97efe) SHA1(6c9ec3954e4d16634bf95835b8b404d3a6ef6e24) )
683
631
ROM_CONTINUE ( 0x08000 , 0x08000 )
684
632
685
- ROM_REGION ( 0x10000 , " audiocpu" , 0 ) /* Z80 code */
633
+ ROM_REGION ( 0x8000 , " audiocpu" , 0 ) /* Z80 code */
686
634
ROM_LOAD ( " 857d01.bin" , 0x0000 , 0x8000 , CRC(aad4210f) SHA1(bb40b8673939b5ce51012606da86b4dcbfc52a57) )
687
635
688
636
ROM_REGION ( 0x080000 , " k052109" , 0 ) /* tiles */
@@ -704,12 +652,12 @@ ROM_START( spy )
704
652
ROM_END
705
653
706
654
ROM_START ( spyu )
707
- ROM_REGION ( 0x28000 , " maincpu" , 0 ) /* code + banked roms + space for banked ram */
655
+ ROM_REGION ( 0x28000 , " maincpu" , ROMREGION_ERASE00 ) /* code + banked roms + space for banked ram */
708
656
ROM_LOAD ( " 857m03.bin" , 0x10000 , 0x10000 , CRC(3bd87fa4) SHA1(257371ef31c8adcdc04f46e989b7a2f3531c2ab1) )
709
657
ROM_LOAD ( " 857m02.bin" , 0x20000 , 0x08000 , CRC(306cc659) SHA1(91d150b8d320bf19c12bc46103ffdffacf4387c3) )
710
658
ROM_CONTINUE ( 0x08000 , 0x08000 )
711
659
712
- ROM_REGION ( 0x10000 , " audiocpu" , 0 ) /* Z80 code */
660
+ ROM_REGION ( 0x8000 , " audiocpu" , 0 ) /* Z80 code */
713
661
ROM_LOAD ( " 857d01.bin" , 0x0000 , 0x8000 , CRC(aad4210f) SHA1(bb40b8673939b5ce51012606da86b4dcbfc52a57) )
714
662
715
663
ROM_REGION ( 0x080000 , " k052109" , 0 ) /* tiles */
0 commit comments