;
;[1m[32m        ____     ___        ___     ___ ___ ___ ___ ____      ___ ___ ___[0m
;[1m[32m         /  /__//_         /__ /  //_ //__ /  //_    /  / / //_ //__//_  [0m
;[1m[32m        /  /  //__        ___//__//__/___//__//     /  /_/_//  //  \/__  [0m
;
;[1m[32m-----------------------------------------------------------------------------[0m
;   - FOR ABO'S CONTACT US AT:   BP:28 1170 WATERMAEL-BOITSFORT 1 BELGIUM!!...
;
;[1m[32m-----------------------------------------------------------------------------[0m
;                           - DON'T SEND ANY DISKS -
;
;[1m[32m-----------------------------------------------------------------------------[0m
;
;
;
;                      [33m THE LEGENDARY >> SUBSOFTWARE << IN 87/88/89/90/91!!...
;                      [1m[32m ------------------------------------------------------
;
;
;
; Exemple de programmation du timer du CIA.
; Adapté du RKM Hardware, page F-331.
; Fait clignoter la PowerLed tous les 1/100èmes de seconde.
;
; (c) 1991 Loïc Far pour ANT.
;

	incdir	"include:"
	include	"graphics/gfxbase.i"
	include	"hardware/cia.i"
	include	"hardware/custom.i"

	include	"exec/exec_lib.i"
	include	"libraries/dos_lib.i"

	opt	o+,ow-

ciaa	EQU	$bfe001
ciab	EQU	$bfd000
custom	EQU	$dff000

N_DELAI	EQU	7159	; Délai pour 1/100ième de seconde NTSC
P_DELAI	EQU	7093	; Délai pour 1/100ième de seconde PAL

Run	lea	dosname(pc),a1	; Ouvre la dos.library
	moveq	#0,d0
	CALLEXEC OpenLibrary
	move.l	d0,_DOSBase
	beq	Exit

	CALLDOS	Output
	move.l	d0,stdout

	lea	gfxname(pc),a1	; Ouvre la graphics.library
	moveq	#0,d0
	CALLEXEC OpenLibrary
	tst.l	d0
	beq	Ciao	; Petit problème...
	move.l	d0,a1
	move.w	#P_DELAI,d7	; Délai pour mode PAL
	cmpi.w	#4,gb_DisplayFlags(a1)	; Mode PAL ?
	beq.s	Ok
	move.w	#N_DELAI,d7	; Délai pour mode NTSC
Ok	CALLEXEC CloseLibrary	; Ferme la librarie

	lea	ciab,a4	; Adresse du CIA-B dans A4
	lea	ciaa,a5	; Adresse du CIA-A dans a5

	move.b	ciacra(a4),d0	; Lit le registre CRA du CIA-B
	and.b	#%11000000,d0	; Masque les bits inutilisés
	or.b	#%00001000,d0	; Mode One-Shot
	move.b	d0,ciacra(a4)
	move.b	#%01111111,ciaicr(a4)	; Pas d'interruption CIA-B

	move.l	stdout(pc),d1
	move.l	#message,d2
	moveq	#messlen,d3
	CALLDOS	Write

	move.b	d7,ciatalo(a4)	; Programme la valeur du compteur
	ror.b	#8,d7	; poids faible d'abord
	move.b	d7,ciatahi(a4)	; poids fort en dernier

busy_wait:
	btst	#0,ciaicr(a4)	; Compteur à 0 ?
	beq.s	busy_wait	; Pas encore
	bchg	#CIAB_LED,ciapra(a5)	; Switche la LED
	btst	#CIAB_GAMEPORT0,ciapra(a5)	; Bouton souris ?
	beq.s	Ciao	; Oui-> fin
	bset	#0,ciacra(a4)	; Redémarre le timer
	bra.s	busy_wait	; et boucle

Ciao	move.l	_DOSBase(pc),a1
	CALLEXEC CloseLibrary

Exit	moveq	#0,d0
	rts

; ************************************
_DOSBase	dc.l	0
stdout	dc.l	0

dosname	dc.b	"dos.library",0
	even
gfxname	dc.b	"graphics.library",0
	even

message	dc.b	"Regardez la PowerLed...",$0a
	dc.b	"Pressez le bouton gauche "
	dc.b	"de la souris pour terminer.",$0a
messlen	EQU	*-message
	even

	END


