Посмотрел на кодевижн-асм. Там сильно можно сэкономить на ap=pzu[(cod.sumadd&0xffc000)>>14];. И он не совсем асм, ибо макросы не раскрыты. Например, RCALL __ASRW4 явно сдвиг с циклом. Кто такие __SAVELOCR2 и __LOADLOCR2P, я не понял.
Если украсть у компилятора 4 регистра, можно из нижней половины, то можно сэкономить на прологе/эпилоге там где ST r22..25 и LD они же.
Вот текст от кодевижена и чем его можно заменить:
ST -Y,R22 ST -Y,R22
ST -Y,R23 ST -Y,R23
ST -Y,R24 ST -Y,R24
ST -Y,R25 ST -Y,R25
ST -Y,R26 ST -Y,R26
ST -Y,R27 X ST -Y,R27 X
ST -Y,R30 ST -Y,R30
ST -Y,R31 Z ST -Y,R31 Z
IN R30,SREG IN R30,SREG
ST -Y,R30 ; 0000 001A unsigned char ap,bp ; ST -Y,R30
; 0000 001B ap=pzu[(cod.sumadd&0xffc000)>>14];
RCALL __SAVELOCR2 ???
;ap -> R17
;bp -> R16 &ffc000 >>14,used bits:
LDS R30,_cod LDS R30,_cod &00 >> xxxx xxxx
LDS R31,_cod+1 LDS R31,_cod+1 &co >> 10xx xxxx
LDS R22,_cod+2 LDS R22,_cod+2 &ff >> 9876 5432
LDS R23,_cod+3 <23:22:31:30> cod.sumadd LDS R23,_cod+3 &00 >> xxfe dcba
__ANDD1N 0xFFC000 cod.sumadd&0xffc000
MOVW R26,R30
MOVW R24,R22 <25:24:27:26> cod.sumadd
LDI R30,LOW(14)
RCALL __LSRD12 <25:24:27:26> >> <30> rol r31
rol r22
LSRD12 сдвиг 4 байтов пока R30-- > 0 rol r23
14*4 LSR + (dec r30, brne)*14 rol r31
rol r22
rol r23 <22:23> (cod.sumadd&0xffc000)>>14
SUBI R30,LOW(-_pzu*2) ldi R30,LOW(_pzu*2)
SBCI R31,HIGH(-_pzu*2) Z = 2*PZU ldi R31,HIGH(_pzu*2)
LPM R17,Z <17>=pzu[(cod.sumadd&0xffc000)>>14] LPM R17,Z <17> ap=pzu[(cod.sumadd&0xffc000)>>14]
; 0000 001C bp=(ap&0xc0)>>4;
MOV R30,R17 MOV R30,R17
ANDI R30,LOW(0xC0) ANDI R30,LOW(0xC0)
LDI R31,0 lsr r30
RCALL __ASRW4 ASRW arithmetic(!?) shift word? lsr r30
MOV R16,R30 lsr r30
lsr r30 <30> bp=(ap&0xc0)>>4
; 0000 001D ap=ap&0x3f;
ANDI R17,LOW(63) ANDI R17,LOW(63)
; 0000 001E PORTC=ap;
OUT 0x15,R17 OUT 0x15,R17
; 0000 001F PORTD=bp;
OUT 0x12,R16 OUT 0x12,R16
; 0000 0020 cod.sumadd=cod.sumadd+stepfaz;
LDS R30,_stepfaz LDS R30,_stepfaz
LDS R31,_stepfaz+1 LDS R31,_stepfaz+1
LDS R22,_stepfaz+2 LDS R22,_stepfaz+2
LDS R23,_stepfaz+3 LDS R23,_stepfaz+3
LDS R26,_cod LDS R26,_cod
LDS R27,_cod+1 LDS R27,_cod+1
LDS R24,_cod+2 LDS R24,_cod+2
LDS R25,_cod+3 LDS R25,_cod+3
RCALL __ADDD12 add R30,R26
adc R31,R27
adc R22,R24
adc R23,R25
STS _cod,R30 STS _cod,R30
STS _cod+1,R31 STS _cod+1,R31
STS _cod+2,R22 STS _cod+2,R22
STS _cod+3,R23 STS _cod+3,R23
; 0000 0021
; 0000 0022 };
RCALL __LOADLOCR2P ???
LD R30,Y+ LD R30,Y+
OUT SREG,R30 OUT SREG,R30
LD R31,Y+ LD R31,Y+
LD R30,Y+ LD R30,Y+
LD R27,Y+ LD R27,Y+
LD R26,Y+ LD R26,Y+
LD R25,Y+ LD R25,Y+
LD R24,Y+ LD R24,Y+
LD R23,Y+ LD R23,Y+
LD R22,Y+ LD R22,Y+
LD R0,Y+ LD R0,Y+
RETI; RETI;