||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Fichier assembleur projet.asm pour le projet el203
| Création pollet@ensta.fr
| maj par diam@ensta.fr le 18/08/95
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||


||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Définition des constantes :
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

        | Adresses des registres du PIT1 (adresses impaires)
        PIT1    = 0x110000
        PGCR1   = PIT1 + 0x01    | port general control register
        PSRR1   = PIT1 + 0x03    | port service request register
        PADDR1  = PIT1 + 0x05    | data direction register (port a)
        PBDDR1  = PIT1 + 0x07    | data direction register (port b)
        PCDDR1  = PIT1 + 0x09    | data direction register (port c)
        PIVR1   = PIT1 + 0x0B    | interrupt vector register
        PACR1   = PIT1 + 0x0D    | port a control register
        PBCR1   = PIT1 + 0x0F    | port a control register
        PADR1   = PIT1 + 0x11    | data register (port a)
        PBDR1   = PIT1 + 0x13    | data register (port b)
        PAAR1   = PIT1 + 0x15    | alternate register (port a)
        PBAR1   = PIT1 + 0x17    | alternate register (port b)
        PCDR1   = PIT1 + 0x19    | data register (port c)
        PSR1    = PIT1 + 0x1B    | port status register
        
        | Adresses des registres du PIT2 (adresses impaires)
        PIT2    = 0x120000                
        PGCR2   = PIT2 + 0x01 
        PSRR2   = PIT2 + 0x03 
        PADDR2  = PIT2 + 0x05 
        PBDDR2  = PIT2 + 0x07 
        PCDDR2  = PIT2 + 0x09 
        PIVR2   = PIT2 + 0x0B 
        PACR2   = PIT2 + 0x0D 
        PBCR2   = PIT2 + 0x0F 
        PADR2   = PIT2 + 0x11 
        PBDR2   = PIT2 + 0x13 
        PAAR2   = PIT2 + 0x15 
        PBAR2   = PIT2 + 0x17 
        PCDR2   = PIT2 + 0x19 
        PSR2    = PIT2 + 0x1B 
                
        | Definition des adresses systeme
        MEMOIRE2        = 0x100000  | adresse de la memoire 2 (RAM)
        TAILLE_MEMOIRE2 =   0x8000  | taille memoire 2 (15 fils => 32K)
        REGISTRE        = 0x100000  | adresse du registre (en mémoire 2)
        
        | On met la pile système en fin de mémoire 2
        ISP = MEMOIRE2 + TAILLE_MEMOIRE2  | pointeur de pile d'interruption
        
        | Nota : la table des exceptions serait mieux en zone RAM
        EXP             = 0x1000    | table des exceptions
        
        | Definition bidon (avec erreur Ox au lieu de 0x)
        | pour tester la colorisation
        POPO1 = Ox123
        POPO1=Ox123
        POPO1=Ox123-Ox234+Ox345
        

||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Initialiation de la zone de démarrage du mp68020 (en adresse 0)
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
init:   .long    ISP    | chargement initial du pointeur de pile
        .long    start  | chargement initial du PC (début du programme)
        | réservation des 1000 octets pour la table des exceptions 
        | initiale (par principe car inutile ici puisqu'on va changer
        | le vecteur de cette table) :
        .org    0x400       
        
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|  Début du programme (à partir de l'adresse 0x400 = 1024)
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
start: 
        | Initialisation du 68020 (SR, VBR, ...)
        move.w  #0x2700,sr   | octet superviseur du registre d'etat
                             | interruptions masquees
        lea.l   EXP,a0       | initialisation de la
        movec   a0,vbr       | table d'exception
                
        | Initialisation des vecteurs
        move.l   #INT2,EXP+4*64+4| chargement de la table d'exeption
        move.l   #INT1,EXP+4*72  | avec les adresses IT1 et IT2

        | Initialisation des registres du PIT1
        move.b   #0x01,PGCR1    | mode 0, W* autorisee, H1 montant
        move.b   #0x18,PSRR1    | int vectorisees (util. de PIRQ et PIACK)
        move.b   #0x00,PADDR1   | port A en entree
        move.b   #72,PIVR1      | numero de vecteur d'interruption
        move.b   #0x82,PACR1    | sous-mode 10, autorisation int H1
        move.b   #0x31,PGCR1    | Valider les ports A et B (Hi)
        
        | Initialisation des registres du PIT2
        move.b   #0x00,PGCR2    | mode 0, W* autorisee, H2 descendant
        move.b   #0x18,PSRR2    
        move.b   #0xFF,PADDR2   | port A en sortie
        move.b   #64,PIVR2    
        move.b   #0x84,PACR2    | sous-mode 10, autorisation int H2
        move.b   #0x30,PGCR2    | verrouille PxCR, et valid du PI/T 

        | Initialisation diverses
        move.b   #0,REGISTRE    | raz REGISTRE
        move.l   #0,d0          | raz D0
        move.l   #0,d1          | raz D1
                
       |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
       | Programme principale :
       |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
       
        move.w   #0x2000,sr      | Autorisation des interruptions
FIN:    bra       FIN    

||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Début des sous-programmes :
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Interruption due au PIT1

INT1:   move.b    #1,PSR1        | accuse réception de IT due à H1
|         move.b    PADR1,REGISTRE | lecture de PADR1 (et mémorisation)
        move.b    PADR1,d1       | lecture de PADR1 dans D1
        | rajout de la donnée lue à la donnée enregistrée :
        add.b     d1,REGISTRE
        move.l    #1,d0          | donnee lue
        rte

||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Interruption due au PIT2

INT2:   move.b    #2,PSR2        | accuse réception de IT due à H2
        cmp.b     #1,d0          | lecture de la donnee sur PADR1 ?
        bne       NON
        move.b    REGISTRE,PADR2 | transfert de la donnee sur PADR2
        | on n'a plus besoin de la ligne suivante car il y a toujours
        | une donnée présente du moment qu'on l'a ecrite au moins une 
        | fois
        move.l    #0,d0          | donnee non presente sur PADR1
NON:    rte    
