dos33fsprogs/music/pt3_lib_6ch/pt3_test.s
2024-01-18 02:05:14 -05:00

306 lines
5.8 KiB
ArmAsm

;=================
; VMW PT3_LIB test
;=================
; template for using the pt3_lib
; zero page definitions
.include "zp.inc"
; some firmware locations
.include "hardware.inc"
; Location the files load at.
; If you change this, you need to update the Makefile
PT3_LOC = song
PT3_LOC_2 = song2
; the below will make for more compact code, at the expense
; of using $80 - $ff zero page addresses by the decoder.
; PT3_USE_ZERO_PAGE = 1
; Comment this to disable Apple IIc support which will free a small amount
; of room
PT3_ENABLE_APPLE_IIC = 1
; Enable ROM copying on IIc
;PT3_ENABLE_IIC_COPY_ROM = 1
; The Vortex Tracker by default generates Atari-ST style pt3 files
; which assume there is a 1.77MHz clock frequency driving
; the AY-3-8910. Apple II Mockingboards run at 1MHz, so unless
; you convert the frequency the music will sound pitched lower.
; The 1.77MHz frequency conversion code can be in three states:
; Enabled (always convert)
; PT3_DISABLE_FREQ_CONVERSION commented out
; PT3_DISABLE_SWITCHABLE_FREQ_CONVERSION = 1
; Disabled (don't convert)
; PT3_DISABLE_FREQ_CONVERSION = 1
; PT3_DISABLE_SWITCHABLE_FREQ_CONVERSION = 1
; Switchable (can disable/enable on the fly)
; this is the default for historical reasons
; PT3_DISABLE_FREQ_CONVERSION commented out
; PT3_DISABLE_SWITCHABLE_FREQ_CONVERSION commented out
; PT3_DISABLE_FREQ_CONVERSION = 1
; PT3_DISABLE_SWITCHABLE_FREQ_CONVERSION = 1
;=============================
; Setup
;=============================
pt3_setup:
jsr HOME
jsr TEXT
;===============
; init variables
;===============
lda #0
sta DONE_PLAYING
lda #1 ; change to 0 to not loop
sta LOOP
sta LOOP_2
;=======================
; Detect Apple II Model
;========================
; IRQ setup is different on IIc
; You can possibly skip this if you only care about II+/IIe
.ifdef PT3_ENABLE_APPLE_IIC
jsr detect_appleii_model
.endif
;=======================
; Detect mockingboard
;========================
jsr print_mockingboard_detect ; print message
jsr mockingboard_detect ; call detection routine
bcs mockingboard_found
jsr print_mocking_notfound
; possibly can't detect on IIc so just try with slot#4 anyway
; even if not detected
jmp setup_interrupt
mockingboard_found:
; print found message
; modify message to print slot value
lda MB_ADDR_H
sec
sbc #$10
sta found_message+11
jsr print_mocking_found
jsr print_artist_message
;==================================================
; patch the playing code with the proper slot value
;==================================================
jsr mockingboard_patch
setup_interrupt:
;=======================
; Set up 50Hz interrupt
;========================
jsr mockingboard_init
jsr mockingboard_setup_interrupt
;============================
; Init the Mockingboard
;============================
jsr reset_ay_both
jsr clear_ay_both
;==================
; init song
;==================
jsr pt3_init_song
;============================
; Enable 6502 interrupts
;============================
jsr pt3_toggle_freq_conversion
jsr pt3_toggle_freq_conversion_2
start_interrupts:
cli ; clear interrupt mask
;============================
; Loop forever
;============================
bit SET_GR
bit LORES
bit TEXTGR
bit PAGE1
forever_loop:
jsr visualization
jmp forever_loop
;========================================
;========================================
; Helper routines below
;========================================
;========================================
;==================================
; Print mockingboard detect message
;==================================
; note: on IIc must do this before enabling interrupt
; as we disable ROM (COUT won't work?)
print_mockingboard_detect:
lda APPLEII_MODEL
sta apple_message+17
; print detection message for Apple II type
ldy #0
print_apple_message:
lda apple_message,Y ; load loading message
beq done_apple_message
ora #$80
jsr COUT
iny
jmp print_apple_message
done_apple_message:
jsr CROUT1
; print detection message
ldy #0
print_mocking_message:
lda mocking_message,Y ; load loading message
beq done_mocking_message
ora #$80
jsr COUT
iny
jmp print_mocking_message
done_mocking_message:
jsr CROUT1
rts
print_mocking_notfound:
ldy #0
print_not_message:
lda not_message,Y ; load loading message
beq print_not_message_done
ora #$80
jsr COUT
iny
jmp print_not_message
print_not_message_done:
rts
print_mocking_found:
ldy #0
print_found_message:
lda found_message,Y ; load loading message
beq done_found_message
ora #$80
jsr COUT
iny
jmp print_found_message
done_found_message:
rts
print_artist_message:
jsr CROUT1
ldy #0
print_artist_message_loop:
lda artist_message,Y ; load loading message
beq done_artist_message
ora #$80
jsr COUT
iny
jmp print_artist_message_loop
done_artist_message:
rts
;=========
; strings
;=========
apple_message: .asciiz "DETECTED APPLE II "
mocking_message: .asciiz "LOOKING FOR MOCKINGBOARD: "
not_message: .byte "NOT "
found_message: .asciiz "FOUND SLOT#4"
artist_message: .asciiz "PLAYING: 'DANCE OF THE DEAD' BY DYA"
;=========
; vars
;=========
;=========
;routines
;=========
.ifdef PT3_ENABLE_APPLE_IIC
.include "pt3_lib_detect_model.s"
.endif
.include "pt3_lib_common.s"
.include "pt3_lib_core.s"
.include "pt3_lib_core2.s"
.include "pt3_lib_init.s"
.include "pt3_lib_mockingboard_setup.s"
.include "interrupt_handler.s"
; if you're self patching, detect has to be after interrupt_handler.s
.include "pt3_lib_mockingboard_detect.s"
.include "visual.s"
;=============
; include song
;=============
.align 256 ; must be on page boundary
; this can be fixed but some changes would have
; to be made throughout the player code
song:
.incbin "music/dya_dance_1.pt3"
;.incbin "../pt3_player/music/EA.PT3"
.align 256
song2:
.incbin "music/dya_dance_2.pt3"
;.incbin "../pt3_player/music/EA.PT3"