From 49203a0b0bfd751d5b53df81489d7c2d715993e6 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Thu, 15 May 2025 16:16:38 -0500 Subject: [PATCH] example/aica/aica_xm: xm offsets --- base.mk | 6 +++ example/aica/aica_xm.cpp | 10 +++- example/arm/Makefile | 4 +- example/arm/xm.cpp | 101 ++++++++++++++++++++++++++++++++++----- xm/debug.c | 8 +++- xm/milkypack01.xm.h | 15 ++++++ 6 files changed, 128 insertions(+), 16 deletions(-) create mode 100644 xm/milkypack01.xm.h diff --git a/base.mk b/base.mk index 2091b89..4921b48 100644 --- a/base.mk +++ b/base.mk @@ -123,6 +123,12 @@ endef %.glm.o: %.glm $(BUILD_BINARY_O) +%.xm.h: %.xm + $(BUILD_BINARY_H) + +%.xm.o: %.xm + $(BUILD_BINARY_O) + %.o: %.s $(AS) $(AARCH) $(AFLAGS) $(DEBUG) $< -o $@ diff --git a/example/aica/aica_xm.cpp b/example/aica/aica_xm.cpp index ca20d79..4d1962f 100644 --- a/example/aica/aica_xm.cpp +++ b/example/aica/aica_xm.cpp @@ -38,5 +38,13 @@ void main() serial::string("mrwinh: "); wait(); serial::integer(aica_sound.common.MRWINH()); - while (1); + int last_dram = -1; + while (1) { + wait(); + int read = aica_wave_memory[0]; + if (read != last_dram) { + serial::integer(read); + } + last_dram = read; + }; } diff --git a/example/arm/Makefile b/example/arm/Makefile index a5af401..65ff063 100644 --- a/example/arm/Makefile +++ b/example/arm/Makefile @@ -2,7 +2,7 @@ MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) DIR := $(dir $(MAKEFILE_PATH)) LIB ?= . -OPT ?= -O3 +OPT ?= -O1 GENERATED ?= AARCH = -march=armv4 -mlittle-endian @@ -26,7 +26,7 @@ sh4_interrupt.elf: LDSCRIPT = main.lds sh4_interrupt.elf: start.o sh4_interrupt.o xm.elf: LDSCRIPT = main.lds -xm.elf: start.o xm.o audio.pcm.o +xm.elf: start.o xm.o ../../xm/milkypack01.xm.o clean: find -P \ diff --git a/example/arm/xm.cpp b/example/arm/xm.cpp index 6d7bc69..92d9e21 100644 --- a/example/arm/xm.cpp +++ b/example/arm/xm.cpp @@ -1,14 +1,97 @@ #include "aica/aica.hpp" -extern void * _sine_start __asm("_binary_audio_pcm_start"); +#include "xm/xm.h" +#include "xm/milkypack01.xm.h" extern volatile uint32_t dram[0x200000] __asm("dram"); +constexpr int max_patterns = 64; +constexpr int max_instruments = 128; +struct xm_state { + xm_header_t * header; + xm_pattern_header_t * pattern_header[max_patterns]; + xm_instrument_header_t * instrument_header[max_instruments]; + xm_sample_header_t * sample_header; // array +}; + +static xm_state xm = {0}; + +int s16(void * buf) +{ + uint8_t * b = (uint8_t *)buf; + int16_t v = (b[0] << 0) | (b[1] << 8); + return v; +} + +int s32(void * buf) +{ + uint8_t * b = (uint8_t *)buf; + int32_t v = (b[0] << 0) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24); + return v; +} + +int xm_samples_init(int buf, int offset, int number_of_samples) +{ + xm_sample_header_t * sample_header[number_of_samples]; + for (int i = 0; i < number_of_samples; i++) { + sample_header[i] = (xm_sample_header_t *)(buf + offset); + offset += (sizeof (xm_sample_header_t)); + } + + for (int i = 0; i < number_of_samples; i++) { + offset += s32(&sample_header[i]->sample_length); + } + return offset; +} + +void print(int i) +{ + for (int i = 0; i < 100000; i++) { + asm volatile ("nop"); + } + dram[0] = i; +} + +void xm_init() +{ + int buf = (int)(&_binary_xm_milkypack01_xm_start); + + while (xm.header != (xm_header_t *)(buf)) + xm.header = (xm_header_t *)(buf); + + int offset = s32(&xm.header->header_size) + (offsetof (struct xm_header, header_size)); + + int number_of_patterns = s16(&xm.header->number_of_patterns); + print(0x12345678); + print(number_of_patterns); + + for (int i = 0; i < number_of_patterns; i++) { + xm_pattern_header_t * pattern_header = (xm_pattern_header_t *)(buf + offset); + + xm.pattern_header[i] = pattern_header; + + offset += s32(&pattern_header->pattern_header_length) + s16(&pattern_header->packed_pattern_data_size); + print(offset); + } + + int number_of_instruments = s16(&xm.header->number_of_instruments); + for (int i = 0; i < number_of_instruments; i++) { + xm_instrument_header_t * instrument_header = (xm_instrument_header_t *)(buf + offset); + + xm.instrument_header[i] = instrument_header; + offset += s32(&instrument_header->instrument_size); + + int number_of_samples = s16(&instrument_header->number_of_samples); + offset = xm_samples_init(buf, offset, number_of_samples); + } + + print(0x11223344); + print(offset); +} + extern "C" void main() { - const uint32_t sine_addr = reinterpret_cast(&_sine_start); - volatile uint32_t * slot = reinterpret_cast(0x00800000); for (uint32_t i = 0; i < (sizeof (struct aica_channel)) * 64 / 4; i++) { slot[i] = 0; @@ -47,16 +130,15 @@ void main() uint32_t segment = 0; - dram[0] = 0x11223344; - dram[1] = sine_addr; constexpr uint32_t timer_a_interrupt = (1 << 6); aica_sound.common.scire = timer_a_interrupt; - uint32_t next_sa = sine_addr; bool started = 0; + xm_init(); + while (1) { if (!started || (aica_sound.common.SCIPD() & timer_a_interrupt)) { - aica_sound.channel[0].SA(next_sa); + //aica_sound.channel[0].SA(next_sa); aica_sound.common.tactl_tima = aica::tactl_tima::TACTL(0) // increment once every 128 samples | aica::tactl_tima::TIMA(256 - 128) // interrupt after 128 counts @@ -65,11 +147,6 @@ void main() if (!started) { aica_sound.channel[0].KYONEX(1); started = 1; } aica_sound.common.scire = timer_a_interrupt; - dram[1] = next_sa; - - segment += 1; - if (segment >= 3440) segment = 0; - next_sa = sine_addr + (128 * 2) * segment; } } } diff --git a/xm/debug.c b/xm/debug.c index 8ee7389..9bda6ce 100644 --- a/xm/debug.c +++ b/xm/debug.c @@ -161,6 +161,8 @@ int debug_pattern_headers(void * buf) { xm_header_t * header = (xm_header_t *)buf; int pattern_header_offset = s32(&header->header_size) + (offsetof (struct xm_header, header_size)); + printf("pattern number of patterns: %08x\n", s16(&header->number_of_patterns)); + printf("pattern header offset: %08x\n", pattern_header_offset); for (int i = 0; i < s16(&header->number_of_patterns); i++) { xm_pattern_header_t * pattern_header = (xm_pattern_header_t *)(((ptrdiff_t)buf) + pattern_header_offset); @@ -172,6 +174,7 @@ int debug_pattern_headers(void * buf) printf(" packed_pattern_data_size: %d\n", s16(&pattern_header->packed_pattern_data_size)); //debug_pattern(pattern_header); pattern_header_offset += s32(&pattern_header->pattern_header_length) + s16(&pattern_header->packed_pattern_data_size); + printf("pattern header offset: %08x\n", pattern_header_offset); } return pattern_header_offset; } @@ -303,6 +306,8 @@ int debug_instruments(void * buf, int offset) offset = debug_samples(buf, offset, i, s16(&instrument_header->number_of_samples)); } } + + return offset; } int main(int argc, const char *argv[]) @@ -318,5 +323,6 @@ int main(int argc, const char *argv[]) debug_header(buf); int end_of_patterns = debug_pattern_headers(buf); - debug_instruments(buf, end_of_patterns); + int end_of_instruments = debug_instruments(buf, end_of_patterns); + printf("end_of_instruments: %08x\n", end_of_instruments); } diff --git a/xm/milkypack01.xm.h b/xm/milkypack01.xm.h new file mode 100644 index 0000000..98ca287 --- /dev/null +++ b/xm/milkypack01.xm.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_xm_milkypack01_xm_start __asm("_binary_xm_milkypack01_xm_start"); +extern uint32_t _binary_xm_milkypack01_xm_end __asm("_binary_xm_milkypack01_xm_end"); +extern uint32_t _binary_xm_milkypack01_xm_size __asm("_binary_xm_milkypack01_xm_size"); + +#ifdef __cplusplus +} +#endif