More speech assembly cleanup. Create a proper API for speech.

This commit is contained in:
Jeremy Rand 2016-10-17 23:57:40 -04:00
parent 9bb4f83010
commit 4e3c65288f
6 changed files with 126 additions and 37 deletions

View File

@ -8,6 +8,9 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
9D16BCE21D9E070B005EE214 /* speech.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = speech.s; sourceTree = "<group>"; }; 9D16BCE21D9E070B005EE214 /* speech.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = speech.s; sourceTree = "<group>"; };
9D49929C1DB5C5F700606789 /* speech.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = speech.h; sourceTree = "<group>"; };
9D49929D1DB5C65200606789 /* speech_api.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = speech_api.c; sourceTree = "<group>"; };
9D49929E1DB5C65200606789 /* speech_api.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = speech_api.h; sourceTree = "<group>"; };
9DB3C98C1D84A11600395532 /* main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = "<group>"; }; 9DB3C98C1D84A11600395532 /* main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = "<group>"; };
9DB3C98D1D84A11600395532 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; }; 9DB3C98D1D84A11600395532 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
9DB3C98F1D84A11600395532 /* AppleCommander.jar */ = {isa = PBXFileReference; lastKnownFileType = archive.jar; name = AppleCommander.jar; path = make/AppleCommander.jar; sourceTree = "<group>"; }; 9DB3C98F1D84A11600395532 /* AppleCommander.jar */ = {isa = PBXFileReference; lastKnownFileType = archive.jar; name = AppleCommander.jar; path = make/AppleCommander.jar; sourceTree = "<group>"; };
@ -37,6 +40,9 @@
9DB3C99C1D84A21E00395532 /* mockingboard.c */, 9DB3C99C1D84A21E00395532 /* mockingboard.c */,
9DB3C99D1D84A21E00395532 /* mockingboard.h */, 9DB3C99D1D84A21E00395532 /* mockingboard.h */,
9D16BCE21D9E070B005EE214 /* speech.s */, 9D16BCE21D9E070B005EE214 /* speech.s */,
9D49929C1DB5C5F700606789 /* speech.h */,
9D49929D1DB5C65200606789 /* speech_api.c */,
9D49929E1DB5C65200606789 /* speech_api.h */,
9DB3C98D1D84A11600395532 /* Makefile */, 9DB3C98D1D84A11600395532 /* Makefile */,
9DB3C98E1D84A11600395532 /* make */, 9DB3C98E1D84A11600395532 /* make */,
); );

View File

@ -14,13 +14,7 @@
#include <conio.h> #include <conio.h>
#include "mockingboard.h" #include "mockingboard.h"
#include "speech_api.h"
extern void setupSpeech(void);
extern uint8_t *speechData;
extern uint16_t speechLen;
extern bool busy;
extern uint8_t numIRQs;
tMockingSoundRegisters soundData1 = { tMockingSoundRegisters soundData1 = {
@ -73,7 +67,8 @@ uint8_t mySpeechData[] = {
0x6B, 0xA8, 0x59, 0x32, 0xE8, 0x6A, 0xA8, 0x4D, 0x6B, 0xA8, 0x59, 0x32, 0xE8, 0x6A, 0xA8, 0x4D,
0x60, 0xE7, 0x29, 0xA8, 0x41, 0x0A, 0xE8, 0x78, 0x60, 0xE7, 0x29, 0xA8, 0x41, 0x0A, 0xE8, 0x78,
0xA8, 0x41, 0x30, 0xE8, 0x70, 0xA8, 0x39, 0xFF, 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; return 0;
printf("\n"); printf("\n");
speechData = mySpeechData; speakMessage(mySpeechData, sizeof(mySpeechData));
speechLen = sizeof(mySpeechData) - 1; while (speechIsBusy()) {
setupSpeech();
while (!kbhit()) {
//printf("numIRQs = %d\n", numIRQs);
} }
printf("\nDone speaking\n");
cgetc(); cgetc();
return 0; return 0;

22
mocktest/speech.h Normal file
View File

@ -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 */

View File

@ -7,7 +7,8 @@
; ;
.export _setupSpeech, _numIRQs, _speechData, _speechLen, _busy .export _setupSpeech, _speechData, _speechLen, _speechBusy
.export _outptr, _endptr
; .interruptor speechIRQ ; .interruptor speechIRQ
@ -29,11 +30,11 @@ IER := $C48E
.DATA .DATA
speechIRQ: .byte $60, <_interr, >_interr ; RTS plus two dummy bytes speechIRQ: .byte $60, <_interr, >_interr ; RTS plus two dummy bytes
_numIRQs: .byte $00
_speechData: .byte $00, $00 _speechData: .byte $00, $00
_speechLen: .byte $00, $00 _speechLen: .byte $00, $00
endptr: .byte $00, $00 _outptr: .byte $00, $00
_busy: .byte $00 _endptr: .byte $00, $00
_speechBusy: .byte $00
.CODE .CODE
@ -58,29 +59,29 @@ _busy: .byte $00
LDA _speechLen+1 ;GET HIGH LENGTH BYTE LDA _speechLen+1 ;GET HIGH LENGTH BYTE
CLC CLC
ADC _speechData+1 ;AND ADD TO BASE ADDRESS 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 LDA _speechLen ;GET LOW LENGTH BYTE
CLC CLC
ADC _speechData ;AND ADD TO BASE ADDRESS ADC _speechData ;AND ADD TO BASE ADDRESS
BCC @L2 ;CHECK FOR PAGE BOUNDARY BCC @L2 ;CHECK FOR PAGE BOUNDARY
INC endptr+1 INC _endptr+1
@L2: @L2:
STA endptr ;STORE END ADDRESS STA _endptr ;STORE END ADDRESS
LDA #$FF ;SET BUSY FLAG LDA #$FF ;SET BUSY FLAG
STA _busy ;AND SET PERIPHERAL CONTROL STA _speechBusy ;AND SET PERIPHERAL CONTROL
LDA #$0C ;REGISTER TO RECOGNIZE LDA #$0C ;REGISTER TO RECOGNIZE
STA PCR ;SIGNAL FROM SPEECH CHIP STA PCR ;SIGNAL FROM SPEECH CHIP
LDA #$80 ;RAISE CTRL BIT IN REGISTER 3 LDA #$80 ;RAISE CTRL BIT IN REGISTER 3
STA CTTRAMP STA CTTRAMP
LDA #$C0 ;SET TRANSITIONED INFLECTION LDA #$C0 ;SET TRANSITIONED INFLECTION
STA DURPHON ;MODE IN REGISTER 0 STA DURPHON ;MODE IN REGISTER 0
LDA #$70 ;LOWER CTRL BIT LDA #$70 ;LOWER CTRL BIT
STA CTTRAMP STA CTTRAMP
LDA #$82 ;ENABLE 6522 INTERRUPTS LDA #$82 ;ENABLE 6522 INTERRUPTS
STA IER STA IER
CLI ;CLEAR INTERRUPT MASK CLI ;CLEAR INTERRUPT MASK
RTS ;RETURN TO CALLER RTS ;RETURN TO CALLER
.endproc .endproc
@ -90,18 +91,18 @@ _busy: .byte $00
PHA PHA
TYA TYA
PHA PHA
LDA IFR ; LDA IFR
BPL @L2 ; BPL @L2
LDA #$02 ;CLEAR INTERRUPT FLAG LDA #$02 ;CLEAR INTERRUPT FLAG
STA IFR STA IFR
LDY #$00 ;INIT REGISTERS LDY #$00 ;INIT REGISTERS
LDX #$04 LDX #$04
LDA OUTPTR+1 LDA OUTPTR+1
CMP endptr+1 CMP _endptr+1
BCC @L1 BCC @L1
BNE @L5 BNE @L5
LDA OUTPTR ;CHECK FOR END OF DATA FILE LDA OUTPTR ;CHECK FOR END OF DATA FILE
CMP endptr CMP _endptr
BCC @L1 ;IF NOT THEN CONTINUE BCC @L1 ;IF NOT THEN CONTINUE
@L5: @L5:
LDA #$00 ;IF END, TURN EVERYTHING OFF LDA #$00 ;IF END, TURN EVERYTHING OFF
@ -109,7 +110,7 @@ _busy: .byte $00
LDA #$70 ;ZERO AMPLITUDE LDA #$70 ;ZERO AMPLITUDE
STA CTTRAMP STA CTTRAMP
LDA #$00 ;CLEAR BUSY FLAG LDA #$00 ;CLEAR BUSY FLAG
STA _busy STA _speechBusy
LDA #$02 ;CLEAR INTERRUPT ENABLE LDA #$02 ;CLEAR INTERRUPT ENABLE
STA IER ;IN 6522 STA IER ;IN 6522
LDA #$FF LDA #$FF
@ -117,6 +118,10 @@ _busy: .byte $00
LDA #$07 LDA #$07
STA DDRB STA DDRB
@L2: @L2:
LDA OUTPTR
STA _outptr
LDA OUTPTR+1
STA _outptr+1
PLA ;RESTORE REGISTERS PLA ;RESTORE REGISTERS
TAY TAY
PLA PLA

41
mocktest/speech_api.c Normal file
View File

@ -0,0 +1,41 @@
//
// speech_api.c
// mocktest
//
// Created by Jeremy Rand on 2016-10-17.
// Copyright © 2016 Jeremy Rand. All rights reserved.
//
#include <stdio.h>
#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;
}

22
mocktest/speech_api.h Normal file
View File

@ -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 <stdbool.h>
#include <stdint.h>
extern bool speechIsBusy(void);
extern bool speakMessage(uint8_t *data, uint16_t dataLen);
#endif /* defined(__mocktest__speech_api__) */