Je ne crois pas que l'on puisse tirer grand chose de cette expérience, car la lecture de la carte SD est trop lente, elle prend plus de cycles que la génération de la musique. Je voulais seulement vous faire écouter le résultat. Attention aux oreilles, c'est insupportable :
http://dcmoto.free.fr/tmp/elvis_pwm.mp3
Les échantillons sur la carte SD sont sur 2 bits à 17857 Hz. Il n'y a pas de traitement des gaps interblocs, ce qui explique les tac-tac-tac-tac... Ne cherchez pas à analyser les fréquences de ce fichier, car je l'ai filtré pour enlever les sifflements introduits par dcmoto. Ces sifflements sont des battements à 4200 Hz, entre la fréquence de sortie son de dcmoto (22050 Hz) et la fréquence d'échantillonnage (17857 Hz). On ne les entend pas sur le vrai MO5.
Code : Tout sélectionner
/**************************************************\
* S D P W M *
* (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 utilise l'interface SDMOTO ou SDMO
* associee au controleur CS91-280 pour jouer de la
* musique 1 bit en streaming sur le buzzer.
* L'adresse en parametre de la commande CMD18
* doit être initialisee en $9E03-$9E06
/**************************************************\
* Version 2015.01.20 *
\**************************************************/
* Historique
* 2015.01.20 debut du developpement
*------------------------------------------------------
* DEBUT DU PROGRAMME
*------------------------------------------------------
ORG $9E00
BRA INIT initialisations
*------------------------------------------------------
* FONCTIONS D'ACCES A LA CARTE SD
*------------------------------------------------------
CMD18
FCB $52 read multiple block
FDB $0000 adresse bloc (poids fort)
FDB $0000 adresse bloc (poids faible)
FCB $FF checksum non testee
FCB $00 code retour attendu
CMD12
FCB $4C stop transmission
FDB $0000 dummy parameter
FDB $0000 dummy parameter
FCB $FF checksum non testee
FCB $00 code retour attendu
*------------------------------------------------------
* Initialisations et execution CMD18 = Read-Multiple-Block
*------------------------------------------------------
INIT
PSHS U,Y,X,DP,B,A,CC sauvegarde des registres du Basic
ORCC #$50
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
BRA INIT2 suite des initialisations
INIT1
LDA #$E0 valeur adresse EXCMD (poids fort)
STA READ+1 pour execution CMD18
STA FIN+4 pour execution CMD12
LDA #$E7 valeur initialisation DP pour TO
INIT2
TFR A,DP initialisation DP
* Initialisation PIA pour SDMOTO
LDA <$CE lecture registre de controle A
ANDA #$FB raz bit 2
STA <$CE selection DDRA
LDB #$60 set bits 5 et 6
STB <$CC bits MOSI et CLOCK en sortie
ORA #$04 set b2
STA <$CE selection PA
* Initialisation buzzer a zero
LDA <$C1 lecture port B 6821 systeme
ANDA #$FE raz bit 0
STA <$C1 raz buzzer
* Lancement de la commande CMD18
LDU #CMD18 adresse commande CMD18
READ
JSR $A028 EXCMD = execution commande
* modifie en $E028 pour TO
BRA PLAY
*------------------------------------------------------
* ARRET DE LA LECTURE ET RETOUR AU BASIC
*------------------------------------------------------
FIN
LDU #CMD12 adresse commande CMD12
JSR $A028 EXCMD = execution commande CMD12
* FIN+4 modifie en $E028 pour TO
PULS B depile compteur octets supplementaires
PULS CC,A,B,DP,X,Y,U,PC
*------------------------------------------------------
* Lecture de la musique 17857Hz sur 2 bits
*------------------------------------------------------
PLAY
LDD #$367F
* lecture d'un bit dans carry et attente bit 0
STB <$C2 clock high (4)
CMPB <$C0 PA b7 (bit lu) -> carry (4)
STA <$C2 clock low (4)
BCS PLAY attente bit 0
* lecture et sortie buzzer de 4096 bits
LDX #$0800 compteur pour 2048 boucles
PLAY1
* bit de poids fort 4+4+4+3+2+2=19
STB <$C2 clock high (4)
CMPB <$C0 PA b7 (bit lu) -> carry (4)
STA <$C2 clock low (4)
BCS PLAY3 carry set (3)
NOP temporisation (2)
NOP temporisation (2)
* bit de poids faible 4+4+4+3+2+6+6+5+3=37
STB <$C2 clock high (4)
CMPB <$C0 PA b7 (bit lu) -> carry (4)
STA <$C2 clock low (4)
BCS PLAY2 carry set (3)
NOP temporisation (2)
INC <$C1 buzzer on (6)
DEC <$C1 buzzer off (6)
LEAX -1,X decrementation compteur (5)
BNE PLAY1 nouvelle boucle (3)
BRA PLAY5 lecture CRC (3)
PLAY2
INC <$C1 buzzer on (6)
NOP temporisation (2)
DEC <$C1 buzzer off (6)
LEAX -1,X decrementation compteur (5)
BNE PLAY1 nouvelle boucle (3)
BRA PLAY5 lecture CRC (3)
PLAY3
* bit de poids faible
STB <$C2 clock high (4)
CMPB <$C0 PA b7 (bit lu) -> carry (4)
STA <$C2 clock low (4)
BCS PLAY4 carry set (3)
NOP temporisation (2)
INC <$C1 buzzer on (6)
NOP temporisation (2)
NOP temporisation (2)
DEC <$C1 buzzer off (6)
LEAX -1,X decrementation compteur (5)
BNE PLAY1 nouvelle boucle (3)
BRA PLAY5 lecture CRC (3)
PLAY4
INC <$C1 buzzer on (6)
NOP temporisation (2)
NOP temporisation (2)
NOP temporisation (2)
DEC <$C1 buzzer off (6)
LEAX -1,X decrementation compteur (5)
BNE PLAY1 nouvelle boucle (3)
BRA PLAY5 lecture CRC (3)
* lecture de deux octets de CRC
PLAY5
LDX #$0010 compteur pour 16 boucles
PLAY6
STB <$C2 clock high (4)
CMPB <$C0 PA b7 (bit lu) -> carry (4)
STA <$C2 clock low (4)
LEAX -1,X decrementation compteur
BNE PLAY6 nouvelle boucle
BRA PLAY lecture bloc suivant
END