Cartouche pour PCjr

Introduction: Le PCjr?

L'IBM PC Junior (le PC junior) est une version plus abordable du IBM PC destiné à un usage domestique. Ce système est nettement mieux équipé pour les jeux vidéos que son grand frère le PC:

PCPCjr
Vidéo320x200, 4 couleurs320x200, 16 couleurs
SonUn canal, one carrée, volume fixe.3 Canaux + bruit, volume programmable
Port de jeuEn option (carte ISA)Deux ports standards

Le circuit graphique de la carte mère supporte un mode graphique 320x200 de 16 couleurs (vs. 4 seulement sur PC), et côté son, la puce PSG SN76496 à 3 canaux (onde carrée et volume programmable) + 1 canal de bruit ne se compare pratiquement pas au PC Speaker (1 canal à onde carrée).

Malgré les critiques et l'échec commercial que le PCjr a connu, pour quelqu'un comme moi qui prends plaisir à programmer des jeux pour des vieux PC (comme RATillery) le PCjr est extrêmement intéressant en raison de la présence d'un élément unique: Des fentes pour cartouche! (oui, comme sur les consoles et autres ordinateurs tels que le C64!)

photo de la façade d'un PCjr
Ci dessus: La façade du PCjr avec les deux fentes pour cartouche.


Survol du projet

J'ai pensé qu'il serait amusant de fabriquer mes propres cartouches. Je ne suis pas le premier à avoir cette idée, par exemple voici le project PCjrCart sur hackaday.io. Mais quoi qu'il en soit, je tenais à faire ma propre version légèrement différente en utilisant un seul ROM de 64k plutôt que deux fois 32k. De plus, j'avais en tête de peut-être tenter de vendre un nouveau jeu sur cartouche, et dans cette situation, je préfère utiliser quelque chose que j'ai conçu que de profiter du travail de quelqu'un d'autre.

Bref, voici ce que j'ai conçu:
  • Un circuit imprimé capable de recevoir un ROM de 64k (ou 1 de 32k)
  • Un boîtier imprimable en 3D pour un résultat fini pas trop mal sans devoir détruire des originaux
  • Un outil permettant de convertir des exécutables .COM et .EXE au format cartouche qui permet de transformer en cartouche plusieurs jeux DOS!


Circuit v1

Les signaux chip select provenant de l'ordinateur correspondent à des tranches de 32k:



J'ai choisi d'utiliser CS4 et CS5. Si javais eu deux ROMs de 32k, il aurait suffit de câbler chaque signal de sélection au ROM correspondant. Mais comme je voulais avoir un seul ROM de 64k, j'ai utilisé une puce 74ALS08 (porte logique ET) de sorte que dès qu'un des chip select est de niveau bas, le ROM est activé.

Cela soulève la question: Quel est l'avantage puisqu'il y a encore deux puces à installer!? La réponse: Moins cher et moins long à assembler. Le ROM de 64k ne coûte que 12% plus cher que le modèle 32K de la même famille (AT27C512R vs. AT27C256R), il n'y a qu'un ROM à programmer (moins de manipulations) et un total de broches à souder beaucoup plus bas (la puce 74als08 n'a que 14 broches, pas 28..).

Voici donc le schéma:





Et quelques photos du circuit imprimé:
Face supérieure

Face supérieure

Face inférieure

Face inférieure

Chamfrein

Chamfrein



J'ai assemblé un circuit avec un socket pour pouvoir changer le ROM facilement lors des tests. Cela prends plus d'espace vertical mais rentre de justesse:
Test

Test

Test

Test



Circuit v3

Après quelques temps, ayant voulu expérimenter quelques trucs, notamment l'utilisation de EPROMs de 32K (la broche 1 doit être à 5 volt) et l'utilisation de CS6 et CS7 pour tester une version modifiée du BIOS sur mon PCjr, il était clair que mon premier concept n'était pas assez polyvalent.

J'ai donc conçu une nouvelle version, configurable à l'aide de ponts de soudure. Voici le nouvel schéma:




Voici quelques photos de ce circuit imprimé:
Face composants

Face composants

Face soudure

Face soudure

Configuration par ponts de soudure

Configuration par ponts de soudure

Exemple remplaçant le BIOS

Exemple remplaçant le BIOS




J'ai fait fabriquer une certaine quantité de circuits, ils sont disponibles ci-dessous:



Oh, et au cas où vous-vous le demandiez, oui, la version 2 existe. Elle est presque identique à la version 3 présentée ici, mais une erreur de routage assez catastrophique est présente alors je n'ai rien d'utile à montrer.


Boîtier

Les dimensions de mon circuit sont les mêmes que le circuit IBM que j'ai utilisé comme modèle. Mais détruire des cartouche IBM pour y loger un nouveau circuit n'est pas bien.. J'ai donc entrepris de concevoir un boîtier que j'imprimerais en 3D.

J'ai modélisé une cartouche avec un système de fermeture à crochets similaire à celles d'IBM. Dans l'écran c'était bien, mais une fois imprimé... juste à regarder les crochets j'ai compris quel serait leur destin: Briser!

Crochets trops fragiles

Crochets trops fragiles



J'ai imprimé je crois 4 ou 5 versions en ajustant la géométrie, mais à la fin j'ai abandonné les crochets... Je me suis contenté d'utiliser des vis. Mais j'ai quand même fait une sorte de crochet en zig-zag à l'avant car, ce qui permet d'avoir deux vis en moins.

Couvercle

Couvercle

Base

Base



Les fichiers .STL pour impression 3D sont disponibles ici: jrcartv7.zip

Voici quelques photos de la version finale. Le circuit imprimé dans ces photos n'est pas le mien, c'est celui de la cartouche du langage BASIC d'IBM.




Conversion d'exécutable en ROMs

J'avais déjà développé un outil nommé Booterify permettant de transférer des exécutables .COM et .EXE en des images de disquette bootable, alors une bonne partie du travail était déjà fait. Je n'ai eu qu'à remplacer le code qui copie les secteurs de la disquette vers la mémoire pour une copie de la cartouche vers la mémoire.

Maintenant pour que le PCjr accepte de faire démarrer ce qu'il y a dans la cartouche, son contenu doit répondre à certaines conditions. Ceci est documenté dans le manuel technique du PCjr:



En résumé:
  • Les deux premiers octets doivent être 0x55 et 0xAA.
  • Le troisième octet est la taille (en blocs de 512 octets).
  • Le code commence au quatrième octet.
  • Les deux derniers octets sont un CRC 16. (L'algo. utilisé est le même que pour Xmodem).
Voici comment un jeu .COM ou .EXE peut être converti à un ROM pour PCjr en utilisant Booterify et le nouvel outil jrromchk qui l'accompagne:

D'abord le travail de Booterify:
  1. Le loader pcjrloader.asm est compilé avec nasm.
  2. Booterify charge le loader compilé (pcjrloader.bin) ainsi que l'exécutable (par exemple: GAME.COM)
  3. Booterify modifie le loader en fonction des informations de l'exécutable (Segments initiaux, valeur du pointeur d'instruction) et modifie au besoin l'exécutable (relocations).
  4. Booterify génrère un fichier contenant le loader modifié suivi du coeur de l'exécutable.
EXECUTABLE=GAME.COM
LOAD_SEGMENT=0x0051
./booterify -s $LOAD_SEGMENT -f 0 pcjrloader.bin $EXECUTABLE tmp1.bin
Cela génère le fichier tmp1.bin. Mais avant de l'écrire dans un ROM, il faut le manipuler encore un peu, cette fois avec jrromchk, afin de:
  1. Ajuster la taille pour qu'elle soit un multiple de 512
  2. Écrire la bonne taille dans l'en-tête du ROM (option -s)
  3. Calculer le CRC et l'écrire à la fin. (option -p)
./jrromchk -s -p -o rom.bin tmp1.bin
Il suffit ensuite d'écrire rom.bin dans la puce de votre choix puis de l'installer dans la cartouche.

Tester avec un émulateur avant d'écrire peut faire sauver beaucoup de temps, surtout si vous utilisez des EPROMS à programmation unique ou des EPROMS traditionels qui demandent plusieurs minutes d'attente pour les effacer avec une lampe UV.

La version SVN de Dosbox supporte le type de machine pcjr et permet de charger des ROMs de PCjr au format JRC à l'aide de la commande BOOT, ce qui est extrêmement pratique!

Avec l'option -j, jrromchk génèrera un fichier au format JRC:
./jrromchk -s -p -o rom.jrc -j tmp1.bin


Créer une cartouche Alley Cat!

Le jeu Alley Cat (faut-il le présenter?) exploite les capacités plus avancées du PCjr pour le son, mais à l'écran titre seulement. Coté graphique, le jeu utilise un mode 4 couleurs qui n'est pas disponible sur PC/CGA qui permet de d'utiliser les 4 couleurs de son choix, et non pas uniquement une des combinaisons « discutables » imposées par les cartes CGA. Cela veut dire que le fromage, eh bien il est jaune enfin!

Version CGA (ce fromage n'est pas apétissant)

Version CGA (ce fromage n'est pas apétissant)

Version PCjr

Version PCjr



Alley Cat est un « PC Booter », c'est à dire un jeu sur disquette qui démarre directement sans passer par DOS. La disquette original fonctionne sans aucun doute très bien sur le PCjr... Mais une version cartouche de cet excellent classique, ce serait super non!? Vous voulez en faire une, oui? C'est ce que je me disais.


Étape 1 : Obtenir le jeu

Il y a quelques versions du jeu au format exécutable (par exemple CAT.EXE) qui traînent sur le net, mais certaines n'ont plus le code spécifique au PCjr, d'autres ont un écran titre vendalisé par l'archiviste qui l'a convertit au format exécutable DOS (.COM ou .EXE) à partir de la disquette « PC Booter » originale. Je recomande donc de travailler à partir de la disquette originale, ou d'une image de celle-ci (ALLEYCAT.IMG, par exemple..)

En 2015, le jeu a été modifié pour fonctionner sur les ordinateurs de la série Tandy 1000 (des clones ou sucesseurs au PCjr), et la version postée par NewRisingSun dans le thread sur vogons.org en date du 13 décembre 2015 contient un l'outil MAKEDOSV.COM (Pour Make Dos Version je suppose..) qui créé ALLEYCAT.EXE en lisant la disquette originale. Il suffit d'insérer votre disquette, taper MAKEDOSV et en quelques instants vous aurez un ALLEYCAT.EXE 100% fonctionnel et non vendalisé.

Si vous n'avez que le fichier image de la disquette, il est possible d'utiliser MAKEDOSV à l'intérieur de DOSBOX. Il suffit d'avoir ALLEYCAT.IMG et MAKEDOSV.COM dans un répertoire, lancer dosbox et:
mount c . ; c: ; imgmount a alleycat.img -t floppy ; makedosv ; dir *.exe

Pour référence, voici les md5 des fichiers impliqués:
	9c003a2dbb48704a47b499d42ad49e55  ALLEYCAT.EXE
	5bbf1bd48e652c66cf704c2e1f80e9a7  ALLEYCAT.IMG
	3ceea0a7d6060f6d8d340c649770fe66  MAKEDOSV.COM


Étape 2 : Convertir le jeu en ROM
./booterify -s 0x0051 -f 0 pcjrloader.bin ALLEYCAT.EXE tmpcat.bin
./jrromchk -s -p -o ALLEYCAT.ROM tmpcat.bin

# Optionnel: Version .JRC pour tester dans DOSBox
./jrromchk -s -p -o ALLEYCAT.JRC -j tmpcat.bin
Pour tester la version .JRC dans Dosbox, il faut une version récente de DOSBox (probablement SVN) et avoir machine=pcjr dans la config (ou utiliser -machine pcjr au lancement). La commande BOOT se charge du reste:
mount c . ; c: ; boot ALLEYCAT.jrc


Étape 3 : L'écrire dans la puce, assembler la cartouche...

Il suffit de prendre le fichier binaire ALLEYCAT.ROM généré à l'étape précédente et l'écrire dans la puce (E)EPROM de 64k de votre choix. Les détails de cette procédure dépendent de votre équipement, je n'élaborerai donc pas davantage.

Reste à souder la puce sur le circuit imprimé, insérer la cartouche et mettre le PCjr sous tension.. Et voila!




Et pourquoi pas un petit vidéo pour entendre la version 3 canaux de la chanson thème du jeu Alley Cat?



Références

#DescriptionAdresse
1 IBM PCjr Technical Reference Manual
Pour le câblage de la cartouche et les informations sur ce qui est requis pour que l'ordinateur les reconaissent.
https://archive.org/details/IbmPcjrTechnicalReference
2 Disassembled BIOS from 8088 machines
Listing du code du BIOS du PCjr beaucoup plus lisible que dans le manuel d'IBM scanné. Pour comprendre certaines choses, comme l'algorithme de CRC et autres détails...
https://github.com/ricardoquesada/bios-8088
3 JRipCart (Tand-Em Project)
Pour la documentation du format d'image de cartouche PCjr (fichier .JRC) fournie avec JRipCart (CODE/JRCSPEC.TXT).
http://www.oldskool.org/pc/tand-em/jripcart/


Avertissement

Je ne saurais être tenu responsable pour les dommages que l'utilisation des informations ou la mise en œuvre des instructions présentées sur cette page pourrait causer à votre équipement, à vous-même ou à autrui. Aussi, je ne donne aucune garantie quant à l'exactitude des informations et à leur fonctionnement.