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

@ -1,7 +1,10 @@
mojprg START 0
CLEAR B
LDA @LAB
LDA LAB
LDB LAB
LDA #12
END mojprg
halt J halt
LAB WORD 2
LAB2 RESW 3
LAB3 WORD 3

View file

@ -1,12 +1,14 @@
***** Section <default> *****
Stats: size=15 blocks=15 symbols=3 literals=0 relocations=0
Stats: size=29 blocks=29 symbols=5 literals=0 relocations=0
Blocks
name start size #ins #dir #sto
<default> 00000 0000F 4 3 0
<default> 00000 0001D 5 4 1
Symbols
name hex dec scope kind type description
LAB 00000C 12 local relative data label
halt 000009 9 local relative code label
LAB 00000E 14 local relative data label
LAB2 000011 17 local relative data label
LAB3 00001A 26 local relative data label
halt 00000B 11 local relative code label
mojprg 000000 0 exported relative code label
Literals
label definition

View file

@ -1,7 +1,10 @@
00000 mojprg START 0
00000 022009 LDA @LAB
00003 032006 LDA LAB
00006 01000C LDA #12
00009 END mojprg
00009 3F2FFD halt J halt
0000C 000002 LAB WORD 2
00000 B430 CLEAR B
00002 022009 LDA @LAB
00005 6B2006 LDB LAB
00008 01000C LDA #12
0000B END mojprg
0000B 3F2FFD halt J halt
0000E 000002 LAB WORD 2
00011 00....00 LAB2 RESW 3
0001A 000003 LAB3 WORD 3

View file

@ -1,3 +1,4 @@
Hmojprg00000000000F
T0000000F02200903200601000C3F2FFD000002
Hmojprg00000000001D
T00000011B4300220096B200601000C3F2FFD000002
T00001A03000003
E000000

View file

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,17 +784,95 @@ 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 {
@ -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

View file

@ -2,12 +2,9 @@ package main
import (
"fmt"
"strconv"
)
func main() {
test := "30"
var i int
i, _ = strconv.Atoi(test)
fmt.Println(i)
test := 65 + ((true ? 1 : 0) << 1) + ((true ? 1 : 0) << 0)
fmt.Println(test)
}