1 // license:BSD-3-Clause 2 // copyright-holders:David Haywood 3 #ifndef MAME_INCLUDES_PGM2_H 4 #define MAME_INCLUDES_PGM2_H 5 6 #pragma once 7 8 #include "cpu/arm7/arm7.h" 9 #include "cpu/arm7/arm7core.h" 10 #include "sound/ymz770.h" 11 #include "machine/igs036crypt.h" 12 #include "screen.h" 13 #include "speaker.h" 14 #include "machine/nvram.h" 15 #include "machine/timer.h" 16 #include "machine/atmel_arm_aic.h" 17 #include "machine/pgm2_memcard.h" 18 #include "emupal.h" 19 #include "tilemap.h" 20 21 struct kov3_module_key 22 { 23 u8 key[8]; 24 u8 sum[8]; 25 u32 addr_xor; // 22bit 26 u16 data_xor; 27 }; 28 29 class pgm2_state : public driver_device 30 { 31 public: pgm2_state(const machine_config & mconfig,device_type type,const char * tag)32 pgm2_state(const machine_config &mconfig, device_type type, const char *tag) : 33 driver_device(mconfig, type, tag), 34 m_maincpu(*this, "maincpu"), 35 m_screen(*this, "screen"), 36 m_lineram(*this, "lineram"), 37 m_sp_zoom(*this, "sp_zoom"), 38 m_mainram(*this, "mainram"), 39 m_romboard_ram(*this, "romboard_ram"), 40 m_fg_videoram(*this, "fg_videoram"), 41 m_bg_videoram(*this, "bg_videoram"), 42 m_sp_videoram(*this, "sp_videoram"), 43 m_bgscroll(*this, "bgscroll"), 44 m_fgscroll(*this, "fgscroll"), 45 m_vidmode(*this, "vidmode"), 46 m_gfxdecode2(*this, "gfxdecode2"), 47 m_gfxdecode3(*this, "gfxdecode3"), 48 m_arm_aic(*this, "arm_aic"), 49 m_sprites_mask(*this, "sprites_mask"), 50 m_sprites_colour(*this, "sprites_colour"), 51 m_sp_palette(*this, "sp_palette"), 52 m_bg_palette(*this, "bg_palette"), 53 m_tx_palette(*this, "tx_palette"), 54 m_mcu_timer(*this, "mcu_timer"), 55 m_memcard(*this, "memcard_p%u", 1U), 56 m_mainrom(*this, "mainrom") 57 { } 58 59 void init_kov2nl(); 60 void init_orleg2(); 61 void init_ddpdojt(); 62 void init_kov3(); 63 void init_kov3_104(); 64 void init_kov3_102(); 65 void init_kov3_101(); 66 void init_kov3_100(); 67 void init_kof98umh(); 68 69 void pgm2_ramrom(machine_config &config); 70 void pgm2_lores(machine_config &config); 71 void pgm2(machine_config &config); 72 void pgm2_hires(machine_config &config); 73 void pgm2_map(address_map &map); 74 void pgm2_module_rom_map(address_map &map); 75 void pgm2_ram_rom_map(address_map &map); 76 void pgm2_rom_map(address_map &map); 77 private: 78 u32 unk_startup_r(); 79 u32 rtc_r(); 80 u32 mcu_r(offs_t offset); 81 void fg_videoram_w(offs_t offset, u32 data, u32 mem_mask = ~0); 82 void bg_videoram_w(offs_t offset, u32 data, u32 mem_mask = ~0); 83 void mcu_w(offs_t offset, u32 data, u32 mem_mask = ~0); 84 void share_bank_w(offs_t offset, u16 data, u16 mem_mask = ~0); 85 u8 shareram_r(offs_t offset); 86 void shareram_w(offs_t offset, u8 data); 87 void vbl_ack_w(u16 data); 88 void unk30120014_w(offs_t offset, u16 data); 89 90 void pio_sodr_w(offs_t offset, u32 data, u32 mem_mask = ~0); 91 void pio_codr_w(offs_t offset, u32 data, u32 mem_mask = ~0); 92 u32 pio_pdsr_r(); 93 void module_rom_w(offs_t offset, u16 data); 94 u16 module_rom_r(offs_t offset); 95 int module_data_r(); 96 void module_data_w(int state); 97 void module_clk_w(int state); 98 99 u32 orleg2_speedup_r(); 100 u32 kov2nl_speedup_r(); 101 u32 kof98umh_speedup_r(); 102 u32 ddpdojt_speedup_r(); 103 u32 ddpdojt_speedup2_r(); 104 u32 kov3_speedup_r(); 105 106 u8 encryption_r(offs_t offset); 107 void encryption_w(offs_t offset, u8 data); 108 void encryption_do_w(u32 data); 109 void sprite_encryption_w(offs_t offset, u32 data, u32 mem_mask = ~0); 110 111 virtual void machine_start() override; 112 virtual void machine_reset() override; 113 virtual void video_start() override; 114 virtual void device_post_load() override; 115 116 TILE_GET_INFO_MEMBER(get_fg_tile_info); 117 TILE_GET_INFO_MEMBER(get_bg_tile_info); 118 119 u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 120 DECLARE_WRITE_LINE_MEMBER(screen_vblank); 121 DECLARE_WRITE_LINE_MEMBER(irq); 122 123 TIMER_DEVICE_CALLBACK_MEMBER(mcu_interrupt); 124 125 void decrypt_kov3_module(u32 addrxor, u16 dataxor); 126 127 tilemap_t *m_fg_tilemap; 128 tilemap_t *m_bg_tilemap; 129 130 bitmap_ind16 m_sprite_bitmap; 131 132 void skip_sprite_chunk(u32 &palette_offset, u32 maskdata, bool reverse); 133 void draw_sprite_pixel(const rectangle &cliprect, u32 palette_offset, s16 realx, s16 realy, u16 pal); 134 void draw_sprite_chunk(const rectangle &cliprect, u32 &palette_offset, s16 x, s16 realy, 135 u16 sizex, int xdraw, u16 pal, u32 maskdata, u32 zoomx_bits, u8 repeats, s16 &realxdraw, s8 realdraw_inc, s8 palette_inc); 136 void draw_sprite_line(const rectangle &cliprect, u32 &mask_offset, u32 &palette_offset, s16 x, s16 realy, 137 bool flipx, bool reverse, u16 sizex, u16 pal, u8 zoomybit, u32 zoomx_bits, u8 xrepeats); 138 void draw_sprites(const rectangle &cliprect); 139 void copy_sprites_from_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect, u16 pri); 140 141 void common_encryption_init(); 142 u8 m_encryption_table[0x100]; 143 bool m_has_decrypted; // so we only do it once. 144 bool m_has_decrypted_kov3_module; 145 u32 m_spritekey; 146 u32 m_realspritekey; 147 bool m_sprite_predecrypted; 148 149 u8 m_shareram[0x100]; 150 u16 m_share_bank; 151 u32 m_mcu_regs[8]; 152 u32 m_mcu_result0; 153 u32 m_mcu_result1; 154 u8 m_mcu_last_cmd; 155 void mcu_command(bool is_command); 156 157 std::vector<u8> m_encrypted_copy; 158 159 u32 m_pio_out_data; 160 const kov3_module_key *module_key; 161 bool module_sum_read; 162 u32 module_in_latch; 163 u32 module_out_latch; 164 int module_prev_state; 165 int module_clk_cnt; 166 u8 module_rcv_buf[10]; 167 u8 module_send_buf[9]; 168 169 // devices 170 required_device<cpu_device> m_maincpu; 171 required_device<screen_device> m_screen; 172 required_shared_ptr<u32> m_lineram; 173 required_shared_ptr<u32> m_sp_zoom; 174 required_shared_ptr<u32> m_mainram; 175 optional_shared_ptr<u32> m_romboard_ram; 176 required_shared_ptr<u32> m_fg_videoram; 177 required_shared_ptr<u32> m_bg_videoram; 178 required_shared_ptr<u32> m_sp_videoram; 179 required_shared_ptr<u32> m_bgscroll; 180 required_shared_ptr<u32> m_fgscroll; 181 required_shared_ptr<u32> m_vidmode; 182 required_device<gfxdecode_device> m_gfxdecode2; 183 required_device<gfxdecode_device> m_gfxdecode3; 184 required_device<arm_aic_device> m_arm_aic; 185 required_region_ptr<u8> m_sprites_mask; 186 required_region_ptr<u8> m_sprites_colour; 187 required_device<palette_device> m_sp_palette; 188 required_device<palette_device> m_bg_palette; 189 required_device<palette_device> m_tx_palette; 190 required_device<timer_device> m_mcu_timer; 191 192 optional_device_array<pgm2_memcard_device, 4> m_memcard; 193 194 required_memory_region m_mainrom; 195 }; 196 197 #endif 198