million-perfect-letters/src/mockingduet.a

188 lines
3.9 KiB
Plaintext

; ELECTRIC DUET MUSIC PLAYER FOR THE MOCKINGBOARD
; COPYRIGHT 2014 CYBERNESTO
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the
; Free Software Foundation, Inc.,
; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
;
; -----------------------------------------------------------------------------
;
; changes to original (by 4am):
; - fixes for stereo output
; - labels for slot independence (see million.init.a)
; - MBCHECKKEY to check against a list of keys that will exit
;
CHN = $1D
SONG = $1E
LEFTCHN = $00
RIGHTCHN = $02
ENAREG = $07
VOL_A = $08
VOL_B = $09
TONE = $06
DURATION = $08
!align $FF,0,0 ; align to page
MockingDuet
JSR INIT
JSR RESET
JSR ENACHN
JMP MBLOOP
SETVOL
MBNEXT LDA SONG
CLC
ADC #$03
STA SONG
BCC MBLOOP
INC SONG+1
MBLOOP LDY #$00
LDA (SONG),Y
CMP #$01
BEQ SETVOL
BPL SETNOTE ;SET DURATION
MBEND JSR RESET
RTS
MBCHECKKEY
ldy #0
MBCHECK lda ($EE), y
beq MBCONTINUE
bpl MBEND
iny
cmp $C000
beq MBEND
bne MBCHECK ; always branches
MBCONTINUE
bit $C010
jmp MBNEXT
SETNOTE STA DURATION
LDA #LEFTCHN
MBSEND STA CHN
MBSLOT01 STA $C401
MBSLOT02 STA $C481
JSR SETREG1
INY
LDA (SONG),Y
BEQ MBSKIP ;IF 0 KEEP LTTSA
JSR CONVFREQ
MBSKIP LDA TONE
MBSLOT03 STA $C401
MBSLOT04 STA $C481
JSR WRDATA1
INC CHN
LDA CHN
MBSLOT05 STA $C401
MBSLOT06 STA $C481
JSR SETREG1
LDA TONE+1
MBSLOT07 STA $C401
MBSLOT08 STA $C481
JSR WRDATA1
LDA #RIGHTCHN
STA CHN
CPY #$02
BNE MBSEND
LDX DURATION
W1 LDY TEMPO
W2 DEC TEMP
BNE W2
DEY
BNE W2
DEX
BNE W1
BIT $C000
MBKEYBRANCH
BMI MBCHECKKEY
JMP MBNEXT
CONVFREQ LDX OCTAVE
INX
PHA
LDA #$00
STA TONE+1
PLA
DECOCT DEX
BMI LOBYTE
ASL
ROL TONE+1
JMP DECOCT
LOBYTE STA TONE
RTS
RESET LDA #$00
MBSLOT09 STA $C400
MBSLOT10 STA $C480
LDA #$04
MBSLOT11 STA $C400
MBSLOT12 STA $C480
RTS
INIT LDA #$FF
MBSLOT13 STA $C403
MBSLOT14 STA $C483
LDA #$07
MBSLOT15 STA $C402
MBSLOT16 STA $C482
RTS
SETREG1 LDA #$07
MBSLOT17 STA $C400
MBSLOT18 STA $C480
LDA #$04
MBSLOT19 STA $C400
MBSLOT20 STA $C480
RTS
WRDATA1 LDA #$06
MBSLOT21 STA $C400
MBSLOT22 STA $C480
LDA #$04
MBSLOT23 STA $C400
MBSLOT24 STA $C480
RTS
ENACHN LDA #ENAREG
MBSLOT25 STA $C401
MBSLOT26 STA $C481
JSR SETREG1
LDA #%00111100
MBSLOT27 STA $C401
MBSLOT28 STA $C481
JSR WRDATA1
LDA #VOL_A
MBSLOT29 STA $C401
MBSLOT30 STA $C481
JSR SETREG1
LDA #$0D
MBSLOT31 STA $C401
MBSLOT32 STA $C481
JSR WRDATA1
LDA #VOL_B
MBSLOT33 STA $C401
MBSLOT34 STA $C481
JSR SETREG1
LDA #$0D
MBSLOT35 STA $C401
MBSLOT36 STA $C481
JSR WRDATA1
RTS
OCTAVE !byte 1
TEMPO !byte 8
TEMP !byte 0