Amstrad Plus Forum Index

Amstrad Plus
Découverte de la gamme Old et Plus des Cpc d'Amstrad.

 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

*****Double Buffering
Goto page: <  1, 2
 
Post new topic   Reply to topic    Amstrad Plus Forum Index -> Programmation Cpc -> CRTC
Previous topic :: Next topic  
Author Message
roudoudou


Offline

Joined: 14 Jul 2016
Posts: 427
Localisation: LYON
Masculin
Point(s): 46
Moyenne de points: 0.11

PostPosted: Mon 26 Jun - 13:16 (2017)    Post subject: *****Double Buffering Reply with quote

Bah j'avais compris, ça ne change pas ma question!


Avec ton fond en B7, tu peux l'écrire en B1 comme en B3 en écrivant toujours de #C000 vers #4000 (magie du mode C1 et C3)


Back to top
Publicité






PostPosted: Mon 26 Jun - 13:16 (2017)    Post subject: Publicité

PublicitéSupprimer les publicités ?
Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,976
Masculin
Point(s): 389
Moyenne de points: 0.13

PostPosted: Mon 26 Jun - 14:45 (2017)    Post subject: *****Double Buffering Reply with quote

roudoudou wrote:
Bah j'avais compris, ça ne change pas ma question!


Avec ton fond en B7, tu peux l'écrire en B1 comme en B3 en écrivant toujours de #C000 vers #4000 (magie du mode C1 et C3)


Tu voulais dire en c7 Wink
Quoiqu'il en soit prochaine évolution c3, c1 ? Ca reste à voir!
J'ai fait "simple" pour commencer!
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
Steph


Offline

Joined: 24 Jul 2015
Posts: 12
Masculin
Point(s): 9
Moyenne de points: 0.75

PostPosted: Fri 1 May - 02:52 (2020)    Post subject: *****Double Buffering Reply with quote

Bonjour,

J'aimerais vraiment avoir la routine complète (avec ce qu'a ecrit Roudoudou), si possible en intégrant mon petit bout de code. On trouve assez facilement la routine des "6 int" avec des rasters, mais pour le double buffer, je n'ai rien trouvé. C'est le truc sur lequel je bute completement. (mais je comprend le principe vu que l'ai implementé en 68000 sur ST)



Mon bout de code (près à l'emploi sous winAPE) est un starfield.
Il y a le HL avec &C000. (je souhaite utiliser &4000)


A votre bon coeur Okay


PS: c'est pour mes sprites qui se chevauchent, avec un très gros au 1er plan, et même quelques fontes du scrolling, tous se déforment, au secours!! Et je dois le faire sur CPC 464. Il me faut la routine avec du code qui dessine quelque chose parceque je n'y arriverais pas autrement. Il y a cette source mais il manque le code qui dessine! http://cpctech.cpc-live.com/source/dbf.html
 
Code:






nolist
            org &100
            run $

Main


count       ld a,0                              ;automod
            inc a
            cp 79
            jr nz,next
            xor a
            ld (hl),a
next        ld (count+1),a

            ld hl,&C000                          ;Ecran
            xor d
            ld e,a                               ;de = a
            add hl,de                            ;inc

            ld (hl),d                            ;Efface
            inc l:ld (hl),&f0                    ;Dessine

            call &bd19
            jp Main









Last edited by Steph on Fri 1 May - 13:38 (2020); edited 3 times in total
Back to top
roudoudou


Offline

Joined: 14 Jul 2016
Posts: 427
Localisation: LYON
Masculin
Point(s): 46
Moyenne de points: 0.11

PostPosted: Fri 1 May - 12:47 (2020)    Post subject: *****Double Buffering Reply with quote

Le double buffer peut se faire de différentes façons mais je ne vais parler que de la façon moderne propre au 6128


Tu mets tes données graphiques en bank 7 et tes écrans seront en #4000 tous les deux!


Tous les deux? Hein? Oui bon j'ai résumé le principe mais le deuxième buffer qui est situé en #C000 ne sera JAMAIS utilisé en #C000. Grâce au double buffer il sera en #4000 comme l'autre


Nous avons besoin de deux modes de configuration mémoire accessibles grâce au PAL (pour rappel, le 464 et le 664 ne disposent pas d'un PAL donc ils pourront pas faire un double buffer en mettant des données en #8000 par exemple)


configuration 1 => LD BC,#7FC1 : OUT (C),C


la mémoire en #4000 est notre buffer 1 (situé en #4000 en configuration RAM de base)
la mémoire en #C000 est notre 7è bank du CPC, à savoir la dernière bank de mémoire étendue d'un 6128 (on peut charger des fichiers dedans en #4000 en faisant un OUT &7F00,&C4 en basic)
quand on travaille dans la mémoire réelle en #4000 on affiche la mémoire en #C000 (comme le CRTC est incapable d'afficher autre chose que les premiers 64K de mémoire, il ne verra pas la bank 7 en #C000 que le Z80 voit très bien lui par contre)

donc CRTC registre 12 = #30



configuration 2 => LD BC,#7FC3 : OUT (C),C


la mémoire en #4000 est notre buffer 2 (situé en #C000 en configuration RAM de base)
la mémoire en #C000 est toujours notre 7è bank du CPC, à savoir la dernière bank de mémoire étendue d'un 6128 (on peut charger des fichiers dedans en #4000 en faisant un OUT &7F00,&C4 en basic)
quand on travaille dans la mémoire réelle en #C000 (même si elle est situé logiquement en #4000) on affiche la mémoire en #4000 (mais le CRTC voit toujours la vraie mémoire en #4000 il ne voit pas la mémoire #C000 qui est basculée en #4000 pour le Z80)
donc CRTC registre 12=#10


Et c'est tout


Dans les deux cas on copie des données de la bank 7 (espace mémoire #C000-#FFFF) vers la mémoire vidéo #4000-#7FFF


Back to top
Steph


Offline

Joined: 24 Jul 2015
Posts: 12
Masculin
Point(s): 9
Moyenne de points: 0.75

PostPosted: Fri 1 May - 21:14 (2020)    Post subject: *****Double Buffering Reply with quote

 
Code:



; Le OUT magique ne fonctionnera pas sur le 464/664, il faudra une routine en &C000 et une en &4000.
nolist
            org &100
            run $

; Mon starfield. (a revoir pour le double buffer!)
; Le double buffer change totalement la manière de dessiner à l'écran, bien plus difficile qu'en single buffer avec 
; une routine en 6 int (par exemple). Pour un scrolling, il faudra doubler la vitesse du scroll et le nombre de pixels   
; dessinés puis copier le tout dans l'autre frame en décalant, dessiner la ligne de fonte qui manque sur le bord droit).
; Perso j'ai dessiné sur papier les 6 premières frames du scrolltext avec une fonte 8*8 en MODE 0...

count       ld a,0                              ;automod
            inc a
            cp 79
            jr nz,next
            xor a
            ld (hl),a
next        ld (count+1),a

            ld hl,&4000                          ;Ecran, sera toujours en &4000 grace au GA
            xor d
            ld e,a                               ;de = a
            add hl,de                            ;inc

            ld (hl),d                            ;Efface
            inc l:ld (hl),d                      ;Encore une fois (petite modification)
            inc l:ld (hl),&f0                    ;Dessine
;---------------------------------------------------------------------------------------------------------------------             
            call &bd19                           ;VBL                 
;---------------------------------------------------------------------------------------------------------------------                    
;AST CRTC routine
            ld bc,&bc0c                          ; Selection du Reg 12 du Crtc
swap        ld a,&10                             ; &10 -> Ecran en &4000
            out (c),c                            ; Select R12
            inc b
            out (c),a                            ; Valide avec a
            xor &20            
            ld (swap+1),a
            add a,a                              ; a=a x 2
            add a,a                              ; a=a x 4
            ld h,a                               ; H=&40xx ou &C0xx
;---------------------------------------------------------------------------------------------------------------------
;Roudoudou Gate Array OUT magique!
            ld b,&7f 
swap2       ld a,&c0
            xor 3
            ld (swap2+1),a
            ld c,a
            out (c),c         
;---------------------------------------------------------------------------------------------------------------------    
            jp count                             ;main loop
            

; THE END






                                ; Mes mains dans le cambouis avec l'aide du tuto BDCIron:            
IF 0            
;---------------------------CRTC-------------------------------------------------------------------------------------
;CRTC, choix du registre R12. Permet de choisir la bank pour l'écran

ld bc,&bc0c                   ;&0c = 12
out (c),c                     ;r12 selectionné

;ensuite faire:

ld bc,&bd10                   ;      &bd00+%00010000    soit ecran en &4000
out (c),c

;ou

ld bc,&bd30                   ;      &bd00+%00110000    soit ecran en &C000
out (c),c

;Pris en compte à la fin de l'écran. CRTC 1, a partir de la 9e ligne du fond (ou char 2)

;------------------------GATE ARRAY-----------------------------------------------------------------------------------                    
;Gate Array pour "connecter la RAM" de manière a dessiner uniquement en &4000 ou autre.

ld bc,#7fc0                   ;ld bc,#7f00+%11000000    Mode "C0" pour dessiner en &c000 (dit normal, boot)        
out (c),c 

;ou

ld bc,#7fc3                   ;ld bc,#7f00+%11000011    Mode "C3" pour dessiner en &4000
out (c),c 
;--------------------------switching XOR------------------------------------------------------------------------------
;CRTC:
;&30 écran en &c000
;&10 écran en &4000
&30 XOR &20 = &10
&10 XOR &20 = &30

;Gate Array:
&C0 XOR 3 = &C3
&C3 XOR 3 = &C0
;---------------------------------------------------------------------------------------------------------------------
;Alors ton code POUR DESSINER (la tech double buffer) devient:
&7FC0 / &BC0C,&30 -> mémoire normale, tu affiches &C000 pendant que tu effaces et écrit dans le vrai &4000
&7FC3 / &BC0C,&10 -> mémoire remappée, tu affiches &4000 pendant que tu effaces et écrit, toujours en &4000
                     mais en fait en &C000 avec le remap
;---------------------------------------------------------------------------------------------------------------------
ENDIF





Last edited by Steph on Sun 10 May - 16:14 (2020); edited 2 times in total
Back to top
TFM


Offline

Joined: 05 Sep 2014
Posts: 238
Masculin
Point(s): 44
Moyenne de points: 0.18

PostPosted: Fri 8 May - 15:56 (2020)    Post subject: *****Double Buffering Reply with quote

Just to remember the nice RAM configuration &C3 works only with CPC6128 and 6128 Plus.


To have it working properly (this means screen gets moved to &4000) the users of the 464 and 664 will need Revaldhinos RAM expansion. 


Maybe there are others which can do this too, but I don't know them.


Back to top
Steph


Offline

Joined: 24 Jul 2015
Posts: 12
Masculin
Point(s): 9
Moyenne de points: 0.75

PostPosted: Fri 8 May - 19:01 (2020)    Post subject: *****Double Buffering Reply with quote

I just saw it under WinAPE. It makes things even harder on the 464 .What wrote Roudoudou makes more sense to me now. Is it something to do with that PAL chip? (sorry if i sound n00b, but I am)
Draw in &4000 and &C000 seems ok otherwise.
Do you think it is possible to fix the sync problems when overlaping many sprites with just a 6 int routine? By redrawing above the buggs or maybe sync delays.


Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,976
Masculin
Point(s): 389
Moyenne de points: 0.13

PostPosted: Sun 10 May - 15:40 (2020)    Post subject: *****Double Buffering Reply with quote

Steph, tu devrais peut-être lire cela.
C’est un bon complément.
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Back to top
Display posts from previous:   
Post new topic   Reply to topic    Amstrad Plus Forum Index -> Programmation Cpc -> CRTC All times are GMT + 2 Hours
Goto page: <  1, 2
Page 2 of 2

 
Jump to:  

Index | Administration Panel | Create a forum | Free support forum | Free forums directory | Report a violation | Cookies | Charte | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group