diff --git a/src/asm/6502/nes/test.s b/src/asm/6502/nes/test.s index 8638f1f07..97643dce9 100644 --- a/src/asm/6502/nes/test.s +++ b/src/asm/6502/nes/test.s @@ -118,8 +118,8 @@ irq: rti ; command stream player definition -FCS_MAX_CHAN=4 -FCS_MAX_STACK=16 +FCS_MAX_CHAN=8 +FCS_MAX_STACK=10 fcsAddrBase=$20 fcsZeroPage=$10 diff --git a/src/asm/6502/seq.bin b/src/asm/6502/seq.bin index d88a8e3e8..5b0afe69e 100644 Binary files a/src/asm/6502/seq.bin and b/src/asm/6502/seq.bin differ diff --git a/src/asm/6502/stream.s b/src/asm/6502/stream.s index 0f115c304..de06157ec 100644 --- a/src/asm/6502/stream.s +++ b/src/asm/6502/stream.s @@ -80,7 +80,7 @@ fcsNoteOnNull: rts ; note off, note off env, env release -fcsNoArgDispatch: +fcsNoArgDispatchB4: tya sec sbc #$b4 @@ -88,14 +88,69 @@ fcsNoArgDispatch: jsr fcsDispatchCmd rts +fcsOneByteDispatchB4: + tya + pha + fcsReadNext + sta fcsArg0 + pla + sec + sbc #$b4 + tay + jsr fcsDispatchCmd + rts + +; dispatch subroutines for full commands +fcsNoArgDispatch: + jsr fcsDispatchCmd + rts + fcsOneByteDispatch: tya pha fcsReadNext sta fcsArg0 pla - sec - sbc #$b4 + tay + jsr fcsDispatchCmd + rts + +fcsTwoByteDispatch: + tya + pha + fcsReadNext + sta fcsArg0 + fcsReadNext + sta fcsArg1 + pla + tay + jsr fcsDispatchCmd + rts + +fcsOneShortDispatch: + tya + pha + fcsReadNext + sta fcsArg0 + fcsReadNext + sta fcsArg0+1 + pla + tay + jsr fcsDispatchCmd + rts + +fcsTwoShortDispatch: + tya + pha + fcsReadNext + sta fcsArg0 + fcsReadNext + sta fcsArg0+1 + fcsReadNext + sta fcsArg1 + fcsReadNext + sta fcsArg1+1 + pla tay jsr fcsDispatchCmd rts @@ -229,9 +284,28 @@ fcsOffWait: jsr fcsDispatchCmd rts -; TODO fcsFullCmd: - rts + ; read command + fcsReadNext + tay + lda fcsFullCmdTable-28,y + tay + lda fcsCmdReadTableLow,y + sta fcsTempPtr + lda fcsCmdReadTableHigh,y + sta fcsTempPtr+1 + jmp (fcsTempPtr) + +fcsSpeedDialCmd: + lda fcsSpeedDial-224,y + tay + lda fcsFullCmdTable-28,y + tay + lda fcsCmdReadTableLow,y + sta fcsTempPtr + lda fcsCmdReadTableHigh,y + sta fcsTempPtr+1 + jmp (fcsTempPtr) fcsCall: ; get address and relocate it @@ -583,15 +657,268 @@ fcsVibTable: ; $de fcsWait1, ; $df fcsStop, fcsInsTableHigh: - .db >fcsNoArgDispatch, >fcsNoArgDispatch, >fcsNoArgDispatch, >fcsNoArgDispatch, >fcsOneByteDispatch, >fcsNoOp, >fcsNoOp, >fcsNoOp, >fcsNoOp, >fcsNoOp, >fcsNoOp, >fcsNoOp + .db >fcsNoArgDispatchB4, >fcsNoArgDispatchB4, >fcsNoArgDispatchB4, >fcsNoArgDispatchB4, >fcsOneByteDispatchB4, >fcsNoOp, >fcsNoOp, >fcsNoOp, >fcsNoOp, >fcsNoOp, >fcsNoOp, >fcsNoOp .db >fcsPrePorta, >fcsArpTime, >fcsVibrato, >fcsVibRange, >fcsVibShape, >fcsPitch, >fcsArpeggio, >fcsVolume, >fcsVolSlide, >fcsPorta, >fcsLegato, >fcsVolSlideTarget, >fcsNoOpOneByte, >fcsNoOpOneByte, >fcsNoOpOneByte, >fcsPan .db >fcsOptPlaceholder, >fcsNoOp, >fcsNoOp, >fcsNoOp, >fcsNoOp, >fcsCallI, >fcsOffWait, >fcsFullCmd, >fcsCall, >fcsRet, >fcsJump, >fcsTickRate, >fcsWaitS, >fcsWaitC, >fcsWait1, >fcsStop + .db >fcsSpeedDialCmd, >fcsSpeedDialCmd, >fcsSpeedDialCmd, >fcsSpeedDialCmd, >fcsSpeedDialCmd, >fcsSpeedDialCmd, >fcsSpeedDialCmd, >fcsSpeedDialCmd, >fcsSpeedDialCmd, >fcsSpeedDialCmd, >fcsSpeedDialCmd, >fcsSpeedDialCmd, >fcsSpeedDialCmd, >fcsSpeedDialCmd, >fcsSpeedDialCmd, >fcsSpeedDialCmd fcsInsTableLow: - .db fcsNoArgDispatch + .db >fcsOneByteDispatch + .db >fcsTwoByteDispatch + .db >fcsOneShortDispatch + .db >fcsTwoShortDispatch + +fcsCmdReadTableLow: + .db