LOL6502 Compiler
Download
Report
Transcript LOL6502 Compiler
LOL6502 Compiler
I CAN HAS LOLCODE?
Things for the Day
Summary of the Project
The Stack Machine – Expanded
6502 Assembly Output
LOLCODE examples… by you
Demonstration
Conclusions, Future Goals
What’s featured?
17-bit integers
All math operations ensure correct sign
Conversion bool <> int
Basic STDOUT (bool, int)
Support for infinite nested structures
Variable/function scoping implemented
What’s missing?
math_mul, math_div
Floats, Strings, heap operations
to_int, to bool (partial)
STDIN, STDOUT (partial)
Any sort of sane error checking and
testing -.
Overall
Standard Library 70% complete, needs
conversion functions (1.4KB code ;_;)
Strings/heap are a total mess, needs
clarification
STDIO – missing a lot of functionality
Macro Compiler – does not need
changing, save for missing features
Of Stack Machines
Three basic registers: SP, FP, HP
One global stack used for all operations
Machine-specific instructions:
push_var/sp/fp, pop_var/fp, stack_swap,
inc/dec_sp
Conversion instructions:
to_bool, to_int, to_float, to_string, to_undef
Of Stack Machines
LOLCODE instructions implemented on a
near 1:1 basis
Examples (LOL = IR = SM)
SUM OF = ADD = math_add
WON OF = XOR = bool_xor
BOTH SAEM = EQUAL = comp_equal
Of Stack Machines
Almost all operations operate on the stack
We avoid the headaches of: register
allocation, spilling, any sort of memory
operations
Variables are stored on stack, and offset
from the FP
Functions make use of a record for calling
Of Stack Machines
A push_var, will copy the contents of a
variable onto the stack
Results of an instruction are saved on the
stack
Why is this better? No instructions have
side effects on variables save for the
ASSIGN instruction (pop_var)
Of Stack Machines
A function call will push space for a return
value, the current FP value, and args
Resets SP and pops the SP onto the FP
Jumps to the correct procedure
Does stuff, returns, pops the saved FP
back into the FP
Removes return value if function exited
Of Stack Machines
All conditionals and loops create a
temporary local scope for each case
Macro compiler ensures these FP offsets
are managed properly (at compile time)
At the time, unable to limit scope of a
function body (will fix later)
ASM Output
SM compiler spits out tons of ASM code
and STDLIB instructions
i.e. Conditionals/Loops will print out ASM
code to facilitate structure
STDLIB is oodles upon oodles of ASM that
manipulate the virtual stack (all
handwritten mind you)
ASM Output
Indirect indexed addressing is the mode
used for almost every major instruction
In theory, there should be an infinite
amount of nested operations available
However, most instructions use JSR,
which push machine SP to machine stack
Machine stack limited to one page (256B)
LOLCODE Examples
Demonstrate the compiler and simulator using
examples provided by you
ADD, SUB, MOD, MAX, MIN, AND, OR, XOR,
NOT, EQUAL, IAND, IOR
Supports int/bool, STDOUT of those two types
IF-THEN-ELSE, SWITCH-CASE, FOR LOOP
VAR DEF, FUNC DEF, FUNC CALL
ASSIGN, EXPLICIT/IMPLICIT casting
Conclusions
This was a fun, if long and grueling project
Developing a compiler from start to finish
provided a lot of knowledge into the
complexities of compiler construction
Creating a virtual stack machine was
insightful in compiling an otherwise
interpreted language
Conclusions
Wrote a lot of ASM – went crazy with the
STDLIB.
Rewrote the SM twice – better each time,
but still requires work
Did not plan accordingly to include
heaps/strings (just ran out of time)
Future Goals
Finish up the formalization and implementation
of heaps/strings
Finish implementing the STDIO for more useful
examples
Finish the type conversions at run time, and
allow for error recovery
Create a game in LOLCODE to 6502
Write my own 6502 emulator with advanced
features (bitmapped graphics, etc)