Yes I noticed that. Still no such reduction.
Most compact code was obtained with the crude
word_temp.byte0=adresl
word_temp.byte1=adresh
array[i]=word_temp
Now that I think about it, it is just two transfer. So makes sense, doesn't it?
Ioannis
Yes I noticed that. Still no such reduction.
Most compact code was obtained with the crude
word_temp.byte0=adresl
word_temp.byte1=adresh
array[i]=word_temp
Now that I think about it, it is just two transfer. So makes sense, doesn't it?
Ioannis
Last edited by Ioannis; - 29th January 2020 at 09:09.
not much on today so i tried a few options with pic16f877 and 16f1825 with no other complications code wise
resultant code sizes are commented
Code:array var word[2] ADRESLO VAR BYTE inx var byte ADRESHi VAR BYTE ;METHOD 0 word_temp var word ;METHODS 2 AND 3 array_asbyte var byte ext @array_asbyte=_array ;ALL METHODS EXCEPT 0 , 1 i var byte i=0 ;METHOD 4 @ MOVE?CW _array , FSR0L ; PIC16 ENH CORE ;METHOD 5 '@ MOVE?CW _array , FSR ; PIC16 SHITTY OLD CHIP for inx=0 to 3 ;1 FOR METHOD 0 ; 36 WORDS ' word_temp.byte0=adreslo ;METHOD 0 ' word_temp.byte1=adreshi ' array[inx]=word_temp ' array[inx]=(adreshi<<8)| adreslo ;METHOD 1 ; 52 WORDS ' if !i&1 then ;METHOD 2 ; 60 WORDS ' array_asbyte[i]=ADRESLO ' else ' array_asbyte[i]=ADRESHi ' endif ' i=1+1 ' array_asbyte[i]=ADRESLO ;METHOD 3 ; 34 WORDS ' i=1+1 ' array_asbyte[i]=ADRESHi ' i=1+1 asm ;METHOD 4 PIC16 ENH CORE; 23 WORDS MOVE?BA _ADRESLO MOVWI FSR0++ MOVE?BA _ADRESHi MOVWI FSR0++ ENDASM 'asm ;METHOD 5 PIC16 SHITTY OLD CHIP; 29 WORDS ' MOVE?BA _ADRESLO ' MOVWF INDF ' INCF FSR,F ' MOVE?BA _ADRESHi ' MOVWF INDF ' INCF FSR,F 'ENDASM next stop
Warning I'm not a teacher
Wow! Thanks for the extensive test.
I suppose i=1+1 should be i=i+1, but does not matter in this test.
The MOVE?BA _ADRESLO are macros I guess, but where can I find documentation how to use that stuff?
Ioannis
might need glassesI suppose i=1+1 should be i=i+1, but does not matter in this test.
there is none i know of but its pretty simplewhere can I find documentation how to use that stuff?
A = wreg
B= byte
C= constant
L= label
W=word
S= string
the same as USERCOMMAND
so
MOVE?BA _ADRESLO
is move byte @ ADRESLO to wreg
it saves all that banksel typing
ie
asm
banksel _ADRESLO
movf _ADRESLO,w
banksel whatever is next
Warning I'm not a teacher
Thanks Richard.
Well this makes things more clear. Once I remember doing things in ASM, the banklsel was a pain...
Ioannis
Received from Charles this very interesting (and I suppose undocumented) tip:
array.highbyte[i << 1]=adresh
array.lowbyte[i << 1]=adresl
OR
array.highbyte[i * 2]=adresh
array.lowbyte[i * 2]=adresl
instead of
array.highbyte[i]=adresh
array.lowbyte[i]=adresl
Really interesting!
Ioannis
Another PBP trick when mixing with ASM is to declare your variables with the addendum SYSTEM:
...becomes:Code:Variable VAR BYTE @MOVF _Variable, W
Code:Variable VAR BYTE SYSTEM @MOVF Variable, W
Bookmarks