@@ -68,12 +68,9 @@ type |
| 68 |
K053260clock: UInt32; |
68 |
K053260clock: UInt32; |
| 69 |
Pokeyclock: UInt32; |
69 |
Pokeyclock: UInt32; |
| 70 |
QSoundclock: UInt32; |
70 |
QSoundclock: UInt32; |
| 71 |
Reserved3: UInt64; // 8 bytes |
71 |
Reserved3: UInt64; |
| 72 |
end; |
72 |
end; |
| 73 |
|
73 |
|
| 74 |
var |
|
|
| 75 |
RecordingVGM: Boolean = False; |
|
|
| 76 |
|
|
|
| 77 |
procedure ExportVGMFile(F: String; TrackName: String; ArtistName: String; Comments: String); |
74 |
procedure ExportVGMFile(F: String; TrackName: String; ArtistName: String; Comments: String); |
| 78 |
|
75 |
|
| 79 |
procedure VGMWriteReg(Reg: Integer; Value: Integer); |
76 |
procedure VGMWriteReg(Reg: Integer; Value: Integer); |
@@ -99,7 +96,8 @@ var |
| 99 |
OrderChecker: TOrderChecker; |
96 |
OrderChecker: TOrderChecker; |
| 100 |
StartOfSong, CurrentOrder: Integer; |
97 |
StartOfSong, CurrentOrder: Integer; |
| 101 |
VGMFile: TFileStream; |
98 |
VGMFile: TFileStream; |
| 102 |
TotalWaitSamps: Integer; |
99 |
TotalWaitSamps, LoopWaitSamps: LongInt; |
|
|
100 |
CyclesSinceLastTick: Integer; |
| 103 |
|
101 |
|
| 104 |
procedure WriteUtf16String(S: String); |
102 |
procedure WriteUtf16String(S: String); |
| 105 |
var |
103 |
var |
@@ -119,6 +117,7 @@ var |
| 119 |
|
117 |
|
| 120 |
YY,MM,DD: Word; |
118 |
YY,MM,DD: Word; |
| 121 |
GD3Temp: Integer; |
119 |
GD3Temp: Integer; |
|
|
120 |
StepCycles: Integer; |
| 122 |
begin |
121 |
begin |
| 123 |
// TODO: Manage these callbacks in a better way, maybe some sort of stack. |
122 |
// TODO: Manage these callbacks in a better way, maybe some sort of stack. |
| 124 |
OldFD := FDCallback; |
123 |
OldFD := FDCallback; |
@@ -143,8 +142,10 @@ begin |
| 143 |
Header := Default(TVGMHeader); // Zero the header |
142 |
Header := Default(TVGMHeader); // Zero the header |
| 144 |
VGMFile.WriteBuffer(Header, SizeOf(Header)); // Write dummy header (will overwrite later) |
143 |
VGMFile.WriteBuffer(Header, SizeOf(Header)); // Write dummy header (will overwrite later) |
| 145 |
|
144 |
|
|
|
145 |
CyclesSinceLastTick := 0; |
| 146 |
repeat |
146 |
repeat |
| 147 |
z80_decode |
147 |
StepCycles := z80_decode; |
|
|
148 |
Inc(CyclesSinceLastTick, StepCycles); |
| 148 |
until StartOfSong <> -1; |
149 |
until StartOfSong <> -1; |
| 149 |
|
150 |
|
| 150 |
VGMFile.WriteByte($66); // End of data |
151 |
VGMFile.WriteByte($66); // End of data |
@@ -154,8 +155,8 @@ begin |
| 154 |
// Update the header to point to the GD3 tag, then write it |
155 |
// Update the header to point to the GD3 tag, then write it |
| 155 |
Header.GD3offset := VGMFile.Position - $14; |
156 |
Header.GD3offset := VGMFile.Position - $14; |
| 156 |
|
157 |
|
| 157 |
VGMFile.WriteDWord($20336447); |
158 |
VGMFile.WriteDWord($20336447); // 'Gd3 ' |
| 158 |
VGMFile.WriteDWord($00000100); |
159 |
VGMFile.WriteDWord($00000100); // Version |
| 159 |
|
160 |
|
| 160 |
GD3Temp := VGMFile.Position; |
161 |
GD3Temp := VGMFile.Position; |
| 161 |
VGMFile.WriteDWord(0); // dummy value... |
162 |
VGMFile.WriteDWord(0); // dummy value... |
@@ -209,9 +210,9 @@ end; |
| 209 |
|
210 |
|
| 210 |
procedure VGMWait(Amount: Integer); |
211 |
procedure VGMWait(Amount: Integer); |
| 211 |
begin |
212 |
begin |
| 212 |
VGMFile.WriteByte($62); // TODO: Use the smaller commands if it matches |
213 |
VGMFile.WriteByte($61); // TODO: Use the smaller commands if it matches |
| 213 |
//VGMFile.WriteWord(Word(Amount)); |
214 |
VGMFile.WriteWord(Word(Amount)); |
| 214 |
Inc(TotalWaitSamps, 735); |
215 |
Inc(TotalWaitSamps, Amount); |
| 215 |
end; |
216 |
end; |
| 216 |
|
217 |
|
| 217 |
{ TOrderChecker } |
218 |
{ TOrderChecker } |
@@ -231,7 +232,8 @@ end; |
| 231 |
|
232 |
|
| 232 |
procedure TOrderChecker.TickCallback; |
233 |
procedure TOrderChecker.TickCallback; |
| 233 |
begin |
234 |
begin |
| 234 |
VGMWait(0); |
235 |
VGMWait(Trunc((CyclesSinceLastTick / (4194304))*44100.0)); |
|
|
236 |
CyclesSinceLastTick := 0; |
| 235 |
end; |
237 |
end; |
| 236 |
|
238 |
|
| 237 |
begin |
239 |
begin |