git @ Cat's Eye Technologies
master

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39``` ```# a sketch of what a Tamsin program to simulate a subset of the 6502 # might look like. # note that the 6502 memory is in the IMPLICIT BUFFER. sim6502 = instr(0,0,0) using \$:byte. instr(A,X,Y) = "\xA9" & any → A & instr(A,X,Y) # LDA # | "\xC8" & inc(Y) → Y & instr(A,X,Y) # INY | "\x8A" & A ← X & instr(A,X,Y) # TAX | "\x4C" & word → W & \$:seek(W) & instr(A,X,Y) # JMP | etc. word = any → Lo & any → Hi & return \$:add(\$:ord(Lo), \$:mul(\$:ord(Hi), 256)). etc. # That's the recursive version; compiling it to C currently would not be # nice to the stack. Here's an iterative version: sim6502 = A ← 0 & X ← 0 & Y ← 0 & !{instr(A,X,Y) → state(A,X,Y)} using \$:byte. instr(A,X,Y) = "\xA9" & any → A & return! state(A,X,Y) # LDA # !| "\xC8" & inc(Y) → Y & return! state(A,X,Y) # INY !| "\x8A" & A ← X & return! state(A,X,Y) # TAX !| "\x4C" & word → W & \$:seek(W) & return! state(A,X,Y) # JMP !| "\x00" & return! halted # BRK !| etc. # this uses ! (non-backtracking) and return! (immediate return from production) # (not sure about either of these...) ```