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
|
||||
CLEAR B
|
||||
LDA @LAB
|
||||
LDA LAB
|
||||
LDB LAB
|
||||
LDA #12
|
||||
END mojprg
|
||||
halt J halt
|
||||
LAB WORD 2
|
||||
LAB2 RESW 3
|
||||
LAB3 WORD 3
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
Hmojprg00000000000F
|
||||
T0000000F02200903200601000C3F2FFD000002
|
||||
Hmojprg00000000001D
|
||||
T00000011B4300220096B200601000C3F2FFD000002
|
||||
T00001A03000003
|
||||
E000000
|
||||
|
|
|
|||
0
ass3/zbirnik/parsing/out.obj
Normal file
0
ass3/zbirnik/parsing/out.obj
Normal 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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue