@@ -14,77 +14,77 @@ driver by Nicola Salmoria
14
14
This is the 052591 PMC code loaded at startup, it contains a RAM/VRAM filling program.
15
15
See https://github.com/furrtek/SiliconRE/tree/master/Konami/052591 for details
16
16
17
- 00: 5f 80 01 e0 08 Entry point, set OUT0 high
18
- 01: df 80 00 e0 0c r0 = 0
19
- 02: df 90 02 e0 0c r1 = 2
20
- 03: df a0 03 e0 0c r2 = 3
21
- 04: df b0 0f e0 0c r3 = f
22
- 05: df c0 ff bf 0c ExtAddr = 1fff, r4 = ffff
23
- 06: 5c 02 00 33 0c
24
- 07: 5f 80 04 80 0c Write 2 to RAM (1fff) m_bankctrl, select pmcram
17
+ 00: 5f 80 01 e0 08 Entry point, set OUT0 high
18
+ 01: df 80 00 e0 0c r0 = 0
19
+ 02: df 90 02 e0 0c r1 = 2
20
+ 03: df a0 03 e0 0c r2 = 3
21
+ 04: df b0 0f e0 0c r3 = f
22
+ 05: df c0 ff bf 0c ExtAddr = 1fff, r4 = ffff
23
+ 06: 5c 02 00 33 0c
24
+ 07: 5f 80 04 80 0c Write 2 to RAM (1fff) m_bankctrl, select pmcram
25
25
08: 5c 0e 00 2b 0c
26
- 09: df 70 00 cb 08 r7 = RAM(4)
27
- 0a: 5f 80 00 80 0c ExtAddr = 0
26
+ 09: df 70 00 cb 08 r7 = RAM(4)
27
+ 0a: 5f 80 00 80 0c ExtAddr = 0
28
28
0b: 5c 04 00 2b 0c
29
- 0c: df 60 00 cb 08 r6 = RAM(0) (commands 0, 1 and 30 are used)
30
- 0d: 5c 0c 1f e9 0c JP 1F if r6 == 0
31
- 0e: 4c 0c 2d e9 08 JP 2D if r6 == 1
29
+ 0c: df 60 00 cb 08 r6 = RAM(0) (commands 0, 1 and 30 are used)
30
+ 0d: 5c 0c 1f e9 0c JP 1F if r6 == 0
31
+ 0e: 4c 0c 2d e9 08 JP 2D if r6 == 1
32
32
33
33
Command anything other than 00 or 01: Set bank to r7, then clear 16 bytes starting from r5.w
34
- 0f: 5f 80 03 80 0c ExtAddr = 3
34
+ 0f: 5f 80 03 80 0c ExtAddr = 3
35
35
10: 5c 04 00 2b 0c
36
- 11: 5f 00 00 cb 00 Read MSB from RAM[3]
37
- 12: 5f 80 02 a0 0c ExtAddr = 2
38
- 13: df d0 00 c0 04 r5.w = RAM[3], RAM[2]
39
- 14: 01 3a 00 f3 0a acc = r5 + r3 = r5 + f
36
+ 11: 5f 00 00 cb 00 Read MSB from RAM[3]
37
+ 12: 5f 80 02 a0 0c ExtAddr = 2
38
+ 13: df d0 00 c0 04 r5.w = RAM[3], RAM[2]
39
+ 14: 01 3a 00 f3 0a acc = r5 + r3 = r5 + f
40
40
15: 5c 08 00 b3 0c
41
- 16: 5c 0e 00 13 0c Write 3 to RAM[1fff] m_bankctrl
41
+ 16: 5c 0e 00 13 0c Write 3 to RAM[1fff] m_bankctrl
42
42
17: 5f 80 00 a0 0c
43
- 18: 5c 00 00 13 0c Write r7 to RAM[0]
43
+ 18: 5c 00 00 13 0c Write r7 to RAM[0]
44
44
19: 5c 08 00 b3 0c
45
- 1a: 5c 00 00 13 0c Write 0 to RAM[1fff] m_bankctrl, select vram
45
+ 1a: 5c 00 00 13 0c Write 0 to RAM[1fff] m_bankctrl, select vram
46
46
1b: 84 5a 00 b3 0c
47
- 1c: 48 0a 5b d1 0c Write 0 to RAM[r5++] until r5 > acc (16 times)
48
- 1d: 5f 80 00 e0 08 Set OUT0 low
49
- 1e: 5f 00 1e fd 0c JP 1E, infinite loop
47
+ 1c: 48 0a 5b d1 0c Write 0 to RAM[r5++] until r5 > acc (16 times)
48
+ 1d: 5f 80 00 e0 08 Set OUT0 low
49
+ 1e: 5f 00 1e fd 0c JP 1E, infinite loop
50
50
51
51
Command is 00: Set bank to 0 and fill from 0 to 0x1fff with r2.b
52
52
1f: 5f 80 01 a0 0c
53
- 20: df 20 00 cb 08 r2 = RAM[1]
53
+ 20: df 20 00 cb 08 r2 = RAM[1]
54
54
21: 5c 08 00 b3 0c
55
- 22: 5f 80 03 00 0c Write 3 to RAM[1fff] m_bankctrl
55
+ 22: 5f 80 03 00 0c Write 3 to RAM[1fff] m_bankctrl
56
56
23: 5c 08 00 b3 0c
57
- 24: 5f 80 00 80 0c Write 3 to RAM[1fff] m_bankctrl
57
+ 24: 5f 80 00 80 0c Write 3 to RAM[1fff] m_bankctrl
58
58
25: 5c 00 00 33 0c
59
- 26: 5c 08 00 93 0c Write 0 to RAM[0]
60
- 27: 9f 91 ff cf 0e Write 0 to RAM[1fff] m_bankctrl, select vram, r1 = fff << 1 = 1ffe
59
+ 26: 5c 08 00 93 0c Write 0 to RAM[0]
60
+ 27: 9f 91 ff cf 0e Write 0 to RAM[1fff] m_bankctrl, select vram, r1 = fff << 1 = 1ffe
61
61
28: 5c 84 00 20 0c
62
- 29: 84 00 00 b3 0c ExtAddr = r0
63
- 2a: 49 10 69 d1 0c Write r2 to RAM[r0++] while r0 < r1
64
- 2b: 5f 80 00 e0 08 Set OUT0 low
65
- 2c: 5f 00 2c fd 0c JP 2C, infinite loop
62
+ 29: 84 00 00 b3 0c ExtAddr = r0
63
+ 2a: 49 10 69 d1 0c Write r2 to RAM[r0++] while r0 < r1
64
+ 2b: 5f 80 00 e0 08 Set OUT0 low
65
+ 2c: 5f 00 2c fd 0c JP 2C, infinite loop
66
66
67
67
Command is 01: Set banks to 1 and fill from 0 to 0x1fff with r2.b
68
68
2d: 5f 80 01 a0 0c
69
- 2e: df 20 00 cb 08 r2 = RAM(1)
69
+ 2e: df 20 00 cb 08 r2 = RAM(1)
70
70
2f: 5c 08 00 b3 0c
71
- 30: 5f 80 03 00 0c Write 3 to RAM[1fff] m_bankctrl
71
+ 30: 5f 80 03 00 0c Write 3 to RAM[1fff] m_bankctrl
72
72
31: 5c 00 00 b3 0c
73
- 32: 5f 80 01 00 0c Write 3 to RAM[0]
73
+ 32: 5f 80 01 00 0c Write 3 to RAM[0]
74
74
33: 5c 08 00 b3 0c
75
- 34: 5f 80 00 80 0c Write 1 to RAM[1fff] m_bankctrl
75
+ 34: 5f 80 00 80 0c Write 1 to RAM[1fff] m_bankctrl
76
76
35: 5c 00 00 33 0c
77
- 36: 5c 08 00 93 0c Write 0 to RAM[0]
78
- 37: 9f 91 ff cf 0e Write 0 to RAM[1fff] m_bankctrl, select vram, r1 = fff << 1 = 1ffe
77
+ 36: 5c 08 00 93 0c Write 0 to RAM[0]
78
+ 37: 9f 91 ff cf 0e Write 0 to RAM[1fff] m_bankctrl, select vram, r1 = fff << 1 = 1ffe
79
79
38: 5c 84 00 20 0c
80
80
39: 84 00 00 b3 0c
81
- 3a: 49 10 79 d1 0c Write r2 to RAM[r0++] while r0 < r1
82
- 3b: 5f 80 00 e0 08 Set OUT0 low
83
- 3c: 5f 00 3c fd 0c JP 3C, infinite loop
81
+ 3a: 49 10 79 d1 0c Write r2 to RAM[r0++] while r0 < r1
82
+ 3b: 5f 80 00 e0 08 Set OUT0 low
83
+ 3c: 5f 00 3c fd 0c JP 3C, infinite loop
84
84
85
- 3d: ff ff ff ff ff Garbage
86
- 3e: ff ff ff ff ff Garbage
87
- 3f: ff ff ff ff ff Garbage
85
+ 3d: ff ff ff ff ff Garbage
86
+ 3e: ff ff ff ff ff Garbage
87
+ 3f: ff ff ff ff ff Garbage
88
88
89
89
***************************************************************************/
90
90
@@ -102,6 +102,7 @@ Command is 01: Set banks to 1 and fill from 0 to 0x1fff with r2.b
102
102
#include " emupal.h"
103
103
#include " speaker.h"
104
104
#include " tilemap.h"
105
+
105
106
#include " multibyte.h"
106
107
107
108
@@ -131,7 +132,7 @@ class hexion_state : public driver_device
131
132
m_gfxdecode (*this , " gfxdecode" ),
132
133
m_palette (*this , " palette" ),
133
134
m_vram (*this , " vram%u" , 0U , 0x2000U , ENDIANNESS_LITTLE),
134
- m_pmcram (*this , " pmcram" , 0x800 , ENDIANNESS_LITTLE), // Might be an unused area of VRAM
135
+ m_pmcram (*this , " pmcram" , 0x800 , ENDIANNESS_LITTLE), // Might be an unused area of VRAM
135
136
m_rombank (*this , " rombank" ),
136
137
m_tilesrom (*this , " tiles" )
137
138
{ }
@@ -243,23 +244,27 @@ void hexion_state::bankswitch_w(uint8_t data)
243
244
m_rombank->set_entry (data & 0x0f );
244
245
245
246
// bit 6 triggers the 052591
246
- if (data & 0x40 )
247
+ if (BIT ( data, 6 ) )
247
248
{
248
- uint8_t command = m_pmcram[0 ];
249
+ const uint8_t command = m_pmcram[0 ];
249
250
if (command <= 1 )
250
251
{
251
252
memset (m_vram[command], m_pmcram[1 ], 0x2000 );
252
253
m_bg_tilemap[command]->mark_all_dirty ();
253
254
}
254
255
else
255
256
{
256
- uint8_t bank = m_pmcram[4 ] & 1 ;
257
- memset (m_vram[bank] + (get_u16le (&m_pmcram[2 ]) & 0x1fff ), 0 , 16 );
258
- m_bg_tilemap[bank]->mark_all_dirty ();
257
+ const uint8_t bank = m_pmcram[4 ] & 1 ;
258
+ const uint16_t offset = get_u16le (&m_pmcram[2 ]);
259
+ for (int i = 0 ; 16 > i; ++i)
260
+ m_vram[bank][(offset + i) & 0x1fff ] = 0 ;
261
+ for (int i = 0 ; 4 > i; ++i)
262
+ m_bg_tilemap[bank]->mark_tile_dirty (((offset >> 2 ) + i) & 0x07ff );
259
263
}
260
264
}
265
+
261
266
// bit 7 = PMC-BK
262
- m_pmcbank = (data & 0x80 ) >> 7 ;
267
+ m_pmcbank = BIT (data, 7 ) ;
263
268
264
269
// other bits unknown
265
270
if (data & 0x30 )
@@ -300,7 +305,7 @@ void hexion_state::bankedram_w(offs_t offset, uint8_t data)
300
305
{
301
306
LOGBANKEDRAM (" %s: bankedram_w offset %04x, data %02x, bankctrl = %02x\n " , m_maincpu->pc (), offset, data, m_bankctrl);
302
307
m_vram[m_rambank][offset] = data;
303
- m_bg_tilemap[m_rambank]->mark_tile_dirty (offset/ 4 );
308
+ m_bg_tilemap[m_rambank]->mark_tile_dirty (offset >> 2 );
304
309
}
305
310
else
306
311
LOGBANKEDRAM (" %04x pmc internal ram %04x = %02x\n " , m_maincpu->pc (), offset, data);
0 commit comments