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!
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.
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.
Inscription : 05 Août 2011, 14:38 Message(s) : 193
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
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
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.
J'ai bien compris ce que tu voulais ET ton problème mais tu n'as pas répondu à mes questions
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é
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
Vous n’êtes pas autorisé(e) à consulter les fichiers insérés à ce message.
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
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
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
Vous n’êtes pas autorisé(e) à consulter les fichiers insérés à ce message.
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 !
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
Inscription : 28 Août 2008, 23:41 Message(s) : 261
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
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 8 invité(s)
Vous ne pouvez pas publier de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas insérer de pièces jointes dans ce forum