;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-1) - lda @start,x sta $106,x dex bpl - jmp $106 @start ; this will be run from main memory +READ_ROM_NO_WRITE sta CLR80VID ; get out of DHGR mode sta DHIRESOFF ; get out of DHGR mode jsr ROM_TEXT ; TEXT jsr ROM_HOME ; HOME +READ_RAM1_WRITE_RAM1 rts @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 sta SET80VID sta DHIRESON bit PAGE1 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 #1 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