; CS617 CH08 Keystone guest r003 -- derived from frozen keystone 0.10.
; Original Keystone logic began at 0E80. This integrated module is NEW
; adapter code at 6000+, not byte-identical; preservation must be re-tested.
; keystoneROM.s r0.9 in keystone-10.zip remains frozen and untouched.
        ORG     &H6000
K8_ENTRY:
        PRE     SS,SSPTP
        PRE     US,USPTP
; Fresh app contract: reset C-ROM keyboard/display environment and clear.
        CAL     CH08_INIT
        CAL     CH08_ARM_BRK
        CAL     CH08_CLEAR
        LD      $6,$SX
        PRE     IZ,K8_L1
        CAL     CH08_PRINT
        LD      $6,&H20
        PRE     IZ,K8_L2
        CAL     CH08_PRINT
        LD      $6,&H60
        PRE     IZ,K8_INPUT
        CAL     CH08_PRINT
; Restore blinking row-four insertion cursor as in keystone 0.9.
        LD      $6,&H61
        CAL     K8_SETCUR
        CAL     &H0304
        CAL     &H0306
; C-ROM CRTKY owns modifier state; KEYMD initialized by CH08_INIT.
        LD      $11,1
K8_LOOP:
; CRTKY consumes sequential red S/CAPS/KANA and returns decoded key.
; Retain $11. BRSTR is registered once at launcher entry.
        PHS     $11
; Do not enter blocking C-ROM CRTKY until a non-BRK key is present.
; BRK at idle is handled directly in the selected application ROM.
K8_WAITRAW:
        CAL     CH08_RAWREADY
        SBC     $17,$SZ
        JR      Z,K8_WAITRAW
; No extra C-ROM call between card-side ready check and CRTKY.
        LDW     $28,CRTKY
        CAL     SYSCAL
        PST     UA,&H14
        PPS     $11
        LD      $14,$0
; MENU (decoded 9C) is shell-owned. Never enter printable editing.
; No splash on warm exit. C-ROM BRK fallback is reset, not warm.
        LD      $15,$14
        SBC     $15,&H9C
        JP      Z,CH08_WARM
        PST     UA,&H54
        PRE     IX,KEYMD
        LD      $13,(IX+$SX)
        PST     UA,&H14
        LD      $6,&H20
        PRE     IZ,K8_TKEY
        CAL     CH08_PRINT
        LD      $12,$14
        CAL     K8_SHOWHEX
        PRE     IZ,K8_TMODE
        CAL     CH08_PRINT
        LD      $12,$13
        CAL     K8_SHOWHEX
; Preserve original 20h..7Eh inclusive printable acceptance.
        LD      $16,$14
        SBC     $16,&H20
        JR      C,K8_LOOP
        LD      $16,$14
        SBC     $16,&H7F
        JR      NC,K8_LOOP
; 30th printable stays; 31st clears before starting anew.
        LD      $16,$11
        SBC     $16,&H1F
        JR      NZ,K8_CHAR
        LD      $6,&H60
        PRE     IZ,K8_INPUT
        CAL     CH08_PRINT
        LD      $11,1
K8_CHAR:
        LD      $6,$11
        AD      $6,&H60
        LD      $16,$14
        CAL     K8_PUTC
        AD      $11,$30
        LD      $6,$11
        AD      $6,&H60
        CAL     K8_SETCUR
        JP      K8_LOOP

; Keystone 0.9 functional routines with names scoped to guest.
K8_SETCUR:
        PST     UA,&H54
        PRE     IX,EDCSR
        ST      $6,(IX+$SX)
        PST     UA,&H14
        RTN
K8_SHOWHEX:
        LD      $16,$12
        DID     $16
        CAL     K8_HEXASC
        CAL     K8_PUTC
        LD      $16,$12
        CAL     K8_HEXASC
        CAL     K8_PUTC
        RTN
K8_HEXASC:
        AN      $16,&H0F
        AD      $16,&H30
        SBC     $16,&H3A
        RTN     C
        AD      $16,&H07
        RTN
K8_PUTC:
        LD      $7,$16
        LD      $0,$7
        DIU     $7
        DID     $0
        OR      $7,$SZ
        CAL     &H0197
        RTN

K8_L1:
        DB      "Press Key          Xandrian Labs",0
K8_L2:
        DB      "Key=-- Mode=--       keystone .9",0
K8_INPUT:
        DB      "[                              ]",0
K8_TKEY:
        DB      "Key=",0
K8_TMODE:
        DB      " Mode=",0
