				Clavier et cran
				****************

1 Reprsentation des nombres
****************************

	Par dfaut les nombres sont crits en base dix, mais le FORTH permet
de modifier la base, on peut ainsi utiliser la base 16 (hexadcimale) ou 2
(binaire) ou d'autres plus exotiques (comme la base 13...).

%d  %b  %o  %h
--------------
	Ce ne sont pas  proprement parl des mots FORTH, mais des prfixes
signalant que le nombre  suivre est en base 10 (%d), 2 (%b), 8, (%o) ou 16
(%h). Ceci ne modifie pas la base courante, seul un nombre est concern:
	%d15		\ 15
	%h15		\ 21 (1*16 + 5)
	%o15		\ 13 (1*8 + 5)
	%b1011	\ 11 = 8 + 2 + 1

base
----
	variable sur 4 octets contenant la base courante. La squence:
	base @ .
	affichera toujours 10, puisque quelle que soit la base, elle s'crit 10
dans sa propre base... En effet 2 s'crit 10 en base 2, 23 s'crit 10 en base 23.
Si on dsire avoir la valeur en base 10 on doit spcifier:
	base @ d.
	De mme, si je suis en base 2, la squence 10 base ! me laissera en
base 2 car ici 10 vaut 2. Il faudra donc utiliser:
	%d10 base !
	ou l'un des mots suivants:

bin  hex  decimal
-----------------
	fixe la base  2, 16 ou 10.

	Pour que la base devienne effective en entre, il faut que la squence
d'instructions modifiant la base et le nombre soient spars par un Enter (en
mode direct) ou un >comp sous l'diteur. En cours de programme, le
changement de base est immdiat (avec input notamment).

%f
--
	prfixe indiquant que le nombre  suivre est un rel. Le format est:
	prfixe:	%f
	signe:		- ou + (celui ci est optionnel)
	mantisse:	un nombre  virgule ou non
	exposant:	cette partie est optionnelle, elle se compose de:
			prfixe:	e ou E
			signe:		- ou + (celui-ci est optionnel)
			valeur:	un entier en base 10.


	Par exmple:
		%f-2.36e5	=	-236000
		%f72e-6	=	0.000072
		%f.5		=	0.5

2 Les entres au clavier
************************

input
-----
	attend la frappe au clavier d'un nombre  la position courante du
curseur. Enter met fin  la saisie. Le nombre exprim dans la base courante
est converti en entier et dpos sur la pile.

input$
------
	attend la frappe au clavier d'une chaine de caractres, Enter met fin 
la saisie. La chaine est envoye dans pad dont l'adresse est laisse sur la pile.

expect
------
	chaine  expect  :  affiche le contenu courant de la chaine et permet de
la modifier. La chaine rsultat est range  la mme adresse (l'adresse est
dpile). Utiliser une constante de chaine avec expect est limit puisque sa
taille maximale correspond  sa taille initiale, exemple:
	" D:\*.*" expect	ne permettra l'introduction que de 6 caractres!,
juste de quoi changer le nom du lecteur. Il faut alors utiliser une chaine
normale:
	80 string CHEMIN
	" D:\*.*" CHEMIN $!
	CHEMIN expect	\ on aura jusqu' 80 caractres.

	Pour la saisie de nombres rels, on doit utiliser input$ fval.

key
---
	attend la frappe d'une touche et renvoit un mot contenant dans l'octet
infrieur le code ASCII et dans l'octet suprieur le SCAN CODE.
	key %hff and		\ isole le code ASCII
	key 256 w/		\ isole le SCANCODE
	key 256 w/mod	\ spare les deux (ASCII au sommet).

inkey
-----
	lit le clavier "au vol" et renvoit le code ASCII et le SCANCODE de la
touche appuye ou 0 si aucune touche n'est dtecte. Ici le code ASCII est
dans le mot faible et le SCANCODE dans le mot fort:
	inkey %hff and	\ isole le code ASCII
	inkey 65536 /	\ isole le scancode
	inkey 65536 /mod	\ spare les deux (ASCII au sommet)

?terminal
---------
	renvoit -1 si un caractre est prsent sur le port clavier ou 0 sinon.


3 Les sorties  l'cran

.  f.
-----
	dpile l'entier au sommet de la pile et l'affiche dans la base courante
(pour .) ou le nombre rel (pour f.).

..   f..
--------
	affiche l'entier (..) ou le rel (f..) du sommet de la pile (il reste sur la
pile).

d.  b.  o.  h.
--------------
	forcent l'affichage en base 10, 2, 8 ou 16. La base courante n'est pas
modifie, seul cet affichage est affect.

type
----
	chaine type  :  affiche la chaine.

."  ....."
----------
	affiche la chaine comprise entre ." et ", ceci est plus commode que
type si le message est une constante de chaine, en fait:
	" xxx" type est quivalent  ." xxx"
	Notez l'espace ncessaire entre ." et le premier caractre de la chaine.

space
-----
	affiche un espace  la position courante du curseur.

spaces
------
	n spaces  : affiche n espaces  la position courante du curseur.

cr
--
	saute une ligne et scrolle l'cran si ncessaire.

emit
----
	c  emit  :  affiche le caractre c (les caractres de contrle sont
simplement affichs eux aussi).

cls
---
	vide la page FORTH actuelle et ramne le curseur en haut de l'cran.

4 Les sorties formates
***********************

start
-----
	vide la chaine temporaire pour en prparer une nouvelle. Cette chaine
est comme pad une zone prdtermine de la mmoire.

pushs
-----
	chaine pushs	: ajoute la chaine  droite de la chaine temporaire.


pushv
-----
	x  pushv  :  ajoute le nombre x  droite de la chaine temporaire (il
sera exprim dans la base courante).

pushc
-----
	c  pushc  :  ajoute le caractre c  droite de la chaine temporaire.

display
-------
	affiche  l'cran la chaine temporaire (celle-ci n'est pas vide, elle
peut encore tre raffiche ou mme complte).

getfmt
------
	copie la chaine temporaire dans pad et laisse pad sur la pile. Ceci est
utile lorsque cette chaine est destine  un autre usage que l'affichage 
l'cran.

	Utilisons cette stucture pour sortir la valeurs d'un tableau (array) sur
l'imprimante:

	5 array TABLEAU
	5 0 do
		i dup *
		i TABLEAU !
	loop				\ remplit le tableau avec les carrs des
nombres de 0  4 (0, 1, 4, 9, 16).

	5 0 do
		start			\ nouvelle ligne
		" TABLEAU[" pushs   \ TABLEAU[
		i pushv		\ TABLEAU[i
		" ]=" pushs		\ TABLEAU[i]=
		i TABLEAU @ pushv	\ TABLEAU[i]=i*i
		13 pushc 10 pushc	\ retour chariot et saut de ligne
		getfmt ltype		\ envoit  l'imprimante
	loop

	Il existe une autre srie de mots pour formatter des donnes numriques
(elle permettent l'affichage avec un nombre fixe de chiffres ou mme l'affichage en
virgule fixe):

<#
--
	x <# : vide la chaine temporaire et prpare la valeur x  tre
formatte.

#
-
	effectue la division euclidienne de x par la base courante. Le reste est
converti en un caractre ajout  gauche de la chaine temporaire. Le
quotient vient remplacer x sur la pile.


hold
----
	c  hold  :  ajoute le caractre c  gauche de la chaine temporaire (une
virgule par exemple).

#s
--
	convertit x en chaine et l'ajoute  la chaine temporaire  gauche, 0
remplace x sur la pile.

#>
--
	termine le formatage, dpile x, copie dans pad la chaine temporaire et
laisse pad sur la pile.

#nul_char
---------
	modifie le comportement de # lorsque la valeur sur la pile est nulle,
par dfaut # ajouterait un zro, on peut fixer un autre caractre pour
'combler'  gauche d'un nombre:
	<# 48 #nulchar 	\ le zro
	#			\ extirpe un chiffre au moins
	32 #nul_char		\ un espace pour la suite
	# # # # #		\ sort 5 autres chiffres avec un blanc ds que le
				\ nombre devient nul
	#>
	Evitera l'criture 000231 pour le nombre 231 tout en gardant 6
caractres (facilite la mise en page).

	Supposons qu'on cacule en centimes et qu'on aimerait afficher en francs
(avec donc deux chiffres aprs la virgule), voici la marche  suivre:

	: francs
		<#			\ dmarrage
			#		\ extirpe le chiffre des units de centimes
			#		\ celui des dizaines de centimes
			44 hold	\ ajoute une virgule
			#s		\ le reste est affich devant la virgule
		#> type		\ rcupre la chaine et l'affiche
	;

	4590 	francs	affichera  	45,90
	12	francs	affichera	  0,12

	Supponsons qu'on dsire afficher un nombre binaire sur 16 bits avec tous
ses chiffres (ventuellement des zros devant):

	: 16bits
		<#			\ prpare
		16 ndo # nloop	\ extirpe 16 chiffres
		#> type		\ fin et affichage
	;
	21	16bits		affichera	0000000000010101
	-1	16bits		affichera	1111111111111111