flycast/core/hw/naomi/m4cartridge.h

80 lines
1.7 KiB
C
Raw Normal View History

2018-11-05 21:54:35 +00:00
/*
* 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();
virtual u32 ReadMem(u32 address, u32 size) override
{
if ((address & 0xff) == 0x34)
return m4id & 0xff80;
u32 data = NaomiCartridge::ReadMem(address, size);
if ((address & 0xff) == (NAOMI_ROM_OFFSETH_addr & 0xff))
// indicates that security PIC is present
data |= 0x2000;
return data;
}
virtual bool Read(u32 offset, u32 size, void *dst) override;
virtual bool Write(u32 offset, u32 size, u32 data) override;
virtual void* GetDmaPtr(u32 &size) override;
virtual void AdvancePtr(u32 size) override;
void SetM4Id(u16 m4id) { this->m4id = m4id; }
void SetKeyData(u8 *key_data)
{
this->m_key_data = key_data;
// FIXME not the best place to do this
device_start();
device_reset();
}
protected:
virtual void DmaOffsetChanged(u32 dma_offset) override;
virtual void PioOffsetChanged(u32 pio_offset) override;
private:
void device_start();
void device_reset();
static const u8 k_sboxes[4][16];
u16 m4id;
u8 *m_key_data; // 2048 bytes
u16 subkey1, subkey2;
u16 one_round[0x10000];
u8 buffer[32768];
u32 rom_cur_address, buffer_actual_size;
u16 iv;
u8 counter;
bool encryption;
bool cfi_mode;
void enc_init();
void enc_reset();
void enc_fill();
u16 decrypt_one_round(u16 word, u16 subkey);
};
#endif /* CORE_HW_NAOMI_M4CARTRIDGE_H_ */