From d32bd87baa7f09770264c1a5c2da3f1d224ea9f6 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Tue, 12 Nov 2024 20:37:40 -0600 Subject: [PATCH] example: add UBC experiment --- example/illslot.s | 4 +- example/interrupt.cpp | 114 +- example/maple_device_request.cpp | 10 +- ip.lds | 2 +- loader.lds | 2 +- maple/maple.cpp | 12 +- maple/maple.hpp | 4 +- maple/maple_host_command_writer.hpp | 32 +- regs/gen/core_bits.py | 28 +- regs/sh7091_bits.csv | 71 + regs/sh7091_bits.ods | Bin 21307 -> 26732 bytes serial_load.cpp | 2 - sh7091/sh7091_bits.hpp | 1908 +++++++++++++++++---------- 13 files changed, 1468 insertions(+), 721 deletions(-) diff --git a/example/illslot.s b/example/illslot.s index 76deb3c..039028b 100644 --- a/example/illslot.s +++ b/example/illslot.s @@ -1,6 +1,8 @@ .global _illslot _illslot: + trapa #12 rts - mova test,r0 + nop + mova test,r0 test: .long 0x12345678 diff --git a/example/interrupt.cpp b/example/interrupt.cpp index 3116687..ed8bc94 100644 --- a/example/interrupt.cpp +++ b/example/interrupt.cpp @@ -11,9 +11,11 @@ void vbr100() { serial::string("vbr100\n"); serial::string("expevt "); - serial::integer(sh7091.CCN.EXPEVT); + serial::integer(sh7091.CCN.EXPEVT); serial::string("intevt "); - serial::integer(sh7091.CCN.INTEVT); + serial::integer(sh7091.CCN.INTEVT); + serial::string("tra "); + serial::integer(sh7091.CCN.TRA); uint32_t spc; uint32_t ssr; asm volatile ("stc spc,%0" @@ -42,9 +44,53 @@ void vbr600() while (1); } +__attribute__ ((interrupt_handler)) +void dbr(); + +void dbr() +{ + serial::string("dbr\n"); + serial::string("expevt "); + serial::integer(sh7091.CCN.EXPEVT); + serial::string("intevt "); + serial::integer(sh7091.CCN.INTEVT); + serial::string("tra "); + serial::integer(sh7091.CCN.TRA); + + uint32_t spc; + uint32_t ssr; + asm volatile ("stc spc,%0" : "=r" (spc) ); + asm volatile ("stc ssr,%0" : "=r" (ssr) ); + serial::string("spc "); + serial::integer(spc); + serial::string("ssr "); + serial::integer(ssr); + + uint32_t sr; + asm volatile ("stc sr,%0" : "=r" (sr) ); + serial::string("sr "); + serial::integer(sr); + + return; +} + +int do_stuff(int a, int b) +{ + serial::string("do_stuff\n"); + asm volatile ("nop;"); + return a + b; +} + extern "C" uint32_t * illslot(void); + void main() { + serial::string("main\n"); + for (int i = 0; i < 10000000; i++) { + asm volatile ("nop;"); + } + //serial::init(0); + uint32_t vbr = reinterpret_cast(&__vbr_link_start) - 0x100; system.IML2NRM = 0; @@ -83,24 +129,64 @@ void main() serial::string("sr "); serial::integer(sr); - sr = sr & (~(1 << 28)); // BL + sr &= ~sh::sr::bl; // BL + sr |= sh::sr::imask(15); // imask - asm volatile ("ldc %0, sr" + serial::string("sr "); + serial::integer(sr); + + asm volatile ("ldc %0,sr" : : "r" (sr)); - /* - uint32_t vbr2; - asm volatile ("stc vbr,%0" - : "=r" (vbr2)); - */ - + serial::string("vbr "); serial::integer(vbr); - //serial::integer(vbr2); + serial::string("vbr100 "); serial::integer(reinterpret_cast(&vbr100)); - uint32_t * test = illslot(); - serial::integer(*test); + (void)dbr; + uint32_t dbr_address = reinterpret_cast(&dbr); + asm volatile ("ldc %0,dbr" + : + : "r" (dbr_address)); + serial::string("dbr "); + serial::integer(dbr_address); - while (1); + sh7091.UBC.BARA = reinterpret_cast(&do_stuff); + sh7091.CCN.BASRA = 0; + sh7091.UBC.BAMRA + = ubc::bamra::bama::all_bara_bits_are_included_in_break_conditions + | ubc::bamra::basma::no_basra_bits_are_included_in_break_conditions + ; + sh7091.UBC.BBRA + = ubc::bbra::sza::operand_size_is_not_included_in_break_conditions + | ubc::bbra::ida::instruction_access_cycle_is_used_as_break_condition + | ubc::bbra::rwa::read_cycle_or_write_cycle_is_used_as_break_condition + ; + sh7091.UBC.BRCR + = ubc::brcr::pcba::channel_a_pc_break_is_effected_before_instruction_execution + | ubc::brcr::ubde::user_break_debug_function_is_used + ; + serial::string("basra "); + serial::integer(sh7091.CCN.BASRA); + serial::string("bara "); + serial::integer(sh7091.UBC.BARA); + serial::string("bamra "); + serial::integer(sh7091.UBC.BAMRA); + serial::string("bbra "); + serial::integer(sh7091.UBC.BBRA); + serial::string("brcr "); + serial::integer(sh7091.UBC.BRCR); + + int res = do_stuff(1, 2); + (void)res; + + /* + uint32_t * test = illslot(); + serial::string("illslot\n"); + serial::integer(*test); + */ + serial::string("return\n"); + + //while (1); } diff --git a/example/maple_device_request.cpp b/example/maple_device_request.cpp index 0aed218..cb5beb8 100644 --- a/example/maple_device_request.cpp +++ b/example/maple_device_request.cpp @@ -7,15 +7,15 @@ void main() { - serial::init(0); + //serial::init(0); - uint32_t send_buf[1024] __attribute__((aligned(32))); - uint32_t recv_buf[1024] __attribute__((aligned(32))); + uint8_t send_buf[1024] __attribute__((aligned(32))); + uint8_t recv_buf[1024] __attribute__((aligned(32))); using command_type = maple::device_request; using response_type = maple::device_status; - auto writer = maple::host_command_writer(send_buf, recv_buf); + auto writer = maple::host_command_writer<>(send_buf, recv_buf); auto [host_command, host_response] = writer.append_command_all_ports(); @@ -47,5 +47,5 @@ void main() } } - while (1); + //while (1); } diff --git a/ip.lds b/ip.lds index ab523e2..82337f4 100644 --- a/ip.lds +++ b/ip.lds @@ -99,4 +99,4 @@ __vbr_load_end = 0; INCLUDE "addresses.lds" __send_buf = 0xac000020; -__recv_buf = 0xac002020; +__recv_buf = 0xac004020; diff --git a/loader.lds b/loader.lds index cbe0cc1..14a9444 100644 --- a/loader.lds +++ b/loader.lds @@ -75,4 +75,4 @@ INCLUDE "addresses.lds" __stack_end = 0x8c00f000; __send_buf = 0xac000020; -__recv_buf = 0xac002020; +__recv_buf = 0xac004000; diff --git a/maple/maple.cpp b/maple/maple.cpp index d77a3e4..c14c5a8 100644 --- a/maple/maple.cpp +++ b/maple/maple.cpp @@ -107,12 +107,10 @@ uint32_t init_block_write(uint32_t * command_buf, uint32_t * receive_buf, } */ -static inline void _dma_start(const uint32_t * command_buf) +static inline void _dma_start(const uint8_t * command_buf) { using namespace dmac; - //command_buf = reinterpret_cast(reinterpret_cast(command_buf) | 0xa000'0000); - sh7091.DMAC.DMAOR = dmaor::ddt::on_demand_data_transfer_mode /* on-demand data transfer mode */ | dmaor::pr::ch2_ch0_ch1_ch3 /* priority mode; CH2 > CH0 > CH1 > CH3 */ | dmaor::dme::operation_enabled_on_all_channels; /* DMAC master enable */ @@ -161,9 +159,9 @@ bool dma_poll_complete() return complete; } -void dma_start(const uint32_t * send_buf, +void dma_start(uint8_t const * const send_buf, const uint32_t send_size, - const uint32_t * recv_buf, + uint8_t * const recv_buf, const uint32_t recv_size ) { @@ -171,7 +169,7 @@ void dma_start(const uint32_t * send_buf, for (uint32_t i = 0; i < align_32byte(send_size) / 32; i++) { asm volatile ("ocbwb @%0" : // output - : "r" (reinterpret_cast(&send_buf[(32 * i) / 4])) // input + : "r" (reinterpret_cast(&send_buf[32 * i])) // input ); } @@ -182,7 +180,7 @@ void dma_start(const uint32_t * send_buf, for (uint32_t i = 0; i < align_32byte(recv_size) / 32; i++) { asm volatile ("ocbp @%0" : // output - : "r" (reinterpret_cast(&recv_buf[(32 * i) / 4])) // input + : "r" (reinterpret_cast(&recv_buf[32 * i])) // input ); } } diff --git a/maple/maple.hpp b/maple/maple.hpp index 7b92600..e0c04bf 100644 --- a/maple/maple.hpp +++ b/maple/maple.hpp @@ -38,9 +38,9 @@ void dma_wait_complete(); bool dma_poll_complete(); -void dma_start(uint32_t const * const command_buf, +void dma_start(uint8_t const * const command_buf, const uint32_t command_size, - uint32_t const * const receive_buf, + uint8_t * const receive_buf, const uint32_t receive_size ); diff --git a/maple/maple_host_command_writer.hpp b/maple/maple_host_command_writer.hpp index d82b17c..a14cba3 100644 --- a/maple/maple_host_command_writer.hpp +++ b/maple/maple_host_command_writer.hpp @@ -12,14 +12,15 @@ namespace maple { template struct host_command_writer { - uint32_t * const send_buf; - uint32_t * const recv_buf; + uint8_t * const send_buf; + uint8_t * const recv_buf; uint32_t send_offset; uint32_t recv_offset; + uint32_t last_send_offset; - constexpr host_command_writer(uint32_t * const send_buf, - uint32_t * const recv_buf) - : send_buf(send_buf), recv_buf(recv_buf), send_offset(0), recv_offset(0) + constexpr host_command_writer(uint8_t * const send_buf, + uint8_t * const recv_buf) + : send_buf(send_buf), recv_buf(recv_buf), send_offset(0), recv_offset(0), last_send_offset(0) { } template @@ -38,8 +39,8 @@ struct host_command_writer { static_assert((sizeof (command_type)) % 4 == 0); static_assert((sizeof (response_type)) % 4 == 0); - auto host_command = reinterpret_cast(&send_buf[send_offset / 4]); - auto host_response = reinterpret_cast(&recv_buf[recv_offset / 4]); + auto host_command = reinterpret_cast(&send_buf[send_offset]); + auto host_response = reinterpret_cast(&recv_buf[recv_offset]); host_command->host_instruction = (end_flag ? host_instruction::end_flag : 0) | (host_port_select & host_instruction::port_select::bit_mask) @@ -59,6 +60,7 @@ struct host_command_writer { host_command->bus_data.source_ap = destination_ap & ap::port_select::bit_mask; host_command->bus_data.data_size = data_size / 4; + last_send_offset = send_offset; send_offset += (sizeof (command_type)) + send_trailing; recv_offset += (sizeof (response_type)) + recv_trailing; @@ -76,6 +78,22 @@ struct host_command_writer { append_command(host_instruction::port_select::d, ap::de::device | ap::port_select::d, true); return ret; } + + void set_end_flag() + { + using host_command_type = maple::host_command; + auto host_command = reinterpret_cast(&send_buf[last_send_offset]); + host_command->host_instruction |= host_instruction::end_flag; + } + + uint32_t reset() + { + const uint32_t old_recv_offset = recv_offset; + // reset writer + send_offset = 0; + recv_offset = 0; + return old_recv_offset; + } }; } diff --git a/regs/gen/core_bits.py b/regs/gen/core_bits.py index 3861916..939caca 100644 --- a/regs/gen/core_bits.py +++ b/regs/gen/core_bits.py @@ -15,22 +15,26 @@ def aggregate_registers(d): return dict(aggregated) def parse_bit_number(s): - assert '-' not in s + assert '-' not in s, s + assert ',' not in s, s return int(s, 10) -def parse_bit_set(s, split_char): - assert len(list(c for c in s if c == split_char)) == 1 - left, right = map(parse_bit_number, s.split(split_char, maxsplit=1)) - assert left > right, (left, right) - return left, right +def parse_bit_set(s, split_char, maxsplit): + #assert len(list(c for c in s if c == split_char)) == 1, s + split = list(map(parse_bit_number, s.split(split_char, maxsplit=maxsplit))) + for i in range(len(split) - 1): + left = split[i] + right = split[i+1] + assert left > right, (left, right) + return split def parse_bit_range(s): if '-' in s: - left, right = parse_bit_set(s, '-') + left, right = parse_bit_set(s, '-', 1) return set(range(right, left+1)) elif ',' in s: - left, right = parse_bit_set(s, ',') - return set([right, left]) + bits = parse_bit_set(s, ',', -1) + return set(bits) else: num = parse_bit_number(s) return set([num]) @@ -124,8 +128,10 @@ def aggregate_all_enums(aggregated): ''' def mask_from_bits(bits): - h, l = max(bits), min(bits) - mask = 2 ** ((h - l) + 1) - 1 + mask = 0 + for b in bits: + mask |= 1 << b + mask >>= min(bits) return mask def parse_value(value): diff --git a/regs/sh7091_bits.csv b/regs/sh7091_bits.csv index db82ffd..59efd22 100644 --- a/regs/sh7091_bits.csv +++ b/regs/sh7091_bits.csv @@ -293,3 +293,74 @@ "SCIF","SCSPTR2","SPB2DT","0","input_output_data_is_high_level","1",, ,,,,,,, "SCIF","SCLSR2","ORER","0","overrun_error_occured","1",, +,,,,,,, +"SH","SR",,"30","md","1",, +"SH","SR",,"29","rb","1",, +"SH","SR",,"28","bl","1",, +"SH","SR",,"15","fd","1",, +"SH","SR",,"9","m","1",, +"SH","SR",,"8","q","1",, +"SH","SR",,"7-4","imask",,"0b1111", +"SH","SR",,"1","s","1",, +"SH","SR",,"0","t","1",, +,,,,,,, +"SH","FPSCR",,"21","fr","1",, +"SH","FPSCR",,"20","sz","1",, +"SH","FPSCR",,"19","pr","1",, +"SH","FPSCR",,"18","dn","1",, +"SH","FPSCR","CAUSE","17-12","fpu_error","0b100000",, +"SH","FPSCR","CAUSE","17-12","invalid_operation","0b010000",, +"SH","FPSCR","CAUSE","17-12","division_by_zero","0b001000",, +"SH","FPSCR","CAUSE","17-12","overflow","0b000100",, +"SH","FPSCR","CAUSE","17-12","underflow","0b000010",, +"SH","FPSCR","CAUSE","17-12","inexact","0b000001",, +"SH","FPSCR","ENABLED","11-7","invalid_operation","0b10000",, +"SH","FPSCR","ENABLED","11-7","division_by_zero","0b01000",, +"SH","FPSCR","ENABLED","11-7","overflow","0b00100",, +"SH","FPSCR","ENABLED","11-7","underflow","0b00010",, +"SH","FPSCR","ENABLED","11-7","inexact","0b00001",, +"SH","FPSCR","FLAG","6-2","invalid_operation","0b10000",, +"SH","FPSCR","FLAG","6-2","division_by_zero","0b01000",, +"SH","FPSCR","FLAG","6-2","overflow","0b00100",, +"SH","FPSCR","FLAG","6-2","underflow","0b00010",, +"SH","FPSCR","FLAG","6-2","inexact","0b00001",, +"SH","FPSCR","RM","1-0","round_to_nearest","0b00",, +"SH","FPSCR","RM","1-0","round_to_zero","0b01",, +,,,,,,, +"UBC","BAMRA","BAMA","3,1,0","all_bara_bits_are_included_in_break_conditions","0b0000",, +"UBC","BAMRA","BAMA","3,1,0","lower_10_bits_of_bara_are_not_included_in_break_conditions","0b0001",, +"UBC","BAMRA","BAMA","3,1,0","lower_12_bits_of_bara_are_not_included_in_break_conditions","0b0010",, +"UBC","BAMRA","BAMA","3,1,0","all_bara_bits_are_not_included_in_break_conditions","0b0011",, +"UBC","BAMRA","BAMA","3,1,0","lower_16_bits_of_bara_are_not_included_in_break_conditions","0b1000",, +"UBC","BAMRA","BAMA","3,1,0","lower_20_bits_of_bara_are_not_included_in_break_conditions","0b1001",, +"UBC","BAMRA","BASMA","2","all_basra_bits_are_included_in_break_conditions","0",, +"UBC","BAMRA","BASMA","2","no_basra_bits_are_included_in_break_conditions","1",, +,,,,,,, +"UBC","BBRA","SZA","6,1,0","operand_size_is_not_included_in_break_conditions","0b00",, +"UBC","BBRA","SZA","6,1,0","byte_access_is_used_as_break_condition","0b01",, +"UBC","BBRA","SZA","6,1,0","word_access_is_used_as_break_condition","0b10",, +"UBC","BBRA","SZA","6,1,0","longword_access_is_used_as_break_condition","0b11",, +"UBC","BBRA","SZA","6,1,0","quadword_access_is_used_as_break_condition","0b1000000",, +"UBC","BBRA","IDA","5-4","condition_comparison_is_not_performed","0b00",, +"UBC","BBRA","IDA","5-4","instruction_access_cycle_is_used_as_break_condition","0b01",, +"UBC","BBRA","IDA","5-4","operand_access_cycle_is_used_as_break_condition","0b10",, +"UBC","BBRA","IDA","5-4","instruction_access_cycle_or_operand_access_cycle_is_used_as_break_condition","0b11",, +"UBC","BBRA","RWA","3-2","condition_comparison_is_not_performed","0b00",, +"UBC","BBRA","RWA","3-2","read_cycle_is_used_as_break_condition","0b01",, +"UBC","BBRA","RWA","3-2","write_cycle_is_used_as_break_condition","0b10",, +"UBC","BBRA","RWA","3-2","read_cycle_or_write_cycle_is_used_as_break_condition","0b11",, +,,,,,,, +"UBC","BRCR","CMFA","15","channel_a_break_condition_is_not_matched","0",, +"UBC","BRCR","CMFA","15","channel_a_break_condition_match_has_occured","1",, +"UBC","BRCR","CMFB","14","channel_b_break_condition_is_not_matched","0",, +"UBC","BRCR","CMFB","14","channel_b_break_condition_match_has_occured","1",, +"UBC","BRCR","PCBA","10","channel_a_pc_break_is_effected_before_instruction_execution","0",, +"UBC","BRCR","PCBA","10","channel_a_pc_break_is_effected_after_instruction_execution","1",, +"UBC","BRCR","DBEB","7","data_bus_condition_is_not_included_in_channel_b_conditions","0",, +"UBC","BRCR","DBEB","7","data_bus_condition_is_included_in_channel_b_conditions","1",, +"UBC","BRCR","PCBB","6","channel_b_pc_break_is_effected_before_instruction_execution","0",, +"UBC","BRCR","PCBB","6","channel_b_pc_break_is_effected_after_instruction_execution","1",, +"UBC","BRCR","SEQ","3","channel_a_and_b_comparison_are_performed_as_independent_condition","0",, +"UBC","BRCR","SEQ","3","channel_a_and_b_comparison_are_performed_as_sequential_condition","1",, +"UBC","BRCR","UBDE","0","user_break_debug_function_is_not_used","0",, +"UBC","BRCR","UBDE","0","user_break_debug_function_is_used","1",, diff --git a/regs/sh7091_bits.ods b/regs/sh7091_bits.ods index e15da92314a91c7eb88302ea0b29e86082e67003..5956d1ea4f1364536bb1c782627711415f2bb663 100644 GIT binary patch delta 24970 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 delta 19448 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 diff --git a/serial_load.cpp b/serial_load.cpp index c0849c1..d29c181 100644 --- a/serial_load.cpp +++ b/serial_load.cpp @@ -72,7 +72,6 @@ static void poststart_read() static void prestart_maple_raw__command() { uint32_t dest = reinterpret_cast(&__send_buf); - //uint32_t dest = 0xac000020; uint32_t size = state.buf.arg[0]; serial::recv_dma(dest - 1, size + 1); state.reply_crc.value = 0xffffffff; @@ -82,7 +81,6 @@ static void prestart_maple_raw__command() static void prestart_maple_raw__response() { uint32_t src = reinterpret_cast(&__recv_buf); - //uint32_t src = 0xac002020; uint32_t size = state.buf.arg[1]; serial::send_dma(src, size); state.reply_crc.value = 0xffffffff; diff --git a/sh7091/sh7091_bits.hpp b/sh7091/sh7091_bits.hpp index 2a931d9..bac8ffd 100644 --- a/sh7091/sh7091_bits.hpp +++ b/sh7091/sh7091_bits.hpp @@ -3,826 +3,1394 @@ #include namespace ccn { - namespace pteh { - constexpr uint32_t VPN(uint32_t reg) { return (reg >> 10) & 0x3fffff; } - constexpr uint32_t ASID(uint32_t reg) { return (reg >> 0) & 0xff; } - } +namespace pteh { +constexpr uint32_t VPN(uint32_t reg) { return (reg >> 10) & 0x3fffff; } +constexpr uint32_t ASID(uint32_t reg) { return (reg >> 0) & 0xff; } +} - namespace ptel { - constexpr uint32_t PPN(uint32_t reg) { return (reg >> 10) & 0x7ffff; } +namespace ptel { +constexpr uint32_t PPN(uint32_t reg) { return (reg >> 10) & 0x7ffff; } - namespace v { - constexpr uint32_t invalid = 0 << 8; - constexpr uint32_t valid = 1 << 8; +namespace v { +constexpr uint32_t invalid = 0 << 8; - constexpr uint32_t bit_mask = 0x1 << 8; - } +constexpr uint32_t valid = 1 << 8; - namespace sz { - constexpr uint32_t _1_kbyte_page = 0b0000 << 4; - constexpr uint32_t _4_kbyte_page = 0b0001 << 4; - constexpr uint32_t _64_kbyte_page = 0b1000 << 4; - constexpr uint32_t _1_mbyte_page = 0b1001 << 4; - constexpr uint32_t bit_mask = 0xf << 4; - } +constexpr uint32_t bit_mask = 0x1 << 8; - namespace pr { - constexpr uint32_t read_only_in_privileged_mode = 0b00 << 5; - constexpr uint32_t read_write_in_privileged_mode = 0b01 << 5; - constexpr uint32_t read_only_in_privileged_and_user_mode = 0b10 << 5; - constexpr uint32_t read_write_in_privileged_and_user_mode = 0b11 << 5; +} - constexpr uint32_t bit_mask = 0x3 << 5; - } +namespace sz { +constexpr uint32_t _1_kbyte_page = 0b0000 << 4; - namespace c { - constexpr uint32_t not_cacheable = 0 << 3; - constexpr uint32_t cacheable = 1 << 3; +constexpr uint32_t _4_kbyte_page = 0b0001 << 4; - constexpr uint32_t bit_mask = 0x1 << 3; - } +constexpr uint32_t _64_kbyte_page = 0b1000 << 4; - namespace d { - constexpr uint32_t write_has_not_been_performed = 0 << 2; - constexpr uint32_t write_has_been_performed = 1 << 2; +constexpr uint32_t _1_mbyte_page = 0b1001 << 4; - constexpr uint32_t bit_mask = 0x1 << 2; - } - namespace sh { - constexpr uint32_t pages_are_shared_by_processes = 0 << 1; - constexpr uint32_t pages_are_not_shared_by_processes = 1 << 1; +constexpr uint32_t bit_mask = 0x9 << 4; - constexpr uint32_t bit_mask = 0x1 << 1; - } +} - namespace wt { - constexpr uint32_t copy_back_mode = 0 << 0; - constexpr uint32_t write_through_mode = 1 << 0; +namespace pr { +constexpr uint32_t read_only_in_privileged_mode = 0b00 << 5; - constexpr uint32_t bit_mask = 0x1 << 0; - } - } +constexpr uint32_t read_write_in_privileged_mode = 0b01 << 5; - namespace mmucr { - constexpr uint32_t LRUI(uint32_t reg) { return (reg >> 26) & 0x3f; } - constexpr uint32_t URB(uint32_t reg) { return (reg >> 18) & 0x3f; } - constexpr uint32_t URC(uint32_t reg) { return (reg >> 10) & 0x3f; } +constexpr uint32_t read_only_in_privileged_and_user_mode = 0b10 << 5; - namespace sqmd { - constexpr uint32_t user_privileged_access_possible = 0 << 9; - constexpr uint32_t privileged_access_possible = 1 << 9; +constexpr uint32_t read_write_in_privileged_and_user_mode = 0b11 << 5; - constexpr uint32_t bit_mask = 0x1 << 9; - } - namespace sv { - constexpr uint32_t multiple_virtual_memory_mode = 0 << 8; - constexpr uint32_t single_virtual_memory_mode = 1 << 8; +constexpr uint32_t bit_mask = 0x3 << 5; - constexpr uint32_t bit_mask = 0x1 << 8; - } +} - namespace ti { - constexpr uint32_t invalidate_all_utlb_itlb_bits = 1 << 2; +namespace c { +constexpr uint32_t not_cacheable = 0 << 3; - constexpr uint32_t bit_mask = 0x1 << 2; - } +constexpr uint32_t cacheable = 1 << 3; - namespace at { - constexpr uint32_t mmu_disabled = 0 << 0; - constexpr uint32_t mmu_enabled = 1 << 0; - constexpr uint32_t bit_mask = 0x1 << 0; - } - } +constexpr uint32_t bit_mask = 0x1 << 3; - namespace basra { - constexpr uint32_t basa(uint32_t num) { return (num & 0xff) << 0; } - } +} - namespace basrb { - constexpr uint32_t basa(uint32_t num) { return (num & 0xff) << 0; } - } +namespace d { +constexpr uint32_t write_has_not_been_performed = 0 << 2; - namespace ccr { - namespace iix { - constexpr uint32_t address_bits_12_5_used_for_ic_entry_selection = 0 << 15; - constexpr uint32_t address_bits_25_and_11_5_used_for_ic_entry_selection = 1 << 15; +constexpr uint32_t write_has_been_performed = 1 << 2; - constexpr uint32_t bit_mask = 0x1 << 15; - } - namespace ici { - constexpr uint32_t clear_v_bits_of_all_ic_entries = 1 << 11; +constexpr uint32_t bit_mask = 0x1 << 2; - constexpr uint32_t bit_mask = 0x1 << 11; - } +} - namespace ice { - constexpr uint32_t ic_not_used = 0 << 8; - constexpr uint32_t ic_used = 1 << 8; +namespace sh { +constexpr uint32_t pages_are_shared_by_processes = 0 << 1; - constexpr uint32_t bit_mask = 0x1 << 8; - } +constexpr uint32_t pages_are_not_shared_by_processes = 1 << 1; - namespace oix { - constexpr uint32_t address_bits_13_5_used_for_oc_entry_selection = 0 << 7; - constexpr uint32_t address_bits_25_and_12_5_used_for_oc_entry_selection = 1 << 7; - constexpr uint32_t bit_mask = 0x1 << 7; - } +constexpr uint32_t bit_mask = 0x1 << 1; - namespace ora { - constexpr uint32_t _16_kbytes_used_as_cache = 0 << 5; - constexpr uint32_t _8_kbytes_used_as_cache_8_kbytes_used_as_ram = 1 << 5; +} - constexpr uint32_t bit_mask = 0x1 << 5; - } +namespace wt { +constexpr uint32_t copy_back_mode = 0 << 0; - namespace oci { - constexpr uint32_t clear_v_and_u_bits_of_all_oc_entries = 1 << 3; +constexpr uint32_t write_through_mode = 1 << 0; - constexpr uint32_t bit_mask = 0x1 << 3; - } - namespace cb { - constexpr uint32_t write_through_mode = 0 << 2; - constexpr uint32_t copy_back_mode = 1 << 2; +constexpr uint32_t bit_mask = 0x1 << 0; - constexpr uint32_t bit_mask = 0x1 << 2; - } +} +} - namespace wt { - constexpr uint32_t copy_back_mode = 0 << 1; - constexpr uint32_t write_through_mode = 1 << 1; +namespace mmucr { +constexpr uint32_t LRUI(uint32_t reg) { return (reg >> 26) & 0x3f; } +constexpr uint32_t URB(uint32_t reg) { return (reg >> 18) & 0x3f; } +constexpr uint32_t URC(uint32_t reg) { return (reg >> 10) & 0x3f; } - constexpr uint32_t bit_mask = 0x1 << 1; - } +namespace sqmd { +constexpr uint32_t user_privileged_access_possible = 0 << 9; - namespace oce { - constexpr uint32_t oc_not_used = 0 << 0; - constexpr uint32_t oc_used = 1 << 0; +constexpr uint32_t privileged_access_possible = 1 << 9; - constexpr uint32_t bit_mask = 0x1 << 0; - } - } - namespace tra { - constexpr uint32_t imm(uint32_t reg) { return (reg >> 2) & 0xff; } - } +constexpr uint32_t bit_mask = 0x1 << 9; - namespace expevt { - constexpr uint32_t exception_code(uint32_t reg) { return (reg >> 0) & 0xfff; } - } +} - namespace intevt { - constexpr uint32_t exception_code(uint32_t reg) { return (reg >> 0) & 0xfff; } - } +namespace sv { +constexpr uint32_t multiple_virtual_memory_mode = 0 << 8; - namespace ptea { - namespace tc { - constexpr uint32_t area_5_is_used = 0 << 3; - constexpr uint32_t area_6_is_used = 1 << 3; +constexpr uint32_t single_virtual_memory_mode = 1 << 8; - constexpr uint32_t bit_mask = 0x1 << 3; - } - namespace sa { - constexpr uint32_t undefined = 0b000 << 0; - constexpr uint32_t variable_size_io_space = 0b001 << 0; - constexpr uint32_t _8_bit_io_space = 0b010 << 0; - constexpr uint32_t _16_bit_io_space = 0b011 << 0; - constexpr uint32_t _8_bit_common_memory_space = 0b100 << 0; - constexpr uint32_t _16_bit_common_memory_space = 0b101 << 0; - constexpr uint32_t _8_bit_attribute_memory_space = 0b110 << 0; - constexpr uint32_t _16_bit_attribute_memory_space = 0b111 << 0; +constexpr uint32_t bit_mask = 0x1 << 8; - constexpr uint32_t bit_mask = 0x7 << 0; - } - } +} - namespace qacr0 { - constexpr uint32_t area(uint32_t num) { return (num & 0x7) << 2; } - } +namespace ti { +constexpr uint32_t invalidate_all_utlb_itlb_bits = 1 << 2; - namespace qacr1 { - constexpr uint32_t area(uint32_t num) { return (num & 0x7) << 2; } - } + +constexpr uint32_t bit_mask = 0x1 << 2; + +} + +namespace at { +constexpr uint32_t mmu_disabled = 0 << 0; + +constexpr uint32_t mmu_enabled = 1 << 0; + + +constexpr uint32_t bit_mask = 0x1 << 0; + +} +} + +namespace basra { +constexpr uint32_t basa(uint32_t num) { return (num & 0xff) << 0; } +} + +namespace basrb { +constexpr uint32_t basa(uint32_t num) { return (num & 0xff) << 0; } +} + +namespace ccr { +namespace iix { +constexpr uint32_t address_bits_12_5_used_for_ic_entry_selection = 0 << 15; + +constexpr uint32_t address_bits_25_and_11_5_used_for_ic_entry_selection = 1 << 15; + + +constexpr uint32_t bit_mask = 0x1 << 15; + +} + +namespace ici { +constexpr uint32_t clear_v_bits_of_all_ic_entries = 1 << 11; + + +constexpr uint32_t bit_mask = 0x1 << 11; + +} + +namespace ice { +constexpr uint32_t ic_not_used = 0 << 8; + +constexpr uint32_t ic_used = 1 << 8; + + +constexpr uint32_t bit_mask = 0x1 << 8; + +} + +namespace oix { +constexpr uint32_t address_bits_13_5_used_for_oc_entry_selection = 0 << 7; + +constexpr uint32_t address_bits_25_and_12_5_used_for_oc_entry_selection = 1 << 7; + + +constexpr uint32_t bit_mask = 0x1 << 7; + +} + +namespace ora { +constexpr uint32_t _16_kbytes_used_as_cache = 0 << 5; + +constexpr uint32_t _8_kbytes_used_as_cache_8_kbytes_used_as_ram = 1 << 5; + + +constexpr uint32_t bit_mask = 0x1 << 5; + +} + +namespace oci { +constexpr uint32_t clear_v_and_u_bits_of_all_oc_entries = 1 << 3; + + +constexpr uint32_t bit_mask = 0x1 << 3; + +} + +namespace cb { +constexpr uint32_t write_through_mode = 0 << 2; + +constexpr uint32_t copy_back_mode = 1 << 2; + + +constexpr uint32_t bit_mask = 0x1 << 2; + +} + +namespace wt { +constexpr uint32_t copy_back_mode = 0 << 1; + +constexpr uint32_t write_through_mode = 1 << 1; + + +constexpr uint32_t bit_mask = 0x1 << 1; + +} + +namespace oce { +constexpr uint32_t oc_not_used = 0 << 0; + +constexpr uint32_t oc_used = 1 << 0; + + +constexpr uint32_t bit_mask = 0x1 << 0; + +} +} + +namespace tra { +constexpr uint32_t imm(uint32_t reg) { return (reg >> 2) & 0xff; } +} + +namespace expevt { +constexpr uint32_t exception_code(uint32_t reg) { return (reg >> 0) & 0xfff; } +} + +namespace intevt { +constexpr uint32_t exception_code(uint32_t reg) { return (reg >> 0) & 0xfff; } +} + +namespace ptea { +namespace tc { +constexpr uint32_t area_5_is_used = 0 << 3; + +constexpr uint32_t area_6_is_used = 1 << 3; + + +constexpr uint32_t bit_mask = 0x1 << 3; + +} + +namespace sa { +constexpr uint32_t undefined = 0b000 << 0; + +constexpr uint32_t variable_size_io_space = 0b001 << 0; + +constexpr uint32_t _8_bit_io_space = 0b010 << 0; + +constexpr uint32_t _16_bit_io_space = 0b011 << 0; + +constexpr uint32_t _8_bit_common_memory_space = 0b100 << 0; + +constexpr uint32_t _16_bit_common_memory_space = 0b101 << 0; + +constexpr uint32_t _8_bit_attribute_memory_space = 0b110 << 0; + +constexpr uint32_t _16_bit_attribute_memory_space = 0b111 << 0; + + +constexpr uint32_t bit_mask = 0x7 << 0; + +} +} + +namespace qacr0 { +constexpr uint32_t area(uint32_t num) { return (num & 0x7) << 2; } +} + +namespace qacr1 { +constexpr uint32_t area(uint32_t num) { return (num & 0x7) << 2; } +} } namespace dmac { - namespace dmatcr { - constexpr uint32_t transfer_count(uint32_t num) { return (num & 0xffffff) << 0; } - } +namespace dmatcr { +constexpr uint32_t transfer_count(uint32_t num) { return (num & 0xffffff) << 0; } +} - namespace chcr { - namespace ssa { - constexpr uint32_t reserved_in_pcmcia_access = 0b000 << 29; - constexpr uint32_t dynamic_bus_sizing_io_space = 0b001 << 29; - constexpr uint32_t _8_bit_io_space = 0b010 << 29; - constexpr uint32_t _16_bit_io_space = 0b011 << 29; - constexpr uint32_t _8_bit_common_memory_space = 0b100 << 29; - constexpr uint32_t _16_bit_common_memory_space = 0b101 << 29; - constexpr uint32_t _8_bit_attribute_memory_space = 0b110 << 29; - constexpr uint32_t _16_bit_attribute_memory_space = 0b111 << 29; +namespace chcr { +namespace ssa { +constexpr uint32_t reserved_in_pcmcia_access = 0b000 << 29; - constexpr uint32_t bit_mask = 0x7 << 29; - } +constexpr uint32_t dynamic_bus_sizing_io_space = 0b001 << 29; - namespace stc { - constexpr uint32_t c5_space_wait_cycle_selection = 0 << 28; - constexpr uint32_t c6_space_wait_cycle_selection = 1 << 28; +constexpr uint32_t _8_bit_io_space = 0b010 << 29; - constexpr uint32_t bit_mask = 0x1 << 28; - } +constexpr uint32_t _16_bit_io_space = 0b011 << 29; - namespace dsa { - constexpr uint32_t reserved_in_pcmcia_access = 0b000 << 25; - constexpr uint32_t dynamic_bus_sizing_io_space = 0b001 << 25; - constexpr uint32_t _8_bit_io_space = 0b010 << 25; - constexpr uint32_t _16_bit_io_space = 0b011 << 25; - constexpr uint32_t _8_bit_common_memory_space = 0b100 << 25; - constexpr uint32_t _16_bit_common_memory_space = 0b101 << 25; - constexpr uint32_t _8_bit_attribute_memory_space = 0b110 << 25; - constexpr uint32_t _16_bit_attribute_memory_space = 0b111 << 25; +constexpr uint32_t _8_bit_common_memory_space = 0b100 << 29; - constexpr uint32_t bit_mask = 0x7 << 25; - } +constexpr uint32_t _16_bit_common_memory_space = 0b101 << 29; - namespace dtc { - constexpr uint32_t c5_space_wait_cycle_selection = 0 << 24; - constexpr uint32_t c6_space_wait_cycle_selection = 1 << 24; +constexpr uint32_t _8_bit_attribute_memory_space = 0b110 << 29; - constexpr uint32_t bit_mask = 0x1 << 24; - } +constexpr uint32_t _16_bit_attribute_memory_space = 0b111 << 29; - namespace ds { - constexpr uint32_t low_level_detection = 0 << 19; - constexpr uint32_t falling_edge_detection = 1 << 19; - constexpr uint32_t bit_mask = 0x1 << 19; - } +constexpr uint32_t bit_mask = 0x7 << 29; - namespace rl { - constexpr uint32_t drak_is_an_active_high = 0 << 18; - constexpr uint32_t drak_is_an_active_low = 1 << 18; +} - constexpr uint32_t bit_mask = 0x1 << 18; - } +namespace stc { +constexpr uint32_t c5_space_wait_cycle_selection = 0 << 28; - namespace am { - constexpr uint32_t dack_is_output_in_read_cycle = 0 << 17; - constexpr uint32_t dack_is_output_in_write_cycle = 1 << 17; +constexpr uint32_t c6_space_wait_cycle_selection = 1 << 28; - constexpr uint32_t bit_mask = 0x1 << 17; - } - namespace al { - constexpr uint32_t active_high_output = 0 << 16; - constexpr uint32_t active_low_output = 1 << 16; +constexpr uint32_t bit_mask = 0x1 << 28; - constexpr uint32_t bit_mask = 0x1 << 16; - } +} - namespace dm { - constexpr uint32_t destination_address_fixed = 0b00 << 14; - constexpr uint32_t destination_address_incremented = 0b01 << 14; - constexpr uint32_t destination_address_decremented = 0b10 << 14; +namespace dsa { +constexpr uint32_t reserved_in_pcmcia_access = 0b000 << 25; - constexpr uint32_t bit_mask = 0x3 << 14; - } +constexpr uint32_t dynamic_bus_sizing_io_space = 0b001 << 25; - namespace sm { - constexpr uint32_t source_address_fixed = 0b00 << 12; - constexpr uint32_t source_address_incremented = 0b01 << 12; - constexpr uint32_t source_address_decremented = 0b10 << 12; +constexpr uint32_t _8_bit_io_space = 0b010 << 25; - constexpr uint32_t bit_mask = 0x3 << 12; - } +constexpr uint32_t _16_bit_io_space = 0b011 << 25; - namespace rs { - constexpr uint32_t resource_select(uint32_t num) { return (num & 0xf) << 8; } +constexpr uint32_t _8_bit_common_memory_space = 0b100 << 25; - constexpr uint32_t bit_mask = 0xf << 8; - } +constexpr uint32_t _16_bit_common_memory_space = 0b101 << 25; - namespace tm { - constexpr uint32_t cycle_steal_mode = 0 << 7; - constexpr uint32_t cycle_burst_mode = 1 << 7; +constexpr uint32_t _8_bit_attribute_memory_space = 0b110 << 25; - constexpr uint32_t bit_mask = 0x1 << 7; - } +constexpr uint32_t _16_bit_attribute_memory_space = 0b111 << 25; - namespace ts { - constexpr uint32_t _64_bit = 0b000 << 4; - constexpr uint32_t _8_bit = 0b001 << 4; - constexpr uint32_t _16_bit = 0b010 << 4; - constexpr uint32_t _32_bit = 0b011 << 4; - constexpr uint32_t _32_byte = 0b100 << 4; - constexpr uint32_t bit_mask = 0x7 << 4; - } +constexpr uint32_t bit_mask = 0x7 << 25; - namespace ie { - constexpr uint32_t interrupt_request_not_generated = 0 << 2; - constexpr uint32_t interrupt_request_generated = 1 << 2; +} - constexpr uint32_t bit_mask = 0x1 << 2; - } +namespace dtc { +constexpr uint32_t c5_space_wait_cycle_selection = 0 << 24; - namespace te { - constexpr uint32_t transfers_not_completed = 0 << 1; - constexpr uint32_t transfers_completed = 1 << 1; +constexpr uint32_t c6_space_wait_cycle_selection = 1 << 24; - constexpr uint32_t bit_mask = 0x1 << 1; - } - namespace de { - constexpr uint32_t channel_operation_disabled = 0 << 0; - constexpr uint32_t channel_operation_enabled = 1 << 0; +constexpr uint32_t bit_mask = 0x1 << 24; - constexpr uint32_t bit_mask = 0x1 << 0; - } - } +} - namespace dmaor { - namespace ddt { - constexpr uint32_t normal_dma_mode = 0 << 15; - constexpr uint32_t on_demand_data_transfer_mode = 1 << 15; +namespace ds { +constexpr uint32_t low_level_detection = 0 << 19; - constexpr uint32_t bit_mask = 0x1 << 15; - } +constexpr uint32_t falling_edge_detection = 1 << 19; - namespace pr { - constexpr uint32_t ch0_ch1_ch2_ch3 = 0b00 << 8; - constexpr uint32_t ch0_ch2_ch3_ch1 = 0b01 << 8; - constexpr uint32_t ch2_ch0_ch1_ch3 = 0b10 << 8; - constexpr uint32_t round_robin = 0b11 << 8; - constexpr uint32_t bit_mask = 0x3 << 8; - } +constexpr uint32_t bit_mask = 0x1 << 19; - namespace ae { - constexpr uint32_t no_address_error__dma_transfer_enabled = 0 << 2; - constexpr uint32_t address_error__dma_transfer_disabled = 1 << 2; +} - constexpr uint32_t bit_mask = 0x1 << 2; - } +namespace rl { +constexpr uint32_t drak_is_an_active_high = 0 << 18; - namespace nmif { - constexpr uint32_t no_nmi__dma_transfer_enabled = 0 << 1; - constexpr uint32_t nmi__dma_transfer_disabled = 1 << 1; +constexpr uint32_t drak_is_an_active_low = 1 << 18; - constexpr uint32_t bit_mask = 0x1 << 1; - } - namespace dme { - constexpr uint32_t operation_disabled_on_all_channels = 0 << 0; - constexpr uint32_t operation_enabled_on_all_channels = 1 << 0; +constexpr uint32_t bit_mask = 0x1 << 18; - constexpr uint32_t bit_mask = 0x1 << 0; - } - } +} + +namespace am { +constexpr uint32_t dack_is_output_in_read_cycle = 0 << 17; + +constexpr uint32_t dack_is_output_in_write_cycle = 1 << 17; + + +constexpr uint32_t bit_mask = 0x1 << 17; + +} + +namespace al { +constexpr uint32_t active_high_output = 0 << 16; + +constexpr uint32_t active_low_output = 1 << 16; + + +constexpr uint32_t bit_mask = 0x1 << 16; + +} + +namespace dm { +constexpr uint32_t destination_address_fixed = 0b00 << 14; + +constexpr uint32_t destination_address_incremented = 0b01 << 14; + +constexpr uint32_t destination_address_decremented = 0b10 << 14; + + +constexpr uint32_t bit_mask = 0x3 << 14; + +} + +namespace sm { +constexpr uint32_t source_address_fixed = 0b00 << 12; + +constexpr uint32_t source_address_incremented = 0b01 << 12; + +constexpr uint32_t source_address_decremented = 0b10 << 12; + + +constexpr uint32_t bit_mask = 0x3 << 12; + +} + +namespace rs { +constexpr uint32_t resource_select(uint32_t num) { return (num & 0xf) << 8; } + +constexpr uint32_t bit_mask = 0xf << 8; + +} + +namespace tm { +constexpr uint32_t cycle_steal_mode = 0 << 7; + +constexpr uint32_t cycle_burst_mode = 1 << 7; + + +constexpr uint32_t bit_mask = 0x1 << 7; + +} + +namespace ts { +constexpr uint32_t _64_bit = 0b000 << 4; + +constexpr uint32_t _8_bit = 0b001 << 4; + +constexpr uint32_t _16_bit = 0b010 << 4; + +constexpr uint32_t _32_bit = 0b011 << 4; + +constexpr uint32_t _32_byte = 0b100 << 4; + + +constexpr uint32_t bit_mask = 0x7 << 4; + +} + +namespace ie { +constexpr uint32_t interrupt_request_not_generated = 0 << 2; + +constexpr uint32_t interrupt_request_generated = 1 << 2; + + +constexpr uint32_t bit_mask = 0x1 << 2; + +} + +namespace te { +constexpr uint32_t transfers_not_completed = 0 << 1; + +constexpr uint32_t transfers_completed = 1 << 1; + + +constexpr uint32_t bit_mask = 0x1 << 1; + +} + +namespace de { +constexpr uint32_t channel_operation_disabled = 0 << 0; + +constexpr uint32_t channel_operation_enabled = 1 << 0; + + +constexpr uint32_t bit_mask = 0x1 << 0; + +} +} + +namespace dmaor { +namespace ddt { +constexpr uint32_t normal_dma_mode = 0 << 15; + +constexpr uint32_t on_demand_data_transfer_mode = 1 << 15; + + +constexpr uint32_t bit_mask = 0x1 << 15; + +} + +namespace pr { +constexpr uint32_t ch0_ch1_ch2_ch3 = 0b00 << 8; + +constexpr uint32_t ch0_ch2_ch3_ch1 = 0b01 << 8; + +constexpr uint32_t ch2_ch0_ch1_ch3 = 0b10 << 8; + +constexpr uint32_t round_robin = 0b11 << 8; + + +constexpr uint32_t bit_mask = 0x3 << 8; + +} + +namespace ae { +constexpr uint32_t no_address_error__dma_transfer_enabled = 0 << 2; + +constexpr uint32_t address_error__dma_transfer_disabled = 1 << 2; + + +constexpr uint32_t bit_mask = 0x1 << 2; + +} + +namespace nmif { +constexpr uint32_t no_nmi__dma_transfer_enabled = 0 << 1; + +constexpr uint32_t nmi__dma_transfer_disabled = 1 << 1; + + +constexpr uint32_t bit_mask = 0x1 << 1; + +} + +namespace dme { +constexpr uint32_t operation_disabled_on_all_channels = 0 << 0; + +constexpr uint32_t operation_enabled_on_all_channels = 1 << 0; + + +constexpr uint32_t bit_mask = 0x1 << 0; + +} +} } namespace intc { - namespace icr { - namespace nmil { - constexpr uint32_t pin_input_level_is_low = 0 << 15; - constexpr uint32_t pin_input_level_is_high = 1 << 15; +namespace icr { +namespace nmil { +constexpr uint32_t pin_input_level_is_low = 0 << 15; - constexpr uint32_t bit_mask = 0x1 << 15; - } +constexpr uint32_t pin_input_level_is_high = 1 << 15; - namespace mai { - constexpr uint32_t interrupts_enabled_while_nmi_pin_is_low = 0 << 14; - constexpr uint32_t interrupts_disabled_while_nmi_pin_is_low = 1 << 14; - constexpr uint32_t bit_mask = 0x1 << 14; - } +constexpr uint32_t bit_mask = 0x1 << 15; - namespace nmib { - constexpr uint32_t interrupt_requests_witheld = 0 << 9; - constexpr uint32_t interrupt_requests_detected = 1 << 9; +} - constexpr uint32_t bit_mask = 0x1 << 9; - } +namespace mai { +constexpr uint32_t interrupts_enabled_while_nmi_pin_is_low = 0 << 14; - namespace nmie { - constexpr uint32_t interrupt_on_falling_edge_of_nmi = 0 << 8; - constexpr uint32_t interrupt_on_rising_edge_of_nmi = 1 << 8; +constexpr uint32_t interrupts_disabled_while_nmi_pin_is_low = 1 << 14; - constexpr uint32_t bit_mask = 0x1 << 8; - } - namespace irlm { - constexpr uint32_t level_encoded_interrupt_requests = 0 << 7; - constexpr uint32_t independent_interrupt_request = 1 << 7; +constexpr uint32_t bit_mask = 0x1 << 14; - constexpr uint32_t bit_mask = 0x1 << 7; - } - } +} - namespace ipra { - constexpr uint32_t TMU0(uint32_t num) { return (num & 0xf) << 12; } - constexpr uint32_t TMU1(uint32_t num) { return (num & 0xf) << 8; } - constexpr uint32_t TMU2(uint32_t num) { return (num & 0xf) << 4; } - constexpr uint32_t RTC(uint32_t num) { return (num & 0xf) << 0; } - } +namespace nmib { +constexpr uint32_t interrupt_requests_witheld = 0 << 9; - namespace iprb { - constexpr uint32_t WDT(uint32_t num) { return (num & 0xf) << 12; } - constexpr uint32_t REF(uint32_t num) { return (num & 0xf) << 8; } - constexpr uint32_t SCI1(uint32_t num) { return (num & 0xf) << 4; } - } +constexpr uint32_t interrupt_requests_detected = 1 << 9; - namespace iprc { - constexpr uint32_t GPIO(uint32_t num) { return (num & 0xf) << 12; } - constexpr uint32_t DMAC(uint32_t num) { return (num & 0xf) << 8; } - constexpr uint32_t SCIF(uint32_t num) { return (num & 0xf) << 4; } - constexpr uint32_t UDI(uint32_t num) { return (num & 0xf) << 0; } - } + +constexpr uint32_t bit_mask = 0x1 << 9; + +} + +namespace nmie { +constexpr uint32_t interrupt_on_falling_edge_of_nmi = 0 << 8; + +constexpr uint32_t interrupt_on_rising_edge_of_nmi = 1 << 8; + + +constexpr uint32_t bit_mask = 0x1 << 8; + +} + +namespace irlm { +constexpr uint32_t level_encoded_interrupt_requests = 0 << 7; + +constexpr uint32_t independent_interrupt_request = 1 << 7; + + +constexpr uint32_t bit_mask = 0x1 << 7; + +} +} + +namespace ipra { +constexpr uint32_t TMU0(uint32_t num) { return (num & 0xf) << 12; } +constexpr uint32_t TMU1(uint32_t num) { return (num & 0xf) << 8; } +constexpr uint32_t TMU2(uint32_t num) { return (num & 0xf) << 4; } +constexpr uint32_t RTC(uint32_t num) { return (num & 0xf) << 0; } +} + +namespace iprb { +constexpr uint32_t WDT(uint32_t num) { return (num & 0xf) << 12; } +constexpr uint32_t REF(uint32_t num) { return (num & 0xf) << 8; } +constexpr uint32_t SCI1(uint32_t num) { return (num & 0xf) << 4; } +} + +namespace iprc { +constexpr uint32_t GPIO(uint32_t num) { return (num & 0xf) << 12; } +constexpr uint32_t DMAC(uint32_t num) { return (num & 0xf) << 8; } +constexpr uint32_t SCIF(uint32_t num) { return (num & 0xf) << 4; } +constexpr uint32_t UDI(uint32_t num) { return (num & 0xf) << 0; } +} } namespace tmu { - namespace tocr { - namespace tcoe { - constexpr uint32_t tclk_is_external_clock_or_input_capture = 0 << 0; - constexpr uint32_t tclk_is_on_chip_rtc = 1 << 0; +namespace tocr { +namespace tcoe { +constexpr uint32_t tclk_is_external_clock_or_input_capture = 0 << 0; +constexpr uint32_t tclk_is_on_chip_rtc = 1 << 0; - constexpr uint32_t bit_mask = 0x1 << 0; - } - } - namespace tstr { - namespace str2 { - constexpr uint32_t counter_start = 1 << 2; +constexpr uint32_t bit_mask = 0x1 << 0; - constexpr uint32_t bit_mask = 0x1 << 2; - } +} +} - namespace str1 { - constexpr uint32_t counter_start = 1 << 1; +namespace tstr { +namespace str2 { +constexpr uint32_t counter_start = 1 << 2; - constexpr uint32_t bit_mask = 0x1 << 1; - } - namespace str0 { - constexpr uint32_t counter_start = 1 << 0; +constexpr uint32_t bit_mask = 0x1 << 2; - constexpr uint32_t bit_mask = 0x1 << 0; - } - } +} - namespace tcr0 { - constexpr uint32_t UNF = 1 << 8; - constexpr uint32_t UNIE = 1 << 5; +namespace str1 { +constexpr uint32_t counter_start = 1 << 1; - namespace ckeg { - constexpr uint32_t rising = 0b00 << 3; - constexpr uint32_t falling = 0b01 << 3; - constexpr uint32_t rising_falling = 0b10 << 3; - constexpr uint32_t bit_mask = 0x3 << 3; - } +constexpr uint32_t bit_mask = 0x1 << 1; - namespace tpsc { - constexpr uint32_t p_phi_4 = 0b000 << 0; - constexpr uint32_t p_phi_16 = 0b001 << 0; - constexpr uint32_t p_phi_64 = 0b010 << 0; - constexpr uint32_t p_phi_256 = 0b011 << 0; - constexpr uint32_t p_phi_1024 = 0b100 << 0; - constexpr uint32_t rtc_output = 0b110 << 0; - constexpr uint32_t external = 0b111 << 0; +} - constexpr uint32_t bit_mask = 0x7 << 0; - } - } +namespace str0 { +constexpr uint32_t counter_start = 1 << 0; - namespace tcr1 { - constexpr uint32_t UNF = 1 << 8; - constexpr uint32_t UNIE = 1 << 5; - namespace ckeg { - constexpr uint32_t rising = 0b00 << 3; - constexpr uint32_t falling = 0b01 << 3; - constexpr uint32_t rising_falling = 0b10 << 3; +constexpr uint32_t bit_mask = 0x1 << 0; - constexpr uint32_t bit_mask = 0x3 << 3; - } +} +} - namespace tpsc { - constexpr uint32_t p_phi_4 = 0b000 << 0; - constexpr uint32_t p_phi_16 = 0b001 << 0; - constexpr uint32_t p_phi_64 = 0b010 << 0; - constexpr uint32_t p_phi_256 = 0b011 << 0; - constexpr uint32_t p_phi_1024 = 0b100 << 0; - constexpr uint32_t rtc_output = 0b110 << 0; - constexpr uint32_t external = 0b111 << 0; +namespace tcr0 { +constexpr uint32_t UNF = 1 << 8; - constexpr uint32_t bit_mask = 0x7 << 0; - } - } +constexpr uint32_t UNIE = 1 << 5; - namespace tcr2 { - constexpr uint32_t ICPF = 1 << 9; - constexpr uint32_t UNF = 1 << 8; - namespace icpe { - constexpr uint32_t disabled = 0b00 << 6; - constexpr uint32_t enabled = 0b10 << 6; - constexpr uint32_t enabled_with_interrupts = 0b11 << 6; +namespace ckeg { +constexpr uint32_t rising = 0b00 << 3; - constexpr uint32_t bit_mask = 0x3 << 6; - } +constexpr uint32_t falling = 0b01 << 3; - constexpr uint32_t UNIE = 1 << 5; +constexpr uint32_t rising_falling = 0b10 << 3; - namespace ckeg { - constexpr uint32_t rising = 0b00 << 3; - constexpr uint32_t falling = 0b01 << 3; - constexpr uint32_t rising_falling = 0b10 << 3; - constexpr uint32_t bit_mask = 0x3 << 3; - } +constexpr uint32_t bit_mask = 0x3 << 3; - namespace tpsc { - constexpr uint32_t p_phi_4 = 0b000 << 0; - constexpr uint32_t p_phi_16 = 0b001 << 0; - constexpr uint32_t p_phi_64 = 0b010 << 0; - constexpr uint32_t p_phi_256 = 0b011 << 0; - constexpr uint32_t p_phi_1024 = 0b100 << 0; - constexpr uint32_t rtc_output = 0b110 << 0; - constexpr uint32_t external = 0b111 << 0; +} - constexpr uint32_t bit_mask = 0x7 << 0; - } - } +namespace tpsc { +constexpr uint32_t p_phi_4 = 0b000 << 0; + +constexpr uint32_t p_phi_16 = 0b001 << 0; + +constexpr uint32_t p_phi_64 = 0b010 << 0; + +constexpr uint32_t p_phi_256 = 0b011 << 0; + +constexpr uint32_t p_phi_1024 = 0b100 << 0; + +constexpr uint32_t rtc_output = 0b110 << 0; + +constexpr uint32_t external = 0b111 << 0; + +constexpr uint32_t bit_mask = 0x7 << 0; + +} +} + +namespace tcr1 { +constexpr uint32_t UNF = 1 << 8; + +constexpr uint32_t UNIE = 1 << 5; + + +namespace ckeg { +constexpr uint32_t rising = 0b00 << 3; + +constexpr uint32_t falling = 0b01 << 3; + +constexpr uint32_t rising_falling = 0b10 << 3; + + +constexpr uint32_t bit_mask = 0x3 << 3; + +} + +namespace tpsc { +constexpr uint32_t p_phi_4 = 0b000 << 0; + +constexpr uint32_t p_phi_16 = 0b001 << 0; + +constexpr uint32_t p_phi_64 = 0b010 << 0; + +constexpr uint32_t p_phi_256 = 0b011 << 0; + +constexpr uint32_t p_phi_1024 = 0b100 << 0; + +constexpr uint32_t rtc_output = 0b110 << 0; + +constexpr uint32_t external = 0b111 << 0; + +constexpr uint32_t bit_mask = 0x7 << 0; + +} +} + +namespace tcr2 { +constexpr uint32_t ICPF = 1 << 9; + +constexpr uint32_t UNF = 1 << 8; + + +namespace icpe { +constexpr uint32_t disabled = 0b00 << 6; + +constexpr uint32_t enabled = 0b10 << 6; + +constexpr uint32_t enabled_with_interrupts = 0b11 << 6; + + +constexpr uint32_t bit_mask = 0x3 << 6; + +} + +constexpr uint32_t UNIE = 1 << 5; + + +namespace ckeg { +constexpr uint32_t rising = 0b00 << 3; + +constexpr uint32_t falling = 0b01 << 3; + +constexpr uint32_t rising_falling = 0b10 << 3; + + +constexpr uint32_t bit_mask = 0x3 << 3; + +} + +namespace tpsc { +constexpr uint32_t p_phi_4 = 0b000 << 0; + +constexpr uint32_t p_phi_16 = 0b001 << 0; + +constexpr uint32_t p_phi_64 = 0b010 << 0; + +constexpr uint32_t p_phi_256 = 0b011 << 0; + +constexpr uint32_t p_phi_1024 = 0b100 << 0; + +constexpr uint32_t rtc_output = 0b110 << 0; + +constexpr uint32_t external = 0b111 << 0; + +constexpr uint32_t bit_mask = 0x7 << 0; + +} +} } namespace scif { - namespace scsmr2 { - namespace chr { - constexpr uint32_t _8_bit_data = 0 << 6; - constexpr uint32_t _7_bit_data = 1 << 6; +namespace scsmr2 { +namespace chr { +constexpr uint32_t _8_bit_data = 0 << 6; - constexpr uint32_t bit_mask = 0x1 << 6; - } +constexpr uint32_t _7_bit_data = 1 << 6; - namespace pe { - constexpr uint32_t parity_disabled = 0 << 5; - constexpr uint32_t parity_enabled = 1 << 5; - constexpr uint32_t bit_mask = 0x1 << 5; - } - - namespace oe { - constexpr uint32_t even_parity = 0 << 4; - constexpr uint32_t odd_parity = 1 << 4; - - constexpr uint32_t bit_mask = 0x1 << 4; - } - - namespace stop { - constexpr uint32_t _1_stop_bit = 0 << 3; - constexpr uint32_t _2_stop_bits = 1 << 3; - - constexpr uint32_t bit_mask = 0x1 << 3; - } - - namespace cks { - constexpr uint32_t p_phi_clock = 0b00 << 0; - constexpr uint32_t p_phi_4_clock = 0b01 << 0; - constexpr uint32_t p_phi_16_clock = 0b10 << 0; - constexpr uint32_t p_phi_64_clock = 0b11 << 0; - - constexpr uint32_t bit_mask = 0x3 << 0; - } - } - - namespace scscr2 { - namespace tie { - constexpr uint32_t transmit_fifo_data_empty_interrupt_disabled = 0 << 7; - constexpr uint32_t transmit_fifo_data_empty_interrupt_enabled = 1 << 7; - - constexpr uint32_t bit_mask = 0x1 << 7; - } - - namespace rie { - constexpr uint32_t request_disabled = 0 << 6; - constexpr uint32_t request_enabled = 1 << 6; - - constexpr uint32_t bit_mask = 0x1 << 6; - } - - namespace te { - constexpr uint32_t transmission_disabled = 0 << 5; - constexpr uint32_t transmission_enabled = 1 << 5; - - constexpr uint32_t bit_mask = 0x1 << 5; - } - - namespace re { - constexpr uint32_t reception_disabled = 0 << 4; - constexpr uint32_t reception_enabled = 1 << 4; - - constexpr uint32_t bit_mask = 0x1 << 4; - } - - namespace reie { - constexpr uint32_t requests_disabled = 0 << 3; - constexpr uint32_t requests_enabled = 1 << 3; - - constexpr uint32_t bit_mask = 0x1 << 3; - } - - namespace cke1 { - constexpr uint32_t sck2_pin_functions_as_input_pin = 0 << 1; - constexpr uint32_t sck2_pin_functions_as_clock_input = 1 << 1; - - constexpr uint32_t bit_mask = 0x1 << 1; - } - } - - namespace scfsr2 { - namespace per3_0 { - constexpr uint32_t number_of_parity_errors(uint32_t reg) { return (reg >> 12) & 0xf; } - - constexpr uint32_t bit_mask = 0xf << 12; - } - - namespace fer3_0 { - constexpr uint32_t number_of_framing_errors(uint32_t reg) { return (reg >> 8) & 0xf; } - - constexpr uint32_t bit_mask = 0xf << 8; - } - - namespace er { - constexpr uint32_t no_framing_error_or_parity_error = 0 << 7; - constexpr uint32_t framing_error_or_parity_error = 1 << 7; - - constexpr uint32_t bit_mask = 0x1 << 7; - } - - namespace tend { - constexpr uint32_t transmission_in_progress = 0 << 6; - constexpr uint32_t transmission_has_ended = 1 << 6; - - constexpr uint32_t bit_mask = 0x1 << 6; - } - - namespace tdfe { - constexpr uint32_t transmit_data_bytes_does_exceed_trigger = 0 << 5; - constexpr uint32_t transmit_data_bytes_does_not_exceed_trigger = 1 << 5; - - constexpr uint32_t bit_mask = 0x1 << 5; - } - - namespace brk { - constexpr uint32_t break_not_received = 0 << 4; - constexpr uint32_t break_received = 1 << 4; - - constexpr uint32_t bit_mask = 0x1 << 4; - } - - namespace fer { - constexpr uint32_t no_framing_error = 0 << 3; - constexpr uint32_t framing_error = 1 << 3; - - constexpr uint32_t bit_mask = 0x1 << 3; - } - - namespace per { - constexpr uint32_t parity_error = 0 << 2; - constexpr uint32_t no_parity_error = 1 << 2; - - constexpr uint32_t bit_mask = 0x1 << 2; - } - - namespace rdf { - constexpr uint32_t receive_data_bytes_less_than_receive_trigger = 0 << 1; - constexpr uint32_t receive_data_bytes_greater_than_or_equal_receive_trigger = 1 << 1; - - constexpr uint32_t bit_mask = 0x1 << 1; - } - - namespace dr { - constexpr uint32_t reception_is_in_progress = 0 << 0; - constexpr uint32_t no_further_data_has_arrived = 1 << 0; - - constexpr uint32_t bit_mask = 0x1 << 0; - } - } - - namespace scfcr2 { - namespace rtrg { - constexpr uint32_t trigger_on_1_byte = 0b00 << 6; - constexpr uint32_t trigger_on_4_bytes = 0b01 << 6; - constexpr uint32_t trigger_on_8_bytes = 0b10 << 6; - constexpr uint32_t trigger_on_14_byte = 0b11 << 6; - - constexpr uint32_t bit_mask = 0x3 << 6; - } - - namespace ttrg { - constexpr uint32_t trigger_on_8_bytes = 0b00 << 4; - constexpr uint32_t trigger_on_4_bytes = 0b01 << 4; - constexpr uint32_t trigger_on_2_bytes = 0b10 << 4; - constexpr uint32_t trigger_on_1_bytes = 0b11 << 4; - - constexpr uint32_t bit_mask = 0x3 << 4; - } - - namespace mce { - constexpr uint32_t modem_signals_disabled = 0 << 3; - constexpr uint32_t modem_signals_enabled = 1 << 3; - - constexpr uint32_t bit_mask = 0x1 << 3; - } - - namespace tfrst { - constexpr uint32_t reset_operation_disabled = 0 << 2; - constexpr uint32_t reset_operation_enabled = 1 << 2; - - constexpr uint32_t bit_mask = 0x1 << 2; - } - - namespace rfrst { - constexpr uint32_t reset_operation_disabled = 0 << 1; - constexpr uint32_t reset_operation_enabled = 1 << 1; - - constexpr uint32_t bit_mask = 0x1 << 1; - } - - namespace loop { - constexpr uint32_t loopback_test_disabled = 0 << 0; - constexpr uint32_t loopback_test_enabled = 1 << 0; - - constexpr uint32_t bit_mask = 0x1 << 0; - } - } - - namespace scfdr2 { - constexpr uint32_t transmit_data_bytes(uint32_t reg) { return (reg >> 8) & 0x1f; } - constexpr uint32_t receive_data_bytes(uint32_t reg) { return (reg >> 0) & 0x1f; } - } - - namespace scsptr2 { - namespace rtsio { - constexpr uint32_t rtsdt_not_output_to_rts2 = 0 << 7; - constexpr uint32_t rtsdt_output_to_rts2 = 1 << 7; - - constexpr uint32_t bit_mask = 0x1 << 7; - } - - namespace rtsdt { - constexpr uint32_t input_output_data_is_low_level = 0 << 6; - constexpr uint32_t input_output_data_is_high_level = 1 << 6; - - constexpr uint32_t bit_mask = 0x1 << 6; - } - - namespace ctsio { - constexpr uint32_t ctsdt_is_not_output_to_cts2 = 0 << 5; - constexpr uint32_t ctsdt_is_output_to_cts2 = 1 << 5; - - constexpr uint32_t bit_mask = 0x1 << 5; - } - - namespace ctsdt { - constexpr uint32_t input_output_data_is_low_level = 0 << 4; - constexpr uint32_t input_output_data_is_high_level = 1 << 4; - - constexpr uint32_t bit_mask = 0x1 << 4; - } - - namespace spb2io { - constexpr uint32_t spb2dt_is_not_output_to_txd2 = 0 << 1; - constexpr uint32_t spb2dt_is_output_to_txd2 = 1 << 1; - - constexpr uint32_t bit_mask = 0x1 << 1; - } - - namespace spb2dt { - constexpr uint32_t input_output_data_is_low_level = 0 << 0; - constexpr uint32_t input_output_data_is_high_level = 1 << 0; - - constexpr uint32_t bit_mask = 0x1 << 0; - } - } - - namespace sclsr2 { - namespace orer { - constexpr uint32_t overrun_error_occured = 1 << 0; - - constexpr uint32_t bit_mask = 0x1 << 0; - } - } +constexpr uint32_t bit_mask = 0x1 << 6; + +} + +namespace pe { +constexpr uint32_t parity_disabled = 0 << 5; + +constexpr uint32_t parity_enabled = 1 << 5; + + +constexpr uint32_t bit_mask = 0x1 << 5; + +} + +namespace oe { +constexpr uint32_t even_parity = 0 << 4; + +constexpr uint32_t odd_parity = 1 << 4; + + +constexpr uint32_t bit_mask = 0x1 << 4; + +} + +namespace stop { +constexpr uint32_t _1_stop_bit = 0 << 3; + +constexpr uint32_t _2_stop_bits = 1 << 3; + + +constexpr uint32_t bit_mask = 0x1 << 3; + +} + +namespace cks { +constexpr uint32_t p_phi_clock = 0b00 << 0; + +constexpr uint32_t p_phi_4_clock = 0b01 << 0; + +constexpr uint32_t p_phi_16_clock = 0b10 << 0; + +constexpr uint32_t p_phi_64_clock = 0b11 << 0; + + +constexpr uint32_t bit_mask = 0x3 << 0; + +} +} + +namespace scscr2 { +namespace tie { +constexpr uint32_t transmit_fifo_data_empty_interrupt_disabled = 0 << 7; + +constexpr uint32_t transmit_fifo_data_empty_interrupt_enabled = 1 << 7; + + +constexpr uint32_t bit_mask = 0x1 << 7; + +} + +namespace rie { +constexpr uint32_t request_disabled = 0 << 6; + +constexpr uint32_t request_enabled = 1 << 6; + + +constexpr uint32_t bit_mask = 0x1 << 6; + +} + +namespace te { +constexpr uint32_t transmission_disabled = 0 << 5; + +constexpr uint32_t transmission_enabled = 1 << 5; + + +constexpr uint32_t bit_mask = 0x1 << 5; + +} + +namespace re { +constexpr uint32_t reception_disabled = 0 << 4; + +constexpr uint32_t reception_enabled = 1 << 4; + + +constexpr uint32_t bit_mask = 0x1 << 4; + +} + +namespace reie { +constexpr uint32_t requests_disabled = 0 << 3; + +constexpr uint32_t requests_enabled = 1 << 3; + + +constexpr uint32_t bit_mask = 0x1 << 3; + +} + +namespace cke1 { +constexpr uint32_t sck2_pin_functions_as_input_pin = 0 << 1; + +constexpr uint32_t sck2_pin_functions_as_clock_input = 1 << 1; + + +constexpr uint32_t bit_mask = 0x1 << 1; + +} +} + +namespace scfsr2 { +namespace per3_0 { +constexpr uint32_t number_of_parity_errors(uint32_t reg) { return (reg >> 12) & 0xf; } + +constexpr uint32_t bit_mask = 0xf << 12; + +} + +namespace fer3_0 { +constexpr uint32_t number_of_framing_errors(uint32_t reg) { return (reg >> 8) & 0xf; } + +constexpr uint32_t bit_mask = 0xf << 8; + +} + +namespace er { +constexpr uint32_t no_framing_error_or_parity_error = 0 << 7; + +constexpr uint32_t framing_error_or_parity_error = 1 << 7; + + +constexpr uint32_t bit_mask = 0x1 << 7; + +} + +namespace tend { +constexpr uint32_t transmission_in_progress = 0 << 6; + +constexpr uint32_t transmission_has_ended = 1 << 6; + + +constexpr uint32_t bit_mask = 0x1 << 6; + +} + +namespace tdfe { +constexpr uint32_t transmit_data_bytes_does_exceed_trigger = 0 << 5; + +constexpr uint32_t transmit_data_bytes_does_not_exceed_trigger = 1 << 5; + + +constexpr uint32_t bit_mask = 0x1 << 5; + +} + +namespace brk { +constexpr uint32_t break_not_received = 0 << 4; + +constexpr uint32_t break_received = 1 << 4; + + +constexpr uint32_t bit_mask = 0x1 << 4; + +} + +namespace fer { +constexpr uint32_t no_framing_error = 0 << 3; + +constexpr uint32_t framing_error = 1 << 3; + + +constexpr uint32_t bit_mask = 0x1 << 3; + +} + +namespace per { +constexpr uint32_t parity_error = 0 << 2; + +constexpr uint32_t no_parity_error = 1 << 2; + + +constexpr uint32_t bit_mask = 0x1 << 2; + +} + +namespace rdf { +constexpr uint32_t receive_data_bytes_less_than_receive_trigger = 0 << 1; + +constexpr uint32_t receive_data_bytes_greater_than_or_equal_receive_trigger = 1 << 1; + + +constexpr uint32_t bit_mask = 0x1 << 1; + +} + +namespace dr { +constexpr uint32_t reception_is_in_progress = 0 << 0; + +constexpr uint32_t no_further_data_has_arrived = 1 << 0; + + +constexpr uint32_t bit_mask = 0x1 << 0; + +} +} + +namespace scfcr2 { +namespace rtrg { +constexpr uint32_t trigger_on_1_byte = 0b00 << 6; + +constexpr uint32_t trigger_on_4_bytes = 0b01 << 6; + +constexpr uint32_t trigger_on_8_bytes = 0b10 << 6; + +constexpr uint32_t trigger_on_14_byte = 0b11 << 6; + + +constexpr uint32_t bit_mask = 0x3 << 6; + +} + +namespace ttrg { +constexpr uint32_t trigger_on_8_bytes = 0b00 << 4; + +constexpr uint32_t trigger_on_4_bytes = 0b01 << 4; + +constexpr uint32_t trigger_on_2_bytes = 0b10 << 4; + +constexpr uint32_t trigger_on_1_bytes = 0b11 << 4; + + +constexpr uint32_t bit_mask = 0x3 << 4; + +} + +namespace mce { +constexpr uint32_t modem_signals_disabled = 0 << 3; + +constexpr uint32_t modem_signals_enabled = 1 << 3; + + +constexpr uint32_t bit_mask = 0x1 << 3; + +} + +namespace tfrst { +constexpr uint32_t reset_operation_disabled = 0 << 2; + +constexpr uint32_t reset_operation_enabled = 1 << 2; + + +constexpr uint32_t bit_mask = 0x1 << 2; + +} + +namespace rfrst { +constexpr uint32_t reset_operation_disabled = 0 << 1; + +constexpr uint32_t reset_operation_enabled = 1 << 1; + + +constexpr uint32_t bit_mask = 0x1 << 1; + +} + +namespace loop { +constexpr uint32_t loopback_test_disabled = 0 << 0; + +constexpr uint32_t loopback_test_enabled = 1 << 0; + + +constexpr uint32_t bit_mask = 0x1 << 0; + +} +} + +namespace scfdr2 { +constexpr uint32_t transmit_data_bytes(uint32_t reg) { return (reg >> 8) & 0x1f; } +constexpr uint32_t receive_data_bytes(uint32_t reg) { return (reg >> 0) & 0x1f; } +} + +namespace scsptr2 { +namespace rtsio { +constexpr uint32_t rtsdt_not_output_to_rts2 = 0 << 7; + +constexpr uint32_t rtsdt_output_to_rts2 = 1 << 7; + + +constexpr uint32_t bit_mask = 0x1 << 7; + +} + +namespace rtsdt { +constexpr uint32_t input_output_data_is_low_level = 0 << 6; + +constexpr uint32_t input_output_data_is_high_level = 1 << 6; + + +constexpr uint32_t bit_mask = 0x1 << 6; + +} + +namespace ctsio { +constexpr uint32_t ctsdt_is_not_output_to_cts2 = 0 << 5; + +constexpr uint32_t ctsdt_is_output_to_cts2 = 1 << 5; + + +constexpr uint32_t bit_mask = 0x1 << 5; + +} + +namespace ctsdt { +constexpr uint32_t input_output_data_is_low_level = 0 << 4; + +constexpr uint32_t input_output_data_is_high_level = 1 << 4; + + +constexpr uint32_t bit_mask = 0x1 << 4; + +} + +namespace spb2io { +constexpr uint32_t spb2dt_is_not_output_to_txd2 = 0 << 1; + +constexpr uint32_t spb2dt_is_output_to_txd2 = 1 << 1; + + +constexpr uint32_t bit_mask = 0x1 << 1; + +} + +namespace spb2dt { +constexpr uint32_t input_output_data_is_low_level = 0 << 0; + +constexpr uint32_t input_output_data_is_high_level = 1 << 0; + + +constexpr uint32_t bit_mask = 0x1 << 0; + +} +} + +namespace sclsr2 { +namespace orer { +constexpr uint32_t overrun_error_occured = 1 << 0; + + +constexpr uint32_t bit_mask = 0x1 << 0; + +} +} + +} + +namespace sh { +namespace sr { +constexpr uint32_t md = 1 << 30; + +constexpr uint32_t rb = 1 << 29; + +constexpr uint32_t bl = 1 << 28; + +constexpr uint32_t fd = 1 << 15; + +constexpr uint32_t m = 1 << 9; + +constexpr uint32_t q = 1 << 8; + +constexpr uint32_t imask(uint32_t num) { return (num & 0xf) << 4; } +constexpr uint32_t s = 1 << 1; + +constexpr uint32_t t = 1 << 0; + +} + +namespace fpscr { +constexpr uint32_t fr = 1 << 21; + +constexpr uint32_t sz = 1 << 20; + +constexpr uint32_t pr = 1 << 19; + +constexpr uint32_t dn = 1 << 18; + + +namespace cause { +constexpr uint32_t fpu_error = 0b100000 << 12; + +constexpr uint32_t invalid_operation = 0b010000 << 12; + +constexpr uint32_t division_by_zero = 0b001000 << 12; + +constexpr uint32_t overflow = 0b000100 << 12; + +constexpr uint32_t underflow = 0b000010 << 12; + +constexpr uint32_t inexact = 0b000001 << 12; + + +constexpr uint32_t bit_mask = 0x3f << 12; + +} + +namespace enabled { +constexpr uint32_t invalid_operation = 0b10000 << 7; + +constexpr uint32_t division_by_zero = 0b01000 << 7; + +constexpr uint32_t overflow = 0b00100 << 7; + +constexpr uint32_t underflow = 0b00010 << 7; + +constexpr uint32_t inexact = 0b00001 << 7; + + +constexpr uint32_t bit_mask = 0x1f << 7; + +} + +namespace flag { +constexpr uint32_t invalid_operation = 0b10000 << 2; + +constexpr uint32_t division_by_zero = 0b01000 << 2; + +constexpr uint32_t overflow = 0b00100 << 2; + +constexpr uint32_t underflow = 0b00010 << 2; + +constexpr uint32_t inexact = 0b00001 << 2; + + +constexpr uint32_t bit_mask = 0x1f << 2; + +} + +namespace rm { +constexpr uint32_t round_to_nearest = 0b00 << 0; + +constexpr uint32_t round_to_zero = 0b01 << 0; + + +constexpr uint32_t bit_mask = 0x3 << 0; + +} +} + +} + +namespace ubc { +namespace bamra { +namespace bama { +constexpr uint32_t all_bara_bits_are_included_in_break_conditions = 0b0000 << 0; + +constexpr uint32_t lower_10_bits_of_bara_are_not_included_in_break_conditions = 0b0001 << 0; + +constexpr uint32_t lower_12_bits_of_bara_are_not_included_in_break_conditions = 0b0010 << 0; + +constexpr uint32_t all_bara_bits_are_not_included_in_break_conditions = 0b0011 << 0; + +constexpr uint32_t lower_16_bits_of_bara_are_not_included_in_break_conditions = 0b1000 << 0; + +constexpr uint32_t lower_20_bits_of_bara_are_not_included_in_break_conditions = 0b1001 << 0; + + +constexpr uint32_t bit_mask = 0xb << 0; + +} + +namespace basma { +constexpr uint32_t all_basra_bits_are_included_in_break_conditions = 0 << 2; + +constexpr uint32_t no_basra_bits_are_included_in_break_conditions = 1 << 2; + + +constexpr uint32_t bit_mask = 0x1 << 2; + +} +} + +namespace bbra { +namespace sza { +constexpr uint32_t operand_size_is_not_included_in_break_conditions = 0b00 << 0; + +constexpr uint32_t byte_access_is_used_as_break_condition = 0b01 << 0; + +constexpr uint32_t word_access_is_used_as_break_condition = 0b10 << 0; + +constexpr uint32_t longword_access_is_used_as_break_condition = 0b11 << 0; + +constexpr uint32_t quadword_access_is_used_as_break_condition = 0b1000000 << 0; + + +constexpr uint32_t bit_mask = 0x43 << 0; + +} + +namespace ida { +constexpr uint32_t condition_comparison_is_not_performed = 0b00 << 4; + +constexpr uint32_t instruction_access_cycle_is_used_as_break_condition = 0b01 << 4; + +constexpr uint32_t operand_access_cycle_is_used_as_break_condition = 0b10 << 4; + +constexpr uint32_t instruction_access_cycle_or_operand_access_cycle_is_used_as_break_condition = 0b11 << 4; + + +constexpr uint32_t bit_mask = 0x3 << 4; + +} + +namespace rwa { +constexpr uint32_t condition_comparison_is_not_performed = 0b00 << 2; + +constexpr uint32_t read_cycle_is_used_as_break_condition = 0b01 << 2; + +constexpr uint32_t write_cycle_is_used_as_break_condition = 0b10 << 2; + +constexpr uint32_t read_cycle_or_write_cycle_is_used_as_break_condition = 0b11 << 2; + + +constexpr uint32_t bit_mask = 0x3 << 2; + +} +} + +namespace brcr { +namespace cmfa { +constexpr uint32_t channel_a_break_condition_is_not_matched = 0 << 15; + +constexpr uint32_t channel_a_break_condition_match_has_occured = 1 << 15; + + +constexpr uint32_t bit_mask = 0x1 << 15; + +} + +namespace cmfb { +constexpr uint32_t channel_b_break_condition_is_not_matched = 0 << 14; + +constexpr uint32_t channel_b_break_condition_match_has_occured = 1 << 14; + + +constexpr uint32_t bit_mask = 0x1 << 14; + +} + +namespace pcba { +constexpr uint32_t channel_a_pc_break_is_effected_before_instruction_execution = 0 << 10; + +constexpr uint32_t channel_a_pc_break_is_effected_after_instruction_execution = 1 << 10; + + +constexpr uint32_t bit_mask = 0x1 << 10; + +} + +namespace dbeb { +constexpr uint32_t data_bus_condition_is_not_included_in_channel_b_conditions = 0 << 7; + +constexpr uint32_t data_bus_condition_is_included_in_channel_b_conditions = 1 << 7; + + +constexpr uint32_t bit_mask = 0x1 << 7; + +} + +namespace pcbb { +constexpr uint32_t channel_b_pc_break_is_effected_before_instruction_execution = 0 << 6; + +constexpr uint32_t channel_b_pc_break_is_effected_after_instruction_execution = 1 << 6; + + +constexpr uint32_t bit_mask = 0x1 << 6; + +} + +namespace seq { +constexpr uint32_t channel_a_and_b_comparison_are_performed_as_independent_condition = 0 << 3; + +constexpr uint32_t channel_a_and_b_comparison_are_performed_as_sequential_condition = 1 << 3; + + +constexpr uint32_t bit_mask = 0x1 << 3; + +} + +namespace ubde { +constexpr uint32_t user_break_debug_function_is_not_used = 0 << 0; + +constexpr uint32_t user_break_debug_function_is_used = 1 << 0; + + +constexpr uint32_t bit_mask = 0x1 << 0; + +} +} }