From 4e3c65288fc8cf9a61d43f6da6d53978e0e9de98 Mon Sep 17 00:00:00 2001 From: Jeremy Rand Date: Mon, 17 Oct 2016 23:57:40 -0400 Subject: [PATCH] More speech assembly cleanup. Create a proper API for speech. --- mocktest.xcodeproj/project.pbxproj | 6 ++++ mocktest/main.c | 19 ++++------- mocktest/speech.h | 22 +++++++++++++ mocktest/speech.s | 53 ++++++++++++++++-------------- mocktest/speech_api.c | 41 +++++++++++++++++++++++ mocktest/speech_api.h | 22 +++++++++++++ 6 files changed, 126 insertions(+), 37 deletions(-) create mode 100644 mocktest/speech.h create mode 100644 mocktest/speech_api.c create mode 100644 mocktest/speech_api.h diff --git a/mocktest.xcodeproj/project.pbxproj b/mocktest.xcodeproj/project.pbxproj index ef7af1e..b69fce8 100644 --- a/mocktest.xcodeproj/project.pbxproj +++ b/mocktest.xcodeproj/project.pbxproj @@ -8,6 +8,9 @@ /* Begin PBXFileReference section */ 9D16BCE21D9E070B005EE214 /* speech.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = speech.s; sourceTree = ""; }; + 9D49929C1DB5C5F700606789 /* speech.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = speech.h; sourceTree = ""; }; + 9D49929D1DB5C65200606789 /* speech_api.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = speech_api.c; sourceTree = ""; }; + 9D49929E1DB5C65200606789 /* speech_api.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = speech_api.h; sourceTree = ""; }; 9DB3C98C1D84A11600395532 /* main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = ""; }; 9DB3C98D1D84A11600395532 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; 9DB3C98F1D84A11600395532 /* AppleCommander.jar */ = {isa = PBXFileReference; lastKnownFileType = archive.jar; name = AppleCommander.jar; path = make/AppleCommander.jar; sourceTree = ""; }; @@ -37,6 +40,9 @@ 9DB3C99C1D84A21E00395532 /* mockingboard.c */, 9DB3C99D1D84A21E00395532 /* mockingboard.h */, 9D16BCE21D9E070B005EE214 /* speech.s */, + 9D49929C1DB5C5F700606789 /* speech.h */, + 9D49929D1DB5C65200606789 /* speech_api.c */, + 9D49929E1DB5C65200606789 /* speech_api.h */, 9DB3C98D1D84A11600395532 /* Makefile */, 9DB3C98E1D84A11600395532 /* make */, ); diff --git a/mocktest/main.c b/mocktest/main.c index 3d138f1..5dfffac 100644 --- a/mocktest/main.c +++ b/mocktest/main.c @@ -14,13 +14,7 @@ #include #include "mockingboard.h" - - -extern void setupSpeech(void); -extern uint8_t *speechData; -extern uint16_t speechLen; -extern bool busy; -extern uint8_t numIRQs; +#include "speech_api.h" tMockingSoundRegisters soundData1 = { @@ -73,7 +67,8 @@ uint8_t mySpeechData[] = { 0x6B, 0xA8, 0x59, 0x32, 0xE8, 0x6A, 0xA8, 0x4D, 0x60, 0xE7, 0x29, 0xA8, 0x41, 0x0A, 0xE8, 0x78, 0xA8, 0x41, 0x30, 0xE8, 0x70, 0xA8, 0x39, 0xFF, - 0xE8, 0x70, 0xA8, 0x39, 0x00, 0xE8, 0xFF, 0xFF + 0xE8, 0x70, 0xA8, 0x39, 0x00, 0xE8, 0xFF, 0xFF, + 0xFF, 0xFF }; @@ -106,13 +101,11 @@ int main(void) return 0; printf("\n"); - speechData = mySpeechData; - speechLen = sizeof(mySpeechData) - 1; - setupSpeech(); - while (!kbhit()) { - //printf("numIRQs = %d\n", numIRQs); + speakMessage(mySpeechData, sizeof(mySpeechData)); + while (speechIsBusy()) { } + printf("\nDone speaking\n"); cgetc(); return 0; diff --git a/mocktest/speech.h b/mocktest/speech.h new file mode 100644 index 0000000..4bc798e --- /dev/null +++ b/mocktest/speech.h @@ -0,0 +1,22 @@ +// +// speech.h +// mocktest +// +// Created by Jeremy Rand on 2016-10-17. +// Copyright © 2016 Jeremy Rand. All rights reserved. +// + +#ifndef speech_h +#define speech_h + + +extern uint8_t *speechData; +extern uint16_t speechLen; +extern uint8_t speechBusy; +extern uint16_t outptr; +extern uint16_t endptr; + +extern void setupSpeech(void); + + +#endif /* speech_h */ diff --git a/mocktest/speech.s b/mocktest/speech.s index 5f0ae85..e0e21b3 100644 --- a/mocktest/speech.s +++ b/mocktest/speech.s @@ -7,7 +7,8 @@ ; - .export _setupSpeech, _numIRQs, _speechData, _speechLen, _busy + .export _setupSpeech, _speechData, _speechLen, _speechBusy + .export _outptr, _endptr ; .interruptor speechIRQ @@ -29,11 +30,11 @@ IER := $C48E .DATA speechIRQ: .byte $60, <_interr, >_interr ; RTS plus two dummy bytes -_numIRQs: .byte $00 _speechData: .byte $00, $00 _speechLen: .byte $00, $00 -endptr: .byte $00, $00 -_busy: .byte $00 +_outptr: .byte $00, $00 +_endptr: .byte $00, $00 +_speechBusy: .byte $00 .CODE @@ -58,29 +59,29 @@ _busy: .byte $00 LDA _speechLen+1 ;GET HIGH LENGTH BYTE CLC ADC _speechData+1 ;AND ADD TO BASE ADDRESS - STA endptr+1 ;STORE END ADDRESS + STA _endptr+1 ;STORE END ADDRESS LDA _speechLen ;GET LOW LENGTH BYTE CLC ADC _speechData ;AND ADD TO BASE ADDRESS - BCC @L2 ;CHECK FOR PAGE BOUNDARY - INC endptr+1 + BCC @L2 ;CHECK FOR PAGE BOUNDARY + INC _endptr+1 @L2: - STA endptr ;STORE END ADDRESS + STA _endptr ;STORE END ADDRESS - LDA #$FF ;SET BUSY FLAG - STA _busy ;AND SET PERIPHERAL CONTROL - LDA #$0C ;REGISTER TO RECOGNIZE - STA PCR ;SIGNAL FROM SPEECH CHIP - LDA #$80 ;RAISE CTRL BIT IN REGISTER 3 + LDA #$FF ;SET BUSY FLAG + STA _speechBusy ;AND SET PERIPHERAL CONTROL + LDA #$0C ;REGISTER TO RECOGNIZE + STA PCR ;SIGNAL FROM SPEECH CHIP + LDA #$80 ;RAISE CTRL BIT IN REGISTER 3 STA CTTRAMP - LDA #$C0 ;SET TRANSITIONED INFLECTION - STA DURPHON ;MODE IN REGISTER 0 - LDA #$70 ;LOWER CTRL BIT + LDA #$C0 ;SET TRANSITIONED INFLECTION + STA DURPHON ;MODE IN REGISTER 0 + LDA #$70 ;LOWER CTRL BIT STA CTTRAMP - LDA #$82 ;ENABLE 6522 INTERRUPTS + LDA #$82 ;ENABLE 6522 INTERRUPTS STA IER - CLI ;CLEAR INTERRUPT MASK - RTS ;RETURN TO CALLER + CLI ;CLEAR INTERRUPT MASK + RTS ;RETURN TO CALLER .endproc @@ -90,18 +91,18 @@ _busy: .byte $00 PHA TYA PHA - LDA IFR - BPL @L2 +; LDA IFR +; BPL @L2 LDA #$02 ;CLEAR INTERRUPT FLAG STA IFR LDY #$00 ;INIT REGISTERS LDX #$04 LDA OUTPTR+1 - CMP endptr+1 + CMP _endptr+1 BCC @L1 BNE @L5 LDA OUTPTR ;CHECK FOR END OF DATA FILE - CMP endptr + CMP _endptr BCC @L1 ;IF NOT THEN CONTINUE @L5: LDA #$00 ;IF END, TURN EVERYTHING OFF @@ -109,7 +110,7 @@ _busy: .byte $00 LDA #$70 ;ZERO AMPLITUDE STA CTTRAMP LDA #$00 ;CLEAR BUSY FLAG - STA _busy + STA _speechBusy LDA #$02 ;CLEAR INTERRUPT ENABLE STA IER ;IN 6522 LDA #$FF @@ -117,6 +118,10 @@ _busy: .byte $00 LDA #$07 STA DDRB @L2: + LDA OUTPTR + STA _outptr + LDA OUTPTR+1 + STA _outptr+1 PLA ;RESTORE REGISTERS TAY PLA diff --git a/mocktest/speech_api.c b/mocktest/speech_api.c new file mode 100644 index 0000000..2a4fd6d --- /dev/null +++ b/mocktest/speech_api.c @@ -0,0 +1,41 @@ +// +// speech_api.c +// mocktest +// +// Created by Jeremy Rand on 2016-10-17. +// Copyright © 2016 Jeremy Rand. All rights reserved. +// + + +#include + +#include "speech_api.h" +#include "speech.h" + + +bool speechIsBusy(void) +{ + static uint16_t old_outptr = 0; + if (old_outptr == 0) { + printf("endptr=%x\n", endptr); + } + if (old_outptr != outptr) { + old_outptr = outptr; + printf("%x ", old_outptr); + } + //printf("busy=0x%x, outptr=0x%x, endptr=0x%x\n", speechBusy, outptr, endptr); + return (speechBusy != 0); +} + + +bool speakMessage(uint8_t *data, uint16_t dataLen) +{ + if (speechIsBusy()) + return false; + + speechData = data; + speechLen = dataLen; + setupSpeech(); + + return true; +} diff --git a/mocktest/speech_api.h b/mocktest/speech_api.h new file mode 100644 index 0000000..e4e72a5 --- /dev/null +++ b/mocktest/speech_api.h @@ -0,0 +1,22 @@ +// +// speech_api.h +// mocktest +// +// Created by Jeremy Rand on 2016-10-17. +// Copyright © 2016 Jeremy Rand. All rights reserved. +// + +#ifndef __mocktest__speech_api__ +#define __mocktest__speech_api__ + + +#include +#include + + +extern bool speechIsBusy(void); +extern bool speakMessage(uint8_t *data, uint16_t dataLen); + + + +#endif /* defined(__mocktest__speech_api__) */