Number-one m'a contacté récemment car il possède une tortue Jeulin modèle T2 et il souhaitait la faire fonctionner sur le TO8. Il a déjà tout ce qu'il faut pour la faire tourner sur TO7/70.
En principe, sur TO8, il faut utiliser l'interface série RF57-932. Mais il ne l'a pas et elle est relativement rare. Sur TO7/70, c'est la plus commune CC90-232 qui est utilisée. Number-one s'est rapidement aperçu que cette dernière n'est pas compatible : la tortue "râle" (jargon officiel pour dire qu'elle détecte une erreur de communication ou de commande).
Grâce aux travaux de PrehisTO, nous savions déjà qu'il est possible d'utiliser l'interface CC90-232 sur toutes les machines Thomson, à condition d'opérer une petite modification de son électronique pour générer le -12V à partir du +5V.
Cependant, cela ne résout pas entièrement le problème lorsqu'on veut utiliser le port série de manière standard, par exemple et comme par hasard, dans LOGO, pour piloter la tortue. En effet, la routine moniteur du TO8, par définition, ne sait gérer que la RF57-932, puisque la CC90-232 n'est pas sensée fonctionner sur cette machine. Mais il existe une échappatoire : on peut rediriger l'appel au moniteur vers une routine utilisateur en RAM.
Afin de dépanner Number-one, j'ai donc écrit un petit bout de code en assembleur qui comporte deux parties : une copie conforme de la routine moniteur du TO7-70 pour piloter la CC90-232, et un petit installeur qui va patcher la table d'appel des routines moniteurs. J'ai également dû légèrement modifier l'applicatif en LOGO pour que ce patch soit installé automatiquement.
Le résultat est visible ici :
https://www.youtube.com/watch?v=1GE98lFIqjw et là :
https://forum.system-cfg.com/viewtopic.php?f=9&t=7574&start=41Number-one est le premier et le seul à ce jour à avoir fait fonctionner une tortue sur TO8 avec l'interface CC90-232.
Code:
*******************************************************************************
*
* CC90-232.ASM, v1.0
* Pilote pour interface CC90-232 sur TO8/8D/9+
* http://megarom.forler.ch
*
* La routine RSCOH standard (pour RF57-932) est remplacee de maniere
* transparente par la routine RSCOH du TO7-70 pour CC90-232.
*
* L'interface CC90-232 (equipee du module -12V) fonctionne ainsi sur TO8/8D/9+.
* Le port parallele est aussi gere ; le port parallele interne a la machine
* devient inaccessible avec le moniteur.
*
* Usage : après chargement du fichier CC90-232.BIN, l'execution du point
* d'entree INSTALL installe le pilote. Le flag INSTLD passe de $00 a
* $FF. Un deuxieme appel a INSTALL desinstalle le pilote, retablit
* le fonctionnement normal et le flag INSTLD repasse a $00.
*
* 1.0 2019-01-25 Version initiale.
*
*******************************************************************************
***** DEFINITIONS *****
DIRECT EQU $60 Page directe en $6000
PRC EQU $E7C3 PIA systeme
PRA2 EQU $E7E0 PIA CC90-232
CRA2 EQU $E7E2
PRB2 EQU $E7E1
CRB2 EQU $E7E3
STAD EQU $4000 Debut memoire video
ENDAD EQU $5F40 Fin memoire video
ENDRAM EQU $DFFF Fin de la RAM
RSRED EQU $6010 Vecteur routine RSCOH
RSOPC EQU $602B Code operation
RSSTA EQU $602C Status
BAUDS EQU $6044 Vitesse
NOMBRE EQU $6046 Configuration
GRCODE EQU $6047 Code graphique imprimante
BLOCZ EQU $6076 Deux zeros
RSCOH EQU $E812 Routine RSCOH
CLRTS EQU $02 Bit CTS
DTTRMN EQU $40 Bit DSR
GRCTO7 EQU $07 Code graphique imprimante TO7
GRCTO8 EQU $1F Code graphique imprimante TO8
REQTS EQU $20 Code RTS
RSOPR EQU $01 Ouverture lecture/ecriture
RSRDC EQU $02 Lecture d'un caractere
RSOPW EQU $04 Ouverture en ecriture seule
RSWRC EQU $08 Ecriture d'un caractere
RSCLO EQU $10 Fermeture
RSCPY EQU $20 Copie d'ecran
RSOPP EQU $40 Ecriture en parallele
RSNRD EQU $80 Not ready
RXDATA EQU $01 Bit RXDATA
* Quelques macros tres courantes chez Thomson
SKIP1 MACRO
FCB $D5
ENDM
SKIP2 MACRO
FCB $F5
ENDM
LSRD MACRO
LSRA
RORB
ENDM
CLC MACRO
ANDCC #$FE
ENDM
SEC MACRO
ORCC #1
ENDM
* Debut ici.
* ORG ENDRAM-410 Calcul au pif
ORG ENDRAM-482 Version pour tortue Jeulin
* Chargement en $DE65, $DE1D = 56861 pour usage avec la tortue Jeulin
* Pt. d'entrée INSTALL en $DE68, $DE20 = 56864 pour usage avec la tortue Jeulin
RSVECT FDB $0000 Ancien vecteur de routine RSCOH
INSTLD FCB $00 $00 = pas installe, $FF = installe
***** INSTALLER *****
INSTALL EQU *
PSHS U,X,Y,D,DP,CC Sauve le contexte
ORCC #%01010000 Interdit les interruptions
LDA #RSCLO Ferme les communications courantes
STA RSOPC
JSR RSCOH
CLR BAUDS Reinitialise la configuration serie
CLR BAUDS+1
CLR NOMBRE
TST INSTLD Pas encore installe ?
BEQ ENABL On y va
LDD RSVECT Sinon, desinstallation
STD RSRED
LDA #GRCTO8 Configure l'imprimante
STA GRCODE
CLR INSTLD Flag d'installation
BRA RETINS Et on quitte
ENABL EQU *
LDD RSRED Sauve le vecteur courant
STD RSVECT
LDD #RSCONT Installe le nouveau vecteur
STD RSRED
LDA #GRCTO7 Configure l'imprimante
STA GRCODE
COM INSTLD Flag d'installation
RETINS EQU *
PULS CC,DP,D,Y,X,U,PC Retour
***** ROUTINE MONITEUR *****
RSCONT EQU *
PSHS A,B,CC,DP,X
LDA #DIRECT
TFR A,DP
LDA RSOPC Code d'operation
ORA #%00010000 Protection contre les interrupt request (IRQ)
TFR A,CC
BCS OPNRD Bit0 = Ouverture en lecture/ecriture
BVS RRDCH Bit1 = Lecture d'un caractere
BEQ OPNWR Bit2 = Ouverture en ecriture seule
BMI RWRCH Bit3 = Envoi d'un caractere
BITA #RSCPY Bit5 = Copie graphique d'un ecran
BNE SCREEN
BITA #RSOPP Bit6 = Ouverture en ecriture parallele
BNE OPNPR
RSCLOS EQU *
LDA RSOPC
STA RSSTA
BRA OUTRW
OPNRD EQU *
LDA #RSOPW+RSOPP Verification que l'on n'est pas ouvert en ecriture
* ou en ecriture parallele avant d'ouvrir en
* lecture/ecriture
SKIP2
OPNWR EQU *
LDA #RSOPR+RSOPP Verification que l'on n'est pas deja ouvert en
* lecture/ecriture ou en ecriture parallele avant
* d'ouvrir en ecriture
SKIP2
OPNPR EQU *
LDA #RSOPW+RSOPR Verification que l'on n'est pas deja ouvert en
* ecriture ou lecture/ecriture avant d'ouvrir
* en ecriture parallele
BITA RSSTA Par un "ET" avec l'etat courant du status
BNE RSERR Si oui, erreur
LDA RSOPC
STA RSSTA Flag de l'operation realisee
BSR RSINI Positionnement du PIA2 et reconnaissance de
* peripherique absent
BCS RSNRD Retour avec flag de peripherique absent
BRA OUTRW
RRDCH EQU *
LDA #RSOPR Verification que l'on est ouvert en
* lecture/ecriture avant de saisir un octet
SKIP2
RWRCH EQU *
LDA #RSOPW+RSOPR+RSOPP Verification que l'on est ouvert en
* ecriture ou en lecture/ecriture ou en
* ecriture parallele avant d'envoyer un octet
SKIP2
SCREEN EQU *
LDA #RSOPP Verification que l'on est ouvert en ecriture
* parallele avant de recopier un ecran graphique
BITA RSSTA Par un "ET" avec le status
BEQ RSERR Si aucun flag n'est present, c'est une erreur
BSR DTTEST Test de peripherique non pret
BCS RSNRD Peripherique deconnecte
BSR IOCH Lecture ou ecriture du caractere
OUTRW EQU *
PULS A,B,CC,DP,X
CLC Flag d'operation correcte
RTS
RSNRD EQU *
LDA #RSNRD Peripherique non pret
STA RSSTA
RSERR EQU *
PULS A,B,CC,DP,X
BUSY EQU *
SEC Flag d'erreur
RTS
RSINI EQU *
LDD BLOCZ Bloc de 00 en page 0
STD CRA2 Mise des ports en direction
LDD #%0000001111111111 Bit7 : TXDATA en input, Bit6 : OTTRMN en input,
* Bit5 : RQTS en input, Bit1 : CLRTS en output,
* Bit0 : RXDATA en output. Tout le port B en
* output.
STD PRA2 Ecrit dans PRA2 et PRB2
LDD #%0000010000111100 CA2 inactif, CA1 actif sur front descendant
* avec IRQ inhibee (REQUEST TO SEND), CB2 en
* output a 1 (STROBE), CB1 actif sur front
* descendant avec IRQ inhibee (ACKNOWLEDGE)
STD CRA2 Dans CRA2 et CRB2
LDA PRB2 Test de l'existence du controleur : on lit le port B
COMA
STA PRB2 On reecrit dedans son complement
CMPA PRB2 Et on verifie la reecriture
BNE BUSY Si non conforme, controleur non present
COM PRB2 Si present, on le remet dans son etat initial
LDA #RXDATA+CLRTS
STA PRA2 CLEAR TO SEND masque et RXDATA = mark
DTTEST EQU *
LDA PRA2 Bit6 de A = DATA TERMINAL READY
EORA RSSTA Si RS.STA = RS.OPP ($40), A(6) est inverse,
* sinon il est inchange
ANDA #DTTRMN On ne conserve que le bit 6
ADDA #$FF CY=1 si A<>0 (flag de BUSY) et CY=0 si A=0 (READY)
RTS
*
***** ENVOI ET RECEPTION D'UN CARACTERE *****
*
IOCH EQU *
LDA RSOPC
BITA #RSRDC Appel en lecture ?
BNE RECECH Aucun doute, ce ne peut etre que la routine
* de reception
BITA #RSCPY Demande de recopie d'un ecran ?
BNE COPYGR Aucun doute non plus
LDA RSSTA Sinon, ce ne peut etre qu'un appel en ecriture.
* Suivant RS.STA, il peut s'agir d'une ecriture
* serie ou parallele
BITA #RSOPR+RSOPW Ecriture serie ?
BNE SENDCH
SENDPA EQU *
JSR PARALL Ecriture en parallele
RTS Sortie sur READY
COPYGR EQU *
LDA PRC Mise en memoire caractere
ORA #1
STA PRC
LDB GRCODE Code qui declenche la mise en mode graphique
JSR PARALL
LDX #STAD Adresse de debut de l'ecran
COPYLP EQU *
LDB ,X+ Caractere physique
JSR PARALL
CMPX #ENDAD Fin de l'ecran ?
BLO COPYLP
BRA OUTLP
RECECH EQU *
LDA PRA2 REQUEST TO SEND ?
BITA #REQTS
BEQ CLEART Si oui, CLEAR TO SEND et reception d'un caractere
CLR 4,S Si non, mise a zero de B sur la pile
BRA OUTLP Sortie sur READY
CLEART EQU *
ANDA #CLRTS!X$FF Envoi de CLEAR TO SEND : PRA2(1) = 0
STA PRA2
RECSD EQU *
LDD BAUDS Vitesse
LSRD Divise par deux pour se synchroniser
* a la moitie du bit de start
TFR D,X X sert de compteur de boucle
LDB NOMBRE Nombre de bits de transmission 7 (%01000000) ou
* 8 (%10000000)
START EQU *
LDA PRA2 Sert aussi au RESET de CA1
BMI START Attente du bit de start
BSR WAIT Des sa reception, on attend un demi-delai
LDA PRA2
BMI RECSD Si non confirme, on recommence l'attente
NXTBIT EQU *
LDX BAUDS
BSR WAIT Boucle de la duree d'un bit
LDA PRA2
BMI BIT1 Si PRA2(7) est a 1, c'est un bit 1
BIT0 EQU *
CLRA (CLC) C'est un bit 0
SKIP1
BIT1 EQU *
COMA (SEC) C'est un bit 1
RORB On entre le bit dans B par la gauche
BCC NXTBIT Et le 1 mis dans B finira par arriver dans CY
TST NOMBRE 7 ou 8 bits a recevoir ?
BMI PILE Si 8, fini
LSRB Si 7 bits, 1 decalage de plus
PILE EQU *
STB 4,S On met B dans la pile pour la routine d'appel
LDA PRA2
ORA #CLRTS Reset de CLEAR TO SEND : PRA2(1) = 1
STA PRA2
LDD BAUDS
LSRD
TFR D,X
BSR WAIT Attente d'un 1/2 bit supplementaire
OUTLP EQU *
JSR DTTEST On ne sort pas tant que le terminal n'est pas pret
BCS OUTLP
RTS Remonte le pointeur de 2 et B est encore
* deux positions plus haut
SENDCH EQU *
LDA PRA2
PSHS B Le mot a envoyer est range sur la pile
BSR SENDCH0 Bit de start
LDB NOMBRE %10000000 = bits ; %01000000 = 7 bits
NXTSCH EQU *
LSR ,S Positionne CY a 1 ou 0 suivant le bit a envoyer
LDA PRA2
BCC SEND0 Si CY = 0 : on envoie un 0
SEND1 EQU *
BSR SENCH1 Sinon, on envoie un 1
SKIP2
SEND0 EQU *
BSR SENCH0
LSRB
BNE NXTSCH Quand le 1 de nombre a disparu, on a fait 8 ou
* 7 tours
PULS B Reset du pointeur de pile
OUTSCH EQU *
LDA PRA2
BSR SENCH1 2 bits de stop
BSR SENCH1
BRA OUTLP
*
***** BOUCLE D'ATTENTE *****
**
WAIT EQU *
LEAX -1,X
BNE WAIT
RTS
*
***** EMISSION D'UN 0 OU D'UN 1 *****
*
SENCH0 EQU *
ANDA #$FE Mise a 0 de PRA2(0)
SKIP2
SENCH1 EQU *
ORA #1 Mise a 1 de PRA2(0)
STA PRA2
LDX BAUDS
BRA WAIT
*
***** ENVOI D'UN OCTET EN PARALLELE *****
*
PARALL EQU *
LDA CRB2
ANDA #%11110111 Mise a 0 de STROBE
STB PRB2 on positionne l'octet dans le port
STA CRB2 puis on envoie le STROBE
ORA #%00001000 Remise a 1 de STROBE
STA CRB2
LDA #DTTRMN
PAR0 EQU *
BITA PRA2
BNE PAR0 Attente de la montee de BUSY
PAR1 EQU *
BITA PRA2
BEQ PAR1 Attente de la redescente de BUSY : READY
RTS
END INSTALL
La première version de mon code ne fonctionnait pas. Je me suis alors aperçu que l'application Tortue Jeulin en LOGO installe elle-même un patch assembleur et redéfinit les primitives LISCAR et TOUCHE? de manière à ce qu'elles travaillent simultanément sur la console et sur le port série (normalement, en LOGO, c'est l'un ou l'autre). Mon code était donc écrasé partiellement. Il suffisait de le déplacer légèrement pour que tout rentre dans l'ordre. Au passage, j'ai découvert qu'on peut redéfinir entièrement le jeu d'instruction primitif de LOGO, comme cela se fait en BASIC.
Quelques remarques en guise de conclusion :
- Cette modification fonctionne sur TO8/8D et TO9+
- L'interface CC90-232 peut dès lors être utilisée par n'importe quel logiciel faisant appel à la routine moniteur, par exemple en BASIC, mais évidemment, dans les limites officiellement fixées. Pour rappel, l'outil TOCOMM de Prehisto permet de monter à des vitesses plus élevées.
- Le port parallèle de l'interface CC90-232 est aussi géré. Dans ce cas, le port parallèle interne du TO8 est masqué. Mais cela permet d'utiliser par exemple une ancienne imprimante prévue pour TO7-70
- Il suffit de rappeler l'installeur pour désinstaller le patch et se retrouver dans l'état normal (RF57-932 + port parallèle interne).
Bien qu'inscrit sur ce forum, Number-one est terriblement timide et m'a donc demandé de poster un petit quelque chose, ce que j'ai accepté de faire avec plaisir.