Commit f21610a

Nick committed on
Fix bug where reading unloaded symbols would crash the tracker
commit f21610aba2475c935a02f24a23bbb079a146e15d parent bdd8757
2 changed files +31−24
Modifiedsymparser.pas +30−3
@@ -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
Modifiedtracker.pas +1−21
@@ -758,7 +758,7 @@ begin
758 if Instr.CounterStep = swSeven then 758 if Instr.CounterStep = swSeven then
759 Regs.NR41 := Regs.NR41 or %10000000; 759 Regs.NR41 := Regs.NR41 or %10000000;
760 760
761 Addr := SymbolTable.KeyData[SYM_HALT_INSTR]; 761 Addr := SymbolAddress(SYM_HALT_INSTR);
762 Spokeb(Addr, Regs.NR42); 762 Spokeb(Addr, Regs.NR42);
763 Spokeb(Addr+1, Regs.NR41); 763 Spokeb(Addr+1, Regs.NR41);
764 764
@@ -974,8 +974,6 @@ procedure TfrmTracker.HaltPlayback;
974 begin 974 begin
975 Playing := False; 975 Playing := False;
976 976
977 SymbolTable := nil;
978
979 TrackerGrid.HighlightedRow := -1; 977 TrackerGrid.HighlightedRow := -1;
980 ToolButton2.ImageIndex := 74; 978 ToolButton2.ImageIndex := 74;
981 979
@@ -1987,26 +1985,8 @@ begin
1987 end; 1985 end;
1988 1986
1989 procedure TfrmTracker.DebugShiteButtonClick(Sender: TObject); 1987 procedure TfrmTracker.DebugShiteButtonClick(Sender: TObject);
1990 var
1991 I: Integer;
1992 AsmInstrument: TAsmInstrument;
1993 Addr: Integer;
1994 begin 1988 begin
1995 LockPlayback;
1996
1997 AsmInstrument := InstrumentToBytes(Song.Instruments.Noise[1]);
1998 Addr := SymbolTable.KeyData['instr'];
1999 Spokeb(Addr, AsmInstrument[1]);
2000 Spokeb(Addr+1, AsmInstrument[0]);
2001 1989
2002 for I := 0 to 5 do begin
2003 Spokeb(Addr+2+I, Byte(Song.Instruments.Noise[1].NoiseMacro[I]));
2004 end;
2005
2006 PokeSymbol('macro_index', 1);
2007 PokeSymbol('note', C_7);
2008
2009 UnlockPlayback;
2010 end; 1990 end;
2011 1991
2012 procedure TfrmTracker.MenuItem11Click(Sender: TObject); 1992 procedure TfrmTracker.MenuItem11Click(Sender: TObject);