; Bubble sort: shrink each pass; stop when no swaps.
BUBBLE_SORT:
        PRE     IX,SORT_NVAL
        LDW     $18,(IX+$SX)
        SBW     $18,$SY
        ANCW    $18,$18
        RTN     Z
        PRE     IX,SORT_BEND
        STW     $18,(IX+$SX)
BUB_PASS:
        PRE     IX,SORT_BSWAP
        ST      $31,(IX+$SX)
        PRE     IX,SORT_MVAL
        LDW     $8,(IX+$SX)
        LDW     $12,SORT_BASE
        LDW     $14,$12
        ADW     $14,$8
        PRE     IX,SORT_BEND
        LDW     $16,(IX+$SX)
BUB_INNER:
        ANCW    $16,$16
        JP      Z,BUB_ENDPASS
        LDW     $20,$12
        LDW     $22,$14
        LDW     $24,$8
        CAL     CMP_SORT
        SBC     $0,1
        JR      NZ,BUB_NOSWAP
        PRE     IX,SORT_BSWAP
        ST      $30,(IX+$SX)
        LDW     $20,$12
        LDW     $22,$14
        LDW     $24,$8
        CAL     SWAP_REC
BUB_NOSWAP:
        ADW     $12,$8
        ADW     $14,$8
        SBW     $16,$SY
        JP      BUB_INNER
BUB_ENDPASS:
        PRE     IX,SORT_BSWAP
        LD      $0,(IX+$SX)
        AN      $0,$0
        RTN     Z
        PRE     IX,SORT_BEND
        LDW     $18,(IX+$SX)
        SBW     $18,$SY
        STW     $18,(IX+$SX)
        ANCW    $18,$18
        RTN     Z
        JP      BUB_PASS
