{"id":7371,"date":"2024-09-03T07:28:22","date_gmt":"2024-09-03T05:28:22","guid":{"rendered":"https:\/\/ceo.oric.org\/?p=7371"},"modified":"2024-09-03T07:28:22","modified_gmt":"2024-09-03T05:28:22","slug":"loresfix-1-0-lores-1-corrige-sur-oric-1","status":"publish","type":"post","link":"https:\/\/oric.bqtt.net\/index.php\/2024\/09\/03\/loresfix-1-0-lores-1-corrige-sur-oric-1\/","title":{"rendered":"LoresFix 1.0: LORES 1 corrig\u00e9 sur Oric-1"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Dans le CEO-Mag 368, Didier se faisait l&#8217;\u00e9cho des tests de Rax sur le mode LORES 1, tr\u00e8s rarement utilis\u00e9. Au passage, il apportait l&#8217;explication sur la diff\u00e9rence entre les caract\u00e8res semi-graphiques sur Oric-1, et sur Atmos: sur Oric-1, ils sont d\u00e9finis sur une matrice de 8&#215;8 pixels, alors que l&#8217;Oric n&#8217;en affiche que 6&#215;8. Ils ont donc un aspect bizarre, d\u00e9centr\u00e9, et Didier en concluait &#8220;on oubliera vite ce jeu de caract\u00e8re dans le cadre d\u2019une utilisation sur Oric-1&#8221;.<br><br>Bien qu&#8217;ayant globalement \u00e9t\u00e9 oubli\u00e9 tout court, j&#8217;ai eu \u00e0 coeur de remettre le mode LORES 1 \u00e0 \u00e9galit\u00e9 entre l&#8217;Oric-1 et l&#8217;Atmos ! Voici donc un modeste programme bricol\u00e9 rapidement, 38 octets ayant pour but de corriger, apr\u00e8s le boot de l&#8217;Oric-1, les caract\u00e8res LORES pour les rendre identiques \u00e0 ceux de l&#8217;Atmos.<br>Cette routine red\u00e9finit simplement les caract\u00e8res LORES en les d\u00e9calant d&#8217;un bit vers la gauche. Elle est relogeable o\u00f9 l&#8217;on veut en RAM. Elle ne modifiera qu&#8217;une fois les caract\u00e8res: s&#8217;il ont d\u00e9j\u00e0 \u00e9t\u00e9 corrig\u00e9s, la lancer ne produira plus d&#8217;effet. Elle peut donc sans risque \u00eatre lanc\u00e9e au d\u00e9but d&#8217;un programme.<br>La red\u00e9finition de caract\u00e8res r\u00e9sistera \u00e0 HIRES\/TEXT, mais pas \u00e0 un reset \u00e0 chaud: il faudra alors lancer \u00e0 nouveau la routine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voici le code:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>AD 08 B9   LDA $B908     Let's control if we already seem to have the right values<br>C9 38      CMP #$38      by testing one<br>F0 1E      BEQ exit      If so, exit!<br>A2 00      LDX #$00      else get ready to change a whole page<br><br>loopB9:<br>BD 00 B9   LDA $B900,X   Load a byte from page $B9<br>F0 06      BEQ nextB9    If $00, nothing to do, skip to next<br>6A         ROR           else shift once to the right<br>29 3F      AND #$3F      then set the two left bytes to 0 ($3F=00111111)<br>9D 00 B9   STA B900,X    and replace the value in RAM<br>nextB9:<br>CA         DEX           Next byte<br>D0 F2      BNE loopB9    As long as X is not zeroed again, loop<br><br>loopBA:<br>BD 00 BA   LDA $BA00,X   X already at 0 here. Load a byte from page $BA<br>F0 06      BEQ nextBA    If $00, nothing to do, skip to next<br>6A         ROR           else shift once to the right<br>29 3F      AND #$3F      then set the two left bytes to 0 ($3F=00111111)<br>9D 00 BA   STA BA00,X    and replace the value in RAM<br>nextBA:<br>CA         DEX           Next byte<br>D0 F2      BNE loopBA    As long as X is not zeroed again, loop<br><br>exit:<br>60         RTS<\/code><br><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><em>(merci \u00e0 ISS qui a relu mon code et supprim\u00e9 deux octets inutiles !)<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">J&#8217;ai red\u00e9couvert apr\u00e8s coup que Mike Brown donnait d\u00e9j\u00e0 exactement cette solution, dans une discussion que nous avions eue en 2019 alors que je m&#8217;\u00e9tonnais de la diff\u00e9rence d&#8217;aspect du mode LORES 1 entre l&#8217;Oric-1 et l&#8217;Atmos. Cf. https:\/\/forum.defence-force.org\/viewtopic.php?t=1981<br>Vous trouverez ci-joint le fichier TAP de LoresFix 1.0, impl\u00e9ment\u00e9 au bas de la page 1 et qui se lance automatiquement.<\/p>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-1eacd7d7-d316-432b-a326-f44107d1fad5\" href=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2024\/09\/LoresFix10-1.tap\">LoresFix10-1<\/a><a href=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2024\/09\/LoresFix10-1.tap\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-1eacd7d7-d316-432b-a326-f44107d1fad5\">T\u00e9l\u00e9charger<\/a><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>In English:<\/strong><br>The goal of Lores Fix is to correct the alternate LORES characters definition, which is wrong on ROM 1.0.<br>What&#8217;s wrong? Well, ROM 1.0 sets those chars on a 8&#215;8 pixels matrix, while Orics actually only display 6&#215;8 pixels on screen. So the chars are not correctly centered.<br>This was corrected in ROM 1.1.<br>So, Lores Fix simply shifts in RAM the default LORES characters by 1 bit to the right, having them centered again. You can run it as much as you want, the chars won&#8217;t shift again if they are at the right value \ud83d\ude09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mise \u00e0 jour 05\/09\/2024<\/strong> :<br>Gr\u00e2ce aux remarques et id\u00e9es d&#8217;ISS et Sodiumlightbaby sur Defence-Force, nous sommes arriv\u00e9s \u00e0 une version bien plus compacte du code, que voici (seulement 16 octets !) :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">  AE 18 B9   LDX $B918      Test if we have a ROM 1.0: value FF in $B918 (3F on ROM 1.1, 7F once shifted on ROM 1.0)<br>  E8         INX            increment by 1 to get 00 if we had FF, thus get ready to change a whole page<br>  D0 09      BNE exit       if result was different from 00, it's not a ROM 1.0 or it was already fixed, so exit!<br><br>loop:<br>  5E 00 B9   LSR $B900,X    shift bytes from page $B9<br>  5E 00 BA   LSR $BA00,X    shift bytes from page $BA<br>  CA         DEX            Next byte<br>  D0 F7      BNE loop       As long as X is not zeroed again, loop<br><br>exit:<br>  60         RTS<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cependant, je me suis rendu compte que lancer ce code sur Oric-1 provoque de gros probl\u00e8mes quand on essaie de rentrer un programme Basic ensuite. Diantre, que se passe-t-il ? Est-ce que cela pourrait avoir un lien avec le HIMEM qui n&#8217;est pas plac\u00e9 au boot de l&#8217;Oric-1 ? Qu&#8217;est-ce qui pourrait donc g\u00eaner le syst\u00e8me, de voir modifi\u00e9es les octets de B900 \u00e0 BAFF ?<br>En r\u00e9alit\u00e9, deux choses se cumulaient:<br>&#8211; sur ROM 1.0, le chargement d&#8217;un bloc m\u00e9moire plante le pointeur &#8220;fin de basic&#8221; en page 0, octets 9C-9D. Ce pointeur de fin prend la valeur de la fin du bloc m\u00e9moire !<br>&#8211; d&#8217;autre part, j&#8217;avais stock\u00e9 la routine en $100 (pile), ce qui semble \u00eatre une mauvaise id\u00e9e quand on reste sur l&#8217;interpr\u00e9teur et qu&#8217;on joue avec le basic: la routine est \u00e9cras\u00e9e. BFE0-BFFF semble plus indiqu\u00e9 !<br><br>Le mieux pour une utilisation sur Oric-1 dans un programme Basic, semble donc \u00eatre une impl\u00e9mentation \u00e0 l&#8217;int\u00e9rieur du Basic, par exemple (en appelant la routine par CALL#BFE0):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> 65 FORI=1TO16<br> 70 READA$:A=VAL(\"#\"+A$):POKE#BFDF+I,A<br> 75 NEXTI<br> 80 DATAAE,18,B9,E8,D0,09,5E,00,B9,5E,00,BA,CA,D0,F7,60<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Dans le CEO-Mag 368, Didier se faisait l&#8217;\u00e9cho des tests de Rax sur le mode LORES 1, tr\u00e8s rarement utilis\u00e9. Au passage, il apportait l&#8217;explication sur la diff\u00e9rence entre les caract\u00e8res semi-graphiques sur Oric-1, et sur Atmos: sur Oric-1, ils sont d\u00e9finis sur une matrice de 8&#215;8 pixels, alors que l&#8217;Oric n&#8217;en affiche que 6&#215;8. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[314,315],"tags":[398,830,864],"class_list":["post-7371","post","type-post","status-publish","format-standard","hentry","category-non-classe","category-oric1","tag-bug","tag-oric-1","tag-rom-1-0"],"_links":{"self":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts\/7371","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=7371"}],"version-history":[{"count":0,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts\/7371\/revisions"}],"wp:attachment":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/media?parent=7371"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/categories?post=7371"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/tags?post=7371"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}