Hejsan.
Jag stötte på ett litet problem när jag programmerade min 2313 nyss.
Det jag har är ett register med värdet 0x01 i, alltså bara bit 0 är satt.
Det jag skulle vilja göra är att skifta den biten ett antal steg, nämligen så många som det står i ett annat register.
De shift och rotations operationer som finns shiftar bara konstant antal steg.
Så, vad kan man göra då? Jo, en enkel liten loop kanm an juh snickra ihop, men ack vad fult och onödigt det känns...finns det inget annat sätt?
Tack o hej
avr 2313 asm, skifta godt. antal bitar?
Tänkte vissa några alternativ
f1 typ case satsen
f2 är lock up table typ
f3 är den vanliga
f1 och f2 kan det behövas a push och popa register som man inte vill förlora (r30, r31 samt r0 för f2)
Dock de inte är bättre... utan lite anorlunda
multplikation hjälper dock inte i det här falet....
f1 typ case satsen
f2 är lock up table typ
f3 är den vanliga
f1 och f2 kan det behövas a push och popa register som man inte vill förlora (r30, r31 samt r0 för f2)
Kod: Markera allt
;Exempel 1
; size 13 words
; cyckler 6-13 + ret
f1:
ldi r30, low(hopp+7)
ldi r31, high(hopp+7)
sub r30, R16
sbci r31,0
ijmp
hopp:
lsl r17
lsl r17
lsl r17
lsl r17
lsl r17
lsl r17
lsl r17
ret
;Slut på funktionen
;Exempel 2
; size 13 word
; cyckler 1-10 + ret
f2:
sbrs r17, 0
ret
ldi r30, low(table<<1)
ldi r31, high(table<<1)
add r30, R16
sbci r31,0
lpm
mov r17, r0
ret
table:
.dw 0x0201
.dw 0x0804
.dw 0x2010
.dw 0x8040
;Exempel 3
; size 5 word
; cyckler 3-38 + ret
f3:
dec r16
brmi f3_hopp
lsl r17
rjmp f3
f3_hopp:
ret
multplikation hjälper dock inte i det här falet....