	16 . Apprentissage du Visual Assembleur



Sous la forme de petits exemples de programmes utilisant les 
multiples fonctionnalits du Visual Assembleur, cette section n'a 
pas pour but de vous apprendre l'assembleur, mais son utilisa-
tion au travers du V.A.
Il vous est conseill, pour vos premiers pas dans le V.A d'aller 
jetter un oeil au squelette de base d'une application qui marche 
aussi bien en programme qu'en accessoire : dans VI-
SUAL41\SAMPLES\ACC_APP\. Ceci est un programme mini-
maliste qui ouvre un slecteur et dispose d'une fentre formulai-
re pour son information. Ce sera le programme de base de tous 
les exemples qui vont suive car il est destin  tre employ en 
tant que quick start. C'est lui que nous utilisons tous pour dmar-
rer un projet depuis zro.
Start,  contrario (disponible dans VISUAL41\SAM-
PLES\START\) est un programme non pas complexe, mais utili-
sant toutes les possibilits du V.A, et  ce titre rserv  ceux qui 
voudront, une fois les premiers pas franchis avec succs, aller 
plus loin dans l'utilisation de fonctions pointues. Sachez gale-
ment que c'est le premier programme que nous compilons lors-
que nous ajoutons une nouvelle fonction au V.A (nous concep-
teurs) pour vrifier que rien n'a t cass !
Enfin, pour ceux qui n'ont pas froid aux yeux, le programme 
LOOK est l pour eux (dans VISUAL41\SAMPLES\LOOK\) Le 
programme "LOOK" programm par Benot PERRIN (GEN) est 
une application bien entendu 100 % GEM qui a la particularit 
d'utiliser quasiment toutes les ressources du Visual Assembleur, 
d'tre en multi-formulaire, et surtout d'tre quasiment multi-tche au niveau de sa conception puisque cet diteur de fichiers 
peut ouvrir autant de fentres que de mmoire disponible et faire 
une recherche simultane et diffrente sur chacun des fichiers 
ouverts ! Cela n'a, je vous l'accorderai volontiers, que trs peu 
d'intrt, mais par contre montre avec brillo que le Visual As-
sembleur est l'ultime langage de programmation GEM propre ! 
(non ?)

	Voici, maintenant, et regroupes, par chapitres les explica-
tions destines au "V.A novice". Ces explications sont toujours 
agrmentes d'un exemple qui met en valeur la ou les fonctions 
dveloppes.

	Partie No 1 : vite une application qui marche !

Il me semble intressant au niveau pdagogique de vous pr-
senter, ds le dbut, un projet (certes tout simple pour un "V.A 
master" :  peu prs 38 lignes de codes) qui fonctionne. Il vous 
permettra de raliser votre premier programme en suivant les ex-
plication, ds le commencement de votre apprentissage. Avoir 
tout de suite quelque chose qui "tourne" et qui utilise plein de 
"fonctions sympas" est tout de mme plus motivant.

Voici ce qu je vous propose en concret :

Cahier des charges :
1) un programme 100% GEM qui marche aussi bien en ac-
cessoire qu'en programme indpendant.
2) le programme doit permettre, en ouvrant une unique fe-
ntre d'avoir un formulaire donnant dans deux champs de 
texte l'heure et la date courante. Une sorte de montre nu-
mrique quoi !
3) la fentre en question doit tre fermable, dplacable, na-
mifiable.
4) le formulaire contenu dans la fentre se nommera 
FORM_CLOCK
5) les deux champs de texte feront :
10 caractres de long pour la date "jj/mm/aaaa", son nom 
sera TXT_DATE
8 caractres de long pour l'heure "hh:mm:ss", son nom se-
ra TXT_TIME
6) on utilisera la bibliothque de formatage de l'heure et de 
la date : LIB_TIME_DATE
7) le rafrachissement du contenu de la fentre se fera tou-
tes les deux secondes car de toute faon, le systme n'est 
pas plus prcis que cela !
8) le timer sera en route uniquement lorsque la fentre sera 
ouverte.
9) pour ce faire, on demandera  tre prvenu des vne-
ments suivants :
initialisation gnrale de l'application
ouverture d'accessoire
fermeture d'accessoire
message "app_term" de MiNT
fermeture de fentre
10) Le nom d'enregistrement systme sera "CLOCK_VA" 
et le nom pour la barre des applications : "Clock 1.0".

Il pourra servir pour un utilisateur qui veut avoir une fentre 
en permanence ouverte avec l'heure dedans et pouvoir se servir 
de son panneau de contrle  ct.

Nous allons passer  la ralisation de ce programme, vous 
n'avez qu' suivre pas  pas les diffrentes tapes et vous verrez 
que vous taperez en dfinitive peu de lignes de codes. Le but fi-
nal de cette formation tant, une fois bien assimiles les bases de 
la programmation en V.A, de pouvoir vous concentrer unique-
ment sur le dessin de l'interface et sur votre code personnel sans 
plus vous soucier du systme et de ses bugs.

1) Commencez par recopier le rpertoire ACC_APP qui se 
trouve dans VISUAL41\SAMPLES vers un rpertoire de 
travail. Ce squelette de base correspond au fonctionne-
ment que l'on dsire : aussi bien en accessoire qu'en ap-
plication.
2) renommez tous les fichiers "project.quelquechose" en 
"clock.quelquechose" en conservant l'extension d'origi-
ne.. Renommez aussi le nom du rpertoire de ACC_APP 
vers CLOCK.
3) ditez le fichier "CLOCK.S" et changez dans son entte 
tous les "project.xxx" en "clock.xxx" (adaptez aussi les 
chemins s'il y en a), votre programme doit compiler ! (s'il 
ne compile pas, reportez-vous  la partie installation du 
manuel du V.A)
4) Si vous le lancez, il ne trouvera pas son ressource, pour 
corriger ceci, ditez "clock.obj" et changez les derniers 
"project.rsc" (juste aprs rsc_16_colors) en "clock.rsc", 
adaptez les chemins  votre organisation de disque dur. 
La constante OPT_FULL_PATHNAME dterminera par 
la suite s'il faut utiliser le chemin complet ou juste le nom 
du ressource : le chemin complet est utile en phase de d-
bug, car le ressource n'est pas forcment dans le rpertoi-
re courant. Votre programme doit maintenant se lancer !
5) modifiez encore dans "notes.obj" le contenu en face de 
name_app : et entrez exactement les 8 caractres : 
"CLOCK_VA" (c'est le nom d'enregistrement systme 
pour les appl_search). Puis remplacez les texte "  Project  
" en face de name_acc (c'est le nom pour la barre d'acces-
soires)  par deux espaces puis "Clock 1.0" puis de nou-
veau 2 espaces
Facile juste que l ? Normal : c'est l'effet V.A.
6) On prend maintenant l'ordre classique d'un dveloppe-
ment Visual : on commence par le ressource ! Lancez vo-
tre diteur de ressource et dtruisez tous les arbres sauf : 
FORM_INFORMATION qui nous servira de base, re-
nommez-le FORM_CLOCK.
Rduisez un peu sa taille, et ajoutez-lui 2 champs de texte 
de 10 et 8 caractres. Nommez-les comme dcrit dans le 
cahier des charges. Vous devez avoir  peu prs ceci :
7) Vous avez les douze travaux du manuel du V.A dans les 
mains ? Oui ? Alors vous savez qu'il faut maintenant tirer 
NOTES.H sur le programme H2HS.PRG (dans VI-
SUAL41\MISC\), il vous cre le .HS directement utili-
sable sous assembleur !
8) ditez maintenant CLOCK.DEF pour y inclure LIB_TI-
ME_DATE et LIB_DECI dont a besoin LIB_TIME_DA-
TE.
9) ditez maintenant CLOCK.OBJ, enlevez tout ce qui 
concerne le menu principal (nous n'en avons pas) et 
MDL_RELOCATE_RSC. Enlevez les rfrences  la fe-
ntre fond. Enfin, renommez la fentre d'information qui 
nous servira de base en "objet_fenetre_clock". La seule 
chose qui ne soit pas de l'puration est de dire que le for-
mulaire qui nous servira est FORM_CLOCK ( la ligne 
window_clock_specs:) et que nous dsirons tre avertis 
des vnements de fermeture de la fentre : ajoutez  
START_EVNT_LIST :
dc.w WM_AFTER+WM_CLOSED
dc.l evenement_window_clock_closed

enfin, ditez CLOCK.S, et faites-y les changements qui s'im-
posent pour que :
10)  l'initialisation, si on est un programme et non un ac-
cessoire, on ouvre le fentre.
11) sur un vnement "acc_open", on ouvre aussi le fen-
tre.
12) quand vous ouvrez la fentre, vous initialisez le timer 
 2 secondes = 2000 mili-secondes.
13) si vous recevez un message "acc_close" ou "ap_term" 
de MiNT, alors fermez la fentre et resetez le timer  0 
pour ne plus en avoir du tout !
14) en cas d'vnement timer, recherchez l'adresse de vos 
champs texte, puis remplissez-les avec le rsultat des 
fonctions des librairies de formatage de la date et de 
l'heure. Envoyez ensuite un ordre de redraw sur les deux 
objets texte pour qu'ils soient redessins.
15) c'est tout !

J'espre que vous avez trouv a facile. Le seul vrai travail est 
dans le fichier .RSC et le fichier .S, je vous avais prvenus : 
grce au Visual Assembleur, on se concentre sur son interface et 
sur son code !

Voici le rsultat, pour ceux qui n'auraient pas su tout faire :

		CLOCK.DEF

GWVA_APP_OBJ_STACK_SIZE = 1024
GWVA_MAX_PATH_LENGTH = 128

GWVA_APP_DEP_LIB_VERSION = 4
GWVA_APP_DEP_LIB_MAJOR = 1
GWVA_APP_DEP_LIB_MINOR = 1

MDL_GEM

MDL_EVENTS

MDL_WIND
GWVA_APP_OBJ_MAX_NUMBER_WIND = 1

MDL_WIND_FORM

LIB_DECI
LIB_TIME_DATE

		CLOCK.OBJ

DATA
objet_application:	dc.b %00000000		; FLAGS
		dc.b 0			; STATUS
		dc.l 0			; TSR_SIZE
		dc.l name_app		; REG_NAME
		dc.l name_menu		; ACC_NAME
		dc.l rsc_16_colors		; RSC_INFO
		dc.l 0		; 
BACKGROUND_WIND_PTR
		dc.l 0			; MAIN_MENU_PTR
		dc.l 0			; ALL_ICON_PTR
		dcb.w 10,0			; 
M1FLAG,M1X,M1Y,M1W,M1H,M2FLAG,M2X,M2Y,M2W,M2H
		dc.l 0			; COUNT (TIMER)
		dc.l 
initialisation_personelle	; CUSTOM_INITS
		dc.l ouverture_accessoire	; AC_OPEN
		dc.l fermeture_accessoire	; AC_CLOSE
		dc.l app_term_pour_mint		; AP_TERM
		dc.l 0			; AP_TFAIL
		dc.l 0			; SHUT_COMPLETED
		dc.l 0			; RESCH_COMPLETED
		dc.l 0			; AP_DRAG_DROP
		dc.l 0			; SH_WDRAW
		dc.l 0			; CH_EXIT
		dc.l 0			; ALL_OTHER
		dc.l 0			; EVNT_KEYBD
		dc.l 0			; EVNT_BUTTON
		dc.l 0			; EVNT_MOUSE1
		dc.l 0			; EVNT_MOUSE2
		dc.l evenement_timer		; EVNT_TIMER

name_app:		dc.b 'CLOCK_VA',0
name_menu:		dc.b '  Clock 1.0  ',0

	ifnd OPT_FULL_PATHNAMES
rsc_16_colors:	dc.b 'clock.rsc',0
	else
rsc_16_colors:	dc.b 
'd:\assemble\visual41\samples\tutorial\clock\clock.rsc',0
	endc
even

*--------------------------------------------------------------------------*

objet_fenetre_clock:	dc.l 0			; FATHER_PTR
		dc.l 0			; NEXT_BROTHER_PTR
		dc.l 0			; FIRST_SON_PTR
		dc.w %0000000000011111		; FLAGS
		dc.w 0			; STATUS
		dc.w %0000001100000000		; PROPERTIES
		dc.w 0			; TOPABLE_STATE
		dc.l 
window_clock_name,GWVA_APP_OBJ_COPYRIGHT_MESSAGE	; NAME,INFO
		dc.l 0			; ICON_WIND_PTR
		dc.l 0			; MENU_SPEC_PTR
		dc.w 0			; MENU_HEIGHT
		dc.l 0			; KEY_TABLE
		dc.w -1,0			; FOCUSED_OBJECT,FOCUSED_OBJ_CURSOR_POS

		dc.w 
GWVA_WIN_H_CENTER,GWVA_WIN_V_CENTER	; 
FIRST_DX,FIRST_DY
		dc.w 0,0			; FIRST_W,FIRST_H
		dc.w 0,0			; INTERNAL_MAX_W,INTERNAL_MAX_H

		dc.w -1			; GEM_HANDLE
		dcb.w 4,0			; 
INTERNAL_DX,INTERNAL_DY,INTERNAL_W,INTERNAL_H
		dc.w 0,0,0,0		; 
SLIDER_V_POS,SLIDER_V_SIZE,SLIDER_H_POS,SLIDER_H_SIZE
		dcb.w 2,0		; 
CONTENTS_DX,CONTENTS_DY

		dc.w GWVA_WIND_TYPE_FORM	; TYPE
		dc.l window_clock_specs		; SPEC_PTR
		dcb.l 2,0		; 
USER_PTR1,USER_PTR2

		dc.w WM_AFTER+WM_CLOSED		; START_EVNT_LIST
		dc.l 
evenement_window_clock_closed

		dc.w -1

window_clock_specs:	dc.w FORM_CLOCK		; FORM_IDX
		dc.l 0			; FORM_PTR
		dc.l 0			; CLICK_ROUTINE
		dcb.w 6,0			; 
L_SCULPT,T_SCULPT,R_SCULPT,B_SCULPT,W_SCULPT,H_SCULPT
		dc.w 0			; IS_CLONE_FORM
		dc.l 0			; CLONE_FORM_SAVE
		dc.l 0			; CLONE_MAIN_PTR

		dc.w -1			; START_OBJ_LIST

window_clock_name:	dc.b '... Clock in V.A ...',0
even

		CLOCK.S

	output 
d:\assemble\visual41\samples\tutorial\clock\clock.acx

OPT_FULL_PATHNAMES
*OPT_DEBUG_IN_ACCESSORY_MODE
*OPT_DEBUG

	lea objet_application,a1

	include clock.def
	include visual41.s
	include clock.hs
	include clock.obj

	comment HEAD=7
	section TEXT

;---------------------------------------------------------------------------
	; Exemple de programme Visual Assembleur 
4.1
	; Proprit : marche aussi bien en 
accessoire qu'en programme

	; Ce programme est un exemple de pendule 
numrique
	; qui se raffraichit touets les 2 
secondes.

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

initialisation_personelle:
	tst GWVA_APP_OBJ_IS_ACC_PRG
	bne.s 
je_suis_lance_en_tant_que_programme

	rts

je_suis_lance_en_tant_que_programme:
ouverture_accessoire:
	lea objet_fenetre_clock,a0
	bsr 
GWVA_WIND_OBJ_PRG_CREATE_OPEN_ONE_WIND

	; mise a jour toutes les secondes
	move.l 
#2000,objet_application+GWVA_APP_OBJ_COUNT
	rts

evenement_timer:
	move #FORM_CLOCK,d0
	move #TXT_TIME,d1
	bsr RETURN_TEXT_OBJ_IN_FORM_OBJ_PTR
	; j'ai ici dans a1 un pointeur sur le 
texte du champs TXT_TIME
	bsr GWVA_GET_FORMATED_TIME	; 
a1=ptr destination : "19:20:00"
	; je le remplis avec l'heure courante : 
bibliothque visual qui prend a1 en entre

	move #FORM_CLOCK,d0
	move #TXT_DATE,d1
	bsr RETURN_TEXT_OBJ_IN_FORM_OBJ_PTR
	; j'ai ici dans a1 un pointeur sur le 
texte du champs TXT_DATE
	bsr GWVA_GET_FORMATED_DATE	; 
a1=ptr destination : "29/06/1995"
	; je le remplis avec la date courante : 
bibliothque visual qui prend a1 en entre

	; je demande de redessiner une liste 
d'objets (d2=3)
	lea objet_fenetre_clock,a0
	lea liste_objets_a_redessiner,a1
	move.w #3,d2		; 
intrieur de la fentre
	bsr GWVA_FORM_WIND_OBJ_PRG_REDRAW_PART

	rts

evenement_window_clock_closed:
app_term_pour_mint:
fermeture_accessoire:
	; plus aucun vnement timer !!
	clr.l 
objet_application+GWVA_APP_OBJ_COUNT
	
	; il ne faut jamais sortir rlement si 
on est un ACCESSOIRE !!
	tst GWVA_APP_OBJ_IS_ACC_PRG
	bne VISUAL40_END

	rts

	section DATA

liste_objets_a_redessiner:
	dc.w TXT_TIME,1
	dc.w TXT_DATE,1
	dc.w -1

END

	Partie No 2 : amliorations significatives du programme 
CLOCK

	Partie No 3 : une application un peu plus complexe : 
NOTES

