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 mojprg START 0
CLEAR B
LDA @LAB LDA @LAB
LDA LAB LDB LAB
LDA #12 LDA #12
END mojprg END mojprg
halt J halt halt J halt
LAB WORD 2 LAB WORD 2
LAB2 RESW 3
LAB3 WORD 3

View file

@ -1,12 +1,14 @@
***** Section <default> ***** ***** 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 Blocks
name start size #ins #dir #sto name start size #ins #dir #sto
<default> 00000 0000F 4 3 0 <default> 00000 0001D 5 4 1
Symbols Symbols
name hex dec scope kind type description name hex dec scope kind type description
LAB 00000C 12 local relative data label LAB 00000E 14 local relative data label
halt 000009 9 local relative code 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 mojprg 000000 0 exported relative code label
Literals Literals
label definition label definition

View file

@ -1,7 +1,10 @@
00000 mojprg START 0 00000 mojprg START 0
00000 022009 LDA @LAB 00000 B430 CLEAR B
00003 032006 LDA LAB 00002 022009 LDA @LAB
00006 01000C LDA #12 00005 6B2006 LDB LAB
00009 END mojprg 00008 01000C LDA #12
00009 3F2FFD halt J halt 0000B END mojprg
0000C 000002 LAB WORD 2 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 Hmojprg00000000001D
T0000000F02200903200601000C3F2FFD000002 T00000011B4300220096B200601000C3F2FFD000002
T00001A03000003
E000000 E000000

View file

View file

@ -8,6 +8,16 @@ import (
"strconv" "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{ var ukazna_tabela = map[string]int{
"ADD": 0x18, "ADD": 0x18,
"ADDF": 0x58, "ADDF": 0x58,
@ -85,20 +95,33 @@ var naslov_programa int
var zacetni_naslov int var zacetni_naslov int
type ukaz interface { type ukaz interface {
GetOznaka() string Velikost() int
GetAddr() int
} }
func (f *format_F1) GetOznaka() string { return f.oznaka } func (f *format_F1) Velikost() int { return f.velikost }
func (f *format_F2_n) GetOznaka() string { return f.oznaka } func (f *format_F2_n) Velikost() int { return f.velikost }
func (f *format_F2_r) GetOznaka() string { return f.oznaka } func (f *format_F2_r) Velikost() int { return f.velikost }
func (f *format_F2_rn) GetOznaka() string { return f.oznaka } func (f *format_F2_rn) Velikost() int { return f.velikost }
func (f *format_F2_rr) GetOznaka() string { return f.oznaka } func (f *format_F2_rr) Velikost() int { return f.velikost }
func (f *format_F3_m) GetOznaka() string { return f.oznaka } func (f *format_F3_m) Velikost() int { return f.velikost }
func (f *format_F4_m) GetOznaka() string { return f.oznaka } func (f *format_F4_m) Velikost() int { return f.velikost }
func (f *format_D) GetOznaka() string { return f.oznaka } func (f *format_D) Velikost() int { return f.velikost }
func (f *format_D_n) GetOznaka() string { return f.oznaka } func (f *format_D_n) Velikost() int { return f.velikost }
func (f *format_M_i) GetOznaka() string { return f.oznaka } func (f *format_M_i) Velikost() int { return f.velikost }
func (f *format_M_r) GetOznaka() string { return f.oznaka } 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` var register string = `A|X|L|B|S|T|F`
@ -761,17 +784,95 @@ func drugi_prehod(AST *[]ukaz) {
} }
func generacija(AST *[]ukaz) { func generacija(AST *[]ukaz) {
_, err := os.Create("out.obj") obj, err := os.Create("out.obj")
if err != nil { if err != nil {
fmt.Println("Error creating a file: ", err) fmt.Println("Error creating a file: ", err)
return return
} }
defer file.Close() defer obj.Close()
switch fmt.Println("H", ime_programa, naslov_programa, lc_global + (*AST)[len(*AST) - 1].Velikost() - naslov_programa)
fmt.Println("H", ime_programa, naslov_programa, naslov_programa - lc_global + (*AST)[len(*AST) - 1].velikost) 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) { func izpis(AST *[]ukaz) {
for _, el := range *AST { for _, el := range *AST {
@ -805,7 +906,6 @@ func main() {
pattern := regexp.MustCompile(`.*\n`) pattern := regexp.MustCompile(`.*\n`)
matches := pattern.FindAllString(input, -1) matches := pattern.FindAllString(input, -1)
var AST []ukaz var AST []ukaz
for _, el := range matches { for _, el := range matches {
if remove_comments_and_empty_lines(el) { if remove_comments_and_empty_lines(el) {
continue continue

View file

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