Lecture du registre de controle

Le coin des demomakers et des programmeurs en herbe.

Modérateurs : SirG, Redfield1, shubibiman, Laucops

Avatar de l’utilisateur
touko
NECromancer
Messages : 2297
Inscription : lun. 31 mars 2008 14:32

Lecture du registre de controle

Message par touko »

Bonjour, je m'adresse a ceux qui parlent ASM, mooz ou peperocket ..

Je voudrai savoir comment lire le registre de contrôle de la pce pour par la suite activer et utiliser la détection de collision du sprite 0.

en lisant la doc j'ai cru comprendre qu'il suffisait d'indiquer le numero du registre CR (control register), à l'adresse $0000, et que le contenu de ce registre
était copié dans $0002 et $0003 ..

Je suis arrivé à écrire en vram, mais bon j'ai du mal à saisir complètement comment ça fonctionne pour la lecture/écriture du VDC ..
La doc en anglais n'est pas très claire.
Si une lumière pouvait m'éclairée, merci d'avance ..
Avatar de l’utilisateur
MooZ
Administrateur
Messages : 2090
Inscription : jeu. 16 déc. 2004 14:25
Contact :

Re: Lecture du registre de controle

Message par MooZ »

Tous les registres ne sont pas accessibles en écriture (cf vieille doc).
Pour la détection de la collision avec le sprite #0, le code est quasiment identique à celui de la synchro verticale ou horizontale. En gros on active le bit pour activer l'interruption dans le registre #5. Puis quand l'interruption pète, tu lis $0000 et tu testes si le bit 0 est à 1.

Code : Tout sélectionner

  ; Setup
  st0  #$05
  lda  #%1100_1101 ; BG_ON + Sprite_ON + VSYNC + HSYNC + Sprite #0 collision
  sta  $0002
  lda  #$00 ; auto increment = 1
  sta  $0003
Pour une HuCard, tu as 2 cas de figures. Soit tu n'utilises pas mkit et tu fais tout à la main. Dans ce cas il te suffira de rajouter le test du bit 0 du registre de controle dans ta routine de gestion de l'IRQ1. Soit tu utilises mkit et tu devras utiliser ta propre routine pour l'IRQ1.

Code : Tout sélectionner

  ; Dans ton code d'init (le main par exemple):
  setvec(IRQ1, irq1Handler)

Code : Tout sélectionner

irq1Handler:
  pha
  phx
  phy

  lda  video_reg ; video_reg est un alias pour $0000
  sta  <vdc_sr ; on en fait une copie

  bbr0  <vdc_sr, .no_spr0_hit
    jsr   handle_collision ; super routine de gestion de collision avec le sprite #0
.no_spr0_hit:
  ; et la on fait les crades et on ressaute dans le code de mkit (startup.asm ligne 821)
  jmp  _irq1+3+3+3+2 ; On ressaute sur .vsync (label local :/)
Pour un CD c'est un peu plus tendu. Le code pour l'IRQ1 est dans le bios (system card, etc...). En plus le code des "hook" (vsync, hsync) sous mkit est copié en RAM (remarque ca peut etre marrant de faire du code qui se modifie lui même). Par contre, je ne peux pas trop t'aider vu que je n'ai bossé que sur des HuCard pour l'instant.
Avatar de l’utilisateur
touko
NECromancer
Messages : 2297
Inscription : lun. 31 mars 2008 14:32

Re: Lecture du registre de controle

Message par touko »

Ouai merci mooz, mais putin j'aurai cru que c'etait plus simple que ça ..

J'avais bien compris comment activer et tester les collision, mais je commencais à perdre mon latin avec les registres du vdc ..
J'arrive très bien à écrire des données en VRAM par exemple ..

donc par exemple si je veux mettre le registre 5 à 0 je dois faire :

Code : Tout sélectionner

  st0 #5
  st1 #0
  st2 #0
PS:Merci de ton aide mooz ..
Avatar de l’utilisateur
touko
NECromancer
Messages : 2297
Inscription : lun. 31 mars 2008 14:32

Re: Lecture du registre de controle

Message par touko »

Bon je suis arrivé à paramétrer le RC comme il faut avec ta valeur ..

En suite je récupere la valeur du RC pendant l'irq1 de HUC, mais j'ai toujours $20 (donc bien l'irq du vblanc), mais j'arrive pas à récupérer celle de la collision du sprite 0 ...
Avatar de l’utilisateur
MooZ
Administrateur
Messages : 2090
Inscription : jeu. 16 déc. 2004 14:25
Contact :

Re: Lecture du registre de controle

Message par MooZ »

D'après "TurboGrafx-16 Hardware Notes" de Charles MacDonald:
At this point, collisions between sprite #0 and any other sprite are
checked. If the bitplane data from sprite #0 is an opaque pixel, and any
other of the 16 buffered sprites also output an opaque pixel, a collision
occurs. If the interrupt enable bit of CR is set, the collision bit in the
status register is set and the VDC will generate an interrupt. Collisions do
not occur outside of the active display period.
Donc si j'ai tout compris l'intérruption n'est levée pour que des collisions entre sprites dans l'intervalle de temps entre le HSYNC de la ligne 64 et celui de la dernière ligne de l'écran.
Avatar de l’utilisateur
touko
NECromancer
Messages : 2297
Inscription : lun. 31 mars 2008 14:32

Re: Lecture du registre de controle

Message par touko »

Ok merci MooZ, je vais voir avec ça .. :wink:
Avatar de l’utilisateur
Tanuki
Push Run Button!
Messages : 95
Inscription : mer. 14 oct. 2009 17:02

Re: Lecture du registre de controle

Message par Tanuki »

Sur chaque ligne active, la collision n'est détéctable que lorsque les pixels des sprites sont blités à l'écran pendant la partie active horizontale (HDW+1). La zone de suppression horizontale sert à transférer les patterns des sprites de la ligne suivante.
Avatar de l’utilisateur
touko
NECromancer
Messages : 2297
Inscription : lun. 31 mars 2008 14:32

Re: Lecture du registre de controle

Message par touko »

Euh, j'ai pas tout compris là :shock: ...
:mrgreen: dsl ..

J'avais compris que la détection devait se faire pendant les hsync ..
Mais bon j'ai peut être tout faux !! :?
Avatar de l’utilisateur
touko
NECromancer
Messages : 2297
Inscription : lun. 31 mars 2008 14:32

Re: Lecture du registre de controle

Message par touko »

Ayé merci les gars ça marche .. :mrgreen:
enfin pour une compilation en ROM ..

Faut que je teste avec le CD, mais à mon avis pas de raison que ça marche pas .
edit : En fait c'est pas aussi simple puisque qu'il faut placer le test de la collision dans le code de l'irq1, et pour le CD, bah c'pas bon :(

Si il y a des personnes intéressées, je peux mettre mon code sans problème :wink:
Avatar de l’utilisateur
MooZ
Administrateur
Messages : 2090
Inscription : jeu. 16 déc. 2004 14:25
Contact :

Re: Lecture du registre de controle

Message par MooZ »

Je suis preneur!
Avatar de l’utilisateur
touko
NECromancer
Messages : 2297
Inscription : lun. 31 mars 2008 14:32

Re: Lecture du registre de controle

Message par touko »

ok, d'abord j'ai modifié le fichier startup.asm dans include/pce .

J'y ai mis une variable en zero page,qui va servir pour indiquer si il y à une collision :

Code : Tout sélectionner

; ----
; system variables
;
 .zp
spr0_col:   .ds 1
"system variables" est présent au début du fichier (ligne 54).

ensuite au niveau de l'irq1 de huc (ligne 830) après la lecture du registre d'état.
Toutes les interruptions du vdc passent par l'irq1 dans huc ..

Code : Tout sélectionner

    lda   video_reg	; get VDC status register
    sta  <vdc_sr		; save a copy	
Je rajoute le test de collision ..

Code : Tout sélectionner

;// TEST DE COLLISION SPRITE 0
;// Accumulateur A contient deja la valeur du RC 
    bit #01                  ;//test du bit 0 du status register
    beq .suite             ;// si pas collision on va à .suite
    sta spr0_col	        ;// si collision on l'indique dans spr0_col (Registra A contient déjà la valeur 1)
.suite:	
Ensuite dans le main du fichier .c, on initialise la prise en compte de l'interruption sur la collision du sprite 0.

Code : Tout sélectionner

#asm
		st0 #5
		lda #%1100_1101   ;// BG_ON + Sprite_ON + VSYNC + HSYNC + Sprite #0 collision		
		sta <vdc_crl
		sta video_data_l
		stz spr0_col           ;// RAZ de la detectio de collision sprite 0
#endasm	
et pour finir on récupère une éventuelle collision .

Code : Tout sélectionner

#asm	   
       lda spr0_col
       sta _spr_test
       stz spr0_col         ;// RAZ irq collision sprite 0
#endasm 
Moi j'utilise spr_test qui est une variable globale HUC ..

Voilà, si il y a des questions ...
faut que je trouve le moyen de le prendre en compte pour la version CD ..
C'est pas gagné :mrgreen:

Je crois que je suis bon pour faire mon propre gestionnaire d'irq1 .
Dernière modification par touko le mer. 05 janv. 2011 15:15, modifié 1 fois.
Avatar de l’utilisateur
xav
NECrophage
Messages : 1159
Inscription : mar. 05 juil. 2005 22:12
Localisation : Le plus grand four solaire de France, Montpellier

Re: Lecture du registre de controle

Message par xav »

Bien joué :wink:
Cela dit, je suis curieux de voir comment tu vas te servir de cette collision hardware, dans la mesure ou elle ne concerne que le sprite 0 ( en voila une limitation à noix) l'intérêt pour un jeux est drôlement limité, sauf bien sur si tu bloque ton sprite principal au slot 0, mais alors impossible de faire passer un sprite devant lui :(

Mais j'imagine que tu as deja ta petite idée :mrgreen:
"Theory, it's when we know everything and nothing works. Practice, it's when everything works and nobody knows why. Here, we have put together theory and practice : Nothing works... and nobody knows why!" (Albert Einstein)
Avatar de l’utilisateur
touko
NECromancer
Messages : 2297
Inscription : lun. 31 mars 2008 14:32

Re: Lecture du registre de controle

Message par touko »

En fait je voulais l'utiliser pour le tir du joueur, pour detecter les collisions avec les aliens et les boss(dans galaxian), j'ai déjà une routine, mais ça m'eviterai de faire des tests pour rien et par la même occasion de faire des économies de cycles ..

Mais il me servirai par la suite dans d'autres projets, le tout est de bien l'utiliser pour éviter cerains problèmes comme celui que tu viens de souligner :mrgreen: ..
Avatar de l’utilisateur
xav
NECrophage
Messages : 1159
Inscription : mar. 05 juil. 2005 22:12
Localisation : Le plus grand four solaire de France, Montpellier

Re: Lecture du registre de controle

Message par xav »

je voulais l'utiliser pour le tir du joueur
Ça c'est pas bête! C'est vrai que pour gérer un tir ça peut être utile :o
"Theory, it's when we know everything and nothing works. Practice, it's when everything works and nobody knows why. Here, we have put together theory and practice : Nothing works... and nobody knows why!" (Albert Einstein)
Avatar de l’utilisateur
touko
NECromancer
Messages : 2297
Inscription : lun. 31 mars 2008 14:32

Re: Lecture du registre de controle

Message par touko »

Oui surtout que tu dégommes plus d'aliens que eux te touchent dans une partie .

Après tu peux aussi affiner la détection pour éviter le pixel prés .
Répondre