dos33fsprogs/vaporlock/doubledouble/static.s
2023-05-15 14:10:16 -04:00

444 lines
7.3 KiB
ArmAsm

; Double Hi-res / Double lo-res mode switch fun
; by Vince `deater` Weaver
.include "zp.inc"
.include "hardware.inc"
double:
;================================
; detect model
;================================
jsr detect_appleii_model
;======================
; machine workarounds
;======================
; mostly IIgs
;===================
; thanks to 4am who provided this code from Total Replay
lda ROM_MACHINEID
cmp #$06
bne not_a_iigs
sec
jsr $FE1F ; check for IIgs
bcs not_a_iigs
; gr/text page2 handling broken on early IIgs models
; this enables the workaround
jsr ROM_TEXT2COPY ; set alternate display mode on IIgs
cli ; enable VBL interrupts
; also set background color to black instead of blue
lda NEWVIDEO
and #%00011111 ; bit 7 = 0 -> IIgs Apple II-compat video modes
; bit 6 = 0 -> IIgs 128K memory map same as IIe
; bit 5 = 0 -> IIgs DHGR is color, not mono
; bits 0-4 unchanged
sta NEWVIDEO
lda #$F0
sta TBCOLOR ; white text on black background
lda #$00
sta CLOCKCTL ; black border
sta CLOCKCTL ; set twice for VidHD
not_a_iigs:
;================================
; setup vblank routine
;================================
lda APPLEII_MODEL
cmp #'G'
beq setup_vblank_iigs
cmp #'C'
beq setup_vblank_iic
setup_vblank_iie:
lda #<wait_vblank_iie
sta vblank_smc+1
lda #>wait_vblank_iie
sta vblank_smc+2
jmp done_setup_vblank
setup_vblank_iigs:
lda #<wait_vblank_iigs
sta vblank_smc+1
lda #>wait_vblank_iigs
sta vblank_smc+2
jmp done_setup_vblank
setup_vblank_iic:
lda #<wait_vblank_iic
sta vblank_smc+1
lda #>wait_vblank_iic
sta vblank_smc+2
jmp done_setup_vblank
done_setup_vblank:
;====================
; show title message
;====================
lda #0
sta DRAW_PAGE
jsr show_title
;===================
; print config
;===================
lda #<config_string
sta OUTL
lda #>config_string
sta OUTH
jsr move_and_print
; print detected model
lda APPLEII_MODEL
ora #$80
sta $7d0+8 ; 23,8
; if GS print the extra S
cmp #'G'|$80
bne not_gs
lda #'S'|$80
sta $7d0+9
not_gs:
lda #0
sta SOUND_STATUS ; clear out, sound enabled
;===========================================
; skip checks if open-apple being held down
lda $C061
and #$80 ; only bit 7 is affected
bne skip_all_checks ; rest is floating bus
;===================================
; Detect Mockingboard
;===================================
PT3_ENABLE_APPLE_IIC = 1
; detect mockingboard
jsr mockingboard_detect
bcc mockingboard_notfound
mockingboard_found:
; print detected location
lda #'S'+$80 ; change NO to slot
sta $7d0+30
lda MB_ADDR_H ; $C4 = 4, want $B4 1100 -> 1011
and #$87
ora #$30
sta $7d0+31 ; 23,31
lda SOUND_STATUS ; indicate we have mockingboard
ora #SOUND_MOCKINGBOARD
sta SOUND_STATUS
;===========================
; patch mockingboard
;===========================
jsr mockingboard_patch ; patch to work in slots other than 4?
;============================
; Init the Mockingboard
;============================
jsr mockingboard_init
jsr reset_ay_both
jsr clear_ay_both
;==============
; set up music
;==============
lda #<fighting_zx02
sta ZX0_src
lda #>fighting_zx02
sta ZX0_src+1
lda #$b0 ; decompress at $b000
jsr full_decomp
PT3_LOC = $b000
;==================
; init song
;==================
PT3_DISABLE_FREQ_CONVERSION = 1
PT3_DISABLE_SWITCHABLE_FREQ_CONVERSION = 1
jsr pt3_init_song
lda #0
sta DONE_PLAYING
lda #1
sta LOOP
mockingboard_notfound:
skip_all_checks:
;=======================
; show title for a bit
;=======================
; you can skip with keypress
lda #25
jsr wait_a_bit
;================================
; Clear screen and setup graphics
;================================
.include "setup_graphics.s"
;=================================
; main static loop
;=================================
; each line 65 cycles (25 hblank+40 bytes)
double_loop:
;====================
; play music
; in theory should be less than the 4550 cycles we have
lda SOUND_STATUS ; check if we have mockingboard
and #SOUND_MOCKINGBOARD
beq no_music_for_you
jsr fake_interrupt
no_music_for_you:
; note, coming out of vblank routines might be
; 8-12 cycles in already
vblank_smc:
jsr $ffff
; 3 LINES 80-COL TEXT AN3=0 PAGE=2
; intentionally a few cycles short as vblank returns+ a few cycles
bit PAGE2
bit SET_TEXT ; 4
; wait 24 scanlines lines
; (24*65)-8 = 1560-8 = 1552
jsr delay_1552
; 3 LINES 40-COL TEXT AN3=0 PAGE=2
nop
nop
nop
nop
sta CLR80COL ; 4
bit SET_TEXT ; 4
jsr delay_1552
; 3 LINES 40-col LORES AN3=0 PAGE=1
nop
nop
nop
nop
bit PAGE1 ; 4
bit SET_GR ; 4
jsr delay_1552
; 3 LINES 80-col DLORES AN3=0 PAGE=1
nop
nop
sta LORES
sta SET80COL ; 4
sta CLRAN3 ; 4
jsr delay_1552
; 3 LINES 80-col DLORES AN3=0 PAGE=1
nop
nop
nop
nop
nop
nop
nop
nop
jsr delay_1552
; 3 lines HIRES 40-COL AN3=1 PAGE=2
sta CLR80COL
sta HIRES ; 4
sta PAGE2 ; 4
sta SETAN3
jsr delay_1552
; 3 lines Double-hires AN3=0 PAGE=1
sta PAGE1
bit HIRES
sta SET80COL ; 4 ; set 80 column mode
sta CLRAN3 ; 4 ; doublehireson
jsr delay_1552
; 3 line Double-HIRES
nop
nop
nop
nop
nop
nop
nop
nop
jsr delay_1552
jmp double_loop ; 3
;=======================================================
; need to align because if we straddle a page boundary
; the time counts end up off
.align $100
.include "vblank.s"
; actually want 1552-12 (6 each for jsr/rts)
; 1540
; Try X=15 Y=19 cycles=1540
; 1532
; Try X=1 Y=139 cycles=1530
delay_1552:
nop
ldy #139 ; 2
loop5: ldx #1 ; 2
loop6: dex ; 2
bne loop6 ; 2nt/3
dey ; 2
bne loop5 ; 2nt/3
rts
wait_until_keypress:
lda KEYBOARD
bpl wait_until_keypress
bit KEYRESET
rts
.include "pt3_lib_detect_model.s"
.include "pt3_lib_core.s"
.include "pt3_lib_init.s"
.include "pt3_lib_mockingboard_setup.s"
.include "interrupt_handler.s"
.include "pt3_lib_mockingboard_detect.s"
.include "pt3_lib_mockingboard_patch.s"
.include "zx02_optim.s"
.include "copy_400.s"
image_hgr:
.incbin "graphics/sworg_hgr.hgr.zx02"
image_dhgr_aux:
.incbin "graphics/sworg_dhgr.aux.zx02"
image_dhgr_bin:
.incbin "graphics/sworg_dhgr.bin.zx02"
image_dgr_aux:
.incbin "graphics/sworg_dgr.aux.zx02"
image_dgr_main:
.incbin "graphics/sworg_dgr.main.zx02"
a2_string:
; 012345678901234567 8 9
.byte "Apple II Forever!! ",'@'+$80," "
.byte "Apple II Forever! ",'@'+$80," ",0
; .byte "DOUBLE DOUBLE by DEATER / DsR ",0
top_string_aux:
.byte "DUL OBEb ETR/DR",0
top_string_main:
.byte "OBEDUL yDAE s ",0
.byte "DOUBLE DOUBLE by DEATER / DsR ",0
; .byte " Graphics based on art by @YYYYYYYYY Music: N. OOOOOOO",0
config_string:
; 0123456789012345678901234567890123456789
.byte 0,23,"APPLE II? MOCKINGBOARD: NO ",0
.include "gr_offsets.s"
.include "text_print.s"
.include "title.s"
.include "gr_fast_clear.s"
.include "wait_a_bit.s"
.include "wait.s"
;.include "load_music.s"
fighting_zx02:
.incbin "music/fighting.zx02"