Forum

Catégorie : Programmes
Forum : Les programmes des internautes
Vues : 2006
Réponses : 21
Type : discussion
Etat : réponses autorisées

*NEW* Cubefield en assembleur (ION) - Page 1 / 2

-Coco- le 10/12/2011 à 21:26
Salut à tous !

/!\ Ceci est un programme en ASSEMBLEUR. Si vous n'avez pas le câble ou pas d'émulateur, passez votre chemin, pas la peine de me demander un code en basic.

Voici...
CUBEFIELD !
En assembleur total et absolu (Eh ouais j'utilise pas de convertisseur moi xd).


Cela fonctionne sous ION, si vous ne l'avez pas, et que vous avez le câble (nécessaire), rendez vous ici : http://tout82.free.fr/forum/sujet.php?sujet=2522

Voici les liens de téléchargement :
Ti 82 stats/82 stats fr/83 : Télécharger (mediafire)

Ti 83 + : Télécharger (mediafire)

Taille : 693 octets


Petit conseil : normalement il n'y a aucune raison que ça plante mortellement et que ça reset la RAM de votre TI, mais je vous conseille tout de même de sauvegarder vos programmes importants sur votre ordinateur avant de tester celui là (on ne sait jamais)

Petit screenshot :
Image manquante

Le jeu tourne à peu près à 60 FPS (sans déconner ^^)

touches :
[gauche],[droite] : se mouvoir
[annul] : quitter à tout moment
[mode] : mettre en pause / reprendre lorsque le jeu est en pause
[2nde] : sortir du jeu lorsque l'on a perdu (important) / sortir de la pause

But du jeu :
Eviter les cubes.
A noter qu'il existe un High score (non nominatif)

Pour les curieux, voici le code en assembleur (note : les fonctions telles que Putsprite n'existent pas en assembleur, je les ai codés moi même à coup de define)

Code

;File generated by Z80Generator by -Coco-

#define TI83

        .nolist
        #include "ion.inc"
        .list
        #include "Ionsim.z80"

;variables here
vx = saferam1
vy = vx+1
delay = vy+1
tempdelay = delay+1
cx = tempdelay+1
cy = cx+1
nbcubes = cy+1
score = nbcubes+1
speed = score+2

#ifdef TI83P
        .org progstart-2
        .db $BB,$6D
#else
        .org progstart
#endif
        ret

        jr nc, start_program
        .db "Champ de cubes",0


start_program:
      Clearbuf
      Defvar(vx,45)
      Defvar(vy,54)
      Defvar(delay,50)
      Defvar(tempdelay,30)
      Defvar(cy,0)
      Defvar(nbcubes,0)
      ld hl,score
      ld (hl),0
      inc hl
      ld (hl),0
      
      Defvar(speed,1)
      
      
      
      set textwrite,(iy+sgrflags)

      ld hl,str_parcoco
      ld de,(15*256)+30
      ld (pencol),de
      bcall(_vputs)
      
      ld hl,str_ctr1
      ld de,(35*256)+5
      ld (pencol),de
      bcall(_vputs)
      
      ld hl,str_ctr2
      ld de,(42*256)+5
      ld (pencol),de
      bcall(_vputs)
      
      Flipbuf
      
      set textinverse,(iy+textflags)
      ld hl,str_cubefield   ;            write cubefield invert
      ld de,0
      ld (currow),de
      bcall(_puts)      
      res textinverse,(iy+textflags)
      
      Clearbuf
      res textwrite,(iy+sgrflags)
      
menuwait:
      ld de,(56*256)+10
      ld (pencol),de


      bcall(_vputs)
      Getkey
      cp gk_clear
      jp z,stop
      cp gk_seconde
      jr z,loop
      jr menuwait

      
loop:      
        Putsprite(vx,sp_vaiss,6)   
      Flipbuf
      Putsprite(vx,sp_vaiss,6)
      
      ld      a,$FF                   ;
        out     (1),a                   ;
        ld      a,$FE                   ;
        out     (1),a                   ;
        in      a,(1)                   ;
        bit     1,a                     ; [(left)]
        call      z,moveleft              ;
        bit     2,a                     ; [(right)]
        call      z,moveright             ;
      
      ld a,(vx)
      cp 5
      call z,moveright
      cp 85
      call z,moveleft

      ld hl,(tempdelay)
      dec hl
      ld (tempdelay),hl
      
      ld a,(tempdelay)
      cp 0
      call z,putBlock
      
      ld a,(nbcubes)
      cp 20
      call z,decdelay
      
;;;;;;;;pixel test;;;;;;;;;;;;;
      ld       a,(vy)                 ;
        ld   e,a        ;
        ld      a,(vx)               ;
      add a,3
        call    ionGetPixel             ;
        ld      a,(hl)                  ;
        or      a                       ;
      jr nz,dead
      
      call scroll
      
      
suit:
      cp 0
      jr nz,st

      
st:
      
      ld hl,(score)
      inc hl
      ld (score),hl
      
      Getkey
      cp gk_clear
      jp z,stop
      cp gk_mode
      call z,pause
      
      jp loop ;;;;;;;;;;endloop
      
dead:
      Putsprite(vx,sp_boum,7)
      Flipbuf
      ld de,0
      ld (currow),de
      ld hl,str_youaredead
      bcall(_puts)
      bcall(_newline)
      ld hl,str_score
      bcall(_puts)
      bcall(_newline)
      ld hl,(score)
      bcall(_disphl)
      bcall(_newline)
      ld hl,(var_hscore)
      ld de,(score)
      bcall(_cphlde)
      jp p,disphigh
      ld hl,str_newhigh
      bcall(_puts)
      ld hl,(score)
      ld (var_hscore),hl
      jr finish
      
disphigh:
      ld hl,str_high
      bcall(_puts)
      bcall(_newline)
      ld hl,(var_hscore)
      bcall(_disphl)
      
finish:      
      Getkey
      cp gk_seconde
      jp z,stop
      jr finish

moveleft:
      ld hl,(vx)
      dec hl
      ld (vx),hl
      ret

      
moveright:
      ld hl,(vx)
      inc hl
      ld (vx),hl
      ret

      
decdelay:
      ld a,(delay)
      dec a
      dec a
      ld (delay),a
      xor a
      ld (nbcubes),a
      ret
      
putBlock:
      ld a,(nbcubes)
      inc a
      ld (nbcubes),a
      ld a,(delay)
      ld b,a
      call ionrandom
      add a,3
      ld (tempdelay),a
      Random(90)
      ld (cx),a
      Random(2)
      cp 0
      jr z,pb2
      Putsprite(cx,sp_cube_1,6)
      ret
pb2:
      Putsprite(cx,sp_cube_2,6)
      ret
      
       
scroll: ld      hl,grbuf+(62*12)          ;
        ld      de,grbuf+(63*12)          ;
        ld      bc,756                  ;
        lddr                            ;
        ld      h,d                     ;
        ld      l,e                     ;
        inc     e                       ;
        ld      (hl),b                  ;
        ld      c,11                    ;
        lddr                            ;
        ret                             ;
      
pause:
      ld hl,str_pause
      ld de,$0604
      ld (currow),de
      bcall(_puts)
p2:
      Getkey
      cp gk_seconde
      ret z
      cp gk_mode
      ret z
      jr p2
       
       
stop:
        ret

sp_vaiss:
      .db %00110000
      .db %00110000
      .db %01111000
      .db %01111000
      .db %11111100
      .db %11111100
      
sp_cube_1:
      .db %11111100
      .db %11111100
      .db %11111100
      .db %11111100
      .db %11111100
      .db %11111100
      .db %11111100
      
sp_cube_2:
      .db %11111100
      .db %10000100
      .db %10000100
      .db %10000100
      .db %10000100
      .db %11111100
      
sp_boum:
      .db %10010010
      .db %01010100
      .db %00111000
      .db %11111110
      .db %00111000
      .db %01010100
      .db %10010010
      
var_hscore:
      .dw 0
      
str_cubefield:
      .db "   Cube Field   ",0
str_parCoco:
      .db "Par -Coco-",0
str_ctr1:
      .db "2nde : Play",0
str_ctr2:
      .db "Clear : Quit",0

      
str_youaredead:
      .db "  You are dead. ",0
str_score:
      .db "Score:",0
str_high:
      .db "High score:",0
str_newhigh:
      .db "New high!",0
str_pause:
      .db "Pause",0
      
.end
Rien à voir avec le BASIC n'est ce pas ? ^^

Autre note : Ce code est là également pour vous montrer à quel point c'est galère à relire, donc ne me demandez pas de mettre 36 améliorations :p


NB :
Très léger problème de collision, du au pixel test de ION, il arrive (très rarement) de mourir à 2 pixels d'un cube...
snap le 10/12/2011 à 22:41
Sympa happy.gif Mais le probleme des pixel revient quand meme souvent c'est dommage^^
J'adore l'asm bigmouth.gif tu m'apprendra a programmer hein? XD
The K le 11/12/2011 à 10:59
Citation
(note : les fonctions telles que Putsprite n'existent pas en assembleur, je les ai codés moi même à coup de define)


Amusant ... je ne vois pourtant qu'un seul define.
ET au vu des quelques rudiments que j'ai en assembleur, je n'en ai vu qu'un, et je croyais que c'était une autre instruction, du genre ... je sais plus quoi, mais pas un define laugh.gif

Par ailleurs une autre question si je veux recopier ça (la question n'est pas où, ça je sais xD), il faut que je saute les lignes et que je marque tout au caratère près même la ligne avec le pixel test et tous les points virgule ?

Sinon, belle réussite coco, vraiment bigmouth.gif
-Coco- le 11/12/2011 à 14:50
En fait les defines sont dans le fichier "Ionsim.z80" (pour ion simple :p), que j'ai inclus au début du code...

Voici le code de Ionsim.z80 pour les intéressés, ça peut aider :
Code
;marche avec Ion !

;------------------------Les principales fonctions simplifiées-------------------------------
;----------------et leur définition ensuite------------------
#define Clear      bcall(_clrlcdf)      ;efface l'écran

#define Def(mm,val)   ld mm,var      ;correspond à un ld

#define Defvar(var,val)      ld a,val \ ld hl,var \ ld (hl),a

#define Defvar16(var,val)    ld hl,val \ ld d,h \ ld e,l \ ld hl,var \ ld (hl),de      ;pour assigner une valeur à une adresse RAM

#define Text(tx,ty,tv)   ld de,(tx*256)+ty \ ld (currow),de \ ld hl,tv \ bcall(_puts)      ;Texte type output( en x,y  tv est une etiquette

#define Vtext(tx,ty,tv)   ld de,(tx*256)+ty \ ld (pencol),de \ ld hl,tv \ bcall(_vputs)      ;texte type Texte( en x,y

#define Random(rx)   ld b,rx \ call ionrandom      ;nombre aléatoire entre 0 et rx stocké dans a.

#define Pixel(px,py,et)   ld bc,(px*256)+py \ ld d,et \ bcall(_ipoint)       ;pixel en (x,y) et non (y,x)

#define Pixelv(var,et)   ld hl,(var) \ ld b,h \ ld c,l \ ld d,et \ bcall(_ipoint)

#define Line(lx,ly,lxx,lyy,et)   ld bc,(lx*256)+ly \ ld de,(lxx*256)+lyy \ ld a,et \ bcall(_iline)   ;ligne de (lx,ly) à (lxx,lyy)

#define Dispvalue(val)   ld hl,val \ bcall(_disphl)       ; indiquer une valeur. ne convient pas aux registres 16 bits.

#define Dispvalue16(val,vall)   ld h,val \ ld l,vall \ bcall(_disphl)      ;pour les registres 16 bits, exemple Dispvalue16(b,c)

#define Darkline(lx,ly,lxx,lyy)   ld bc,(lx*256)+ly \ ld de,(lxx*256)+lyy \ bcall(_darkline)  ;ligne type PxlLigne

#define Getkey       bcall(_getk)      ;correspond au getkey du BASIC

#define Waitkey      bcall(_getkey)      ;attend l'appui d'une touche

#define Putspritea(sx,sy,sp,lin)   ld a,sy \ ld l,a \ ld a,sx \ ld b,lin \ ld ix,sp \ call ionputsprite
;crée un sprite de 8*lin pixels aux coordonnées x,y

#define Putsprite(var,sp,lin)   ld hl,var \ ld a,(hl) \ inc hl \ ld l,(hl) \ ld b,lin \ ld ix,sp \ call ionputsprite
;crée un sprite de 8*lin pixels aux coordonnées d'un 16 bits : ex Putsprite((coordonnees),sprite,8)

#define Largesprite(var,sp,lin,col)   ld hl,var \ ld c,col \ ld a,(hl) \ inc hl \ ld l,(hl) \ ld b,lin \ ld ix,sp \ call ionlargesprite

#define Clearbuf   bcall(_grbufclr)      ;efface le graph buffer

#define Flipbuf      call ionfastcopy      ;affiche le graph buffer

;-----------------Les Getkey----------------
;---ceux du Waitkey---
wk_clear .equ 9
wk_right .equ 1
wk_up .equ 3
wk_left .equ 2
wh_down .equ 4
wk_enter .equ 5
wk_mode .equ 69
wk_del .equ 10

;---ceux de Getkey---
gk_left .equ 2
gk_right .equ 3
gk_up .equ 4
gk_down .equ 1
gk_enter .equ 9
gk_seconde .equ 54
gk_alpha .equ 48
gk_clear .equ 15
gk_mode .equ 55


Moi perso ça me sert beaucoup (après je crois que je suis un des rares programmeurs en ASM ici :p)


Sinon snap je serais totalement incapable de t'apprendre l'assembleur, en fait j'ai appris plus ou moins tout seul avec des trucs sur internette. Mais souvent on ne trouve que des bribes de code, comme 'exemple d'utilisation de ionputsprite, mais avec de l'entraînement ça finit par rentrer.

En fait on apprend pas mal en regardant le code de programmes en assembleur déjà faits (par exemple j'ai énormément appris de Falldown). En tout cas si vous voulez vous y mettre bon courage, il en faut ^^
calcugeek le 11/12/2011 à 16:22
Est ce que c'est possible d'avoir un équivalent en hexadécimal? J'ai pas le cable cry.gif cry.gif
-Coco- le 11/12/2011 à 16:24
Si tu es prêt à recopier 1000 petits caractères sans aucune erreur autorisée (sinon mémoire cleaered), tu peux toujours tenter de l'ouvrir avec un éditeur hexadécimal et le recopier.

Personnellement, je pense que c'est une mauvais idée :p
calcugeek le 11/12/2011 à 16:29
euh ouais. O_o sinon tu peux me donner un exemple d'editeur?
-Coco- le 11/12/2011 à 16:40
D'éditeur pour écrire en assembleur ?

Ben... Bloc-notes !
Ce programme est largement suffisant.
Personnellement j'utilise Notepad++ qui est une version améliorée de Bloc-notes, que je trouve plus pratique.
Après pour compiler et tout ça, il existe des programmes spéciaux.
Si vous voulez avoir des petites notions, allez voir sur :
http://www.siteduzero.com/tuto[...]80-pour-ti.html

Bon c'est pour Ti 83 +, et il faut utiliser un émulateur (sauf si vous avez une Ti 83+, mais si vous débutez en assembleur je vous conseille vivement d'utiliser un émulateur). Mais vous avez tous els outils de compilation, dont ceux pour ti 83, si vous êtes un peu débrouillards winkle.gif
sandro le 11/12/2011 à 19:19
sinon, matrefeytontias viens juste den publier un sur Espace TI : http://espace-ti.forumactif.co[...]sm-pour-windows
snap le 12/12/2011 à 21:04
Petite question pour -coco- (oui je sais je suis très énervant crazy.gif )
Dans un tuto pour z80 le mec dit sa

mec qui dit sa a écrit :
Logiquement, ils peuvent donc contenir des valeurs de %00000000 à %11111111, c'est-à-dire entre 0 et 255. Votre programme ne sera pas compilé en cas de dépassement.


Mais le truc que j'ai pas compris c'est comment on reconnait les valeur. Comment on peut savoir que %11111111 c'est 255?
linkakro le 12/12/2011 à 21:46
C'est le language binaire.
1001 base 2 = 2^3+2^0 = 9
1011 base 2 = 2^3+2^1+2^0 = 11
11111111 base 2 = 2^8-1 = 255
Le 2^8-1 c'est pour éviter 2^7+2^6+...+2^0
snap le 12/12/2011 à 21:57
OK merci beaucoup! Et sa sert à quelque chose de savoir sa pour le z80?
linkakro le 12/12/2011 à 22:06
C'est indispensable pour manipuler des languages de bas niveau comme l'assembleur. Ne serait-ce que pour comprendre ce que fait ton compilateur.
Je te rappelles que toute l'électronique se sert du language binaire.
Une TI en assembleur c'est comme un microcontrôleur : tu as des périphériques et des adresses mémoire numérotées en hexadécimal voire en binaire.
snap le 12/12/2011 à 23:20
OK. Et encore une question : 200 = 11001000b = C8h
C'est bien joli mais pourquoi? C'est quoi ce C8h xD
Persalteas le 12/12/2011 à 23:56
Je vais peut être dire une énorme connerie, mais je me permets d'émmettre une hypothèse:

le h se retrouve souvent après des "trucs" en ASM, je ne sais pas trop quoi, et il ne sert apparement pas.

Il se pourrait que C8 soit la traduction hexadécimale de 11001000, même si ça m'étonnerait, j'aurais dit plus (au moins E8 ou plus...)
cKZO le 13/12/2011 à 08:58
le prblm c que bcp de programmes sont ac "ion mais je sais pas comment ça marche
domage il a l'air bien ton prgm winkle.gif
linkakro le 13/12/2011 à 12:26
Le h signifie hexadécimal et b binaire.
C8 hexa = 12*16+8 = 200
11001000 bin = 128+64+8 = 200

Si tu as du mal avec les calculs ou si tu n'as jamais eu de cours, utilise la calculatrice windows en mode programmeur pour convertir toutes les bases 2,8,10,16.
( ou bien utilise ta TI avec mon programme de convertion godgrace.gif )

----

ION est écrit en assembleur classique. Il permet de lire des programmes écris dans un language différent et surtout compilés autrement qu'en hexadécimal habituel.
Persalteas le 13/12/2011 à 15:56
Pour savoir comment installer ION, regarde dans ce topic...

http://tout82.free.fr/forum/sujet.php?sujet=2522

plus précisément cette partie:

Persalteas a écrit :

téléchargez ion ici (utilisez les progs en 83p !!). les 3 programmes indispensables sont ION, IONZ et ZMINFO. le reste c'est des modules facultatifs.(n'utilsez pas celui apellé "minuscules", c'est pour les 83+ ! erreur de rangement de ma part !

une fois les progs dans votre TI, éxécutez ION. ça écrit "ION Installed" et deux programmes A et thêtaION se créent.

Vous pouvez supprimmer ION et IONZ pour gagner de la place, mais conservez les deux autres (ou alors supprimez A et faites un nouveau prog du nom de votre choix en écrivant:

:Envoi(9prgm@ION
:EffEcr


envoyez ensuite vos progs en ASM, et quand vous éxécutez A, il apparait une liste de vos programmes en ASM.Quittez ION en faisant [2nd][mode].
snap le 13/12/2011 à 22:18
A ok merci linkakro. Mais par contre j'ai pas compris ton calcul xD
The K le 14/12/2011 à 13:59
Quand on a compris c'est simple sur le principe ne t'en fais pas winkle.gif

Toi tu comptes en base 10, base décimale, avec des nombres variant de 0 à 10.

Le binaire est en base 2, avec des 0 et des 1.
Le nombre 00110101 sera donc égal à (en partant de la droite) :
1*2^1 + 0*2² + 1*2^3 + 0*2^4 + 1*2^5 + 1*2^6 + 0*2^7 + 0*2^8
Soit : 1 + 0 + 8 + 0 + 32 + 64 + 0 + 0
= 105

Voila !

Le calcul en hexa reprend les mêmes bases, sauf qu'avec des 1 et des 0, on a 0123456789ABCDEF, avec A=10,B=11, etc jusqu'à F=15.

Je t'invite à aller voir ceci si tu n'as pas tout compris : http://www.siteduzero.com/tuto[...]ecomposeur.html

En espérant t'avoir aidé winkle.gif