Logicielsmoto.com

Nous sommes le 29 Mar 2024, 07:29

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 168 messages ]  Aller à la page Précédente  1 ... 4, 5, 6, 7, 8, 9, 10 ... 12  Suivante
Auteur Message
MessagePosté: 16 Sep 2020, 14:00 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
SETDP $NN est une directive qui instruit l'assembleur que dans les instructions qui quivent et qui utilisent une adresse $NNxx (NN est le paramètre du SETDP), il peut générer une instruction en mode page directe au lieu de étendu qui économise 1 octet et 1 cycle. C'est peu, mais sur la longueur ca fini par faire beaucoup (les petits ruisseaux font les grandes rivières).

Attention, ca instruit l'assembleur, mais ca ne modifie pas la valeur de DP dans le code source. C'est au codeur de postionner DP à la bonne valeur ($NN) quand il appelle du code utilisant le mode page-directe.

Dans ton code, tu dis à l'assembleur que DP est présumé être $72.. or quand on regarde le source il y a peu d'adresses de la forme $72xx qui sont souvent executées. Le petit ruisseau reste petit.
Code:
 ORG $7200 Minimum en Basic 512
 SETDP $72
ASPRIT LDA #1
 STA BASCEC   <=== probablement pas de la forme $72xx... donc pas d'optim
SPRIT0 LDA BASCEC <=== idem
 LDB $E7C3 <== idem
 ADDA IMPAIR <== idem
 CMPA #1
 BNE SPRIT1 <== relatif donc pas optim
 ORB #1
 LDA BASCEC <== pas DP
 BNE SPRIT2
 LDY >RAMECR <=== pas $72xx
 LEAY 1,Y
 STY >RAMECR <== idem
 JMP SPRIT2 <== Ah!!! SPRIT2 est de la forme $72xx, donc ca passe en JMP direct-page.. OPTIM ok
SPRIT1 ANDB #254
SPRIT2 STB $E7C3
 LDA HSPRIP Boucle I HSPRIP <== pareil pas $72xx ==> pas optim
 STA ISPRIP Samuel Devulder <== pareil pas $72xx ==> pas optim
 LDY >RAMECR <== pareil pas $72xx ==> pas optim
SPRI02 LDA LSPRIP Boucle J LSPRIP <== pareil pas $72xx ==> pas optim
 STA JSPRIP <== pareil pas $72xx ==> pas optim
SPRI03 LDA ,X Boucle J : LSPRIP
 LDB ISSPRI Sprite ou un tile ? <== pareil pas $72xx ==> pas optim
 BEQ FINTRA
*Debut transparence couleur 15
 CMPA #$F0
 BLO TRANSA
 LDB ,Y
 JMP TRANSB <=== Ah $72xx donc OPTIM OK
TRANSA LDB ,X
TRANSB ANDB #$F0
 STB BTEMPO <== pareil pas $72xx ==> pas optim
 ANDA #$0F
 CMPA #$0F
 BLO TRANSC
 LDA ,Y
 ANDA #$0F
TRANSC ORA BTEMPO  <== pareil pas $72xx ==> pas optim
FINTRA * Fin transparence
 STA ,Y+
 LEAX 1,X
 DEC JSPRIP Samuel Devulder <== pareil pas $72xx ==> pas optim
 BNE SPRI03
* Fin boucle J
 LDA #40
 SUBA LSPRIP Soustrait largeur sprite <== pareil pas $72xx ==> pas optim
 LEAY A,Y
 DEC ISPRIP Samuel Devulder <== pareil pas $72xx ==> pas optim
 BNE SPRI02
* Fin boucle I
 LDA BASCEC <== pareil pas $72xx ==> pas optim
 LSRA Samuel Devulder
 BCC FIPRO0 b0 de A dans C de CC
 STA BASCEC <== pareil pas $72xx ==> pas optim
 JMP SPRIT0 <== Ahhh $72xx ==> OPTIM ok
FIPRO0 RTS
On voit clairement que les JMP sont les seuls bouts optimisables car ils sautent en $72xx. Les variables étant probablement déclarées en fin de code sont du type $73yy et donc hors de la page-directe.

Pour optimiser ca, déclare une autre valeur pour le STDP pour dire que DP aura la valeur $73 ou autre, bref la page qui contient les variables (arrange toi pour qu'elles ne tombent pas à cheval sur deux pages). N'oublie pas non plus de positionner DP: "lda #$NN puis tfr A,DP" au tout début du code possiblement impacté par le SETDP (sinon tu va lire la variable $PPxx au lieu de $NNxx, PP étant la valeur de DP en ce point du code.)

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 16 Sep 2020, 18:17 
Hors ligne

Inscription: 13 Juin 2005, 21:50
Messages: 290
Localisation: Planete Zorg (31)
Le mieux c'est d'utiliser le registre U comme registre de donnée. Tu pointes U sur les datas et tu pioches à X,U

Par exemple pour l'adresse écran LDY, U...


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 16 Sep 2020, 18:30 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
"X,U" tu veux dire "n,U" ? (n=nombre)

Le problème est de déterminer ce n quand on utilise des vars symboliques et éviter que l'assembleur n'utilise un entier 16bits ce qui ruine l'affaire. C'est pas facile quand on est pas familier avec son assembleur ou qu'on est susceptible d'ajouter/retirer des variables. En plus perdre un registre aussi c'est pas idéal non plus. Enfin depuis pascal-base il faut préserver U ce qui complique encore les choses quand on est pas familier avec tout ça.

Perso je préfère de loin avoir les vars accessible en page DP et réserver les regs pour l'algo. A la limite j'utiliserais le mode indexé non pas par rapport à U, mais par rapport à S pour stocker le max de variables temporaires (indice de boucles) en pile et garder les variables d'état en page directe.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 18 Sep 2020, 12:48 
Hors ligne

Inscription: 13 Juin 2005, 21:50
Messages: 290
Localisation: Planete Zorg (31)
Pour le moment ce n'est que de l'affichage comme tu le désignes. Mais tu vas voir que cela va se compliquer avec le reste (déplacements, collisions, bulles...). Et il faudra se résoudre à utiliser les piles.

Par exemple l'affichage de bubble n'a besoin que de 3 paramètres
- sa position à l'écran
- sa largeur
- sa longueur

Toutes ces informations peuvent êtres empilées dans un ordre logique pour les dépiler dans la séquence d'affichage.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 20 Sep 2020, 13:54 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
jasz a écrit:
Pour le moment ce n'est que de l'affichage comme tu le désignes. Mais tu vas voir que cela va se compliquer avec le reste (déplacements, collisions, bulles...). Et il faudra se résoudre à utiliser les piles.

Par exemple l'affichage de bubble n'a besoin que de 3 paramètres
- sa position à l'écran
- sa largeur
- sa longueur

Toutes ces informations peuvent êtres empilées dans un ordre logique pour les dépiler dans la séquence d'affichage.


Figures toi que tout ceci est déjà existant dans mon algorithme, et quand je dis affichage de l'animation, c'est justement avec les paramètre X et Y de chaque sprte à l'écran, la largeur et hauuer sont déjà existant (si tu as vu mon code assembleur, tu l'aura vu dans les étiquette HSprite, Xsproite etc). Et donc, les Thomson peuvent animer sans ralentissement, 12 sprites de 8x16 en transparence en rafraichissement en 1/10s. J'ai pas testé avec 20 sprites 8x16 (vertical) mais je le ferai très prochainement.

Et fait il ne manque juste que la gestion des collision (et c'est là où je me demande comment faire avec les tableau!! J'avais conseillé à l'auteur du PacMan de faire un tableau de valeur où chaque valeur représente un tile de 8x8... Mais pour un jeu de plateau avec la complexité de Buuble Bobble... je sais qu'il faudra que je fasse des comparaison des position avec les valeurs divisible par 8 (ou 4) et voir si la position dans le tableau du niveau coincide en bas ou sur les côté (Bubble bobble se se cogne jamais avec les plateau mais passe au travers dans la phase montante). T'inquiète tout est prévu!! Pour info j'ai déjà programmer un clone de PAcman en JavasScript s'appellant PoPPyMan (tu peu faire une recherche sur Internet). Et il y a la gestion des contact avec les fantômes (un peu trop sévère d'ailleurs puisque même dans les coins ça nous tue).

Mais actuellement, je suis en train d'ajouter le module de crétin de niveau de jeux Thomson dans mon logiciel JavaScript (8 bits game builder) qui n'est pas encore en ligne (parce qu'il est encore assez incomplet mais me permet de créer très rapidement les sprites et tiles sur Thomson déjà et les intégrer durectement en FCB en Asembleur!)


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 20 Sep 2020, 14:20 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Pour les collisions, on utilise souvent la "hit-box". Chaque sprite est approximé par le rectangle qui l'entoure (on se fiche des transparence).

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 22 Sep 2020, 21:43 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
Samuel Devulder a écrit:
Pour les collisions, on utilise souvent la "hit-box". Chaque sprite est approximé par le rectangle qui l'entoure (on se fiche des transparence).

Oui je sais (c'est ce que j'ai pfait pour le jeux JavaScript PoppyMan) mais le tour est de savoir dans quelle limite on admet ça par rapport aux autres Sprite et d'où on compare ? (Pour les colisions du Bubble, à comparer avec la position de chacun des ennemis, mais savoir si on compare uniquement dans chaque axes ou dans les 8 direction ? J'ai fauit dans les 8 direction dans Poppy Man et ça devient pus difficile en fait)

Je suis en train de regarder ta doc sur le scrolling (PSH, PLS...) (et celui de Bentoc), on gagne quand même 70%/aux LDD ,X+ et STD ,Y+, mais je compte utiliser le gate array mode page pour ça et la technique des piles n'est pas vraiment possible dans ce cas je pense (utilisation de la banque RA% 2 et 3 pour l'écran et une autre banque pour le buffer... Ou alors utiliser une étiquette pour cela où stocker la pile...


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 26 Oct 2020, 20:13 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
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 ?


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 26 Oct 2020, 20:56 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Avant de creuser plus en détail il me semble me souvenir que la bank 2 du basic n'est pas la bank2 physique du gate-array et qu'on y a pas accès facilement par un simple bank2. Enfin c'est plus très clair pour moi, mais il me semble qu'il y a une sorte de décalage: la bank 0 gate array est la zone 6000->9FFF, la 1 la ram écran $4000->$5FFF x2, la 2 était la bank 0, la 3 la bank 1 du basic ou dans le genre, et donc la bank2 du basic est la 4 du gate-array et donc n'est pas affichable par ce dernier. Mais ce dont je me souviens c'est qu'entre le code de test en basic et le même en asm, la version asm marchait comme attendu. Pour le basic c'était pas exactement ca lors de mes tests il me semble. C'est vieux tout ca ;)

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 27 Oct 2020, 00:36 
Hors ligne

Inscription: 06 Avr 2010, 01:59
Messages: 478
salut,
Pour la commutation moi je me suis aidé de cette technique, pour le swap écran memoire <--> écran physique : http://pulsdemos.com/vector02.html

1 - ECRAN SET $0000 *ECRAN correspond donc a mon coin haut gauche de l'écran

1 - JSR SCRC *pour alterner les 2 écrans (en memoire ou écran physique ce que je vois) quant je vois l'un j'écris sur l'autre.

2 - exemple :

JSR SCRC | là je vide
JSR EFFACEECRAN | les 2 ecrans
JSR SCRC |
JSR EFFACEECRAN |

ici je dessine mes sprites qu'on ne vois pas a partir de ECRAN ($0000)
...
...
JSR SCRC *je swap pour voir tout d'un coup à l'écran

et ici du coup si je dessine sur l'autre écran que je ne vois plus, toujours a partir de ECRAN ($0000)

JSR SCRC

etc.. (tu fait une loop)




Code:
********************************************************************************
* Changement de page ecran
*
* Provenance de ce bout de code :  http://pulsdemos.com/vector02.html
* Modifie par OlivierP (ORB #$0A et lignes commencant par 6 espaces)
* Suppression du CLR $E7CF sur les conseils de Gilles.
********************************************************************************
SCRC
        LDB  SCRC0+1
        ANDB #$80          * BANK1 utilisee ou pas pour l affichage , fond couleur 0
        ORB #$03           * contour ecran = couleur
        STB  $E7DD         * change contour couleur
        COM  SCRC0+1
SCRC0
        LDB  #$00
        ANDB #$02          * page RAM no0 ou no2 utilisee dans l espace cartouche
        ORB  #$60          * espace cartouche recouvert par RAM , ecriture autorisee
        STB  $E7E6
        *CLR $E7CF
        RTS


Bon je sais pas si je suis clair ou pas, lol c'est pas evident...

_________________
Image


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 27 Oct 2020, 00:41 
Hors ligne

Inscription: 06 Avr 2010, 01:59
Messages: 478
par exemple moi j'ai fait ça dans ma boucle de jeu :

Code:
mainloop

        JSR SAVE_SPRITES_ZONES
        JSR DRAW_ALL_SPRITES
            JSR SCRC    *------ SWAP BUFFER TO VISIBLE ----
        JSR DRAW_ALL_SPRITES
            JSR SCRC    *------ SWAP BUFFER TO VISIBLE ----
        JSR RESTORE_SPRITES_ZONES




       * TEST JOYSTICK
       * check player direction to move
       * mvt fantomes
       * TEST CLAVIER



       JSR DRAW_ALL_SPRITES
            JSR SCRC    *------ SWAP BUFFER TO VISIBLE ----
        JSR RESTORE_OLD_SPRITES_ZONES


    JMP   mainloop

_________________
Image


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 27 Oct 2020, 02:18 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Placer la ram écran en $0000-$3FFF est pratique. Par contre ca ne marche qu'en ASM et pas en basic qui doit être présent dans cette zone là.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 27 Oct 2020, 16:06 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
Samuel Devulder a écrit:
Avant de creuser plus en détail il me semble me souvenir que la bank 2 du basic n'est pas la bank2 physique du gate-array et qu'on y a pas accès facilement par un simple bank2. Enfin c'est plus très clair pour moi, mais il me semble qu'il y a une sorte de décalage: la bank 0 gate array est la zone 6000->9FFF, la 1 la ram écran $4000->$5FFF x2, la 2 était la bank 0, la 3 la bank 1 du basic ou dans le genre, et donc la bank2 du basic est la 4 du gate-array et donc n'est pas affichable par ce dernier. Mais ce dont je me souviens c'est qu'entre le code de test en basic et le même en asm, la version asm marchait comme attendu. Pour le basic c'était pas exactement ca lors de mes tests il me semble. C'est vieux tout ca ;)


Plus être plus précis (Page 120 du manuel technique) par défaut
- Page 0 RAM = écran
- Page 1 RAM = Système (à ne pas toucher)
Par gate Array:
- L'espace logique 0000-3FFF peut se voir attribuer toutes les banques (via b5 de E7E6 à 1 et écriture de la banque en ??)
- L'espace logique écran 4000-5FFF peut se voir attribuer les banques 0 à 3 via les b7b6 de E7DD. Sachant qu'il fait éviter le 1 et que par défaut (compatibilité) c'est la banque 0.
- Espace A000-DFFF : peut se faire via le gate array (b4 de E7E7 à 1 et écriture (32 banques) dans les b4b5b2b1b0 de E7E5

Il y a un soucis au basculement de la RAM écran, on voit une image zébrée, le mode bm16 ne semble pas fonctionner pour ces banques là (enfin, en utilisant le classique "PUTC", je me rend compte là que c'est sans doute une erreur de ma part ? Puisque le PUTC n'agit que sur l'écran "par défaut" ?)

Pour ce qui est des BANK du BASIC, c'est quoi la procédure pour travailler dessus ? A quoi ça sert le CLEAR ? J'ai pas l'impression que ça serve à grand chose en fait! Je pense que les BA?NK du basic sont décalé de +1 comparé aux numéro des pages de banque RAM.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 27 Oct 2020, 16:12 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
Samuel Devulder a écrit:
Placer la ram écran en $0000-$3FFF est pratique. Par contre ca ne marche qu'en ASM et pas en basic qui doit être présent dans cette zone là.


Ok donc le CLEAR ne sert qu'en BASIC en fait et qu'il faut charger en RAM tout le programme assembleur qui se chargera de gérer toutes ces init de gate Array ? Ok pigé et à la fin du programme on remet le basic dans cette zone... C'était une question que je me posais.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 27 Oct 2020, 16:43 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
adnz a écrit:
salut,
Pour la commutation moi je me suis aidé de cette technique, pour le swap écran memoire <--> écran physique : http://pulsdemos.com/vector02.html

1 - ECRAN SET $0000 *ECRAN correspond donc a mon coin haut gauche de l'écran

1 - JSR SCRC *pour alterner les 2 écrans (en memoire ou écran physique ce que je vois) quant je vois l'un j'écris sur l'autre.

2 - exemple :

JSR SCRC | là je vide
JSR EFFACEECRAN | les 2 ecrans
JSR SCRC |
JSR EFFACEECRAN |

ici je dessine mes sprites qu'on ne vois pas a partir de ECRAN ($0000)
...
...
JSR SCRC *je swap pour voir tout d'un coup à l'écran

et ici du coup si je dessine sur l'autre écran que je ne vois plus, toujours a partir de ECRAN ($0000)

JSR SCRC

etc.. (tu fait une loop)
[code]


Oui c'est aussi l'approche que j'ai utilisé avec mon propre algorithme, je suis suffisamment expérimenté pour créer mes propres algorithmes (partie "CHBNK1" et "CHECR" dans mon source), et ne pas copier sur les autres.
Alors je m'interroge sur ton code "EFFACEECRAN", est ce que tu effaces l'écran à chaque fois ? (En gros, mettre des "0" sur les 16k) ? Ou simplement tu fais un effacement juste là où se trouve tes sprites ? J'en avais discuté avec Sam au début de mon projet et il m'avait dit que l'effacement des sprites prenait beaucoup moins de temps!! Effacer 920 pixels (10 sprites) prend beaucoup moins de temps que n'en effacer 32000 (tout l'écran)

Le soucis avec mon approche est que je travaille sur la zone A000-DFFF comme suggéré dans le manuel technique (mon algo est basé là dessus), et évidemment je travaille sur une banque physique avant de basculer dessus pour la RAM Ecran.

Mais j'ai l'impression que le mode bm16 ne marche pas sur ces banques là (2 et 3), et j'aimerais avoir une correspondante entre les BANK basic et celle des pages physique de RAM...


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 168 messages ]  Aller à la page Précédente  1 ... 4, 5, 6, 7, 8, 9, 10 ... 12  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 46 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
cron
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com