Code:
' red0 = (boden_value_red0[2*i]*256 | boden_value_red0[2*i + 1]) >> 2;
Dim Red0 As Word
Dim Boden_value_red0(16) As Byte
Dim I As Byte
Dim X1 As Byte
X1 = I * 2
Red0 = Boden_value_red0(x1) * 256
Incr X1
Red0 = Red0 Or Boden_value_red0(x1)
Shift Red0 , Right , 2
End
RED0 Word 0060 96
BODEN_VALUE_RED0 Byte (16) 0062 98
I Byte 0072 114
X1 Byte 0073 115
; X1 = I * 2
LDS r16,0x0072 ; r16 = i
LDI r20,0x02 ; r20 = "2"
MUL r16,r20 ; mul
LDI XL,0x73
LDI XH,0x00
ST X,r0 ; X1
; red0 = tab (X1) * 256
LDI XL,0x73 ; X1
LDI XH,0x00
LD r10,X+ ;
CLR r11 ;
LDI XL,0x61 ;
LDI XH,0x00
ADD XL,r10
ADC XH,r11 ; tab[X1]
LD r16,X+ ; r16:r17 = tab[X1]
CLR r17
LDI r20,0x00
LDI r21,0x01 ; r20:r21 = "256"
CALL L_0x012E ; multiply
LDI XL,0x60
LDI XH,0x00
ST X+,r16
ST X,r17 ; red0 = tab[i*2] * 256
; incr X1
LDI XL,0x73
LDI XH,0x00
LD r24,X
SUBI r24,0xFF
ST X,r24
; red0 = red0 OR tab(x1)
LDI XL,0x60 ;
LDI XH,0x00
LD r16,X+
LD r17,X ; r16:r17 = red0
LDI XL,0x73 ; s.o.
LDI XH,0x00
LD r10,X+
CLR r11
LDI XL,0x61 ; tab -offset
LDI XH,0x00
ADD XL,r10
ADC XH,r11
LD r20,X r20:r21 = tab(i*2 + 1)
CLR r21
OR r16,r20
OR r17,r21
LDI XL,0x60
LDI XH,0x00
ST X+,r16 ;red0
ST X,r17
; shift red0, right, 2
LDI r25,0x02 ; = "2"
LDI XL,0x60 ; &red0
LDI XH,0x00
CALL L_0x0158 ; shift right
;---------------END---------------
CLI
L_0x00EA:
RJMP L_0x00EA
;------------------- r16:r17 *= r20:r21 -----------
L_0x012E:
PUSH r0
MUL r16,r20
MOV r2,r0
MOV r3,r1
MUL r20,r17
ADD r3,r0
MUL r21,r16
ADD r0,r3
MOV r16,r2
MOV r17,r0
POP r0
RET
;-------- shift @(xL:xH) right r25 times
L_0x0158:
CPI r25,0x00
BREQ L_0x016C
LD r16,X+
LD r17,X
L_0x0160:
LSR r17
ROR r16
DEC r25
BRNE L_0x0160
ST X,r17
ST -X,r16
L_0x016C:
RET
Also ganz brav, er verwendet zum Multiplizieren und zum Shiften Library-Functions. Brauch dadurch mehr platz, aber dann hat er das ein für alle Mal.
Lesezeichen