Revenir au plan du site

Comment remplir la mémoire centrale à 100% de graphs?

Dans l'article sur [ l'effet avancé de color cycling ], nous utilisons les facilités de Rasm pour créer un snapshot avec la mémoire centrale remplie de graphismes et le code en mémoire étendue qui s'exécute directement.

Mais sur un vrai CPC, ce n'est pas possible ni standard alors nous allons voir comment transformer notre programme pour initier cette configuration mémoire. Je vous propose UNE solution parmi d'autres.

D'abord on va commencer par enlever la partie spécifique aux snapshots, normalement vous savez déjà configurer le CRTC.
buildsna
snaset GA_RAMCFG,#C2 ; le code va démarrer dans la mémoire étendue
snaset CRTC_REG,1,32 ; réglages écran
snaset CRTC_REG,2,42
snaset CRTC_REG,6,32
snaset CRTC_REG,7,34

org #100
ld bc,#BC01 : out (c),c : inc b : ld a,32 : out (c),a
ld bc,#BC02 : out (c),c : inc b : ld a,42 : out (c),a
ld bc,#BC06 : out (c),c : inc b : ld a,32 : out (c),a
ld bc,#BC07 : out (c),c : inc b : ld a,34 : out (c),a


Ensuite, il va falloir penser à la façon dont nous allons écrire la mémoire centrale intégralement en exécutant du code situé en mémoire étendue.

On peut découper nos 64K en 4 fichiers de 16K, les compresser et travailler avec. Après compression, nous avons 4 fichiers d'environ 5K chacun.

Charge à nous de trouver les combinaisons utiles pour pouvoir accéder à l'ensemble de la mémoire centrale depuis la mémoire étendue.

Avec une bascule 4,5,6 ou 7 qui connecte la RAM étendue de 16K sur la zone #4000-#7FFF, on peut accéder aux zones #0000-#3FFF et #8000-#FFFF.

Avec une bascule de type 1 qui connecte la 4è bank en #C000-#FFFF permet d'accéder à la zone #0000-#BFFF de la mémoire centrale.

Maintenant que nous avons nos deux connexions utiles, il faut s'organiser.

Dans la bank logique 5 (la 2è du slot étendu 0), avec une bascule 4 (#4000-#7FFF) on pourrait décompresser 2 blocs, celui en #0000-#3FFF et celui en #C000-#FFFF. L'autre intérêt de la bank logique 5 est qu'elle se situe au même endroit en mémoire quand on utilise la bascule 2 et la bascule 5 (#4000-#7FFF). On peut donc basculer entre ces modes depuis la bank.

include 'dzx0_standard.asm' ; contient une macro pour la routine de decrunch ZX0

org #4000

di : ld sp,#8000 ; impératif que la pile se situe TOUJOURS en mémoire étendue

ld hl,fullSet0 : ld de,#0000 : call unzx0
ld hl,fullSet3 : ld de,#C000 : call unzx0

jr $ ; terminé!!!

unzx0 dzx0_standard (void)

fullSet0 incbin 'fullSet0.zx0'
fullSet3 incbin 'fullSet3.zx0'


Dans la bank logique 7 (la 4è du slot étendu 0), avec une bascule 1 (#C000-#FFF) on peut décompresser nos deux autres blocs en mémoire centrale #4000-#7FFF.

org #C000
ld bc,#7FC1 : out (c),c ; car ce code sera appelé depuis une bascule de type 2
ld sp,#0000 ; impératif que la pile se situe TOUJOURS en mémoire étendue

ld hl,fullSet1 : ld de,#4000 : call unzx0
ld hl,fullSet2 : ld de,#8000 : call unzx0

jr $ ; terminé!!!

unzx0 dzx0_standard (void)

fullSet1 incbin 'fullSet1.zx0'
fullSet2 incbin 'fullSet2.zx0'


Reste à faire le passage entre ces deux morceaux de code et ajouter le color cycling de l'exemple.

Note : Il vous faudra les fichiers [ fullSet0.zx0 ] [ fullSet1.zx0 ] [ fullSet2.zx0 ] [ fullSet3.zx0 ] [ dzx0_standard.asm disponible avec RASM dans le répertoire decrunch ] pour assembler ce source.
include 'dzx0_standard.asm' ; contient une macro pour la routine de decrunch ZX0

org #4000
di
ld sp,#8000 ; impératif que la pile se situe TOUJOURS en mémoire étendue

ld hl,fullSet0 : ld de,#0000 : call unzx0
ld hl,fullSet3 : ld de,#C000 : call unzx0

ld bc,#7FC2 : out (c),c ; connecter toute la mémoire étendue pour sauter dans la bank logique 7 depuis la bank logique 4
jp #C000

unzx0 dzx0_standard (void)

fullSet0 incbin 'fullSet0.zx0'
fullSet3 incbin 'fullSet3.zx0'

SAVE 'bank5.bin',#4000,$-#4000,DSK,'color_cycling.dsk'

; -----------------------------

org #C000
ld bc,#7FC1 : out (c),c ; car ce code sera appelé depuis une bascule de type 2
; et qu'on a besoin de voir la mémoire centrale le temps de décruncher
ld sp,#0000 ; impératif que la pile se situe TOUJOURS en mémoire étendue

ld hl,fullSet1 : ld de,#4000 : call unzx0bis
ld hl,fullSet2 : ld de,#8000 : call unzx0bis
jp ColorCycling

unzx0bis dzx0_standard (void) ; la routine est deux fois en mémoire, il faut changer son nom pour avoir le droit de le faire

fullSet1 incbin 'fullSet1.zx0'
fullSet2 incbin 'fullSet2.zx0'
; ----------------------------
ColorCycling
ld bc,#BC01 : out (c),c : inc b : ld a,32 : out (c),a
ld bc,#BC02 : out (c),c : inc b : ld a,42 : out (c),a
ld bc,#BC06 : out (c),c : inc b : ld a,32 : out (c),a
ld bc,#BC07 : out (c),c : inc b : ld a,34 : out (c),a
ld bc,#BC00+12 : out (c),c

ld hl,#544B : ld de,#4B54
debut
call novbl : ld bc,#BD00 : out (c),c : call couleursPaires
call novbl : call couleursImpaires
call novbl : ld bc,#BD10 : out (c),c : call couleursPaires
call novbl : call couleursImpaires
call novbl : ld bc,#BD20 : out (c),c : call couleursPaires
call novbl : call couleursImpaires
call novbl : ld bc,#BD30 : out (c),c : call couleursPaires
call novbl : call couleursImpaires
ex hl,de
jr debut

couleursPaires
ld bc,#7F00 : out (c),c : ld a,h : out (c),a
ld bc,#7F01 : out (c),c : ld a,l : out (c),a
ld bc,#7F02 : out (c),c : ld a,h : out (c),a
ld bc,#7F03 : out (c),c : ld a,l : out (c),a
ret

couleursImpaires
ld bc,#7F00 : out (c),c : ld a,h : out (c),a
ld bc,#7F01 : out (c),c : ld a,h : out (c),a
ld bc,#7F02 : out (c),c : ld a,l : out (c),a
ld bc,#7F03 : out (c),c : ld a,l : out (c),a
ret

novbl ld b,#F5 : in a,(c) : rra : jr c,novbl
vbl ld b,#F5 : in a,(c) : rra : jr nc,vbl : ret

SAVE 'bank7.bin',#C000,$-#C000,DSK,'color_cycling.dsk'

Ne manque plus qu'un petit loader en BASIC pour charger nos deux banks et lancer le programme.
10 MEMORY &3FFF
20 OUT &7F00,&C7 : LOAD"BANK7.BIN",&4000
30 OUT &7F00,&C5 : LOAD"BANK5.BIN",&4000
40 CALL &4000

Et voilà :)

Pour ceux qui ont la flemme d'assembler tout ça, voici le [ DSK de l'effet ].