CPC Rulez
https://cpcrulez.fr/forum/

Images stocké Bank RAM
https://cpcrulez.fr/forum/viewtopic.php?f=4&t=6349
Page 1 sur 1

Auteur :  glaby [ 08 Mai 2020, 15:45 ]
Sujet du message :  Images stocké Bank RAM

Bonjour à tous,

Voila j'ais un petit soucis .


Précedement j'avais realisé un jolie flip en mettant une image directement #4000 puis en faisant pointer la memoire ecran en 4000, enfin je charge une image en #c0000 et le rappel du pointeur ecran sur #C0000.
J 'alternais alors les C000 et 4000 pour avoir un bel effet plutot parfait pour la transition.

Maintenant je souhaite faire de meme mais avec 4 images
J' arrive à connecter la bank 0 page 0 en lieu et place de la memoire en #4000.
Je charge mon screen et je fais de meme avec les autres bank et images.

Evidemment comme le CRTC ne veux prendre que la memoire centrale , je recopie betement mes ecran en C000 avec un LDIR, et je fais tourner ça en boucle. Cela marche , on voit bien les 4 écrans mais evidemment le temps de recopie entre banque et apperement plus long que le balayage d'un ecran d'ou un effet dirais je degeulasse.

Vu que par exemple ma page 0 bank 0 est connecté en #4000 , je ne peux pas la mettre en memoire centrale et faire mon beau flip entre 4000 et C0000.

La question est comment reussir cela ? Je pense aussi qu'attendre la VBL ne serve pas à grand chose!

Merci à vous.

Auteur :  marcel [ 08 Mai 2020, 19:38 ]
Sujet du message :  Re: Images stocké Bank RAM

Petites questions anodines:
- est-ce que tes écrans se compressent bien?
- est-ce que ta configuration CRTC est particulière?

Auteur :  markerror [ 08 Mai 2020, 19:59 ]
Sujet du message :  Re: Images stocké Bank RAM

Bonsoir,

Alterner quatre pages écran, je pense que c'est possible sans recopier ou décompresser quoi que ce soit en utilisant le mode alternate (128ko obligatoire, et programmation tordue nécessaire pour charger les images correctement sur les pages 0 1 2 et 3 de la mémoire principale).

Autre contrainte, une petite zone de ram centrale devra quand même héberger du code, ne serait ce que pour faire la bascule vers la mémoire étendue.

Auteur :  marcel [ 08 Mai 2020, 20:21 ]
Sujet du message :  Re: Images stocké Bank RAM

markerror a écrit :
Bonsoir,

Alterner quatre pages écran, je pense que c'est possible sans recopier ou décompresser quoi que ce soit en utilisant le mode alternate (128ko obligatoire, et programmation tordue nécessaire pour charger les images correctement sur les pages 0 1 2 et 3 de la mémoire principale).

Autre contrainte, une petite zone de ram centrale devra quand même héberger du code, ne serait ce que pour faire la bascule vers la mémoire étendue.


Donc faut recopier :D (et 128K only)

Auteur :  velus [ 08 Mai 2020, 20:33 ]
Sujet du message :  Re: Images stocké Bank RAM

a taper dans évidement dans une zone mémoire <&4000 ou >&7FFF
par ex en &8000 :call &8000
01 C4 7F ED 49 3E 40 CD 08 BC C9 affiche l'ecran qui est en &4000 dans la ram C4
01 C5 7F ED 49 3E 40 CD 08 BC C9 affiche l'ecran qui est en &4000 dans la ram C5
01 C6 7F ED 49 3E 40 CD 08 BC C9 affiche l'ecran qui est en &4000 dans la ram C6
01 C7 7F ED 49 3E 40 CD 08 BC C9 affiche l'ecran qui est en &4000 dans la ram C7
01 C0 7F ED 49 3E C0 CD 08 BC C9 remet l'ecran d'origine en &C000 de la ram C0

Auteur :  glaby [ 09 Mai 2020, 10:28 ]
Sujet du message :  Re: Images stocké Bank RAM

Bonjour,

Dans le petit programme suivant on réalise un flip entre 2 pages ecran. Les images ont étés sauvegardé avec le logiciel de conversion Convimcpc et elles sont non compressés. Elles occupent 16 ko chacune
Ce programme n'utilise que la mémoire centrale des premiers 64Ko

1 INK 0,0:INK 1,1:INK 2,10:INK 3,23:INK 4,1:INK 6,26
2 CLS
5 MODE 1
10 MEMORY &3FFF: LOAD"audrey1.scr",&4000
19 OUT &BC00,12:OUT &BD00,&10
21 LOAD"audrey2.scr",&C000
30 OUT &BC00,12:OUT &BD00,&30
31 a=0
35 a=a+1:IF a=200 THEN GOTO 40 ELSE GOTO 35
40 OUT &BC00,12:OUT &BD00,&10
50 a=0
60 a=a+1:IF a=200 THEN GOTO 30 ELSE GOTO 60


Maintenant le but c'est de réaliser un beau flip entre 4 pages ecrans en utilisant les 64 Ko supplémentaire.

Dans un premier temps on vient charger en basic les 4 ecrans non compressés dans chaque bank en les connectant une à une.
10 MODE 2
20 MEMORY &3FFF
30 PRINT"Connection Page 0 Bank 0:";:
40 OUT &7F00,&C4:PRINT" OK"
50 PRINT"Chargement image lune0.scr Page 0 bank 0:";:
60 LOAD"lune0.scr",&4000
70 PRINT" OK"
80 PRINT"Connection Page 0 Bank 1:";:
90 OUT &7F00,&C5:PRINT" OK"
100 PRINT"Chargement image lune1.scr Page 0 bank 1:";:
110 LOAD"lune1.scr",&4000
120 PRINT" OK"
130 PRINT"Connection Page 0 Bank 2:";:
140 OUT &7F00,&C6:PRINT" OK"
150 PRINT"Chargement image lune2.scr Page 0 bank 2:";:
160 LOAD"lune2.scr",&4000
170 PRINT" OK"
180 PRINT"Connection Page 0 Bank 3:";:
190 OUT &7F00,&C7:PRINT" OK"
200 PRINT"Chargement image lune3.scr Page 0 bank 3:";:
210 LOAD"lune3.scr",&4000
220 PRINT" OK"
230 PRINT"=========PRESS A KEY=========="
240 IF INKEY$="" THEN GOTO 240
250 MODE 1
270 OUT &7F00,&C4:
280 GOSUB 400:CALL &8000
290 OUT &7F00,&C5
300 GOSUB 400:CALL &8000
310 OUT &7F00,&C6
320 GOSUB 400:CALL &8000
330 OUT &7F00,&C7
340 GOSUB 400:CALL &8000
350 GOTO 270
400 a=a+1:IF a=100 THEN a=0:RETURN ELSE GOTO 400

Et je fini par appeler un petit programme assembleur qui recopie chaque ecran en &4000 dans la memoire ecran :
ORG #8000
LD HL,#4000 ;on charge l'adresse basse dans BC bank 0 ou 1 ou 2 ou 3 connecté
LD DE,#C000 ;on charge l'adresse ecran dans HL
LD BC,#3FFF
LDIR ; copie BC octets depuis HL vers DE

RET

En faite si on connecte par exemple la bank 0 en &4000 et qu'on décale l'ecran en &4000 cela n'affiche pas la nouvelle bank mais le CRTC se sert uniquement de la memoire principale . Du coup je recopie toute ma bank en &C000 mais cela prend du temps et le flip n'est pas jolie.

Merci à vous !

Auteur :  marcel [ 09 Mai 2020, 13:00 ]
Sujet du message :  Re: Images stocké Bank RAM

J'ai bien compris ce que tu voulais ET ton problème mais tu n'as pas répondu à mes questions :D

Si ça se compresse un minimum on peut très bien charger les 4 écrans en utilisant toute la mémoire basse

On peut même faire en sorte que le programme n'ait pas besoin de 128K pour fonctionner

Tes fichiers sont des SCR ?

Je peux te faire un squelette assembleur qui prenne les 4 fichiers binaires de tes écrans et fasse un exécutable (faudra juste ajouter la palette) mais faudra que les trois (premiers) écrans tiennent dans 40k max une fois crunché

Auteur :  velus [ 09 Mai 2020, 14:11 ]
Sujet du message :  Re: Images stocké Bank RAM

En 8000 c est pas bon. Mets ce que je t ai dit 3e 40 cd 08 bc c9 c est tout lancé ton programme et ça ira

Auteur :  marcel [ 09 Mai 2020, 22:38 ]
Sujet du message :  Re: Images stocké Bank RAM

glaby a écrit :
Bonjour,
En faite si on connecte par exemple la bank 0 en &4000 et qu'on décale l'ecran en &4000 cela n'affiche pas la nouvelle bank mais le CRTC se sert uniquement de la memoire principale . Du coup je recopie toute ma bank en &C000 mais cela prend du temps et le flip n'est pas jolie.
Merci à vous !


Je viens de faire un programme qui fait un ping-pong sur les pages vidéo 0 à 3 bah c'est bien bien rapide...

Mais en même temps qui peut le plus peut le moins, on peut ralentir sans aller jusqu'à être aussi lent que le LDIR :wink:

Auteur :  velus [ 10 Mai 2020, 10:21 ]
Sujet du message :  Re: Images stocké Bank RAM

Faut faire une boucle pour le faire attendre un peu...


ld hl,&1000 ; temps d'attente
moins:dec hl
ld a,l
or h
jr nz,moins
ret

Auteur :  glaby [ 13 Mai 2020, 09:02 ]
Sujet du message :  Re: Images stocké Bank RAM

marcel a écrit :
glaby a écrit :
Bonjour,
En faite si on connecte par exemple la bank 0 en &4000 et qu'on décale l'ecran en &4000 cela n'affiche pas la nouvelle bank mais le CRTC se sert uniquement de la memoire principale . Du coup je recopie toute ma bank en &C000 mais cela prend du temps et le flip n'est pas jolie.
Merci à vous !


Je viens de faire un programme qui fait un ping-pong sur les pages vidéo 0 à 3 bah c'est bien bien rapide...

Mais en même temps qui peut le plus peut le moins, on peut ralentir sans aller jusqu'à être aussi lent que le LDIR :wink:


Merci pour vos reponse, j 'ais bien lancé ton fichier mais j'aimerais voir le code assembleur si c'est possible pour comprendre. As tu le fichier sources ? Merci

Auteur :  marcel [ 13 Mai 2020, 12:26 ]
Sujet du message :  Re: Images stocké Bank RAM

glaby a écrit :
Merci pour vos reponse, j 'ais bien lancé ton fichier mais j'aimerais voir le code assembleur si c'est possible pour comprendre. As tu le fichier sources ? Merci


Rien de plus que ce que je t'ai dit

Aucun besoin d'avoir 128K on fait tout dans les 64K et on charge 4 écrans dans les 64K

Pour ce faire, on decrunch les 48K en écrasant le système (aurevoir les INT) et ensuite on exécute du code planqué dans les 48 octets de chaque fin de bloc de la dernière page

C'est pas très lisible en l'état mais j'ai commenté un minimum

Auteur :  glaby [ 13 Mai 2020, 13:57 ]
Sujet du message :  Re: Images stocké Bank RAM

marcel a écrit :
glaby a écrit :
Merci pour vos reponse, j 'ais bien lancé ton fichier mais j'aimerais voir le code assembleur si c'est possible pour comprendre. As tu le fichier sources ? Merci


Rien de plus que ce que je t'ai dit

Aucun besoin d'avoir 128K on fait tout dans les 64K et on charge 4 écrans dans les 64K

Pour ce faire, on decrunch les 48K en écrasant le système (aurevoir les INT) et ensuite on exécute du code planqué dans les 48 octets de chaque fin de bloc de la dernière page

C'est pas très lisible en l'état mais j'ai commenté un minimum


Je te remercie mais cela ecrabouille comme tu dis le systeme. Il y a certainement un moyen de réinitialiser la memoire afin de rendre la main au basic par exemple.

Je vais tenter une autre approche et je reviens vers vous !

Auteur :  glaby [ 13 Mai 2020, 15:33 ]
Sujet du message :  Re: Images stocké Bank RAM

glaby a écrit :
marcel a écrit :
glaby a écrit :
Merci pour vos reponse, j 'ais bien lancé ton fichier mais j'aimerais voir le code assembleur si c'est possible pour comprendre. As tu le fichier sources ? Merci


Rien de plus que ce que je t'ai dit

Aucun besoin d'avoir 128K on fait tout dans les 64K et on charge 4 écrans dans les 64K

Pour ce faire, on decrunch les 48K en écrasant le système (aurevoir les INT) et ensuite on exécute du code planqué dans les 48 octets de chaque fin de bloc de la dernière page

C'est pas très lisible en l'état mais j'ai commenté un minimum


Je te remercie mais cela ecrabouille comme tu dis le systeme. Il y a certainement un moyen de réinitialiser la memoire afin de rendre la main au basic par exemple.

Je vais tenter une autre approche et je reviens vers vous !



J'ai un peu modifié le code en basic et en assembleur et cela marche.
En faite je charge tout de suite une page ecran en 4000 et je met le debut de la page ecran en 4000
Je charge mes ecran dans bank 0 1 2 3 ram supplementaire
Quand je viens connecter la bank 0 je recopie en &C000 , je met le debut de la page ecran en C000 puis je recopie tout le bloc ecran en 4000, ensuite je met le debut de l'eran en 4000 et ensuite je fais de meme avec bank 1 2 3 :

pour le petit programme basic:
10 MODE 2
20 MEMORY &3FFF
25 PRINT"Chargement image lune0.scr Page 4000":LOAD"lune0.scr",&4000
30 PRINT"Connection Page 0 Bank 0:";:
40 OUT &7F00,&C4:PRINT" OK"
50 PRINT"Chargement image lune0.scr Page 0 bank 0:";:
60 LOAD"lune0.scr",&4000
70 PRINT" OK"
80 PRINT"Connection Page 0 Bank 1:";:
90 OUT &7F00,&C5:PRINT" OK"
100 PRINT"Chargement image lune1.scr Page 0 bank 1:";:
110 LOAD"lune1.scr",&4000
120 PRINT" OK"
130 PRINT"Connection Page 0 Bank 2:";:
140 OUT &7F00,&C6:PRINT" OK"
150 PRINT"Chargement image lune2.scr Page 0 bank 2:";:
160 LOAD"lune2.scr",&4000
170 PRINT" OK"
180 PRINT"Connection Page 0 Bank 3:";:
190 OUT &7F00,&C7:PRINT" OK"
200 PRINT"Chargement image lune3.scr Page 0 bank 3:";:
210 LOAD"lune3.scr",&4000
220 PRINT" OK"
230 PRINT"=========PRESS A KEY=========="
240 IF INKEY$="" THEN GOTO 240
250 MODE 1
260 OUT &BC00,12:OUT &BD00,&10
270 OUT &7F00,&C4:
280 GOSUB 400:CALL &8000:OUT &BC00,12:OUT &BD00,&30:OUT &7F00,&C0: CALL &9000:OUT &BC00,12:OUT &BD00,&10
290 OUT &7F00,&C5
300 GOSUB 400:CALL &8000:OUT &BC00,12:OUT &BD00,&30:OUT &7F00,&C0: CALL &9000:OUT &BC00,12:OUT &BD00,&10
310 OUT &7F00,&C6:
320 GOSUB 400:CALL &8000:OUT &BC00,12:OUT &BD00,&30:OUT &7F00,&C0: CALL &9000:OUT &BC00,12:OUT &BD00,&10
330 OUT &7F00,&C7
340 GOSUB 400:CALL &8000:OUT &BC00,12:OUT &BD00,&30:OUT &7F00,&C0: CALL &9000:OUT &BC00,12:OUT &BD00,&10
350 GOTO 270
400 a=a+1:IF a=50 THEN a=0:RETURN ELSE GOTO 400


et pour l'assembleur:
ORG #8000
LD B,#F5 ;adresse du port B du PPI
frm IN A,(C) ;On récupère l'octet contenu sur le port dans A
RRA ;On fait une rotation afin de récupérer le bit 0 dans le flag carry
JR NC,FRM ;tant que le flag carry n'est pas à 1 on boucle au label frm

LD HL,#4000 ;Adresse de debut dans HLé
LD DE,#C000 ;on charge l'adresse ecran dans de destination dans DE
LD BC,#3FFF ; longeur d'un ecran 3FFF
LDIR ; copie BC octets depuis HL vers DE

RET
ORG #9000
LD B,#F5 ;adresse du port B du PPI
frmm IN A,(C) ;On récupère l'octet contenu sur le port dans A
RRA ;On fait une rotation afin de récupérer le bit 0 dans le flag carry
JR NC,FRMM ;tant que le flag carry n'est pas à 1 on boucle au label frm

LD HL,#C000
LD DE,#4000
LD BC,#3FFF
LDIR


Merci à tous en tout cas !

Auteur :  Longshot [ 08 Juin 2020, 16:42 ]
Sujet du message :  Re: Images stocké Bank RAM

Ce que tu peux faire aussi, c'est charger les 4 images dans les banques. (C4, C5, C6, C7)
Ensuite tu appelles un petit programme qui permute le contenu des 2 banques de 64k, et qui passe en mode C2.
La seule petite contrainte c'est qu'il faut qu'il faut prévoir du code au bon endroit lorsque tu effectues la bascule C2 (rien de méchant).
Après il te suffit de modifier l'offset en 0, &4000, &8000 et &C000
L'inconvénient, c'est que si tu fais une opération graphique en basic, elle sera invisible tant que tu n'auras pas "repermuté".

Code :
   ; swap 64k
   org #C793
debut
   di
   ld (sovsp+1),sp
   ld sp,mapile
   ld bc,#7fc5
   ld hl,#4000
   ld d,#c0
   out(c),d
swapb15
   ld a,(hl)
   out (c),c
   ld e,(hl)
   ld (hl),a
   out (c),d
   ld (hl),e
   inc hl
   bit 7,h
   jr z,swapb15
   ;   
   ld bc,#7fc7
   out (c),c
   ld hl,duplic
   ld bc,findup-duplic
   ld de,duplic-#8000
   ldir
   ;
   ld bc,#7FC4
   ld h,0
   call swap16k
   ld c,#c6
   ld h,d
   call swap16k
duplic
   ld c,#c7
   call swap16k
bolto
sovsp    ld sp,#3131
   ld c,#c2
   out (c),c
   ei
   ret
   dw bolto
mapile

swap16k
   out (c),c
   ld de,#4000
   ld l,e
swap256b   
   ld c,(hl)
   ld a,(de)
   ld (hl),a
   ld a,c
   ld (de),a
   inc e
   inc l
   jr nz,swap256b
   inc h
   inc d
   jp po,swap256b
   ret
findup

Page 1 sur 1 Le fuseau horaire est UTC+1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/