Salut,
Je vous propose à mon tour un bricolage mais logiciel pour rester dans mon domaine.
Après avoir fait un petit logiciel de dessin pour me remettre dans le bain et jouer avec le crayon optique, j'ai voulu afficher une photo.
Bon déjà, les limitations sont nombreuses : une seule couleur par ligne de 8 pixels, limitation mémoire des listings BASIC et des données en RAM. Mais si on tient compte de toutes ces limitations, on peut générer un listing qui contient les données de la photo au format 40*200 (qui sera « étiré » en 320*200) et la routine d'affichage.
C'est ce que j'ai fait en Python, le langage que j'utilise aujourd'hui que j'en ai fait mon métier. Vous pardonnez la qualité du code pour un bricolage vite fait pour épater les enfants à qui je fais découvrir cette machine.
Code : Tout sélectionner
import sys
END = "\r\n"
def h2line(filename, output):
output.write("1 CLS:SCREEN7,0,0")
output.write(END)
with open(filename) as fp:
for lineno, line in enumerate(fp.readlines(), 2):
output.write(str(lineno))
output.write(" DATA ")
output.write(line.strip().rstrip(','))
output.write(END)
for lineno, line in enumerate((
" FOR Y=0 TO 191",
" FOR X=0 TO 319 STEP 8",
" READ C",
" LINE(X,Y)-(X+8,Y),C",
" NEXT X",
" NEXT Y",
" LINE INPUT A$",
), lineno):
output.write(str(lineno))
output.write(line)
output.write(END)
if __name__ == '__main__':
h2line(sys.argv[1], sys.stdout)
Pour générer le fichier source, j'ouvre la photo dans Gimp, je la réduis en 320x200 pour garder les proportions, puis 40x200 puis je la passe en mode indexé avec la palette de couleurs du MO5. L'astuce est d'exporter la photo au format « En-tête C (.h) » qui me génère déjà toute la liste des codes couleur. Je n'ai qu'à effacer ce qui ne m'intéresse pas dans le fichier.
Le listing en sortie ressemble à ceci (j'ai élidé pour la lisibilité) :
Code : Tout sélectionner
1 CLS:SCREEN7,0,0
2 DATA 0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12
3 DATA 0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12
4 DATA 0,12,0,12,0,12,0,12
[...]
601 DATA 0,0,0,0,0,0,0,0
601 FOR Y=0 TO 191
602 FOR X=0 TO 319 STEP 8
603 READ C
604 LINE(X,Y)-(X+8,Y),C
605 NEXT X
606 NEXT Y
607 LINE INPUT A$
Il est possible de rendre le listing plus compact en codant deux « pixels » dans un seul nombre, vu que chaque couleur occupe au maximum 4 bits. Peut-être même quatre mais j'avais eu des erreurs en testant.
Pour une future version, je pense stocker une version compressée de l'image, peut-être même un format plus courant comme BMP ou PNG et écrire la routine de décodage du format.