Added two examples showing the machine in action
This commit is contained in:
parent
b0b055d6ce
commit
810ecdb3ac
40
examples/echo.go
Normal file
40
examples/echo.go
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
// +build ignore
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "os"
|
||||||
|
import cre "git.tebibyte.media/sashakoshka/creature"
|
||||||
|
|
||||||
|
func main () {
|
||||||
|
// this is a simple echo program. it will take in input indefinetly and
|
||||||
|
// repeat it. due to line buffering in the terminal however, it will
|
||||||
|
// only print output once you have pressed enter.
|
||||||
|
machine := cre.Machine { Program: []int {
|
||||||
|
cre.PUSH, 0,
|
||||||
|
cre.CAL,
|
||||||
|
|
||||||
|
cre.PUSH, 1,
|
||||||
|
cre.CAL,
|
||||||
|
|
||||||
|
cre.PUSH, 1,
|
||||||
|
cre.PUSH, 0,
|
||||||
|
cre.JMP,
|
||||||
|
}}
|
||||||
|
|
||||||
|
machine.Register (0, read)
|
||||||
|
machine.Register (1, write)
|
||||||
|
err := machine.Execute(0)
|
||||||
|
if err != nil { panic(err.Error()) }
|
||||||
|
}
|
||||||
|
|
||||||
|
func read (machine *cre.Machine) (stop bool) {
|
||||||
|
ch := []byte { 0 }
|
||||||
|
os.Stdin.Read(ch)
|
||||||
|
machine.Push(int(ch[0]))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func write (machine *cre.Machine) (stop bool) {
|
||||||
|
print(string(rune(machine.Pop())))
|
||||||
|
return
|
||||||
|
}
|
142
examples/psychiatrist.go
Normal file
142
examples/psychiatrist.go
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
// +build ignore
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "os"
|
||||||
|
import cre "git.tebibyte.media/sashakoshka/creature"
|
||||||
|
|
||||||
|
func main () {
|
||||||
|
// this is an "ai psychiatrist" program. when it starts, it asks the
|
||||||
|
// user "What brings you in today?", and no matter what the user types,
|
||||||
|
// the program will respond with "And how does that make you feel?".
|
||||||
|
// this is a crude re-implementation of a program i used on macos at one
|
||||||
|
// point.
|
||||||
|
|
||||||
|
// constant address values
|
||||||
|
x := 0
|
||||||
|
introStart := 1
|
||||||
|
introLoopStart := 5
|
||||||
|
readLoopStart := 36
|
||||||
|
responseStart := 71
|
||||||
|
responseLoopStart := 50
|
||||||
|
|
||||||
|
machine := cre.Machine { Program: []int {
|
||||||
|
// reset x
|
||||||
|
cre.PUSH, introStart,
|
||||||
|
cre.PUSH, x,
|
||||||
|
cre.POKE,
|
||||||
|
|
||||||
|
// INTRO LOOP START
|
||||||
|
// get char
|
||||||
|
cre.PUSH, x,
|
||||||
|
cre.PEEK,
|
||||||
|
cre.PEEK,
|
||||||
|
|
||||||
|
// break if char is equal to zero
|
||||||
|
cre.PUSH, 0,
|
||||||
|
cre.EQ,
|
||||||
|
cre.PUSH, readLoopStart,
|
||||||
|
cre.JMP,
|
||||||
|
|
||||||
|
// get char
|
||||||
|
cre.PUSH, x,
|
||||||
|
cre.PEEK,
|
||||||
|
cre.PEEK,
|
||||||
|
|
||||||
|
// call write function
|
||||||
|
cre.PUSH, 1,
|
||||||
|
cre.CAL,
|
||||||
|
|
||||||
|
// increment x
|
||||||
|
cre.PUSH, x,
|
||||||
|
cre.PEEK,
|
||||||
|
cre.PUSH, 1,
|
||||||
|
cre.ADD,
|
||||||
|
cre.PUSH, x,
|
||||||
|
cre.POKE,
|
||||||
|
|
||||||
|
// loop
|
||||||
|
cre.PUSH, 1,
|
||||||
|
cre.PUSH, introLoopStart,
|
||||||
|
cre.JMP,
|
||||||
|
|
||||||
|
// INTRO LOOP END / READ LOOP START
|
||||||
|
// wait until the user presses enter
|
||||||
|
cre.PUSH, 0,
|
||||||
|
cre.CAL,
|
||||||
|
cre.PUSH, int('\n'),
|
||||||
|
cre.NEQ,
|
||||||
|
cre.PUSH, readLoopStart,
|
||||||
|
cre.JMP,
|
||||||
|
|
||||||
|
// reset x
|
||||||
|
cre.PUSH, responseStart,
|
||||||
|
cre.PUSH, x,
|
||||||
|
cre.POKE,
|
||||||
|
|
||||||
|
// RESPONSE LOOP START
|
||||||
|
// get char
|
||||||
|
cre.PUSH, x,
|
||||||
|
cre.PEEK,
|
||||||
|
cre.PEEK,
|
||||||
|
|
||||||
|
// if the char is zero, we have finished printing and can once
|
||||||
|
// again prompt the user for an answer
|
||||||
|
cre.PUSH, 0,
|
||||||
|
cre.EQ,
|
||||||
|
cre.PUSH, readLoopStart,
|
||||||
|
cre.JMP,
|
||||||
|
|
||||||
|
// get char
|
||||||
|
cre.PUSH, x,
|
||||||
|
cre.PEEK,
|
||||||
|
cre.PEEK,
|
||||||
|
|
||||||
|
// call write function
|
||||||
|
cre.PUSH, 1,
|
||||||
|
cre.CAL,
|
||||||
|
|
||||||
|
// increment x
|
||||||
|
cre.PUSH, x,
|
||||||
|
cre.PEEK,
|
||||||
|
cre.PUSH, 1,
|
||||||
|
cre.ADD,
|
||||||
|
cre.PUSH, x,
|
||||||
|
cre.POKE,
|
||||||
|
|
||||||
|
// loop
|
||||||
|
cre.PUSH, 1,
|
||||||
|
cre.PUSH, responseLoopStart,
|
||||||
|
cre.JMP,
|
||||||
|
}}
|
||||||
|
|
||||||
|
stringData := []byte (
|
||||||
|
"\x00" +
|
||||||
|
"== Artificial Intelligence Psychiatrist ==\n" +
|
||||||
|
"What brings you in today?\n\x00" +
|
||||||
|
"And how does that make you feel?\n\x00")
|
||||||
|
block := make([]int, len(stringData))
|
||||||
|
|
||||||
|
for index, char := range stringData {
|
||||||
|
block[index] = int(char)
|
||||||
|
}
|
||||||
|
|
||||||
|
machine.LoadMemory(block)
|
||||||
|
machine.Register (0, read)
|
||||||
|
machine.Register (1, write)
|
||||||
|
|
||||||
|
err := machine.Execute(0)
|
||||||
|
if err != nil { panic(err.Error()) }
|
||||||
|
}
|
||||||
|
|
||||||
|
func read (machine *cre.Machine) (stop bool) {
|
||||||
|
ch := []byte { 0 }
|
||||||
|
os.Stdin.Read(ch)
|
||||||
|
machine.Push(int(ch[0]))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func write (machine *cre.Machine) (stop bool) {
|
||||||
|
print(string(rune(machine.Pop())))
|
||||||
|
return
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user