LOLCODE to 6502 Compiler

Download Report

Transcript LOLCODE to 6502 Compiler

LOLCODE to 6502
Compiler
HOW DUZ I PUSH YR POP?
MAH TABLES IZ A STACKZ
LDA #$1337 ; WAT U SAY?
Of VM’s and SM’s: Problem
LOLCODE is a dynamic, interpreted
language
 The 6502 is an 8-bit, 3 register, limited
CPU
 Instruction sets inherently different and
perpendicular
 How to solve this?

Of VM’s and SM’s: Solution
Use a virtual machine built on top of the
6502
 Create a custom instruction set for the
LOLCODE IR tree – SM assembly
 Create a custom stack machine to execute
instructions on a ‘stack’
 Abstracts memory addressing with stack

Of SM’s and VM’s: Emulate?
LOL SM is not a pure emulated stack
machine
 Only stack/heap/frame are emulated
 Why? Emulating an entire machine is
slow, snail pace on the 6502
 End result: bastardization of emulation and
pure 6502 assembly

Of SM’s and VM’s: The Machine
What is the machine then?
 Stack, Heap, ‘IT’ register, Frames
 SP (stack pointer), FP (frame pointer), HP
(heap pointer)
 Most instructions operate on stack
 Strings (objects) operate on heap
 Function calls manipulate frame

Of SM’s and VM’s: Limitations
The 6502 CPU limits what we can do, and
forces workarounds
 Absolute addressing is not possible with
the stack
 Stack must be indirectly referenced with
an offset counter (no negative offsets)
 Operations using the SP are tricky

Of VM’s and SM’s: Example

LOLCODE
num R SUM OF 0 AN 1
num
num IZ NOW A TROOF
Of SM’s and VM’s: Example

LOLCODE IR
ASSIGN
|- ID:num
|- ADD
|- INT:0
|- INT:1
ASSIGN
|- ID:IT
|- ID:num
RECAST
|- ID:num
|- LTBOOL
Of SM’s and VM’s: Example

SM Assembly
push_const:0
push_const:1
pop_var:num
push_var:num
pop_it
push_var:num
to_bool
pop_var:num
Of SM’s and VM’s: Example

6502 Assembly
pop_var:
; X is offset of var, known at compile
TAX
; push the X register onto stack
PHA
LDX #$1
JMP dec_sp ; decrement the SP by 3 bytes
PLA
; pop the X register off the stack
TXA
LDY #$0
LDA (SP), Y ; grab first byte off SM stack
STA (FP, X) ; store into FP + offset X
INX
; go to next byte
INY
; go to next byte
; Repeat for next two bytes
Compiler Report: Progress
Most LOLCODE IR converted into a mix of
macro SM, and pure assembly
 75% done when realized that current
OffsetTable counter was broken
 Rewrote table, but have to rewrite most of
the conversions
 Now supports local variables/new frames

Compiler Report: Progress
Several macro instructions already written
in 6502 assembly
 Variable type conversions still need to
finish (because they are tricky)
 String/heap operations require more
analysis (creation/deletion)
 Math operations require clarification

Compiler Report: The Last Mile
All LOLCODE IR converted to macro
instructions (big)
 All SM assembly written in 6502 ASM
(bigger)
 Actual heap/string/stdio working with
garbage collection (small)
 Code examples (tiny)
