;=====================================================================
;    vide6.ASM - DIGIPRESS 96 - REGULATEUR DE POMPE A VIDE
;=====================================================================
;auteur: Silicium 628.

;premiere version : 02-05-1996.
;pour ST6210 (le 20 pattes 2K ROM)
;attention: espace mémoire ROM différent sur ST62T20
;affichage sur AFFICHEUR LCD 16 caractères
;ATTENTION Qx = 3,2768 Mhz

;MODIF: 20-03-97 Silicium 628: (suppression de la fonction METEO)
;MODIF: 21-05-97 Silicium 628: (Hystérésis = 1 au lieu de 2)
;MODIF: 26-05-97 Silicium 628: Qx = 3,2768 Mhz au lieu de 4,000 Mhz

;si vous faites des modifs perso, S.V.P. indiquez les ci-dessus. merci.
;D'autre part je vous encourage à developper pour les PIC16F84 comme 
;je le fais dorénavant moi-même...
;c'est le jour et la nuit comparé au ST6 ! Fred.

;---------------------------------------------------------------------
;Directives d'assemblage

		.title "VIDE6"
		.vers "st6210"
		.romsize 4
		.input "6215_reg.asm"
		.w_on

;Constantes

os		.equ 0FEh
duree		.equ 24		;24 heures au départ

;adresses registres
;Les données en RAM commencent à l'adresse 84h (=132). voir p:15
;FIN à BFh (=191) soit 60 octets.
; de 80h à 84h, ce sont les registres X, Y, V, W

BB		.def 84h	;pour opérations en bit unique sur port B
AA		.def 85h	;sauvegarde de A
VV		.def 86h
rom		.def 87h	;copie du drwr voir p:64
Aff1		.def 88h	;copie mémoire d'un digit
Aff2		.def 89h
Aff3		.def 8Ah
Aff4		.def 8Bh
delai1		.def 8Ch
delai2		.def 8Dh
memo0		.def 8Eh
memo1		.def 8Fh
memo2		.def 90h
memo3		.def 91h
valbin0		.def 92h
valbin1		.def 93h
unit		.def 94h
cent		.def 95h
compte		.def 96h
tm		.def 97h	;pour mesure temps moteur
mode		.def 98h
tare		.def 99h
depress		.def 9Ah
consign		.def 9Bh
caract		.def 9Ch	;caractere a afficher
nombre		.def 9Dh
data		.def 9Eh	;data vers afficheur LCD
decal		.def 9Fh	;decallage adresses en ROM
bitn		.def 0A0h
digit		.def 0A1h
decal_m		.def 0A2h
negatif		.def 0A3h	;pour afficher signe (-)
consi_m		.def 0A4h
tarvrai		.def 0A5h	;valeur tare sans non corrigée
div67		.def 0A6h
heures		.def 0A7h
minutes		.def 0A8h
secondes	.def 0A9h
tot		.def 0AAh	;pour totaliser temps moteur
h_m		.def 0ABh	;pour totaliser temps moteur
mn_m		.def 0ACh	;pour totaliser temps moteur
s_m		.def 0ADh	;pour totaliser temps moteur
top		.def 0AEh	;memorise le plus grand 'tm'
on		.def 0AFh	;on=0 -> arret on=1 ->marche

;------------------------------------------------------------------
		.org 880h	;espace memoire pour ST6210 p:14
				;(adresse en ROM !)
;===================================
;ATTENTION ORG=080h POUR LE ST62T20
;===================================

string1		.ascii "  PRESSION: "	;0
		.ascii "DEPRESSION: "	;12
		.ascii "  CONSIGNE: "	;24
		.ascii " PB TARAGE! "	;36
		.ascii " FUITE !!!  "	;48
		.ascii "----"		;pour éviter brisure de page à 64
		.ascii "            "	;64
		.ascii "  BONJOUR ! "	;76
		.ascii "Surpression!"	;88
		.ascii "Reste       "	;100
		.ascii " -- FIN --  "	;112
		.ascii "----"		;pour éviter brisure de page à 128
		.ascii "Taux Fuite: "	;128
		.ascii "T.Mot       "	;140
		.ascii "DIGIPRESS 96"	;152
		.ascii "Tarage....  "	;164
		.ascii "Ouvrir tube "	;176
		.ascii "----"		;pour éviter brisure de page à 192
string2		.ascii "0123456789"

;=================================================================
;				RAPPEL
;000	E + R
;001	E
;010	E + R + int
;011	E (PA0-3) ; E analogique (autres; 1 seule à la fois !)
;10x	S drain ouvert 10mA (PA0-3) ; drain ouvert 5mA (autres)
;11x	S sym
;=================================================================
reset  		ldi wdr,os	;chargt chien de garde

		ldi ddra,11111111b
		ldi ora, 11111111b
		ldi dra, 00001111b

		ldi ddrb,00001111b
		ldi orb, 10001111b	;entrée PB7 analog
		ldi BB,  11000000b
		ld A,BB
		ld drb,A

		clr ddrc
		clr orc
		clr drc

		ldi ior, 00000000b	;interruptions interdites p:98
		ldi tscr,01011100b	;quartz/16  p:99
		ldi tcr,10

		ldi div67,67
		ldi secondes,60
		ldi minutes,60
		ldi heures,duree

		clr valbin0
		clr valbin1
		ldi mode,1
		ldi compte,0
		ldi tare,90		;par défaut
		clr tm
		ldi tot,3
		ldi h_m,1
		ldi mn_m,1
		ldi s_m,1
		clr top
		clr on
		clr negatif

		clr A			;efface le bit de retenue

		reti			;retour au mode normal p:99

;***********************************************************************
;Corps du programme principal

debut		ldi ior,00010000b	;interruptions autorisées p:89; 98
		ldi adcr,00010000b	;CAN ACTIF p:50
		call tempo10

;RAZ LCD
		call dspclr
		call home
		call fset
		call setmode
		call dsp10

;message de bienvenue
		call vert	;allume LED verte

		ldi decal,152	;DIGIPRESS 96
		call affitxt
		call tempo1s

		ldi decal,76	;bonjour
		call affitxt
		call tempo1s

		call lirecns	;lit pot. de consigne 1ere fois

boucle		ldi wdr,os

		call tarbute	;évite valeur abérante si mega parasite !
		ld A,heures
		cpi A,duree
		jrc suite11
		ldi heures,duree	;évite nb d'heures > 10

suite11		ld A,consign
		ld consi_m,A
		call lirecns	;lit pot. de consigne
		sub A,consi_m
		cpi A,2
		jrc suite12	;saut si consign inchangé (diff <2 )
		cpi A,253
		jrnc suite12	;saut si consign inchangé (diff > 253 )

		ld A,mode
		cpi A,9
		jrz suite12	;saut si FUITE. (Maintient mode alarme)
		ldi mode,2	;on a touché au potentiomètre


;touche MODE (verte) -----------------------------
suite12		jrs 4,drb,suite20	;saut si touche non détectée
		clr tm			;stop ALERTE éventuelle
		res 3,BB		;stop BUZZER
		ld A,BB
		ld drb,A
		inc mode
		ld A,mode
		cpi A,7			;mode = 1..6
		jrc att1
		ldi mode,1

att1		ldi wdr,os
		call tempo10
		call modes
		jrr 4,drb,att1		;attend relachement touche

;touche JAUNE -------------------------------------------------------
suite20		jrs 5,drb,suite30	;saut si touche non détectée
		clr tm		;stop ALERTE éventuelle

		ld A,mode
		cpi A,1		;en mode DEPRESSION
		jrnz suite22
		call arret
		call rouge
		call tarage
		jp att2

suite22		ld A,mode
		cpi A,4
		jrnz suite25
		call decTps	;en mode chrono
		jp att2

suite25		ld A,mode
		cpi A,5		;en mode Taux de fuite
		jrnz suite27
		clr top
		jp att2

suite27		nop		;si autres modes

att2		ldi wdr,os
		call tempo10
		jrr 5,drb,att2	;attend relachement touche

;-------------------------------------------------------------------
suite30		call lireprs	;lit pression sur MPX100

		call pompe	;asservissement moteur

		ld A,on
		jrnz suite31	;saut si le moteur tourne
		jp suite40	;saut si moteur à l'arret
suite31		dec tot
		jrnz suite32
		ldi tot,3
		call inc_tpm
suite32		inc tm		;mesure rapport cyclique de marche
		ld A,tm
		cp A,top
		jrc suite34	;saut si tm < top
		ld top,A	;si tm > top on fait: top:=tm
		ld A,tm
suite34		cpi A,100
		jrc suite40
		ldi mode,9	;ALERTE BUZZER: tps de pompage trop long
		clr top

suite40		call modes

		call mult
		call affnb

suite50		ld A,mode
		cpi A,4
		jrnc suite55	;pour ne pas afficher 0000 si mode > 3

		call affi4

suite55		inc compte
		ld A,compte
		cpi A,250
		jrnz suite60

		clr tm		;pour mesurer le temps de marche
		clr compte

suite60		jp boucle

;**********************************************************************
;début des procédures
;**********************************************************************
;========== traitement modes ==================
;----- dépression -----------------------------
modes		nop	;os ?
mode1		ld A,mode
		cpi A,1
		jrz md11
		jp mode2
md11		ldi decal,12
		ld A,negatif
		jrz md12
		ldi decal,88
md12		call affitxt
		call vert
		ld A,depress
		ret
;------ consigne -------------------------------
mode2		ld A,mode
		cpi A,2
		jrz md21
		jp mode3
md21		ldi decal,24
		call affitxt
		call vert
		ld A,consign
		ret

;----- pression absolue -------------------------
;pres abs =10 (101 - depress + 90 - tare) = 10 ( 191 -depress - tare)
mode3		ld A,mode
		cpi A,3
		jrnz mode4
		ldi decal,0
		call affitxt
		call vert
		ldi A,191
		sub A,tare
		sub A,depress
		ret

;---------- chrono ----------------
mode4		ld A,mode
		cpi A,4
		jrnz mode5
		ldi decal,100
		call affitxt
		call vert
		call affitps
		ret
;- taux de fuite ------------------
mode5		ld A,mode
		cpi A,5
		jrnz mode6
		ldi decal,128
		call affitxt
		call vert
		call tempo10
		call affitf
		ret

;- T. moteur total --------------------------------
mode6		ld A,mode
		cpi A,6
		jrnz mode7
		ldi decal,140
		call affitxt
		call vert
		call affitpm
		ret

;------ PB DE TARAGE ------------------------------
mode7		ld A,mode
		cpi A,7
		jrz mode7_1
		jp mode8
mode7_1		ldi decal,36
		call affitxt
		call rouge
		ld A,tarvrai
		ret
;------ FIN ------------------------------
mode8		ldi wdr,os	;parce que c'est une boucle
		ld A,mode
		cpi A,8
		jrz mode8_1
		jp mode9
mode8_1		ldi decal,112
		call affitxt
		call rouge
		res 2,BB	;stop moteur
		ld A,BB
		ld drb,A
		ldi A,0		;pour afficher 0000
		call mult
		call affnb
		call affi4
		jp mode8	;BOUCLE

		ld A,tarvrai
		ret


;------- FUITE: ALARME BUZZER ----------------------
mode9		ld A,mode
		cpi A,9
		jrz mode9_1
		jp mode10
mode9_1		ldi decal,48
		call affitxt
		call rouge
		set 3,BB
		ld A,BB
		ld drb,A	;commande du buzzer
		ld A,depress
		ret

mode10		ldi mode,1	;au cas ou mode > 9...
		ret

;====fin des modes ==================================
;------------------------------------------------------------------------
vert		res 0,BB	;éteint led rouge
		set 1,BB	;allume led verte
		ld A,BB
		ld drb,A
		ret

;------------------------------------------------------------------------
rouge		res 1,BB	;éteint led verte
		set 0,BB	;allume led rouge
		ld A,BB
		ld drb,A
		ret
;------------------------------------------------------------------------
;conversion analogique -> binaire (résultat -> A)
;256 acquisitions cumulées dans valbin0 et valbin1
;cumul div 256 -> A
;cette technique permet d'obtenir une valeur stable (instabilité du CAN...)
lireprs		ldi orb, 10001111b	;entrée PB7 analog
		ldi V,255
		clr valbin0
		clr valbin1
		clr negatif

anl1		set 5,adcr		;depart acquisition p:50 et 111

attente		ldi wdr,os
		jrr 6,adcr,attente	;attend fin acqui

		res 5,adcr		;pret pour acqui suivante
		ld A,adr		;cumul resultat -> A

		sub A,tare	;offset. soit 1,76 V pour 1013mb -> affi 0
		cpi A,250
		jrc anl2
		ldi A,0		;zone de neutre

anl2		cpi A,200
		jrc anl3
		ldi negatif,1	;SURPRESSION !
		com A		;A:=255-A

anl3		ld W,A
		ld A,valbin0
		add A,W

		ld valbin0,A
		ldi A,0		;A=0
		rlc A		;A=retenue1
		add A,valbin1
		ld valbin1,A
		dec V
		jrz finAnl
		jp anl1

finAnl		ld A,valbin1	;revient à diviser par 256
		ret

;----------------------------------------------------------------------
;lecture pot. de consigne
;conversion analogique -> binaire (résultat -> A)
;256 acquisitions cumulées dans valbin0 et valbin1
;sortie div 256 -> A

lirecns		ldi orb, 01001111b	;entrée PB6 analog
		ldi V,255
		clr valbin0
		clr valbin1

cns1		set 5,adcr		;depart acquisition p:50 et 111

att3		ldi wdr,os
		jrr 6,adcr,att3		;attend fin acqui

		res 5,adcr		;pret pour acqui suivante
		ld A,adr		;cumul resultat -> A

cns2		ld W,A
		ld A,valbin0
		add A,W

		ld valbin0,A
		ldi A,0		;A=0
		rlc A		;A=retenue1
		add A,valbin1
		ld valbin1,A
		dec V
		jrz fincns
		jp cns1

fincns		ld A,valbin1	;revient à diviser par 256
		call div2A	;0..255 -> 0..128 (=0..-1280 mb max)
				;(en fait -1 atm max bien sur !)
butee		cpi A,3
		jrnc butee1
		ldi A,3		;-30 mb mini
butee1		cpi A,80
		jrc butee2
		ldi A,80	;-800 mb maxi
butee2		ld consign,A
		ret
;----------------------------------------------------------------------
;décrémente la durée totale 30 mn par 30 mn
decTps		ld A,minutes
		cpi A,32
		jrc dec_h1	;saut si minutes < 32

min30		ldi minutes,31	;affichera 31-1 = 30
		ret

dec_h1		ld A,heures
		cpi A,2
		jrc dec11	;saut si heures < 2
		jp dec_h2	;saut si heures >= 2 (affichée >= 1 )
dec11		ld A,minutes
		cpi A,1
		jrnz dec12
		jp plein	;saut si h < 2 et mn = 1 (affi 0)
dec12		ldi heures,1	;affi 0
		ldi minutes,1	;affi 0
		ldi secondes,60	;affi 59
		ret
dec_h2		ld A,minutes
		cpi A,2
		jrc dec_h3	;saut si minutes < 2 (mn =1 ou mn =0 )
		ldi minutes,1	;si mn >=2
		ldi secondes,60
		ret

dec_h3		dec heures
		ldi minutes,31
		ret

plein		ldi secondes,60	;le plein SVP, vérifiez la pression des pneus
		ldi minutes,60
		ldi heures,duree
		ret

;----------------------------------------------------------------------
;tare sera = 90 environ pour 1,76 V sur entrée A/D
;c.a.d pour 1013 mb si l'ampli est bien réglé
;si la pression athmospérique est < 1013 mb, tare sera > 90
;si la pression athmospérique est > 1013 mb, tare sera < 90

tarage		ldi decal,164	;"Tarage..."
		call affitxt
		call tempo1s
		call tempo1s
		ldi decal,176	;"Ouvrir tube"
		call affitxt
		ldi A,68
		call ddras	;adresse 68 (position 1er chiffre)
		ldi caract,' '  ;(efface nbr déja affiché)
		call ecrire
		ldi caract,' '
		call ecrire
		ldi caract,' '
		call ecrire
		ldi caract,' '  ;espace (efface nbr déja affiché)
		call ecrire

		ldi V,40
boucle2		ldi A,68
		call ddras	;adresse 68 (position 1er chiffre)
		ldi caract,'|'
		call ecrire
		call tp100ms
		ldi A,68
		call ddras	;adresse 68 (position 1er chiffre)
		ldi caract,'/'
		call ecrire
		call tp100ms
		ldi A,68
		call ddras	;adresse 68 (position 1er chiffre)
		ldi caract,'-'
		call ecrire
		call tp100ms
		ldi A,68
		call ddras	;adresse 68 (position 1er chiffre)
		ldi caract,96	;`
		call ecrire
		call tp100ms
		dec V
		jrz suite80
		jp boucle2

suite80		ldi tare,0	;important
		call lireprs
		ld tare,A
		ld tarvrai,A
		call tarbute
		inc A		;affi zéro garanti
		ld tare,A
		ldi mode,1
		ret

;----------------------------------------------------------------------
tarbute		ld A,tare
		cpi A,95
		jrc tb1		;saut si A < 95
		ldi tare,90	;par défaut
		ldi mode,7	;pb de tarage
		ret
tb1		cpi A,85
		jrnc tb2	;saut si A > 85
		ldi tare,90
		ldi mode,7	;pb de tarage
tb2		ret
;-----------------------------------------------------------------------
;Incrémente temps moteur
inc_tpm		inc s_m
		ld A,s_m
		cpi A,61
		jrc fininc
		ldi s_m,1
		inc mn_m
		ld A,mn_m
		cpi A,61
		jrc fininc
		ldi mn_m,1
		inc h_m
fininc		ret

;-----------------------------------------------------------------------
;sortie pompe

pompe		ld depress,A
		ld A,consign
		cp A,depress
		jrc arret	;si consign < depress
		ld A,consign
		subi A,1	;hystérésis
		cp A,depress
		jrnc marche	;si consign-hystérésis > depress
		ret
arret		res 2,BB
		ld A,BB
		ld drb,A
		call tempo10
		ldi on,0
		ret
marche		set 2,BB
		ld A,BB
		ld drb,A
		ldi on,1
		ret
;------------------------------------------------------------------------
;multiplie la valeur de A range dans valbin0 et valbin1
mult		ldi V,10		;facteur de x
		ld memo3,A
		clr valbin0
		clr valbin1

nf		nop		;ldi wdr,os
		ld A,valbin0
		add A,memo3	;retenue possible par débordement
		ld valbin0,A
		ldi A,0		;A=0
		rlc A		;A=retenue1
		add A,valbin1
		ld valbin1,A
		dec V
		jrz sortie0
		jp nf
sortie0		ret

;-------------------------------------------------------------------------
;TEMPO 1ms (avec Qx=3.2768 MHz)
;n'utilise pas le TIMER, et ne modifie pas les registres
;cette tempo est OK. mesuree le 30-1-95

tp1ms		ldi delai1,18

tp1m2		ldi wdr,os	;4 chargt chien de garde
		dec delai1	;4
		jrz fin1ms	;2
		jp tp1m2	;4
fin1ms		ret

;3.2768 MHz/13 /(18 x 14 ) = 1000.2442 Hz
;-------------------------------------------------------------------------
;TEMPO 10ms (avec Qx=3.2768 MHz)
;n'utilise pas le TIMER, et ne modifie pas les registres
;cette tempo est OK. mesuree le 30-1-95

tempo10		ldi delai1,180

bcl2		ldi wdr,os	;4 chargt chien de garde
		dec delai1	;4
		jrz suiteTP	;2
		jp bcl2		;4
suiteTP		ret

;3.2768 MHz/13 /(180 x 14 ) = 100,02442 Hz
;-------------------------------------------------------------------------
;TEMPO 100ms  (avec Qx=3.2768 MHz)
;n'utilise pas le TIMER, et ne modifie pas les registres
;évite de faire un call supplémentaire

tp100ms		ldi delai2,10
		ldi delai1,180

tp1		ldi wdr,os	;4 chargt chien de garde
		dec delai1	;4
		jrz tp2		;2
		jp tp1		;4

tp2		dec delai2
		jrz fintp
		jp tp1

fintp		ret

;-------------------------------------------------------------------------
;TEMPO 1/2 s  (avec Qx=3.2768 MHz)
;n'utilise pas le TIMER, et ne modifie pas les registres
;évite de faire un call supplémentaire

tempo1s		ldi delai2,50
		ldi delai1,180

bcl1s1		ldi wdr,os	;4 chargt chien de garde
		dec delai1	;4
		jrz bcl1s2	;2
		jp bcl1s1	;4

bcl1s2		dec delai2
		jrz fin1s
		jp bcl1s1

fin1s		ret

;------------------------------------------------------------------------
;début des procédures d'affichage LCD
;----------------------------------------------------------------------
;FUNCTION SET
;utilisation de res et de set sur dra permises because port entier en sortie

fset		res 2,dra	;E=0
		res 3,dra	;R/S=0

		ldi data,32+16+8
		call dataout	;transmission série vers 4015 -> DATA // LCD
		call impuls
		ret
;----------------------------------------------------------------------
;DISPLAY CLEAR
dspclr		res 2,dra	;E=0
		res 3,dra	;R/S=0

		ldi data,1
		call dataout
		call impuls
		ret
;----------------------------------------------------------------------
;RETURN HOME
home		ldi dra,0
		ldi data,2
		call dataout
		call impuls
		ret
;----------------------------------------------------------------------
;ENTRY MODE SET
setmode		res 2,dra	;E=0
		res 3,dra	;R/S=0

		ldi data,4+2	;sens inverse si 4+0
		call dataout
		call impuls
		ret

;----------------------------------------------------------------------
;DISPLAY ON OFF
dsp10		res 2,dra	;E=0
		res 3,dra	;R/S=0

		ldi data,8+4
		call dataout
		call impuls
		ret
;----------------------------------------------------------------------
;DDRAM ADRESS SET (A)
;A doit contenir l'adresse (position d'affichage. voir doc)
ddras		res 2,dra	;E=0
		res 3,dra	;R/S=0
		ldi data,128
		add A,data
		ld data,A
		call dataout
		call impuls
		ret
;----------------------------------------------------------------------
;ECRIRE
ecrire		nop		;ldi wdr,os
		res 2,dra	;E=0
		set 3,dra	;R/S=1

		ld A,caract
		ld data,A
		call dataout

		set 2,dra	;impuls E à 1 avec RS=1
		call tempo10
		res 2,dra	;fin impulsion
		call tp1ms
		ret

;----------------------------------------------------------------------
;impulsion E à 1 avec RS=0
impuls		res 3,dra	;R/S=0
		set 2,dra	;impulsion E à 1
		call tempo10
		res 2,dra	;fin impulsion
		call tempo10
		ret

;----------------------------------------------------------------------
;SORTIE DATA (8 bits) en série sur PA0 vers CD4015. PA1=Clock 4015.
;ne pas utiliser V dans cett procédure !
dataout		ldi bitn,8
		ld A,data
dtbcl		sla A
		jrc dt1
		res 0,dra	;bit = 0
		jp out
dt1		set 0,dra	;bit = 1

out		set 1,dra	;clock 4015
		res 1,dra	;fin clock
		dec bitn
		jrnz dtbcl
		ret

;-------------------------------------------------------------------------
;AFFICHAGE MESSAGE EN ROM
;l'afficheur est structuré en 2 'lignes' (situées cote à cote)
affitxt		nop		;ldi wdr,os
		ld A,decal
		cp A,decal_m
		jrnz suiteaf	;affichage uniquement si decal a changé
		ret

suiteaf		ld A,decal
		ld decal_m,A
		call home
		ldi rom,string1.W
		ld A,rom	;on fait une copie voir p:64
		ld drwr,A
		ld A,decal	;decallage dans le tableau en ROM

;on va ajuster le nº de la page de 64 octets lus en ROM
page		cpi A,64
		jrc suitepg
		ld V,A
		inc rom
		ld A,rom
		ld drwr,a
		ld A,V
		subi A,64
		jp page

suitepg		ldi V,string1.D		;voir p:65
		add A,V
		ld X,A
		ldi nombre,8	;affi 8 caract
		ldi A,0
		call ddras	;adresse 0 (à gauche de l'affichage)
bcl70		ld A,(X)	;lit 1 caractère dans le tableau
		ld caract,A
		call ecrire
		inc X
		dec nombre
		jrnz bcl70

		ldi nombre,4	;affi 4 car suivants
		ldi A,64
		call ddras	;adresse 64 (2eme partie de l'affichage)
bcl80		ld A,(X)	;lit 1 caractère dans le tableau
		ld caract,A
		call ecrire
		inc X
		dec nombre
		jrnz bcl80

		ret
;-------------------------------------------------------------------------
;AFFICHAGE 1 DIGIT (nombre) sur afficheur LCD
;digit doit contenir ce nombre
affi		nop		;ldi wdr,os
		ldi rom,string2.W
		ld A,rom	;on fait une copie voir p:64
		ld drwr,A
		ld A,digit	;decall dans le tableau de chiffres en ROM
		ldi V,string2.D	;voir p:65
		add A,V
		ld X,A
		ld A,(X)	;lit 1 caractère dans le tableau
		ld caract,A
		call ecrire
		ret

;-------------------------------------------------------------------------
;AFFICHAGE 4 DIGITS sur afficheur LCD
affi4		nop		;ldi wdr,os
		ldi A,68
		call ddras	;adresse 68 (position 1er chiffre)
		ld A,Aff4
		ld digit,A
		call affi
		ld A,Aff3
		ld digit,A
		call affi
;--------
affi2		ld A,Aff2
		ld digit,A
		call affi
		ld A,Aff1
		ld digit,A
		call affi
		ret
;-----------------------------------------------------------------------
;AFFICHAGE taux de fuite
;2 DIGITS et de % sur afficheur LCD
;seuls Aff2 et Aff1 sont pris en compte
affitf		ldi A,68
		call ddras	;adresse 68 (position 1er chiffre)

		ldi caract,' '  ;espace (efface nbr déja affiché)
		call ecrire

		ld A,top
		call affi_A
		call affi2

		ldi caract,'%'
		call ecrire

		ret


;-----------------------------------------------------------------------
;affichage nombre 0..9999
;valbin0 et valbin1 contiennent un nb 0..9999
affnb		ld A,valbin0
		call cvBCU	;convertit valbin0 en BCD
		ld A,V
		ld unit,A
		ld A,W
		ld cent,A

;on va ajouter valbin1 x 256

		ld A,valbin1
		ld memo3,A	;pour ne pas toucher valbin1

		inc memo3	;hors boucle
bcl1		dec memo3
		jrnz ici1
		jp suitef
ici1		ld A,unit
		addi A,56		;(+56) retenue decimale possible
		cpi A,100
		jrc st1
		subi A,100
		inc cent		;ajout retenue decimale
st1		ld unit,A
		ld A,cent
		addi A,2		;(+200) soit en tout +256
		ld cent,A
		jp bcl1

suitef		call affdeci
		ret

;------------------------------------------------------------------------
; A doit contenir un octet binaire 0..255
affi_A		call cvBCU	;fractionne l'octet en deux: 0..2 et 0..99
		ld A,V
		ld unit,A
		ld A,W
		ld cent,A
		call affdeci
		ret

;------------------------------------------------------------------------
;nb decimaux dans unit et cent au préalable
affdeci		ld A,unit	;0..99
		call cvBDU
		ld A,V
		ld Aff1,A
		ld A,W
		ld Aff2,A
		ld A,cent	;0..99
		call cvBDU
		ld A,V
		ld Aff3,A
		ld A,W
		ld Aff4,A
		ret
;--------------------------------------------------------------------
;AFFICHAGE temps:  HEURES:MINUTES:SECONDES
affitps		ldi A,64	;adresse 1er pos affi à droite
		call ddras
		ld A,heures
		dec A
		call cvBDU
		ld A,V
		ld VV,A
		ld A,W
		ld digit,A
		call affi	;attention: affi touche V
		ld A,VV
		ld digit,A
		call affi

		ldi caract,'h'
		call ecrire

		ld A,minutes
		dec A
		call cvBDU
		ld A,V
		ld VV,A
		ld A,W
		ld digit,A
		call affi
		ld A,VV
		ld digit,A
		call affi

		ldi caract,39	;(')
		call ecrire

		ld A,secondes
		dec A
		call cvBDU
		ld A,V
		ld VV,A
		ld A,W
		ld digit,A
		call affi
		ld A,VV
		ld digit,A
		call affi

		ret
;--------------------------------------------------------------------
;AFFICHAGE TEMPS MOTEUR: HEURES,MINUTES,SECONDES
affitpm		ldi A,64	;adresse 1er pos affi à droite
		call ddras
		ld A,h_m
		dec A
		call cvBDU
		ld A,V
		ld VV,A
		ld A,W
		ld digit,A
		call affi	;attention: affi touche V
		ld A,VV
		ld digit,A
		call affi

		ldi caract,'h'
		call ecrire

		ld A,mn_m
		dec A
		call cvBDU
		ld A,V
		ld VV,A
		ld A,W
		ld digit,A
		call affi
		ld A,VV
		ld digit,A
		call affi

		ldi caract,39	;(')
		call ecrire

		ld A,s_m
		dec A
		call cvBDU
		ld A,V
		ld VV,A
		ld A,W
		ld digit,A
		call affi
		ld A,VV
		ld digit,A
		call affi
		ret

;--------------------------------------------------------------------
;CONVERSION BINAIRE (1 octet incomplet 0..99 et pas 0..255) --> BCD

;nombre à convertir dans A
;resultat dans W (dizaines) et dans V (unités)
;ex: A=28 -> W=2 et V=8

cvBDU		ldi V,0
		ldi W,0
conv2		cpi A,10
		jrc conv3	;saut si A<10
		subi A,10	;en boucle : revient à diviser A par 10
		inc W
		jp conv2	;9 passages au max si nb <= 99
conv3		ld V,A		;reste de la division
		ret
;--------------------------------------------------------------------
;CONVERSION BINAIRE (1 octet complet 0..255) --> DECIMAL 2 octets (0..99)
;nombre à convertir dans A
;resultat dans W (centaines) et dans V (unités)
;ex A=236 -> W=2 et V=36

cvBCU		ldi V,0
		ldi W,0
cv2		cpi A,100
		jrc cv3		;saut si A<100
		subi A,100	;en boucle : revient à diviser A par 100
		inc W
		jp cv2		;2 passages au max puisque A<=255
cv3		ld V,A		;reste de la division
		ret

;------------------------------------------------------------------------
;fait  a div 2 --> A  (equ à rrc A qui n'existe pas)
div2A		rlc A
		rlc A
		rlc A
		rlc A
		rlc A
		rlc A
		rlc A
		rlc A
		res 7,A
		ret
;-----------------------------------------------------------------------
;GESTION INT TIMER
;ATTENTION Qx = 3.2768 Mhz

IntTimer	nop		;ldi wdr,os
		ld AA,A
		res 7,tscr	;RAZ du bit du TMZ voir page 104 et p:90
		ld A,heures
		jrnz decompte	;on sort si heures non initialisees
		jp finint

decompte	dec div67 	;67 tops ecoules ?
		jrz bip		;toutes les secondes
		jp finint	;non : fin interruption

bip		ldi div67,67	;rechargement diviseur
;3.2768Mhz/12/16/255/67 = 0.9989s
		dec secondes	;1 mn = 60 s
		jrz topmn
		jp finint

topmn		ldi secondes,60	;rechargement
		dec minutes
		jrz toph
		jp finint

toph		ldi minutes,60

		dec heures
		jrnz finint

eteint		clr heures
		ldi mode,8	;FIN

finint		ld A,AA		;fin d interruption
		reti

;--------------------------------------------------------------------
;VECTEURS D'INTERRUPTION

		.org 0FF0h	;conv A/D p:88
		nop
		reti

		.org 0FF2h	;TIMER
		jp IntTimer

		.org 0FF4h	;ports B et C
		nop
		reti

		.org 0FF6h	;port A
		nop
		reti

		.org 0FFCh
nmi             nop
		reti

		.org 0FFEh
res		jp reset
