rendered paste body// Laboratorijska vjezba 03
// By Igor Kovacic
// 0246002237
// Rjesenje u asembleru
.include "m128def.inc"
//inicijalizacija stoga
ldi r16, LOW(RAMEND)
out spl, r16
ldi r16, HIGH(RAMEND)
out sph, r16
ldi r31, 0
ldi r30, 1
ldi r29, 2
ldi r28, 0x0A
clr r22
clr r23
// R17:R16 broj 16-bitnih podataka u polju, 6000(10)=1770(16)
ldi r16, 0x70
ldi r17, 0x17
// R19:R18 donja granica, -2000(10)=F830(16)
ldi r18, 0x30
ldi r19, 0xF8
// R21:R20 gornja granica, 4000(10)=0FA0(16)
ldi r20, 0xA0
ldi r21, 0x0F
// postavi X na 0x2000 (X=r27:r26)
ldi r26, 0x00
ldi r27, 0x20
// broj koji se upisuje r25:r24 (kreni od -10000)
ldi r24, 0xF0
ldi r25, 0xD8
pocetak:
// upisi broj i uvecaj X
st X+, r24
st X+, r25
// povecaj broj koji se upisuje za 10
add r24, r28
adc r25, r31
// smanji broj elemenata
sub r16, r30
sbc r17, r31
// izadi ako je popunjeno
tst r17
brne pocetak
tst r16
brne pocetak
call potprogram
nop
// pocetak potprograma
potprogram:
// postavi X na 0x2000
ldi r26, 0x00
ldi r27, 0x20
// R17:R16 broj 16-bitnih podataka u polju, 6000(10)=1770(16) (+1 zbog smanjenja)
ldi r16, 0x71
ldi r17, 0x17
ponovi:
// smanji broj elemenata
ldi r31, $0
sub r16, r30
sbc r17, r31
// ako dodemo do kraja polja
tst r16
brne dalje
tst r17
breq vrati
dalje:
// ucitaj broj i uvecaj adresu X-a
ld r24, X+
ld r25, X+
// usporedi s donjom granicom
cp r25, r19 // visi bitovi
brlt ponovi
// usporedi s gornjom granicom
cp r21, r25
brlt ponovi
// povecaj brojac
ldi r31, $0
add r22, r30
adc r23, r31
jmp ponovi
vrati: ret