; ======================================================================
; XANDRIAN LABS  /  CS617 CHAPTER 02
; ======================================================================
; Program    : Chapter 02 Sorting
; Source     : app/editor.inc
; Revision   : x0.31a-dev / comment-harmonization pass
; Target     : Casio PB-2000C / HD61700
; Role       : Edit n/m through the bounded READN input service.
; Interface  : EDIT_N, EDIT_M, READN and local buffer operations.
; Maintainer : Xandrian Labs
; ----------------------------------------------------------------------
; MENU cancellation leaves the stored setting unchanged.
; ======================================================================

; PURPOSE : Edit n with a five-character work buffer.
; OUTPUT  : Returns reason code in $8.
; EFFECTS : Commits the edit unless the reason is MENU.
EDIT_N:
        LDW     $20,WS_NBUF
        LDW     $22,RN_BUF
        CAL     RN_COPY5
        PRE     IX,WS_NLEN
        LD      $2,(IX+$SX)
        LD      $3,0
        LDW     $0,RN_BUF
        LDW     $4,5
        LD      $6,3
        CAL     READN
        PRE     IX,RN_REASON
        LD      $8,(IX+$SX)
        SBC     $8,RN_MENU
        JR      Z,EN_RET
        LDW     $20,RN_BUF
        LDW     $22,WS_NBUF
        CAL     RN_COPY5
        PRE     IX,RN_LEN
        LD      $2,(IX+$SX)
        PRE     IX,WS_NLEN
        ST      $2,(IX+$SX)
EN_RET:
        PRE     IX,RN_REASON
        LD      $8,(IX+$SX)
        RTN

; PURPOSE : Edit m with a five-character work buffer.
; OUTPUT  : Returns reason code in $8.
; EFFECTS : Commits the edit unless the reason is MENU.
EDIT_M:
        LDW     $20,WS_MBUF
        LDW     $22,RN_BUF
        CAL     RN_COPY5
        PRE     IX,WS_MLEN
        LD      $2,(IX+$SX)
        LD      $3,0
        LDW     $0,RN_BUF
        LDW     $4,5
        LD      $6,&H23
        CAL     READN
        PRE     IX,RN_REASON
        LD      $8,(IX+$SX)
        SBC     $8,RN_MENU
        JR      Z,EM_RET
        LDW     $20,RN_BUF
        LDW     $22,WS_MBUF
        CAL     RN_COPY5
        PRE     IX,RN_LEN
        LD      $2,(IX+$SX)
        PRE     IX,WS_MLEN
        ST      $2,(IX+$SX)
EM_RET:
        PRE     IX,RN_REASON
        LD      $8,(IX+$SX)
        RTN

RN_COPY5:
        LD      $13,5
RC5_LOOP:
        LD      $16,($20)
        ST      $16,($22)
        ADW     $20,$SY
        ADW     $22,$SY
        SB      $13,$SY
        JR      NZ,RC5_LOOP
        RTN

; PURPOSE : Run bounded line editing with a blinking cursor.
; INPUT   : $0=buffer, $2=length, $4=capacity, $6=LCD row.
; OUTPUT  : $0=buffer, $2=length, $8=exit reason.
; EFFECTS : Updates caller-supplied text; waits for key release.
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)
        CAL     RN_REFRESH

RN_LOOP:
        CAL     INKEY
        AN      $17,$17
        JP      Z,RN_IDLE
        LD      $12,$0
        SBC     $12,KEYEXE
        JP      Z,RN_EXIT_EXE
        SBC     $12,KEYMENU
        JP      Z,RN_EXIT_MENU
        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_IGNORE
        SBC     $12,&H7F
        JP      NC,RN_IGNORE
        LD      $16,$12
        CAL     RN_LOADBUF
        CAL     B_OVR
        JP      RN_EDITED

RN_INSERT:
        CAL     RN_LOADBUF
        LD      $16,&H20
        CAL     B_INS
        AN      $8,$8
        JR      NZ,RN_EDITED
        SBW     $6,$SY
        JP      RN_EDITED
RN_DELETE:
        CAL     RN_LOADBUF
        CAL     B_DEL
        JP      RN_EDITED
RN_BACKSP:
        CAL     RN_LOADBUF
        CAL     B_BS
        JP      RN_EDITED
RN_LEFT:
        CAL     RN_LOADBUF
        CAL     B_LEFT
        JP      RN_EDITED
RN_RIGHT:
        CAL     RN_LOADBUF
        CAL     B_RIGHT
        JP      RN_EDITED

RN_EDITED:
        CAL     RN_SAVEBUF
        CAL     WAIT_RELEASE
        CAL     RN_REFRESH
        JP      RN_LOOP
RN_IGNORE:
        CAL     WAIT_RELEASE
        JP      RN_LOOP
RN_IDLE:
        CAL     RN_BLINK
        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     RN_PAINT       ; return with no underline left on screen
        CAL     WAIT_RELEASE
        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

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)
        RTN

RN_PAINT:
        PRE     IX,RN_DBASE
        LD      $6,(IX+$SX)
        PRE     IX,RN_CAP
        LDW     $18,(IX+$SX)
RP_CLEAR:
        ANCW    $18,$18
        JR      Z,RP_TEXT
        LD      $16,&H20
        CAL     PUTC
        SBW     $18,$SY
        JR      RP_CLEAR
RP_TEXT:
        PRE     IX,RN_BASE
        LDW     $20,(IX+$SX)
        PRE     IX,RN_LEN
        LDW     $18,(IX+$SX)
        PRE     IX,RN_DBASE
        LD      $6,(IX+$SX)
RP_LOOP:
        ANCW    $18,$18
        RTN     Z
        PRE     IX,$20
        LD      $16,(IX+$SX)
        CAL     PUTC
        ADW     $20,$SY
        SBW     $18,$SY
        JR      RP_LOOP

RN_REFRESH:
        CAL     RN_PAINT
        PRE     IX,WS_CUR
        LD      $0,1
        ST      $0,(IX+$SX)
        PRE     IX,WS_TICK
        ST      $31,(IX+$SX)
        JP      RN_CURSOR

RN_CURSOR:
        PRE     IX,RN_POS
        LDW     $10,(IX+$SX)
        PRE     IX,RN_DBASE
        LD      $6,(IX+$SX)
        AD      $6,$10
        PRE     IX,WS_CUR
        LD      $8,(IX+$SX)
        AN      $8,$8
        JR      Z,RNC_ORIG
        LD      $16,&H5F
        JP      PUTC
RNC_ORIG:
        PRE     IX,RN_LEN
        LDW     $12,(IX+$SX)
        SBCW    $10,$12
        JR      NC,RNC_SPACE
        PRE     IX,RN_BASE
        LDW     $14,(IX+$SX)
        ADW     $14,$10
        PRE     IX,$14
        LD      $16,(IX+$SX)
        JP      PUTC
RNC_SPACE:
        LD      $16,&H20
        JP      PUTC

RN_BLINK:
        PRE     IX,WS_TICK
        LD      $0,(IX+$SX)
        AD      $0,$SY
        SBC     $0,128
        JR      Z,RNB_TOGGLE
        ST      $0,(IX+$SX)
        RTN
RNB_TOGGLE:
        LD      $0,0
        ST      $0,(IX+$SX)
        PRE     IX,WS_CUR
        LD      $1,(IX+$SX)
        AN      $1,$1
        JR      Z,RNB_ON
        LD      $1,0
        ST      $1,(IX+$SX)
        JP      RN_CURSOR
RNB_ON:
        LD      $1,1
        ST      $1,(IX+$SX)
        JP      RN_CURSOR

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
BD_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      BD_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

; end of include
