Get rid of machine.go

This commit is contained in:
Přemysl Eric Janouch 2016-10-20 01:58:16 +02:00
parent 17e7453fff
commit 372be38613
Signed by: p
GPG Key ID: B715679E3A361BE6
2 changed files with 57 additions and 62 deletions

View File

@ -1,61 +0,0 @@
package main
import (
"errors"
"fmt"
)
func Run(code []int16) error {
if len(code) != 100 {
return errors.New("Code must be exactly 100 mailboxes long")
}
// for i, x := range code {
// fmt.Printf("%d: %d\n", i, x)
// }
// fmt.Println()
var accumulator int16 = 0
pc := 0
for pc >= 0 && pc < len(code) {
i := code[pc]
arg := i % 100
pc++
switch i - arg {
case IHALT:
return nil
case IADD:
accumulator += code[arg]
case ISUBTRACT:
accumulator -= code[arg]
case ISTORE:
code[arg] = accumulator
case ILOAD:
accumulator = code[arg]
case IBRANCH:
pc = int(i % 100)
case IBRANCH_IF_ZERO:
if accumulator == 0 {
pc = int(arg)
}
case IBRANCH_IF_POSITIVE:
if accumulator > 0 {
pc = int(arg)
}
case IIO:
switch arg {
case IO_INPUT:
fmt.Printf("Input: ")
fmt.Scanf("%d\n", &accumulator)
case IO_OUTPUT:
fmt.Printf("Output: %d\n", accumulator)
}
default:
e := fmt.Sprintf("Unsupported instruction %d at %d", i, pc)
return errors.New(e)
}
}
return errors.New("Program counter ran away")
}

58
main.go
View File

@ -1,10 +1,66 @@
package main package main
import ( import (
"errors"
"fmt" "fmt"
"os" "os"
) )
func run(code []int16) error {
if len(code) != 100 {
return errors.New("Code must be exactly 100 mailboxes long")
}
// for i, x := range code {
// fmt.Printf("%d: %d\n", i, x)
// }
// fmt.Println()
var accumulator int16 = 0
pc := 0
for pc >= 0 && pc < len(code) {
i := code[pc]
arg := i % 100
pc++
switch i - arg {
case IHALT:
return nil
case IADD:
accumulator += code[arg]
case ISUBTRACT:
accumulator -= code[arg]
case ISTORE:
code[arg] = accumulator
case ILOAD:
accumulator = code[arg]
case IBRANCH:
pc = int(i % 100)
case IBRANCH_IF_ZERO:
if accumulator == 0 {
pc = int(arg)
}
case IBRANCH_IF_POSITIVE:
if accumulator > 0 {
pc = int(arg)
}
case IIO:
switch arg {
case IO_INPUT:
fmt.Printf("Input: ")
fmt.Scanf("%d\n", &accumulator)
case IO_OUTPUT:
fmt.Printf("Output: %d\n", accumulator)
}
default:
e := fmt.Sprintf("Unsupported instruction %d at %d", i, pc)
return errors.New(e)
}
}
return errors.New("Program counter ran away")
}
func main() { func main() {
if len(os.Args) != 2 { if len(os.Args) != 2 {
fmt.Printf("usage: %s file\n", os.Args[0]) fmt.Printf("usage: %s file\n", os.Args[0])
@ -12,7 +68,7 @@ func main() {
fmt.Printf("Cannot open file: %s\n", err) fmt.Printf("Cannot open file: %s\n", err)
} else if code, err := Assemble(file); err != nil { } else if code, err := Assemble(file); err != nil {
fmt.Printf("Assembly failed: %s\n", err) fmt.Printf("Assembly failed: %s\n", err)
} else if err = Run(code); err != nil { } else if err = run(code); err != nil {
fmt.Printf("Runtime error: %s\n", err) fmt.Printf("Runtime error: %s\n", err)
} else { } else {
os.Exit(0) os.Exit(0)