mocklib/mocktest/speech.s

136 lines
3.4 KiB
ArmAsm

;
; speech.s
; mocktest
;
; Created by Jeremy Rand on 2016-09-29.
; Copyright © 2016 Jeremy Rand. All rights reserved.
;
.export _setupSpeech
TABPTR := $F9 ;DATA POINTER
OUTPTR := $FB ;START OF DATA POINTER
ENDPTR := $FD ;END OF DATA POINTER
BUSY := $FF ;BUSY FLAG
IRQL := $03FE ;INTERRUPT VECTOR, LOW BYTE
IRQH := $03FF ;INTERRUPT VECTOR, HIGH BYTE
BASE := $C440 ;FIRST SPEECH CHIP
DURPHON := BASE ;REGISTER 0 OF SPEECH CHIP
INFLECT := BASE+$01 ;REGISTER 1 OF SPEECH CHIP
RATEINF := BASE+$02 ;REGISTER 2 OF SPEECH CHIP
CTTRAMP := BASE+$03 ;REGISTER 3 OF SPEECH CHIP
FILFREQ := BASE+$04 ;REGISTER 4 OF SPEECH CHIP
DDRB := $C402
DDRA := $C403
PCR := $C48C ;PERIPHERAL CONTROL REG-6522
IFR := $C48D ;INTERRUPT FLAG REG-6522
IER := $C48E
.CODE
.proc _setupSpeech
SEI ;DISABLE INTERRUPTS
LDA #<_interr ;SET INTERRUPT VECTOR
STA IRQL ;TO POINT TO INTERRUPT
LDA #>_interr ;SERVICE ROUTINE
STA IRQH
LDA #$00
STA DDRA
STA DDRB
LDA TABPTR+1 ;GET HIGH ADDRESS OF DATA
STA OUTPTR+1 ;STORE IN WORK POINTER
LDX TABPTR ;GET LOW ADDRESS OF DATA
INX ;INCREMENT TWICE
INX ;TO SKIP OVER LENGTH BYTES
BNE @L1 ;CHECK FOR PAGE BOUNDARY
INC OUTPTR+1
@L1:
STX OUTPTR ;STORE LOW BYTE
LDY #$01
LDA (TABPTR),Y ;GET HIGH LENGTH BYTE
CLC
ADC TABPTR+1 ;AND ADD TO BASE ADDRESS
STA ENDPTR+1 ;STORE END ADDRESS
DEY
LDA (TABPTR),Y ;GET LOW LENGTH BYTE
CLC
ADC TABPTR ;AND ADD TO BASE ADDRESS
BCC @L2 ;CHECK FOR PAGE BOUNDARY
INC ENDPTR+1
@L2:
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
STA CTTRAMP
LDA #$C0 ;SET TRANSITIONED INFLECTION
STA DURPHON ;MODE IN REGISTER 0
LDA #$70 ;LOWER CTRL BIT
STA CTTRAMP
LDA #$82 ;ENABLE 6522 INTERRUPTS
STA IER
CLI ;CLEAR INTERRUPT MASK
RTS ;RETURN TO CALLER
.endproc
.proc _interr
TXA ;SAVE REGISTERS
PHA
TYA
PHA
LDA IFR
BPL @L2
LDA #$02 ;CLEAR INTERRUPT FLAG
STA IFR
LDY #$00 ;INIT REGISTERS
LDX #$04
LDA OUTPTR ;CHECK FOR END OF DATA FILE
CMP ENDPTR
BCC @L1 ;IF NOT THEN CONTINUE
LDA OUTPTR+1 ;CHECK HIGH ADDRESS ALSO
CMP ENDPTR+1
BCC @L1 ;IF NOT THEN CONTINUE
LDA #$00 ;IF END, TURN EVERYTHING OFF
STA DURPHON ;STORE PAUSE PHONEME
LDA #$70 ;ZERO AMPLITUDE
STA CTTRAMP
LDA #$00 ;CLEAR BUSY FLAG
STA BUSY
LDA #$02 ;CLEAR INTERRUPT ENABLE
STA IER ;IN 6522
LDA #$FF
STA DDRA
LDA #$07
STA DDRB
@L2:
PLA ;RESTORE REGISTERS
TAY
PLA
TAX
LDA $45
RTI ;RETURN FROM INTERRUPT
@L1:
LDA (OUTPTR),Y ;GET DATA
STA BASE,X ;STORE IN SPEECH CHIP
INC OUTPTR ;NEXT DATA
BNE @L3
INC OUTPTR+1
@L3:
DEX ;NEXT REGISTER
CPX #$FF ;LAST REGISTER?
BNE @L1 ;NO, CONTINUE
BEQ @L2 ;YES, RETURN
.endproc