;********************
;* 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