;License:MIT ;(c) 2018-9 by 4am ; ; miscellaneous UI functions ; ; Public functions ; - ClearScreens ; - Home ; - BlankDHGR ; - IsSearchKey ; - IsUpDownOrRightArrow ; ;------------------------------------------------------------------------------ ; 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: $0106..$011F clobbered ;------------------------------------------------------------------------------ ClearScreens jsr Home lda #$20 ; clear both hi-res pages sta @clear+2 ; (in case game loader shows them, we don't want ldx #$40 ; to flash previous bits of the launcher UI) ldy #$00 tya @clear sta $FD00,y ; SMC iny bne @clear inc @clear+2 dex bne @clear rts ;------------------------------------------------------------------------------ ; Home ; clear and display text screen (HARDER THAN IT SOUNDS) ; ; in: none ; out: $0106..$011F clobbered ;------------------------------------------------------------------------------ Home lda MachineStatus and #SUPPORTS_SHR beq @noSHR lda NEWVIDEO and #%00011111 ; bit 7 = 0 -> IIgs Apple II-compatible video modes ; bit 6 = 0 -> IIgs 128K memory map is the same as the Apple IIe ; bit 5 = 0 -> IIgs DHGR is color, not monochrome ; 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 @noSHR ldx #(.end-@start) - lda @start-1,x sta $105,x dex bne - stx gMachineInDHGRMode jmp $106 @start ; this will be run from main memory lda #$A0 ; clear text screen page 1 ldx #$77 - sta $400,x sta $480,x sta $500,x sta $580,x sta $600,x sta $680,x sta $700,x sta $780,x dex bpl - sta DHIRESOFF ; get out of DHGR mode sta CLR80VID ; get out of DHGR mode ; write-order matters for RGB-card lda PAGE1 lda $C051 ; now show it SwitchToBank1 +READ_RAM1_WRITE_RAM1 rts ; and return to caller .end ;------------------------------------------------------------------------------ ; BlankDHGR ; clear and show DHGR page 1 without flickering ; ; in: none ; out: text page clobbered (but screen holes preserved) ; $2000..$3FFF/main and /aux cleared ;------------------------------------------------------------------------------ BlankDHGR jsr Home jsr ClearHGR1 ; clear hi-res screen 1 sta WRITEAUXMEM jsr ClearHGR1 ; clear hi-res screen 1 in auxmem sta WRITEMAINMEM ; magic sequence to set colour mode on an RGB card ; SET80VID clears the RGB-card shift-register ; DHIRESON/OFF shifts that bit into the mode register ; we do that twice because the mode register is two bits wide ; we need mode 00 for colour sta SET80VID sta DHIRESON sta DHIRESOFF sta DHIRESON sta DHIRESOFF sta DHIRESON ; then turn DHGR on bit PAGE1 lda #1 sta OffscreenPage sta gMachineInDHGRMode jmp HGRMode ;------------------------------------------------------------------------------ ; IsSearchKey ; test whether accumulator contains a key that might trigger a new textrank ; search ; ; in: A = key ; out: A &= 0x7F ; Y preserved ; X clobbered ; Z = 1 and C = 0 if this is a search key ; Z = 0 if this is not a search key ;------------------------------------------------------------------------------ IsSearchKey and #$7F ; strip high bit for search characters cmp #$30 ; control keys and punctuation ignored bcc @badkey cmp #$3A ; numbers are good input bcc @goodkey cmp #$41 ; more punctuation (also ignored) bcc @badkey cmp #$5B ; uppercase letters are good input bcs + ora #$20 ; convert uppercase letters to lowercase @goodkey ldx #0 rts + cmp #$61 ; more punctuation (also ignored) bcc @badkey cmp #$7B ; lowercase letters are good input bcc @goodkey @badkey ldx #kInputError ; also #kSoftBell rts ;------------------------------------------------------------------------------ ; IsUpDownOrRightArrow ; test whether accumulator contains ASCII code for up, down, or right arrow ; search ; ; in: A = key ; out: all registers preserved ; Z = 1 if accumulator was one of those 3 keys ; Z = 0 otherwise ;------------------------------------------------------------------------------ IsUpDownOrRightArrow cmp #$8B ; up arrow beq @done cmp #$95 ; right arrow beq @done cmp #$8A ; down arrow @done rts