; ======================================================================
; XANDRIAN LABS  /  CS617 CHAPTER 02
; ======================================================================
; Program    : Chapter 02 Sorting
; Source     : app/math32.inc
; Revision   : x0.31a-dev / comment-harmonization pass
; Target     : Casio PB-2000C / HD61700
; Role       : Perform unsigned 32-bit arithmetic for configuration.
; Interface  : UADD32, UMUL32 and UDECAPP.
; Maintainer : Xandrian Labs
; ----------------------------------------------------------------------
; Overflow is reported by the decimal append helper.
; ======================================================================

; PURPOSE : Accumulate an unsigned 32-bit value.
UADD32:
        ADW     $15,$5
        JR      NC,UADD_HI
        ADW     $17,$SY
UADD_HI:
        ADW     $17,$7
        RTN

; PURPOSE : Compute a bounded unsigned 32-bit product.
UMUL32:
        LDM     $0,$15,4
        SBW     $15,$15
        SBW     $17,$17

M32_LOOP:
        SBW     $10,$10
        SBCW    $5,$10
        JR      NZ,M32_BIT
        SBCW    $7,$10
        RTN     Z

M32_BIT:
        ANC     $5,$SY
        JR      Z,M32_SHIFT
        ADW     $15,$SZ
        JR      NC,M32_ADDHI
        ADW     $17,$SY

M32_ADDHI:
        ADW     $17,$2

M32_SHIFT:
        BIUW    $0
        ROUW    $2
        BIDW    $8
        RODW    $6
        JR      M32_LOOP

; PURPOSE : Append a decimal digit with overflow checking.
; OUTPUT  : $4=0 valid / 1 overflow.
UDECAPP:
        LD      $4,$5

        LDW     $5,&H9999
        LDW     $7,&H1999

        SBCW    $17,$7
        JR      C,DAPP_SAFE
        JR      NZ,DAPP_OVF

        SBCW    $15,$5
        JR      C,DAPP_SAFE
        JR      NZ,DAPP_OVF

        SBC     $4,6
        JR      C,DAPP_SAFE
        JR      DAPP_OVF

DAPP_SAFE:
        LDW     $5,10
        SBW     $7,$7
        CAL     UMUL32

        LD      $5,$4
        LD      $6,0
        SBW     $7,$7
        CAL     UADD32

        LD      $4,0
        RTN

DAPP_OVF:
        LD      $4,1
        RTN

; end of include
