From 6a170522acd76d3ef81fd27bf1f5913421a7d506 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Thu, 18 Apr 2024 13:26:18 +0200 Subject: [PATCH] sound effects, not yet working --- sound-driver/Makefile | 2 +- sound-driver/ay_3_8913.c | 33 ++------------------------------- sound-driver/effects.c | 18 ++++++++++++++++++ sound-driver/effects.h | 9 +++++++++ sound-driver/main.c | 4 ++-- sound-driver/psg.h | 32 +++++++++++++++++++++++++++++++- sound-driver/spi.S | 1 + 7 files changed, 64 insertions(+), 35 deletions(-) create mode 100644 sound-driver/effects.c create mode 100644 sound-driver/effects.h diff --git a/sound-driver/Makefile b/sound-driver/Makefile index 19994eb..7f62f9e 100644 --- a/sound-driver/Makefile +++ b/sound-driver/Makefile @@ -13,7 +13,7 @@ CFLAGS+= -g3 -ggdb -gdwarf-2 LDFLAGS=-mmcu=$(MCU) -L $(TOOLCHAIN_PREFIX)/include -$(ARTIFACT).elf: main.o scheduler.o spi.o spi_init.o sequencer.o melody_tetris.o melody_tusch1.o ay_3_8913.o mute.o +$(ARTIFACT).elf: main.o scheduler.o spi.o spi_init.o sequencer.o melody_tetris.o melody_tusch1.o ay_3_8913.o mute.o effects.o $(CC) -o $@ $(LDFLAGS) $^ $(OBJDUMP) -D $(ARTIFACT).elf > $(ARTIFACT).txt diff --git a/sound-driver/ay_3_8913.c b/sound-driver/ay_3_8913.c index b00dd6a..70260bb 100644 --- a/sound-driver/ay_3_8913.c +++ b/sound-driver/ay_3_8913.c @@ -27,35 +27,6 @@ const uint16_t frequencyCodes[8][12] = { #define _CS0 BIT2 #define _CS1 BIT0 -#define R0 0 -#define CHANNEL_A_TONE_PERIOD_FINE_REG R0 -#define R1 1 -#define CHANNEL_A_TONE_PERIOD_COARSE_REG R1 -#define R2 2 -#define CHANNEL_B_TONE_PERIOD_FINE_REG R2 -#define R3 3 -#define CHANNEL_B_TONE_PERIOD_COARSE_REG R3 -#define R4 4 -#define CHANNEL_C_TONE_PERIOD_FINE_REG R4 -#define R5 5 -#define CHANNEL_C_TONE_PERIOD_COARSE_REG R5 -#define R6 6 -#define NOISE_PERIOD_REG R6 -#define R7 7 -#define _ENABLE_REG R7 -#define R10 010 -#define CHANNEL_A_AMPLITUDE_REG R10 -#define R11 011 -#define CHANNEL_B_AMPLITUDE_REG R11 -#define R12 012 -#define CHANNEL_C_AMPLITUDE_REG R12 -#define R13 013 -#define ENVELOPE_PERIOD_FINE_REG R13 -#define R14 014 -#define ENVELOPE_PERIOD_COARSE_REG R13 -#define R15 015 -#define ENVELOPE_SHAPE_REG R15 - uint8_t psgShadowRegisters[2][14]; inline static void BUS_OP_NACT() { @@ -94,11 +65,11 @@ asm volatile ( } #endif -static uint8_t psgReadShadow(uint8_t chip, uint8_t address) { +uint8_t psgReadShadow(uint8_t chip, uint8_t address) { return psgShadowRegisters[chip][address]; } -static void psgWrite(uint8_t chip, uint8_t address, uint8_t data) { +void psgWrite(uint8_t chip, uint8_t address, uint8_t data) { psgShadowRegisters[chip][address] = data; // according to "State Timing" (p. 15) of datasheet diff --git a/sound-driver/effects.c b/sound-driver/effects.c new file mode 100644 index 0000000..243d2b0 --- /dev/null +++ b/sound-driver/effects.c @@ -0,0 +1,18 @@ +#include "effects.h" +#include "psg.h" + + +void effectsInit() { + +} + + +void playEffect1() { + psgWrite(1, NOISE_PERIOD_REG, 0); + psgWrite(1, _ENABLE_REG, psgReadShadow(1, _ENABLE_REG) & ~0b00111000); + psgWrite(1, CHANNEL_A_AMPLITUDE_REG, 020); + psgWrite(1, CHANNEL_B_AMPLITUDE_REG, 020); + psgWrite(1, CHANNEL_C_AMPLITUDE_REG, 020); + psgWrite(1, ENVELOPE_PERIOD_COARSE_REG, 070); + psgWrite(1, ENVELOPE_SHAPE_REG, 0); +} diff --git a/sound-driver/effects.h b/sound-driver/effects.h new file mode 100644 index 0000000..32428be --- /dev/null +++ b/sound-driver/effects.h @@ -0,0 +1,9 @@ +#ifndef _EFFECTS_H_ +#define _EFFECTS_H_ + + +void effectsInit(); + + + +#endif // _EFFECTS_H_ diff --git a/sound-driver/main.c b/sound-driver/main.c index 8e4a119..35fe259 100644 --- a/sound-driver/main.c +++ b/sound-driver/main.c @@ -9,6 +9,7 @@ #include "melody_tetris.h" #include "melody_tusch1.h" #include "mute.h" +#include "effects.h" int main() { WDTCTL = WDTPW | WDTHOLD; @@ -28,11 +29,10 @@ int main() { psgInit(); muteInit(); sequencerInit(); + effectsInit(); __enable_interrupt(); - // playMelodyTetris(); - while (1) { schExec(); } diff --git a/sound-driver/psg.h b/sound-driver/psg.h index 79bcda9..7dd3cfa 100644 --- a/sound-driver/psg.h +++ b/sound-driver/psg.h @@ -36,11 +36,41 @@ typedef enum { #define e_As e_Gis #define e_B e_Ais +#define R0 0 +#define CHANNEL_A_TONE_PERIOD_FINE_REG R0 +#define R1 1 +#define CHANNEL_A_TONE_PERIOD_COARSE_REG R1 +#define R2 2 +#define CHANNEL_B_TONE_PERIOD_FINE_REG R2 +#define R3 3 +#define CHANNEL_B_TONE_PERIOD_COARSE_REG R3 +#define R4 4 +#define CHANNEL_C_TONE_PERIOD_FINE_REG R4 +#define R5 5 +#define CHANNEL_C_TONE_PERIOD_COARSE_REG R5 +#define R6 6 +#define NOISE_PERIOD_REG R6 +#define R7 7 +#define _ENABLE_REG R7 +#define R10 010 +#define CHANNEL_A_AMPLITUDE_REG R10 +#define R11 011 +#define CHANNEL_B_AMPLITUDE_REG R11 +#define R12 012 +#define CHANNEL_C_AMPLITUDE_REG R12 +#define R13 013 +#define ENVELOPE_PERIOD_FINE_REG R13 +#define R14 014 +#define ENVELOPE_PERIOD_COARSE_REG R13 +#define R15 015 +#define ENVELOPE_SHAPE_REG R15 + void psgInit(); void psgPlayTone(uint8_t chip, uint8_t channel, uint8_t volume, t_octave octave, t_note note); void psgAmplitude(uint8_t chip, uint8_t channel, uint8_t volume); - +uint8_t psgReadShadow(uint8_t chip, uint8_t address); +void psgWrite(uint8_t chip, uint8_t address, uint8_t data); #endif // _PSG_H_ diff --git a/sound-driver/spi.S b/sound-driver/spi.S index c61617f..eb8510f 100644 --- a/sound-driver/spi.S +++ b/sound-driver/spi.S @@ -44,6 +44,7 @@ spiCmdHandler_5: spiCmdHandler_6: bit #SOUND_LOCK, &cmd jz spiCmdHandler_7 + call #playEffect1 ;; insert a call here bic #SOUND_LOCK, &cmd spiCmdHandler_7: