; ======================================================================
; XANDRIAN LABS  /  CS617 CHAPTER 02
; ======================================================================
; Program    : Chapter 02 Sorting
; Source     : app/vt_data.inc
; Revision   : x0.31a-dev / comment-harmonization pass
; Target     : Casio PB-2000C / HD61700
; Role       : Render DATA into successive 24x80 VT documents.
; Interface  : VTD_REPORT and PG_* caller-owned pagination state.
; Maintainer : Xandrian Labs
; ----------------------------------------------------------------------
; Records wrap at 24 bytes per line; DATA is never rewritten.
; ======================================================================

; PURPOSE : Render one 20-line DATA page in VT_CANVAS.
; INPUT   : PG_REC_RAM, PG_COL_RAM, PG_OFF_RAM.
; OUTPUT  : PG_NEXT_* and PG_MORE_RAM for the next page.
; EFFECTS : Reads DATA, writes only document and page state.
VTD_REPORT:
        PST     UA,&H55
        CAL     VTP_PREP
        LDW     $20,VT_CANVAS+&H0050
        PRE     IZ,TXT_VD_HEAD
        CAL     VTP_TEXT
        LDW     $20,VT_CANVAS+&H00A0
        PRE     IZ,TXT_VD_LIMIT
        CAL     VTP_TEXT
; OFFSET is the first intra-record byte column on this document.
        PRE     IX,PG_COL_RAM
        LDW     $12,(IX+$SX)
        PRE     IX,VT_CANVAS+&H00BC
        LD      $10,$13
        CAL     HEX_ST
        LD      $10,$12
        CAL     HEX_ST

        PRE     IX,WS_NVAL
        LDW     $24,(IX+$SX)       ; n records
        PRE     IX,WS_MVAL
        LDW     $26,(IX+$SX)       ; m bytes per record
        PRE     IX,PG_REC_RAM
        LDW     $20,(IX+$SX)       ; current record index
        PRE     IX,PG_COL_RAM
        LDW     $14,(IX+$SX)       ; current byte column in record
        PRE     IX,PG_OFF_RAM
        LDW     $22,(IX+$SX)       ; DATA-relative current record start
        LDW     $28,VT_CANVAS+&H0140
        LD      $2,20             ; available body lines (rows 4..23)

VTD_LINE:
        AN      $2,$2
        JP      Z,VTD_DONE
        SBCW    $20,$24
        JP      NC,VTD_DONE
        LDW     $4,$28            ; beginning of this canvas line

; Number new records. Indent normal continuation lines, but identify a
; continuation that begins a new DOCUMENT (record number followed by
; '+').
        ANCW    $14,$14
        JP      Z,VTD_PRINT_REC
        LD      $0,$2
        SBC     $0,20
        JP      NZ,VTD_INDENT
VTD_PRINT_REC:
        PRE     IX,$28
        LDW     $8,$20
        LDW     $10,&H03E8
        CAL     DEC_ST
        LDW     $10,&H0064
        CAL     DEC_ST
        LDW     $10,&H000A
        CAL     DEC_ST
        LD      $16,$8
        AD      $16,&H30
        STI     $16,(IX+$SX)
        ANCW    $14,$14
        JP      Z,VTD_FIRST_MARK
        LD      $16,"+"
        JP      VTD_STORE_MARK
VTD_FIRST_MARK:
        LD      $16,":"
VTD_STORE_MARK:
        STI     $16,(IX+$SX)
        LD      $16," "
        STI     $16,(IX+$SX)
VTD_INDENT:
        LDW     $18,6
        ADW     $28,$18

; Display min(24, m - current_column) raw bytes in this line.
        LDW     $18,$26
        SBW     $18,$14
        LDW     $10,24
        SBCW    $18,$10
        JR      C,VTD_SHORT
        LD      $13,24
        JR      VTD_BYTES
VTD_SHORT:
        LD      $13,$18
VTD_BYTES:
        LDW     $6,$22
        ADW     $6,$14
        LDW     $18,DATA
        ADW     $6,$18
VTD_BYTE_LOOP:
        AN      $13,$13
        JP      Z,VTD_ADVANCE
        PRE     IX,$28
        LD      $16," "
        STI     $16,(IX+$SX)
        ADW     $28,$SY
        PRE     IX,$6
        LD      $10,(IX+$SX)
        PRE     IX,$28
        CAL     HEX_ST
        LDW     $18,2
        ADW     $28,$18
        ADW     $6,$SY
        SB      $13,$SY
        JP      VTD_BYTE_LOOP

VTD_ADVANCE:
; A whole line has been consumed, whether full or short.
        LDW     $18,24
        ADW     $14,$18
        SBCW    $14,$26
        JP      C,VTD_NEXT_LINE
; End of record: reset column and advance data base by full m.
        LDW     $14,0
        ADW     $22,$26
        ADW     $20,$SY
VTD_NEXT_LINE:
        LDW     $28,$4
        LDW     $18,80
        ADW     $28,$18
        SB      $2,$SY
        JP      VTD_LINE

VTD_DONE:
; Save the NEXT logical document start independently of current start.
        PRE     IX,PG_NEXT_REC_RAM
        STW     $20,(IX+$SX)
        PRE     IX,PG_NEXT_COL_RAM
        STW     $14,(IX+$SX)
        PRE     IX,PG_NEXT_OFF_RAM
        STW     $22,(IX+$SX)
        LD      $0,0
        SBCW    $20,$24
        JP      NC,VTD_NO_MORE
        LD      $0,1
VTD_NO_MORE:
        PRE     IX,PG_MORE_RAM
        ST      $0,(IX+$SX)
VTD_VIEW:
        LDW     $10,VT_CANVAS
        CAL     VT_BIND_RO
        JP      VTX_RUN

; end of include
