*******************************************************************
*  68HC11F1   clavier 16 touches sans 74LS922                     *
*                                                                 *
* Connexions clavier -> HC11                                      *
*                                                                 *
*	voir schéma                                               *
*	Y1-Y4 PA0-PA3 et X1-X4 PE0-PE3                            *
*  Le port E est en entrée uniquement.                            *
*                                                                 *
*  Ce programme permet de lire une touche pressé sur un clavier   *
*  de 16 touches au momment où l'une d'elle est appuyé.           *
*  Dans cette configuration, le 68HC11 utilise l'interruption IRQ *
*  afin de connaitre le momment ou balayer le clavier.            *
*                                                                 *
*  Le programme envoit à l'ordinateur '*' lors d'un reset. Puis   *
*  dès qu'une touche a été appuyé, il l'envoit le caractère       * 
*  correspondant.                                                 *
*  Principe de fonctionnement:                                    *
*  Une interruption.                                              *
*  balayage du clavier j'usqu'à que l'on trouve une touche        *
*  enfoncé correctement. là on regroupe les 2 variables en une    *
*  seule pour pouvoir la comparer et l'associer au caractère      *
*  voulu.                                                         *
*  La routine termine par remettre le port A dans l'état          *
*  d'origine pour qu'une nouvelle interruption puisse être faite. *
*                                                                 *
*  On attends quelques  ms afin de ne pas lire les rebonds.       *
*  Enfin le programme sort de fonction d'intérruption et reprend  *
*  l'activité d'origine .                                         *
*                                                                 *
*  Le programme s'execute en mode étendu.                         *
*                                                                 *
*  par Burg Thomas EFREI promo 2005                               *
*  (burg@efrei.fr) le 14/4/2003                                   *     
*  le 24/4/2003 : ajout du schéma de câblage avec explication     *
*                 succinte  clavier.png                           *
*******************************************************************

* Registres utilises :

porta  equ   $00       ; port A (commande)
ddra   equ   $01       ; data direction register for port A
portg  equ   $02       ; port G (data bus)
ddrg   equ   $03       ; data direction register for port G
portb  equ   $04       ; port B data register (été la commande)
ddrc   equ   $07       ; data direction register for port C
portc  equ   $06       ; port C data register (été les data)
porte  equ   $0a

baud   equ   $2b
sccr1  equ   $2c
sccr2  equ   $2d
scsr   equ   $2e
scdr   equ   $2f
csclt  equ   $5d       ;configurartion registre chip select controle
option equ   $39
config equ   $3f
hprio  equ   $3c

* constante

intvect    equ	$ffd6
vsci	   equ	$00c4
startbase  equ	$9000
regbase    equ	$1000
rambase    equ	$2000
pile	   equ	$c3

        org   rambase

	org   startbase
begins	sei
        lds   #pile
	ldx   #regbase

* initialisation de la liaison serie:
      clr   sccr1,x	      ; début d'initialisation de la liaison série.
      ldd   #$302c		      ; SCI en interruption
      staa  baud,x		      ; Initialise SCI to 9600 bauds (crystal 8 MHz)
      stab  sccr2,x	      ; no parity and disable SCI tx & rx interrupt,

* initialisation

      bset  ddra,x,$ff	  ; PA0-3 configure port a in output (port a en sortie)
      

      ldaa  #'*'          ; send '*' the program begin
      jsr   outsci        ; sub routine to send by asynchrone serial port

* boucle principale

        jsr init_cl
boucle  bra boucle

****************************************************************************
*               sous-routine d'attente                                     *
****************************************************************************
wait	pshy
	ldy #$2FFF
wait1	dey
	bne wait1
	puly
	rts
****************************************************************************
*               routine d'interruption série asynchrone                    *
****************************************************************************
routsci jsr insci		; Chargement de la valeur transmise sur la liaison serie
        jsr outsci		; renvoie vers le PC
	rti
****************************************************************************
*              sous-routine de lecture du buffer serie asynchrone          *
****************************************************************************
insci  brclr scsr,x,$20,insci  
	 ldaa  scdr,x		
	 rts
****************************************************************************
*        sous routine d'envoie de caractère par liaison serie synchrone    *
****************************************************************************
outsci	   brclr   scsr,x,$80,outsci
	   staa    scdr,x
	   rts
****************************************************************************
*       routine d'initialisation du clavier                                *
****************************************************************************
init_cl    cli                  ; on autorise les interruptions
           bclr porta,x,$0f     ; pour qu'il y est une interruption lorsque
                                ; l'on presse une touche il faut que les ligne de sortie que l'on
                                ; brancher au clavier soit à l'état bas.
           rts
****************************************************************************
* fonction d'interruption clavier                                          *
****************************************************************************
IRQ        ldaa  #%00001110    ;charge la valeur initiale de test
nextT      staa  porta,x       ;basculement de sur le porta
           ldab  porte,x       ;lecture sur le porte 
           andb  #%00001111    ; on applique un masque sur uniquement ce qui nous interesse
           cmpb  #$0f          ;si on lit 1111. ce n'est pas ligne choisie
           beq   conti         ; on saute à conti
           lslb                ; si on trouve une valeur on fait
           lslb                ; 4x logical shift pour  pouvoir par la suite travailler
           lslb                ; sur 8 bits
           lslb                ;
           aba                 ;On somme a et b pour comparer 1 nombre au lieu de 2
           jsr  table          ;On cherche la touche presser dans une table
           ; ------
           jsr  outsci         ; on traite a: on envoie a sur la liaison série par exemple
           ; ------
           bra  readok         ; on a lu on s'enva de cette fontion
conti      lsla                ; on décale a pour poursuivre la recherche de la bonne ligne
           inca
           anda #%00001111     ; on applique un masque sur uniquement ce qui nous interesse
           cmpa #%00001111     ; si on arrive a cette valeur, on n'a pas trouver de ligne à lire
           beq  IRQ            ; on relance la sous routine
           bra  nextT          ;sinon on continu
readok     bclr porta,x,$0f    ;réenclenche la possibilité de faire une interruption clavier
           jsr  wait           ;
           jsr  wait           ; attend avant de retourner au sous programme afin qu'il n'y ait
           jsr  wait           ; pas de saisie de rebond
           rti
*****************************************************************************
*  sous-routine de correspondance code caractère                            *
*****************************************************************************
table     cmpa #%01111110
          beq tabledata1
          cmpa #%01111101
          beq tabledata2
          cmpa #%01111011
          beq tabledata3
          cmpa #%01110111
          beq tabledataF
          cmpa #%10111110
          beq tabledata4
          cmpa #%10111101
          beq tabledata5
          cmpa #%10111011
          beq tabledata6
          cmpa #%10110111
          beq tabledataE
          cmpa #%11011110
          beq tabledata7
          cmpa #%11011101
          beq tabledata8
          cmpa #%11011011
          beq tabledata9
          cmpa #%11010111
          beq tabledataD
          cmpa #%11101110
          beq tabledataA
          cmpa #%11101101
          beq tabledata0
          cmpa #%11101011
          beq tabledataB
          cmpa #%11100111
          beq tabledataC
**********************************************************************
*            affectation du bon caractère                            *
**********************************************************************
tabledata1    ldaa #'1'
              bra  endtable
tabledata2    ldaa #'2'
              bra  endtable
tabledata3    ldaa #'3'
              bra  endtable
tabledata4    ldaa #'4'
              bra  endtable
tabledata5    ldaa #'5'
              bra  endtable
tabledata6    ldaa #'6'
              bra  endtable
tabledata7    ldaa #'7'
              bra  endtable
tabledata8    ldaa #'8'
              bra  endtable
tabledata9    ldaa #'9'
              bra  endtable
tabledata0    ldaa #'0'
              bra  endtable
tabledataA    ldaa #'A'
              bra  endtable
tabledataB    ldaa #'B'
              bra  endtable
tabledataC    ldaa #'C'
              bra  endtable
tabledataD    ldaa #'D'
              bra  endtable
tabledataE    ldaa #'E'
              bra  endtable
tabledataF    ldaa #'F'
              bra  endtable
endtable      rts
********************************************************************************
* Vector jump  table
********************************************************************************
           org	  intvect

tablevect  fdb	  routsci	      ; SCI Serial System
	   fdb	  begins	      ; SPI Serial Transfert Complete
	   fdb	  begins	      ; Pulse Accumulator Input Edge
	   fdb	  begins	      ; Pulse Accumulator Overflow
	   fdb	  begins	      ; Timer Overflow
	   fdb	  begins	      ; Timer Input Capture 4 / Output Compare 5
	   fdb	  begins	      ; Timer Output Compare 4
	   fdb	  begins	      ; Timer Output Compare 3
	   fdb	  begins	      ; Timer Output Compare 2
	   fdb	  begins	      ; Timer Output Compare 1
	   fdb	  begins	      ; Timer Input Compare 3
	   fdb	  begins	      ; Timer Input Compare 2
	   fdb	  begins	      ; Timer Input Compare 1
	   fdb	  begins	      ; Real-Time Interrupt
	   fdb	  IRQ                 ; IRQ (external pin)
	   fdb	  begins                 ; XIRQ (SCI RX line may be connected to XIRQ input,
				      ; to allow exit from STOP in bootstrap mode.
	   fdb	  begins	      ; Software Interrupt
	   fdb	  begins	      ; Illegal Opcode Trap
	   fdb	  begins	      ; COP Failure
	   fdb	  begins	      ; Clock Monitor Fail
	   fdb	  begins	      ; RESET

	   end
