mirror of
https://github.com/Michaelangel007/apple2_castle_wolfenstein_sound_board.git
synced 2025-01-21 05:31:19 +00:00
195 lines
3.7 KiB
ArmAsm
195 lines
3.7 KiB
ArmAsm
; Castle Wolfenstein Sound Board
|
|
; https://github.com/Michaelangel007/apple2_castle_wolfenstein_sound_board
|
|
; Assembler: Merlin32
|
|
;
|
|
; To rip code + data
|
|
; bsave "cw.play.1950",1950:1980
|
|
; bsave "cw.sfx.5e36",5e36:8b9d
|
|
|
|
temp = $FB ; menu item key name, delay for player
|
|
dst = $FC
|
|
src = $FE
|
|
|
|
PRODOS = $BF00
|
|
|
|
KEY = $C000
|
|
KEYSTROBE = $C010
|
|
|
|
SQUEEKER = $C030 ; 1-bit audio ... who knew Sony would COPY the idea with SACD in 1999!
|
|
|
|
TEXT = $FB39 ; SETTXT
|
|
HOME = $FC58
|
|
COUT = $FDED
|
|
BELL = $FBDD
|
|
|
|
ORG $2000
|
|
|
|
LENGTH = __END - __START + __MAIN - Main
|
|
|
|
; Move from $2000 .. $5D00
|
|
Main BIT __MAIN + $3D00
|
|
LDA #$4C ; "JMP" $abs
|
|
STA $2000
|
|
Move LDY #0
|
|
Src LDA $2000,Y ; The two regions don't overlap
|
|
Dst STA $5D00,Y ; $2000 + $2E9E = $4E9E < $5D00
|
|
INY
|
|
BNE Src
|
|
INC Src+2
|
|
INC Dst+2
|
|
LDA Src+2
|
|
CMP #>LENGTH + Main
|
|
BNE Move
|
|
BEQ Main
|
|
|
|
__MAIN
|
|
ORG * + $3D00 ; $5D00
|
|
__START
|
|
JSR TEXT
|
|
JSR HOME
|
|
|
|
LDA #'A'+$80 ; menu item key name
|
|
STA temp
|
|
|
|
LDX #$5E ; hi - original CW SFX
|
|
LDY #$36 ; lo - voice sample location
|
|
STX src+1
|
|
STY src+0
|
|
|
|
STX Pointers+1
|
|
STY Pointers+0
|
|
|
|
LDX #>Pointers ; hi
|
|
LDY #<Pointers+2
|
|
STX dst+1
|
|
STY dst+0
|
|
|
|
; Walk Linked-List
|
|
PrintNames
|
|
LDY #1
|
|
LDA (src),Y ;16-bit pointer to next SFX
|
|
BEQ DoneNames
|
|
STA (dst),Y
|
|
|
|
DEY
|
|
LDA (src),Y
|
|
STA (dst),Y
|
|
|
|
INY
|
|
INY
|
|
LDX #$18
|
|
|
|
LDA temp
|
|
JSR COUT
|
|
INC temp
|
|
|
|
LDA #')'+$80
|
|
JSR COUT
|
|
LDA #' '+$80
|
|
JSR COUT
|
|
|
|
LoopName
|
|
LDA (src),Y
|
|
JSR COUT
|
|
INY
|
|
DEX
|
|
BNE LoopName
|
|
|
|
LDA #$8D
|
|
JSR COUT
|
|
|
|
LDY #0
|
|
LDA (dst),Y
|
|
STA src+0
|
|
INY
|
|
LDA (dst),Y
|
|
STA src+1
|
|
|
|
INC dst ; too lazy to do page cross check
|
|
INC dst
|
|
BNE PrintNames
|
|
|
|
DoneNames
|
|
JSR BELL
|
|
|
|
GetInput
|
|
LDA KEY
|
|
BPl GetInput
|
|
STA KEYSTROBE
|
|
|
|
AND #$7F
|
|
CMP #$1B
|
|
BEQ Exit
|
|
|
|
SEC
|
|
SBC #'A'
|
|
ASL
|
|
TAX
|
|
LDA Pointers,X
|
|
CLC
|
|
ADC #36 ; + 36?
|
|
STA src+0
|
|
INX
|
|
LDA Pointers,X
|
|
BEQ DoneNames
|
|
ADC #0
|
|
STA src+1
|
|
JSR Play
|
|
JMP GetInput
|
|
Exit JSR PRODOS ;Call the MLI ($BF00)
|
|
|
|
DFB $65 ;CALL TYPE = QUIT
|
|
DW PARMTABLE ;Pointer to parameter table
|
|
PARMTABLE
|
|
DFB 4 ;Number of parameters is 4
|
|
DFB 0 ;0 is the only quit type
|
|
DW 0000 ;Pointer reserved for future use
|
|
DFB 0 ;Byte reserved for future use
|
|
DW 0000 ;Pointer reserved for future use
|
|
|
|
|
|
; Player ripped from $1950
|
|
Play
|
|
LDY #$00
|
|
NextNote
|
|
LDA (src),Y
|
|
PHA
|
|
STA temp
|
|
DelayNote
|
|
LDY #$04
|
|
BEQ DoneDelay
|
|
Delay
|
|
DEY
|
|
BNE Delay
|
|
DoneDelay
|
|
DEC temp
|
|
BNE DelayNote
|
|
PLA
|
|
CMP #$FE
|
|
BEQ SkipDelay
|
|
Delay2
|
|
LDA #$FF
|
|
NOP
|
|
EOR #$FF
|
|
STA Delay2+1 ; Waste 4 cycles
|
|
LDA SQUEEKER
|
|
SkipDelay
|
|
INC src+0
|
|
BNE SamePage
|
|
INC src+1
|
|
SamePage
|
|
LDA (src),Y
|
|
CMP #$FF
|
|
BNE NextNote
|
|
RTS
|
|
|
|
; Array of 16-bit pointers
|
|
DS \,$00
|
|
Pointers ; This can't go on the previous page since it spills over due to lazy code above
|
|
DS $36,$00
|
|
SFX PUTBIN cw.sfx.5e36
|
|
|
|
DS \,$FF ; Pad with End-of-Song
|
|
__END
|
|
|