{"id":631,"date":"2019-05-17T14:59:17","date_gmt":"2019-05-17T12:59:17","guid":{"rendered":"https:\/\/ceobeta.oric.org\/?p=631"},"modified":"2019-05-17T14:59:17","modified_gmt":"2019-05-17T12:59:17","slug":"chargement-cassette-rapide-novalight-par-simon","status":"publish","type":"post","link":"https:\/\/oric.bqtt.net\/index.php\/2019\/05\/17\/chargement-cassette-rapide-novalight-par-simon\/","title":{"rendered":"Chargement cassette rapide: Novalight par Simon"},"content":{"rendered":"<p><strong>&nbsp;<\/strong><em>Depuis l&#8217;av\u00e8nement des fichiers WAV, l&#8217;Oric a connu plusieurs nouveaux modes de chargement cassette acc\u00e9l\u00e9r\u00e9s: TAP2CD, F16, &#8230; En voici un petit nouveau, dont la gestation m&#8217;aura bien occup\u00e9 !<\/em><\/p>\n<p>Je vous pr\u00e9sente <em>Novalight<\/em>, qui se veut le mode de chargement cassette Oric le plus rapide \u00e0 ce jour de f\u00e9vrier 2019. Son nom a \u00e9t\u00e9 choisi en hommage \u00e0 deux regrett\u00e9s disparus. Twilighte tout d\u2019abord, qui a programm\u00e9 tant d&#8217;outils, jeux et d\u00e9mos pour Oric, en essayant souvent de garder ses jeux Oric compatibles avec le format cassette. Paul Woakes ensuite, un non-Oricien disparu en 2017. Il a \u00e9t\u00e9 le co-fondateur de la soci\u00e9t\u00e9 de jeux vid\u00e9o Novagen, auteur de l&#8217;excellente s\u00e9rie Mercenary, et cr\u00e9ateur de NovaLoad sur Commodore 64&#8230; NovaLoad \u00e9tant pr\u00e9cis\u00e9ment un mode de chargement cassette rapide, tr\u00e8s r\u00e9pandu \u00e0 l&#8217;\u00e9poque !<\/p>\n<p>Tout est parti au d\u00e9but sur une id\u00e9e de compresser le signal cassette au niveau des bits (plut\u00f4t qu&#8217;au niveau des octets). Apr\u00e8s des simulations sur 5 ou 6 fa\u00e7ons de faire, il est apparu que la plus r\u00e9guli\u00e8rement efficace est celle&#8230; Qu&#8217;utilisait d\u00e9j\u00e0 TAP2CD de Fabrice ! Novalight doit donc son \u00e9pine dorsale \u00e0 TAP2CD: il lui emprunte cette &#8220;compression&#8221;, ainsi qu&#8217;un principe de fonctionnement par interruptions, indispensable pour analyser suffisamment finement la dur\u00e9e des sinuso\u00efdes du signal audio. J&#8217;aurais presque pu l&#8217;appeler &#8220;TAP2CD2&#8221; ! C\u00f4t\u00e9 outil PC, Novalight est un d\u00e9riv\u00e9 direct (mais bien modifi\u00e9) des outils existants comme TAP2WAV.<\/p>\n<p>Fabrice a apport\u00e9, comme toujours, un soutien r\u00e9gulier; il est fort probable que sans son aide le projet n&#8217;aurait pas vu le jour. Il me faut remercier \u00e9galement les Oriciens sur les forums Oric.org et Defence-Force.com, qui ont pris de leur temps pour tester diverses beta-versions et donner des conseils.<\/p>\n<p><strong>Quelles diff\u00e9rences entre TAP2CD, F16 et Novalight ?<\/strong><\/p>\n<p>Commen\u00e7ons \u00e0 situer entre eux les chargements &#8220;turbo&#8221; existants. On pourrait les hi\u00e9rarchiser ainsi:<\/p>\n<p>&#8211; F16: le plus lent des trois, il a l&#8217;avantage d&#8217;acc\u00e9l\u00e9rer les chargements pour tous les Oric (Oric-1 et Atmos), et ne n\u00e9cessite aucun loader ! C&#8217;est en fait une optimisation du signal audio pour les routines existantes en ROM.<\/p>\n<p>&#8211; TAP2CD: tr\u00e8s, tr\u00e8s rapide, TAP2CD n\u00e9cessite une ROM 1.1. Il utilise un loader et sera tr\u00e8s fiable \u00e0 partir du moment o\u00f9 votre liaison audio est de bonne qualit\u00e9<\/p>\n<p>&#8211; Novalight: reprend les principes de TAP2CD, mais en les poussant aux limites quasi-maximum et en ajoutant une compatibilit\u00e9 ROM 1.0. Il sera donc plus rapide que TAP2CD, mais au d\u00e9triment de la fiabilit\u00e9: il faut une connexion audio et un player de WAV d&#8217;excellente qualit\u00e9 (Audacity ?), et certains Oric au hardware un peu fatigu\u00e9, malgr\u00e9 tout, ne seront pas compatibles. A noter que Novalight gagne un peu de temps sur le chargement de son loader&#8230; En utilisant le format F16 puis en se chargeant en partie lui-m\u00eame au format Novalight \ud83d\ude09<\/p>\n<p>Novalight va se loger en page 1, sous la pile, et laisse assez peu de place \u00e0 cette derni\u00e8re: 54 octets. Attention \u00e0 l&#8217;utilisation dans un programme donc, \u00e9viter de faire trop d&#8217;appels \u00e0 des sous-programmes !<\/p>\n<p><strong> <img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-733\" src=\"https:\/\/ceobeta.oric.org\/wp-content\/uploads\/2019\/05\/articles\/simon\/article_1.2a_Byte_size_detail-300x83.png\" alt=\"\" width=\"651\" height=\"180\"><br \/>\n<\/strong><\/p>\n<p><strong>Comparatif des vitesses Loader + Programme<\/strong><\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"149\"><\/td>\n<td width=\"78\"><strong>slow<\/strong><\/td>\n<td width=\"103\"><strong>Fast standard<\/strong><\/td>\n<td width=\"83\"><strong>F16<\/strong><\/td>\n<td width=\"84\"><strong>TAP2CD<\/strong><\/td>\n<td width=\"84\"><strong>Novalight<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"149\"><strong>Zorgon&nbsp; (37K)<\/strong><\/td>\n<td width=\"78\">?<\/td>\n<td width=\"103\">4min 26s<\/td>\n<td width=\"83\">2min 38s<\/td>\n<td width=\"84\">31s<\/td>\n<td width=\"84\">15s<\/td>\n<\/tr>\n<tr>\n<td width=\"149\"><strong>Xenon-1 (37K)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/strong><\/td>\n<td width=\"78\">28min<\/td>\n<td width=\"103\">4min 15s<\/td>\n<td width=\"83\">2min 31s<\/td>\n<td width=\"84\">32s<\/td>\n<td width=\"84\">12s<\/td>\n<\/tr>\n<tr>\n<td width=\"149\"><strong>Acheron&#8217;s Rage (43K)<\/strong><\/td>\n<td width=\"78\">32min<\/td>\n<td width=\"103\">5min 12s<\/td>\n<td width=\"83\">3min 12s<\/td>\n<td width=\"84\">40s<\/td>\n<td width=\"84\">12s<\/td>\n<\/tr>\n<tr>\n<td width=\"149\"><strong>Oricium (46K)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/strong><\/td>\n<td width=\"78\">?<\/td>\n<td width=\"103\">5min 31s<\/td>\n<td width=\"83\">3min 27s<\/td>\n<td width=\"84\">48s<\/td>\n<td width=\"84\">18s<\/td>\n<\/tr>\n<tr>\n<td width=\"149\"><strong>Voilier (Hires &#8211; 8K)<\/strong><\/td>\n<td width=\"78\">6min<\/td>\n<td width=\"103\">56s<\/td>\n<td width=\"83\">34s<\/td>\n<td width=\"84\">8s<\/td>\n<td width=\"84\">3s<\/td>\n<\/tr>\n<tr>\n<td width=\"149\"><strong>Cercle (Hires &#8211; 8K)<\/strong><\/td>\n<td width=\"78\">?<\/td>\n<td width=\"103\">1min 03s<\/td>\n<td width=\"83\">42s<\/td>\n<td width=\"84\">11s<\/td>\n<td width=\"84\">2s<\/td>\n<\/tr>\n<tr>\n<td width=\"149\"><strong>Ecran TEXT (1K)<\/strong><\/td>\n<td width=\"78\">?<\/td>\n<td width=\"103\">10s<\/td>\n<td width=\"83\">6.5s<\/td>\n<td width=\"84\">5s<\/td>\n<td width=\"84\">1.5s<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>En d\u00e9tail, les modifications et ajouts par rapport \u00e0 TAP2CD<\/strong><\/p>\n<p>&#8211; les p\u00e9riodes de base servant \u00e0 encoder 2 bits dans le signal (fichier WAV), sont pass\u00e9es de 4, 6, 8, 10 samples, \u00e0 3, 4, 5 et 6 samples. Cela a sans doute \u00e9t\u00e9 le travail le plus difficile: bien souvent ces dur\u00e9es raccourcies n&#8217;\u00e9taient pas correctement reconnues par les Oric, dont certains prenaient l&#8217;une pour l&#8217;autre. Il a fallu tester toutes formes de sinuso\u00efdes pour voir laquelle permettait au mieux \u00e0 un maximum d&#8217;Oric de distinguer correctement ces quatre dur\u00e9es. Au final quelques Oric avec un VIA fatigu\u00e9 n&#8217;arriveront jamais \u00e0 d\u00e9coder correctement ce signal. C&#8217;est LA limite de Novalight, TAP2CD sera plus fiable \u00e0 ce niveau.<\/p>\n<p>&#8211; des statistiques ont \u00e9t\u00e9 effectu\u00e9es et ont montr\u00e9 que dans les programmes Oric, on utilise environ 60% de bits \u00e0 0, et 40% de bits \u00e0 1. La p\u00e9riode la plus courte a donc \u00e9t\u00e9 utilis\u00e9e en priorit\u00e9 pour encoder &#8220;00&#8221;, alors que dans TAP2CD elle servait pour &#8220;11&#8221;. Le gain ne sera pas syst\u00e9matique, il s&#8217;agit vraiment d&#8217;une statistique&#8230;<\/p>\n<p>&#8211; une compression RLE a \u00e9t\u00e9 ajout\u00e9e: si un octet est r\u00e9p\u00e9t\u00e9 plusieurs fois \u00e0 la suite, il n&#8217;est encod\u00e9 qu&#8217;une seule fois, et sera suivi par le nombre de r\u00e9p\u00e9titions. Dans le signal, un octet r\u00e9p\u00e9t\u00e9 N fois se traduit donc par cet octet, suivi de (N-1) sinuso\u00efdes de 3 samples, puis une derni\u00e8re sinuso\u00efde de 4 samples qui marque la derni\u00e8re r\u00e9p\u00e9tition (et leur fin donc).<\/p>\n<p>&#8211; cr\u00e9ation de dictionnaires: avant de cr\u00e9er le signal, le fichier TAP est analys\u00e9 et on rep\u00e8re les octets non r\u00e9p\u00e9t\u00e9s (\u00e9chappant \u00e0 la compression RLE donc), qui occupent la plus grande place dans le signal. Les 14 octets avec le plus grand nombre d&#8217;occurrences sont plac\u00e9s dans deux tableaux de 7 octets chacun, charg\u00e9s en page 2 avec l&#8217;en-t\u00eate du programme. Les octets de chaque dictionnaire b\u00e9n\u00e9ficieront d&#8217;un encodage particulier, plus rapide qu&#8217;un octet normal: une seule sinuso\u00efde de 3 \u00e0 9 samples.<\/p>\n<p>&#8211; les bits de stop ont \u00e9t\u00e9 supprim\u00e9s, l&#8217;Oric travaille pendant le bit de start. Et ce bit de start devient porteur d&#8217;information: s&#8217;il dure 5 samples, ce qui suit est un octet normal. 6 ou 7 samples, c&#8217;est un octet \u00e0 chercher dans un des deux dictionnaires. Enfin 8 samples: ce qui suit est une r\u00e9p\u00e9tition d&#8217;octet (RLE). Pourquoi pas moins de 5 samples ? Parce que c&#8217;est pendant cette dur\u00e9e que l&#8217;Oric assemble les bits et met en m\u00e9moire l&#8217;octet pr\u00e9c\u00e9dent. Il faut quand m\u00eame lui laisser ces 115 microsecondes pour cela; on pourrait donc dire que les bits de stop ne sont pas vraiment supprim\u00e9s, mais regroup\u00e9s avec le bit de start \ud83d\ude09<\/p>\n<table width=\"100%\">\n<tbody>\n<tr>\n<td>ROM 1.0: l&#8217;horrible bug d&#8217;affichage du Loading en HIRES n&#8217;affectera plus les \u00e9crans que vous chargerez !<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Si on arrivait \u00e0 faire en sorte que l&#8217;Oric travaille plus vite, on pourrait raccourcir ce bit de stop. Mais le code a \u00e9t\u00e9 tordu dans tous les sens pour minimiser les sauts et autres &#8220;pertes de temps&#8221;. Au final quand d\u00e9filent les bits, l&#8217;Oric doit, dans toutes les situations, travailler en moins de 69\u00b5s (3 samples, p\u00e9riode la plus courte pour encoder &#8220;00&#8221;) pour \u00eatre certain de ne pas rater une information; et en fin d&#8217;octet, pour assembler en plus l&#8217;octet et le placer en m\u00e9moire, travailler donc en moins de 115\u00b5s.<\/p>\n<p>&#8211; pour son loader, Novalight utilise le format F16 plut\u00f4t que le format standard, ce qui fait gagner environ 1 seconde. Ensuite il inverse la valeur des bits, pour encoder des 1 (plus courts) \u00e0 la place des 0 (plus nombreux); gain environ 10% de temps. Enfin le loader Novalight est d\u00e9coup\u00e9 en morceaux: un &#8220;noyau&#8221; charg\u00e9 en vitesse F16, qui peut charger le reste de son code \u00e0 la vitesse Novalight sans compression, sous forme de banques. Chaque banque contient le code n\u00e9cessaire au moment voulu (compression, fin de programme, etc.).<\/p>\n<p>&#8211; Ce syst\u00e8me de banques permet de gagner de l&#8217;espace m\u00e9moire, suffisamment pour permettre de rendre Novalight compatible Oric-1 et Atmos<\/p>\n<p>&#8211; En bonus, le chargement des \u00e9crans Hires n&#8217;est plus ab\u00eem\u00e9 sur Oric-1 par l&#8217;affichage de &#8220;Loading&#8221; au beau milieu du dessin. Le CLOAD de la ROM va commencer par afficher ce bug, mais il sera effac\u00e9 par l&#8217;\u00e9cran charg\u00e9, lequel ne sera ensuite plus alt\u00e9r\u00e9 \u00e0 la fin du chargement.<\/p>\n<p><strong>Mise au point<\/strong><\/p>\n<p>La mise au point de Novalight s&#8217;est \u00e9tal\u00e9e sur plusieurs ann\u00e9es, non sans difficult\u00e9s. Le principe est le suivant: quand une sinuso\u00efde se pr\u00e9sente, le VIA (6522) d\u00e9tecte un signal (front montant), et envoie une interruption \u00e0 l&#8217;Oric. Lors du front montant suivant, l&#8217;Oric calcule le temps \u00e9coul\u00e9 entre ces deux sinuso\u00efdes. Cette dur\u00e9e est compar\u00e9e \u00e0 des seuils (des bornes, donc) qui lui permettent de d\u00e9terminer si la sinuso\u00efde valait 3, 4, 5 samples (etc.). Probl\u00e8me&nbsp;: la valeur de cette dur\u00e9e, mesur\u00e9e par l&#8217;Oric, diff\u00e8re l\u00e9g\u00e8rement d&#8217;une machine \u00e0 l&#8217;autre. Et donc les seuils \u00e0 utiliser pour l&#8217;encadrer diff\u00e8rent aussi un peu selon chaque Oric.<\/p>\n<p>Ainsi le programme, s&#8217;il veut tourner sur tous les Oric, devrait soit g\u00e9rer ces variations (autocalibration: test sur la machine et adaptation des seuils), soit utiliser des valeurs qui seront communes \u00e0 tous les Oric et Atmos. La calibration n\u00e9cessitant trop de temps d&#8217;ex\u00e9cution et de place dans le programme, il a fallu \u00e9tudier le cas d&#8217;un maximum de machines pour tenter de d\u00e9terminer des seuils moyens, communs \u00e0 tous. J&#8217;ai pu tester r\u00e9guli\u00e8rement Novalight sur 3 \u00e0 10 machines, plus l&#8217;aide ponctuelle de testeurs sur les forums Oric ou par email, sur 4 ou 5 autres machines. Sur les 10 r\u00e9guli\u00e8res, seule une machine est r\u00e9calcitrante, il faut dire qu&#8217;elle ne doit pas \u00eatre en forme: m\u00eame avec des seuils personnalis\u00e9s, elle n&#8217;est pas capable de distinguer \u00e0 chaque coup entre 3 et 4 samples. Deux autres machines n\u00e9cessitent un volume sonore minimal pour fonctionner, les autres un volume maximal. Comme d&#8217;habitude donc, le volume semble \u00eatre un param\u00e8tre essentiel et al\u00e9atoire d&#8217;une machine \u00e0 l&#8217;autre !<\/p>\n<table width=\"100%\">\n<tbody>\n<tr>\n<td><em>La difficile recherche des seuils communs \u00e0 plusieurs Oric et aux \u00e9mulateurs, en fonction des formes d&#8217;ondes.<\/em><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h1>Compatibilit\u00e9 ROM 1.0<\/h1>\n<p>Initialement, Novalight ne fonctionne que sur ROM 1.1, avec un loader de 218 octets. Impossible de faire l&#8217;\u00e9quivalent sur ROM 1.0, programm\u00e9e de fa\u00e7on moins modulaire que la ROM 1.1. Il aurait fallu reproduire de longs morceaux de la ROM, ce qui aurait pris trop d&#8217;octets.<\/p>\n<p>L&#8217;id\u00e9e est donc venue petit \u00e0 petit: cr\u00e9er un &#8220;noyau&#8221; Novalight, permettant, sur toute ROM, de charger \u00e0 vitesse acc\u00e9l\u00e9r\u00e9e mais sans toutes les options (compression et dictionnaires absents); puis des &#8220;banques&#8221; (de 40 \u00e0 60 octets) chargeant des morceaux de code \u00e0 ex\u00e9cuter ensuite. Au final Novalight utilise un noyau charg\u00e9 en 2 parties, et 4 banques. La place ainsi gagn\u00e9e a permis d&#8217;\u00e9crire du code compatible Oric-1 et Atmos !<\/p>\n<p>L&#8217;avantage &#8220;bonus&#8221; est que le loader initial est plus court, donc plus rapide \u00e0 charger. Les banques se chargeant \u00e0 vitesse &#8220;Novalight r\u00e9duite&#8221; sont beaucoup plus rapides \u00e0 charger. Au final, le loader se charge en moins de 0,7 seconde. Le revers de la m\u00e9daille est pour les programmes en plusieurs parties: il faut recharger le loader \u00e0 chaque fois, car les banques \u00e9crasent le code initial.<\/p>\n<p>Le fichier WAV sera donc construit avec une succession de programmes \u00e0 charger:<\/p>\n<p>Loader (vitesse standard ou F16): initialisations du VIA, des interruptions, et chargement de la suite du loader<\/p>\n<p>Suite du loader contenant les instructions de chargement des banques&nbsp; (vitesse Novalight &#8220;lente&#8221;)<\/p>\n<p>En-t\u00eate du programme (vitesse Novalight &#8220;lente&#8221;)<\/p>\n<p>Banque 2 (vitesse Novalight &#8220;lente&#8221;): affichage Loading etc., et chargement de la suite<\/p>\n<p>Banque 3 (vitesse Novalight &#8220;lente&#8221;): chargement de la compression RLE et des dictionnaires Novalight<\/p>\n<p>Programme (vitesse Novalight maximale)<\/p>\n<p>Banque 4 (vitesse Novalight &#8220;lente&#8221;): r\u00e9initialisation du VIA, des interruptions, lancement du programme charg\u00e9<\/p>\n<p>Afin de garder un peu de&nbsp; flexibilit\u00e9, une option existe dans Novalight pour utiliser l&#8217;ancien loader: ROM 1.1 uniquement, mais il n&#8217;est pas utile de le recharger \u00e0 chaque fois. Cela peut \u00eatre utile, par exemple, pour faire des slide-shows ou des animations.<\/p>\n<p><strong>La surprise Oric<\/strong><\/p>\n<p>Les tests ont \u00e9t\u00e9 l&#8217;occasion d&#8217;avoir une petite surprise.<\/p>\n<table width=\"100%\">\n<tbody>\n<tr>\n<td>\n<h2>C\u2019\u00e9tait presque \u00e7a&nbsp;! Try again\u2026<\/h2>\n<p><em>&nbsp;<\/em><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Pour \u00eatre tr\u00e8s rapide, une des id\u00e9es de Novalight est que l&#8217;Oric doit rester synchronis\u00e9 avec le signal audio du d\u00e9but \u00e0 la fin. Le signal audio num\u00e9rique se d\u00e9roulant \u00e0 vitesse parfaitement constante, il &#8220;suffit&#8221; que l&#8217;Oric travaille assez vite pour lire les informations et les traiter avant de lire l&#8217;information suivante&#8230; Il se trouve que sur un Atmos particulier, j&#8217;avais des erreurs, d&#8217;abord prises pour des erreurs de calibration des seuils. Mais rien n&#8217;y faisait&#8230; La conclusion a fini par s&#8217;imposer: le traitement du dictionnaire \u00e9tait un peu long, et passait sur certains Atmos, mais pas sur celui-ci quand il \u00e9tait appel\u00e9 plus de 3 fois de suite ! Il \u00e9tait donc ex\u00e9cut\u00e9 plus lentement, trop lentement ! Et d\u00e9phasait doucement le signal audio et l&#8217;Atmos, qui finissait par perdre une information. Autrement dit, et \u00e7a a \u00e9t\u00e9 ma surprise: tous les Oric ne travaillent pas exactement \u00e0 la m\u00eame vitesse !<\/p>\n<p>En r\u00e9duisant un peu la dur\u00e9e de traitement du dictionnaire, tout est rentr\u00e9 dans l&#8217;ordre&#8230; Comprendre le probl\u00e8me aura pris plusieurs jours !<\/p>\n<p><strong>La surprise PC<\/strong><\/p>\n<p>Autre surprise sur laquelle je me suis arrach\u00e9 les cheveux&#8230; Le PC (sous Windows XP), au bout d&#8217;un certain temps de fonctionnement, ne semble plus g\u00e9n\u00e9rer un signal audio aussi propre qu&#8217;apr\u00e8s le boot ! Un de mes Oric en prend ombrage et ne charge plus les programmes, alors que tout va bien sur les autres&#8230;<\/p>\n<p>En cas de doute, appliquez la r\u00e8gle universelle: rebootez l&#8217;ordi qui lit le WAV !<\/p>\n<p><strong>Utilisation<\/strong><\/p>\n<p>En ligne de commande&nbsp;: Novalight [ -option1 ] [ -option2 ] &lt;.TAP ficher en entr\u00e9e&gt; &lt;.WAV fichier en sortie&gt;<\/p>\n<p>Il existe bien entendu des options:<\/p>\n<p><strong>-s<\/strong>&nbsp; &#8216;standard speed&#8217;: utiliser la vitesse standard au lieu de la vitesse F16 pour le loader (plus lent, mais certains Oric supporteraient mal la vitesse F16 ?)<\/p>\n<p><strong>-o<\/strong>&nbsp; &#8216;old loader&#8217;: utiliser l&#8217;ancien loader ROM 1.1-seulement au lieu du nouveau compatible 1.0\/1.1. L&#8217;ancien a un avantage: il peut \u00eatre charg\u00e9 une seule fois, puis appel\u00e9 plusieurs fois par un CALL#100, tant qu&#8217;il reste intact bien s\u00fbr. Vous pourrez ainsi charger plusieurs programmes ou \u00e9crans sauv\u00e9s au format Novalight sans loader. Mais adieu la ROM 1.0 donc.<\/p>\n<p><strong>-n<\/strong>&nbsp; &#8216;no loader&#8217;: g\u00e9n\u00e8re les WAV Novalight sans y ajouter de loader. Il vous faudra charger un &#8216;old loader&#8217; d&#8217;abord puis utiliser CALL#100 pour charger chaque WAV ainsi constitu\u00e9. ROM 1.1 seulement.<\/p>\n<p><strong>-p<\/strong>&nbsp; &#8216;long pause&#8217;: g\u00e9n\u00e8re un silence de plusieurs secondes apr\u00e8s chaque programme sur le WAV. Raison ? Les programmes ERE Informatique, par exemple, n\u00e9cessitent du temps pour dessiner l&#8217;\u00e9cran de chargement; c&#8217;est dommage si le WAV d\u00e9marre avant que l&#8217;Oric ait fini son dessin&#8230;<\/p>\n<p>Novalight affichera, pour chaque programme converti, le dictionnaire utilis\u00e9 pour la compression, ainsi que des statistiques de compression. Vous verrez que certains programmes y sont peu propices, alors qu&#8217;un \u00e9cran HIRES presque vide sera quasi-totalement compress\u00e9, et donc tr\u00e8s, tr\u00e8s rapide \u00e0 charger.<\/p>\n<p><em>&nbsp;<\/em><\/p>\n<h1>O\u00f9 trouver Novalight<\/h1>\n<p>Vous devriez trouver Novalight sur la disquette du magazine \u00e0 t\u00e9l\u00e9charger. Y sont inclus des sources; C pour le programme MS-DOS, et assembleur pour le loader Oric. Attention toutefois, ce n&#8217;est pas normalis\u00e9 et je n&#8217;ai rien nettoy\u00e9, ne soyez pas surpris\u2026 Mon assembleur est autodidacte et donc plein d&#8217;astuces r\u00e9dactionnelles perso, et je vois surtout ces fichiers comme des brouillons desquels il aurait \u00e9t\u00e9 dommage d&#8217;effacer certaines id\u00e9es. Le C n\u00e9anmoins, devrait compiler comme il faut !<\/p>\n<p>Un petit fichier mp3 est aussi l\u00e0 pour l&#8217;anecdote: quand une id\u00e9e arrivait subitement, je m&#8217;enregistrais pour ne pas l&#8217;oublier, tout en esp\u00e9rant l&#8217;exposer clairement pour qu&#8217;\u00e0 la r\u00e9\u00e9coute, elle reste compr\u00e9hensible ! J&#8217;ignore si \u00e7a peut \u00eatre rigolo \u00e0 \u00e9couter, ou si ce sera totalement p\u00e9nible, \u00e0 vous de me dire si vous en avez le courage \ud83d\ude09<\/p>\n<p>Il est aussi possible de r\u00e9cup\u00e9rer Novalight avec les autres outils cassette de Fabrice:<\/p>\n<p><a href=\"https:\/\/sourceforge.net\/projects\/euphorictools\/files\/Tape%20tools\/\">https:\/\/sourceforge.net\/projects\/euphorictools\/files\/Tape%20tools\/<\/a><\/p>\n<table width=\"100%\">\n<tbody>\n<tr>\n<td><em>Zorgons Revenge \u00e0 la moulinette Novalight: un seul programme, moyennement compress\u00e9.<\/em><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>N&#8217;oubliez pas les imp\u00e9ratifs:<\/strong><\/p>\n<p>&#8211; liaison audio au top, et aucune perturbation audio pendant la lecture (t\u00e9l\u00e9phone sans fil, sons sur l&#8217;ordi qui joue le WAV, Wifi ?, &#8230;)<\/p>\n<p>&#8211; ne surtout pas modifier le WAV ou le convertir dans un autre format: chaque sample compte<\/p>\n<p>&#8211; lecteur de WAV \u00e0 44kHz, au top (la moindre approximation, et c&#8217;est l&#8217;\u00e9chec)<\/p>\n<p>&#8211; il reste la possibilit\u00e9 que votre Oric ne soit pas compatible<\/p>\n<h1>Snif, la fin !<\/h1>\n<p>J&#8217;esp\u00e8re que vous pourrez profiter de Novalight sur vos Oric-1 et vos Atmos. C&#8217;est pour moi la fin d&#8217;un long projet passionnant, de plusieurs ann\u00e9es, \u00e0 cr\u00e9er des outils pour faire des mesures, des statistiques, \u00e0 r\u00e9fl\u00e9chir \u00e0 la compression, \u00e0 r\u00e9duire la taille du code, \u00e0 l&#8217;acc\u00e9l\u00e9rer, \u00e0 \u00e9changer avec les Oriciens, \u2026 Et j&#8217;esp\u00e8re qu&#8217;un jour quelqu&#8217;un fera mieux \u2013 plus rapide ou plus fiable, voire les deux !<\/p>\n<table width=\"100%\">\n<tbody>\n<tr>\n<td><em>Tests de signal sur l&#8217;Atmos de Chema, d\u00e9but 2018.<\/em><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Merci pour leur aide, tests et conseil, \u00e0\u2026<\/strong><\/p>\n<p>Fabrice, FredV60, Musepat, Kenneth, Dom50, Voyageur, Oric1-Atmos, Froggy, Godzil, DrPsy, ISS, Chema, Dbug, NekoNoNiaow.<\/p>\n<p><strong>Annexe 1: s\u00e9quence de chargement du loader Novalight dans la pile, puis du programme.<\/strong><\/p>\n<p><strong>Annexe 2: Format du WAV, et s\u00e9quence de chargement du loader Novalight, puis du programme.<\/strong><\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"133\"><strong>Codage WAV<\/strong><\/td>\n<td width=\"565\"><strong>Contenu loader normal<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"133\">3000 samples<\/td>\n<td width=\"565\">Silence d&#8217;intro, au cas o\u00f9 un player &#8220;mange&#8221; le d\u00e9but du signal. 0,07s.<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">F16<\/td>\n<td width=\"565\">30 octets de synchro (surtout pour la m\u00eame raison que le silence qui pr\u00e9c\u00e8de)<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">F16<\/td>\n<td width=\"565\">header et nom de programme = au nom du programme dans le .TAP<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">100*3 samples<\/td>\n<td width=\"565\">Gap: bits de stop pour laisser le temps \u00e0 l&#8217;Oric de travailler<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">F16<\/td>\n<td width=\"565\">$13E-14A &#8211; 13 octets: code pour inverser les bits des octets qui suivent<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">F16, bits invers\u00e9s<\/td>\n<td width=\"565\">$14B-$1BD &#8211; Common Area 1 et d\u00e9codage de base Novalight (sans dictionnaire ni compression RLE)<\/p>\n<p>115 octets, inverser les bits permet de gagner 10% de temps (les 0 \u00e9tant encod\u00e9s plus lentement que les 1 en F16)<\/p>\n<p>D\u00e9tail:<\/p>\n<p>$14E-$14F: saut pour ex\u00e9cuter la &#8220;Common Area 1&#8221;<\/p>\n<p>$150-$15C: interruption de lecture du signal<\/p>\n<p>$15D-$18F: d\u00e9codage d&#8217;un octet Novalight &#8220;normal&#8221; (non compress\u00e9 RLE, et hors dictionnaire)<\/p>\n<p>$190-$1C0: &#8220;Common Area 1&#8221;: initialisation du VIA, mise en place de l&#8217;interruption Novalight, chargement de la &#8220;Common Area 0&#8221;<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">500 samples<\/td>\n<td width=\"565\">Silence pour s\u00e9parer les programmes (purement visuel). 0,0115 secondes. R\u00e9duire cette dur\u00e9e affecte la compatibilit\u00e9 Euphoric.<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">100*3 samples<\/td>\n<td width=\"565\">Synchro Novalight<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">Novaligth &#8220;basique&#8221; (sans compression RLE ni dictionnaire), octets invers\u00e9s<\/td>\n<td width=\"565\">$100-$14C &#8211; Common Area 0<\/p>\n<p>77 octets, du dernier au premier (permet au code de chargement d&#8217;\u00eatre plus compact). A noter: \u00e9crase la partie pr\u00e9c\u00e9dente $141-$14F, devenue inutile.<\/p>\n<p>D\u00e9tail:<\/p>\n<p>$100-$117: chargement du header (et du dictionnaire) du programme \u00e0 charger<\/p>\n<p>$118-$120: chargement et ex\u00e9cution de la &#8220;Common Area 2&#8221; (affichage du Loading, gestion du Hires et du bug de la ROM 1.0)<\/p>\n<p>$121-$128: chargement de la &#8220;Common Area 3&#8221; (gestion de la compression RLE et du dictionnaire Novalight)<\/p>\n<p>$129-13A: chargement du program principal, 100% Novalight<\/p>\n<p>$13B-$145: chargement et ex\u00e9cution de la &#8220;Common Area 4&#8221; (restauration des interruptions et du VIA, lancement du programme charg\u00e9)<\/p>\n<p>$146-$14F: sous-programme de chargement des &#8220;Common Area&#8221;<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">30*3 samples<\/td>\n<td width=\"565\">Petit gap<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">Novaligth &#8220;basique&#8221;<\/td>\n<td width=\"565\">30 octets de synchro ($16)<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">Novaligth &#8220;basique&#8221;, octets invers\u00e9s<\/td>\n<td width=\"565\">$292-$2BF &#8211; En-t\u00eate du programme + dictionnaire<\/p>\n<p>46 octets, du dernier au premier (permet au code de chargement d&#8217;\u00eatre plus compact).<\/p>\n<p>Contient les infos du programme \u00e0 charger (header classique) + les dictionnaires de 14 octets les plus r\u00e9p\u00e9t\u00e9s dans le programme (pour la compression)<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">Novaligth &#8220;basique&#8221;, octets invers\u00e9s<\/td>\n<td width=\"565\">$18D-$1BA &#8211; Common Area 2<\/p>\n<p>46 octets, du dernier au premier (permet au code de chargement d&#8217;\u00eatre plus compact).<\/p>\n<p>D\u00e9tail:<\/p>\n<p>Affichage du Loading, gestion du Hires et du bug de la ROM 1.0: si l&#8217;\u00e9cran est en Hires, on n&#8217;affiche pas le Loading, et on \u00e9vite ainsi une ligne avec des points blancs.<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">100*3 samples<\/td>\n<td width=\"565\">Synchro Novalight<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">Novaligth &#8220;basique&#8221;, octets invers\u00e9s<\/td>\n<td width=\"565\">$18D-$1C9 &#8211; Common Area 3<\/p>\n<p>61 octets, du dernier au premier (permet au code de chargement d&#8217;\u00eatre plus compact).<\/p>\n<p>D\u00e9tail:<\/p>\n<p>$190-$1BB: d\u00e9codage d&#8217;un octet du dictionnaire<\/p>\n<p>$1BC-$1CD: d\u00e9codage d&#8217;octets compress\u00e9s RLE<\/td>\n<\/tr>\n<tr>\n<td width=\"133\"><strong>Novalight<\/strong><\/td>\n<td width=\"565\"><strong>Programme \u00e0 charger (fichier TAP), \u00e0 vitesse maxi ! <\/strong>(avec compression RLE et dictionnaire).<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">2*9 samples<\/td>\n<td width=\"565\"><strong>Marqueur de fin de programme<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"133\">100*3 samples<\/td>\n<td width=\"565\">Synchro Novalight<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">Novaligth &#8220;basique&#8221;, octets invers\u00e9s<\/td>\n<td width=\"565\">$18D-$1C4 &#8211; Common Area 4<\/p>\n<p>56 octets, du dernier au premier (permet au code de chargement d&#8217;\u00eatre plus compact).<\/p>\n<p>D\u00e9tail:<\/p>\n<p>Restauration des interruptions et du VIA, lancement du programme charg\u00e9.<\/td>\n<\/tr>\n<tr>\n<td width=\"133\">2*3 samples<\/td>\n<td width=\"565\"><strong>Pour terminer la synchro Novalight<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"133\">15000 samples<\/td>\n<td width=\"565\">Silence de fin, au cas o\u00f9 un player &#8220;mange&#8221; la fin du signal.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp;Depuis l&#8217;av\u00e8nement des fichiers WAV, l&#8217;Oric a connu plusieurs nouveaux modes de chargement cassette acc\u00e9l\u00e9r\u00e9s: TAP2CD, F16, &#8230; En voici un petit nouveau, dont la gestation m&#8217;aura bien occup\u00e9 ! Je vous pr\u00e9sente Novalight, qui se veut le mode de chargement cassette Oric le plus rapide \u00e0 ce jour de f\u00e9vrier 2019. Son nom a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":722,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[318],"tags":[655,797],"class_list":["post-631","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software","tag-ceomag348","tag-k7"],"_links":{"self":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts\/631","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=631"}],"version-history":[{"count":0,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts\/631\/revisions"}],"wp:attachment":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/media?parent=631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/categories?post=631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/tags?post=631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}