martedì 28 maggio 2013

#include<p18f452.h>

#pragma config LVP=OFF
#pragma config OSC=HS
#pragma config WDT=OFF

#define idle SSPCON2bits.ACKEN | SSPCON2bits.RCEN | SSPCON2bits.PEN | SSPCON2bits.RSEN | SSPCON2bits.SEN | SSPCON2bits.ACKSTAT | SSPSTATbits.R_W

void Enable(void);
void Waitms(int);
void Waitus(int);
void ConfigTMR(void);
void ConfigI2C(void);
int Trasmissione(void);
int ADconversion(void);

void Riga1(void);
void Riga2(void);
void Inizializza(void);
void Writechar(char*);
void Writeint(int);
void Scrivitemp_LCD(void);
void Scrivitens_LCD(void);
void clearLCD(void);






void main(){
        char benv[10]={"BENVENUTO"};
        char s1[9]={"SW1 -> V"};
        char s2[9]={"SW2 -> T"};
        short int i;

        T0CON=0;
            TRISC=24;
            TRISD=0;
            PORTC=0;
            PORTD=0;

        ConfigTMR();
        ConfigI2C();
        Inizializza();           

        Riga1();
        Writechar(benv);
           
        for(i=0; i<50; i++){
                    Waitus(9000000); //fare conto..
                   }
           
        clearLCD();
        Riga1();
        Writechar(s1);
        Riga2();
        Writechar(s2);
           
        while(1){
            if(!PORTBbits.RB0){
                    clearLCD();
                    while(PORTBbits.RB1){
                            Scrivitens_LCD();
                            Waitus(100);
                             }
                    }                   
            if(!PORTBbits.RB1){
                    clearLCD();
                    while(PORTBbits.RB0){
                              Scrivitemp_LCD();
                               Waitus(100);
                             }
                    }           
                                                          
                     }
}






void Enable(void){
          PORTCbits.RC5=1;
          Nop();
          PORTCbits.RC5=0;
        }


void Waitms(int num){
        num = 0xFFFF-(num*1000);
        TMR0H=num/256;
        TMR0L=num-(num/256)*256;
        T0CONbits.TMR0ON=1;
        while(!INTCONbits.TMR0IF);
        INTCONbits.TMR0IF=0;
        T0CONbits.TMR0ON=1;
        }


void Waitus(int num){
        num = 0xFFFF-(num);
        TMR0H=num/256;
        TMR0L=num-(num/256)*256;
        T0CONbits.TMR0ON=1;
        while(!INTCONbits.TMR0IF);
        INTCONbits.TMR0IF=0;
        T0CONbits.TMR0ON=1;
        }


void ConfigTMR(void){
        T0CON=0;
        T0CONbits.T08BIT=0;
        T0CONbits.PSA=1;
        }







void clearLCD(void){
        PORTCbits.RC1 = 0;
        PORTCbits.RC2 = 0;
        PORTD = 0b00000001;
        Enable();
        Waitus(100);
        }

void Writechar(char* dato){
        short int i=0;
        PORTCbits.RC1=1;
        PORTCbits.RC2=0;
        while(dato[i]!=0){
                PORTD=dato[i];
                Enable();
                Waitus(100);
                i++;
                }
                  }

void Writeint(int dato){
            PORTCbits.RC1=1;
            PORTCbits.RC2=0;
            PORTD=dato;
            Enable();
            Waitms(100);
                    }

void Inizializza(void){
            PORTCbits.RC0 = 1; //ACCENDI LCD
            Waitms(20);
                   
            PORTCbits.RC1 = 0; //SCELTA CMD
            PORTCbits.RC2 = 0; //SCRIVI
                   
            // Attivazione LCD
            PORTD = 0x30;
            Enable();
            Waitms(5);
            PORTD = 0x30;
            Enable();
            Waitus(100);
            PORTD = 0x30;
            Enable();
            Waitus(100);
            // Fine attivazione LCD
                           
            PORTD = 0b00111000;
            Enable();
            Waitus(100);           
            PORTD = 0b00001000;
            Enable();
            Waitus(100);       
            PORTD = 0b00000001;
            Enable();
            Waitus(100);           
            PORTD = 0b00000110;
            Enable();
            Waitms(2);           
            PORTD = 0b00001100;
            Enable();
            Waitus(100);
                       }

void Riga1(void){
        PORTCbits.RC1=0;
        PORTD=0x80;
        Enable();
        Waitms(100);
        }

void Riga2(void){
        PORTCbits.RC1=0;
        PORTD=0xc0;
        Enable();
        Waitms(100);
        }








void ConfigI2C(void){
        SSPCON1=0x28;
        SSPSTATbits.SMP=1;
        SSPSTATbits.CKE=1;
        SSPADD=0x09;
        }

int Trasmissione(void){
        int dato;
        SSPCON2bits.SEN=1;
        while(idle);
        SSPBUF=0b10011010;       
        while(idle);
        SSPBUF=0x00;
        while(idle);
        SSPCON2bits.RSEN=1;
        while(idle);
        SSPBUF=0b10011011;
        while(idle);
        SSPCON2bits.RCEN=1;
        while(idle);
        dato=SSPBUF;
        SSPCON2bits.ACKDT=1;
        SSPCON2bits.ACKEN=1;                          
        while(idle);
        SSPCON2bits.PEN=1;
        while(idle);
        return dato;
            }


void Scrivitemp_LCD(void){
          int dato;
          char temp[7]={"TEMP: "};
            char temp1[8]={"SW1-> V"};
          unsigned int u;
          unsigned int d;
              unsigned int c;
          unsigned int m;
                               
          Riga1();
          Writechar(temp1);
           dato=Trasmissione();
           Riga2();
                       
          m=dato/1000;
          c=(dato-m*1000)/100;
          d=(dato-m*1000-c*100)/10;
          u=(dato-m*1000-c*100-d*10);       
                                         
          m=m+0x30;   
          c=c+0x30;
          d=d+0x30;
          u=u+0x30;

          Writechar(temp);                                 
          Writeint(m);
          Writeint(c);
          Writeint(d);
          Writeint(u);
               }










int ADconversion (void){
            int dato;
            //ACCENSIONE
            ADCON0bits.ADON=1;
                       
                //CONFIGURO I PIN
            ADCON1bits.PCFG3=1;
            ADCON1bits.PCFG2=1;
            ADCON1bits.PCFG1=1;
            ADCON1bits.PCFG0=0;                           
            ADCON1bits.ADFM=1;
                                           
            //SELEZIONO IL CANALE DI INGRESSO
            ADCON0bits.CHS2=0;
            ADCON0bits.CHS1=0;
            ADCON0bits.CHS0=0;
                                           
            //SELEZIONO IL CLOCk
            ADCON1bits.ADCS2=0;
            ADCON0bits.ADCS1=0;
            ADCON0bits.ADCS0=1;
                                           
            //START CONVERSIONE
            ADCON0bits.GO=1;
                                           
            //Attendo la fine della conversione.
            while(ADCON0bits.GO==1);
                                           
            dato=ADRESH*256 + ADRESL;
                                           
            return dato;
            }



void Scrivitens_LCD (void){
            int dato;
            unsigned int d;
            unsigned int c;
            unsigned int m;
            unsigned int u;
            char temp[8]={"VALUE: "};
            char temp1[8]={"SW2-> T"};
            char punt[2]={"."};
               
            Riga1();
            Writechar(temp1);
                                               
            dato=ADconversion();
            Riga2();
            dato=ADconversion();
            /*       
            m=dato/1000;
            c=(dato - m*1000)/100;
            d=(dato - m*1000 - c*100)/10;
            u= dato - m*1000 - c*100 - d*10;
                                           
            m=m+0x30;
            c=c+0x30;
            d=d+0x30;
            u=u+0x30;
                                           
            Writeint(m);
            Writeint(c);
            Writeint(d);
            Writeint(u);
                                           
            Writechar(spazio);
            */               
            dato=dato*4.887;                               
            m=dato/1000;
            c=(dato - m*1000)/100;
            d=(dato - m*1000 - c*100)/10;
            u= dato - m*1000 - c*100 - d*10;
                                            
            m=m+0x30;
            c=c+0x30;
            d=d+0x30;
            u=u+0x30;
                           
            Writechar(temp);               
            Writeint(m);
            Writechar(punt);
            Writeint(c);
            Writeint(d);
            Writeint(u);
               }




void Writetim(void){
        secondi++;
        if(secondi==60){
                //selezRiga(0,6);
                PORTCbits.RC1=0;
                PORTD=0x80 + 6;
                Enable();
                Waitms(10);
                Writeint(0x30);
                Writeint(0x30);
                secondi = 0;
                minuti++;
                //Writechar(d);
                if(minuti==60){
                        minuti = 0;
                        //selezRiga(0,3);
                        PORTCbits.RC1=0;
                        PORTD=0x80 + 3;
                        Enable();
                        Waitms(10);
                        Writeint(0x30);
                        Writeint(0x30);
                        ore++;
                        Writechar(d);
                        //selezRiga(0,0);
                        PORTCbits.RC1=0;
                        PORTD=0x80;
                        Enable();
                        Waitms(10);
                        Writechar(d);
                        Writeint(ore/10 + 0x30);
                        Writeint(ore%10 + 0x30);
                        }else{
                            //selezRiga(0,3);
                            PORTCbits.RC1=0;
                            PORTD=0x80 + 3;
                            Enable();
                            Waitms(10);
                            Writeint(minuti/10 + 0x30);
                            Writeint(minuti%10 + 0x30);
                            }
                }else{
                    //selezRiga(0,6);

                      Waitms(10);
                    Writeint(ore/10 + 0x30);
                    Writeint(ore%10 + 0x30);
                    Writechar(d);
                    Writeint(minuti/10 + 0x30);
                    Writeint(minuti%10 + 0x30);
                    Writechar(d);
                    Writeint(secondi/10 + 0x30);
                    Writeint(secondi%10 + 0x30);
                    }

}




























void config_usart(void){
            PORTCbits.RC7=1;
            PORTCbits.RC6=0;
            RCSTAbits.SPEN=1;//Serial Port Enable bit
            TXSTAbits.BRGH=1;//High Baud Rate Selcet bit (1=>High speed)
            SPBRG=25;
            }

void scrivi_usart(int dato){   
                TXREG=dato;
                while(!PIR1bits.TXIF);
                Waitms(9000);
               }

int leggi_usart(void){   
              while(!PIR1bits.RCIF);
              return RCREG;
             }









void main(){
    int dato;
    int riemp;
    short int i, j;
    unsigned int u, u1;
    unsigned int d, d1;
    unsigned int c, c1;
    unsigned int m, m1;
    int mig[7];
    int cen[7];
    int dec[7];
    int uni[7];
    int buf[7];
    int max, min, med;
    short int app1;
    short int app2;
   
    ConfigI2C();
    ConfigTMR();
    config_usart();
           
    TXSTAbits.TXEN=1;//Transmission Enable bit
    RCSTAbits.CREN=1;//Continuos Receive Enable bit

    while(!Trasmissione());
           
    max=0;
    min=10;
    med=0;

    while(i<5){
        dato=Trasmissione();             
        buf[i]=dato;         
        m=(dato/1000);
        c=(dato-m*1000)/100;
        d=(dato-m*1000-c*100)/10;
        u=(dato-m*1000-c*100-d*10);
                         
        m=m+0x30;   
        c=c+0x30;
        d=d+0x30;
        u=u+0x30;
       
        mig[i]=m;
        cen[i]=c;
        dec[i]=d;
        uni[i]=u;
                       
        if(buf[i]>max){
                max=buf[i];
                app1=i;
                   }   

        if(min>buf[i]){
                app2=i;
                min=buf[i];
                  }
                       
        med=med+buf[i];
        i++;
                                       
        while(dato==Trasmissione());
        }

    med=med/5;

    m1=(med/1000);
    c1=(med-m1*1000)/100;
    d1=(med-m1*1000-c1*100)/10;
    u1=(med-m1*1000-c1*100-d1*10);       
    m1=m1+0x30;   
    c1=c1+0x30;
    d1=d1+0x30;
    u1=u1+0x30;
           
    scrivi_usart(mig[app1]);
    scrivi_usart(cen[app1]);
    scrivi_usart(dec[app1]);
    scrivi_usart(uni[app1]);
    scrivi_usart(0x20);
    scrivi_usart(0x20);
    scrivi_usart(mig[app2]);
    scrivi_usart(cen[app2]);
    scrivi_usart(dec[app2]);
    scrivi_usart(uni[app2]);       
    scrivi_usart(0x20);
    scrivi_usart(0x20);
    scrivi_usart(m1);
    scrivi_usart(c1);
    scrivi_usart(d1);
    scrivi_usart(u1);
    while(1);       
       }

martedì 26 marzo 2013

programmazione PIC 18f452 tramite MPLAB

#include<p18f452.h>

#pragma config LVP=OFF
#pragma config OSC=HS
#pragma config WDT=OFF

#define idle SSPCON2bits.ACKEN | SSPCON2bits.RCEN | SSPCON2bits.PEN | SSPCON2bits.RSEN | SSPCON2bits.SEN | SSPCON2bits.ACKSTAT | SSPSTATbits.R_W

void Enable(void);
void Waitms(int);
void Waitus(int);
void ConfigTMR(void);
void ConfigI2C(void);
int Trasmissione(void);
int ADconversion(void);

void Riga1(void);
void Riga2(void);
void Inizializza(void);
void Writechar(char*);
void Writeint(int);
void Scrivitemp_LCD(void);
void Scrivitens_LCD(void);

void scrivi_usart(int);
int leggi_usart(void);
void config_usart(void);

void main(){
        T0CON=0;
        TRISC=24;
        TRISD=0;
        PORTC=0;
        PORTD=0;



________cose_che_servono_sempre____________________

void Enable(void){
          PORTCbits.RC3=1;
          Nop();
          PORTCbits.RC3=0;
                 }


void Waitms(int flg){
             int  num = 0xFFFF-(flg*1000);
             TMR0H=num/256;
             TMR0L=num-(num/256)*256;
             T0CONbits.TMR0ON=1;
             while(!INTCONbits.TMR0IF);
             INTCONbits.TMR0IF=0;
             T0CONbits.TMR0ON=1;
                    }


void Waitus(int flg){
             int num = 0xFFFF-(flg);
             TMR0H=num/256;
             TMR0L=num-(num/256)*256;
             T0CONbits.TMR0ON=1;
             while(!INTCONbits.TMR0IF);
             INTCONbits.TMR0IF=0;
             T0CONbits.TMR0ON=1;
                    }


void ConfigTMR(void){
             T0CON=0;
             T0CONbits.T08BIT=0;
             T0CONbits.PSA=1;
                    }


void ConfigI2C(void){
             SSPCON1=0x28;
             SSPSTATbits.SMP=1;
             SSPSTATbits.CKE=1;
             SSPADD=0x09;
                    }



________TEMPERATURA_____________________


int Trasmissione(void){
               int dato;
            SSPCON2bits.SEN=1;
            while(idle);
            SSPBUF=0b10011010;
            while(idle);
            SSPBUF=0x00;
            while(idle);
            SSPCON2bits.RSEN=1;
            while(idle);
            SSPBUF=0b10011011;
            while(idle);
            SSPCON2bits.RCEN=1;
            while(idle);
            dato=SSPBUF;
            SSPCON2bits.ACKDT=1;
            SSPCON2bits.ACKEN=1;                          
            while(idle);
            SSPCON2bits.PEN=1;
            while(idle);
            return dato;
              }


void Scrivitemp_LCD(void){
              int dato;
              char temp[12]={"TEMPERATURA"};


              unsigned int u;
              unsigned int d;
              unsigned int c;
              unsigned int m;
                   
              Riga1();
              Writechar(temp);
              while(1){
                       dato=Trasmissione();
                       Riga2();
       
                      m=dato/1000;
                     c=(dato-m*1000)/100;
                    d=(dato-m*1000-c*100)/10;
                      u=(dato-m*1000-c*100-d*10);
                                     
                      m=m+0x30;   
                      c=c+0x30;
                      d=d+0x30;
                      u=u+0x30;
                                         
                      Writeint(m);
                      Writeint(c);
                      Writeint(d);
                      Writeint(u);
                      }
            }


________TENSIONE______________________



int ADconversion (void){
            int dato;
            //ACCENSIONE
            ADCON0bits.ADON=1;
           
              //CONFIGURO I PIN
            ADCON1bits.PCFG3=1;
            ADCON1bits.PCFG2=1;
            ADCON1bits.PCFG1=1;
            ADCON1bits.PCFG0=0;                           
            ADCON1bits.ADFM=1;
                               
            //SELEZIONO IL CANALE DI INGRESSO
            ADCON0bits.CHS2=0;
            ADCON0bits.CHS1=0;
            ADCON0bits.CHS0=0;
                               
            //SELEZIONO IL CLOCk
            ADCON1bits.ADCS2=0;
            ADCON0bits.ADCS1=0;
            ADCON0bits.ADCS0=1;
                               
            //START CONVERSIONE
            ADCON0bits.GO=1;
                               
            //Attendo la fine della conversione.
            while(ADCON0bits.GO==1);
                               
            dato=ADRESH*256 + ADRESL;
                               
            return dato;
            }



void Scrivitens_LCD (void){
            int dato;
            unsigned int d;
            unsigned int c;
            unsigned int m;
            unsigned int u;
            char temp[14]={"COD.   VALUE."};
            char spazio[4]={"___"};
            char punt[2]={"."};

            Riga1();
            Writechar(temp);
                   
            while(1){           
                 dato=ADconversion();
                 Riga2();
                 dato=ADconversion();
                       
                 m=dato/1000;
                 c=(dato - m*1000)/100;
                 d=(dato - m*1000 - c*100)/10;
                 u= dato - m*1000 - c*100 - d*10;
                               
                 m=m+0x30;
                 c=c+0x30;
                 d=d+0x30;
                 u=u+0x30;
                               
                 Writeint(m);
                 Writeint(c);
                 Writeint(d);
                 Writeint(u);
                               
                 Writechar(spazio);
                               
                 dato=dato*4.887;                               
                 m=dato/1000;
                 c=(dato - m*1000)/100;
                 d=(dato - m*1000 - c*100)/10;
                 u= dato - m*1000 - c*100 - d*10;
                                
                      m=m+0x30;
                 c=c+0x30;
                 d=d+0x30;
                 u=u+0x30;
                               
                 Writeint(m);
                 Writechar(punt);
                 Writeint(c);
                 Writeint(d);
                 Writeint(u);
                    }      
           }



________TERMINALE_VIRTUALE________________________


void config_usart(void){
            PORTCbits.RC7=1;
            PORTCbits.RC6=0;
            RCSTAbits.SPEN=1;//Serial Port Enable bit
            TXSTAbits.BRGH=1;//High Baud Rate Selcet bit (1=>High speed)
            SPBRG=25;
            }

void scrivi_usart(int dato){   
                TXREG=dato;
                while(!PIR1bits.TXIF);
                Waitms(9000);
               }

int leggi_usart(void){   
              while(!PIR1bits.RCIF);
              return RCREG;
             }


________LCD______________________
void Writechar(char* dato){
            int i=0;
            PORTCbits.RC1=1;
            PORTCbits.RC2=0;
            while(dato[i]!=0){
                      PORTD=dato[i];
                      Enable();
                      Waitus(100);
                      i++;
                     }
                  }

void Writeint(int dato){
            PORTCbits.RC1=1;
            PORTCbits.RC2=0;
            PORTD=dato;
            Enable();
            Waitms(100);
                    }

void Inizializza(void){
            PORTCbits.RC0=1;
            Waitms(20);
            PORTCbits.RC1=0;
            PORTCbits.RC2=0;
                    PORTD=0b01100000;
            Enable();
            Waitms(5);
            PORTD=0b01100000;
            Enable();
            Waitus(100);
            PORTD=0b01100000;
            Enable();
            Waitus(100);
            PORTD=0b00111000;
            Enable();
            Waitus(100);
            PORTD=0b00001000;
            Enable();
            Waitus(100);
            PORTD=0b00000110;
            Enable();
            Waitus(100);

            PORTD=0b00001111;
            Enable();
            Waitus(100);
              }

void Riga1(void){
         PORTCbits.RC1=0;
         PORTD=0x80;
         Enable();
         Waitms(100);
        }

void Riga2(void){
         PORTCbits.RC1=0;
         PORTD=0xc0;
         Enable();
         Waitms(100);
        }


________MAIN_____________
void main(){
    int dato;
    int riemp;
    short int i, j;
    unsigned int u, u1;
    unsigned int d, d1;
    unsigned int c, c1;
    unsigned int m, m1;
    int mig[7];
    int cen[7];
    int dec[7];
    int uni[7];
    int buf[7];
    int max, min, med;
    short int app1;
    short int app2;
   
    ConfigI2C();
    ConfigTMR();
    config_usart();
           
    TXSTAbits.TXEN=1;//Transmission Enable bit
    RCSTAbits.CREN=1;//Continuos Receive Enable bit

    while(!Trasmissione());
           
    max=0;
    min=1000;
    med=0;

    while(i<5){
        dato=Trasmissione();             
        buf[i]=dato;         
        m=(dato/1000);
        c=(dato-m*1000)/100;
        d=(dato-m*1000-c*100)/10;
        u=(dato-m*1000-c*100-d*10);
                         
        m=m+0x30;   
        c=c+0x30;
        d=d+0x30;
        u=u+0x30;
       
        mig[i]=m;
        cen[i]=c;
        dec[i]=d;
        uni[i]=u;
                       
        if(buf[i]>max){
                max=buf[i];
                app1=i;
                   }   

        if(min>buf[i]){
                app2=i;
                min=buf[i];
                  }
                       
        med=med+buf[i];
        i++;
                                       
        while(dato==Trasmissione());
        }

    med=med/5;

    m1=(med/1000);
    c1=(med-m1*1000)/100;
    d1=(med-m1*1000-c1*100)/10;
    u1=(med-m1*1000-c1*100-d1*10);       
    m1=m1+0x30;   
    c1=c1+0x30;
    d1=d1+0x30;
    u1=u1+0x30;
           
    scrivi_usart(mig[app1]);
    scrivi_usart(cen[app1]);
    scrivi_usart(dec[app1]);
    scrivi_usart(uni[app1]);
    scrivi_usart(0x20);
    scrivi_usart(0x20);
    scrivi_usart(mig[app2]);
    scrivi_usart(cen[app2]);
    scrivi_usart(dec[app2]);
    scrivi_usart(uni[app2]);       
    scrivi_usart(0x20);
    scrivi_usart(0x20);
    scrivi_usart(m1);
    scrivi_usart(c1);
    scrivi_usart(d1);
    scrivi_usart(u1);
    while(1);       
       }

lunedì 20 giugno 2011

cerca lettera

ORG $8000
STRINGA DC.B 'no one likes you',0
SUM DS.W 1

* Inizio area codice del MAIN
ORG $8400
MAIN ADDA #-2,SP
PEA STRINGA
JSR CONTA
MOVE.W 4(SP),SUM
ADDA #6,SP
CLR.L D0-D5/A0-A5
STOP #$2000

*Inizio subroutine
ORG $8800
CONTA LINK A6,#0
MOVEM.L A0/D0-D2,-(SP)
CLR.L D2
MOVEA.L 8(A6),A0
CICLO MOVE.B (A0)+,D1
BEQ FINE
CMP #32,D1
BEQ CICLO
ADD #1,D2
BRA CICLO
FINE MOVE D2,12(A6)
MOVEM.L (SP)+,A0/D0-D2
UNLK A6
RTS


END MAIN

contadispari

ORG $8000 Inizio area MAIN
MAIN ADDA #-2,SP
PEA VETT
JSR CONTADISP
ADDA #4,SP
MOVE.W (SP)+,RIS
STOP #$2000

ORG $8100 Inizio area SUBROUTINE
CONTADISP LINK A6,#0
MOVEM.L A0/D0/D1,-(SP)
CLR D0
CLR D1
MOVEA.L VETTOFF(A6),A0
LOOP MOVE.W (A0)+,D1
BEQ FINE
BTST #0,D1
BEQ LOOP
ADDQ #1,D0
BRA LOOP

FINE MOVE.W D0,RISOFF(A6)
MOVEM.L (SP)+,A0/D0/D1
UNLK A6
RTS
ORG $8200
VETT DC.W 1,5,6,3,7,4,2,0
RIS DS.W 1

VETTOFF EQU 8
RISOFF EQU 12
END MAIN

inciarmo

RESoff EQU 14
DIMoff EQU 12
V1off EQU 08
V2off EQU 04
RIToff EQU 00


*main:
ORG $8000
INIZIO ADDA #-4,SP
MOVE.W DIM,-(SP)
MOVE.L #V1,-(SP)
MOVE.L #V2,-(SP)

JSR PRODSCAL
MOVE.L (SP)+,RES
FINE JMP FINE


*sottoprog:

PRODSCAL MOVEA.L RIToff(SP),A2
MOVEA.L V2off(SP),A1
MOVEA.L V1off(SP),A0
MOVE.W DIMoff(SP),D0

CLR.L D7

SOMMA MOVE.B (A0)+,D1
MOVE.B (A1)+,D2
MULT MULU D1,D2
ADD.L D2,D7
CTRL SUB #1,D0
BNE SOMMA
ESCI MOVE.L D7,RESoff(SP)
ADDA.L #RESoff,SP

JMP (A2)
*dati:

ORG $8100
V1 DC.B 0,1,3,2
V2 DC.B 3,2,2,1
DIM DC.W 4
RES DS.L 1

END INIZIO