Page 1 of 1

Un PONG en ASM z80 avec Mimas

Unread postPosted: 25 Jan 2017, 12:03
by Ti64CLi++
Bonjour,
Je me suis remis à l'ASM z80 depuis quelque temps, et ai décidé de créer un PONG, jeu plutôt connu de la communauté.
Je programme surtout oncalc, donc ce programme à été développé avec Mimas.
Seulement, après être compilé, le programme ne fait pas du tout ce que je voudrais.
Voici le code source en .8xv :
PONG.8xv


Et le code source du fichier:
Show/Hide spoilerAfficher/Masquer le spoiler
Code: Select all
;#SECTION "MAIN", CODE

   org   userMem - 2
   db   0BBh, 6Dh
Pal1_x equ   8265h
Pal1_y equ   8267h
Pal2_x equ   8269h
Pal2_y equ   8271h
B_x equ   8273h
B_y equ   8275h
V_x equ   8277h
V_y equ   8279h
Start:
   B_CALL   _ClrLCDFull
   ld   hl, 0
   ld   (Pal1_x), hl
   ld   hl, 92
   ld   (Pal2_x), hl
   ld   hl, 46
   ld   (B_x), hl
   ld   hl, 26
   ld   (Pal1_y), hl
   ld   (Pal2_y), hl
   ld   hl, 30
   ld   (B_y), hl
   ld   hl, 1
   ld   (V_x), hl
   ld   (V_y), hl
   ld   c, 1
Draw:
   ld   a, (Pal1_x)
   ld   l, a
   ld   b, 2
   add   a, b
   ld   e, a
   ld   a, (Pal1_y)
   ld   h, a
   ld   b, 10
   add   a, b
   ld   d, a
   B_CALL   _DrawRectBorder
   ld   a, (Pal2_x)
   ld   l, a
   ld   b, 2
   add   a, b
   ld   e, a
   ld   a, (Pal2_y)
   ld   h, a
   ld   b, 10
   add   a, b
   ld   d, a
   B_CALL   _DrawRectBorder
   ld   a, (B_x)
   ld   l, a
   ld   b, 1
   add   a, b
   ld   e, a
   ld   a, (B_y)
   ld   h, a
   ld   b, 1
   add   a, b
   ld   d, a
   ld   a, c
   cp   1
   push   bc
   call   z, DrawRECT
   pop   bc
   ld   a, c
   cp   1
   call   nz, ClearRECT
Loop:
   ld   c, 0
   call   Draw
   ld   a, (V_x)
   ld   b, a
   ld   a, (B_x)
   add   a, b
   ld   (B_x), a
   ld   a, (V_y)
   ld   b, a
   ld   a, (B_y)
   add   a, b
   ld   (B_y), a
   ld   a, (V_y)
   ld   b, a
   ld   a, (Pal2_y)
   add   a, b
   ld   (Pal2_y), a
   call   Draw
Test:
   B_CALL   _GetCSC
   cp   skUp
   jp   z, Up
   cp   skDown
   jp   z, Down
   cp   skClear
   jp   z, Quit
   cp   skEnter
   call   z, Pause
   ld   a, (B_x)
   cp   3
   jp   z, Pal1B_H
   cp   91
   jp   z, Pal2B_H
   ld   a, (B_y)
   cp   0
   jp   z, B_Hy
   cp   61
   jp   z, B_Hy
   jp   Loop

Up:
   ld   c, 0
   call   Draw
   ld   a, (Pal1_y)
   cp   0
   jp   z, Loop
   sub   1
   ld   (Pal1_y), a
   ld   c, 1
   call   Draw
   jp   Loop

Down:
   ld   c, 0
   call   Draw
   ld   a, (Pal1_y)
   cp   52
   jp   z, Loop
   add   a, 1
   ld   (Pal1_y), a
   ld   c, 1
   call   Draw
   jp   Loop

Pal1B_H:
   ld   a, (Pal1_y)
   ld   b, a
   ld   a, (B_y)
   cp   b
   jp   m, Loop
   ld   a, 10
   add   a, b
   ld   b, a
   ld   a, (B_y)
   cp   b
   jp   p, Loop
   ld   a, (V_x)
   cp   1
   call   z, Moins1
   ld   a, (V_x)
   cp   -1
   call   z, Plus1
   jp   Loop

Pal2B_H:
   ld   a, (Pal2_y)
   ld   b, a
   ld   a, (B_y)
   cp   b
   jp   m, Loop
   ld   a, 10
   add   a, b
   ld   b, a
   ld   a, (B_y)
   cp   b
   jp   p, Loop
   ld   a, (V_x)
   cp   1
   call   z, Moins1
   ld   a, (V_x)
   cp   -1
   call   z, Plus1
   ld   (V_x), a
   jp   Loop

Moins1:
   ld   a, -1
   ret

Plus1:
   ld   a, 1
   ret

B_Hy:
   ld   a, (V_y)
   cp   1
   call   z, Moins1
   ld   a, (V_y)
   cp   -1
   call   z, Plus1
   ld   (V_y), a
   jp   Loop

Pause:
   push   af
   push   bc
   push   de
   push   hl
L_Pause:
   B_CALL   _GetKey
   cp   kEnter
   jr   nz, L_Pause
   pop   hl
   pop   de
   pop   bc
   pop   af
   ret

Quit:
   ret

;#SECTION "DRAW", CODE

ClearRECT:
   B_CALL   _DrawRectBorderClear
   ret

DrawRECT:
   B_CALL   _DrawRectBorder
   ret



Et le programme compilé:
PONG.8xp


Voilà, si quelqu'un peut m'aider, je lui en serais reconnaissant,
Merci

Re: Un PONG en ASM z80 avec Mimas

Unread postPosted: 25 Jan 2017, 13:01
by Epharius
Si tu veux qu'on t'aide met des commentaires, là ton code fait trois kilomètres avec des noms de variables pas forcément évident à cerner (enfin surtout pal1/pal2 ?)

Et dis ce que ça fait en terme de bug aussi, RAM CLEARED ?...

Re: Un PONG en ASM z80 avec Mimas

Unread postPosted: 25 Jan 2017, 14:31
by Ti64CLi++
Bah, en fait, c'est très difficile à expliquer, car ça fait défiler une longue barre au milieu de l'écran :(
Et je m'occupe des commentaires.
Les variable Pal1 sont pour la palette/raquette de gauche et Pal2 sont pour la palette/raquette de droite.
Les variables B_ sont pour la balle ;)

Re: Un PONG en ASM z80 avec Mimas

Unread postPosted: 25 Jan 2017, 17:49
by TheMachine02
Même sans commentaire, (et sans regarder le code en précision), le truc qui me saute aux yeux, c'est que tu utilise les bcall de l'OS. Sauf que les bcall de l'os en général détruisent tout les registres, et là manifestement, tu les restaures pas.

Re: Un PONG en ASM z80 avec Mimas

Unread postPosted: 25 Jan 2017, 18:18
by Ti64CLi++
Ah, donc il faudrait que je fasse des push/pop avant et après chaque bcall?

Re: Un PONG en ASM z80 avec Mimas

Unread postPosted: 25 Jan 2017, 18:20
by Epharius
Que pour ceux qui sont nécessaires mais oui. Tu peux t'aider de la doc qui t'indique quels sont les registres utilisés pour chaque romcall (CF wikiti)

Re: Un PONG en ASM z80 avec Mimas

Unread postPosted: 25 Jan 2017, 18:21
by Ti64CLi++
Ok, je vais regarder, et essayé, je vous redis demain

Re: Un PONG en ASM z80 avec Mimas

Unread postPosted: 28 Jan 2017, 16:08
by Ti64CLi++
J'ai mis des push/pop devant et après chaque bcall, et j'ai toujours le bug, qui me fait une ligne BLEUE qui monte et qui descend au milieu de l'écran. Elle est bleue, je ne sais pas comment c'est possible :#fou#: