10 Août 2018
La communauté homebrew autour de l'Intellivision semble relativement active ces dernières années et ça semble lié a l'apparition y a 2 ou 3 ans d'un SDK en langage Basic qui s’appelle IntyBasic. Et y a quelques jours cette vidéo a popé sur youtube. Une vidéo ou l'on voit un début d'adaptation de Castlevania sur Intellivision par l'un de ces nouveaux adeptes du IntyBasic:
C'est une vidéo qui interpelle pas mal de retrogamer notamment par la présence de ce scrolling au pixel parfaitement fluide (60fps selon l'auteur). Y a pas de ROM disponible de cette démo Castlevania donc on est en droit de douter. Du coup c'est une bonne occasion de parler du scrolling sur Intellivision et de voir ce qu'il est possible de faire ou pas.
Pour comprendre pourquoi la vidéo peut interpeller il faut replacer dans le contexte. L'intellivision est une très vieille machine avec une mise sur le marché qui débute fin 1979. La Colecovision qu'on lui oppose souvent apparaît mi 82 et donc chronologiquement plus proche de la Famicom (mi 83) que de l'Intellivision mais pourtant dépourvu de support hardware du scrolling comme toutes les machines a base de TMS9918A (Coleco, MSX, SG-1000). On ne compte plus les jeux Coleco (ou MSX, SG-1000) pointé du doigt pour leurs scrolling "a la tuile" très saccadés. Avec de grosses bidouilles et de grosses contraintes on pouvait simuler un scrolling au pixel mais on est vraiment dans l'exception (J'ai moi même codé un scrolling de ce genre sur Coleco pour une démo technique: Vidéo démo smooth scrolling sur Coleco )
Donc on aurait pu naturellement associer les mêmes maux a l'Intellivision mais il n'en est rien. L'intellivision était accompagné de ce qui est peut être le tout premier GPU "moderne" (Avec Tilemap, Tileset, 2D Sprite Hardware...) tel qu'on trouvera ensuite dans toutes nos consoles et qui était relativement calibré aussi pour le scrolling grâce a différents choix technologiques. C’était pas très visible dans la première vie de l'Intellivision (la période Mattel 80-83) mais après le rachat de la marque (période INTV 85-89) ca sera plus évident. Notamment les tiers qui n'auront jamais accès a la documentation des routines du bios, seront bien obligé de développer leurs propres routines ce qui sera au final plutôt un gain de performance.
On a donc quand même un certain nombre d'exemples de jeux a scrolling et même des exemples de jeu a scrolling multidirectionnel comme Hover Force, Safe Cracker, Stadium Mud Buggies, Motocross, Auto Racing , AD&D, Microsurgeon, The Dreadnaught Factor.
Ce genre de jeu a scrolling mutlidirectionnel n'ont pas des framerates incroyables (et c'est le cas aussi de beaucoup d'autre jeux Intellivision a cause d'un CPU poussif et d'un usage excessif des routines du bios). Ca tourne entre 15fps et 30fps au mieux. Mais ça fonctionne et c'est plutôt impressionnant malgré la faible résolution de la machine (159x96 en 16 couleurs).
On a aussi River Raid qui sert souvent de démo technique de scrolling sur tous les supports et qui une fois de plus ne déroge pas a la règle avec un scrolling vertical au pixel a 60fps (mais ici pas de bidouille, ça utilise juste les aptitudes de la machine)
C'est même une version très intéressante de River Raid car sur cette version ils ont matérialisé visuellement et physiquement une foret dans le décor qui exploite le système de collision hardware de la machine pour gérer les collisions au pixel entre le joueur et chaque arbre (pas de hit-box ici) ce qui a permis de customiser le gamedesign de cette version du jeu en autorisant le joueur a sortir de la rivière a condition qu'il évite les arbres. Donc une excellente version de River Raid.
Entrons maintenant dans le dure, a réserver uniquement a ceux d'entre vous qui sont friand de détails techniques pour les autres vous pouvez sauter ce paragraphe sans être perdu.
Quelles sont exactement les attributs de l'Intellivision qui lui permettent de faire un vrai scrolling?
Premièrement le chip graphique de l'Intellivision propose un registre d'offset qui permet de décaler l'image de quelques pixels (entre 0 et 7). C'est cette fonction qui va permettre de faire un scrolling au pixel et qui manque au TMS9918A. A cela s'ajoute la possibilité de désactiver l'affichage sur le bord gauche (ou en haut) pour cacher justement les glitch produit par cette offset.
Décaler l'image de 7 pixels c'est bien mais c'est pas suffisant pour faire un scrolling et c'est la que les choses se compliquent. au delà de 7 pixels Il va falloir ensuite décaler tout le background a la main (c'est a dire au CPU). Ce qui revient a déplacer d'une case une a une toute les tuiles de la tilemap et ainsi effectuer un décalage de l'image de 8 pixels (la taille d'une tuile) tel qu'on le fait déjà pour un scrolling a la tuile sur Coleco ou MSX. Et ensuite on peut alors reprendre a nouveau le décalage au pixel par offset (après l'avoir reset) pour continuer le scrolling au pixel et on recommence cette boucle a l'infini pour avoir un jolie scrolling.
Mais le décalage (ou shift) de la tilemap a faire au CPU c'est une tache lourde. C'est ce qui différencie l'Intellivision de la Famicom qui a apporté un vrai support complet du scrolling hardware avec un espace mémoire de la tilemap qui boucle sur lui même comme un rouleau (ou un tore car c'est valable dans toutes les directions) et qui du coup ne nécessite pas de manipulation du background. Sur Famicom pour faire un scrolling on a juste a jouer avec l'offset qui a une amplitude total. Y a aucune tache coûteuse. L'intellivision sur ce point ressemble plutôt au C64 qui fonctionne sur le même principe pour le scrolling (offset 0-7 pixels + décalage au CPU de l'intégralité de la tilemap tout les 8 pixels si on fait abstraction du trick VSP). C'est d'ailleurs pas les seules similitudes avec le C64, y a aussi les 8 sprites sans multiplexage hardware ou la résolution horizontal qui peut aussi être de 160 pixels. Du coup l'analogie du C64 est pas mauvaise.
Non seulement cette tache de shifter la tilemap est une tache lourde mais en plus sur Intellivision on ne peut pas double-bufferiser la tilemap comme on pourrait le faire sur les autres machines tel le C64 ou la Coleco ce qui complique beaucoup les choses. Ca veut dire pas de possibilité de diluer cette tache sur plusieurs frames et on est obligé de travailler directement sur la tilemap qui est utilisé au même moment par le chip graphique pour l'affichage ainsi si la tache du shift de tilemap est exécuté trop lentement ca produira des glitch a l’écran (du tearing). Faudra faire aussi avec le poids des tuiles Intellivision riche en attribut et qui pèse 14bit chacune ce qui est beaucoup (C'est plus que sur NES color map compris). En plus de cela s'ajoute un problème de ressource car malgré que le CPU de l'Intellivision soit 16bit (C'est l'une des curiosités de l'Intellivision, il est même plus 16bit que celui de la SNES d'une certaine façon) il est quand même très lent. C'est même le seul CPU de toute l'histoire des consoles de salon a être en dessous du Mhz (0.9 Mhz) et ses instructions prennent plus de cycles que l'emblématique 6502. C'est un CPU plus proche d'un Z80 mais avec une fréquence 4 fois plus faible que le Z80 d'une Colecovision ce qui fait une sacré différence. Mais c'est pas tout. Le CPU est régulièrement interrompu (et bloqué) pendant l'affichage par le chip graphique qui a besoin d’accéder a la RAM. Ca représente 10% des ressources CPU qui sont perdu a cette occasion.
Une fois que tout ça est posé normalement on peut commencer a douter sérieusement qu'il soit possible de faire un jeu avec un jolie scrolling propre au pixel sans glitch a 60fps mais il y a aussi quelques éléments positif pour aider a s'en sortir.
La première chose qui va aider c'est que la tilemap est stocké dans la RAM principale du CPU et donc directement accessible par celui ci et cela même pendant la période d'affichage du coup on est pas condamné a devoir faire ce shift pendant la courte période du Vblank. Faudra juste démarrer quelques part pendant le Vblank en commençant par shifter la première rangé de tuile de la tilemap et réussir ensuite a exécuter le reste du shift rangé par rangé plus rapidement que le balayage de l’écran pour le prendre de vitesse.
De plus cette RAM ci est 16bit (y a d'autre RAM 8bit dans la machine mais celle ci est 16bit) ce qui veut dire que chaque tuile de 14bit va pouvoir être manipulé plus facilement en un seul accès par le CPU 16bit. Il se trouve aussi que le CPU a pas mal de registres dont des registres qui servent pour l'adressage indexé et qui s'auto-incrémente. Tout ça est plutôt une bonne chose pour copier un bloc de data 16bit d'un espace a l'autre de la mémoire, justement ce qu'on a besoin pour faire le shift des tuiles. Dans ce contexte précis le CPU de l'Intellivision revient un peu dans la course (tout en restant a la traîne) par rapport aux autres CPU console.
Et pour terminer, la faible résolution de l'Intellivision implique que la tilemap elle même a une résolution faible de 20x12 tuiles donc un total de seulement 240 tuiles (exactement le quart d'un écran NES composé de 960 tuiles) et ça c'est une très bonne nouvelle. Ca fait finalement peu de tuile a déplacer.
Tout cela combiné, les faiblesses et les atouts, on peut dire après calcul a l'aide du datasheet du CPU que le shift (et mise a jour) de la tilemap pour un scrolling horizontal doit prendre 33% des ressources CPU de la frame soit un tiers. C'est une petite victoire. Ca veut dire qu'on doit pouvoir shifter plus rapidement que le balayage de l’écran et qu'on aura même du rab pour faire tourner le reste du moteur du jeu et peut être espérer ne pas droper la frame.
Oui l'Intellivision a les atouts pour faire tourner un jeu avec un scrolling propre au pixel sans glitch a 60fps. Les paramètres semblent même avoir été consciemment ajustés pour que cela soit possible. C'est une console qui semble bien avoir été conçu avec l'objectif du scrolling en ligne de mire même si on est pas face a un support hardware complet comme dans une Famicom qui propose un scrolling vraiment "free". Ici le scrolling a un coût et un coût qui est très condensé et ponctuel (une forte charge mais seulement sur une frame toute les X frames) ce qui peut être un peu pénible a intégrer dans un moteur mais au moins elle permet de faire ce qu'on ne peut pas faire sur Colecovision ou MSX.
L'intellivision n'a pas seulement ce support du scrolling ou ce CPU 16bit comme curiosité. C'est une machine plein de surprise. Elle a notamment énormément d'attributs pour les sprites ce qui lui permet une forme de gestion hardware des collisions assez poussé ou de pouvoir gérer les priorités d'affichage entre sprite et background (autre élément qui manque cruellement au TMS9918A et donc a la Coleco, MSX, SG-1000).
C'est aussi la seule console (et la seule machine a ma connaissance) a utiliser des cartouches avec des ROM composés non pas d'octets mais de decles. Ce sont des mémoires 10bit. Un choix économique lié au CPU qui utilise des opcodes 10bit pour ses instructions. Ca permet au code de prendre moins de place sur la cartouche qu'avec une ROM 16bit ou 8bit (par contre les data 8bit ou 16bit eux gâcheront un peu de place). Mais c'est peut être Général Instrument qui a poussé dans ce sens car l'autre particularité de cette machine c'est que le hardware est signé 100% GI qu'on ne connait plus aujourd'hui mais qui était un acteur majeur des semi-conducteurs, concurrent de Texas Instrument, et très large leader et fournisseur des pong-chips des centaines de pong-machines de l'époque. Leader aussi des soundchip PSG console/micro/arcade. GI a conçu et fournit tous les chips de l'Intellivision... et du coup avec cette histoire de decles fournissait aussi les ROM de toutes les cartouches, c'est futés :). Mais on se retrouve avec une machine composé de trop de chip (peu d'effort d'intégration par rapport a une VCS ou une NES très économique) et une architecture mémoire très complexe (qui mélange mémoire 8bit, 10bit et 16bit)
Du coup vous devinez aussi que son soundchip PSG était plutôt en avance, supérieur même a celui de notre chère Master System. C'est ni plus ni moins celui qu'on retrouvera un peu partout dans nos machines dont l'Atari ST (après rachat de la licence par Yamaha) mais qui ne sera jamais vraiment exploité ici (pas assez de ressource CPU,RAM,ROM et aucune expérience de la chiptune a l'époque). Voici justement une musique de Castlevania par celui qui a fait la demo Castlevania. Une musiques qui utilise simplement les fonctions intégrés au IntyBasic mais qui une fois intégré a la démo fera sans doute droper des frames.
Dans la liste des curiosités y a aussi son controleur (décrié) qui a cette singularité d’être 16 way (8 way + les diagonales) ce qui n'est vraiment pas ordinaire. C'est utilisé par exemple dans la version Intellivision de Commando qui permet de s'orienter (et tirer) dans 16 directions ou dans le jeu de buggy que je vous ai mis en gif plus haut. Maintenant en émulation nos stick analogique émulent cela très bien pour en profiter dans de meilleurs conditions.
C'est aussi la première console qui a eu un service de jeu dématérialisé distribué par le câble TV "Playcable" et encore une fois fournis par General Instrument en 1981 (Oui on peut le dire, l'Intellivision est une console GI).
Plus anecdotique mais quand même surprenant: Le CPU n'a pas d’opérateur logique OR (y a du AND, NOT, XOR). Il faut donc l’éviter ou le simuler en combinant d'autres opérateurs ce qui peut être coûteux. C'est plutôt exceptionnel pour un CPU, c'est la seule console dans ce cas. Du coup exécuter un simple OR peut prendre jusqu'a 24 fois plus de temps que sur une Colecovision! (Seule consolation, sur Intellivision ça sera un OR 16bit forcement)
C'est vraiment une machine assez surprenante. Une curiosité qu'il faut connaitre malgré son catalogue de jeu pas très passionnant mais qui au moins n'est pas submergé par les adaptations de jeu d'arcade et qui donc a aussi ses curiosités softwares ( moi j'y joue en émulation avec Bizhawk, ca marche bien).
Si vous en voulez encore j'en profite pour mettre ici la vidéo que j'avais fais sur la machine y a quelques temps (c'est largement facultatif, j'ai a peu prêt tout résumé ici, c'est pour les gourmands qui veulent plus de détail):
N'hesitez pas a utiliser les commentaires