flycast/core/hw/naomi/m4cartridge.h

86 lines
1.9 KiB
C++

/*
* m4cartridge.h
*
* Created on: Nov 5, 2018
* Author: flyinghead
* Plagiarized from mame (mame/src/mame/machine/naomim4.h)
* // license:BSD-3-Clause
* // copyright-holders:Olivier Galibert,Andreas Naive
*
*/
#ifndef CORE_HW_NAOMI_M4CARTRIDGE_H_
#define CORE_HW_NAOMI_M4CARTRIDGE_H_
#include "naomi_cart.h"
#include "naomi_regs.h"
class M4Cartridge: public NaomiCartridge {
public:
M4Cartridge(u32 size) : NaomiCartridge(size) { }
~M4Cartridge() override;
void Init(LoadProgress *progress = nullptr, std::vector<u8> *digest = nullptr) override
{
device_start();
device_reset();
}
u32 ReadMem(u32 address, u32 size) override
{
if ((address & 0xff) == 0x34)
return m4id & 0xff80;
u32 data = NaomiCartridge::ReadMem(address, size);
if (address == NAOMI_ROM_OFFSETH_addr)
// indicates that security PIC is present
data |= 0x2000;
return data;
}
bool Read(u32 offset, u32 size, void *dst) override;
bool Write(u32 offset, u32 size, u32 data) override;
void* GetDmaPtr(u32 &size) override;
void AdvancePtr(u32 size) override;
void Serialize(Serializer& ser) const override;
void Deserialize(Deserializer& deser) override;
bool GetBootId(RomBootID *bootId) override;
void SetKey(u32 key) override { this->m4id = key; }
void SetKeyData(u8 *key_data) override { this->m_key_data = key_data; }
protected:
void DmaOffsetChanged(u32 dma_offset) override;
void PioOffsetChanged(u32 pio_offset) override;
u16 decrypt(u16 w);
void enc_reset();
private:
void device_start();
void device_reset();
static const u8 k_sboxes[4][16];
u16 m4id;
u8 *m_key_data = nullptr; // 2048 bytes
u16 subkey1 = 0;
u16 subkey2 = 0;
u16 one_round[0x10000];
u8 buffer[32768];
u32 rom_cur_address, buffer_actual_size;
u16 iv;
u8 counter;
bool encryption;
bool cfi_mode;
bool xfer_ready;
void enc_init();
void enc_fill();
u16 decrypt_one_round(u16 word, u16 subkey);
};
#endif /* CORE_HW_NAOMI_M4CARTRIDGE_H_ */