; franjo stipanovic
; arh 3
; atmega128
.include "m128def.inc"
.equ adresa = $2000
.equ podaci = 6000
; prvi element u nizu
.equ prvi = -10000
; granice
.equ donja = -1000
.equ gornja = -900
rjmp start
trazi:
; ucitajmo broj
ld r0, X+
ld r1, X+
; oduzmi
sub r16, r2
sbc r17, r3
brmi trazi_kraj
; donja granica
push r0
push r1
sub r0, r18
sbc r1, r19
pop r1
pop r0
brmi trazi
; gornja granica
sub r0, r20
sbc r1, r21
breq odgovara
brpl trazi
odgovara:
add r22, r2
adc r23, r3
rjmp trazi
trazi_kraj:
ret
start:
; inicijalizacija stack pointera
; RAMEND -> (highest) end sram address ($10ff)
ldi r16, LOW(RAMEND)
out SPL, r16
ldi r16, HIGH(RAMEND)
out SPH, r16
; pomocni registri (r2 i r3) za operacije
ldi r16, 1
mov r2, r16
clr r3
; brojevi za zapis, pocnimo od -10000
ldi r30, LOW(prvi)
ldi r31, HIGH(prvi)
; broj podataka za zapis, 6000
ldi r16, LOW(podaci)
ldi r17, HIGH(podaci)
push r16
push r17
; adresa u X reg
ldi r26, LOW(adresa)
ldi r27, HIGH(adresa)
push r26
push r27
; donja granica
ldi r18, LOW(donja)
ldi r19, HIGH(donja)
; gornja granica
ldi r20, LOW(gornja)
ldi r21, HIGH(gornja)
petlja:
tst r17
brmi kraj
st X+, r30
st X+, r31
; uvecaj element u nizu
adiw r31:r30, 10
; smanji broj podataka za 1
sub r16, r2
sbc r17, r3
rjmp petlja
kraj:
; vratimo adresu u X
pop r27
pop r26
; vratimo broj podataka za zapis
pop r17
pop r16
; pozovimo potprogram
rcall trazi
nop