Bon il semble que je n'ai pas épuisé les zones de sprites. En effet, je viens d'en trouver une tout au début de la mémoire du jeu, peu après l'écran interne. Il est important puisque c'est lui qui affiche les vaisseaux ennemis "de base" en 16x16 au début du jeu:
Code:
7E7F CE6560 LDU #$6560 3
7E82 EC84 LDD ,X 5
7E84 847F ANDA #$7F 2
7E86 33C6 LEAU A,U 5
7E88 8618 LDA #$18 2
7E8A 3D MUL 11
7E8B 33CB LEAU D,U 8
7E8D A60A LDA $0A,X 5
7E8F 271B BEQ $7EAC 3
7E91 108E7E5F LDY #$7E5F 4
7E95 A607 LDA $07,X 5
7E97 8108 CMPA #$08 2
7E99 2D01 BLT $7E9C 3
7E9B 4F CLRA 2
7E9C 8407 ANDA #$07 2
7E9E 48 ASLA 2
7E9F 48 ASLA 2
7EA0 31A6 LEAY A,Y 5
7EA2 A60C LDA $0C,X 5
7EA4 48 ASLA 2
7EA5 31A6 LEAY A,Y 5
7EA7 10AEA4 LDY ,Y 6
7EAA 2003 BRA $7EAF 3
7EAC 10AE03 LDY $03,X 7
7EAF A602 LDA $02,X 5
7EB1 2703 BEQ $7EB6 3
7EB3 31A860 LEAY $60,Y 5
7EB6 3410 PSHS X 7
7EB8 1F21 TFR Y,X 6
7EBA C602 LDB #$02 2
7EBC A68830 LDA $30,X 5
7EBF A4C4 ANDA ,U 4
7EC1 AA80 ORA ,X+ 6
7EC3 A7C4 STA ,U 4
7EC5 A68830 LDA $30,X 5
7EC8 A441 ANDA $01,U 5
7ECA AA80 ORA ,X+ 6
7ECC A741 STA $01,U 5
7ECE A68830 LDA $30,X 5
7ED1 A442 ANDA $02,U 5
7ED3 AA80 ORA ,X+ 6
7ED5 A742 STA $02,U 5
../...
7FA3 A68830 LDA $30,X 5
7FA6 A4C900A8 ANDA $00A8,U 8
7FAA AA80 ORA ,X+ 6
7FAC A7C900A8 STA $00A8,U 8
7FB0 A68830 LDA $30,X 5
7FB3 A4C900A9 ANDA $00A9,U 8
7FB7 AA80 ORA ,X+ 6
7FB9 A7C900A9 STA $00A9,U 8
7FBD A68830 LDA $30,X 5
7FC0 A4C900AA ANDA $00AA,U 8
7FC4 AA80 ORA ,X+ 6
7FC6 A7C900AA STA $00AA,U 8
7FCA 33C900C0 LEAU $00C0,U 8
7FCE 5A DECB 2
7FCF 1026FEE9 LBNE $7EBC 6/5
7FD3 3510 PULS X 7
7FD5 39 RTS 5
C'est plus ou moins la routine de sprites 24x24 qu'on a vu en
$C8EA. Le patch est similaire
Code:
* sprite 16x16
ORG $7E7F
LDU #$6560
PSHS X
LEAY ,X
LEAU $60,U
LDD ,Y
ANDA #$7F
LEAU A,U
LDA #$18
MUL
LEAU D,U
LDA 10,Y
BEQ L1
LDX #$7E5F
LDB 7,Y
CMPB #8
BLT L2
CLRB
L2 ANDB #7
ASLB
ASLB
ABX
LDB 12,Y
ASLB
LDX B,X
BRA L3
L1 LDX 3,Y
L3 LDB #12
LDA 2,Y
BEQ L4
ADDB #$60
MSK MACRO
INDEXED LDD,\0-$60,U
INDEXED ANDA,$30+\1-12,X
INDEXED ANDB,$31+\1-12,X
INDEXED ORA,0+\1-12,X
INDEXED ORB,1+\1-12,X
INDEXED STD,\0-$60,U
INDEXED LDA,\0-$5e,U
INDEXED ANDA,$32+\1-12,X
INDEXED ORA,2+\1-12,X
INDEXED STA,\0-$5e,U
ENDM
L4 LEAX B,X
LDY #L5
PSHS X,Y
BRA L6
L5 LEAU $C0,U
LEAX 24,X
L6 SET *
MSK 0,0
MSK $18,3
MSK $30,6
MSK $48,9
MSK $60,12
MSK $78,15
MSK $90,18
MSK $A8,21
PULS X,PC
Ca march bien, .. jusqu'à ce qu'on zigouille un ennemi et là ca plante !
Heureusement en utilisant la fonction TRACE de DCMoto, et en analysant les chemins d'execution vers $7EB6, je tombe sur ceci
Code:
7C5A 108E7E3F LDY #$7E3F D=03E0 X=7FE5 Y=7D2E U=6D4C S=BC62 DP=61 CC=D1 | Banques: SYST=0 ROM=0 RAM=0F MEMO=0 VIDEO=1
7C5E 48 ASLA D=03E0 X=7FE5 Y=7E3F U=6D4C S=BC62 DP=61 CC=D1 | Banques: SYST=0 ROM=0 RAM=0F MEMO=0 VIDEO=1
7C5F 10AEA6 LDY A,Y D=06E0 X=7FE5 Y=7E3F U=6D4C S=BC62 DP=61 CC=D0 | Banques: SYST=0 ROM=0 RAM=0F MEMO=0 VIDEO=1
Ok rien de spécial, sauf que là, regardez:
Code:
7C62 BD7EB6 JSR $7EB6 D=06E0 X=7FE5 Y=BDC6 U=6D4C S=BC62 DP=61 CC=D8 | Banques: SYST=0 ROM=0 RAM=0F MEMO=0 VIDEO=1
7EB6 3410 PSHS X D=06E0 X=7FE5 Y=BDC6 U=6D4C S=BC60 DP=61 CC=D8 | Banques: SYST=0 ROM=0 RAM=0F MEMO=0 VIDEO=1
7EB8 1F21 TFR Y,X D=06E0 X=7FE5 Y=BDC6 U=6D4C S=BC5E DP=61 CC=D8 | Banques: SYST=0 ROM=0
Une autre routine saute pile au milieu de notre routine de remplacement.Gasp!
Donc le code plus haut n'est pas atomique. D'autres endroits du jeux sautent en plein milieu. Comme il m'est impossible de tracer tous ces appels "sauvages" (la trace m'en montre qu'il n'y en a pas qu'un seul), le mieux qu'on puisse faire est de ne pas patcher l'ensemble de la routine mais uniquement la partie $7EB6->$7FD5 qui réalise l'affichage et semble vraiment atomique. On ne peut plus ainsi réorganiser les registres au mieux et le gain sera marginal (on gagne juste au niveau des LDD/STD au lieu de deux LDA). Voici ce que ca donne:
Code:
(main)PATCH
* Compiler avec:
* c6809.exe -bd -am -oOP PATCH_7EB6_7FD5.txt 7EB6_7FD5.RAW
* Optimise "OPCODE n,Reg" en "OPCODE ,Reg" quand n=0.
INDEXED MACRO
IFEQ \1
\0 ,\2
ELSE
\0 \1,\2
ENDC
ENDM
* Jeu de masque AND/OR sur 3 octets horizontaux
MSK MACRO
INDEXED LDD,\0-$60,U
INDEXED ANDA,$30+\1-12,X
INDEXED ANDB,$31+\1-12,X
INDEXED ORA,0+\1-12,X
INDEXED ORB,1+\1-12,X
INDEXED STD,\0-$60,U
INDEXED LDA,\0-$5e,U
INDEXED ANDA,$32+\1-12,X
INDEXED ORA,2+\1-12,X
INDEXED STA,\0-$5e,U
ENDM
* sprite 16x16
ORG $7EB6
LEAU $60,U ; on re-avance U pour avoir des index 8 bits
LEAS -6,S
STX 4,S ; sauvegarde X en entree
LDX #L4 ; on simule un BSR L5
STX 2,S ; incluant une sauvegarde de X
LEAX 12,Y ; sur 68000 on ferait "PEA 12,Y"
STX ,S
BRA L5
L4 LEAU $C0,U
LEAX 24,X
L5 SET *
MSK 0,0
MSK $18,3
MSK $30,6
MSK $48,9
MSK $60,12
MSK $78,15
MSK $90,18
MSK $A8,21
PULS X,PC
Avec lui le temps entre 2 rafraichissement est réduit de 0.5 ms/ennemi "simple". C'est "
bof". On devrait pouvoir faire mieux en patchant tous les calculs entourant les appels à cette routine. Mais pour ca il faudrait avoir le code source d'origine, je le crains.