generation 3.0

This commit is contained in:
aljazbrodar. 2026-01-17 16:54:20 +01:00
parent d30c4a2e24
commit 59a65cf49e
7 changed files with 143 additions and 37 deletions

View file

@ -8,6 +8,16 @@ import (
"strconv"
)
var register_map = map[string]int{
"A": 0,
"X": 1,
"L": 2,
"B": 3,
"S": 4,
"T": 5,
"F": 6,
}
var ukazna_tabela = map[string]int{
"ADD": 0x18,
"ADDF": 0x58,
@ -85,20 +95,33 @@ var naslov_programa int
var zacetni_naslov int
type ukaz interface {
GetOznaka() string
Velikost() int
GetAddr() int
}
func (f *format_F1) GetOznaka() string { return f.oznaka }
func (f *format_F2_n) GetOznaka() string { return f.oznaka }
func (f *format_F2_r) GetOznaka() string { return f.oznaka }
func (f *format_F2_rn) GetOznaka() string { return f.oznaka }
func (f *format_F2_rr) GetOznaka() string { return f.oznaka }
func (f *format_F3_m) GetOznaka() string { return f.oznaka }
func (f *format_F4_m) GetOznaka() string { return f.oznaka }
func (f *format_D) GetOznaka() string { return f.oznaka }
func (f *format_D_n) GetOznaka() string { return f.oznaka }
func (f *format_M_i) GetOznaka() string { return f.oznaka }
func (f *format_M_r) GetOznaka() string { return f.oznaka }
func (f *format_F1) Velikost() int { return f.velikost }
func (f *format_F2_n) Velikost() int { return f.velikost }
func (f *format_F2_r) Velikost() int { return f.velikost }
func (f *format_F2_rn) Velikost() int { return f.velikost }
func (f *format_F2_rr) Velikost() int { return f.velikost }
func (f *format_F3_m) Velikost() int { return f.velikost }
func (f *format_F4_m) Velikost() int { return f.velikost }
func (f *format_D) Velikost() int { return f.velikost }
func (f *format_D_n) Velikost() int { return f.velikost }
func (f *format_M_i) Velikost() int { return f.velikost }
func (f *format_M_r) Velikost() int { return f.velikost }
func (f *format_F1) GetAddr() int { return f.lc }
func (f *format_F2_n) GetAddr() int { return f.lc }
func (f *format_F2_r) GetAddr() int { return f.lc }
func (f *format_F2_rn) GetAddr() int { return f.lc }
func (f *format_F2_rr) GetAddr() int { return f.lc }
func (f *format_F3_m) GetAddr() int { return f.lc }
func (f *format_F4_m) GetAddr() int { return f.lc }
func (f *format_D) GetAddr() int { return f.lc }
func (f *format_D_n) GetAddr() int { return f.lc }
func (f *format_M_i) GetAddr() int { return f.lc }
func (f *format_M_r) GetAddr() int { return f.lc }
var register string = `A|X|L|B|S|T|F`
@ -761,18 +784,96 @@ func drugi_prehod(AST *[]ukaz) {
}
func generacija(AST *[]ukaz) {
_, err := os.Create("out.obj")
obj, err := os.Create("out.obj")
if err != nil {
fmt.Println("Error creating a file: ", err)
return
}
defer file.Close()
switch
fmt.Println("H", ime_programa, naslov_programa, naslov_programa - lc_global + (*AST)[len(*AST) - 1].velikost)
defer obj.Close()
fmt.Println("H", ime_programa, naslov_programa, lc_global + (*AST)[len(*AST) - 1].Velikost() - naslov_programa)
line_len := 0
line := ""
line_addr := naslov_programa
for _, el := range *AST {
temp := ""
switch val := el.(type) {
case *format_F1: temp= fmt.Sprintf("%s%4x", temp, val.opcode)
case *format_F2_n: temp = fmt.Sprintf("%s%2x%x%x", temp, val.opcode, val.n, 0)
case *format_F2_r: temp = fmt.Sprintf("%s%2x%x%x", temp, val.opcode, register_map[val.r1], 0)
case *format_F2_rn: temp = fmt.Sprintf("%s%2x%x%x", temp, val.opcode, val.r1, val.n)
case *format_F2_rr: temp = fmt.Sprintf("%s%2x%x%x", temp, val.opcode, register_map[val.r1], register_map[val.r2])
case *format_F3_m: n := 0
i := 0
x := 0
b := 0
p := 0
e := 0
if val.n {
n = 1
}
if val.i {
i = 1
}
if val.x {
x = 1
}
if val.b {
b = 1
}
if val.p {
p = 1
}
if val.e {
e = 1
}
temp = fmt.Sprintf("%s%2x%2x%2x", temp, val.opcode + (n << 1) + i, (x << 7) + (b << 6) + (p << 5) + (e << 4) +
(val.odmik & (0xF << 8)), val.odmik & 0xFF)
case *format_F4_m: n := 0
i := 0
x := 0
b := 0
p := 0
e := 0
if val.n {
n = 1
}
if val.i {
i = 1
}
if val.x {
x = 1
}
if val.b {
b = 1
}
if val.p {
p = 1
}
if val.e {
e = 1
}
temp = fmt.Sprintf("%s%2x%2x%2x%2x", temp, val.opcode + (n << 1) + i, (x << 7) + (b << 6) + (p << 5) + (e << 4) +
(val.odmik & (0xF << 16)), val.odmik & (0xFF << 8), val.odmik & 0xFF)
case *format_D: continue
case *format_D_n: if val.ime == "START" || val.ime == "END" {
continue
}
case *format_M_r: continue
case *format_M_i: vr, _ := strconv.Atoi(val.operand)
temp = fmt.Sprintf("%s%3x", temp, vr)
}
if line_len + el.Velikost() <= 30 {
line_len += el.Velikost()
line = fmt.Sprintf("%s%s", line, temp)
} else {
fmt.Printf("T: %x, %x, %s\n", line_addr, line_len, line)
line_len = el.Velikost()
line = temp
line_addr = el.GetAddr()
}
}
}
func izpis(AST *[]ukaz) {
for _, el := range *AST {
switch val := el.(type) {
@ -805,7 +906,6 @@ func main() {
pattern := regexp.MustCompile(`.*\n`)
matches := pattern.FindAllString(input, -1)
var AST []ukaz
for _, el := range matches {
if remove_comments_and_empty_lines(el) {
continue