Created
January 27, 2012 21:34
-
-
Save jgouly/1691036 to your computer and use it in GitHub Desktop.
titan
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Titan | |
OPCODES = %w( | |
SHR | |
ADD | |
SUB | |
AND | |
LOR | |
XOR | |
NOT | |
PSH | |
POP | |
MOV | |
JMP | |
LDI | |
STI | |
LDC | |
LDM | |
STM) | |
def initialize(&blk) | |
init_flags | |
init_regs | |
@ops = [] | |
instance_eval &blk | |
run | |
p @registers | |
end | |
def init_flags | |
@flags = {} | |
@flags['Z'] = 0 | |
@flags['C'] = 0 | |
@flags['S'] = 0 | |
end | |
def init_regs | |
@registers = Array.new(16, 0) | |
end | |
def init_stack | |
@stack = [] | |
end | |
def get_reg(r) | |
@registers[r] | |
end | |
def set_reg(r, v) | |
@registers[r] = v | |
end | |
def run | |
@ops.each do |op| | |
args = op[1..op.length] | |
send(op[0], *args) | |
end | |
end | |
def op_SHR(r) | |
set_reg(r, get_reg(r) >> 1) | |
end | |
def op_ADD(r1, r2) | |
set_reg(r1, get_reg(r1) + get_reg(r2)) | |
end | |
def op_SUB(r1, r2) | |
set_reg(r1, get_reg(r1) - get_reg(r2)) | |
end | |
def op_AND(r1, r2) | |
set_reg(r1, get_reg(r1) & get_reg(r2)) | |
end | |
def op_LOR(r1, r2) | |
set_reg(r1, get_reg(r1) | get_reg(r2)) | |
end | |
def op_XOR(r1, r2) | |
set_reg(r1, get_reg(r1) ^ get_reg(r2)) | |
end | |
def op_MOV(r1, r2) | |
set_reg(r2, get_reg(r1)) | |
end | |
def op_PSH(r) | |
@stack << get_reg(r) | |
end | |
def op_POP(r) | |
set_reg(r, @stack.pop) | |
end | |
def op_LDC(r, n) | |
set_reg(r, n) | |
end | |
OPCODES.each do |op| | |
define_method op.downcase do |*args| | |
@ops << ["op_"+op, args].flatten | |
end | |
end | |
(0..16).each do |n| | |
define_method "r#{n}" do | |
n | |
end | |
end | |
end | |
t = Titan.new do | |
ldc r1, 1 | |
ldc r0, 5 | |
xor r0, r1 | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment