From dec0f7c7a4710cb1b531b7a508983ed04dd6cda2 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Sun, 17 Dec 2023 11:06:38 +0800 Subject: [PATCH] maple: add ft8 data transfer --- example/maple_controller.cpp | 4 ++- maple/maple_bus_ft0.hpp | 64 +++++++++++++++++++++++++--------- maple/maple_bus_ft8.hpp | 37 ++++++++++++++++++++ regs/gen/maple_data_format.py | 34 +++++++++++++----- regs/maple_bus_ft8.csv | 5 +++ regs/maple_bus_ft8.ods | Bin 0 -> 9731 bytes 6 files changed, 119 insertions(+), 25 deletions(-) create mode 100644 maple/maple_bus_ft8.hpp create mode 100644 regs/maple_bus_ft8.csv create mode 100644 regs/maple_bus_ft8.ods diff --git a/example/maple_controller.cpp b/example/maple_controller.cpp index 5ccc3cc..8e831d3 100644 --- a/example/maple_controller.cpp +++ b/example/maple_controller.cpp @@ -65,7 +65,7 @@ void do_get_condition(uint32_t port) } state[port].controller_connected = 1; - bool a = data_fields.data.digital_button & ft0::data_transfer::digital_button::a; + bool a = ft0::data_transfer::digital_button::a(data_fields.data.digital_button); if (a == 0) { serial::string("port "); serial::integer(port); @@ -108,6 +108,8 @@ void main() command_buf = align_32byte(_command_buf); receive_buf = align_32byte(_receive_buf); + vga(); + while (1) { v_sync_out(); v_sync_in(); diff --git a/maple/maple_bus_ft0.hpp b/maple/maple_bus_ft0.hpp index 3c37d7a..3da1db6 100644 --- a/maple/maple_bus_ft0.hpp +++ b/maple/maple_bus_ft0.hpp @@ -1,22 +1,54 @@ namespace ft0 { namespace data_transfer { namespace digital_button { - constexpr uint32_t ra = 1 << 7; - constexpr uint32_t la = 1 << 6; - constexpr uint32_t da = 1 << 5; - constexpr uint32_t ua = 1 << 4; - constexpr uint32_t start = 1 << 3; - constexpr uint32_t a = 1 << 2; - constexpr uint32_t b = 1 << 1; - constexpr uint32_t c = 1 << 0; - constexpr uint32_t rb = 1 << 15; - constexpr uint32_t lb = 1 << 14; - constexpr uint32_t db = 1 << 13; - constexpr uint32_t ub = 1 << 12; - constexpr uint32_t d = 1 << 11; - constexpr uint32_t x = 1 << 10; - constexpr uint32_t y = 1 << 9; - constexpr uint32_t z = 1 << 8; + constexpr uint32_t ra() { return 0b1 << 7; } + constexpr uint32_t ra(uint32_t reg) { return (reg >> 7) & 0b1; } + + constexpr uint32_t la() { return 0b1 << 6; } + constexpr uint32_t la(uint32_t reg) { return (reg >> 6) & 0b1; } + + constexpr uint32_t da() { return 0b1 << 5; } + constexpr uint32_t da(uint32_t reg) { return (reg >> 5) & 0b1; } + + constexpr uint32_t ua() { return 0b1 << 4; } + constexpr uint32_t ua(uint32_t reg) { return (reg >> 4) & 0b1; } + + constexpr uint32_t start() { return 0b1 << 3; } + constexpr uint32_t start(uint32_t reg) { return (reg >> 3) & 0b1; } + + constexpr uint32_t a() { return 0b1 << 2; } + constexpr uint32_t a(uint32_t reg) { return (reg >> 2) & 0b1; } + + constexpr uint32_t b() { return 0b1 << 1; } + constexpr uint32_t b(uint32_t reg) { return (reg >> 1) & 0b1; } + + constexpr uint32_t c() { return 0b1 << 0; } + constexpr uint32_t c(uint32_t reg) { return (reg >> 0) & 0b1; } + + constexpr uint32_t rb() { return 0b1 << 15; } + constexpr uint32_t rb(uint32_t reg) { return (reg >> 15) & 0b1; } + + constexpr uint32_t lb() { return 0b1 << 14; } + constexpr uint32_t lb(uint32_t reg) { return (reg >> 14) & 0b1; } + + constexpr uint32_t db() { return 0b1 << 13; } + constexpr uint32_t db(uint32_t reg) { return (reg >> 13) & 0b1; } + + constexpr uint32_t ub() { return 0b1 << 12; } + constexpr uint32_t ub(uint32_t reg) { return (reg >> 12) & 0b1; } + + constexpr uint32_t d() { return 0b1 << 11; } + constexpr uint32_t d(uint32_t reg) { return (reg >> 11) & 0b1; } + + constexpr uint32_t x() { return 0b1 << 10; } + constexpr uint32_t x(uint32_t reg) { return (reg >> 10) & 0b1; } + + constexpr uint32_t y() { return 0b1 << 9; } + constexpr uint32_t y(uint32_t reg) { return (reg >> 9) & 0b1; } + + constexpr uint32_t z() { return 0b1 << 8; } + constexpr uint32_t z(uint32_t reg) { return (reg >> 8) & 0b1; } + } struct data_format { diff --git a/maple/maple_bus_ft8.hpp b/maple/maple_bus_ft8.hpp new file mode 100644 index 0000000..5e7fa50 --- /dev/null +++ b/maple/maple_bus_ft8.hpp @@ -0,0 +1,37 @@ +namespace ft8 { + namespace data_transfer { + namespace vset { + constexpr uint32_t vn() { return 0b1111 << 4; } + constexpr uint32_t vn(uint32_t reg) { return (reg >> 4) & 0b1111; } + + constexpr uint32_t vp() { return 0b11 << 2; } + constexpr uint32_t vp(uint32_t reg) { return (reg >> 2) & 0b11; } + + constexpr uint32_t vd() { return 0b11 << 0; } + constexpr uint32_t vd(uint32_t reg) { return (reg >> 0) & 0b11; } + + constexpr uint32_t pf() { return 0b1 << 15; } + constexpr uint32_t pf(uint32_t reg) { return (reg >> 15) & 0b1; } + + constexpr uint32_t cv() { return 0b1 << 14; } + constexpr uint32_t cv(uint32_t reg) { return (reg >> 14) & 0b1; } + + constexpr uint32_t pd() { return 0b1 << 13; } + constexpr uint32_t pd(uint32_t reg) { return (reg >> 13) & 0b1; } + + constexpr uint32_t owf() { return 0b1 << 12; } + constexpr uint32_t owf(uint32_t reg) { return (reg >> 12) & 0b1; } + + constexpr uint32_t va() { return 0b1111 << 8; } + constexpr uint32_t va(uint32_t reg) { return (reg >> 8) & 0b1111; } + + } + + struct data_format { + uint16_t vset; + uint16_t fm; + }; + static_assert((sizeof (struct data_format)) == 4); + } +} + diff --git a/regs/gen/maple_data_format.py b/regs/gen/maple_data_format.py index 116c713..3cae87c 100644 --- a/regs/gen/maple_data_format.py +++ b/regs/gen/maple_data_format.py @@ -5,6 +5,12 @@ from collections import defaultdict from generate import renderer +@dataclass +class Bit: + name: str + length: int + position: int + @dataclass class Field: name: str @@ -26,6 +32,17 @@ def read_input(filename): ] return rows +def parse_bits(bits: list[str]): + bit_order = [7, 6, 5, 4, 3, 2, 1, 0] + by_name = defaultdict(list) + for bit_ix, bit in zip(bit_order, bits): + by_name[bit].append(bit_ix) + for name, indicies in by_name.items(): + yield Bit(name=name, + length=len(indicies), + position=min(indicies), + ) + def parse_data_format(ix, rows): if ix >= len(rows): return None @@ -50,7 +67,8 @@ def parse_data_format(ix, rows): assert excess_bits == [] bits = [b for b in _bits[:8] if b != ""] assert len(bits) in {0, 8}, bits - fields[field_name].append(Field(field_name, list(bits))) + fields[field_name].append(Field(field_name, + list(parse_bits(bits)))) size += 1 if field_name not in field_order: field_order.append(field_name) @@ -71,8 +89,6 @@ def parse(rows): assert len(formats) > 0 return formats -bit_order = [7, 6, 5, 4, 3, 2, 1, 0] - def render_format(format): yield f"namespace {format.name} {{" for field_name in format.field_order: @@ -83,11 +99,13 @@ def render_format(format): yield f"namespace {field_name} {{" for ix, field in enumerate(subfields): bit_offset = 8 * ix - if field.bits != []: - assert len(field.bits) == 8 - for byte_ix, bit in zip(bit_order, field.bits): - bit_ix = byte_ix + bit_offset - yield f"constexpr uint32_t {bit.lower()} = 1 << {bit_ix};" + for bit in field.bits: + name = bit.name.lower() + pos = bit_offset + bit.position + mask = bin(2 ** bit.length - 1) + yield f"constexpr uint32_t {name}() {{ return {mask} << {pos}; }}" + yield f"constexpr uint32_t {name}(uint32_t reg) {{ return (reg >> {pos}) & {mask}; }}" + yield "" yield "}" yield "" diff --git a/regs/maple_bus_ft8.csv b/regs/maple_bus_ft8.csv new file mode 100644 index 0000000..aa8c13e --- /dev/null +++ b/regs/maple_bus_ft8.csv @@ -0,0 +1,5 @@ +"data_transfer",7,6,5,4,3,2,1,0 +"vset","vn","vn","vn","vn","vp","vp","vd","vd" +"vset","pf","cv","pd","owf","va","va","va","va" +"fm",,,,,,,, +"fm",,,,,,,, diff --git a/regs/maple_bus_ft8.ods b/regs/maple_bus_ft8.ods new file mode 100644 index 0000000000000000000000000000000000000000..7b878e61fe2ae9f0b0edcd9e21c9c6f962dd6b41 GIT binary patch literal 9731 zcmdUVby$?!*ES6bNP`FnC?MUP0@B?j-8IAz!Vt;;(uhcROLs{LNHc_VH&R25fFQy* zocHyp=cng=zw7$``PMwoTzk)c*1dMjv-aL=->M48D1-0k*TPp9v#!@$7!>+b~bhQ9?1o^mt= z*jiZv-B?{MtRS%v0GJ&&@IW}oa%lQ78!D<`2HJjEo7!zA!6w$myg9+y={hFLWQrp@a9#%EJ5K>RRJBN=FH|JDk1^`7#RWKzuth~b>ClaqotcE>oZ4(NR0u&96N6F z850VfPAHCEl~nKTSCT3WvtZ11tKM~KQ;AqKIjQ|69hFD6zP(C9sWUTr>KhB^Z*%yZ zjr6LexT)!p9+qh4&txw(9UP%8Xf4Tq{hW*9Y%2vqAy|DFD7cf?4eORGtlts{B803AV)a2XCWvh+) z@#QCrQ#ankKg&`oqte=96OAt=18KE+L|i6fUkP27;Q0rl8RuPBSU+3kHOV9~&=GkH z24|Q%G%Hups7yn_oKUaphQ70N#*4?(8L7UAc+S#*1A{!vL95s^KaJ}F*yk+DQFPjD zJe(78NoEIoi8fd67f3Zm?An8wB3R0pinwL+m)jnPwPINpm^Y&dh~?}^gpa1ozm6s* z{ADnA0=V5cPWXUA^%R`ecyU|LbnY^akUbPTcAlpRCzb-)AQ7fGjv9!EzZqnuy-i~| zbKNSb_L@P;HBlxKnoYv?#E%Q+VnlA`B)X?AI-_2g*b4y9%y1`;FyjYW_BkGYEyx(< z{Nj8Di3~9(9wow4i}|RSBWrQ*D($&jzIJ2o?beF2H-wx9w@MQAE&228@^a#OZ6|xn z()&von><9+?XsM}k(1|)SOZnUOeEG4bSnkXSu>K!`)<>j1acUZ62k>!Qi*{m_7Qav z@k_k;O_9pzv{qA7Q>L|Z5=3NbBAC}c4gL|l++87-@@vf5=nTirnwU{RiW3-q_h+GK zicbWKNO3~|?O81PQm;2=`N)Z(XdQ{CalE=Zyj|X0t812D5K<oT2Q|`WxsrMzTgPWC_)kA?;fHLMgQymg|}GcAkB?jtG_XoM!e@7t#B! zj7c*c&G-iH+zoyj-oq{ChA#|leV1V+75jR`mHuHb=9_CnsXzAs_XJBG15kV&NttU5 z66j+vSJ_&r%1Q=L@X|@LavNXGmL3~A7NO#FX=03-p@e3wh--)Y)YwkLa$XW)NJ>;wzBFT2 zExJJD{itoovK@gLzFd}sy@#FM;XxftirB@U9WoM9+(f2OVwgVd)Vap{Wo2!>{%c=( zqU|aB`9_ZkQs3xfjqbDhc29niov-(YSkYpm?7%X&Aj>8ryW>W-$sSY!V|eo_2F!X| zH7hOvvC+08%C2=hYr8iIV1Zi&AT&L-ym1#JkyM=e*9<4*wa(1lCxWas kFz5O_b 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 literal 0 HcmV?d00001