song code housekeeping
This commit is contained in:
@@ -398,8 +398,8 @@ void Tracker::LoadSongs(ROM &rom) {
|
|||||||
unsigned char *d;
|
unsigned char *d;
|
||||||
short *e;
|
short *e;
|
||||||
|
|
||||||
Song *song;
|
Song song;
|
||||||
Song *song2;
|
Song song2;
|
||||||
SongPart *sp;
|
SongPart *sp;
|
||||||
SPCCommand *spc_command;
|
SPCCommand *spc_command;
|
||||||
ZeldaWave *zelda_wave;
|
ZeldaWave *zelda_wave;
|
||||||
@@ -437,10 +437,16 @@ void Tracker::LoadSongs(ROM &rom) {
|
|||||||
spc_command[i].prev = i - 1;
|
spc_command[i].prev = i - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Init blank songs.
|
||||||
|
for (i = 0; i < 128; i++) {
|
||||||
|
Song new_song;
|
||||||
|
songs.emplace_back(new_song);
|
||||||
|
}
|
||||||
|
|
||||||
spc_command[1023].next = -1;
|
spc_command[1023].next = -1;
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
|
// Extract the song banks.
|
||||||
b = GetSPCAddr(rom, 0xd000, i);
|
b = GetSPCAddr(rom, 0xd000, i);
|
||||||
|
|
||||||
for (j = 0;; j++) {
|
for (j = 0;; j++) {
|
||||||
if ((r = ((unsigned short *)b)[j]) >= 0xd000) {
|
if ((r = ((unsigned short *)b)[j]) >= 0xd000) {
|
||||||
r = (r - 0xd000) >> 1;
|
r = (r - 0xd000) >> 1;
|
||||||
@@ -452,40 +458,42 @@ void Tracker::LoadSongs(ROM &rom) {
|
|||||||
for (j = 0; j < r; j++) {
|
for (j = 0; j < r; j++) {
|
||||||
k = ((unsigned short *)b)[j];
|
k = ((unsigned short *)b)[j];
|
||||||
if (!k)
|
if (!k)
|
||||||
songs[l] = 0;
|
songs[l].in_use = false;
|
||||||
else {
|
else {
|
||||||
c = GetSPCAddr(rom, k, i);
|
c = GetSPCAddr(rom, k, i);
|
||||||
|
|
||||||
|
// Init the bank index we are current loading.
|
||||||
if (!spcbank)
|
if (!spcbank)
|
||||||
m = 0;
|
m = 0;
|
||||||
else
|
else
|
||||||
m = l - j;
|
m = l - j;
|
||||||
|
|
||||||
for (; m < l; m++)
|
for (; m < l; m++)
|
||||||
if (songs[m] && songs[m]->addr == k) {
|
if (songs[m].in_use && songs[m].addr == k) {
|
||||||
(songs[l] = songs[m])->inst++;
|
(songs[l] = songs[m]).inst++;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m == l) {
|
if (m == l) {
|
||||||
songs[l] = song = (Song *)malloc(sizeof(Song));
|
// create a new song (Song *)malloc(sizeof(Song));
|
||||||
song->inst = 1;
|
songs[l] = song;
|
||||||
song->addr = k;
|
song.inst = 1;
|
||||||
song->flag = !spcbank;
|
song.addr = k;
|
||||||
|
song.flag = !spcbank;
|
||||||
|
|
||||||
for (m = 0;; m++)
|
for (m = 0;; m++)
|
||||||
if ((n = ((unsigned short *)c)[m]) < 256) break;
|
if ((n = ((unsigned short *)c)[m]) < 256) break;
|
||||||
|
|
||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
song->flag |= 2;
|
song.flag |= 2;
|
||||||
song->lopst = (((unsigned short *)c)[m + 1] - k) >> 1;
|
song.lopst = (((unsigned short *)c)[m + 1] - k) >> 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
song->numparts = m;
|
song.numparts = m;
|
||||||
song->tbl = (SongPart **)malloc(4 * m);
|
song.tbl = (SongPart **)malloc(4 * m);
|
||||||
|
|
||||||
for (m = 0; m < song->numparts; m++) {
|
for (m = 0; m < song.numparts; m++) {
|
||||||
k = ((unsigned short *)c)[m];
|
k = ((unsigned short *)c)[m];
|
||||||
d = GetSPCAddr(rom, k, i);
|
d = GetSPCAddr(rom, k, i);
|
||||||
if (!spcbank)
|
if (!spcbank)
|
||||||
@@ -495,21 +503,21 @@ void Tracker::LoadSongs(ROM &rom) {
|
|||||||
|
|
||||||
for (; n < l; n++) {
|
for (; n < l; n++) {
|
||||||
song2 = songs[n];
|
song2 = songs[n];
|
||||||
if (song2)
|
if (song2.in_use)
|
||||||
for (o = 0; o < song2->numparts; o++)
|
for (o = 0; o < song2.numparts; o++)
|
||||||
if (song2->tbl[o]->addr == k) {
|
if (song2.tbl[o]->addr == k) {
|
||||||
(song->tbl[m] = song2->tbl[o])->inst++;
|
(song.tbl[m] = song2.tbl[o])->inst++;
|
||||||
goto foundpart;
|
goto foundpart;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (o = 0; o < m; o++)
|
for (o = 0; o < m; o++)
|
||||||
if (song->tbl[o]->addr == k) {
|
if (song.tbl[o]->addr == k) {
|
||||||
(song->tbl[m] = song->tbl[o])->inst++;
|
(song.tbl[m] = song.tbl[o])->inst++;
|
||||||
goto foundpart;
|
goto foundpart;
|
||||||
}
|
}
|
||||||
|
|
||||||
sp = song->tbl[m] = (SongPart *)malloc(sizeof(SongPart));
|
sp = song.tbl[m] = (SongPart *)malloc(sizeof(SongPart));
|
||||||
sp->flag = !spcbank;
|
sp->flag = !spcbank;
|
||||||
sp->inst = 1;
|
sp->inst = 1;
|
||||||
sp->addr = k;
|
sp->addr = k;
|
||||||
@@ -833,7 +841,7 @@ void Tracker::SaveSongs(ROM &rom) {
|
|||||||
unsigned char *rom_data;
|
unsigned char *rom_data;
|
||||||
unsigned char *b;
|
unsigned char *b;
|
||||||
|
|
||||||
Song *s;
|
Song song;
|
||||||
|
|
||||||
SPCCommand *spc_command;
|
SPCCommand *spc_command;
|
||||||
|
|
||||||
@@ -875,14 +883,14 @@ void Tracker::SaveSongs(ROM &rom) {
|
|||||||
k = numsong[i];
|
k = numsong[i];
|
||||||
|
|
||||||
for (j = 0; j < k; j++) {
|
for (j = 0; j < k; j++) {
|
||||||
s = songs[l++];
|
song = songs[l++];
|
||||||
|
|
||||||
if (!s) continue;
|
if (!song.in_use) continue;
|
||||||
|
|
||||||
s->flag &= -5;
|
song.flag &= -5;
|
||||||
|
|
||||||
for (m = 0; m < s->numparts; m++) {
|
for (m = 0; m < song.numparts; m++) {
|
||||||
sp = s->tbl[m];
|
sp = song.tbl[m];
|
||||||
sp->flag &= -3;
|
sp->flag &= -3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -903,21 +911,21 @@ void Tracker::SaveSongs(ROM &rom) {
|
|||||||
stbl = AllocSPCBlock(k << 1, i + 1);
|
stbl = AllocSPCBlock(k << 1, i + 1);
|
||||||
|
|
||||||
for (j = 0; j < k; j++) {
|
for (j = 0; j < k; j++) {
|
||||||
s = songs[l++];
|
song = songs[l++];
|
||||||
|
|
||||||
if (!s) {
|
if (!song.in_use) {
|
||||||
((short *)(stbl->buf))[j] = 0;
|
((short *)(stbl->buf))[j] = 0;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->flag & 4) goto alreadysaved;
|
if (song.flag & 4) goto alreadysaved;
|
||||||
|
|
||||||
sptbl = AllocSPCBlock(((s->numparts + 1) << 1) + (s->flag & 2),
|
sptbl = AllocSPCBlock(((song.numparts + 1) << 1) + (song.flag & 2),
|
||||||
(s->flag & 1) ? 0 : (i + 1));
|
(song.flag & 1) ? 0 : (i + 1));
|
||||||
|
|
||||||
for (m = 0; m < s->numparts; m++) {
|
for (m = 0; m < song.numparts; m++) {
|
||||||
sp = s->tbl[m];
|
sp = song.tbl[m];
|
||||||
|
|
||||||
if (sp->flag & 2) goto spsaved;
|
if (sp->flag & 2) goto spsaved;
|
||||||
|
|
||||||
@@ -947,18 +955,18 @@ void Tracker::SaveSongs(ROM &rom) {
|
|||||||
AddSPCReloc(sptbl, m << 1);
|
AddSPCReloc(sptbl, m << 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->flag & 2) {
|
if (song.flag & 2) {
|
||||||
((short *)(sptbl->buf))[m++] = 255;
|
((short *)(sptbl->buf))[m++] = 255;
|
||||||
((short *)(sptbl->buf))[m] = sptbl->start + (s->lopst << 1);
|
((short *)(sptbl->buf))[m] = sptbl->start + (song.lopst << 1);
|
||||||
|
|
||||||
AddSPCReloc(sptbl, m << 1);
|
AddSPCReloc(sptbl, m << 1);
|
||||||
} else
|
} else
|
||||||
((short *)(sptbl->buf))[m++] = 0;
|
((short *)(sptbl->buf))[m++] = 0;
|
||||||
|
|
||||||
s->addr = sptbl->start;
|
song.addr = sptbl->start;
|
||||||
s->flag |= 4;
|
song.flag |= 4;
|
||||||
alreadysaved:
|
alreadysaved:
|
||||||
((short *)(stbl->buf))[j] = s->addr;
|
((short *)(stbl->buf))[j] = song.addr;
|
||||||
|
|
||||||
AddSPCReloc(stbl, j << 1);
|
AddSPCReloc(stbl, j << 1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ using Song = struct {
|
|||||||
short numparts;
|
short numparts;
|
||||||
short lopst;
|
short lopst;
|
||||||
unsigned short addr;
|
unsigned short addr;
|
||||||
|
bool in_use = true;
|
||||||
};
|
};
|
||||||
// =============================================================================
|
// =============================================================================
|
||||||
|
|
||||||
@@ -239,7 +240,8 @@ class Tracker {
|
|||||||
|
|
||||||
size_t t_number;
|
size_t t_number;
|
||||||
|
|
||||||
Song *songs[128];
|
// Song *songs[128];
|
||||||
|
std::vector<Song> songs;
|
||||||
SongPart *sp_mark;
|
SongPart *sp_mark;
|
||||||
SongRange *song_range_;
|
SongRange *song_range_;
|
||||||
SPCCommand *current_spc_command_;
|
SPCCommand *current_spc_command_;
|
||||||
|
|||||||
Reference in New Issue
Block a user