En komplett 16-bitars datorsimulator byggd från grunden. CPU, assembler, grafik, ljud, debugger; allt i Rust.
Problem
Jag ville bygga något som rör vid varje lager av ett riktigt system. CPU-arkitektur, assembly-språkdesign, grafik, ljud, minneshantering, interrupts och felsökningsverktyg. Begränsade möjligheter är vad som skapar kreativitet. I dagens samhälle med spel som är på ~80+ GiB av data så kan det kännas som frisk luft att ta ett steg tillbaks och endast ha 64 KiB.
Tillvägagångssätt
Jag designade en egen instruktionsuppsättningsarkitektur (ISA) med blandad 16/32-bitars kodning, 8 generella register, deterministisk cykeltid, minnesmappad I/O och interrupt-hantering. Systemet är uppdelat i tre fristående crate: core (CPU, minne, 21 sysanrop), assembler (multi-pass med etiketter, framåtreferenser och automatisk kort-till-lång-expansion) och emulator (SDL2 med REPL-debugger, brytpunkter, disassemblering och enkel backtrace).
Funktioner
- Egen CPU: 30 opcodes, blandad 16/32-bitars kodning, 8 register, 30 instruktioner, 1–5 cykler per instruktion
- Assembler: Multi-pass, etiketter,
.org/.dw/.db/.ds/.equ-direktiv, automatisk kort/lång-expansion, symboltabell - Emulator: SDL2, ljud via rodio, minnesmappad tangentbord/mus/kontroll, async HTTP, REPL-debugger
- Grafik: 128×128, 4 bpp nibblepackad, 4 palettbankar × 16 färger, hårdvaruscrollande tilemap, spritebank (512 sprites, varav de första 256 kan användas till en tilemap)
- Ljud: 4 kanaler, 5 vågformer, minnesmappade register
- 21 sysanrop: Debug-print, sprites, text, former (linje/rektangel/cirkel), random, sqrt, sin, async HTTP, spara/ladda
- Kassett-format:
.cove.png= giltig PNG med programdatan på sluttet - 317+ enhetstester och 29 end-to-end-tester som körs headless i CI
- 2100+ rader programmeringsmanual och specifikationsdokumentation
Vad den erbjuder
Cove är inte bara en fantasikonsol, det må ha varit grunden till varför jag skapade det, men Cove kan också användas som ett pedagogiskt verktyg där det kan ge insikt till varför datorer fungerar som de gör, allt i ett relativt litet projekt där man rimligen kan förstå hela kodbasen, och varför saker fungerar som de gör.
Teknisk stack:
- Språk: Rust
- Grafik: SDL2
- Ljud: rodio, 4 channel waves
- Verktyg: Egen assembler, egen emulator, REPL-debugger