Skip to content

Instantly share code, notes, and snippets.

@jgouly
Created January 27, 2012 21:34
Show Gist options
  • Save jgouly/1691036 to your computer and use it in GitHub Desktop.
Save jgouly/1691036 to your computer and use it in GitHub Desktop.
titan
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