;********************
;*   Main program   *
;********************
        `ORG    0
        LOADL   R7, 10000       ;inicijalizacija stoga
        LOADL   R1, #LO BLOCK   ;ucitaj adresu bloka
        LOADH   R1, #HI BLOCK   ;       -||-
        LOAD    R4, (LIMIT)     ;ucitaj granicu bloka
        CLEAR   R2
        CLEAR   R3
        
LOOP    LOAD    R0, (R1)        ;ucitaj podatak
        CMP     R0, R4          ;da li je kraj?
        JR_EQ   END
        MOVE    R0, R5          ;sacuvaj originalni podatak
        CALL    MIRR1           ;pozovi potprogram
        SUB     R0, R5, R0      ;oduzmi broj i zrcalnu kopiju
        JR_NN   NOTN            ;skoci ako nije negativan
        NEG     R0              ;apsolutna vrijednost
NOTN    ADD     R0, R2, R2      ;dodaj u sumu
        ADC     0, R3, R3       ;dodja carry ako ga je bilo
        INC     R1              ;povecaj memorijski pokazivac
        JR      LOOP

END     HALT

;*********************
;* Subroutine Mirror *
;*********************
        `ORG    50
MIRR1   PUSH    R1              ;R1 treba za privremeni rezultat
        CLEAR   R1
        PUSH    R2              ;R2 - brojac
        LOADL   R2, %D 32       ;brojac broja operacija
        
MIRLOOP ROTR    1, R0, R0       ;rotiraj udesno R0, 0-bit u carry
        ROTLnc  1, R1, R1       ;rotiraj ulijevo R1, carry na 0-bit
        ADC     0, R1, R1       ;dovuci carry u R1
        DEC     R2              ;smanji brojac
        JR_NZ   MIRLOOP

        POP     R2
        MOVE    R1, R0          ;kopiraj rezultat u R0
        POP     R1
        RET

        `ORG    100
BLOCK   `DW     0A00A0A0, 01111110, 0, 000FF000, 99999999
LIMIT   `DW     99999999

        `END