AUTO
DIM code% 2560
*fx11
write=&EB21
pitch=&ED16
vol=&EB1C
ch1temp=&70
REMch1count=&70
chordtmp=&71
chordptr=&72
accicount=&7B
tuneptr=&78
tunedelay=&79
tunetmp=&7A
tunecount=&7B
tunepos=&7C
evnum=&80
tickcount=&81
eventcount=&82
FOR I%=0 TO2 STEP2
P%=code%
[OPT I%
.chordtable
EQUB &5B
EQUB &5B
EQUB &4B
EQUB &83
EQUB &64
EQUB &27
EQUB &5F
EQUB &27
\EQUB &79

.chordtable2
\
EQUB &67
EQUB &67
EQUB &77
EQUB &83
EQUB &77
EQUB &77
EQUB &83
EQUB &83

.tuneseq
EQUB 0
EQUB 0
EQUB tunetab2-tunetab
EQUB tunetab4-tunetab

EQUB tunetab2-tunetab \1
EQUB tunetab5-tunetab
EQUB tunetab2-tunetab
EQUB tunetab5-tunetab
EQUB tunetab7-tunetab
EQUB 0

.tunelen
EQUB tunetab2-tunetab
EQUB tunetab4-tunetab
EQUB tunetab3-tunetab
EQUB tunetab5-tunetab

EQUB tunetab2b-tunetab \1
EQUB tunetab7-tunetab
EQUB tunetab2b-tunetab
EQUB tunetab6-tunetab
EQUB tunetabend-tunetab

EQUB tunetab2-tunetab

.tunetab
\patt0
\EQUB &6F
EQUB &6B
EQUB &6B
EQUB &59
EQUB &69
EQUB &48
EQUB &40
EQUB &30
EQUB &00
\patt1
EQUB &58
EQUB &00
EQUB &68
EQUB &00
\EQUB &D9 \ cut version
\EQUB &E9

EQUB &C8
EQUB &C0
EQUB &B1

EQUB &09
EQUB &18
EQUB &28
EQUB &31
EQUB &51

.tunetab2
EQUB &10
EQUB &00
EQUB &10
EQUB &20
EQUB &33
.tunetab2b
EQUB &48
EQUB &00
EQUB &48
EQUB &58
EQUB &32
EQUB &00
\
EQUB &41
EQUB &20
EQUB &00

.tunetab3
EQUB &C0
EQUB &C8
EQUB &D8
EQUB &E8
EQUB &41
EQUB &30
EQUB &00
EQUB &32
EQUB &00

.tunetab4
EQUB &58
EQUB &48
EQUB &40
EQUB &48
EQUB &33
EQUB &D3

.tunetab5
\EQUB &10
\EQUB &00
\EQUB &10
\EQUB &20
\EQUB &33
EQUB &C0
EQUB &C8
EQUB &D8
EQUB &E8
EQUB &32
EQUB &00
\
EQUB &40
EQUB &00
EQUB &20
EQUB &00
\
.tunetab6
EQUB &F0
EQUB &E8
EQUB &D8
EQUB &C8
EQUB &41
EQUB &B1
EQUB &32
EQUB &00
\
.tunetab7
EQUB &40
EQUB &30
EQUB &58
EQUB &48
EQUB &41
EQUB &30
EQUB &00
EQUB &31
EQUB &51
.tunetabend

.cuttimes
EQUB &1C
EQUB &3E
EQUB &F0
EQUB &F2

.accitimes
EQUB &1D
EQUB &3D
EQUB &7B
EQUB &FD

.delay
LDA &2A0
CLC
ADC #4
.delloop
CMP &2A0
BNE delloop
LDX tickcount
INX
CPX #3
BNE enddelay
INC eventcount
LDX #0
.enddelay
STX tickcount
RTS

.tune
\event tick in X, flags set
CPX #0
BNE notick
DEC tunedelay
BMI nextnote
.notick2
RTS

.notick
CPX #2
BNE notick2
LDA eventcount
LDY #3
.acciloop
CMP accitimes,Y
BEQ doacci
CMP cuttimes,Y
BEQ nonote
DEY
BPL acciloop
LDA tunetmp
BPL notick2
.nonote
.ch2off
LDA #&BF
JMP write

.doacci
LDA #&A0 \ D#
JMP tunenote2

.nextnote
LDX tuneptr
LDA tunetab,X
INX
CPX tunecount
BNE noover
INC tunepos
LDY tunepos
LDX tunelen,Y
STX tunecount
LDX tuneseq,Y
.noover
STX tuneptr
STA tunetmp
AND #7
STA tunedelay
LDA tunetmp
LSR A
.tunenote
AND #&3C
BEQ nonote \ A is zero
CMP #40
BNE not40
LDA #72 \ top E
.not40
CLC
ADC #92
.tunenote2
.ch2pitch
LDX #6
JSR pitch
.ch2on
LDA #&B0
JMP write

.go
LDA #&E3
JSR write
LDY #0
STY chordptr
STY tuneptr
STY tunepos
STY tunedelay
STY eventcount
LDY tunelen
STY tunecount

LDX #0

.evloop
\JSR middle
JSR tune
\LDX tickcount
\JSR playchord
JSR delay
JMP evloop


.ch1off
LDA #&DF
JMP write
.seven
EQUB 7

.playchord
CPX #2
BEQ ch1off
CPX #0
BNE rts
.dochord
\JSR &C7AF
\LDA eventcount
\JSR &F97A
LDA eventcount
LSR A
BCS dochord2
LSR A
BCS chordnote
BIT seven
BNE noincchord
LSR A
AND #8
STA chordptr

.noincchord
LDY chordptr
LDA chordtable,Y
INC chordptr
STA &70

.chordnote
LDA &70
LSR A
AND #&FC
STA chordtmp
JMP ch1pitch

.dochord2
LDA &70
AND #7
ASL A
ASL A
ADC chordtmp
.ch1pitch
LDX #5
JSR pitch
.ch1on
LDA #&D0
JMP write
.rts
RTS

.mlow
EQUB &C0
EQUB &A8
EQUB &D0
EQUB &C0
\FIXME

.mbassnotes
EQUB &00
EQUB &0C
EQUB &10
EQUB &14

EQUB &30
EQUB &20
EQUB &1C
EQUB &10

EQUB &00
EQUB &20
EQUB &00
EQUB &04

.moff
TYA
AND #15
CMP #13
BPL rts
JSR ch1off
JSR ch2off
JSR ch3off
.ch0off
LDA #&FF
JMP write


.middle
CPX #1
BEQ rts
LDY eventcount
CPX #2
BEQ moff
DEY
TYA
AND #15
CMP #11
BEQ mchord3
BPL mbass
LSR A
BCC middlechord
LDA #20
JSR ch1pitch
LDA #48
JSR ch2pitch
.ch3off
LDA #&9F
JMP write


.mbass
AND #3
TAX
LDA mbassnotes,X
PHA
JSR ch2pitch
LDA #&F0
JSR write
PLA
CLC
ADC #139
LDX #5
JMP pitch

.mchord3
LDA #124
BNE mchord2
.middlechord
\chord
LDA #128
.mchord2
JSR ch1pitch
LDA #116
JSR ch2pitch
LDA #96
.ch3pitch
LDX #7
JSR pitch
.ch3on
LDA #&90
JSR write
RTS

]
NEXT

P.P%-code%

CALL go
