mirror of
https://github.com/jeremysrand/mocklib.git
synced 2024-09-29 08:57:11 +00:00
Hide table access routines and use a higher level function for playing sounds on the Mockingboard.
This commit is contained in:
parent
ee5b55de46
commit
2a16923dbf
@ -88,13 +88,13 @@ int main(void)
|
||||
printf("HELLO, WORLD!\n");
|
||||
|
||||
while (!kbhit()) {
|
||||
mockingBoardTableAccess(SOUND_CHIP_1, &soundData1);
|
||||
mockingBoardPlaySound(SPEAKER_LEFT, &soundData1);
|
||||
delay();
|
||||
mockingBoardReset(SOUND_CHIP_1);
|
||||
mockingBoardStopSound(SPEAKER_LEFT);
|
||||
|
||||
mockingBoardTableAccess(SOUND_CHIP_2, &soundData2);
|
||||
mockingBoardPlaySound(SPEAKER_RIGHT, &soundData2);
|
||||
delay();
|
||||
mockingBoardReset(SOUND_CHIP_2);
|
||||
mockingBoardStopSound(SPEAKER_RIGHT);
|
||||
}
|
||||
|
||||
cgetc();
|
||||
|
@ -22,6 +22,19 @@
|
||||
#define RESET_COMMAND 0x0
|
||||
#define THROUGH_PORT_B 0x4
|
||||
|
||||
#define MOCKINGBOARD_LATCH(soundChip) writeCommand((soundChip), LATCH_COMMAND)
|
||||
#define MOCKINGBOARD_WRITE(soundChip) writeCommand((soundChip), WRITE_COMMAND)
|
||||
#define MOCKINGBOARD_RESET(soundChip) writeCommand((soundChip), RESET_COMMAND)
|
||||
|
||||
|
||||
// Typedefs
|
||||
|
||||
typedef enum {
|
||||
SOUND_CHIP_1 = 0,
|
||||
SOUND_CHIP_2 = 1,
|
||||
NUM_SOUND_CHIPS = 2
|
||||
} tMockingBoardSoundChip;
|
||||
|
||||
|
||||
// Globals
|
||||
|
||||
@ -35,6 +48,8 @@ static uint8_t gMockingBoardInitialized = false;
|
||||
static uint8_t gMockingBoardSpeechInitialized = false;
|
||||
|
||||
|
||||
// Implementation
|
||||
|
||||
static uint8_t *mapIOPointer(tSlot slot, uint8_t *ptr)
|
||||
{
|
||||
uint16_t temp1 = (uint16_t)ptr;
|
||||
@ -51,7 +66,7 @@ static uint8_t *mapIOPointer(tSlot slot, uint8_t *ptr)
|
||||
|
||||
void mockingBoardInit(tSlot slot, bool hasSpeechChip)
|
||||
{
|
||||
tSoundChip soundChip;
|
||||
tMockingBoardSoundChip soundChip;
|
||||
|
||||
if (sizeof(tMockingSoundRegisters) != 16) {
|
||||
printf("The sound registers must be 16 bytes long!\n");
|
||||
@ -93,7 +108,7 @@ void mockingBoardShutdown(void)
|
||||
}
|
||||
|
||||
|
||||
static void writeCommand(tSoundChip soundChip, uint8_t command)
|
||||
static void writeCommand(tMockingBoardSoundChip soundChip, uint8_t command)
|
||||
{
|
||||
volatile uint8_t *ptr = gMockPortB[soundChip];
|
||||
|
||||
@ -102,25 +117,7 @@ static void writeCommand(tSoundChip soundChip, uint8_t command)
|
||||
}
|
||||
|
||||
|
||||
void mockingBoardLatch(tSoundChip soundChip)
|
||||
{
|
||||
writeCommand(soundChip, LATCH_COMMAND);
|
||||
}
|
||||
|
||||
|
||||
void mockingBoardWrite(tSoundChip soundChip)
|
||||
{
|
||||
writeCommand(soundChip, WRITE_COMMAND);
|
||||
}
|
||||
|
||||
|
||||
void mockingBoardReset(tSoundChip soundChip)
|
||||
{
|
||||
writeCommand(soundChip, RESET_COMMAND);
|
||||
}
|
||||
|
||||
|
||||
void mockingBoardTableAccess(tSoundChip soundChip, tMockingSoundRegisters *registers)
|
||||
static void mockingBoardTableAccess(tMockingBoardSoundChip soundChip, tMockingSoundRegisters *registers)
|
||||
{
|
||||
uint8_t *data = (uint8_t *)registers;
|
||||
volatile uint8_t *ptr = gMockPortA[soundChip];
|
||||
@ -129,17 +126,41 @@ void mockingBoardTableAccess(tSoundChip soundChip, tMockingSoundRegisters *regis
|
||||
if (!gMockingBoardInitialized)
|
||||
return;
|
||||
|
||||
mockingBoardReset(soundChip);
|
||||
MOCKINGBOARD_RESET(soundChip);
|
||||
for (index = 0; index < 16; index++) {
|
||||
*ptr = index;
|
||||
mockingBoardLatch(soundChip);
|
||||
MOCKINGBOARD_LATCH(soundChip);
|
||||
*ptr = *data;
|
||||
mockingBoardWrite(soundChip);
|
||||
MOCKINGBOARD_WRITE(soundChip);
|
||||
data++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void mockingBoardPlaySound(tMockingBoardSpeaker speaker, tMockingSoundRegisters *registers)
|
||||
{
|
||||
if ((speaker & SPEAKER_LEFT) != 0) {
|
||||
mockingBoardTableAccess(SOUND_CHIP_1, registers);
|
||||
}
|
||||
|
||||
if ((speaker & SPEAKER_RIGHT) != 0) {
|
||||
mockingBoardTableAccess(SOUND_CHIP_2, registers);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void mockingBoardStopSound(tMockingBoardSpeaker speaker)
|
||||
{
|
||||
if ((speaker & SPEAKER_LEFT) != 0) {
|
||||
MOCKINGBOARD_RESET(SOUND_CHIP_1);
|
||||
}
|
||||
|
||||
if ((speaker & SPEAKER_RIGHT) != 0) {
|
||||
MOCKINGBOARD_RESET(SOUND_CHIP_2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool mockingBoardSpeechIsBusy(void)
|
||||
{
|
||||
return (mockingBoardSpeechBusy != 0);
|
||||
|
@ -91,11 +91,13 @@
|
||||
|
||||
typedef uint8_t tSlot;
|
||||
|
||||
|
||||
typedef enum {
|
||||
SOUND_CHIP_1 = 0,
|
||||
SOUND_CHIP_2 = 1,
|
||||
NUM_SOUND_CHIPS = 2
|
||||
} tSoundChip;
|
||||
SPEAKER_NONE = 0,
|
||||
SPEAKER_LEFT = (1 << 0),
|
||||
SPEAKER_RIGHT = (1 << 1),
|
||||
SPEAKER_BOTH = (1 << 0) | (1 << 1)
|
||||
} tMockingBoardSpeaker;
|
||||
|
||||
|
||||
typedef struct tMockingSoundRegisters {
|
||||
@ -115,11 +117,8 @@ typedef struct tMockingSoundRegisters {
|
||||
extern void mockingBoardInit(tSlot slot, bool hasSpeechChip);
|
||||
extern void mockingBoardShutdown(void);
|
||||
|
||||
extern void mockingBoardLatch(tSoundChip soundChip);
|
||||
extern void mockingBoardWrite(tSoundChip soundChip);
|
||||
extern void mockingBoardReset(tSoundChip soundChip);
|
||||
|
||||
extern void mockingBoardTableAccess(tSoundChip soundChip, tMockingSoundRegisters *registers);
|
||||
extern void mockingBoardPlaySound(tMockingBoardSpeaker speaker, tMockingSoundRegisters *registers);
|
||||
extern void mockingBoardStopSound(tMockingBoardSpeaker speaker);
|
||||
|
||||
extern bool mockingBoardSpeechIsBusy(void);
|
||||
extern bool mockingBoardSpeechIsPlaying(void);
|
||||
|
Loading…
Reference in New Issue
Block a user