|
extern "C" void lcd_scroll(void)
{
unsigned int x,y,plus;
unsigned char s;
for(y=1; y < 4; y++)
for(x=0; x < 20; x++)
{
if(y&0x02) plus=20;
else plus=0;
if(y&0x01) lcd_cmd(0xC0+plus+x);
else lcd_cmd(0x80+plus+x);
s = lcd_read_dat();
if((y-1)&0x02) plus=20;
//
// Результат компиляции:
//
// MOV.B R10, R14 ; y -> R14
// ADD.B #0xff, R14 ; OK
// BIT.B #0x2, R14 ; OK
// JEQ $else... ; OK
// $plus = 20
//
else plus=0;
if((y-1)&0x01) lcd_cmd(0xC0+plus+x);
//
// Результат компиляции:
//
// mov.b R10,R14 ; y -> R14
// and.b #0x1,R14 ; BUG! почему??? (неправильный порядок инструкций???)
// add.b #0x1,R14 ; BUG!
// tst.b R14 ; BUG! почему??? (может быть "bit.b #0x01,R14" ???)
// jeq $else... ; result - incorrect jump!!!
// $lcd_cmd(...
//
else lcd_cmd(0x80+plus+x);
lcd_dat(s);
}
lcd_cmd(0xC0+20); // at line 3for(x=0; x < 20; x++) lcd_dat(' ');
lcd_cmd(0xC0+20); // at line 3
}
error situation:
y = 1mov.b R10,R14 ; R14 = 1
and.b #0x1,R14 ; R14 = R14 & 0x01 = 1 & 0x01 = 1
add.b #0x1,R14 ; R14 = R14 + 0x01 = 1 + 0x01 = 2
tst.b R14 ; R14=2 ==>NOT ZERO! (а правильно ZERO!)
jeq $else... ; jump не происходит (а должен произойти!)
Очевидно ошибка парсера выражений в ПОЛИЗ... ;(((
E-mail: info@telesys.ru