6502 command stream player, part 5

it compiles

to-do: test with an actual command stream
This commit is contained in:
tildearrow 2025-04-17 20:05:14 -05:00
parent 134954412d
commit 66e2791b35

View file

@ -193,54 +193,98 @@ fcsOptPlaceholder:
jsr fcsReadNext jsr fcsReadNext
rts rts
fcsNoOp: fcsCallI:
jsr fcsPushCall
; get address
jsr fcsReadNext
tay
jsr fcsReadNext
; ignore next two bytes
jsr fcsIgnoreNext
jsr fcsIgnoreNext
; a has high byte
; y has low byte
sty chanPC,x
sta chanPC+1,x
rts rts
; COMMAND TABLE fcsOffWait:
; $b4 fcsNoArgDispatch, ldy #0
; $b5 fcsNoArgDispatch, sty chanTicks+1,x
; $b6 fcsNoArgDispatch, iny
; $b7 fcsNoArgDispatch, sty chanTicks,x
; $b8 fcsOneByteDispatch, jsr fcsDispatchCmd
; $b9 fcsNoOp, rts
; $ba fcsNoOp,
; $bb fcsNoOp, ; TODO
; $bc fcsNoOp, fcsFullCmd:
; $bd fcsNoOp, rts
; $be fcsNoOp,
; $bf fcsNoOp, fcsCall:
; $c0 fcsPrePorta, jsr fcsPushCall
; $c1 fcsArpTime, ; get address
; $c2 fcsVibrato, jsr fcsReadNext
; $c3 fcsVibRange, tay
; $c4 fcsVibShape, jsr fcsReadNext
; $c5 fcsPitch, ; a has high byte
; $c6 fcsArpeggio, ; y has low byte
; $c7 fcsVolume, sty chanPC,x
; $c8 fcsVolSlide, sta chanPC+1,x
; $c9 fcsPorta, rts
; $ca fcsLegato,
; $cb fcsVolSlideTarget, fcsPushCall:
; $cc fcsNoOpOneByte, rts
; $cd fcsNoOpOneByte,
; $ce fcsNoOpOneByte, fcsRet:
; $cf fcsPan, rts
; $d0 fcsOptPlaceholder,
; $d1 fcsNoOp, fcsJump:
; $d2 fcsNoOp, ; get address
; $d3 fcsNoOp, jsr fcsReadNext
; $d4 fcsNoOp, tay
; $d5 fcsCallI, jsr fcsReadNext
; $d6 fcsOffWait, ; ignore next two bytes
; $d7 fcsFullCmd, jsr fcsIgnoreNext
; $d8 fcsCall, jsr fcsIgnoreNext
; $d9 fcsRet, ; a has high byte
; $da fcsJump, ; y has low byte
; $db fcsTickRate, sty chanPC,x
; $dc fcsWaitS, sta chanPC+1,x
; $dd fcsWaitC, rts
; $de fcsWait1,
; $df fcsStop, ; TODO
fcsTickRate:
rts
fcsWaitS:
jsr fcsReadNext
sta chanTicks,x
jsr fcsReadNext
sta chanTicks+1,x
rts
fcsWaitC:
jsr fcsReadNext
sta chanTicks,x
lda #0
sta chanTicks+1,x
rts
fcsWait1:
ldy #1
sty chanTicks,x
dey
sty chanTicks+1,x
rts
fcsStop:
lda #0
sta chanPC,x
sta chanPC+1,x
rts
fcsNoOp:
rts
; x: channel*2 ; x: channel*2
; y: command ; y: command
@ -282,6 +326,14 @@ fcsReadNext:
lda (fcsTempPtr),y lda (fcsTempPtr),y
rts rts
; x: channel*2
fcsIgnoreNext:
; increase PC
inc chanPC,x
bne +
inc chanPC+1,x
+ rts
; x: channel*2 (for speed... char variables are interleaved) ; x: channel*2 (for speed... char variables are interleaved)
; read commands ; read commands
fcsChannelCmd: fcsChannelCmd:
@ -434,6 +486,62 @@ fcsVibTable:
.db 0, -12, -24, -36, -48, -59, -70, -80, -89, -98, -105, -112, -117, -121, -124, -126 .db 0, -12, -24, -36, -48, -59, -70, -80, -89, -98, -105, -112, -117, -121, -124, -126
.db -126, -126, -124, -121, -117, -112, -105, -98, -89, -80, -70, -59, -48, -36, -24, -12 .db -126, -126, -124, -121, -117, -112, -105, -98, -89, -80, -70, -59, -48, -36, -24, -12
; COMMAND TABLE
; $b4 fcsNoArgDispatch,
; $b5 fcsNoArgDispatch,
; $b6 fcsNoArgDispatch,
; $b7 fcsNoArgDispatch,
; $b8 fcsOneByteDispatch,
; $b9 fcsNoOp,
; $ba fcsNoOp,
; $bb fcsNoOp,
; $bc fcsNoOp,
; $bd fcsNoOp,
; $be fcsNoOp,
; $bf fcsNoOp,
; $c0 fcsPrePorta,
; $c1 fcsArpTime,
; $c2 fcsVibrato,
; $c3 fcsVibRange,
; $c4 fcsVibShape,
; $c5 fcsPitch,
; $c6 fcsArpeggio,
; $c7 fcsVolume,
; $c8 fcsVolSlide,
; $c9 fcsPorta,
; $ca fcsLegato,
; $cb fcsVolSlideTarget,
; $cc fcsNoOpOneByte,
; $cd fcsNoOpOneByte,
; $ce fcsNoOpOneByte,
; $cf fcsPan,
; $d0 fcsOptPlaceholder,
; $d1 fcsNoOp,
; $d2 fcsNoOp,
; $d3 fcsNoOp,
; $d4 fcsNoOp,
; $d5 fcsCallI,
; $d6 fcsOffWait,
; $d7 fcsFullCmd,
; $d8 fcsCall,
; $d9 fcsRet,
; $da fcsJump,
; $db fcsTickRate,
; $dc fcsWaitS,
; $dd fcsWaitC,
; $de fcsWait1,
; $df fcsStop,
fcsInsTableLow:
.db >fcsNoArgDispatch, >fcsNoArgDispatch, >fcsNoArgDispatch, >fcsNoArgDispatch, >fcsOneByteDispatch, >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
fcsInsTableHigh:
.db <fcsNoArgDispatch, <fcsNoArgDispatch, <fcsNoArgDispatch, <fcsNoArgDispatch, <fcsOneByteDispatch, <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
; "dummy" implementation - example only! ; "dummy" implementation - example only!
fcsDummyFunc: fcsDummyFunc: