{"id":3094,"date":"2020-03-27T17:51:27","date_gmt":"2020-03-27T16:51:27","guid":{"rendered":"https:\/\/ceo.oric.org\/?p=3094"},"modified":"2020-03-27T17:51:27","modified_gmt":"2020-03-27T16:51:27","slug":"print-et-plot-en-mode-hires","status":"publish","type":"post","link":"https:\/\/oric.bqtt.net\/index.php\/2020\/03\/27\/print-et-plot-en-mode-hires\/","title":{"rendered":"PRINT@ et PLOT en mode HIRES"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>par Andr\u00e9 C.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> Les commandes PRINT@ et PLOT sont rejet\u00e9es en mode HIRES. On obtient le message d&#8217;erreur &#8220;<em>?DISP TYPE MISMATCH ERROR<\/em>&#8220;. C&#8217;est une limitation tr\u00e8s f\u00e2cheuse pour utiliser la zone TEXT du bas de l&#8217;\u00e9cran ! Et c&#8217;est un probl\u00e8me qui me titille depuis des ann\u00e9es.<br> Pour d\u00e9velopper un jeu en mode HIRES, j&#8217;avais besoin d&#8217;exploiter <em>les 3 lignes de la zone TEXT<\/em> pour y afficher certains param\u00e8tres de l&#8217;\u00e9volution du jeu (messages, score etc.) et il fallait trouver une solution.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Etat des lieux<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"> En mode HIRES, la zone TEXT fonctionne comme l&#8217;\u00e9cran TEXT normal (mais h\u00e9las avec quelques limitations). Si les num\u00e9ros de colonnes restent inchang\u00e9s (<em>X va de 0 \u00e0 39<\/em>), par contre, les num\u00e9ros de lignes sont restreints (<em>Y va de 1 \u00e0 3<\/em>). En mode HIRES, on peut observer ces valeurs en suivant le contenu des variables #0268 (num\u00e9ro de ligne du curseur TEXT) et #0269 (num\u00e9ro de colonne du curseur TEXT). Mais \u00e0 quoi cela peut-il servir puisque les commandes PRINT@X,Y; et PLOTX,Y sont prohib\u00e9es? C&#8217;est ce que nous allons voir.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Pour la petite anecdote<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"> Il existe en RAM, entre la zone \u00e9cran HIRES et la zone \u00e9cran TEXT, une zone m\u00e9moire de 40 octets, inutilis\u00e9e \u00e0 l&#8217;\u00e9cran, qui pourrait  correspondre \u00e0 une ligne num\u00e9ro z\u00e9ro (une sorte de ligne service inutilis\u00e9e). Il s&#8217;agit peut-\u00eatre d&#8217;un r\u00e9sidu de d\u00e9veloppement. Notons sur le plan pratique, qu&#8217;avec une routine appropri\u00e9e, il serait possible de scroller la zone TEXT d&#8217;une ligne vers le haut (c&#8217;est \u00e0 dire cacher la ligne num\u00e9ro 1 en vue de la r\u00e9cup\u00e9rer ult\u00e9rieurement). Tout autre usage est \u00e9galement \u00e0 recommander (par exemple stockage de variables ou d&#8217;un bout de code en langage machine). Comme en mode TEXT, le scrolling de l&#8217;\u00e9cran vers le haut n&#8217;affecte pas cette &#8220;ligne 0&#8221;.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Revenons \u00e0 nos moutons<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"> Que faire pour afficher s\u00e9lectivement au point X,Y ? Il n&#8217;y a pas 36000 solutions. <strong>Soit<\/strong> on arrive \u00e0 repositionner le curseur en X,Y et le PRINT suivant se fera \u00e0 partir de ce point. <strong>Soit<\/strong> on calcule l&#8217;adresse en RAM correspondant  \u00e0 ce point X,Y et on y POKE le code Ascii souhait\u00e9.<br> La zone texte commence en #BF68. La formule est donc <em>AD=#BF40+(#28*Y)+X <\/em> avec <em>Y de 1 \u00e0 3<\/em> et <em>X de 0 \u00e0 39<\/em>. Mais le probl\u00e8me n&#8217;est pas l\u00e0. Pour afficher une cha\u00eene de caract\u00e8re, il faudra d\u00e9couper celle-ci avec la commande MID$ et en POKEr tous les code Ascii un \u00e0 un. Idem pour les nombres qu&#8217;il faut d&#8217;abord transformer en chaine de caract\u00e8res. Vous pouvez imaginer la lenteur de l&#8217;affichage !<br> Reste donc la commande PRINT qui a la particularit\u00e9 d&#8217;afficher au curseur. Le probl\u00e8me est \u00e9l\u00e9mentaire mon cher Watson, <em>il suffit de repositionner le curseur<\/em>. En quelque sorte, la commande PRINT@X,Y; est scind\u00e9e en deux :<br> 1) positionner le curseur en X,Y <br> 2) envoyer un PRINT.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Positionner le curseur sur une ligne Y<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"> Je me suis demand\u00e9 s&#8217;il ne serait pas possible de forcer la variable #0268 avec les valeurs  1, 2 ou 3 \u00e0 l&#8217;aide d&#8217;un POKE. Zut, \u00e7a ne marche pas : l&#8217;affichage commence syst\u00e9matiquement sur la premi\u00e8re ligne. Divers autres essais ne se sont pas r\u00e9v\u00e9l\u00e9s plus heureux.<br> A la r\u00e9flexion, ce n&#8217;est pas grave, car il suffit d&#8217;un PRINT pour passer \u00e0 la ligne suivante et comme il n&#8217;y a que 3 lignes, c&#8217;est vite fait. Cette solution serait bien trop lourde en mode TEXT o\u00f9 il faudrait r\u00e9p\u00e9ter 26 fois la commande PRINT pour placer le curseur sur la derni\u00e8re ligne !<br> Je rappelle en passant  que PRINT&#8221;&#8221; (cha\u00eene vide) ne fait rien sinon passer \u00e0 la ligne suivante et que PRINT&#8221;&#8221;; ne fait absolument rien (sinon valider des variables du syst\u00e8me, mais c&#8217;est un autre sujet).<br> Il est utile de se rappeler que la commande CLS nettoie la zone TEXT et repositionne le curseur au d\u00e9but de la premi\u00e8re ligne. Elle peut \u00eatre utilis\u00e9e \u00e0 tout moment, alors que les commandes PAPER et INK doivent \u00eatre plac\u00e9es avant la commande HIRES si on veut affecter la zone TEXT. Sinon, elles affectent la zone HIRES.<br> Attention, la zone TEXT est scroll\u00e9e exactement comme en mode TEXT, mais comme ici on ne dispose que de 3 lignes, les infos fichent rapidement le camp vers le haut, notamment lors du retour au Ready. Seule solution pour contr\u00f4ler \u00e7a : <em>Utiliser un&#8221;;&#8221; \u00e0 la fin des commandes PRINT.<\/em><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Positionner le curseur sur une colonne X<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Et que faut-il faire pour afficher \u00e0 un endroit sp\u00e9cifique  sur la ligne ? <br> Ecartons tout de suite l&#8217;utilisation d&#8217;espaces pour atteindre la case cibl\u00e9e, car ces espaces \u00e9crasent les informations situ\u00e9es \u00e0 gauche de cette case.<br> On pourrait  \u00e9videmment remplacer ces espaces par des codes Ascii 9 (d\u00e9placement \u00e0 droite). Mais imaginez-vous en train d&#8217;\u00e9crire <em>PRINT CHR$(9) CHR$(9) CHR$(9) CHR$(9) CHR$(9) CHR$(9) CHR$(9) CHR$(9) CHR$(9)CHR$(9) CHR$(9) CHR$(9) CHR$(9) CHR$(9) CHR$(9) CHR$(9) CHR$(9) CHR$(9)&#8221;OK&#8221;<\/em> seulement pour afficher &#8220;OK&#8221; au milieu de la ligne !<br> J&#8217;ai donc repris l&#8217;\u00e9tude des variables du syst\u00e8me.<br> En page z\u00e9ro, l&#8217;adresse #30 contient la position du curseur sur la ligne TEXT, mais la commande POKE#30,X ne modifie pas l&#8217;affichage.<br> En page 2, la variable #0253 contient le num\u00e9ro de la premi\u00e8re colonne valide (et donc  0 ou 2), mais la commande POKE#0253,X ne modifie pas l&#8217;affichage. De toute fa\u00e7on, il me semblait farfelu de toucher \u00e0 ce param\u00e8tre qui g\u00e8re les 2 colonnes prot\u00e9g\u00e9es.<br> Apr\u00e8s le #0268 qui n&#8217;avait pas march\u00e9, il me semblait peu probable que modifier la variable #0269 (num\u00e9ro de colonne du curseur TEXT de 0 \u00e0 39) donne des r\u00e9sultats. Mais j&#8217;ai quand m\u00eame test\u00e9.<br> Divine surprise, un <em>POKE#0269,10:PRINT&#8221;OK&#8221;<\/em> affiche bien &#8220;OK&#8221; \u00e0 la position X=10 de la premi\u00e8re ligne de la zone TEXT. Un <em>POKE#0269,12:PRINT&#8221;OK&#8221;<\/em> envoie le &#8220;OK&#8221; sur la deuxi\u00e8me ligne. Enfin, avec un <em>POKE#0269,14:PRINT&#8221;OK&#8221;<strong>;<\/strong><\/em> on voit appara\u00eetre le hoquet sur la troisi\u00e8me ligne (<em>attention \u00e0 ne pas oublier le &#8220;;&#8221; final<\/em>). Ceci est illustr\u00e9 par la recopie du bas de l&#8217;\u00e9cran ci-dessous et le programme correspondant.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/03\/SCREEN32.png\" alt=\"\" class=\"wp-image-3095\"\/><figcaption>Affichage contr\u00f4l\u00e9 dans la zone TEXT en mode HIRES<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/03\/SCREEN33.png\" alt=\"\" class=\"wp-image-3096\"\/><figcaption>Et le bout de programme qui permet de faire \u00e7a&#8230;<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dernier point sensible, cette m\u00e9thode ne permet pas la mise \u00e0 jour automatique de l&#8217;affichage du curseur TEXT et mes essais laissent tra\u00eener des curseurs fant\u00f4mes\u2026 Il est donc imp\u00e9ratif de bloquer l&#8217;affichage du curseur en pla\u00e7ant la commande suivante :<br><em>POKE#26A,(PEEK(#26A)AND#FE):PRINT&#8221;&#8221;:&#8217; CURSEUR TEXT OFF<\/em> dans le programme Basic, <em>juste apr\u00e8s la commande HIRES.<\/em><br> NB. Cette commande \u00e9teint le curseur quelle que soit son statut ant\u00e9rieur, alors que : <em>POKE#26A,(PEEK(#26A)OR#01):PRINT&#8221;&#8221;:&#8217; CURSEUR TEXT ON<\/em> allume le curseur \u00e0 coup s\u00fbr (dans un programme Basic complexe, l&#8217;utilisation r\u00e9p\u00e9t\u00e9e de la bascule PRINTCHR$(17) c&#8217;est-\u00e0-dire contr\u00f4le + Q est vite difficile \u00e0 g\u00e9rer, car on ne sait plus o\u00f9 on en est).<br> La recopie du bas de l&#8217;\u00e9cran ci-dessous et le programme correspondant donnent un exemple concret de <strong>pseudo PRINT@ en mode HIRES !<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/03\/SCREEN27.png\" alt=\"\" class=\"wp-image-3097\"\/><figcaption>Exemple d&#8217;application en situation r\u00e9elle<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/03\/SCREEN29.png\" alt=\"\" class=\"wp-image-3098\"\/><figcaption>Et le bout de programme qui permet de faire \u00e7a&#8230;<\/figcaption><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">En conclusion<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">N&#8217;importe laquelle des 120 cases de la zone TEXT est adressable individuellement. En fait, pas la 124e, qui n&#8217;est accessible qu&#8217;avec un POKE#BFDF,code Ascii sous peine de d\u00e9clencher un scrolling.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Coule, je vais pouvoir retourner au d\u00e9veloppent de mon jeu\u2026<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En mode HIRES, n&#8217;importe laquelle des 120 cases de la zone TEXT est adressable individuellement.<\/p>\n","protected":false},"author":1,"featured_media":3097,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[338,347,348,22,317],"tags":[668],"class_list":["post-3094","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-338","category-atmos","category-basic","category-ceomag","category-programmation","tag-ceomag359"],"_links":{"self":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts\/3094","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/comments?post=3094"}],"version-history":[{"count":0,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts\/3094\/revisions"}],"wp:attachment":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/media?parent=3094"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/categories?post=3094"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/tags?post=3094"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}