Une compilation d’articles sur la programmation en assembleur du hardware de l’Amiga

Rien n'est éternel, et certainement pas ce blog. Mais à quoi bon avoir rédigé tant d'articles pour expliquer la programmation en assembleur du hardware de l'Amiga en prenant pour prétexte la réalisation de cracktros, si cela devait être perdu un jour ?
Yragael's stash of code
Pour prévenir le drame, j'ai converti tous les articles concernés sous forme de pages Web, et réuni ces dernières ainsi que le code et les données des cracktros évoquées au sein d'une seule et même archive. Ainsi tout les articles peuvent être consultés hors ligne. Il y a même quelques bonus, pour ceux qui iront fouiller dans les répertoires.
N'hésitez pas à télécharger cette archive et à la faire circuler auprès de ceux que la programmation en assembleur du hardware de l'Amiga pourrait intéresser.
Pour nos amis germanophiles, je signale qu'un travail similaire d'archivage a été réalisé par le sympathique Göran Strack en septembre 2023. Au prix d'un bel effort, ce dernier a tout traduit en allemand et mis l'ensemble à disposition sur Aminet sous la forme de l'archive dev/asm/asm-kurs_stashofcode.lha. Merci à lui !
Continuer la lecture de "Une compilation d’articles sur la programmation en assembleur du hardware de l’Amiga"
Une compilation d’articles sur la programmation en assembleur du hardware de l’Amiga

Scoopex « THREE » : Le coding-of d’un menu de trainer sur Amiga

Sur Amiga, le trainer était essentiellement un menu enjolivé par un FX et une musique, qui permettait d'activer des options pour tricher dans un jeu : "Vie illimitées: On/Off", et ainsi de suite. Dans bien des cas, le trainer a pu être le seul moyen de parvenir à profiter totalement d'un jeu sans y passer trop de temps, vu la difficulté. Ne termine pas Shadow of the Beast qui veut...
Dans la continuité d'un programme d'hommages aux différentes figures de la scène, voici Scoopex "THREE", un trainer produit pour le fameux StingRay du glorieux groupe Scoopex. Après Scoopex "TWO" rendant hommage aux graphistes, un hommage aux crackers, donc.
Scoopex THREE : Un trainer pour A500 en 2019
Comme on pourra le constater, l'originalité a pris ici le pas sur la technique. Du moins en apparence, car en matière de programmation du hardware en assembleur sur Amiga, tout devient finalement assez technique rapidement !
Code, data et explications dans tout ce qui suit...
Mise à jour du 08/12/2019 : Le menu a été magnifiquement porté sur Flashtro. C'est ici !
Ce menu n'a toujours pas été utilisé par StingRay, mais comme dans le cas de Scoopex "ONE" j'ai jugé qu'après des mois d'attente, il était nécessaire... de ne plus attendre. A priori, il devrait être utilisé sous peu. On verra bien...
Continuer la lecture de "Scoopex « THREE » : Le coding-of d’un menu de trainer sur Amiga"
Scoopex « THREE » : Le coding-of d’un menu de trainer sur Amiga

Scoopex « ONE » : Le coding-of d’une cracktro AGA sur Amiga

Comme il en a été question dans un long article sur le coding-of de Scoopex "TWO", Scoopex "ONE" était restée dans les cartons. En effet, au moment de la diffusion de Scoopex "TWO" sur Amiga 500, il s'était avéré que cette cracktro, et celle qui devait la précéder sur Amiga 1200, ne tournaient dans la trame que du fait d'une erreur de configuration de WinUAE. L'émulation n'était pas fidèle, le hardware ne volant pas autant de cycles au MC68000 que dans la réalité.
Dans Scoopex "TWO", le problème fut résolu par downsizing. Restait à trouver une solution pour Scoopex "ONE". C'est à l'occasion de la programmation d'une BBS-intro à venir pour le groupe Desire qu'elle fut trouvée. Voici donc le détail du coding-of de Scoopex "ONE", une cracktro pour Amiga 1200 :
Scoopex "ONE" : Une cracktro pour A1200 en 2019
Cette cracktro exploite quelques possibilités offertes par le chipset AGA (Advanced Graphics Architecture) : l'affichage en 256 couleurs, et le mode "burst" permettant au hardware de lire les données des bitplanes par paquets de 64 bits. En tant que telle, cette cracktro constitue une bonne introduction à la programmation du hardware de l'Amiga 1200, pour ceux qui souhaitent renouer avec le passé de la plus glorieuse gamme de micro-ordinateurs.
Cette cracktro n'a toujours pas été utilisée par Scoopex, mais j'ai jugé qu'après des mois d'attente, il était nécessaire... de ne plus attendre. A priori, elle devrait être utilisée pour la release d'une version AGA de Hired Guns. On verra bien...
Continuer la lecture de "Scoopex « ONE » : Le coding-of d’une cracktro AGA sur Amiga"
Scoopex « ONE » : Le coding-of d’une cracktro AGA sur Amiga

Scoopex « TWO » : Le coding-of d’une cracktro sur Amiga 500

Et voilà ! On promet que c'est le dernier pour la route, et on s'en remet un malgré tout. Difficile de décrocher de la programmation en assembleur du hardware vidéo de l'Amiga 500, tant que la connaissance de ce dernier semble à parfaire, qu'il se trouve des FX à créer ou, plus modestement, à reproduire.
Un quart de siècle après la "dernière", trinquons donc encore ensemble avec Scoopex "TWO", cracktro codée en 2018 en guise d'appetizer pour le portage du jeu Starquake par Galahad du glorieux groupe Scoopex.
Scoopex "TWO" : Une cracktro pour A500 en 2018
Au menu : BOBs qui bougent, printer qui affiche, et rotozoom qui tourne. Et comme toujours, quelques leçons de portée plus générale que le sujet initial ne semblerait offrir l'opportunité d'en dispenser.
Mise à jour du 22/11/2018 : Optimisation du code JavaScript du rotozoom pour le mettre à disposition de l'auteur du portage de la cractro en HTML5 sur Flashtro.
Mise à jour du 19/11/2018 : Ajout d'un encadré (un peu long, mais me semble-t-il intéressant) sur l'enjeu pour l'authenticité que soulève l'émulation d'un jeu.
Mise à jour du 18/11/2018 : Cliquez ici pour télécharger copperScreen.s, un programme qui permet de générer un écran au Copper de n'importe quelle hauteur à n'importe quelle position verticale.
Mise à jour du 17/11/2018 : En complément, une vidéo de la cracktro est disponible sur YouTube. Par ailleurs Galahad raconte l'intéressant making-of du portage du jeu dans un fil de l'English Amiga Bord.
Continuer la lecture de "Scoopex « TWO » : Le coding-of d’une cracktro sur Amiga 500"
Scoopex « TWO » : Le coding-of d’une cracktro sur Amiga 500

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 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!).
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 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 01/10/2018 : Tous les sources ont été modifiés pour intégrer une section "StingRay's stuff" qui permet d'assurer le bon fonctionnement sur tous les modèles d'Amiga, notamment dotés d'une carte graphique.
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.
Mise à jour du 02/10/2018 : Tous les sources ont été modifiés pour intégrer une section "StingRay's stuff" qui permet d'assurer le bon fonctionnement sur tous les modèles d'Amiga, notamment dotés d'une carte graphique.
Mise à jour du 13/10/2018 : Correction d'un bogue dans le code attendant qu'il s'écoule deux lignes rasters pour acquitter l'interruption du CIA.
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 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.
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 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 01/10/2018 : Tous les sources ont été modifiés pour intégrer une section "StingRay's stuff" qui permet d'assurer le bon fonctionnement sur tous les modèles d'Amiga, notamment dotés d'une carte graphique.
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.
Mise à jour du 01/10/2018 : Tous les sources ont été modifiés pour intégrer une section "StingRay's stuff" qui permet d'assurer le bon fonctionnement sur tous les modèles d'Amiga, notamment dotés d'une carte graphique.
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)
Mise à jour du 14/01/2019 : J'ai oublié de mentionner qu'ayant la flegme de terminer la rédaction de la seconde partie, j'en ai inclu l'essentiel dans ici. En effet, le rotozoom s'appuie sur une solution au problème évoqué à la fin du présent article.
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 19/07/2017 : l'intro pour Comotion est disponible sur Flashtro.
Mise à jour du 03/08/2017 : l'intro pour Skara Brae est disponible sur Flashtro.
Mise à jour du 18/09/2017 : la carte de voeux 1993 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