115 lines
1.9 KiB
Go
115 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/user"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
const MaxUint16 uint16 = uint16(0xFFFF)
|
|
const MaxByte byte = byte(0xFF)
|
|
|
|
func IsLongOp(b byte) bool {
|
|
if b>>7 == 1 {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func IsRetStackOp(b byte) bool {
|
|
if b&0x40 == 0x40 {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func PopAddress() uint16 {
|
|
return To16(vm.Data.Pop2())
|
|
}
|
|
|
|
func ReadAddress(a uint16) uint16 {
|
|
return To16(vm.Mem.Read2(a))
|
|
}
|
|
|
|
func IsTrue(b byte) bool {
|
|
if b == 0 {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func To16(high, low byte) uint16 {
|
|
return (uint16(high)<<8)|uint16(low)
|
|
}
|
|
|
|
func To8s(n uint16) (byte, byte) {
|
|
return byte(n>>8), byte(n & uint16(0xFF))
|
|
}
|
|
|
|
func LoadProg(b []byte) int{
|
|
for i := range b {
|
|
vm.Prog[i] = b[i]
|
|
}
|
|
if len(b) < 2 {
|
|
return 0
|
|
}
|
|
vm.HP = To16(vm.Prog[0], vm.Prog[1])
|
|
return len(b)
|
|
}
|
|
|
|
func DumpVm(l int) {
|
|
fmt.Fprintf(
|
|
os.Stderr,
|
|
"\n<%03d>Data : %v\n<%03d>Return: %v\nPC: %d\nMemory: %v",
|
|
vm.Data.pointer,
|
|
vm.Data.data[:vm.Data.pointer],
|
|
vm.Return.pointer,
|
|
vm.Return.data[:vm.Return.pointer],
|
|
vm.PC,
|
|
vm.Prog[:l])
|
|
}
|
|
|
|
|
|
func loadFile(p string) ([]byte, error) {
|
|
return os.ReadFile(absFilepath(p))
|
|
}
|
|
|
|
func absFilepath(p string) string {
|
|
if strings.HasPrefix(p, "~") {
|
|
if p == "~" || strings.HasPrefix(p, "~/") {
|
|
homedir, _ := os.UserHomeDir()
|
|
if len(p) <= 2 {
|
|
p = homedir
|
|
} else if len(p) > 2 {
|
|
p = filepath.Join(homedir, p[2:])
|
|
}
|
|
} else {
|
|
i := strings.IndexRune(p, '/')
|
|
var u string
|
|
var remainder string
|
|
if i < 0 {
|
|
u = p[1:]
|
|
remainder = ""
|
|
} else {
|
|
u = p[1:i]
|
|
remainder = p[i:]
|
|
}
|
|
usr, err := user.Lookup(u)
|
|
if err != nil {
|
|
p = filepath.Join("/home", u, remainder)
|
|
} else {
|
|
p = filepath.Join(usr.HomeDir, remainder)
|
|
}
|
|
}
|
|
} else if !strings.HasPrefix(p, "/") {
|
|
wd, _ := os.Getwd()
|
|
p = filepath.Join(wd, p)
|
|
}
|
|
|
|
path, _ := filepath.Abs(p)
|
|
return path
|
|
}
|
|
|