122 lines
1.9 KiB
ArmAsm
122 lines
1.9 KiB
ArmAsm
; Build as GBS music file
|
|
|
|
.memoryMap
|
|
defaultSlot 0
|
|
slot 0 $3000 size $1000
|
|
slot 1 $C000 size $1000
|
|
.endMe
|
|
|
|
.romBankSize $1000
|
|
.romBanks 2
|
|
|
|
|
|
;;;; GBS music file header
|
|
|
|
.byte "GBS"
|
|
.byte 1 ; vers
|
|
.byte 1 ; songs
|
|
.byte 1 ; first song
|
|
.word load_addr
|
|
.word reset
|
|
.word gbs_play
|
|
.word std_stack
|
|
.byte 0,0 ; timer
|
|
.ds $60,0
|
|
load_addr:
|
|
|
|
; WLA assumes we're building ROM and messes
|
|
; with bytes at the beginning, so skip them.
|
|
.ds $100,0
|
|
|
|
|
|
;;;; Shell
|
|
|
|
.include "runtime.s"
|
|
|
|
init_runtime:
|
|
ld a,$01 ; Identify as DMG hardware
|
|
ld (gb_id),a
|
|
.ifdef TEST_NAME
|
|
print_str TEST_NAME,newline,newline
|
|
.endif
|
|
ret
|
|
|
|
std_print:
|
|
sta SB
|
|
wreg SC,$81
|
|
delay 2304
|
|
ret
|
|
|
|
post_exit:
|
|
call play_byte
|
|
forever:
|
|
wreg NR52,0 ; sound off
|
|
- jp -
|
|
|
|
.ifndef CUSTOM_RESET
|
|
gbs_play:
|
|
.endif
|
|
console_flush:
|
|
console_normal:
|
|
console_inverse:
|
|
console_set_mode:
|
|
ret
|
|
|
|
; Reports A in binary as high and low tones, with
|
|
; leading low tone for reference. Omits leading
|
|
; zeroes.
|
|
; Preserved: AF, BC, DE, HL
|
|
play_byte:
|
|
push af
|
|
push hl
|
|
|
|
; HL = (A << 1) | 1
|
|
scf
|
|
rla
|
|
ld l,a
|
|
ld h,0
|
|
rl h
|
|
|
|
; Shift left until next-to-top bit is 1
|
|
- add hl,hl
|
|
bit 6,h
|
|
jr z,-
|
|
|
|
; Reset sound
|
|
delay_msec 400
|
|
wreg NR52,0 ; sound off
|
|
wreg NR52,$80 ; sound on
|
|
wreg NR51,$FF ; mono
|
|
wreg NR50,$77 ; volume
|
|
|
|
- add hl,hl
|
|
|
|
; Low or high pitch based on bit shifted out
|
|
; of HL
|
|
ld a,0
|
|
jr nc,+
|
|
ld a,$FF
|
|
+ sta NR23
|
|
|
|
; Play short tone
|
|
wreg NR21,$A0
|
|
wreg NR22,$F0
|
|
wreg NR24,$86
|
|
delay_msec 75
|
|
wreg NR22,0
|
|
wreg NR23,$F8
|
|
wreg NR24,$87
|
|
delay_msec 200
|
|
|
|
; Loop until HL = $8000
|
|
ld a,h
|
|
xor $80
|
|
or l
|
|
jr nz,-
|
|
|
|
pop hl
|
|
pop af
|
|
ret
|
|
|
|
.ends
|