This repository has been archived on 2022-04-18. You can view files and clone it, but cannot push or open issues or pull requests.
kalama-sin/engine.tal

182 lines
5.3 KiB
Tal
Raw Normal View History

2022-01-25 18:48:19 +00:00
%k-RTN { JMP2r }
2022-01-10 08:18:54 +00:00
@k-tick
&run
.kalama/tick LDZ #01 ADD DUP
.kalama/speed LDZ EQU ,&play JCN
.kalama/tick STZ
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-10 08:18:54 +00:00
&play
POP
2022-01-10 08:18:54 +00:00
#ff .kalama/tick STZ
.kalama/line LDZ #01 ADD STHk ( rst: line )
#00 SWP #0003 MUL2 ;&lineaddr STA2 ( store line address offset )
.kalama/songpos LDZ2 DUP2 ( songpos* songpos )
2022-01-19 22:56:23 +00:00
( don't play if song pos is ffff aka song is stopped or over )
#ffff EQU2 ;&no-play JCN2 ( songpos* )
#0005 ADD2 .kalama/module LDZ2 ADD2 ( songposinmod* )
DUP2 LDA ;k-get-pattern/run JSR2 ;&lineaddr LDA2 ADD2 #00 ;k-play-line/run JSR2
DUP2 #0001 ADD2 LDA ;k-get-pattern/run JSR2 ;&lineaddr LDA2 ADD2 #01 ;k-play-line/run JSR2
DUP2 #0002 ADD2 LDA ;k-get-pattern/run JSR2 ;&lineaddr LDA2 ADD2 #02 ;k-play-line/run JSR2
#0003 ADD2 LDA ;k-get-pattern/run JSR2 ;&lineaddr LDA2 ADD2 #03 ;k-play-line/run JSR2
2022-01-19 22:56:23 +00:00
STHrk #0f EQU ,&next JCN
STHr .kalama/line STZ
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-10 08:18:54 +00:00
&next
2022-01-19 22:56:23 +00:00
POPr
2022-01-10 23:41:14 +00:00
#ff .kalama/line STZ .kalama/songpos LDZ2 #0004 ADD2 DUP2
.kalama/module LDZ2 #0003 ADD2 LDA2 ( song length ) EQU2 ,&reset JCN
.kalama/songpos STZ2
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-10 23:41:14 +00:00
&reset
2022-01-13 20:59:06 +00:00
POP2
2022-01-14 14:17:05 +00:00
.kalama/songloop LDZ #00 EQU ,&end JCN
2022-01-10 23:41:14 +00:00
#0000 .kalama/songpos STZ2
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-14 14:17:05 +00:00
&end
#ffff .kalama/songpos STZ2
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-14 14:17:05 +00:00
&no-play
2022-01-19 22:56:23 +00:00
POP2 POP2 POPr
2022-01-25 18:48:19 +00:00
k-RTN
&lineaddr $2
2022-01-10 08:18:54 +00:00
( initialises kalama with module data )
@k-init-module ( addr* -- )
&run
DUP2 .kalama/module STZ2 ( store module address )
2022-01-14 14:17:05 +00:00
DUP2 LDA DUP
#0f AND .kalama/speed STZ ( set speed )
#80 AND .kalama/songloop STZ ( set song loop or not )
2022-01-13 20:59:06 +00:00
#0001 ADD2 LDA ( stash pattern count byte )
2022-01-14 14:17:05 +00:00
;k-get-pattern JSR2 .kalama/instruments STZ2
2022-01-10 08:18:54 +00:00
#ff .kalama/tick STZ
#ff .kalama/line STZ
2022-01-10 23:41:14 +00:00
#0000 .kalama/songpos STZ2
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-10 08:18:54 +00:00
( gets the memory address of the given pattern in loaded module )
@k-get-pattern ( number -- addr* )
&run
2022-01-19 22:56:23 +00:00
DUP #ff EQU ,&blank JCN
2022-01-10 08:18:54 +00:00
#00 SWP #0030 MUL2
2022-01-24 16:11:09 +00:00
.kalama/module LDZ2 #0003 ADD2 DUP2 LDA2 ADD2 #0002 ADD2 ADD2
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-13 20:59:06 +00:00
&blank
POP
;k-blank-pattern
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-10 08:18:54 +00:00
( gets the memory address of the given instrument in loaded module )
@k-get-instrument ( number -- addr* )
&run
STH ( store instrument number for later )
.kalama/instruments LDZ2
( we are now at the size byte of instrument 00, the start of instrument memory )
&loop
STHrk #00 EQU ,&end JCN
STHr #01 SUB STH ( decrement counter )
DUP2 LDA2 ( load length byte and convert to short )
#0006 ADD2 ( jump over length short, vol, flags, ADSR )
2022-01-10 23:41:14 +00:00
ADD2 ( jump to next instrument )
2022-01-10 08:18:54 +00:00
,&loop JMP
&end
POPr
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-10 08:18:54 +00:00
@k-play-line ( *l channel -- )
&chan $1
2022-01-10 08:18:54 +00:00
&run
2022-01-14 18:13:20 +00:00
,&chan STR
DUP2 #0001 ADD2 LDA2 ,&chan LDR ;k-run-command/run JSR2
2022-01-10 08:18:54 +00:00
LDA DUP
#00 EQU ,&rest JCN
.kalama/loopflags LDZ ,&chan LDR #10 MUL #01 SWP SFT AND
#00 NEQ ,&noloop JCN
#80 ORA
&noloop
2022-01-14 18:13:20 +00:00
.Audio0/pitch ,&chan LDR #10 MUL ADD DEO ( TODO effects, use loop bit )
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-10 08:18:54 +00:00
&rest
POP
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-10 08:18:54 +00:00
@k-run-command ( c arg channel )
&chan $1
&run
2022-01-21 19:13:46 +00:00
;&chan STA
SWP ( get command )
2022-01-21 19:13:46 +00:00
DUP #01 EQU ;&vol JCN2 ( set volume )
DUP #02 EQU ;&instrument JCN2 ( set instrument )
DUP #03 EQU ;&attack JCN2 ( set attack time )
DUP #04 EQU ;&decay JCN2 ( set decay time )
DUP #05 EQU ;&sustain JCN2 ( set sustain time )
2022-01-21 19:20:41 +00:00
DUP #06 EQU ;&release JCN2 ( set sustain time )
2022-01-21 19:13:46 +00:00
DUP #07 EQU ;&speed JCN2 ( set speed )
2022-01-25 18:48:19 +00:00
POP2 k-RTN
2022-01-21 19:13:46 +00:00
&vol POP ;&chan LDA #10 MUL .Audio0/volume ADD DEO
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-21 19:13:46 +00:00
&instrument POP ;&chan LDA ;k-load-instrument JSR2
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-21 11:16:06 +00:00
&attack POP
#0f AND #40 SFT ( shift new value into appropriate position )
2022-01-21 19:13:46 +00:00
;&chan LDA #10 MUL .Audio0/adsr ADD DEI ( load current value )
2022-01-21 11:16:06 +00:00
#0f AND ( take only decay nibble )
ADD ( add together new attack and old decay )
2022-01-21 19:13:46 +00:00
;&chan LDA #10 MUL .Audio0/adsr ADD DEO ( store )
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-21 11:16:06 +00:00
&decay POP
#0f AND
2022-01-21 19:13:46 +00:00
;&chan LDA #10 MUL .Audio0/adsr ADD DEI ( load current value )
2022-01-21 11:16:06 +00:00
#f0 AND ( take only attack nibble )
ADD ( add together new decay and old attack )
2022-01-21 19:13:46 +00:00
;&chan LDA #10 MUL .Audio0/adsr ADD DEO ( store )
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-21 19:13:46 +00:00
&sustain POP
#0f AND #40 SFT ( shift new value into appropriate position )
;&chan LDA #10 MUL .Audio0/adsr #01 ADD ADD DEI ( load current value )
#0f AND ( take only decay nibble )
ADD ( add together new attack and old decay )
;&chan LDA #10 MUL .Audio0/adsr #01 ADD ADD DEO ( store )
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-21 19:20:41 +00:00
&release POP
#0f AND
;&chan LDA #10 MUL .Audio0/adsr #01 ADD ADD DEI ( load current value )
#f0 AND ( take only attack nibble )
ADD ( add together new decay and old attack )
;&chan LDA #10 MUL .Audio0/adsr #01 ADD ADD DEO ( store )
2022-01-25 18:48:19 +00:00
k-RTN
&speed POP #0f AND .kalama/speed STZ #00 .kalama/tick STZ
k-RTN
2022-01-10 08:18:54 +00:00
( loads instrument with number into specified audio channel, 0-indexed )
@k-load-instrument ( number channel -- )
&run
#10 MUL STH ( stash channel * 0x10, offset for that channel's data relative to Audio0 )
;k-get-instrument JSR2 ( get instrument location )
DUP2 LDA2 STHrk .Audio0/length ADD DEO2 ( copy ADSR value )
#0002 ADD2 ( move to volume value )
DUP2 LDA STHrk .Audio0/volume ADD DEO ( copy volume value )
#0001 ADD2 DUP2 ( move to flags value )
LDA #07 SFT ( MSB is set for looping sample, turn it into 0/1 )
( set or clear loop bit )
2022-01-10 08:18:54 +00:00
#00 EQU ,&clear JCN
#01 STHrk SFT .kalama/loopflags LDZ ORA .kalama/loopflags STZ ( set bit on )
2022-01-10 08:18:54 +00:00
,&end JMP
&clear
#01 STHrk SFT #ff EOR .kalama/loopflags LDZ AND .kalama/loopflags STZ ( set bit off )
2022-01-10 08:18:54 +00:00
&end
#0001 ADD2 LDA2k STHrk .Audio0/adsr ADD DEO2 ( copy ADSR value )
2022-01-18 20:24:06 +00:00
#0002 ADD2 STHrk .Audio0/addr ADD DEO2
2022-01-10 08:18:54 +00:00
POPr
2022-01-25 18:48:19 +00:00
k-RTN
2022-01-13 20:59:06 +00:00
@k-blank-pattern $30