' Define the opcodes Enum NOP = 0 LDA STA ADD SUV BRZ JMP STP End Enum Function instr_(op As Ubyte, v As Ubyte) As Ubyte Return (32 * op) + v End Function Function NOP_(v As Ubyte) As Ubyte Return instr_(NOP, v) End Function Function LDA_(v As Ubyte) As Ubyte Return instr_(LDA, v) End Function Function STA_(v As Ubyte) As Ubyte Return instr_(STA, v) End Function Function ADD_(v As Ubyte) As Ubyte Return instr_(ADD, v) End Function Function SUB_(v As Ubyte) As Ubyte Return instr_(SUV, v) End Function Function BRZ_(v As Ubyte) As Ubyte Return instr_(BRZ, v) End Function Function JMP_(v As Ubyte) As Ubyte Return instr_(JMP, v) End Function Function STP_(v As Ubyte) As Ubyte Return instr_(STP, v) End Function Sub execute(nombre As String, program() As Ubyte) ' Initialize memory and program counter Dim As Ubyte m(Ubound(program)) Dim As Short m_pos = -1 For i As Ubyte = Lbound(program) To Ubound(program) m(m_pos + 1) = program(i) m_pos += 1 Next Dim As Boolean running = True Dim As Ubyte pc = 0 Dim As Ubyte a = 0 Dim As Ubyte op Dim As Ubyte operand While running op = m(pc) \ 32 operand = m(pc) Mod 32 pc = (pc + 1) Mod 32 Select Case op Case NOP ' No operation Case LDA a = m(operand) Case STA m(operand) = a Case ADD a = (a + m(operand)) Mod 256 If a > 255 Then a = 0 Case SUV a = (a - m(operand)) Mod 256 If a < 0 Then a = 255 Case BRZ If a = 0 Then pc = operand Case JMP pc = operand Case Else ' Stop running = False Print Space(12 - Len(nombre)) & nombre & ": " & a End Select Wend End Sub ' Test programs Dim poly1(4) As Ubyte = {LDA_(3), ADD_(4), STP_(0), 2, 2} execute("2+2", poly1()) Dim poly2(13) As Ubyte = {LDA_(12), ADD_(10), STA_(12), LDA_(11), SUB_(13), STA_(11), BRZ_(8), JMP_(0), LDA_(12), STP_(0), 8, 7, 0, 1} execute("7*8", poly2()) Dim poly3(0 To ...) As Ubyte = {LDA_(14), STA_(15), ADD_(13), STA_(14), LDA_(15), STA_(13), LDA_(16), SUB_(17), BRZ_(11), STA_(16), JMP_(0), LDA_(14), STP_(0), 1, 1, 0, 8, 1} execute("fibonacci", poly3()) Dim poly4(0 To ...) As Ubyte = {LDA_(13), ADD_(15), STA_(5), ADD_(16), STA_(7), NOP_(0), STA_(14), NOP_(0), BRZ_(11), STA_(15), JMP_(0), LDA_(14), STP_(0), LDA_(0), 0, 28, 1, 0, 0, 0, 6, 0, 2, 26, 5, 20, 3, 30, 1, 22, 4, 24} execute("linkedList", poly4()) Dim poly5(0 To ...) As Ubyte = {NOP_(0), NOP_(0), STP_(0), 0, LDA_(3), SUB_(29), BRZ_(18), LDA_(3), STA_(29), BRZ_(14), LDA_(1), ADD_(31), STA_(1), JMP_(2), LDA_(0), ADD_(31), STA_(0), JMP_(2), LDA_(3), STA_(29), LDA_(1), ADD_(30), ADD_(3), STA_(1), LDA_(0), ADD_(30), ADD_(3), STA_(0), JMP_(2), 0, 1, 3} execute("prisoner", poly5()) Dim poly6(0 To ...) As Ubyte = {LDA_(3), SUB_(4), STP_(0), 0, 255} execute("0-255", poly6()) Dim poly7(0 To ...) As Ubyte = {LDA_(3), SUB_(4), STP_(0), 0, 1} execute("0-1", poly7()) Dim poly8(0 To ...) As Ubyte = {LDA_(3), ADD_(4), STP_(0), 1, 255} execute("1+255", poly8()) Sleep