Le but est de lire un programme stocké sur cassette audio et de le transmettre tel quel sur la liaison série RS232, vers un autre ordinateur.

L'idée est bien de lire tout type de cassette DAI, sachant qu'il y a en standard 3 types de fichiers prévus par le DAI (programmes basic, données de tableau et fichiers binaires).

Pour arriver à lire une cassette DAI et faire ce qui vient d'être écrit, il faut descendre dans les entrailles de la ROM et repérer les routines chargées de la gestion des cassettes audio.

Un petit cours s'impose donc sur ce sujet.

Je vous rassure tout de suite, vous n'aurez pas à écrire quoi que ce soit, vous trouverez ici même les programmes prêts à l'emploi. Cependant, pour bien comprendre comment fonctionne l'ensemble, je vous conseille de lire ce qui suit.

En guise de cours, je vous propose de commenter le programme assembleur permettant d'envoyer sur la liaison RS232 du DAI, chacun des octets d'un fichier lu sur cassette audio. Voici donc le programme (que vous pourrez également bientôt récupérer). Il s'appelle "COPYK7RS232.SRC" pour le source et "COPYK7RS232.BIN G7000" pour l'exécutable.

0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
 








DEBUT

GETC




LOAD


SUIT1







MESS1$






END
 
ORG
REM
REM
REM
LXI
LXI
LXI
CALL
LXI
CALL
CALL
JC
JZ
CPI
JNZ
DI
CALL
CALL
DI
LHLD
MOV
STA
CALL
JNC
CALL
JMP
DATA
ASC
DATA
ASC
DATA
ASC
DATA
END
 
:7000



H,:D7B9
D,:D7A4
B,:02C5
:DE4F
H,MESS1$
:DAD4
:D6BB
:0E009
GETC
:31
DEBUT

:D42E
:D3F4

:72
M,A
:FF06
:D4D4
SUIT1
:D445
DEBUT
:C,:D,:D
'(1)=LOAD'
:D
'(BREAK)=UT'
:D,:D
'CHOIX?'
0

 

**************************
* COPY CASSETTE DAI 48 K *
**************************



REM RESTAURER VECTEURS K7

REM PMSG
REM SCRUT CLAVIER
REM RETOUR SOUS UTILITY
REM Z=1 => PAS DE CARACTERE
REM TOUCHE 1 PRESSEE ?
REM TOUCHE NON OK RAFFICHE
REM LIRE K7 OCTET PAR OCTET
REM DEMARRE MOTEUR K7
REM LIT LE FILE HEADER
REM DESACTIVE INTERRUPTIONS
REM POS CURSEUR ECRAN DANS H
REM AFFICHER CAR A POS CURSE
REM ENVOI VERS RS232
REM LECTURE OCTET SUIVANT
REM CONTINUER TQ PAS D'ERREU
REM STOP MOTEUR K7









 

La directive ORG indique à l'assembleur qu'il va falloir assembler le code à partir de l'adresse 7000. C'est également cette adresse qu'il faudra appeler lors de l'exécution du programme.

La ligne 5 charge le registre HL avec l'adresse de début d'une table présente en ROM et contenant les vecteurs cassette. La ligne 6 charge DE avec l'adresse suivant immédiatement la fin de cette table. La ligne 7 charge BC avec l'adresse cible où recopier cette table. Enfin la ligne 8 appelle une routine présente en ROM et permettant de recopier à partir de l'adresse BC,  les octets se trouvant entre l'adresse HL et DE-1. La raison est donnée ci-dessous :

Le DAI comporte une zone en mémoire  RAM dans laquelle sont indiquées les adresses de gestion des unités de lecture/écriture. Le système d'exploitation présent en ROM appelle cette table à chaque fois qu'une opération de lecture ou d'écriture est demandée. C'est à dire à chaque fois qu'une commande Basic LOAD ou SAVE est  appelée ou bien à chaque fois qu'une commande R ou W est appelée dans le mode Utility (mode UT). Le système pourrait appeler directement les adresses dont il dispose dans la table en ROM mais ceci ne permettrait pas d'appeler autre chose que les routines du lecteur de cassette, puisque c'est le mode par défaut du DAI. En mappant les adresses en RAM, cela permet de remplacer ces adresses par d'autres points d'entrée. Par exemple le lecteur de micro-cassettes MEMOCOM fait usage de la table en ROM pour indiquer d'autres adresses correspondant à une EPROM additionnelle qu'il faut installer lorsque l'on dispose du MEMOCOM. J'utilise cette possibilité pour le programme permettant de lire des données sur un PC via la liaison RS232, ce que l'on verra plus tard.

L'intérêt de restaurer systématiquement les pointeurs liées aux routines de gestion des lecteurs de cassettes standards est le suivant : si le programme COPYK7RS232.BIN vient d'être chargé via la liaison RS232 ou via MEMOCOM (voir par l'unité de disques pour les chanceux) alors les vecteurs présents en RAM seront respectivement ceux de la solution PC/RS232, ceux du MEMOCOM ou ceux du lecteur de disques. Or, le but du programme ci-dessus est de gérer lire un magnétocassette et pas autre chose ! Il faut donc que le système face référence à ses routines et non pas aux routines d'un autre système... Voici donc le pourquoi de la chose.

Les lignes 9 et 10 servent à afficher un mini menu :

(1)=LOAD
(BREAK)=UT

CHOIX?

 En appuyant sur la touche 1 le programme cherchera à lire la cassette audio octet par octet et les enverra un à un sur la liaison RS232 au bout de laquelle un programme se contentera d'en faire un fichier.

L'appui sur la touche BREAK quelques secondes permet de retourner dans le mode UT.

La ligne 11 appelle la routine de scrutation du clavier. Si CY=1 en sortie de cette routine, c'est que la touche Break a été enfoncée, on appelle alors la routine en E009, on peut se permettre de le faire de cette façon sans passer par l'instruction RST car on est déjà sous Utility et que la mémoire ROM switchée est la bonne.

Pour le reste des commentaire lire directement les REM dans le programme ci-dessus.

Après avoir été généré sous forme de code binaire, ce programme peut être chargé directement en mémoire par la commande :

UT

R COPYK7RS232.BIN G7000

Il peut ensuite être exécuté par la commande

G7000

Pour ceux qui ne disposent pas de l'assembleur, vous avez toujours la solution d'entrer directement le code assembleur sous UT à partir de l'adresse 7000 puis de sauver le tout avec la commande

W7000 7059 COPYK7RS232.BIN G7000

J'indique souvent la commande permettant de lancer le programme dans le nom du programme, cela évite les efforts de mémoire ou de recherche documentaire, c'est pourquoi on trouve "G7000" dans le nom du programme.

Voici le code assemblé :

7000 21 B9 D7 11 A4 D7 01 C5 02 CD 4F DE 21 3B 70 CD
7010 D4 DA CD BB D6 DA 09 E0 CA 12 70 FE 31 C2 0C 70
7020 F3 CD 2E D4 CD F4 D3 F3 2A 72 00 77 32 06 FF CD
7030 D4 D4 D2 27 70 CD 45 D4 C3 0C 70 0C 0D 0D 28 31
7040 29 3D 4C 4F 41 44 0D 28 42 52 45 41 4B 29 3D 55
7050 54 0D 0D 43 48 4F 49 58 3F 00

En gras sont représentées les adresses de début de chaque ligne. Vous pourrez facilement entre ce code sous UT avec la commande S

Il va falloir entrer chacun des octets, un par un. Pour ça je conseille vivement de le faire ligne par ligne par paquet de 16 octets. L’adresse du début de chaque ligne est en gras. Pour ça, il faut  utiliser la commande S qui signifie Substitute. Il faut taper S immédiatement suivi de l’adresse (sans blanc) suivi immédiatement de l’appui sur la barre d’espace. Donc pour commencer à entrer le premier octet, il faut taper :

S7000

Et taper tout de suite la barre d’espace sans faire return.

Le premier octet en 7000 va apparaître, suivi d’un tiret. On tape ensuite

21

Suivi immédiatement de la barre d’espace et ainsi de suite.

Quand vous serez arrivé au bout de la ligne (CD) il faudra appuyer sur la flèche gauche.

 Vous pourrez alors débuter la deuxième ligne de la même façon et ainsi de suite jusqu’à la ligne débutant en 7050 et se terminant en 7059.

 

Copyright 2004-2023 © Bruno VIVIEN tous droits réservés.