Skip to content

Commit 13d5eed

Browse files
authored
konami/spy.cpp: Cleaned up code: (#13311)
* Use a memory view for the RAM overlay. * Reduced the sound CPU ROM region size to match the area mapped in the CPU address space. * Added comments about unknown writes in address map.
1 parent 9d21990 commit 13d5eed

File tree

1 file changed

+76
-128
lines changed

1 file changed

+76
-128
lines changed

src/mame/konami/spy.cpp

+76-128
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
#include "speaker.h"
4141

4242
#include "multibyte.h"
43-
43+
#include <algorithm>
4444

4545
namespace {
4646

@@ -49,61 +49,58 @@ class spy_state : public driver_device
4949
public:
5050
spy_state(const machine_config &mconfig, device_type type, const char *tag) :
5151
driver_device(mconfig, type, tag),
52-
m_rombank(*this, "rombank"),
53-
m_ram(*this, "ram"),
5452
m_maincpu(*this, "maincpu"),
5553
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),
5855
m_k052109(*this, "k052109"),
5956
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")
6161
{ }
6262

6363
void spy(machine_config &config);
6464

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;
7868

69+
private:
7970
/* devices */
8071
required_device<cpu_device> m_maincpu;
8172
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;
8474
required_device<k052109_device> m_k052109;
8575
required_device<k051960_device> m_k051960;
8676
required_device<palette_device> m_palette;
8777

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+
9090
void bankswitch_w(uint8_t data);
9191
void spy_3f90_w(uint8_t data);
92-
void spy_sh_irqtrigger_w(uint8_t data);
92+
void sh_irqtrigger_w(uint8_t data);
9393
void sound_bank_w(uint8_t data);
9494
uint8_t k052109_051960_r(offs_t offset);
9595
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;
9896
uint32_t screen_update_spy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
9997
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);
10299
K052109_CB_MEMBER(tile_callback);
103100
K051960_CB_MEMBER(sprite_callback);
104101

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;
107104
};
108105

109106

@@ -168,51 +165,6 @@ uint32_t spy_state::screen_update_spy(screen_device &screen, bitmap_ind16 &bitma
168165
return 0;
169166
}
170167

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-
216168
/*
217169
This is the 052591 PMC code loaded at startup, it contains both projection and collision check programs.
218170
See https://github.com/furrtek/SiliconRE/tree/master/Konami/052591 for details
@@ -292,12 +244,12 @@ Collision check routine:
292244
void spy_state::bankswitch_w(uint8_t data)
293245
{
294246
/* bit 0 = RAM bank */
295-
if ((data & 1) == 0)
247+
if (BIT(~data, 0))
296248
popmessage("bankswitch RAM bank 0");
297249

298250
/* bit 1-4 = ROM bank */
299251
int bank;
300-
if (data & 0x10)
252+
if (BIT(data, 4))
301253
bank = 8 + ((data & 0x06) >> 1);
302254
else
303255
bank = (data & 0x0e) >> 1;
@@ -314,10 +266,8 @@ void spy_state::pmc_run()
314266
{
315267
// Projection program
316268
// 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]);
321271

322272
// fail safe
323273
if (loopend > MAX_SPRITES)
@@ -430,23 +380,27 @@ void spy_state::spy_3f90_w(uint8_t data)
430380
********************************************************************/
431381

432382
/* 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));
435385

436386
/* 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));
438388

439389
/* bit 3 = disable video */
440-
m_video_enable = !(data & 0x08);
390+
m_video_enable = BIT(~data, 3);
441391

442392
/* bit 4 = read RAM at 0000 (if set) else read color palette RAM */
443393
/* bit 5 = PMCBK */
444394
m_rambank = (data & 0x30) >> 4;
445395
/* 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));
447401

448402
/* bit 6 = PMC-START */
449-
if ((data & 0x40) && !(m_old_3f90 & 0x40))
403+
if (BIT(data, 6) && BIT(~m_old_3f90, 6))
450404
{
451405
pmc_run();
452406
m_maincpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE);
@@ -456,15 +410,15 @@ void spy_state::spy_3f90_w(uint8_t data)
456410
}
457411

458412

459-
void spy_state::spy_sh_irqtrigger_w(uint8_t data)
413+
void spy_state::sh_irqtrigger_w(uint8_t data)
460414
{
461415
m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // Z80
462416
}
463417

464418
void spy_state::sound_bank_w(uint8_t data)
465419
{
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));
468422
}
469423

470424

@@ -493,32 +447,38 @@ void spy_state::k052109_051960_w(offs_t offset, uint8_t data)
493447
m_k051960->k051960_w(offset - 0x3c00, data);
494448
}
495449

496-
void spy_state::spy_map(address_map &map)
450+
void spy_state::main_map(address_map &map)
497451
{
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);
500458
map(0x2000, 0x5fff).rw(FUNC(spy_state::k052109_051960_r), FUNC(spy_state::k052109_051960_w));
501459
map(0x3f80, 0x3f80).w(FUNC(spy_state::bankswitch_w));
502460
map(0x3f90, 0x3f90).w(FUNC(spy_state::spy_3f90_w));
503461
map(0x3fa0, 0x3fa0).w("watchdog", FUNC(watchdog_timer_device::reset_w));
504462
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));
506464
map(0x3fd0, 0x3fd0).portr("SYSTEM");
507465
map(0x3fd1, 0x3fd1).portr("P1");
508466
map(0x3fd2, 0x3fd2).portr("P2");
509467
map(0x3fd3, 0x3fd3).portr("DSW1");
510468
map(0x3fe0, 0x3fe0).portr("DSW2");
469+
//map(0x7c00, 0x7c00) writes 0x12, unknown usage
470+
//map(0x7f80, 0x7f80) writes 0x01, unknown usage
511471
map(0x6000, 0x7fff).bankr(m_rombank);
512472
map(0x8000, 0xffff).rom();
513473
}
514474

515-
void spy_state::spy_sound_map(address_map &map)
475+
void spy_state::sound_map(address_map &map)
516476
{
517477
map(0x0000, 0x7fff).rom();
518478
map(0x8000, 0x87ff).ram();
519479
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));
522482
map(0xc000, 0xc001).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
523483
map(0xd000, 0xd000).r("soundlatch", FUNC(generic_latch_8_device::read));
524484
}
@@ -572,17 +532,11 @@ static INPUT_PORTS_START( spy )
572532
INPUT_PORTS_END
573533

574534

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)
583537
{
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);
586540
}
587541

588542

@@ -592,37 +546,33 @@ void spy_state::machine_start()
592546

593547
m_rombank->configure_entries(0, 12, &ROM[0x10000], 0x2000);
594548

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);
599550

600-
save_item(NAME(m_paletteram));
601551
save_item(NAME(m_rambank));
602552
save_item(NAME(m_pmcbank));
603553
save_item(NAME(m_pmcpc));
604554
save_item(NAME(m_video_enable));
605555
save_item(NAME(m_old_3f90));
606-
save_item(NAME(m_pmcram));
607556
}
608557

609558
void spy_state::machine_reset()
610559
{
611560
m_rambank = 0;
612-
m_pmcbank = 0;
561+
m_pmcbank = false;
613562
m_pmcpc = 0;
614563
m_video_enable = false;
615564
m_old_3f90 = -1;
565+
m_ram_view.disable();
616566
}
617567

618568
void spy_state::spy(machine_config &config)
619569
{
620570
/* basic machine hardware */
621571
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);
623573

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

627577
WATCHDOG_TIMER(config, "watchdog");
628578

@@ -658,15 +608,13 @@ void spy_state::spy(machine_config &config)
658608
ymsnd.irq_handler().set_inputline(m_audiocpu, INPUT_LINE_NMI);
659609
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
660610

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);
665614

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);
670618
}
671619

672620

@@ -677,12 +625,12 @@ void spy_state::spy(machine_config &config)
677625
***************************************************************************/
678626

679627
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 */
681629
ROM_LOAD( "857n03.bin", 0x10000, 0x10000, CRC(97993b38) SHA1(0afd561bc85fcbfe30f2d16807424ceec7188ce7) )
682630
ROM_LOAD( "857n02.bin", 0x20000, 0x08000, CRC(31a97efe) SHA1(6c9ec3954e4d16634bf95835b8b404d3a6ef6e24) )
683631
ROM_CONTINUE( 0x08000, 0x08000 )
684632

685-
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code */
633+
ROM_REGION( 0x8000, "audiocpu", 0 ) /* Z80 code */
686634
ROM_LOAD( "857d01.bin", 0x0000, 0x8000, CRC(aad4210f) SHA1(bb40b8673939b5ce51012606da86b4dcbfc52a57) )
687635

688636
ROM_REGION( 0x080000, "k052109", 0 ) /* tiles */
@@ -704,12 +652,12 @@ ROM_START( spy )
704652
ROM_END
705653

706654
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 */
708656
ROM_LOAD( "857m03.bin", 0x10000, 0x10000, CRC(3bd87fa4) SHA1(257371ef31c8adcdc04f46e989b7a2f3531c2ab1) )
709657
ROM_LOAD( "857m02.bin", 0x20000, 0x08000, CRC(306cc659) SHA1(91d150b8d320bf19c12bc46103ffdffacf4387c3) )
710658
ROM_CONTINUE( 0x08000, 0x08000 )
711659

712-
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code */
660+
ROM_REGION( 0x8000, "audiocpu", 0 ) /* Z80 code */
713661
ROM_LOAD( "857d01.bin", 0x0000, 0x8000, CRC(aad4210f) SHA1(bb40b8673939b5ce51012606da86b4dcbfc52a57) )
714662

715663
ROM_REGION( 0x080000, "k052109", 0 ) /* tiles */

0 commit comments

Comments
 (0)