m68k: rationalize frame math

On real hardware and mednafen, there is still a playback "gap". I
don't yet understand why.
This commit is contained in:
Zack Buhman 2023-05-17 12:43:06 +00:00
parent 1bd38b78f5
commit b9e6296058
2 changed files with 29 additions and 29 deletions

View File

@ -6,27 +6,33 @@ extern void * _jojo_start __asm("_binary_jojo_11025_s16be_1ch_pcm_start");
static volatile int32_t frame = 0; static volatile int32_t frame = 0;
constexpr int32_t tactl = 7;
constexpr int32_t frame_size = ((1 << tactl) * 256) / (44100 / 11025);
constexpr int32_t frame_count = 507150 / (frame_size * 2);
constexpr int32_t tima = 0;
extern "C" extern "C"
void auto_vector_1(void) __attribute__ ((interrupt_handler)); void auto_vector_1(void) __attribute__ ((interrupt_handler));
void auto_vector_1(void) void auto_vector_1(void)
{ {
// reset TIMER_A interrupt // reset TIMER_A interrupt
scsp.reg.ctrl.SCIRE = INT__TIMER_A; scsp.reg.ctrl.SCIRE = INT__TIMER_A;
scsp.reg.ctrl.TIMA = TIMA__TACTL(tactl) | TIMA__TIMA(tima);
frame++; if (frame > frame_count) frame = 0;
//if (frame > 3962) frame = 0;
const uint16_t * jojo_start = reinterpret_cast<uint16_t *>(&_jojo_start); const uint16_t * jojo_start = reinterpret_cast<uint16_t *>(&_jojo_start);
const uint32_t frame_addr = reinterpret_cast<uint32_t>(&jojo_start[frame * 8192]); const uint32_t frame_addr = reinterpret_cast<uint32_t>(&jojo_start[frame * frame_size]);
scsp_slot& slot = scsp.reg.slot[frame % 32]; scsp_slot& slotp = scsp.reg.slot[(frame - 1) % 32];
slot.LOOP = 0; slotp.LOOP = 0;
slot.LOOP |= LOOP__KYONEX; slotp.LOOP |= LOOP__KYONEX;
scsp_slot& slot = scsp.reg.slot[(frame) % 32];
slot.LOOP = LOOP__KYONB | LOOP__SA(frame_addr); // kx kb sbctl[1:0] ssctl[1:0] lpctl[1:0] 8b sa[19:16] slot.LOOP = LOOP__KYONB | LOOP__SA(frame_addr); // kx kb sbctl[1:0] ssctl[1:0] lpctl[1:0] 8b sa[19:16]
slot.SA = SA__SA(frame_addr); // start address (bytes) slot.SA = SA__SA(frame_addr); // start address (bytes)
slot.LSA = 0; // loop start address (samples) slot.LSA = 0; // loop start address (samples)
slot.LEA = 8192; // loop end address (samples) slot.LEA = frame_size; // loop end address (samples)
slot.EG = EG__AR(0x1f) | EG__EGHOLD; // d2r d1r ho ar krs dl rr slot.EG = EG__AR(0x1f) | EG__EGHOLD; // d2r d1r ho ar krs dl rr
slot.VOLUME = 0; // stwinh sdir tl slot.VOLUME = 0; // stwinh sdir tl
slot.FM = 0; // mdl mdxsl mdysl slot.FM = 0; // mdl mdxsl mdysl
@ -36,6 +42,8 @@ void auto_vector_1(void)
slot.LOOP |= LOOP__KYONEX; slot.LOOP |= LOOP__KYONEX;
frame++;
return; return;
} }
@ -43,9 +51,13 @@ void main()
{ {
for (long i = 0; i < 807; i++) { asm volatile ("nop"); } // wait for (way) more than 30µs for (long i = 0; i < 807; i++) { asm volatile ("nop"); } // wait for (way) more than 30µs
scsp.reg.ctrl.MIXER = MIXER__MEM4MB | MIXER__MVOL(0xf); for (int i = 0; i < 32; i++) {
scsp_slot& slot = scsp.reg.slot[i];
slot.LOOP = 0;
slot.LOOP |= LOOP__KYONEX;
}
scsp.reg.ctrl.TIMA = TIMA__TACTL(7); scsp.reg.ctrl.MIXER = MIXER__MEM4MB | MIXER__MVOL(0xf);
// timer A is vector 1 (0b001) // timer A is vector 1 (0b001)
scsp.reg.ctrl.SCILV2 = 0; scsp.reg.ctrl.SCILV2 = 0;
@ -56,11 +68,13 @@ void main()
scsp.reg.ctrl.SCIRE = INT__TIMER_A; scsp.reg.ctrl.SCIRE = INT__TIMER_A;
scsp.reg.ctrl.SCIEB = INT__TIMER_A; scsp.reg.ctrl.SCIEB = INT__TIMER_A;
scsp.reg.ctrl.TIMA = TIMA__TACTL(tactl) | TIMA__TIMA(tima);
asm volatile ("move.w #8192,%sr"); asm volatile ("move.w #8192,%sr");
/*
const uint16_t * jojo_start = reinterpret_cast<uint16_t *>(&_jojo_start); const uint16_t * jojo_start = reinterpret_cast<uint16_t *>(&_jojo_start);
const uint32_t frame_addr = reinterpret_cast<uint32_t>(&jojo_start[frame * 128]); const uint32_t frame_addr = reinterpret_cast<uint32_t>(&jojo_start[frame * 128]);
scsp_slot& slot = scsp.reg.slot[0]; scsp_slot& slot = scsp.reg.slot[0];
slot.LOOP = 0; slot.LOOP = 0;
slot.LOOP |= LOOP__KYONEX; slot.LOOP |= LOOP__KYONEX;
@ -77,12 +91,5 @@ void main()
slot.MIXER = MIXER__DISDL(0b101); // disdl dipan efsdl efpan slot.MIXER = MIXER__DISDL(0b101); // disdl dipan efsdl efpan
slot.LOOP |= LOOP__KYONEX; slot.LOOP |= LOOP__KYONEX;
*/
} }
extern "C"
void start(void)
{
main();
while (1);
}

View File

@ -29,10 +29,3 @@ void main()
slot.LOOP |= LOOP__KYONEX; slot.LOOP |= LOOP__KYONEX;
} }
extern "C"
void start(void)
{
main();
while (1);
}