; ======================================================================
; CS617 NUMERIC - DECIMAL U32 APPEND TEST ROM - CANDIDATE 5
;
; Hypothesis:
;   A live decimal-input primitive can be composed from accepted UMUL32 and
;   UADD32 while rejecting UINT32 overflow before arithmetic wraparound.
;
; Required gates:
;   1. Rev. 0.45 assembly success.
;   2. included UMUL32 remains byte-identical to accepted EA49 donor.
;   3. included UADD32 remains byte-identical to accepted E964 donor.
;   4. embedded independent test reports PASS 255/255 transitions.
;
; New primitive:
;   UDECAPP(current_u32,digit_0_to_9)
;       success -> current*10+digit
;       overflow -> status=1 and current unchanged
; ======================================================================

        ORG     0
        LEVEL   0

OFFCHK: EQU     &H04EF

        DB      &H43,&H4D
        DB      &HFF,&HFF,&HFF,&HFF
        DB      &H01,&H04,&H10,&H10
        DB      &HFF,&HFF,&HFF,&HFF
        DB      &HFF,&HFF,&HFF,&HFF
        DB      &HFF,&HFF,&HFF,&HFF
        DB      &HFF,&HFF,&HFF,&HFF
        DB      &HFF
        DB      &H03
        DB      &HC0
        DB      &HFF,&HFF,&HFF

        ORG     &H0D80

        JP      MAIN
        JP      TRAP
        JP      &H01AA
        JP      &H01BC
        JP      TRAP
        JP      TRAP
        JP      TRAP
        JP      &H00E3

DEFRT:  RTN
        DB      &HFF,&HFF
        RTN
        DB      &HFF,&HFF
        JP      DEFRT
        JP      POFF
        JP      DEFRT
        JP      DEFRT
        JP      MAIN
        JP      DEFRT
        JP      DEFRT
        JP      DEFRT
        JP      DEFRT
        DB      &H11
        DB      &H10

TRAP:   RTNI

POFF:   OFF
        OFF
        OFF
        JR      POFF

        ORG     &H0E00

MAIN:
        PRE     SS,&H0100
        LD      $30,1
        LD      $31,0
        PSR     SZ,0
        PSR     SY,30
        PSR     SX,31
        PST     UA,&H14
        JP      RUN_TESTS

; Accepted dependency layout:
;   UMUL32   0E16..0E41  44 bytes
;   UADD32   0E42..0E4C  11 bytes
;   UDECAPP  begins 0E4D
#INCLUDE (../lib/mul_u32_u32.inc)
#LIST
#INCLUDE (../lib/add_u32_u32.inc)
#LIST
#INCLUDE (../lib/dec_append_u32.inc)
#LIST

; Expected:
;   $19-$22 expected value
;   $23     expected status
; Failure component:
;   1 status
;   2 value low
;   3 value high
TEST_APP:
        CAL     UDECAPP
        LD      $29,0

        LD      $28,1
        SBC     $4,$23
        JR      NZ,T_FAIL

        LD      $28,2
        SBCW    $15,$19
        JR      NZ,T_FAIL

        LD      $28,3
        SBCW    $17,$21
        JR      NZ,T_FAIL
        RTN

T_FAIL:
        LD      $29,1
        RTN

RUN_TESTS:
#INCLUDE (c5_dec_vectors.inc)
#LIST
        JP      TEST_PASS

TEST_PASS:
        CAL     SCREEN_INIT
        LD      $6,&H40
        PRE     IZ,TXT_PASS
        CAL     PRINTZ
        LD      $6,&H60
        PRE     IZ,TXT_READY
        CAL     PRINTZ
        JP      HALT

TEST_FAIL:
        PHSW    $27
        CAL     SCREEN_INIT
        PPSW    $27

        LD      $6,&H40
        PRE     IZ,TXT_FAIL
        CAL     PRINTZ

        PHSW    $27
        LD      $12,$27
        CAL     SHOWHEX
        PPSW    $27

        PHSW    $27
        LD      $6,&H60
        PRE     IZ,TXT_COMP
        CAL     PRINTZ
        PPSW    $27

        LD      $12,$28
        CAL     SHOWHEX
        JP      HALT

HALT:
        JR      HALT

SCREEN_INIT:
        PST     UA,&H14
        CAL     OFFCHK
        PPO     &HC0

        LDW     $0,&H12B5
INIT_DELAY:
        SBW     $0,$SY
        JR      NZ,INIT_DELAY

        CAL     &H02D4

        PPO     &HC3
        LD      $0,&H0C
        LDW     $1,&H3000
        STLM    $0,3

        LD      $6,$SX
        PRE     IZ,TXT_TITLE
        CAL     PRINTZ
        LD      $8,115
        CAL     &H018D

        LD      $6,&H20
        PRE     IZ,TXT_OP
        CAL     PRINTZ

        CAL     &H0304
        CAL     &H0306
        RTN

SHOWHEX:
        LD      $16,$12
        DID     $16
        CAL     HEXASC
        CAL     PUTC
        LD      $16,$12
        CAL     HEXASC
        CAL     PUTC
        RTN

HEXASC:
        AN      $16,&H0F
        AD      $16,&H30
        SBC     $16,&H3A
        RTN     C
        AD      $16,&H07
        RTN

PUTC:
        LD      $7,$16
        LD      $0,$7
        DIU     $7
        DID     $0
        OR      $7,$SZ
        CAL     &H0197
        RTN

PRINTZ:
        LDI     $7,(IZ+$SX)
        LD      $0,$7
        DIU     $7
        DID     $0
        OR      $7,$SZ
        RTN     Z
        CAL     &H0197
        JR      PRINTZ

TXT_TITLE:
        DB      "CS617 NUMERIC",0
TXT_OP:
        DB      "DECIMAL APPEND",0
TXT_PASS:
        DB      "PASS 255/255",0
TXT_FAIL:
        DB      "FAIL TEST ",0
TXT_COMP:
        DB      "COMPONENT ",0
TXT_READY:
        DB      "DECIMAL C5",0

        ORG     &HFFFF
        DB      0
