PROJET D'ARCHITECTURE 68000

"Réalisation d'une Horloge"

Philippe COVAL + Céline FRESSYNET (g72)

 

Licence d'Informatique U.P.S. Mai 1997

 


Introduction

Spécifications

Affichage de l'heure en matrices ascii sur un terminal texte.
Mise à jour par boutons poussoirs (pia) & clavier (acia)
Un cheneillard defilera sur une batterie de leds (pia) a la vitesse de 8KHz
L'affichage à l'ecran est par géré par intéruptions de l'acia. Le programme ce décompose en 3 parties
  1. Initialisation PIA, ACIA, TIMER, IT
  2. Routines d'affichage
  3. Traitement de chaque Interruption délivrée par les circuits spécalisés

TOPOLOGIE HARDWARE :


[ mc 68000] <=>	[ MEM ]

[ Encoder]	[ TIMER ]
		[ PIA ]
		[ ACIA ]   <=>	[ Term VT100 ]

TIMER

Le but étant de gérer une horloge a l'aide du timer, on se contentera de lire/écrire dans les registres d'horloge du Timer.
On utilise aussi la fonction Oscillateur du timer pour generer une IT tous les 1/8eme de seconde pour le chenillard.

AFFICHAGE

L'affichage se fait donc en boucle (de même pour la lecture des registres d'horloge). Tandis que les ITs PIA/ACIA (get) ne font QUE modifier l'heure (registres), l'affichage est donc independant.

L'affichage est basiquement un "flot d'octets" sur l'acia donc par simplicité on utilise des caracteres de tabulation pour positionner les chiffres à l'ecran.

Aprés quelques essais on remarquera que l'acia a un débit plus faible que notre "flot d'octets" d'où la boucle dans putcar. pour supprimer cette boucle, on affiche par interuptions, c'est a dire que l'affichage ce fait en 2 temps :

  1. On remplit le buffer, pour cela on modifie putcar on rempli t un buffer au lieu d'envoyer un caractère dans l'acia.
  2. Dés que l'acia peut afficher il lit & affiche un caractère du buffer préalablement remplit.
Ceci n'est possible que si l'acia délivre une intéruption chaque fois que On discerne les 2 cas de figures en testant le bit 0 du registre d'état de l'acia

 


Algorithme

PROG PRINCIPAL

  1. Init PIA (port B en sortie, detection fronts montants)
  2. Init TIMER (8Hz + Plus prise en comptes des IT PIE UIE + horodateur 24h DCB)
  3. Init ACIA ( ITs Acia Libre , reception)
  4. Init Ecran
  5. Remplit Buffer
  6. Demasque ITs

IT TIMER

  1. "Roule" le registre du motif du chenillard
  2. Copie dans le PIA
  3. Valide l'IT

IT PIAx

  1. Teste le bit de l'autre cra
  2. Incremente / Decremente ou RAZ

IT ACIA

 


Arbre d'appel des sous programmes

 	       ,-->  SetZero
	       |
	       |-->  Putstr ------> Putcar
	       |
* PPrincipal - +-->  Disnum ------> Putmtx ------> Putstr -------> PutCar
	       |	       `--> Putcar
               |
	       `-->  Feedbuf -----> Disnum ------> ...




			      ,---> GetCar
			      |---> GetAH -------> Getcar
			      |---> GetAM -------> Getcar
	       ,--> Aget -----|
	       |	      |---> Exit
* ITACIA ------|	      `---> SetZero
	       |
	       `--> Aput ---------> Update ------> Feedbuf ------> ...


		,--> Inc/Dec ------> Sub/AppTen
* ITPIAx -------+->  Exepx
		`--> raz ----------> SetZero
			        `--> Sleep


* ITTIMR ---------> Chenill


 


Utilisation des resources par les S/P

Nom Description Entrée Sortie Reg tmp
Disnum Affiche un chiffre a une position donnée D3 : Chiffre (0-10)
D4 : Position (1-8)
A0 : @ Matrice
D4 : Position
d3 d4 a0
PutMtx Affiche la matrice pointée par A0 a la position donée par D4 A0 : @ Matrice
D4 : position
A3 : buffer a0 d4 d0 a1 d6 d3 d5
PutStr Affiche la chaine de caractere (terminée par #EOF) pointée par A1 A1 : @ Chaine A3 a1, d0 : Caractère
PutCar Affiche le caractére contenu dans D0 D0 : Caractère A3, Aciae d0, a3, aciae
GetCar Lit un caractére et le range dans D0 Aciar D0 : Caractère d0
ITPIAx Modife le reg horodateur selon CRA/CRB cra / crb DS timer d2 d3
ITTMR "Roule" le motif du chenillard d7 : Motif chenillard d7 : Nouveau motif d7
ITACIA Lit le clavier / affiche un caractere du buffer A3 : pointeur buffer DS timer / A3 d0 d1 d5 a3
Aput Affiche un caractere du buffer, pointe par a3 a3 ds timer ds
AGet Lit le clavier et maj de l'horodateur Aciar ds d0 d1 as

 


Remarques

On aurait pu ajouter des tests sur chaque registre d'entrée des procédure & le fait d'empiler/dépiler le contexte à chaque procédure. Néanmoins ceci n'est justifié que si l'on réutilise ces procédures dans des contextes différents.

Eventuelles évolutions

 


Listing Source

 ; =======================================================
 ; = Projet d'Assembleur 68K
 ; =	Theme : Realisation d'une horologe
 ; =======================================================
	psect clock,1,0,0,0,0
 ; _________________________[ CONFIG HARDWARE ]________________________________

 ;=== ACIA
acias	equ	$fb0005
aciae	equ	$FB0007
aciar	equ	$fb0007
NACIA	equ	$6c

 ;=== PIA
dra	equ	$fa0001
drb	equ	dra+2
ddra	equ	dra
cra	equ 	dra+4
ddrb	equ 	drb
crb	equ 	drb+4
NPIAA	equ	$68
NPIAB	equ	$70

 ; === TIMER
as	equ	$fb0009
ds	equ	$fb000b
NTMR	equ	$74

 ;_________________________[ INITIALISATION ]__________________________________
initpia:
		clr.b	crb
 		move.b	#%11111111,ddrb		; Port B en sortie (LEDs)
		move.b	#%101,crb
		tst.b	drb
		move.l	#ITPIAB,NPIAB

		clr.b	cra
		move.b	#$FF,ddra
		move.b	#%101,cra
		tst.b	dra
		move.l	#ITPIAA,NPIAA

		move.b	#%11111110,d7		; Motif chenillard

initimer:	move.b	#$a,as
		move.b	#%00101101,ds		; 8 Hz
		move.b	#$B,as
		move.b	#%01010011,ds		; PIE + UIE / DCB + 24h

		move.l	#ITTMR,NTMR
		bsr	setzero

initacia:	move.b	#%10110101,acias	; It ACIA Vide / Recep
		move.l	#ITACIA,NACIA
		lea	buf,a3			; Pointe au debut du buffer

initscreen:	lea	hdcr,a1			; Cache curseur
		bsr	putstr
		lea	cls,a1			; CLear Screen
		bsr	putstr

		lea	vdr,a1			; Message D'info
		bsr	putstr
		lea	intro,a1
		bsr	putstr
		lea	vdn,a1
		bsr	putstr

		move.l	#10,d3			; Separateur HHxMM:SS
		move.l	#3,d4
		bsr	disnum

		move.l	#10,d3			; HH:MMxSS
  		move.l	#6,d4
		bsr	disnum

		bsr	feedbuf
		move	#$2000,sr
		bra	*

exit:		lea	rvcr,a1			; Curseur Visible
		bsr	putstr
		lea	cls,a1			; Efface Ecran
		bsr	putstr
		move.l	#NULL,(A7)+
		move.l	#$ff,d1			; Attent Vidage buffer
purge:		bsr	sleep
		dbra	d1,purge
		illegal

 ; ____________________[ REMPLISSAGE DU BUFFER D'AFFICHAGE ]__________________

feedbuf:
		movem.l	d0-d7,-(a7)
		move.b 	#$4,as 			; Heure
		move.b	ds,d6			; xH:MM:SS
		move.b	d6,d3
		andi.l	#%11110000,d3
		lsr.l	#4,d3
		move.l	#1,d4
		bsr	disnum
						; Hx:MM:SS
		andi.l	#%00001111,d6
		move.l	d6,d3
		move.l	#2,d4
		bsr	disnum

		move.b	#$2,as			; HH:xM:SS
		move.b	ds,d6
		move.b	d6,d3
		andi.l	#%11110000,d3
		lsr.l	#4,d3
		move.l	#4,d4
		bsr	disnum
						; HH:MX:SS
		move.b	d6,d3
		andi.l	#%00001111,d3
		move.l	#5,d4
		bsr	disnum
						; HH:MM:xS
		move.b	#$0,as
		move.b	ds,d6
		move.b	d6,d3
		andi.l	#%11110000,d3
		lsr.l	#4,d3
		move.l	#7,d4
		bsr	disnum
						; HH:MM:Sx
		move.b	d6,d3
		andi.l	#%00001111,d3
		move.l	#8,d4
		bsr	disnum

		move.b	#NULL,(a3)+		; sentinelle de fin de buf
		lea	buf,a3
		movem.l	(a7)+,d0-d7
		rts
 ; ---------------------------------------------------------------------

setzero:					; RAZ registres horodateur
		move.b	#4,as
		move.b	#0,ds
		move.b	#2,as
		move.b	#0,ds
		move.b	#0,as
		move.b	#0,ds
		rts
 ;________________________[ INTERRUPTIONS ]______________________________

ITTMR:		movem.l	d0/d1/d3-d6,-(a7)
		move.b	#$c,as
		tst.b	ds			; raz PF
		bsr	chenil
		movem.l	(a7)+,d0/d1/d3-d6
		rte

 ; ------------------------------------------------------------------------

ITACIA:
		btst.b	#0,acias		; Quel type d'IT ?
		beq	aput
aget:
		move.b	aciar,d0		; Test 1er car
		cmp.b	#'h',d0
		beq	getah
		cmp.b	#'m',d0
		beq	getam
		cmp.b	#'x',d0
		beq	exit
		rte
getah:						; Lit digits Heures
		bsr	getcar
		sub.b	#$30,d0			; ASCII to Bin
		lsl.b	#4,d0
		move.b	d0,d1
		bsr	getcar
		sub.b	#$30,d0			; ASCII to Bin
		add.b	d0,d1
		cmp.b	#%00100100,d1		; Maximum 23h
		blt	seth
		rte
seth:		move.b	#4,as			; Mise a jour reg H horodateur
		move.b	d1,ds
		rte
getam:						; Lit digits Minutes
		bsr	getcar
		sub.b	#$30,d0
		lsl.b	#4,d0
		move.b	d0,d1
		bsr	getcar
		sub.b	#$30,d0
		add.b	d0,d1
		cmp.b	#%1100000,d1		; inf a 60min
		blt	setm
		rte
setm:						; Mise a jour reg M horodateur
		move.b	#2,as
		move.b	d1,ds
		rte

aput:						; Affiche un car du buffer
		move.b	(a3)+,d5
		cmp.b	#NULL,d5		; Si fin buffer
		beq	update			; Remplit le buffer
		move.b	d5,aciae
		rte

update:		lea	buf,a3
		bsr	feedbuf
		rte

 ; --------------------------------------------------------------------


chenil:
		rol.b	#1,d7			; Deplace la led
		move.b	d7,drb
		rts

 ;________________________[ INTERUPTION PIA ]___________________________

ITPIAA:						; Incremente l'horloge
		bsr	sleep
		btst.b	#7,crb
		bne	raz
		move.b	#4,as
		move.b	ds,d2
		cmp	#%00100011,d2		; si H=23h on traite l'exeption
		beq	exepa
		bra	inc
exepa:		clr.b	d2
		bra	setha
inc:
		move.b	d2,d3
		andi.b	#%00001111,d3
		cmp	#9,d3			; si H=x9 => (x+1)0
		beq	addten
		addq.b	#1,d2
		bra	setha
addten:
		addi.b	#%00010000,d2
		andi.b	#$F0,d2

setha:		move.b	#4,as			; Stocke la nouvelle val de H
		move.b	d2,ds
		tst.b	drb
		tst.b	dra
		rte
 ; --------------------------------------------------------------------------

ITPIAB:						; decremente l'horloge
		bsr	sleep
		btst.b	#7,cra
		bne	raz
		move.b	#4,as
		move.b	ds,d2
		cmp	#%0,d2
		beq	exepb
		bra	dec
exepb:
		move.b	#$23,d2
		bra	setha
dec:
		move.b	d2,d3
		andi.b	#%00001111,d3
		cmp	#0,d3
		beq	subten
		sub.b	#1,d2
		bra	setha
subten:
		subi.b	#%00010000,d2
		addi.b	#9,d2
		bra	setha
raz:
		bsr	setzero
		bsr	sleep			; Evite le rebond
		tst.b	drb			; Aquite les ITs
		tst.b	dra
		rte
 ;------------------------------------------------------------------------

sleep:						; tempo
		move.l	d0,-(a7)
		move.l	#$FFFF,d0
loop:		dbra	d0,loop
		move.l	(a7)+,d0
		rts

 ;_______________________________[ AFFICHAGE ]______________________________
 ; Ces Routines n'affichent rien
 ; mais rermplissent le buffer d'affichage lui meme géré Par IT (acia)

putstr:						; --- Affiche une chaine de car
		move.b	(a1)+,d0		;     Pointee a l'@a1
		cmp.b	#NULL,d0		;     se terminant par #NULL
		BEQ	endpts
		bsr	putcar
		bra	putstr
endpts:
		rts

putmtrx:					; --- Affiche une Matrice de HT x LG
		lea	home,a1			; se positionne en haut a gauche
		bsr	putstr
		move.l	#6,d3
skip:		move.b	#10,d0			; --- centrage Vertical
		bsr	putcar
		dbra	d3,skip
		move.l	#HT,d6			; Hauteur
ligne:		move.l	d4,d3
pos:		move.b	#9,d0			; Positione a la position D3
		bsr	putcar
		dbra	d3,pos
		move.l	#LG,d5			; Largeur
cols:		move.b	(a0)+,d0
		bsr	putcar
		dbra	d5,cols
		lea	NL,a1
		bsr	putstr
		dbra	d6,ligne		; Ligne suivante du caractere
		rts

putcar:						; remplit le buffer du car courant
		move.b	d0,(a3)+
		rts

getcar:
		btst	#0,acias
		beq	getcar
		move.b	aciae,d0
		rts

disnum:
		cmp.b	#10,d3
		bgt	exit
		movem.l	d0-d6,-(A7)
		lea	zero,a0
		mulu.w	#35,d3
		add.l	d3,a0
		bsr	putmtrx
		clr.l	d3
		movem.l	(a7)+,d0-d6
		rts


 ; _____________________________[ DATA ]_______________________________

NULL	equ	0
cls	dc.b	$1b,$5b,'2','J',NULL		; Efface Ecran
home	dc.b	$1b,$5b,'H',NULL		; Coin sup gauche
goto	dc.b	$1b,$5b,NULL			; Positionnement curseur
NL	dc.b	13,10,NULL			; Retour a un nouvelle ligne
hdcr	dc.b	$1b,"[?25l",NULL		; Curseur Invisible
rvcr	dc.b	$1b,"[?25h",NULL		; Curseur Visible
vdr	dc.b	$1b,"[7m",NULL			; Video Inv
vdn	dc.b	$1b,"[0m",NULL			; Video Normal / 1bold 4uline / 5blink
valeur	dc.l	$FFFFe

intro	dc.b	"Horloge -- Par Philippe COVAL + Celine FressyNet -- Mai 1997",13,10
	dc.b	"Mise a jour par clavier : H/M    quit: X",NULL

buf	dz.b	1000


 ; _____________________________[ FONTES ]_______________________________

HT	equ		4
LG	equ		6

zero:	dc.b	47,34,34,34,34,34,124
	dc.b	124,32,47,34,92,32,124
	dc.b	124,32,92,32,47,32,124
	dc.b	124,32,32,34,32,32,47
	dc.b	39,34,34,34,34,34,32
un:	dc.b	32,32,47,34,34,124,32
	dc.b	32,47,32,32,32,124,32
	dc.b	32,34,124,32,32,124,32
	dc.b	32,32,124,32,32,124,32
	dc.b	32,32,39,34,34,39,32
deux:	dc.b	124,34,34,34,34,92,32
	dc.b	32,34,47,32,32,47,32
	dc.b	32,47,32,32,47,32,32
	dc.b	47,32,32,39,34,34,124
	dc.b	39,34,34,34,34,34,39
trois:	dc.b	47,34,34,34,34,34,124
	dc.b	39,34,34,47,32,32,124
	dc.b	32,32,32,92,32,32,124
	dc.b	47,34,34,34,32,32,124
	dc.b	39,34,34,34,34,34,39
quatre:	dc.b	124,34,124,32,124,34,124
	dc.b	124,32,124,32,124,32,124
	dc.b	92,32,39,34,39,32,124
	dc.b	32,39,34,34,124,32,124
	dc.b	32,32,32,32,39,34,39
cinq:	dc.b	124,34,34,34,34,34,124
	dc.b	124,32,32,34,34,34,92
	dc.b	39,34,34,34,62,32,47
	dc.b	47,34,34,39,32,47,32
	dc.b	34,34,34,34,34,32,32
six:	dc.b	32,32,47,34,34,47,32
	dc.b	32,47,32,32,47,32,32
	dc.b	47,32,32,32,34,34,92
	dc.b	92,32,39,34,34,32,47
	dc.b	32,34,34,34,34,34,32
sept:	dc.b	47,34,34,34,34,34,47
	dc.b	34,34,47,32,32,47,32
	dc.b	32,47,32,32,47,32,32
	dc.b	47,32,32,47,32,32,32
	dc.b	34,34,34,32,32,32,32
huit:	dc.b	47,34,34,34,34,34,92
	dc.b	92,32,39,34,39,32,47
	dc.b	47,32,32,32,32,32,92
	dc.b	92,32,34,34,34,32,47
	dc.b	32,34,34,34,34,34,32
neuf:	dc.b	47,34,34,34,34,34,92
	dc.b	92,32,34,34,34,32,47
	dc.b	32,34,47,32,32,47,32
	dc.b	32,47,32,32,47,32,32
	dc.b	32,34,34,34,32,32,32
sep:	dc.b	32,32,32,32,32,32,32
	dc.b	32,32,47,34,47,32,32
	dc.b	32,32,34,34,32,32,32
	dc.b	32,47,34,47,32,32,32
	dc.b	32,34,34,32,32,32,32

	ends
	end



http://rzr.online.fr
Last modified: Sun Feb 8 18:14:02 CET 2004 www.Philippe.COVAL.free.FR