Bonjour à tous,
Sur l'invitation de Didier_v je viens découvrir ce fabuleux forum, je ne pensais pas qu'il y avait encore autant d'activité autour de cette petite machine, ça fait plaisir. Je m'appelle Claire, j'ai eu mon premier Oric à 15 ans et 40 ans plus tard je viens d'en acheter un nouveau par nostalgie et le premier étant malheureusement perdu à jamais... Depuis janvier je me suis dit que ça serait sympa de me faire un petit lecteur de carte SD. Alors je sais bien qu'il existe plusieurs modèles, j'ai d'ailleurs acheté un Erebus que je trouve incroyablement rapide, j'avais jamais vu ça à l'époque, je n'avais pas les moyens de m'acheter un lecteur de disquettes alors je faisais avec le bon vieux magnétophone à cassette. J'avais envie de faire quelque chose qui se rapproche de l'expérience que j'avais vécu avec l'Oric mais en plus moderne et surtout qui puisse enregistrer des programmes.
Mon projet est bien avancé, il fonctionne, on peut lire les fichiers TAP et aussi sauvegarder les programmes toujours au format TAP avec seulement les instructions CLOAD et CSAVE. Il se connecte sur le port cassette, il a une prise USB C pour l'alimentation et tiendra dans un petit boitier de environ 3*7 cm. L'utilisation est simple on tape CLOAD" et on obtient le directory de la carte SD, on peut changer de répertoire et on peut théoriquement lire toutes sortes de carte sd en fat 16 ou 32. on peut sélectionner un fichier manuellement avant de faire cload, il suffit de taper la commande ? suivie du nom du programme ex: CSAVE"?TEST" (faire new avant sinon on envoie tout le prg en mémoire ou alors utiliser la fonction STORE) cette fonction va indiquer à la carte qu'on veut lire le fichier TEST.TAP, il suffit ensuite de taper CLOAD"" et l'Oric va lire le programme TEST.TAP
Pour sauvegarder on tape simplement CSAVE"TEST" et le programme sera transféré sur la carte SD avec le nom TEST.TAP
J'ai encore des fonctions que je souhaite ajouter comme la possibilité d'envoyer des données par le port série de l'esp32 ou d'autres petites choses. On pourrait imaginer aussi une option comme l'excellent projet Novalight qui permettrait d'accélérer les transferts mais bon là ça se complique.
Pour faire ce projet j'ai utilisé un esp32 que j'ai programmé en C++, tout cela était nouveau pour moi et j'ai dû aussi décrypter le protocole de communication de l'Oric sur le port cassette avec ses petites subtilités, d'ailleurs je n'ai pas encore compris pourquoi certains jeux comme Driver par exemple provoquent des erreurs, j'ai vu que les anciens éditeurs de jeux utilisaient des astuces contre le piratage, on verra ça plus tard.
J'essaie de vous mettre quelques photos.
A bientôt !
Bonjour Claire et bienvenue
Bravo pour ce premier post décrivant ta création. Comme je crois qu'il y a des experts en ESP32 sur le forum, tu devrais trouver des amis
Didier
Merci Didier 😉 ,si quelqu'un sait comment on utilise les routines décrites dans la doc de l'atmos pour envoyer des octets sur le port cassette, ça m'intéresse.
Bonjour, post et projet intéressants.
Il y a en gros quatre routines pour écrire un fichier sur une K7 (en plus de CSAVE qui les encapsule):
- une pour l'écriture de l'entête du fichier
- une pour l'écriture d'un bloc mémoire
- une pour l'écriture d'un seul octet
- une pour l'écriture d'un bit
À celà s'ajoute la routine d'initialisation du VIA et sa remise en état.
Il peut y avoir des différences entre l'Oric-1 et l'Atmos.
Est-ce que tu veux les détails de chacune ou seulement de certaines?
Peux-tu me dire à quelle doc tu fais référence?
Bonjour Assinie, en fait j'aurais besoin dans un premier temps d'envoyer des octets, on va dire une série de 15 octets environ pour envoyer une commande à l'esp32. Actuellement je me sers de la fonction csave en basic pour faire ça mais ça impose d'envoyer déjà les 256 bytes de synchro puis l'entête du fichier ce qui ralenti la communication alors que j'ai besoin juste d'une quinzaine d'octets.
Il faut aussi que le petit programme que j'envoie lors de l'affichage du directory soit le plus court possible pour diminuer le temps de chargement. Ce petit programme permet de dialoguer avec l'Oric pour afficher le DIR et de sélectionner le programme à charger. L'appel de la routine qui sert à communiquer avec l'esp32 doit donc être facile à mettre en oeuvre sinon on augmente le temps de chargement et ça devient pas intéressant.
Le seul document auquel je fais référence c'est le bouquin fourni avec l'Oric, il mentionne ces 4 routines mais ils n'expliquent pas comment s'en servir.
Par la suite j'ai envie de faire une sorte de terminal série qui utiliserait la sortie série de l'esp32, j'aimerais aussi permettre d'autres connexions avec le monde extérieur.
Mon humble avis, mais je suis nul en hardware donc je n'ai pas d'idée de la faisabilité
J'aurais rendu le périphérique indépendant de l'oric, donc esp32 + boutons + écran (ou écran tactile)
l'esp se conporterai comme le magnétophone. je sélectionne le fichier sur l'esp32, je fais play et des que l'oric lance cload, c'est parti
idem dans l'autre sens : je fais rec, je fais csave "nom" et voila. pas sur que cela soit judicieux de faire des échanges pour faire la sélection à l'écran
Mon humble avis, mais je suis nul en hardware donc je n'ai pas d'idée de la faisabilité
J'aurais rendu le périphérique indépendant de l'oric, donc esp32 + boutons + écran (ou écran tactile)
l'esp se conporterai comme le magnétophone. je sélectionne le fichier sur l'esp32, je fais play et des que l'oric lance cload, c'est parti
idem dans l'autre sens : je fais rec, je fais csave "nom" et voila. pas sur que cela soit judicieux de faire des échanges pour faire la sélection à l'écran
En fait c'est ce que je comptais faire au début du projet mais j'ai trouvé bien plus intéressant de rendre le port cassette communicant avec l'esp car je trouve que ça sort de l'ordinaire, ça rend le port cassette intelligent et c'est un peu un défi de vouloir le détourner de ce pour quoi il était fait au départ.
Ca marche déjà bien, l'esp n'a pas besoin d'être activé par l'opérateur comme avec un magnétophone, tout se fait depuis l'oric, on tape cload et obtient le dir sans toucher à l'esp, de même pour csave, on peut si on veut intégrer un petit esp dans l'oric, pas besoin de l'écran dans l'absolu et ça laisse les autres ports libres.
Bonjour Claire,
J'ai fait également un émulateur K7. L'article devrait sortir dans le prochain CEO-MAG.
En attendant tu peux regarder les sources ici :
K7 EMULATOR
Mais j'ai choisi un encodeur rotatif pour sélectionner les fichiers dans la mémoire spiffs de l'esp32
il n'y a pas de carte mSD externe afin de diminuer les couts.
La MAJ de la mémoire spiffs se fait par WiFi via FTP.
J'ai ajouté une Liaison série avec passerelle TELNET pour étendre la connectivité. (mais il faut un 6551)
j'ai également mis cet émulateur de K7 dans mon Oric Maison
Si le domaine des E/S t'intéresse tu trouvera ma 1ere carte E/S ORIC (il me reste 1 ou deux PCB)
J'ai aussi transformé l'EREBUS en bus I2C pour le fun.
Tous les projets ont été expliqués dans les CEO-MAG.
tu peux tester facilement le projet K7 EMU car il y a le web flasher
la programmation se fait sans compilation.
Bonnes bricoles
Amicalement,
F4GOH
Bonjour F4GOH,
Très intéressant ton travail, malgré mes recherches que j'avais faites je n'avais pas découvert ton projet c'est clair que si je l'avais connu avant de commencer le mien j'aurais avancé bien plus vite.
J'avais pensé ajouter la possibilité de transférer les fichiers via wifi, je compte toujours y parvenir mais dernièrement j'ai fait des tests en Bluetooth et ça me génère des problèmes de communication. Je vois que tu as des connaissances en électronique et programmation qui sont certainement plus sérieuses que moi, je bidouille à ma façon mais j'arrive malgré tout à un résultat 🙂
C'est drôle j'avais pensé aussi à un encodeur rotatif mais j'ai laissé tomber car je voulais que tout soit contrôlé depuis l'oric, ça me complique la tâche mais c'est surtout pour le fun. J'ai aussi pensé à inclure une option pour lire des images au format bmp, je vois que tu as déjà pensé à un système similaire.
Bref je ne manque pas d'idées, c'est surtout les connaissances dans certains domaines qui me manquent...
Merci pour ton post, je vais continuer à consulter tes travaux 😉
Claire
Les étapes pour lire ou écrire un octet depuis ou vers le port K7:
- initialiser le VIA
- indiquer la vitesse de transfert (lente ou rapide)
- lire / écrire les octets un par un
- restaurer la configuration du VIA
Exemple:
; Configuration du VIA pour les transferts K7 jsr SetupVIA ; Indiquer la vitesse de transfert: 0-> rapide, autre->lent lda #$00 sta TSPEED ; Envoyer un ocet vers le port K7: mettre le caractère dans A et faire un saut en OUTBYT : Ici on écrit le caractère 'C' lda #'C' jsr OUTBYT ; Recevoir un octet depuis le port K7: jsr RDBYTE ; Ici A= caractère reçu, on le copie vers le permier caractère de la ligne de statut de l'écran sta $BB80 ; Restaurer la configuration du VIA jsr ResetVIA
Il est également possible d'envoyer toute une zone mémoire vers le port K7 ou de lire plusieurs octets et de les copier vers une zone mémoire.
Attention: il faut connaitre à l'avance le nombre d'octets à transférer de façon à calculer l'adresse de fin du tampon parce que ces routines ne s'arrêtent que lorsque l'adresse de fin du tampon est atteinte.
Exemple pour envoyer une copie d'écran (sans la ligne de statut)
; Configuration du VIA pour les transferts K7 jsr SetupVIA ; Indiquer la vitesse de transfert: 0-> rapide, autre->lent lda #$00 sta TSPEED ; Envoyer plusieurs octets vers le port K7 ; Adresse de début des ocets à envoyer: $BBA8 lda #<$BBA8 sta TSTART lda #>$BBA8 sta TSTART+1 ; Adresse de fin des ocets à envoyer: $BFDF lda #<$BFDF sta TEND lda #>$BFDF sta TEND+1 jsr OUTBYTES ; Restaurer la configuration du VIA jsr ResetVIA
Exemple pour lire une copie d'écran (sans la ligne de statut):
; Configuration du VIA pour les transferts K7 jsr SetupVIA ; Indiquer la vitesse de transfert: 0-> rapide, autre->lent lda #$00 sta TSPEED ; Recevoir plusieurs octets depuis le port K7 ; Adresse de début pour la réception des octets: $BBA8 lda #<$BBA8 sta TSTART lda #>$BBA8 sta TSTART+1 ; Adresse de fin pour la recpetion des octets: $BFDF lda #<$BFDF sta TEND lda #>$BFDF sta TEND+1 jsr RDBYTES ; Restaurer la configuration du VIA jsr ResetVIA
Pour un transfert de ce type, tu peux décider que le nombre d'octets envoyé est fixe (256 par exmple) ou envoyer d'abord la taille du bloc qui sera échangé de façon à ce que l'esp32 ou l'Oric s'adapte si cette taille est variable.
Adresses poour un Atmos:
INTTMP = $33 ; 2 octets ($33-$34) TSPEED = $024D ; 0->rapide, autre->lent ('S') TSTART = $02A9 ; 2 octets ($02A9-$02AA) TEND = $02AB ; 2 octets ($02AB-$02AC) SetupVIA = $E76A ResetVIA = $E93D OUTBYT = $E65E ; octet à envoyer dans A, conserve X et Y, utilise $2F OUTBYTES = $E62E ; Adresse de début en $02A9-02AA, fin en $02AB-$02AC, utilise INTTMP RDBYTE = $E6C9 ; Octet reçu dans A, conserve X et Y, utilise $2F RDBYTES = $E4E0 ; Adresse de début en $02A9-$02AA, fin en $02AB-$02AC, utilise INTTMP
Adresses pour un Oric-1:
INTTMP = $33 ; 2 octets ($33-$34) TSTART = $5F ; 2 octets ($5F-$60) TEND = $61 ; 2 octets ($61-$62) TSPEED = $67 ; 0->rapide, autre->lent (3) SetupVIA = $E6CA ResetVIA = $E804 OUTBYT = $E5C6 ; octet à envoyer dans A, conserve X et Y, utilise $2F OUTBYTES = $E5A7 ; Adresse de début en $5F-$60, fin en $61-$62, utilise INTTMP RDBYTE = $E630 ; Octet reçu dans A, conserve X et Y, utilise $2F RDBYTES = $E4EB ; Adresse de début en $5F-$60, fin $61-$62, utilise INTTMP
En espérant que ça puisse t'aider.
Merci beaucoup Assinie, ça va bien m'aider. J'ai de quoi m'amuser 😊
Peux tu me donner les adresses des routines ? Je n'arrive pas à trouver de documents à ce sujet...
@atmosphere : Je crois que les fichiers d'Assinie sont complets, les lignes de code sont autonomes avec les adresses listées notamment dans le dernier listing