diff --git a/engine.tal b/engine.tal index 938e4fe..5138ecf 100644 --- a/engine.tal +++ b/engine.tal @@ -1,5 +1,10 @@ ( TODO -commmands ) +* 0x03 (A) - set attack to argument 1-0f +* 0x04 (D) - set decay to argument 1-0f +* 0x05 (S) - set sustain to argument 1-0f +* 0x06 (R) - set release to argument 1-0f +* 0x07 (T) - set song speed to argument 1-0f +* 0x08 (L) - set sample loop 00: off, otherwise: on ) @k-tick &run @@ -16,7 +21,7 @@ commmands ) ( 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 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 @@ -91,9 +96,10 @@ RTN &chan $1 &run ,&chan STR +DUP2 #0001 ADD2 LDA2 ,&chan LDR ;k-run-command/run JSR2 LDA DUP #00 EQU ,&rest JCN - .kalama/loopflags LDZ ,&chan LDR #01 SWP SFT AND + .kalama/loopflags LDZ ,&chan LDR #10 MUL #01 SWP SFT AND #00 NEQ ,&noloop JCN #80 ORA &noloop @@ -103,6 +109,19 @@ LDA DUP POP RTN +@k-run-command ( c arg channel ) +&chan $1 +&run +,&chan STR +SWP ( get command ) +DUP #01 EQU ,&vol JCN ( set instrument ) +DUP #02 EQU ,&instr JCN ( set instrument ) +POP2 RTN +&vol POP ,&chan LDR #10 MUL .Audio0/volume ADD DEO +RTN +&instr POP ,&chan LDR ;k-load-instrument JSR2 +RTN + ( loads instrument with number into specified audio channel, 0-indexed ) @k-load-instrument ( number channel -- ) &run @@ -113,16 +132,16 @@ RTN #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 ) - - DUP ( set or clear loop bit ) + + LDA #07 SFT ( MSB is set for looping sample, turn it into 0/1 ) + ( set or clear loop bit ) #00 EQU ,&clear JCN - STHrk SFT .kalama/loopflags LDZ ORA .kalama/loopflags STZ ( set bit on ) + #01 STHrk SFT .kalama/loopflags LDZ ORA .kalama/loopflags STZ ( set bit on ) ,&end JMP &clear - STHrk SFT #ff EOR .kalama/loopflags LDZ AND .kalama/loopflags STZ ( set bit off ) + #01 STHrk SFT #ff EOR .kalama/loopflags LDZ AND .kalama/loopflags STZ ( set bit off ) &end - + #0001 ADD2 LDA2k STHrk .Audio0/adsr ADD DEO2 ( copy ADSR value ) #0002 ADD2 STHrk .Audio0/addr ADD DEO2 diff --git a/format.md b/format.md index e90cfa6..c08ba5e 100644 --- a/format.md +++ b/format.md @@ -65,6 +65,7 @@ More soon probably * 0x06 (R) - set release to argument (1-0f) * 0x07 (T) - set song speed to argument (1-0f) * 0x08 (L) - set sample loop ( 00: off, otherwise: on ) + ## Instruments Instruments contain a sample and some default parameters for that sample. Everything is in the same format expected by the audio device. diff --git a/player.tal b/player.tal index 122b126..c9868a4 100644 --- a/player.tal +++ b/player.tal @@ -1,4 +1,3 @@ - ( a blank file ) %DEBUG { ;print-hex/byte JSR2 #0a18 DEO } @@ -43,9 +42,6 @@ #0f25 .System/b DEO2 ;module ;k-init-module JSR2 - - #00 #00 ;k-load-instrument JSR2 - #01 #01 ;k-load-instrument JSR2 ;on-frame/run .Screen/vector DEO2 BRK @@ -98,13 +94,13 @@ ff 02 ff ff ( song table, 2 rows ) @DEBUG-patterns ( pattern 00 ) 54 02 00 ( C-3 I00 ) -52 00 00 -54 00 00 -4f 00 00 -4b 00 00 -4f 00 00 -48 00 00 -ff 00 00 +52 01 80 +54 01 08 +4f 01 80 +4b 01 08 +4f 01 22 +48 01 cc +ff 01 88 54 02 00 52 00 00 54 00 00 @@ -114,34 +110,34 @@ ff 00 00 48 00 00 ff 00 00 ( pattern 01 ) -54 00 00 -56 02 00 ( C-3 I00 ) +54 02 01 +56 00 00 57 00 00 56 00 00 57 00 00 54 00 00 -56 00 00 +56 02 00 54 00 00 56 00 00 52 00 00 -54 00 00 +54 02 01 52 00 00 54 00 00 50 00 00 -54 00 00 +54 02 00 ff 00 00 ( pattern 02 ) +3c 02 01 +00 01 f0 3c 00 00 00 00 00 -3c 00 00 +3c 01 0f 00 00 00 -3c 00 00 +3c 01 ff 00 00 00 -3c 00 00 +3c 01 44 00 00 00 -3c 00 00 -00 00 00 -3c 00 00 +3c 01 ff 00 00 00 3c 00 00 00 00 00