121 lines
3.2 KiB
Plaintext
121 lines
3.2 KiB
Plaintext
' 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
|