Page 1 of 1

[eZ80] Programmer des Rasters (ou Rasterbars)

Unread postPosted: 25 Mar 2016, 20:38
by grosged
Salut à tou(te)s !

Je ne vous cache pas qu'il m'arrive parfois d'être empreint d'une certaine nostalgie : les années CPC !
Vous savez cet ordinateur familial 8bit (doté d'un... Z80!) qui a débarqué en France dès l'automne 1984 ? Au départ disponible en clavier...QWERTY !
(c'était le cas du mien, tout droit venu d'Angleterre!) et décliné en version "lecteur de cassette" (CPC464) ou lecteur de disquette (CPC 664) puis, quelques mois plus tard en version disquette et 128Ko de ram (CPC6128) et pour le moniteur : en version monochrome (vert!) ou couleur .
Bref, je vais en venir au vif du sujet : je veux vous parler de l'effet graphique appelé rasters ou rasterbars
(un bel exemple ici : https://www.youtube.com/watch?v=Oc20_swFSMc )

Et je me suis dit qu'étant donné l'utilisation de palette de couleur (en mode 8bpp, 4bpp, 2bpp, 1bpp) sur la TI83 Premium CE, c'était possible de programmer des rasters sur la TI83Premium CE !!

En fait , faire un raster c'est modifier plusieurs fois tout ou partie de la palette de couleur, et ce de façon si rapide que tout doit être fait le temps d'une synchronisation verticale.
Dans mon programme, je bascule en mode 8bpp, puis fais un fond noir, puis je trace 2 grosses ligne verticales , puis je modifie en temp réel juste l'endroit de la palette qui contenait cette couleur noir. Voilà le principe !

Je me suis mis à l'ouvrage ...et j'ai bien galéré car je ne sais pas (encore?) comment se caler sur la synchro verticale du pl111 (contrôleur LCD).
Mais bon! Il y a quand même du résultat !
Voici un petit screenshot :
Image

et voici le code source:
(faîtes pas attention aux mini-routines de temporisation, j'ai eu tellement de mal à caler l'effet! héhé)

Code: Select all
.nolist
#include "ti84pce.inc"
.list
.org userMem-2
.db tExtTok,tAsm84CeCmp
.assume ADL=1
      
      di
      ld hl,$e40000
      ld de,$d40000
      ld bc,153600
      ldir


      ld ix,$d40000
      ld de,320
      ld b,240
pot:    ld (ix+40),250
      ld (ix+41),250
      ld (ix+42),250
      ld (ix+43),250
      ld (ix+120),200
      ld (ix+121),200
      ld (ix+122),200
      ld (ix+123),200

      add ix,de
      djnz pot

      ld a,$27
      ld ($e30018),a

      
      ld hl,$e30200

      

      ld b,200
l00p:   
      ld de,0
cont:   ld (hl),de
      xor a
      ld c,25
biig:   ld a,105

tempo:   dec a
      jr nz,tempo
      dec c
      jr nz,biig
      nop
      nop
      nop
      nop
      inc d           ; remplacer par "inc c"  pour avoir un dégradé de bleu !
      dec e
      jr nz,cont

      ld a,222
wtp:   dec a
      jr nz,wtp


      djnz l00p

      ld a,$2d
      ld ($e30018),a
      ret


J'ai tenté de faire une capture video, en passant par CEmu : impossible, en fait!

Je vous conseille donc d'assembler et lancer ce code chez vous !
(ou d'en télécharger le fichier 8xp : https://tiplanet.org/forum/archives_voir.php?id=466338 )

Re: [eZ80] Programmer des Rasters (ou Rasterbars)

Unread postPosted: 25 Mar 2016, 20:48
by Adriweb
Génial :D
Sur CEmu, c'est pas aussi bien qu'en vrai, mais ça donne une espèce d'idée :P

Image

J'aime bien lire tes expériences exploitant tes connaissances de vieilles machines désormais applicables sur nos chères calculatrices :P

Re: [eZ80] Programmer des Rasters (ou Rasterbars)

Unread postPosted: 25 Mar 2016, 20:54
by grosged
Merci Adriweb ;)
Hey , y a quand même un rendu, dis donc ! =D
J'espère que Mateo nous expliquera comment se caler sur cette synchro verticale :)
J'ai lu et relu le manual du pl111 , et j'étais sur une piste ...mais c'est pas encore ça ... :(

Re: [eZ80] Programmer des Rasters (ou Rasterbars)

Unread postPosted: 25 Mar 2016, 20:56
by critor
Passionnant ! :bj:
Merci grosged.

Re: [eZ80] Programmer des Rasters (ou Rasterbars)

Unread postPosted: 25 Mar 2016, 21:00
by grosged
Merci Critor ! C'est avec plaisir ;)

EDIT: Un grand merci à jacobly pour m'avoir expliqué comment se caler sur la synchronisation verticale !!

"the easiest way is to check bit 3 of $e30020 and write 8 to $e30028 whenever you find it set"

Voici donc ma traduction en assembleur :

Code: Select all
         ld hl,$e30028
         ld (hl),8
         ld l,$20
vsync_wait:   bit 3,(hl)
         jr z,vsync_wait