From 3f30c96dcd2a371b2270f4eaee68dec4f1120bbc Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Fri, 8 Dec 2023 11:22:15 +0800 Subject: [PATCH] add more notes on maple --- maple-notes.txt | 40 +++++++++++++++++++++- maple.cpp | 86 ++++++++++++++++++++++++++++++++++++++++++++++++ maple.h | 78 +++++++++++++++++++++++++++++++++++++++++++ regs/maple.csv | 38 +++++++++++++++++++++ regs/maple.ods | Bin 0 -> 23918 bytes 5 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 maple.cpp create mode 100644 maple.h create mode 100644 regs/maple.csv create mode 100644 regs/maple.ods diff --git a/maple-notes.txt b/maple-notes.txt index debb191..4f791e4 100644 --- a/maple-notes.txt +++ b/maple-notes.txt @@ -6,18 +6,21 @@ MAPLE82E.pdf Chapter 6 "COMMAND REFERENCE" jargon: -AP - Absolute Position ; MAPLE82E.pdf page 13 +AP - Absolute Position ; MAPLE82E.pdf page 13 / page 21 (Address) (Data) 0x0C700000 → 0x00000000 Port 0, 4-byte data transmission (instruction to Maple-Host) 0x0C700004 → 0x0C800000 Port 0, reception data storage address (instruction to Maple-Host) 0x0C700008 → 0x01200000 [Device Request], transfer destination AP: 0x20, transfer source AP: 0x00 + 0x0C70000C → 0x00010000 Port 1, 4-byte data transmission 0x0C700010 → 0x0C800100 Port 1, reception data storage address 0x0C700014 → 0x01604000 [Device Request], transfer destination AP: 0x60, transfer source AP: 0x40 + 0x0C700018 → 0x00020000 Port 2, 4-byte data transmission 0x0C70001C → 0x0C800200 Port 2, reception data storage address 0x0C700020 → 0x01A08000 [Device Request], transfer destination AP: 0xA0, transfer source AP: 0x80 + 0x0C700024 → 0x80030000 Port 3, 4-byte data transmission 0x0C700028 → 0x0C800300 Port 3, reception data storage address 0x0C70002C → 0x01E0C000 [Device Request], transfer destination AP: 0xE0, transfer source AP: 0xC0 @@ -50,3 +53,38 @@ AP - Absolute Position ; MAPLE82E.pdf page 13 0x0C700034 → 0x0C800300 Port 3, reception data storage address 0x0C700038 → 0x09E0C001 [Get Condition], transfer destination AP: 0xC0, transfer source AP: 0xE0 0x0C70003C → 0x00000001 Function Type + +--- + +SB_MDSTAR 0x005F6C04: Starting address setting for the command table in system memory + Settable area: 0x0C000000 - 0x0FFFFFE0 + +SB_MDTSEL 0x005F6C10: Maple-DMA trigger setting + 0x00000000 : Software trigger + 0x00000001 : Hardware trigger + +SB_MDEN 0x005F6C14: Enables Maple-DMA + (Read) + 0x00000000 : Disable + 0x00000001 : Enable + (Write) + 0x00000000 : Disable + 0x00000001 : Enable + +SB_MDST 0x005F6C18: Maple-DMA software start + (Read) + 0x00000000 : Maple-DMA end + 0x00000001 : Maple-DMA transfer in progress + (Write) + 0x00000000 : Invalid + 0x00000001 : Maple-DMA start + +SB_MSYS 0x005F6C80: Maple system control setting + For details, refer to section 8.4.1.1, "System Registers." + +SB_MDAPRO 0x005F6C8C: Maple-DMA area protection setting + Settable area: 0x0C000000 to 0x0FFFFFE0 + +SB_ISTNRM 0x005F6900: Normal interrupt status + bit12: Maple-DMA end + For details on interrupt registers, refer to section 8.4.1.1, "System Registers." diff --git a/maple.cpp b/maple.cpp new file mode 100644 index 0000000..24c7600 --- /dev/null +++ b/maple.cpp @@ -0,0 +1,86 @@ +#define AP__PO__A (0b00 << 6) +#define AP__PO__B (0b01 << 6) +#define AP__PO__C (0b10 << 6) +#define AP__PO__D (0b11 << 6) + +#define AP__DE__DEVICE = (1 << 5) +#define AP__DE__EXPANSION_DEVICE = (0 << 5) +#define AP__DE__PORT = (0 << 5) + +#define AP__LM(reg) ((reg) & 0b11111) + +// 2.6.8 "Peripheral Data Transfers" +// 5 "User Interface"; page 269 + +#define HOST_INSTRUCTION__END_FLAG (1 << 31) +#define HOST_INSTRUCTION__PORT_SELECT__A (0b00 << 16) +#define HOST_INSTRUCTION__PORT_SELECT__B (0b01 << 16) +#define HOST_INSTRUCTION__PORT_SELECT__C (0b10 << 16) +#define HOST_INSTRUCTION__PORT_SELECT__D (0b11 << 16) +#define HOST_INSTRUCTION__TRANSFER_LENGTH(n) (((n) & 0xff) << 0) + +template +struct maple_host_command { + uint32_t host_instruction; + uint32_t receive_data_storage_address; + uint32_t protocol_data[N]; +}; + +void maple_host_command(uint32_t * buf, uint32_t * receive_address) +{ + auto command = reinterpet_cast *>(buf); + + command->host_instruction = HOST_INSTRUCTION__END_FLAG + | HOST_INSTRUCTION__PORT_SELECT__A + | HOST_INSTRUCTION__TRANSFER_LENGTH(0); // 4 bytes + + command->receive_data_storage_address = reinterpret_cast(receive_address); + + uint32_t command_code = 0x01; // 'Device Request' + uint32_t destination_ap = AP__DE__DEVICE | AP__PO__A; + uint32_t source_ap = AP__PO__A; + uint32_t data_size = 0; + command->protocol_data[0] = (command_code << 24) + | (destination_ap << 16) + | (source_ap << 8) + | (data_size << 0); +} + +void maple_dma_start(uint32_t * command_buf) +{ + sh7091.DMAC.DMAOR = DMAOR__DDT /* on-demand data transfer mode */ + | DMAOR__PR__CH2_CH0_CH1_CH3 /* priority mode; CH2 > CH0 > CH1 > CH3 */ + | DMAOR__DME; /* DMAC master enable */ + + // clear maple-DMA end status + system.ISTNRM = ISTNRM__END_OF_DMA_MAPLE_DMA; + + // disable maple-DMA + system.MDEN = mden::dma_enable::abort; + + volatile uint32_t _dummy = system.MDST; + (void)_dummy; + + // 20nsec * 0xc350 = 1ms + constexpr uint32_t one_msec = 0xc350; + system.MSYS = msys::time_out_counter(one_msec) + | msys::sending_rate::_2M; + + system.MDTSEL = mdtsel::trigger_select::software_initiation; + + /* top address: the first/lowest address + bottom address: the last/highest address */ + system.MDAPRO = mdapro::security_code + | mdapro::top_address(0x00) + | mdapro::bottom_address(0x7f); + + system.MDSTAR = mdstar::table_address(command_buf); + + system.MDEN = mden::dma_enable::enable; + system.MDST = mdst::start_status::start; + + // wait for completion + while ((system.ISTNRM & ISTNRM__END_OF_DMA_MAPLE_DMA) == 0); + + system.ISTNRM = ISTNRM__END_OF_DMA_MAPLE_DMA; +} diff --git a/maple.h b/maple.h new file mode 100644 index 0000000..2a528cf --- /dev/null +++ b/maple.h @@ -0,0 +1,78 @@ +#include + +#include "float_uint32.h" + +namespace mdstar { + constexpr uint32_t table_address(uint32_t num) { return (num & 0xfffffe0) << 0; } +} + +namespace mdtsel { + namespace trigger_select { + constexpr uint32_t software_initiation = 0 << 0; + constexpr uint32_t v_blank_initiation = 1 << 0; + } +} + +namespace mden { + namespace dma_enable { + constexpr uint32_t abort = 0 << 0; + constexpr uint32_t enable = 1 << 0; + constexpr uint32_t status(uint32_t reg) { return (reg >> 0) & 0x1; } + } +} + +namespace mdst { + namespace start_status { + constexpr uint32_t status(uint32_t reg) { return (reg >> 0) & 0x1; } + constexpr uint32_t start = 1 << 0; + } +} + +namespace msys { + constexpr uint32_t time_out_counter(uint32_t num) { return (num & 0xffff) << 16; } + constexpr uint32_t single_hard_trigger = 1 << 12; + + namespace sending_rate { + constexpr uint32_t _2M = 0 << 8; + constexpr uint32_t _1M = 1 << 8; + } + + constexpr uint32_t delay_time(uint32_t num) { return (num & 0xf) << 0; } +} + +namespace mst { + constexpr uint32_t move_status(uint32_t reg) { return (reg >> 31) & 0x1; } + constexpr uint32_t internal_frame_monitor(uint32_t reg) { return (reg >> 24) & 0x7; } + constexpr uint32_t internal_state_monitor(uint32_t reg) { return (reg >> 16) & 0x3f; } + constexpr uint32_t line_monitor(uint32_t reg) { return (reg >> 0) & 0xff; } +} + +namespace mshtcl { + constexpr uint32_t hard_dma_clear = 1 << 0; +} + +namespace mdapro { + constexpr uint32_t security_code = 0x6155 << 16; + constexpr uint32_t top_address(uint32_t num) { return (num & 0x7f) << 8; } + constexpr uint32_t bottom_address(uint32_t num) { return (num & 0x7f) << 0; } +} + +namespace mmsel { + namespace msb_selection { + constexpr uint32_t bit7 = 0 << 0; + constexpr uint32_t bit31 = 1 << 0; + } +} + +namespace mtxdad { + constexpr uint32_t txd_address_counter(uint32_t reg) { return (reg >> 0) & 0x1fffffff; } +} + +namespace mrxdad { + constexpr uint32_t rxd_address_counter(uint32_t reg) { return (reg >> 0) & 0x1fffffff; } +} + +namespace mrxdbd { + constexpr uint32_t rxd_base_address(uint32_t reg) { return (reg >> 0) & 0x1fffffff; } +} + diff --git a/regs/maple.csv b/regs/maple.csv new file mode 100644 index 0000000..1f74217 --- /dev/null +++ b/regs/maple.csv @@ -0,0 +1,38 @@ +"register_name","enum_name","bits","bit_name","value","mask","description" +"MDSTAR",,"27-0","table_address",,"0xfffffe0", +,,,,,, +"MDTSEL","trigger_select",0,"software_initiation",0,, +"MDTSEL","trigger_select",0,"v_blank_initiation",1,, +,,,,,, +"MDEN","dma_enable",0,"abort",0,, +"MDEN","dma_enable",0,"enable",1,, +"MDEN","dma_enable",0,"status",,, +,,,,,, +"MDST","start_status",0,"status",,, +"MDST","start_status",0,"start",1,, +,,,,,, +"MSYS",,"31-16","time_out_counter",,"0xffff", +"MSYS",,12,"single_hard_trigger",1,, +"MSYS","sending_rate","9-8","_2M",0,, +"MSYS","sending_rate","9-8","_1M",1,, +"MSYS",,"3-0","delay_time",,"0xf", +,,,,,, +"MST",,31,"move_status",,, +"MST",,"26-24","internal_frame_monitor",,, +"MST",,"21-16","internal_state_monitor",,, +"MST",,"7-0","line_monitor",,, +,,,,,, +"MSHTCL",,0,"hard_dma_clear",1,, +,,,,,, +"MDAPRO",,"31-16","security_code","0x6155",, +"MDAPRO",,"14-8","top_address",,"0x7f", +"MDAPRO",,"6-0","bottom_address",,"0x7f", +,,,,,, +"MMSEL","msb_selection",0,"bit7",0,, +"MMSEL","msb_selection",0,"bit31",1,, +,,,,,, +"MTXDAD",,"28-0","txd_address_counter",,, +,,,,,, +"MRXDAD",,"28-0","rxd_address_counter",,, +,,,,,, +"MRXDBD",,"28-0","rxd_base_address",,, diff --git a/regs/maple.ods b/regs/maple.ods new file mode 100644 index 0000000000000000000000000000000000000000..abbd202471baf23cd23db751dd00ff0df3121bd8 GIT binary patch literal 23918 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 R!`)cPKO}k5S+h9&_dnvk-=Y8j literal 0 HcmV?d00001