maple: add ft8 data transfer

This commit is contained in:
Zack Buhman 2023-12-17 11:06:38 +08:00
parent 5a9790daf1
commit dec0f7c7a4
6 changed files with 119 additions and 25 deletions

View File

@ -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<uint8_t>(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();

View File

@ -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 {

37
maple/maple_bus_ft8.hpp Normal file
View File

@ -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);
}
}

View File

@ -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 ""

5
regs/maple_bus_ft8.csv Normal file
View File

@ -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",,,,,,,,
1 data_transfer 7 6 5 4 3 2 1 0
2 vset vn vn vn vn vp vp vd vd
3 vset pf cv pd owf va va va va
4 fm
5 fm

BIN
regs/maple_bus_ft8.ods Normal file

Binary file not shown.