From d6716619c616ed02049caca3d267963233e40e8c Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Mon, 26 Feb 2024 17:46:35 +0800 Subject: [PATCH] gdrom: add gdrom_bits --- common.mk | 5 +- gdrom/gdrom_bits.hpp | 150 ++++++++++++++++++++++++++++++++---------- regs/gdrom.ods | Bin 15676 -> 16136 bytes regs/gdrom_bits.csv | 64 ++++++++++++++++++ regs/gdrom_bits.ods | Bin 0 -> 14862 bytes regs/gen/core_bits.py | 8 +-- 6 files changed, 186 insertions(+), 41 deletions(-) create mode 100644 regs/gdrom_bits.csv create mode 100644 regs/gdrom_bits.ods diff --git a/common.mk b/common.mk index 67ae4a0..2aaf69b 100644 --- a/common.mk +++ b/common.mk @@ -131,7 +131,7 @@ audio.pcm: $(BUILD_BINARY_O) %.csv: %.ods - libreoffice --headless -convert-to csv:"Text - txt - csv (StarCalc)":44,34,76,,,,true --outdir $(dir $@) $< + libreoffice --headless --convert-to csv:"Text - txt - csv (StarCalc)":44,34,76,,,,true --outdir $(dir $@) $< maple/maple_bus_commands.hpp: regs/maple_bus_commands.csv regs/gen/maple_bus_commands.py python regs/gen/maple_bus_commands.py $< > $@ @@ -160,6 +160,9 @@ sh7091/sh7091.hpp: regs/sh7091.csv regs/gen/sh7091.py sh7091/sh7091_bits.hpp: regs/sh7091_bits.csv regs/gen/core_bits.py python regs/gen/core_bits.py $< > $@ +gdrom/gdrom_bits.hpp: regs/gdrom_bits.csv regs/gen/core_bits.py + python regs/gen/core_bits.py $< gdrom > $@ + 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 > $@ diff --git a/gdrom/gdrom_bits.hpp b/gdrom/gdrom_bits.hpp index 19287d1..da237d7 100644 --- a/gdrom/gdrom_bits.hpp +++ b/gdrom/gdrom_bits.hpp @@ -1,43 +1,121 @@ +#pragma once + #include +#include "../float_uint32.hpp" + namespace gdrom { + namespace status { + constexpr uint32_t bsy(uint32_t reg) { return (reg >> 7) & 0x1; } + constexpr uint32_t drdy(uint32_t reg) { return (reg >> 6) & 0x1; } + constexpr uint32_t df(uint32_t reg) { return (reg >> 5) & 0x1; } + constexpr uint32_t dsc(uint32_t reg) { return (reg >> 4) & 0x1; } + constexpr uint32_t drq(uint32_t reg) { return (reg >> 3) & 0x1; } + constexpr uint32_t corr(uint32_t reg) { return (reg >> 2) & 0x1; } + constexpr uint32_t check(uint32_t reg) { return (reg >> 0) & 0x1; } + } -namespace status { + namespace alternate_status { + constexpr uint32_t bsy(uint32_t reg) { return (reg >> 7) & 0x1; } + constexpr uint32_t drdy(uint32_t reg) { return (reg >> 6) & 0x1; } + constexpr uint32_t df(uint32_t reg) { return (reg >> 5) & 0x1; } + constexpr uint32_t dsc(uint32_t reg) { return (reg >> 4) & 0x1; } + constexpr uint32_t drq(uint32_t reg) { return (reg >> 3) & 0x1; } + constexpr uint32_t corr(uint32_t reg) { return (reg >> 2) & 0x1; } + constexpr uint32_t check(uint32_t reg) { return (reg >> 0) & 0x1; } + } -constexpr uint8_t bsy = (1 << 7); -constexpr uint8_t drdy = (1 << 6); -constexpr uint8_t df = (1 << 5); -constexpr uint8_t dsc = (1 << 4); -constexpr uint8_t drq = (1 << 3); -constexpr uint8_t corr = (1 << 2); -constexpr uint8_t check = (1 << 0); - -} - -namespace interrupt_reason { - -constexpr uint8_t io = (1 << 1); -constexpr uint8_t cod = (1 << 0); - -} - -namespace command { - -constexpr uint8_t test_unit = 0x00; -constexpr uint8_t req_stat = 0x10; -constexpr uint8_t req_mode = 0x11; -constexpr uint8_t set_mode = 0x12; -constexpr uint8_t req_error = 0x13; -constexpr uint8_t get_toc = 0x14; -constexpr uint8_t req_ses = 0x15; -constexpr uint8_t cd_open = 0x16; -constexpr uint8_t cd_play = 0x20; -constexpr uint8_t cd_seek = 0x21; -constexpr uint8_t cd_scan = 0x22; -constexpr uint8_t cd_read = 0x30; -constexpr uint8_t cd_read2 = 0x31; -constexpr uint8_t get_scd = 0x40; - -} + namespace command { + namespace code { + constexpr uint32_t soft_reset = 0x08 << 0; + constexpr uint32_t execute_device_diagnostic = 0x90 << 0; + constexpr uint32_t nop = 0x00 << 0; + constexpr uint32_t packet_command = 0xa0 << 0; + constexpr uint32_t identify_device = 0xa1 << 0; + constexpr uint32_t set_features = 0xef << 0; + + constexpr uint32_t bit_mask = 0xff << 0; + } + } + + namespace device_control { + constexpr uint32_t device_control = 0b1000 << 0; + constexpr uint32_t srst = 1 << 2; + constexpr uint32_t nien = 1 << 1; + } + + namespace drive_select { + constexpr uint32_t drive_select = 0b1010 << 4; + constexpr uint32_t lun(uint32_t num) { return (num & 0xf) << 0; } + } + + namespace error { + constexpr uint32_t sense_key(uint32_t reg) { return (reg >> 4) & 0xf; } + constexpr uint32_t mcr(uint32_t reg) { return (reg >> 3) & 0x1; } + constexpr uint32_t abrt(uint32_t reg) { return (reg >> 2) & 0x1; } + constexpr uint32_t eomf(uint32_t reg) { return (reg >> 1) & 0x1; } + constexpr uint32_t ili(uint32_t reg) { return (reg >> 0) & 0x1; } + } + + namespace features { + namespace dma { + constexpr uint32_t disable = 0 << 0; + constexpr uint32_t enable = 1 << 0; + + constexpr uint32_t bit_mask = 0x1 << 0; + } + } + + namespace features_ata { + namespace set_clear { + constexpr uint32_t clear = 0 << 7; + constexpr uint32_t set = 1 << 7; + + constexpr uint32_t bit_mask = 0x1 << 7; + } + + namespace command { + constexpr uint32_t set_transfer_mode = 3 << 0; + + constexpr uint32_t bit_mask = 0x7f << 0; + } + } + + namespace interrupt_reason { + constexpr uint32_t io(uint32_t reg) { return (reg >> 1) & 0x1; } + constexpr uint32_t cod(uint32_t reg) { return (reg >> 0) & 0x1; } + } + + namespace sector_count { + namespace transfer_mode { + constexpr uint32_t pio_default_transfer_mode = 0b0000_0000 << 0; + constexpr uint32_t pio_flow_control_transfer_mode = 0b0000_1000 << 0; + constexpr uint32_t single_word_dma_mode = 0b0001_0000 << 0; + constexpr uint32_t multi_word_dma_mode = 0b0010_0000 << 0; + + constexpr uint32_t bit_mask = 0xff << 0; + } + } + + namespace sector_number { + constexpr uint32_t disc_format(uint32_t reg) { return (reg >> 4) & 0xf; } + constexpr uint32_t status(uint32_t reg) { return (reg >> 0) & 0xf; } + } + + namespace error_ata { + namespace sense_key { + constexpr uint32_t no_sense = 0x0 << 0; + constexpr uint32_t recovered_error = 0x1 << 0; + constexpr uint32_t not_ready = 0x2 << 0; + constexpr uint32_t medium_error = 0x3 << 0; + constexpr uint32_t hardware_error = 0x4 << 0; + constexpr uint32_t illegal_request = 0x5 << 0; + constexpr uint32_t unit_attention = 0x6 << 0; + constexpr uint32_t data_protect = 0x7 << 0; + constexpr uint32_t aborted_command = 0xb << 0; + + constexpr uint32_t bit_mask = 0xf << 0; + } + } } diff --git a/regs/gdrom.ods b/regs/gdrom.ods index 19da936b8c854a63aed1de52bd4f6d32bc1e80a5..434c1e19697f7e20a0267f66a2c8ac2e171a925d 100644 GIT binary patch delta 14031 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 O&_#Y~gig*sNdFI@JM|#| diff --git a/regs/gdrom_bits.csv b/regs/gdrom_bits.csv new file mode 100644 index 0000000..c810446 --- /dev/null +++ b/regs/gdrom_bits.csv @@ -0,0 +1,64 @@ +"register_name","enum_name","bits","bit_name","value","mask","description" +"status",,"7","bsy",,, +"status",,"6","drdy",,, +"status",,"5","df",,, +"status",,"4","dsc",,, +"status",,"3","drq",,, +"status",,"2","corr",,, +"status",,"0","check",,, +,,,,,, +"alternate_status",,"7","bsy",,, +"alternate_status",,"6","drdy",,, +"alternate_status",,"5","df",,, +"alternate_status",,"4","dsc",,, +"alternate_status",,"3","drq",,, +"alternate_status",,"2","corr",,, +"alternate_status",,"0","check",,, +,,,,,, +"command","code","7-0","soft_reset","0x08",, +"command","code","7-0","execute_device_diagnostic","0x90",, +"command","code","7-0","nop","0x00",, +"command","code","7-0","packet_command","0xa0",, +"command","code","7-0","identify_device","0xa1",, +"command","code","7-0","set_features","0xef",, +,,,,,, +"device_control",,"3,0","device_control","0b1000",, +"device_control",,"2","srst","1",, +"device_control",,"1","nien","1",, +,,,,,, +"drive_select",,"7-4","drive_select","0b1010",, +"drive_select",,"3-0","lun",,"0xf", +,,,,,, +"error",,"7-4","sense_key",,, +"error",,"3","mcr",,, +"error",,"2","abrt",,, +"error",,"1","eomf",,, +"error",,"0","ili",,, +,,,,,, +"features","dma","0","disable","0",, +"features","dma","0","enable","1",, +,,,,,, +"features_ata","set_clear","7","clear","0",, +"features_ata","set_clear","7","set","1",, +"features_ata","command","6-0","set_transfer_mode","3",, +,,,,,, +"interrupt_reason",,"1","io",,, +"interrupt_reason",,"0","cod",,, +,,,,,, +"sector_count","transfer_mode","7-0","pio_default_transfer_mode","0b0000_0000",, +"sector_count","transfer_mode","7-0","pio_flow_control_transfer_mode","0b0000_1000",, +"sector_count","transfer_mode","7-0","single_word_dma_mode","0b0001_0000",, +"sector_count","transfer_mode","7-0","multi_word_dma_mode","0b0010_0000",, +,,,,,, +"sector_number",,"7-4","disc_format",,, +"sector_number",,"3-0","status",,, +,,,,,, +"error_ata","sense_key","3-0","no_sense","0x0",, +"error_ata","sense_key","3-0","recovered_error","0x1",, +"error_ata","sense_key","3-0","not_ready","0x2",, +"error_ata","sense_key","3-0","medium_error","0x3",, +"error_ata","sense_key","3-0","hardware_error","0x4",, +"error_ata","sense_key","3-0","illegal_request","0x5",, +"error_ata","sense_key","3-0","unit_attention","0x6",, +"error_ata","sense_key","3-0","data_protect","0x7",, +"error_ata","sense_key","3-0","aborted_command","0xb",, diff --git a/regs/gdrom_bits.ods b/regs/gdrom_bits.ods new file mode 100644 index 0000000000000000000000000000000000000000..8e7180571706a3e5d0ea01145435d73009105cf6 GIT binary patch literal 14862 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

t7D3z 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 max(bits), (all_bits, bits) all_bits |= bits @@ -51,11 +51,11 @@ def aggregate_enums(aggregated_rows): bits = parse_bit_range(row["bits"]) assert row["bit_name"] != "", row if row["enum_name"] == "": - assert_unique_ordered(bits) + assert_unique_ordered(bits, row) non_enum.append(row) else: if row["enum_name"] not in enum_bits: - assert_unique_ordered(bits) + assert_unique_ordered(bits, row) non_enum.append(row["enum_name"]) else: assert enum_bits[row["enum_name"]] == bits, row