Execute Computer/Zero: Difference between revisions

Added FreeBASIC
(Added Easylang)
(Added FreeBASIC)
 
Line 135:
400 DATA "LINKED LIST",45,111,69,112,71,0,78,0,171,79,192,46,224,32,0,28,1,0,0,0,6,0,2,26,5,20,3,30,1,22,4,24
500 DATA "PRISONER",0,0,224,0,0,35,157,178,35,93,174,33,127,65,194,32,127,64,192,35,93,33,126,99,</syntaxhighlight>
 
==={{header|FreeBASIC}}===
{{trans|ALGOL 68}}
<syntaxhighlight lang="vbnet">' 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</syntaxhighlight>
{{out}}
<pre> 2+2: 4
7*8: 56
fibonacci: 55
linkedList: 6
prisoner: 0
0-255: 1
0-1: 255
1+255: 0</pre>
 
=={{header|Delphi}}==
2,167

edits