holey-toys/src/args.c

68 lines
1.5 KiB
C
Raw Normal View History

2024-03-11 10:15:06 +00:00
typedef struct ArgMeta_s {
2024-03-11 14:00:55 +00:00
char chr;
uint8_t size;
// This is a bitset of acceptable overflow states,
// where accept signed = 1, accept unsigned = 2.
// 1 -> signed, 2 -> unsigned, 3 -> whatever
uint8_t sign;
uint8_t rel;
2024-03-08 11:23:47 +00:00
} ArgMeta;
const ArgMeta ARGS[] = {
2024-03-11 10:15:06 +00:00
{'R', 1, 2, 0}, {'1', 1, 3, 0}, {'b', 1, 1, 0}, {'B', 1, 2, 0},
{'2', 2, 3, 0}, {'o', 2, 1, 1}, {'h', 2, 1, 0}, {'H', 2, 2, 0},
{'4', 4, 3, 0}, {'w', 4, 1, 0}, {'O', 4, 1, 1}, {'W', 4, 2, 0},
{'8', 8, 3, 0}, {'d', 8, 1, 0}, {'D', 8, 2, 0}, {0},
2024-03-08 11:23:47 +00:00
};
2024-03-11 10:15:06 +00:00
typedef enum Operands_e {
2024-03-11 14:00:55 +00:00
Empty = 0,
R,
RR,
RRR,
RRRR,
Rx8,
Rx16,
Rx32,
Rx64,
RRx8,
RRx16,
RRx32,
RRx64,
RRs32,
RRs64,
RRu8,
RRu16,
RRu64,
r16,
r32,
RRr16,
RRr32,
RRr16u16,
RRr32u16,
RRu64u16,
2024-03-11 10:15:06 +00:00
} Operands;
// R -> register,
// 1 -> Xi8, 2 -> Xi16, 4 -> Xi32, 8 -> Xi64,
// b -> Si8, h -> Si16, w -> Si32, d -> Si64,
// B -> Ui8, H -> Ui16, W -> Ui32, D -> Ui64,
// o -> 16 bit relative offset,
// O -> 32 bit relative offset,
const char *TYPE_STR[] = {
"", "R", "RR", "RRR", "RRRR", "R1", "R2", "R4", "R8",
"RR1", "RR2", "RR4", "RR8", "RRw", "RRd", "RRB", "RRH", "RRD",
"o", "O", "RRo", "RRO", "RRoH", "RROH", "RRDH",
};
2024-03-08 11:23:47 +00:00
const size_t NARGS = sizeof(ARGS) / sizeof(ARGS[0]);
2024-03-13 17:21:04 +00:00
2024-03-17 10:42:44 +00:00
static ArgMeta arg_meta(char arg) {
2024-03-11 14:00:55 +00:00
for (size_t ii = 0; ii < NARGS; ii += 1) {
ArgMeta meta = ARGS[ii];
if (meta.chr == arg) {
return meta;
}
2024-03-08 11:23:47 +00:00
}
2024-03-11 14:00:55 +00:00
return ARGS[NARGS - 1];
2024-03-08 11:23:47 +00:00
}