Jag sitter och portar över kod ifrån en Mega32:a till en Tiny15.
Det mesta är löst förutom en sak.
Jag använder Adiw för att öka Z-pekaren. T15 har dock inte det kommandot i sin in instruktionslista. Vad kan jag använda istället för att öka ZH och ZL?
Om du använder Z tillsammans med t ex 'ld' eller 'st' så kan du ju ange att Z-pekaren ska öka automatiskt med ett, så slipper du göra det manuellt. Om du inte använder Z till det eller av någon annan anledning vill öka Z med ett så är väl ett sätt att köra med,
ld dummy, Z+
(där dummy är något register som du inte använder)
Om du nu vill öka/minska med ett alltså. Annars får du väl kolla på subi och sbci.
Jag pekar Z för att läsa id´t på en I-button som jag har i minnet.
Jag testar byte för byte och ökar då Z för att testa nästa byte.
Alltså: läser in 1:a byten ifrån nyckeln, gämnför den med 1:a byten i key:, sedan nästa osv.
Jag provade att köra inc r30, inc r31 men det funkade inte. (zl=r30, zh=r31)
När du läser av det som ligger där Z pekar så använder du väl 'lpm'? Då borde du kunna göra så här för att spara ett värde i taget och samtidigt öka Z-pekaren med ett.
lpm r16, Z+ ;sparar första värdet i 'key' i r16
;gör något med r16
lpm r16, Z+ ;sparar andra värdet i 'key' i r16
osv.
Finns inte adiw som intruktion så skulle jag inte tro att instruktionerna som i vanliga fall går att skriva med +/- finns heller. Eftersom att skriva +/- framför/bakom registret inte är ett makro, utan tillhör instruktionen LD, LPM ST mfl och har svårt att se varför man skulle plocka bort adiw, men behålla dessa troligtvis-krångligare-att-implementera-i-hårvaran-instruktioner
Du får helt enkelt öka på r30 och sedan kolla om det är lika med noll, och isåfall öka på även r31.
Ok, för det ungerade inge vidare med cykze´s alternativ. (tack ändå)
Varför kolla om r30 är = 0 innan man ökar r31?
Får prova detta när jag kommer hem sen.
Hedis: För att det är så ett binärt tal är uppbyggt. ZH:ZL utgör ju ett 16 bitars-tal tillsammans. Så när ZL slår över från 11111111 till 00000000 så ska ZH öka med ett.
;***************************************************************************
;*
;* "addi16" - Adding 16-bit register with immediate
;*
;* This example adds a register variable (addi1l,addi1h) with an
;* immediate 16-bit number defined with .equ-statement. The result is
;* placed in (addi1l, addi1h).
;*
;* Number of words :2
;* Number of cycles :2
;* Low registers used :None
;* High registers used :2
;*
;* Note: The sum and the addend share the same register. This causes the
;* addend to be overwritten by the sum.
;*
;***************************************************************************
;***** Register Variables
.def addi1l = r16
.def addi1h = r17
;***** Immediate 16-bit number
.equ addi2 = 0x1234
;***** Code
addi16: subi add1l, low(-addi2) ;Add low byte ( x -(-y)) = x + y
sbci add1h, high(-addi2) ;Add high byte with carry
;Expected result is 0xBE9C