39 lines
1.8 KiB
Plaintext
39 lines
1.8 KiB
Plaintext
|
GOAL:
|
||
|
live-program an emulator in assembly
|
||
|
|
||
|
- a program is a graph that is flattened into a set of bytestreams.
|
||
|
- first step: make the damn graph.
|
||
|
|
||
|
APPROACH:
|
||
|
- program is split into "ROM" and "RAM" - ROM is code that generally doesn't change while the program is running, RAM is program data
|
||
|
- a program is assembled from snippets that refer to other snippets by name
|
||
|
- a code snippet can be marked as a "loop point", a safe spot to pause and replace a running program's code
|
||
|
- this is also be a good spot to take snapshots of "RAM" which we could roll back to
|
||
|
- this assumes an empty stack + no code references in RAM - perhaps a special typed variable is needed for snippet pointers?
|
||
|
- for now, we will depend on gsplus' socket-based remote debugging capabilities to poke the program into emulated memory
|
||
|
|
||
|
WHAT IS A SNIPPET
|
||
|
- label + block
|
||
|
- block = bytestring, labels (offset into instruction list), fixups (label references)
|
||
|
- can concatenate blocks; snippets are stored "loose" - accessed by absolute JMP or JSR
|
||
|
- other compositional ideas:
|
||
|
- "scopes" - keep labels "alive" only for a short period, for autogenerated loops, if statements, etc
|
||
|
- could also just gensym
|
||
|
|
||
|
(lda 13) ; immediate
|
||
|
(lda (addr #x2000)) ; absolute
|
||
|
(lda (addr #x20)) ; zero-page
|
||
|
(lda (off-x (addr #x20))) ; zp,x
|
||
|
(lda (off-y (addr #x20))) ; zp,y
|
||
|
(lda (off-x@ (addr #x20))) ; (zp,x)
|
||
|
(lda (@off-y (addr #x20))) ; (zp),y
|
||
|
(lda (off-x (addr #x2000))) ; abs,x
|
||
|
(lda (off-y (addr #x2000))) ; abs,y
|
||
|
|
||
|
label = lazy address
|
||
|
maybe treat zero-page and absolute as different types? we will always plan what goes into zero-page. zp has addressing modes abs doesn't.
|
||
|
|
||
|
each opcode is a function that returns a block, usually 0-3 bytes with optionally associated labels + fixups
|
||
|
(fixup is a tuple: local offset, label reference, and whether we're expecting an absolute, zero-page, or relative address)
|
||
|
|