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

1 Repr‚sentation des nombres
****************************

	Par d‚faut les nombres sont ‚crits en base dix, mais le FORTH permet
de modifier la base, on peut ainsi utiliser la base 16 (hexad‚cimale) 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 pr‚fixes
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 s‚quence:
	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 d‚sire avoir la valeur en base 10 on doit sp‚cifier:
	base @ d.
	De mˆme, si je suis en base 2, la s‚quence 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 entr‚e, il faut que la s‚quence
d'instructions modifiant la base et le nombre soient s‚par‚s par un Enter (en
mode direct) ou un >comp sous l'‚diteur. En cours de programme, le
changement de base est imm‚diat (avec input notamment).

%f
--
	pr‚fixe indiquant que le nombre … suivre est un r‚el. Le format est:
	pr‚fixe:	%f
	signe:		- ou + (celui ci est optionnel)
	mantisse:	un nombre … virgule ou non
	exposant:	cette partie est optionnelle, elle se compose de:
			pr‚fixe:	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 entr‚es 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 d‚pos‚ sur la pile.

input$
------
	attend la frappe au clavier d'une chaine de caractŠres, Enter met fin …
la saisie. La chaine est envoy‚e dans pad dont l'adresse est laiss‚e sur la pile.

expect
------
	chaine  expect  :  affiche le contenu courant de la chaine et permet de
la modifier. La chaine r‚sultat est rang‚e … la mˆme adresse (l'adresse est
d‚pil‚e). 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 caractŠres!,
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 caractŠres.

	Pour la saisie de nombres r‚els, on doit utiliser input$ fval.

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

inkey
-----
	lit le clavier "au vol" et renvoit le code ASCII et le SCANCODE de la
touche appuy‚e ou 0 si aucune touche n'est d‚tect‚e. 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	\ s‚pare les deux (ASCII au sommet)

?terminal
---------
	renvoit -1 si un caractŠre est pr‚sent sur le port clavier ou 0 sinon.


3 Les sorties … l'‚cran

.  f.
-----
	d‚pile l'entier au sommet de la pile et l'affiche dans la base courante
(pour .) ou le nombre r‚el (pour f.).

..   f..
--------
	affiche l'entier (..) ou le r‚el (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
modifi‚e, 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 n‚cessaire entre ." et le premier caractŠre 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 n‚cessaire.

emit
----
	c  emit  :  affiche le caractŠre c (les caractŠres de contr“le sont
simplement affich‚s eux aussi).

cls
---
	vide la page FORTH actuelle et ramŠne le curseur en haut de l'‚cran.

4 Les sorties format‚es
***********************

start
-----
	vide la chaine temporaire pour en pr‚parer une nouvelle. Cette chaine
est comme pad une zone pr‚d‚termin‚e de la m‚moire.

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 caractŠre c … droite de la chaine temporaire.

display
-------
	affiche … l'‚cran la chaine temporaire (celle-ci n'est pas vid‚e, elle
peut encore ˆtre r‚affich‚e ou mˆme compl‚t‚e).

getfmt
------
	copie la chaine temporaire dans pad et laisse pad sur la pile. Ceci est
utile lorsque cette chaine est destin‚e … 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 carr‚s 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 s‚rie de mots pour formatter des donn‚es num‚riques
(elle permettent l'affichage avec un nombre fixe de chiffres ou mˆme l'affichage en
virgule fixe):

<#
--
	x <# : vide la chaine temporaire et pr‚pare la valeur x … ˆtre
formatt‚e.

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


hold
----
	c  hold  :  ajoute le caractŠre 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, d‚pile 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 d‚faut # ajouterait un z‚ro, on peut fixer un autre caractŠre pour
'combler' … gauche d'un nombre:
	<# 48 #nulchar 	\ le z‚ro
	#			\ extirpe un chiffre au moins
	32 #nul_char		\ un espace pour la suite
	# # # # #		\ sort 5 autres chiffres avec un blanc dŠs que le
				\ nombre devient nul
	#>
	Evitera l'‚criture 000231 pour le nombre 231 tout en gardant 6
caractŠres (facilite la mise en page).

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

	: francs
		<#			\ d‚marrage
			#		\ extirpe le chiffre des unit‚s de centimes
			#		\ celui des dizaines de centimes
			44 hold	\ ajoute une virgule
			#s		\ le reste est affich‚ devant la virgule
		#> type		\ r‚cupŠre la chaine et l'affiche
	;

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

	Supponsons qu'on d‚sire afficher un nombre binaire sur 16 bits avec tous
ses chiffres (‚ventuellement des z‚ros devant):

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