Routine sauvegarde écran T07/70

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

Répondre
jvernet
Messages : 2454
Inscription : 12 avr. 2007 10:59
Localisation : France 69
Contact :

Routine sauvegarde écran T07/70

Message par jvernet »

Bonjour,

Plutôt que de réinventer la roue, je cherche une routine (assembleur) utilisable en BASIC 128 sur TO7/70 pour sauvegarder sur disquette et restaurer la mémoire écran d'un TO7/70, sauvegarde optimisée/compressée pour prendre le moins de place et de temps possible. Il faut que l'on puisse spécifier le coin supérieur gauche et inférieur droit pour une sauvegarde partielle.
En BASIC 128 on peut faire un GET(X1,Y1)-(X2,Y2),M%(200) par exemple, puis sauvegarder le tableau M%, mais pas sur que ce soit efficace.

j'ai trouvé une routine dans TEO N°1, mais je ne pense pas qu'elle soit utilisable sous BASIC 128, vu que les adresses d'implantation ne sont surement pas les bonnes. Il n'y a pas le listing assembleur...

Si vous avez ça dans un coin... Merci d'avance !
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Routine sauvegarde écran T07/70

Message par __sam__ »

Si tu as le basic128, l'idéal est d'utiliser PUT/GET et SAVEP, LOADP pour afficher/capturer et sauver/charger un fichier MAP. La compression n'est pas mauvaise dans le fond et c'est fourni en standard. Les performances ne sont pas trop mauvaises si la zone a manipuler n'est pas très grande. Il me semble qu'un italien dont j'ai oublié le pseudo (qu'il m'excuse) utilise ces commandes pour gérer le sprites d'un jeu très sympa qu'il avait fait en basic (un jeu avec un loup qui avance et sur lequel il faut tirer des flèches).

Je crois même qu'il s'amuse à faire des sprites encore plus animés avec ces commandes, et ca rends pas mal:

test de vitesse:
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
jvernet
Messages : 2454
Inscription : 12 avr. 2007 10:59
Localisation : France 69
Contact :

Re: Routine sauvegarde écran T07/70

Message par jvernet »

Tout simplement! J'aurais du lire la doc du BASIC 128 jusqu'au bout ;).
Ca marche, c'est pas ultra rapide, mais ça marche plutôt bien.


JV
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Routine sauvegarde écran T07/70

Message par __sam__ »

En rapide sur thomson il faut faire pleins de compromis pas toujours idéaux. Sinon il y a des trucs comme Cartoon-Maker pour gérer les sprites en basic, mais je n'ai jamais été convaincu du truc.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
jvernet
Messages : 2454
Inscription : 12 avr. 2007 10:59
Localisation : France 69
Contact :

Re: Routine sauvegarde écran T07/70

Message par jvernet »

Je n'ai pas besoin que ce soit très rapide après tout. je sauvegarde un écran pour le réafficher ultérieurement et tracer par dessus. c'est juste que l'on voit l'écran se redessiner de bas en haut au PUT. je ne sais pas si il existe un moyen de bloquer le refresh de l'écran pendant que le PUT se termine.

Après, je pensais à éventuellement afficher plusieurs écrans les un après les autres pour visualiser des changements; inutile d'avoir plusieurs FPS non plus, c'est pas un jeu. Je vais me satisfaire de cette solution GET/PUT pour l'instant.

Idéalement, il faudrait une routine pour sauvegarder l'écran dans une autre portion de la mémoire, faire le SAVEM, ou LOADM et recopie dans l'autre sens entre 2 VSYNC. J'imagine que c'est déjà des choses qui existent.

JV
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Routine sauvegarde écran T07/70

Message par __sam__ »

Ok ce que tu veux c'est sauvegarder le plus rapidement le contenu de la RAM vidéo dans l'une des banques de 16ko que le basic 128 te permet de réserver. Tu ne parles pas de la compression, il n'y en a plus besoin?

Par plus rapidement, c'est pour pouvoir faire la course avec le rayon cathodique pour que l'affichage progressif ne se voit pas je suppose. C'est extrêmement difficile sur Thomson dont le CPU n'est pas forcément un foudre de guerre. En utilisant PULS et PSHU pour faire les lecture/écriture le plus rapidement possible et en minimisant le nb de comparaisons, le code ci-dessous (dans la routine CPY) fait la copie de 21 octets en 80 cycles. Les 16000 octets de la ram vidéo à copier nécessitent 762 tours de boucle, soit au total d'environ 61ms. On en est rendu à plus de 3 VSYNC. L'affichage se verra forcément, et comme on peut pas travailler sur la mémoire forme et fond en même temps, il y aura plein d'artefacts moches sur au moins une ou deux images consécutives.

Code : Tout sélectionner

      2        9FCC                 ORG $9FCC
      3        9FCC               BACKUP 
      4  5+10  9FCC 34   7F         PSHS D,X,Y,DP,U,CC ; sauvegarde de tous les registres utilisés
      5  7     9FCE 10FF 9FDE       STS  bak    ; sauvegarde registre pile
      6  2     9FD2 1A   50         ORCC #$50   ; pas d'interruptions svp
      7  4     9FD4 10CE E000       LDS  #$E000 ; sauvegarde en descendant
      8  7     9FD8 8D   08         BSR  CPY
      9  7     9FDA 8D   06         BSR  CPY
     10  4     9FDC 10CE 0000       LDS  #0     ; recup registre pile
     11                  9FDE     bak set *-2
     12  5+12  9FE0 35   FF         PULS D,X,Y,DP,U,CC,PC ; recup des registres utilisés et retour
     13        9FE2               CPY
     14  3     9FE2 CE   4000       LDU  #$4000 ; debut ram vidéo
     15        9FE5               loop
     16  5+7   9FE5 37   3E         PULU D,X,Y,DP ; copie de 3*7 = 21  octets
     17  5+7   9FE7 34   3E         PSHS D,X,Y,DP ; (1/2 ligne horiz)
     18  5+7   9FE9 37   3E         PULU D,X,Y,DP ; sans comparaisons pour
     19  5+7   9FEB 34   3E         PSHS D,X,Y,DP ; aller au plus vite.
     20  5+7   9FED 37   3E         PULU D,X,Y,DP ; On copie 1 octet de trop, 
     21  5+7   9FEF 34   3E         PSHS D,X,Y,DP ; mais tant pis. C'est le 
     22  5     9FF1 1183 5F40       CMPU #$5F40   ; meilleurs compromis
     23  3     9FF5 25   EE         BCS  loop
     24  2     9FF7 86   01         LDA  #1       ; bascule forme/fond
     25  5     9FF9 B8   E7C3       EORA $E7C3
     26  5     9FFC B7   E7C3       STA  $E7C3
     27  5     9FFF 39              RTS
Quand je dis que c'est difficile, je crois que c'est impossible sur les machines de premières génération :( (et on ne perds pas de temps à compresser quoi que ce soit). Sur les machines de seconde générations le flip d'écran peut se faire matériellement, par contre ca condamne une bonne partie de l'usage du basic qui ne tournera plus qu'avec 16ko de libres au mieux.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
jvernet
Messages : 2454
Inscription : 12 avr. 2007 10:59
Localisation : France 69
Contact :

Re: Routine sauvegarde écran T07/70

Message par jvernet »

Merci _SAM_ c'est très instructif et bien expliqué ! Au mieux donc 1/3 d'image par VSYNC. La compression c'est juste pour le disque, ça peut être fait à posteriori.
On a moyen de gérer le VSYNc (interruption, compteur) sur ces machines ?

JV
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Routine sauvegarde écran T07/70

Message par __sam__ »

Il n'y a pas d'interruption lors du retour du faisceau d'electron. Par contre il y a un bit qui change de statut pendant cette phase de l'affichage à une adresse précise. Il faut alors caller une interruption timer juste après... Je crois cela très difficile à faire car personne ne l'a encore fait à ma connaissance. Les trucs de Préhisto qui se synchronisent sur l'affichage se font exclusivement en comptant les cycles (les interruptions timer sont très lentes).
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Asic512
Messages : 128
Inscription : 30 juin 2019 21:13

Re: Routine sauvegarde écran T07/70

Message par Asic512 »

Si l'on prêt à travailler en deux couleurs donc juste avec la mémoire forme, la routine de Sam est assez rapide pour faire des animations plein écran.
Asic512
zef
Messages : 4
Inscription : 27 sept. 2020 20:18

Re: Routine sauvegarde écran T07/70

Message par zef »

salut, j'ai fait la démo du jeu en BASIC du loup et les tests d'animation avec GET et PUT, ces instructions sont très pratiques et rapides, il est aussi possible d'obtenir la transparence des sprites grâce à CONSOLE et de conserver les graphismes de fond même si la vitesse en souffre.
Avatar de l’utilisateur
DataPro
Messages : 2790
Inscription : 07 févr. 2011 17:03
Localisation : France - Auvergne

Re: Routine sauvegarde écran T07/70

Message par DataPro »

Elle est réussie cette adaptation du jeu d'arcade Pooyan.
Cependant, même le jeu original de 1982 pouvait gérer plus de sprites. Cà risque d'être difficile d'avoir la même vitesse avec tous les sprites de l'original; peut-être en assembleur sur TO8 ?
Recherche: cartouches Mattel Intellivision Imagic (loose)
Star Jacker et Lode Runner sur Yeno/SEGA SC-3000
Répondre