summaryrefslogtreecommitdiff
path: root/source/blog/yaxgbc_dev_notes.md
diff options
context:
space:
mode:
Diffstat (limited to 'source/blog/yaxgbc_dev_notes.md')
-rw-r--r--source/blog/yaxgbc_dev_notes.md39
1 files changed, 39 insertions, 0 deletions
diff --git a/source/blog/yaxgbc_dev_notes.md b/source/blog/yaxgbc_dev_notes.md
new file mode 100644
index 0000000..2a14567
--- /dev/null
+++ b/source/blog/yaxgbc_dev_notes.md
@@ -0,0 +1,39 @@
+# yaxgbc
+
+i hack on a gameboy color emulator from time to time. it started as... [a disassembler](https://git.iximeow.net/yaxpeax-sm83/?h=no-gods-no-) for the kind-of-but-not-Z80 processor in the Gameboy and Gameboy Color. in December or so, i looked at that library, remarked to myself that the whole disassembler is maybe 400 lines of Rust, and wondered how it would fare seeing real use.
+
+so i started writing enough of an emulator to see that the disassembler worked (it did! yay!), and started measuring how it affected the dependent code:
+* actual runtime overhead?
+* how large is the compiled decoder?
+
+TODO: fish up old numbers and screenshots. because there was substantial runtime impact, and i spotted a [missed optimization](https://github.com/rust-lang/rust/issues/107208) in rustc. i entirely rewrote the [`sm83` disassembler](https://github.com/iximeow/yaxpeax-sm83/commit/819e8a30d20c28398a00976a9925e9e741950bee) to be easier to merge the disassembler directly into code using it. as a [length-only decoder](https://github.com/iximeow/yaxpeax-sm83/commit/819e8a30d20c28398a00976a9925e9e741950bee#diff-9176af78feab5192ec447e97a2b52a0ba00b22c9e9b7ac3fc8c9763a5e9bd5caR50-R55), the decoder is on the order of 85 bytes without rustc being improved.
+
+somewhere between discovering the issue and coming up with a redesigned decoder interface, i had an existential panic about code reuse being fundamentally incompatible with high performance/tightly-integrated libraries. i no longer have any such panic :)
+
+## bugs aka dev log
+
+### video issues ("ascii `video` to the terminal is good right")
+
+### video issues ("why is the gameboy logo rendered wrong")
+
+### interrupt issues (are they level-triggered or edge-triggered? what clears interrupt bits, if anything)
+
+### input issues (edge/level trigger on inputs too)
+
+### clock sync (sleep() accuracy on windows and timeBeginPeriod)
+
+### audio issues ("there isn't any")
+
+### audio issues ("sounds are.. backwards?? what gives" [cycles/sample vs samples/sec])
+
+### audio issues ("noise noises too long. why." [channel 4 length docs])
+
+### audio issues ("frequencies are all off?" [timer multiplier issue])
+
+### video issues ("why is parallax in link's awakening broken" [not handlnig lyc=0])
+
+### video issues ("why is oracle of seasons/oracle of ages corrupted" [dma transfers to odd addresses])
+
+### video issues ("why is wario land 3 corrupted" [dma transfers to address 0, expecting high bits set])
+
+...