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
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
; 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,
fcsOffWait:
ldy #0
sty chanTicks+1,x
iny
sty chanTicks,x
jsr fcsDispatchCmd
rts
; TODO
fcsFullCmd:
rts
fcsCall:
jsr fcsPushCall
; get address
jsr fcsReadNext
tay
jsr fcsReadNext
; a has high byte
; y has low byte
sty chanPC,x
sta chanPC+1,x
rts
fcsPushCall:
rts
fcsRet:
rts
fcsJump:
; 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
; 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
; y: command
@ -282,6 +326,14 @@ fcsReadNext:
lda (fcsTempPtr),y
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)
; read commands
fcsChannelCmd:
@ -434,6 +486,62 @@ fcsVibTable:
.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
; 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!
fcsDummyFunc: