

Rappel du schéma du montage :

Modérateurs : Carl, Papy.G, fneck
Code : Tout sélectionner
1 '================================
2 ' SDANIM2
3 '================================
10 SCREEN0,7,7:LOCATE0,0,0:CLS
20 A=&H9000
30 READX$:IFX$="**"THEN99
40 POKEA,VAL("&H"+X$):A=A+1:GOTO30
99 EXEC&H9000:END
100 DATA 34,7F,1A,50,8E,1F,40,E6
101 DATA 84,63,84,E1,84,27,14,63
102 DATA 84,86,A7,1F,8B,96,C0,8A
103 DATA 01,97,C0,8E,00,00,7F,90
104 DATA 51,20,0D,86,E7,1F,8B,96
105 DATA C3,8A,01,97,C3,8E,40,00
106 DATA 4F,5F,DD,CE,C6,7F,DD,CC
107 DATA 8A,04,97,CE,97,CF,84,3F
108 DATA 97,CD,D6,CC,8A,40,97,CD
109 DATA 5D,2B,0C,27,03,12,20,0B
110 DATA 8E,40,00,12,12,20,06,30
111 DATA 89,01,00,30,85,84,3F,97
112 DATA CD,96,CC,8A,40,97,CD,84
113 DATA 3F,97,CD,D6,CC,8A,40,97
114 DATA CD,E7,84,84,3F,97,CD,96
115 DATA CC,8A,40,97,CD,81,FF,26
116 DATA BD,35,FF,**
Code : Tout sélectionner
/**************************************************\
* S D A N I M 2 *
* (c) 2015 - Daniel Coulom *
* http://dcmoto.free.fr/ *
* http://forum.system-cfg.com/ *
*--------------------------------------------------*
* Ce code est distribue gratuitement dans l'espoir *
* qu'il sera utile, mais sans aucune garantie et *
* sans engager la responsabilité de l'auteur. *
* Vous pouvez l' utiliser, le modifier et le *
* diffuser librement, en conservant cette licence *
* et les références de l'auteur dans toutes les *
* copies. L'exploitation commerciale est interdite.*
\**************************************************/
/***************************************************
* Version 2015.06.03 *
****************************************************
Historique
2015.06.03 optimisation du code
2015.06.02 desactivation des interruptions
2015.05.23 n'utilise plus SimpleSDAudio.cpp
2015.05.19 premiere version operationnelle
Communication parallele avec un ordinateur Thomson
Lecture des donnees dans un fichier sur carte SD
Envoi des octets sur le port D a destination du
port manettes de l'ordinateur Thomson.
Connexion module Catalex pour carte micro SD
GND --> GND
SCK --> D13
MISO --> D12
MOSI --> D11
VCC --> VCC (5V)
CS --> D10
Connexion DB9 de la manette 0
1 --> D0 (RX)
2 --> D1 (TX)
3 --> D2
4 --> D3
5 --> VCC (+5V)
6 --> D8
7 --> non connecte
8 --> non connecte
9 --> GND
Connexion DB9 de la manette 1
1 --> D4
2 --> D5
3 --> D6
4 --> D7
5 --> non connecte
6 --> non connecte
7 --> non connecte
8 --> non connecte
9 --> non connecte
This sketch uses the SimpleSDAudio library for SD card access.
Visit SimpleSDAudio website for more information:
http://www.hackerspace-ffm.de/wiki/index.php?title=SimpleSDAudio
*/
#include <sd_l0.h>
#include <sd_l1.h>
#include <sd_l2.h>
#define SD_FILE "cat.sd"
uint8_t SD_L1_CardCommand(uint8_t cmd, uint32_t arg);
SD_L2_File_t AudioFileInfo;
uint8_t string[1024];
void setup()
{
int i; // compteur de boucle
int index; //index dans le buffer
int wait0xfe; // indicateur d'attente octet 0xfe
//desactiver les interruptions
noInterrupts();
// Configure pin8 as an input (thomson request)
pinMode(8, INPUT);
// Configure port D as an output
PORTD = 0x00;
DDRD = 0xff;
// Initialize SD card
SD_L0_CSPin = 10;
SD_L2_Init(string);
SD_L0_SpiSetHighSpeed();
// Search for file SD_FILE in Rootdir (=cluster 0),
// search shortname files only (0x00,0x18)
SD_L2_SearchFile((uint8_t *)SD_FILE, 0UL, 0x00, 0x18, &AudioFileInfo);
// send CMD18 (multiblock read)
uint32_t offset = AudioFileInfo.ActSector; // offset = secteur
if (SD_L1_GetCardType() != SD_CARD_TYPE_SDHC) // si carte non SDHC
offset <<= 9; // offset = octet
SD_L1_CardCommand(18, offset); // lance CMD18
while(SD_L0_SpiRecvByte() != 0xfe); // attente octet $FE de debut de bloc
uint32_t count = 0; // compteur d'echantillons
while(count < AudioFileInfo.Size) // tant qu'il reste des echantillons
{
// remplir le buffer avec deux octets a chaque boucle
// (512 octets de donnees et 2 octets de CRC)
// et envoyer un seul octet par boucle sur le port D
index = 0;
for(i = 0; i < 257; i++) // boucle 257 fois
{
string[index++] = SD_L0_SpiRecvByte(); // octet lu sur la carte
while(digitalRead(8) == LOW); // wait Thomson acknowledge
string[index++] = SD_L0_SpiRecvByte(); // octet lu sur la carte
PORTD = string[i]; // write byte to output port
while(digitalRead(8) == HIGH); // wait Thomson request
}
// envoyer les octets suivants (lus dans le buffer)
// tout en attendant l'octet 0xfe
wait0xfe = 1;
for(i = 257; i < 512; i++)
{
while(digitalRead(8) == LOW); // wait Thomson acknowledge
if(wait0xfe)
if(SD_L0_SpiRecvByte() == 0xfe) // lire un octet, tester 0xfe
wait0xfe = 0; // raz flag d'attente 0xfe
PORTD = string[i]; // load byte to send
while(digitalRead(8) == HIGH); // wait Thomson request
}
count += 512; // 512 echantillons par boucle
}
}
void loop(void) {
}
Code : Tout sélectionner
/**************************************************\
* S D A N I M 2 *
* (c) 2015 - Daniel Coulom *
* http://dcmoto.free.fr/ *
* http://forum.system-cfg.com/ *
*--------------------------------------------------*
* Ce code est distribue gratuitement dans l'espoir *
* qu'il sera utile, mais sans aucune garantie et *
* sans engager la responsabilité de l'auteur. *
* Vous pouvez l' utiliser, le modifier et le *
* diffuser librement, en conservant cette licence *
* et les références de l'auteur dans toutes les *
* copies. L'exploitation commerciale est interdite.*
\**************************************************/
* Ce programme sort video + son 22050 Hz a partir de
* donnees lues sur carte SD par l'Arduino et envoyées
* à l'ordinateur Thomson par les ports manettes.
/**************************************************\
* Version 2015.05.28 *
\**************************************************/
* Historique
* 2015.05.28 compatibilite MO et TO
* 2015.05.27 premiere version TO operationnelle
*------------------------------------------------------
* INITIALISATIONS
*------------------------------------------------------
ORG $9000
PSHS U,Y,X,DP,B,A,CC empile les registres
ORCC #$50 masque les interruptions
LDX #$1F40 adresse pour test RAM ou ROM
LDB ,X lecture adresse X
COM ,X tente de modifier adresse X
CMPB ,X test modification adresse X
BEQ INIT1 pas de difference -> TO
COM ,X retablissement adresse X
LDA #$A7 valeur initialisation DP pour MO
TFR A,DP initialisation DP
LDA <$C0 port A du PIA systeme
ORA #$01 set bit 0
STA <$C0 selection video forme
LDX #$0000 adresse dans ecran
CLR PLAY2+1 adresse nouvel ecran
BRA INIT2 suite des initialisations
INIT1
LDA #$E7 valeur initialisation DP pour TO
TFR A,DP initialisation DP
LDA <$C3 registre de donnees peripheriques port C
ORA #$01 set bit 0
STA <$C3 selection video forme
LDX #$4000 adresse dans ecran
INIT2
CLRA A=$00
CLRB B=$00
STD <$CE selectionne DDRA et DDRB
LDB #$7F B=$7F
STD <$CC PA b0-7 en entree, PB b0-7 en sortie
ORA #$04 set b2
STA <$CE selectionne PORTA
STA <$CF selectionne PORTB
*------------------------------------------------------
* JOUE LA VIDEO ET LA MUSIQUE
* Boucle de 91 cycles = 21978 Hz
*------------------------------------------------------
* lecture déplacement ecran dans B (34 cycles)
PLAY1
ANDA #$3F (2) clear bit 6
STA <$CD (4) request to send
LDB <$CC (4) lecture octet déplacement
ORA #$40 (2) set bit 6
STA <$CD (4) acknowledge
TSTB (2) test du signe
BMI PLAY3 (3) increment negatif
BEQ PLAY2 (3) nouvelle image
NOP (2) temporisation 2 cycles
BRA PLAY4 (3) incrementation
PLAY2
LDX #$4000 (3) debut nouvelle image
NOP (2) temporisation 2 cycles
NOP (2) temporisation 2 cycles
BRA PLAY5 (3) lecture suivante
PLAY3
LEAX 256,X (8) increment negatif: ajout 256
PLAY4
LEAX B,X (5) incrementation index ecran
* lecture echantillon de son dans A (16 cycles)
PLAY5
ANDA #$3F (2) clear bit 6
STA <$CD (4) request to send
LDA <$CC (4) lecture echantillon son
ORA #$40 (2) set bit 6
STA <$CD (4) joue le son et acknowledge
* lecture octet image dans B (20 cycles)
PLAY6
ANDA #$3F (2) clear bit 6
STA <$CD (4) request to send
LDB <$CC (4) lecture octet image
ORA #$40 (2) set bit 6
STA <$CD (4) acknowledge
STB ,X (4) affiche l'octet image
* lecture echantillon de son (21 cycles)
PLAY7
ANDA #$3F (2) clear bit 6
STA <$CD (4) request to send
LDA <$CC (4) lecture echantillon son
ORA #$40 (2) set bit 6
STA <$CD (4) joue le son et acknowledge
CMPA #$FF (2) test de fin de fichier
BNE PLAY1 (3) nouvelle boucle
*------------------------------------------------------
* RETOUR AU BASIC
*------------------------------------------------------
PULS CC,A,B,DP,X,Y,U,PC retour au Basic
END
Code : Tout sélectionner
LDB #$7F B=$7F
STD <$CC PA b0-7 en entree, PB b0-7 en sortie
Oui je comprends. Du coup il faut jongler un peu avec des and/or lorsqu'on lit l'offset et l'octet vidéo.Daniel a écrit :- b0 est un des bits du CNA, et n'est pas disponible sur le port manette (ni sur aucun port). On ne peut utiliser que b6 ou b7, normalement dédiés aux boutons 0 des manettes 0 et 1. J'avais aussi envisagé d'utiliser le signal MOTORON sur le connecteur magnétophone. Ca complique le câblage et aussi la programmation, et je pense qu'au total on perd des cycles. Dans la méthode actuelle, l'astuce est d'envoyer à la fois l'échantillon de son au CNA et l'acknowledge à l'Arduino par une seule instruction STA <$CD.
Code : Tout sélectionner
...
PLAY5
ANDA #$3F (2) clear bit 6
STA <$CD (4) request to send
LDA <$CC (4) lecture echantillon son
* ORA #$40 (2) set bit 6 <=== inutile
STA <$CD (4) joue le son et acknowledge
...
PLAY7
ANDA #$3F (2) clear bit 6
STA <$CD (4) request to send
LDA <$CC (4) lecture echantillon son
* ORA #$40 (2) set bit 6 <=== inutile
STA <$CD (4) joue le son et acknowledge
Code : Tout sélectionner
PLAY1
ANlDA #$3F (2) clear bit 6
STA <$CD (4) request to send
ORA #$40 (2) set bit 6
STA <$CD (4) acknowledge
LDB <$CC (4) lecture octet déplacement
* TSTB (2) test du signe (inutile)
BEQ PLAY2 (3) nouvelle image
ABX
Code : Tout sélectionner
/**************************************************\
* S D A N I M 2 *
* (c) 2015 - Daniel Coulom *
* http://dcmoto.free.fr/ *
* http://forum.system-cfg.com/ *
*--------------------------------------------------*
* Ce code est distribue gratuitement dans l'espoir *
* qu'il sera utile, mais sans aucune garantie et *
* sans engager la responsabilité de l'auteur. *
* Vous pouvez l' utiliser, le modifier et le *
* diffuser librement, en conservant cette licence *
* et les références de l'auteur dans toutes les *
* copies. L'exploitation commerciale est interdite.*
\**************************************************/
* Ce programme sort video + son 22050 Hz a partir de
* donnees lues sur carte SD par l'Arduino et envoyées
* à l'ordinateur Thomson par les ports manettes.
/**************************************************\
* Version 2015.06.03 *
\**************************************************/
* Historique
* 2015.06.03 utilisation de ABX pour incrementer X
* 2015.05.28 compatibilite MO et TO
* 2015.05.27 premiere version TO operationnelle
*------------------------------------------------------
* INITIALISATIONS
*------------------------------------------------------
ORG $9000
PSHS U,Y,X,DP,B,A,CC empile les registres
ORCC #$50 masque les interruptions
LDX #$1F40 adresse pour test RAM ou ROM
LDB ,X lecture adresse X
COM ,X tente de modifier adresse X
CMPB ,X test modification adresse X
BEQ INIT1 pas de difference -> TO
COM ,X retablissement adresse X
LDA #$A7 valeur initialisation DP pour MO
TFR A,DP initialisation DP
LDA <$C0 port A du PIA systeme
ORA #$01 set bit 0
STA <$C0 selection video forme
LDX #$0000 adresse dans ecran
CLR PLAY2+1 adresse nouvel ecran
BRA INIT2 suite des initialisations
INIT1
LDA #$E7 valeur initialisation DP pour TO
TFR A,DP initialisation DP
LDA <$C3 registre de donnees peripheriques port C
ORA #$01 set bit 0
STA <$C3 selection video forme
LDX #$4000 adresse dans ecran
INIT2
CLRA A=$00
CLRB B=$00
STD <$CE selectionne DDRA et DDRB
LDB #$7F B=$7F
STD <$CC PA b0-7 en entree, PB b0-6 en sortie
ORA #$04 set b2
STA <$CE selectionne PORTA
STA <$CF selectionne PORTB
*------------------------------------------------------
* JOUE LA VIDEO ET LA MUSIQUE
* Boucle de 90 cycles pour 2 echantillons = 22222 Hz
*------------------------------------------------------
* lecture déplacement ecran dans B (16 cycles)
PLAY1
ANDA #$3F (2) clear bit 6
STA <$CD (4) request to send
LDB <$CC (4) lecture octet déplacement
ORA #$40 (2) set bit 6
STA <$CD (4) acknowledge
* calcul position dans l ecran (11 cycles)
TSTB (2) test du signe
BEQ PLAY2 (3) nouvelle image
ABX (3) ajout de l'increment
BRA PLAY3 (3) suite
PLAY2
LDX #$4000 (3) debut nouvelle image
BRA PLAY3 (3) suite
* lecture echantillon de son dans A (16 cycles)
PLAY3
ANDA #$3F (2) clear bit 6
STA <$CD (4) request to send
LDA <$CC (4) lecture echantillon son
ORA #$40 (2) set bit 6
STA <$CD (4) joue le son et acknowledge
* lecture octet image dans B (20 cycles)
ANDA #$3F (2) clear bit 6
STA <$CD (4) request to send
LDB <$CC (4) lecture octet image
ORA #$40 (2) set bit 6
STA <$CD (4) acknowledge
STB ,X (4) affiche l'octet image
* temporisation (8 cycles)
NOP (2) temporisation
NOP (2) temporisation
NOP (2) temporisation
NOP (2) temporisation
* lecture echantillon de son (19 cycles)
ANDA #$3F (2) clear bit 6
STA <$CD (4) request to send
LDA <$CC (4) lecture echantillon son
ORA #$40 (2) set bit 6
STA <$CD (4) joue le son et acknowledge
BPL PLAY1 (3) nouvelle boucle
*------------------------------------------------------
* RETOUR AU BASIC
*------------------------------------------------------
PULS CC,A,B,DP,X,Y,U,PC retour au Basic
END