J'ai essayé d'utiliser le gate array mode page pour les animations de sprites, ça suppose d'utiliser les adresse A000-DFFF, mais ça ne marche pas vraiment!!
Le principe du gate array est d'alterner l'affichage de la RAM logique avec les banques physiques 2 et 3 (dans mon cas), sachant que ça va de 0 à 31 (512 kO).
J'ai écrit des petits modules pour le basculement de banque 2 et 3 (pour y travailleyr dessus en RAM logique), travailler également sur la RAM Data pour les écrans (sachant que la RAM B est pour les adresses basse hA000..hA000+7999) et la RAM A à partir de hA000+8000
Ben ça ne fonctionne pas vraiment comme je le voudrais.
Première chose, est ce que ce code BASIC (512) est bon si je veux travailer directement dans la RAM Data ?
Code:
BANK 3 :clear,&H9FFF,,&H71FF:bank2
Voici tout mon code assembleur pour TO8
Code:
*Equates
****************************************
*Pour le GATE ARRAY Mode Page (TO8-TO9+)
*La memoire logique ecran peut pointer
*sur 4 Banques RAM (0 à 3). En pratique
*la 1 servant pour le systeme, ne sert
*pas pour l ecran. Le CPU ne peut
*travailler que sur la RAM logique, il
*faut donc le faire travailler sur
*l'espace logique A000 à DFFF qui
*pointera sur l'une des banques 0 à 3.
*Dans cet espace, la RAM Forme sera sur
*C000-DFFF et la RAM Couleur sur
*A000-BFFF. On Debut avec RAMCoul
*pour optimiser l affichage de sprites
************************************
ECRDEB EQU $A000 RAMEcran Couleur debut
* Affichage d'un caractere
PUTC EQU $E803
*Timer
KBIN EQU $E830 a appeler fin procedure timer
STATUT EQU $6019 b5 pour valider timer
TIMEPT EQU $6027 Adresse routine timer
IRQPT EQU $6021 Adresse routine timer
TCR EQU $E7C5 Registre controle timer (???)
TSB EQU $E7C6 Valeur (16bits) timer en nombre de 8 cycles
REGSY1 EQU $E7E7 Registre Systeme 1
REGSY2 EQU $E7DD Registre Systeme 2
RAMDAT EQU $E7E5 Registre RAM donnees
*************************************
*Procedure affiche sprite ou tile
*mode bm16c avec decalage possible
*de 2 pxl (avec IMPAIR=0)
*Variable externe : RAMECR
*IMPAIR a 0 si XSPRIT pair, 1 sinon
*RAM forme en C000 Ram Couleur en A000
************************************
ORG $7200 Minimum en Basic 512
SETDP $72
ASPRIT LDA #1
STA BASCEC Demarre a 1 et on ote 1
SPRIT0 LDA BASCEC
LDY >RAMECR
EORA IMPAIR
BEQ SPRIT1
LEAY 8000,Y
LDA BASCEC
BNE SPRIT1
LEAY 1,Y
SPRIT1 LDA HSPRIP
STA ISPRIP Samuel Devulder
SPRI02 LDA LSPRIP Boucle I
STA JSPRIP
SPRI03 LDA ,X Boucle J : LSPRIP
LDB ISSPRI Sprite ou un tile ?
BEQ FINTRA
*Debut transparence couleur 15
CMPA #$F0
BLO TRANSA
LDB ,Y
JMP TRANSB
TRANSA LDB ,X
TRANSB ANDB #$F0
STB BTEMPO
ANDA #$0F
CMPA #$0F
BLO TRANSC
LDA ,Y
ANDA #$0F
TRANSC ORA BTEMPO
FINTRA * Fin transparence
STA ,Y+
LEAX 1,X
DEC JSPRIP Samuel Devulder
BNE SPRI03
* Fin boucle J
LDA #40
SUBA LSPRIP Soustrait largeur sprite
LEAY A,Y
DEC ISPRIP Samuel Devulder
BNE SPRI02
* Fin boucle I
LDA BASCEC
LSRA Samuel Devulder
BCC FIPRO0 b0 de A dans C de CC
STA BASCEC
JMP SPRIT0
FIPRO0 RTS
****************************
*DATA pour fonctions affiche
****************************
ISPRIP FCB 0 Index I
JSPRIP FCB 0 Index J
HSPRIP FCB 16 Hauteur de Sprite
LSPRIP FCB 2 Nb octets RAM ecran de large
BTEMPO FCB 0
IMPAIR FCB 1 Vaut 0 ou 1 (par defaut)
BASCEC FCB 1 Vaut 0 ou 1 (par defaut)
ISSPRI FCB 0 Vaut 0 ou 1 (Externe)
*************************************
*Positionnement Sprite ou TILE
*Variables externe:RAMECR,DEBECR
*XSPRIT est sur 80 col, RAMECR sur 40
*On fait donc un decalage d'1 bit
*Sur la droite pour RAMECR/XSPRIT
*Et on valide IMPAIR à 0 ou 1
*************************************
POSSPR *
LDA XSPRIT
LDB XSPRIT
ANDB #1
STB IMPAIR
LSRA Pour RAM ecran
STA >XPOSEC
LDB >YSPRIT
LDA #40
MUL
ADDB >XPOSEC
ADDD #ECRDEB
STD >RAMECR
JMP ASPRIT
XPOSEC FCB 0
**************
*Routine timer
**************
ORG $7300
FNTIMR *
JSR >CHBNK1 bascule entre bnk2 et 3
LDA #$72
TFR A,DP
LDA >XSPRIT
CMPA #76
BEQ STOTMR Fin interruption
*On vide les sprites
LDA #0
STA >ISSPRI
STA >YSPRIT
JSR VIDSPR
* Affichage sprites
LDA #0
STA >YSPRIT
INCA A vaut 1
STA >ISSPRI
LDA >XSPRIT
ADDA #2 increment 4px droite
STA >XSPRIT
JSR >AFFSPR
JSR >CHECR
DEC >XSPRIT decrement 2px
JMP KBIN Contient un RTS
STOTMR * Extinction statut timer
LDA >STATUT
ANDA #$DF
STA >STATUT
LDA >DPINIT
TFR A,DP
JMP KBIN Contient un RTS
**************************
*Routine vidage 12 Sprites
**************************
VIDSPR *
LDX #ADRTIL
JSR >POSSPR
LDB >YSPRIT
ADDB #16
STB >YSPRIT
CMPB #176
BLO VIDSPR Fin boucle VIDSPR
RTS
***************************
*Routine affiche 12 Sprites
***************************
AFFSPR *
LDX #ADRSPR
JSR >POSSPR
LDB >YSPRIT
ADDB #16
STB >YSPRIT
CMPB #176
BLO AFFSPR Fin boucle AFFSPR
RTS
*******************************
*Routine changement de banque
*en RAM Logique A000-DFFF
*Via Gate Array mode page
*(TO8 MO6 et TO9+)
********************************
CHBNK1 *
LDA >BNKRM1 2 ou 3 ?
EORA #1 XOR complement bit 1.
STA >BNKRM1
LDA >RAMDAT Registre RAM Donnees
ANDA #224 Mise à 0 des bits 4-0
ORA >BNKRM1 Ajout bank Ram
STA >RAMDAT
RTS
*******************************
*Routine changement banque RAM
*Pour Ecran Logique 4000-5FFF
*Gate Array mode page
*(TO8 MO6 et TO9+)
********************************
CHECR *
LDA >BNKRM1 2 ou 3
LDB #64 decalage 6b gauche
MUL
STB >BNKVID
LDA >REGSY2
ANDA #63
ORA >BNKVID
STA >REGSY2
RTS
********************************
*Programme principal
*Animation sprite bas de l ecran
*de gauche a droite
********************************
ORG $8000 Apres les fonctions
MAIN *
LDA >REGSY1 Activation Mode Page..
ORA $16 ...pour Banques RAM
STA >REGSY1
LDB #$1B sequence d echappement
JSR PUTC
LDB #$5E Mode bm16c
JSR PUTC
*INIT DP
TFR DP,A
STA >DPINIT
*Programme*
LDA #0
STA >XSPRIT
STA >YSPRIT
LDD #49999 Timer toutes les 1/20s
STD TSB
LDX #FNTIMR Routine d interruption
STX TIMEPT
LDA >STATUT
ORA #$20
STA >STATUT
*fin programme*
RTS
ORG $8500
************************
*Data deplacement sprite
************************
XSPRIT FCB 0 par 2 px horizontal
YSPRIT FCB 0
***************
*Data divers
***************
DPINIT FCB 0
LIMITB FCB 0
STIMER FDB 0 Adresse routine timer init
SVLTMR FDB 0 Valeur timer init
RAMECR FDB 0 Adresse RAMEcran en Data.
BNKRM1 FCB 3 BankRam pour data 2,3
BNKVID FCB 0 BankRam video (128 ou 192)
**************************
* Les Sprites
**************************
* Bubble Droite 1
ADRSPR FCB 255,243,255,51,243,34,255
FCB 34,255,39,51,112,243,112
FCB 255,112,51,112,243,39,255
FCB 0,255,34,245,39,245,39
FCB 242,153,34,153,255,255,255
FCB 255,51,47,50,34,242,39
FCB 50,32,34,32,45,32,45
FCB 32,32,39,82,112,82,34
FCB 82,127,82,127,34,121,41
FCB 121
ADRTIL FCB 0,0,0,0,0,0,0,0
FCB 0,0,0,0,0,0,0,0
FCB 0,0,0,0,0,0,0,0
FCB 0,0,0,0,0,0,0,0
FCB 0,0,0,0,0,0,0,0
FCB 0,0,0,0,0,0,0,0
FCB 0,0,0,0,0,0,0,0
FCB 0,0,0,0,0,0,0,0
END
La gestion de la RAMA et RAMB se fait ici avec +/-8000 sur la RAM Data des TO8.
Pour la gestion du changement de Bank ça se fait avec la "fonction" CHBNK1 (en mode page TO8) et CHECR (POur changer la visu de l'espace logique écran, entre les banque 2 et 3)
J'ai bien utilisé les recommandation du manuel technique, à savoir:
- mettre à 1 le b4 de E7E7
- pour le calcul du basculement entre RAM physique 2 et 3 j'utilise un simple XOR (EOR)
- pour changer de bank RAM, j'utilise les b4..b0 de E7E5
- pour basculer de l'écran physique 2 vers 3 et vice versa, j'utilise b7b6 de E7DD
Le résultat est qu'il y a bien un défilement sur une seule des 2 banque, mais ça n'est point le sprite attendu, il est incomplet en plus, et sur l'autre RAM écran, il ne se passe rien, je ne voit qu'un écran de zébrures bleue...
Bref c'est la merde... Je pense pas que mon code soit mauvais, mais je retrouve le même problème que lorsqu'avant j'avais essayé de travaillé sur la RAM Data. Ya-t-il un bug dans DC Moto ? Est ce ma procédure "CLEAR" en BASIC qui n'est pas bonne ? Si je fais "BANK 3:CLEAR ,1H9FFF", je réserve bien tout l'espace à partir de la banque 3 jusqu'à la fin des banque n'est ce pas ? Et cette banque 3 correspond bien à la RAM physique 2 ?