bird-asm/main.go

76 lines
3.2 KiB
Go

package main
import (
"flag"
"fmt"
)
var (
version string = "0.02"
in string
out string
longMask byte = 1 << 7
returnMask byte = 1 << 6
verbose bool
dryRun bool
expansions uint16
ops = map[string]uint8{
"NOP": 0x00, "SET": 0x01, "GET": 0x02, "SEI": 0x03, "GEI": 0x04, "ALL": 0x05,
"PSH": 0x07, "POP": 0x08, "OVR": 0x09, "SWP": 0x0A, "ROT": 0x0B, "DUP": 0x0C, "SSW": 0x0D,
"ADD": 0x0E, "SUB": 0x0F, "MUL": 0x10, "DIV": 0x11, "INC": 0x12, "DEC": 0x13,
"AND": 0x15, "BOR": 0x16, "XOR": 0x17, "SHR": 0x18, "SHL": 0x19,
"JMP": 0x1C, "CAL": 0x1D, "JCD": 0x1E, "RET": 0x1F,
"RCH": 0x23, "RST": 0x24, "PUT": 0x25, "PST": 0x26, "HLT": 0x27, "SST": 0x28, "GST": 0x29,
"GRT": 0x2A, "LST": 0x2B, "GTE": 0x2C, "LTE": 0x2D, "EQL": 0x2E, "NEQ": 0x2F,
"NOPr": 0x40, "SETr": 0x41, "GETr": 0x42, "SEIr": 0x43, "GEIr": 0x44, "ALLr": 0x45,
"PSHr": 0x47, "POPr": 0x48, "OVRr": 0x49, "SWPr": 0x4A, "ROTr": 0x4B, "DUPr": 0x4C, "SSWr": 0x4D,
"ADDr": 0x4E, "SUBr": 0x4F, "MULr": 0x50, "DIVr": 0x51, "INCr": 0x52, "DECr": 0x53,
"ANDr": 0x55, "BORr": 0x56, "XORr": 0x57, "SHRr": 0x58, "SHLr": 0x59,
"JMPr": 0x5C, "CALr": 0x5D, "JCDr": 0x5E, "RETr": 0x5F,
"RCHr": 0x63, "RSTr": 0x64, "PUTr": 0x65, "PSTr": 0x66, "HLTr": 0x67, "SSTr": 0x68, "GSTr": 0x69,
"GRTr": 0x6A, "LSTr": 0x6B, "GTEr": 0x6C, "LTEr": 0x6D, "EQLr": 0x6E, "NEQr": 0x6F,
"NOP2": 0x80, "SET2": 0x81, "GET2": 0x82, "SEI2": 0x83, "GEI2": 0x84, "ALL2": 0x85,
"PSH2": 0x87, "POP2": 0x88, "OVR2": 0x89, "SWP2": 0x8A, "ROT2": 0x8B, "DUP2": 0x8C, "SSW2": 0x8D,
"ADD2": 0x8E, "SUB2": 0x8F, "MUL2": 0x90, "DIV2": 0x91, "INC2": 0x92, "DEC2": 0x93,
"AND2": 0x95, "BOR2": 0x96, "XOR2": 0x97, "SHR2": 0x98, "SHL2": 0x99,
"JMP2": 0x9C, "CAL2": 0x9D, "JCD2": 0x9E, "RET2": 0x9F,
"RCH2": 0xA3, "RST2": 0xA4, "PUT2": 0xA5, "PST2": 0xA6, "HLT2": 0xA7, "SST2": 0xA8, "GST2": 0xA9,
"GRT2": 0xAA, "LST2": 0xAB, "GTE2": 0xAC, "LTE2": 0xAD, "EQL2": 0xAE, "NEQ2": 0xAF,
"NOP2r": 0xC0, "SET2r": 0xC1, "GET2r": 0xC2, "SEI2r": 0xC3, "GEI2r": 0xC4, "ALL2r": 0xC5,
"PSH2r": 0xC7, "POP2r": 0xC8, "OVR2r": 0xC9, "SWP2r": 0xCA, "ROT2r": 0xCB, "DUP2r": 0xCC, "SSW2r": 0xCD,
"ADD2r": 0xCE, "SUB2r": 0xCF, "MUL2r": 0xD0, "DIV2r": 0xD1, "INC2r": 0xD2, "DEC2r": 0xD3,
"AND2r": 0xD5, "BOR2r": 0xD6, "XOR2r": 0xD7, "SHR2r": 0xD8, "SHL2r": 0xD9,
"JMP2r": 0xDC, "CAL2r": 0xDD, "JCD2r": 0xDE, "RET2r": 0xDF,
"RCH2r": 0xE3, "RST2r": 0xE4, "PUT2r": 0xE5, "PST2r": 0xE6, "HLT2r": 0xE7, "SST2r": 0xE8, "GST2r": 0xE9,
"GRT2r": 0xEA, "LST2r": 0xEB, "GTE2r": 0xEC, "LTE2r": 0xED, "EQL2r": 0xEE, "NEQ2r": 0xEF,
}
)
var strDelim rune = '`'
func main() {
flag.BoolVar(&dryRun, "dry", false, "Does a dry run (doesnot produce output file, but shows errors)")
flag.BoolVar(&verbose, "v", false, "Run in verbose mode")
delim := flag.String("delim", "`", "Override the ascci char that delimits strings")
ver := flag.Bool("version", false, "Print version information and exit")
outFile := flag.String("o", "", "Output file path")
flag.Parse()
if *ver {
fmt.Printf("bird-asm, version %s\n", version)
return
}
if *delim != "`" && *delim != "" {
strDelim = rune((*delim)[0])
}
setIn()
setOut(*outFile)
program := newProg()
program.Compile()
}