3Fermer5
bode_sephirothLe 14/09/2008 à 15:05
Salut!

Merci beaucoup Folco pour tes réponses!
Alors je ferais donc mieux de me satisfaire de l'int1.
J'ai téléchargé J89hw.txt mais je ne suis pas sûr que ce soit la dernière version. En tout cas merci de l'info!
Merci aussi pour le lien vers le code! Je n'ai fait que jeté un oeil très très rapide je regarderai plus tard.

Pour info, je programme en nostub, j'aurais dû le préciser.
Folco (./3) :
bode_sephiroth (./1) :
Pour info je place mon vecteur en $40068
hum... l'int 1 est à $64, donc là c'est la 2.


En effet c'est bien la 2, je voulais dire que je place mon vecteur là dans le cas où ça ne marche pas.
Folco (./3) :
Ton masque alakhon marcgait sur les hw1 (ghostspace), mais t'es baisé sur les hw2+. La version correcte pour écrire un vecteur est de mettre à zéro $600001:2, écrire le vecteur, puis remettre le bit à 1. Ton hack ne marche que sur les tous premiers HWs...


En fait comme tu le verras plus bas je fais ça aussi. Je pensais cependant utiliser les masques aussi pour pouvoir contrôler à quel moment mon handler devient actif et à quel moment je l'inhibe. En effet, comme je change l'adresse de retour si appui sur 'hand', ça fout la merde si mon handler intervient en dehors de la boucle de jeu (et c'est pas beau couic si ça arrive).
Sinon pour la différence 000 ou 001, il y en a vraiment une?
Folco (./3) :
bode_sephiroth (./1) :
PS: j'ai préféré ne pas mettre de code pour le moment car je me dis que peut-être une particularité de la V200 est déjà connue là-dessus. Bien sûr, je peux poster des bouts de code.

Heu, ici, on est plutôt d genre généreux, et le code est passé de l'un à l'autre pour la bonne cause, t'inquiète pas de ce que adviendras ce que tu as écris si c'est ça qui te fait peur grin


Pas de problème pour le code! C'est juste que j'avais peur que fasse lourd et en plus je me disais que ce n'était peut-être pas nécessaire. Mais c'est sûr que c'est toujours mieux d'avoir le code sous les yeux, alors voilà les parties intéressantes:
(j'ai coupé des morceaux pour plus de clarté)

	include "OS.h"
	xdef _nostub
	xdef _ti92plus

;------------------------------------------------------------------------
;--masquage des interruptions

	trap #12

	;tester la valeur du masque avant modif
	;et la sauvegarder pour restauration à la fin

	clr.l d0
	btst.w #8,SR
	beq masque_neuf
	addq.b #%1,d0
masque_neuf:
	btst.w #9,SR
	beq masque_dix
	addq.b #%10,d0
masque_dix:
	btst.w #10,SR
	beq masque_ok
	addq.b #%100,d0
masque_ok:
	move.b d0,-(a7)

	ori.w #%0000001100000000,SR
	;            ^^^ 
	;on masque jusqu'a trois pour eviter des probs en debut de prog

;------------------------------------------------------------------------
;	on déroute les interruptions suivantes:
;       int1: barre en bas de l'écran entre autres
;       int2: clavier...
;	int5: timer programmable
;	int4: port I/O
;	int6: appui sur ON
;	RQ: il faut garder int3 : c'est le timer de la clock...
;

	bclr.b #2,($600001) ;on enlève la protection en écriture
     
	;déroutage int1
	move.l #$40064,a0
	lea Int1(pc),a1
	move.l (a0),(a1)
	lea fake_int(pc),a1
	move.l a1,(a0)

	;déroutage int2
	move.l #$40068,a0
	lea Int2(pc),a1
	move.l (a0),(a1)
	lea clavier(pc),a1
	move.l a1,(a0)

	;déroutage int4
	move.l #$40070,a0
	lea Int4(pc),a1
	move.l (a0),(a1)
	lea fake_int(pc),a1
	move.l a1,(a0)
	
	;déroutage int5
	move.l #$40074,a0
	lea Int5(pc),a1
	move.l (a0),(a1)
	lea fake_int(pc),a1
	move.l a1,(a0)

	;déroutage int6
	move.l #$40078,a0
	lea Int6(pc),a1
	move.l (a0),(a1)
	lea fake_int(pc),a1
	move.l a1,(a0)
	
	bset.b #2,($600001)
	andi.w #%1101111111111111,SR ;on remet à 0 le bit superviseur


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

[...sauvegarde et effacement de l'écran, allocations de mémoire...]

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

[...affichage d'un dessin et d'un sprite avec des macros persos. Je l'ai ai vérifiées elles fonctionnent pas de problème ici...]


	trap #12
	andi.w #%1101100111111111,SR
	;             ^^^
	;on demasque les int et on repasse en user
boucle:

	bra boucle
;--fin de boucle------------------------

fin:
	trap #12  ;passage en superviseur
	ori.w #%0000001100000000,SR
	;            ^^^ 
	;on remasque les int pour eviter des ennuis...
	andi.w #%1101111111111111,SR ;on remet à 0 le bit superviseur


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

[...restauration de la mémoire allouée et de l'écran...]

;------------------------------------------------------------------------
;--remise en place des interruptions déroutées

	trap #12  ;passage en superviseur
	bclr.b #2,($600001)
     
	;remise en place de int1
	move.l #$40064,a0
	lea Int1(pc),a1
	move.l (a1),(a0)
	
	;remise en place de int2
	move.l #$40068,a0
	lea Int2(pc),a1
	move.l (a1),(a0)

	;remise en place de int4
	move.l #$40070,a0
	lea Int4(pc),a1
	move.l (a1),(a0)
	
	;remise en place de int5
	move.l #$40074,a0
	lea Int5(pc),a1
	move.l (a1),(a0)

	;remise en place de int6
	move.l #$40078,a0
	lea Int6(pc),a1
	move.l (a1),(a0)
     
	bset.b #2,($600001)
	;andi.w #%1101111111111111,SR ;on remet à 0 le bit superviseur
					;on repasse donc en utilisateur

;------------------------------------------------------------------------
;--démasquage des interruptions

[...on remet en place le masque trouvé au début du programme...]

;------------------------------------------------------------------------
;--fin du prog

	rts

			;--------------------------!
			;--------------------------!

;------------------------------------------------------------------------
;--fake handler
fake_int:
	rte


clavier:	

	move.b #%11111110,$600019
	nop
	nop
	nop 
	nop
	move.b $60001b,d0     ;lecture du byte de sortie du port
	                        ;correspond aux colonnes

	tst.b d0
	beq fin_clavier
	btst #6,d0    ;flèche droite? (droite)
	beq droit
	btst #4,d0    ;flèche gauche? (gauche)
	beq gauche
	btst #7,d0    ;flèche bas? (descente rapide)
	beq bas
	btst #5,d0    ;flèche haut? (descente instantannée)
	beq haut

	btst #3,d0    ;hand? (quitter)
	beq sortie
	bra fin_clavier

;--flèche droite-----------------------
droit:

[...on deplace le sprite correctement...]

	bra fin_clavier
;--fin droite---------------------------

[...de même pour les trois autres directions...]
	
fin_clavier:
	rte
sortie:
	;on va changer l'adresse de retour
	;on va revenir au label fin, apres la boucle de jeu
	;l'adresse est à mettre après un
	;word sur la pile qui est une sauvegarde du SR avant int je crois
	lea.l fin(pc),a0
	move.l a0,2(a7)	;on écrit donc la new adresse en 2(a7)
	rte


;-----------------------------------------------------------------------!
;				SECTION DATA				!
;-----------------------------------------------------------------------!
	section ".data"

	Int1: dc.l 0
	Int2: dc.l 0
	Int4: dc.l 0
	Int5: dc.l 0
	Int6: dc.l 0
[...et d'autres trucs dont le sprite...]