lytron hat geschrieben:Hat hier jemand einen möglichst simplen MSU-(Sound)-Player-Sourcecode herumliegen? (...)
ikari_01, hast du da noch was rumfliegen?
Ich bin zwar nicht ikari_01, aber ich hab da gewissermaßen noch was rumfliegen.
Der Code selber ist simpel und lässt sich im Prinzip direkt in eins der bekannten Beispiel-Homebrew-ROMs einpflanzen. Ich hab vor einiger Zeit testweise nevikstis Starter-Kit benutzt, man kann aber auch ein beliebiges anderes nehmen.
Wichtig ist, dass man dem SPC700 quasi miteilt, dass er Passthrough aktiviert, bevor PCM wiedergegeben werden kann. Diese Info habe ich von ikari selbst (
hier). Irgendwie klappte das Ganze bei meinem ersten Test trotzdem nicht. Ich hab dann irgendwo gelesen, dass man zusätzlich noch die Echo Volume auf beiden Kanälen deaktivieren muss - weiß leider nicht mehr, wo. (Finde auch gerade den Dev-Guide nicht mehr online, den ich benutzt habe - es war nicht der von byuu.)
Hier also der relevante Code-Teil (!), einzusetzen in eine Main-Sektion. Der SPC-Upload-Code stammt von ikari/blargg/necronomfive (?), der Maschinen-Code für den SPC700 von ikari (glaube ich). Der Starterkit kann am besten mit WLA DX kompiliert werden. Die WAV-Dateien müssen natürlich erst mit einem Tool (hieß wav2msu und war auch von ikari, IIRC) konvertiert und entsprechend benannt werden (track-01.pcm oder so).
Wenn's denn mal läuft - und das tat es letztlich - macht das Ganze durchaus Laune.
Code: Alles auswählen
; *************************** DEFINES
; status bits
.DEFINE XY_8BIT $10
.DEFINE A_8BIT $20
; SPC700 I/O registers
.equ APUIO0 $2140
.equ APUIO1 $2141
.equ APUIO2 $2142
.equ APUIO3 $2143
; MSU1 registers
.define MSU_STATUS $2000
.define MSU_READ $2001
.define MSU_ID $2002
.define MSU_SEEK $2000
.define MSU_TRACK $2004
.define MSU_VOLUME $2006
.define MSU_CONTROL $2007
; *************************** MAIN CODE
CheckForMSU:
lda MSU_ID
cmp #'S'
beq +
brl NoMSU
+ lda MSU_ID+1
cmp #'-'
bne NoMSU
lda MSU_ID+2
cmp #'M'
bne NoMSU
lda MSU_ID+3
cmp #'S'
bne NoMSU
lda MSU_ID+4
cmp #'U'
bne NoMSU
lda MSU_ID+5
cmp #'1'
bne NoMSU
MSUFound:
; SPC700 pass-through enabling needed, source: http://board.byuu.org/viewtopic.php?p=65217#p65217
php
sep #A_8BIT
rep #XY_8BIT
sei ; Disable NMI & IRQ
stz $4200
; ---- Begin upload
ldy #$0002
jsr spc_begin_upload
; ---- Upload SPC700 pass-through code
ldx #$0000
-
lda.w spccode,x
jsr spc_upload_byte
inx
cpy #41 ; size of spc code
bne -
; ---- Execute loader
ldy #$0002
jsr spc_execute
lda #$81 ; VBlank NMI + Auto Joypad Read
sta $4200 ; re-enable VBlank NMI
cli
plp
SetCursorPos 0, 0
PrintString "Playing a PCM tune :-)\n"
jsr PlayTrack
; lda MSU_STATUS
; sta temp
; PrintHexNum temp
bra ForeverLoader
NoMSU:
SetCursorPos 0, 0
PrintString "No MSU1 media enhancement hardware found!"
bra ForeverLoader
PlayTrack:
; ldx #$0000
; stx MSU_SEEK ; zero out data port address
; stx MSU_SEEK+2
;- bit MSU_STATUS ; wait for the data port busy bit to clear
; bmi -
lda #$00
sta MSU_VOLUME
ldx #$0001
stx MSU_TRACK
- bit MSU_STATUS ; Wait for the Audio Busy bit to clear.
bvs -
lda #$01 ; Set audio state to play, no repeat.
sta MSU_CONTROL
lda #$00
- inc a
wai
sta MSU_VOLUME
cmp #$FF
bne -
; The MSU1 will now start playing.
; Use lda #$03 to play a song repeatedly.
rts
ForeverLoader:
lda #$81
sta $4200 ; turn on NMI
ForeverLoop:
wai ; wait for next frame
bra ForeverLoop
; ************************ SPC700 pass-through *************************
spc_begin_upload:
sty APUIO2 ; Set address
ldy #$BBAA ; Wait for SPC
-
cpy APUIO0
bne -
lda #$CC ; Send acknowledgement
sta APUIO1
sta APUIO0
- ; Wait for acknowledgement
cmp APUIO0
bne -
ldy #0 ; Initialize index
rts
spc_upload_byte:
sta APUIO1
tya ; Signal it's ready
sta APUIO0
- ; Wait for acknowledgement
cmp APUIO0
bne -
iny
rts
spc_execute:
sty APUIO2
stz APUIO1
lda APUIO0
inc a
inc a
sta APUIO0
; Wait for acknowledgement
-
cmp APUIO0
bne -
rts
spccode:
.byt $e8, $6c ; - MOV A, #$6c ; FLG register
.byt $c4, $f2 ; MOV $f2, A
.byt $e8, $20 ; MOV A, #$20 ; unmute, disable echo
.byt $c4, $f3 ; MOV $f3, A
.byt $78, $20, $f3 ; CMP $f3, #$20
.byt $d0, $f3 ; BNE -
.byt $e8, $2c ; - MOV A, #$2c ; Echo volume left
.byt $c4, $f2 ; MOV $f2, A
.byt $e8, $00 ; MOV A, #$00 ; silent
.byt $c4, $f3 ; MOV $f3, A
.byt $78, $00, $f3 ; CMP $f3, #$00
.byt $d0, $f3 ; BNE -
.byt $e8, $3c ; - MOV A, #$3c ; Echo volume right
.byt $c4, $f2 ; MOV $f2, A
.byt $e8, $00 ; MOV A, #$00 ; silent
.byt $c4, $f3 ; MOV $f3, A
.byt $78, $00, $f3 ; CMP $f3, #$00
.byt $d0, $f3 ; BNE -
.byt $2f, $fe ; - BRA -