From 73a685faceb6a4b239e6b748160d19ace4fc6509 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Fri, 1 Mar 2024 15:25:49 +0800 Subject: [PATCH] aica: use SCIPD to detect TIMA overflow Real hardware does not support TIMA reads--SCIPD is the correct way to achieve this. --- addresses.lds | 2 +- aica/aica.hpp | 14 +- aica/aica_channel.hpp | 170 ++++++++++++++++++++--- aica/aica_common.hpp | 275 +++++++++++++++++++++++++++++-------- aica/aica_dsp_out.hpp | 12 +- aica/aica_rtc.hpp | 27 +++- example/aica.cpp | 30 ++-- example/aica_gdrom.cpp | 62 +++++++++ example/arm/addresses.lds | 2 +- example/arm/channel.cpp | 55 ++++---- regs/aica_channel_data.csv | 84 +++++------ regs/aica_channel_data.ods | Bin 20039 -> 20159 bytes regs/aica_common_data.csv | 132 +++++++++--------- regs/aica_common_data.ods | Bin 21172 -> 21345 bytes regs/aica_dsp_out_data.csv | 6 +- regs/aica_dsp_out_data.ods | Bin 10313 -> 10701 bytes regs/aica_rtc_data.csv | 8 +- regs/aica_rtc_data.ods | Bin 10975 -> 11013 bytes regs/gen/aica.py | 85 +++++++++--- 19 files changed, 707 insertions(+), 257 deletions(-) create mode 100644 example/aica_gdrom.cpp diff --git a/addresses.lds b/addresses.lds index c5115e7..fb645f9 100644 --- a/addresses.lds +++ b/addresses.lds @@ -8,7 +8,7 @@ g2_if = 0xa05f7800; pvr_if = 0xa05f7c00; holly = 0xa05f8000; modem = 0xa0600000; -aica = 0xa0700000; +aica_sound = 0xa0700000; aica_rtc = 0xa0710000; system_boot_rom = 0xa0000000; diff --git a/aica/aica.hpp b/aica/aica.hpp index 463ed85..915264b 100644 --- a/aica/aica.hpp +++ b/aica/aica.hpp @@ -1,3 +1,5 @@ +#pragma once + #include #include @@ -8,7 +10,7 @@ #include "aica_common.hpp" #include "aica_rtc.hpp" -struct aica_reg { +struct aica_sound { // 0x00700000 [64] channel data start // 0x00702000 [64] channel data end // 0x00702000 [18] dsp out start @@ -22,10 +24,10 @@ struct aica_reg { 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); +static_assert((sizeof (struct aica_sound)) == 0x2d08); +static_assert((offsetof (struct aica_sound, channel)) == 0); +static_assert((offsetof (struct aica_sound, dsp_out)) == 0x2000); +static_assert((offsetof (struct aica_sound, common)) == 0x2800); -extern struct aica_reg aica __asm("aica"); +extern struct aica_sound aica_sound __asm("aica_sound"); extern struct aica_rtc aica_rtc __asm("aica_rtc"); diff --git a/aica/aica_channel.hpp b/aica/aica_channel.hpp index 36af3e0..cf38ec6 100644 --- a/aica/aica_channel.hpp +++ b/aica/aica_channel.hpp @@ -4,24 +4,78 @@ #include "type.hpp" struct aica_channel { - reg32 reg_0000; - reg32 reg_0004; - reg32 reg_0008; - reg32 reg_000c; - reg32 reg_0010; - reg32 reg_0014; - reg32 reg_0018; - reg32 reg_001c; - reg32 reg_0020; - reg32 reg_0024; - reg32 reg_0028; - reg32 reg_002c; - reg32 reg_0030; - reg32 reg_0034; - reg32 reg_0038; - reg32 reg_003c; - reg32 reg_0040; - reg32 reg_0044; + union { + reg32 reg_0000; + reg32 kyonex_kyonb_ssctl_lpctl_pcms_sa0; + }; + union { + reg32 reg_0004; + reg32 sa1; + }; + union { + reg32 reg_0008; + reg32 lsa; + }; + union { + reg32 reg_000c; + reg32 lea; + }; + union { + reg32 reg_0010; + reg32 d2r_d1r_ar; + }; + union { + reg32 reg_0014; + reg32 lpslnk_krs_dl_rr; + }; + union { + reg32 reg_0018; + reg32 oct_fns; + }; + union { + reg32 reg_001c; + reg32 lfore_lfof_plfows_plfos_alfows_alfos; + }; + union { + reg32 reg_0020; + reg32 imxl_isel; + }; + union { + reg32 reg_0024; + reg32 disdl_dipan; + }; + union { + reg32 reg_0028; + reg32 tl_voff_lpoff_q; + }; + union { + reg32 reg_002c; + reg32 flv0; + }; + union { + reg32 reg_0030; + reg32 flv1; + }; + union { + reg32 reg_0034; + reg32 flv2; + }; + union { + reg32 reg_0038; + reg32 flv3; + }; + union { + reg32 reg_003c; + reg32 flv4; + }; + union { + reg32 reg_0040; + reg32 far_fd1r; + }; + union { + reg32 reg_0044; + reg32 fd2r_frr; + }; const reg32 _pad0[14]; uint32_t KYONEX() const @@ -406,3 +460,83 @@ 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); + +namespace aica { + namespace kyonex_kyonb_ssctl_lpctl_pcms_sa0 { + constexpr uint32_t KYONEX(const uint32_t v) { return (((v >> 0) & 0x1) << 15); } + constexpr uint32_t KYONB(const uint32_t v) { return (((v >> 0) & 0x1) << 14); } + constexpr uint32_t SSCTL(const uint32_t v) { return (((v >> 0) & 0x1) << 10); } + constexpr uint32_t LPCTL(const uint32_t v) { return (((v >> 0) & 0x1) << 9); } + constexpr uint32_t PCMS(const uint32_t v) { return (((v >> 0) & 0x3) << 7); } + constexpr uint32_t SA(const uint32_t v) { return (((v >> 16) & 0x7f) << 0); } + } + namespace sa1 { + constexpr uint32_t SA(const uint32_t v) { return (((v >> 0) & 0xffff) << 0); } + } + namespace lsa { + constexpr uint32_t LSA(const uint32_t v) { return (((v >> 0) & 0xffff) << 0); } + } + namespace lea { + constexpr uint32_t LEA(const uint32_t v) { return (((v >> 0) & 0xffff) << 0); } + } + namespace d2r_d1r_ar { + constexpr uint32_t D2R(const uint32_t v) { return (((v >> 0) & 0x1f) << 11); } + constexpr uint32_t D1R(const uint32_t v) { return (((v >> 0) & 0x1f) << 6); } + constexpr uint32_t AR(const uint32_t v) { return (((v >> 0) & 0x1f) << 0); } + } + namespace lpslnk_krs_dl_rr { + constexpr uint32_t LPSLNK(const uint32_t v) { return (((v >> 0) & 0x1) << 14); } + constexpr uint32_t KRS(const uint32_t v) { return (((v >> 0) & 0xf) << 10); } + constexpr uint32_t DL(const uint32_t v) { return (((v >> 0) & 0x1f) << 5); } + constexpr uint32_t RR(const uint32_t v) { return (((v >> 0) & 0x1f) << 0); } + } + namespace oct_fns { + constexpr uint32_t OCT(const uint32_t v) { return (((v >> 0) & 0xf) << 11); } + constexpr uint32_t FNS(const uint32_t v) { return (((v >> 0) & 0x3ff) << 0); } + } + namespace lfore_lfof_plfows_plfos_alfows_alfos { + constexpr uint32_t LFORE(const uint32_t v) { return (((v >> 0) & 0x1) << 15); } + constexpr uint32_t LFOF(const uint32_t v) { return (((v >> 0) & 0x1f) << 10); } + constexpr uint32_t PLFOWS(const uint32_t v) { return (((v >> 0) & 0x3) << 8); } + constexpr uint32_t PLFOS(const uint32_t v) { return (((v >> 0) & 0x7) << 5); } + constexpr uint32_t ALFOWS(const uint32_t v) { return (((v >> 0) & 0x3) << 3); } + constexpr uint32_t ALFOS(const uint32_t v) { return (((v >> 0) & 0x7) << 0); } + } + namespace imxl_isel { + constexpr uint32_t IMXL(const uint32_t v) { return (((v >> 0) & 0xf) << 4); } + constexpr uint32_t ISEL(const uint32_t v) { return (((v >> 0) & 0xf) << 0); } + } + namespace disdl_dipan { + constexpr uint32_t DISDL(const uint32_t v) { return (((v >> 0) & 0xf) << 8); } + constexpr uint32_t DIPAN(const uint32_t v) { return (((v >> 0) & 0x1f) << 0); } + } + namespace tl_voff_lpoff_q { + constexpr uint32_t TL(const uint32_t v) { return (((v >> 0) & 0xff) << 8); } + constexpr uint32_t VOFF(const uint32_t v) { return (((v >> 0) & 0x1) << 6); } + constexpr uint32_t LPOFF(const uint32_t v) { return (((v >> 0) & 0x1) << 5); } + constexpr uint32_t Q(const uint32_t v) { return (((v >> 0) & 0x1f) << 0); } + } + namespace flv0 { + constexpr uint32_t FLV0(const uint32_t v) { return (((v >> 0) & 0x1fff) << 0); } + } + namespace flv1 { + constexpr uint32_t FLV1(const uint32_t v) { return (((v >> 0) & 0x1fff) << 0); } + } + namespace flv2 { + constexpr uint32_t FLV2(const uint32_t v) { return (((v >> 0) & 0x1fff) << 0); } + } + namespace flv3 { + constexpr uint32_t FLV3(const uint32_t v) { return (((v >> 0) & 0x1fff) << 0); } + } + namespace flv4 { + constexpr uint32_t FLV4(const uint32_t v) { return (((v >> 0) & 0x1fff) << 0); } + } + namespace far_fd1r { + constexpr uint32_t FAR(const uint32_t v) { return (((v >> 0) & 0x1f) << 8); } + constexpr uint32_t FD1R(const uint32_t v) { return (((v >> 0) & 0x1f) << 0); } + } + namespace fd2r_frr { + constexpr uint32_t FD2R(const uint32_t v) { return (((v >> 0) & 0x1f) << 8); } + constexpr uint32_t FRR(const uint32_t v) { return (((v >> 0) & 0x1f) << 0); } + } +} diff --git a/aica/aica_common.hpp b/aica/aica_common.hpp index ac38b2a..fb144b3 100644 --- a/aica/aica_common.hpp +++ b/aica/aica_common.hpp @@ -4,34 +4,109 @@ #include "type.hpp" struct aica_common { - reg32 reg_2800; - reg32 reg_2804; - reg32 reg_2808; - reg32 reg_280c; - reg32 reg_2810; - reg32 reg_2814; + union { + reg32 reg_2800; + reg32 mono_mem8mb_dac18b_ver_mvol; + }; + union { + reg32 reg_2804; + reg32 rbl_rbp; + }; + union { + reg32 reg_2808; + reg32 moful_moemp_miovf_miful_miemp_mibuf; + }; + union { + reg32 reg_280c; + reg32 afsel_mslc_mobuf; + }; + union { + reg32 reg_2810; + reg32 lp_sgc_eg; + }; + union { + reg32 reg_2814; + reg32 ca; + }; const reg32 _pad0[26]; - reg32 reg_2880; - reg32 reg_2884; - reg32 reg_2888; - reg32 reg_288c; - reg32 reg_2890; - reg32 reg_2894; - reg32 reg_2898; - reg32 reg_289c; - reg32 reg_28a0; - reg32 reg_28a4; - reg32 reg_28a8; - reg32 reg_28ac; - reg32 reg_28b0; - reg32 reg_28b4; - reg32 reg_28b8; - reg32 reg_28bc; + union { + reg32 reg_2880; + reg32 dmea0_mrwinh; + }; + union { + reg32 reg_2884; + reg32 dmea1; + }; + union { + reg32 reg_2888; + reg32 dgate_drga; + }; + union { + reg32 reg_288c; + reg32 ddir_dlg_dexe; + }; + union { + reg32 reg_2890; + reg32 tactl_tima; + }; + union { + reg32 reg_2894; + reg32 tbctl_timb; + }; + union { + reg32 reg_2898; + reg32 tcctl_timc; + }; + union { + reg32 reg_289c; + reg32 scieb; + }; + union { + reg32 reg_28a0; + reg32 scipd; + }; + union { + reg32 reg_28a4; + reg32 scire; + }; + union { + reg32 reg_28a8; + reg32 scilv0; + }; + union { + reg32 reg_28ac; + reg32 scilv1; + }; + union { + reg32 reg_28b0; + reg32 scilv2; + }; + union { + reg32 reg_28b4; + reg32 mcieb; + }; + union { + reg32 reg_28b8; + reg32 mcipd; + }; + union { + reg32 reg_28bc; + reg32 mcire; + }; const reg32 _pad1[208]; - reg32 reg_2c00; + union { + reg32 reg_2c00; + reg32 vreg_armrst; + }; const reg32 _pad2[63]; - reg32 reg_2d00; - reg32 reg_2d04; + union { + reg32 reg_2d00; + reg32 l7_l6_l5_l4_l3_l2_l1_l0; + }; + union { + reg32 reg_2d04; + reg32 rp_m7_m6_m5_m4_m3_m2_m1_m0; + }; uint32_t MONO() const { @@ -78,15 +153,6 @@ struct aica_common { 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); @@ -159,11 +225,11 @@ struct aica_common { reg_2808 = (((v >> 0) & 0xff) << 0) | (reg_2808 & 0xff00); } - uint32_t AFSET() const + uint32_t AFSEL() const { return (static_cast((reg_280c >> 14) & 0x1) << 0); } - void AFSET(const uint32_t v) + void AFSEL(const uint32_t v) { reg_280c = (((v >> 0) & 0x1) << 14) | (reg_280c & 0xbfff); } @@ -232,24 +298,6 @@ struct aica_common { 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); @@ -421,11 +469,11 @@ struct aica_common { reg_28b4 = (((v >> 0) & 0x7ff) << 0); } - uint32_t MCIPB() const + uint32_t MCIPD() const { return (static_cast((reg_28b8 >> 0) & 0x7ff) << 0); } - void MCIPB(const uint32_t v) + void MCIPD(const uint32_t v) { reg_28b8 = (((v >> 0) & 0x7ff) << 0); } @@ -638,3 +686,118 @@ 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); + +namespace aica { + namespace mono_mem8mb_dac18b_ver_mvol { + constexpr uint32_t MONO(const uint32_t v) { return (((v >> 0) & 0x1) << 15); } + constexpr uint32_t MEM8MB(const uint32_t v) { return (((v >> 0) & 0x1) << 9); } + constexpr uint32_t DAC18B(const uint32_t v) { return (((v >> 0) & 0x1) << 8); } + constexpr uint32_t VER(const uint32_t reg) { return (static_cast((reg >> 4) & 0xf) << 0); } + constexpr uint32_t MVOL(const uint32_t v) { return (((v >> 0) & 0xf) << 0); } + } + namespace rbl_rbp { + constexpr uint32_t RBL(const uint32_t v) { return (((v >> 0) & 0x3) << 13); } + constexpr uint32_t RBP(const uint32_t v) { return (((v >> 11) & 0xfff) << 0); } + } + namespace moful_moemp_miovf_miful_miemp_mibuf { + constexpr uint32_t MOFUL(const uint32_t reg) { return (static_cast((reg >> 12) & 0x1) << 0); } + constexpr uint32_t MOEMP(const uint32_t reg) { return (static_cast((reg >> 11) & 0x1) << 0); } + constexpr uint32_t MIOVF(const uint32_t reg) { return (static_cast((reg >> 10) & 0x1) << 0); } + constexpr uint32_t MIFUL(const uint32_t reg) { return (static_cast((reg >> 9) & 0x1) << 0); } + constexpr uint32_t MIEMP(const uint32_t reg) { return (static_cast((reg >> 8) & 0x1) << 0); } + constexpr uint32_t MIBUF(const uint32_t reg) { return (static_cast((reg >> 0) & 0xff) << 0); } + } + namespace afsel_mslc_mobuf { + constexpr uint32_t AFSEL(const uint32_t v) { return (((v >> 0) & 0x1) << 14); } + constexpr uint32_t MSLC(const uint32_t v) { return (((v >> 0) & 0x3f) << 8); } + constexpr uint32_t MOBUF(const uint32_t v) { return (((v >> 0) & 0xff) << 0); } + } + namespace lp_sgc_eg { + constexpr uint32_t LP(const uint32_t reg) { return (static_cast((reg >> 15) & 0x1) << 0); } + constexpr uint32_t SGC(const uint32_t reg) { return (static_cast((reg >> 14) & 0x1) << 0); } + constexpr uint32_t EG(const uint32_t reg) { return (static_cast((reg >> 0) & 0x1fff) << 0); } + } + namespace ca { + constexpr uint32_t CA(const uint32_t reg) { return (static_cast((reg >> 0) & 0xffff) << 0); } + } + namespace dmea0_mrwinh { + constexpr uint32_t DMEA(const uint32_t v) { return (((v >> 16) & 0x7f) << 9); } + constexpr uint32_t MRWINH(const uint32_t v) { return (((v >> 0) & 0xf) << 0); } + } + namespace dmea1 { + constexpr uint32_t DMEA(const uint32_t v) { return (((v >> 2) & 0x3fff) << 2); } + } + namespace dgate_drga { + constexpr uint32_t DGATE(const uint32_t v) { return (((v >> 0) & 0x1) << 15); } + constexpr uint32_t DRGA(const uint32_t v) { return (((v >> 2) & 0x1fff) << 2); } + } + namespace ddir_dlg_dexe { + constexpr uint32_t DDIR(const uint32_t v) { return (((v >> 0) & 0x1) << 15); } + constexpr uint32_t DLG(const uint32_t v) { return (((v >> 2) & 0x1fff) << 2); } + constexpr uint32_t DEXE(const uint32_t v) { return (((v >> 0) & 0x1) << 0); } + } + namespace tactl_tima { + constexpr uint32_t TACTL(const uint32_t v) { return (((v >> 0) & 0x7) << 8); } + constexpr uint32_t TIMA(const uint32_t v) { return (((v >> 0) & 0xff) << 0); } + } + namespace tbctl_timb { + constexpr uint32_t TBCTL(const uint32_t v) { return (((v >> 0) & 0x7) << 8); } + constexpr uint32_t TIMB(const uint32_t v) { return (((v >> 0) & 0xff) << 0); } + } + namespace tcctl_timc { + constexpr uint32_t TCCTL(const uint32_t v) { return (((v >> 0) & 0x7) << 8); } + constexpr uint32_t TIMC(const uint32_t v) { return (((v >> 0) & 0xff) << 0); } + } + namespace scieb { + constexpr uint32_t SCIEB(const uint32_t v) { return (((v >> 0) & 0x7ff) << 0); } + } + namespace scipd { + constexpr uint32_t SCIPD(const uint32_t v) { return (((v >> 0) & 0x7ff) << 0); } + } + namespace scire { + constexpr uint32_t SCIRE(const uint32_t v) { return (((v >> 0) & 0x7ff) << 0); } + } + namespace scilv0 { + constexpr uint32_t SCILV0(const uint32_t v) { return (((v >> 0) & 0xff) << 0); } + } + namespace scilv1 { + constexpr uint32_t SCILV1(const uint32_t v) { return (((v >> 0) & 0xff) << 0); } + } + namespace scilv2 { + constexpr uint32_t SCILV2(const uint32_t v) { return (((v >> 0) & 0xff) << 0); } + } + namespace mcieb { + constexpr uint32_t MCIEB(const uint32_t v) { return (((v >> 0) & 0x7ff) << 0); } + } + namespace mcipd { + constexpr uint32_t MCIPD(const uint32_t v) { return (((v >> 0) & 0x7ff) << 0); } + } + namespace mcire { + constexpr uint32_t MCIRE(const uint32_t v) { return (((v >> 0) & 0x7ff) << 0); } + } + namespace vreg_armrst { + constexpr uint32_t VREG(const uint32_t v) { return (((v >> 0) & 0x3) << 8); } + constexpr uint32_t ARMRST(const uint32_t v) { return (((v >> 0) & 0x1) << 0); } + } + namespace l7_l6_l5_l4_l3_l2_l1_l0 { + constexpr uint32_t L7(const uint32_t reg) { return (static_cast((reg >> 7) & 0x1) << 0); } + constexpr uint32_t L6(const uint32_t reg) { return (static_cast((reg >> 6) & 0x1) << 0); } + constexpr uint32_t L5(const uint32_t reg) { return (static_cast((reg >> 5) & 0x1) << 0); } + constexpr uint32_t L4(const uint32_t reg) { return (static_cast((reg >> 4) & 0x1) << 0); } + constexpr uint32_t L3(const uint32_t reg) { return (static_cast((reg >> 3) & 0x1) << 0); } + constexpr uint32_t L2(const uint32_t reg) { return (static_cast((reg >> 2) & 0x1) << 0); } + constexpr uint32_t L1(const uint32_t reg) { return (static_cast((reg >> 1) & 0x1) << 0); } + constexpr uint32_t L0(const uint32_t reg) { return (static_cast((reg >> 0) & 0x1) << 0); } + } + namespace rp_m7_m6_m5_m4_m3_m2_m1_m0 { + constexpr uint32_t RP(const uint32_t v) { return (((v >> 0) & 0x1) << 8); } + constexpr uint32_t M7(const uint32_t v) { return (((v >> 0) & 0x1) << 7); } + constexpr uint32_t M6(const uint32_t v) { return (((v >> 0) & 0x1) << 6); } + constexpr uint32_t M5(const uint32_t v) { return (((v >> 0) & 0x1) << 5); } + constexpr uint32_t M4(const uint32_t v) { return (((v >> 0) & 0x1) << 4); } + constexpr uint32_t M3(const uint32_t v) { return (((v >> 0) & 0x1) << 3); } + constexpr uint32_t M2(const uint32_t v) { return (((v >> 0) & 0x1) << 2); } + constexpr uint32_t M1(const uint32_t v) { return (((v >> 0) & 0x1) << 1); } + constexpr uint32_t M0(const uint32_t v) { return (((v >> 0) & 0x1) << 0); } + } +} diff --git a/aica/aica_dsp_out.hpp b/aica/aica_dsp_out.hpp index f8c6305..0b19e11 100644 --- a/aica/aica_dsp_out.hpp +++ b/aica/aica_dsp_out.hpp @@ -4,7 +4,10 @@ #include "type.hpp" struct aica_dsp_out { - reg32 reg_0000; + union { + reg32 reg_0000; + reg32 efdsl_efpan; + }; uint32_t EFDSL() const { @@ -28,3 +31,10 @@ struct aica_dsp_out { static_assert((sizeof (aica_dsp_out)) == 0x4 - 0x0); static_assert((offsetof (aica_dsp_out, reg_0000)) == 0x0 - 0x0); + +namespace aica { + namespace efdsl_efpan { + constexpr uint32_t EFDSL(const uint32_t v) { return (((v >> 0) & 0xf) << 8); } + constexpr uint32_t EFPAN(const uint32_t v) { return (((v >> 0) & 0x1f) << 0); } + } +} diff --git a/aica/aica_rtc.hpp b/aica/aica_rtc.hpp index cf4598a..279af71 100644 --- a/aica/aica_rtc.hpp +++ b/aica/aica_rtc.hpp @@ -4,9 +4,18 @@ #include "type.hpp" struct aica_rtc { - reg32 reg_0000; - reg32 reg_0004; - reg32 reg_0008; + union { + reg32 reg_0000; + reg32 rtc0; + }; + union { + reg32 reg_0004; + reg32 rtc1; + }; + union { + reg32 reg_0008; + reg32 en; + }; uint32_t RTC() const { @@ -33,3 +42,15 @@ 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); + +namespace aica { + namespace rtc0 { + constexpr uint32_t RTC(const uint32_t v) { return (((v >> 16) & 0xffff) << 0); } + } + namespace rtc1 { + constexpr uint32_t RTC(const uint32_t v) { return (((v >> 0) & 0xffff) << 0); } + } + namespace en { + constexpr uint32_t EN(const uint32_t v) { return (((v >> 0) & 0x1) << 0); } + } +} diff --git a/example/aica.cpp b/example/aica.cpp index 4851143..9cf9164 100644 --- a/example/aica.cpp +++ b/example/aica.cpp @@ -1,8 +1,8 @@ #include "memorymap.hpp" -#include "aica/aica.hpp" #include "sh7091/serial.hpp" #include "systembus.hpp" #include "systembus_bits.hpp" +#include "aica/aica.hpp" extern void * _binary_start __asm("_binary_example_arm_channel_bin_start"); extern void * _binary_size __asm("_binary_example_arm_channel_bin_size"); @@ -27,35 +27,37 @@ void main() const uint32_t * binary = reinterpret_cast(&_binary_start); const uint32_t binary_size = reinterpret_cast(&_binary_size); - wait(); aica.common.reg_2c00 = 1; - wait(); aica.common.reg_2880 = 0; + wait(); aica_sound.common.vreg_armrst = aica::vreg_armrst::ARMRST(1); + wait(); aica_sound.common.dmea0_mrwinh = aica::dmea0_mrwinh::MRWINH(0); for (uint32_t i = 0; i < binary_size / 4; i++) { // copy - aica_wave_memory[i] = binary[i]; - if (i % 8 == 7) wait(); + while (aica_wave_memory[i] != binary[i]) { + wait(); + aica_wave_memory[i] = binary[i]; + } } - wait(); aica.common.reg_2c00 = 0; + wait(); aica_sound.common.vreg_armrst = aica::vreg_armrst::ARMRST(0); - serial::integer(aica_wave_memory[0]); - - wait(); aica.common.MSLC(0); + wait(); aica_sound.common.afsel_mslc_mobuf = aica::afsel_mslc_mobuf::MSLC(0); serial::string("mrwinh: "); wait_read(); - serial::integer(aica.common.MRWINH()); + serial::integer(aica_sound.common.MRWINH()); while (1) { wait_read(); serial::string("sgc: "); - serial::integer(aica.common.SGC(), ' '); + serial::integer(aica_sound.common.SGC(), ' '); serial::string("; ca: "); - serial::integer(aica.common.CA(), ' '); + serial::integer(aica_sound.common.CA(), ' '); serial::string("; eg: "); - serial::integer(aica.common.EG(), ' '); + serial::integer(aica_sound.common.EG(), ' '); serial::string("; lp: "); - serial::integer(aica.common.LP(), ' '); + serial::integer(aica_sound.common.LP(), ' '); serial::character('\n'); for (int i = 0; i < 10000000; i++) { asm volatile ("nop"); } + serial::integer(aica_wave_memory[0], ' '); + serial::integer(aica_wave_memory[1], '\n'); } while (1); diff --git a/example/aica_gdrom.cpp b/example/aica_gdrom.cpp new file mode 100644 index 0000000..4851143 --- /dev/null +++ b/example/aica_gdrom.cpp @@ -0,0 +1,62 @@ +#include "memorymap.hpp" +#include "aica/aica.hpp" +#include "sh7091/serial.hpp" +#include "systembus.hpp" +#include "systembus_bits.hpp" + +extern void * _binary_start __asm("_binary_example_arm_channel_bin_start"); +extern void * _binary_size __asm("_binary_example_arm_channel_bin_size"); + +void wait() +{ + while (ffst::aica_internal_write_buffer(system.FFST)); +} + +void wait_read() +{ + uint32_t ffst = ~0; + while ( ffst::holly_cpu_if_block_internal_write_buffer(ffst) + | ffst::holly_g2_if_block_internal_write_buffer(ffst) + | ffst::aica_internal_write_buffer(ffst)) { + ffst = system.FFST; + }; +} + +void main() +{ + const uint32_t * binary = reinterpret_cast(&_binary_start); + const uint32_t binary_size = reinterpret_cast(&_binary_size); + + wait(); aica.common.reg_2c00 = 1; + wait(); aica.common.reg_2880 = 0; + for (uint32_t i = 0; i < binary_size / 4; i++) { + // copy + aica_wave_memory[i] = binary[i]; + if (i % 8 == 7) wait(); + } + wait(); aica.common.reg_2c00 = 0; + + serial::integer(aica_wave_memory[0]); + + wait(); aica.common.MSLC(0); + serial::string("mrwinh: "); + wait_read(); + serial::integer(aica.common.MRWINH()); + while (1) { + wait_read(); + serial::string("sgc: "); + serial::integer(aica.common.SGC(), ' '); + serial::string("; ca: "); + serial::integer(aica.common.CA(), ' '); + serial::string("; eg: "); + serial::integer(aica.common.EG(), ' '); + serial::string("; lp: "); + serial::integer(aica.common.LP(), ' '); + serial::character('\n'); + for (int i = 0; i < 10000000; i++) { + asm volatile ("nop"); + } + } + + while (1); +} diff --git a/example/arm/addresses.lds b/example/arm/addresses.lds index bd61339..3b4f340 100644 --- a/example/arm/addresses.lds +++ b/example/arm/addresses.lds @@ -1,2 +1,2 @@ dram = 0x00000000; -aica = 0x00800000; +aica_sound = 0x00800000; diff --git a/example/arm/channel.cpp b/example/arm/channel.cpp index 41fb9d8..5c245a3 100644 --- a/example/arm/channel.cpp +++ b/example/arm/channel.cpp @@ -19,41 +19,46 @@ void main() dsp[i] = 0; } - aica.channel[0].KYONB(1); - aica.channel[0].LPCTL(1); - aica.channel[0].PCMS(0); - aica.channel[0].SA(sine_addr); - aica.channel[0].LSA(0); - aica.channel[0].LEA(128); - aica.channel[0].D2R(0x0); - aica.channel[0].D1R(0x0); - aica.channel[0].RR(0x0); - aica.channel[0].AR(0x1f); + aica_sound.channel[0].KYONB(1); + aica_sound.channel[0].LPCTL(1); + aica_sound.channel[0].PCMS(0); + aica_sound.channel[0].SA(sine_addr); + aica_sound.channel[0].LSA(0); + aica_sound.channel[0].LEA(128); + aica_sound.channel[0].D2R(0x0); + aica_sound.channel[0].D1R(0x0); + aica_sound.channel[0].RR(0x0); + aica_sound.channel[0].AR(0x1f); - aica.channel[0].OCT(0); - aica.channel[0].FNS(0); - aica.channel[0].DISDL(0xf); - aica.channel[0].DIPAN(0x0); + aica_sound.channel[0].OCT(0); + aica_sound.channel[0].FNS(0); + aica_sound.channel[0].DISDL(0xf); + aica_sound.channel[0].DIPAN(0x0); - aica.channel[0].Q(0b00100); - aica.channel[0].TL(0); - aica.channel[0].LPOFF(1); + aica_sound.channel[0].Q(0b00100); + aica_sound.channel[0].TL(0); + aica_sound.channel[0].LPOFF(1); - aica.common.MVOL(0xf); + aica_sound.common.MVOL(0xf); uint32_t segment = 0; - aica.common.TACTL(7); // increment once every 128 samples - aica.common.TIMA(0); - aica.channel[0].KYONEX(1); + aica_sound.common.TACTL(7); // increment once every 128 samples + aica_sound.common.TIMA(255); + aica_sound.channel[0].KYONEX(1); dram[0] = 0x11223344; - + dram[1] = sine_addr; + constexpr uint32_t timer_a_interrupt = (1 << 6); + aica_sound.common.scire = timer_a_interrupt; while (1) { - if (aica.common.TIMA() >= 1) { - aica.common.TIMA(0); + if (aica_sound.common.SCIPD() & timer_a_interrupt) { + aica_sound.common.scire = timer_a_interrupt; + aica_sound.common.TIMA(255); segment += 1; if (segment >= 3440) segment = 0; - aica.channel[0].SA(sine_addr + (128 * 2) * segment); + uint32_t sa = sine_addr + (128 * 2) * segment; + dram[1] = sa; + aica_sound.channel[0].SA(sa); } } } diff --git a/regs/aica_channel_data.csv b/regs/aica_channel_data.csv index 1a0a6c1..0375809 100644 --- a/regs/aica_channel_data.csv +++ b/regs/aica_channel_data.csv @@ -1,42 +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", +"name","part","address","register_bits","argument_bits","rw" +"KYONEX",,"0x0000","15",,"w" +"KYONB",,"0x0000","14",,"rw" +"SSCTL",,"0x0000","10",,"rw" +"LPCTL",,"0x0000","9",,"rw" +"PCMS",,"0x0000","8-7",,"rw" +"SA","0","0x0000","6-0","22-16","rw" +"SA","1","0x0004","15-0",,"rw" +"LSA",,"0x0008","15-0",,"rw" +"LEA",,"0x000c","15-0",,"rw" +"D2R",,"0x0010","15-11",,"rw" +"D1R",,"0x0010","10-6",,"rw" +"AR",,"0x0010","4-0",,"rw" +"LPSLNK",,"0x0014","14",,"rw" +"KRS",,"0x0014","13-10",,"rw" +"DL",,"0x0014","9-5",,"rw" +"RR",,"0x0014","4-0",,"rw" +"OCT",,"0x0018","14-11",,"rw" +"FNS",,"0x0018","9-0",,"rw" +"LFORE",,"0x001c","15",,"rw" +"LFOF",,"0x001c","14-10",,"rw" +"PLFOWS",,"0x001c","9-8",,"rw" +"PLFOS",,"0x001c","7-5",,"rw" +"ALFOWS",,"0x001c","4-3",,"rw" +"ALFOS",,"0x001c","2-0",,"rw" +"IMXL",,"0x0020","7-4",,"rw" +"ISEL",,"0x0020","3-0",,"rw" +"DISDL",,"0x0024","11-8",,"rw" +"DIPAN",,"0x0024","4-0",,"rw" +"TL",,"0x0028","15-8",,"rw" +"VOFF",,"0x0028","6",,"rw" +"LPOFF",,"0x0028","5",,"rw" +"Q",,"0x0028","4-0",,"rw" +"FLV0",,"0x002c","12-0",,"rw" +"FLV1",,"0x0030","12-0",,"rw" +"FLV2",,"0x0034","12-0",,"rw" +"FLV3",,"0x0038","12-0",,"rw" +"FLV4",,"0x003c","12-0",,"rw" +"FAR",,"0x0040","12-8",,"rw" +"FD1R",,"0x0040","4-0",,"rw" +"FD2R",,"0x0044","12-8",,"rw" +"FRR",,"0x0044","4-0",,"rw" diff --git a/regs/aica_channel_data.ods b/regs/aica_channel_data.ods index 7add0c21fae7fbbcb8cfe670bf001cc56a0832f3..39ced0f87ecb8f228a394802a3d4624bc6c2f816 100644 GIT binary patch delta 6459 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 diff --git a/regs/aica_common_data.csv b/regs/aica_common_data.csv index f9b3969..fa9a54b 100644 --- a/regs/aica_common_data.csv +++ b/regs/aica_common_data.csv @@ -1,66 +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", +"name","part","address","register_bits","argument_bits","rw" +"MONO",,"0x2800","15",,"w" +"MEM8MB",,"0x2800","9",,"w" +"DAC18B",,"0x2800","8",,"w" +"VER",,"0x2800","7-4",,"r" +"MVOL",,"0x2800","3-0",,"w" +"TESTB0",,"0x2804","15",, +"RBL",,"0x2804","14-13",,"w" +"RBP",,"0x2804","11-0","22-11","w" +"MOFUL",,"0x2808","12",,"r" +"MOEMP",,"0x2808","11",,"r" +"MIOVF",,"0x2808","10",,"r" +"MIFUL",,"0x2808","9",,"r" +"MIEMP",,"0x2808","8",,"r" +"MIBUF",,"0x2808","7-0",,"r" +"AFSEL",,"0x280c","14",,"w" +"MSLC",,"0x280c","13-8",,"w" +"MOBUF",,"0x280c","7-0",,"w" +"LP",,"0x2810","15",,"r" +"SGC",,"0x2810","14",,"r" +"EG",,"0x2810","12-0",,"r" +"CA",,"0x2814","15-0",,"r" +"DMEA","0","0x2880","15-9","22-16","w" +"TSCD",,"0x2880","7-5",, +"T",,"0x2880","4",, +"MRWINH",,"0x2880","3-0",,"w" +"DMEA","1","0x2884","15-2","15-2","w" +"DGATE",,"0x2888","15",,"rw" +"DRGA",,"0x2888","14-2","14-2","w" +"DDIR",,"0x288c","15",,"rw" +"DLG",,"0x288c","14-2","14-2","w" +"DEXE",,"0x288c","0",,"rw" +"TACTL",,"0x2890","10-8",,"w" +"TIMA",,"0x2890","7-0",,"w" +"TBCTL",,"0x2894","10-8",,"w" +"TIMB",,"0x2894","7-0",,"w" +"TCCTL",,"0x2898","10-8",,"w" +"TIMC",,"0x2898","7-0",,"w" +"SCIEB",,"0x289c","10-0",,"rw" +"SCIPD",,"0x28a0","10-0",,"rw" +"SCIRE",,"0x28a4","10-0",,"w" +"SCILV0",,"0x28a8","7-0",,"w" +"SCILV1",,"0x28ac","7-0",,"w" +"SCILV2",,"0x28b0","7-0",,"w" +"MCIEB",,"0x28b4","10-0",,"rw" +"MCIPD",,"0x28b8","10-0",,"rw" +"MCIRE",,"0x28bc","10-0",,"w" +"VREG",,"0x2c00","9-8",,"rw" +"ARMRST",,"0x2c00","0",,"rw" +"L7",,"0x2d00","7",,"r" +"L6",,"0x2d00","6",,"r" +"L5",,"0x2d00","5",,"r" +"L4",,"0x2d00","4",,"r" +"L3",,"0x2d00","3",,"r" +"L2",,"0x2d00","2",,"r" +"L1",,"0x2d00","1",,"r" +"L0",,"0x2d00","0",,"r" +"RP",,"0x2d04","8",,"w" +"M7",,"0x2d04","7",,"w" +"M6",,"0x2d04","6",,"w" +"M5",,"0x2d04","5",,"w" +"M4",,"0x2d04","4",,"w" +"M3",,"0x2d04","3",,"w" +"M2",,"0x2d04","2",,"w" +"M1",,"0x2d04","1",,"w" +"M0",,"0x2d04","0",,"w" diff --git a/regs/aica_common_data.ods b/regs/aica_common_data.ods index 8cb9e2d6826ecc144487d8a3908ebeef3718ca18..b02418927e0f08798fa735e390dcea7a08ce3fc9 100644 GIT binary patch delta 11617 zcmaiabyytD(k~Kxk)R6+8r*{fcXtgAL4sS*;EOIE2o~HWxJz(YoZtiq?!GvSERf5a z^L^)@@80`7cm9~}{&jWL%ye~iO?5RCA#M~SVyi15zaT_FKu18><23t)7kDjeY*u(t3{JxJ2DvS(@`hr16yxy1%ZXd zJF$tH&QofqYMJq!rw~z`N_+GI9(wGrjn(Jn!B5-J835v*!$?+cUB2l#Cw?%VQ#u$!aL&bJDQfR3zW|+t+<(#N^7V(zb_&@vFYwGq#}p zSjBN%dcTG~dQyxxdh@H-Lc4N_yk2J~Nss^gV|O@$IU3tb3|nEsx=qJX;8^8Q^-6V z{)(pg34DmFu7rjjP$qAahlqfngp7djFID-k8BBCWAqQoxxNY*|cdwmR=eCsjy8Rqf zmRz7U#4vOH5jIT7`P;t@zX@S&F+~YK=;4Op4ofPqmPFQ(t(`XPm*!_Bu||X5cYIy! zBFz_ICbtNXVdaO}GNNO{KF@~($7}e0^ikLVX;<{UD&2C<3z#FCjx>eAEB}@^nS+XhFmY zq1RvCJ*f&0+Z&40X3l#CvVG8B=K!z{|d;Xd4MlZbg_oAQW1TM=Z_SnY+%C{QTUk|0t_iwm89l?^nU;Zpt8j1Rp!8=>5 zA_TfF&Z<;G?i?JSpzlY_6BZi%R$Hd+wUmkvqLBjBGSIAJlqu9$9M(76p49qhoTM7e z0j8Dm6J90NPh}2e=`W_r@nP7n4B6Y-A^}Pqy7?2+UzQFZ zLAe)|x_8(D%LlsI6lFw+ax{kmCveB>4~$gD->`q|n>W_YH6-yBFOYnR)EitS9b8S9 zU;m_3q2?SRxKYS^vjmIy6K=AXOnvcNwT+8Q(cw@aI0~=y(bI8gr`B-d<*N$bpJF0HLt4&+BZCh+nu(Sp=W=%5|rPt~3ISD!N0CXpB` zn(wV{6V>#*^(3+4KOK~Rgy>sJE?PuQ~*whImT6O)DznVUZ2Wj`?K^bJtFZc)41Q0BxB7nSZQG^xTq&d#*LKQ; z;J$hq#NROCHKce2{QQOIV^$AmFe_-Y=R$@8yxh1>KtxJoEB+*km=^NGD=lg}N6u@W zRxEfcP5tgI?Es2}c~>=lyf~gyJ?X&13B9D;iRi9VOCJ#6rl2hOt86TCYY7}Zut40UcG zFq!YCpjsNOO|mU673+f&X@AL{yngi{f;UfE61-+d_gmAMi2yp9u&&zVZZSaV^i!pB zJZz|Ghv$8nRwxKvuFCNbxsXw%m2}C*iCTwM>q7bXaw;yGay&9Nw9C(* zX_h+!aTERBY)Y(7rRUkLvQhBueG(zY?jH1=bZ;rf^~7XWE+927*tXM!QE4Th{13v) zSGoMsh!K069FNF%aW`2$M}!!*67UKv>gp9lcU{DF7fZijSh^jO{2$PD5!#9_LMTtH z`MoNCXiO_)3fap!EQT=SS9lp~YTwf>LNDt~4GzV~+f$;r1BQatP?+JjG%>GR)Rp&m z5wloT*x}3$JTX4TrLx8d$6bDRCSMreJ3w4GgRyN&8Wlc#Xnk~j!PFm0hy^TB9=aSo zBH14grg|Z4IUgQBV`K^Hj?=$J+~y%6J=4zHQrUbU46REH^mv2uu z^B;t`phiMap4S%;(+`Y;_IM+fZJ1NZDV#SOIuGZ5SMVE}3#!c?U z#XI(tmzhRj2oynV^0lY%LC0}qM0&R$9W;XRs z8`&p$9`nK*%vD2b+P#>@ZOBEzTyf z0XAA!Ps$=DEhMFhkl^|c{8=_1>rHitrm&%1=@T3BZM~Oc@6cne7%*kS?DensK(v>R zcn8K3pOZn|5S>Ri)Jf5!i({AS1+8)ru3)$S92n>96$Eh~;YRM8%e**F#D-XGT0aJ!M`q&_oikd?4>BlpVKFbzb+C9{iD>`v;WLo z@PE2USJ6x{ceZhDdEzU0(^As z(~$iIeXKWbFRu{gwaMjVK6g583${pPzHMq4#yVAtS6$<;8%!d;arMl+B*kIxPm{Wu~H2jQQIs|y6QGa@?* z;_x&}L5Tn|GwVI7*@;&ZV7pc;et8AF#CF0+m&gpo`3{45LKpdRaSLs~1Du9JouFdV zm7{5XOuB(u+LK0FRQ{?^=iHqra}>o*Jaa~J>kTiSs%ia;$g6iVGWBJvnsvmC?P3ABMkOYQVMS$yxyLM}Cfjh#Actr@tTK{oUUXM_ZPiHZz(d8ZS#`rpN!UW6Ye z=+(CV0Momt1FUoC**Vy}%oLpA#_L8(WixB6?*DQ@v1;`M4QM^nmuzc)>2- zBM5cnj5D7RqD>IDRPQpzUdCIRi>USG0Xh2RG_82Aj-xXuX53s%G_UrLs&1us`_{7` zGvjhs!Ih6>khE%gi{T9kv3YhynC20+&Kq>OR0X+4s6~u=@&fp5<@6X0@scA{5-}l? z@1&;o@rW`=6El9l%c-k>bD)_&4Dct~cF}g_1xtLb6sHH9=AoL`uDUQQKe=!4f%;L+ zv5{r$KfV($?M7-OQ)x(Ng&s|7#waRzc{f$+Iq?Ebnynn9JWw3pn`nIdUfN0X=u#ZK zhX1R-)?|8Y#00BRVR6VgQ1~*bK(cZ?ZCyzn%uhhiEW^g-nAuF!J`KBF!65eJ{(}=F zEOgE3``%Rttu(i)g$3pPi78D}8;IfSJ&&7{tEsDM+`&LKUN}l1AH+VQu4nIif1nNJHM5VuuK=D?j@zU%kI_!4ffDGn_|G&8u-I94V@M$I9H*w@&|^y8Ybb zYrV#4WM&)BYu=U5Sgpw|Oacn4gQp5zYl(wrzSDc3SzNYmw%-MS2tAieUx0j>jabJ% zar_?nZdc6wWx&rk_*O~QQt9=AxmrKN7rt|3QYHi(c9-r_))XYCsTL|-9;W0;Y1r`8 ze%g1DxR){br^6bwU9C65);(!u6KCk{^r0j-+*&KLr0@(D3j7tpsJ3s_sy@k%sBhcH zokBhC6*mx9l9fa&th5nj(iuVhllN6LONjaf(yIhPL=5B+;NqUA51+bqkMo#Mu&IYl z>SFcbvqrDW(_d+lXIJbG%mLimS-u+SW4@8b^Ad6Z?!i~E2wH`e7l0U4eT1 zyDQyxi9zP4!ZtBeUHAm~Soyhk*XlKn=vuz>;@X~V^~B5|Oh6-N<4dO094MmGm#(SF z7k7b}sp#;Oy2N%z{qx|Dqwb1@4D18wd}58uS1XF5dVzID99FZv#?iu~MY^E3_=DHt zw6=gW{uTI1n6lXQ+&nL+sNEd@m$**5)he8e63&(jWf8thS9ds-P{r>Fx9#TOOKvAb zTP#-OPKhFjy?s9+bpV+z6z56*iBlr~;bJGyDj00W%ycbbcXmCc)ceD4>ve4Y@2Q~9 zC_q~!*RCIyk^qz8SVab*Q@^=5fZb>~TU+aVR zA$`pOBTtq?RZT4pvYSiF^eS;Oq7(43gXpCpbvM8%*(i!}3FX&}9_hVAt0P5WxX;*! zm`dC6g_K4eZ8lL5as}^DfIXyg{}^-Ohxg1HLG`ds`xQYLDNXA~r&p39cRzZw^9Z2l+u}t6V)NDg<-XQR zB9U}?&8_=2+hEk?56;|~@x*0+8Q8pZe;12W6!qi2D$_|x^rRKECNr?K4rUMW$!JO) zGeQ-CL0M=WJ{lloK5G#Zy90I`Gx|z2Ki#omd$ZE(HkY0Y9nsfMs1u(OYkZ?2XIfU$UU|O*cuSm z$4TKMWX`1;hB0dpDUtc`wGds z3ShWaZnnR!Q;|1CPkpe~(OiBpi^RAnGnOBwt%G5TLvR{E@Yqh<(n;l#bKe#Op?)C| zXwRnlMsHfEh9wC@1i9+AW5|J9dee{}?W8qg9zX@sNzg~Fh&ByhuZ%N`Go>JCtq6P{ zZVE6~{XU%gMdEv8BEEwwdne#Vrg^62VRbS|_Bc2xK5W;O8HjiIhmZ_a{xg%r5Ml!- z2FplE_z5%*Bc$oOOo|0&qLE3EK7)gUyaKbBkRQMNnOvwYim?hnNnPm0%k&Q>**PPw z1%=+AE}se_MoWa$cwx*M*-gY3**0uA6NPd%c+``qJk5%$w|2vf+#hdVlB@t{=Yyp1 zX3Weo*}6igm9PV-3gw1zq#ceoX&s0SW++78eN^b>j6em3x4rW~MlZ(I+ZKQQDFMS-Y5XMP)_>8hyJRer_QGPW`pFc7iff%OXP z^DoDYaj~30iKnLxRZr@Cs`EIpw2SZZ!o#)SpKf_w1QFWs-kXY;Ma)S;t}s8TBl`6z zpi$}4lA8cmM1^^`28b>V|*cQkjZP*UboQbj+pC)H@3 zu?aeeu=mNmHRxgxIXo;2Su#Jx9u5F9r#r~NARf0ZPHM{tGA3&VpOIvioBLcqYDiji zWQI@%68ob;rUb#B{bA^v?WZK2;o6xGZ0((;3lecZ>b$pZ9o!xk-%QDW1919O7aQ7Nc*9zV*0=4uE|u zV2dk}6|{BP-o`3tr>m)t6it;N4Rqwo<$XiVI^4$ctd>WjVBL+5H+=DvVO5@T77)AU z%IxXJ3RspEn-#d!y>XcD{VToNH=MDhbq(0APD7rbikcX9@mCCul|b=iju4(fJHCm4 z)UxZU>dGDN6>(@RYWnZgR2$d3-)H zq7i(lEw=cCFWowyCq)r)AM^Mb2@{|j+$J;-QyYveeRR}6Y+-6g0#1yAOh|*2%GdG` zk%kG(8=k=mH?DsCkI8x99y}k9EWv2S4JkUru7;O(Nyz*BE^HFGr=VQ_;2r_?P)#zb zhzc`BTTcjMOqM3tBaxhTO$5hj7nR&>^`yujhd3S;{K((i!h?ZIWUl#h!qv&t@5rCb zHaq_`*S|%t>ilfMPTw`h*qBe0TsgR>GVs`FQvFn`VXLS#oPk1s8XJf{hVW#MX$b4}q<0x?xK`iyy|-@NUb(?{J{@j1BF0<^PH|6KZQa6qwGqBJVyqp%BO zB1s!`d6sRsN(?^TwZNvQFmAww%bC{n_nMm3>|~jFHC8n?Ow0pq$w;ZP8gLE&%#JUS zaThjEU}nD!IrZkZY+s#tosw#*rX~2|xnKCR+ub&Ft5X5wO!-3%#X0BK@SMk|I;Hlj z7rd95Z`d|)-KRuNe}31PD1-jAKI{N3H&LxeM$Vl5skS+Ipw|GG9FSSqxxWROUdGuduW8x`2JrTAg}zH?Ldi6b(ZS z5CL!Ug*Qwu$yHvE$tfaRv`e_saodwBE!yN*8ba^yG$U-Wc~;v7{g;-NzhA&K+=B4J z9^+AQb~NApnrcv8WC%v#`}%Y(+vmTOS>;+QO9nvP^J~t=u1*`21YWajT*=?mrdZ;#q&XV-ok~vn{r#Iw@CmGtK(b@)WtBg^#iTI zN38dqQEN?xZAKet0FMJ<|DI-)kVd#Hyy6YJB;=`=_%sg*Wj(HyNT_&}Okk(mbGQ1uPP&~K9A+ws*>@o)3 zt_5Q7vuvEjK~#`;{f;tl;po_YF{GW;g0^A$S-<~L@>^Y=dod(PT*E~3%>#r}Iok)M zaMj1bBmX1~k1*yiX z?MrV#@jhDCAao)I*v-lpbQSMkttC_1Kq?kcob?wdm2h<%9BPpBK=#WzjT!w~(mgfgkF~nb=Zdw%8|4B*qOBHg--qB6S%I z;EBzbgG<3}wkfD84RL@AD^n**`a!>~v%YU3b=1C}niY-*Ppp)yjEh z%r4T<`GmAVci2ITCEhWxx17xrhd&f#vxr~&KG1?+=W?|eZtr88_>e$DDDwRQKcR0F zGm45_k4vY=wo-U)SM8k)8K4$!@P!LT!0}vJu}IUBqXp<8FiXEW8P$*#K#Xb_6TSgD zg+fe5>XxP8!emF#cg?um)XlhF19-t(v9NQvZewL43{={maonH=R;Xzg0lYaJc$we) z_KzgIJ%7K@-=J1x%?+-7(%0LK0Bp*0E%GiAZ!??lN+4)!iUG zv0JS(AkiUEEYGvBbwi|qaa_$^7`VG8wuuFLnUMb#_VN$S*<31BGj8aw_cZ6LoW~l7 zpBD#xRb~Wjb9TrMRb*=&R)x1$PoMaB0M06Nf8q}M&I|3J18}_0OM%t?OV`f^IBU9!)Wl>T zgs(Y~xNYldrq4t<0UGNiuHK!Y91YU%fRsfN$G@;Y2|!lika>E~1aQ!T%3a#G-yrP-#4`0OshSWw9AcGaT4Xe+w^j@=W*kd2iEz1;C=mzw1F(t0|qmm8YMmAk>(S+VMpxzl}#in*xQ$y*|&T`O~~|`fRD> zg+~d|sE=1M#rSQ!|0u$FTtOGgw#Z^(+Q)g6DwK;Gtd|E~n1DAUWtsV8oB0aJdV#1E z31xUF-I0^XhLgWkz-N1qnrEM?jHxH)$ANa#p!`ae>zDO2Y^YXVt49u|%lo{tOQb1{ z(#7--OB;D>B_M`{LJo#jd!CCSWFgtpjVF4Rb9q6(_ADeos1rOx<-l;!+Cw(&o$)dP z1@7HT!!5psI9=h44k5O@Z(fN;Yqs`s2EX9fuYp#nr0q#FKMAU{3ZK{jwv3k_C|Rk! zaGuX}*K=%hdh|&?ud|$dY%M$qS{8k__Oj&bAg4~}U!cfKnR}C(jx1rLDDM4{a*&j= z02}v|??);T+?5D0k4F1@?`0U9!YyT7-ydc8EaRtyv9aycNl>x>dJDgE_I0^YGf!%KOZ^8^;2ouH&M%H)Fd%D` zaun)T1oCG-M~s!+`@y}Em~J#j6+hg4)R86q09n50DWWAp9uqj&!beY2VR}m;NO2yg zHr>TiL}^2*IiI_fsP5yT$ciHmv0e=4u)Hi}u&Gv6VdW?O71d}o!iV_=YkZixVFzZ` zPH2h_bUoyFu!_nqJlxML;5Isdil&NT{Cu8qkfPuQy|!dBxlsLO7>qP@_LrJK!dS-M z81&u;i+<0^KG2Q00!2nL1_i(!)#pCxj5X)CXs%B2g`#ECD_4wV?3qWu!r-E<*RJOd zb>q|XL<_1sW;Wx}d1w$H%(q@1`rZRQ;+vBd1@{-GunXO z?d2SDuDfkBbnRcIJa5%ObPm!?JjVA|lT#_DHaT4A*@k1=XAbVR+h26v|C(g{vfnqq zZ6#-|;yc&tlVW=++(zuXLh$Dm=YqLe&9ml{1J*(xKjyIS&(~AhQhMGEQ&fG^x2@R$ z0+cK2w-^g~KTK1pmtTSJC71@x=!roi_rk|Z;^f)7JFgcRiZ;JmG$w?1s7JyTLU+QT{RBgXXwNO+2l&dKpC$F};L)q>>(BmHu3&MBKb~15{*W5fr=iLHfEmHg; z3!g+OC@CHije@z9^uh<0tX-UJDE&T`S+>(HU7fr)=5a7=N?qhfi95l13<7DcWxc~rFsXX`=%Y1ZgvZX>Fb`FEtVi>cxLR7 zJ2OP|*k$qzCA0|_x;A!l#e+}>*iG~qzGcDm&qx+a%IMbc#>ZV28IXEQ3$;~jPEU~T zNm0-D6Ao<2SBJNKS)7u10P=BhCnr#;u4z#ZnZCF|8_GHk4HABXtCOjfPUfPQVUC8q z!ddwZOvY1uHKws&i+MbSpvW7r3yuc0VjIfkl)=nyD;_BKtMj(SVGy>aVp`_VE-kut z4fx#^ld^k_zfyzaTGgs3#I^zVL)FI_=B5I0h5oap!vmU>8vb4j2>esRv!J!D!=w*% z@a6zM9YY}$*8Z%3CSgp7Ec_visENXvQdFisa$21z?0Hi*a_aD3&~J!iB*dog?dDtD z`?UjxrKMlm=cVDdM1#cOH=IW8 z{%2)eTK&rE~+Z!L6kBGq{OB7w1TVL4~nVj89WOK4@( z+K<_wHpeaCmOC$gHIW4u{RZ)doy;TVxuiKqa7f?i;Z=L?x)3ra<2=D1Z(xHLyl{+8 zDNvbK%cr=T(<=>lP@gl6jY>a|1B9~Jc7%~gcXOT55Q@;7nr2KuE;%1gpqF@1_;)l~BZA)8JdP z+U`qBtpqb1Yo3h!BqLR<6Ks6c9tnUbi^H5#QZl-)-&Q7o=6(dZZu^$^O723Ij$H?H9KGJ1{So# zwgki+s?<*9mWl33%|EBXZVxq^rP=q2BI}&MuCWtz>nZDBV(>U*r?R^-Zh>w{se*99 zqzSxHCQwXK7Tq-It4Fe+3tOsjUXT)f3pzsoLmzaBV^uV6O7uM*Ej-EOE{K#-&tl*e zr28r5*D+u*{P(hGiF@0>d~2|nEgDpDOV^o_1-q%85S-%*5B$AXyDaK=%WHEXvMRcH z8PYSR?L>L5dX=ygKJrs|BB?sr=^#Lr$4dPB6~gqr^xh8aWroGoXea3Cd94gExHB$1 zs5s?ZBrKI23*RRlK2%K~4l8!`=2ACLq_Y;nSBkIdn{iF03#7(H*S29_)4a2z_6mxo zt2vF_;J4P#+;;Yku|Ipk18v#kz#&1U&(fVMT1TZp!#^)S-KigRg1wriPYWe>U z&`W##*ftwVQ{!+@2uIr1H*xZi*|(iE zLr~=Um2FXb+$U{Y55=N2M!Mvs5`MPkxCAie;Q8sQsK%D|`^}Va9a_F0{&g?Cl0>*C zw5HFf&D6bAi*ihF(BU6nXb6|Wnp6AXZ+fMU#4A?+{Z74fcHOWwhg(VU*0IjdcaoO6U}%~D<~y^QIJCMnM^W?wtjH6|Pf6+`~c zr1SeH8f1OhbOu=j!d-;tOF>3ex=PYC_^Qyi4z*Yzuf;b&ItG)M2AEO2yT|{?zT?WZvV;t|B6HY4MYCt(91+|O@_a3WT*KG V$yFtBLzyHoTN4j;SM?vV{{@a|PnG}x delta 11545 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 diff --git a/regs/aica_dsp_out_data.csv b/regs/aica_dsp_out_data.csv index aabf8fd..c27325d 100644 --- a/regs/aica_dsp_out_data.csv +++ b/regs/aica_dsp_out_data.csv @@ -1,3 +1,3 @@ -"name","part","address","register_bits","argument_bits" -"EFDSL",,"0x0000","11-8", -"EFPAN",,"0x0000","4-0", +"name","part","address","register_bits","argument_bits","rw" +"EFDSL",,"0x0000","11-8",,"rw" +"EFPAN",,"0x0000","4-0",,"rw" diff --git a/regs/aica_dsp_out_data.ods b/regs/aica_dsp_out_data.ods index 00e54cc02065a5989fbff9a36aa6bd1dae577440..547642c683e89a7622e85b7748dc5a08b4c5e07e 100644 GIT binary patch delta 5608 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 NQ!z7PXfXUr`wuIoO~wEK delta 5242 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 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])) + addresses.append((part.address, [(name, part.index)])) else: assert addresses[-1][0] == part.address - addresses[-1][1].append(name) + addresses[-1][1].append((name, part.index)) bits = slice_bits(part.register_bits) assert bits.intersection(register_bit_alloc[part.address]) == set(), row @@ -82,24 +87,33 @@ def group_parts(rows, address_increment): if name not in by_name: assert part.index == 0, row - register = Register(name, [part]) + register = Register(name, rw, [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 + parts_by_register_name[name].append(part.index) + + return addresses, register_order, parts_by_register_name def format_reg(address): return f"reg_{address:04x}" -def render_struct_fields(struct_size, addresses, address_increment, c_type, c_type_size): +def format_reg_friendly_name(names, parts_by_register_name): + return "_".join( + name.lower() if len(parts_by_register_name[name]) == 1 + else f"{name.lower()}{part_index}" + for name, part_index in names + ) + +def render_struct_fields(struct_size, addresses, address_increment, c_type, c_type_size, parts_by_register_name): assert address_increment >= c_type_size assert address_increment % c_type_size == 0 next_address = None pad_index = 0 - for address, _ in addresses: + for address, names in addresses: if next_address is None: next_address = address if address != next_address: @@ -108,7 +122,12 @@ def render_struct_fields(struct_size, addresses, address_increment, c_type, c_ty yield f"const {c_type} _pad{pad_index}[{padding}];" pad_index += 1 + # render the actual field + yield "union {" yield f"{c_type} {format_reg(address)};" + yield f"{c_type} {format_reg_friendly_name(names, parts_by_register_name)};" + yield "};" + if c_type_size < address_increment: padding = (address_increment - c_type_size) // c_type_size yield f"const {c_type} _pad{pad_index}[{padding}];" @@ -136,17 +155,23 @@ def mask_from_bits(bit_slice): mask = 2 ** ((h - l) + 1) - 1 return mask -def part_get_expression(part): +def part_get_expression(part, value=None): _, 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})" + value_expression = format_reg(part.address) if value is None else value + return f"(static_cast(({value_expression} >> {reg_end}) & {hex(arg_mask)}) << {arg_end})" + +def part_set_expression(part): + _, reg_end = part.register_bits + _, arg_end = part.argument_bits + arg_mask = mask_from_bits(part.argument_bits) + expression = f"(((v >> {arg_end}) & {hex(arg_mask)}) << {reg_end})" + return expression def part_set_statement(addresses_dict, c_type_real_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})" + assignment = f"{format_reg(part.address)} = {part_set_expression(part)}" if len(addresses_dict[part.address]) > 1: reg_mask = mask_from_bits(part.register_bits) << reg_end inverse_mask = (~reg_mask) & ((2 ** (c_type_real_size * 8)) - 1) @@ -169,14 +194,40 @@ def render_struct_accessors(addresses_dict, c_type, c_type_real_size, registers) yield "}" yield "" -def render_struct(struct_name, struct_size, addresses, address_increment, c_type, c_type_size, c_type_real_size, registers): +def render_bits(addresses_dict, registers, parts_by_register_name): + parts_by_address = defaultdict(list) + + for register in registers: + for part in register.parts: + parts_by_address[part.address].append((register, part)) + + for address, names in addresses_dict.items(): + namespace = format_reg_friendly_name(names, parts_by_register_name) + yield f"namespace {namespace} {{" + for register, part in parts_by_address[address]: + if 'w' in register.rw: + arg = "v" + expression = part_set_expression(part) + elif 'r' in register.rw: + arg = "reg" + expression = part_get_expression(part, arg) + else: + continue + yield f"constexpr uint32_t {register.name}(const uint32_t {arg}) {{ return {expression}; }}"; + yield "}" + +def render_struct(struct_name, struct_size, addresses, address_increment, c_type, c_type_size, c_type_real_size, registers, parts_by_register_name): yield f"struct {struct_name} {{" - yield from render_struct_fields(struct_size, addresses, address_increment, c_type, c_type_size) + yield from render_struct_fields(struct_size, addresses, address_increment, c_type, c_type_size, parts_by_register_name) yield "" addresses_dict = dict(addresses) yield from render_struct_accessors(addresses_dict, c_type, c_type_real_size, registers) yield "};" yield from render_struct_static_assertions(struct_name, struct_size, addresses, address_increment) + yield "" + yield f"namespace aica {{" + yield from render_bits(addresses_dict, registers, parts_by_register_name) + yield "}" def header(): yield '#include ' @@ -194,8 +245,8 @@ if __name__ == "__main__": c_type = "reg32" c_type_size = 4 c_type_real_size = 2 - addresses, registers = group_parts(rows, address_increment) + addresses, registers, parts_by_register_name = 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, c_type_real_size, registers)) + render(render_struct(struct_name, struct_size, addresses, address_increment, c_type, c_type_size, c_type_real_size, registers, parts_by_register_name)) sys.stdout.write(out.getvalue())