; ======================================================================
; XANDRIAN LABS  /  CS617 CHAPTER 02
; ======================================================================
; Program    : Chapter 02 Sorting
; Source     : app/ui.inc
; Revision   : x0.31a-dev / comment-harmonization pass
; Target     : Casio PB-2000C / HD61700
; Role       : Render splash, menus and configuration fields.
; Interface  : INIT_SETUP, DRAW_SETUP, SHOW_SPLASH, PRINTZ, PUTC.
; Maintainer : Xandrian Labs
; ----------------------------------------------------------------------
; This module owns the firmware LCD helper wrappers.
; ======================================================================

CYCLE_PAT:
        PRE     IX,WS_PAT
        LD      $9,(IX+$SX)
        AD      $9,$SY
        SBC     $9,3
        JR      C,CP_STORE
        LD      $9,0
CP_STORE:
        ST      $9,(IX+$SX)
        RTN

; PURPOSE : Load initial n/m/pattern and editor defaults.
; EFFECTS : Resets configuration and UI working state.
INIT_SETUP:
        PRE     IX,WS_NBUF
        LD      $0,"1"
        ST      $0,(IX+0)
        LD      $0,"6"
        ST      $0,(IX+1)

        PRE     IX,WS_NLEN
        LD      $0,2
        ST      $0,(IX+$SX)

        PRE     IX,WS_MBUF
        LD      $0,"1"
        ST      $0,(IX+0)

        PRE     IX,WS_MLEN
        LD      $0,1
        ST      $0,(IX+$SX)

        PRE     IX,WS_PAT
        LD      $0,PAT_ORD
        ST      $0,(IX+$SX)

        PRE     IX,WS_CUR
        LD      $0,1
        ST      $0,(IX+$SX)

        PRE     IX,WS_TICK
        LD      $0,0
        ST      $0,(IX+$SX)
        PRE     IX,WS_EDIT
        ST      $0,(IX+$SX)
        PRE     IX,WS_EPOS
        ST      $0,(IX+$SX)
        PRE     IX,WS_NEW
        ST      $0,(IX+$SX)

        SBW     $0,$0
        SBW     $2,$2
        PRE     IX,WS_NVAL
        STM     $0,(IX+$SX),4
        PRE     IX,WS_MVAL
        STM     $0,(IX+$SX),4

        PRE     IX,WS_ERR
        ST      $0,(IX+$SX)
        RTN

DRAW_CFG:
        LD      $6,$SX
        PRE     IZ,TXT_N
        CAL     PRINTZ

        PRE     IX,WS_NLEN
        LD      $13,(IX+$SX)
        PRE     IX,WS_NBUF
        CAL     PRINT_RAM

        LD      $6,&H20
        PRE     IZ,TXT_M
        CAL     PRINTZ

        PRE     IX,WS_MLEN
        LD      $13,(IX+$SX)
        PRE     IX,WS_MBUF
        CAL     PRINT_RAM

        LD      $6,&H40
        PRE     IZ,TXT_INPUT
        CAL     PRINTZ
        CAL     PRINT_PAT
        RTN

; PURPOSE : Draw current setup values and the FK legend.
; EFFECTS : Changes the LCD, not the underlying DATA.
DRAW_SETUP:
        CAL     CLEAR_ALL
        CAL     DRAW_CFG
        LD      $6,&H60
        PRE     IZ,TXT_SETKEYS
        CAL     PRINTZ
        RTN

PRINT_RAM:
        AN      $13,$13
        RTN     Z
        LD      $12,0
PR_LOOP:
        SBC     $12,$13
        RTN     NC
        LD      $16,(IX+$12)
        CAL     PUTC
        AD      $12,$SY
        JR      PR_LOOP

PRINT_PAT:
        PRE     IX,WS_PAT
        LD      $9,(IX+$SX)

        AN      $9,$9
        JR      Z,PP_ORD

        SBC     $9,PAT_REV
        JR      Z,PP_REV

        PRE     IZ,TXT_SAME
        JP      PRINTZ

PP_ORD:
        PRE     IZ,TXT_ORDERED
        JP      PRINTZ

PP_REV:
        PRE     IZ,TXT_REVERSE
        JP      PRINTZ

SHOW_PH_REST:
        LD      $6,&H20
        PRE     IZ,TXT_PH1
        CAL     PRINTZ

        LD      $6,&H40
        PRE     IZ,TXT_PH2
        CAL     PRINTZ

        LD      $6,&H60
        PRE     IZ,TXT_PH3
        CAL     PRINTZ

        CAL     WAIT_EXE
        RTN

; PURPOSE : Present the application identity on the LCD.
SHOW_SPLASH:
        LD      $6,$SX
        PRE     IZ,TXT_SPL0
        CAL     PRINTZ

        LD      $6,&H20
        PRE     IZ,TXT_SPL1
        CAL     PRINTZ

        LD      $6,&H40
        PRE     IZ,TXT_SPL2
        CAL     PRINTZ

        LD      $6,&H60
        PRE     IZ,TXT_SPL3
        CAL     PRINTZ
        RTN

WAIT_SPLASH:
        CAL     SPLASH_TM
        LD      $22,$8
        LD      $23,0
WSP_LOOP:
        CAL     FW_OFFCHK
        CAL     SPLASH_TM
        SBC     $8,$22
        JR      Z,WSP_LOOP
        LD      $22,$8
        AD      $23,$SY
        SBC     $23,3
        JR      NZ,WSP_LOOP
        RTN

SPLASH_TM:
        GST     TM,$8
STM_AGAIN:
        LD      $9,$8
        GST     TM,$8
        SBC     $8,$9
        JR      NZ,STM_AGAIN
        LD      $9,0
        RTN

WAIT_EXE:
WE_WAIT:
        CAL     INKEY
        AN      $17,$17
        JR      Z,WE_WAIT

        SBC     $0,&H0D
        JR      Z,WE_EXE

WE_IGNORE:
        CAL     INKEY
        AN      $17,$17
        JR      NZ,WE_IGNORE
        JR      WE_WAIT

WE_EXE:
        CAL     INKEY
        AN      $17,$17
        JR      NZ,WE_EXE
        RTN

WAIT_RELEASE:
WR_LOOP:
        CAL     INKEY
        AN      $17,$17
        JR      NZ,WR_LOOP
        RTN

FW_OFFCHK:
        PST     UA,&H54
        CAL     OFFCHK
        PST     UA,&H55
        RTN

CLEAR_ALL:
        LD      $6,$SX
        LD      $8,128
        PST     UA,&H54
        CAL     &H018D
        PST     UA,&H55
        RTN

; PURPOSE : Send one character through the firmware LCD path.
PUTC:
        LD      $7,$16
        LD      $0,$7
        DIU     $7
        DID     $0
        OR      $7,$SZ
        PST     UA,&H54
        CAL     &H0197
        PST     UA,&H55
        RTN

; PURPOSE : Print zero-terminated text at the current LCD row.
PRINTZ:
        LDI     $7,(IZ+$SX)
        LD      $0,$7
        DIU     $7
        DID     $0
        OR      $7,$SZ
        RTN     Z
        PST     UA,&H54
        CAL     &H0197
        PST     UA,&H55
        JR      PRINTZ

SHOW_BSORT:
        CAL     CLEAR_ALL
        LD      $6,$SX
        PRE     IZ,TXT_BUBBLE
        CAL     PRINTZ
        JP      SHOW_SORTMSG

SHOW_SSORT:
        CAL     CLEAR_ALL
        LD      $6,$SX
        PRE     IZ,TXT_SHELL
        CAL     PRINTZ
        JP      SHOW_SORTMSG

SHOW_XSORT:
        CAL     CLEAR_ALL
        LD      $6,$SX
        PRE     IZ,TXT_SELECT
        CAL     PRINTZ

SHOW_SORTMSG:
        LD      $6,&H20
        PRE     IZ,TXT_SORTING
        CAL     PRINTZ
        RTN

; end of include
