generation 3.0
This commit is contained in:
parent
d30c4a2e24
commit
59a65cf49e
7 changed files with 143 additions and 37 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
Hmojprg00000000000F
|
Hmojprg00000000001D
|
||||||
T0000000F02200903200601000C3F2FFD000002
|
T00000011B4300220096B200601000C3F2FFD000002
|
||||||
|
T00001A03000003
|
||||||
E000000
|
E000000
|
||||||
|
|
|
||||||
0
ass3/zbirnik/parsing/out.obj
Normal file
0
ass3/zbirnik/parsing/out.obj
Normal 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,18 +784,96 @@ 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 {
|
||||||
switch val := el.(type) {
|
switch val := el.(type) {
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue