From 5b696f7c0d190ecef4ceb786487bcc00d2d534eb Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Wed, 28 Feb 2024 20:51:10 +0800 Subject: [PATCH] aica: initial register definitions --- aica.hpp | 1 - aica/aica.hpp | 31 ++ aica/aica_channel.hpp | 426 ++++++++++++++++++++++++ aica/aica_common.hpp | 665 +++++++++++++++++++++++++++++++++++++ aica/aica_dsp_out.hpp | 31 ++ aica/aica_rtc.hpp | 38 +++ common.mk | 14 +- regs/aica_channel_data.csv | 42 +++ regs/aica_channel_data.ods | Bin 18709 -> 20039 bytes regs/aica_common_data.csv | 66 ++++ regs/aica_common_data.ods | Bin 20022 -> 21172 bytes regs/aica_dsp_out_data.csv | 3 + regs/aica_dsp_out_data.ods | Bin 0 -> 10313 bytes regs/aica_rtc_data.csv | 4 + regs/aica_rtc_data.ods | Bin 10265 -> 10975 bytes regs/gen/aica.py | 200 +++++++++++ regs/gen/sh7091.py | 21 +- vga.cpp | 6 +- 18 files changed, 1522 insertions(+), 26 deletions(-) delete mode 100644 aica.hpp create mode 100644 aica/aica.hpp create mode 100644 aica/aica_channel.hpp create mode 100644 aica/aica_common.hpp create mode 100644 aica/aica_dsp_out.hpp create mode 100644 aica/aica_rtc.hpp create mode 100644 regs/aica_channel_data.csv create mode 100644 regs/aica_common_data.csv create mode 100644 regs/aica_dsp_out_data.csv create mode 100644 regs/aica_dsp_out_data.ods create mode 100644 regs/aica_rtc_data.csv create mode 100644 regs/gen/aica.py diff --git a/aica.hpp b/aica.hpp deleted file mode 100644 index 64b856f..0000000 --- a/aica.hpp +++ /dev/null @@ -1 +0,0 @@ -extern reg32 aica[0x8000] __asm("aica"); diff --git a/aica/aica.hpp b/aica/aica.hpp new file mode 100644 index 0000000..9704c89 --- /dev/null +++ b/aica/aica.hpp @@ -0,0 +1,31 @@ +#include +#include + +#include "type.hpp" + +#include "aica_channel.hpp" +#include "aica_dsp_out.hpp" +#include "aica_common.hpp" +#include "aica_rtc.hpp" + +struct aica_reg { + // 0x00700000 [64] channel data start + // 0x00702000 [64] channel data end + // 0x00702000 [18] dsp out start + // 0x00702048 [18] dsp out end + // padding 0x7b8 + // 0x00702800 common data start + + struct aica_channel channel[64]; + struct aica_dsp_out dsp_out[18]; + const uint16_t _pad[0x7b8 / 2]; + struct aica_common common; +}; + +static_assert((sizeof (struct aica_reg)) == 0x2d08); +static_assert((offsetof (struct aica_reg, channel)) == 0); +static_assert((offsetof (struct aica_reg, dsp_out)) == 0x2000); +static_assert((offsetof (struct aica_reg, common)) == 0x2800); + +extern struct aica_reg aica __asm("aica"); +extern struct aica_rtc aica_rtc __asm("aica_rtc"); diff --git a/aica/aica_channel.hpp b/aica/aica_channel.hpp new file mode 100644 index 0000000..5b2e4f0 --- /dev/null +++ b/aica/aica_channel.hpp @@ -0,0 +1,426 @@ +#include +#include + +#include "type.hpp" + +struct aica_channel { + reg16 reg_0000; + const reg16 _pad0[1]; + reg16 reg_0004; + const reg16 _pad1[1]; + reg16 reg_0008; + const reg16 _pad2[1]; + reg16 reg_000c; + const reg16 _pad3[1]; + reg16 reg_0010; + const reg16 _pad4[1]; + reg16 reg_0014; + const reg16 _pad5[1]; + reg16 reg_0018; + const reg16 _pad6[1]; + reg16 reg_001c; + const reg16 _pad7[1]; + reg16 reg_0020; + const reg16 _pad8[1]; + reg16 reg_0024; + const reg16 _pad9[1]; + reg16 reg_0028; + const reg16 _pad10[1]; + reg16 reg_002c; + const reg16 _pad11[1]; + reg16 reg_0030; + const reg16 _pad12[1]; + reg16 reg_0034; + const reg16 _pad13[1]; + reg16 reg_0038; + const reg16 _pad14[1]; + reg16 reg_003c; + const reg16 _pad15[1]; + reg16 reg_0040; + const reg16 _pad16[1]; + reg16 reg_0044; + const reg16 _pad17[1]; + const reg16 _pad18[28]; + + uint32_t KYONEX() const + { + return (static_cast((reg_0000 >> 15) & 0x1) << 0); + } + void KYONEX(const uint32_t v) + { + reg_0000 = (((v >> 0) & 0x1) << 15) | (reg_0000 & 0x7fff); + } + + uint32_t KYONB() const + { + return (static_cast((reg_0000 >> 14) & 0x1) << 0); + } + void KYONB(const uint32_t v) + { + reg_0000 = (((v >> 0) & 0x1) << 14) | (reg_0000 & 0xbfff); + } + + uint32_t SSCTL() const + { + return (static_cast((reg_0000 >> 10) & 0x1) << 0); + } + void SSCTL(const uint32_t v) + { + reg_0000 = (((v >> 0) & 0x1) << 10) | (reg_0000 & 0xfbff); + } + + uint32_t LPCTL() const + { + return (static_cast((reg_0000 >> 9) & 0x1) << 0); + } + void LPCTL(const uint32_t v) + { + reg_0000 = (((v >> 0) & 0x1) << 9) | (reg_0000 & 0xfdff); + } + + uint32_t PCMS() const + { + return (static_cast((reg_0000 >> 7) & 0x3) << 0); + } + void PCMS(const uint32_t v) + { + reg_0000 = (((v >> 0) & 0x3) << 7) | (reg_0000 & 0xfe7f); + } + + uint32_t SA() const + { + return (static_cast((reg_0000 >> 0) & 0x7f) << 16) | (static_cast((reg_0004 >> 0) & 0xffff) << 0); + } + void SA(const uint32_t v) + { + reg_0000 = (((v >> 16) & 0x7f) << 0) | (reg_0000 & 0xff80); + reg_0004 = (((v >> 0) & 0xffff) << 0); + } + + uint32_t LSA() const + { + return (static_cast((reg_0008 >> 0) & 0xffff) << 0); + } + void LSA(const uint32_t v) + { + reg_0008 = (((v >> 0) & 0xffff) << 0); + } + + uint32_t LEA() const + { + return (static_cast((reg_000c >> 0) & 0xffff) << 0); + } + void LEA(const uint32_t v) + { + reg_000c = (((v >> 0) & 0xffff) << 0); + } + + uint32_t D2R() const + { + return (static_cast((reg_0010 >> 11) & 0x1f) << 0); + } + void D2R(const uint32_t v) + { + reg_0010 = (((v >> 0) & 0x1f) << 11) | (reg_0010 & 0x7ff); + } + + uint32_t D1R() const + { + return (static_cast((reg_0010 >> 6) & 0x1f) << 0); + } + void D1R(const uint32_t v) + { + reg_0010 = (((v >> 0) & 0x1f) << 6) | (reg_0010 & 0xf83f); + } + + uint32_t AR() const + { + return (static_cast((reg_0010 >> 0) & 0x1f) << 0); + } + void AR(const uint32_t v) + { + reg_0010 = (((v >> 0) & 0x1f) << 0) | (reg_0010 & 0xffe0); + } + + uint32_t LPSLNK() const + { + return (static_cast((reg_0014 >> 14) & 0x1) << 0); + } + void LPSLNK(const uint32_t v) + { + reg_0014 = (((v >> 0) & 0x1) << 14) | (reg_0014 & 0xbfff); + } + + uint32_t KRS() const + { + return (static_cast((reg_0014 >> 10) & 0xf) << 0); + } + void KRS(const uint32_t v) + { + reg_0014 = (((v >> 0) & 0xf) << 10) | (reg_0014 & 0xc3ff); + } + + uint32_t DL() const + { + return (static_cast((reg_0014 >> 5) & 0x1f) << 0); + } + void DL(const uint32_t v) + { + reg_0014 = (((v >> 0) & 0x1f) << 5) | (reg_0014 & 0xfc1f); + } + + uint32_t RR() const + { + return (static_cast((reg_0014 >> 0) & 0x1f) << 0); + } + void RR(const uint32_t v) + { + reg_0014 = (((v >> 0) & 0x1f) << 0) | (reg_0014 & 0xffe0); + } + + uint32_t OCT() const + { + return (static_cast((reg_0018 >> 11) & 0xf) << 0); + } + void OCT(const uint32_t v) + { + reg_0018 = (((v >> 0) & 0xf) << 11) | (reg_0018 & 0x87ff); + } + + uint32_t FNS() const + { + return (static_cast((reg_0018 >> 0) & 0x3ff) << 0); + } + void FNS(const uint32_t v) + { + reg_0018 = (((v >> 0) & 0x3ff) << 0) | (reg_0018 & 0xfc00); + } + + uint32_t LFORE() const + { + return (static_cast((reg_001c >> 15) & 0x1) << 0); + } + void LFORE(const uint32_t v) + { + reg_001c = (((v >> 0) & 0x1) << 15) | (reg_001c & 0x7fff); + } + + uint32_t LFOF() const + { + return (static_cast((reg_001c >> 10) & 0x1f) << 0); + } + void LFOF(const uint32_t v) + { + reg_001c = (((v >> 0) & 0x1f) << 10) | (reg_001c & 0x83ff); + } + + uint32_t PLFOWS() const + { + return (static_cast((reg_001c >> 8) & 0x3) << 0); + } + void PLFOWS(const uint32_t v) + { + reg_001c = (((v >> 0) & 0x3) << 8) | (reg_001c & 0xfcff); + } + + uint32_t PLFOS() const + { + return (static_cast((reg_001c >> 5) & 0x7) << 0); + } + void PLFOS(const uint32_t v) + { + reg_001c = (((v >> 0) & 0x7) << 5) | (reg_001c & 0xff1f); + } + + uint32_t ALFOWS() const + { + return (static_cast((reg_001c >> 3) & 0x3) << 0); + } + void ALFOWS(const uint32_t v) + { + reg_001c = (((v >> 0) & 0x3) << 3) | (reg_001c & 0xffe7); + } + + uint32_t ALFOS() const + { + return (static_cast((reg_001c >> 0) & 0x7) << 0); + } + void ALFOS(const uint32_t v) + { + reg_001c = (((v >> 0) & 0x7) << 0) | (reg_001c & 0xfff8); + } + + uint32_t IMXL() const + { + return (static_cast((reg_0020 >> 4) & 0xf) << 0); + } + void IMXL(const uint32_t v) + { + reg_0020 = (((v >> 0) & 0xf) << 4) | (reg_0020 & 0xff0f); + } + + uint32_t ISEL() const + { + return (static_cast((reg_0020 >> 0) & 0xf) << 0); + } + void ISEL(const uint32_t v) + { + reg_0020 = (((v >> 0) & 0xf) << 0) | (reg_0020 & 0xfff0); + } + + uint32_t DISDL() const + { + return (static_cast((reg_0024 >> 8) & 0xf) << 0); + } + void DISDL(const uint32_t v) + { + reg_0024 = (((v >> 0) & 0xf) << 8) | (reg_0024 & 0xf0ff); + } + + uint32_t DIPAN() const + { + return (static_cast((reg_0024 >> 0) & 0x1f) << 0); + } + void DIPAN(const uint32_t v) + { + reg_0024 = (((v >> 0) & 0x1f) << 0) | (reg_0024 & 0xffe0); + } + + uint32_t TL() const + { + return (static_cast((reg_0028 >> 8) & 0xff) << 0); + } + void TL(const uint32_t v) + { + reg_0028 = (((v >> 0) & 0xff) << 8) | (reg_0028 & 0xff); + } + + uint32_t VOFF() const + { + return (static_cast((reg_0028 >> 6) & 0x1) << 0); + } + void VOFF(const uint32_t v) + { + reg_0028 = (((v >> 0) & 0x1) << 6) | (reg_0028 & 0xffbf); + } + + uint32_t LPOFF() const + { + return (static_cast((reg_0028 >> 5) & 0x1) << 0); + } + void LPOFF(const uint32_t v) + { + reg_0028 = (((v >> 0) & 0x1) << 5) | (reg_0028 & 0xffdf); + } + + uint32_t Q() const + { + return (static_cast((reg_0028 >> 0) & 0x1f) << 0); + } + void Q(const uint32_t v) + { + reg_0028 = (((v >> 0) & 0x1f) << 0) | (reg_0028 & 0xffe0); + } + + uint32_t FLV0() const + { + return (static_cast((reg_002c >> 0) & 0x1fff) << 0); + } + void FLV0(const uint32_t v) + { + reg_002c = (((v >> 0) & 0x1fff) << 0); + } + + uint32_t FLV1() const + { + return (static_cast((reg_0030 >> 0) & 0x1fff) << 0); + } + void FLV1(const uint32_t v) + { + reg_0030 = (((v >> 0) & 0x1fff) << 0); + } + + uint32_t FLV2() const + { + return (static_cast((reg_0034 >> 0) & 0x1fff) << 0); + } + void FLV2(const uint32_t v) + { + reg_0034 = (((v >> 0) & 0x1fff) << 0); + } + + uint32_t FLV3() const + { + return (static_cast((reg_0038 >> 0) & 0x1fff) << 0); + } + void FLV3(const uint32_t v) + { + reg_0038 = (((v >> 0) & 0x1fff) << 0); + } + + uint32_t FLV4() const + { + return (static_cast((reg_003c >> 0) & 0x1fff) << 0); + } + void FLV4(const uint32_t v) + { + reg_003c = (((v >> 0) & 0x1fff) << 0); + } + + uint32_t FAR() const + { + return (static_cast((reg_0040 >> 8) & 0x1f) << 0); + } + void FAR(const uint32_t v) + { + reg_0040 = (((v >> 0) & 0x1f) << 8) | (reg_0040 & 0xe0ff); + } + + uint32_t FD1R() const + { + return (static_cast((reg_0040 >> 0) & 0x1f) << 0); + } + void FD1R(const uint32_t v) + { + reg_0040 = (((v >> 0) & 0x1f) << 0) | (reg_0040 & 0xffe0); + } + + uint32_t FD2R() const + { + return (static_cast((reg_0044 >> 8) & 0x1f) << 0); + } + void FD2R(const uint32_t v) + { + reg_0044 = (((v >> 0) & 0x1f) << 8) | (reg_0044 & 0xe0ff); + } + + uint32_t FRR() const + { + return (static_cast((reg_0044 >> 0) & 0x1f) << 0); + } + void FRR(const uint32_t v) + { + reg_0044 = (((v >> 0) & 0x1f) << 0) | (reg_0044 & 0xffe0); + } + +}; + +static_assert((sizeof (aica_channel)) == 0x80 - 0x0); +static_assert((offsetof (aica_channel, reg_0000)) == 0x0 - 0x0); +static_assert((offsetof (aica_channel, reg_0004)) == 0x4 - 0x0); +static_assert((offsetof (aica_channel, reg_0008)) == 0x8 - 0x0); +static_assert((offsetof (aica_channel, reg_000c)) == 0xc - 0x0); +static_assert((offsetof (aica_channel, reg_0010)) == 0x10 - 0x0); +static_assert((offsetof (aica_channel, reg_0014)) == 0x14 - 0x0); +static_assert((offsetof (aica_channel, reg_0018)) == 0x18 - 0x0); +static_assert((offsetof (aica_channel, reg_001c)) == 0x1c - 0x0); +static_assert((offsetof (aica_channel, reg_0020)) == 0x20 - 0x0); +static_assert((offsetof (aica_channel, reg_0024)) == 0x24 - 0x0); +static_assert((offsetof (aica_channel, reg_0028)) == 0x28 - 0x0); +static_assert((offsetof (aica_channel, reg_002c)) == 0x2c - 0x0); +static_assert((offsetof (aica_channel, reg_0030)) == 0x30 - 0x0); +static_assert((offsetof (aica_channel, reg_0034)) == 0x34 - 0x0); +static_assert((offsetof (aica_channel, reg_0038)) == 0x38 - 0x0); +static_assert((offsetof (aica_channel, reg_003c)) == 0x3c - 0x0); +static_assert((offsetof (aica_channel, reg_0040)) == 0x40 - 0x0); +static_assert((offsetof (aica_channel, reg_0044)) == 0x44 - 0x0); diff --git a/aica/aica_common.hpp b/aica/aica_common.hpp new file mode 100644 index 0000000..c4a0508 --- /dev/null +++ b/aica/aica_common.hpp @@ -0,0 +1,665 @@ +#include +#include + +#include "type.hpp" + +struct aica_common { + reg16 reg_2800; + const reg16 _pad0[1]; + reg16 reg_2804; + const reg16 _pad1[1]; + reg16 reg_2808; + const reg16 _pad2[1]; + reg16 reg_280c; + const reg16 _pad3[1]; + reg16 reg_2810; + const reg16 _pad4[1]; + reg16 reg_2814; + const reg16 _pad5[1]; + const reg16 _pad6[52]; + reg16 reg_2880; + const reg16 _pad7[1]; + reg16 reg_2884; + const reg16 _pad8[1]; + reg16 reg_2888; + const reg16 _pad9[1]; + reg16 reg_288c; + const reg16 _pad10[1]; + reg16 reg_2890; + const reg16 _pad11[1]; + reg16 reg_2894; + const reg16 _pad12[1]; + reg16 reg_2898; + const reg16 _pad13[1]; + reg16 reg_289c; + const reg16 _pad14[1]; + reg16 reg_28a0; + const reg16 _pad15[1]; + reg16 reg_28a4; + const reg16 _pad16[1]; + reg16 reg_28a8; + const reg16 _pad17[1]; + reg16 reg_28ac; + const reg16 _pad18[1]; + reg16 reg_28b0; + const reg16 _pad19[1]; + reg16 reg_28b4; + const reg16 _pad20[1]; + reg16 reg_28b8; + const reg16 _pad21[1]; + reg16 reg_28bc; + const reg16 _pad22[1]; + const reg16 _pad23[416]; + reg16 reg_2c00; + const reg16 _pad24[1]; + const reg16 _pad25[126]; + reg16 reg_2d00; + const reg16 _pad26[1]; + reg16 reg_2d04; + const reg16 _pad27[1]; + + uint32_t MONO() const + { + return (static_cast((reg_2800 >> 15) & 0x1) << 0); + } + void MONO(const uint32_t v) + { + reg_2800 = (((v >> 0) & 0x1) << 15) | (reg_2800 & 0x7fff); + } + + uint32_t MEM8MB() const + { + return (static_cast((reg_2800 >> 9) & 0x1) << 0); + } + void MEM8MB(const uint32_t v) + { + reg_2800 = (((v >> 0) & 0x1) << 9) | (reg_2800 & 0xfdff); + } + + uint32_t DAC18B() const + { + return (static_cast((reg_2800 >> 8) & 0x1) << 0); + } + void DAC18B(const uint32_t v) + { + reg_2800 = (((v >> 0) & 0x1) << 8) | (reg_2800 & 0xfeff); + } + + uint32_t VER() const + { + return (static_cast((reg_2800 >> 4) & 0xf) << 0); + } + void VER(const uint32_t v) + { + reg_2800 = (((v >> 0) & 0xf) << 4) | (reg_2800 & 0xff0f); + } + + uint32_t MVOL() const + { + return (static_cast((reg_2800 >> 0) & 0xf) << 0); + } + void MVOL(const uint32_t v) + { + reg_2800 = (((v >> 0) & 0xf) << 0) | (reg_2800 & 0xfff0); + } + + uint32_t TESTB0() const + { + return (static_cast((reg_2804 >> 15) & 0x1) << 0); + } + void TESTB0(const uint32_t v) + { + reg_2804 = (((v >> 0) & 0x1) << 15) | (reg_2804 & 0x7fff); + } + + uint32_t RBL() const + { + return (static_cast((reg_2804 >> 13) & 0x3) << 0); + } + void RBL(const uint32_t v) + { + reg_2804 = (((v >> 0) & 0x3) << 13) | (reg_2804 & 0x9fff); + } + + uint32_t RBP() const + { + return (static_cast((reg_2804 >> 0) & 0xfff) << 11); + } + void RBP(const uint32_t v) + { + reg_2804 = (((v >> 11) & 0xfff) << 0) | (reg_2804 & 0xf000); + } + + uint32_t MOFUL() const + { + return (static_cast((reg_2808 >> 12) & 0x1) << 0); + } + void MOFUL(const uint32_t v) + { + reg_2808 = (((v >> 0) & 0x1) << 12) | (reg_2808 & 0xefff); + } + + uint32_t MOEMP() const + { + return (static_cast((reg_2808 >> 11) & 0x1) << 0); + } + void MOEMP(const uint32_t v) + { + reg_2808 = (((v >> 0) & 0x1) << 11) | (reg_2808 & 0xf7ff); + } + + uint32_t MIOVF() const + { + return (static_cast((reg_2808 >> 10) & 0x1) << 0); + } + void MIOVF(const uint32_t v) + { + reg_2808 = (((v >> 0) & 0x1) << 10) | (reg_2808 & 0xfbff); + } + + uint32_t MIFUL() const + { + return (static_cast((reg_2808 >> 9) & 0x1) << 0); + } + void MIFUL(const uint32_t v) + { + reg_2808 = (((v >> 0) & 0x1) << 9) | (reg_2808 & 0xfdff); + } + + uint32_t MIEMP() const + { + return (static_cast((reg_2808 >> 8) & 0x1) << 0); + } + void MIEMP(const uint32_t v) + { + reg_2808 = (((v >> 0) & 0x1) << 8) | (reg_2808 & 0xfeff); + } + + uint32_t MIBUF() const + { + return (static_cast((reg_2808 >> 0) & 0xff) << 0); + } + void MIBUF(const uint32_t v) + { + reg_2808 = (((v >> 0) & 0xff) << 0) | (reg_2808 & 0xff00); + } + + uint32_t AFSET() const + { + return (static_cast((reg_280c >> 14) & 0x1) << 0); + } + void AFSET(const uint32_t v) + { + reg_280c = (((v >> 0) & 0x1) << 14) | (reg_280c & 0xbfff); + } + + uint32_t MSLC() const + { + return (static_cast((reg_280c >> 8) & 0x3f) << 0); + } + void MSLC(const uint32_t v) + { + reg_280c = (((v >> 0) & 0x3f) << 8) | (reg_280c & 0xc0ff); + } + + uint32_t MOBUF() const + { + return (static_cast((reg_280c >> 0) & 0xff) << 0); + } + void MOBUF(const uint32_t v) + { + reg_280c = (((v >> 0) & 0xff) << 0) | (reg_280c & 0xff00); + } + + uint32_t LP() const + { + return (static_cast((reg_2810 >> 15) & 0x1) << 0); + } + void LP(const uint32_t v) + { + reg_2810 = (((v >> 0) & 0x1) << 15) | (reg_2810 & 0x7fff); + } + + uint32_t SGC() const + { + return (static_cast((reg_2810 >> 14) & 0x1) << 0); + } + void SGC(const uint32_t v) + { + reg_2810 = (((v >> 0) & 0x1) << 14) | (reg_2810 & 0xbfff); + } + + uint32_t EG() const + { + return (static_cast((reg_2810 >> 0) & 0x1fff) << 0); + } + void EG(const uint32_t v) + { + reg_2810 = (((v >> 0) & 0x1fff) << 0) | (reg_2810 & 0xe000); + } + + uint32_t CA() const + { + return (static_cast((reg_2814 >> 0) & 0xffff) << 0); + } + void CA(const uint32_t v) + { + reg_2814 = (((v >> 0) & 0xffff) << 0); + } + + uint32_t DMEA() const + { + return (static_cast((reg_2880 >> 9) & 0x7f) << 16) | (static_cast((reg_2884 >> 2) & 0x3fff) << 2); + } + void DMEA(const uint32_t v) + { + reg_2880 = (((v >> 16) & 0x7f) << 9) | (reg_2880 & 0x1ff); + reg_2884 = (((v >> 2) & 0x3fff) << 2); + } + + uint32_t TSCD() const + { + return (static_cast((reg_2880 >> 5) & 0x7) << 0); + } + void TSCD(const uint32_t v) + { + reg_2880 = (((v >> 0) & 0x7) << 5) | (reg_2880 & 0xff1f); + } + + uint32_t T() const + { + return (static_cast((reg_2880 >> 4) & 0x1) << 0); + } + void T(const uint32_t v) + { + reg_2880 = (((v >> 0) & 0x1) << 4) | (reg_2880 & 0xffef); + } + + uint32_t MRWINH() const + { + return (static_cast((reg_2880 >> 0) & 0xf) << 0); + } + void MRWINH(const uint32_t v) + { + reg_2880 = (((v >> 0) & 0xf) << 0) | (reg_2880 & 0xfff0); + } + + uint32_t DGATE() const + { + return (static_cast((reg_2888 >> 15) & 0x1) << 0); + } + void DGATE(const uint32_t v) + { + reg_2888 = (((v >> 0) & 0x1) << 15) | (reg_2888 & 0x7fff); + } + + uint32_t DRGA() const + { + return (static_cast((reg_2888 >> 2) & 0x1fff) << 2); + } + void DRGA(const uint32_t v) + { + reg_2888 = (((v >> 2) & 0x1fff) << 2) | (reg_2888 & 0x8003); + } + + uint32_t DDIR() const + { + return (static_cast((reg_288c >> 15) & 0x1) << 0); + } + void DDIR(const uint32_t v) + { + reg_288c = (((v >> 0) & 0x1) << 15) | (reg_288c & 0x7fff); + } + + uint32_t DLG() const + { + return (static_cast((reg_288c >> 2) & 0x1fff) << 2); + } + void DLG(const uint32_t v) + { + reg_288c = (((v >> 2) & 0x1fff) << 2) | (reg_288c & 0x8003); + } + + uint32_t DEXE() const + { + return (static_cast((reg_288c >> 0) & 0x1) << 0); + } + void DEXE(const uint32_t v) + { + reg_288c = (((v >> 0) & 0x1) << 0) | (reg_288c & 0xfffe); + } + + uint32_t TACTL() const + { + return (static_cast((reg_2890 >> 8) & 0x7) << 0); + } + void TACTL(const uint32_t v) + { + reg_2890 = (((v >> 0) & 0x7) << 8) | (reg_2890 & 0xf8ff); + } + + uint32_t TIMA() const + { + return (static_cast((reg_2890 >> 0) & 0xff) << 0); + } + void TIMA(const uint32_t v) + { + reg_2890 = (((v >> 0) & 0xff) << 0) | (reg_2890 & 0xff00); + } + + uint32_t TBCTL() const + { + return (static_cast((reg_2894 >> 8) & 0x7) << 0); + } + void TBCTL(const uint32_t v) + { + reg_2894 = (((v >> 0) & 0x7) << 8) | (reg_2894 & 0xf8ff); + } + + uint32_t TIMB() const + { + return (static_cast((reg_2894 >> 0) & 0xff) << 0); + } + void TIMB(const uint32_t v) + { + reg_2894 = (((v >> 0) & 0xff) << 0) | (reg_2894 & 0xff00); + } + + uint32_t TCCTL() const + { + return (static_cast((reg_2898 >> 8) & 0x7) << 0); + } + void TCCTL(const uint32_t v) + { + reg_2898 = (((v >> 0) & 0x7) << 8) | (reg_2898 & 0xf8ff); + } + + uint32_t TIMC() const + { + return (static_cast((reg_2898 >> 0) & 0xff) << 0); + } + void TIMC(const uint32_t v) + { + reg_2898 = (((v >> 0) & 0xff) << 0) | (reg_2898 & 0xff00); + } + + uint32_t SCIEB() const + { + return (static_cast((reg_289c >> 0) & 0x7ff) << 0); + } + void SCIEB(const uint32_t v) + { + reg_289c = (((v >> 0) & 0x7ff) << 0); + } + + uint32_t SCIPD() const + { + return (static_cast((reg_28a0 >> 0) & 0x7ff) << 0); + } + void SCIPD(const uint32_t v) + { + reg_28a0 = (((v >> 0) & 0x7ff) << 0); + } + + uint32_t SCIRE() const + { + return (static_cast((reg_28a4 >> 0) & 0x7ff) << 0); + } + void SCIRE(const uint32_t v) + { + reg_28a4 = (((v >> 0) & 0x7ff) << 0); + } + + uint32_t SCILV0() const + { + return (static_cast((reg_28a8 >> 0) & 0xff) << 0); + } + void SCILV0(const uint32_t v) + { + reg_28a8 = (((v >> 0) & 0xff) << 0); + } + + uint32_t SCILV1() const + { + return (static_cast((reg_28ac >> 0) & 0xff) << 0); + } + void SCILV1(const uint32_t v) + { + reg_28ac = (((v >> 0) & 0xff) << 0); + } + + uint32_t SCILV2() const + { + return (static_cast((reg_28b0 >> 0) & 0xff) << 0); + } + void SCILV2(const uint32_t v) + { + reg_28b0 = (((v >> 0) & 0xff) << 0); + } + + uint32_t MCIEB() const + { + return (static_cast((reg_28b4 >> 0) & 0x7ff) << 0); + } + void MCIEB(const uint32_t v) + { + reg_28b4 = (((v >> 0) & 0x7ff) << 0); + } + + uint32_t MCIPB() const + { + return (static_cast((reg_28b8 >> 0) & 0x7ff) << 0); + } + void MCIPB(const uint32_t v) + { + reg_28b8 = (((v >> 0) & 0x7ff) << 0); + } + + uint32_t MCIRE() const + { + return (static_cast((reg_28bc >> 0) & 0x7ff) << 0); + } + void MCIRE(const uint32_t v) + { + reg_28bc = (((v >> 0) & 0x7ff) << 0); + } + + uint32_t VREG() const + { + return (static_cast((reg_2c00 >> 8) & 0x3) << 0); + } + void VREG(const uint32_t v) + { + reg_2c00 = (((v >> 0) & 0x3) << 8) | (reg_2c00 & 0xfcff); + } + + uint32_t ARMRST() const + { + return (static_cast((reg_2c00 >> 0) & 0x1) << 0); + } + void ARMRST(const uint32_t v) + { + reg_2c00 = (((v >> 0) & 0x1) << 0) | (reg_2c00 & 0xfffe); + } + + uint32_t L7() const + { + return (static_cast((reg_2d00 >> 7) & 0x1) << 0); + } + void L7(const uint32_t v) + { + reg_2d00 = (((v >> 0) & 0x1) << 7) | (reg_2d00 & 0xff7f); + } + + uint32_t L6() const + { + return (static_cast((reg_2d00 >> 6) & 0x1) << 0); + } + void L6(const uint32_t v) + { + reg_2d00 = (((v >> 0) & 0x1) << 6) | (reg_2d00 & 0xffbf); + } + + uint32_t L5() const + { + return (static_cast((reg_2d00 >> 5) & 0x1) << 0); + } + void L5(const uint32_t v) + { + reg_2d00 = (((v >> 0) & 0x1) << 5) | (reg_2d00 & 0xffdf); + } + + uint32_t L4() const + { + return (static_cast((reg_2d00 >> 4) & 0x1) << 0); + } + void L4(const uint32_t v) + { + reg_2d00 = (((v >> 0) & 0x1) << 4) | (reg_2d00 & 0xffef); + } + + uint32_t L3() const + { + return (static_cast((reg_2d00 >> 3) & 0x1) << 0); + } + void L3(const uint32_t v) + { + reg_2d00 = (((v >> 0) & 0x1) << 3) | (reg_2d00 & 0xfff7); + } + + uint32_t L2() const + { + return (static_cast((reg_2d00 >> 2) & 0x1) << 0); + } + void L2(const uint32_t v) + { + reg_2d00 = (((v >> 0) & 0x1) << 2) | (reg_2d00 & 0xfffb); + } + + uint32_t L1() const + { + return (static_cast((reg_2d00 >> 1) & 0x1) << 0); + } + void L1(const uint32_t v) + { + reg_2d00 = (((v >> 0) & 0x1) << 1) | (reg_2d00 & 0xfffd); + } + + uint32_t L0() const + { + return (static_cast((reg_2d00 >> 0) & 0x1) << 0); + } + void L0(const uint32_t v) + { + reg_2d00 = (((v >> 0) & 0x1) << 0) | (reg_2d00 & 0xfffe); + } + + uint32_t RP() const + { + return (static_cast((reg_2d04 >> 8) & 0x1) << 0); + } + void RP(const uint32_t v) + { + reg_2d04 = (((v >> 0) & 0x1) << 8) | (reg_2d04 & 0xfeff); + } + + uint32_t M7() const + { + return (static_cast((reg_2d04 >> 7) & 0x1) << 0); + } + void M7(const uint32_t v) + { + reg_2d04 = (((v >> 0) & 0x1) << 7) | (reg_2d04 & 0xff7f); + } + + uint32_t M6() const + { + return (static_cast((reg_2d04 >> 6) & 0x1) << 0); + } + void M6(const uint32_t v) + { + reg_2d04 = (((v >> 0) & 0x1) << 6) | (reg_2d04 & 0xffbf); + } + + uint32_t M5() const + { + return (static_cast((reg_2d04 >> 5) & 0x1) << 0); + } + void M5(const uint32_t v) + { + reg_2d04 = (((v >> 0) & 0x1) << 5) | (reg_2d04 & 0xffdf); + } + + uint32_t M4() const + { + return (static_cast((reg_2d04 >> 4) & 0x1) << 0); + } + void M4(const uint32_t v) + { + reg_2d04 = (((v >> 0) & 0x1) << 4) | (reg_2d04 & 0xffef); + } + + uint32_t M3() const + { + return (static_cast((reg_2d04 >> 3) & 0x1) << 0); + } + void M3(const uint32_t v) + { + reg_2d04 = (((v >> 0) & 0x1) << 3) | (reg_2d04 & 0xfff7); + } + + uint32_t M2() const + { + return (static_cast((reg_2d04 >> 2) & 0x1) << 0); + } + void M2(const uint32_t v) + { + reg_2d04 = (((v >> 0) & 0x1) << 2) | (reg_2d04 & 0xfffb); + } + + uint32_t M1() const + { + return (static_cast((reg_2d04 >> 1) & 0x1) << 0); + } + void M1(const uint32_t v) + { + reg_2d04 = (((v >> 0) & 0x1) << 1) | (reg_2d04 & 0xfffd); + } + + uint32_t M0() const + { + return (static_cast((reg_2d04 >> 0) & 0x1) << 0); + } + void M0(const uint32_t v) + { + reg_2d04 = (((v >> 0) & 0x1) << 0) | (reg_2d04 & 0xfffe); + } + +}; + +static_assert((sizeof (aica_common)) == 0x2d08 - 0x2800); +static_assert((offsetof (aica_common, reg_2800)) == 0x2800 - 0x2800); +static_assert((offsetof (aica_common, reg_2804)) == 0x2804 - 0x2800); +static_assert((offsetof (aica_common, reg_2808)) == 0x2808 - 0x2800); +static_assert((offsetof (aica_common, reg_280c)) == 0x280c - 0x2800); +static_assert((offsetof (aica_common, reg_2810)) == 0x2810 - 0x2800); +static_assert((offsetof (aica_common, reg_2814)) == 0x2814 - 0x2800); +static_assert((offsetof (aica_common, reg_2880)) == 0x2880 - 0x2800); +static_assert((offsetof (aica_common, reg_2884)) == 0x2884 - 0x2800); +static_assert((offsetof (aica_common, reg_2888)) == 0x2888 - 0x2800); +static_assert((offsetof (aica_common, reg_288c)) == 0x288c - 0x2800); +static_assert((offsetof (aica_common, reg_2890)) == 0x2890 - 0x2800); +static_assert((offsetof (aica_common, reg_2894)) == 0x2894 - 0x2800); +static_assert((offsetof (aica_common, reg_2898)) == 0x2898 - 0x2800); +static_assert((offsetof (aica_common, reg_289c)) == 0x289c - 0x2800); +static_assert((offsetof (aica_common, reg_28a0)) == 0x28a0 - 0x2800); +static_assert((offsetof (aica_common, reg_28a4)) == 0x28a4 - 0x2800); +static_assert((offsetof (aica_common, reg_28a8)) == 0x28a8 - 0x2800); +static_assert((offsetof (aica_common, reg_28ac)) == 0x28ac - 0x2800); +static_assert((offsetof (aica_common, reg_28b0)) == 0x28b0 - 0x2800); +static_assert((offsetof (aica_common, reg_28b4)) == 0x28b4 - 0x2800); +static_assert((offsetof (aica_common, reg_28b8)) == 0x28b8 - 0x2800); +static_assert((offsetof (aica_common, reg_28bc)) == 0x28bc - 0x2800); +static_assert((offsetof (aica_common, reg_2c00)) == 0x2c00 - 0x2800); +static_assert((offsetof (aica_common, reg_2d00)) == 0x2d00 - 0x2800); +static_assert((offsetof (aica_common, reg_2d04)) == 0x2d04 - 0x2800); diff --git a/aica/aica_dsp_out.hpp b/aica/aica_dsp_out.hpp new file mode 100644 index 0000000..77dffa6 --- /dev/null +++ b/aica/aica_dsp_out.hpp @@ -0,0 +1,31 @@ +#include +#include + +#include "type.hpp" + +struct aica_dsp_out { + reg16 reg_0000; + const reg16 _pad0[1]; + + uint32_t EFDSL() const + { + return (static_cast((reg_0000 >> 8) & 0xf) << 0); + } + void EFDSL(const uint32_t v) + { + reg_0000 = (((v >> 0) & 0xf) << 8) | (reg_0000 & 0xf0ff); + } + + uint32_t EFPAN() const + { + return (static_cast((reg_0000 >> 0) & 0x1f) << 0); + } + void EFPAN(const uint32_t v) + { + reg_0000 = (((v >> 0) & 0x1f) << 0) | (reg_0000 & 0xffe0); + } + +}; + +static_assert((sizeof (aica_dsp_out)) == 0x4 - 0x0); +static_assert((offsetof (aica_dsp_out, reg_0000)) == 0x0 - 0x0); diff --git a/aica/aica_rtc.hpp b/aica/aica_rtc.hpp new file mode 100644 index 0000000..4c69d8b --- /dev/null +++ b/aica/aica_rtc.hpp @@ -0,0 +1,38 @@ +#include +#include + +#include "type.hpp" + +struct aica_rtc { + reg16 reg_0000; + const reg16 _pad0[1]; + reg16 reg_0004; + const reg16 _pad1[1]; + reg16 reg_0008; + const reg16 _pad2[1]; + + uint32_t RTC() const + { + return (static_cast((reg_0000 >> 0) & 0xffff) << 16) | (static_cast((reg_0004 >> 0) & 0xffff) << 0); + } + void RTC(const uint32_t v) + { + reg_0000 = (((v >> 16) & 0xffff) << 0); + reg_0004 = (((v >> 0) & 0xffff) << 0); + } + + uint32_t EN() const + { + return (static_cast((reg_0008 >> 0) & 0x1) << 0); + } + void EN(const uint32_t v) + { + reg_0008 = (((v >> 0) & 0x1) << 0); + } + +}; + +static_assert((sizeof (aica_rtc)) == 0xc - 0x0); +static_assert((offsetof (aica_rtc, reg_0000)) == 0x0 - 0x0); +static_assert((offsetof (aica_rtc, reg_0004)) == 0x4 - 0x0); +static_assert((offsetof (aica_rtc, reg_0008)) == 0x8 - 0x0); diff --git a/common.mk b/common.mk index 20f52e6..343e6c0 100644 --- a/common.mk +++ b/common.mk @@ -2,7 +2,7 @@ MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) DIR := $(dir $(MAKEFILE_PATH)) LIB ?= . -OPT ?= -O2 +OPT ?= -O0 DEBUG ?= -g -gdwarf-4 GENERATED ?= @@ -169,6 +169,18 @@ gdrom/gdrom_bits.hpp: regs/gdrom_bits.csv regs/gen/core_bits.py gdrom/command_packet_format.hpp: regs/gdrom_command_packet_format.csv regs/gen/gdrom_command_packet_format.py regs/gen/generic_sparse_struct.py python regs/gen/gdrom_command_packet_format.py $< gdrom_command_packet_format > $@ +aica/aica_channel.hpp: regs/aica_channel_data.csv regs/gen/aica.py + python regs/gen/aica.py $< aica_channel 0x80 > $@ + +aica/aica_common.hpp: regs/aica_common_data.csv regs/gen/aica.py + python regs/gen/aica.py $< aica_common > $@ + +aica/aica_rtc.hpp: regs/aica_rtc_data.csv regs/gen/aica.py + python regs/gen/aica.py $< aica_rtc > $@ + +aica/aica_dsp_out.hpp: regs/aica_dsp_out_data.csv regs/gen/aica.py + python regs/gen/aica.py $< aica_dsp_out > $@ + iso9660/%.hpp: iso9660/%.csv iso9660/byte_position.py python iso9660/byte_position.py $< > $@ diff --git a/regs/aica_channel_data.csv b/regs/aica_channel_data.csv new file mode 100644 index 0000000..1a0a6c1 --- /dev/null +++ b/regs/aica_channel_data.csv @@ -0,0 +1,42 @@ +"name","part","address","register_bits","argument_bits" +"KYONEX",,"0x0000","15", +"KYONB",,"0x0000","14", +"SSCTL",,"0x0000","10", +"LPCTL",,"0x0000","9", +"PCMS",,"0x0000","8-7", +"SA","0","0x0000","6-0","22-16" +"SA","1","0x0004","15-0", +"LSA",,"0x0008","15-0", +"LEA",,"0x000c","15-0", +"D2R",,"0x0010","15-11", +"D1R",,"0x0010","10-6", +"AR",,"0x0010","4-0", +"LPSLNK",,"0x0014","14", +"KRS",,"0x0014","13-10", +"DL",,"0x0014","9-5", +"RR",,"0x0014","4-0", +"OCT",,"0x0018","14-11", +"FNS",,"0x0018","9-0", +"LFORE",,"0x001c","15", +"LFOF",,"0x001c","14-10", +"PLFOWS",,"0x001c","9-8", +"PLFOS",,"0x001c","7-5", +"ALFOWS",,"0x001c","4-3", +"ALFOS",,"0x001c","2-0", +"IMXL",,"0x0020","7-4", +"ISEL",,"0x0020","3-0", +"DISDL",,"0x0024","11-8", +"DIPAN",,"0x0024","4-0", +"TL",,"0x0028","15-8", +"VOFF",,"0x0028","6", +"LPOFF",,"0x0028","5", +"Q",,"0x0028","4-0", +"FLV0",,"0x002c","12-0", +"FLV1",,"0x0030","12-0", +"FLV2",,"0x0034","12-0", +"FLV3",,"0x0038","12-0", +"FLV4",,"0x003c","12-0", +"FAR",,"0x0040","12-8", +"FD1R",,"0x0040","4-0", +"FD2R",,"0x0044","12-8", +"FRR",,"0x0044","4-0", diff --git a/regs/aica_channel_data.ods b/regs/aica_channel_data.ods index 62e5ea48e308d163551ce029836e5840df3bbb24..7add0c21fae7fbbcb8cfe670bf001cc56a0832f3 100644 GIT binary patch delta 18278 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 AX#fBK delta 16897 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 S+C4{VSLP!WNXjYdbt%%zm;Xd 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 RSY#8ZRavpq-~1K&{{Y8hJxTxo diff --git a/regs/aica_common_data.csv b/regs/aica_common_data.csv new file mode 100644 index 0000000..f9b3969 --- /dev/null +++ b/regs/aica_common_data.csv @@ -0,0 +1,66 @@ +"name","part","address","register_bits","argument_bits" +"MONO",,"0x2800","15", +"MEM8MB",,"0x2800","9", +"DAC18B",,"0x2800","8", +"VER",,"0x2800","7-4", +"MVOL",,"0x2800","3-0", +"TESTB0",,"0x2804","15", +"RBL",,"0x2804","14-13", +"RBP",,"0x2804","11-0","22-11" +"MOFUL",,"0x2808","12", +"MOEMP",,"0x2808","11", +"MIOVF",,"0x2808","10", +"MIFUL",,"0x2808","9", +"MIEMP",,"0x2808","8", +"MIBUF",,"0x2808","7-0", +"AFSET",,"0x280c","14", +"MSLC",,"0x280c","13-8", +"MOBUF",,"0x280c","7-0", +"LP",,"0x2810","15", +"SGC",,"0x2810","14", +"EG",,"0x2810","12-0", +"CA",,"0x2814","15-0", +"DMEA","0","0x2880","15-9","22-16" +"TSCD",,"0x2880","7-5", +"T",,"0x2880","4", +"MRWINH",,"0x2880","3-0", +"DMEA","1","0x2884","15-2","15-2" +"DGATE",,"0x2888","15", +"DRGA",,"0x2888","14-2","14-2" +"DDIR",,"0x288c","15", +"DLG",,"0x288c","14-2","14-2" +"DEXE",,"0x288c","0", +"TACTL",,"0x2890","10-8", +"TIMA",,"0x2890","7-0", +"TBCTL",,"0x2894","10-8", +"TIMB",,"0x2894","7-0", +"TCCTL",,"0x2898","10-8", +"TIMC",,"0x2898","7-0", +"SCIEB",,"0x289c","10-0", +"SCIPD",,"0x28a0","10-0", +"SCIRE",,"0x28a4","10-0", +"SCILV0",,"0x28a8","7-0", +"SCILV1",,"0x28ac","7-0", +"SCILV2",,"0x28b0","7-0", +"MCIEB",,"0x28b4","10-0", +"MCIPB",,"0x28b8","10-0", +"MCIRE",,"0x28bc","10-0", +"VREG",,"0x2c00","9-8", +"ARMRST",,"0x2c00","0", +"L7",,"0x2d00","7", +"L6",,"0x2d00","6", +"L5",,"0x2d00","5", +"L4",,"0x2d00","4", +"L3",,"0x2d00","3", +"L2",,"0x2d00","2", +"L1",,"0x2d00","1", +"L0",,"0x2d00","0", +"RP",,"0x2d04","8", +"M7",,"0x2d04","7", +"M6",,"0x2d04","6", +"M5",,"0x2d04","5", +"M4",,"0x2d04","4", +"M3",,"0x2d04","3", +"M2",,"0x2d04","2", +"M1",,"0x2d04","1", +"M0",,"0x2d04","0", diff --git a/regs/aica_common_data.ods b/regs/aica_common_data.ods index 5c51f67777566be1e3a8490b2539c545392c624e..8cb9e2d6826ecc144487d8a3908ebeef3718ca18 100644 GIT binary patch delta 19178 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 T%pL`QN&=J|HYiv)EC~DuP};_C delta 18066 zcmY(p1z1}_*ENb0Jh)46x1uey5Gd~M?(Pmjf)ptZ#i7NuxJz+|;!cAWcc*Z9zxV(C zdvBg6PfqqsPWH^6*=y}Jr=bYGDH|SBMII4}01gfS2bV9Dh^dBI;6wR8hHoF< z42dQJ|25Ml-Vy!h>Ij}T*%lt}f0}5M^WX{o*SPq9jj_s@$)fOp|2A-=004lu``7Cu zh{FHJl!-_IQH;;xCg`}+rtz*B9OOY_@0An1ZqQ`oXS*T7ed6#uT1w=Re>@wr_G-?O zV8HIU825J`RM{|AV)R4Vw6peR{=yR7BUjSk==In2m304a*P}{X2@{7nGgCYMQm``c z&?aF;i_eIqUgDF45C-_MEB;CGI6#7=hlySu7U;eV#o3w6W<_jUbN71xz`>|M_O(BotNkZZygTpFCI+S9Xc81UC!zdI} zuW01p4lycZXf0q)B{(ZA%kPsgPn+grYZ74_k;^IxoiT0kseJ$Gro8JU`B}d1U)Q*g z_lp+es|=!J>T{pbpA7$hp)1@CHeqSMp^=X^aPo`G+=Zc5Dxo}VgUrS%-p|Oql|r8_ zY}bRsO}X|fPy?^eJ<(Ggw)r^CyzcTHy@j8L>qR66e`rJdmfLHoWe?U%l*q%E>t5x% zlR8>KZb#0gF9<5~sDM{qfvr4vI5>GkIJo~Vl>Y`Y*$J5j;=UySgq#`wn$GBA8B8z$ zD7qyB-HHZAuv~17!#R4~n|2c=XvAOiupfxsMs%OuR1YOkWrQ#rPg+ui-}GtFGw z0#5Ae@;%uqJ@Jq@O2Kain%!7u;`NUYkInKTRP6$G!b`ai%qBg9@Y}C!*&p(&5@<#t z;zazsbmABgiNhH!xIjt$aVHoMnZ?;Yr-X1MZp=}R{J8wRCA$OZV8F*u8G=gO86N3&0$j`0|OFOM=7~=4#liNh?cX7 zaw1L$xe5v*d8eE3r@hgrp>Ovd7=i0i73yZFPx|_hJpwq8AtLnem9Vb*$JgY~UA^TaVifA&xCiTdz61(VeQE&Ux_&0SrfphK!+3E0aXi2l z>nWMNZ&ma7oRCo^Gq}CQIQVdwp)g#q>1a+YC7B}qvy@$Ytk2O%HIgrT>llk^N*>%K zG4(DiABdlJclnu?m2LydGDzERVm*#X)oe!radHiO6k&-yxw43{Usjhv|3QJvl@TTO z{byVc;qphbpUn076IXusOdSlQR|XgljA0p{z=c0~&L5m6EC)F+v&~4%|IBIzBYUqI z^k(RD@|7Go{J6B|Kbb@w6P$m&(2?HfERrWE7<2e2Dk`xh_0c{>Z9=5b zi7N#Jq28t9?n`Wtdpd)#hTUrIYN6p2=hR}I7E(-->>a@`qNskzpp=B9Kbo1p!%zE5 z<;#SFw=s@W&SKpKgs!RKnsRVD?ZFi>{vDgXGap?c2_tAtX2GACxMC#k(%&Zi3>P_mQ-FH8 z7CWxu+DW=r>8TvjKCKHI4X#e?>)?=QE zM^$c8ih|)fEGeb;%01}!b6A}WuU{+R@~lmM#)v7bQt4UH5Bvi-Uj0Dy5Fw6R_@Si6 z(>pnKls!&;|ozGKqcTYs0Ds)sl-&k2TEEzx`hCUvB4OOgSRMPq2zA{@0gJ!0ob=ZBnZ`55^Akvr`pxee z@5B9r$C&JM$XC^t&c~3|vFjL07En=uhy)Vpmi)KDDVd!M+b|*AciMd0j*gHS`4+pj z%a9FB_*=Y7w^2ZIoE^i2i@@B)?Pom_v>4+#u|#9Z^TGH?`*O;HY}d%Ga8_yd!*&PiOK!-00Tqo1&-lLLZNq%nuZmnjTO3 z?P?ry^PXGLk$2$9+0MtUHGFGBN_BBDu4?FOQ3Rd*phL5IS)A_O#lZ`NglE>r)Xp>h zoq%1(gxT9CpIyh8nWu9%rMZR3qOf&$E44?2T(FhA65P$eIN9~e5I`64F9jvF=9jN- zs2jR56uHtF}p{MRl{OQg$=ykLmIPPAd`&P8J3-8~mjQ0TB@XV?DWXuO#u=M}WOg zMRbYmM$P>CY>LmI0YrtzjKr8$JJ({PmMkTq*`8NB#-br}F+X zU`p5CB6(wwG}>HY4fTyw)m>r#kCt5SQ`|EU{)XtN^|8(7(zn|gbGw)kGH#k1PG>Mam?q)+ zpC;L{^mJt8>5gS==Td1KZJkEfp$e+Mhyxnb3Nak86jK0>>g&hXVMFS$G%BrVeZoY z*~+Ckm4#($X9GKO@WghC7 zXWo?NB8=eX>!SsKaH8Tdh^jru@+R~F>k4S;U1(XpV_p#bHrYciJNId$!|Rzb)4XbV zN&8q;PTpOv$E9Ui7=F(;(xI~GgHk9I1$P2HgG8{<*5iYX=h#oNN=&|A4?{0vY<8qJ z5R~Sygkq422%++Kab;SW?`jWU8<)7hXKVpzLJ3^3i<50LCgqfhn{znR(r(hG6{)iH zc&;K((ffbWihmzS`u3XeYLL7FqRrO~L#kIc) zy%8svXhK>#Z=*#MrENVqRR67_nc-YV-Y+$zABfI7 zg;TC)XH)Tqc&v}_{`&LJM}Lx0<#ZiRjdJGM=l_ZjBjZHXoM39G`iEw*IR0Q&l$hB+ z%3WJS#c{&_Vc&S;X3S_mGd6yY@-Id+rC?yP1nv(cr>K+SY^$Tv>JAz(^!{sSFlI3( z(NTT^TGY3mI^=isBOHy>v{5|7+}e;Ve<9(42dBZgt+lk-pj&!FFjmI4a*_xZM!^tZ zd=^V#7dUz&Mt`KueQ^0?-(4njt{Iebi#3O{5sPV&8e$0l##tC`~a-m!`%(?$=^<2Un6@{RAkk>+(x#Fp5S>qSVAJo^G!O5Gz>S_3{|+>~Uv*W+io zTaEMawmJlXma&|1l@{IfTMOt<71@52$;}1nm8Np*mscG=_|P=Qwt= zQI>Jk_&DB+WBGAxlnc;-^Tz)+u1kkoOK~Kt+xW8iVcHmN$t`TcpFg79Igs2Pv$#w} zxOn4vw^&F131a%^qk@L5(PEJKTeYoGeODnBFYci&+!B*H1yqK-UTki=X2RGwRQ1h zPTh;3wg`K>GQ|y-apyJfD*Mp=`}XvW47y8eXhm9p#$>5gitTqSx=2Imrbx>ebI&t) z!O&Y5KK8gl2uJ?X`IM$>w<;NR(Q2Eg!o=sq>QI8<_kT>*^{#sIFp| zL^5W;G%6@UnTk5xl0Fl{JkvR2!}ltdM!nk0k1Lw1-OVetJgXhz?#7iX36W~Z@P9uL z$?x~+b0YM$we5@x+aW)MA5;3a#%txPEUrJEFwN($J!`WadgDVk)i^x?Vw)Z!dk-{w z59;P$Z>&WUnxk;2zf&81$vN4uc8F_Et4y zBELuV55T|1&?<0|lPCJ8NHr?2EM5QZ!A6bIFs3?AS2fEVVR9u(8!rFd2Ep>&nTee- ztZdQ9%^!!COkTJb!L`0(r%_~DKyjs3GS_CO#*c~>(>@CUX3->+W9~kZE}kYwCjRC7 z9BRgHP5g!mXpVdi;)2IHsWh%h|MzaR?TSH!u;H&q{VAT!fSDww^=mze*3`!A$ieAf z!`2=)6Ni^TF}ZNAVx{sQ7)#y(ZJ|5IxH+5JEU>g#Ol=nz4j5dWaY2VpG04I~`)W20>b%Lv(} z8ibN=4%rpgdR#jruYP2PT1^-$=Gdp!rZp>Ra(txgXw2^02-WhqMLwm6gW5>rvE=)CMyxrKvvbZg@A#ZHTlojtuD*5 z=)B0LI(2>6WkTHTSH(*?lHrwJvToVqi_T+8%m4xW?5LHhEi?!D68)3YS>pZcD-k^Z zcPg1bM6SqCJ)LnZfhRmtNKJ?Rk5z7q38l1-KlwK`zLS-Jx z7ND1FO0=zBg(Q8>UuCp0$8>9~`sd;K0Y7as1A~)#vZIX0wOvbo_L@diM2x?TU$07w z!@o^0Iw~H6!>d}isYSPjdj9fgXnuLVIGRH_gQe;D^@}Zb=j14M#kRLny7kEGu{&a7 z>bbnyG=OF(ny8^|=fncr~H#rvDt75M}~_|2ZB z7V(!!iFX{KPK{r)^nVy5<|$zCJ2zp+lV@$6NwaV4^FoE8M|CtDL9)wKZX}IMlIAl0 zu*}RA=1aI5^M5eMOucD-(a2c#OSaE>&KD(c#kC=bUid|-H>&OuFR$K-je-lW{5z27 zg!oUIVUUkFn0X=87)~e(N+#>~>KY63;J@JBaqaeCt1tw#m_Qi7F6AvO11eBvV!AIwSOzKhCZn)ys8A`2uVdDe7k-x#h}9T z-a>2;>H=_gm;d6(&fOV;hCyUmH>mJ8y4TGlZy2J~gO%P+CkS$0eJn=FwN+QosZ_5oo)V7;Dq`7nGakL$jq>E$n^JM z99ARiZ>lV|bN^XygZ-wM!>qEzagbyy*cS2VVEvd z=Y4NzpuW#1((r)6o3HwD#D4}xwLNnvUIHMKjotYxas@k|#yYQmxI8%%I*l!K`-Gs> zKe#Y;Co)@YZ*!>Ux{Ev4DevYz;7c1aA_B2Hn7$5#vR86um}39I4>M#$kb7U8vQggW zU7}DM+*=u=S}C^5yy1)W$Ur9UQ!SjV@$qU&C(k<}>mAQ61;XAba%Xhs=Q*oCf;&f$ zGm}dFjMnPou0ji9+oN+9P`Cna{0-=mvwz#U63<-C`% z_y~LD(-%yIq>Fld@iR4|ZtYfB2V-&F7K{^{#rQeg6fK!r3o1o~&AgHj)fcj-Ta9uP z#~EEB)ELL}$d2M!#7*lgyCB{0VXhGZ%(WE~Zu^r|Ho(XV;p55bd8N)G$(t|{Qv9B1 zu_k_E3p=|~E^V%3Q)xe^^zLIE!skuzV_fX(%kJiYV1=NsP|m+t8o$4itIt~3yVd>r z(O(VBYJI0|eZ3m^iP;fs&lTjZ!uG^3wQu|%?hb1(t+YgfgPQ{VHy4rouOe)qGf^ov z)5Hk}_n$WjT(YTgXv2=c5-_<9M16XF z9W!4}C^~5X{bI>pnd+PswnZ5x29bBBL0d?>c@q+Q0M1azlgT_gM4+!i+U~=Hc`2WP zrRb%b$d7ZZr$uM0iu6x8$HtrEKlaZh9`;7}E0>=hPon)N(8BX_4)VI|QqP@UTKbLS zY4lzNg!~~8xVn8udZ=@Kgx}UTi9f0r;l+wO1nPg$x6L!8ub8SnRETiL^IY3-VCy~k zLZ4qwMKksp!22^;cAx+@PB0*^!D&K&6JtQp(C<8qAvgWwV<3_#>=DsvnYV`aWRfau2A4nAx^F!SoaLy z2uQWcf7e@3x0)VaB5sT^Kky1|M$6%prt}UiXjoZ*GZa@!iIA z=>P`myMkKU%ih|bv%W#PKKCmFgu%D`#8&+kwY4yPY$Lob`h1@WjG-Sg6zwVB-J8E9 zY`0+t9rj`fF~`k`ho6H(Cfh#Eh#5v3o<=J}_;t+>dzr>zV4+6CMZ#CspKGxfziSWr zHu!@_=AFV1X#&iX^ZnQ78%Un2Jovrdp>NVKeny>6NYM`MV}o6xd2Vxy z3a+N=804g5_L{mTvB5s+h3B=0N*Qb~@T$H3zeQpdvVGX2m^PNJwJz_=BX}wx z`s_yRj%FHXKi3@bHCSWv5)5c}e8?g*&P*;Smu%SBb1RAR!nR=&SB3F;e+0^T?h`NB zV5B}Wi?9OjEHcH$0q6_z+PDb(QH>7U2DhF%Kd0a{9UXx)#k7GOY~QRE)hMNtKmhpQ zV!H)N12UAN@{nIPK@@$svDztB38W#p?+l?+KBf#AH^)0b%C8+A*4WC zJ(iYi?^F~b8eK6;SK%vrk9#^`w`G`J%R&u1sHK`yw@9Z~Hu8eS%Cg3G#n(f8IZ+;D zR{FhhirqPhtUV|EF9!X#)QNCBb^SSF)>+wQOu zmhHl1M?H`sR$K(o?dyUdJ%GD7fK76;sBe`9eP00$!73n0O@&~4V z@EqbxGR2)+k-)s~W~GUP9-kp1gI1!{FCSy;o{9BChsNlx`d^xfKCN8(2G9aWC%J!N zvmYB8qdfJ8jZv7!+IGLTnk)SM>_=p}73~=$ClclF4HcWV`HnQSdKy2CJ46w6e>WN6 z0P~l$dZ=V6#ICZVc$eZX)gSh8JE%8fyI~gieLZ#Ryr&f6yD+qU{9y}X>-mQ;lSW2Y zpR&Y*>V!ka#DiIqk*u9~`w!8kFlRqsfa!KsQu9x%(?XrKtDtdp{f*<0_Pa6==Wl&= z+S3|VShx?L14ph38Ui`M{GJEjILrsI;WFJtDR!Tk-81i@wD;xHI>EQF%O-(9yT%EmsdO}6$8G)BD^iUu51b&gDo{dE_QrpdtO z42Wl1yJF@rJmvEKIN7>B<%QV08l8jX|CBkBv{STaN+6|nN0#6nYXIA!ZAn;5j^H|t z<`_B=zsLI=9)okb{UHk#jY$G_IjtTe*uK-UD~zHY_U>UNI3kAwLS(~7Fxnbh*U!p1UX4n3G0(El4*`sjJZR}tbf~%h7y>F}j zd3rXS<6XoXpR?tKi2M_dC7)pgsdPb-zmNuvoWtVR-NK?$#XVeNhPJMfD4^C&9a`Gs zF1=d=nUk`bqU%QqqKpK%Uy4Ox;df`q8e zK0LmbHb}66O<97K({WNA5oJ}BmzfxZhVC28CL9B79RaMCFp0xi-=Do}?j-Ria~E*^ zLtUK=8(OM3s_$>2ikCjz@4QF6DkB~q8kJNp?;vc!i)@;={_0}-BsffSc=CqfQYNmB*eZ8<(`iD#Ju z?SAYV4H8aJ2m&bPryvcISgemt5IXc{lnLZx2s z>g*~Tvr-WMyMkQE%|E*v3ABqrLysGI@$3$OAc7zH|K_%T_0ggnm25L1Ebh?A%mKbK*tE+dn+I~dW!rao~;9d1Ts2A3z2S=V7;P)>0WZn_#9xm z?`(Eegx?#78(%+b1AAZ4z-<#Wl8;PtITAj|;G`MC-ms@8`&<-C*qUQ#iu;sXzar$S zng};CUt0o#0Vs14m+?jg*D;C7`~}<8h=!m4LkIV4Wff3AlG3KOQ1aZVQ>npTPgcDf zOCjVDC=N#qG2Owy4mv=F;jvW9hnRCVfNp?DfECq{?XWFtJ^r_K>_u-`YOXYDuG~j- za1^Ha84~!>wqYo_B@+YCs#KkF_jNYpJOQ7(z_g`H9__4~?6eCWw6$~&d3g_DiDoF+ z!6b_3qA8TlRW8%n-UVwaS29A+QwjI`A?e0bm(@h7o8HIT64!cSGI8Ih52rxS28Lq8 z27AGD=xCq)U~ps?q>p^nryKmg+7B1g9rDCvUI+mrO;x#%^r8dUuK4sH63&l@h`pi> zM3KNt6{!3~&Jnm9Z&c;ej0r^d9!DhPV0hdI3F@#%cI80?WB7Nj5g7YRE!@-&f@)qW zTt}~S9_yntLOK8yYCqY1qJjc12>_}~dlbsmrKD{NC%Uo7nuNccySU#1<#Sy334!>@UYiyj&QkL8SBd(|1#ZY9 zn`gXKa3Eef`b`9|O^2_2aN9|uf8|&bp4i1&P{S#sF>!;i) z;_^^_LohHY2h|Jl-?<~NSRJXg0y~TFl?u(m{13UG=R?0Ez}jYRo(P)~4)C=go%8y4Z0wjEx`}w7NMV0_v@TA;k^TM_n+qZ7ZAbpO+2+^?*!0a zr`BRcB?R<%!I%J^zPGRnZcq2V@&GSi;wu>FcKCXyBsn)TW(5Rja6b?$bDa~PG;(?e`Gje6}O0!R4|LEpyu1(rrAmPdOC5p`)>Imx2sW-!tTT;rHoXb8FGVvq|lwIVBqAi-#S(zgXvecXZnxa z^p3l?a7wusJ?IbwGaSFEN>nJ^GorrRdgzC^wa}nHyM@$arT#%j+e{~X;urv!3zF%v z??O5=X6Y^tDp8j!_?wb*cqFYw<~{=ljpW*=ieIssxLrW@N2D<76xfVXHpBQk)cqF>^_ET+_o#|>^AzQVT=(!8@{Y&<9$yj(e+ZG z4LnE%67FZ4%HEep__6L>{x_SSC9M*>p;*kGc=~`nB1lAyUNR!t|EWd1?nUqVuvhYY zg~WowL$`wyh)45%gG=2<%3h>;z&OUp@Ebt2TJ@eZkf;U?ifQ;49>Bt2PJ+$;tQenw zfsa;NSQFk^Tx?6CCpJ86A$ZO?_JMTPIezp7;v{b_z9PLn{M6OWhw?kUy_AE_!hjc? zFX1nV(~;eAfcyO$pxYL6hA#dw_v?h>TZa15+kZPRx{}ZQGjbapvPfrPO1n5n!)r`G z+iTot4W(#RNJC4aRPi~PP4WWvPO@~6O8L-rkgkNketx}=6d%5>;a{spBa07Cc&#~y zjQ8>47Jgem0d4utxXS#J&makZI%)V_}P@~T>O<@SI$nuG|w}kzp*jMw!FHAJjt;sy1aA1IrQ@iT@ z6`y>!-t!C%l13S#21hSO%w0*4j7EVF>B#!P)|-Qz-fa`Tc_q4!^IPfu>JZ1$M9L$! z5!|^T-wLNFAC~0`x~nM~dUh2OpR`X-?)=uaY1L3vp^gBtqWa1QuXn9qOH-xV^o!gDr7Z1eN}Jj?vR+wGbSK}>vYD&%a>&c zNn0Av2xaK8CsSDDveAo%s%g_TBtA4jQMnoe5HfVqc;DcIHWq9N8FS~OlJoJ6*PmBw zL>x1zdMUt%M%B#Y%oOcQd=M*aNlo27>O;dBc(jydw{bS>6!)p3fyVow;{`1`NyOqQ zqv8dL+2#^MjY1+>r)zv|kU?wm1!(7whCPZsK30^aF>MV#WcPq^b9ky_QKA}rD8W|D z)c_yN@Aod_AMhLkCSq#V6}l>so-u-YL7?EOiOLb5NBt6g!9A9cnkeRY9} z2j1Ozk8b^%HloP{upO;)v-N&TI&@E>oY)$utJ;1+7jf89w|pUslmgOHM!WD|c4>0O z{n#zS7M|H@ONlSn+aUB+?Gd1nWsp0Wt$6G7V!686%?H`7oBD!A`i*9p_=4p&O=X^3 z9PmN!d_t$=KlnXpOt=vYTvrVf3<2I=9tN5+fB2rlB_8Dvtpr|=F{+}WZ|36Q#8>Dz zm}d+3(`R6$J{UdmZTi&83gk5u12oUpo>5Hb|7i#XZnmeGavkR)a|Na?QRzet6wP($ zsEmTOAx=|Q29;83CH}w}`$7Kq;==})^1|-K=zbj<3f~w_jnt}$4^%x<`;QlfF=qa$k?Ibye%>)hGC(a_+5LTt`E-%-=Vys zu=D9(bpL_*0A%nrPA4g7rcVY4E}uWnGe*_np1M+6i;2ZqPOWARnlu8wKv2McXet;Y zJ{qe<=TgR*?ab!5Lf%ig_ilzIH0!*@llN;1ZTf;6RW^5ARk}!={g}Oc;yrABW}geP zPg=?~b(M1NO+%kfQ|LF=MIA_EkqeDysSAfH=sqX?fMNYjn&^D~4G~iI6^=(s%Hh$v zTDYHE6^kn7)pwA7+Z7nUW#96f)IB9rX7X;U(%Gv2rAmAP6IY~SWb=KI^spoiLZWFX zyrc}#))J|t{GS7^-Q823dQ>r)vsQ@G&k;9bG1UaRBFOX6$juBLG*XNIE9s8f(!tWr zdO!PvwG~wISWEw5S8^2|!C;7_pJVV#-9k@}hwi3=?10!P*+2(6&Qrol_ znWK~JXe(11Ljdama4DGnZ5#LQmrF+t;eYnGsxa!~uNXMvdPbz_-xU{%bAogowAjy` z>!IxZtVW5qj|W0puUscjXq4+MrkVcJ3l^q$9OtP=0BAKQl5X?~IKai@^lmhCJ4WhK z*6(V`{1^BvL4$N#|Fk;#@`lB{F=6^0fd{y1da>{FtNsnlmwGS@CISN%Q!fxj!SpIl zO#?H80M+rWzeL^F0NfzRd>R`d-sozIIhFcH=YRZvOU>nIM2rJX`icnAXoA_)n_D%a zV81NMf|F=@hcon3P-q0BEjhI{I=k97VO&<6Awwn>PSc%On}|)}KJF zaw`yGLbStFU2Xg|pe)&9mW5c%b&Or1axm68-1-bdKokMI1fd%Gf64OreHJO`>J<^1 zEq0GXgJdiY_{G`&P$fsX%!PEx3|OZBmsytB*`$BTp^Kl%o;=(>l=Y8(z5 z^+JwNKukY<=GjF#IxqmW7^zt_&;H(yMQ<~kb02C1y!0p@{1EuO!oJ>#3`&Tbz1zNN zHo1Tb(Qh7%XNpIOT*AV;5kb#HP`ErjNV~g0rWUYnC!2C@J^%^C*_oDmT+`j@;k<19 zAGh*M+>mWQg#cY&pHdz-xD9wlCW#<5xX{=i<8!5N3(6o68GJ~K%EtrGNJ{>&+Pb!A zYlj34Bz<@4?(_Z;$$4yoEFNO@g08JG4G=*vAOa{eB` z{P<=I`3s)a41b+{Tm7B%Z!|FL#o1~Y##@QVIOn=2bixPSa^{@F+A11wCx?8K>AvE~ z$A@B;;thTBLER>wL41@pb&Qx#siwuiWj;`7f2aMpTCP7yx)!j?Uwq);CIx z#e;CP)7%$&!*5DJgqu$6&0jvqpdvQt+5OC&H-VtvRyjHtd97H|t82`AJX z0}}SWXY0%1*6a^)p-}ONNC?JGOl|$YH`t&Gh@uhcIA=SAgIRu&8pN<6J1L@k9`fWkXH(Y=Ds6LY)a;)!-C! z5U;Fu{J;?+=%q)LsWD!pIS39^nbi2nJr%K6Gf&`xT=ZUz95BKNnT)=lCcR;l@#2PU z;v3H(gO%9-4`F)shbhJbCnPWc8T<8sS9qvKk{?iOSjG2jd~LpgR0$Peiu>y&02_8D zCNt*l|F^wsyZkfKaeBi|e`8~Cf+WS@)mtHn3alGM#aoU;0V`!jXWGMq3WIGXJn-Ir zG|bvjcMrjycrzctgL<48=kg@(^?|g|<~nxytC;gPb|V}B+CX6D_gjKq2pmWlJzx{Z z*&wc{$hwmX$lJaY=i*HSa~2;yw9CII-;NtFahw1B-Vh&fQ1Y8fdCSg8Ovb-}spWutaC?oL2nv~jFS?uLJV>@^de>Aw_Q{*|d*l?=fwJp25 zn1x$ZL}Ldwu=j~xG~@@5c%3==6klZ3TfKGr3Alkt_Xd!$ueIkWP#Y>gvEjF>wi^NT zH7CZJq?Km!*vM1$?ly??Hv$+uq>*&%3e za>pwiNaQ?NY>v~mhSKYfLQf13XBzozD;|X@HA8S1{8ZMC-pvL4jR=-2$@@{C-|Y`n zqd{wzR*F$rL$v7UXvwU`xl`PmNx=pGPX!uJBYA({MNLw&>~Iz81_}tK0RQcBOuY_H zNQhn@&7Gos)~1ncAv;YA8aRQ>&mW7tjp^?{k86YgZS5;kD0^>uf7Y+9MnDZRw1ln2#d#9L*a`TZ@YG0?5aYK``k)Ho2G(XC}XkKaE|B)gw61~uhK|6p4 z9sE)kS4cSi*4xdXWGNQ)Uk(mY_CW;m;hczqv9l>JaiJdQ5U7{|V?y{AM%y*YuXg8O z^YCDVzZYNUXCSv|U*F0H4uEc$g@(vPn+gx$w)(b|s;z5v)$h$=*Aw%Q`J#wZ5!iK0 z@0*GPtRS5ROt^z2Wo|i*yRbQEkRmFA<1isw_rtxLA;4B!LV>jnoepf6XX@ZqD{IRS zIetn3j(rFla0`g3-(VOu%?iVp!CPLQ|H~RTFpNi#2HUwPtvY;*>Na;uOM9aadQq*{ z3sRe$d1?YUrPYar4Fzk6=;a-t0RE2FCY!3=-&;;6vN#rqvtXl`dxOt?wqS+o#cv!8 ztZf?qqyDb8L!~#bkdLVS7R9xH=PjCCOmDdmvN@zOmA0a4qgp+-)ff!?IBI4zqhQB| zehhmX*7%!vBciRPUJ(RxFWUE-M*ur<-3~8<-nOd@j9*z{Mc%x&9{s;sON10`bGB?N zwpzD&pu6Pr10BuID@OnnCZXN*LobA&-!=bSK9&Lg0AH5_8vU`MQA5fWX@z{W-j=6x^(gkyaxc5MWiCDNsx9Ui9e!|0j4Wg zHQ(vdmQp(3l}9`|-@cMUB?FX1+H9XpHnGb+Jx-qvVBt)un1t2j4Ic>Dwu@nEr4bh{ zcP6uMkiOluYDtb|d~-~7K>(pJy3gd!y$1q~^+M*pT0Vi(;F2VMrUXD>)bOBp9VIJ! zTN>$pT;c1JsKguIqr6Rw^XO2y29bIAa*aCUPlvcK@W3t4h1;UI1|Q~3UmxvvD?xuE zwK!u;Wo36tusT0bcS8)GRDpG_!2|D(Bj5)gYQwd6Z~Mnt14XuDHXwX0=u;jF)i}XG z&NQvH&4n6qyzXLlwsfx{q76>C3&m2l#gTcpt)*XxIP7_kUD}7W_tIiAb|pub=d}fy zMPs_KztvWp^QaY(u8Kw9#^^)7>r^RVkMy{_$9gb$t1%fT1%1iq*#nb0S0BwWoCga+ zE%qk>uwvb||Jf1{Qhg|-dFnZtW=GwUB~C$-31E8FJ?WmG5Hb$P0QrA+r$il!O+UI) z`-HfyZ3mjZbHV<>#@!G^C|H11nn)Lz61MCfg<^OJ*c?8lgEjV1N&v(iB?my0RY zsia;67#=4pF`ypylJ)((ZZ6Yyx^B%sM*%F*XT(N_nzn0pY|+39OhX#U!EMs1O8FAt z)JKy>_Mi7}|3hL%{=?_yqIPftu}w^-1l>H&FrsAPhL(!5PH!O-S8Xg7*oacWZhH}X zfj*)+ln)s&Y6wZN)s1O8NZCz2ZgB0e)0H*B)LRIY z0yUh8P3 ziC)ym*t~Y;1TZoRjIU)_FANRXgN$LGAqhA|wUyiHgRK4g2B!fAE)E~C@v#3L+65q> z(Y33J8Pe=Pi)z#so?mpj{1WV44LO@#7kD~C00|b=F4?|iD`(ZUfdpxJr+H_AFU@3szK@p#oHBc0FI(&mg?;CJbFk z`g76Y-&Kjk{-t~E`W-|-x0xB8tx$PQY>fAX`$gCB>O|H*`E2esREiOy-)3~I90+qe zxzvg}`4&R@90#}J{)erVpBGC+*S?K~puBEiUynz!--274}$@AY{wy^|p zSH;x&ZnDkbgfwE6L+S9Z7}kB_=`%X~!XXv9;i%UaQm{9E>Xz);)K4UcLZVqfqlPr% zK@^i-z32G5!&wXxwPtpR9#g}!iJ54@s`TZ1@4(gX@N}t3?v$L^ji!_*Z0PltJzR`2 zG*3`pB<##?nHpjPTRz<06nen|Luib$q$>9B3*PvM663vT_w@p0@w0Opbj)yo4^Myeius1h&*SSbRqTg9=?`y;J z#zeU4BDBvUP&R{sT00B|_-6!A-?iWDq@b<;9>P2qpLd&4zG2#6UYcz?IUF3;tE{BB zMmMiI+1P(+$u|0{x7ctI6;T!!^&=M2R(x2(+n0dhziI%sA(Hk?3@#fa5QW?wb*D7s zKi%B3y~xZ;ukZ@&W;F5aDci)N0@J8K>3%vH=mEr(XBxE_q71bQ1sKpJ`S=7HQJC>(PlW)Q#iy}&FB_lWP!-8v>M5ph zoz|~6B=J@kV?(pQOAj9}se-G>l0L05)3C_mszoc;g(e{3JHO9A7qxq&vNPhjLjZ5^c!VbCiQv5z zhv@z$UEVSc0aAkd1e!(d;OW$;Q!G$f+{>XZIYxHzR}SN3O2XzXQ{U1HpCm0z?2dp%$pPFICmk|66%&(1<*7bo&^exoD41em%L48+a`~H~iCDYrv`e z@|OKm_c!JinMJv9)0S1pz}F6#Y1UJ2+aG)J&=V9w&YphZZQF_niWZ(TpjXT!LllGD zuRofp=zk95@?UzVAwZI8nGy)KHcDbBFc-@LOSAXfBAuXIim;_b+Ny3Ood@^E%V@O% zdLCs?Iwp30Ve0!wL;wOue&Fr21t-`TG&RqfsQ+wGw5;4~;#)AyD%!ubd@SRM-<;Pn zh_JV|51tsMPfb@bGeWa>{$*vU1NnBr_qPd|Nt2+}$OYE>vPqsVO+2mo<86RFEi4|8_sh{3f?0vZ$hVbsOyy$ab4g4bH4?!y_)Ay#e#G zE(OdA#a#ERRZ-aRfCFbT$Cfr$Jyv8JU~r%BZiJuJ)$eViO|k807lr9oRdf2xUa#bT zZ&J^F&$~J8DPM~~u&8$X1@d!QWQZ>ve@j4n))H-$SF4~B>kqk!82pu#v)b=j9F@So zeh1?imZ0_a=tcfq)IfU^3B`UqpPdV7BXzRt0PJV(!i@3Y)k57}6>B zuiAj$P|Vo#XF7oC2Z})eL@zwHf~PmDHt+m6-Ra+5FwjdZFCw=4AEc8>`|U}83-u0g zL6{zU35Jg56M@-v)$8~z4CDgw+j=Gjp!GLm7VP(3sqgubZ_nk4%P`~-8<95d4^Cq* zdxybJMY0(I()CqLyFRWXwvYk^kLQ1f)?(6slRD9&qPs50{_2>ItzCKl*c9 z9BHFW*70wc6uNT!SfVqLPGiyJx7?=F0q-?lqW|6Njpj4?H|9BIhskwBSLfLZ$H$5{ zU)A@<|AFOvo9)M?=8Im}hnX9D6|M^f409H2E-!bB%UDl9lGiUt1?zsxT}j3#d;qGI zo&2epm}^{_5EbjnEU*-R@2lCgLtJI52qcRZh<9G!{F zd=X*O!^3Y{AEg!tIDFoluORijQuB;L@iume4U1~20ZjRbwWj0r?ul?3#GR%1=4$_} z@1WMVzjD%t;N1Vl>Aic-qp|R+FQ7FvzuNbM8i>n)jPgUAJDZGsRFeCTed|P>TXUK4 zAl&T%zvhQmbBePYOtGWPT=`?4(j?YSW{;+-_sD_ZQM>?;oiWUhWiKc(uK@6UiZ++k zzec-HJ+HB$OYb5MT?dmckj> z@}gZ6p7T}|Uf2Hnca(sP$`-DwXr{M`a+@*^PFO1+UE~Ebv($^23$yk!++I3`UKKv{ z8$wp3rZ|~)5j7A_QCKUA6E1~HQA>L&(vT9(uF~J5I9-Q1S08*51F&-=%E9JZ^)aBRUJEG8=!jNY+rCzZY-Dbq;z=4aQ9jN=e zv82hYq8116rL1K~rK%F9+h6h3{^E0*eo$i5+C`>7Sg9m5>HQG)wwKC|vTH)5hxEY2 zLYqF&OdhC~|5e(D4p3ItA(K{4Ld9`aDcVp08X&uYS+Y>A!fJiI+8ZHlxm~535DVya z&OdrU2reh7vXZZjcHjK1!5~wE!FeM%3kzOC(Nlu}P#Zb^Kuc#)=OhN$;FaYyO13of ziY_L3sO2yk>|q_dg!4=GFvQnMo$Fh0-FsV)o`_(9J+9W6f_G+5x$_iy_YC*Lnf>Cs ztRlwkvi3x8+m3f?a`x>Y3*Z9DDa5KlEfw}fh)JhwY*pSp^tCd%h&6Qc^rB(|WSlbr z)lzt=&f*umfOv4BBP^Quvllb}KB9ARYSqQBY{fZr^KZ-P21H(4m{gO3uHOMzFld8B zP{G4(!PzEk;}>>jfnNNgmq+g-Nd=@_Q&+)QI!X~T>U0%^P%+)QYkUYmmH_a}vx|e@ zMzZg{1a31+)%A2WW1{*riEpl4SxsPiF99-+N@5dgslAj;GdTb@OV~ZW6>|QQO%9(| zsPg>mI`O!f>rahN$H;%r#v#o$4*+oP9?hFb*@Yhj59K$BZuvhk8M&NW`d%)Yo%O3j@1k0IKy4m8NHjynpDN}x zoN+8uEK1+S0s3lmFE0hi)g;b(6M{Y=g6qTrGOzCMjcwUpKy-zPhN7q9!+Ws_xJ93x zK6lpMI}Zwyf|SD&c(D7XFUia=He+!}K}xA7@ZkG01Bl`!8{?&fRMaa0AcXx6#@Cy5 zu?U6G)Aj!^+)pw;-;sj2n4lzYM-6KCED4y%$T^~6}K`tcV`Azlq>Pp0tt?T}>@b&P1V>^_I(wqV}iN8ocEj=>_B>bg7-3UeS54!0 z;@_J7uk>O4IgU!MmWFo4PZ`WdK3Z4Xt^2T~{(#2a$9pFH+SxO~=&Mkix~KZxs~NK4KhBAHH#RnG+vFuS zrJ?ziSKY~aZT>T9VPg7W65ajxk6yKzB>2fEQ)k1ceG9fo0qgy~*I89((*0`^H2<(% z=RMt_P~dL2bK&}3Z7Caq3Y^oQpDg{}BXDzhb>{=;@M&*OOkQoUL*lD=_jAh`UcC-k zU0VBoRYW{|vvbasNrFPrsgDJ}9+`df>oZ@=_ab#I({h}StJObV?6th3hsXDxjW>`YWXzA#G9ob`%z za*D+!6Q4bgI15aNAJ*=f`-QK_a_+7{AH~%jMDHD2sRr$&BO@H|t1rmDi9_!!!je~Pdw)2DfpI6^r_$?n2 z-alc!?mu9Zoyy!1{_&e+x4hJ`bd}jlKLgDP*Zo&@;nCOTd*3-umc15Sr1LL2`md$3 z%8E6MI^NV=e)VvfyT>Kw^a$&kJt-f{d)@!Y^8H%r-m%@kU%>DK|K!)_B^B$$Po=$_ z{o?L&ImO3(Co`@$TUpC~Dej+8P!IHM@U+Ole{0)+87i}Qp7;^8xnzU5*Mk%5*JQop z)B5}AlG&53p=aCW6yNIEIsA-LPfb{FE|)J#Ge$pSQsE|^keqMS^36JeOGnn zzO9x^{-|b^30$Sa``BLT$7YAE!mIK?yGcD={an^LB{U%&O2KHc`Jzt=_;?X_KNHX? zBl`kmCeQQ}nfxw5L>Y3P3F=-{d5}qP&^K|p3J)Wb2m@^G`{Y_b8OGBS^W{-RL8eyt zi%$H(J2}9g3uI44fDEJUVzJ*!4YV|xxgYO0(>6FWY0j|2oMi>$1OM9A0S3DD-h@Bm89mC zfVSBNctiXJF)bzndFv5qLoNc$ntU!$G74lk@|FM|gaROI4={j=Q%g!R^U}eacwwf) nf*5tj0J7F-N#OngHBcyJ2FWnFdrW@lBR+XvkO13mPmnSI@NpJ8 diff --git a/regs/aica_dsp_out_data.csv b/regs/aica_dsp_out_data.csv new file mode 100644 index 0000000..aabf8fd --- /dev/null +++ b/regs/aica_dsp_out_data.csv @@ -0,0 +1,3 @@ +"name","part","address","register_bits","argument_bits" +"EFDSL",,"0x0000","11-8", +"EFPAN",,"0x0000","4-0", diff --git a/regs/aica_dsp_out_data.ods b/regs/aica_dsp_out_data.ods new file mode 100644 index 0000000000000000000000000000000000000000..00e54cc02065a5989fbff9a36aa6bd1dae577440 GIT binary patch literal 10313 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 literal 0 HcmV?d00001 diff --git a/regs/aica_rtc_data.csv b/regs/aica_rtc_data.csv new file mode 100644 index 0000000..92e55b6 --- /dev/null +++ b/regs/aica_rtc_data.csv @@ -0,0 +1,4 @@ +"name","part","address","register_bits","argument_bits" +"RTC","0","0x0000","15-0","31-16" +"RTC","1","0x0004","15-0","15-0" +"EN",,"0x0008","0", diff --git a/regs/aica_rtc_data.ods b/regs/aica_rtc_data.ods index 8a02ab6be54109a4e7f642b71f364b66611bc1ee..05827ab2f888f6887a1ce8c712175beb5da3e90c 100644 GIT binary patch delta 8799 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 SVZ=G)gzfV1;5%^t0sRM}>oP$A delta 8156 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 end, s + return start, end + else: + start = int(s, 10) + return start, start + +def slice_bits(s): + start, end = s + return set(range(start, end+1)) + +def parse_row(row): + address = int(row["address"], 16) + name = row["name"] + part_index0 = row["part"].strip() + part_index = int(part_index0, 10) if part_index0 else 0 + + register_bits = parse_slice(row["register_bits"]) + if row["argument_bits"].strip(): + argument_bits = parse_slice(row["argument_bits"]) + assert len(slice_bits(argument_bits)) == len(slice_bits(register_bits)), row + else: + start, end = register_bits + argument_bits = (start - end, 0) + + part = Part( + part_index, + address, + register_bits, + argument_bits, + ) + return name, part + +def group_parts(rows, address_increment): + by_name: dict[str, Register] = {} + register_bit_alloc: dict[int, set[int]] = defaultdict(set) + argument_bit_alloc: dict[str, set[int]] = defaultdict(set) + register_order = [] + addresses = [] + last_address = 0 + + for row in rows: + name, part = parse_row(row) + assert part.address >= last_address, row + assert part.address % address_increment == 0, row + last_address = part.address + if part.address not in set(a[0] for a in addresses): + addresses.append((part.address, [name])) + else: + assert addresses[-1][0] == part.address + addresses[-1][1].append(name) + + bits = slice_bits(part.register_bits) + assert bits.intersection(register_bit_alloc[part.address]) == set(), row + register_bit_alloc[part.address] |= bits + + bits = slice_bits(part.argument_bits) + assert bits.intersection(argument_bit_alloc[name]) == set(), row + argument_bit_alloc[part.address] |= bits + + if name not in by_name: + assert part.index == 0, row + register = Register(name, [part]) + by_name[name] = register + register_order.append(register) + else: + assert len(by_name[name].parts) == part.index + by_name[name].parts.append(part) + + return addresses, register_order + +def format_reg(address): + return f"reg_{address:04x}" + +def render_struct_fields(struct_size, addresses, address_increment, c_type, c_type_size): + assert address_increment >= c_type_size + assert address_increment % c_type_size == 0 + next_address = None + pad_index = 0 + for address, _ in addresses: + if next_address is None: + next_address = address + if address != next_address: + assert address > next_address, (address, next_address) + padding = (address - next_address) // c_type_size + yield f"const {c_type} _pad{pad_index}[{padding}];" + pad_index += 1 + + yield f"{c_type} {format_reg(address)};" + if c_type_size < address_increment: + padding = (address_increment - c_type_size) // c_type_size + yield f"const {c_type} _pad{pad_index}[{padding}];" + pad_index += 1 + next_address = address + address_increment + + if struct_size is not None: + assert struct_size % address_increment == 0 + assert struct_size >= next_address + if struct_size > next_address: + padding = (struct_size - next_address) // c_type_size + yield f"const {c_type} _pad{pad_index}[{padding}];" + +def render_struct_static_assertions(struct_name, struct_size, addresses, address_increment): + first_address = addresses[0][0] + last_address = addresses[-1][0] + if struct_size is None: + struct_size = last_address + address_increment + yield f"static_assert((sizeof ({struct_name})) == {hex(struct_size)} - {hex(first_address)});" + for address, _ in addresses: + yield f"static_assert((offsetof ({struct_name}, {format_reg(address)})) == {hex(address)} - {hex(first_address)});" + +def mask_from_bits(bit_slice): + h, l = bit_slice + mask = 2 ** ((h - l) + 1) - 1 + return mask + +def part_get_expression(part): + _, reg_end = part.register_bits + _, arg_end = part.argument_bits + arg_mask = mask_from_bits(part.argument_bits) + return f"(static_cast(({format_reg(part.address)} >> {reg_end}) & {hex(arg_mask)}) << {arg_end})" + +def part_set_statement(addresses_dict, c_type_size, part): + _, reg_end = part.register_bits + _, arg_end = part.argument_bits + arg_mask = mask_from_bits(part.argument_bits) + assignment = f"{format_reg(part.address)} = (((v >> {arg_end}) & {hex(arg_mask)}) << {reg_end})" + if len(addresses_dict[part.address]) > 1: + reg_mask = mask_from_bits(part.register_bits) << reg_end + inverse_mask = (~reg_mask) & ((2 ** (c_type_size * 8)) - 1) + assignment += f" | ({format_reg(part.address)} & {hex(inverse_mask)});" + else: + assignment += ";" + return assignment + +def render_struct_accessors(addresses_dict, c_type, c_type_size, registers): + for register in registers: + yield f"uint32_t {register.name}() const" + yield "{" + get_expression = " | ".join(map(part_get_expression, register.parts)) + yield f"return {get_expression};" + yield "}" + yield f"void {register.name}(const uint32_t v)" + yield "{" + for part in register.parts: + yield part_set_statement(addresses_dict, c_type_size, part) + yield "}" + yield "" + +def render_struct(struct_name, struct_size, addresses, address_increment, c_type, c_type_size, registers): + yield f"struct {struct_name} {{" + yield from render_struct_fields(struct_size, addresses, address_increment, c_type, c_type_size) + yield "" + addresses_dict = dict(addresses) + yield from render_struct_accessors(addresses_dict, c_type, c_type_size, registers) + yield "};" + yield from render_struct_static_assertions(struct_name, struct_size, addresses, address_increment) + +def header(): + yield "#include " + yield "#include " + yield "" + yield '#include "type.hpp"' + yield "" + +if __name__ == "__main__": + input_file = sys.argv[1] + struct_name = sys.argv[2] + struct_size = int(sys.argv[3], 16) if len(sys.argv) > 3 else None + rows = read_input(input_file) + address_increment = 4 + c_type = "reg16" + c_type_size = 2 + addresses, registers = group_parts(rows, address_increment) + render, out = renderer() + render(header()) + render(render_struct(struct_name, struct_size, addresses, address_increment, c_type, c_type_size, registers)) + sys.stdout.write(out.getvalue()) diff --git a/regs/gen/sh7091.py b/regs/gen/sh7091.py index 1374d7f..ec64379 100644 --- a/regs/gen/sh7091.py +++ b/regs/gen/sh7091.py @@ -1,26 +1,7 @@ -import csv import sys -from functools import partial -from pprint import pprint from generate import renderer - -def as_dict(header, row0): - row = [s.strip() for s in row0] - return dict(zip(header, row)) - -def read_input(filename): - with open(filename) as f: - reader = csv.reader(f, delimiter=",", quotechar='"') - header, *rows = reader - - rows = [ - as_dict(header, row) - for row in rows - if "".join(map(str, row)).strip() - ] - - return rows +from csv_input import read_input def size_p(size): return size in {1, 2, 4} diff --git a/vga.cpp b/vga.cpp index a5af9ad..aab1450 100644 --- a/vga.cpp +++ b/vga.cpp @@ -4,7 +4,7 @@ #include "sh7091/sh7091_bits.hpp" #include "holly/holly.hpp" #include "holly/core_bits.hpp" -#include "aica.hpp" +#include "aica/aica.hpp" #include "memorymap.hpp" #include "vga.hpp" @@ -90,10 +90,8 @@ void vga2() | fb_r_ctrl::fb_depth::_0565_rgb_16bit | fb_r_ctrl::fb_enable; -#define DVE_OUTPUT_MODE (&aica[0x2c00]) #define DVE_OUTPUT_MODE__VGA (0b00 << 0) - *DVE_OUTPUT_MODE = DVE_OUTPUT_MODE__VGA; -#undef DVE_OUTPUT_MODE + aica.common.VREG(DVE_OUTPUT_MODE__VGA); #undef DVE_OUTPUT_MODE__VGA }