diff --git a/example/aica_gdrom.cpp b/example/aica_gdrom.cpp index dc8232e..d5905eb 100644 --- a/example/aica_gdrom.cpp +++ b/example/aica_gdrom.cpp @@ -19,6 +19,7 @@ extern void * _binary_start __asm("_binary_example_arm_sh4_interrupt_bin_start") extern void * _binary_size __asm("_binary_example_arm_sh4_interrupt_bin_size"); constexpr uint32_t mcipd__sh4_interrupt = (1 << 5); +constexpr uint32_t miceb__sh4_interrupt = (1 << 5); constexpr uint32_t scipd__arm_interrupt = (1 << 5); constexpr uint32_t sectors_per_chunk = 16; @@ -64,7 +65,7 @@ void aica_init(uint32_t& chunk_index, const uint32_t * src_chunk) } } - chunk = reinterpret_cast(&aica_wave_memory[0x001f0000 / 4]); + chunk = reinterpret_cast(&aica_wave_memory[0x00100000 / 4]); serial::integer(reinterpret_cast(&(*chunk)[0][0])); serial::integer(reinterpret_cast(&(*chunk)[1][0])); @@ -83,9 +84,8 @@ void aica_init(uint32_t& chunk_index, const uint32_t * src_chunk) void aica_step(uint32_t& chunk_index, const uint32_t * src_chunk) { - aica_wait_read(); { // wait for interrupt from arm - while ((aica_sound.common.MCIPD() & mcipd__sh4_interrupt) == 0) { aica_wait_read(); }; + while ((system.ISTEXT & (1 << 1)) == 0); aica_wait_write(); aica_sound.common.mcire = mcipd__sh4_interrupt; } @@ -372,6 +372,8 @@ void main() aica_init(chunk_index, &gdrom_buf[0]); + aica_sound.common.MCIEB(miceb__sh4_interrupt); + //serial::string("aica wave memory:\n"); //while (aica_wave_memory[0] == 0xeaffffff) { aica_wait_read(); }; //aica_wait_read(); serial::integer(aica_wave_memory[0]); diff --git a/example/arm/main.lds b/example/arm/main.lds index 3775665..1ba41fe 100644 --- a/example/arm/main.lds +++ b/example/arm/main.lds @@ -1,8 +1,8 @@ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") MEMORY { - ram : ORIGIN = 0x00000000, LENGTH = 0x1f0000 - buffers : ORIGIN = 0x001f0000, LENGTH = 0x10000 + ram : ORIGIN = 0x00000000, LENGTH = 0x100000 + buffers : ORIGIN = 0x00100000, LENGTH = 0x100000 } SECTIONS { diff --git a/example/arm/sh4_interrupt.cpp b/example/arm/sh4_interrupt.cpp index 66c3703..9e0276a 100644 --- a/example/arm/sh4_interrupt.cpp +++ b/example/arm/sh4_interrupt.cpp @@ -45,8 +45,8 @@ void main() aica_sound.channel[0].RR(0x1f); aica_sound.channel[0].AR(0x1f); - aica_sound.channel[0].OCT(0xf); - aica_sound.channel[0].FNS(0x7d); + aica_sound.channel[0].OCT(-1); + aica_sound.channel[0].FNS(0x0); aica_sound.channel[0].DISDL(0xf); aica_sound.channel[0].DIPAN(0x0); @@ -72,6 +72,8 @@ void main() dram[0] = reinterpret_cast(&chunk[0][0]); dram[1] = reinterpret_cast(&chunk[1][0]); + request_chunk(); + aica_sound.channel[0].SA(reinterpret_cast(&chunk[0][0])); aica_sound.channel[0].KYONEX(1); @@ -99,16 +101,18 @@ void main() request_chunk(); uint32_t sample = 0; - const uint32_t target = 16384 + (16384 * 10 / 12); - constexpr uint32_t sample_interval = (1 << 10); + constexpr uint32_t samples_per_sample = 2; + constexpr uint32_t target = chunk_size / 2 * samples_per_sample; + constexpr uint32_t scire__sample_interval = (1 << 10); + constexpr uint32_t scipd__sample_interval = (1 << 10); while (sample < target) { //aica_sound.common.tactl_tima = aica::tactl_tima::TACTL(tactl) // | aica::tactl_tima::TIMA(tima); //while (!(aica_sound.common.SCIPD() & timer_a_interrupt)); //aica_sound.common.scire = timer_a_interrupt; - while (!(aica_sound.common.SCIPD() & sample_interval)); - aica_sound.common.scire = sample_interval; + while (!(aica_sound.common.SCIPD() & scipd__sample_interval)); + aica_sound.common.scire = scire__sample_interval; sample++; }