6502 command stream player, part 18

- fix short wait for multiples of 256
- fix arp implementation
- fix vibrato implementation
- make example command table bigger
- add a basic status view
This commit is contained in:
tildearrow 2025-04-23 04:46:39 -05:00
parent 216518d65b
commit 6acc835d71
4 changed files with 202 additions and 36 deletions

View file

@ -1,7 +1,7 @@
all: test.nes all: test.nes
test.nes: test.o test.ini test.nes: test.o test.ini
wlalink -v -S test.ini test.nes wlalink -v -S test.ini test.nes
test.o: test.s nes.i chr.bin ../stream.s test.o: test.s nes.i chr.bin ../stream.s ../seq.bin
wla-6502 -o test.o test.s wla-6502 -o test.o test.s
clean: clean:

View file

@ -12,6 +12,8 @@ PPUDATA=$2007
APUBASE=$4000 APUBASE=$4000
OAMDMA=$4014 OAMDMA=$4014
JOY1=$4016
JOY2=$4017
; memory map ; memory map
.MEMORYMAP .MEMORYMAP

View file

@ -4,6 +4,9 @@
.include "nes.i" .include "nes.i"
pendingTick=$400 pendingTick=$400
curChan=$401
joyInput=$402
joyPrev=$403
; program ROM ; program ROM
.BANK 1 SLOT 1 .BANK 1 SLOT 1
@ -94,7 +97,7 @@ loop:
beq loop beq loop
; wait a bit so we can see the raster ; wait a bit so we can see the raster
ldy #$ff ldy #$ff
ldx #$03 ldx #$02
- dey - dey
bne - bne -
@ -115,12 +118,134 @@ loop:
jmp loop jmp loop
.MACRO ppuPos
bit PPUSTATUS
lda #>($2000+((\1))+((\2)<<5))
sta PPUADDR
lda #<($2000+((\1))+((\2)<<5))
sta PPUADDR
.ENDM
; interrupt handlers ; interrupt handlers
nmi: nmi:
php php
pha pha
lda #1
; read controller
lda joyInput
sta joyPrev
lda #$01
sta JOY1
sta joyInput
lsr
sta JOY1
- lda JOY1
lsr
rol joyInput
bcc -
; PPU update
ppuPos 10, 4
lda curChan
jsr printNum
lda curChan
rol
tax
ppuPos 12, 6
lda chanPC.w+1,x
jsr printNum
lda chanPC.w,x
jsr printNum
ppuPos 12, 7
lda chanTicks.w+1,x
jsr printNum
lda chanTicks.w,x
jsr printNum
ppuPos 14, 8
lda chanNote.w,x
jsr printNum
ppuPos 14, 9
lda chanPitch.w,x
jsr printNum
ppuPos 20, 9
lda chanVibratoDebug.w,x
jsr printNum
ppuPos 14, 10
lda chanVibrato.w,x
jsr printNum
ppuPos 14, 11
lda chanVibratoPos.w,x
jsr printNum
ppuPos 14, 12
lda chanArp.w,x
jsr printNum
ppuPos 20, 12
lda chanArpTicks.w,x
jsr printNum
ppuPos 23, 12
lda chanArpStage.w,x
jsr printNum
ppuPos 14, 13
lda chanPortaSpeed.w,x
jsr printNum
ppuPos 20, 13
lda chanPortaTarget.w,x
jsr printNum
ppuPos 12, 14
lda chanVol.w+1,x
jsr printNum
lda chanVol.w,x
jsr printNum
; end of PPU update
bit PPUSTATUS
lda #0
sta PPUSCROLL
sta PPUSCROLL
; process joy input
lda joyInput
eor joyPrev
and joyInput
; left
pha
and #$02
beq +
dec curChan
bpl +
lda #0
sta curChan
; right
+ pla
and #$01
beq +
inc curChan
; set pendingTick
+ lda #1
sta pendingTick sta pendingTick
; end
pla pla
plp plp
rti rti
@ -128,6 +253,22 @@ nmi:
irq: irq:
rti rti
printNum:
pha
lsr
lsr
lsr
lsr
tay
lda hexChar.w,y
sta PPUDATA
pla
and #$0f
tay
lda hexChar.w,y
sta PPUDATA
rts
; command stream player definition ; command stream player definition
FCS_MAX_CHAN=8 FCS_MAX_CHAN=8
@ -147,17 +288,23 @@ fcsCmdTableHigh=fcsCmdTableExample
screenText: screenText:
.db " Furnace Test Player " .db " Furnace Test Player "
.db " " .db " "
.db " channel " .db " channel 00 "
.db " "
.db " PC tick "
.db " note pitch "
.db " vib vibPos "
.db " arp porta "
.db " vol volS "
.db " pan "
.db " " .db " "
.db " PC $0000 (00) "
.db " tick 0000 "
.db " note 00 "
.db " pitch 00 ~00 "
.db " vib 00 "
.db " vibPos 00 "
.db " arp 00 (00/00) "
.db " porta 00 -> 00 "
.db " vol 0000 "
.db " pan 0000 "
.db 0 .db 0
hexChar:
.db "0123456789ABCDEF"
ppuPalette: ppuPalette:
.db $0e, $00, $10, $30 .db $0e, $00, $10, $30
.db $0e, $00, $10, $30 .db $0e, $00, $10, $30
@ -165,7 +312,16 @@ ppuPalette:
.db $0e, $00, $10, $30 .db $0e, $00, $10, $30
volMaxArray: volMaxArray:
.dw $40, $40, $40, $40 .db $7f, 00
.db $7f, 00
.db $7f, 00
.db $7f, 00
.db $7f, 00
.db $7f, 00
.db $7f, 00
.db $7f, 00
.ORGA $9000
cmdStream: cmdStream:
.incbin "../seq.bin" .incbin "../seq.bin"

View file

@ -55,6 +55,7 @@ chanVolSpeed=fcsAddrBase+24+(FCS_MAX_CHAN*12) ; short
chanPan=fcsAddrBase+24+(FCS_MAX_CHAN*14) ; short chanPan=fcsAddrBase+24+(FCS_MAX_CHAN*14) ; short
chanArpStage=fcsAddrBase+24+(FCS_MAX_CHAN*16) ; char chanArpStage=fcsAddrBase+24+(FCS_MAX_CHAN*16) ; char
chanArpTicks=fcsAddrBase+24+(FCS_MAX_CHAN*16)+1 ; char chanArpTicks=fcsAddrBase+24+(FCS_MAX_CHAN*16)+1 ; char
chanVibratoDebug=fcsAddrBase+24+(FCS_MAX_CHAN*18) ; char
; may be used for driver detection ; may be used for driver detection
fcsDriverInfo: fcsDriverInfo:
@ -244,10 +245,10 @@ fcsNoOpOneByte:
fcsPan: fcsPan:
fcsReadNext fcsReadNext
sta chanPan,x sta chanPan.w,x
sta fcsArg0 sta fcsArg0
fcsReadNext fcsReadNext
sta chanPan+1,x sta chanPan.w+1,x
sta fcsArg1 sta fcsArg1
ldy #10 ldy #10
jsr fcsDispatchCmd jsr fcsDispatchCmd
@ -379,9 +380,14 @@ fcsTickRate:
rts rts
fcsWaitS: fcsWaitS:
sec
fcsReadNext fcsReadNext
and #$ff
sta chanTicks,x sta chanTicks,x
fcsReadNext bne +
clc
+ fcsReadNext
adc #$ff
sta chanTicks+1,x sta chanTicks+1,x
rts rts
@ -565,8 +571,16 @@ fcsChannelPost:
jmp fcsChanDoPitch1 jmp fcsChanDoPitch1
; update vibrato ; update vibrato
; get vibrato ; 1. store vibrato pitch table offset
+ lda chanVibrato,x + lda chanVibrato,x
rol
rol
rol
rol
and #$f0
sta fcsTempPtr
; 2. update vibrato position
lda chanVibrato,x
lsr lsr
lsr lsr
lsr lsr
@ -575,16 +589,7 @@ fcsChannelPost:
adc chanVibratoPos,x adc chanVibratoPos,x
and #$3f and #$3f
sta chanVibratoPos,x sta chanVibratoPos,x
; calculate vibrato pitch (TODO) ; 3. calculate vibrato pitch
; 1. store table offset
lda chanVibrato,x
rol
rol
rol
rol
and #$f0
sta fcsTempPtr
; 2. calculate vibrato position
; - we use 15 quarter sine tables, one for each vibrato depth ; - we use 15 quarter sine tables, one for each vibrato depth
; - 32-63 are negatives of 0-31 ; - 32-63 are negatives of 0-31
; - a&31: zero is zero. otherwise a-1 in the table unless a&16 ; - a&31: zero is zero. otherwise a-1 in the table unless a&16
@ -635,6 +640,7 @@ fcsChannelPost:
; at this point, a contains the vibrato pitch ; at this point, a contains the vibrato pitch
fcsPostVibratoCalc1: fcsPostVibratoCalc1:
sta fcsArg0 sta fcsArg0
sta chanVibratoDebug,x
; extend sign ; extend sign
bmi + bmi +
lda #0 lda #0
@ -850,7 +856,17 @@ fcsInit:
bne - bne -
; set volumes ; set volumes
; TODO ldx #0
- lda fcsVolMax.w,x
sta chanVol+1,x
inx
inx
cpx #(FCS_MAX_CHAN*2)
bne -
; set arp speed
lda #1
sta fcsArpSpeed
; success ; success
lda #0 lda #0
@ -1198,13 +1214,5 @@ fcsVolMaxExample:
.db $7f, $00 .db $7f, $00
.db $7f, $00 .db $7f, $00
; first 64 commands
fcsCmdTableExample: fcsCmdTableExample:
.db 0, 0, 0, 0, 0, 0, 0, 0 .dsb 256, 0
.db 0, 0, 0, 0, 0, 0, 0, 0
.db 0, 0, 0, 0, 0, 0, 0, 0
.db 0, 0, 0, 0, 0, 0, 0, 0
.db 0, 0, 0, 0, 0, 0, 0, 0
.db 0, 0, 0, 0, 0, 0, 0, 0
.db 0, 0, 0, 0, 0, 0, 0, 0
.db 0, 0, 0, 0, 0, 0, 0, 0