 
VERSION		=	"2"
REVISION	=	"2"
REVA		=	"1"
YEAR		=	"3"
        ************************************************* De la Version 0 à
        *		   ALARMING			*la version 0.33,
        * Un utilitaire d'alarme pour Amiga		*programmation sur
        * Il nécessite le système 2.04 (eh oui...)	*a68k et az.
        * Il permet de fixer des alarmes pour:          *
        *   - 1 date précise				* A partir de 0.40, 
        *   - 1 fois par an				*programmation sur
        *   - 1 fois par mois				*Devpac 3.
        *   - 1 fois par semaine			*
        *   - 1 fois tout les jours			*
        *************************************************
        * ALARMING © 1992, 1993 par Philippe Girolami	*
        *************************************************
        * - V0.11 10/03/92			* Fenetre "hh:mm JJ/MM/AA".
        * - V0.20 20/03/92			* Event-Handling de cette Fen.
        * - V0.30 22/03/92			* Fenetre Set-Up.
        * - V0.31 29/03/92			* ^^^^^^^ ^^^^^^^
        * - V0.32 30/03/92			* Textes dans Set-Up Window.
        * - V0.33 01/04/92			* ^^^^^^ ^^^^ ^^^^^^ ^^^^^^^
 	*	Devpac 3 et RKM de la Release 2	*
 	* - V0.40 30/08/92			* Doc 2.0 -> Spécificités 2.0 Réécriture Fenêtres+ création gadgets textes
 	* - V0.41 31/08/92			* Création gadgets Checkbox et certains Cycles
 	* - V0.42 01/09/92			* Création gadgets Cycle et Slider (tout le reste quoi!!)
 	* - V0.51 02/09/92			* Event-Handling Fenêtre Set-Up
 	* - V 0.52 03/09/92			* Event-Handl ng de la Fenêtre Set Up (suite) gestion gadget Enables et disabled
 	* - V 0.60 05/09/92			* Création Task pour fenêtre de l'heure
 	* - V 0.61 06/09/92			* Cr ation Task pour fenêtre de l'heure (suite)
 	* - V 0.62 07/09/92			* Création Task pour fenêtre de l'heure (suite2) pas fini pourtant (ne marche pas)
 	* - V 0.63 07/09/92			* Code de la Task elle-même
 	* - V 0.64 16/09/92			* Code du Timer.device pour avoir l'heure et l'afficher
 	* - V 0.65 17/09/92			* Code de test si alarme -> affichage fenêtre message...
 	* - V 0.66 19/09/92			* Code d'affichage de la fenêtre d'alarme
 	* - V 0.67 20/09/92			* ^^^^ ^^^^^^^^^^^ ^^ ^^ ^^^^^^^ ^^^^^^^^ (suite)
 	* - V 0.68 21/09/92			* Code d'affichage de la fenêtre, tests d'alarme, optimisation...
 	* - V 0.69 22/09/92			* Code de test entièrement réécrit (en mieux...mais plus long)
 	* - V 0.6A 23/09/92			* Code de la création de Task, msgPorts et tout.
 	* - V 0.70 26/09/92			* Gestion des messages inter-tâches.
 	* - V 0.71 27/09/92			* Gestion des messages (suite).
 	* - V 0.72 30/09/92			* Gestion des messages (suite).
 	* - V 0.72b 1/10/92			* Gestion des messages (suite).		MESSAGE "KILL"
 	* - V 0.72c 2/10/92			* Gestion des messages (suite).
 	* - V 0.73 03/10/92			* Gestion des messages (suite).
 	* - V 0.74 04/10/92			* Messages d'erreur (Alerts)...
 	* - V 0.74b 5/10/92			* Messages d'erreur (suite) et gestion messages (suite)
 	* - V 0.74c 6/10/92			* Gestion des messages (réglage du probleme WaitPort pour reply...)
 	* - V 0.75 08/10/92			* Gestion des messages "Stop" et "Restart".
 	* - V 0.75b 10/10/92			* Débuggage de la fonction "Quit". Gestion des messages (sauf Save Alarmes) est terminée à cette V (et marche).
 	* - V 0.80 11/10/92			* Gestion des tailles de fonte différentes (barre de titre, textes et gadgets) dans toutes les fenetre.
 	* - V 0.81 12/10/92			* Update de la SUWindow en fonction des structures Alarme.
 	* - V 0.82 13/10/92			* Update de la SUWind (suite) + corrections bug après un Cancel ne recevait plus message Timer
 	* - V 0.83 29/10/92			* Update de la SUWind (suite)
 	* - V 0.83b 30/10/92			* Update de la SUWind (suite) ((b car peu de modifs hier))
	* - V 0.83c 29/11/92			* Update de la SUWind (fin) + correction bug de départ (plantait tout de suite)
	* - V 0.83d 01/12/92			* Tentative correction bug fenêtre de l'heure (largeur fausse) + non exit du program ("prog still running") (PAS REUSSI)
	* - V 0.84 06/12/92			* Réécriture Inits: Création PROCESS, pas TASK=> règle pbml de Quit (!!)
	* - V 0.84b 06/12/92			* Problème de largeur fenêtre heure réglé pour taille fonts <>
	* - V 0.84c 06/12/92			* Correction bug de plantage lors utilisation gadget Heure,minute...
	* - V 0.85 06/12/92			* Copie ds structure les nouvelles valeurs à partir de Save
	* - V 0.86 07/12/92			* Règle problème d'affichage alarme avec une minute de retard, début sauvagarde
	* - V 0.87 08/12/92			* Gestion du disque: chargement des préférences alarme.
	* - V 0.87b 08/12/92			* Gestion du disque (suite) + tentative reglage de pbml affichage alarmes
	* - V 0.88 09/12/92			* Gestion du disque (sauvegardes).
	* - V 0.89 10/12/92			* Gestion erreurs disque (terminé mais marche pas sauf si debugger) + j'ai réglé pbml aff alarmes (seule alarme 1 marchait)
	* - V 0.8A 12/12/92			* Gestion des erreurs disque et pas V 2.0... + réorganisation du source
	* - V 0.90 13/12/92			* Un peu d'esthetique...
	* - V 0.91 13/12/92			* L'option son que j'avais oubliée...
	* - V 0.91b 18/12/92			* Suite de l'option son, plus long que prévu !!!
	* - V 0.91c 19/12/92			* Suite code option son (après 2 reconstructions disquette Devpac3 !!!)
	* - V 0.93d 20/12/92			* Suite car je n'arrive pas à la faire marcher, merde... 
	* - V 0.92 22/12/92			* Suppression option car impossible à mettre en oeuvre (je ne trouve pas BeginIO).
	* La version 0.92, assemblée sur disque marche pour les erreurs disque, le programme est donc fini à par pour les gadgets sliders.
	* - V 0.93 22/12/92			* Réécriture tests alarme car gros bugs: Si date précise et pas affiché cette année pouvait ne pas afficher à cause mois <> ...
	* - V 0.93b 23/12/92			* Relecture du code pour trouver mauvaise gestion erreurs + esthetique.
	* - V 1.00 23/12/92 12:45		* Terminé sauf pour problème slider gadgets irrésolvables...
	* - V 1.01 26/12/92			* Place fenêtre heure complétement à droite lors de son affichage.
	* - V 1.02 27/12/92			* Bidouille dans les structure gadget pour pouvoir avoir le look 2.0 sur les sliders (et voir le curseur).
	* - V 1.03 ??/12/92			* Tout en anglais.
	* - V 1.10 06/12/92			* Menu dans fenêtre set-up avec "About...".
	* - V 1.10b 17/01/93			* Suite...
	* - V 1.10c 24/01/93			* Suite avec menu "quit" et menu "choose host screen".
	* - V 1.10d 26/01/93			* Suite avec tentative de faire afficher les textes du menu(!)
	* - V 1.11 27/01/93			* Suite pour enfin le faire marcher (j'espère).
	* - V 1.11b 28/1/93			* Suite pour afficher le fond du menu en noir (c'est pour çà qu'on ne voyait rien!)
	* - V 1.12 29/01/93			* Gestion des messages du menu. Routine "About...".
	* - V 1.12b 29/01/93			* Routine "Host screen..."
	* - V 1.12c 30/01/93			* Suite de la routine (lecture screen list)
	* - V 1.12d 03/02/93			* Suite de la routine (recopie le noms et tableaux)
	* - V 1.12e 04/02/93			* Suite de la routine (pblm recopie noms)
	* - V 1.12f 04/02/93			* Optimisation des créations de gadgets: Emploi d'une seule structure.
	* - V 1.12g 06/02/93			* Fin de la réécriture des créations de gadgets ^^^^^^^^^^^
	* - V 1.12h 07/02/93			* Debuggage de tout cette merde + suite routine host screen (fenêtre + gadget)
	* - V 1.12i 07/02/93			* Gestion des messages des 2 gadgets.
	* - V 1.12j 07/02/93			* Réécriture de "GetScreen" pour accomoder la nouvelle fonctionnalitée.
	* - V 1.12k 07/02/93			* Fin du debuggage, la fonction nouvelle marche -> fin V 1.1(2)
	* - V 1.12l 07/02/93			* V 1.1 avec un peu de Bevel pour mieux séparer les parties du Set Up. (Correction d'un bug)
	* - V 1.13 09/02/93			* Tentative de correction de couleur fond du menu et mauvaise désallocation mémoire.
	* - V 1.13b 15/02/93			* Correction mauvaise désallocation mémoire (oubli de libérer "Mem").
	* - V 1.20 17/02/93			* Meilleur gestion des erreurs (on va éviter de planter Alarming si possible).
	* - V 1.21 17/02/93			* Meilleur gestion des erreurs (plus que 2 plantages obligatoires), ici dans Process.
	* - V 1.22 17/02/93			* Debuggage...
	* - V 1.23 18/02/93			* Suite debuggage...
	* - V 1.24 05/02/93			* Tentative d'arranger tous les bugs.
	* - V 1.30 27/03/93			* Lifting de la fenêtre de choix...
	* - V 1.31 30/03/93			* Suite du lifting...
	* - V 1.32 03/04/93			* Implantation type 1 * par semaine (lettre envoyée à X.Leclercq le 2/4/93).
	* - V 1.33 04/04/93			* Suite et fin...
	* - V 1.34 08/05/93			* Réécriture ouverture fenêtre, menu car programme à part marche (mais ne marche pas!!).
	* - V 1.35 09/05/93			* Réglage du problème du menu (remplacement de la structure de la wind par des Tags!!).
	* - V 1.36 09/05/93			* Réglage du problème des Bevels et créations des manquants (pbml dans paramètres RKMs) + codage flash screens
	* ------------------------------------- *
	* - V 2.00 07/09/93			* Début Alarming II, 1 seul process pour tout le prog.
	* - V 2.01 07/09/93			* Utilisation des fonctions dos, DateStamp et DateToString
	* - V 2.02 13/09/93			* Correction des messages d'erreur.
	* - V 2.10 13/09/93			* 20 alarmes modulables... (I)
	* - V 2.11 19/09/93			* Correction bug copie; ne conserve pas bien si pas effacement 1ere alarme (oubli d'une incrémentation!)
	* - V 2.12 19/09/93			* Macro ALLOCMEM et FREEMEM (plus lisible)
	* - V 2.13 19/09/93			* Correction bug dans TimeDateInit: réouverture et fermeture de Gfx avec même base -> plantage en Quit.
	* - V 2.14 19/09/93			* Correction bug dans quit, DeleteMsgPort sur un port non-initialisé et oublie d'un AbortIO.
	* - V 2.15 20/09/93			* Correction bug dans "ChangeGadget".
	* - V 2.20 20/09/93			* Mise en place du ToolType EURODATE (=ON ou OFF)
	* - V 2.21 20/09/93  16:28		* Mise en place du ToolType SCREEN.
	*****************************************
		
  ***************
  * Définitions *
  ***************
	
  * Directive Assembleur
	
  * Includes 
  * Macro
CALLGDT	MACRO			;call gadtools library
	move.l	_GadToolsBase,a6
	jsr	_LVO\1(a6)
	ENDM
	
CALLUTIL	MACRO
	move.l	_UtilityBase,a6
	jsr	_LVO\1(a6)
	ENDM

CALLTIMER	MACRO
	move.l	_TimerBase,a6
	jsr	_LVO\1(a6)
	ENDM
	
CALLGFX	MACRO
	move.l	_GfxBase,a6
	jsr	_LVO\1(a6)
	ENDM
  ********************
  * Structure Alarme *
  ********************
 ************************************
 * Structure sauvegarde des alarmes *
 ************************************sur disque
  * EQUs
  * Programme *
  *************

	SECTION	Startup,CODE
	
Début:  bra.s   Startup                 ;MA SIGNATURE DE PROGRAMME
        dc.b    "Alarming V",VERSION,".",REVISION,REVA," © 199",YEAR," par Philippe Girolami, DP à distribuer..."
	dc.b	"C'est sympa de venir voir mon programme, salut..."
        even

Startup:
        sub.l   a1,a1
        CALLEXEC	FindTask
        move.l  d0,a2
        tst.l   pr_CLI(a2)
        bne.s   FromCLI

        lea     pr_MsgPort(a2),a0
        CALLEXEC	WaitPort
        lea     pr_MsgPort(a2),a0
        CALLEXEC	GetMsg
        move.l  d0,WBMsg

FromCLI:

        jsr     Main            ;LEUUU PROGRAAAAMEUUU

        move.l  WBMsg(pc),d0
        beq.s   More
        move.l  d0,a1
        CALLEXEC	Forbid
        CALLEXEC	ReplyMsg
More:   moveq   #0,d0
        rts

WBMsg:  dc.l    0

  ******************
  * Alarming V1.13 * 09/02/93
  ******************

	SECTION	Main,CODE
	

Main:

; On verifie que Alarming n'a pas déjà été chargé


	lea	AlarmingPort,a1
	CALLEXEC	Forbid	;interdit multitache->le port reste
	CALLEXEC	FindPort	;cherche port
	CALLEXEC	Permit	;autorise
	tst.l	d0	;retour
	bne	ErrorExists	;si <>0 alors le port exists donc erreur

	move.l	#37,d0          ;SYSTEME 2.04 ou plus************
	lea	intname,a1
	CALLEXEC	OpenLibrary 	;Tente d'ouvrir avec Version number=36
        move.l	d0,_IntuitionBase   	;sauvegarde addresse de base
	tst.l	d0		;Si <>0 =>  = address de base => ROM 2.0
	bne	.ok		;si >< 0 alors c'est pas d'erreur
; S'il y a une erreur, on va voir si on peut ouvrir en < 2.0, si on peut
;  c'est qu'on a pas un version 2.0, donc on quitte avec mess d'erreur.
	moveq.l	#0,d0	;n'importe quelle version
	lea	intname,a1
	CALLEXEC	OpenLibrary
	move.l	d0,d7
	TEST	ErrorIntuitionOpen	;si = 0 alors pas Mem
	bsr	NotVers2.0	;sinon affiche qu'il faut vers 2.0
	move.l	d7,a1
	CALLEXEC	CloseLibrary	;rend mémoire de la library.
	rts			;bye, bye

.ok
; Ouverture de GadTools
	lea	GadToolsName,a1
	moveq.l	#36,d0			;n'importe quelle version
	CALLEXEC OpenLibrary
	TEST	GadToolsOpenErr		;n'a pas réussi à ouvrir si = 0
	move.l	d0,_GadToolsBase

;utility
	move.l	#36,d0
	lea	utilname,a1
	CALLEXEC	OpenLibrary
	TEST	UtilityOpenErr
	move.l	d0,_UtilityBase

;dos.library
	moveq.l	#36,d0			;Ouverture DosLibrary
	lea	dosnam,a1		;version inimportante
	CALLEXEC	OpenLibrary	;pour attendre une seconde
	TEST	DosOpenErr		;branche si erreur
	move.l	d0,_DOSBase
; graphics.library
	moveq.l	#36,d0			;Ouverture DosLibrary
	lea	gfxnam,a1		;version inimportante
	CALLEXEC	OpenLibrary	;pour attendre une seconde
	TEST	GrafOpenErr		;branche si erreur
	move.l	d0,_GfxBase
;Ouverture Timer.device
 ;Création du MsgPort
	CALLEXEC	CreateMsgPort	;Pour dialogue entre les deux tâches
	TEST	ErrorTimerMsgPort		;PAS BSR pour rts direct au startup
	move.l	d0,TimerMsgPort		;si erreur
	move.l	d0,a1						PROCESS)
	move.b	#1,LN_PRI(a1)		;priorité
	lea	AlarmingPort,a0
	move.l	a0,LN_NAME(a1)		;nom
	CALLEXEC	AddPort		;public	

	move.l	TimerMsgPort,a0			;MsgPort
	move.l	#IOTV_SIZE,d0			;TimerequestSize
	CALLEXEC	CreateIORequest	;Création  IORequest field
	tst.l	d0	;test retour
	beq	ErrorTimerIOCreate	;affiche erreur
	move.l	d0,IOTimer

	lea	timname,a0
	move.l	#UNIT_VBLANK,d0
	move.l	IOTimer,a1
	moveq.l	#0,d1
	CALLEXEC	OpenDevice
	tst.l	d0
	bne	ErrorTimerOpen	;affiche erreur si <> 0
; ça y est il est ouvert
; On cherche sa base pour utiliser les fonctions comme des libraries
	move.l	IOTimer,a0		;Addresse Io Block
	move.l	IO_DEVICE(a0),_TimerBase	;Trouve l'addresse du timer.device

; créé le mask du signal du timer.device
InitTimerSignal
	move.l	TimerMsgPort,a4		;addresse MsgPort du Timer
	move.b	MP_SIGBIT(a4),d0	;le n° de signal pour le timer.device
	moveq.l	#0,d1			;met 1L dans d2
	bset.l	d0,d1			;1L<<Mp_SigBit de Timer Port
	move.l	d1,TimSign		;Le sauve dans TimSign
; mask de la feneêtre est créé dans TimeDateInit

; Chargement des préfrences
	bsr     LoadPrefs       ;on charge les preférences ds ActualBuff
	tst.l	d0		;test retour
	bmi	ErrorPrefs	;si <0 alors erreur prefs!
; Ici miseàjour table de pointeurs pour gadget n°
; Met un zero sur le pointeur pointant sur la chaine du numéro max+1
	move.w	NumAlarme,d0
	asl.w	#2,d0		;Nombre d'alarmes*4
	lea	AlarmeTxts,a0	;adresse base nombres
	ext.l	d0
	add.l	d0,a0
	move.l	(a0),SaveOld	;sauve le truc avant
	move.l	a0,WhereSaveOld	;et son adresse (simplifie beaucoup)
	move.l	#0,(a0)	;met NULL
	
; Appel à GetToolTypes pour les lire
	bsr	GetToolTypes
; Ici on lock le Default screen pour tout les GetScreen du programme...
.tryagain
	tst.l	ChoosedScreen
	bne	.alreadylocked	;déjà locké en GetToolTypes
	move.l	#NULL,a0
	move.l	a0,a1
	CALLINT	LockPubScreen
	tst.l	d0
	beq	.tryagain		;reessaye à l'infinie
	move.l	d0,ChoosedScreen

; Tente ouverture TimeDateInit
.alreadylocked
	bsr	ConvertTime	;prend l'heure et met à jour chaine.
	bsr	TimeDateInit

	bsr	DoTimerIO	;envoit demande de message dans 1 minute...
Loopeur        
Prog2
	move.l	WindSign,d0
	or.l	TimSign,d0			;d0=d0|d7	
	CALLEXEC	Wait		;attend sur timer et fenêtre
Prog
; on va voir ce qui nous a reveillé
	
	move.l	TimeWindHd,a2
	move.l	wd_UserPort(a2),a0	;addresse du port fenêtre	
	CALLEXEC	GetMsg
	TEST	TimerMsg		;si = 0 pas de message sur ce port
					;donc ce doit être le timer.
	move.l	d0,a1
	CALLEXEC	ReplyMsg	;on répond tout de suite
	
        move.l  TimeWindHd,a0           ;Ce ne peut etre que MOUSEBOUTTONS car c'est le seul initialisé
        CALLINT CloseWindow             ;donc on ferme celle-là et on ouvre l'autre


	bsr	SetUpRender		;On a message, Affichage fenetre de SetUp
					;qu'à le gadget "Alarme: " cad
					;le numéro d'alarme.
	tst.b	d0			;test retour
	beq	.cont			;pas erreur, CONTINUE SUR .cont
	cmp.b	#1,d0			;erreur n°1 ? (si oui c'est erreur
	beq	.closeit		;ouverture de la fenêtre)
	cmp.b	#2,d0			;erreur n°2 ? (si oui c'est pas de
	beq	.go			;mémoire pour allouer "Mem")
	cmp.b	#4,d0
	beq	.closemem		;erreur context gadget
	cmp.b	#5,d0
.closeit
.freethem
	move.l	BaseGad,a0		;rend les gadgets
	CALLGDT	FreeGadgets
.closemem
	FREEMEM	Mem,MemSize
.go	bsr	TimeDateInit
	bra	Loopeur
	

.cont
	moveq.w	#0,d0			;toujours 00 quand affichage départ
	bsr	UpdateDisplay		;on met tous les gadgets à la valeur

* Gestion des messages
GestionMess
	move.l  SUWindHd,a0		;Handle de la fenetre
	move.l  wd_UserPort(a0),a0	;UserPort address
	CALLEXEC	WaitPort	;Attend un message de intuition...

ProcessMessages	;ceci permet de voir si il y une queue de messages.
	move.l  SUWindHd,a0             ;Handle de la fenetre
	move.l  wd_UserPort(a0),a0	;UserPort address
	CALLGDT	GT_GetIMsg		;Prend le IMessage avec GadTools
	TEST	GestionMess		;test D0, si 0 alors Message
					;interressant pour GadTools seulement
	move.l	d0,a0	
	move.l	28(a0),IAddress		;IAddress (=Gadget)
	move.l	20(a0),Class		;Class
	move.w	24(a0),Code		;Code
	
	move.l	a0,a1
	CALLGDT	GT_ReplyIMsg		;Répond

	move.l	Class,d1		;GT_ReplyIMsg détruit d1
	cmp.l	#IDCMP_REFRESHWINDOW,d1	;on va trouver quel IDCMP
	bne.s	NotRefresh
	move.l	SUWindHd,a0		;Win
	CALLGDT	GT_BeginRefresh
	bsr	DrawLines		;les Bevels
	move.l	SUWindHd,a0
	move.l	#TRUE,d0
	CALLGDT	GT_EndRefresh		;fini rafraîchissement
	bra	ProcessMessages
NotRefresh
	cmp.l	#IDCMP_GADGETUP,d1	;Button Gadget
	beq	.tstgads	
	cmp.l	#IDCMP_GADGETDOWN,d1	;il faut tester tous ceci
	beq	.tstgads
	cmp.l	#IDCMP_MOUSEMOVE,d1	;et celui-ci aussi
	bne	NotGadget
.tstgads
	move.l	IAddress,a0		;prend address gadget structure
	move.w	38(a0),d0		;GadgetID
	cmp.w	#16,d0			;gadget "Save" ?
	beq	Save			;branche sur sauvegarde
	
	cmp.w	#17,d0			;gadget "Cancel" ?  c'est un Word
	beq	Cancel			;branche sur cancel	     ----	             ----
	
	cmp.w	#15,d0			;Alarme n° ?
	bne	NotAlarmeNbr
	bsr	CopyBuffer2Structure	;recopie les chaînes de caract des
					;string gadgets
	move.w	Code,d0			;n° sélectionné
	bsr	UpdateDisplay		;remet à jour
	bra	ProcessMessages		;fini
	
NotAlarmeNbr
; si on est arrivé ici alors c'est que c'est un des gadgets de réglage,
;  on met donc le dernier affichage de l'alarme à zéro afin qu'elle s'affiche
;  même si c'est le même jour la première fois
	move.w	d0,d6			;sauve d0
	bsr	ResetLastDisp		;remet à zero dernière modif
	move.w	d6,d0			;ramène d0
	cmp.w	#6,d0			;CheckBox  "Message" ID=6
	bne	NotMessage		;pas ça
	move.w	AlNbr,d0		;numéro d'alarme dans d0
	bsr	GetAlAdd		;adresse structure alarme
	eor	#AFLG_Mess,Al_Flags(a0)	;change dans structure
	move.l	IAddress,a0		;adresse du Gadget
	bsr	InitUpdateMess		;initialisations
	bsr	UpdateMess		;met à jour les lignes de texte
	bra	ProcessMessages
	
NotMessage:
	cmp.w	#7,d0			;checkbox "Son" ?
	bne	NotSound
	move.w	AlNbr,d0		;numéro d'alarme dans d0
	bsr	GetAlAdd		;adresse structure alarme
	eor	#AFLG_Son,Al_Flags(a0)	;change dans structure
	move.l	IAddress,a0		;adresse du Gadget
	bra	ProcessMessages

NotSound
	cmp.w	#8,d0			;checkbox "Clignotement" ?
	bne	NotFlash
	move.w	AlNbr,d0		;numéro d'alarme dans d0
	bsr	GetAlAdd		;adresse structure alarme
	eor	#AFLG_Flash,Al_Flags(a0)	;change dans structure
	move.l	IAddress,a0		;adresse du Gadget
	bra	ProcessMessages

NotFlash
	cmp.w	#14,d0			;Type d'alarme
	bne	NotAlarmeType
	move.w	Code,d4			;Pour tester
	move.w	AlNbr,d0
	bsr	GetAlAdd		;trouve adresse de cette alarme
	move.w	d4,Al_Type(a0)		;met le nouveau type ds structure
	move.w	d4,d6
	bsr	UpdateAbles		;met à jour les autorisations
					;de changement et tout et tout
	bra	ProcessMessages
	
NotAlarmeType
	cmp.w	#11,d0
	bne	NotAlarmeDay
	move.w	Code,d4
	move.w	AlNbr,d0
	bsr	GetAlAdd
	move.w	d4,Al_Date+mday(a0)
	bra	ProcessMessages
NotAlarmeDay
	cmp.w	#18,d0
	bne	NotAlarmeWDay
	move.w	Code,d4
	move.w	AlNbr,d0
	bsr	GetAlAdd
	move.w	d4,Al_Date+wday(a0)
	bra	ProcessMessages
NotAlarmeWDay
	cmp.w	#12,d0
	bne	NotAlarmeMonth
	move.w	Code,d4
	addq.w	#1,d4
	move.w	AlNbr,d0
	bsr	GetAlAdd
	move.w	d4,Al_Date+month(a0)
	bra	ProcessMessages	
NotAlarmeMonth
; si c'est l'année, on s'en fout, on ferra comme pour les string Gadgets
NotAlarmeYear
	cmp.w	#9,d0
	bne	NotAlarmeHour
	move.w	Code,d4
	move.w	AlNbr,d0
	bsr	GetAlAdd
	move.w	d4,Al_Date+hour(a0)	;=4
	bra	ProcessMessages
NotAlarmeHour
	cmp.w	#10,d0
	bne	ProcessMessages		;si connait pas rebranche
	move.w	Code,d4
	move.w	AlNbr,d0
	bsr	GetAlAdd
	move.w	d4,Al_Date+min(a0)
	bra	ProcessMessages
UpdateAbles
	cmp.w	#ATYP_Jour,d6		;1 * par jour ??
	bne	NotJour
;on va disabler Année(Integer1),Mois(Cycle1),Jour(Slider3)
	bsr	DisableYear
	bsr	DisableMonth
	bsr	DisableDay
	bsr	EnableHour
	bsr	EnableMinute
	bsr	DisableWeek
	rts
NotJour
	cmp.w	#ATYP_Mois,d6
	bne	NotMois			;pas une fois par mois
;On va disabler année et mois et enabler jour
	bsr	DisableYear		;Disable année
	bsr	DisableMonth		;Disable mois
	bsr 	EnableDay		;Autorise Jour
	bsr	EnableHour
	bsr	EnableMinute
	bsr	DisableWeek
	rts
	
NotMois	
	cmp.w	#ATYP_An,d6
	bne	NotAnnée
; on va disabler année et enabler mois et jour
	bsr	DisableYear
	bsr	EnableMonth
	bsr	EnableDay
	bsr	EnableHour
	bsr	EnableMinute
	bsr	DisableWeek
	rts
	
NotAnnée
;C'est donc une date précise donc on enable tout
	cmp.w	#ATYP_Prec,d6
	bne	NotPrécise		;pas une fois par mois
;On va tout enabler
	bsr	EnableYear
	bsr	EnableMonth
	bsr	EnableDay
	bsr	EnableHour
	bsr	EnableMinute
	bsr	DisableWeek
	rts
NotPrécise
	cmp.w	#ATYP_Week,d6	;une fois par semaine ? (V1.3)
	bne	NotWeekly
; une fois par semaine c'est comme 1 * par jour avec + cycle week ablé
	bsr	EnableWeek
	bsr	EnableHour
	bsr	EnableMinute
	bsr	DisableYear
	bsr	DisableMonth
	bsr	DisableDay
	rts
	
	
NotWeekly
; c'est qu'elle est inactive, on disable tout
	bsr	DisableWeek
	bsr	DisableYear
	bsr	DisableMonth
	bsr	DisableDay
	bsr	DisableHour		;heure minute aussi
	bsr	DisableMinute
	rts
	
DisableYear:
	move.l	Integer1,a0		;address gadget Année
	move.l	SUWindHd,a1		;Handle fenêtre
	move.l	#NULL,a2		;pas de requester
	lea	DisableTags,a3	;c'est le même de toute façon
	CALLGDT	GT_SetGadgetAttrsA	;Disable Integer
	rts
DisableMonth:
	move.l	Cycle1,a0
	move.l	SUWindHd,a1
	move.l	#NULL,a2
	lea	DisableTags,a3	
	CALLGDT	GT_SetGadgetAttrsA	;Disable Mois
	rts
DisableDay
	move.l	Slider3,a0
	move.l	SUWindHd,a1
	move.l	#NULL,a2
	lea	DisableTags,a3		;Disable Jour
	CALLGDT	GT_SetGadgetAttrsA
	rts
DisableHour
	move.l	Slider1,a0		;heures
	move.l	SUWindHd,a1
	move.l	#NULL,a2
	lea	DisableTags,a3		;Disable Jour
	CALLGDT	GT_SetGadgetAttrsA
	rts
DisableMinute
	move.l	Slider2,a0		;minutes
	move.l	SUWindHd,a1
	move.l	#NULL,a2
	lea	DisableTags,a3		;Disable Jour
	CALLGDT	GT_SetGadgetAttrsA
	rts
DisableWeek
	move.l	Cycle4,a0		;jours semaine
	move.l	SUWindHd,a1
	move.l	#NULL,a2
	lea	DisableTags,a3		;Disable Jour
	CALLGDT	GT_SetGadgetAttrsA
	rts
EnableYear:
	move.l	Integer1,a0		;address gadget Année
	move.l	SUWindHd,a1		;Handle fenêtre
	move.l	#NULL,a2		;pas de requester
	lea	EnableTags,a3
	CALLGDT	GT_SetGadgetAttrsA	;Disable Integer
	rts
EnableMonth:	
	move.l	Cycle1,a0
	move.l	SUWindHd,a1
	move.l	#NULL,a2
	lea	EnableTags,a3	
	CALLGDT	GT_SetGadgetAttrsA	;Disable Mois
	rts
EnableDay
	move.l	Slider3,a0
	move.l	SUWindHd,a1
	move.l	#NULL,a2
	lea	EnableTags,a3	;Disable Jour
	CALLGDT	GT_SetGadgetAttrsA
	rts
EnableHour
	move.l	Slider1,a0	;heures
	move.l	SUWindHd,a1
	move.l	#NULL,a2
	lea	EnableTags,a3	;Disable Jour
	CALLGDT	GT_SetGadgetAttrsA
	rts
EnableMinute
	move.l	Slider2,a0	;minutes
	move.l	SUWindHd,a1
	move.l	#NULL,a2
	lea	EnableTags,a3	;autorise Jour
	CALLGDT	GT_SetGadgetAttrsA
	rts
EnableWeek
	move.l	Cycle4,a0		;jours semaine
	move.l	SUWindHd,a1
	move.l	#NULL,a2
	lea	EnableTags,a3		;autorise Jour
	CALLGDT	GT_SetGadgetAttrsA
	rts		

					

NotGadget
	cmp.l	#IDCMP_MENUPICK,d1	;is it a menu chosen ?
	bne	NotMenu
; il faut maintenant savoir quel item a été choisi.
; Code=Menu number
	move.w	Code,d0
	cmp.w	#MENUNULL,d0
	beq	.end			;si c'est MENUNULL c'est pas select
	move.w	d0,d1			;sauve le retour d'intuition.
; prend le numéro de item car on n'a que des items
; ITEMNUM(n) ((n >> 5) & 0x003F) (Includes...)
	lsr.w	d0
	lsr.w	d0
	lsr.w	d0			;5 fois
	lsr.w	d0
	lsr.w	d0	; d0>>5
	and.w	#$3f,d0	;et le & 0x003F
.bcl	
; prend le numéro de menu MENUNUM(n)=(n& 0x001F)
	and.w	#$1f,d1			;trouve si menu 0 ou 1
	bne	.menu2	
	tst.w	d0
	beq	HostScreen	;branche sur host screen
	cmp.w	#1,d0		:=1 ? (About...)
	bne	.notabout
	bsr	About
	bra	.end
.notabout
	cmp.w	#3,d0		;=3 ? (Quit...)	(3 car BARLABEL=2)
	beq	Quit		;bye bye
.menu2
	tst.w	d0
	beq	AddAl
	bne	SubAl
.end		;fin		
NotMenu
NotMessageKnown
	bra	ProcessMessages		;inconnu au bataillon

Save					;Ramène toutes les alarmes sauvegardée auparavent (au SetUp)
	bsr	CopyBuffer2Structure	;recopie les structures alarmes
					;après les modifs faites
	bsr	Closeitall		;on ferme tout
	bsr	TimeDateInit		;réaffiche heure pour éviter plantage
	bsr	SaveAls			;Save alarms.
	bra	Loopeur
	
Cancel:					;Ramène toutes les alarmes sauvegardée auparavent (au SetUp)
;	Il suffit d'inverser Mem et ActualBuffer pour tout ramener.
	move.l	Mem,a0
	move.l	ActualBuffer,Mem
	move.l	a0,ActualBuffer
	bsr	Closeitall
	bsr	TimeDateInit		;réaffiche heure
	bra	Loopeur			;branche sur petite fenêtre

Quit:
	bsr	Closeitall		;on ferme tout
	FREEMEM	ActualBuffer,MemSize
	move.l	ChoosedScreen,a1	;on unlock le screen maintenant
	move.l	#NULL,a0
	CALLINT	UnlockPubScreen
	bsr	Abort			;on abort le IO pour que le device n'envoit pas de message au port effacé
	bra	Exit8			;ferme tout le reste
	rts				;RTS vers Startup
Closeitall
	FREEMEM	Mem,MemSize
	move.l	SUWindHd,a0
	CALLINT	ClearMenuStrip
	move.l	MenuAdd,d0
	beq	.after			;si NULL rien du tout
	move.l	d0,a0
	CALLGDT	FreeMenus		;on rend le menu
.after	
	move.l	SUWindHd,a0		;ferme la fenetre
	CALLINT	CloseWindow
	move.l	BaseGad,a0		;rend les gadgets
	CALLGDT	FreeGadgets
	move.l	vi,a0			;désalloue le visual info
	CALLGDT	FreeVisualInfo
		rts
******************************
* Chargement des préférences *
******************************
***********************
* Inits Date et heure * Ouvre fenetre minuscule
***********************

TimeDateInit:
	move.l	ChoosedScreen,PubScreen
; on réeffectue cette routine à chaque fois en cas de chgment de font
; en cours d'utilisation !! (Si l'écran a été ouvert puis fermé en
; quelques dixièmes de secondes, on sait jamais car c'est interdit de
; changer la font d'un écran sans le fermer pouis le rouvrir ou si l'écran
; default a été changé).

					;HAUTEUR DE LA FONT POUR
					;DONNER LES TAILLES A LA
; alloue mémoire pour TextExtent	 FENETRE (LARGEUR ET HAUTEUR)
;
	ALLOCMEM	#te_SIZEOF,#MEMF_ANY!MEMF_PUBLIC
	tst.l	d0
	bne	.ok2
	bsr	ErrorTextExtent		;erreur ? Si oui, branche
	bra	JDI
.ok2	move.l	d0,TextExt		;sinon sauve l'addresse
	
; effectue l'opération
	move.l	PubScreen,a0		;addresse écran
	lea	84(a0),a1		;le RastPort
	lea	Longuest,a0		;chaine long= mais taille prop >
	move.w	#TD_Length,d0		;longueur du texte
	move.l	TextExt,a2		;addresse du buffer de TextExtent Str
	CALLGFX	TextExtent		;le fait

; met à jour la valeur des Tags
	move.l	TextExt,a0		;adresse du TextExtent structure
	move.w	te_Height(a0),d0	;hauteur fonte
	addq.w	#3,d0			;ajoute 3 pour avoir de la marge
	ext.l	d0			:il faut un mot long
	move.l	d0,TD_Height		;ca y est on a la hauteur
	move.w	te_Extent+4(a0),d0	;Maximum en largeur (box de dessin)
	add.w	#24,d0			;+24 pour gadget de profondeur
	ext.l	d0			;mot long et sauve
	move.l	d0,TD_Width		;ET LARGEUR
	move.w	d0,d5			;le sauve pour soustraction plus loin
	FREEMEM	TextExt,#te_SIZEOF
; On va maintenant placer la fenêtre à l'extrème droite de l'écran
JDI	move.l	PubScreen,a0	;adresse structure écran
	move.w	sc_Width(a0),d0		;largeur écran
	sub.w	d5,d0			;soustrais pour trouver X de départ
	sub.w	#23,d0			;(pour gadget profondeur)
	ext.l	d0			;de la fenêtre
	move.l	d0,TD_XStart	;et voilà
	movea.l	#00,a0		;"NewWindow" est optionel, on va faire par Tags
	lea	TWTags,a1	;les voilà, justement
	CALLINT	OpenWindowTagList	;que fait cette routine ?
	tst.l	d0			;Ouverture de la fenêtre
	beq	ManageError
	move.l	d0,TimeWindHd
; créé le Mask du signal de la MsgPort de la fenêtre.	
	move.l	TimeWindHd,a4		;addresse MsgPort de la fenêtre
	move.l	wd_UserPort(a4),a4
	move.b	MP_SIGBIT(a4),d0	;le n° de signal pour créer le mask
	moveq.l	#0,d1
	bset.l	d0,d1			;d1=1<<mp_SigBit pour Mask dans d1
	move.l	d1,WindSign		;le sauve...
	move.b	#-1,d0		;pas d'erreur
	rts
ManageError
	bsr	GereTDError
	bra	TimeDateInit         
ResetLastDisp
	move.w	AlNbr,d0
	bsr	GetAlAdd
	lea	Al_LastDispDate(a0),a0
	move.l	#0,(a0)
	move.l	#0,4(a0)
	move.l	#0,8(a0)
	rts
	
******************************************************       
* Copie modifs ds Buffer de la structure de l'alarme *
******************************************************
CopyBuffer2Structure
.strings
	move.w	AlNbr,d0
	bsr	GetAlAdd		;adresse structure
	move.l	a0,-(sp)		;sauve sur pile
	lea	Text1(a0),a1		;adresse ligne 1 texte ds structure
	move.l	Line1Gad,a0		;adresse String 1
	move.l	gg_SpecialInfo(a0),a0	;adresse spécial info
	move.l	si_Buffer(a0),a0	;adresse du Buffer du gadget
	move.l	#AlText_SIZE,d0		;taille
	CALLEXEC	CopyMem		;copie Nelle ligne1->StructAl
	move.l	(sp),a0			;récupère adresse structure alarme	
	lea	Text2(a0),a1		;sans décaler pile
	move.l	Line2Gad,a0		;adresse String 1
	move.l	gg_SpecialInfo(a0),a0	;adresse spécial info
	move.l	si_Buffer(a0),a0	;adresse du Buffer du gadget
	move.l	#AlText_SIZE,d0		;taille
	CALLEXEC	CopyMem		;copie
	move.l	(sp),a0			;récupère adresse structure alarme	
	lea	Text3(a0),a1
	move.l	Line3Gad,a0		;adresse String 1
	move.l	gg_SpecialInfo(a0),a0	;adresse spécial info
	move.l	si_Buffer(a0),a0	;adresse du Buffer du gadget
	move.l	#AlText_SIZE,d0		;taille
	CALLEXEC	CopyMem		;copie
	move.l	(sp),a0			;récupère adresse structure alarme	
	lea	Text4(a0),a1
	move.l	Line4Gad,a0		;adresse String 1
	move.l	gg_SpecialInfo(a0),a0	;adresse spécial info
	move.l	si_Buffer(a0),a0	;adresse du Buffer du gadget
	move.l	#AlText_SIZE,d0		;taille
	CALLEXEC	CopyMem		;copie
	move.l	(sp),a0			;récupère adresse structure alarme	
	lea	Text5(a0),a1		;
	move.l	Line5Gad,a0		;adresse String 1
	move.l	gg_SpecialInfo(a0),a0	;adresse spécial info
	move.l	si_Buffer(a0),a0	;adresse du Buffer du gadget
	move.l	#AlText_SIZE,d0		;taille
	CALLEXEC	CopyMem		;copie
.integer
	move.l	(sp)+,a0		;récupère addresse en dépilant
	lea	Al_Date+year(a0),a1	;année qu'on choisie
	move.l	Integer1,a0		;adresse gadget Année
	move.l	gg_SpecialInfo(a0),a0	;adresse special info
	move.l	si_LongInt(a0),d0	;valeur du gadget
	move.w	d0,(a1)			;le met dans la structure WORD
	
; TOUT LES AUTRES PARAMETRE SONT REMIS A JOUR DANS LA BOUCLE
;  PROCESS MESSAGES AU DEBUT DU CODE
	rts
	
*****************************************
* Mise à jour des gadgets de la fenêtre * (Set Up) entré n° choisie ds d0:16
***************************************** 
UpdateDisplay
	move.w	d0,AlNbr	;sauve le n° d'alarme sur lequel nous travaillons
	bsr	UpdateMessageStr	;met à jour les chaînes de caractère
	bsr	UpdateMessageGad	;met à jour Mess Gad a0=Add Gadget
	bsr	UpdateFlashGad		;on fait "Clignotement"
; Son a été supprimé à la version 0.92
;	bsr	UpdateSoundGad		;on fait "Son"
;
	bsr	UpdateType		;met à jour type d'alarme
	bsr	UpdateYear		;met à jour année
	bsr	UpdateMonth		;met à jour mois
	bsr	UpdateWeek		;met à jour, le jour de la semaine.
	bsr	UpdateHeure		;met à jour heure
	bsr	UpdateDay		;met à jour jour
	bsr	UpdateMinutes		;met à jour minutes
	bsr	UpdateAble		;met à jour autorisations de modifs
	rts
	
GetAlAdd		;Trouve adresse structure (d0:16 n° d'alarme)
	move.l	ActualBuffer,a0	;Adresse de la 1ère Alarme
	move.w	AlarmeSize,d1	;Taille d'une alarme
	mulu	d0,d1		;multiplie choix fois Taille alarme
	add.l	d1,a0		;on a maintenant l'adresse de la structue Al
	rts
UpdateSoundGad			;met à jour le gadget "Son"
	move.w	AlNbr,d0
	bsr	GetAlAdd
	move.w	Al_Flags(a0),d0		;Son ou pas ?
	and.w	#AFLG_Son,d0
	beq	.nomess			;si branche alors pas son
	bsr	Toggled			;met les tags Toggledé
	bra	.continue
.nomess	bsr	UnToggled	
.continue
	move.l	CheckBox2,a0		;Adresse du Gadget Son
	move.l	SUWindHd,a1		;Handle de la fenêtre
	move.l	#NULL,a2		;pas dans requester
	CALLGDT	GT_SetGadgetAttrsA	;met à jour
	rts
UpdateFlashGad			;met à jour le gadget "Clignotement"
	move.w	AlNbr,d0
	bsr	GetAlAdd
	move.w	Al_Flags(a0),d0		;Clignotement ou pas ?
	and.w	#AFLG_Flash,d0
	beq	.nomess			;si branche alors pas messages
	bsr	Toggled			;met les tags Toggledé
	bra	.continue
.nomess	bsr	UnToggled	
.continue
	move.l	CheckBox3,a0		;Adresse du Gadget Clignotement
	move.l	SUWindHd,a1		;Handle de la fenêtre
	move.l	#NULL,a2		;pas dans requester
	CALLGDT	GT_SetGadgetAttrsA	;met à jour
	rts
UpdateAble
	move.w	AlNbr,d0
	bsr	GetAlAdd	;adresse structure
	move.w	Al_Type(a0),d6
	bsr	UpdateAbles
	rts
UpdateType
	move.w	AlNbr,d0
	bsr	GetAlAdd		;adresse
	lea	SetCycleTags,a3
	moveq.l	#0,d0			;met d0 à zéro
	move.w	Al_Type(a0),d0		;le met dans les Tags
	move.l	d0,4(a3)		;sauve en long, 2 octets du haut à 0
	move.l	SUWindHd,a1
	move.l	Cycle2,a0		;gadget Type
	move.l	#NULL,a2		;pas dans requester
	CALLGDT	GT_SetGadgetAttrsA
	rts				;çà y est
UpdateYear
	move.w	AlNbr,d0
	bsr	GetAlAdd		;adresse
	lea	SetIntegerTags,a3
	moveq.l	#0,d0			;on met à zéro
	move.w	Al_Date+year(a0),d0	;met l'année dans les Tags
	move.l	d0,4(a3)		;pour avoir les 2 octets du haut à 0
	move.l	SUWindHd,a1
	move.l	Integer1,a0		;gadget Type
	move.l	#NULL,a2		;pas dans requester
	CALLGDT	GT_SetGadgetAttrsA
	rts				;çà y est
UpdateMonth
	move.w	AlNbr,d0
	bsr	GetAlAdd		;adresse
	lea	SetCycleTags,a3
	move.w	Al_Date+month(a0),d0	;met l'année dans les Tags
	sub.w	#1,d0			;car utility revoit [1-12]
	ext.l	d0
	move.l	d0,4(a3)
	move.l	SUWindHd,a1
	move.l	Cycle1,a0		;gadget Type
	move.l	#NULL,a2		;pas dans requester
	CALLGDT	GT_SetGadgetAttrsA
	rts				;çà y est
UpdateWeek
	move.w	AlNbr,d0
	bsr	GetAlAdd		;adresse
	lea	SetCycleTags,a3
	move.w	Al_Date+wday(a0),d0	;met l'année dans les Tags
	ext.l	d0
	move.l	d0,4(a3)
	move.l	SUWindHd,a1
	move.l	Cycle4,a0		;gadget Type
	move.l	#NULL,a2		;pas dans requester
	CALLGDT	GT_SetGadgetAttrsA
	rts				;çà y est

UpdateHeure
	move.w	AlNbr,d0
	bsr	GetAlAdd		;adresse strcuture al -> a0
	lea	SetSliderTags,a3
	move.w	Al_Date+hour(a0),d0	;met l'année dans les Tags
	ext.l	d0
	move.l	d0,4(a3)
	move.l	SUWindHd,a1
	move.l	Slider1,a0		;gadget Type
	move.l	#NULL,a2		;pas dans requester
	CALLGDT	GT_SetGadgetAttrsA
	rts				;çà y est
UpdateMinutes
	move.w	AlNbr,d0
	bsr	GetAlAdd		;adresse
	lea	SetSliderTags,a3
	move.w	Al_Date+min(a0),d0	;met l'année dans les Tags
	ext.l	d0
	move.l	d0,4(a3)
	move.l	SUWindHd,a1
	move.l	Slider2,a0		;gadget Type
	move.l	#NULL,a2		;pas dans requester
	CALLGDT	GT_SetGadgetAttrsA
	rts				;çà y est
UpdateDay
	move.w	AlNbr,d0
	bsr	GetAlAdd		;adresse
	lea	SetSliderTags,a3
	move.w	Al_Date+mday(a0),d0	;met l'année dans les Tags
	ext.l	d0
	move.l	d0,4(a3)
	move.l	SUWindHd,a1
	move.l	Slider3,a0		;gadget Type
	move.l	#NULL,a2		;pas dans requester
	CALLGDT	GT_SetGadgetAttrsA
	rts				;çà y est

UpdateMessageGad			;met à jour gadget si texte
	move.w	AlNbr,d0
	bsr	GetAlAdd		;Trouve addresse structure de cette alarme
	move.w	Al_Flags(a0),d0		;Message ou pas ?
	and.w	#AFLG_Mess,d0
	beq	.nomess			;si branche alors pas messages
	bsr	Toggled			;met les tags Toggledé
	bra	.continue
.nomess	bsr	UnToggled	
.continue
	move.l	CheckBox1,a0		;Adresse du Gadget Mess
	move.l	SUWindHd,a1		;Handle de la fenêtre
	move.l	#NULL,a2		;pas dans requester
	CALLGDT	GT_SetGadgetAttrsA	;met à jour
	move.l	CheckBox1,a0		;adresse du CheckBox1=Message?	
	bsr	InitUpdateMess		;initialisations
	bsr	UpdateMess		;met à jour l'état des gadgets STRING
	rts
UpdateMessageStr	;Met à jour CHAINES des lignes de message
	move.w	AlNbr,d0		;On cherche l'adresse de la structure
	bsr	GetAlAdd		;prend l'adresse
	lea	Text1(a0),a1		;adresse ligne1
	lea	Text2(a0),a2
	lea	Text3(a0),a3
	lea	Text4(a0),a4
	lea	Text5(a0),a5
	movem.l	a1-a5,-(sp)		;tout sur pile
	move.l	(sp)+,SetStringTags+4	;met l'adresse dans le Tag
	move.l	Line1Gad,a0		;adresse du gadget
	bsr	DefaultSInit		;initialisations communes
	CALLGDT	GT_SetGadgetAttrsA
	move.l	(sp)+,SetStringTags+4	;met l'adresse dans le Tag
	move.l	Line2Gad,a0
	bsr	DefaultSInit
	CALLGDT	GT_SetGadgetAttrsA	;mise à jour
	move.l	(sp)+,SetStringTags+4	;met l'adresse dans le Tag
	move.l	Line3Gad,a0
	bsr	DefaultSInit
	CALLGDT	GT_SetGadgetAttrsA	;mise à jour
	move.l	(sp)+,SetStringTags+4	;met l'adresse dans le Tag
	move.l	Line4Gad,a0
	bsr	DefaultSInit
	CALLGDT	GT_SetGadgetAttrsA	;mise à jour
	move.l	(sp)+,SetStringTags+4	;met l'adresse dans le Tag
	move.l	Line5Gad,a0
	bsr	DefaultSInit
	CALLGDT	GT_SetGadgetAttrsA	;mise à jour
; fini
	rts
DefaultSInit
	move.l	#NULL,a2		;null pour requester
	move.l	SUWindHd,a1		;fenêtre de set-up
	lea	SetStringTags,a3	;nouveau pointeur
	rts
InitUpdateMess		;Inits pour routine suivante
	move.w	12(a0),d0		;Flags du GADGET
	andi.w	#GFLG_SELECTED,d0	;gadget sélectionné ?
	beq	.notext			;branche si pas sélectionné
	move.w	#TRUE,AutoriseMess	;sinon autorise message
	bra	.text
.notext					;sinon pas de texte
	move.w	#FALSE,AutoriseMess	;non autorisé
.text	rts				;fin
UpdateMess			;Update messages (si modifiable ou pas)
	move.l	Line1Gad,a0		;on autorise un message
	bsr	DefaultArgs		;5 * alors on s'emmerde pas
	CALLGDT	GT_SetGadgetAttrsA
	move.l	Line2Gad,a0		;pointeur gadget ligne 2
	bsr	DefaultArgs
	CALLGDT	GT_SetGadgetAttrsA
	move.l	Line3Gad,a0
	bsr	DefaultArgs
	CALLGDT	GT_SetGadgetAttrsA
	move.l	Line4Gad,a0
	bsr	DefaultArgs
	CALLGDT	GT_SetGadgetAttrsA
	move.l	Line5Gad,a0
	bsr	DefaultArgs
	CALLGDT	GT_SetGadgetAttrsA
	rts
DefaultArgs
	move.l	SUWindHd,a1		;pointeur sur fenêtre
	move.l	#NULL,a2		;pas de req
	move.w	AutoriseMess,d6		;Scratch register ici (plutôt TEMP)
	cmp.w	#TRUE,d6		;enable or disable?
	bne.s	Disable			;disable here
	
Able	lea	EnableTags,a3	;TagList
	rts				;fini
Disable	lea	DisableTags,a3
	rts
Toggled	lea	ToggledTags,a3
	rts				;met les message autorisé ou pas
UnToggled	lea	UnToggledTags,a3
	rts
*****************
* Set Up window *
*****************
SetUpRender:
; Réserve de la mémoire pour les structure Alarme il en faut
	ALLOCMEM	MemSize,#MEMF_ANY!MEMF_PUBLIC
	tst.l	d0
	bne	.ok3		;si <> 0 alors on a une adresse...
	bsr	ErrorNoMemory	;sinon affiche message d'erreur
	move.b	#2,d0		;et quitte avec flag d'erreur
	rts
.ok3	move.l	d0,Mem		;Sauve le Handle
; On copie notre buffer actuel d'alarme dedans pour pouvoir canceler.
	move.l	ActualBuffer,a0	;départ
	move.l	Mem,a1		;Destination
	move.l	MemSize,d0	;Taille
	CALLEXEC	CopyMem	;Copie
	
; Affichage fenêtre
	move.l	ChoosedScreen,scr		;on a maintenant l'écran standard
	move.l	scr,a0			;écran ou l'on s'affiche
	move.l	sc_Font(a0),a0		;structure Font de l'écran
	move.w	4(a0),d0		;TA_YSize (Hauteur font écran)
	sub.w	#8,d0			;soustrait 8 (cad font topaz 8)
	move.w	d0,AddedHeight		;Taille en plus par / à T8
	add.w	#SUHeight,d0		;Taille normale (220) fenêtre
	ext.l	d0			;en mot long
	move.l	d0,AlTextWHeight	;ca y est on a la hauteur

; On s'oocupe de la position verticale des textes
	move.w	AddedHeight,d1
	move.w	#Option_Hite,Option_Height	;ramène valeur normale
	add.w	d1,Option_Height		;a chaque fois car sinon
	move.w	#Text_Hite,Text_Height		;elle s'ajoutent à
	add.w	d1,Text_Height			;chaque ouverture de fenêtre.
	move.w	#SU_Hite,SU_Height
	add.w	d1,SU_Height	;compensation hauteur fenêtre.
	
; cherche visual info
CACA
	move.l	scr,a0		;pointeur sur écran "default"
	lea	TagEnd,a1	;TagList
	CALLGDT	GetVisualInfoA	;fonction...
	move.l	d0,vi		;visualinfo
; on créé le premier gadget invisible
        lea	ContextGad,a0	;Contexte gadget structure		
	CALLGDT	CreateContext	;On se crée le premier gadget invisible
	tst.l	d0
	bne	.ok
	bsr	ErrorCreateGads	;affiche erreur
	move.b	#4,d0		;code d'erreur (aucun gadget créé)
	rts
.ok	move.l	d0,BaseGad	;Gadget de départ
	


; ici on met à jour les positions des gadgets à cause des hauteurs de font
; multiples:
; et on met à jour la structure commune à tous les gadgets
	lea	GadStruct,a5	;adresse de la structure
Gad1
	move.w	#Gad1Height,d1	;Hauteur en Topaz-8
	move.w	AddedHeight,d7
	add.w	d7,d1		;Ajoute hauteur en plus à cause font
	move.w	d1,gng_TopEdge(a5);le met dans la structure
	move.w	#Gad1Left,gng_LeftEdge(a5)	;position gauche
	move.w	#Gad1Width,gng_Width(a5)	;largeur
	move.w	#Gad1Haut,gng_Height(a5)
	move.l	#PLACETEXT_LEFT,gng_Flags(a5)
	move.w	#1,gng_GadgetID(a5)	;le n° d'identité
	lea	TAttG1,a0
	move.l	a0,gng_TextAttr(a5)	;le text attribut
	lea	L1Text,a0		;adresse du texte
	move.l	a0,gng_GadgetText(a5)	;dans la structure.
	move.l	BaseGad,a0		;"previous gadget"
	move.l	#STRING_KIND,d0	;"kind"	
	lea	GadStruct,a1	;"NewGad" structure
	lea	Gad1Tags,a2	;TagList
	CALLGDT	CreateGadgetA	;Appel de la fonction...
	move.l	d0,Line1Gad
; ON NE TEST PAD ERREUR CAR SI D0=0 ICI ALORS APRES AUSSI DONC IL SUFFIT
;  DE TOUT VERIFIER A LA FIN ET D'EFFACER SI BESOIN EST.

Gad2	
	move.w	#Gad2Height,d1
	add.w	d7,d1		;ajoute différence par rapport à Topaz-8
	move.w	d1,gng_TopEdge(a5)	;position verticale du gadget.
	lea	L2Text,a0
	move.l	a0,gng_GadgetText(a5)	;le texte
	add.w	#1,gng_GadgetID(a5)	;+1 pour le ID
;   Tout le reste étant le même on ne change pas la structure
	move.l	d0,a0		;pointeur du dernier gadget créé (toujours)
	move.l	#STRING_KIND,d0	;on s'en fait un autre
	lea	GadStruct,a1
	lea	Gad2Tags,a2	;en fait il pointe sur Gad1Tags...
	CALLGDT	CreateGadgetA	;on le créé
	move.l	d0,Line2Gad

Gad3	
	move.w	#Gad3Height,d1
	add.w	d7,d1		;ajoute différence par rapport à Topaz-8
	move.w	d1,gng_TopEdge(a5)	;position verticale du gadget.
	lea	L3Text,a0
	move.l	a0,gng_GadgetText(a5)	;le texte
	add.w	#1,gng_GadgetID(a5)	;+1 pour le ID
	move.l	d0,a0			;gadget suivant...
	move.l	#STRING_KIND,d0
	lea	GadStruct,a1
	lea	Gad3Tags,a2
	CALLGDT	CreateGadgetA
	move.l	d0,Line3Gad

Gad4	
	move.w	#Gad4Height,d1
	add.w	d7,d1		;ajoute différence par rapport à Topaz-8
	move.w	d1,gng_TopEdge(a5)	;position verticale du gadget.
	lea	L4Text,a0
	move.l	a0,gng_GadgetText(a5)	;le texte
	add.w	#1,gng_GadgetID(a5)	;+1 pour le ID
	move.l	d0,a0			;gadget suivant...
	move.l	#STRING_KIND,d0
	lea	GadStruct,a1
	lea	Gad4Tags,a2
	CALLGDT	CreateGadgetA
	move.l	d0,Line4Gad
	
Gad5	
	move.w	#Gad5Height,d1
	add.w	d7,d1		;ajoute différence par rapport à Topaz-8
	move.w	d1,gng_TopEdge(a5)	;position verticale du gadget.
	lea	L5Text,a0
	move.l	a0,gng_GadgetText(a5)	;le texte
	add.w	#1,gng_GadgetID(a5)	;+1 pour le ID
	move.l	d0,a0			;gadget suivant...
	move.l	#STRING_KIND,d0
	lea	GadStruct,a1
	lea	Gad5Tags,a2
	CALLGDT	CreateGadgetA
	move.l	d0,Line5Gad

Gad6
	move.w	#Gad6Height,d1	;Hauteur en Topaz-8
	add.w	d7,d1		;Ajoute hauteur en plus à cause font
	move.w	d1,gng_TopEdge(a5);le met dans la structure
	move.w	#Gad6Left,gng_LeftEdge(a5)	;position gauche
	move.w	#Gad6Width,gng_Width(a5)	;largeur
	move.w	#Gad6Haut,gng_Height(a5)
	move.l	#PLACETEXT_RIGHT,gng_Flags(a5)
	move.w	#6,gng_GadgetID(a5)	;le n° d'identité
	lea	L6Text,a0		;adresse du texte
	move.l	a0,gng_GadgetText(a5)	;dans la structure.
	move.l	d0,a0		;"previous gadget"
	move.l	#CHECKBOX_KIND,d0	;"kind"	
	lea	GadStruct,a1	;"NewGad" structure
	lea	Gad6Tags,a2	;TagList
	CALLGDT	CreateGadgetA	;Appel de la fonction...
	move.l	d0,CheckBox1
	
Gad8	
	move.w	#Gad8Height,d1
	add.w	d7,d1		;ajoute différence par rapport à Topaz-8
	move.w	d1,gng_TopEdge(a5)	;position verticale du gadget.
	lea	L8Text,a0
	move.l	a0,gng_GadgetText(a5)	;le texte
	move.w	#8,gng_GadgetID(a5)	;+1 pour le ID
	move.l	d0,a0			;gadget suivant...
	move.l	#CHECKBOX_KIND,d0
	lea	GadStruct,a1
	lea	Gad8Tags,a2
	CALLGDT	CreateGadgetA
	move.l	d0,CheckBox3

Gad9	
	move.w	#Gad9Height,d1	;Hauteur en Topaz-8
	add.w	d7,d1		;Ajoute hauteur en plus à cause font
	move.w	d1,gng_TopEdge(a5);le met dans la structure
	move.w	#Gad9Left,gng_LeftEdge(a5)	;position gauche
	move.w	#Gad9Width,gng_Width(a5)	;largeur
	move.w	#Gad9Haut,gng_Height(a5)
	move.l	#PLACETEXT_LEFT!NG_HIGHLABEL,gng_Flags(a5)
	move.w	#9,gng_GadgetID(a5)	;le n° d'identité
	lea	L9Text,a0		;adresse du texte
	move.l	a0,gng_GadgetText(a5)	;dans la structure.
	move.l	d0,a0		;"previous gadget"
	move.l	#SLIDER_KIND,d0	;"kind"	
	lea	GadStruct,a1	;"NewGad" structure
	lea	Gad9Tags,a2	;TagList
	CALLGDT	CreateGadgetA	;Appel de la fonction...
	move.l	d0,Slider1
	
Gad10	
	move.w	#Gad10Left,gng_LeftEdge(a5);position verticale du gadget.
	move.l	#PLACETEXT_LEFT,gng_Flags(a5)
	lea	L10Text,a0
	move.l	a0,gng_GadgetText(a5)	;le texte
	move.w	#10,gng_GadgetID(a5)	;+1 pour le ID
	move.l	d0,a0			;gadget suivant...
	move.l	#SLIDER_KIND,d0
	lea	GadStruct,a1
	lea	Gad10Tags,a2
	CALLGDT	CreateGadgetA
	move.l	d0,Slider2

Gad11	
	move.w	#Gad11Left,gng_LeftEdge(a5)	;position Hz du gadget.
	move.w	#Gad11Height,d1		;verticale
	add.w	d7,d1		;Ajoute hauteur en plus à cause font
	move.w	d1,gng_TopEdge(a5)
	move.w	#Gad11Width,gng_Width(a5)
	lea	L11Text,a0
	move.l	a0,gng_GadgetText(a5)	;le texte
	move.w	#11,gng_GadgetID(a5)	;+1 pour le ID
	move.l	#PLACETEXT_LEFT!NG_HIGHLABEL,gng_Flags(a5)
	move.l	d0,a0			;gadget suivant...
	move.l	#SLIDER_KIND,d0
	lea	GadStruct,a1
	lea	Gad11Tags,a2
	CALLGDT	CreateGadgetA
	move.l	d0,Slider3
	
Gad12	
	move.w	#Gad12Left,gng_LeftEdge(a5)	;position Hz du gadget.
	move.w	#Gad12Width,gng_Width(a5)	;largeur
	move.w	#Gad12Haut,gng_Height(a5)
	move.l	#PLACETEXT_BELOW,gng_Flags(a5)
	lea	L12Text,a0
	move.l	a0,gng_GadgetText(a5)	;le texte
	move.w	#12,gng_GadgetID(a5)	;+1 pour le ID
	move.l	d0,a0			;gadget suivant...
	move.l	#CYCLE_KIND,d0
	lea	GadStruct,a1
	lea	Gad12Tags,a2
	CALLGDT	CreateGadgetA
	move.l	d0,Cycle1
	
	
Gad13
	move.w	#Gad13Left,gng_LeftEdge(a5)	;position Hz du gadget.
	move.w	#Gad13Width,gng_Width(a5)	;largeur
	move.w	#Gad13Haut,gng_Height(a5)
	move.l	#PLACETEXT_BELOW,gng_Flags(a5)
	lea	L13Text,a0
	move.l	a0,gng_GadgetText(a5)	;le texte
	move.w	#13,gng_GadgetID(a5)	;+1 pour le ID
	move.l	d0,a0			;gadget suivant...
	move.l	#INTEGER_KIND,d0
	lea	GadStruct,a1
	lea	Gad13Tags,a2
	CALLGDT	CreateGadgetA
	move.l	d0,Integer1
	
Gad14	
	move.w	#Gad14Height,d1	;Hauteur en Topaz-8
	add.w	d7,d1		;Ajoute hauteur en plus à cause font
	move.w	d1,gng_TopEdge(a5);le met dans la structure
	move.w	#Gad14Left,gng_LeftEdge(a5)	;position gauche
	move.w	#Gad14Width,gng_Width(a5)	;largeur
	move.w	#Gad14Haut,gng_Height(a5)
	move.l	#PLACETEXT_LEFT!NG_HIGHLABEL,gng_Flags(a5)
	move.w	#14,gng_GadgetID(a5)	;le n° d'identité
	lea	L14Text,a0		;adresse du texte
	move.l	a0,gng_GadgetText(a5)	;dans la structure.
	move.l	d0,a0		;"previous gadget"
	move.l	#CYCLE_KIND,d0	;"kind"	
	lea	GadStruct,a1	;"NewGad" structure
	lea	Gad14Tags,a2	;TagList
	CALLGDT	CreateGadgetA	;Appel de la fonction...
	move.l	d0,Cycle2

Gad15	
	move.w	#Gad15Left,gng_LeftEdge(a5)	;position Hz du gadget.
	move.w	#Gad15Width,gng_Width(a5)	;largeur
	move.l	#PLACETEXT_LEFT!NG_HIGHLABEL,gng_Flags(a5)
	lea	L15Text,a0
	move.l	a0,gng_GadgetText(a5)	;le texte
	move.w	#15,gng_GadgetID(a5)	;ID
	move.l	d0,a0			;gadget suivant...
	move.l	#CYCLE_KIND,d0
	lea	GadStruct,a1
	lea	Gad15Tags,a2
	CALLGDT	CreateGadgetA
	move.l	d0,Cycle3

Gad16	
	move.w	#Gad16Height,d1	;position Vert du gadget.
	add.w	d7,d1		;Ajoute hauteur en plus à cause font
	move.w	d1,gng_TopEdge(a5)
	move.w	#Gad16Width,gng_Width(a5)	;largeur
	move.w	#Gad16Left,gng_LeftEdge(a5)
	move.l	#0,gng_Flags(a5)
	lea	L16Text,a0
	move.l	a0,gng_GadgetText(a5)	;le texte
	move.w	#16,gng_GadgetID(a5)	;+1 pour le ID
	move.l	d0,a0
	move.l	#BUTTON_KIND,d0		;Boutton Save
	lea	GadStruct,a1
	lea	Gad16Tags,a2
	CALLGDT	CreateGadgetA
	
Gad17	
	move.w	#Gad17Left,gng_LeftEdge(a5)
	lea	L17Text,a0
	move.l	a0,gng_GadgetText(a5)	;le texte
	move.w	#17,gng_GadgetID(a5)	;+1 pour le ID
	move.l	d0,a0
	move.l	#BUTTON_KIND,d0		;boutton "Cancel"
	lea	GadStruct,a1
	lea	Gad17Tags,a2
	CALLGDT	CreateGadgetA
	
Gad18	
	move.w	#Gad18Height,d1	;position vert du gadget.
	add.w	d7,d1		;Ajoute hauteur en plus à cause font
	move.w	d1,gng_TopEdge(a5)
	move.w	#Gad18Width,gng_Width(a5)	;largeur
	move.w	#Gad18Left,gng_LeftEdge(a5)
	move.w	#Gad18Haut,gng_Height(a5)
	move.l	#0,gng_Flags(a5)
	lea	L18Text,a0
	move.l	a0,gng_GadgetText(a5)	;le texte
	move.w	#18,gng_GadgetID(a5)	;+1 pour le ID
	move.l	d0,a0
	move.l	#CYCLE_KIND,d0		;Boutton Save
	lea	GadStruct,a1
	lea	Gad18Tags,a2
	CALLGDT	CreateGadgetA
	move.l	d0,Cycle4	;sauve le pointeur pour ables	
	move.l	d0,gad		;sauve le pointeur pour tester si erreur.
	bne	.ok
	bsr	ErrorContextGad	;affiche l'erreur
	move.b	#5,d0		;erreur code gadget
	rts			;retourne pour tout rendre

; Il faut patcher les slider gadgets en Look V36
.ok	move.l	Slider1,a0
	move.l	gg_SpecialInfo(a0),a0	;adresse du special info
	or.w	#PROPNEWLOOK,pi_Flags(a0)	;met le PROPNEWLOOK à 1
	move.l	Slider2,a0
	move.l	gg_SpecialInfo(a0),a0	;adresse du special info
	or.w	#PROPNEWLOOK,pi_Flags(a0)	;met le PROPNEWLOOK à 1
	move.l	Slider3,a0
	move.l	gg_SpecialInfo(a0),a0	;adresse du special info
	or.w	#PROPNEWLOOK,pi_Flags(a0)	;met le PROPNEWLOOK à 1

;on tente d'ouvrir la fenêtre

	move.l	#0,a0
	lea	SetUpWindowTags,a1
        CALLINT OpenWindowTagList	;avec les Tags, môsieur....
	move.l	d0,SUWindHd
        tst.l   d0
	bne	.continue		;si <> 0 alors pas erreur
        bsr     ErrorOpenSUWind		;si Handle=0 alors erreur.
	moveq.b	#1,d0			;signale erreur (flag "1")
	move.l	#0,MenuAdd		;pour ne pas désaouller structure
        rts				;et quitte


; on layout le menu...
.continue
	lea	NewMenu1,a0
	lea	TagEnd,a1	;pas de Tags
	CALLGDT	CreateMenusA	;alloue une structure pour menu assez grande.
	tst.l	d0
	bne	.ok4
	move.l	SUWindHd,a0	;ERREUR
	CALLINT	CloseWindow	;ferme la fenêtre
	bsr	ErrorMenu	;affiche que ne peut attacher le menu.
	move.l	#0,MenuAdd	;signal de ne pas rendre structure car pas allouée
	moveq.b	#5,d0			;signale erreur (flag "5") pour désallouer les gadgets
        rts				;et quitte
	
.ok4
	move.l	d0,MenuAdd	;sauve l'adresse
	move.l	d0,a0
	move.l	vi,a1
	lea	TagEnd,a2	;(=TAG_DONE)
	CALLGDT	LayoutMenusA	;effectue la "mise-en-page"
; don't check return 'cos we're not asking for a specefic TextAttr.
; so the return can only be good (TRUE).

	move.l	SUWindHd,a0
	move.l	MenuAdd,a1
	CALLINT	SetMenuStrip		;attache le menu à la fenêtre.
	
; don't need to check, always returns TRUE.
;Refresh pour afficher les gadgets
.after2
	bsr	DrawLines	;affiche les lignes pour mieux délimiter.

	move.l	SUWindHd,a0	;window dans a0
	movea.l	#NULL,a1	;NULL pour req
	CALLGDT	GT_RefreshWindow
	
	
	move.l  SUWindHd,a0
	move.l	#-1,a1		;don't change window name
	lea	ScrTitle,a2	;Nom dans Screen (même que SUWind)
        CALLINT	SetWindowTitles

* Affiche tous les textes en 1 appel par 1 chainage des structures...

        move.l  SUWindHd,a0	;let's get
        move.l  wd_RPort(a0),a0       ;le RastPort de la fenetre
        lea   TitleStruct,a1  ; 1ere structure de texte
        moveq.l  #0,d0          ;X-Pos et Y-Pos = 0; voir structures pour positions
        moveq.l  #0,d1          ;
        CALLINT	PrintIText  	; ET HOP, ON Y VA
	moveq.b	#0,d0		;signal pas erreur
        rts 

DrawLines
	move.l	vi,Boxvi	;le visualinfo
	move.w	AddedHeight,d7	;a cause font de tailles différentes.
; Rectangle 1
	move.l	SUWindHd,a0
	move.l	wd_RPort(a0),a0
	move.l	a0,a5		;sauve
	move.l	#Box1Left,d0
	move.l	#Box1Width,d2
	move.l	#Box1Height,d3
	move.w	#Box1Top,d1
	add.w	d7,d1		;ajoute hauteur différente par rapport à T8
	ext.l	d1
	lea	BoxTags,a1
	CALLGDT	DrawBevelBoxA
;rectangle2
	move.l	a5,a0
	move.l	#Box2Left,d0
	move.l	#Box2Width,d2
	move.l	#Box2Height,d3
	move.w	#Box2Top,d1
	add.w	d7,d1		;ajoute hauteur différente par rapport à T8
	ext.l	d1
	lea	BoxTags,a1
	CALLGDT	DrawBevelBoxA
;rectangle3
	move.l	a5,a0
	move.l	#Box3Left,d0
	move.l	#Box3Width,d2
	move.l	#Box3Height,d3
	move.w	#Box3Top,d1
	add.w	d7,d1		;ajoute hauteur différente par rapport à T8
	ext.l	d1
	lea	BoxTags,a1
	CALLGDT	DrawBevelBoxA
;rectangle4
	move.l	a5,a0
	move.l	#Box4Left,d0
	move.l	#Box4Width,d2
	move.l	#Box4Height,d3
	move.w	#Box4Top,d1
	add.w	d7,d1		;ajoute hauteur différente par rapport à T8
	ext.l	d1
	lea	BoxTags,a1
	CALLGDT	DrawBevelBoxA
;rectangle5
	move.l	a5,a0
	move.l	#Box5Left,d0
	move.l	#Box5Width,d2
	move.l	#Box5Height,d3
	move.w	#Box5Top,d1
	add.w	d7,d1		;ajoute hauteur différente par rapport à T8
	ext.l	d1
	lea	BoxTags,a1
	CALLGDT	DrawBevelBoxA
;rectangle6
	move.l	a5,a0
	move.l	#Box6Left,d0
	move.l	#Box6Width,d2
	move.l	#Box6Height,d3
	move.w	#Box6Top,d1
	add.w	d7,d1		;ajoute hauteur différente par rapport à T8
	ext.l	d1
	lea	BoxTags,a1
	CALLGDT	DrawBevelBoxA
	rts
*********
* About *
*********
About
	move.l	#0,a0
	lea	AboutReqStruct,a1
	lea	ReqIDCMP,a2		;affiche le requester
	move.l	a0,a3
	CALLINT	EasyRequestArgs
	rts

****************
* Add an alarm * On ne peut canceler l'ajout d'une alarme ni le retrait.
****************
AddAl			;ajoute une alarme.
	move.l	MemSize,d7	;sauve dans d7 longueur ancien buffer alarmes
	cmp.w	#19,NumAlarme
	blt	.cava
	bsr	Trop
	bra	.exit
.cava	add.w	#1,NumAlarme	;+1 alarme
	move.w	AlarmeSize,d0
	mulu	NumAlarme,d0	;calcul du nouveau MemSize
	move.l	d0,MemSize
;
	move.l	Mem,a5
	move.l	ActualBuffer,a4
	bsr	CopyAls
	tst.w	d0
	beq	.exit
	bsr	ChangeGadget
.exit	bra	GestionMess		;branché direct
********************* On ne peut canceler ceci
* Subtract an alarm * On va effacer l'alarme actuelement visualisé
*********************SI CONFIRME ET SI INACTIVE
SubAl
; test si alarme inactive.
	move.w	AlNbr,d0	;alarme visible actuel (ON COMPTE SUR LE
		;FAIT QU'IL Y A EU UN UPDATE AVANT AVEC MISE A JOUR DE AlNbr
	move.l	ActualBuffer,a0		;calcul adresse de struct al actuelle
	mulu	AlarmeSize,d0	;Mem=base buffer, d0=d0*longueur alarme.
	add.l	d0,a0		;a0 = base structure alarme actuelle.
	cmp.w	#ATYP_Inactive,Al_Type(a0)	;si pas inactive laisse beton
	beq	.ok
	bsr	NotInactive
	bra	.exit
.ok
	move.l	#0,a0
	lea	DeleteAlStruct,a1
	lea	ReqIDCMP,a2		;affiche le requester
	add.w	#1,AlNbr
	lea	AlNbr,a3		;adresse de alnbr dans a3 car il contient n° alarme
	CALLINT	EasyRequestArgs			;affiche requester
	sub.w	#1,AlNbr		; car al actu=AlNbr+1
	tst.w	d0
	beq	.exit			;si =1 alors =Cancel, quitte
.do_it
	move.l	MemSize,d7	;sauve dans d7 longueur ancien buffer alarmes
	sub.w	#1,NumAlarme	;-1 alarme
	bne	.okag
	bsr	NotEnufAl
	add.w	#1,NumAlarme
	bra	.exit
.okag	move.w	AlarmeSize,d0
	mulu	NumAlarme,d0	;calcul du nouveau MemSize
	move.l	d0,MemSize
;
	move.w	AlNbr,d4	;numéro alarme actu (-1) dans d4
	move.w	d4,d3
	mulu	AlarmeSize,d3	;d3=offset base alarme à effacer (=nbr octets à copier avant arriver à cette structure)
	sub.w	NumAlarme,d4
	neg.w	d4		;d4=NumAlarme-AlNbr
	mulu	AlarmeSize,d4	;d4=nbr octets à copier après alarme à effac.
	bsr	CopyAls2
	tst.b	d0
	beq	.exit
; modify gadget
	bsr	ChangeGadget
.exit	bra	GestionMess
CopyAls
	ALLOCMEM	MemSize,#MEMF_ANY!MEMF_PUBLIC!MEMF_CLEAR
	move.l	d0,d6		;nouveau buffer (ActualBuffer)
	bne	.ok
	bsr	ErrorNoMemory	;affiche erreur
	moveq.b	#0,d0
	rts
.ok
	ALLOCMEM	MemSize,#MEMF_ANY!MEMF_PUBLIC!MEMF_CLEAR
	move.l	d0,d5		;nouveau buffer aussi (Mem)
	bne	.ok2
	bsr	ErrorNoMemory
	FREEMEM	d6,MemSize
	move.b	#0,d0	;signal erreur
	rts
.ok2
; On copie notre buffer actuel d'alarme dedans
	move.l	Mem,a0
	move.l	d5,a1	;Destination
	move.l	d7,d0	;Taille (sauvée AVANT NOUVEAU CALCUL MEMSIZE)
	CALLEXEC	CopyMem	;Copie
	
	move.l	ActualBuffer,a0
	move.l	d6,a1	;Destination
	move.l	d7,d0	;Taille (sauvée AVANT NOUVEAU CALCUL MEMSIZE)
	CALLEXEC	CopyMem	;Copie

	FREEMEM	Mem,d7

	FREEMEM	ActualBuffer,d7
	move.l	d6,ActualBuffer
	move.l	d5,Mem
	move.b	#-1,d0
	rts
CopyAls2
	ALLOCMEM	MemSize,#MEMF_ANY!MEMF_PUBLIC!MEMF_CLEAR
	move.l	d0,d6		;nouveau buffer (ActualBuffer)
	bne	.ok
	bsr	ErrorNoMemory	;affiche erreur
	move.b	#0,d0	;signal erreur
	rts
.ok
	ALLOCMEM	MemSize,#MEMF_ANY!MEMF_PUBLIC!MEMF_CLEAR
	move.l	d0,d5		;nouveau buffer aussi (Mem)
	bne	.ok2
	bsr	ErrorNoMemory
	FREEMEM	d6,MemSize
	move.b	#0,d0	;signal erreur
	rts
.ok2
; On copie notre buffer actuel d'alarme dedans
	move.l	Mem,a0
	move.l	d5,a1	;Destination
	move.l	d3,d0	;Taille		COPIE PREMIERE PARTIE
	beq	.after	;(AlarmesAvant)-(ToDelete)-(AlarmesApres).
	CALLEXEC	CopyMem	;Copie
	move.l	ActualBuffer,a0
	move.l	d6,a1	;Destination
	move.l	d3,d0	;Taille		COPIE PREMIERE PARTIE
	CALLEXEC	CopyMem	;Copie

.after
	move.w	AlarmeSize,d0
	ext.l	d0
	move.l	Mem,a0
	add.l	d3,a0
	add.l	d0,a0	;copie alarmes suivantes
	move.l	d5,a1	;base nouveau buffer
	add.l	d3,a1	;base+nombre d'octets déjà copiés
	move.l	d4,d0	;nbr d'octets à copier
	beq	.after2
	CALLEXEC	CopyMem
	move.w	AlarmeSize,d0
	ext.l	d0
	move.l	ActualBuffer,a0
	add.l	d3,a0
	add.l	d0,a0	;copie alarmes suivantes
	move.l	d6,a1
	add.l	d3,a1	;base+nbr d'octets déjà copiés.
	move.l	d4,d0	;nbr d'octets restant à copier
	CALLEXEC	CopyMem
.after2
	FREEMEM	Mem,d7

	FREEMEM	ActualBuffer,d7
	move.l	d6,ActualBuffer
	move.l	d5,Mem
	move.b	#-1,d0	;signal ok
	rts
*******************
* Routine commune * ChangeGadget
*******************  Remet à jour le gadget de selection nà alarme
ChangeGadget
	move.l	WhereSaveOld,a0
	move.l	SaveOld,(a0)	;ramène le vieux.
	move.w	NumAlarme,d0
	asl.w	#2,d0		;Nombre d'alarmes*4
	lea	AlarmeTxts,a0
	ext.l	d0
	add.l	d0,a0
	move.l	(a0),SaveOld	;sauve le truc avant
	move.l	a0,WhereSaveOld	;et son adresse (simplifie beaucoup)
	move.l	#0,(a0)	;met NULL
UpdateNumber
			;On va comparer Alarme affichée actu à max Al
	move.w	NumAlarme,d1	;(cad NumAlarme) (au cas où on efface dernière
	subq.w	#1,d1		;(alarme), -1 pour comparer à AlNbr
	cmp.w	AlNbr,d1
	bge	.ok		;si >= alors il faut soustraire 1 (e fait2 à AlNbr)
	sub.w	#1,AlNbr	;si c'est le cas alors on remet AlNbr à jour
.ok	lea	Gad15Tags,a3
	move.l	SUWindHd,a1
	move.l	Cycle3,a0
	move.l	#NULL,a2
	CALLGDT	GT_SetGadgetAttrsA
	move.w	AlNbr,d0
	bsr	UpdateDisplay
	rts
*****************************************
* Trouve toutes les infos  ToolType	*
*  (EURODATE=ON|OFF)			*
*  (PUBSCREEN=...)				*
*****************************************	
GetToolTypes		;Cf routine de Welcome 2.11
; On ouvre icon.library et on la ferme tout de suite car ce n'est pas la peine
;  d'encombrer le système avec pour nous, on ne s'en sert que maintenant !
	moveq.l	#0,d0
	lea	iconname,a1
	CALLEXEC	OpenLibrary
	tst.l	d0
	beq	.end
	move.l	d0,a4	;sauve la base
	move.l	#0,d7	;si = 0 à la fin, alors on a pas fait CurrentDir
; Marche à suivre pour pouvoir avoir le ".info" file.  Le problème est que
;  si on fait GetDiskObject("Welcome") on aura jamais le ".info" file car
;  si Welcome est dans un répertoire ou dans la ram: icon.lirabry can't find
;  it.
;CLI: On fait un GetProgramName qui donne le chemin d'accès complet au prog
;---	et le nom aussi (ex:"ram:t/welcome").  Il suffit donc de donner la
;	chaîne de caractère à icon.library et çà ira.
;WB : On lit le premier WBArg qui donne le lock Workbench sur le directory
;---	On va donc faire un CurrentDirectory dessus puis lire le nom qui
;	est dans wa_lock.  On fait alors le programme puis on REND le lock.

	move.l	WBMsg,d0
	bne	.wb		;s'il y a un WorkbenchMsg alors chargé du WB
; sinon on fait la routine pour le CLI.
	lea	FileName,a0
	move.l	a0,d1			;buffer pour nom du prog
	move.l	#BuffLength,d2			;longueur buffer
	CALLDOS	GetProgramName		;trouve le nom du prog sur le disk.
	bne	.suite			;si <> 0 alors pas d'erreur.
	rts				;sinon, rien et affiche en Français.
.wb		;ici si lançé du Workbench (dans les Args)
	move.l	d0,a3
	move.l	sm_ArgList(a3),a3	;liste des Arguments
	move.l	wa_Lock(a3),d1		;ici, c'est le lock sur le directory
					;d'ou est chargé prog.
	CALLDOS	CurrentDir		;met ceci en chemin d'accès.
	move.l	d0,d7			;sauve le OldLock afin de le rendre.
	move.l	wa_Name(a3),a0		;ceci est le nom du programme (celui-ci)
	bra	.siute
	
; lecture du fichier Welcome.info pour prendre les Tools Types
.suite	lea	FileName,a0
.siute	move.l	a4,a6	;a4=base icon.	
	jsr	_LVOGetDiskObject(a6)	;prend structure DiskObj de cette icone
	move.l	d0,a5			;sauve son adresse
	beq	.out			;si n'arrive pas à lire, aff en Fran
	move.l	d0,a0			;on va prendre
	move.l	do_ToolTypes(a0),a0	;l'adresse des tool types
	move.l	a0,a3			;et le sauve
	lea	EuroDateString,a1		;add de "EURODATE"
	move.l	a4,a6
	jsr	_LVOFindToolType(a6)	;a-t-on ce tool type ?
	tst.l	d0
	beq	.scr?			;si = 0 alors pas EURODATE=ON|OFF
	move.l	d0,a0			;on va tester juste la 2ème lettre
	move.b	1(a0),d0		;du tooltype
	and.b	#%11011111,d0	;met en majuscule
	cmp.b	#"N",d0		;en marche ?
	beq	.scr?			;dejà en euro don on ne change rien
	cmp.b	#"F",d0		;etteinte ?
	bne	.scr?			;si non, alors on eurodate
	lea	DatTime,a1		:adresse structure
	move.b	#FORMAT_USA,dat_Format(a1)
.scr?		;tooltype SCREEN=... pour default screen ?
	move.l	a3,a0			;ad des tool types.
	lea	ScreenString,a1		;add de "PUBSCREEN"
	move.l	a4,a6
	jsr	_LVOFindToolType(a6)	;a-t-on ce tool type ?
	tst.l	d0
	beq	.rien			;si = 0 alors pas PUBSCREEN=...
	move.l	d0,a0			;on va prendre l'adresse du nom et tenter un lock dessus
	move.l	#NULL,a1		;on lock par nom
	CALLINT	LockPubScreen
	move.l	d0,ChoosedScreen	;on met résultat là sans tester.
.rien	move.l	a5,a0		;on va desallouer el DiskObject
	move.l	a4,a6
	jsr	_LVOFreeDiskObject(a6)	
.out	
	move.l	d7,d1		;y a t'il un OldLock ?
	beq.s	.end
	CALLDOS	CurrentDir	;rend le lock pris si on vient WB
.end
	move.l	a4,a1		;ferme icon.library
	CALLEXEC	CloseLibrary
	rts

******************
* Host Screen... *
******************
HostScreen
	bsr	Closeitall	;ferme, et désalloue TOUT (ou presque)
; tâche déjà arrétée, on ne l'arrête pas donc
	bsr	HostScreenRoutine	;la ROUTINE
	bsr	TimeDateInit	;réaffiche heure et date
	bra	Prog		;PAS RTS car on a branché directement ici
				;-------

HostScreenRoutine
	CALLINT	LockPubScreenList	;lock sur la liste
	move.l	d0,PubScreenList	;sauve l'adresse de la liste
	bsr	NumScreen		;trouve le nombre d'écrans (d1=nbr-1)
	bsr	AllocArrays		;alloue tableau ad noms et écrans
	TEST	.memok			;si branche, il y a de la mémoire
	CALLINT	UnlockPubScreenList	;on rend le lock
	rts
.memok
	bsr	CopyNames		;copie les noms en allouant tout seul
	tst.b	d0
	bne	.freeall		;si <> 0 alors erreur
	CALLINT	UnlockPubScreenList	;on rend le lock
	bsr	LockScreens		;on tente lock sur tous ces écrans
	move.l	ChoosedScreen,LVscr		;et le lock.
	bsr	DisplayList		;créé le gagdet liste
	cmp.b	#3,d0
	beq	.outnogadgets		;branche si pas gadget (mais allocs mem)
	cmp.b	#0,d0			;pas d'erreur ? (=0)
	bne	.outnomem		;non en fait erreur mémoire.
	bsr	DisplWind		;affiche fenêtre et gadget
	TEST	.outnowindow		;si = 0, on n'a pas put ouvrir fen.
	bsr	ProcessLVMess		;les messages
	bsr	EraseWindow		;ferme la fenêtre
	bsr	UpdateFromChoice	;met à jour tout ce qu'il faut
.outnowindow
	bsr	DisposeList		;efface le gagdet.
.outnomem
	bsr	UnlockScreens		;on rend lock sur tout écran locké
	bsr	FreeNames		;désalloue mémoire sur noms
.freeall
	FREEMEM	NameArray,ArrayLength
	FREEMEM	ScreenArray,ArrayLength
	FREEMEM	LengthArray,ArrayLength
	rts
.outnogadgets
	bsr	DisposeList2	;efface liste
	move.l	vi,a0
	CALLGDT	FreeVisualInfo
	bra	.outnomem	;continue sur sa lancée
UpdateFromChoice
; On va ici locker le screen désiré puis tout désallouer.
; Ceci entraine une réécriture de la fonction GetScreen, celle-ci ne doit
; plus locker un écran mais recopier l'adresse de l'écran choisi là où il
;faut...
	move.w	Choice,d7		;d7=offset à partir début liste du
	move.l	LVLabels,a5		;liste
.bcl
	move.l	(a5),a5	;node suivant
	dbf	d7,.bcl		;le fait autant de fois qu'il faut
; on a maintenant en a5, le node qu'on veut.
	move.l	LN_NAME(a5),a0		;pointeur sur nom choisi
	CALLINT	LockPubScreen	;prend un lock.
	tst.l	d0
	bne	.ok	;si <> 0, on l'a locké
	move.l	#NULL,a0	;sinon, on lock le default
	CALLINT	LockPubScreen
	tst.l	d0
	beq	UpdateFromChoice	;si n'arrive pas, reessaye
.ok	move.l	d0,d7	;sauve ce lock
	move.l	ChoosedScreen,a1
	move.l	#NULL,a0
	CALLINT	UnlockPubScreen	;rend le lock précédent.
	move.l	d7,ChoosedScreen	;save the adresse
	rts
ProcessLVMess
	move.l	LVWindHd,a0
	move.l	wd_UserPort(a0),a0
	CALLEXEC	WaitPort
DoMessage
	move.l	LVWindHd,a0
	move.l	wd_UserPort(a0),a0
	CALLGDT	GT_GetIMsg
	TEST	ProcessLVMess		;si=0 plus de message -> on va attendre
	move.l	d0,a0
	move.l	28(a0),IAddress
	move.l	20(a0),Class
	move.w	24(a0),Code
	move.l	a0,a1
	CALLGDT	GT_ReplyIMsg		;on a ce qu'on voulait, on répond
	move.l	Class,d1
	cmp.l	#IDCMP_REFRESHWINDOW,d1
	bne.s	.notrefresh
	move.l	LVWindHd,a0
	CALLGDT	GT_BeginRefresh
	move.l	LVWindHd,a0
	move.l	#TRUE,d0
	CALLGDT	GT_EndRefresh
	bra	DoMessage
.notrefresh
	cmp.l	#IDCMP_GADGETUP,d1
	bne	DoMessage		;si pas ça, message inconnu...
	move.l	IAddress,a0
	move.w	38(a0),d0		;le gadget ID
	beq	.finished		;si <> 0 c'est le listview
	move.w	Code,Choice		;sauve car le boutton écrase Code...
	bra	DoMessage
.finished	;si boutton ok, on a fini...
	rts
EraseWindow
	move.l	LVWindHd,a0
	CALLINT	CloseWindow	;efface la fenêtre.
	rts
DisposeList	;effacement des gadgets
	move.l	LVGads,a0	;bye bye les gagdets
	CALLGDT	FreeGadgets
	move.l	vi,a0
	CALLGDT	FreeVisualInfo
; maintenant il faut rendre mémoire liste et nodes
; on en fait ce qu'on veut mainenant car Gadget n'en s'en sert plus.
DisposeList2
	move.l	ScreenNum,d7
	move.l	LVLabels,a1
.bcl	
	move.l	(a1),-(a7)	;on empile pour pouvoir tout désallouer
	move.l	(a1),a1
	dbf	d7,.bcl

	move.l	ScreenNum,d7
.bcl2
	FREEMEM	(a7)+,#LN_SIZE
	dbf	d7,.bcl2	;pour tous les nodes

	FREEMEM	LVLabels,#LH_SIZE
; toute la mémoire est rendue...
	rts
	
DisplayList	;création du gadget list view
	bsr	CreateNameList	;on créé une liste Exec des noms.
	tst.b	d0
	beq	.ok	;si retour = 0 alors pas erreur
	rts	;retour encore à même valeur (1->pas mémoire pour List struct
;						(2-> pour nodes)
		;MAIS ces <> codes importent peu car le nodes sont déjà désalloué...
.ok	move.l	LVscr,a0
	lea	TagsDONE,a1
	CALLGDT	GetVisualInfoA
	move.l	d0,vi
; on créé le premier gadget invisible
        lea	ContextGad,a0	;Contexte gadget structure		
	CALLGDT	CreateContext	;On se crée le premier gadget invisible
	tst.l	d0
	bne	.ok5		;branche si pas d'erreur
	bsr	ErrorContextGad
	move.l	#3,d0		;erreur code gadget
	rts
.ok5
	move.l	d0,LVGads	;Gadget de départ
	
	lea	GadStruct,a5	;adresse de la structure
;Gadget boutton ("Ok")
	move.w	#GadOk2Height,d1	;Hauteur en Topaz-8
	move.w	AddedHeight,d7
	add.w	d7,d1		;Ajoute hauteur en plus à cause font
	move.w	d1,gng_TopEdge(a5);le met dans la structure
	move.w	#GadOk2Left,gng_LeftEdge(a5)	;position gauche
	move.w	#GadOk2Width,gng_Width(a5)	;largeur
	move.w	#GadOk2Haut,gng_Height(a5)
	move.l	#PLACETEXT_IN,gng_Flags(a5)
	move.w	#0,gng_GadgetID(a5)	;le n° d'identité
	lea	OkText,a0		;adresse du texte
	move.l	a0,gng_GadgetText(a5)	;dans la structure.
	move.l	d0,a0		;"previous gadget"
	move.l	#BUTTON_KIND,d0	;"kind"	
	lea	GadStruct,a1	;"NewGad" structure
	lea	GadLVOkTags,a2	;TagList
	CALLGDT	CreateGadgetA	;Appel de la fonction...
	tst.l	d0
	bne	.ok2		;branche si pas d'erreur
	bsr	ErrorCreateGads
	move.l	#3,d0		;erreur gadget
	move.l	#0,LVGads
	rts
.ok2

; Gadget Listview
	move.w	#GadLVHeight,d1	;Hauteur en Topaz-8
	move.w	AddedHeight,d7
	add.w	d7,d1		;Ajoute hauteur en plus à cause font
	move.w	d1,gng_TopEdge(a5);le met dans la structure
	move.w	#GadLVLeft,gng_LeftEdge(a5)	;position gauche
	move.w	#GadLVWidth,gng_Width(a5)	;largeur
	move.w	#GadLVHaut,gng_Height(a5)
	move.l	#PLACETEXT_ABOVE!NG_HIGHLABEL,gng_Flags(a5)	
	move.w	#1,gng_GadgetID(a5)	;le n° d'identité
	lea	LVGadText,a0		;adresse du texte
	move.l	a0,gng_GadgetText(a5)	;dans la structure.
	move.l	d0,a0		;"previous gadget"
	move.l	#LISTVIEW_KIND,d0	;"kind"	
	lea	GadStruct,a1	;"NewGad" structure
	lea	GadLVTags,a2	;TagList
	CALLGDT	CreateGadgetA	;Appel de la fonction...
	tst.l	d0
	bne	.ok7		;branche si pas d'erreur
	bsr	ErrorCreateGads
	move.l	#0,LVGads
	move.l	#3,d0		;erreur code gadget
	rts
.ok7
	moveq.b	#0,d0	;code d'erreur (aucune!!).
	rts
CreateNameList
	ALLOCMEM	#LH_SIZE,#MEMF_ANY!MEMF_PUBLIC!MEMF_CLEAR
	tst.l	d0
	bne	.ok
	bsr	ErrorNoMemory	;pas de mémoire
	moveq.b	#1,d0
	rts
.ok	move.l	d0,LVLabels	;sauve adresse
	move.l	d0,a5		;adresse liste
	move.l	d0,a4		;sauve l'adresse
	NEWLIST	a5		;Macro exec/lists.i, initialise la liste
	move.l	ScreenNum,d7	;nombre d'écrans (et donc de nodes)
	move.l	NameArray,a3	;"liste" des adresses des noms
.bcl
	ALLOCMEM	#LN_SIZE,#MEMF_ANY!MEMF_PUBLIC!MEMF_CLEAR
;ici d7=nbr de nodes alloués - 1
	tst.l	d0
	bne	.ok8
	bsr	ErrorNoMemory	;pas de mémoire
; on va faire la désallocation de la liste nous-même.
	move.l	ScreenNum,-(a7)	;le sauve
	move.l	d7,ScreenNum	;nombre de nodes initialisés
	bsr	DisposeList2	;désalloue
	move.l	(a7)+,ScreenNum	;le ramène
	moveq.b	#2,d0		;et bye bye avec code d'erreur
	rts			
; ajoute ce node à la liste
.ok8	move.l	a4,a0	;adresse list
	move.l	d0,a1	;adresse node
	move.l	(a3)+,LN_NAME(a1)	;met en place add nom.
	ADDHEAD			;ajoute ce node en haut de la liste
	dbf	d7,.bcl
	move.b	#0,d0	;flag pour PAS erreur
	rts	;OUFFF, on a créé la liste
DisplWind	;Affiche la fenêtre pour le listview gadget
	lea	ListViewWind,a1		;les tags
	move.l	#0,a0			;on ouvre par tags
	CALLINT	OpenWindowTagList	;et voilà
	tst.l	d0
	bne	.ok
	bsr	LVWindowErr		;erreur

.ok	move.l	d0,LVWindHd		;on sauve le pointeur
	move.l	d0,a0
	movea.l	#NULL,a1
	CALLGDT	GT_RefreshWindow	;obligatoire pour GadTools.
	moveq.l	#-1,d0			;pour tester le retour (-1=ok)
	rts
NumScreen	;trouve le nombre d'écran sur système (à partir de a0)
	move.l	PubScreenList,a0
	lea	LH_TAIL(a0),a5	;pour comparer fin de liste à la fin
; Trouve le premier node
	move.l	(a0),a0		;premier node
	moveq.l	#-1,d1		;met à $ff pour avoir nbr écrans-1

.bcl
	addq.l	#1,d1			;il y a forcément Workbench screen
	move.l	LN_SUCC(a0),a0		;nouvelle valeur
	move.l	a0,d0			;pour pouvoir tester
	cmp.l	a0,a5			;=début liste (fin)?
	bne	.bcl			;si <> 0 alors pas fini
	move.l	d1,ScreenNum
	rts
FreeNames		;rend mémoire allouée dans tableau noms
	move.l	ScreenNum,d7	;nombre d'écrans-1
FreeNames2
	move.l	NameArray,a4	;tableau
	move.l	LengthArray,a5	;tableau des longueurs des chaînes
.bcl
	FREEMEM	(a4)+,(a5)+	;a4=adresse de l'alloc, a4=longueur chaine
	dbf	d7,.bcl
	rts	;bye bye.
AllocArrays

.allocscreenarray	;On alloue 4*d0 octets de mémoire pour adresse écrans
	move.l	ScreenNum,d0
	addq.l	#1,d0			;car c'est nbr-1 en fait.
	asl.l	d0		;*2
	asl.l	d0		;*2		=*4
	move.l	d0,ArrayLength			;initialise la valeur
	ALLOCMEM	d0,#MEMF_ANY!MEMF_PUBLIC
	tst.l	d0
	bne	.ok3
	bsr	ErrorNoMemory
	move.l	#-1,d0		;flag pour cette erreur
	rts
.ok3
	move.l	d0,ScreenArray

.allocnamearray
	ALLOCMEM	ArrayLength,#MEMF_ANY!MEMF_PUBLIC
	tst.l	d0
	bne	.ok
;si erreur, on l'affiche et on quitte SANS planter
	FREEMEM	ScreenArray,ArrayLength
	bsr	ErrorNoMemory
	move.l	#-1,d0
	rts
.ok
	move.l	d0,NameArray

.alloclengtharray
	ALLOCMEM	ArrayLength,#MEMF_ANY!MEMF_PUBLIC
	tst.l	d0
	bne	.ok2
	FREEMEM	NameArray,ArrayLength
	bsr	ErrorNoMemory
	move.l	#-1,d0
	rts
.ok2
	move.l	d0,LengthArray	;tableau de longueur des chaînes.
	moveq.l	#0,d0		;pour retour
	rts	;bye bye

CopyNames
	move.l	NameArray,a5		;notre tableau pour add du texte
	move.l	PubScreenList,a3	;liste Intuition des écrans publics
	move.l	LengthArray,a4		;tableau des longueurs
	move.l	ScreenNum,d7		;nombre de public screens
; ces registres a5,a3,a4 ne sont pas détruits lors appel fonctions EXEC

.bcl	move.l	(a3),a3			;node suivant
	move.l	LN_NAME(a3),a2		;nom en node du pubscreen
	bsr	FindLength		;trouve longueur chaîne (->"Length")
	move.l	d0,Length
	bsr	Alloc4Length		;alloue la mémoire (Length=longueur)
	tst.b	d0
	bne	.ok9
;ici retour = 0 donc on n'a pas pu allouer mémoire.
;etd7=nombre d'allocations - 1 je pense donc on fait comme pour les nodes
;on va désallouer ici...
	move.l	ScreenNum,-(a7)	;le sauve
	move.l	d7,ScreenNum
	bsr	FreeNames2	;les désalloue
	move.l	(a7)+,ScreenNum
	move.b	#-1,d0	;erreur
	rts
;suite normale
.ok9	move.l	d0,(a5)+		;sauve l'adresse dans tableau
	move.l	d0,a1			;destination copie
	move.l	LN_NAME(a3),a0		;source de la copie
	move.l	Length,d0		;longueur
	move.l	d0,(a4)+		;sauve longueur de la chaîne
	CALLEXEC	CopyMem		;fait la copie
	dbf	d7,.bcl			;recopie tout
	moveq.b	#0,d0
	rts				;tout est recopié
Alloc4Length	;alloue mémoire de longueur Length, de type ANY!PUBLIC
	ALLOCMEM	Length,#MEMF_ANY!MEMF_PUBLIC
	tst.l	d0
	bne	.ok
	bsr	ErrorNoMemory	;affiche erreur
	moveq.b	#0,d0		;code d'erreur
.ok	rts	;d0=adresse
	
FindLength	;trouve longueur chaîne d'adresse a2.
	moveq.l	#00,d0			;pour longueur chaîne
.bcl
	addq.l	#1,d0			;+1
	move.b	(a2)+,d1		;premier octet
	bne	.bcl			;on recommence si pas NULL
; d0=longueur de la chaîne, en comptant le zéro.
	rts
	
LockScreens	;On va locker tous les écrans pour éviter d'avoir d'avoir à
	;conserver le lock sur la liste des écrans et ne pas avoir de tester
	;l'existance des écrans après le choix par l'utilisateur.
	move.l	ScreenNum,d7
	move.l	NameArray,a5	;adresse des noms
	move.l	ScreenArray,a4	;adresse des écrans
.bcl			;a1 est incrémenté par la dernière ligne...
	move.l	(a5)+,a0		;adresse premier nom dans a0
	CALLINT	LockPubScreen	;tente le lock
	move.l	d0,(a4)+	;ceci met 0 si écran est en PRIVATE
	dbf	d7,.bcl
	rts			;on a maintenant locké tous les écrans.
	
UnlockScreens	;on Unlock tous les écrans
	move.l	ScreenNum,d7
	move.l	ScreenArray,a5
.bcl
	move.l	(a5)+,a1	;adresse du premier écran (et suivants)
	move.l	a1,d0		;pour tester le régistre d'état.
	beq	.after		;si oui, on unlock pas car n'était pas locké
	move.l	#0,a0		;on unlock par le pointeur pas le nom
	CALLINT	UnlockPubScreen
.after	dbf	d7,.bcl
	rts		;tout est délocké, oufff...
		
	
 ***************
 * Main Errors *
 ***************
GereTDError
	lea	DoItAgain,a0	;adresse du message
	bsr	DisplayError	;affiche erreur
	rts

ErrorNoMemory	;même chose que ErrorMemory sans planter
	lea	MemTxt,a0
	bsr	DisplayError
	rts
ErrorContextGad
ErrorCreateGads
	lea	GadErr3,a0
	bsr	DisplayError
	rts
ErrorOpenSUWind
	lea	NoSUWind,a0
	bsr	DisplayError
	rts
LVWindowErr
	lea	NoLVWind,a0
	bsr	DisplayError
	rts
ErrorMenu
	lea	NoMenu,a0
	bsr	DisplayError
	rts			;retourne sans planter
ErrorTextExtent
	lea	GrafErr,a0
	bsr	DisplayError
	rts
; erreur lecture prefs
ErrorReadStruct
	FREEMEM	ActualBuffer,MemSize
ErrorAllocStruct	;pas de mémoire pour allouer mem structs
ErrorPrefsRead		;ne peut lire header
ErrorNotAlPrefs		;n'est pas un header alarming
ErrorWriteStruct	;ne peut écrir en-tête (header)
	move.l	FileHd,d1
	CALLDOS	Close		;ferme le fichier
ErrorOpenFile	;ne peut ouvrir le fichier
ErrorOpenPFile		;ne peut ouvrir doslib
ErrorHeadAdd		;ne peut alloue mémoire
	bsr	DisplayErrorLoad
	moveq.l	#-1,d0			;signal erreur
	rts
; Affiche un requester annonçant l'erreur de chargement
DisplayErrorLoad
	move.l	#0,a0			;Requester sur Workbench ou Default Screen
	lea	Request2Struct,a1	;easy structure
	lea	ReqIDCMP,a2		;IDCMP_ptr
	move.l	#0,a3			;ArgList
	CALLINT	EasyRequestArgs		;Display un Requester
; Quand reviens, c'est qu'on a appuyé sur "Abandon"
	rts
NotInactive	;alarme pas inactive, ne peut la deleter
	lea	NotInactiv,a0
	bsr	DisplayError
	rts
NotEnufAl
	lea	NotEnufAlarms,a0
	bsr	DisplayError
	rts
Trop
	lea	TooMany,a0
	bsr	DisplayError
	rts
;
; Error Exists: Requester disant que Alarming a déjà été chargé
ErrorExists
	;Intuition pas encore ouvert on ne peut rien afficher
	bra	Exit1
NotVers2.0
	;On n'affiche rien car on n'a pas version 37> don pas EasyRequest.
	bra	Exit1
ErrorIntuitionOpen
	bra	Exit1
GadToolsOpenErr
	lea	GadToolsOpen,a0
	bsr	DisplayError
	bra	Exit2
UtilityOpenErr
	lea	NoUtil,a0
	bsr	DisplayError
	bra	Exit3
DosOpenErr
	lea	DosOpen,a0
	bsr	DisplayError
	bra	Exit4
GrafOpenErr
	lea	GfxOpen,a0
	bsr	DisplayError
	bra	Exit5
ErrorTimerMsgPort
	lea	NoMsgPort,a0	;adresse du message
	bsr	DisplayError	;affiche erreur
	bra	Exit5b
ErrorTimerIOCreate		;ne reviens jamais...
	lea	TimerIOErr,a0
	bsr	DisplayError
	bra	Exit6
ErrorTimerOpen			;ne reviens jamais
	lea	TimerError,a0
	bsr	DisplayError
	bra	Exit7
ErrorPrefs
	bra	Exit8		;pas de message car déjà affiché
	nop
Exit8
	move.l	IOTimer,a1
	CALLEXEC	CloseDevice
Exit7
	move.l	IOTimer,a0
	CALLEXEC	DeleteIORequest
Exit6
	move.l	TimerMsgPort,a0
	CALLEXEC	GetMsg
	Tst.l	d0
	bne	Exit6		;on ne reply pas car nous avons envoyé le msg
	move.l	TimerMsgPort,a1
	CALLEXEC	RemPort	;le fait privé
	
	move.l	TimerMsgPort,a0
	CALLEXEC	DeleteMsgPort	
Exit5b
	move.l	_GfxBase,a1
	CALLEXEC	CloseLibrary
Exit5
	move.l	_DOSBase,a1
	CALLEXEC	CloseLibrary
Exit4
	move.l	_UtilityBase,a1
	CALLEXEC	CloseLibrary
Exit3
	move.l	_GadToolsBase,a1
	CALLEXEC	CloseLibrary
Exit2
	move.l	_IntuitionBase,a1
	CALLEXEC	CloseLibrary
Exit1	rts

****************
* Partie Timer *
****************

; Boucle principale 
Loop
	bsr	ConvertTime		;prend l'heure
	bsr	Display			;Affiche
	

TestSiAlarme:

	lea	Time,a0			;ClockData structure(Heures, min, secondes...)
	move.l	ActualBuffer,a5		;Alarme1 (alarme à tester)
	moveq.w	#0,d6			;Alarme n°1 (pour savoir + tard)
Boucle
	move.w	Al_Type(a5),d5		;Test du Type d'alarme
	bsr	TestInactive		;alarme inactive ?
	beq	PasAlarme		;Z=0 alors pas d'alarme
	cmp.w	#ATYP_Prec,d5		;Type date précise ?
	beq	TestPrécis		;test pour date précise
; sinon on va voir si c'est ce type
PasDate	cmp.w	#ATYP_An,d5		;TYPE 1 * TOUS LES ANS?
	beq	Annuel

PasAn	cmp.w	#ATYP_Mois,d5			;1 fois tous les mois ?
	beq	Mensuel

PasMois	cmp.w	#ATYP_Jour,d5		;1 * par jour ?, heures et minutes
	beq	Journalier
PasJour	cmp.w	#ATYP_Week,d5
	beq	Hebdomadaire		;1 * par semaine?
	bne	PasAlarme
			
Lalarme
	move.l	a1,-(sp)			;sauve a1
	move.l	a0,-(sp)			;sauve a0
	bsr	RenderWindow		;affiche la fenêtre
; il faut mettre ici pour enrgistrer dernier affichage
	move.w	#1,ToSave			;Word signifiant qu'il faut
						;sauvegarder les alarmes
	move.w	Al_Type(a5),d0
	cmp.w	#ATYP_Prec,d0
	bne.s	.la
	move.w	#ATYP_Inactive,Al_Type(a5)	;la rend inactive si date précise
.la	lea	Time,a0				;source (heure actuelle)
	lea	Al_LastDispDate(a5),a1		;destination
	move.l	#CD_SIZE,d0			;taille
	CALLEXEC	CopyMem			;copie la date
	move.l	(sp)+,a0
	move.l	(sp)+,a1
	
PasAlarme:
	addq.w	#1,d6			;ajoute 1 au compteur
	cmp.w	NumAlarme,d6		;nombre d'alarme
	beq	Again			;reprend et affiche l'heure si fini
	add.w	AlarmeSize,a5		;AlarmeSize est un WORD
	bra	Boucle			;teste autres alarmes
Again					;Attend une minute et reteste	
	move.w	ToSave,d0		;doit-on sauvegarder les alarmes?
	beq	.A2			;si 0 alors pas de sauvegarde
	bsr	SaveAls		;sinon sauve les alarmes
	move.w	#0,ToSave		;le remet à zéro
.A2	bsr	DoTimerIO
	bra	Prog2		;va à boucle gestion des messages
	
DoTimerIO
	bsr	PrendHeure		;prend l'heure
	lea	Time,a0			;ClockData structure
	move.w	sec(a0),d0		;met le nbr de secs dans d0
	sub.w	#60,d0			;seconde - 60
	neg.w	d0			;d1 = 60 - (secondes maintenant)
	move.l	IOTimer,a1		;addresse de la IORequest
	move.w	#TR_ADDREQUEST,IO_COMMAND(a1)
	ext.l	d0
	move.l	d0,IOTV_TIME(a1)	;on attend le temps qu'il faut
	move.l	#0,IOTV_TIME+4(a1)	;pour arriver à la prochaine minute
	CALLEXEC	SendIO		;on envoit en asynchrone
	rts
Abort
	move.l	IOTimer,a1
	CALLEXEC	AbortIO
	move.l	IOTimer,a1
	CALLEXEC	WaitIO
	rts
	
TimerMsg
; c'est le timer sans doute
	move.l	TimerMsgPort,a0
	CALLEXEC	GetMsg		;prend le message
	TEST	Prog2			;on a eu un signal sans message donc on rebranche pour reattendre
; sinon on ne reply pas au message: c'est nous qui l'avons envoyé avec SendIO
	bra	Loop			;reply -> refait affichage et boucle
PrendHeure				;met la bonne dans ClockData
	lea	Heure,a0
	CALLTIMER	GetSysTime	;Prend l'heure
	
	move.l	(a0),d0			;met	TV_SCS dans D0
	lea	Time,a0			;ClockDate structure
	CALLUTIL	Amiga2Date	;Convertie en ClockData
	rts
	
ConvertTime
	lea	DatTime+dat_Stamp,a0	;adresse du dateStamp
	move.l	a0,d1
	CALLDOS	DateStamp		;met l'heure
	
	lea	DatTime,a0
	move.l	a0,d1
	CALLDOS	DateToStr		;convertie en texte, l'heure et la date.
	lea	Unwanted,a0
	move.b	#0,(a0)			;enlève les secondes
	move.b	#" ",-6(a0)
	rts

RenderWindow:				;Affichage fenêtre alarme	
; on trouve sur quel écran on va s'installer
	move.l	ChoosedScreen,d0
	move.l	d0,screen		;on a maintenant l'écran standard
	move.l	d0,screen2
	move.l	d0,a0			;écran ou l'on s'affiche
	move.l	sc_Font(a0),a0		;structure Font de l'écran
	move.w	4(a0),d0		;TA_YSize (Hauteur font écran)
	sub.w	#8,d0			;soustrait 8 (cad font topaz 8)
	move.w	d0,AddedHeight		;Taille en plus par / à T8
	add.w	#150,d0			;Taille normale (150) fenêtre
	ext.l	d0			;en mot long
	move.l	d0,AlTextWHeight	;ca y est on a la hauteur

	move.l	screen,a0		;pointeur sur écran "default"
	lea	TagsDONE,a1	;TagList
	CALLGDT	GetVisualInfoA	;fonction...

	move.l	d0,viL1
	move.l	d0,viL2
	move.l	d0,viL3		;les 5 lignes de texte éventuelles
	move.l	d0,viL4
	move.l	d0,viL5
	move.l	d0,viL6		;le "©1992 par" ...
	move.l	d0,viOk		;Ok gadget...
	
; on créé le premier gadget invisible
        lea	ContextGad,a0	Contexte gadget structure		
	CALLGDT	CreateContext	;On se crée le premier gadget invisible
	TEST	fin2
	move.l	d0,BaseGad	;Gadget de départ, on utilise les mêmes que SUWind
	move.l	d0,BaseGad2
	move.l	d0,BaseGad3
	
	
	move.w	#L1Height,d1	;Hauteur en Topaz-8
	move.w	AddedHeight,d2
	add.w	d2,d1		;Ajoute hauteur en plus à cause font
	move.w	d1,L1_Height	;le sauve pour gadget L1
	add.w	#11,d1		;en print en Topaz-8 donc interligne normal
	move.w	d1,L2_Height	;gadget L2
	add.w	#11,d1
	move.w	d1,L3_Height	;gadget L3
	add.w	#11,d1		;
	move.w	d1,L4_Height	;gadget L4
	add.w	#11,d1
	move.w	d1,L5_Height	;gadget L5
	move.w	#CopyHeight,d1	;hauteur copyright sans textes
	add.w	d2,d1		;fait ce qu'il faut
	move.w	d1,CH		;gadget Ok
	move.w	#CopyHeight2,d1
	add.w	d2,d1
	move.w	d1,CH2		;hauteur copyheight avec texte
	move.w	#OkHeight,d1
	add.w	d2,d1		;fait ce qu'il faut
	move.w	d1,OH		;Ok_Height	;gadget Ok
	move.w	#OkHeight2,d1
	add.w	d2,d1		;en cas de fenetre sans texte
	move.w	d1,OH2
	
; ici d0 contient "previous gadget"
.ok
	move.w	Al_Flags(a5),d5	;Flags	(message?)
	and.w	#AFLG_Mess,d5		;message?
	bne	FenConText		;fenêtre avec Text
	move.w	CH2,d1
	move.w	d1,Copy_Height		;hauteur de ce gadget quand pas txt
	move.w	OH2,d1
	move.w	d1,Ok_Height		;idem
	bra	DisplayWindow			;non alors branche

FenConText		;affiche fenêtre avec texte
	move.w	CH,d1
	move.w	d1,Copy_Height		;hauteur de ce gadget quand pas txt
	move.w	OH,d1
	move.w	d1,Ok_Height		;idem

	move.l	d0,a0		;previous Gadget
	lea	Text1(a5),a3
	move.l	a3,Line1	;Addresse Text ligne1
	move.l	#TEXT_KIND,d0
	lea	GadL1Struct,a1	;Gadget ligne 1
	lea	GadL1Tags,a2
	CALLGDT	CreateGadgetA
	TEST	fin

	move.l	d0,a0		
	lea	Text2(a5),a3
	move.l	a3,Line2
	move.l	#TEXT_KIND,d0
	lea	GadL2Struct,a1
	lea	GadL2Tags,a2
	CALLGDT	CreateGadgetA
	TEST	fin

	move.l	d0,a0		;previous Gadget
	lea	Text3(a5),a3
	move.l	a3,Line3	;Addresse Text ligne1
	move.l	#TEXT_KIND,d0
	lea	GadL3Struct,a1	;Gadget ligne 1
	lea	GadL3Tags,a2
	CALLGDT	CreateGadgetA
	TEST	fin

	move.l	d0,a0		
	lea	Text4(a5),a3
	move.l	a3,Line4
	move.l	#TEXT_KIND,d0
	lea	GadL4Struct,a1
	lea	GadL4Tags,a2
	CALLGDT	CreateGadgetA
	TEST	fin
	
	move.l	d0,a0		
	lea	Text5(a5),a3
	move.l	a3,Line5
	move.l	#TEXT_KIND,d0
	lea	GadL5Struct,a1
	lea	GadL5Tags,a2
	CALLGDT	CreateGadgetA
	TEST	fin

DisplayWindow
	move.l	d0,a0		;previous
	move.l	#TEXT_KIND,d0	;ligne de copyright
	lea	GadCopyStruct,a1
	lea	GadCopyTags,a2
	CALLGDT	CreateGadgetA
	TEST	fin

	move.l	d0,a0
	move.l	#BUTTON_KIND,d0
	lea	GadOkStruct,a1
	lea	GadOkTags,a2
	CALLGDT	CreateGadgetA
	TEST	fin
	
	move.l	d0,gad		;sauve dernier pointeur sur gadget
	movea.l	#00,a0		;"NewWindow" est optionel, on va faire par Tags
	move.w	Al_Flags(a5),d5	;Flags	(message?)
	and.w	#AFLG_Mess,d5		;message?
	beq	.là			;non alors branche
	lea	AlTextWTags,a1	;Fenêtre avec Texts
	bra	.there
.là	lea	AlWindTags,a1	;Fenêtre sans Texts
.there	CALLINT	OpenWindowTagList
	TEST	fin		;si erreur direct à fin
	move.l	d0,AlWindHd
	
	move.l	AlWindHd,a0
	movea.l	#0,a1			;pas requester
	CALLGDT	GT_RefreshWindow

; Clignotement écrans ?
	move.w	Al_Flags(a5),d5
	and.w	#AFLG_Flash,d5
	beq	ProcessMessAlarme
	move.l	#0,a0
	CALLINT	DisplayBeep
ProcessMessAlarme			;Messages fenêtre Alarme

	move.l	AlWindHd,a0
	move.l  86(a0),a0               ;UserPort address
	CALLEXEC	WaitPort	;Attend un message de intuition...


	move.l  AlWindHd,a0             ;Handle de la fenetre
	move.l  86(a0),a0               ;UserPort address
	CALLGDT	GT_GetIMsg		;Prend le IMessage

	move.l	d0,a0	
	move.l	28(a0),IAddress		;IAddress (=Gadget)
	move.l	20(a0),Class		;Class		;on réutilise les
	move.w	24(a0),Code		;Code		;mêmes car on a jamais SUWindow et AlarmeWindow en même temps
	
	move.l	a0,a1
	CALLGDT	GT_ReplyIMsg		;Répond
	
	move.l	Class,d1
	cmp.l	#IDCMP_REFRESHWINDOW,d1
	bne	.next
	move.l	AlWindHd,a0		;Win
	CALLGDT	GT_BeginRefresh
	move.l	AlWindHd,a0
	move.l	#TRUE,d0
	CALLGDT	GT_EndRefresh		;fini rafraîchissement
	bra	ProcessMessAlarme
.next
	move.l	Class,d1
	cmp.l	#IDCMP_GADGETUP,d1
	bne	ProcessMessAlarme		;pas un message connu
	move.l	IAddress,a0
	move.w	38(a0),d0
	cmp.w	#6,d0				;Gadget "Okay"
	bne	ProcessMessAlarme

LaFin
				;Ferme la fenêtre d'alarme
	move.l	AlWindHd,a0
	CALLINT	CloseWindow
	
fin
	move.l	BaseGad,a0
	CALLGDT	FreeGadgets
	
fin2
	move.l	viL1,a0			;le visual info
	CALLGDT	FreeVisualInfo

fin3	
fin4
	rts

***************************************
* Routines des tests pour les alarmes *
***************************************
Annuel
	bsr	TestYear		;test si pas déjà affiché cette année
	tst.b	d0
	beq	PasAlarme		;si retour=0 alors déjà affichée
	bra	TestAnnuel		;sinon, on test
Mensuel
	bsr	TestMonth		;voir plus haut
	tst.b	d0
	beq	PasAlarme
	bra	TestMensuel
Journalier
	bsr	TestDay
	tst.b	d0
	beq	PasAlarme
	bra	TestJournalier
; Ici c'est spécial, on test d'abord si déjà affichée aujourd'hui
;  puis, si pas affichée aujourd'hui, s'il faut l'afficher et si oui
; on l'affiche.. sinon rien.
Hebdomadaire
	bsr	TestDay			;déjà affichée aujourd'hui
	tst.b	d0
	beq	PasAlarme		;si oui pas d'alarme
					;sinon on test si il faut afficher
					;aujourd'hui
	bsr	TestJourSem		;today ???
	tst.b	d0
	bne	PasAlarme		;si pas le même jour alors pas aff.
	bra	TestJournalier		;ensuite çà continue avec test heure.	


; Routine est commune, seulement point d'entrée différents
TestPrécis
	bsr	TestAn			;TEST ANNEE
	cmp.b	#2,d0			;année actu< année voulue?
	beq	PasAlarme		;si oui, branche
	cmp.b	#1,d0			;année actu> année voulue?
	beq	Lalarme			;si oui affiche alarme
; si égal, il faut tester le reste
; Remarque qu'il n'y a pas de test si déjà affiché: c'est normal car quand
;  ce type d'alarme est affiché, il devient un type inactive donc intestable.
TestAnnuel
	bsr	TestMois		;test mois actu/mois voulu
	cmp.b	#1,d0
	beq	PasAlarme		;branche si mois actu<mois voulu
	cmp.b	#2,d0
	beq	Lalarme			;branche si mois actu>mois voulu
TestMensuel		;TYPE=1 * par mois
	bsr	TestJour
	cmp.b	#2,d0
	beq	PasAlarme
	cmp.b	#1,d0
	beq	Lalarme
TestJournalier		;TYPE= 1* par jour
	bsr	TestHeure
	cmp.b	#2,d0
	beq	PasAlarme
	cmp.b	#1,d0
	beq	Lalarme

	bsr	TestMins
	cmp.b	#2,d0
	beq	PasAlarme
	bra	Lalarme		;affiche si min actu>= min voulues

*******************Entrées	a0:Time			Sorties: d0 = 0 an = actu
*Test...(Francais)*		a5:Alarme testée		    = 1 an > actu
*******************						    = 2 an < actu
TestAn
	move.w	year(a0),d0		;année actuelle
	cmp.w	year(a5),d0		;compare avec année demandée
tests	beq	Egal			;sortie avec d0=0
	bpl	Grand			;sortie avec d0=1 année actu <
	bmi	Petit			;sortie avec d0=2 année actu >
TestMois
	move.w	month(a0),d0		;mois actuel
	cmp.w	month(a5),d0
	bra	tests			;les tests sont tjrs les mêmes
TestJourSem
	move.w	wday(a0),d0
	cmp.w	wday(a5),d0
	bra	tests
TestJour
	move.w	mday(a0),d0
	cmp.w	mday(a5),d0
	bra	tests
TestHeure
	move.w	hour(a0),d0
	cmp.w	hour(a5),d0
	bra	tests
TestMins
	move.w	min(a0),d0
	cmp.w	min(a5),d0		;<=> (min voulue) - (min actu)
	bra	tests			;faisons les tests
*********************Entrée: a0: Time		Sortie: d0=0 Egal
* Test....(anglais) *	       a5: Alarme		d0=1 >
*********************					d0=2 <
TestYear			;dernier affichage <=> année actu
	move.w	year(a0),d0
	cmp.w	year+CD_SIZE(a5),d0	;dernier aff. année
tests2	beq	Egal
	bpl	Grand
	bmi	Petit
TestMonth
	move.w	month(a0),d0
	cmp.w	month+CD_SIZE(a5),d0
	bra	tests2
TestDay
	move.w	mday(a0),d0
	cmp.w	mday+CD_SIZE(a5),d0	;*test si déjà affiché cette date*
	bra	tests2
TestHour
	move.w	hour(a0),d0
	cmp.w	hour+CD_SIZE(a5),d0
	bra	tests2
TestInactive
	cmp.w	#ATYP_Inactive,d5
	bne	.la
	moveq.b	#0,d0			;met à zéro
	tst.b	d0			;test d0 pour mettre Z à 0
	bra	.ici			;si retourne avec d0=0 alors
.la	tst.b	d5			;alarme inactive
.ici	rts				;retourne
Egal	
	moveq.b	#0,d0
	rts				;sortie avec d0=0
Petit
	moveq.b	#2,d0
	rts				;sortie avec d0=2
Grand
	moveq.b	#1,d0
	rts				;sortie	avec d0=1


********************************
* Affichage de l'heure et date * Avec chaine TD déja modifiée
********************************

Display:
        move.l  TimeWindHd,a0
        lea     TD2,a1           ;chaine de titre de la fenetre
	lea	ScrTitle,a2	;Nom dans Screen (même que SUWind)
        CALLINT	SetWindowTitles
        rts


;
;
**************************
* Sauvegarde des alarmes *
**************************
;
;
SaveAls
; Version non-enregistrée
	lea	Money,a0
	bsr	DisplayError
	rts
;
;
***********
* Erreurs *
***********
;
;
******************************
* Gestion des erreurs disque *
******************************


; Affiche un requester d'erreur avec Gadget Abandon.
; Entré:  Addresse du Msg mise dans la structure du requester dans A0

DisplayError
	lea	ReqErrStruct,a1	;easy structure
	move.l	a0,es_TextFormat(a1)		;met addresse txt.
	move.l	#0,a0			;Requester sur Workbench ou Default Screen
	lea	ReqIDCMP,a2		;IDCMP_ptr
	move.l	#0,a3			;ArgList
	CALLINT	EasyRequestArgs		;Display un Requester
; Quand reviens, c'est qu'on a appuyé sur "ok"
	rts 


;
;
************************************
* Variables, textes, structures... *
************************************
;
;

	SECTION	Structures,DATA

******************
* Menu Structure *
******************
NewMenu1
	dc.b	NM_TITLE,0
	dc.l	ProjectTxt	;"Project"
	dc.l	0
	dc.w	0
	dc.l	0,0
	
; "Host screen..."
	dc.b	NM_ITEM,0
	dc.l	ChooseScrTxt	;"Host screen..."
	dc.l	KeyScrTxt	;"C"
	dc.w	0,0,0,0,0

; "About..."
	dc.b	NM_ITEM,0
	dc.l	AboutTxt	;"About..."
	dc.l	AboutKeyTxt	;"A"
	dc.w	0,0,0,0,0
	
; filet entre 'Quit' et toutes ces options
	dc.b	NM_ITEM,0
	dc.l	NM_BARLABEL	;filet pour séparer quit.
	dc.w	0,0,0,0,0,0,0
	
; "Quit"
	dc.b	NM_ITEM,0
	dc.l	QuitText	;"Quit"
	dc.w	0,0,0,0,0,0,0
	
; Menu 2, "Extra"
	dc.b	NM_TITLE,0
	dc.l	ExtraText	;"Extra"
	dc.l	0
	dc.w	0
	dc.l	0,0
	
; "Add an alarm"
	dc.b	NM_ITEM
	dc.l	AddAlarm
	dc.l	PlusSign	;"+"
	dc.w	0,0,0,0,0
	
; "Subtract alarm..."
	dc.b	NM_ITEM,0
	dc.l	SubAlarm
	dc.l	MinusSign	;"-"
	dc.w	0,0,0,0,0
	
; fin de la définition des structures.
	dc.b	NM_END,0
	dc.w	0,0,0,0,0,0,0,0,0

**************************
* Easy Request Structure *
**************************
ReqErrStruct	dc.l	es_SIZEOF
		dc.l	0
		dc.l	ReqName		; structure erreur générique
		dc.l	0		;texte dans requester.
		dc.l	ErrGad

Request2Struct	dc.l	es_SIZEOF
		dc.l	0
		dc.l	ReqName		; structure erreur chargement
		dc.l	ReqTxt2
		dc.l	ReqGadNames
		
RequestStruct	dc.l	es_SIZEOF
		dc.l	0
		dc.l	ReqName		; structure erreur sauvegarde
		dc.l	ReqTxt
		dc.l	ReqGadNames
AboutReqStruct	dc.l	es_SIZEOF
		dc.l	0
		dc.l	AlarmingTxt
		dc.l	AboutReqTxt
		dc.l	OkText
DeleteAlStruct	dc.l	es_SIZEOF
		dc.l	0
		dc.l	AlarmingTxt
		dc.l	DeleteOK
		dc.l	DeleteChoices
	
SetUpWindowTags
	dc.l	WA_Left,0
	dc.l	WA_Top,11
	dc.l	WA_Width,640
	dc.l	WA_Height
	dc.w	0		;Normalement un long mais pour ne pas
SU_Height	dc.w	180	;modifier le programme en 2*word (9/5/93).
	dc.l	WA_IDCMP,BUTTONIDCMP!IDCMP_REFRESHWINDOW!IDCMP_MENUPICK
	dc.l	WA_Flags,WFLG_DRAGBAR!WFLG_DEPTHGADGET!WFLG_ACTIVATE
	dc.l	WA_Gadgets
BaseGad	dc.l	0
	dc.l	WA_Title,SUTitle
	dc.l	WA_PubScreen
scr	dc.l	0
	dc.l	TAG_DONE
DefaultHeader
		dc.b	"PGCB"		;test PAS BESOIN DE EVEN car word boundary
		dc.w	0		;version
		dc.w	DefaultNbrAl	;nombre d'alarmes
		dc.w	DefaultAlSize	;longueur
HeadAdd	dc.l	Header
Header		dc.w	0,0,0
NumAlarme	dc.w	0		;obligatoirement mis à jour
AlarmeSize	dc.w	0
		dc.w	0		;DA_Bug

*******************
* Text Attributes *
*******************
TAttG1:				;Ligne de texte
	dc.l	FontName	;Nom de la Fonte
	dc.w	8,0,0	
TAttGCopy
	dc.l	FontName
	dc.w	8,0
	dc.b	0
	dc.b	0
TAttL1Gad
	dc.l	FontName
	dc.w	8,0,0
TAttL2Gad	=	TAttL1Gad
TAttL3Gad	=	TAttL2Gad
TAttL4Gad	=	TAttL3Gad
TAttL5Gad	=	TAttL4Gad
TAttOk	
	dc.l	FontName
	dc.w	8,0,0
TAttTexts
	dc.l	FontName
	dc.w	8,0,0
*******************
* Text Structures *
*******************
;Constantes
Option_Hite	=	153
Text_Hite	=	Option_Hite

TitleStruct:                             ;1er Texte de la set-Up Window
OptionStruct:
        dc.b    3	;bleu
        dc.b    0	;gris
        dc.b    0	;draw mode
        dc.b    0	;Kludgefill00
        dc.w    100	;X position
Option_Height	dc.w    153	;Y position
        dc.l	TAttTexts
        dc.l    OptionText      ;"Options",0
	dc.l    TexteStruct
TexteStruct
	dc.b	3
	dc.b	0
	dc.b	0
	dc.b 	0
	dc.w	478-52	;milieu gadget texte -  moitiée longueur du texte
Text_Height	dc.w	153
	dc.l	TAttTexts
	dc.l	TextStr
	dc.l	0

********************
* Gadget Structure *
********************
ContextGad:	dc.l	0	;NULL
GadStruct
	dc.w	70
	dc.w	132
	dc.w	320
	dc.w	13
	dc.l	L1Text
	dc.l	TAttG1
	dc.w	1
	dc.l	PLACETEXT_LEFT
vi	dc.l	0
	dc.l	0

	
;Gadgets fenêtre Alarme
GadCopyStruct:
	dc.w	20
Copy_Height	dc.w	90
	dc.w	WidthCopyright,10
	dc.l	NULL		;pas de Text
	dc.l	TAttGCopy
	dc.w	00		;n°0 dans cette fenêtre
	dc.l	0
viL6	dc.l	0
	dc.l	0
GadL1Struct:
	dc.w	LeftT
L1_Height	dc.w	15	;position du gadget (11 de la barre de titre ne Topaz 8  + 7)
	dc.w	WidthTGad,10	;Hauteur
	dc.l	NULL		;Pas de Texte
	dc.l	TAttL1Gad
	dc.w	01		;Gadget ID
	dc.l	0
viL1	dc.l	0
	dc.l	0
GadL2Struct
	dc.w	LeftT
L2_Height	dc.w	26
	dc.w	WidthTGad,10	;heuteur dans la fenêtre
	dc.l	NULL		;pas de texte
	dc.l	TAttL2Gad
	dc.w	02		;ID	
	dc.l	0
viL2	dc.l	0
	dc.l	0
GadL3Struct:
	dc.w	LeftT
L3_Height	dc.w	37
	dc.w	WidthTGad,10	;barre de titre=11 lignes
	dc.l	NULL		;Pas de Texte
	dc.l	TAttL3Gad
	dc.w	03		;Gadget ID
	dc.l	0
viL3	dc.l	0
	dc.l	0
GadL4Struct
	dc.w	LeftT
L4_Height	dc.w	48
	dc.w	WidthTGad,10	;10+1=26
	dc.l	NULL		;pas de texte
	dc.l	TAttL4Gad
	dc.w	04		;ID	
	dc.l	0 
viL4	dc.l	0
	dc.l	0
GadL5Struct
	dc.w	LeftT
L5_Height	dc.w	59
	dc.w	WidthTGad,10	;10+1=26
	dc.l	NULL		;pas de texte
	dc.l	TAttL5Gad
	dc.w	05		;ID	
	dc.l	0
viL5	dc.l	0
	dc.l	0
GadOkStruct
	dc.w	((WidthCopyright+40)/2)-45
Ok_Height	dc.w	120
	dc.w	90,12
	dc.l	OkText
	dc.l	TAttOk
	dc.w	6		;ID
	dc.l	0
viOk	dc.l	0
	dc.l	0
********************
* Gadget constants *
********************
*********************
* Bevels Constantes *
*********************
Box1Left	=	5
Box1Top		=	11			;SELECTION TYPE & N°
Box1Height	=	30
Box1Width	=	630
Box2Left	=	Box1Left		;SELECTION DATE
Box2Top		=	Box1Top+Box1Height	;=41
Box2Height	=	33
Box2Width	=	Box1Width
Box3Top		=	Box2Top+Box2Height	;=74
Box3Height	=	150-Box3Top		;SELECTION OPTIONS
Box3Left	=	Box2Left
Box3Width	=	300
Box4Left	=	Box3Left+Box3Width
Box4Width	=	330			;SELECTION TEXTE
Box4Top		=	Box3Top
Box4Height	=	Box3Height
Box5Top		=	Box3Top+Box3Height	;TEXTE "Options"
Box5Left	=	Box3Left
Box5Width	=	Box3Width
Box5Height	=	13
Box6Left	=	Box4Left		;TEXTE "Text"
Box6Top		=	Box5Top
Box6Width	=	Box4Width
Box6Height	=	Box5Height


*****************************************************
* Tableau de pointeur de texte pour Gadget de Cycle *
*****************************************************

;Cycle Gadget pour les types d'alarmes
CycleType
	dc.l	Inactive
	dc.l	ParJour
	dc.l	ParMois
	dc.l	ParAn
	dc.l	Precise
	dc.l	ParSem
	dc.l	NULL

; Cycle gadget pour les mois
CycleDate:
	dc.l	Janvier
	dc.l	Fevrier
	dc.l	Mars
	dc.l	Avril
	dc.l	Mai
	dc.l	Juin
	dc.l	Juillet
	dc.l	Aout
	dc.l	Septembre	
	dc.l	Octobre
	dc.l	Novembre
	dc.l	Decembre
	dc.l	NULL
	
; Cycle gadget n° d'alarme
AlarmeTxts
l	set	0
	rept	19
	dc.l	Un+(4*l)	;pointe sur tous les chiffres jusqu'à 19
l	set	l+1
	endr
	dc.l	NULL

WeekTexts
	dc.l	Dim		;Dimanche = 0 comme fonction utility.library
	dc.l	Lun
	dc.l	Mar
	dc.l	Mer
	dc.l	Jeudi
	dc.l	Vend
	dc.l	Sam
	dc.l	NULL
;
;
****************************
* Tags de plusieurs appels *
****************************
;
;

	SECTION Tags,DATA

	
********
* Tags *
********

; Tags Menu
MenuTags
	dc.l	GTMN_FrontPen,1		;pen 1
	dc.l	TAG_DONE
; Tags divers
EnableTags:				;Tags permettant de disabler en enabler les gadgets
	dc.l	GA_Disabled,FALSE
TagEnd
	dc.l	TAG_DONE
DisableTags:
	dc.l	GA_Disabled,TRUE
	dc.l	TAG_DONE		;Pas de Tags pour fenêtre de Set-Up
SUWTags
	dc.l	TAG_DONE
ToggledTags
	dc.l	GTCB_Checked,TRUE
	dc.l	TAG_DONE
UnToggledTags
	dc.l	GTCB_Checked,FALSE
	dc.l	TAG_DONE
SetStringTags
	dc.l	GTST_String,0		;pointe sur rien
	dc.l	TAG_DONE		;permet de changer les chaines de car
SetCycleTags
	dc.l	GTCY_Active,0		;change n° de type
	dc.l	TAG_DONE		;
SetIntegerTags
	dc.l	GTIN_Number,1993
	dc.l	TAG_DONE
SetSliderTags
	dc.l	GTSL_Level,0
	dc.l	TAG_DONE		;niveau de mois
; Tags Gadget
Gad1Tags:
	dc.l	GTST_MaxChars,38
TagsDONE:	dc.l	TAG_DONE	;fini
Gad2Tags:
	dc.l	GTST_MaxChars,38
	dc.l	TAG_DONE	;fini
Gad3Tags:
	dc.l	GTST_MaxChars,38
	dc.l	TAG_DONE	;fini
Gad4Tags:
	dc.l	GTST_MaxChars,38
	dc.l	TAG_DONE	;fini
Gad5Tags:
	dc.l	GTST_MaxChars,38
	dc.l	TAG_DONE	;fini
Gad6Tags:
	dc.l	GTCB_Checked,TRUE	;on démarre avec "message"=TRUE
	dc.l	TAG_DONE
Gad7Tags	=	Gad6Tags
Gad8Tags	=	Gad7Tags
Gad9Tags:
	dc.l	GTSL_Min,0
	dc.l	GTSL_Max,23	;max heures
	dc.l	GTSL_Level,0
	dc.l	GTSL_LevelFormat,HeureFormat
	dc.l	GTSL_MaxLevelLen,2
	dc.l	GTSL_LevelPlace,PLACETEXT_RIGHT 
	dc.l	TAG_DONE
Gad10Tags:
	dc.l	GTSL_Min,0
	dc.l	GTSL_Max,59	;max minutes
	dc.l	GTSL_Level,0
	dc.l	GTSL_LevelFormat,MinuteFormat
	dc.l	GTSL_MaxLevelLen,2
	dc.l	GTSL_LevelPlace,PLACETEXT_LEFT
	dc.l	TAG_DONE
Gad11Tags:
	dc.l	GTSL_Min,01				;01 jours min
	dc.l	GTSL_Max,31				;31 jours max
	dc.l	GTSL_LevelFormat,DateFormat
	dc.l	GTSL_MaxLevelLen,2
	dc.l	GTSL_LevelPlace,PLACETEXT_RIGHT
	dc.l	TAG_DONE
Gad12Tags
	dc.l	GTCY_Labels,CycleDate
	dc.l	TAG_DONE
Gad13Tags
	dc.l	GTIN_MaxChars,4
	dc.l	GTIN_Number,1993		;Année
	dc.l	STRINGA_ReplaceMode,TRUE
	dc.l	TAG_DONE
Gad14Tags:
	dc.l	GTCY_Labels,CycleType
	dc.l	TAG_DONE
Gad15Tags:
	dc.l	GTCY_Labels,AlarmeTxts
Gad16Tags:	dc.l	TAG_DONE
Gad17Tags	=	Gad16Tags
Gad18Tags	
	dc.l	GA_Disabled,TRUE	;normalement pas choisi.
	dc.l	GTCY_Labels,WeekTexts
GadLVOkTags	dc.l	TAG_DONE
GadLVTags
	dc.l	GTLV_Labels
LVLabels	dc.l	0	;pointeur sur la liste
	dc.l	GTLV_ShowSelected,0	;montre seulement
	dc.l	GTLV_Selected,0		;au départ c'est le n°0 qui est choisi
	dc.l	TAG_DONE
GadCopyTags:
	dc.l	GTTX_Text,Copyright
	dc.l	GTTX_Border,TRUE
	dc.l	TAG_DONE
GadL1Tags:			;Tags pour ligne 1 de gadget dans Alarme Window
	dc.l	GTTX_Text
Line1	dc.l	0		;Addresse du text
	dc.l	GTTX_Border,TRUE
	dc.l	TAG_DONE
GadL2Tags
	dc.l	GTTX_Text
Line2	dc.l	0
	dc.l	GTTX_Border,TRUE
	dc.l	TAG_DONE
GadL3Tags:			;Tags pour ligne 3 de gadget dans Alarme Window
	dc.l	GTTX_Text
Line3	dc.l	0		;Addresse du text
	dc.l	GTTX_Border,TRUE
	dc.l	TAG_DONE
GadL4Tags
	dc.l	GTTX_Text
Line4	dc.l	0
	dc.l	GTTX_Border,TRUE
	dc.l	TAG_DONE
GadL5Tags
	dc.l	GTTX_Text
Line5	dc.l	0
	dc.l	GTTX_Border,TRUE
	dc.l	TAG_DONE
GadOkTags
	dc.l	TAG_DONE
; Tags pour tracer rectangle
BoxTags
;	dc.l	GTBB_Recessed,0
	dc.l	GT_VisualInfo
Boxvi	dc.l	0
	dc.l	TAG_DONE
; Tags de la fenêtre pour le listview
ListViewWind
	dc.l	WA_PubScreen		;open on this public screen
LVscr	dc.l	0
	dc.l	WA_Gadgets		;le gadget
LVGads	dc.l	0
	dc.l	WA_Width,320		;320 de large
	dc.l	WA_Height,150		;150 de haut
	dc.l	WA_IDCMP,BUTTONIDCMP!LISTVIEWIDCMP!IDCMP_REFRESHWINDOW
	dc.l	WA_Title,ChooseScrTxt
	dc.l	WA_DragBar,TRUE
	dc.l	WA_Activate,TRUE
	dc.l	TAG_DONE
	
; Tags NewWindow =  Fenêtre de l'heure
TWTags:
	dc.l	WA_Left
TD_XStart
	dc.l	0
	dc.l	WA_Top,0
	dc.l	WA_Width
TD_Width	dc.l	150
	dc.l	WA_Height
TD_Height	dc.l	11
	dc.l	WA_DetailPen,-1
	dc.l	WA_BlockPen,-1
	dc.l	WA_IDCMP,IDCMP_MOUSEBUTTONS
	dc.l	WA_Title,TD2
	dc.l	WA_DragBar,TRUE
	dc.l	WA_DepthGadget,TRUE
	dc.l	WA_RMBTrap,TRUE
	dc.l	WA_PubScreen
PubScreen	dc.l	NULL		;addresse écran sur lequel on s'installe
	dc.l	TAG_DONE
	
AlTextWTags:			;fenetre alarme avec text
	dc.l	WA_Width,WidthCopyright+40
	dc.l	WA_Height
AlTextWHeight:	dc.l	150
	dc.l	WA_Title,AlarmeTitle
	dc.l	WA_IDCMP,BUTTONIDCMP!IDCMP_REFRESHWINDOW
	dc.l	WA_Activate,TRUE
	dc.l	WA_DragBar,TRUE
	dc.l	WA_PubScreen
screen:	dc.l	0		;l'écran
	dc.l	WA_Gadgets
BaseGad3	dc.l	0	;Gadget
	dc.l	TAG_DONE
AlWindTags:			;fenetre alarme sans texte
	dc.l	WA_Width,WidthCopyright+40
	dc.l	WA_Height
AlWindHeight	dc.l	60
	dc.l	WA_Title,AlarmeTitle
	dc.l	WA_DragBar,TRUE
	dc.l	WA_IDCMP,BUTTONIDCMP!IDCMP_REFRESHWINDOW
	dc.l	WA_Activate,TRUE
	dc.l	WA_PubScreen
screen2	dc.l	0
	dc.l	WA_Gadgets
BaseGad2	dc.l	0		;Gadget
	dc.l	TAG_DONE
DatTime			;structure pour mettre date et heure en txt
	dcb.b	ds_SIZEOF	;une datestamp structure
	dc.b	FORMAT_CDN
	dc.b	0
	dc.l	0,TD2,TD	;date et heure
;
;	
*************
* Variables * (dont la valeur au départ est <> de 0)
*************
;
;

;	SECTION	Variables,DATA
	
;
;ChannelAlloc		dc.b	%00000001	;pour allocation d'un canal
;			dc.b	%00000010
;			dc.b	%00000100
;			dc.b	%00001000
;CAEnd		=	*
;Canal			dc.b	3	;canal pour son



;
;
**********
* Textes *
**********
;
;
	SECTION	Textes,DATA

; Pour version non-enregistré
Money		TXT	<Please send $10 to me for a complete version of ALARMING.>
;
ScreenString	TXT	<PUBSCREEN>	;tool type écran public
EuroDateString	TXT	<EURODATE>	;tool type type de date
AlarmingPort	TXT	<Alarming Port>
ProjectTxt	TXT	Project
AboutTxt	TXT	<About...>		;about the program
QuitText	TXT	Quit			;quit program
ChooseScrTxt	TXT	<Host screen...>	;choose host public screen
ExtraText	TXT	Extra			;extras menu
AddAlarm	TXT	<Add an alarm>		;add an alarm
SubAlarm	TXT	<Delete alarm...>	;un alarme en moins
KeyScrTxt	TXT	C			;equivalent clavier.
AboutKeyTxt	TXT	A
PlusSign	TXT	+			;^^^^^^^^^^ ^^^^^^^.
MinusSign	TXT	-
AlarmingTxt	TXT	Alarming
AboutReqTxt	dc.b	"ALARMING Version ",VERSION,".",REVISION,REVA,$a
		dc.b	"Copyright © 199",YEAR," Philippe Girolami.",$a
		dc.b	"Release date: 20/09/9",YEAR,$a
		dc.b	"---------------**------------------",$a
		dc.b	"Please note this is shareware:",$a
		dc.b	"You are supposed to send me $10US (=FF60)",$a
		dc.b	" Philippe Girolami",$a
		dc.b	" 131 Domaine de Suartello",$a
		dc.b	" 20090 Ajaccio",$a
		dc.b	" FRANCE (Remenber to send it by AIRMAIL!)",$a
		dc.b	"Thank you-Gracias-Merci",0
		even
NotInactiv	dc.b	"To delete current alarm,",$a
		dc.b	" please set it INACTIVE.",0
		even
TooMany		dc.b	"Alarms are currently",$a
		dc.b	"   limited to 19",0
		even
NotEnufAlarms	TXT	<MUST have at least one alarm>
DoItAgain	dc.b	"Could not open the Time Window",$a
		dc.b	" BUT TRYING AGAIN...",0
		even
; Resuming errors
NoMenu		TXT	<Error: Couldn't attach menu strip to window, BUT RESUMING Alarming...> 
GrafErr		TXT	<Error: Couldn't allocate memory for TextExtent, BUT RESUMING Alarming...>
GadErr3		TXT	<Error: Couldn't create GadTools gadget, BUT RESUMING Alarming...>
MemTxt		TXT	<Error: Couldn't allocate enough memory, BUT RESUMING Alarming...>
NoSUWind	TXT	<Error: Couldn't open Set-up Window, BUT RESUMING Alarming...>
NoLVWind	TXT	<Error: Couldn't open window, BUT RESUMING Alarming...>
; Quitting errors
TimerError	TXT	<Error: Couldn't open timer.device, QUITTING...>
TimerIOErr	TXT	<Error: Timer IO error, QUITTING...>
NoUtil		TXT	<Error: Couldn't open utility.library, QUITTING...>
GadToolsOpen	TXT	<Error: Couldn't open gadTools.library, QUITTING...>
NoMsgPort	TXT	<Error: Couldn't create MsgPort, QUITTING...>
DosOpen		TXT	<Error: Couldn't open dos.library, QUITTING...>
GfxOpen		TXT	<Error: Couldn't open graphics.library, QUITTING...>
; misc
ReqName		TXT	<Alarming Error>
ErrGad		TXT	Ok
DeleteOK	TXT	<Delete alarm %2d ?>
DeleteChoices	TXT	<Ok|Cancel>
ReqGadName2	TXT	<Retry|Cancel>
ReqTxt2		TXT	<Can't load Prefs File>
ReqTxt		TXT	<Can't save Prefs File>	;quand erreur sauvegarde
ReqGadNames	TXT	Abandon		;CES GADGET SONT POUR ERREURS
PrefsName	TXT	<ENVARC:Alarming.prefs>	;nom du fichier de sauvegarde
VolName		TXT	<ENVARC:>
AlarmeTitle	TXT	<ALARME-ALARME-ALARME-ALARME-ALARME-ALARME-ALARME-ALARME>
Copyright	dc.b	"   Alarming V",VERSION,".",REVISION,REVA," © 199",YEAR," Philippe Girolami ",0
	even
SUTitle:        dc.b    "Alarming v",VERSION,".",REVISION,REVA," Set-Up Window...",0
	even
ScrTitle	dc.b	"Alarming ",VERSION,".",REVISION,REVA,"  Copyright © 199",YEAR," Philippe Girolami",0
	even
OkText		=	ErrGad
; Gadget Texts
LVGadText	TXT	<Please choose Alarming's host screen...>
L18Text		TXT	<Day:>		;Gadget "Jour"
L17Text		TXT	Cancel
L16Text:	TXT	Save
L15Text:	TXT	<Alarme:>
L14Text:	TXT	<Type  :>
L13Text		TXT	
L12Text		TXT
L11Text		TXT	<Date:>
L10Text:	TXT	<:  >	;permet de mettre les 2 points entre l'heure et les minutes
L9Text:		TXT	<Time:>
L8Text:		TXT	<Flash screens>
L7Text:		TXT	Sound
L6Text:		TXT	Message
L1Text		dc.w	0	;un word pour l'alignement.
L2Text	=	L1Text
L3Text	=	L2Text
L4Text	=	L3Text
L5Text	=	L4Text
TextStr		TXT	<Text (Option)>
; Library names
intname		INTNAME
        even
utilname	UTILITYNAME
	even
timname		TIMERNAME
	even
;audname		AUDIONAME
;	even
dosnam		DOSNAME
	even
iconname	TXT	<icon.library>
gfxnam		TXT	<graphics.library>
GadToolsName:	TXT	<gadtools.library>
FontName:	TXT	<topaz.font>
; Texte dans TimeDateWindow
Longuest	TXT	<77-77-77 77:77>	;Chaine = à TD la plus longue en proportionelle
TD2		dc.b	"JJ/MM/AA "
TD		dc.b	"hh:mm"
Unwanted	dc.b	":ss"	; don't need 0 because we store 0 in Unwanted
		even
; Texte pour gadgets
OptionText:     TXT	Options
HeureFormat:	TXT	<%2ld>		;max 2 chars, décimal
MinuteFormat:	TXT	<%2ld>
DateFormat:	TXT	<%2ld>

; les textes
Inactive	TXT	Inactive
ParJour		TXT	<Once a day>
ParMois		TXT	<Once a month>		;SERONT CENTRES
ParAn		TXT	<Once a year>		;LES TEXTES
Precise		TXT	<A precise date>
ParSem		TXT	<Once a week>		;PAR GADTOOLS

; les textes
Janvier:	TXT	January
Fevrier:	TXT	Feburary
Mars:		TXT	March
Avril		TXT	April
Mai		TXT	May
Juin		TXT	June
Juillet		TXT	July
Aout		TXT	August
Septembre	TXT	Septembre
Octobre		TXT	Octobre
Novembre	TXT	Novembre
Decembre	TXT	Decembre
;texts pour alarme
Un
l	set	1
	rept	9
	dc.b	l+$30,0,0,0	;ici de "1" à "9"
l	set	l+1
	endr
k	set	1
l	set	0
	rept	10
	dc.b	k+$30,l+$30,0,0	;ici de "10" à "19"
l	set	l+1
	endr
	dc.w	0	;au cas ou.
;Text jour semainne
Dim		TXT	Sunday	;Dimanche
Lun		TXT	Monday	;Lundi
Mar		TXT	Tuesday	;Mardi
Mer		TXT	Wednesday	;Mercredi
Jeudi		TXT	Thursday	;Jeudi
Vend		TXT	Friday	;Vendredi
Sam		TXT	Saturday	;Samedi

;
;
*************************************************
* Des blocks pour éviter des allocation mémoire *
* et les 0 inutiles dans le fichier		*
*************************************************
;
;

	SECTION	Vide,BSS


SaveOld			ds.l	1	;sauvegarde de en-dessous NUll sur liste gadget15
WhereSaveOld		ds.l	1	;adresse de SaveOld
MemSize			ds.l	1	;longueur buffer alarme
Choice			ds.w	1	;écran choisi.
ChoosedScreen		ds.l	1	;écran choisi lors du choose...
LVWindHd		ds.l	1	;pointeur sur fenêtre du ListView
ScreenNum		ds.l	1	;nombre de public screens
ArrayLength		ds.l	1	;longueur de la liste d'adresse écran
PubScreenList		ds.l	1	;base de la liste
ScreenArray		ds.l	1	;adresse de toutes les adresses des écrans
NameArray		ds.l	1	;adresse des ad des alloc mem pour noms
LengthArray		ds.l	1	;adresse tableau des longueurs des chaînes.
Length			ds.l	1	;longueur de la denière chaîne testée
MenuAdd			ds.l	1
Sounding		ds.w	1	;dit si un son est en marche en pas.
CH			ds.w	1	;hauteur copyright quand texte
CH2			ds.w	1	;idem sans texte
OH			ds.w	1	;hauteur gad ok quand texte
OH2			ds.w	1	;idem sans texte
ReqIDCMP		ds.l	1	;pour requester d'erreur sauvegarde
_GfxBase		ds.l	1	;addresse de base de grafics.library
_IntuitionBase:		ds.l    1       ;addresse de base de intuition
_GadToolsBase:		ds.l 	1	;addresse de base de GadgetTools
_UtilityBase		ds.l	1	;addresse de Base de la utility library
_TimerBase		ds.l	1	;addresse de Base du timer.device
_DOSBase		ds.l	1	;addresse de Base de la dos.library
FileHd		ds.l	1	;le BCPL du fichier de préférences
ToSave		ds.w	1	;pour savoir si il faut sauvegarder alarmes
Passed?		ds.w	1	;pour savoir si on doit redessiner fenêtre
Statut		ds.w	1	;statut des réglages alarme: modifiés ou pas
AlNbr		ds.w	1	;n° d'alarme affiché ds SetUp
AddedHeight	ds.w	1	;taille de la barre de titre en plus des 8 de Topaz-8
gad:		ds.l	1	;valeur retourné par CreateContext(GadTools)
SUWindHd:       ds.l    1       ;handle fenetre Set_Up
TimeWindHd:     ds.l    1       ;handle de la fenetre-titre
TextExt		ds.l	1	;addresse du TextExtent buffer
Day:            ds.l    1       ;Day for Alarme
IAddress	ds.l	1	;\
Class		ds.l	1	;|	IntuiMessage
Code		ds.w	1	;/
Line1Gad:	ds.l	1	;Addresse gadget ligne 1
Line2Gad:	ds.l	1
Line3Gad	ds.l	1
Line4Gad	ds.l	1
Line5Gad	ds.l	1
Slider1		ds.l	1
Slider2		ds.l	1
Slider3		ds.l	1
Cycle1		ds.l	1
Cycle2		ds.l	1
Cycle3		ds.l	1
Cycle4		ds.l	1	;week gadget (jours semaine)
Integer1	ds.l	1
CheckBox1	ds.l	1
CheckBox2	ds.l	1	;Son supprimé à la version 0.92
CheckBox3	ds.l	1
AutoriseMess	ds.w	1
ActualBuffer	ds.l	1	;Memoire Structure
Mem		ds.l	1	;Idem
TimerMsgPort	ds.l	1
IOTimer		ds.l	1
Digit1		ds.w	1
Digit2		ds.w	1
Digit3		ds.w	1
Digit4		ds.w	1
AlWindHd	ds.l	1	;il faut faire une combine (v plus haut)
TimSign		ds.l	1
WindSign	ds.l	1	
StringLength	ds.l	1	;longueur chaine du nom du programme (TType)
FileName	ds.b	BuffLength

Heure:
	dcb.b	TV_SIZE		;Time_Val structure
	even
Time
	dcb.b	CD_SIZE		;ClockData structure
	even
	
	END

