; ======================================================================
; READN r0.03 INTEGRATION
; Editing mechanics / backing-state behavior: accepted READN lineage.
; Callable stack adapter: accepted Chapter 05 r012 integration lesson.
; r0.03 delta: FK1..FK4 terminate like EXE and report distinct reasons.
; BRK policy is Chapter-07-owned: clean restart through CH07_COLD.
; ======================================================================
; Tiny BREAK trampoline copied to BRKRAM.  CRTKY/C-ROM BRSTR transfers here.
BRK_TOP:
        PST     UA,&H14
        JP      RN_BREAK
BRK_END:

; Install the validated C-ROM bridge/runtime substrate.  This routine is called
; from r008-style MAIN on SS=0100h; it switches stacks only around firmware calls
; and restores the application stack before returning.
RN_SYSINIT:
; CAL RN_SYSINIT has already pushed its return address on the r008 stack.
; Preserve the *current* SS before entering the C-ROM stack domain so RTN can
; later pop that exact pending return address.  The standalone READN harness
; switched stacks only at top level and therefore did not need this boundary.
        GRE     SS,$0
        PRE     IX,RN_SAVESS
        STW     $0,(IX+$SX)

        PRE     IX,RCS_TOP
        PRE     IY,RCS_END-1
        PRE     IZ,RCS
        PST     UA,&H44
        BUP
        PST     UA,&H14

        PRE     IX,BRK_TOP
        PRE     IY,BRK_END-1
        PRE     IZ,BRKRAM
        PST     UA,&H44
        BUP
        PST     UA,&H14

        PRE     SS,SSPTP
        PRE     US,USPTP

        LDW     $28,SYSCLR
        CAL     SYSCAL
        PST     UA,&H14
        LDW     $28,SETLCD
        CAL     SYSCAL
        PST     UA,&H14
        LDW     $28,SET4LN
        CAL     SYSCAL
        PST     UA,&H14

        PST     UA,&H54
        PRE     IX,KEYMD
        ST      $31,(IX+$SX)
        PST     UA,&H14

        LDW     $2,BRKRAM
        LDW     $28,BRSTR
        CAL     SYSCAL
        PST     UA,&H14

        LD      $30,1
        LD      $31,0
        PSR     SZ,0
        PSR     SY,30
        PSR     SX,31
        PST     UA,&H14
        PRE     IX,RN_SAVESS
        LDW     $0,(IX+$SX)
        PRE     SS,$0
        RTN

; Call READN with the C-ROM system stack, then restore the *exact* caller SS.
; A fixed PRE SS,&H0100 here is incorrect because CAL APP_READN has already
; moved SS by two bytes to store its return address.
APP_READN:
; Preserve SS without touching READN's argument registers.
; r010 used $0/$1 here, destroying the RN_BUF pointer before CAL READN.
        GRE     SS,$10
        PRE     IX,RN_SAVESS
        STW     $10,(IX+$SX)
        PRE     SS,SSPTP
        CAL     READN
        LD      $30,1
        LD      $31,0
        PSR     SZ,0
        PSR     SY,30
        PSR     SX,31
        PST     UA,&H14
        PRE     IX,RN_SAVESS
        LDW     $10,(IX+$SX)
        PRE     SS,$10
        RTN

READN:
        PRE     IX,RN_BASE
        STW     $0,(IX+$SX)
        PRE     IX,RN_LEN
        STW     $2,(IX+$SX)
        PRE     IX,RN_CAP
        STW     $4,(IX+$SX)
        PRE     IX,RN_DBASE
        ST      $6,(IX+$SX)

        SBW     $20,$20
        PRE     IX,RN_POS
        STW     $20,(IX+$SX)
        PRE     IX,RN_REASON
        ST      $31,(IX+$SX)
        PRE     IX,RN_STAT
        ST      $31,(IX+$SX)

        CAL     RN_REFRESH

RN_LOOP:
        LDW     $28,CRTKY
        CAL     SYSCAL
        PST     UA,&H14
        LD      $12,$0

        SBC     $12,KEYEXE
        JP      Z,RN_EXIT_EXE
        SBC     $12,KEYMENU
        JP      Z,RN_EXIT_MENU
        SBC     $12,KEYBRK
        JP      Z,RN_BREAK
        SBC     $12,FK1
        JP      Z,RN_EXIT_FK1
        SBC     $12,FK2
        JP      Z,RN_EXIT_FK2
        SBC     $12,FK3
        JP      Z,RN_EXIT_FK3
        SBC     $12,FK4
        JP      Z,RN_EXIT_FK4
        SBC     $12,KEYINS
        JP      Z,RN_INSERT
        SBC     $12,KEYLT
        JP      Z,RN_LEFT
        SBC     $12,KEYRT
        JP      Z,RN_RIGHT
        SBC     $12,KEYDEL
        JP      Z,RN_DELETE
        SBC     $12,KEYBS
        JP      Z,RN_BACKSP

        SBC     $12,&H20
        JP      C,RN_LOOP
        SBC     $12,&H7F
        JP      NC,RN_LOOP

        LD      $16,$12
        CAL     RN_LOADBUF
        CAL     B_OVR
        CAL     RN_SAVEBUF
        CAL     RN_REFRESH
        JP      RN_LOOP

RN_INSERT:
        CAL     RN_LOADBUF
        LD      $16,&H20
        CAL     B_INS
        AN      $8,$8
        JR      NZ,RNI_SAVE
        SBW     $6,$SY
RNI_SAVE:
        CAL     RN_SAVEBUF
        CAL     RN_REFRESH
        JP      RN_LOOP

RN_DELETE:
        CAL     RN_LOADBUF
        CAL     B_DEL
        CAL     RN_SAVEBUF
        CAL     RN_REFRESH
        JP      RN_LOOP

RN_BACKSP:
        CAL     RN_LOADBUF
        CAL     B_BS
        CAL     RN_SAVEBUF
        CAL     RN_REFRESH
        JP      RN_LOOP

RN_LEFT:
        CAL     RN_LOADBUF
        CAL     B_LEFT
        CAL     RN_SAVEBUF
        CAL     RN_REFRESH
        JP      RN_LOOP

RN_RIGHT:
        CAL     RN_LOADBUF
        CAL     B_RIGHT
        CAL     RN_SAVEBUF
        CAL     RN_REFRESH
        JP      RN_LOOP

RN_EXIT_EXE:
        LD      $8,RN_EXE
        JR      RN_EXIT
RN_EXIT_MENU:
        LD      $8,RN_MENU
        JR      RN_EXIT
RN_EXIT_FK1:
        LD      $8,RN_FK1
        JR      RN_EXIT
RN_EXIT_FK2:
        LD      $8,RN_FK2
        JR      RN_EXIT
RN_EXIT_FK3:
        LD      $8,RN_FK3
        JR      RN_EXIT
RN_EXIT_FK4:
        LD      $8,RN_FK4

RN_EXIT:
        PRE     IX,RN_REASON
        ST      $8,(IX+$SX)
        CAL     CUR_HIDE
        CAL     REV_OFF
        PRE     IX,RN_BASE
        LDW     $0,(IX+$SX)
        PRE     IX,RN_LEN
        LDW     $2,(IX+$SX)
        PRE     IX,RN_REASON
        LD      $8,(IX+$SX)
        RTN

; C-ROM BREAK does not return through READN. Preserve the reason, restore the
; historical cursor glyph, then take Chapter 07 clean-slate restart.
RN_BREAK:
        PRE     SS,SSPTP
        PRE     US,USPTP
        PST     UA,&H14
        LD      $8,RN_BRK
        PRE     IX,RN_REASON
        ST      $8,(IX+$SX)
        CAL     CUR_HIDE
        CAL     REV_OFF
        JP      CH07_COLD

RN_LOADBUF:
        PRE     IX,RN_BASE
        LDW     $0,(IX+$SX)
        PRE     IX,RN_LEN
        LDW     $2,(IX+$SX)
        PRE     IX,RN_CAP
        LDW     $4,(IX+$SX)
        PRE     IX,RN_POS
        LDW     $6,(IX+$SX)
        RTN

RN_SAVEBUF:
        PRE     IX,RN_LEN
        STW     $2,(IX+$SX)
        PRE     IX,RN_POS
        STW     $6,(IX+$SX)
        PRE     IX,RN_STAT
        ST      $8,(IX+$SX)
        RTN

; Redraw only the bounded editable field, while synchronizing the firmware-owned
; backing representation used by the historical narrow cursor.
RN_REFRESH:
        CAL     CUR_HIDE
        CAL     REV_OFF

        PRE     IX,RN_BASE
        LDW     $10,(IX+$SX)
        PRE     IX,RN_LEN
        LDW     $18,(IX+$SX)
        PRE     IX,RN_CAP
        LDW     $20,(IX+$SX)
        PRE     IX,RN_DBASE
        LD      $6,(IX+$SX)

        LDW     $12,$18
RNR_CHARS:
        ANCW    $12,$12
        JR      Z,RNR_SPACES
        PRE     IX,$10
        LD      $16,(IX+$SX)
        CAL     RN_PUTBACK
        ADW     $10,$SY
        SBW     $12,$SY
        JR      RNR_CHARS

RNR_SPACES:
        SBW     $20,$18
RNR_SPLP:
        ANCW    $20,$20
        JR      Z,RNR_ENDCELL
        LD      $16,&H20
        CAL     RN_PUTBACK
        SBW     $20,$SY
        JR      RNR_SPLP

; Keep the one-past-end backing cell deterministic for POS=LEN.
RNR_ENDCELL:
        LD      $16,&H20
        CAL     RN_PUTBACK

        PRE     IX,RN_DBASE
        LD      $6,(IX+$SX)
        PRE     IX,RN_POS
        LDW     $10,(IX+$SX)
        AD      $6,$10
        CAL     SETCUR
        CAL     CUR_ON
        RTN

RN_PUTBACK:
        PHS     $6
        PHS     $10
        PHS     $11
        PHS     $12
        PHS     $13
        PHS     $16
        PHS     $18
        PHS     $19
        PHS     $20
        PHS     $21
        CAL     SETCUR
        LDW     $28,BACKCHR
        CAL     SYSCAL
        PST     UA,&H14
        PPS     $21
        PPS     $20
        PPS     $19
        PPS     $18
        PPS     $16
        PPS     $13
        PPS     $12
        PPS     $11
        PPS     $10
        PPS     $6
        JP      PUTC

; Generic fixed-buffer byte operations preserved from accepted READN editing baseline.
B_OVR:
        LDW     $10,$6
        SBCW    $10,$2
        JR      C,BO_REPLACE
        JR      Z,BO_APPEND
        LD      $8,B_EDGE
        RTN
BO_REPLACE:
        LDW     $10,$0
        ADW     $10,$6
        PRE     IX,$10
        ST      $16,(IX+$SX)
        ADW     $6,$SY
        LD      $8,B_OK
        RTN
BO_APPEND:
        LDW     $10,$2
        SBCW    $10,$4
        JR      C,BO_APOK
        LD      $8,B_FULL
        RTN
BO_APOK:
        LDW     $10,$0
        ADW     $10,$2
        PRE     IX,$10
        ST      $16,(IX+$SX)
        ADW     $2,$SY
        ADW     $6,$SY
        LD      $8,B_OK
        RTN

B_INS:
        LDW     $10,$2
        SBCW    $10,$4
        JR      C,BI_CUR
        LD      $8,B_FULL
        RTN
BI_CUR:
        LDW     $10,$6
        SBCW    $10,$2
        JR      Z,BI_APPEND
        JR      C,BI_SHIFT
        LD      $8,B_EDGE
        RTN
BI_SHIFT:
        LDW     $10,$0
        ADW     $10,$2
        LDW     $12,$10
        SBW     $12,$SY
        LDW     $14,$0
        ADW     $14,$6
BI_LOOP:
        PRE     IX,$12
        LD      $9,(IX+$SX)
        PRE     IX,$10
        ST      $9,(IX+$SX)
        LDW     $8,$12
        SBCW    $8,$14
        JR      Z,BI_PUT
        SBW     $12,$SY
        SBW     $10,$SY
        JR      BI_LOOP
BI_APPEND:
        LDW     $14,$0
        ADW     $14,$2
BI_PUT:
        PRE     IX,$14
        ST      $16,(IX+$SX)
        ADW     $2,$SY
        ADW     $6,$SY
        LD      $8,B_OK
        RTN

B_DEL:
        LDW     $10,$6
        SBCW    $10,$2
        JR      C,BD_HAVE
        LD      $8,B_EDGE
        RTN
BD_HAVE:
        LDW     $10,$2
        SBW     $10,$6
        SBW     $10,$SY
        LDW     $12,$0
        ADW     $12,$6
        LDW     $14,$12
        ADW     $14,$SY
RBD_LOOP:
        ANCW    $10,$10
        JR      Z,BD_DONE
        PRE     IX,$14
        LD      $9,(IX+$SX)
        PRE     IX,$12
        ST      $9,(IX+$SX)
        ADW     $14,$SY
        ADW     $12,$SY
        SBW     $10,$SY
        JR      RBD_LOOP
BD_DONE:
        SBW     $2,$SY
        LD      $8,B_OK
        RTN

B_BS:
        ANCW    $6,$6
        JR      NZ,BB_GO
        LD      $8,B_EDGE
        RTN
BB_GO:
        SBW     $6,$SY
        JP      B_DEL

B_LEFT:
        ANCW    $6,$6
        JR      NZ,BL_GO
        LD      $8,B_EDGE
        RTN
BL_GO:
        SBW     $6,$SY
        LD      $8,B_OK
        RTN

B_RIGHT:
        LDW     $10,$6
        SBCW    $10,$2
        JR      C,BR_GO
        LD      $8,B_EDGE
        RTN
BR_GO:
        ADW     $6,$SY
        LD      $8,B_OK
        RTN

; Cursor/backing wrappers from accepted READN editing baseline.
SETCUR:
        PST     UA,&H54
        PRE     IX,EDCSR
        ST      $6,(IX+$SX)
        PST     UA,&H14
        RTN
CUR_ON:
        LDW     $28,CSREN
        CAL     SYSCAL
        PST     UA,&H14
        RTN
CUR_OFF:
        LDW     $28,CSRDIS
        CAL     SYSCAL
        PST     UA,&H14
        RTN
CUR_HIDE:
        CAL     CURFORCEOFF
        CAL     CUR_OFF
        RTN
REV_OFF:
        LDW     $28,REVOFF
        CAL     SYSCAL
        PST     UA,&H14
        RTN

