2019-09-24 19:50:40 +00:00
|
|
|
;License:MIT
|
2020-03-13 00:03:37 +00:00
|
|
|
;(c) 2018-2020 by 4am
|
2019-09-24 19:50:40 +00:00
|
|
|
;
|
|
|
|
; functions for managing which HGR page is showing, and doing things on the other one
|
|
|
|
;
|
|
|
|
; - GetOffscreenAddress
|
|
|
|
; - LoadTitleOffscreen
|
|
|
|
; - LoadCoverOffscreen
|
2019-09-26 17:46:13 +00:00
|
|
|
; - LoadHelpOffscreen
|
2019-09-24 19:50:40 +00:00
|
|
|
; - LoadGameTitleOffscreen
|
2021-11-16 01:25:32 +00:00
|
|
|
; - UnpackHGRTitle
|
2019-09-28 12:35:48 +00:00
|
|
|
; - ResyncPage
|
2019-09-24 19:50:40 +00:00
|
|
|
; - ShowOtherPage
|
2021-11-16 01:25:32 +00:00
|
|
|
; - ShowOtherDHGRPage
|
2019-09-24 19:50:40 +00:00
|
|
|
; - ToggleOffscreenPage
|
2020-03-14 00:11:59 +00:00
|
|
|
; - ClearScreens
|
2019-09-24 19:50:40 +00:00
|
|
|
; - ClearOffscreen
|
|
|
|
; - ClearHGR1
|
2019-10-10 01:02:46 +00:00
|
|
|
; - ClearMem
|
2019-09-24 19:50:40 +00:00
|
|
|
;
|
|
|
|
; Public variables
|
|
|
|
; - OffscreenPage
|
|
|
|
;
|
|
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
; GetOffscreenAddress
|
|
|
|
; get high byte of HGR page that is currently not showing
|
|
|
|
;
|
|
|
|
; in: none
|
|
|
|
; out: A = high byte of offscreen HGR page (#$20 or #$40)
|
|
|
|
; preserves X/Y
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
GetOffscreenAddress
|
2019-12-03 18:02:39 +00:00
|
|
|
Ignore = * + 1 ; discard IRQs, particularly on the IIc
|
2019-10-10 01:02:46 +00:00
|
|
|
lda #$40
|
2019-10-09 02:25:22 +00:00
|
|
|
OffscreenPage = * + 1
|
2019-10-10 01:02:46 +00:00
|
|
|
bne + ; SMC
|
2019-10-09 02:25:22 +00:00
|
|
|
; 0 = currently showing HGR page 2
|
|
|
|
; (so offscreen is page 1 @ $2000)
|
|
|
|
; 1 = currently showing HGR page 1
|
|
|
|
; (so offscreen is page 2 @ $4000)
|
2019-10-10 01:02:46 +00:00
|
|
|
+ lsr
|
2019-09-24 19:50:40 +00:00
|
|
|
rts
|
|
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
; LoadTitleOffscreen
|
|
|
|
; load title screen in the HGR page that is currently not showing
|
|
|
|
;
|
|
|
|
; in: none
|
|
|
|
; out: all flags and registers clobbered
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
LoadTitleOffscreen
|
2021-11-17 02:44:30 +00:00
|
|
|
lda #<kTitleRecord
|
2019-10-10 04:26:18 +00:00
|
|
|
+HIDE_NEXT_2_BYTES
|
2019-09-26 17:46:13 +00:00
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
; LoadHelpOffscreen
|
|
|
|
; load help screen in the HGR page that is currently not showing
|
|
|
|
;
|
|
|
|
; in: none
|
|
|
|
; out: all flags and registers clobbered
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
LoadHelpOffscreen
|
2021-11-17 02:44:30 +00:00
|
|
|
lda #<kHelpBackgroundRecord
|
2019-10-10 04:26:18 +00:00
|
|
|
+HIDE_NEXT_2_BYTES
|
2019-09-24 19:50:40 +00:00
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
; LoadCoverOffscreen
|
|
|
|
; load cover screen in the HGR page that is currently not showing
|
|
|
|
;
|
|
|
|
; in: none
|
|
|
|
; out: all flags and registers clobbered
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
LoadCoverOffscreen
|
2021-11-17 02:44:30 +00:00
|
|
|
lda #<kCoverRecord
|
2019-09-26 17:46:13 +00:00
|
|
|
LoadOffscreenFromAY
|
2021-11-17 02:44:30 +00:00
|
|
|
sta @indexlo
|
2020-03-09 22:05:01 +00:00
|
|
|
jsr ForceHGRMode
|
2019-09-24 19:50:40 +00:00
|
|
|
jsr GetOffscreenAddress
|
2021-11-17 02:44:30 +00:00
|
|
|
sta @addrhi
|
|
|
|
jsr LoadIndexedFile
|
2019-09-24 19:50:40 +00:00
|
|
|
!byte $00
|
2021-11-17 02:44:30 +00:00
|
|
|
@addrhi !byte $FD ; SMC
|
|
|
|
@indexlo !byte $FD ; SMC
|
|
|
|
!byte >kCoverRecord ; all of these are on the same page
|
2019-09-24 19:50:40 +00:00
|
|
|
rts
|
|
|
|
|
|
|
|
LoadGameTitleOffscreen
|
2021-10-28 00:08:03 +00:00
|
|
|
; in: gGameToLaunch = index into gSearchStore (word)
|
2021-10-28 05:28:20 +00:00
|
|
|
jsr GetGameToLaunch
|
2021-11-09 17:41:15 +00:00
|
|
|
jsr okvs_next_field
|
|
|
|
jsr okvs_next_field_PTR_is_already_set
|
2021-10-28 00:08:03 +00:00
|
|
|
; (PTR) -> length-prefixed game info bitfield
|
2020-03-09 21:24:30 +00:00
|
|
|
; Y = 0
|
2021-10-28 00:08:03 +00:00
|
|
|
iny ; Y = 1
|
|
|
|
lda (PTR), y ; A = game info bitfield
|
2021-11-16 01:25:32 +00:00
|
|
|
bpl .LoadHGRGameTitleOffscreen ; bit 7 = 1 if game has DHGR title, 0 if HGR title
|
|
|
|
|
|
|
|
jsr SwitchToBank2
|
|
|
|
- iny
|
|
|
|
lda (PTR), y
|
|
|
|
sta OKVS_CACHE-1, y
|
|
|
|
cpy #6
|
|
|
|
bne -
|
|
|
|
LoadIndexedDHRFile
|
|
|
|
jsr SwitchToBank2
|
|
|
|
lda #0
|
|
|
|
sta OKVS_CACHE
|
|
|
|
lda #$20 ; load first $2000 bytes into auxiliary memory
|
|
|
|
sta OKVS_CACHE + 5
|
2019-09-24 19:50:40 +00:00
|
|
|
jsr GetOffscreenAddress
|
2021-11-16 01:25:32 +00:00
|
|
|
sta @dhgr_addr_aux + 1
|
|
|
|
sta @dhgr_addr_main + 1
|
|
|
|
jsr LoadAuxIndexedFile
|
|
|
|
@dhgr_addr_aux
|
|
|
|
!word $FD00 ; SMC high byte
|
|
|
|
!word OKVS_CACHE
|
|
|
|
jsr SwitchToBank2
|
|
|
|
lda OKVS_CACHE + 2 ; offset += $2000 (note: stored in big-endian)
|
|
|
|
clc
|
|
|
|
adc #$20
|
|
|
|
sta OKVS_CACHE + 2
|
|
|
|
bcc +
|
|
|
|
inc OKVS_CACHE + 1
|
|
|
|
+ jsr LoadIndexedFile ; load next $2000 bytes into main memory
|
|
|
|
@dhgr_addr_main
|
|
|
|
!word $FD00 ; SMC high byte
|
|
|
|
!word OKVS_CACHE
|
|
|
|
rts
|
2021-11-13 01:52:25 +00:00
|
|
|
|
2021-11-16 01:25:32 +00:00
|
|
|
.LoadHGRGameTitleOffscreen
|
|
|
|
jsr ForceHGRMode
|
|
|
|
jsr GetOffscreenAddress
|
|
|
|
sta @hgr_addr + 1
|
2021-11-13 01:52:25 +00:00
|
|
|
eor #$1F
|
|
|
|
sta @poke+2
|
2021-11-14 16:00:57 +00:00
|
|
|
sta @peek+2
|
2021-11-16 01:25:32 +00:00
|
|
|
@poke sta $3FFD ; SMC high byte to clear screen hole before load
|
|
|
|
+LD16 PTR
|
|
|
|
+ST16 @hgrIndexRecordPtr
|
|
|
|
jsr LoadIndexedFile
|
|
|
|
@hgr_addr
|
|
|
|
!word $FD00 ; SMC high byte
|
|
|
|
@hgrIndexRecordPtr
|
|
|
|
!word $FDFD ; SMC
|
|
|
|
@peek lda $3FFD ; SMC high byte
|
2021-11-13 01:52:25 +00:00
|
|
|
cmp #$4C ; Check if screen hole now contains a JMP
|
2021-11-14 16:00:57 +00:00
|
|
|
beq OFFSCREENRTS ; if so, file was not packed, so skip unpack
|
2021-11-16 01:25:32 +00:00
|
|
|
; /!\ execution falls through here to UnpackHGRTitle
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
; UnpackHGRTitle
|
|
|
|
; unpack data from screen holes of the off screen HGR page
|
|
|
|
;
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
UnpackHGRTitle
|
|
|
|
jsr GetOffscreenAddress
|
|
|
|
sta src+2
|
|
|
|
ora #$1E
|
|
|
|
sta dest+2
|
|
|
|
lda #$00
|
|
|
|
sta src+1
|
|
|
|
sta dest+1
|
|
|
|
lda #3
|
|
|
|
sta $E0
|
|
|
|
loop
|
|
|
|
ldx #0
|
|
|
|
-- ldy #$78
|
|
|
|
src
|
|
|
|
- lda $0000,y ;smc
|
|
|
|
dest
|
|
|
|
sta $0000,x ;smc
|
|
|
|
inx
|
|
|
|
iny
|
|
|
|
bpl -
|
|
|
|
tya ; y = #$80
|
|
|
|
eor src+1
|
|
|
|
sta src+1
|
|
|
|
bne +
|
|
|
|
inc src+2
|
|
|
|
+ cpx #$78
|
|
|
|
bne --
|
|
|
|
lda dest+1
|
|
|
|
eor #$80
|
|
|
|
sta dest+1
|
|
|
|
bne +
|
|
|
|
inc dest+2
|
|
|
|
+ dec $E0
|
|
|
|
bpl loop
|
2021-11-14 16:00:57 +00:00
|
|
|
OFFSCREENRTS
|
2019-09-24 19:50:40 +00:00
|
|
|
rts
|
|
|
|
|
2020-03-14 00:11:59 +00:00
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
; ClearScreens
|
|
|
|
; clear and display text screen and then clear both hires screens
|
|
|
|
; (in this order so that the erasing isn't visible)
|
|
|
|
;
|
|
|
|
; in: none
|
|
|
|
; out: $400..$7FF and $2000..$5FFF cleared
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
ClearScreens
|
|
|
|
jsr Home
|
|
|
|
lda #$20 ; clear both hi-res pages
|
|
|
|
ldx #$40 ; to flash previous bits of the launcher UI)
|
|
|
|
bne ClearMem ; always
|
|
|
|
|
2019-09-24 19:50:40 +00:00
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
; ClearOffscreen
|
|
|
|
; clear $2000..$3FFF or $4000..$5FFF, depending on which HGR page is not
|
|
|
|
; visible right now
|
|
|
|
; does not change HGR mode
|
|
|
|
;
|
|
|
|
; in: none
|
|
|
|
; out: $2000..$3FFF or $4000..$5FFF cleared
|
2019-10-08 23:40:38 +00:00
|
|
|
; A = #$80
|
|
|
|
; X = #$00
|
|
|
|
; Y = #$00
|
2019-09-24 19:50:40 +00:00
|
|
|
; Z = 1
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
ClearOffscreen
|
|
|
|
jsr GetOffscreenAddress
|
|
|
|
+HIDE_NEXT_2_BYTES
|
|
|
|
ClearHGR1
|
2019-09-26 03:01:59 +00:00
|
|
|
lda #$20 ; note to self: LDX #$20 can't move here
|
2019-09-24 19:50:40 +00:00
|
|
|
ldx #$20
|
2019-10-10 01:02:46 +00:00
|
|
|
ClearMem
|
2020-03-13 00:03:37 +00:00
|
|
|
ldy #$2C ; BIT
|
|
|
|
bne + ; always
|
|
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
; CopyHGR
|
|
|
|
;
|
|
|
|
; in: source and destination page pointers set
|
|
|
|
; out: all registers clobbered
|
|
|
|
; 8kb memory region duplicated
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
CopyHGR
|
|
|
|
ldx #$20
|
2021-12-11 02:50:10 +00:00
|
|
|
ldy #$B9 ; LDA $0000,Y opcode
|
2020-03-13 00:03:37 +00:00
|
|
|
+ sty PageFrom
|
|
|
|
sta PageTo+2
|
2021-12-11 02:50:10 +00:00
|
|
|
ClearToBlack
|
2020-03-15 23:01:58 +00:00
|
|
|
lda #$00
|
2020-03-13 00:03:37 +00:00
|
|
|
ClearGR
|
2019-09-24 19:50:40 +00:00
|
|
|
ldy #0
|
2021-12-11 02:50:10 +00:00
|
|
|
PageFrom lda $FD00,y ; SMC address high byte, also SMC opcode (might be BIT)
|
|
|
|
PageTo sta $FD00,y ; SMC address high byte
|
2019-09-24 19:50:40 +00:00
|
|
|
iny
|
2020-03-13 00:03:37 +00:00
|
|
|
bne PageFrom
|
|
|
|
inc PageFrom+2
|
|
|
|
inc PageTo+2
|
2019-09-24 19:50:40 +00:00
|
|
|
dex
|
2020-03-13 00:03:37 +00:00
|
|
|
bne PageFrom
|
2020-03-15 15:23:56 +00:00
|
|
|
sta READMAINMEM
|
2019-09-24 19:50:40 +00:00
|
|
|
rts
|
|
|
|
|
2019-09-28 12:35:48 +00:00
|
|
|
ResyncPage
|
|
|
|
jsr ToggleOffscreenPage
|
2019-10-08 17:19:20 +00:00
|
|
|
; /!\ execution falls through here to ShowOtherPage
|
2019-09-24 19:50:40 +00:00
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
; ShowOtherPage
|
|
|
|
; switch to the HGR page that is not currently showing
|
|
|
|
;
|
|
|
|
; in: none
|
|
|
|
; out: A = new value of OffscreenPage
|
|
|
|
; preserves X/Y
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
ShowOtherPage
|
|
|
|
jsr ToggleOffscreenPage
|
|
|
|
bne +
|
|
|
|
bit PAGE2 ; show page 2
|
|
|
|
rts
|
|
|
|
+ bit PAGE1 ; show page 1
|
|
|
|
rts
|
|
|
|
|
2021-11-16 01:25:32 +00:00
|
|
|
ShowOtherDHGRPage
|
|
|
|
jsr ToggleOffscreenPage
|
|
|
|
jmp DHGRMode
|
|
|
|
|
2019-09-24 19:50:40 +00:00
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
; ToggleOffscreenPage
|
|
|
|
; switch the internal variable that tracks which HGR page is showing
|
|
|
|
; (does not affect screen)
|
|
|
|
;
|
|
|
|
; in: none
|
|
|
|
; out: A = new value of OffscreenPage
|
|
|
|
; preserves X/Y
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
ToggleOffscreenPage
|
|
|
|
lda OffscreenPage
|
|
|
|
eor #$01
|
|
|
|
sta OffscreenPage
|
|
|
|
rts
|