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
|
// license:BSD-3-Clause
// copyright-holders:David Haywood
#ifndef MAME_INCLUDES_PGM2_H
#define MAME_INCLUDES_PGM2_H
#pragma once
#include "cpu/arm7/arm7.h"
#include "cpu/arm7/arm7core.h"
#include "sound/ymz770.h"
#include "machine/igs036crypt.h"
#include "screen.h"
#include "speaker.h"
#include "machine/nvram.h"
#include "machine/timer.h"
#include "machine/atmel_arm_aic.h"
#include "machine/pgm2_memcard.h"
#include "emupal.h"
#include "tilemap.h"
struct kov3_module_key
{
u8 key[8];
u8 sum[8];
u32 addr_xor; // 22bit
u16 data_xor;
};
class pgm2_state : public driver_device
{
public:
pgm2_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_screen(*this, "screen"),
m_lineram(*this, "lineram"),
m_sp_zoom(*this, "sp_zoom"),
m_mainram(*this, "mainram"),
m_romboard_ram(*this, "romboard_ram"),
m_fg_videoram(*this, "fg_videoram"),
m_bg_videoram(*this, "bg_videoram"),
m_sp_videoram(*this, "sp_videoram"),
m_bgscroll(*this, "bgscroll"),
m_fgscroll(*this, "fgscroll"),
m_vidmode(*this, "vidmode"),
m_gfxdecode2(*this, "gfxdecode2"),
m_gfxdecode3(*this, "gfxdecode3"),
m_arm_aic(*this, "arm_aic"),
m_sprites_mask(*this, "sprites_mask"),
m_sprites_colour(*this, "sprites_colour"),
m_sp_palette(*this, "sp_palette"),
m_bg_palette(*this, "bg_palette"),
m_tx_palette(*this, "tx_palette"),
m_mcu_timer(*this, "mcu_timer"),
m_memcard(*this, "memcard_p%u", 1U),
m_mainrom(*this, "mainrom")
{ }
void init_kov2nl();
void init_orleg2();
void init_ddpdojt();
void init_kov3();
void init_kov3_104();
void init_kov3_102();
void init_kov3_101();
void init_kov3_100();
void init_kof98umh();
void pgm2_ramrom(machine_config &config);
void pgm2_lores(machine_config &config);
void pgm2(machine_config &config);
void pgm2_hires(machine_config &config);
void pgm2_map(address_map &map);
void pgm2_module_rom_map(address_map &map);
void pgm2_ram_rom_map(address_map &map);
void pgm2_rom_map(address_map &map);
private:
u32 unk_startup_r();
u32 rtc_r();
u32 mcu_r(offs_t offset);
void fg_videoram_w(offs_t offset, u32 data, u32 mem_mask = ~0);
void bg_videoram_w(offs_t offset, u32 data, u32 mem_mask = ~0);
void mcu_w(offs_t offset, u32 data, u32 mem_mask = ~0);
void share_bank_w(offs_t offset, u16 data, u16 mem_mask = ~0);
u8 shareram_r(offs_t offset);
void shareram_w(offs_t offset, u8 data);
void vbl_ack_w(u16 data);
void unk30120014_w(offs_t offset, u16 data);
void pio_sodr_w(offs_t offset, u32 data, u32 mem_mask = ~0);
void pio_codr_w(offs_t offset, u32 data, u32 mem_mask = ~0);
u32 pio_pdsr_r();
void module_rom_w(offs_t offset, u16 data);
u16 module_rom_r(offs_t offset);
int module_data_r();
void module_data_w(int state);
void module_clk_w(int state);
u32 orleg2_speedup_r();
u32 kov2nl_speedup_r();
u32 kof98umh_speedup_r();
u32 ddpdojt_speedup_r();
u32 ddpdojt_speedup2_r();
u32 kov3_speedup_r();
u8 encryption_r(offs_t offset);
void encryption_w(offs_t offset, u8 data);
void encryption_do_w(u32 data);
void sprite_encryption_w(offs_t offset, u32 data, u32 mem_mask = ~0);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
virtual void device_post_load() override;
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(screen_vblank);
DECLARE_WRITE_LINE_MEMBER(irq);
TIMER_DEVICE_CALLBACK_MEMBER(mcu_interrupt);
void decrypt_kov3_module(u32 addrxor, u16 dataxor);
tilemap_t *m_fg_tilemap = nullptr;
tilemap_t *m_bg_tilemap = nullptr;
bitmap_ind16 m_sprite_bitmap;
void skip_sprite_chunk(u32 &palette_offset, u32 maskdata, bool reverse);
void draw_sprite_pixel(const rectangle &cliprect, u32 palette_offset, s16 realx, s16 realy, u16 pal);
void draw_sprite_chunk(const rectangle &cliprect, u32 &palette_offset, s16 x, s16 realy,
u16 sizex, int xdraw, u16 pal, u32 maskdata, u32 zoomx_bits, u8 repeats, s16 &realxdraw, s8 realdraw_inc, s8 palette_inc);
void draw_sprite_line(const rectangle &cliprect, u32 &mask_offset, u32 &palette_offset, s16 x, s16 realy,
bool flipx, bool reverse, u16 sizex, u16 pal, u8 zoomybit, u32 zoomx_bits, u8 xrepeats);
void draw_sprites(const rectangle &cliprect);
void copy_sprites_from_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect, u16 pri);
void common_encryption_init();
u8 m_encryption_table[0x100]{};
bool m_has_decrypted = false; // so we only do it once.
bool m_has_decrypted_kov3_module = false;
u32 m_spritekey = 0;
u32 m_realspritekey = 0;
bool m_sprite_predecrypted = false;
u8 m_shareram[0x100]{};
u16 m_share_bank = 0;
u32 m_mcu_regs[8]{};
u32 m_mcu_result0 = 0;
u32 m_mcu_result1 = 0;
u8 m_mcu_last_cmd = 0;
void mcu_command(bool is_command);
std::vector<u8> m_encrypted_copy;
u32 m_pio_out_data = 0;
const kov3_module_key *module_key = nullptr;
bool module_sum_read = false;
u32 module_in_latch = 0;
u32 module_out_latch = 0;
int module_prev_state = 0;
int module_clk_cnt = 0;
u8 module_rcv_buf[10]{};
u8 module_send_buf[9]{};
// devices
required_device<cpu_device> m_maincpu;
required_device<screen_device> m_screen;
required_shared_ptr<u32> m_lineram;
required_shared_ptr<u32> m_sp_zoom;
required_shared_ptr<u32> m_mainram;
optional_shared_ptr<u32> m_romboard_ram;
required_shared_ptr<u32> m_fg_videoram;
required_shared_ptr<u32> m_bg_videoram;
required_shared_ptr<u32> m_sp_videoram;
required_shared_ptr<u32> m_bgscroll;
required_shared_ptr<u32> m_fgscroll;
required_shared_ptr<u32> m_vidmode;
required_device<gfxdecode_device> m_gfxdecode2;
required_device<gfxdecode_device> m_gfxdecode3;
required_device<arm_aic_device> m_arm_aic;
required_region_ptr<u8> m_sprites_mask;
required_region_ptr<u8> m_sprites_colour;
required_device<palette_device> m_sp_palette;
required_device<palette_device> m_bg_palette;
required_device<palette_device> m_tx_palette;
required_device<timer_device> m_mcu_timer;
optional_device_array<pgm2_memcard_device, 4> m_memcard;
required_memory_region m_mainrom;
};
#endif
|