Zoom hardware avec BPLxMOD et BPLCON1 sur Amiga

Le choc de l’arrivée de la Super Nintendo fin 1991 pour les amateurs de micros 16 bits, ce fut le Mode 7. La console était capable d’appliquer une rotation et un redimensionnement à un bitmap de grande taille dans la trame, et il était possible de trafiquer pour produire un effet de perspective.
L’Amiga 500 était doublement handicapé pour parvenir à produire de tels effets : pas de circuit spécialisé pour cela, et une organisation des données affichées sous forme de bitplanes exigeant, pour y parvenir, de nombreuses opérations au CPU et/ou au Blitter. Toutefois, cela n’empêcha pas certains de produire des effets du genre, par exemple le zoom au démarrage de la démo World of Commodore 92 de Sanity :
Zoom dans la démo World of Commodore 92 de Sanity
Parmi tous ces effets de zoom avec ou sans perspective, la plupart se sont appuyés sur le zoom vertical hardware, découvert dès les débuts de l’Amiga, et certains sur le zoom horizontal hardware, qui l’a été bien plus tard.
Comment procéder à l’un et l’autre de ces zooms avec le hardware ? En particulier, quel est ce fameux « $102 trick » régulièrement évoqué dans les forums de demomakers, souvent succinctement, et parfois abusivement ? Et dans quelle mesure est-il possible de zoomer ainsi ? Tout cela et plus encore dans ce qui suit.
Mise à jour du 12/09/2018 (matin) : Modification de la fin de la section sur le passage de la dissimulation à la suppression, pour expliquer pourquoi et comment il faut optimiser.
Mise à jour du 11/09/2018 (soir) : Ajout d’un paragraphe et d’une figure pour expliquer pourquoi le zoom horizontal hardware limite à 4 le nombre de bitplanes.
Mise à jour du 11/09/2018 (matin) : Correction de la figure représentant le scénario du zoom horizontal hardware (une étape de trop!) et de la « magic table » (bogue dans le programme HTML5 générateur!).
Continuer la lecture de « Zoom hardware avec BPLxMOD et BPLCON1 sur Amiga »
Zoom hardware avec BPLxMOD et BPLCON1 sur Amiga

Quelques routines en assembleur pour demomaker sur Amiga

Celui qui débute dans la programmation du hardware de l’Amiga en assembleur MC68000 se gratte souvent la tête pour exécuter des fonctions basiques : charger et afficher une image, lire les touches du clavier, etc.
Le fameux "KingTut.iff" de Deluxe Paint
« King Tut », le fichier IFF ILBM par excellence, dessiné par Avril Harrison en 1986 pour Deluxe Paint. © Electronic Arts.
Pour lui simplifier la tâche, cette page met à disposition le source de routines couvrant de telles tâches, qu’on a voulu abordables en se limitant au strict minimum.
Pour l’heure, on trouvera les sources des routines suivantes… :
Pour assembler ce code avec ASM-One, il est nécessaire de disposer de ce fichier qui contient la liste des offsets des registres du hardware.
L’article sera enrichi au fil des réalisations. Ces mises à jour seront signalées.
Mise à jour du 19/08/2018 : Correction d’un bogue dans l’interprétation de la valeur retournée par Read () dans IFF.s.
Continuer la lecture de « Quelques routines en assembleur pour demomaker sur Amiga »
Quelques routines en assembleur pour demomaker sur Amiga

Afficher des sprites et des BOBs sur Amiga OCS et AGA (2/2)

Cet article est le second – et donc dernier – d’une série de deux consacrée à l’affichage de bitmaps sur Amiga. Dans le premier article, nous avons exploré dans le détail les sprites du hardware. A cette occasion, il est apparu que les sprites sont comme les hobbits : pratiques et colorés, mais petits et peu nombreux. Et même si le hardware permet d’en démultiplier apparemment le nombre en les découpant ou en les répétant, recourir à ces astuces reste assez contraignant.
C’est pourquoi une autre solution a souvent été préférée pour afficher des bitmaps : les BOBs. Le BOB est un bitmap affiché à l’aide du Blitter, le coprocesseur dont la fonctionnalité la plus notoire est la copie des données d’une ou plusieurs zones de mémoire vers une autre.
Des vector balls (avec quelques droites pour mieux constater la 3D)
Comment afficher un BOB ? Et ne faut-il pas alors assurer soi-même toutes ces tâches qui étaient prises en charge automatiquement par le hardware s’agissant de sprites : transparence, recover, clipping, détection de collisions, etc ? Tout cela et plus encore dans ce qui suit.
Mise à jour du 14/08/2018 : Mise à jour de bobRAW.s et bobRAWB.s dans l’archive, car les versions proposées ne mettaient pas en oeuvre le masquage présenté !
Mise à jour du 11/08/2018 : Ajout de perfectBob.s dans l’archive, une version améliorée de bobRAWB.s où la partie rectangulaire du décor que le BOB recouvre est précisément ou globalement restaurée au Blitter.
Mise à jour du 05/08/2018 : Précision apportée sur la nécessité d’utiliser b (l’inverse du masque) et non B (le masque) comme source dans la combinaison logique utilisée par le Blitter.
Continuer la lecture de « Afficher des sprites et des BOBs sur Amiga OCS et AGA (2/2) »
Afficher des sprites et des BOBs sur Amiga OCS et AGA (2/2)

Afficher des sprites et des BOBs sur Amiga OCS et AGA (1/2)

Quoi de plus confortable qu’un sprite ? Le coprocesseur graphique l’affiche en laissant voir le décor derrière ses pixels transparents, et il préserve le décor derrière ses autres pixels pour le restaurer quand le sprite est déplacé. Par ailleurs, il découpe le sprite s’il sort de l’écran.
Malheureusement, les capacités de l’Amiga 500 sont en la matière très limitées. Huit sprites de 16 pixels de large, même de hauteur infinie, en 4 couleurs dont une transparente, seulement ? C’est la dèche…
Les sprites n’en conservent pas moins une certaine utilité, à condition d’en utiliser pleinement le potentiel. Ainsi, il est possible de les attacher pour former jusqu’à un bitmap de 64 pixels de large, de hauteur infinie, en 16 couleurs dont une transparente, notamment. Ou alors, il est possible d’en réutiliser pour créer un playfield supplémentaire, dont le contenu devra toutefois être un motif répétitif qui, dans le meilleur des cas, occupera 48 pixels de large sur une hauteur infinie, en peu de couleurs. Par ailleurs, l’Advanced Graphics Architecture, dont l’Amiga 1200 est doté, dispose de fonctionnalités un peu étendues en matière de sprites. En particulier, leur largeur unitaire passe de 16 à 64 pixels.
Des sprites un peu plus mieux en AGA
Comment afficher des sprites ? Et utiliser les sprites pour afficher un gros et beau bitmap, ou un playfield supplémentaire ? Et enfin utiliser les sprites sur AGA, sachant que Commodore n’a jamais documenté ce hardware ? Tout cela et plus en encore dans ce premier article consacré à l’affichage de bitmaps sur Amiga OCS et AGA.
Mise à jour du 08/07/2018 : Correction d’un bogue dans triplePlayfield.s.
Continuer la lecture de « Afficher des sprites et des BOBs sur Amiga OCS et AGA (1/2) »
Afficher des sprites et des BOBs sur Amiga OCS et AGA (1/2)

WAIT, SKIP et COPJMPx : un usage avancé du Copper sur Amiga (1/2)

La programmation du Copper sur Amiga est très particulière. Tout d’abord, ce coprocesseur graphique ne comprend que trois instructions, MOVE, WAIT et SKIP, auxquelles il est toutefois possible de rajouter JUMP, quoiqu’elle ne se code pas comme les autres. Ensuite, on n’écrit pas du code pour le Copper comme on écrit du code pour le 68000 : point de mnémoniques, il faut écrire directement en opcodes. Enfin, WAIT et SKIP présentent certaines limitations dont la prise en compte conduit à complexifier le code dès que ce dernier doit pouvoir fonctionner quelle que soit la ligne que le faisceau d’électrons – le raster – est en train de balayer à l’écran.
Paradoxalement, ces limitations n’entravent généralement pas la programmation d’effets visuels complexes comme le plasma ou l’affichage d’une image true color en plein écran – oui, l’Amiga 500 peut afficher en true color, et sans utiliser aucun bitplane par ailleurs -, c’est-à-dire sur toute la largeur des 320 pixels et toute la hauteur des 256 lignes de pixels d’une surface classiquement utilisée dans une démo en PAL. La surprise du codeur n’en est que plus grande quand il s’y heurte. Pour les dépasser, il faut exploiter l’information qui réside dans une section assez cryptique de l’Amiga Hardware Reference Manual. Explications.
Un effet plasma (un plasma RGB pour être plus exact)

Continuer la lecture de « WAIT, SKIP et COPJMPx : un usage avancé du Copper sur Amiga (1/2) »

WAIT, SKIP et COPJMPx : un usage avancé du Copper sur Amiga (1/2)

Des sources de cracktros et d’intros sur Amiga

14 juillet oblige, feu d’artifice de sources ! Pour clore un bon mois de retour dans le passé sur la programmation en assembleur 68000 du hardware de l’Amiga, voici une collection de sources de cracktros et d’intros sur cette machine.
Intros et cracktros sur Amiga
Elles ont été réalisées au début des années 1990 pour différents groupes de warez (Skid Row, Interpol, Paradox, Fairlight ou Passwords) ainsi que pour le groupe Comotion et pour une BBS allemande, Skara Brae.
Toutes ces cracktros et intros ont été codées en assembleur 68000 attaquant directement le hardware de l’Amiga, tout particulièrement deux coprocesseurs graphiques qui ont fait l’objet de présentations détaillées dans de précédents articles : le Blitter et le Copper.
A l’exception de l’intro pour Comotion qui reprend un module de Modesty, Code by Yragael, Music by Monty, comme expliqué dans les textes qui y apparaissent.
Mise à jour du 18/09/2017 : la carte de voeux 1993 est disponible sur Flashtro.
Mise à jour du 03/08/2017 : l’intro pour Skara Brae est disponible sur Flashtro.
Mise à jour du 19/07/2017 : l’intro pour Comotion est disponible sur Flashtro.
Continuer la lecture de « Des sources de cracktros et d’intros sur Amiga »
Des sources de cracktros et d’intros sur Amiga

Utiliser l’interruption VERTB sur Amiga

Un dernier pour la route ! Dans la foulée des précédentes séries d’articles prenant pour prétexte la programmation d’une cracktro (1 et 2) et celle d’un sine scroll (1, 2, 3, 4 et 5), pour présenter dans le détail la manière d’attaquer le hardware de l’Amiga 500 en assembleur 68000 après avoir court-circuité l’OS, il convient de revenir sur un point délicat qui a été soulevé, à savoir celui de la gestion des « interruptions hardware ».
Le problème plus particulièrement étudié est le suivant : comment mettre sous « interruption VERTB » un bout de code dont l’unique fonction est de modifier la couleur de fond (COLOR00) ? Pour bien en visualiser les effets, nous allons élaborer un scénario au fil duquel la couleur de fond sera notamment modifiée par un tel bout de code quand le faisceau d’électrons atteint certaines positions verticales :
Changement de COLOR00 par le Copper, le programme principal et un gestionnaire d'interruption VERTB
Cliquez ici pour télécharger le source du programme présenté ici.
Continuer la lecture de « Utiliser l’interruption VERTB sur Amiga »
Utiliser l’interruption VERTB sur Amiga

Coder un sine scroll sur Amiga (5/5)

Cet article est le cinquième et dernier article d’une série de cinq consacrés à la programmation d’un one pixel sine scroll sur Amiga, un effet très utilisé par les coders de démos et autres cracktros durant un temps. Par exemple, dans cette cracktro du groupe Angels :
Sine scroll dans une cracktro du groupe Angels
Dans le premier article, nous avons vu comment installer en environnement de développement sur un Amiga émulé avec WinUAE et coder la Copper list de base pour afficher quelque chose à l’écran. Dans le deuxième article, nous avons vu comment préparer une police de caractères 16×16 pour en afficher facilement les colonnes de pixels des caractères, précalculer les valeurs du sinus requises pour déformer le texte en modifiant l’ordonnée des colonnes, et mettre en place un triple buffering pour alterner proprement les images à l’écran. Enfin, dans le troisième article, nous avons vu comment dessiner et animer le sine scroll, d’abord au CPU, puis au Blitter. Dans le quatrième article nous avons vu comment enjoliver le sine scroll avec quelques effets peu coûteux en cycle assurés par le Copper.
Dans ce cinquième et dernier article, nous allons optimiser le code afin d’être bien certain de tenir dans la trame, et nous protéger des lamers tentés de modifier le texte. Pour terminer, nous verrons s’il n’y a pas quelques leçons à tirer de cette immersion dans la programmation en assembleur du hardware de l’Amiga.
Cliquez ici pour télécharger l’archive contenant le code et les données du programme présenté ici – c’est la même que dans les autres articles.
NB : Cet article se lit mieux en écoutant l’excellent module composé par Nuke / Anarchy pour la partie magazine de Stolen Data #7, mais c’est affaire de goût personnel…
Mise à jour du 12/07/2017 : perfomances améliorées suite à la suppression du positionnement de BLTPRI dans DMACON.
Click here to read this article in english.
Continuer la lecture de « Coder un sine scroll sur Amiga (5/5) »
Coder un sine scroll sur Amiga (5/5)

Coder un sine scroll sur Amiga (4/5)

Cet article est le quatrième article d’une série de cinq consacrés à la programmation d’un one pixel sine scroll sur Amiga, un effet très utilisé par les coders de démos et autres cracktros durant un temps. Par exemple, dans cette intro, aussi magnifique que vintage, du groupe Miracle :
Sine scroll dans une intro du groupe Miracle
Dans le premier article, nous avons vu comment installer en environnement de développement sur un Amiga émulé avec WinUAE et coder la Copper list de base pour afficher quelque chose à l’écran. Dans le deuxième article, nous avons vu comment préparer une police de caractères 16×16 pour en afficher facilement les colonnes de pixels des caractères, précalculer les valeurs du sinus requises pour déformer le texte en modifiant l’ordonnée des colonnes, et mettre en place un triple buffering pour alterner proprement les images à l’écran. Enfin, dans le troisième article, nous avons vu comment dessiner et animer le sine scroll, d’abord au CPU, puis au Blitter.
Dans ce quatrième article, nous allons enjoliver le sine scroll avec quelques effets peu coûteux en cycles car assurés par le Copper, et rendre la main aussi proprement que possible à l’OS.
Cliquez ici pour télécharger l’archive contenant le code et les données du programme présenté ici – c’est la même que dans les autres articles.
NB : Cet article se lit mieux en écoutant l’excellent module composé par Nuke / Anarchy pour la partie magazine de Stolen Data #7, mais c’est affaire de goût personnel…
Mise à jour du 17/07/2017 : attente du Blitter avant de procéder à la finalisation.
Click here to read this article in english.
Continuer la lecture de « Coder un sine scroll sur Amiga (4/5) »
Coder un sine scroll sur Amiga (4/5)

Coder un sine scroll sur Amiga (3/5)

Cet article est le troisième d’une série de cinq consacrés à la programmation d’un one pixel sine scroll sur Amiga, un effet très utilisé par les coders de démos et autres cracktros durant un temps. Par exemple, dans cette cracktro du groupe Supplex :
Sine scroll dans une cracktro du groupe Supplex
Dans le premier article, nous avons vu comment installer en environnement de développement sur un Amiga émulé avec WinUAE et coder la Copper list de base pour afficher quelque chose à l’écran. Dans le deuxième article, nous avons vu comment préparer une police de caractères 16×16 pour en afficher facilement les colonnes de pixels des caractères, précalculer les valeurs du sinus requises pour déformer le texte en modifiant l’ordonnée des colonnes, et mettre en place un triple buffering pour alterner proprement les images à l’écran.
Dans ce troisième article, nous allons rentrer dans le vif du sujet en voyant comment dessiner et animer le sine scroll, d’abord au CPU, puis au Blitter.
Cliquez ici pour télécharger l’archive contenant le code et les données du programme présenté ici – c’est la même que dans les autres articles.
NB : Cet article se lit mieux en écoutant l’excellent module composé par Nuke / Anarchy pour la partie magazine de Stolen Data #7, mais c’est affaire de goût personnel…
Click here to read this article in english.
Continuer la lecture de « Coder un sine scroll sur Amiga (3/5) »
Coder un sine scroll sur Amiga (3/5)