// license:BSD-3-Clause // copyright-holders:David Haywood, Andreas Naive, Tomasz Slanina, ElSemi /*************************************************************************** Capcom CPS-3 Hardware ****************************************************************************/ #include "machine/intelfsh.h" #include "cpu/sh/sh2.h" #include "audio/cps3.h" class cps3_state : public driver_device { public: cps3_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_gfxdecode(*this, "gfxdecode") , m_palette(*this, "palette") , m_cps3sound(*this, "cps3sound") , m_mainram(*this, "mainram") , m_spriteram(*this, "spriteram") , m_colourram(*this, "colourram") , m_tilemap20_regs_base(*this, "tmap20_regs") , m_tilemap30_regs_base(*this, "tmap30_regs") , m_tilemap40_regs_base(*this, "tmap40_regs") , m_tilemap50_regs_base(*this, "tmap50_regs") , m_fullscreenzoom(*this, "fullscreenzoom") , m_0xc0000000_ram(*this, "0xc0000000_ram") , m_decrypted_gamerom(*this, "decrypted_gamerom") , m_0xc0000000_ram_decrypted(*this, "0xc0000000_ram_decrypted") , m_user4_region(*this, "user4") , m_user5_region(*this, "user5") { } required_device m_maincpu; required_device m_gfxdecode; required_device m_palette; required_device m_cps3sound; required_shared_ptr m_mainram; required_shared_ptr m_spriteram; required_shared_ptr m_colourram; required_shared_ptr m_tilemap20_regs_base; required_shared_ptr m_tilemap30_regs_base; required_shared_ptr m_tilemap40_regs_base; required_shared_ptr m_tilemap50_regs_base; required_shared_ptr m_fullscreenzoom; required_shared_ptr m_0xc0000000_ram; required_shared_ptr m_decrypted_gamerom; required_shared_ptr m_0xc0000000_ram_decrypted; optional_memory_region m_user4_region; optional_memory_region m_user5_region; fujitsu_29f016a_device *m_simm[7][8]; uint32_t m_cram_gfxflash_bank; std::unique_ptr m_char_ram; std::unique_ptr m_eeprom; uint32_t m_ss_pal_base; uint32_t m_unk_vidregs[0x20/4]; uint32_t m_ss_bank_base; uint32_t m_screenwidth; std::unique_ptr m_mame_colours; bitmap_rgb32 m_renderbuffer_bitmap; rectangle m_renderbuffer_clip; uint8_t* m_user4; uint32_t m_key1; uint32_t m_key2; int m_altEncryption; std::unique_ptr m_ss_ram; uint32_t m_cram_bank; uint16_t m_current_eeprom_read; uint32_t m_paldma_source; uint32_t m_paldma_realsource; uint32_t m_paldma_dest; uint32_t m_paldma_fade; uint32_t m_paldma_other2; uint32_t m_paldma_length; uint32_t m_chardma_source; uint32_t m_chardma_other; uint32_t m_current_table_address; int m_rle_length; int m_last_normal_byte; unsigned short m_lastb; unsigned short m_lastb2; uint8_t* m_user5; DECLARE_READ32_MEMBER(cps3_ssram_r); DECLARE_WRITE32_MEMBER(cps3_ssram_w); DECLARE_WRITE32_MEMBER(cps3_0xc0000000_ram_w); DECLARE_WRITE32_MEMBER(cram_bank_w); DECLARE_READ32_MEMBER(cram_data_r); DECLARE_WRITE32_MEMBER(cram_data_w); DECLARE_READ32_MEMBER(cps3_gfxflash_r); DECLARE_WRITE32_MEMBER(cps3_gfxflash_w); DECLARE_READ32_MEMBER(cps3_flash1_r); DECLARE_READ32_MEMBER(cps3_flash2_r); DECLARE_WRITE32_MEMBER(cps3_flash1_w); DECLARE_WRITE32_MEMBER(cps3_flash2_w); DECLARE_WRITE32_MEMBER(cram_gfxflash_bank_w); DECLARE_READ32_MEMBER(cps3_vbl_r); DECLARE_READ32_MEMBER(cps3_unk_io_r); DECLARE_READ32_MEMBER(cps3_40C0000_r); DECLARE_READ32_MEMBER(cps3_40C0004_r); DECLARE_READ32_MEMBER(cps3_eeprom_r); DECLARE_WRITE32_MEMBER(cps3_eeprom_w); DECLARE_WRITE32_MEMBER(cps3_ss_bank_base_w); DECLARE_WRITE32_MEMBER(cps3_ss_pal_base_w); DECLARE_WRITE32_MEMBER(cps3_palettedma_w); DECLARE_WRITE32_MEMBER(cps3_characterdma_w); DECLARE_WRITE32_MEMBER(cps3_irq10_ack_w); DECLARE_WRITE32_MEMBER(cps3_irq12_ack_w); DECLARE_WRITE32_MEMBER(cps3_unk_vidregs_w); DECLARE_READ32_MEMBER(cps3_colourram_r); DECLARE_WRITE32_MEMBER(cps3_colourram_w); void init_sfiii3(); void init_sfiii(); void init_redearth(); void init_jojo(); void init_jojoba(); void init_sfiii2(); void init_cps3boot(); SH2_DMA_KLUDGE_CB(dma_callback); virtual void machine_reset() override; virtual void video_start() override; uint32_t screen_update_cps3(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(cps3_vbl_interrupt); INTERRUPT_GEN_MEMBER(cps3_other_interrupt); uint16_t rotate_left(uint16_t value, int n); uint16_t rotxor(uint16_t val, uint16_t xorval); uint32_t cps3_mask(uint32_t address, uint32_t key1, uint32_t key2); void cps3_decrypt_bios(); void init_common(void); void init_crypt(uint32_t key1, uint32_t key2, int altEncryption); void cps3_set_mame_colours(int colournum, uint16_t data, uint32_t fadeval); void cps3_draw_tilemapsprite_line(int tmnum, int drawline, bitmap_rgb32 &bitmap, const rectangle &cliprect ); uint32_t cps3_flashmain_r(address_space &space, int which, uint32_t offset, uint32_t mem_mask); void cps3_flashmain_w(int which, uint32_t offset, uint32_t data, uint32_t mem_mask); uint32_t process_byte( uint8_t real_byte, uint32_t destination, int max_length ); void cps3_do_char_dma( uint32_t real_source, uint32_t real_destination, uint32_t real_length ); uint32_t ProcessByte8(uint8_t b,uint32_t dst_offset); void cps3_do_alt_char_dma( uint32_t src, uint32_t real_dest, uint32_t real_length ); void cps3_process_character_dma(uint32_t address); void copy_from_nvram(); inline void cps3_drawgfxzoom(bitmap_rgb32 &dest_bmp, const rectangle &clip, gfx_element *gfx, unsigned int code, unsigned int color, int flipx, int flipy, int sx, int sy, int transparency, int transparent_color, int scalex, int scaley, bitmap_ind8 *pri_buffer, uint32_t pri_mask); void cps3(machine_config &config); void jojo(machine_config &config); void redearth(machine_config &config); void sfiii2(machine_config &config); void sfiii3(machine_config &config); void sfiii(machine_config &config); void jojoba(machine_config &config); void simm1_64mbit(machine_config &config); void simm2_64mbit(machine_config &config); void simm3_128mbit(machine_config &config); void simm4_128mbit(machine_config &config); void simm5_128mbit(machine_config &config); void simm5_32mbit(machine_config &config); void simm6_128mbit(machine_config &config); void cps3_map(address_map &map); void decrypted_opcodes_map(address_map &map); };