Hey tout le monde!
Pour le Ti-Concours, en asm z80, il fallait programmer un jeux de tirs aux buts : le sujet.
Je vous présente mon projet : ZGOAL !
Notez que ça tombe bien avec la coupe du monde .
Vous jouez à tour de rôle contre une IA comme tireur et comme goal. La jauge à gauche du joueur indique la vitesse de tir.
Un petit screen:
Les commandes:
Se déplacer: les flèches directionnelles.
Tirer : [2nde].
Quitter : [clear].
Les liens de téléchargement (82stats/82stats.fr/83 uniquement):
ZGOAL
GOAL
Lancez le prgm GOAL, qui se charge de lancer le prgm ZGOAL.
Sinon, vous pouvez lancer directement le prgm ZGOAL en faisant Send(9prgmZGOAL (il est en unsquished donc ça marche). Send = Envoi pour les modèles français.
/!\ Ne lancez pas ce programme sur un autre modèle, vous connaissez les risques .
Une version 83+/84+ arrive, il y a juste 2-3 détails à peaufiner.
Il fait 4Ko environ, je vais voir à le porter pour un shell, pour réduire la taille du prgm .
Et enfin, pour les courageux qui voudraient lire le code pour me donner des conseils (bon vu qu'il y a pas trop de personne qui code en asm ici ):
Pour le Ti-Concours, en asm z80, il fallait programmer un jeux de tirs aux buts : le sujet.
Je vous présente mon projet : ZGOAL !
Notez que ça tombe bien avec la coupe du monde .
Vous jouez à tour de rôle contre une IA comme tireur et comme goal. La jauge à gauche du joueur indique la vitesse de tir.
Un petit screen:
Les commandes:
Se déplacer: les flèches directionnelles.
Tirer : [2nde].
Quitter : [clear].
Les liens de téléchargement (82stats/82stats.fr/83 uniquement):
ZGOAL
GOAL
Lancez le prgm GOAL, qui se charge de lancer le prgm ZGOAL.
Sinon, vous pouvez lancer directement le prgm ZGOAL en faisant Send(9prgmZGOAL (il est en unsquished donc ça marche). Send = Envoi pour les modèles français.
/!\ Ne lancez pas ce programme sur un autre modèle, vous connaissez les risques .
Une version 83+/84+ arrive, il y a juste 2-3 détails à peaufiner.
Il fait 4Ko environ, je vais voir à le porter pour un shell, pour réduire la taille du prgm .
Et enfin, pour les courageux qui voudraient lire le code pour me donner des conseils (bon vu qu'il y a pas trop de personne qui code en asm ici ):
- Code:
.nolist
#include "ion.inc"
.list
#ifdef TI83P
.org progstart-2
.db $bb,$6d
#else
.org progstart
#endif
;Début du prgm
start:
bcall _indicatorOff
bcall _homeup
Menu:
;Le menu
ld de,grbuf
ld hl,FondMenu
ld bc,12 * 64
ldir
Menu_loop:
;On affiche l'écran
call DispBallMenu
bcall _copygbuf
call DispBallMenu
;On teste si on veut quitter
bcall _getcsc
cp skClear
ret z
;On teste si on change de choix
cp skUp
jr z,Choix1
cp skDown
jr z,Choix2
;On teste si on a choisi
cp skEnter
jr z,Menu_Done
cp sk2nd
jr nz,Menu_loop
Menu_Done:
;On agit en fonction de la sélection
ld a,(ChoixMenu)
or a
ret nz
call StartGame
jr Menu
Choix1
xor a
ld (ChoixMenu),a
jr Menu_loop
Choix2:
ld a,1
ld (ChoixMenu),a
jr Menu_loop
StartGame:
;On affiche les buts
bcall _clrlcdfull
bcall _cleargbuf
ld bc,$6040 - $1901
ld de,$6040 - $4401
bcall _darkline
inc b
dec c
ld d,b
ld e,$40 - $12
bcall _darkline
ld b,$60 - $45
ld d,b
bcall _darkline
inc d
inc d
ld b,d
dec c
dec c
bcall _darkline
push de
ld b,$60 - $1A
ld d,b
bcall _darkline
push de
inc c
ld e,c
dec b
ld d,$60 - $42
bcall _darkline
pop bc
ld d,1
inc b
bcall _ipoint
dec b
ld de,$6040 - $1E0E
bcall _darkline
pop bc
ld d,1
dec b
bcall _ipoint
inc b
ld d,$60 - $3F
bcall _darkline
ld c,e
ld b,$60 - $1E
bcall _darkline
push bc
ld bc,$6040 - $4204
bcall _darkline
pop de
ld b,$60 - $1B
bcall _darkline
ld bc,$40 - $12
ld de,$40 - $6012
bcall _darkline
ld bc,$6040 - $1029
ld de,$6340 - $5029
bcall _darkline
ld d,b
ld e,$40 - $12
bcall _darkline
ld b,$63 - $50
ld d,b
bcall _darkline
;On trace la zone de scores (les 5 derniers tirs)
ld bc,$40 - $01
ld de,$1940 - $01
bcall _darkline
ld c,$40 - $06
ld e,c
bcall _darkline
ld c,$40 - $0B
ld e,c
bcall _darkline
ld e,$40 - 2
ld l,6
TraceScores_loop:
ld d,b
bcall _darkline
ld a,5
add a,b
ld b,a
dec l
jr nz,TraceScores_loop
;On mets les scores etc à 0
xor a
ld (ScoreIA),a
ld (ScoreJoueur),a
ld a,10
ld (ManchesRestantes),a
ld hl,$54F
ld (pencol),hl
ld hl,TextScores
set textwrite,(IY+sgrflags)
bcall _vputs
res textwrite,(IY+sgrflags)
Game:
;On teste s'il reste des manches, on les rajoute sinon
ld a,(ManchesRestantes)
or a
jr nz,GameStart
;On rajoute 1 tir chacun
inc a
inc a
ld (ManchesRestantes),a
;On décale le tableau de scores
DecalerScores:
;On décale les 9 lignes concernées
ld hl,grbuf+12
ld b,9
DecalerScores_loop:
push bc
;3 octets concernés par ligne
inc hl
inc hl
ld b,3
xor a
ld e,a
DecalerScores_loop2:
;On traite l'octet
ld a,(hl)
push bc
;Sur 5 bits
ld b,5
DecalerScores_loop3:
rl e
rl a
djnz DecalerScores_loop3
;On fait passer les bits récupérés à gauche de e
rl e
sla e
sla e
sla e
;On stocke l'octet et on recommence
pop bc
ld (hl),a
dec hl
djnz DecalerScores_loop2
;On change de ligne
ld de,13
add hl,de
pop bc
djnz DecalerScores_loop
;On décale les pxl à droite de la barre si on avait perdu (il n'est pas compris dans les 3octets)
ld b,2
ld e,0
TestPxl_loop:
push bc
;On teste s'il est allumé
ld a,$40 - 2
sub e
ld c,a
ld b,$18
push bc
ld d,3
bcall _ipoint
pop bc
jr z,TestPxlNo
;On l'éteint
ld d,2
bcall _ipoint
;On allume l'autre
ld b,19
bcall _ipoint
TestPxlNo:
ld e,5
pop bc
djnz TestPxl_loop
;On trace les lignes manquantes
ld bc,$1340 - 6
ld de,$1940 - 6
bcall _darkline
ld bc,$1440 - 1
ld de,$1440 - 11
bcall _darkline
xor a
ld h,a
ld b,a
ld d,a
bcall _iline
GameStart:
;On met les positions etc initiales
xor a
ld (BallStoped),a
ld (deplacementXGardien),a
ld (MoveTireurIANombresDeplacements),a
ld (MoveTireurIADeplacementsDone),a
ld a,45
ld (posXTireur),a
ld (posXGardien),a
ld a,$33
ld (posYTireur),a
ld a,80
ld (posYGardien),a
ld a,$C9
ld (BallSent),a
ld hl,45*8
ld (RealPosXGardien),hl
Game_loop:
;On charge les joueurs
call drawGardienChange
call drawTireurChange
call drawBall
;On affiche l'écran
bcall _copygbuf
call RALENTIR
;On efface les joueurs
call drawGardien
call drawTireur
call drawBall
;On calcule les nouvelles coordonnées
call MoveGardien
call MoveTireur
call MoveBall
;On teste si on veut quitter
bcall _getcsc
cp skClear
ret z
;On teste si la balle est à l'arrêt
BallStoped = $+1
ld a,0
or a
jr z,Game_loop
;Le message de fin
ld hl,$526
push af
;Le tableau de scores
ld a,(ManchesRestantes)
ld d,a
and 1
jr z,TourJoueur
ld a,5
TourJoueur:
ld e,a
ld a,$40 - 3
sub e
ld c,a
ld a,d
dec a
srl a
ld d,a
add a,d
add a,a
add a,d
ld b,a
ld a,22
sub b
ld b,a
pop af
;On teste si on a marqué
dec a
ld de,TextArretFormidable
jp nz,PasMarque
ld de,TextRate
ld a,(posXBall)
cp $60 - $1E
jp p,PasMarque
cp $60 - $49
jp m,PasMarque
;Qulqu'un a marqué
ld a,(ManchesRestantes)
rra
jr c,IAMarque
;Le joueur a marque
ld a,(ScoreJoueur)
inc a
ld (ScoreJoueur),a
push hl
push de
push bc
;On affiche le score
ld hl,$54F
cp 10
jp m,NoDepassement
ld de,-4
add hl,de
NoDepassement:
ld (pencol),hl
push hl
set textwrite,(IY+sgrflags)
bcall _setxxop1
ld a,3
bcall _dispop1a
res textwrite,(IY+sgrflags)
ld a,3
pop hl
ld (pencol),hl
bcall _dispop1a
;On répare les dégats (la barre de séparation se fait rogner)
ld bc,$4F40 -9 + $400
ld de,$4F40 -9 + $500
bcall _darkline
pop bc
pop de
pop hl
jr JoueurMarque
IAMarque:
;L'IA
ld a,(ScoreIA)
inc a
ld (ScoreIA),a
push hl
push de
push bc
;On affiche le score
ld hl,$54F + 8
ld (pencol),hl
set textwrite,(IY+sgrflags)
bcall _setxxop1
ld a,3
bcall _dispop1a
res textwrite,(IY+sgrflags)
ld hl,$54F + 8
ld (pencol),hl
ld a,3
bcall _dispop1a
pop bc
pop de
pop hl
JoueurMarque:
;on complète l'affichage des points
ld d,1
bcall _ipoint
inc b
bcall _ipoint
dec c
bcall _ipoint
dec b
bcall _ipoint
;On charge le message adéquat
ld de,TextGOAL
push de
ld l,$22
jr DispFinalMessage
PasMarque:
;On complète l'affichage des scores
inc b
inc b
inc c
ld a,c
push de
ld d,2
bcall _ipoint
dec c
dec b
bcall _ipoint
dec c
dec b
bcall _ipoint
dec c
dec b
bcall _ipoint
DispFinalMessage:
;On affiche le message pré-chargé
ld (pencol),hl
ld b,$FF
DispFinalMessage_loop:
call RALENTIR
djnz DispFinalMessage_loop
pop hl
set textInverse,(iY+textflags)
bcall _vputs
res textInverse,(iY+textflags)
ld b,$FF
DispFinalMessage_loop2:
call RALENTIR
djnz DispFinalMessage_loop2
bcall _getcsc
bcall _getkey
;On décrémente le nombre de manches restantes
ManchesRestantes = $+1
ld a,10
dec a
ld hl,ManchesRestantes
ld (hl),a
;On teste si quelqu'un a remporté le match ou s'il faut poursuivre
ScoreJoueur = $+1
ld a,0
ScoreIA = $+1
sub 0
jp z,Game
;On teste s'il reste assez de manches
ld c,a
ld a,(hl)
jp m,TestIfEnouthManchesForPlayer
;C'est l'IA qui perd: on doit tester s'il lui reste une partie de plus (elle joue en 2eme)
srl a
adc a,0
sub c
jp p,Game
;Fin : Joueur Gagne
ld hl,TextGagne
jr FinPartie
TestIfEnouthManchesForPlayer:
srl a
add a,c
jp p,Game
;Fin : IA Gagne
ld hl,TextPerdu
FinPartie:
push hl
ld c,$1A
xor a
ld de,$601A
ld b,8
FinPartie_loop:
push bc
ld b,a
inc e
ld c,e
bcall _darkline
pop bc
djnz FinPartie_loop
ld hl,$1E14
ld (pencol),hl
pop hl
bcall _vputs
bcall _getkey
ret
;-------------------------------------
;On déplace la Balle
MoveBall:
ld a,(BallSent)
or a
ret nz
;On déplace la balle si elle a été lancée
ld a,(posYBall)
VitesseBall = $+1
sub 3
ld (posYBall),a
ret
;-------------------------------------
;On déplace le gardien
;Gestion de l'IA (elle s'efforce de suivre le tireur (ou la balle))
MoveGardienIA:
ld a,(BallSent)
or a
ld hl,posXBall
jr z,MoveGardienIABall
ld hl,posXTireur
MoveGardienIABall:
ld a,(posXGardien)
cp (hl)
ld a,0
jr z,MoveGardienTest
jp p,MoveGardienIALeft
ld a,4
jr MoveGardienTest
MoveGardienIALeft:
ld a,2
jr MoveGardienTest
MoveGardien:
;Le gardien ralenti s'il est en mouvement
deplacementXGardien = $+1
ld a,0
or a
jr z,NoDeplacementGardien
bit 7,a
jr z,DeplacementGardienRight
inc a
cp $F4 - 10
jr nz,NoDeplacementGardien
inc a
jr NoDeplacementGardien
DeplacementGardienRight:
dec a
cp $1A
jr nz,NoDeplacementGardien
dec a
NoDeplacementGardien:
ld (deplacementXGardien),a
push af
ld a,(ManchesRestantes)
rra
jr nc,MoveGardienIA
xor a
out (1),a
;On teste l'appui sur les flèches
xor a
out (1),a
ld a,Fleches
out (1),a
in a,(1)
cpl
MoveGardienTest:
or a
call nz,MoveGardienYes
;On gère le déplacement horizontal
RealPosXGardien = $+1
ld hl,45*8
pop af
sra a
sra a
ld e,a
xor a
bit 7,e
jr z,MoveGardienLeft
dec a
MoveGardienLeft:
ld d,a
add hl,de
ld (RealPosXGardien),hl
rr h
rr l
xor a
rr h
rr l
xor a
rr h
rr l
ld a,l
;On teste un dépassement
cp $47
jp m,testPosXUnder
ld a,$47
ld hl,$47 * 8
jr saveRealGardienPosX
testPosXUnder:
cp $12
jp p,posXGardienOk
ld a,$12
ld hl,$12 * 8
saveRealGardienPosX:
ld (RealPosXGardien),hl
posXGardienOk:
;On sauve la position validée
ld (posXGardien),a
ret
;On a appuye sur une flèche
MoveGardienYes:
rra
jr nc,MoveGardienNoDown
;On va en bas
ld hl,posYGardien
inc (hl)
MoveGardienNoDown:
rra
jr nc,MoveGardienNoLeft
;On va à gauche
ld hl,deplacementXGardien
dec (hl)
dec (hl)
MoveGardienNoLeft:
rra
jr nc,MoveGardienNoRight
;On va à droite
ld hl,deplacementXGardien
inc (hl)
inc (hl)
MoveGardienNoRight:
rra
ret nc
;On va en haut
ld hl,posYGardien
dec (hl)
ret
;-----------------------------------------
;Deplacement du tireur
PositionsTireurIA:
.db 0,0,0,0
.db 0,0,0,0
MoveTireurIA:
MoveTireurIANombresDeplacements = $+1
ld a,0
or a
jr nz,MoveTireurIADeplace
;On tire le nombre de positions
ld b,7
call random
inc a
ld (MoveTireurIANombresDeplacements),a
;On tire les positions
ld b,a
ld hl,PositionsTireurIA
MoveTireurIAPosition:
push bc
ld b,$47 - $12
call random
add a,$12
ld (hl),a
inc hl
pop bc
djnz MoveTireurIAPosition
MoveTireurIADeplace:
;Il ne se déplace 2 fois sur ~3
ld a,%11011010
rlca
ld (MoveTireurIADeplace+1),a
ret nc
MoveTireurIADeplacementsDone = $+1
;On teste quelle position on doit faire
ld de,0
ld hl,PositionsTireurIA
add hl,de
ld a,(posXTireur)
cp (hl)
jr z,PositionTireurAtteinte
jp m,MoveTireurIARight
;On doit aller à gauche
ld a,2
jr MoveTireurTest
MoveTireurIARight:
;On doit aller à droite
ld a,4
jr MoveTireurTest
PositionTireurAtteinte:
;Si on a finis de le déplacer
ld a,(MoveTireurIANombresDeplacements)
dec a
cp e
jr z,SendBall
;Sinon on passe à la position suivante
ld hl,MoveTireurIADeplacementsDone
inc (hl)
ret
MoveTireur:
ld a,(ManchesRestantes)
rra
jr c,MoveTireurIA
xor a
out (1),a
;On teste l'appui sur les flèches
xor a
out (1),a
ld a,Fleches
out (1),a
in a,(1)
cpl
MoveTireurTest:
or a
jr z,TestSendBall
;On a appuye sur une flèche
rra
jr nc,MoveTireurNoDown
;On va en bas
ld hl,posYTireur
inc (hl)
MoveTireurNoDown:
rra
jr nc,MoveTireurNoLeft
;On va à gauche
ld hl,posXTireur
dec (hl)
MoveTireurNoLeft:
rra
jr nc,MoveTireurNoRight
;On va à droite
ld hl,posXTireur
inc (hl)
MoveTireurNoRight:
rra
jr nc,TestSendBall
;On va en haut
ld hl,posYTireur
dec (hl)
TestSendBall:
ld a,(ManchesRestantes)
rra
ret c
;La balle part si on a appuyé sur 2nde ou entrer
xor a
out (1),a
ld a,Haut
out (1),a
in a,(1)
cp kp2nd
ret nz
SendBall:
ld a,(BallSent)
or a
ret z
;La balle est envoyé avec les coordonnées et la vitesse adéquates
xor a
ld (BallSent),a
ld a,(posXTireur)
sub 1
adc a,0
ld (posXBall),a
ld a,(posYTireur)
dec a
dec a
dec a
rla
rla
ld (posYBall),a
ld a,(powerOfShoot)
inc a
ld (VitesseBall),a
ret
;-------------------
;Ralentir le prgm
;Conserve les registres
RALENTIR:
push bc
ld bc,$FF
RALENTIR_loop:
push bc
pop bc
djnz RALENTIR_loop
pop bc
ret
;==========
;Ressources
;==========
;##############################################################
;Sprites
ImgGardienBras = $+2
ImgGardien:
.db %01110
.db %01010
.db %10100
.db %11111
.db %00101
.db %01010
.db %11011
ImgTireurPieds = $+6
ImgTireur:
.db %1001110
.db %1001110
.db %1010100
.db %1011111
.db %1000101
.db %1001010
.db %0011011
ImgBall:
.db %0110
.db %1001
.db %1001
.db %0110
ImgBallMenu:
.db %01110
.db %10111
.db %11101
.db %11011
.db %01110
FondMenu:
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,255,255,255,255,96,0
.db 0,7,255,192,0,7,3,255,255,255,255,255,255,255,255,224,0,7,255,255,255,255,255,255,255,255,255,224,0,0,0
.db 0,0,152,159,254,255,255,240,96,0,0,0,1,192,204,255,255,239,254,112,96,0,0,1,224,126,127,231,255,254,127
.db 192,96,0,0,0,62,7,254,127,255,63,255,0,96,0,0,0,39,252,31,255,255,251,252,152,96,0,0,17,34,31
.db 255,153,145,255,204,156,96,0,0,113,34,98,15,255,255,196,196,252,96,0,0,63,178,34,56,0,12,199,255,216,96
.db 0,0,17,255,255,56,31,13,255,196,128,96,0,0,113,18,255,120,61,136,204,196,128,96,0,0,63,146,34,124,118
.db 200,204,196,248,64,0,0,25,255,255,188,107,200,204,223,192,64,0,0,25,18,35,30,123,136,255,252,0,64,0,0
.db 125,18,35,27,55,141,228,196,0,96,0,0,31,250,35,13,30,12,68,192,96,96,0,0,17,63,254,13,0,12,68
.db 192,144,64,0,0,113,18,15,13,0,12,69,251,16,64,0,0,127,16,17,159,0,13,255,195,16,96,0,0,19,240
.db 16,190,0,127,196,199,240,96,0,0,17,23,152,252,0,12,68,206,16,64,0,0,17,5,143,204,0,12,68,222,8
.db 96,0,0,63,134,143,216,0,12,127,144,15,224,0,0,0,3,143,236,0,63,228,22,79,224,0,0,0,3,152,230
.db 0,0,68,63,8,224,0,0,0,3,184,227,0,0,68,47,60,96,0,0,0,1,231,1,224,0,7,111,124,96,0
.db 0,0,1,79,131,240,7,254,127,212,96,0,0,0,1,153,195,28,63,0,255,146,224,0,0,0,1,224,111,142,0
.db 0,131,138,224,0,0,0,0,192,61,219,0,1,131,7,160,0,0,0,0,0,25,243,192,1,135,7,160,0,0,0
.db 0,0,8,191,224,1,15,3,160,0,0,0,0,0,15,131,240,3,30,15,255,0,0,0,0,0,15,224,216,3,156
.db 0,0,0,0,0,0,0,15,254,124,3,248,0,0,0,0,0,0,0,255,158,31,7,112,0,0,0,0,0,0,0
.db 255,253,127,255,112,0,0,0,0,0,0,0,0,1,127,251,240,0,0,0,0,0,0,0,0,0,0,55,240,0,0
.db 0,0,0,0,0,0,0,3,237,144,0,0,0,0,0,0,0,0,0,3,184,144,0,0,0,0,0,0,0,0,0
.db 3,240,208,0,0,0,0,0,0,0,0,0,0,112,208,0,0,0,7,255,255,255,255,255,255,255,223,255,255,224,7
.db 255,255,255,255,255,255,255,248,0,0,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0
.db 112,0,0,0,0,0,57,10,32,0,0,0,240,0,0,0,0,0,37,21,64,0,0,0,224,0,0,0,0,0,57
.db 28,128,0,1,243,255,0,0,0,0,0,33,20,128,0,1,255,224,0,0,0,0,0,33,212,128,0,0,0,0,0
.db 0,0,0,0,0,0,0,0,0,0,0,4,0,68,0,0,28,171,192,0,4,6,65,32,128,204,0,0,34,169,0
.db 0,6,166,201,165,85,68,0,0,34,169,0,0,5,69,85,53,149,228,0,0,54,169,0,0,6,69,77,172,204,78
.db 0,0,28,233,0,0,0,128,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0
;##############################################################
;##############################################################
;Textes
TextGOAL:
.db $20, $23, " GOAL ", $23, $20, 0
TextArretFormidable:
.db " ARRET! ",0
TextRate:
.db " Rat", $96, "... ",0
TextScores:
.db "0-0",0
TextGagne:
.db "Vous avez GAGNE!!!",0
TextPerdu:
.db "Vous avez perdu...",0
;##############################################################
;##############################################################
;ROUTINES
;--------------------------------------------------------------
;drawTireurChange
;On charge le Tireur dans le gbuf (xor) et on lui bouger les pieds (1/16)
; On fait également varier la barre de puissance de tir si la balle n'est pas partie
;input: posYTireur ;$32 - $39
; posXTireur ;$00 - $54
;output: none
;destroy: all
drawTireurChange:
;On fait varier la barre de puissance une fois sur 4 si le tir n'est
; pas déjà parti
drawTireurChange4 = $+1
ld a,%10001
rlca
ld (drawTireurChange4),a
jr nc,drawTireur
ld a,(BallSent)
or a
jr z,drawTireurChange4b - 1
powerOfShoot = $+1
ld a,0
ld d,0
ld e,a
ld hl,ImgTireurPieds
xor a
sbc hl,de
ld a,(hl)
xor %1000000
ld (hl),a
add hl,de
powerChange = $+1
ld a,1
ld b,a
add a,e
jp m,powerChangeSens
cp 7
jr nz,powerChangeSensOk
powerChangeSens:
;On change le sens de variation de la barre
sub b
sub b
ld c,a
ld a,b
neg
ld (powerChange),a
ld a,c
powerChangeSensOk:
ld (powerOfShoot),a
ld e,a
xor a
sbc hl,de
ld a,(hl)
xor %1000000
ld (hl),a
drawTireurChange4b = $+1
ld a,%10001000
rlca
ld (drawTireurChange4b),a
jr nc,drawTireur
;On bouge les pieds (en changeant la configuration à chaque fois)
; une fois sur 16
drawTireurChangePieds = $+1
ld e,1
ld hl,ImgTireurPieds
ld a,(hl)
xor e
ld (hl),a
;On change la configuration une fois sur 2
drawTireurChangeRestants = $+1
ld a,%01010101
rlca
ld (drawTireurChangeRestants),a
jr nc,drawTireur
;On teste la configuration
ld hl,drawTireurChangePieds
ld a,(hl)
dec a
jr z,drawTireurChangePieds1
inc a
inc a
drawTireurChangePieds1:
xor %10000
ld (hl),a
;end drawTireurChange
;--------------------------------------------------------------
;--------------------------------------------------------------
;drawTireur
;On charge le Tireur dans le gbuf (xor)
;input: posYTireur ;$32 - $39
; posXTireur ;$00 - $54
;output: none
;destroy: all
drawTireur:
posYTireur = $+1
ld a,$33
;On teste un dépassement
cp $39
jp m,testPosYTireurUnder
ld a,$39
testPosYTireurUnder:
cp $32
jp p,posYTireurOk
ld a,$32
posYTireurOk:
;On sauve la pausition validée
ld (posYTireur),a
ld l,a
posXTireur = $+1
ld a,45
;On teste un dépassement
cp $54
jp m,testPosXTireurUnder
ld a,$54
testPosXTireurUnder:
cp 2
jp p,posXTireurOk
ld a,2
posXTireurOk:
;On sauve la pausition validée
ld (posXTireur),a
ld b,7
ld ix,ImgTireur
jr dispSprite
;end drawTireur
;--------------------------------------------------------------
;--------------------------------------------------------------
;drawGardienChange
;On charge le Gardien dans le gbuf (xor) et on lui bouger les bras (1/8)
;input: posYGardien ;$12 - $1A (*2)
; posXGardien ;$12 - $47
;output: none
;destroy: all
drawGardienChange:
;On ne bouge les pieds qu'un fois sur 16-24
ld a,1
rlca
ld (drawGardienChange+1),a
jr nc,drawGardien
;On bouge les bras
ld hl,ImgGardienBras
ld a,(hl)
xor %10001
ld (hl),a
inc hl
inc hl
ld a,(hl)
xor %10001
ld (hl),a
;end drawGardienChange
;--------------------------------------------------------------
;--------------------------------------------------------------
;drawGardien
;On charge le gardien dans le gbuf (xor)
;input: posYGardien ;$12 - $1A (*4)
; posXGardien ;$12 - $47
;output: none
;destroy: all
drawGardien:
posYGardien = $+1
ld a,80
;On teste un dépassement
cp $1A * 4
jp m,testPosYUnder
ld a,$1A * 4
testPosYUnder:
cp $12 * 4
jp p,posYGardienOk
ld a,$12 * 4
posYGardienOk:
;On sauve la pausition validée
ld (posYGardien),a
srl a
srl a
ld l,a
posXGardien = $+1
ld a,45
ld b,7
ld ix,ImgGardien
;end drawGardien
;--------------------------------------------------------------
;--------------------------------------------------------------
;dispSprite
;On affiche un sprite (en mode xor)
;input: a : abscisse
; l : ordonnée
; ix : adresse du sprite
; b : nombre de lignes du sprite
;output: none
;destroy: all
dispSprite:
ld e,l
ld h,0
ld d,h
add hl,de
add hl,de
add hl,hl
add hl,hl
ld e,a
and 7
ld c,a
srl e
srl e
srl e
add hl,de
ld de,gbuf
add hl,de
putSpriteLoop1:
sl1: ld d,(ix)
ld e,0
ld a,c
or a
jr z,putSpriteSkip1
putSpriteLoop2:
srl d
rr e
dec a
jr nz,putSpriteLoop2
putSpriteSkip1:
ld a,(hl)
xor d
ld (hl),a
inc hl
ld a,(hl)
xor e
ld (hl),a
ld de,11
add hl,de
inc ix
djnz putSpriteLoop1
ret
;end dispSprite
;--------------------------------------------------------------
;--------------------------------------------------------------
;drawBall
;On charge le Ball dans le gbuf (xor)
;input: posYBall ;Same - 3 as PosYTireur when shoot (*4)
; posXBall ;Same as PosXTireur when shoot
;output: none
;destroy: all
PasDArretA:
ld a,c
PasDArret:
ld l,b
ld b,4
ld ix,ImgBall
DispSprite:
jr dispSprite
drawBall:
BallSent:
ret
posYBall = $+1
ld a,0
ld d,a
srl a
srl a
ld b,a
;On teste si on a dépassé la ligne de buts
cp $D
jp p,posXBall-1
xor a
inc a
ld (BallStoped),a
posXBall = $+1
ld a,45
;On teste si le gardien a fait un arrêt
ld hl,posXGardien
ld c,(hl)
ld l,c
dec c
dec c
dec c
dec c
cp c
jp m,PasDArret
ld c,l
inc c
inc c
inc c
inc c
cp c
jp p,PasDArret
ld c,a
ld a,d
ld hl,posYGardien
add a,3*4
cp (hl)
jp m,PasDArretA
ld a,d
sub 7*4
cp (hl)
jp p,PasDArretA
;Il y a eut un arret!
xor a
dec a
ld (BallStoped),a
ret
;end drawBall
;--------------------------------------------------------------
;--------------------------------------------------------------
;DispBallMenu
;On affiche un sprite (en mode xor)
;input: a : abscisse
; l : ordonnée
; ix : adresse du sprite
; b : nombre de lignes du sprite
;output: none
;destroy: all
DispBallMenu:
;On place la balle en face du choix
ChoixMenu = $+1
ld a,0
ld l,$34
or a
jr z,DispBallMenu2
ld l,$34+6
DispBallMenu2:
ld b,5
ld ix,ImgBallMenu
ld a,9
jr DispSprite
;end drawBallMenu
;--------------------------------------------------------------
;--------------------------------------------------------------
;Tire un nombre aléatoire entre 0 et b dans a
random:
push hl
push de
ld hl,(randData)
ld a,r
ld d,a
ld e,(hl)
add hl,de
add a,l
xor h
ld (randData),hl
sbc hl,hl
ld e,a
ld d,h
randomLoop:
add hl,de
djnz randomLoop
ld a,h
pop de
pop hl
ret
randData: .dw 12
;end random
;--------------------------------------------------------------
;##############################################################
end_prgm:
.echo "TEST: Prgm compiled, size is ",end_prgm - start," bytes"