; SMILENGHEADER ; COMMENT This is the Smile NG file header, do not modify! ; VERSION 1.0 ; PROC CALM ;************************************************ ; Driver pour écrire sur un LCD Alphanumérique * ;************************************************ .PROC z80 .BASE 10'16 ; Définition des constantes ; Adresses LCD LCDWRI = 40 LCDWRD = 41 LCDRDI = 42 LCDRDD = 43 ; Pages mémoires PAGE0 = 4100 PAGE1 = 4110 PAGE2 = 4120 PAGE3 = 4130 PAGE4 = 4140 PAGE5 = 4150 PAGE6 = 4160 PAGE7 = 4170 PAGE8 = 4180 PAGE9 = 4190 PAGEA = 41A0 PAGEB = 41B0 PAGEC = 41C0 PAGED = 41D0 PAGEE = 41E0 PAGEF = 41F0 ; Paramètres LCD (instructions) .BASE 10'2 ZERO = 0 FSET = 00111000 ; Function SET (8 bits, char 5x8 px) DISP = 00001110 ; Display ON, Cusror ON, Blink OFF ; Pour avoir le curseur : DISP+1 CLRDSP = 00000001 ; Efface l'écran, remet à la position initiale EMSET = 00000110 ; Entry Mode Set (fin de l'initialisation) PAHAUT = 10000000 ; Page/rangée supérieure de l'écran PABAS = 11000000 ; Page/rangée inférieure de l'écran ; Programme ; Dans un premier temps, l'écran est initialisé prêt à recevoir des données. ; Les données écrites sur le LCD sont lues en RAM ; il y a plusieurs pages, de l'adresse 4100h à 410Fh pour la 1ère page, 4110 à 411Fh ; pour la 2è, etc, il y a 16 pages en mémoires et HL contient la valeur immédiate pour l'écran .BASE 10'16 ;création de la pile au sommet de la RAM (évite des beug avec l'utilisation de zones réservées dans la RAM) RAMTOP = 7FFF ioff ; désactive les interruptions move #RAMTOP,SP ; place le pointeur de pile au sommet de la ram im1 ; met le mode d'interruptions 1 jump start ; jump to Start of program start: ;call memzero ; met à 0 toutes les pages call init ; Initialise l'écran ; message d'accueil move #LONG1,B ; longueur du message move #msg1,HL call wrstr ; on passe à la ligne call carret ; on écrit la 2è ligne du message d'accueil move #LONG2,B ; longueur du message move #msg2,HL call wrstr fin: nop ;fin du programme jump fin ; Procédures regroupées ici ;========================================= ;Boucle d'attente attente: push AF move #0FF,A a$: dec A jump,ne a$ pop AF ret ;========================================= ;========================================= ;Initialisation de l'écran LCD init: move #ZERO,A move A,$LCDWRI move #FSET,A move A,$LCDWRI call attente call attente call attente call attente call attente call attente call attente call attente call attente call attente ;---------------------------------------------- move #FSET,A move A,$LCDWRI call attente call attente ;---------------------------------------------- move #FSET,A move A,$LCDWRI call attente call attente ;---------------------------------------------- move #FSET,A move A,$LCDWRI call attente call attente ;---------------------------------------------- move #DISP,A move A,$LCDWRI call attente call attente ;---------------------------------------------- move #CLRDSP,A move A,$LCDWRI call attente call attente ;---------------------------------------------- move #EMSET,A move A,$LCDWRI call attente call attente ;---------------------------------------------- move #PAHAUT,A move A,$LCDWRI call attente call attente ;---------------------------------------------- ret ;========================================= ;========================================= ;met à zéro les pages mémoires memzero: move #ZERO,A move A,PAGE0 move A,PAGE1 move A,PAGE2 move A,PAGE3 move A,PAGE4 move A,PAGE5 move A,PAGE6 move A,PAGE7 move A,PAGE8 move A,PAGE9 move A,PAGEA move A,PAGEB move A,PAGEC move A,PAGED move A,PAGEE move A,PAGEF ret ;========================================= ;========================================= ; écriture d'une chaîne de caractère sur le LCD ; entrée ; - Longueur de la chaine de caractères en B ; - Adresse du début de la chaine en HL ; sortie : - rien ; modifie: - A, B, HL wrstr: move {HL},A ; acquérir le byte move A,$LCDWRD ; sortie du caractère sur l'écran call attente call attente inc HL ; pointage sur le caractère suivant dec B ;move B,A ;comp #1,A jump,ne wrstr ;dj,ne B,wrstr ; boucle jusqu'à ce que tous les caractères soient affichés ret ;========================================= ;========================================= ; écriture d'un caractère sur le LCD ; entrée ; - adresse où se trouve le caractère dans HL ; sortie : - rien ; modifie: - A, HL wrchr: call attente call attente move {HL},A move A,$LCDWRD ret ;========================================= ;========================================= ; lecture d'un caractère sur le LCD ; entrée ; - adresse où sera copié le caractère en HL ; - adresse écran où se trouve le chr dans B ; sortie : - le caractère est copié où pointe HL ; modifie: - A, HL rdchr: call attente call attente ; on pointe où on va lire sur l'écran push AF move B,A move A,$LCDWRI pop AF call attente call attente ; on lit et on copie move $LCDRDD,A move A,{HL} ret ;========================================= ;========================================= ; lecture d'une chaîne de caractères sur le LCD ; entrée ; - adresse où sera copié le caractère en HL ; - adresse écran où se trouve le début de la chaîne dans B ; - longueur de la chaîne de caractères dans C ; sortie : - la chaine est copiée à partir d'où pointe HL ; modifie: - A, C, HL rdstr: call attente call attente ; on pointe où on va lire sur l'écran push AF move B,A move A,$LCDWRI pop AF rdstr1$: call attente call attente ; on lit et on copie move $LCDRDD,A move A,{HL} inc HL dec C move C,A comp #1,A jump,ne rdstr1$ ret ;========================================= ;========================================= ;carriage return ; entrée ; - rien ; sortie : - rien ; modifie - rien carret: push AF move #PABAS,A move A,$LCDWRI pop AF call attente call attente ret ;========================================= ;========================================= ;Clrear Screen : efface l'écran et repositionne au départ ; entrée : - rien ; sortie : - rien ; modifie : - rien clrscr: push AF move #CLRDSP,A move A,$LCDWRI pop AF call attente call attente ;========================================= ; autre conneries en ROM (nan nan, c'est pas juste pour prendre de la place :p ) ; message d'accueil ; page du haut msg1: .ascii " -- OS Conus -- " msg1fin: nop LONG1 = msg1fin-msg1-1 ; Longuieur de la chaine de caractères ; page du bas msg2: .ascii " Version 0.22 " msg2fin: nop LONG2= msg2fin-msg2-1 ; Longuieur de la chaine de caractères