@@ -10,9 +10,7 @@ uses |
| 10 |
type |
10 |
type |
| 11 |
TSymbolMap = specialize TFPGMap<String, Integer>; |
11 |
TSymbolMap = specialize TFPGMap<String, Integer>; |
| 12 |
|
12 |
|
| 13 |
var |
13 |
function SymbolAddress(Symbol: String): Integer; |
| 14 |
SymbolTable: TSymbolMap; |
|
|
| 15 |
|
|
|
| 16 |
function WordPeekSymbol(Symbol: String): Integer; |
14 |
function WordPeekSymbol(Symbol: String): Integer; |
| 17 |
procedure WordPokeSymbol(Symbol: String; Value: Word); |
15 |
procedure WordPokeSymbol(Symbol: String; Value: Word); |
| 18 |
function PeekSymbol(Symbol: String): Integer; |
16 |
function PeekSymbol(Symbol: String): Integer; |
@@ -24,6 +22,9 @@ implementation |
| 24 |
|
22 |
|
| 25 |
uses machine; |
23 |
uses machine; |
| 26 |
|
24 |
|
|
|
25 |
var |
|
|
26 |
SymbolTable: TSymbolMap; |
|
|
27 |
|
| 27 |
procedure ParseSymFile(F: String); |
28 |
procedure ParseSymFile(F: String); |
| 28 |
var |
29 |
var |
| 29 |
SL: TStringList; |
30 |
SL: TStringList; |
@@ -51,27 +52,53 @@ begin |
| 51 |
end; |
52 |
end; |
| 52 |
end; |
53 |
end; |
| 53 |
|
54 |
|
|
|
55 |
function SymbolAddress(Symbol: String): Integer; |
|
|
56 |
begin |
|
|
57 |
if not SymbolTable.TryGetData(Symbol, Result) then begin |
|
|
58 |
Writeln('[WARNING] Attempting to read address of unloaded symbol: ', symbol); |
|
|
59 |
Result := 0; |
|
|
60 |
end; |
|
|
61 |
end; |
|
|
62 |
|
| 54 |
function PeekSymbol(Symbol: String): Integer; |
63 |
function PeekSymbol(Symbol: String): Integer; |
| 55 |
begin |
64 |
begin |
| 56 |
if SymbolTable = nil then exit(0); |
65 |
if SymbolTable = nil then exit(0); |
|
|
66 |
if SymbolTable.IndexOf(Symbol) = -1 then begin |
|
|
67 |
WriteLn('[WARNING] Attempting to peek unloaded symbol: ', symbol); |
|
|
68 |
Exit(0); |
|
|
69 |
end; |
|
|
70 |
|
| 57 |
Result := speekb(SymbolTable.KeyData[Symbol]); |
71 |
Result := speekb(SymbolTable.KeyData[Symbol]); |
| 58 |
end; |
72 |
end; |
| 59 |
|
73 |
|
| 60 |
procedure PokeSymbol(Symbol: String; Value: Byte); |
74 |
procedure PokeSymbol(Symbol: String; Value: Byte); |
| 61 |
begin |
75 |
begin |
| 62 |
if SymbolTable = nil then exit; |
76 |
if SymbolTable = nil then exit; |
|
|
77 |
if SymbolTable.IndexOf(Symbol) = -1 then begin |
|
|
78 |
WriteLn('[WARNING] Attempting to poke unloaded symbol: ', symbol); |
|
|
79 |
Exit; |
|
|
80 |
end; |
| 63 |
spokeb(SymbolTable.KeyData[Symbol], Value); |
81 |
spokeb(SymbolTable.KeyData[Symbol], Value); |
| 64 |
end; |
82 |
end; |
| 65 |
|
83 |
|
| 66 |
function WordPeekSymbol(Symbol: String): Integer; |
84 |
function WordPeekSymbol(Symbol: String): Integer; |
| 67 |
begin |
85 |
begin |
| 68 |
if SymbolTable = nil then exit(0); |
86 |
if SymbolTable = nil then exit(0); |
|
|
87 |
if SymbolTable.IndexOf(Symbol) = -1 then begin |
|
|
88 |
WriteLn('[WARNING] Attempting to wordpeek unloaded symbol: ', symbol); |
|
|
89 |
Exit(0); |
|
|
90 |
end; |
|
|
91 |
|
| 69 |
Result := wordpeek(SymbolTable.KeyData[Symbol]); |
92 |
Result := wordpeek(SymbolTable.KeyData[Symbol]); |
| 70 |
end; |
93 |
end; |
| 71 |
|
94 |
|
| 72 |
procedure WordPokeSymbol(Symbol: String; Value: Word); |
95 |
procedure WordPokeSymbol(Symbol: String; Value: Word); |
| 73 |
begin |
96 |
begin |
| 74 |
if SymbolTable = nil then exit; |
97 |
if SymbolTable = nil then exit; |
|
|
98 |
if SymbolTable.IndexOf(Symbol) = -1 then begin |
|
|
99 |
WriteLn('[WARNING] Attempting to wordpoke unloaded symbol: ', symbol); |
|
|
100 |
Exit; |
|
|
101 |
end; |
| 75 |
wordpoke(SymbolTable.KeyData[Symbol], Value); |
102 |
wordpoke(SymbolTable.KeyData[Symbol], Value); |
| 76 |
end; |
103 |
end; |
| 77 |
|
104 |
|