From 60e1775b874015a3451e4bde10a8eb30701b1165 Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Tue, 6 Jul 2021 09:44:36 -0700 Subject: Initial commit. --- insts.rb | 228 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 insts.rb (limited to 'insts.rb') diff --git a/insts.rb b/insts.rb new file mode 100644 index 0000000..bc9c156 --- /dev/null +++ b/insts.rb @@ -0,0 +1,228 @@ +inst "hlt" do + @control.halt +end + +inst "mov $ #" do + uop { @decode.outaddr_a; @decode.outdata_b; @rf.store } +end + +inst "mov $ $" do + uop { @decode.outaddr_b; @rf.outdata; @tmp0.loaddata } + uop { @decode.outaddr_a; @tmp0.outdata; @rf.store } +end + +inst "mov [#] #" do + uop { @decode.outaddr_a; @decode.outdata_b; @memory.store } +end + +inst "mov [#] $" do + uop { @decode.outaddr_b; @rf.outdata; @tmp0.loaddata } + uop { @decode.outaddr_a; @tmp0.outdata; @memory.store } +end + +inst "mov [$] #" do + uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } + uop { @decode.outdata_b; @tmp0.outaddr; @memory.store } +end + +inst "mov [$] $" do + uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } + uop { @decode.outaddr_b; @rf.outdata; @tmp1.loaddata } + uop { @tmp0.outaddr; @tmp1.outdata; @memory.store } +end + +inst "mov $ [#]" do + uop { @decode.outaddr_b; @memory.outdata; @tmp0.loaddata } + uop { @decode.outaddr_a; @tmp0.outdata; @rf.store } +end + +inst "mov $ [$]" do + uop { @decode.outaddr_b; @rf.outdata; @tmp0.loaddata } + uop { @tmp0.outaddr; @memory.outdata; @tmp1.loaddata } + uop { @decode.outaddr_a; @tmp1.outdata; @rf.store } +end + +inst "skipz $" do + uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } + uop { @tmp0.outdata; @control.set_uip_if_nonzero; constaddr($eom) } + uop { @decode.clear } + decode_loop = uip() + uop { @pc.increment; @pc.outaddr; @memory.outdata; @decode.decode } + uop { @decode.outdata_needmore; @control.set_uip_if_nonzero; constaddr(decode_loop) } +end + +inst "skipnz $" do + uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } + uop { @tmp0.outdata; @control.set_uip_if_nonzero; constaddr(uip()+2) } + uop { @control.set_uip; constaddr($eom) } + uop { @decode.clear } + decode_loop = uip() + uop { @pc.increment; @pc.outaddr; @memory.outdata; @decode.decode } + uop { @decode.outdata_needmore; @control.set_uip_if_nonzero; constaddr(decode_loop) } +end + +inst "push $ #" do + uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } + uop { @tmp0.outaddr; @alu.sub; constdata(1) } + uop { @decode.outaddr_a; @alu.outdata; @rf.store } + uop { @decode.outdata_b; @alu.outaddr; @memory.store } +end + +inst "push $ $" do + uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } + uop { @tmp0.outaddr; @alu.sub; constdata(1) } + uop { @decode.outaddr_a; @alu.outdata; @rf.store } + uop { @decode.outaddr_b; @rf.outdata; @tmp1.loaddata } + uop { @tmp1.outdata; @alu.outaddr; @memory.store } +end + +inst "pop $ $" do + uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } + uop { @tmp0.outaddr; @alu.add; constdata(1) } + uop { @decode.outaddr_a; @alu.outdata; @rf.store } + uop { @alu.outaddr; @memory.outdata; @tmp0.loaddata } + uop { @decode.outaddr_b; @tmp0.outdata; @rf.store } +end + +def alu(op) + inst "#{op} $ #" do + uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } + uop { @decode.outdata_b; @tmp0.outaddr; @alu.send(op) } + uop { @decode.outaddr_a; @alu.outdata; @rf.store } + end + + inst "#{op} $ $" do + uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } + uop { @decode.outaddr_b; @rf.outdata; @tmp1.loaddata } + uop { @tmp0.outaddr; @tmp1.outdata; @alu.send(op) } + uop { @decode.outaddr_a; @alu.outdata; @rf.store } + end +end + +alu :and +alu :or +alu :xor +alu :add +alu :sub +alu :cmp +alu :lshift +alu :rshift + +def cmpbit(name, bit) + inst "#{name} $ #" do + uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } + uop { @decode.outdata_b; @tmp0.outaddr; @alu.cmp } + uop { @alu.outdata; @alu.and; constaddr(1<