; ======================================================================
; XANDRIAN LABS  /  CS617 CHAPTER 09
; ======================================================================
; Program    : MathABI - Return-Capture Application
; Source     : mathabi_probe.s
; Revision   : R003a
; Target     : Casio PB-2000C / HD61700
; Role       : Capture native return bytes before formatting reports.
; Interface  : PI/CNVR/CMP witness cases and VT report display.
; Maintainer : Xandrian Labs
; ----------------------------------------------------------------------
; Case records are snapshots, not a claim of full clobber safety.
; UA14 workspace and report canvas belong to this probe.
; ======================================================================

; ----------------------------------------------------------------------
; IMPLEMENTATION NOTES
; ----------------------------------------------------------------------
; AB_DOC is the report canvas; AB_REG is post-return capture.

AB_DOC:   EQU &H2000   ; 24 x 80 viewer / serial report
AB_HEX_TMP: EQU &H2D60  ; up to 16 ASCII hex chars, post-capture only
AB_MARKER: EQU &H2D80  ; self-test bytes, separate from raw record and hex temp
AB_CMP_NEXT: EQU &H2D90 ; F3 CMP cycle: 0 LT, 1 GT, 2 EQ
AB_OPER_A: EQU &H2DA0  ; native CNVR-built B9(A) (9 bytes)
AB_OPER_B: EQU &H2DB0  ; native CNVR-built B9(B) (9 bytes)
AB_SPLMODE: EQU &H2D70   ; startup cold/warm flag, outside raw record
AB_MAGIC: EQU &H2D00   ; 4 bytes "ABI1"
AB_CASE:  EQU &H2D04   ; 0 none, 1 PI, 2 CNVR, 3 LT, 4 GT, 5 EQ
AB_STAT:  EQU &H2D05   ; 0 NOT RUN, 3 CHECK. No speculative PASS.
AB_UA:    EQU &H2D06   ; UA sampled immediately after native return
AB_CMP:   EQU &H2D07   ; 0 none/greater, 1 carry, 2 zero (source hypothesis)
AB_REG:   EQU &H2D10   ; 32 captured general bytes AFTER UA capture
AB_END:   EQU &H2D30   ; 2-byte sentinel
        ORG &H0E80
LAB_COLD:
        PRE SS,&H0100
        LD $29,1          ; cold start only
        JP AB_SETUP
LAB_WARM:
        PRE SS,&H0100
        LD $29,0          ; warm reset skips splash
; ----------------------------------------------------------------------
; RETURN-WITNESS STARTUP
; ----------------------------------------------------------------------
AB_SETUP:
        LD $30,1
        LD $31,0
        PSR SZ,0
        PSR SY,30
        PSR SX,31
        PST UA,&H14
        PRE IX,AB_SPLMODE
        ST $29,(IX+$SX)
        PRE IX,RCS_TOP
        PRE IY,RCS_END-1
        PRE IZ,RCS
        PST UA,&H44
        BUP
        PST UA,&H14
        PRE SS,SSPTP
        PRE US,USPTP
        CAL SYS_INIT
        CAL SCREEN_INIT
        PST UA,&H14
        PRE IX,AB_SPLMODE
        LD $0,(IX+$SX)
        AN $0,$0
        JR Z,AB_SKIP_SPLASH
        LDW $10,AB_SPLASH_TEXT
        LD $12,2          ; two TM transitions, same timing convention as mathrom
        CAL SPL_SHOW
AB_SKIP_SPLASH:
        CAL KBD_INIT
        PST UA,&H14
        CAL VT23_INIT
        PST UA,&H14
        LDW $10,AB_DOC
        CAL VT23_BIND_RAM
        CAL AB_RESET
        PRE IX,AB_CMP_NEXT
        LD $0,0
        ST $0,(IX+$SX)
; ----------------------------------------------------------------------
; CASE SELECTION
; ----------------------------------------------------------------------
AB_MENU:
        PST UA,&H14
        CAL LCD_CLEAR
        LD $6,0
        PRE IZ,AB_LINE0
        CAL LCD_ROM32
        LD $6,&H20
        PRE IZ,AB_LINE1
        CAL LCD_ROM32
        LD $6,&H40
        PRE IZ,AB_LINE2
        CAL LCD_ROM32
        LD $6,&H60
        PRE IZ,AB_LINE3
        CAL LCD_ROM32
AB_WAIT:
        CAL KEY_WAIT
        SBC $17,2
        JP Z,LAB_WARM
        LD $15,$0
        SBC $15,KEYF1
        JP Z,AB_PI
        LD $15,$0
        SBC $15,KEYF2
        JP Z,AB_CNVR
        LD $15,$0
        SBC $15,KEYF3
        JP Z,AB_CMP_RUN
        LD $15,$0
        SBC $15,KEYF4
        JP Z,LAB_WARM
        JP AB_WAIT

; Clear record before every call. Exposes uncompleted / nonreturn as NOT RUN.
AB_RESET:
        PST UA,&H14
        PRE IX,AB_MAGIC
        LD $0,0
        LD $20,48
AB_ZERO:
        STI $0,(IX+$SX)
        SB $20,$SY
        JP NZ,AB_ZERO
        PRE IX,AB_MAGIC
        LD $0,&H41
        STI $0,(IX+$SX)
        LD $0,&H42
        STI $0,(IX+$SX)
        LD $0,&H49
        STI $0,(IX+$SX)
        LD $0,&H31
        ST $0,(IX+$SX)
        PRE IX,AB_END
        LD $0,&HA5
        STI $0,(IX+$SX)
        LD $0,&H5A
        ST $0,(IX+$SX)
        RTN
AB_MARK:
        PRE IX,AB_CASE
        ST $21,(IX+$SX)
        RTN
AB_PI:
        CAL AB_RESET
        LD $21,1
        CAL AB_MARK
        CAL MATH_PI
        JP AB_CAPTURE
; ----------------------------------------------------------------------
; SIGNED INTEGER TO B9 WITNESS
; ----------------------------------------------------------------------
AB_CNVR:
        CAL AB_RESET
        LD $21,2
        CAL AB_MARK
        LDW $15,1
        CAL MATH_CNVR
        JP AB_CAPTURE
; F3 cycles LT(2,3), GT(3,2), EQ(2,2); other cases restart via F1/F2.
; Operands constructed with resident CNVR, saved *before* CMP, then restored.
; This is a source-backed fixture like the established specialist5 path,
; not an independently qualified B9 encoder. Two CNVR setup calls occur.
AB_CMP_RUN:
        CAL AB_RESET
        PRE IX,AB_CMP_NEXT
        LD $21,(IX+$SX)  ; 0..2 cycle selector
        LD $0,$21
        AD $0,$SY
        SBC $0,3
        JP NZ,AB_CMP_ADV_OK
        LD $0,0
AB_CMP_ADV_OK:
        ST $0,(IX+$SX)
        LD $0,$21
        AD $0,3          ; case ID 3 / 4 / 5
        LD $21,$0
        CAL AB_MARK
        ; First operand A: 2 for LT/EQ, 3 for GT.
        LDW $15,2
        LD $0,$21
        SBC $0,4
        JP NZ,AB_CMP_A_OK
        LDW $15,3
AB_CMP_A_OK:
        CAL MATH_CNVR
        PST UA,&H14
        PRE IX,AB_OPER_A
        STM $10,(IX+$SX),8
        PRE IX,AB_OPER_A+8
        ST $18,(IX+$SX)
        ; Second operand B: 3 for LT, 2 for GT/EQ.
        LDW $15,2
        LD $0,$21
        SBC $0,3
        JP NZ,AB_CMP_B_OK
        LDW $15,3
AB_CMP_B_OK:
        CAL MATH_CNVR
        PST UA,&H14
        PRE IX,AB_OPER_B
        STM $10,(IX+$SX),8
        PRE IX,AB_OPER_B+8
        ST $18,(IX+$SX)
        ; Load A into $10..$18 and B into $0..$8.
        ; The native CMP call is the only call after fixture load.
        PRE IX,AB_OPER_B
        LDM $0,(IX+$SX),8
        PRE IX,AB_OPER_B+8
        LD $8,(IX+$SX)
        PRE IX,AB_OPER_A
        LDM $10,(IX+$SX),8
        PRE IX,AB_OPER_A+8
        LD $18,(IX+$SX)
        CAL MATH_CMP
        JP C,AB_CARRY
        JP Z,AB_ZEROFLAG
        LD $25,0
        JP AB_CAPTURE
AB_CARRY:
        JP Z,AB_ZEROFLAG
        LD $25,1
        JP AB_CAPTURE
AB_ZEROFLAG:
        LD $25,2
        JP AB_CAPTURE

; Instrumentation first reads UA into $29. $29 is NOT a native clobber witness.
; IX is modified by capture; SX must be 31 at return for indexed writes.
; If UA changes or SX changes unexpectedly, capture cannot prove safe behavior.
AB_CAPTURE:
        GST UA,$29
        PST UA,&H14
        PRE IX,AB_UA
        ST $29,(IX+$SX)
        PRE IX,AB_REG
        STM $0,(IX+$SX),8
        PRE IX,AB_REG+8
        STM $8,(IX+$SX),8
        PRE IX,AB_REG+16
        STM $16,(IX+$SX),8
        PRE IX,AB_REG+24
        STM $24,(IX+$SX),8
        PRE IX,AB_CMP
        ST $25,(IX+$SX)
        PRE IX,AB_STAT
        LD $0,3
        ST $0,(IX+$SX)
        ; Raw record is frozen before constructing the human VT report.
        CAL AB_REPORT
        CAL VT23_VIEW     ; owner may use :t to transmit 24x80 text
        JP AB_MENU


; ================================================================
; R003 read-only evidence formatter. NEVER runs before raw capture.
; No numerical success claim: CHECK means native call returned only.
; Report is derived from UA14 2D00..2D31; VT23 :t sends all 24 rows.
; Record bytes 2D00..2D31 are never modified by the formatter.
; ================================================================
AB_REPORT:
        PST UA,&H14
        CAL AB_MARK_INIT
        CAL VT23_CLEAR
        LD $8,1
        LD $9,1
        LDW $10,AB_RPT_00
        LD $13,49
        CAL AB_RPT_ROM
        LD $8,2
        LD $9,1
        LDW $10,AB_RPT_01
        LD $13,57
        CAL AB_RPT_ROM
        LD $8,3
        LD $9,1
        LDW $10,AB_RPT_02
        LD $13,53
        CAL AB_RPT_ROM
        PRE IX,AB_CASE
        LD $0,(IX+$SX)
        SBC $0,1
        JP Z,AB_RPT_CASE_PI
        SBC $0,2
        JP Z,AB_RPT_CNVR
        SBC $0,3
        JP Z,AB_RPT_CASE_CMP
        SBC $0,4
        JP Z,AB_RPT_CMP_GT
        SBC $0,5
        JP Z,AB_RPT_CMP_EQ
        JP AB_RPT_CASE_END
AB_RPT_CASE_PI:
        LD $8,4
        LD $9,1
        LDW $10,AB_RPT_03
        LD $13,35
        CAL AB_RPT_ROM
        JP AB_RPT_CASE_END
AB_RPT_CNVR:
        LD $8,4
        LD $9,1
        LDW $10,AB_RPT_04
        LD $13,38
        CAL AB_RPT_ROM
        JP AB_RPT_CASE_END
AB_RPT_CASE_CMP:
        LD $8,4
        LD $9,1
        LDW $10,AB_RPT_05
        LD $13,50
        CAL AB_RPT_ROM
        JP AB_RPT_CASE_END
AB_RPT_CMP_GT:
        LD $8,4
        LD $9,1
        LDW $10,AB_RPT_26
        LD $13,51
        CAL AB_RPT_ROM
        JP AB_RPT_CASE_END
AB_RPT_CMP_EQ:
        LD $8,4
        LD $9,1
        LDW $10,AB_RPT_27
        LD $13,49
        CAL AB_RPT_ROM
AB_RPT_CASE_END:
        LD $8,5
        LD $9,1
        LDW $10,AB_RPT_06
        LD $13,54
        CAL AB_RPT_ROM
        LD $8,6
        LD $9,1
        LDW $10,AB_RPT_07
        LD $13,16
        CAL AB_RPT_ROM
        LD $8,6
        LD $9,17
        LDW $10,AB_UA
        CAL AB_RPT_HEX1
        LD $8,7
        LD $9,1
        LDW $10,AB_RPT_08
        LD $13,53
        CAL AB_RPT_ROM
        LD $8,8
        LD $9,1
        LDW $10,AB_RPT_09
        LD $13,11
        CAL AB_RPT_ROM
        LD $8,8
        LD $9,13
        LDW $10,&H2D00
        CAL AB_RPT_HEX8
        LD $8,9
        LD $9,1
        LDW $10,AB_RPT_10
        LD $13,11
        CAL AB_RPT_ROM
        LD $8,9
        LD $9,13
        LDW $10,&H2D08
        CAL AB_RPT_HEX8
        LD $8,10
        LD $9,1
        LDW $10,AB_RPT_11
        LD $13,11
        CAL AB_RPT_ROM
        LD $8,10
        LD $9,13
        LDW $10,&H2D10
        CAL AB_RPT_HEX8
        LD $8,11
        LD $9,1
        LDW $10,AB_RPT_12
        LD $13,11
        CAL AB_RPT_ROM
        LD $8,11
        LD $9,13
        LDW $10,&H2D18
        CAL AB_RPT_HEX8
        LD $8,12
        LD $9,1
        LDW $10,AB_RPT_13
        LD $13,11
        CAL AB_RPT_ROM
        LD $8,12
        LD $9,13
        LDW $10,&H2D20
        CAL AB_RPT_HEX8
        LD $8,13
        LD $9,1
        LDW $10,AB_RPT_14
        LD $13,11
        CAL AB_RPT_ROM
        LD $8,13
        LD $9,13
        LDW $10,&H2D28
        CAL AB_RPT_HEX8
        LD $8,14
        LD $9,1
        LDW $10,AB_RPT_15
        LD $13,11
        CAL AB_RPT_ROM
        LD $8,14
        LD $9,13
        LDW $10,&H2D30
        CAL AB_RPT_HEX2
        LD $8,15
        LD $9,1
        LDW $10,AB_RPT_16
        LD $13,63
        CAL AB_RPT_ROM
        LD $8,16
        LD $9,1
        LDW $10,AB_MARK_LABEL
        LD $13,15
        CAL AB_RPT_ROM
        LD $8,16
        LD $9,17
        LDW $10,AB_MARKER
        CAL AB_RPT_HEX8
        LD $8,17
        LD $9,1
        LDW $10,AB_RPT_18
        LD $13,54
        CAL AB_RPT_ROM
        LD $8,18
        LD $9,1
        LDW $10,AB_RPT_19
        LD $13,54
        CAL AB_RPT_ROM
        LD $8,19
        LD $9,1
        LDW $10,AB_RPT_20
        LD $13,54
        CAL AB_RPT_ROM
        LD $8,20
        LD $9,1
        LDW $10,AB_OPER_A_LABEL
        LD $13,11
        CAL AB_RPT_ROM
        LD $8,20
        LD $9,13
        LDW $10,AB_OPER_A
        CAL AB_RPT_HEX8
        LD $8,20
        LD $9,29
        LDW $10,AB_OPER_A+8
        CAL AB_RPT_HEX1
        LD $8,21
        LD $9,1
        LDW $10,AB_OPER_B_LABEL
        LD $13,11
        CAL AB_RPT_ROM
        LD $8,21
        LD $9,13
        LDW $10,AB_OPER_B
        CAL AB_RPT_HEX8
        LD $8,21
        LD $9,29
        LDW $10,AB_OPER_B+8
        CAL AB_RPT_HEX1
        LD $8,22
        LD $9,1
        LDW $10,AB_RPT_23
        LD $13,63
        CAL AB_RPT_ROM
        LD $8,23
        LD $9,1
        LDW $10,AB_RPT_24
        LD $13,60
        CAL AB_RPT_ROM
        LD $8,24
        LD $9,1
        LDW $10,AB_RPT_25
        LD $13,58
        CAL AB_RPT_ROM
        RTN
AB_RPT_ROM:
        LD $12,SRC_ROM
        JP VT23_WRITE

; Inputs: $8 report row, $9 column, $10 source UA14 RAM byte(s).
; Outputs: hex ASCII at requested location. Changes only 2D60..2D6F.
AB_RPT_HEX1:
        LD $20,1
        LD $13,2
        JP AB_RPT_HEX
AB_RPT_HEX2:
        LD $20,2
        LD $13,4
        JP AB_RPT_HEX
AB_RPT_HEX8:
        LD $20,8
        LD $13,16
AB_RPT_HEX:
        LDW $4,$10
        PRE IX,AB_HEX_TMP
AB_RPT_HEX_LOOP:
        PRE IZ,$4
        ; IZ reads bank 1 of the app RAM with UA=54, as in MR_RAWVAL.
        ; UA=14 reads ROM bank 0 and incorrectly renders all zeroes.
        PST UA,&H54
        LD $0,(IZ+$SX)
        PST UA,&H14
        LD $1,$0
        DID $1
        AN $1,&H0F
        AN $0,&H0F
        PRE IZ,AB_HEX_DIGITS
        LD $2,(IZ+$1)
        STI $2,(IX+$SX)
        LD $2,(IZ+$0)
        STI $2,(IX+$SX)
        ADW $4,$SY
        SB $20,$SY
        JP NZ,AB_RPT_HEX_LOOP
        LDW $10,AB_HEX_TMP
        LD $12,SRC_RAM
        JP VT23_WRITE
; Instrumentation-only fixture, independent of the native call.
; Its hex export MUST be 123456789ABCDEF0, else raw fields are untrusted.
AB_MARK_INIT:
        PST UA,&H14
        PRE IX,AB_MARKER
        LD $0,&H12
        STI $0,(IX+$SX)
        LD $0,&H34
        STI $0,(IX+$SX)
        LD $0,&H56
        STI $0,(IX+$SX)
        LD $0,&H78
        STI $0,(IX+$SX)
        LD $0,&H9A
        STI $0,(IX+$SX)
        LD $0,&HBC
        STI $0,(IX+$SX)
        LD $0,&HDE
        STI $0,(IX+$SX)
        LD $0,&HF0
        ST $0,(IX+$SX)
        RTN
AB_MARK_LABEL: DB "MARK 2D80:     "
AB_OPER_A_LABEL: DB "B9 A 2DA0: "
AB_OPER_B_LABEL: DB "B9 B 2DB0: "
AB_HEX_DIGITS: DB "0123456789ABCDEF"

AB_RPT_00: DB "MATHABI R003a / NATIVE MATHROM ABI RETURN WITNESS"
AB_RPT_01: DB "EVIDENCE CLASS: RETURNED / CHECK - NOT LIBRARY ACCEPTANCE"
AB_RPT_02: DB "BUILD SHA256: VERIFY EXTERNALLY; OWNER EMULATOR TRACE"
AB_RPT_03: DB "CASE 01: PI() / no explicit operand"
AB_RPT_04: DB "CASE 02: CNVR(+1) / integer in $15-$16"
AB_RPT_05: DB "CASE 03: CMP(2,3) / CNVR-B9 operands; EXPECT CARRY"
AB_RPT_26: DB "CASE 04: CMP(3,2) / CNVR-B9 operands; EXPECT NO C/Z"
AB_RPT_27: DB "CASE 05: CMP(2,2) / CNVR-B9 operands; EXPECT ZERO"
AB_RPT_06: DB "F3 CYCLES 2<3, 3>2, 2=2; F1/F2 INDEPENDENT; :t exports"
AB_RPT_07: DB "UA AFTER CALL = "
AB_RPT_08: DB "CMP CODE: 00 neither, 01 carry, 02 zero (provisional)"
AB_RPT_09: DB "UA14 2D00: "
AB_RPT_10: DB "UA14 2D08: "
AB_RPT_11: DB "UA14 2D10: "
AB_RPT_12: DB "UA14 2D18: "
AB_RPT_13: DB "UA14 2D20: "
AB_RPT_14: DB "UA14 2D28: "
AB_RPT_15: DB "UA14 2D30: "
AB_RPT_16: DB "RECORD: ABI1 case status UA cmp then general registers and A55A"
AB_RPT_17: DB "STATUS 03 = CHECK, not an accepted output or ABI safety PASS"
AB_RPT_18: DB "RAW $10..$18 in lines 12-13; $29 overwritten by GST UA"
AB_RPT_19: DB "CMP class saved at 2D07; CPU C/Z flags NOT snapshotted"
AB_RPT_20: DB "CMP OPERANDS BELOW; IX/SX/STACK/MEMORY SAFETY UNPROVEN"
AB_RPT_21: DB "CMP A/B GENERATED BY CNVR; NOT INDEPENDENT NUMERIC ORACLE"
AB_RPT_22: DB "PI B9 value / CNVR B9 value not yet judged by this viewer"
AB_RPT_23: DB "Transport sends 24 x 80 bytes; serial receipt requires checking"
AB_RPT_24: DB "Capture this :t transcript, ROM SHA256 and emulator identity"
AB_RPT_25: DB "Q/MENU: home; F3 next CMP pair; retain failing raw reports"

AB_LINE0: DB "MATHABI R003a / NATIVE ABI CHECK"
AB_LINE1: DB "                                "
AB_LINE2: DB "                                "
AB_LINE3: DB "[pi  ][cnvr][cmp ][reset]       "
AB_RESULT0: DB "MATHABI / CALL RETURNED         "
AB_RESULT1: DB "RAW: UA14 2D00..2D2F            "
AB_RESULT2: DB "STATUS CHECK - ABI UNPROVEN     "
AB_RESULT3: DB "PRESS KEY TO RETURN TO MENU     "

; Four NUL-terminated lines consumed by lib/splash/SPL_SHOW.
AB_SPLASH_TEXT: DB "XANDRIAN LABS",0
                DB "MATHABI R003a",0
                DB "NATIVE MATHROM ABI",0
                DB "VT23 EVIDENCE ROM",0
