Category: 2020

  • ORIC version RC2019

    — PRESENTATION —

    Disponible sur le Net, un excellent site concernant le RC2014 (cf https://rc2014.co.uk/) est à visiter. Un passionné a créé un simple ordinateur à base de Z80 avec de multiples cartes enfichables, qui tourne avec Microsoft Basic.

    Reprenant l’idée, pourquoi ne pas faire de même pour notre cher Oric ?
    Aussitôt dit, aussitôt fait ! Euh, le temps d’étudier comment organiser les cartes et de réaliser quelques soudures, bien entendu…

    Voici une carte mère d’Oric Atmos :

    Si l’on ne tient pas compte de certains composants pourvus pour d’autres fonctions que l’on n’utilisera pas de suite, on peut grouper les circuits en 4 blocs.

    • le 1 avec le processeur 6502 couplé avec la ROM
    • le 2 avec le VIA 6522, le générateur de sons AY-3-8912 et l’amplificateur LM386
    • le 3 avec l’ULA HCS10017, le générateur de fréquence et la sortie vidéo RGBS
    • le 4 avec la RAM et les deux circuits de décodage d’adresse 74LS257

    Il faudra également prévoir différentes sorties sur connecteurs : le haut-parleur, le port parallèle, le port clavier, le port vidéo.
    Et réaliser une carte support capable de recevoir ces différentes cartes-filles… Six connecteurs de 40 broches véhiculant les signaux des adresses, des données et de diverses commandes communs à toutes les cartes-filles :

    CARTE SUPPORT

    Et voici les cartes-filles, toutes sur un connecteur mâle de 40 broches :

    Un rajout de connecteurs a été nécessaire entre les cartes ULA et RAM (connecteurs jaunes sur les deux dernières photos)

    Les 2 cartes avec le connecteur latéral

    Et voici le tout monté :

    Premiers essais :

    Il a fallu tout d’abord rechercher les erreurs de câblage et de soudure… Pas évident quand on ne travaille qu’avec des petites cartes non reliées sur une carte mère classique d’Oric !
    Mais après un certain temps (comme pour le refroidissement du fût du canon) et l’aide d’une autre carte mère DIY susnommée “Mammouth” par son concepteur, il a été possible enfin de démarrer l’Oric version RC 2019 !

    L’occasion de relier le clavier DIY, un haut-parleur, d’écrire un petit programme de test en basic, de jouer avec quelques Ping et Explode plus tard, ça tourne toujours ! Bonne nouvelle ! D’autres cartes vont pouvoir être développées et connectées a cette version sympa de l’Oric…

    Deux slots d’extension sont encore disponibles. Il est également possible d’utiliser le dernier slot pour y relier une carte intermédiaire comportant d’autres slots…

    Ça ouvre pas mal de possibilités !

    Oui, il faut admettre que cet Oric n’a pas la beauté d’un Oric original. Le boîtier noir et orange a disparu, le clavier mécanique et le bloc d’alimentation aussi…
    Mais c’est un clone fonctionnel, destiné au développement de projets divers qui ne manqueront pas de venir enrichir ces pages.

    Oricalement,
    Voyageur

  • Retour sur la mise en œuvre du PSG AY3-8912

    par Andre C.

    Dans certaines de mes expérimentations musicales récentes (par exemple MereMichel2, qui utilise la commande SOUND), j’ai été amené à ajouter un CALL#C4B7 en fin de programme. Il s’agit d’une sorte de pseudo END qui permet de sortir du programme en évitant le “Ready” et surtout le parasite sonore qui l’accompagne (une sorte de “PEUP”). Impossible de trouver la cause de ce parasite.

    En cherchant autre chose, je suis tombé sur la citation suivante : “Le fait crucial suivant ne figure dans aucun manuel : Au boot et lors de chaque retour à l’interpréteur BASIC, le canal 1 est validé (mais ni le 2, ni le 3, ni le bruit). C’est comme si un PLAY 1,0,0,0 était exécuté. Ceci explique pourquoi les essais que l’on peut faire sur le canal 1 ne marchent pas toujours lors de leur mise en application ultérieure. Par exemple au “Ready”, un MUSIC 2,3,10,9 ne produit rien, alors que MUSIC 1,3,10,9 produit bien un LA de l’octave 3. Si le bit 3 de #26A est à zéro (bruit clavier actif) alors PLAY 1,0,0,0 est envoyé à chaque “Ready”. Si le bit 3 est à un (clavier muet) alors c’est le dernier PLAY qui reste valide (comme en mode programme) tant qu’on n’envoie pas un nouveau PLAY ou qu’on ne coupe pas l’alimentation électrique du PSG.

    Ceci se trouve dans l’article “PLAY, MUSIC, SOUND, une mise au point effectuée par André C., Dominique P. et Claude S.” (CEO-mag n°119, pages 25-39). En fait, Dominique est le père de cette observation étonnante, ce qui explique peut-être que je ne l’avais pas gardée en mémoire.

    Le fait crucial suivant ne figure dans aucun manuel : Au boot et lors de chaque retour à l’interpréteur BASIC, le canal 1 est validé (mais ni le 2, ni le 3, ni le bruit). C’est comme si un PLAY 1,0,0,0 était exécuté. Ceci explique pourquoi les essais que l’on peut faire sur le canal 1 ne marchent pas toujours lors de leur mise en application ultérieure. Par exemple au “Ready”, un MUSIC 2,3,10,9 ne produit rien, alors que MUSIC 1,3,10,9 produit bien un LA de l’octave 3. Si le bit 3 de #26A est à zéro (bruit clavier actif) alors PLAY 1,0,0,0 est envoyé à chaque “Ready”. Si le bit 3 est à un (clavier muet) alors c’est le dernier PLAY qui reste valide (comme en mode programme) tant qu’on n’envoie pas un nouveau PLAY ou qu’on ne coupe pas l’alimentation électrique du PSG.
    Ceci se trouve dans l’article “PLAY, MUSIC, SOUND, une mise au point effectuée par André C., Dominique P. et Claude S.” (CEO-mag n°119, pages 25-39). En fait, Dominique est le père de cette observation étonnante, ce qui explique peut-être que je ne l’avais pas gardée en mémoire.


    Comme ce phénomène me chiffonnait toujours, j’ai effectué quelques recherches. Voici les observations que j’ai pu faire :
    1) Les sons parasites produits dépendent de la configuration. On peut bien sûr les entendre avec un Atmos seul (configuration 1), mais ils sont plus importants dans la configuration Atmos+Microdisc+Sedoric (configuration 2). Ainsi, dans la configuration 2, si l’on remplace le CALL#C4B7 final par un END, le programme modifié produit un “PEUP” en rendant la main. Par contre avec la configuration 1, le même programme modifié de la même manière rend la main sans produire de parasite sonore. Curieux non?
    2) Les sons parasites produits dépendent des commandes utilisées. Par exemple, les deux programmes MereMichel1 et MereMichel2 sont quasi identiques et produisent les mêmes sons, sauf que le premier utilise la commande MUSIC et reste silencieux après le retour au “Ready” (configuration 2), alors que le second utilise la commande SOUND et nécessite l’ajout du fameux CALL#C4B7 pour bloquer le disgracieux “PEUP”(toujours avec la configuration 2).
    3) La manière dont on termine le programme joue aussi. Curieusement, ajouter une commande END en fin de programme est souvent toxique. Si nécessaire, mieux vaut sortir avec un CALL#C4B7 ou alors effectuer un reset des registres du PSG (voir plus loin la routine RSETPSG).
    4) Si on utilise un Oric réél ou un émulateur.
    Je ne suis pas allé plus loin dans la recherche des causes du phénomène, découragé par l’hétérogénéité des conditions dans lesquelles il se produit.
    Mais le problème vient sans doute en grande partie du fait que les 14 registres du PSG sont latchés (verrouillés), ce qui veut dire que la valeur qu’on y écrit y reste jusqu’à ce qu’on en écrive une autre ou que l’on coupe le courant.
    Selon la configuration, les commandes musicales utilisées et la manière dont on termine le programme, il est difficile de savoir ce qu’il y a dans ces 14 registres. Certes un PLAY 0,0,0,0 semble tout couper, mais en apparence seulement car seul le registre 7 est mis à jour, sans nettoyage des 13 autres registres. Ce registre 7 sert à valider les canaux actifs. Les bits 0, 1 et 2 contrôlent respectivement les canaux 1, 2 et 3 ; les bits 3, 4 et 5 mixent le bruit blanc aux canaux 1, 2 et 3. Attention, pour valider un canal, il faut mettre le bit correspondant à 0. Par conséquent la commande PLAY 0,0,0,0 envoie la valeur #3F (111111 en binaire) dans le registre 7 ce qui bloque toutes les sorties ! Je ne suis pas à l’origine de cette conception tordue et j’espère que vous avez suivi !
    Quand on revalide un canal (ou quand on retourne au “Ready”, ce qui revalide le canal 1), on peut alors entendre s’exprimer ce que le PSG a dans le ventre, même si ce n’est ni voulu, ni agréable !
    Je ne vois qu’une seule solution à ce problème : neutraliser tous les registres du PSG !

    Registre 0 et 1 : Tonalité canal 1 (de #00 à #0FFF) mettre à #0000
    Registre 2 et 3 : Tonalité canal 2 (de #00 à #0FFF) mettre à #0000
    Registre 4 et 5 : Tonalité canal 3 (de #00 à #0FFF) mettre à #0000
    Registre 6 : Tonalite bruit blanc (de 0 a $1F) mettre à #00
    Registre 7 : Contrôle des canaux en service (de #00 à #3F) mettre à #3F
    Registre 8 : Volume canal 1 (de #00 à #10) mettre à #00
    Registre 9 : Volume canal 2 (de #00 à #10) mettre à #00
    Registre 10 : Volume canal 3 (de #00 à #10) mettre à #00
    Registre 11 et 12 : Durée du son (de #00 à $FFFF) mettre à #0000
    Registre 13 : Forme de l’enveloppe (de #00 à #0F) mettre à #00

    Ceci peut se faire à l’aide de la petite routine en assembleur RSETPSG ci-dessous :

    ; Routine RSETPSG pour neutraliser les 14 registres du PSG AY3-8912
    ; Cette routine sera appelée par CALL STP (soit #980E si la routine est implantée en #9800)
    org $9800 ; Exemple d'adresse d'implantation de la routine
    DATA db $00, $00, $00, $00, $00, $00 ; Tonalite canaux A, B et C (de 0 a $0FFF)
    db $00 ; Tonalite bruit blanc (de 0 a $1F)
    db $3F ; Canaux C+br, B+br, A+br, C, B, A)
    db $00, $00, $00 ; Volume canaux A, B et (0 a $0F, -> enveloppe si $10)
    db $00, $00 ; Durée du son (de 0 a $FFFF)
    db $00 ; Forme de l'enveloppe (de 0 à 7)
    STP ldx #LOW DATA ; Adresse des 14 valeurs
    ldy #HIGH DATA ; à envoyer au PSG
    jmp $FA86 ; Routine en Rom "écrire dans les 14 registres du PSG"
    EOF


    Il est évidemment possible de POKEr les octets correspondants avec un programme Basic :

    100 FOR K=#9800 TO #9814:READ V:POKE K,V:NEXT
    200 DATA 0,0,0,0,0,0,0,#3F,0,0,0, 0,0,0,#A2,#00,#A0,#98,#4C,#86,#FA
    300 SAVE"RSETPSG",A#9800,E#9814

    La routine est relogeable si on assemble le programme source à une autre adresse ou si on met à jour manuellement les octets du LDX #00 (ici #A2,#00) et ceux du LDY#98 (ici #A0,#98) afin de cibler la nouvelle adresse d’implantation.
    La différence entre ces 2 CALL est que le CALL#C4B7 (routine de la Rom) rend la main (sans afficher le “Ready”), alors que le CALL#980E (routine RSETPSG en Ram) permet de rester dans le programme et éventuellement d’en sortir plus proprement. Ces deux remèdes devraient résoudre vos éventuels problèmes. N’hésitez pas à faire connaître vos tribulations musicales…