bird-vm/helpers.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
}