-
Notifications
You must be signed in to change notification settings - Fork 0
/
code.c
129 lines (97 loc) · 2.19 KB
/
code.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* Object code handler */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "jos.h"
#include "as6502.h"
#include "obj65.h"
#include "utils.h"
struct reloc {
unsigned at_lc;
struct reloc *next;
};
PRIVATE byte *code = NULL;
PRIVATE word codeseglen = 0;
PRIVATE word highwater = 1;
PRIVATE struct reloc *reloc_root = NULL;
PUBLIC word lc = 0;
extern int lineno;
extern char listline[];
extern FILE *listfile;
extern int pass;
PRIVATE void newpage() {
int i;
unsigned newlen = codeseglen + 256;
if (code)
code = realloc(code, newlen);
else
code = malloc(newlen);
if (!code)
fatal("Not enough memory (code table)");
for (i = 0; i < 256; i++)
*(code + codeseglen + i) = (byte)0;
codeseglen = newlen;
}
PUBLIC void emit(unsigned char b) {
int i;
char s[4];
while (lc >= codeseglen)
newpage();
*(code + lc) = b;
lc++;
if (lc >= highwater)
highwater = lc + 1;
if (!listfile)
return;
sprintf(s, "%02X", (int)b);
for (i = 7; i < 18; i += 3)
if (listline[i] == ' ') {
listline[i] = s[0];
listline[i + 1] = s[1];
return;
}
fputs(listline, listfile);
sprintf(listline, "%04X %02X %4d\n", lc - 1, (int)b, lineno);
}
PUBLIC void emit2(word w) {
emit(w % 256);
emit(w / 256);
}
PUBLIC void emit4(doubleword d) {
emit2(d % 65536);
emit2(d / 65536);
}
PUBLIC byte getcode(word at_lc) {
while (lc >= codeseglen)
newpage();
return *(code + at_lc);
}
PUBLIC void writecode(int objfile) {
struct reloc *work = reloc_root;
struct obj65rec orec;
orec.type = RELOCREC;
while (work) {
orec.rec.at_lc = work->at_lc;
write(objfile, &orec, sizeof(orec.rec.at_lc) + sizeof(orec.type));
work = work->next;
}
orec.type = CODEREC;
orec.rec.len = highwater - 1;
write(objfile, &orec, sizeof(orec.rec.len) + sizeof(orec.type));
write(objfile, code, highwater - 1);
}
PUBLIC void set_lc(word newlc) {
lc = newlc;
if (lc >= highwater)
highwater = lc + 1;
}
PUBLIC void reloc_req(word at_lc) {
struct reloc *work;
if (pass == 1)
return;
work = GETCORE(struct reloc);
work->at_lc = at_lc;
work->next = reloc_root;
listline[5] = '*';
reloc_root = work;
}