summaryrefslogtreecommitdiff
path: root/supervia.c
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2021-01-27 13:42:57 -0500
committermrb0nk500 <b0nk@b0nk.xyz>2021-01-27 13:42:57 -0500
commitcd6982e5da1f5facdc1e0154b3a27c01e8b076c9 (patch)
treec8db5ade59d054c6f88ff2ab2cb99df45b250fad /supervia.c
parent1700d8d10453ffe046438de0e6fbd496def915a1 (diff)
- Fixed some bugs in the emulator.
- Started work on implementing the Super VIA emulation. - Added support for disabling disassembly per instruction, when in debug mode. - Did some more work on rewriting the SuB Suite to work with the new calling convention. - Rewrote the symbol handling code in the emulator's assembler, to make it both simpler, and to add support for arbitrarily deep symbol scopes. - Added support for arbitrarily deep local symbol scopes. For example, to declare a symbol of depth 2, you add two '@' characters to the start of the symbol name. In other words, the number of '@' characters before the symbol name is what determines the scope of that symbol. And to use a symbol thats outside the current scope, you would use the same syntax as using a struct member, so you would do `global.local`.
Diffstat (limited to 'supervia.c')
-rw-r--r--supervia.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/supervia.c b/supervia.c
new file mode 100644
index 0000000..23e44e9
--- /dev/null
+++ b/supervia.c
@@ -0,0 +1,18 @@
+void init_supervia(struct supervia *sv) {
+ memset(sv, 0, sizeof(struct supervia));
+}
+
+/* Shifts out one bit from each output byte of the shift register into
+ * the serial output lines of those output bytes.
+ */
+void shift_out8(struct supervia *sv, int id) {
+ uint8_t bitpos = 7-sv->sr[id].ocount;
+ for (int i = 0; i < 8; i++) {
+ if (sv->sr[id].dir & (1 << i)) {
+ uint8_t bit = (sv->sr[id].data.u8[i] >> bitpos) & 1;
+ sv->sr[id].bits |= (bit << i);
+ }
+ }
+ sv->sr[id].ocount++;
+ sv->sr[id].ocount %= 8;
+}