Posté le 27/02/2011 à 14:21 Membre depuis le 02/02/2009, 672 messages
Salut,


Cette article présente une manière de compiler du C pour ti83 (pas ti83+, bien la ti83 regular).
Ce n'est pas vraiment difficile, mais il y a quelques subtilités qui ne sont pas forcément faciles à deviner (squisher et choix du "-startup=10" par exemple).
Pour les autres modèles ça ne devrait que peu changer (non testé).

J'utilise Linux et z88dk.

Pour commencer il faut télécharger z88dk :

> sudo apt-get install z88dk
(debian/ubuntu)

OU

> wget http://sourceforge.net/projects/z88dk/files/z88dk/1.9/z88dk-src-1.9.tgz/download

OU

ou juste cliquer ici :
http://sourceforge.net/projects/z88dk/files/z88dk/1.9/z88dk-src-1.9.tgz/download

puis installer normalement.

Il faut également récupérer bin2bin83 (la source est disponible sur yaronet).
Et le compiler et le mettre dans le path.
Idem pour bin2var (disponible sur ticalc.org).


Ok une fois installé on dispose donc d'un compilateur "zcc" ou "z88dk-zcc" et d'un linkeur et même de z80asm (qui est un assembleur généraliste pour z80) .
A propos, préférez spasm à z80asm si vous voulez faire de l'assembleur.
Il y a aussi une alternative LPG nommée "zasm" mais il y a quelques variantes de syntaxe et peu (personne) de gens utilisent zasm (z80asm est très utilisé hors communauté TI).

Commençons par ecrire un petit fichier C qui devrait fonctionner (mais impossible de trouver d'exemple de code fonctionnel pour ti83 en C sur internet).
Bref ne prenons pas de risque juste un printf et une boucle sans fin wink
(la boucle c'est pour laisser le temps de voir ce qui s'affiche à l'écran)

Testons un premier fichier :

#include <stdio.h>

main() {

printf("hello world\n\n\n\n");
while (1) {
// ne finit jamais
}


}


On tente de le compiler comme indiqué ici : http://www.z88dk.org/wiki/doku.php?id=platform:ticalc

> zcc +ti83 -lm -o hello -create-app hello.c

Petit explication de cette commande :
zcc : compilateur
+ti83 : la cible (le modèle qui peut être ti82, ti86 etc... ou meme zx spectrum donc "-zx").
-lm : linker et laisser les fichier .map
-o hello : nom du fichier de sortie
-create-app : faire le travail de bin2var
hello.c : fichier source

Cela veut dire compile pour cible ti83 avec linkage et creation d'application (create app = utilise un clone de bin2var ou wabbitsign).


Bon ça compile mais ça ne marche pas (sans shell).
Evidemment fallait s'y attendre lol.

Alors regardons de plus près.

Comme je sais que sans shell on a souvent un petit probleme de lancement (j'utilise Send(9pgrmHello).
Je vais utiliser mon programme pour "squisher" le source (bin2bin83) probleme inhérent à Linux et noshell, puis utiliser bin2var plutôt que l'utilitaire z88dk.
Juste histoire de voir s'il y a du mieux...

Ce qui nous donne un makefile :

all:
zcc +ti83ansi -lm -o hello hello.c
bin2bin83 hello
bin2var output.bin OUTPUT.83p

clean:
rm *.83p


Y a du mieux si on regarde le code à la loupe (avec un éditeur hexadecimal).
Tout parait normal (entête, code squishé, suffixe de fin etc...) mais lorsqu'on le lance il ne se passe strictement rien.


Bref il nous manque encore une petite chose cf : http://www.z88dk.org/wiki/doku.php?id=platform:ticalc#ti83

En fait il va falloir spécifier quel shell utiliser ici il s'agit de plain TI OS (no shell)

Donc on ajoute un "-startup=10" à notre ligne de commande :

Ici notre makefile :

all:
zcc +ti83ansi -lm -startup=10 -o hello hello.c
bin2bin83 hello
bin2var output.bin OUTPUT.83p

clean:
rm *.83p


Avec notre hello.c qui n'a pas bougé :

#include <stdio.h>

main() {

printf("hello world\n\n\n\n");
while (1) {
// ne finit jamais
}


}


On fait :
> make

puis on charge le fichier dans un émulateur par exemple tilem.

Puis sur la ti83 :
> send(9pgrmHello

Et on obtient :

tromb Fichier joint : HDBh (screenshot001.png fait avec tilem v2 héhé)


Victoire !! wink


Thibault Duponchelle
Posté le 27/02/2011 à 15:55 Membre depuis le 15/03/2005, 3470 messages
C'est sympa ce genre de petit tuto (même si le C est selon moi le dernier langage a utiliser sur TI z80 wink). D'ailleurs ça me rappel que gh en faisait un sur l'asm pendant un moment.
Posté le 28/02/2011 à 08:47 Membre depuis le 02/02/2009, 672 messages
Merci wink
En fait je n'ai pas trouvé d'article équivalent c'est pour ça que je pense que ça valait le coup d'être partagé tongue

C'est vrai que le code généré par le compilo semble abominablement long pour un simple affichage de "hello world".
Il faudrait tester avec un code assembleur mais je suis sur que ce serait moins gros.
Mais selon toi quelles sont les autres raisons de discréditer le C?

J'ai beaucoup entendu de reproches aux compilateurs C pour z80 (tels que sdcc) mais z88dk semble à présent assez performant et assez fiable (à priori).

Pour le tuto à gh, il est disponible quelque part en version non terminée il me semble que je l'ai lu il y a quelques mois.
Il faudra lui demander quand il passera par ici wink
Posté le 28/02/2011 à 09:33 Membre depuis le 02/02/2009, 672 messages
Ok j'ai fait mon petit test :

.nolist
#define EQU .equ
#include "ti83asm.inc"
#include "tokens.inc"
#define xcoord 8270h
#define ycoord 8272h

.list

.org 9327h

START:
; Turn the indicator to off and clear screen
call RINDOFF ; Turn off runindicator


loop:
call _CLRLCDFULL ; Turn off runindicator

ld hl,3
ld (pencol),hl ;charge la valeur de la ligne de texte sur l'écran
ld hl,4
ld (penrow),hl ;charge la valeur de la colone de texte.
ld hl,texte ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ret
.end
end

texte:
.db "Helloworld!",0


Avec un petit makefile :

all: HELLO83.83p

HELLO83.83p: hello83.bin
bin2var hello83.bin HELLO83.83p

hello83.bin: hello.bin
bin2bin83 hello.bin hello

hello.bin: hello.asm
spasm hello.asm



clean:
rm -f *.bin
rm -f *.83p

.PHONY: all clean

install:
cp HELLO83.83p ~/Code/tilem162/trunk/gui/



Et on obtient :

tromb Fichier joint : 6C4H (screenshot006.png)

On peut remarquer que ce n'est pas la même police ...


Avec un code généré :

0000000 2a2a 4954 3338 2a2a 0a1a 4300 6572 7461
0000010 6465 7720 7469 2068 6942 326e 6156 2072
0000020 3176 312e 0030 0000 0000 0000 0000 0000
0000030 0000 0000 6400 0b00 5500 0600 4548 4c4c
0000040 384f 0033 0055 0053 4443 3539 3734 4443
0000050 3535 3734 3132 3330 3030 3232 3235 3238
0000060 3132 3430 3030 3232 3335 3238 3132 3034
0000070 3339 4443 3138 3734 3943 3834 3536 4336
0000080 4336 4636 3737 4636 3237 4336 3436 3132
0000090 3030 d43f 303f 3030 3f30 ced4 0015
000009d


Alors qu'avec le code C on a :

0000000 2a2a 4954 3338 2a2a 0a1a 4300 6572 7461
0000010 6465 7720 7469 2068 6942 326e 6156 2072
0000020 3176 312e 0030 0000 0000 0000 0000 0000
0000030 0000 0000 5800 0b19 4900 0619 554f 5054
0000040 5455 0000 1949 1947 4443 3539 3734 3132
0000050 3030 3030 3933 3232 4539 3339 3132 4146
0000060 4646 3933 3946 4445 3337 4344 3339 3132
0000070 4330 3030 3545 4443 4532 3439 3145 4443
0000080 4435 3734 4445 3635 4446 4243 3930 3642
0000090 4533 3638 4445 3734 3130 3030 3130 3736
00000a0 3936 3735 3835 4333 3737 4445 3042 4636
00000b0 3633 3343 3332 3633 3836 3332 3633 3339
00000c0 3332 3633 3030 3831 3033 3546 4133 4138
00000d0 3738 4243 4637 3032 3232 3545 3544 3543
00000e0 4446 3545 4446 3132 3736 3538 3132 4138
00000f0 3738 4243 4546 3944 3830 4646 3346 3346
0000100 3830 3944 3132 4138 3738 4243 4542 4446
0000110 3145 3143 3144 3145 3146 4246 3943 3146
0000120 3830 3944 3143 3831 3645 4445 4535 4443
0000130 3031 3439 3133 3030 3030 4446 3132 3736
0000140 3538 4443 4435 3734 4446 4243 3930 3641
0000150 4445 3635 4246 3943 3030 3030 3331 3030
0000160 3030 3030 3531 3030 3030 3030 3531 3030
0000170 3030 3030 3030 3030 3030 3030 3030 3030
*
00001a0 3030 3030 3030 3030 3343 4442 4239 3030
00001b0 3030 3030 3030 3030 3030 3030 3030 3030
00001c0 3932 4538 3030 3030 3346 4533 3038 3344
00001d0 3031 3132 4331 3139 4533 3032 4634 3332
00001e0 4232 3630 3034 4330 3131 3130 4446 3344
00001f0 3031 3931 3131 4130 3030 3931 3332 3332
0000200 3331 4537 3344 3131 4231 3031 3646 3937
0000210 4546 4332 3032 3545 3943 3132 4531 3439
0000220 3545 4533 3130 4443 4538 4639 3143 3343
0000230 4131 3439 3943 3836 3536 4336 4336 4636
0000240 3032 3737 4636 3237 4336 3436 4430 4430
0000250 4430 4430 3030 3132 3230 3030 3933 3131
0000260 3130 3030 3343 4233 3439 3943 3030 3030
0000270 4137 3342 3843 4445 4234 3444 3439 3837
0000280 3142 3243 4530 3539 4537 3332 4231 4546
0000290 4231 4143 3232 3539 4546 4239 4143 3733
00002a0 3539 4546 4330 3032 3031 3545 3544 4443
00002b0 4632 4239 4641 3233 4133 3439 3233 3933
00002c0 3439 3144 3145 3831 3636 4546 4430 3832
00002d0 3430 4546 4130 3032 3930 3545 3544 4443
00002e0 4135 4239 3144 3145 3831 3535 4546 3930
00002f0 3032 4131 3545 3544 4133 3933 3439 4631
0000300 4631 4333 3731 3731 3545 3132 3646 3839
0000310 4542 3145 3246 3339 3439 3233 3933 3439
0000320 3144 3145 3831 3733 4546 3730 3032 3930
0000330 3545 3544 4443 3546 3839 3144 3145 3831
0000340 4132 4546 3830 3032 4631 4133 3933 3439
0000350 3741 3832 3630 4433 3233 3933 3439 3831
0000360 4131 4133 4133 3439 3741 3832 3431 4433
0000370 3233 4133 3439 4133 3646 3839 4433 3233
0000380 3933 3439 3831 3730 3545 3544 4443 4141
0000390 4239 3144 3145 4137 3342 3243 4533 3439
00003a0 3943 3030 3030 3030 3030 3030 3030 3030
00003b0 3030 3030 3030 3030 3030 3030 3030 3030
*
0000400 3030 3130 3030 3030 4445 3334 3444 3439
0000410 3343 4543 3439 4445 4234 3444 3439 3543
0000420 4445 4234 3644 3439 3943 3130 3030 3030
0000430 4445 3334 3444 3439 3343 3743 3439 4137
0000440 3342 3032 4130 3130 3033 3539 4445 3334
0000450 3444 3439 3343 3344 3439 4537 3332 4231
0000460 4546 4235 3032 3145 3130 4144 3439 4641
0000470 3230 4230 3233 3844 3439 4137 3342 3032
0000480 4530 4445 3334 3644 3439 3130 3235 3539
0000490 4445 3334 3444 3439 3343 3344 3439 4537
00004a0 3332 4231 4546 4433 3832 3430 4546 4633
00004b0 3032 3831 3233 3844 3439 4137 3342 3032
00004c0 4530 4445 3334 3644 3439 3130 3237 3539
00004d0 4445 3334 3444 3439 3343 3344 3439 4537
00004e0 3332 4231 4546 3033 4146 3341 3539 4546
00004f0 4133 3246 3341 3539 3545 3036 3936 3543
0000500 3130 3230 3539 4445 3234 3143 3145 3033
0000510 3130 3330 3644 3033 3230 4137 3342 3243
0000520 3033 3639 4445 3334 3644 3439 3130 3033
0000530 3639 4445 3334 3444 3439 3343 3344 3439
0000540 4546 3232 3832 3530 4546 4335 3243 3143
0000550 3539 3233 3944 3439 4137 3342 3032 3533
0000560 4445 3334 3644 3439 3130 3845 3539 4445
0000570 3334 3444 3439 3343 3344 3439 4546 4233
0000580 3243 3436 3639 3545 3036 3936 3543 3130
0000590 3230 3539 4445 3234 3143 3145 3033 3130
00005a0 3330 4641 3230 4137 3342 3032 3839 4445
00005b0 3334 3644 3439 3130 3237 3539 4445 3334
00005c0 3444 3439 3343 3344 3439 4537 3332 4231
00005d0 3545 3132 3944 3439 4542 3145 3832 3132
00005e0 3545 3036 3936 3543 3130 3230 3539 4445
00005f0 3234 3143 3145 3033 3130 3330 3230 4137
0000600 3342 3032 3245 4445 3334 3644 3439 3130
0000610 3845 3539 4445 3334 3444 3439 3343 3344
0000620 3439 4137 3342 3032 4530 4445 3334 3644
0000630 3439 3130 3632 3639 4445 3334 3444 3439
0000640 3343 3344 3439 4537 3332 4231 4546 4233
0000650 3243 3537 3539 3831 3641 4537 3332 4231
0000660 4546 3033 4146 4635 3639 4546 4133 3246
0000670 4635 3639 3644 3033 3543 3546 4130 4634
0000680 3630 3930 3138 3031 4446 4634 3146 3138
0000690 3143 3230 4137 3342 3032 4644 4445 3334
00006a0 3644 3439 3130 3033 3639 4445 3334 3444
00006b0 3439 3343 3344 3439 4546 4233 4143 3644
00006c0 3539 3545 3544 3036 3936 3130 4144 3439
00006d0 4230 3733 4633 4445 3234 3534 3430 3530
00006e0 3032 3830 3546 3132 4144 3439 4533 3130
00006f0 3737 3146 4546 4436 3243 4339 3639 3430
0000700 3530 3032 3730 3132 4144 3439 4533 3030
0000710 3737 3430 3132 4144 3439 4537 4443 3942
0000720 3839 3332 3530 3243 3039 3639 3343 3442
0000730 3839 4546 3334 3032 3432 3132 4144 3439
0000740 4133 3933 3439 3638 3543 3546 4133 3646
0000750 3839 3734 3146 3430 3842 3143 3246 4142
0000760 3639 3233 3933 3439 3343 3442 3839 4133
0000770 3646 3839 4433 3233 3933 3439 3343 3442
0000780 3839 4546 3434 3032 3131 3132 4144 3439
0000790 4133 3933 3439 3639 3244 3344 3639 4641
00007a0 3233 3933 3439 3343 3442 3839 4546 3134
00007b0 3032 3131 3132 4144 3439 4133 4133 3439
00007c0 3639 3246 3845 3639 4641 3233 4133 3439
00007d0 3343 3442 3839 4546 3234 3032 3931 3132
00007e0 4144 3439 4133 4133 3439 3638 4333 3132
00007f0 3746 3839 4542 3246 3430 3739 4133 3746
0000800 3839 4433 3233 4133 3439 3343 3442 3839
0000810 4546 3337 3832 3430 4546 4136 3032 3131
0000820 4133 3933 3439 3233 3232 3739 4133 4133
0000830 3439 3233 3332 3739 3343 3442 3839 3030
0000840 3030 4546 3537 3832 3430 4546 4236 3032
0000850 4630 4133 3232 3739 3233 3933 3439 4133
0000860 3332 3739 3233 4133 3439 3343 3442 3839
0000870 4546 3636 3832 3430 4546 3834 3032 4333
0000880 3430 3530 3032 3830 3132 4144 3439 4533
0000890 3130 3737 3332 3737 3530 3032 3730 3132
00008a0 4144 3439 3332 4533 3130 3737 3132 4144
00008b0 3439 4537 3545 3132 3746 3839 4542 3145
00008c0 4146 4136 3739 4133 3746 3839 4433 3233
00008d0 4133 3439 3332 4537 4433 3132 3646 3839
00008e0 4542 4146 3937 3739 4537 4433 3233 3933
00008f0 3439 3343 3442 3839 4546 3236 3832 4334
0000900 4546 4134 3243 3731 3839 3430 3530 3032
0000910 3630 3132 4144 3439 4533 3030 3737 3132
0000920 4144 3439 4537 3741 3032 3233 4133 4133
0000930 3439 3546 4133 3933 3439 3546 3546 4533
0000940 3032 4443 3846 3839 3146 4333 3233 3933
0000950 3439 3132 3646 3839 4542 4146 3141 3739
0000960 3146 3233 3933 3439 3146 3233 4133 3439
0000970 4333 4333 3132 3746 3839 4542 4143 3442
0000980 3839 3546 4443 4633 4239 3146 3831 3046
0000990 4546 3130 3032 3233 4133 4133 3439 3546
00009a0 4133 3933 3439 3546 3546 4533 3032 4443
00009b0 3846 3839 3146 4433 3233 3933 3439 4546
00009c0 3030 3246 3744 3739 3146 3233 3933 3439
00009d0 3146 3233 4133 3439 3741 4143 3442 3839
00009e0 4433 3546 4443 4633 4239 3146 4546 3030
00009f0 3246 3346 3739 3343 3442 3839 4546 3230
0000a00 3243 3442 3839 3543 3544 4443 4632 4239
0000a10 3144 3143 4641 3233 4133 3439 3233 3933
0000a20 3439 3343 3442 3839 4546 4636 3832 3433
0000a30 4546 4234 3243 3837 3839 3430 3530 3032
0000a40 3630 3132 4144 3439 4533 3030 3737 3132
0000a50 4144 3439 4537 3741 3032 4131 4133 3933
0000a60 3439 3546 3546 4533 3032 4443 3846 3839
0000a70 3146 4333 3233 3933 3439 3132 3646 3839
0000a80 4542 4146 3533 3839 3146 3233 3933 3439
0000a90 4546 3130 3032 4231 4133 3933 3439 3546
0000aa0 3546 4533 3032 4443 3846 3839 3146 4433
0000ab0 3233 3933 3439 4546 3030 3246 3335 3839
0000ac0 3146 3233 3933 3439 3343 3442 3839 4546
0000ad0 3230 3243 3442 3839 4133 4133 3439 4443
0000ae0 4633 4239 3343 3442 3839 4546 4336 3032
0000af0 3930 4133 4133 3439 4443 4633 4239 3343
0000b00 3442 3839 4546 4536 3243 4539 3839 3430
0000b10 3530 4143 3442 3839 3132 4144 3439 4537
0000b20 4546 3630 4143 3442 3839 4443 3935 4239
0000b30 3343 3442 3839 4546 4334 3032 4130 3132
0000b40 4144 3439 3634 4133 4133 3439 3343 3442
0000b50 3839 4546 4434 3032 3430 3132 4144 3439
0000b60 4537 3144 3145 3343 3430 3539 4546 3430
0000b70 3032 3630 4533 3032 3233 3438 3939 3943
0000b80 4546 3831 3032 3630 4533 3831 3233 3438
0000b90 3939 3943 4546 3530 3032 3630 4533 3032
0000ba0 3233 3438 3939 3943 4546 3931 3032 3630
0000bb0 4533 3831 3233 3438 3939 3943 4546 3730
0000bc0 3032 3630 4533 4632 3233 3238 3939 3943
0000bd0 4546 4231 3032 3530 4641 3233 3238 3939
0000be0 3943 3943 3943 3032 3830 3233 4134 3939
0000bf0 4132 3345 3339 4133 4133 3439 3741 3832
0000c00 4130 3738 3738 3738 3734 3131 4330 3030
0000c10 3931 3031 4446 3232 3334 3939 3132 4138
0000c20 3939 3634 3132 3030 3030 4133 3933 3439
0000c30 4635 3631 3030 3242 3832 3231 3931 3031
0000c40 4446 3630 3330 4243 4333 4243 4431 4631
0000c50 3031 3946 3630 3530 4243 4633 3031 4346
0000c60 3233 3436 3939 4635 4133 4138 3939 3338
0000c70 4635 4533 3031 3339 3233 3739 3939 3131
0000c80 3030 3030 3931 3545 4444 3145 3630 3134
0000c90 4641 4243 3831 3833 3230 4533 3430 3233
0000ca0 4437 3939 3132 4632 3939 3131 3830 3030
0000cb0 3931 3031 4446 3131 4330 3030 4530 3830
0000cc0 3630 3430 4444 4243 3130 3631 4444 4243
0000cd0 3030 3631 3430 3530 3832 4130 4444 4243
0000ce0 3130 3631 4444 4243 3030 3631 3031 3646
0000cf0 4537 3831 3430 3731 3731 3731 3731 3030
0000d00 4430 3831 3230 4533 4646 4330 3630 3330
0000d10 3731 4444 4243 3130 3631 4444 4243 3030
0000d20 3631 3031 3546 3630 3630 3430 3530 3832
0000d30 4130 4444 4243 3130 3631 4444 4243 3030
0000d40 3631 3031 3646 4444 3931 3332 4430 3032
0000d50 3742 3343 3745 3339 3430 3430 3430 3430
0000d60 3430 3030 3430 3030 3530 3541 4641 3530
0000d70 4630 3530 3530 3030 3034 4136 3238 3434
0000d80 3432 3843 4134 3030 3030 3434 3841 3034
0000d90 3041 3038 3045 3030 3834 3438 3438 3438
0000da0 3438 3438 3834 3030 3030 3441 3434 4545
0000db0 3434 3441 3030 3030 3030 3030 3030 4530
0000dc0 3030 3034 3034 3038 3030 3230 3230 3430
0000dd0 3430 3830 3834 3030 3434 4341 3441 3441
0000de0 3441 3441 4534 3030 3434 4141 3232 3434
0000df0 3234 4141 3445 3030 4532 3836 4336 3241
0000e00 3245 4132 3432 3030 4536 3238 3238 3443
0000e10 3441 3841 3834 3030 3434 4141 4141 3634
0000e20 3241 3241 4334 3030 3030 3030 3434 3030
0000e30 3030 3434 3430 3830 3030 3032 4534 3038
0000e40 4534 3032 3030 3030 3430 4138 3234 3432
0000e50 3434 3038 3430 3030 3436 4139 4139 4142
0000e60 4542 4138 4136 3030 3443 4141 3841 3843
0000e70 3841 4141 3443 3030 4543 3841 3841 4341
0000e80 3841 3841 4543 3030 3445 4138 3838 3843
0000e90 4138 4138 3638 3030 4541 3441 3441 3445
0000ea0 3441 3441 4541 3030 4136 4132 4332 4332
0000eb0 4141 4141 4134 3030 4138 4538 4538 4138
0000ec0 4138 4138 4145 3030 3443 4141 4141 4141
0000ed0 4141 4141 3441 3030 3443 4141 4141 4143
0000ee0 4538 4338 3238 3030 3443 4141 3841 3443
0000ef0 3241 4141 3441 3030 4145 4134 4134 4134
0000f00 4134 4134 4534 3030 4141 4141 4141 4141
0000f10 4541 4534 4134 3030 4141 4141 4141 3434
0000f20 3441 3441 3441 3030 3645 3432 3432 3434
0000f30 3438 3438 3645 3030 3638 3238 3234 3234
0000f40 3234 3232 3632 3030 3030 3034 3041 3030
0000f50 3030 3030 3030 4630 3030 3038 4334 3230
0000f60 4530 4130 4430 3030 3038 3038 3438 4143
0000f70 3841 4141 3443 3030 3032 3032 3432 4136
0000f80 4541 3841 3636 3030 3032 3034 3634 4145
0000f90 4134 3634 3245 4330 3438 3038 3438 3443
0000fa0 3441 3441 3441 3030 3832 3830 4132 4132
0000fb0 4332 4132 4141 3034 3043 3034 4134 4534
0000fc0 4534 4134 4145 3030 3030 3030 3443 4141
0000fd0 4141 4141 3441 3030 3030 3030 3643 4141
0000fe0 4141 3643 3238 3238 3030 3030 3643 3841
0000ff0 3438 3238 4338 3030 3034 3034 4145 4134
0001000 4134 4134 3636 3030 3030 3030 4141 4541
0001010 4541 4541 3434 3030 3030 3030 4141 4141
0001020 4134 3641 3241 4330 3230 3430 3445 4332
0001030 3434 3438 3245 3030 3834 3434 3434 3630
0001040 3434 3434 3834 3030 3035 3441 3430 4130
0001050 4130 4130 4530 3030 4132 3345 3339 3633
0001060 3030 3435 4435 3331 3130 3030 3330 4445
0001070 3042 3343 3745 3339 3131 3036 3030 3734
0001080 4132 3345 3339 3741 3832 3330 3931 3031
0001090 4446 3435 4435 3331 3633 3030 3130 3036
00010a0 3030 4445 3042 3343 3745 3339 3943 4641
00010b0 3233 3933 3439 4133 4133 3439 4333 3233
00010c0 4133 3439 3132 3746 3839 4542 3043 4133
00010d0 3746 3839 4433 3233 4133 3439 3343 3437
00010e0 4239 4443 4441 3339 3132 4438 4239 4533
00010f0 4646 3344 3130 4537 3741 3832 3546 3344
0001100 3130 4244 3130 4546 4646 3032 4230 3332
0001110 3831 4445 4546 4446 4246 3746 4645 4644
0001120 4642 3030 4443 4541 3339 3132 3036 3030
0001130 4445 4235 3345 3339 3931 3130 3041 3230
0001140 4445 3042 4533 3730 3343 4633 4239 4443
0001150 3846 3839 4133 3646 3839 3735 4133 3933
0001160 3439 4333 3233 3933 3439 4142 3043 3343
0001170 4135 4239 3543 3543 3132 3330 3030 3933
0001180 3545 3132 4130 3030 3933 3545 4443 4542
0001190 4539 3332 3144 4443 4337 4639 4232 4537
00011a0 3144 3231 3741 4143 4539 4439 3132 3330
00011b0 3030 3933 4537 4546 3532 4143 4246 4239
00011c0 3132 3330 3030 3933 4536 3632 3030 3545
00011d0 3132 4330 3030 3933 4443 4542 4539 3545
00011e0 4443 3835 4539 3143 3143 3343 4239 4439
00011f0 3132 3330 3030 3933 3545 3132 4130 3030
0001200 3933 3545 4443 4542 4539 3332 3144 4443
0001210 4337 4639 4232 4537 3144 3231 3132 3330
0001220 3030 3933 4536 3632 3030 4437 4546 4336
0001230 4143 3533 4339 4546 3436 4143 4141 4339
0001240 4546 3537 4143 4444 4339 4546 3337 4143
0001250 3031 4439 4546 3336 4143 4435 4439 3343
0001260 3638 4439 3132 3330 3030 3933 3545 3132
0001270 4130 3030 3933 3545 4443 4542 4539 3332
0001280 3144 4443 4337 4639 4232 4537 3144 3231
0001290 3132 3330 3030 3933 4536 3632 3030 4437
00012a0 4546 3436 4143 3036 4339 4546 3537 4143
00012b0 3036 4339 3343 3741 4339 3132 3630 3030
00012c0 3933 3545 4443 4542 4539 4232 4232 3144
00012d0 4443 4337 4639 3132 3630 3030 3933 4443
00012e0 4542 4539 4443 3343 4539 3544 3545 3132
00012f0 4530 3030 3933 4535 3332 3635 3544 3132
0001300 3930 3030 3933 4537 4546 3436 3132 3030
0001310 3030 3032 3130 3332 3632 3030 3545 4443
0001320 3441 4439 3143 3143 3143 3143 3132 3630
0001330 3030 3933 3545 4443 4542 4539 4232 4232
0001340 3144 4443 4337 4639 3343 4239 4439 3132
0001350 3630 3030 3933 4443 4542 4539 4443 4542
0001360 4539 4443 4443 4539 3544 3545 3132 4530
0001370 3030 3933 4535 3332 3635 3544 3132 3130
0001380 3030 3545 4443 3441 4439 3143 3143 3143
0001390 3143 3132 3630 3030 3933 3545 4443 4542
00013a0 4539 4232 4232 3144 4443 4337 4639 3343
00013b0 4239 4439 3132 3630 3030 3933 4443 4542
00013c0 4539 4443 4542 4539 3131 3030 3030 3544
00013d0 3545 3132 4530 3030 3933 4535 3332 3635
00013e0 3544 3132 3030 3030 3545 4443 3441 4439
00013f0 3143 3143 3143 3143 3132 3630 3030 3933
0001400 3545 4443 4542 4539 4232 4232 3144 4443
0001410 4337 4639 3343 4239 4439 3132 3630 3030
0001420 3933 4443 4542 4539 4443 4542 4539 3143
0001430 3545 3132 3230 3030 3933 3545 4232 4232
0001440 3545 4443 4542 4539 3332 3144 4443 4337
0001450 4639 4232 4537 3144 3231 3741 4143 4334
0001460 4439 3132 3230 3030 3933 4536 3632 3030
0001470 3545 3132 4330 3030 3933 4443 4542 4539
0001480 3545 4443 3835 4539 3143 3143 3343 4331
0001490 4439 3132 3630 3030 3933 3545 4443 4542
00014a0 4539 4232 4232 3144 4443 4337 4639 3343
00014b0 4239 4439 3132 3630 3030 3933 4443 4542
00014c0 4539 4535 3332 3635 3544 3132 4330 3030
00014d0 3933 4443 4542 4539 3545 4443 3835 4539
00014e0 3143 3143 3132 3630 3030 3933 3545 4443
00014f0 4542 4539 4232 4232 3144 4443 4337 4639
0001500 3343 4239 4439 3132 3330 3030 3933 4536
0001510 3632 3030 3545 3132 4330 3030 3933 4443
0001520 4542 4539 3545 4443 3835 4539 3143 3143
0001530 3343 4642 4239 3132 3030 3030 3143 3143
0001540 3943 3543 3543 3132 3630 3030 3933 4537
0001550 3741 4143 3243 4439 3132 4130 3030 3933
0001560 4443 3343 4539 3544 3545 3132 3030 3030
0001570 3435 4435 4443 3333 4639 3833 3330 3343
0001580 3945 4439 3132 4432 3030 3545 3132 4130
0001590 3030 3933 4443 4542 4539 3545 4443 3835
00015a0 4539 3143 3143 3132 4130 3030 3933 3545
00015b0 3132 4330 3030 3933 4443 3343 4539 4443
00015c0 4136 4639 3143 4443 3238 4639 3132 3030
00015d0 3030 3933 3545 3132 4330 3030 3933 4443
00015e0 3343 4539 3544 3545 3132 4130 3030 3131
00015f0 3030 3030 4443 3045 4539 3143 4443 3238
0001600 4639 4337 3542 4143 3932 4539 3132 3030
0001610 3030 3933 4443 3343 4539 3544 3545 3132
0001620 4330 3030 3933 4535 3332 3635 3544 3132
0001630 4330 3030 3933 4536 3632 3030 3545 4443
0001640 3441 4439 3143 3143 3143 3143 3132 4130
0001650 3030 3933 4443 3343 4539 3544 3545 3132
0001660 4130 3030 3131 3030 3030 4443 3045 4539
0001670 3944 3544 3545 3132 3033 3030 3131 3030
0001680 3030 4443 3544 4539 3545 3132 4130 3030
0001690 3933 4443 4542 4539 3545 4443 3835 4539
00016a0 3143 3143 3143 3143 3943 3144 4444 3145
00016b0 3143 3543 4444 3545 3544 3132 4646 4646
00016c0 4444 4537 3230 3741 3843 3645 3230 3043
00016d0 4444 4537 3230 3645 3038 3832 3231 4444
00016e0 4536 3030 4444 3636 3130 3137 3332 4444
00016f0 3537 3030 4444 3437 3130 3936 3632 3030
0001700 3943 4444 3545 4443 3141 4539 4444 3145
0001710 3833 3630 3543 4443 4532 3439 3145 3943
0001720 4444 4536 3030 4444 3636 3130 3545 3543
0001730 4443 4442 4539 3143 3143 3943 3144 4444
0001740 3145 4444 3545 3544 3132 3030 3030 4444
0001750 4537 3230 3645 3031 3733 3843 4232 4444
0001760 4537 3230 3645 3230 3741 3043 3332 3332
0001770 3741 3943 3943 4537 3332 3636 4636 3943
0001780 4535 3332 3635 3332 4537 3332 3636 4636
0001790 4245 3943 3131 3030 3030 4243 4337 3843
00017a0 4231 3943 4444 3145 3143 3930 4245 3143
00017b0 4445 4134 4245 4444 3945 4137 3342 3442
00017c0 3542 3832 3634 3146 3545 3944 3144 3143
00017d0 3132 3030 3030 3944 3143 3132 3030 3030
00017e0 3546 4533 3032 3742 3944 4243 3131 4243
00017f0 3031 3944 4243 3131 4243 3031 3944 4445
0001800 4136 3944 4445 4136 3944 4445 3235 3944
0001810 4445 3235 3033 3530 3944 3931 3944 4445
0001820 4135 4633 4433 3243 3746 4539 3944 4243
0001830 3131 4243 3031 3944 4243 3131 4243 3031
0001840 3545 3944 3144 3543 3944 3145 3935 3035
0001850 3943 3944 3143 3145 3144 3543 3944 3943
0001860 4443 3933 4639 3844 4232 3943 3143 3944
0001870 3143 3145 3144 3543 4437 3944 3543 3539
0001880 4636 3944 4337 3944 4339 3736 3944 4237
0001890 3944 4239 4635 3944 4137 3944 4139 3735
00018a0 4243 4137 3832 3930 4337 3542 3242 3342
00018b0 3132 3130 3030 3733 3943 4337 3542 3242
00018c0 3342 3733 4633 3132 3130 3030 3943 4437
00018d0 4632 4636 4337 4632 3736 4237 4632 4635
00018e0 4137 4632 3735 4332 3043 3432 3043 3331
00018f0 3943 4437 3231 3331 4337 3231 3943 4437
0001900 3230 3330 4337 3230 3330 4237 3230 3330
0001910 4137 3230 3943 3543 4443 4542 4639 3932
0001920 3545 3132 3830 3030 3933 3144 3931 3130
0001930 4346 4646 3930 3143 3545 3132 3342 3339
0001940 3545 3143 3145 3545 3543 4535 3332 3635
0001950 3544 3132 3430 3030 3933 4443 4542 4539
0001960 4232 4232 3545 4443 3744 3339 3143 3143
0001970 3143 3143 3943 3343 3143 4639 4636 3730
0001980 4639 3736 3943 d43f 303f 3030 3f30 fbd4
0001990 00a1
0001991


eek eek eek eek eek eek eek eek


Un peu gros hein pour un hello world wink

Thibault
Posté le 28/02/2011 à 09:42 Membre depuis le 15/03/2005, 3470 messages
S'il utilise sa propre police d'écriture ça fait ça de plus dans le code source. Puis le fait qu'il manque sûrement beaucoup de fonctions ne facilite pas son utilisation (rien qu'afficher un sprite ça doit être super chiant, scanner le clavier, etc...).

Enfin je ne demande qu'à ce qu'on me prouve le contraire smile
Posté le 28/02/2011 à 10:26 Membre depuis le 11/04/2007, 1076 messages
Ah quand même!
N'empêche, faire du C sur TI, si c'était un minimum efficace, ce serait vraiment le pied

Y'a moyen de traduire le C en Axe? Je crois qu'il utilise des notions assez proches...
Posté le 01/03/2011 à 09:07 Membre depuis le 02/02/2009, 672 messages
gon33 (./6) :
Y'a moyen de traduire le C en Axe? Je crois qu'il utilise des notions assez proches...


Je ne pense pas...

Pour la taille des binaires, les développeurs m'ont invoqué 2 raisons :
- Les définitions très lourdes des fonctions <stdio.h> par exemple dans mon programme j'utilise printf().
- La police de caractère qui est embarquée dans le binaire (la police n'est pas celle native de la ti83).

Il y a quand même des trucs sympa dans ce compilateur, comme une librairie de niveau de gris (qui bouffe les piles de la calto selon les auteurs) et des librairies de sprite (pas forcement destinées à la TI et des routines d'affichage (pixel, carré, cercle etc...)

Voici ce qu'on peut obtenir avec le code exemple :
tromb Fichier joint : Kmv0 (gifencod.gif)

Plutôt sympa wink

Thibault
Posté le 29/03/2011 à 16:37 Membre depuis le 02/02/2009, 672 messages
Pour essayer de résoudre le problème de place j'ai essayé d'utiliser +ti83 au lieu de +ti83ansi (qui utilisait sa propre police je rappelle) et d'utiliser puts à la place de printf.

#include <stdio.h>


main() {

	puts("hello world\n\n\n\n");
	while (1) {
		// ne finit jamais
	}


}


Avec un makefile :
all:
	zcc +ti83 -lm -startup=10 -o hello hello.c 
	bin2bin83 hello
	bin2var output.bin OUTTIOS.83p

clean:
	rm *.83p


Ce qui donne :
tromb Fichier joint : 3b9u (screenshot003.png)
(on voit bien que ce n'est pas la police ANSI)

Et on gagne pas mal de place :

0000000 2a2a 4954 3338 2a2a 0a1a 4300 6572 7461
0000010 6465 7720 7469 2068 6942 326e 6156 2072
0000020 3176 312e 0030 0000 0000 0000 0000 0000
0000030 0000 0000 0e00 0b04 ff00 0603 554f 5454
0000040 4f49 0053 03ff 03fd 4443 3539 3734 3132
0000050 3030 3030 3933 3232 4539 3339 3132 4146
0000060 4646 3933 3946 4445 3337 3944 3339 3132
0000070 4330 3030 3545 4443 3932 3439 3145 4443
0000080 4435 3734 4445 3635 4446 4243 3930 3642
0000090 4533 3638 4445 3734 3130 3030 3130 3736
00000a0 3936 3735 3835 4333 3737 4445 3042 4636
00000b0 3633 3343 3332 3633 3836 3332 3633 3339
00000c0 3332 3633 3030 3831 3033 3546 4133 4138
00000d0 3738 4243 4637 3032 3232 3545 3544 3543
00000e0 4446 3545 4446 3132 3736 3538 3132 4138
00000f0 3738 4243 4546 3944 3830 4646 3346 3346
0000100 3830 3944 3132 4138 3738 4243 4542 4446
0000110 3145 3143 3144 3145 3146 4246 3943 3146
0000120 3830 3944 3143 3831 3645 4445 4535 4443
0000130 4430 3439 3133 3030 3030 4446 3132 3736
0000140 3538 4443 4435 3734 4446 4243 3930 3641
0000150 4445 3635 4246 3943 3030 3030 3331 3030
0000160 3030 3030 3531 3030 3030 3030 3531 3030
0000170 3030 3030 3030 3030 3030 3030 3030 3030
00001b0 3030 3030 3030 3030 3030 3932 4538 3030
00001c0 3030 3346 4533 3038 3344 3031 3132 4331
00001d0 3139 4533 3032 4634 3332 4232 3630 3034
00001e0 4330 3131 3130 4446 3344 3031 3931 3131
00001f0 4130 3030 3931 3332 3332 3331 4537 3344
0000200 3131 4231 3031 3646 3937 4546 4332 3032
0000210 3545 3943 3132 3931 3439 3545 4443 4237
0000220 3439 3143 3343 3531 3439 3943 3836 3536
0000230 4336 4336 4636 3032 3737 4636 3237 4336
0000240 3436 4430 4430 4430 4430 3030 3132 3230
0000250 3030 3933 4537 4546 4330 3032 3231 3630
0000260 3830 3543 4443 3837 3439 3143 3031 3946
0000270 4533 3030 3233 4430 3038 3233 4330 3038
0000280 3943 4546 4430 3832 3430 4546 4130 3032
0000290 3131 4533 3030 3233 4430 3038 4133 4330
00002a0 3038 4546 3730 3832 3032 4333 3233 4330
00002b0 3038 3943 3546 4133 4430 3038 4546 4630
00002c0 3032 4630 4133 4330 3038 4546 3730 3032
00002d0 3830 4443 3837 3439 4533 3030 3233 4430
00002e0 3038 3146 3343 3530 3734 3343 4433 3734
00002f0 3143 3145 3545 3543 3545 3132 3342 3339
0000300 3545 4443 4446 3439 3143 3143 3132 4430
0000310 3030 3545 3132 3342 3339 3545 4443 3739
0000320 3439 3143 3143 3943 3144 4444 3145 3143
0000330 3543 4444 3545 3544 3132 4646 4646 4444
0000340 4537 3230 3741 3843 3645 3230 3043 4444
0000350 4537 3230 3645 3038 3832 3231 4444 4536
0000360 3030 4444 3636 3130 3137 3332 4444 3537
0000370 3030 4444 3437 3130 3936 3632 3030 3943
0000380 4444 3545 4443 3045 3439 4444 3145 3833
0000390 3630 3543 4443 3932 3439 3145 3943 4444
00003a0 4536 3030 4444 3636 3130 3545 3543 4443
00003b0 4346 3439 3143 3143 3943 3144 4444 3145
00003c0 4444 3545 3544 3132 3030 3030 4444 4537
00003d0 3230 3645 3031 3733 3843 4232 4444 4537
00003e0 3230 3645 3230 3741 3043 3332 3332 3741
00003f0 3943 3943 3145 4444 3145 3144 3544 4444
0000400 3545 3545 3132 3130 3030 4131 3741 3843
0000410 4636 3632 3030 3331 3544 3545 4444 3545
0000420 4443 3739 3439 4444 3145 3143 3144 4437
0000430 3441 4333 3843 3831 3545 3943 d43f 303f
0000440 3030 3f30 e0d4 00e7                    
0000447


C'est mieux que la version avec puts mais avec la lib ansi :

0000000 2a2a 4954 3338 2a2a 0a1a 4300 6572 7461
0000010 6465 7720 7469 2068 6942 326e 6156 2072
0000020 3176 312e 0030 0000 0000 0000 0000 0000
0000030 0000 0000 8800 0b12 7900 0612 554f 4154
0000040 534e 0049 1279 1277 4443 3539 3734 3132
0000050 3030 3030 3933 3232 4539 3339 3132 4146
0000060 4646 3933 3946 4445 3337 3944 3339 3132
0000070 4330 3030 3545 4443 3932 3439 3145 4443
0000080 4435 3734 4445 3635 4446 4243 3930 3642
0000090 4533 3638 4445 3734 3130 3030 3130 3736
00000a0 3936 3735 3835 4333 3737 4445 3042 4636
00000b0 3633 3343 3332 3633 3836 3332 3633 3339
00000c0 3332 3633 3030 3831 3033 3546 4133 4138
00000d0 3738 4243 4637 3032 3232 3545 3544 3543
00000e0 4446 3545 4446 3132 3736 3538 3132 4138
00000f0 3738 4243 4546 3944 3830 4646 3346 3346
0000100 3830 3944 3132 4138 3738 4243 4542 4446
0000110 3145 3143 3144 3145 3146 4246 3943 3146
0000120 3830 3944 3143 3831 3645 4445 4535 4443
0000130 4430 3439 3133 3030 3030 4446 3132 3736
0000140 3538 4443 4435 3734 4446 4243 3930 3641
0000150 4445 3635 4246 3943 3030 3030 3331 3030
0000160 3030 3030 3531 3030 3030 3030 3531 3030
0000170 3030 3030 3030 3030 3030 3030 3030 3030
*
00001b0 3030 3030 3030 3030 3030 3932 4538 3030
00001c0 3030 3346 4533 3038 3344 3031 3132 4331
00001d0 3139 4533 3032 4634 3332 4232 3630 3034
00001e0 4330 3131 3130 4446 3344 3031 3931 3131
00001f0 4130 3030 3931 3332 3332 3331 4537 3344
0000200 3131 4231 3031 3646 3937 4546 4332 3032
0000210 3545 3943 3132 3931 3439 3545 4443 3842
0000220 4239 3143 3343 3531 3439 3943 3836 3536
0000230 4336 4336 4636 3032 3737 4636 3237 4336
0000240 3436 4430 4430 4430 4430 3030 3132 3230
0000250 3030 3933 3131 3130 3030 3343 3633 3439
0000260 3943 3030 3030 4137 3342 3843 4445 4234
0000270 4643 3439 3837 3142 3243 3930 3539 4537
0000280 3332 4231 4546 4231 4143 4431 3539 4546
0000290 4239 4143 3233 3539 4546 4330 3032 3031
00002a0 3545 3544 4443 4132 4239 4641 3233 3533
00002b0 3439 3233 3433 3439 3144 3145 3831 3636
00002c0 4546 4430 3832 3430 4546 4130 3032 3930
00002d0 3545 3544 4443 3535 4239 3144 3145 3831
00002e0 3535 4546 3930 3032 4131 3545 3544 4133
00002f0 3433 3439 4631 4631 4333 3731 3731 3545
0000300 3132 3146 3839 4542 3145 3246 4538 3439
0000310 3233 3433 3439 3144 3145 3831 3733 4546
0000320 3730 3032 3930 3545 3544 4443 3046 3839
0000330 3144 3145 3831 4132 4546 3830 3032 4631
0000340 4133 3433 3439 3741 3832 3630 4433 3233
0000350 3433 3439 3831 4131 4133 3533 3439 3741
0000360 3832 3431 4433 3233 3533 3439 4133 3146
0000370 3839 4433 3233 3433 3439 3831 3730 3545
0000380 3544 4443 3541 4239 3144 3145 4137 3342
0000390 3243 3933 3439 3943 3030 3030 3030 3030
00003a0 3030 3030 3030 3030 3030 3030 3030 3030
*
00003f0 3030 3030 3030 3030 3130 3030 3030 4445
0000400 3334 4643 3439 3343 3943 3439 4445 4234
0000410 4643 3439 3543 4445 4234 3144 3439 3943
0000420 3130 3030 3030 4445 3334 4643 3439 3343
0000430 3243 3439 4137 3342 3032 4130 3130 4232
0000440 3539 4445 3334 4643 3439 3343 4543 3439
0000450 4537 3332 4231 4546 4235 3032 3145 3130
0000460 3544 3439 4641 3230 4230 3233 3344 3439
0000470 4137 3342 3032 4530 4445 3334 3144 3439
0000480 3130 4434 3539 4445 3334 4643 3439 3343
0000490 4543 3439 4537 3332 4231 4546 4433 3832
00004a0 3430 4546 4633 3032 3831 3233 3344 3439
00004b0 4137 3342 3032 4530 4445 3334 3144 3439
00004c0 3130 4436 3539 4445 3334 4643 3439 3343
00004d0 4543 3439 4537 3332 4231 4546 3033 4146
00004e0 4539 3539 4546 4133 3246 4539 3539 3545
00004f0 3036 3936 3543 3130 4446 3439 4445 3234
0000500 3143 3145 3033 3130 3330 3644 3033 3230
0000510 4137 3342 3243 4232 3639 4445 3334 3144
0000520 3439 3130 4232 3639 4445 3334 4643 3439
0000530 3343 4543 3439 4546 3232 3832 3530 4546
0000540 4335 3243 4342 3539 3233 3444 3439 4137
0000550 3342 3032 3533 4445 3334 3144 3439 3130
0000560 3345 3539 4445 3334 4643 3439 3343 4543
0000570 3439 4546 4233 3243 4635 3639 3545 3036
0000580 3936 3543 3130 4446 3439 4445 3234 3143
0000590 3145 3033 3130 3330 4641 3230 4137 3342
00005a0 3032 3839 4445 3334 3144 3439 3130 4436
00005b0 3539 4445 3334 4643 3439 3343 4543 3439
00005c0 4537 3332 4231 3545 3132 3444 3439 4542
00005d0 3145 3832 3132 3545 3036 3936 3543 3130
00005e0 4446 3439 4445 3234 3143 3145 3033 3130
00005f0 3330 3230 4137 3342 3032 3245 4445 3334
0000600 3144 3439 3130 3345 3539 4445 3334 4643
0000610 3439 3343 4543 3439 4137 3342 3032 4530
0000620 4445 3334 3144 3439 3130 3132 3639 4445
0000630 3334 4643 3439 3343 4543 3439 4537 3332
0000640 4231 4546 4233 3243 3037 3539 3831 3641
0000650 4537 3332 4231 4546 3033 4146 4135 3639
0000660 4546 4133 3246 4135 3639 3644 3033 3543
0000670 3546 4130 4634 3630 3930 3138 3031 4446
0000680 4634 3146 3138 3143 3230 4137 3342 3032
0000690 4644 4445 3334 3144 3439 3130 4232 3639
00006a0 4445 3334 4643 3439 3343 4543 3439 4546
00006b0 4233 4143 3144 3539 3545 3544 3036 3936
00006c0 3130 3544 3439 4230 3733 4633 4445 3234
00006d0 3534 3430 3530 3032 3830 3546 3132 3544
00006e0 3439 4533 3130 3737 3146 4546 4436 3243
00006f0 3739 3639 3430 3530 3032 3730 3132 3544
0000700 3439 4533 3030 3737 3430 3132 3544 3439
0000710 4537 4443 3442 3839 3332 3530 3243 4238
0000720 3639 3343 4641 3839 4546 3334 3032 3432
0000730 3132 3544 3439 4133 3433 3439 3638 3543
0000740 3546 4133 3146 3839 3734 3146 3430 3842
0000750 3143 3246 3542 3639 3233 3433 3439 3343
0000760 4641 3839 4133 3146 3839 4433 3233 3433
0000770 3439 3343 4641 3839 4546 3434 3032 3131
0000780 3132 3544 3439 4133 3433 3439 3639 3244
0000790 4543 3639 4641 3233 3433 3439 3343 4641
00007a0 3839 4546 3134 3032 3131 3132 3544 3439
00007b0 4133 3533 3439 3639 3246 3345 3639 4641
00007c0 3233 3533 3439 3343 4641 3839 4546 3234
00007d0 3032 3931 3132 3544 3439 4133 3533 3439
00007e0 3638 4333 3132 3246 3839 4542 3246 4646
00007f0 3639 4133 3246 3839 4433 3233 3533 3439
0000800 3343 4641 3839 4546 3337 3832 3430 4546
0000810 4136 3032 3131 4133 3433 3439 3233 4431
0000820 3739 4133 3533 3439 3233 4531 3739 3343
0000830 4641 3839 3030 3030 4546 3537 3832 3430
0000840 4546 4236 3032 4630 4133 4431 3739 3233
0000850 3433 3439 4133 4531 3739 3233 3533 3439
0000860 3343 4641 3839 4546 3636 3832 3430 4546
0000870 3834 3032 4333 3430 3530 3032 3830 3132
0000880 3544 3439 4533 3130 3737 3332 3737 3530
0000890 3032 3730 3132 3544 3439 3332 4533 3130
00008a0 3737 3132 3544 3439 4537 3545 3132 3246
00008b0 3839 4542 3145 4146 3536 3739 4133 3246
00008c0 3839 4433 3233 3533 3439 3332 4537 4433
00008d0 3132 3146 3839 4542 4146 3437 3739 4537
00008e0 4433 3233 3433 3439 3343 4641 3839 4546
00008f0 3236 3832 4334 4546 4134 3243 3231 3839
0000900 3430 3530 3032 3630 3132 3544 3439 4533
0000910 3030 3737 3132 3544 3439 4537 3741 3032
0000920 3233 4133 3533 3439 3546 4133 3433 3439
0000930 3546 3546 4533 3032 4443 3346 3839 3146
0000940 4333 3233 3433 3439 3132 3146 3839 4542
0000950 4146 4339 3739 3146 3233 3433 3439 3146
0000960 3233 3533 3439 4333 4333 3132 3246 3839
0000970 4542 4143 4641 3839 3546 4443 4133 4239
0000980 3146 3831 3046 4546 3130 3032 3233 4133
0000990 3533 3439 3546 4133 3433 3439 3546 3546
00009a0 4533 3032 4443 3346 3839 3146 4433 3233
00009b0 3433 3439 4546 3030 3246 3244 3739 3146
00009c0 3233 3433 3439 3146 3233 3533 3439 3741
00009d0 4143 4641 3839 4433 3546 4443 4133 4239
00009e0 3146 4546 3030 3246 4545 3739 3343 4641
00009f0 3839 4546 3230 3243 4641 3839 3543 3544
0000a00 4443 4132 4239 3144 3143 4641 3233 3533
0000a10 3439 3233 3433 3439 3343 4641 3839 4546
0000a20 4636 3832 3433 4546 4234 3243 3337 3839
0000a30 3430 3530 3032 3630 3132 3544 3439 4533
0000a40 3030 3737 3132 3544 3439 4537 3741 3032
0000a50 4131 4133 3433 3439 3546 3546 4533 3032
0000a60 4443 3346 3839 3146 4333 3233 3433 3439
0000a70 3132 3146 3839 4542 4146 3033 3839 3146
0000a80 3233 3433 3439 4546 3130 3032 4231 4133
0000a90 3433 3439 3546 3546 4533 3032 4443 3346
0000aa0 3839 3146 4433 3233 3433 3439 4546 3030
0000ab0 3246 4534 3839 3146 3233 3433 3439 3343
0000ac0 4641 3839 4546 3230 3243 4641 3839 4133
0000ad0 3533 3439 4443 4133 4239 3343 4641 3839
0000ae0 4546 4336 3032 3930 4133 3533 3439 4443
0000af0 4133 4239 3343 4641 3839 4546 4536 3243
0000b00 3939 3839 3430 3530 4143 4641 3839 3132
0000b10 3544 3439 4537 4546 3630 4143 4641 3839
0000b20 4443 3435 4239 3343 4641 3839 4546 4334
0000b30 3032 4130 3132 3544 3439 3634 4133 3533
0000b40 3439 3343 4641 3839 4546 4434 3032 3430
0000b50 3132 3544 3439 4537 3144 3145 3343 4646
0000b60 3439 4546 3430 3032 3630 4533 3032 3233
0000b70 4637 3939 3943 4546 3831 3032 3630 4533
0000b80 3831 3233 4637 3939 3943 4546 3530 3032
0000b90 3630 4533 3032 3233 4637 3939 3943 4546
0000ba0 3931 3032 3630 4533 3831 3233 4637 3939
0000bb0 3943 4546 3730 3032 3630 4533 4632 3233
0000bc0 4437 3939 3943 4546 4231 3032 3530 4641
0000bd0 3233 4437 3939 3943 3943 3943 3032 3830
0000be0 3233 3534 3939 4132 3045 3339 4133 3533
0000bf0 3439 3741 3832 4130 3738 3738 3738 3734
0000c00 3131 4330 3030 3931 3031 4446 3232 4533
0000c10 3939 3132 3538 3939 3634 3132 3030 3030
0000c20 4133 3433 3439 4635 3631 3030 3242 3832
0000c30 3231 3931 3031 4446 3630 3330 4243 4333
0000c40 4243 4431 4631 3031 3946 3630 3530 4243
0000c50 4633 3031 4346 3233 4635 3939 4635 4133
0000c60 3538 3939 3338 4635 4533 3031 3339 3233
0000c70 3239 3939 3131 3030 3030 3931 3545 4444
0000c80 3145 3630 3134 4641 4243 3831 3833 3230
0000c90 4533 3430 3233 3837 3939 3132 4132 3939
0000ca0 3131 3830 3030 3931 3031 4446 3131 4330
0000cb0 3030 4530 3830 3630 3430 4444 4243 3130
0000cc0 3631 4444 4243 3030 3631 3430 3530 3832
0000cd0 4130 4444 4243 3130 3631 4444 4243 3030
0000ce0 3631 3031 3646 4537 3831 3430 3731 3731
0000cf0 3731 3731 3030 4430 3831 3230 4533 4646
0000d00 4330 3630 3330 3731 4444 4243 3130 3631
0000d10 4444 4243 3030 3631 3031 3546 3630 3630
0000d20 3430 3530 3832 4130 4444 4243 3130 3631
0000d30 4444 4243 3030 3631 3031 3646 4444 3931
0000d40 3332 4430 3032 3742 3343 3445 3339 3430
0000d50 3430 3430 3430 3430 3030 3430 3030 3530
0000d60 3541 4641 3530 4630 3530 3530 3030 3034
0000d70 4136 3238 3434 3432 3843 4134 3030 3030
0000d80 3434 3841 3034 3041 3038 3045 3030 3834
0000d90 3438 3438 3438 3438 3438 3834 3030 3030
0000da0 3441 3434 4545 3434 3441 3030 3030 3030
0000db0 3030 3030 4530 3030 3034 3034 3038 3030
0000dc0 3230 3230 3430 3430 3830 3834 3030 3434
0000dd0 4341 3441 3441 3441 3441 4534 3030 3434
0000de0 4141 3232 3434 3234 4141 3445 3030 4532
0000df0 3836 4336 3241 3245 4132 3432 3030 4536
0000e00 3238 3238 3443 3441 3841 3834 3030 3434
0000e10 4141 4141 3634 3241 3241 4334 3030 3030
0000e20 3030 3434 3030 3030 3434 3430 3830 3030
0000e30 3032 4534 3038 4534 3032 3030 3030 3430
0000e40 4138 3234 3432 3434 3038 3430 3030 3436
0000e50 4139 4139 4142 4542 4138 4136 3030 3443
0000e60 4141 3841 3843 3841 4141 3443 3030 4543
0000e70 3841 3841 4341 3841 3841 4543 3030 3445
0000e80 4138 3838 3843 4138 4138 3638 3030 4541
0000e90 3441 3441 3445 3441 3441 4541 3030 4136
0000ea0 4132 4332 4332 4141 4141 4134 3030 4138
0000eb0 4538 4538 4138 4138 4138 4145 3030 3443
0000ec0 4141 4141 4141 4141 4141 3441 3030 3443
0000ed0 4141 4141 4143 4538 4338 3238 3030 3443
0000ee0 4141 3841 3443 3241 4141 3441 3030 4145
0000ef0 4134 4134 4134 4134 4134 4534 3030 4141
0000f00 4141 4141 4141 4541 4534 4134 3030 4141
0000f10 4141 4141 3434 3441 3441 3441 3030 3645
0000f20 3432 3432 3434 3438 3438 3645 3030 3638
0000f30 3238 3234 3234 3234 3232 3632 3030 3030
0000f40 3034 3041 3030 3030 3030 3030 4630 3030
0000f50 3038 4334 3230 4530 4130 4430 3030 3038
0000f60 3038 3438 4143 3841 4141 3443 3030 3032
0000f70 3032 3432 4136 4541 3841 3636 3030 3032
0000f80 3034 3634 4145 4134 3634 3245 4330 3438
0000f90 3038 3438 3443 3441 3441 3441 3030 3832
0000fa0 3830 4132 4132 4332 4132 4141 3034 3043
0000fb0 3034 4134 4534 4534 4134 4145 3030 3030
0000fc0 3030 3443 4141 4141 4141 3441 3030 3030
0000fd0 3030 3643 4141 4141 3643 3238 3238 3030
0000fe0 3030 3643 3841 3438 3238 4338 3030 3034
0000ff0 3034 4145 4134 4134 4134 3636 3030 3030
0001000 3030 4141 4541 4541 4541 3434 3030 3030
0001010 3030 4141 4141 4134 3641 3241 4330 3230
0001020 3430 3445 4332 3434 3438 3245 3030 3834
0001030 3434 3434 3630 3434 3434 3834 3030 3035
0001040 3441 3430 4130 4130 4130 4530 3030 4132
0001050 3045 3339 3633 3030 3435 4435 3331 3130
0001060 3030 3330 4445 3042 3343 3445 3339 3131
0001070 3036 3030 3734 4132 3045 3339 3741 3832
0001080 3330 3931 3031 4446 3435 4435 3331 3633
0001090 3030 3130 3036 3030 4445 3042 3343 3445
00010a0 3339 3943 4641 3233 3433 3439 4133 3533
00010b0 3439 4333 3233 3533 3439 3132 3246 3839
00010c0 4542 3043 4133 3246 3839 4433 3233 3533
00010d0 3439 3343 4636 4239 4443 4441 3339 3132
00010e0 3838 4239 4533 4646 3344 3130 4537 3741
00010f0 3832 3546 3344 3130 4244 3130 4546 4646
0001100 3032 4230 3332 3831 4445 4546 4446 4246
0001110 3746 4645 4644 4642 3030 4443 4541 3339
0001120 3132 3036 3030 4445 4235 3045 3339 3931
0001130 3130 3041 3230 4445 3042 4533 3730 3343
0001140 4133 4239 4443 3346 3839 4133 3146 3839
0001150 3735 4133 3433 3439 4333 3233 3433 3439
0001160 4142 3043 3343 3535 4239 3143 3145 3545
0001170 3543 3545 3132 3342 3339 3545 4443 4133
0001180 4339 3143 3143 3132 4430 3030 3545 3132
0001190 3342 3339 3545 4443 3444 4239 3143 3143
00011a0 3943 3144 4444 3145 3143 3543 4444 3545
00011b0 3544 3132 4646 4646 4444 4537 3230 3741
00011c0 3843 3645 3230 3043 4444 4537 3230 3645
00011d0 3038 3832 3231 4444 4536 3030 4444 3636
00011e0 3130 3137 3332 4444 3537 3030 4444 3437
00011f0 3130 3936 3632 3030 3943 4444 3545 4443
0001200 4431 4339 4444 3145 3833 3630 3543 4443
0001210 3932 3439 3145 3943 4444 4536 3030 4444
0001220 3636 3130 3545 3543 4443 3933 4339 3143
0001230 3143 3943 3144 4444 3145 4444 3545 3544
0001240 3132 3030 3030 4444 4537 3230 3645 3031
0001250 3733 3843 4232 4444 4537 3230 3645 3230
0001260 3741 3043 3332 3332 3741 3943 3943 3145
0001270 4444 3145 3144 3544 4444 3545 3545 3132
0001280 3130 3030 4131 3741 3843 4636 3632 3030
0001290 3331 3544 3545 4444 3545 4443 3444 4239
00012a0 4444 3145 3143 3144 4437 3441 4333 3843
00012b0 3831 3545 3943 d43f 303f 3030 3f30 5ed4
00012c0 0019                                   
00012c1


Ce compilateur n'est décidemment pas "si horrible", mais du reste il manque cruellement de librairies de fonctions ti (en asm inline).


Posté le 28/05/2013 à 10:52 Membre depuis le 15/03/2005, 3470 messages
Call : Contra appelé(e) sur ce topic...


Tiens j'étais curieux de voir ce qu'on pouvait faire avec z88dk, alors j'ai programmé quelques trucs mais ça n'a pas l'air d'entièrement fonctionner : http://www.ti-84-plus.com/forum/index.php/topic,48.msg85.html#new ... :/

Autrement je suppose que comme pas mal de monde tu as assez peu de temps à consacrer à la prog, mais vas-tu reprendre le développement de ton site ? Parce que je le trouve pas mal, il faudrait juste ajouter quelques trucs (une protection anti-bots etc...) smile
Posté le 28/05/2013 à 14:23 Membre depuis le 02/02/2009, 672 messages
Je continue à bosser sur le site smile

Par exemple j'ai ajouté une page de screenshots : http://www.ti-84-plus.com/ti-84-plus-screenshots.php
Et puis une autre sur les émulateurs : http://www.ti-84-plus.com/ti-84-plus-emulators.php
Et puis aussi une grosse grosse faq : http://www.ti-84-plus.com/calculatorquestions/
Et puis aussi pas mal de trucs dans download comme par exemple les includes files : http://www.ti-84-plus.com/ti-84-plus-download-includes.php

Mais bon effectivement j'ai pas mal d'autres trucs à faire en ce moment.

Y a déjà une protection anti bots mais bon ça ne suffit pas. J'hésite même à dégager le forum si vraiment personne ne participe (mais pour l'instant je laisse comme ça grin)

C'est déjà pas mal ce que tu fais en C, je n'ai pas bien compris ce qui marche et ce qui marche pas...
Tu peux détailler ?

Comment tu compiles?
Posté le 28/05/2013 à 15:14 Membre depuis le 15/03/2005, 3470 messages
Ah ouais pas mal, j'avais même pas vu tout ça smile

Le forum est bien, il faudrait juste qu'il soit un peu plus pratique pour les programmeurs : la balise code ne fait pas la coloration syntaxique, si ?

Tu devrais faire une page avec des billets (news), pour que justement on ne rate pas tes mises à jour tongue

La mise en page de http://www.ti-84-plus.com/calculatorquestions/ est différente du reste du site (à moins que mon cache ne soit pas à jour, mais je crois que si) ? Parce qu'à la limite je préfère ce thème (hormis la bannière qui s'inclue pas trop dans le reste).

Autrement j'ai tenté d'expliquer un peu plus le problème : en gros la macro pour faire des bcalls ne marche pas.
Posté le 28/05/2013 à 22:44Edité par deeph le 29/05/2013 à 09:48 Membre depuis le 15/03/2005, 3470 messages
J'ai commencé à "porter" GBA lib 2 pour pouvoir l'utiliser en C :

LDb6
gbalib2.h
// -----------------------------------------------------------------------------
// -------------------------------| GBAlib v2.0 |-------------------------------
// ------------------------| published in January 2009 |------------------------
// ---------------------------| by Martin BOUSQUET |----------------------------
// ------------------------| martin.bousquet@hotmail.fr|------------------------
// ----------------------------| on www.ticalc.org |----------------------------
// -----------------------| C port by deeph in May 2013 |-----------------------
// -----------------------------------------------------------------------------

#define backBuffer	saferam1
#define frontBuffer	graph_mem
#define screenHeight	8
#define screenWidth	12
#define screenOffsetY	0
#define screenOffsetX	0
#define backOrigin	backBuffer+screenOffsetX+(12*screenOffsetY)
#define frontOrigin	frontBuffer+screenOffsetX+(12*screenOffsetY)
#define GBA_NOCLIP_SPRITE	0
#define GBA_CLIP_SPRITE	1

char gbaInitMap(unsigned char scrollX, unsigned char scrollY, unsigned char mapWidth, unsigned char mapHeight, unsigned char *tileAddr, unsigned char *mapAddr);
void gbaRestoreMap(void);
void gbaScrollRight(void);
void gbaScrollLeft(void);
void gbaScrollUp(void);
void gbaScrollDown(void);
char gbaDrawMaskSprite(unsigned char x, unsigned char y, unsigned char width, unsigned char height, unsigned char *sprite, unsigned char is_clipped);
char gbaDrawInvertedSprite(unsigned char x, unsigned char y, unsigned char width, unsigned char height, unsigned char *sprite, unsigned char is_clipped);
char gbaCollision(unsigned char x, unsigned char y);

#asm
mapAddr:
	defw 0

tileAddr:
	defw 0

mapHeight:
	defw 0

mapWidth:
	defw 0

scrollY:
	defw 0
	
scrollX:
	defw 0

offsetX:
	defb 0

offsetY:
	defb 0

offsetX2:
	defb 0

pixelMask:
	defb 0

saveByte:
	defb 0

saveByte2:
	defb 0

;-------------------------
; GBA HORIZONTAL SCROLLS |
;-------------------------

gbaScrollHorizontal:
	push de
	ld bc,(scrollX)
	add hl,bc
	ld de,(scrollY)
	ld a,(mapWidth)
	call hl_plus_axde
	pop de
	ld bc,gbaScrollHorizontal_next
	push bc
	push hl
	call findTile
	ld bc,(offsetY)
	ld b,0
	add hl,bc
	ld a,(offsetY)
	sub 8
	neg
	jr Col1xa_loop

gbaScrollHorizontal_next:
	ld b,7

gbaScrollHorizontal_loop:
	push bc
	ld a,8
	call Col1xa
	pop bc
	djnz gbaScrollHorizontal_loop
	ld a,(offsetY)
	or a
	ret z

Col1xa:
	push hl
	call findTile	;  de and a unchanged

Col1xa_loop:
	push af
	ld a,(offsetX)
	and (hl)
	ex de,hl
	jr z,Pixel_white
	ld a,(pixelMask)
	or (hl)
	ld (hl),a

Pixel_white:
	ld bc,12
	add hl,bc
	ex de,hl
	inc hl
	pop af
	dec a
	jr nz,Col1xa_loop
	pop hl
	ld bc,(mapWidth)
	add hl,bc
	ret

;-----------------------
; GBA VERTICAL SCROLLS |
;-----------------------

gbaScrollVertical:
	push de
	ld de,(scrollX)
	add hl,de
	ld a,(mapWidth)
	ld de,(scrollY)
	call hl_plus_axde
	pop de
	ld b,screenWidth+1

gbaScrollVertical_loop:
	push bc
	push hl
	call findTile
	ld bc,(offsetY)
	ld b,0
	add hl,bc
	ld a,(hl)
	ld (de),a
	inc de
	pop hl
	inc hl
	pop bc
	djnz gbaScrollVertical_loop
	dec de
	ex de,hl
	ld a,(offsetX2)
	or a
	ret z

gbaScrollVertical_loop2:	
	push hl
	sla (hl)
	dec hl
	rl (hl)
	dec hl
#if screenWidth > 1
	rl (hl)
	dec hl
#if screenWidth > 2
	rl (hl)
	dec hl
#if screenWidth > 3
	rl (hl)
	dec hl
#if screenWidth > 4
	rl (hl)
	dec hl
#if screenWidth > 5
	rl (hl)
	dec hl
#if screenWidth > 6
	rl (hl)
	dec hl
#if screenWidth > 7
	rl (hl)
	dec hl
#if screenWidth > 8
	rl (hl)
	dec hl
#if screenWidth > 9
	rl (hl)
	dec hl
#if screenWidth > 10
	rl (hl)
	dec hl
#if screenWidth > 11
	rl (hl)
	dec hl
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
	pop hl
	dec a
	jr nz,gbaScrollVertical_loop2
	ret

;-------------------------------------------------------------------------;
;----------------------| GBA SPRITE ROUTINES |----------------------------;
;-------------------------------------------------------------------------;

findTile:
	ld l,(hl)
	ld h,0
	ld bc,(tileAddr)
	add hl,hl
	add hl,hl
	add hl,hl
	add hl,bc
	ret

findPixel:
	ld hl,frontOrigin
	ld a,b
	and @111
	srl b
	srl b
	srl b
	ld d,0
	ld e,b
	add hl,de
	ld e,c
	ex de,hl
	add hl,hl
	add hl,hl
	ld b,h
	ld c,l
	add hl,hl
	add hl,bc
	add hl,de
	ret

gbaClipSprite:
	ld a,127
	cp b
	ret c
	ld a,screenWidth
	sub d
	add a,a
	add a,a
	add a,a
	sub b
	ret c
	ld a,c
	bit 7,a
	jr z,gbaClipSprite_next
	neg
	cp e
	ccf
	ret c
	add a,a
	push de
	ld e,d
	ld d,0
	call hl_plus_axde
	pop de
	or a
	ret

gbaClipSprite_next:
	ld a,screenHeight
	add a,a
	add a,a
	add a,a
	dec a
	sub c
	ret c
	inc a
	cp e
	ret nc
	ld e,a
	or a
	ret

;-------------------------------------------------------------------------;
;---------------------| GBA USEFUL ROUTINES |-----------------------------;
;-------------------------------------------------------------------------;

hl_plus_axde:
	ld b,8

hlplusaxde_loop:
	srl a
	jr nc,hlplusaxde_next
	add hl,de

hlplusaxde_next:
	sla e	; multiply de with 2
	rl d
	djnz hlplusaxde_loop
	ret

;-------------------------------------------------------------------------;
;------------------------| OTHER ROUTINES |-------------------------------;
;-------------------------------------------------------------------------;

return_false:
	ld hl,0
	ret

return_true:
	ld hl,1
	ret

gbaGetSpriteParameters:
	ld a,(hl)
	push af
	inc hl
	inc hl
	push hl
	inc hl
	inc hl
	ld e,(hl)
	inc hl
	inc hl
	ld d,(hl)
	inc hl
	inc hl
	ld c,(hl)
	inc hl
	inc hl
	ld b,(hl)
	pop hl
	ld a,(hl)
	inc hl
	ld h,(hl)
	ld l,a
	pop af
	or a
	call nz,gbaClipSprite
	ret
#endasm

char gbaInitMap(unsigned char scrollX, unsigned char scrollY, unsigned char mapWidth, unsigned char mapHeight, unsigned char *tileAddr, unsigned char *mapAddr){
#asm
	ld hl,2
	add hl,sp	; skip over return address on stack
	push hl
	ld de,mapAddr
	ld bc,12
	ldir
	pop hl
	ld a,(hl)
	inc hl
	ld h,(hl)
	ld l,a	; hl = *mapAddr

gbaInitMap:
	ld de,(scrollX)
	add hl,de
	ld de,(scrollY)
	ld a,(mapWidth)
	call hl_plus_axde
	ld (offsetX2),a
	ld (offsetY),a
	ld (offsetX),a
	set 7,a
	ld (offsetX),a
	ld de,backOrigin
	ld b,screenWidth

gbaInitMap_row:
	ld c,screenHeight
	push de
	push hl

gbaInitMap_col:
	push bc
	push hl
	call findTile
	ld a,8

draw8x8:
	ld b,(hl)
	inc hl
	ex de,hl
	ld (hl),b
	ld bc,12
	add hl,bc
	ex de,hl
	dec a
	jr nz,draw8x8
	pop hl
	ld bc,(mapWidth)
	add hl,bc
	pop bc
	dec c
	jr nz,gbaInitMap_col
	pop hl
	inc hl
	pop de
	inc de
	djnz gbaInitMap_row
#endasm
}

void gbaRestoreMap(void){
#asm
gbaRestoreMap:
	ld hl,backOrigin
	ld de,frontOrigin
#if screenWidth == 12
	ld bc,screenWidth*8*screenHeight
	ldir
#else
	ld b,8*screenHeight	
gbaRestoreMap_loop:
	push bc
#if screenWidth < 7
	push de
	push hl
	ld bc,screenWidth
	ldir
	ld bc,12
	pop hl
	add hl,bc
	ex de,hl
	pop add hl,bc
	ex de,hl
#else
	ld bc,screenWidth
	ldir
	inc hl
	inc de
#if screenWidth < 11
	inc hl
	inc de
#elif screenWidth < 10
	inc hl
	inc de
#elif screenWidth < 9
	inc hl
	inc de
#elif screenWidth < 8
	inc hl
	inc de
#endif
	pop bc
	djnz gbaRestoreMap_loop	
#endif
#endif
#endasm
}

void gbaScrollRight(void){
#asm
gbaScrollRight:
	ld a,(mapWidth)
	ld hl,scrollX
	sub (hl)
	cp screenWidth+1
	jp c,return_false
	ld hl,backOrigin+screenWidth-1
	ld b,8*screenHeight

gbaScrollRight_loop:
	sla (hl)
	dec hl
#if screenWidth > 1
	rl (hl)
	dec hl
#if screenWidth > 2
	rl (hl)
	dec hl
#if screenWidth > 3
	rl (hl)
	dec hl
#if screenWidth > 4
	rl (hl)
	dec hl
#if screenWidth > 5
	rl (hl)
	dec hl
#if screenWidth > 6
	rl (hl)
	dec hl
#if screenWidth > 7
	rl (hl)
	dec hl
#if screenWidth > 8
	rl (hl)
	dec hl
#if screenWidth > 9
	rl (hl)
	dec hl
#if screenWidth > 10
	rl (hl)
	dec hl
#if screenWidth > 11
	rl (hl)
	dec hl
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
	ld de,screenWidth+12
	add hl,de
	djnz gbaScrollRight_loop
	ld a,@00000001
	ld (pixelMask),a
	ld de,backOrigin+screenWidth-1
	ld hl,(mapAddr)
	ld bc,screenWidth
	add hl,bc
	call gbaScrollHorizontal
	ld a,(offsetX2)
	inc a
	and @111
	ld (offsetX2),a
	ld a,(offsetX)
	srl a
	ld (offsetX),a
	ret nc
	ld a,@10000000
	ld (offsetX),a
	ld hl,scrollX
	inc (hl)
	or a
	ld hl,1
#endasm
}

void gbaScrollLeft(void){
#asm
gbaScrollLeft:
	ld a,(offsetX)
	cp @10000000
	jr nz,gbaScrollLeft_ok
	ld a,(scrollX)
	sub 1
	jp c,return_false

gbaScrollLeft_ok:
	ld a,(offsetX2)
	dec a
	and @111
	ld (offsetX2),a
	ld a,(offsetX)
	add a,a
	jr nc,gbaScrollLeft_next
	ld a,@00000001
	ld hl,scrollX
	dec (hl)

gbaScrollLeft_next:
	ld (offsetX),a
	ld hl,backOrigin
	ld b,8*screenHeight

gbaScrollLeft_loop:
	srl (hl)
	inc hl
#if screenWidth > 1
	rr (hl)
	inc hl
#if screenWidth > 2
	rr (hl)
	inc hl
#if screenWidth > 3
	rr (hl)
	inc hl
#if screenWidth > 4
	rr (hl)
	inc hl
#if screenWidth > 5
	rr (hl)
	inc hl
#if screenWidth > 6
	rr (hl)
	inc hl
#if screenWidth > 7
	rr (hl)
	inc hl
#if screenWidth > 8
	rr (hl)
	inc hl
#if screenWidth > 9
	rr (hl)
	inc hl
#if screenWidth > 10
	rr (hl)
	inc hl
#if screenWidth > 11
	rr (hl)
	inc hl
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#if screenWidth < 9
	ld de,12-screenWidth
	add hl,de
#else
#if screenWidth < 12
	inc hl
#if screenWidth < 11
	inc hl
#if screenWidth < 10
	inc hl
#endif
#endif
#endif
#endif
	djnz gbaScrollLeft_loop
	ld a,@10000000
	ld (pixelMask),a
	ld hl,(mapAddr)
	ld de,backOrigin
	call gbaScrollHorizontal
	or a
	ld hl,1
#endasm
}

void gbaScrollUp(void){
#asm
gbaScrollUp:
	ld a,(offsetY)
	or a
	jr nz,gbaScrollUp_ok
	ld a,(scrollY)
	sub 1
	jp c,return_false

gbaScrollUp_ok:
	ld a,(offsetY)
	dec a
	and @111
	ld (offsetY),a
	cp 7
	jr nz,gbaScrollUp_next
	ld hl,scrollY
	dec (hl)

gbaScrollUp_next:
	ld de,backOrigin+screenWidth-1+(12*(8*screenHeight-1))
	ld hl,backOrigin+screenWidth-1+(12*(8*screenHeight-2))
#if screenWidth == 12
	ld bc,8*screenHeight*screenWidth
	lddr
#else
	ld b,8*screenHeight

gbaScrollUp_loop:
	push bc
	ld bc,screenWidth
#if screenWidth < 7
	push hl
	push de
	lddr
	pop hl
	ld bc,-12
	add hl,bc
	ex de,hl
	pop hl
	add hl,bc
#else
	lddr
	dec hl
	dec de
#if screenWidth < 11
	dec hl
	dec de
#if screenWidth < 10
	dec hl
	dec de
#if screenWidth < 9
	dec hl
	dec de
#if screenWidth < 8
	dec hl
	dec de
#endif
#endif
#endif
#endif
#endif
	pop bc
	djnz gbaScrollUp_loop
#endif
	ld a,(backOrigin+screenWidth)
	ld (saveByte),a
	ld hl,(mapAddr)
	ld de,backOrigin
	call gbaScrollVertical
	ld a,(saveByte)
	ld (hl),a
	ld hl,1
#endasm
}

void gbaScrollDown(void){
#asm
gbaScrollDown:
	ld a,(mapHeight)
	ld hl,scrollY
	sub (hl)
	cp screenHeight+1
	jp c,return_false
	ld de,backOrigin
	ld hl,backOrigin+12
#if screenWidth == 12
	ld bc,8*screenWidth*screenHeight
	ldir
#else
	ld b,8*screenHeight

gbaScrollDown_loop:
	push bc
	ld bc,screenWidth
#if screenWidth < 8
	push hl
	push de
	ldir
	pop hl
	ld bc,12
	add hl,bc
	ex de,hl
	pop hl
	add hl,bc
#else
	ldir
	inc hl
	inc de
#if screenWidth < 11
	inc hl
	inc de
#if screenWidth < 10
	inc hl
	inc de
#if screenWidth < 9
	inc hl
	inc de
#endif
#endif
#endif
#endif
	pop bc
	djnz gbaScrollDown_loop
#endif
	ld a,(de)
	ld (saveByte2),a
	ld hl,-12
	add hl,de
	push hl
	ld hl,(mapAddr)
	ld de,(mapWidth)
	ld a,screenHeight
	call hl_plus_axde
	pop de
	call gbaScrollVertical
	ld a,(saveByte2)
	ld (hl),a
	ld a,(offsetY)
	inc a
	and @111
	ld (offsetY),a
	jp nz,return_true
	ld hl,scrollY
	inc (hl)
	or a
	ld hl,1
#endasm
}

char gbaDrawMaskSprite(unsigned char x, unsigned char y, unsigned char width, unsigned char height, unsigned char *sprite, unsigned char is_clipped){
#asm
	ld hl,2
	add hl,sp	; skip over return address on stack
	call gbaGetSpriteParameters
	jp c,return_false

gbaDrawMaskSprite:
	push hl
	push de
	call findPixel
	pop bc
	ex de,hl
	pop hl

gbaDrawMaskSprite_col:
	push bc
	push de

gbaDrawMaskSprite_row:
	push bc
	ld b,(hl)
	ld c,@11111111
	inc hl
	push hl
	push af
	push af
	ld a,(hl)

gbaInvertedOpcode:
	nop
	nop
	ld h,a
	ld l,0
	pop af
	or a
	jr z,gbaDrawMaskSprite_next

gbaDrawMaskSprite_shift:
	scf
	rr b
	rr c
	srl h
	rr l
	dec a
	jr nz,gbaDrawMaskSprite_shift

gbaDrawMaskSprite_next:
	ex de,hl
	ld a,(hl)
	and b
	or d
	ld (hl),a
	inc hl
	ld a,(hl)
	and c
	or e
	ld (hl),a
	ex de,hl
	pop af
	pop hl
	inc hl
	pop bc
	djnz gbaDrawMaskSprite_row
	ex de,hl
	pop hl
	ld bc,12
	add hl,bc
	ex de,hl
	pop bc
	dec c
	jr nz,gbaDrawMaskSprite_col
#endasm
}

char gbaDrawInvertedSprite(unsigned char x, unsigned char y, unsigned char width, unsigned char height, unsigned char *sprite, unsigned char is_clipped){
#asm
	ld hl,2
	add hl,sp	; skip over return address on stack
	call gbaGetSpriteParameters
	jp c,return_false

gbaDrawInvertedSprite:
	push hl
	ld hl,gbaInvertedOpcode
	ld (hl),$2f			; opcode for 'cpl'
	inc hl
	ld (hl),$a8			; opcode for 'xor b'
	pop hl
	call gbaDrawMaskSprite
	ld hl,gbaInvertedOpcode
	ld (hl),0
	inc hl
	ld (hl),0
#endasm
}

char gbaCollision(unsigned char x, unsigned char y){
#asm
	ld hl,2
	add hl,sp	; skip over return address on stack
	ld c,(hl)
	inc hl
	inc hl
	ld b,(hl)

gbaCollision:
	ld hl,(mapAddr)
	ld de,(scrollX)
	add hl,de
	ld a,(offsetX2)
	add a,b
	sra a
	sra a
	sra a
	ld e,a
	ld d,0
	bit 7,a
	jr z,gbaCollision_next
	dec d

gbaCollision_next:
	add hl,de
	ld a,(offsetY)
	add a,c
	sra a
	sra a
	sra a
	ld b,0
	ld c,a
	bit 7,a
	jr z,gbaCollision_next2
	dec b

gbaCollision_next2:
	ex de,hl
	ld hl,(scrollY)
	add hl,bc
	ex de,hl
	ld a,(mapWidth)
	call hl_plus_axde
	ld l,(hl)
	ld h,0
#endasm
}

#pragma string name C TEST

#include <..\dev\ti83p.h>
#include <..\dev\routines.h>
#include <..\dev\ion.h>
#include <..\dev\gbalib.h>

// #define bcall(romcall)	asm("rst rbr_call");
	// asm("defw romcall");

extern char map[];
#asm
._map
	defb 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,0,0
	defb 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,1,1,1
	defb 3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	defb 3,3,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1
	defb 3,3,0,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0
	defb 3,3,0,0,0,0,0,0,2,2,2,2,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0
	defb 3,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0
	defb 3,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,1,1,0,0,0,2
	defb 0,0,0,0,0,0,0,0,4,4,4,4,1,1,1,4,4,4,4,0,0,0,0,0,1,1,0,0,0,2,2
	defb 0,0,0,0,0,0,0,0,4,4,4,4,1,5,1,1,1,1,1,1,1,1,1,1,1,0,0,0,2,2,2
	defb 3,3,0,0,0,0,0,0,4,4,4,4,1,1,1,4,4,4,4,0,0,0,0,0,0,0,0,0,2,2,2
	defb 3,3,3,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,2,2,2,2
	defb 3,3,3,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,2,2,2,2,2
	defb 3,3,3,3,0,0,0,0,0,0,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,3
	defb 3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,0,0,0,0,0,0,2,3,3,3,3,3
	defb 3,3,3,3,3,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,0,0,0,3,3,3,3,3,3,3
#endasm

extern char tiles[];
#asm
._tiles
	defb @10000000		; tile #0 (field)
	defb @10000100
	defb @00010000
	defb @01000001
	defb @00000000
	defb @00100000
	defb @00000010
	defb @00000000
	defb @00000000		; tile #1 (road)
	defb @00000000
	defb @00000000
	defb @00000000
	defb @00000000
	defb @00000000
	defb @00000000
	defb @00000000
	defb @00010000		; tile #2 (forest)
	defb @00110000
	defb @00101000
	defb @01100000
	defb @01010100
	defb @11000000
	defb @11111110
	defb @00010000
	defb @00000000		; tile #3 (mountain)
	defb @00000000
	defb @00001000
	defb @00010100
	defb @00100110
	defb @01010010
	defb @11011001
	defb @10001000
	defb @11111010		; tile #4 (water)
	defb @11011111
	defb @10101101
	defb @11111010
	defb @11101111
	defb @11010111
	defb @11111111
	defb @11111101
	defb @11111111		; tile #5 (temple)
	defb @01011110
	defb @00101100
	defb @00101100
	defb @00101100
	defb @00101100
	defb @01111110
	defb @10011111
#endasm

char sprite[]={
	0xC3,0x3C,
	0x81,0x42,
	0x00,0xA5,
	0x00,0xA5,
	0x00,0x81,
	0x00,0xBD,
	0x81,0x42,
	0xC3,0x3C
};

int main(){
	char x=0, y=0;
	gbaInitMap(0, 0, 31, 16, tiles, map);
	gbaRestoreMap();
	ionFastCopy();
	while(1){
		switch(direct_input(key_group_1)){
			case key_up:
				if(gbaScrollUp()){
					gbaRestoreMap();
				}
				// y-=1;
				// gbaDrawMaskSprite(x, y, 1, 8, sprite, GBA_CLIP_SPRITE);
				ionFastCopy();
				break;
			case key_right:
				if(gbaScrollRight()){
					gbaRestoreMap();
				}
				// x+=1;
				// gbaDrawMaskSprite(x, y, 1, 8, sprite, GBA_CLIP_SPRITE);
				ionFastCopy();
				break;
			case key_left:
				if(gbaScrollLeft()){
					gbaRestoreMap();
				}
				// x-=1;
				// gbaDrawMaskSprite(x, y, 1, 8, sprite, GBA_CLIP_SPRITE);
				ionFastCopy();
				break;
			case key_down:
				if(gbaScrollDown()){
					gbaRestoreMap();
				}
				// y+=1;
				// gbaDrawMaskSprite(x, y, 1, 8, sprite, GBA_CLIP_SPRITE);
				ionFastCopy();
				break;
		}
	}
}
C'est pas aussi rapide qu'en asm pur, mais ça reste tout à fait acceptable. Par contre j'ai encore quelques problèmes avec le clipping, il faut que je vois ça... Ah et le bcall() ne marche toujours pas ça commence à me prendre la tête fou Enfin ça servira peut être à d'autres personnes smile
Posté le 29/05/2013 à 09:03 Membre depuis le 02/02/2009, 672 messages
Wouah !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

edit: le bcall tu peux pas essayer de mettre toute la macro sur la meme ligne?
Posté le 29/05/2013 à 09:23 Membre depuis le 15/03/2005, 3470 messages
Dans tous les cas ça ne marche pas parce que j'ai l'impression qu'il ne comprend pas que rbr_call et romcall sont des constantes... :/

À la limite je pourrais en faire une fonction, mais ce serait vachement moins optimisé que de faire une simple macro.

edit : le clipping horizontal marche maintenant mais pas le vertical...

Et sinon, si pour la macro c'est un bug de z88dk je vais faire un post sur le forum officiel. Il faut juste être sûr que ce n'est pas une erreur de ma part ?
Posté le 29/05/2013 à 23:00 Membre depuis le 15/03/2005, 3470 messages
fI90

Je viens de porter la routine de rectangle de chickendude et j'ai un peu adapté sa routine de texte lettre par lettre multiligne et qui gère les pauses avec 2nd smile

Bientôt j'aurais de quoi faire des petits jeux facilement en C sans que ça prenne trop de place. Par contre je n'ai pas encore réussis à résoudre ce bug de clipping vertical.
tiroutines.h
#define include_ionPutSprite	0
#define include_ionFastCopy	1
#define include_direct_input	1
#define include_rectangle_filled	1
#define include_text	1

#if include_ionPutSprite == 1
char ionPutSprite(unsigned char x, unsigned char y, unsigned char height, unsigned char *sprite_pointer);
char ionPutSprite(unsigned char x, unsigned char y, unsigned char height, unsigned char *sprite_pointer){
#asm
	; parameters are puts on the sp
	ld hl,2
	add hl,sp	; skip over return address on stack
	ld e,(hl)
	inc hl
	ld d,(hl)
	push de
	pop ix		; ix = *sprite_pointer
	inc hl
	ld b,(hl)	; height occupies 16 bits on stack but only the LSB is relevant
	inc hl		; skip MSB
	inc hl
	ld c,(hl)	; c = y
	inc hl		; skip MSB
	inc hl
	ld a,(hl)	; a = x
	ld l,c
;-----> Draw a sprite
; b=size of sprite
; l=y
; a=x
; ix holds pointer
ionPutSprite:
	ld e,l
	ld h,$00
	ld d,h
	add hl,de
	add hl,de
	add hl,hl
	add hl,hl
	ld e,a
	and $07
	ld c,a
	srl e
	srl e
	srl e
	add hl,de
	ld de,gbuf
	add hl,de

ionPutSpriteLoop1:
	ld d,(ix)
	ld e,$00
	ld a,c
	or a
	jr z,ionPutSpriteSkip1

ionPutSpriteLoop2:
	srl d
	rr e
	dec a
	jr nz,ionPutSpriteLoop2

ionPutSpriteSkip1:
	ld a,(hl)
	xor d
	ld (hl),a
	inc hl
	ld a,(hl)
	xor e
	ld (hl),a
	ld de,$0b
	add hl,de
	inc ix
	djnz ionPutSpriteLoop1
#endasm
}
#endif

#if include_ionFastCopy == 1 || include_text == 1
void ionFastCopy(void);
void ionFastCopy(void){
#asm
;-----> Copy the gbuf to the screen (fast)
;Input:	nothing
;Output:graph buffer is copied to the screen
ionFastCopy:
	di
	ld a,$80
	out (plcdcmd),a
	ld hl,gbuf-12-(-(12*64)+1)
	ld a,$20
	ld c,a
	inc hl
	dec hl

ionFastCopyAgain:
	ld b,64
	inc c
	ld de,-(12*64)+1
	out (plcdcmd),a
	add hl,de
	ld de,10

ionFastCopyLoop:
	add hl,de
	inc hl
	inc hl
	inc de
	ld a,(hl)
	out (plcddata),a
	dec de
	djnz ionFastCopyLoop
	ld a,c
	cp $2b+1
	jr nz,ionFastCopyAgain
#endasm
}
#endif

#if include_direct_input == 1
char __FASTCALL__ direct_input(unsigned char keygroup);
char __FASTCALL__ direct_input(unsigned char keygroup){
#asm
	ld a,l	; a = keygroup
	out (pkey),a
	in a,(pkey)
	ld h,0
	ld l,a		; hl is the return parameter
#endasm
}
#endif

#if include_rectangle_filled == 1
#define RECT_FILL_WHITE	0
#define RECT_FILL_BLACK	1
#define RECT_FILL_XOR	2

char rectangle_filled(unsigned char x, unsigned char y, unsigned char width, unsigned char height, unsigned char color);
char rectangle_filled(unsigned char x, unsigned char y, unsigned char width, unsigned char height, unsigned char color){
#asm
	ld hl,2
	add hl,sp
	push hl
	inc hl
	inc hl
	ld b,(hl)
	inc hl
	inc hl
	ld c,(hl)
	inc hl
	inc hl
	ld e,(hl)
	inc hl
	inc hl
	ld d,(hl)
	pop hl
	ld a,(hl)
	cp 2
	jr z,rectangle_filled_xor
	or a
	jr nz,rectangle_filled_solid

; Rectangle filled routine by chickendude
;b = height
;c = width
;d = starting x
;e = starting y

#define GBUF_LSB	$40
#define GBUF_MSB	$93

rectangle_filled_white:
	call rectangle_filled_solid

rectangle_filled_xor:
	ld a,$ae		;xor (hl)
	jr rectangle_filled2

rectangle_filled_solid:
	ld a,$b6		;or (hl)

rectangle_filled2:
	push de
	push bc
	ld (or_xor),a	;use smc for xor/solid fill
	ld a,d			;starting x
	and $7			;what bit do we start on?
	ex af,af
	ld a,d			;starting x
	ld l,e			;ld hl,e
	ld h,0			; ..
	ld d,h			;set d = 0
	add hl,de		;starting y * 12
	add hl,de		;x3
	add hl,hl		;x6
	add hl,hl		;x12
	rra				;a = x coord / 8
	rra				;
	rra				;
	and @00011111	;starting x/8 (starting byte in gbuf)
	add a,GBUF_LSB
	ld e,a			;
	ld d,GBUF_MSB	;
	add hl,de		;hl = offset in gbuf
	ex af,af
	ld d,a
	ld a,@10000000
	jr z,rectangle_filled4
	rra

rectangle_filled3:
	dec d
	jr nz,rectangle_filled3

rectangle_filled4:
	ld e,12

rectangle_loop_x:
	push af
	push bc
	push hl
	ld c,a

rectangle_loop_y:

or_xor:
	or (hl)			;smc will modify this to or/xor
	ld (hl),a
	ld a,c
	add hl,de
	djnz rectangle_loop_y
	pop hl
	pop bc
	pop af
	rrca
	jr nc,rectangle_filled5
	inc hl

rectangle_filled5:
	dec c
	jr nz,rectangle_loop_x

rectangle_end:
	pop bc
	pop de
#endasm
}
#endif

#if include_text == 1
#asm
#define	TEXT_NOTYPE	0
#define	TEXT_TYPE	1
#define NEWX	$ff
#define NEWY	$fe
#define NEWXY	$fd
#define NEWL	$fc
#define BRK	$fb
text_wait:
	defb 0
text_typing_speed:
	defb 0
default_col:
	defb 0
#endasm
char text(unsigned char x, unsigned char y, unsigned char *text, unsigned char is_typed, unsigned char typing_speed);
char text(unsigned char x, unsigned char y, unsigned char *text, unsigned char is_typed, unsigned char typing_speed){
#asm
	ld hl,2
	add hl,sp
	set textwrite,(iy+sgrflags)
	ld a,(hl)
	ld (text_typing_speed),a
	inc hl
	inc hl
	ld a,(hl)
	ld (text_wait),a
	inc hl
	inc hl
	push hl
	inc hl
	inc hl
	ld e,(hl)
	inc hl
	inc hl
	ld d,(hl)
	pop hl
	ld a,(hl)
	inc hl
	ld h,(hl)
	ld l,a

; Text routine by chickendude

text_start:
	ld (pencol),de
	ld a,e
	ld (default_col),a

text_loop:
	ld de,(pencol)
	ld a,(hl)
	or a
	jp z,ionFastCopy
	cp BRK
	jr c,not_special
	ld bc,text_loop
	push bc
	push hl
	ld hl,text_routine_table
	cpl
	add a,a
	ld c,a
	ld b,0
	add hl,bc
	ld c,(hl)
	inc hl
	ld b,(hl)
	pop hl			;hl = adress in the string
	push bc			;bc = routine adress where we want to jump
	ret

not_special:
	push de
	push ix
	rst rbr_call
	defw _vputmap
	pop ix
	pop de
	ld a,(text_wait)	;= 0 if no delay, != 0 else
	or a
	call nz,text_delay
	inc hl
	jr text_loop

text_delay:
	di
	exx
	ld a,key_group_6	;check ALPHA to skip text typing
	out (pkey),a
	in a,(pkey)
	bit 7,a
	jr nz,text_delay_skip
	xor a
	ld (text_wait),a

text_delay_skip:
	ld a,(text_typing_speed)
	ld b,a

text_delay_loop:
	push bc
	call nc,ionFastCopy
	pop bc
	djnz text_delay_loop
	exx
	ret

;		$00		= end of a dialogue or end of a menu option
;NEWX	($ff)	= new X coordinate
;NEWY	($fe)	= new Y coordinate
;NEWXY	($fd)	= new XY coordinates
;NEWL	($fc)	= new line
;BRK	($fb)	= pause

text_routine_table:
	defw text_new_x
	defw text_new_y
	defw text_new_x_y
	defw text_new_line
	defw text_pause

text_new_x:
	inc hl
	ld e,(hl)
	ld (pencol),de
	inc hl
	ret

text_new_x_y:
	call text_new_x

text_new_y:
	inc hl
	ld d,(hl)
	ld (pencol),de
	inc hl
	ret

text_new_line:
	ld a,d
	add a,6	;penrow+6
	ld d,a
	ld a,(default_col)
	ld e,a
	ld (pencol),de
	inc hl
	ld a,(hl)
	ret

text_pause:
	pop bc			;clear stack
	push hl
	call ionFastCopy

text_pause_loop:
	ei
	halt
	di
	ld a,key_group_7	;check 2nd
	out (pkey),a
	in a,(pkey)
	bit 5,a
	jr nz,text_pause_loop

load_next_text:
	ld hl,text_wait
	inc (hl)
	in a,(pkey)
	inc a
	jr nz,load_next_text
	pop hl
	inc hl					;skip BRK
	ret
#endasm
}
#endif
#pragma string name C TEST

#include <..\dev\ti83p.h>
#include <..\dev\tiroutines.h>
#include <..\dev\gbalib2.h>

// #define bcall(romcall)	asm("rst $28");\
	// asm("defw romcall");

extern char map[];
#asm
._map
	defb 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,0,0
	defb 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,1,1,1
	defb 3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	defb 3,3,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1
	defb 3,3,0,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0
	defb 3,3,0,0,0,0,0,0,2,2,2,2,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0
	defb 3,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0
	defb 3,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,1,1,0,0,0,2
	defb 0,0,0,0,0,0,0,0,4,4,4,4,1,1,1,4,4,4,4,0,0,0,0,0,1,1,0,0,0,2,2
	defb 0,0,0,0,0,0,0,0,4,4,4,4,1,5,1,1,1,1,1,1,1,1,1,1,1,0,0,0,2,2,2
	defb 3,3,0,0,0,0,0,0,4,4,4,4,1,1,1,4,4,4,4,0,0,0,0,0,0,0,0,0,2,2,2
	defb 3,3,3,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,2,2,2,2
	defb 3,3,3,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,2,2,2,2,2
	defb 3,3,3,3,0,0,0,0,0,0,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,3
	defb 3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,0,0,0,0,0,0,2,3,3,3,3,3
	defb 3,3,3,3,3,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,0,0,0,3,3,3,3,3,3,3
#endasm

extern char tiles[];
#asm
._tiles
	defb @10000000		; tile #0 (field)
	defb @10000100
	defb @00010000
	defb @01000001
	defb @00000000
	defb @00100000
	defb @00000010
	defb @00000000
	defb @00000000		; tile #1 (road)
	defb @00000000
	defb @00000000
	defb @00000000
	defb @00000000
	defb @00000000
	defb @00000000
	defb @00000000
	defb @00010000		; tile #2 (forest)
	defb @00110000
	defb @00101000
	defb @01100000
	defb @01010100
	defb @11000000
	defb @11111110
	defb @00010000
	defb @00000000		; tile #3 (mountain)
	defb @00000000
	defb @00001000
	defb @00010100
	defb @00100110
	defb @01010010
	defb @11011001
	defb @10001000
	defb @11111010		; tile #4 (water)
	defb @11011111
	defb @10101101
	defb @11111010
	defb @11101111
	defb @11010111
	defb @11111111
	defb @11111101
	defb @11111111		; tile #5 (temple)
	defb @01011110
	defb @00101100
	defb @00101100
	defb @00101100
	defb @00101100
	defb @01111110
	defb @10011111
#endasm

char sprite[]={
	0xC3,0x3C,
	0x81,0x42,
	0x00,0xA5,
	0x00,0xA5,
	0x00,0x81,
	0x00,0xBD,
	0x81,0x42,
	0xC3,0x3C
};

extern char text01[];
#asm
._text01
	defb 'T','E','S','T',BRK,0
#endasm

int main(){
	char x=0, y=0;
	// bcall(_cleargbuf);
	gbaInitMap(0, 0, 31, 16, tiles, map);
	gbaRestoreMap();
	text(6, 30, text01, TEXT_TYPE, 5);
	rectangle_filled(0, 0, screen_w, screen_h, RECT_FILL_XOR);
	ionFastCopy();
	while(1){
		switch(direct_input(key_group_1)){
			case key_up:
				if(gbaScrollUp()){
					gbaRestoreMap();
				}
				y-=1;
				gbaDrawMaskSprite(x, y, 1, 8, sprite, GBA_CLIP_SPRITE);
				ionFastCopy();
				break;
			case key_right:
				if(gbaScrollRight()){
					gbaRestoreMap();
				}
				x+=1;
				gbaDrawMaskSprite(x, y, 1, 8, sprite, GBA_CLIP_SPRITE);
				ionFastCopy();
				break;
			case key_left:
				if(gbaScrollLeft()){
					gbaRestoreMap();
				}
				x-=1;
				gbaDrawMaskSprite(x, y, 1, 8, sprite, GBA_CLIP_SPRITE);
				ionFastCopy();
				break;
			case key_down:
				if(gbaScrollDown()){
					gbaRestoreMap();
				}
				y+=1;
				gbaDrawMaskSprite(x, y, 1, 8, sprite, GBA_CLIP_SPRITE);
				ionFastCopy();
				break;
		}
	}
}

Par contre ça n'est pas possible de définir un texte en entier après un defb, on est vraiment obligé de le faire lettre par lettre ?! Je crois que j'ai un tas de trucs à réclamer sur le forum officiel.
Posté le 19/06/2013 à 23:23 Membre depuis le 15/03/2005, 3470 messages
Cool on m'a enfin répondu smile

Donc enfaite tout ce dont je plaignais est possible, c'est juste que la syntaxe est assez bizarre. Voilà la macro bcall :
#define bcall(romcall);	asm("rst $28\ndefw "#romcall);


Et une bonne nouvelle : on peut tout à fait définir du texte autrement que lettre par lettre tout en incluant des tokens !
extern char text_menu[];
#asm
._text_menu
	defm "Nouveau"&NEWL&"Continuer"&NEWL&"Quitter"&0
#endasm


Je crois que si j'ai 5min je ferais un petit RPG assez rapide pour montrer que finalement c'est possible de faire des jeux en C sur TI z80 tongue
Posté le 20/06/2013 à 09:26 Membre depuis le 02/02/2009, 672 messages
Ouai super smile

Désolé de ne pas t'avoir aidé je n'ai pas trop de temps en ce moment :/

Tu as raison, je suis sur qu'on peut faire des jeux en C, en ajoutant un peu d'asm par ci par là smile
Posté le 20/06/2013 à 09:59 Membre depuis le 15/03/2005, 3470 messages
Non je comprend, moi c'est pareil, si j'avais vraiment le temps de programmer je reprendrai pokémon tongue
Posté le 21/06/2013 à 06:32 Membre depuis le 03/06/2011, 520 messages
C'est cool, mais moi je crois que je vais continuer avec de l'asm grin

Pour les menus, il serait super si on pourrait utiliser "\n" en lieu de NEWL (et peut-être \x, \y, \z (xy), etc. dans le style C), mais je ne sais pas si c'est possible. En tout cas, bon travail ! Mais il faut encore écrire plus de routines. J'ai une autre routine que j'ai écrit pour Juego qui est comme la routine de rectangle mais peut afficher une simple bordure et est plus rapide pour les boîtes de textes (il ne faut pas afficher deux rectangles).
Posté le 21/06/2013 à 08:35 Membre depuis le 15/03/2005, 3470 messages
Bien sûr que je continue aussi avec l'asm wink

C'est juste des tests pour voir ce qu'on peut faire en C. D'ailleurs pour l'instant c'est très bien mais le binaire généré grossit vite...

Et puis wabbitemu ne veut toujours pas lancer ces programmes, et je ne sais pas pourquoi (l'header est peut être corrompu ?).

J'ai commencé à coder un jeu-exemple (qui fait déjà 3,98ko pour pas grand chose, et sans compter gbalib2 que je compte ajouter !) :

yx3I
tiroutines.h
#define include_delay	1
#define include_ionPutSprite	1
#define include_ionLargeSprite	1
#define include_ionFastCopy	1
#define include_direct_input	1
#define include_getkey	1
#define include_getpixel	1
#define include_rectangle_filled	1
#define include_text	1

#if include_delay == 1
char __FASTCALL__ delay(unsigned char delay);
char __FASTCALL__ delay(unsigned char delay){
#asm
	ld a,(hl)
	ld b,a
	ei

delay_loop:
	halt
	djnz delay_loop
	di
#endasm
}
#endif

#if include_ionPutSprite == 1
char ionPutSprite(unsigned char x, unsigned char y, unsigned char height, unsigned char *sprite);
char ionPutSprite(unsigned char x, unsigned char y, unsigned char height, unsigned char *sprite){
#asm
	ld hl,2
	add hl,sp
	ld e,(hl)
	inc hl
	ld d,(hl)
	push de
	pop ix
	inc hl
	ld b,(hl)
	inc hl
	inc hl
	ld c,(hl)
	inc hl
	inc hl
	ld a,(hl)
	ld l,c

;-----> Draw a sprite
; b=size of sprite
; l=y
; a=x
; ix holds pointer
ionPutSprite:
	ld e,l
	ld h,$00
	ld d,h
	add hl,de
	add hl,de
	add hl,hl
	add hl,hl
	ld e,a
	and $07
	ld c,a
	srl e
	srl e
	srl e
	add hl,de
	ld de,gbuf
	add hl,de

ionPutSpriteLoop1:
	ld d,(ix)
	ld e,$00
	ld a,c
	or a
	jr z,ionPutSpriteSkip1

ionPutSpriteLoop2:
	srl d
	rr e
	dec a
	jr nz,ionPutSpriteLoop2

ionPutSpriteSkip1:
	ld a,(hl)
	xor d
	ld (hl),a
	inc hl
	ld a,(hl)
	xor e
	ld (hl),a
	ld de,$0b
	add hl,de
	inc ix
	djnz ionPutSpriteLoop1
#endasm
}
#endif

#if include_ionLargeSprite == 1
char ionLargeSprite(unsigned char x, unsigned char y, unsigned char width, unsigned char height, unsigned char *sprite);
char ionLargeSprite(unsigned char x, unsigned char y, unsigned char width, unsigned char height, unsigned char *sprite){
#asm
	ld hl,2
	add hl,sp
	ld e,(hl)
	inc hl
	ld d,(hl)
	push de
	pop ix
	inc hl
	ld b,(hl)
	inc hl
	inc hl
	ld c,(hl)
	inc hl
	inc hl
	push hl
	inc hl
	inc hl
	ld a,(hl)
	pop hl
	ld l,(hl)

;-----> Draw a picture
;Input:	ix->sprite
;	a=x
;	l=y
;	b=height	(in pixels)
;	c=width		(in bytes, e.g. 2 would be 16)
;Output: nothing
ionLargeSprite:
	di
	ex af,af
	ld a,c
	push af
	ex af,af
	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 $07
	ld c,a
	srl e
	srl e
	srl e
	add hl,de
	ld de,gbuf
	add hl,de

ionLargeSpriteLoop1:
	push hl

ionLargeSpriteLoop2:
	ld d,(ix)
	ld e,0
	ld a,c
	or a
	jr z,ionLargeSpriteSkip1

ionLargeSpriteLoop3:
	srl d
	rr e
	dec a
	jr nz,ionLargeSpriteLoop3

ionLargeSpriteSkip1:
	ld a,(hl)
	xor d
	ld (hl),a
	inc hl
	ld a,(hl)
	xor e
	ld (hl),a
	inc ix
	ex af,af
	dec a
	push af
	ex af,af
	pop af
	jr nz,ionLargeSpriteLoop2
	pop hl
	pop af
	push af
	ex af,af
	ld de,$0c
	add hl,de
	djnz ionLargeSpriteLoop1
	pop af
#endasm
}
#endif

#if include_ionFastCopy == 1 || include_text == 1
void ionFastCopy(void);
void ionFastCopy(void){
#asm
;-----> Copy the gbuf to the screen (fast)
;Input:	nothing
;Output:graph buffer is copied to the screen
ionFastCopy:
	di
	ld a,$80
	out (plcdcmd),a
	ld hl,gbuf-12-(-(12*64)+1)
	ld a,$20
	ld c,a
	inc hl
	dec hl

ionFastCopyAgain:
	ld b,64
	inc c
	ld de,-(12*64)+1
	out (plcdcmd),a
	add hl,de
	ld de,10

ionFastCopyLoop:
	add hl,de
	inc hl
	inc hl
	inc de
	ld a,(hl)
	out (plcddata),a
	dec de
	djnz ionFastCopyLoop
	ld a,c
	cp $2b+1
	jr nz,ionFastCopyAgain
#endasm
}
#endif

#if include_direct_input == 1
char __FASTCALL__ direct_input(unsigned char keygroup);
char __FASTCALL__ direct_input(unsigned char keygroup){
#asm
	ld a,l	; a = keygroup
	out (pkey),a
	in a,(pkey)
	ld h,0
	ld l,a		; hl is the return parameter
#endasm
}
#endif

#if include_getkey == 1
void getkey(void);
void getkey(void){
#asm
getkey_loop:
	rst rbr_call
	defw _getcsc
	or a
	jr z,getkey_loop
	ld h,0
	ld l,a
#endasm
}
#endif

#if include_getpixel == 1
#define PIXEL_ON	1
#define PIXEL_OFF	0
char getpixel(unsigned char x, unsigned char y);
char getpixel(unsigned char x, unsigned char y){
#asm
	ld hl,2
	add hl,sp
	ld e,(hl)	; e=y
	inc hl
	inc hl
	ld a,(hl)	; a=x
	ld l,e

getpixel:
	ld h,0
	ld d,h
	ld e,l
	add hl,hl
	add hl,de
	add hl,hl
	add hl,hl
	ld e,a
	srl e
	srl e
	srl e
	add hl,de
	ld de,plotsscreen
	add hl,de
	and 7
	ld b,a
	ld a,$80
	jr z,testpixel

getpixel_loop:
	rrca
	djnz getpixel_loop

testpixel:
	and (hl)
	or a
	jr nz,getpixel_quit
	ld hl,0

getpixel_quit:
#endasm
}
#endif

#if include_rectangle_filled == 1
#define RECT_FILL_WHITE	0
#define RECT_FILL_BLACK	1
#define RECT_FILL_XOR	2

char rectangle_filled(unsigned char x, unsigned char y, unsigned char width, unsigned char height, unsigned char color);
char rectangle_filled(unsigned char x, unsigned char y, unsigned char width, unsigned char height, unsigned char color){
#asm
; Rectangle filled routine by chickendude

#define GBUF_LSB	$40
#define GBUF_MSB	$93

	ld hl,2
	add hl,sp
	push hl
	inc hl
	inc hl
	ld b,(hl)
	inc hl
	inc hl
	ld c,(hl)
	inc hl
	inc hl
	ld e,(hl)
	inc hl
	inc hl
	ld d,(hl)
	pop hl
	ld a,(hl)
	cp 2
	jr z,rectangle_filled_xor
	or a
	jr nz,rectangle_filled_solid

;b = height
;c = width
;d = starting x
;e = starting y

rectangle_filled_white:
	call rectangle_filled_solid

rectangle_filled_xor:
	ld a,$ae		;xor (hl)
	jr rectangle_filled2

rectangle_filled_solid:
	ld a,$b6		;or (hl)

rectangle_filled2:
	push de
	push bc
	ld (or_xor),a	;use smc for xor/solid fill
	ld a,d			;starting x
	and $7			;what bit do we start on?
	ex af,af
	ld a,d			;starting x
	ld l,e			;ld hl,e
	ld h,0			; ..
	ld d,h			;set d = 0
	add hl,de		;starting y * 12
	add hl,de		;x3
	add hl,hl		;x6
	add hl,hl		;x12
	rra				;a = x coord / 8
	rra				;
	rra				;
	and @00011111	;starting x/8 (starting byte in gbuf)
	add a,GBUF_LSB
	ld e,a			;
	ld d,GBUF_MSB	;
	add hl,de		;hl = offset in gbuf
	ex af,af
	ld d,a
	ld a,@10000000
	jr z,rectangle_filled4

rectangle_filled3:
	rra
	dec d
	jr nz,rectangle_filled3

rectangle_filled4:
	ld e,12

rectangle_loop_x:
	push af
	push bc
	push hl
	ld c,a

rectangle_loop_y:

or_xor:
	or (hl)			;smc will modify this to or/xor
	ld (hl),a
	ld a,c
	add hl,de
	djnz rectangle_loop_y
	pop hl
	pop bc
	pop af
	rrca
	jr nc,rectangle_filled5
	inc hl

rectangle_filled5:
	dec c
	jr nz,rectangle_loop_x

rectangle_end:
	pop bc
	pop de
#endasm
}
#endif

#if include_text == 1
#asm
#define TEXT_NOTYPE	0
#define TEXT_TYPE	1
#define NEWX	$ff
#define NEWY	$fe
#define NEWXY	$fd
#define NEWL	$fc
#define BRK	$fb
text_wait:
	defb 0
text_typing_speed:
	defb 0
default_col:
	defb 0
#endasm
char text(unsigned char x, unsigned char y, unsigned char *text, unsigned char is_typed, unsigned char typing_speed);
char text(unsigned char x, unsigned char y, unsigned char *text, unsigned char is_typed, unsigned char typing_speed){
#asm
; Text routine by chickendude
;	$00		= end of a dialogue or end of a menu option
;NEWX	($ff)	= new X coordinate
;NEWY	($fe)	= new Y coordinate
;NEWXY	($fd)	= new XY coordinates
;NEWL	($fc)	= new line
;BRK	($fb)	= pause
	ld hl,2
	add hl,sp
	set textwrite,(iy+sgrflags)
	ld a,(hl)
	ld (text_typing_speed),a
	inc hl
	inc hl
	ld a,(hl)
	ld (text_wait),a
	inc hl
	inc hl
	push hl
	inc hl
	inc hl
	ld d,(hl)
	inc hl
	inc hl
	ld e,(hl)
	pop hl
	ld a,(hl)
	inc hl
	ld h,(hl)
	ld l,a

text_start:
	ld (pencol),de
	ld a,e
	ld (default_col),a

text_loop:
	ld de,(pencol)
	ld a,(hl)
	or a
	jp z,ionFastCopy
	cp BRK
	jr c,not_special
	ld bc,text_loop
	push bc
	push hl
	ld hl,text_routine_table
	cpl
	add a,a
	ld c,a
	ld b,0
	add hl,bc
	ld c,(hl)
	inc hl
	ld b,(hl)
	pop hl			;hl = adress in the string
	push bc			;bc = routine adress where we want to jump
	ret

not_special:
	push de
	push ix
	rst rbr_call
	defw _vputmap
	pop ix
	pop de
	ld a,(text_wait)	;= 0 if no delay, != 0 else
	or a
	call nz,text_delay
	inc hl
	jr text_loop

text_delay:
	di
	exx
	ld a,dkey_group_6	;check ALPHA to skip text typing
	out (pkey),a
	in a,(pkey)
	bit 7,a
	jr nz,text_delay_skip
	xor a
	ld (text_wait),a

text_delay_skip:
	ld a,(text_typing_speed)
	ld b,a

text_delay_loop:
	push bc
	call nc,ionFastCopy
	pop bc
	djnz text_delay_loop
	exx
	ret

text_routine_table:
	defw text_new_x
	defw text_new_y
	defw text_new_x_y
	defw text_new_line
	defw text_pause

text_new_x:
	inc hl
	ld e,(hl)
	ld (pencol),de
	inc hl
	ret

text_new_x_y:
	call text_new_x

text_new_y:
	inc hl
	ld d,(hl)
	ld (pencol),de
	inc hl
	ret

text_new_line:
	ld a,d
	add a,6	;penrow+6
	ld d,a
	ld a,(default_col)
	ld e,a
	ld (pencol),de
	inc hl
	ld a,(hl)
	ret

text_pause:
	pop bc			;clear stack
	push hl
	call ionFastCopy

text_pause_loop:
	ei
	halt
	di
	ld a,dkey_group_7	;check 2nd
	out (pkey),a
	in a,(pkey)
	bit 5,a
	jr nz,text_pause_loop

load_next_text:
	ld hl,text_wait
	inc (hl)
	in a,(pkey)
	inc a
	jr nz,load_next_text
	pop hl
	inc hl					;skip BRK
	ret
#endasm
}
#endif
test.c
#pragma string name C TEST

#include <..\dev\ti83p.h>
#include <..\dev\tiroutines.h>
//#include <..\dev\gbalib2.h>

#define bcall(romcall);	asm("rst rbr_call\ndefw "#romcall);

#include <..\dev\sprites\title.h>
#include <..\dev\sprites\map.h>
#include <..\dev\sprites\map_player.h>

#define START	0
#define LOAD	1
#define QUIT	2

extern char text_menu[];
#asm
._text_menu
	defm "Nouveau"&NEWL&"Continuer"&NEWL&"Quitter"&0
#endasm

extern char text_intro[];
#asm
._text_intro
	defm "Vous viviez tranquillement"&NEWL&"en dehors de la soci"&0x96&"t"&0x96&NEWL&"jusqu'au jour o"&0xaf&" vous"&NEWL&"d"&0x96&"couvrez qu'on vous a"&NEWL&"vol"&0x96&"..."&BRK&NEWL&"Vous d"&0x96&"cidez alors de"&NEWL&"partir "&0x8f&" la recherche"&NEWL&"des voleurs."&BRK&0
#endasm
// j'en suis là à essayer de faire afficher la 2nde partie du message

extern char text_castle[];
#asm
._text_castle
	defm "Garde :"&NEWL&"Passez votre chemin sale"&NEWL&"manant !"&BRK&0
#endasm

void main_menu(void);
char draw_cursor(unsigned char x, unsigned char y);
char handle_map(unsigned char player_x, unsigned char player_y);
char update_map(unsigned char player_x, unsigned char player_y);
char draw_player(unsigned char old_player_x, unsigned char old_player_y, unsigned char player_x, unsigned char player_y);
char check_place(unsigned char player_x, unsigned char player_y);

int main(){
	unsigned char player_x = 1, player_y = 1;
	switch(main_menu()){
		case START:	// start
			rectangle_filled(0, 0, 96, 64, RECT_FILL_BLACK);
			rectangle_filled(1, 1, 94, 62, RECT_FILL_WHITE);
			text(2, 1, text_intro, TEXT_TYPE, 5);
			handle_map(player_x, player_y);
			break;
		case LOAD: // load
			break;
	}
}

void main_menu(void){
	unsigned char cursor_y = 0, key = 0;
	ionLargeSprite(5, 0, 11, 26, title);
	rectangle_filled(28, 33, 40, 21, RECT_FILL_BLACK);
	rectangle_filled(29, 34, 38, 19, RECT_FILL_WHITE);
	text(34, 34, text_menu, TEXT_NOTYPE, 0);
	ionFastCopy();
	while(key != skey_2nd){
		draw_cursor(30, 34+cursor_y*6);
		key = getkey();
		switch(key){
			case skey_up:
				if(cursor_y > START){
					ionFastCopy();
					cursor_y-=1;
				}
				break;
			case skey_down:
				if(cursor_y < QUIT){
					ionFastCopy();
					cursor_y+=1;
				}
				break;
		}
	}
	return cursor_y;
}

char draw_cursor(unsigned char x, unsigned char y){
#asm
	res textwrite,(iy+sgrflags)	; reset some flag to write only to the screen (not the graph buffer)
	ld hl,2
	add hl,sp
	ld b,(hl)	; get y from the parameters (stack)
	inc hl
	inc hl
	ld c,(hl)	; get x
	ld (pencol),bc
	ld a,5
	rst rbr_call
	defw _vputmap	; write the cursor character
	set textwrite,(iy+sgrflags)	; set the flag to write on the gbuf
#endasm
}

char handle_map(unsigned char player_x, unsigned char player_y){
	unsigned char key = 0;
	update_map(player_x, player_y);
	while(key != dkey_clear){
		switch(direct_input(dkey_group_1)){
			case dkey_up:
				if((getpixel(player_x, player_y-1) == PIXEL_OFF) && (getpixel(player_x+1, player_y-1) == PIXEL_OFF) && (getpixel(player_x+2, player_y-1) == PIXEL_OFF)){
					draw_player(player_x, player_y, player_x, player_y-=1);
				}else{
					check_place(player_x+1, player_y-1);
					update_map(player_x, player_y);
				}
				break;
			case dkey_right:
				if((getpixel(player_x+3, player_y) == PIXEL_OFF) && (getpixel(player_x+3, player_y+1) == PIXEL_OFF) && (getpixel(player_x+3, player_y+2) == PIXEL_OFF)){
					draw_player(player_x, player_y, player_x+=1, player_y);
				}else{
					check_place(player_x+3, player_y+1);
					update_map(player_x, player_y);
				}
				break;
			case dkey_left:
				if((getpixel(player_x-1, player_y) == PIXEL_OFF) && (getpixel(player_x-1, player_y+1) == PIXEL_OFF) && (getpixel(player_x-1, player_y+2) == PIXEL_OFF)){
					draw_player(player_x, player_y, player_x-=1, player_y);
				}else{
					check_place(player_x-1, player_y+1);
					update_map(player_x, player_y);
				}
				break;
			case dkey_down:
				if((getpixel(player_x, player_y+3) == PIXEL_OFF) && (getpixel(player_x+1, player_y+3) == PIXEL_OFF) && (getpixel(player_x+2, player_y+3) == PIXEL_OFF)){
					draw_player(player_x, player_y, player_x, player_y+=1);
				}else{
					check_place(player_x+1, player_y+3);
					update_map(player_x, player_y);
				}
				break;
		}
		key = direct_input(dkey_group_2);
	}
}

char update_map(unsigned char player_x, unsigned char player_y){
	bcall(_cleargbuf);
	ionLargeSprite(0, 0, 12, 64, map);
	ionPutSprite(player_x, player_y, 3, map_player);
	ionFastCopy();
}

char draw_player(unsigned char old_player_x, unsigned char old_player_y, unsigned char player_x, unsigned char player_y){
	ionPutSprite(old_player_x, old_player_y, 3, map_player);	// clear the player's sprite
	ionPutSprite(player_x, player_y, 3, map_player);	// and re-draw it to its new place
	ionFastCopy();
}

char check_place(unsigned char player_x, unsigned char player_y){
	if(player_x > 5 && player_x < 19 && player_y > 4 && player_y < 31){
		// TOWER
	}else if(player_x > 25 && player_x < 58 && player_y > 3 && player_y < 36){
		// CASTLE
		rectangle_filled(0, 37, 96, 27, RECT_FILL_BLACK);
		rectangle_filled(1, 38, 94, 25, RECT_FILL_WHITE);
		text(2, 38, text_castle, TEXT_TYPE, 5);
	}else if(player_x > 57 && player_x < 95 && player_y > 0 && player_y < 25){
		// VOLCANO
	}else if(player_x > 29 && player_x < 49 && player_y > 39 && player_y < 54){
		// TOWN
	}else if(player_x > 59 && player_x < 95 && player_y > 32 && player_y < 63){
		if(player_x > 83 && player_x < 94 && player_y > 52 && player_y < 62){
			// HOUSE
		}else{
			// FOREST
		}
	}
}

(Comme je suis nul en C, si vous voyez des optimisations n'hésitez pas !)

Voilà la source (qui contient un programme pour convertir ses sprites facilement) : http://www.mirari.fr/4CGJ (pour compiler avec windows il faut mettre ce dossier dans celui de z88dk).

Je crois que j'en étais à régler un bug avec la routine de texte : après un BRK le texte s'arrête (du coup seule la première partir du texte d'intro marche).
Posté le 23/06/2013 à 09:02 Membre depuis le 03/06/2011, 520 messages
As-tu dessiné les sprites toi-même ? Qu'ils sont beaux !

Du C je n'en sais rien, si tu veux faire une boucle ou une instruction if peut-être je pourrai t'aider, mais si non ... :P
Posté le 23/06/2013 à 10:24 Membre depuis le 15/03/2005, 3470 messages
Les sprites viennent d'un chipset d'RPG Maker, je les ai juste un peu modifiées.
chickendude (./21) :
Du C je n'en sais rien, si tu veux faire une boucle ou une instruction if peut-être je pourrai t'aider, mais si non ... :P

La plupart du code est en asm enfaite, et je pense que le problème du BRK vient du fait que j'ai mal adapté ta routine (qui est à la fin de tiroutines.h).
Posté le 23/06/2013 à 18:16 Membre depuis le 03/06/2011, 520 messages
Tu ne peux pas ajouter un fichier .lst ? Il serait plus facile de déboguer comme ça.

EDIT : Wow, les paramètres sont envoyés par la pile ?! J'ai trouvé le problème, enlève la "pop bc" après text_pause. Là on pop l'adresse où l'on veut sauter après avoir exécuté la routine smile
Posté le 23/06/2013 à 18:45 Membre depuis le 15/03/2005, 3470 messages
Génial, ça marche !
chickendude (./23) :
Wow, les paramètres sont envoyés par la pile ?!

Oui les paramètres marchent comme ça : http://www.z88dk.org/wiki/doku.php?id=usage:stackframe (d'ailleurs si c'était plus compliqué je ne sais pas si j'aurais essayé de faire quoique ce soit avec ce langage).

Autrement je crois que c'est possible de générer un fichier "liste", ça doit être quelque part dans le wiki.
Posté le 23/06/2013 à 19:01 Membre depuis le 03/06/2011, 520 messages
Ou au moins voir le code asm reproduit smile

Et il n'y a pas un moyen de passer des registres directement ?

EDIT : J'ai vu FASTCALL, mais ça ne permet qu'un paramètre :/
Posté le 23/06/2013 à 19:09 Membre depuis le 15/03/2005, 3470 messages
Je ne crois pas qu'il y ait moyen de faire autrement avec les paramètres, mais on peut faire ses propres routines asm qu'on appelle soit-même avec asm("call routine"); ou #asm\call routine\#endasm.
Posté le 25/06/2013 à 10:26 Membre depuis le 15/03/2005, 3470 messages
Mon RPG-test avance bien, et je dois dire que c'est assez sympa de pouvoir coder aussi rapidement pour un résultat pas trop moche/lourd smile

J'ai commencé à coder les phases de combat : ce sera un truc type a-rpg (à chaque mouvement du joueur les ennemis bougerons aussi ou attaquerons selon les cas). Dans le screen on voit simplement qu'un ennemi nous pourchasse (c'est tout ce que j'ai codé pour l'instant !) :

aKsp

J'ai mis à jour la "TIlib" et GBAlib2 : maintenant tout marche nickel top

Code source : dev.zip.
test.c
#pragma string name C TEST

#include "..\dev\ti83p.h"
#include "..\dev\tilib.c"
#include "..\dev\gbalib2.c"

// Sprites
#include "..\dev\sprites\title.h"
#include "..\dev\sprites\map.h"
#include "..\dev\sprites\map_player.h"
#include "..\dev\sprites\tiles.h"
#include "..\dev\sprites\battle_player.h"
#include "..\dev\sprites\battle_ennemy.h"

// Map
extern char battle_map[];
#asm
._battle_map
	defb 4,4,4,4,4,4,4,3,3,3,3,3,4,4,4,4,4,4,4,4
	defb 4,0,0,0,0,0,0,1,3,3,3,4,4,0,1,1,1,0,0,4
	defb 4,0,0,0,0,0,0,2,1,3,3,1,1,0,2,2,2,0,0,4
	defb 4,0,0,4,4,4,0,0,2,3,0,2,2,0,0,0,0,0,0,4
	defb 4,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,4
	defb 4,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,4
	defb 4,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,4
	defb 4,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,4
	defb 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
#endasm

// Constants
#define START	0
#define LOAD	1
#define QUIT	2
#define BATTLE_MAP_WIDTH	20
#define BATTLE_MAP_HEIGHT	20

// Global variables
unsigned char i, key, player_x = 80, player_y = 59, battle_player_x = 10, battle_player_y = 18, camera_x, camera_y;

typedef struct {
  int  x;
  int  y;
  int  hp;
} ennemy_struct;

ennemy_struct ennemy[4];

extern char text_menu[];
#asm
._text_menu
	defm "Nouveau"&TL_NEWL&"Continuer"&TL_NEWL&"Quitter"&0
#endasm

extern char text_intro[];
#asm
._text_intro
	defm "Vous viviez tranquillement"&TL_NEWL&"en dehors de la soci"&0x96&"t"&0x96&TL_NEWL&"jusqu'au jour o"&0xaf&" vous"&TL_NEWL&"d"&0x96&"couvrez qu'on vous a"&TL_NEWL&"vol"&0x96&"..."&TL_BRK&TL_NEWL&"Vous d"&0x96&"cidez alors de"&TL_NEWL&"partir "&0x8f&" la recherche"&TL_NEWL&"des voleurs."&TL_BRK&0
#endasm

extern char text_castle[];
#asm
._text_castle
	defm "Garde :"&TL_NEWL&"Passez votre chemin sale"&TL_NEWL&"manant !"&TL_BRK&0
#endasm

//Functions prototypes
void main_menu(void);
char draw_cursor(unsigned char x, unsigned char y);
void handle_map(void);
void update_map(void);
char draw_player(unsigned char old_player_x, unsigned char old_player_y, unsigned char player_x, unsigned char player_y);
char check_place(unsigned char player_x, unsigned char player_y);
void battle(void);
void update_battle_screen(void);

//Functions
int main(){
	switch(main_menu()){
		case START:
			TL_rectangle_filled(0, 0, 96, 64, TL_RECT_FILL_BLACK);
			TL_rectangle_filled(1, 1, 94, 62, TL_RECT_FILL_WHITE);
			TL_text(2, 1, text_intro, TL_TEXT_TYPE, 5);
			handle_map();
			break;
		case LOAD:
			break;
	}
}

void main_menu(void){
	unsigned char cursor_y = 0;
	TL_large_sprite(5, 0, 11, 26, title);
	TL_rectangle_filled(28, 33, 40, 21, TL_RECT_FILL_BLACK);
	TL_rectangle_filled(29, 34, 38, 19, TL_RECT_FILL_WHITE);
	TL_text(34, 34, text_menu, TL_TEXT_NOTYPE, 0);
	TL_gbuf_to_lcd();
	key = 0;
	while(key != skey_2nd){
		draw_cursor(30, 34+cursor_y*6);
		key = TL_get_key();
		switch(key){
			case skey_up:
				if(cursor_y > START){
					TL_gbuf_to_lcd();
					cursor_y-=1;
				}
				break;
			case skey_down:
				if(cursor_y < QUIT){
					TL_gbuf_to_lcd();
					cursor_y+=1;
				}
				break;
		}
	}
	return cursor_y;
}

char draw_cursor(unsigned char x, unsigned char y){
#asm
	res textwrite,(iy+sgrflags)	; reset some flag to write only to the screen (not the graph buffer)
	ld hl,2
	add hl,sp
	ld b,(hl)	; get y from the parameters (stack)
	inc hl
	inc hl
	ld c,(hl)	; get x
	ld (pencol),bc
	ld a,5
	rst rbr_call
	defw _vputmap	; write the cursor character
	set textwrite,(iy+sgrflags)	; set the flag to write on the gbuf
#endasm
}

void handle_map(void){
	update_map();
	key = 0;
	while(key != dkey_clear){
		switch(TL_direct_input(dkey_group_1)){
			case dkey_up:
				if((TL_get_pixel(player_x, player_y-1) == TL_PIXEL_OFF) && (TL_get_pixel(player_x+1, player_y-1) == TL_PIXEL_OFF) && (TL_get_pixel(player_x+2, player_y-1) == TL_PIXEL_OFF)){
					draw_player(player_x, player_y, player_x, player_y-=1);
				}else{
					check_place(player_x+1, player_y-1);
					update_map();
				}
				break;
			case dkey_right:
				if((TL_get_pixel(player_x+3, player_y) == TL_PIXEL_OFF) && (TL_get_pixel(player_x+3, player_y+1) == TL_PIXEL_OFF) && (TL_get_pixel(player_x+3, player_y+2) == TL_PIXEL_OFF)){
					draw_player(player_x, player_y, player_x+=1, player_y);
				}else{
					check_place(player_x+3, player_y+1);
					update_map();
				}
				break;
			case dkey_left:
				if((TL_get_pixel(player_x-1, player_y) == TL_PIXEL_OFF) && (TL_get_pixel(player_x-1, player_y+1) == TL_PIXEL_OFF) && (TL_get_pixel(player_x-1, player_y+2) == TL_PIXEL_OFF)){
					draw_player(player_x, player_y, player_x-=1, player_y);
				}else{
					check_place(player_x-1, player_y+1);
					update_map();
				}
				break;
			case dkey_down:
				if((TL_get_pixel(player_x, player_y+3) == TL_PIXEL_OFF) && (TL_get_pixel(player_x+1, player_y+3) == TL_PIXEL_OFF) && (TL_get_pixel(player_x+2, player_y+3) == TL_PIXEL_OFF)){
					draw_player(player_x, player_y, player_x, player_y+=1);
				}else{
					check_place(player_x+1, player_y+3);
					update_map();
				}
				break;
		}
		key = TL_direct_input(dkey_group_2);
	}
}

void update_map(void){
	bcall(_cleargbuf);
	TL_large_sprite(0, 0, 12, 64, map);
	TL_small_sprite(player_x, player_y, 3, map_player);
	TL_gbuf_to_lcd();
}

char draw_player(unsigned char old_player_x, unsigned char old_player_y, unsigned char player_x, unsigned char player_y){
	TL_small_sprite(old_player_x, old_player_y, 3, map_player);	// clear the player's sprite
	TL_small_sprite(player_x, player_y, 3, map_player);	// and re-draw it to its new place
	TL_gbuf_to_lcd();
}

char check_place(unsigned char player_x, unsigned char player_y){
	if(player_x > 5 && player_x < 19 && player_y > 4 && player_y < 31){
		// TOWER
	}else if(player_x > 25 && player_x < 58 && player_y > 3 && player_y < 36){
		// CASTLE
		TL_rectangle_filled(0, 37, 96, 27, TL_RECT_FILL_BLACK);
		TL_rectangle_filled(1, 38, 94, 25, TL_RECT_FILL_WHITE);
		TL_text(2, 38, text_castle, TL_TEXT_TYPE, 5);
	}else if(player_x > 57 && player_x < 95 && player_y > 0 && player_y < 25){
		// VOLCANO
	}else if(player_x > 29 && player_x < 49 && player_y > 39 && player_y < 54){
		// TOWN
	}else if(player_x > 59 && player_x < 95 && player_y > 32 && player_y < 63){
		if(player_x > 83 && player_x < 94 && player_y > 52 && player_y < 62){
			// HOUSE
		}else{
			// FOREST
			battle();
		}
	}
}

void battle(void){
	bcall(_cleargbuf);
	for(i=0; i<4; i++){
		ennemy[i].x = TL_random(BATTLE_MAP_WIDTH-2)+1;
		ennemy[i].y = TL_random(BATTLE_MAP_HEIGHT/2)+1;
		ennemy[i].hp = 3;
	}
	while(key != skey_clear){
		if(battle_player_x < screen_w/16){
			camera_x = 0;
		}else if(battle_player_x > BATTLE_MAP_WIDTH-screen_w/16){
			camera_x = BATTLE_MAP_WIDTH-screen_w/8;
		}else{
			camera_x = battle_player_x-screen_w/16;
		}
		if(battle_player_y < screen_h/16){
			camera_y = 0;
		}else if(battle_player_y > BATTLE_MAP_HEIGHT-screen_h/16){
			camera_y = BATTLE_MAP_HEIGHT-screen_h/8;
		}else{
			camera_y = battle_player_y-screen_h/16;
		}
		update_battle_screen();

		// IA
		if(ennemy[0].x < battle_player_x){
			ennemy[0].x+=1;
		}else if(ennemy[0].x > battle_player_x){
			ennemy[0].x-=1;
		}
		if(ennemy[0].y < battle_player_y){
			ennemy[0].y+=1;
		}else if(ennemy[0].y > battle_player_y){
			ennemy[0].y-=1;
		}

		key = TL_get_key();
		switch(key){
			case skey_up:
				battle_player_y-=1;
				break;
			case skey_right:
				battle_player_x+=1;
				break;
			case skey_left:
				battle_player_x-=1;
				break;
			case skey_down:
				battle_player_y+=1;
				break;
		}
	}
}

void update_battle_screen(void){
	GBA_init_map(camera_x, camera_y, 20, 20, tiles, battle_map);
	GBA_restore_map();
	GBA_draw_mask_sprite((battle_player_x-GBA_scroll_x)*8, (battle_player_y-GBA_scroll_y)*8, 1, 8, battle_player, GBA_CLIP_SPRITE);
	for(i=0; i<4; i++){
		GBA_draw_mask_sprite((ennemy[i].x-GBA_scroll_x)*8, (ennemy[i].y-GBA_scroll_y)*8, 1, 8, battle_ennemy, GBA_CLIP_SPRITE);
	}
	TL_gbuf_to_lcd();
}


J'en suis à ~6ko sans trop avoir optimisé le code (d'ailleurs si vous avez mieux, dites-le !!).
Posté le 26/06/2013 à 14:36 Membre depuis le 15/03/2005, 3470 messages
J'ai ajouté les collisions tiles/ennemis/joueur, il me manque plus qu'à calculer les dégâts (la boite qui s'affiche au dessus de la tête du joueur c'est pour indiquer qu'il a été touché, mais c'est temporaire/juste pour débugger) :

gTyX

J'en suis à ~8ko, ça monte vite (mais il y a sans doute moyen d'optimiser) ! :/
test.c
#pragma string name C TEST

#include "..\dev\ti83p.h"
#include "..\dev\tilib.c"
#include "..\dev\gbalib2.c"

// Sprites
#include "..\dev\sprites\title.h"
#include "..\dev\sprites\map.h"
#include "..\dev\sprites\map_player.h"
#include "..\dev\sprites\tiles.h"
#include "..\dev\sprites\battle_player_up.h"
#include "..\dev\sprites\battle_player_up_attack.h"
#include "..\dev\sprites\battle_player_right.h"
#include "..\dev\sprites\battle_player_right_attack.h"
#include "..\dev\sprites\battle_player_down.h"
#include "..\dev\sprites\battle_player_down_attack.h"
#include "..\dev\sprites\battle_player_left.h"
#include "..\dev\sprites\battle_player_left_attack.h"
#include "..\dev\sprites\battle_ennemy.h"

// Map
extern char battle_map[];
#asm
._battle_map
	defb 4,4,4,4,4,4,4,3,3,3,3,3,4,4,4,4,4,4,4,4
	defb 4,0,0,0,0,0,0,1,3,3,3,4,4,0,1,1,1,0,0,4
	defb 4,0,0,0,0,0,0,2,1,3,3,1,1,0,2,2,2,0,0,4
	defb 4,0,0,4,4,4,0,0,2,3,0,2,2,0,0,0,0,0,0,4
	defb 4,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,4
	defb 4,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,4
	defb 4,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,4
	defb 4,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,4
	defb 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
	defb 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
#endasm

// Constants
#define START	0
#define LOAD	1
#define QUIT	2
#define BATTLE_MAP_WIDTH	20
#define BATTLE_MAP_HEIGHT	20

// Global variables
unsigned char i, j, key, player_x = 80, player_y = 59, battle_player_x = 10, battle_player_y = 18, *battle_player_direction = 0, camera_x, camera_y, x_temp, y_temp;

typedef struct {
  int  x;
  int  y;
  int  hp;
} ennemy_struct;

ennemy_struct ennemy[4];

extern char text_menu[];
#asm
._text_menu
	defm "Nouveau"&TL_NEWL&"Continuer"&TL_NEWL&"Quitter"&0
#endasm

extern char text_intro[];
#asm
._text_intro
	defm "Vous viviez tranquillement"&TL_NEWL&"en dehors de la soci"&0x96&"t"&0x96&TL_NEWL&"jusqu'au jour o"&0xaf&" vous"&TL_NEWL&"d"&0x96&"couvrez qu'on vous a"&TL_NEWL&"vol"&0x96&"..."&TL_BRK&TL_NEWL&"Vous d"&0x96&"cidez alors de"&TL_NEWL&"partir "&0x8f&" la recherche"&TL_NEWL&"des voleurs."&TL_BRK&0
#endasm

extern char text_castle[];
#asm
._text_castle
	defm "Garde :"&TL_NEWL&"Passez votre chemin sale"&TL_NEWL&"manant !"&TL_BRK&0
#endasm

//Functions prototypes
void main_menu(void);
char draw_cursor(unsigned char x, unsigned char y);
void handle_map(void);
void update_map(void);
char draw_player(unsigned char old_player_x, unsigned char old_player_y, unsigned char player_x, unsigned char player_y);
char check_place(unsigned char player_x, unsigned char player_y);
void battle(void);
void update_battle_screen(void);
void draw_ennemies(void);
char is_location_empty(unsigned char x, unsigned char y);
void hit_player(void);

//Functions
int main(){
	switch(main_menu()){
		case START:
			TL_rectangle_filled(0, 0, 96, 64, TL_RECT_FILL_BLACK);
			TL_rectangle_filled(1, 1, 94, 62, TL_RECT_FILL_WHITE);
			TL_text(2, 1, text_intro, TL_TEXT_TYPE, 5);
			handle_map();
			break;
		case LOAD:
			break;
	}
}

void main_menu(void){
	unsigned char cursor_y = 0;
	TL_large_sprite(5, 0, 11, 26, title);
	TL_rectangle_filled(28, 33, 40, 21, TL_RECT_FILL_BLACK);
	TL_rectangle_filled(29, 34, 38, 19, TL_RECT_FILL_WHITE);
	TL_text(34, 34, text_menu, TL_TEXT_NOTYPE, 0);
	TL_gbuf_to_lcd();
	key = 0;
	while(key != skey_2nd){
		draw_cursor(30, 34+cursor_y*6);
		key = TL_get_key();
		switch(key){
			case skey_up:
				if(cursor_y > START){
					TL_gbuf_to_lcd();
					cursor_y-=1;
				}
				break;
			case skey_down:
				if(cursor_y < QUIT){
					TL_gbuf_to_lcd();
					cursor_y+=1;
				}
				break;
		}
	}
	return cursor_y;
}

char draw_cursor(unsigned char x, unsigned char y){
#asm
	res textwrite,(iy+sgrflags)	; reset some flag to write only to the screen (not the graph buffer)
	ld hl,2
	add hl,sp
	ld b,(hl)	; get y from the parameters (stack)
	inc hl
	inc hl
	ld c,(hl)	; get x
	ld (pencol),bc
	ld a,5
	rst rbr_call
	defw _vputmap	; write the cursor character
	set textwrite,(iy+sgrflags)	; set the flag to write on the gbuf
#endasm
}

void handle_map(void){
	update_map();
	key = 0;
	while(key != dkey_clear){
		switch(TL_direct_input(dkey_group_1)){
			case dkey_up:
				if((TL_get_pixel(player_x, player_y-1) == TL_PIXEL_OFF) && (TL_get_pixel(player_x+1, player_y-1) == TL_PIXEL_OFF) && (TL_get_pixel(player_x+2, player_y-1) == TL_PIXEL_OFF)){
					draw_player(player_x, player_y, player_x, player_y -= 1);
				}else{
					check_place(player_x+1, player_y-1);
					update_map();
				}
				break;
			case dkey_right:
				if((TL_get_pixel(player_x+3, player_y) == TL_PIXEL_OFF) && (TL_get_pixel(player_x+3, player_y+1) == TL_PIXEL_OFF) && (TL_get_pixel(player_x+3, player_y+2) == TL_PIXEL_OFF)){
					draw_player(player_x, player_y, player_x += 1, player_y);
				}else{
					check_place(player_x+3, player_y+1);
					update_map();
				}
				break;
			case dkey_left:
				if((TL_get_pixel(player_x-1, player_y) == TL_PIXEL_OFF) && (TL_get_pixel(player_x-1, player_y+1) == TL_PIXEL_OFF) && (TL_get_pixel(player_x-1, player_y+2) == TL_PIXEL_OFF)){
					draw_player(player_x, player_y, player_x -= 1, player_y);
				}else{
					check_place(player_x-1, player_y+1);
					update_map();
				}
				break;
			case dkey_down:
				if((TL_get_pixel(player_x, player_y+3) == TL_PIXEL_OFF) && (TL_get_pixel(player_x+1, player_y+3) == TL_PIXEL_OFF) && (TL_get_pixel(player_x+2, player_y+3) == TL_PIXEL_OFF)){
					draw_player(player_x, player_y, player_x, player_y += 1);
				}else{
					check_place(player_x+1, player_y+3);
					update_map();
				}
				break;
		}
		key = TL_direct_input(dkey_group_2);
	}
}

void update_map(void){
	bcall(_cleargbuf);
	TL_large_sprite(0, 0, 12, 64, map);
	TL_small_sprite(player_x, player_y, 3, map_player);
	TL_gbuf_to_lcd();
}

char draw_player(unsigned char old_player_x, unsigned char old_player_y, unsigned char player_x, unsigned char player_y){
	TL_small_sprite(old_player_x, old_player_y, 3, map_player);	// clear the player's sprite
	TL_small_sprite(player_x, player_y, 3, map_player);	// and re-draw it to its new place
	TL_gbuf_to_lcd();
}

char check_place(unsigned char player_x, unsigned char player_y){
	if(player_x > 5 && player_x < 19 && player_y > 4 && player_y < 31){
		// TOWER
	}else if(player_x > 25 && player_x < 58 && player_y > 3 && player_y < 36){
		// CASTLE
		TL_rectangle_filled(0, 37, 96, 27, TL_RECT_FILL_BLACK);
		TL_rectangle_filled(1, 38, 94, 25, TL_RECT_FILL_WHITE);
		TL_text(2, 38, text_castle, TL_TEXT_TYPE, 5);
	}else if(player_x > 57 && player_x < 95 && player_y > 0 && player_y < 25){
		// VOLCANO
	}else if(player_x > 29 && player_x < 49 && player_y > 39 && player_y < 54){
		// TOWN
	}else if(player_x > 59 && player_x < 95 && player_y > 32 && player_y < 63){
		if(player_x > 83 && player_x < 94 && player_y > 52 && player_y < 62){
			// HOUSE
		}else{
			// FOREST
			battle();
		}
	}
}

void battle(void){
	bcall(_cleargbuf);
	for(i = 0; i<4; i++){
generate_ennemy_coordinates:
		x_temp = TL_random(BATTLE_MAP_WIDTH-2)+1;
		y_temp = TL_random(BATTLE_MAP_HEIGHT/2)+1;
		if(GBA_collision((x_temp-GBA_scroll_x)*8, (y_temp-GBA_scroll_y)*8) > 0)
			goto generate_ennemy_coordinates;
		ennemy[i].x = x_temp;
		ennemy[i].y = y_temp;
		ennemy[i].hp = 3;
	}
	x_temp = battle_player_x;
	y_temp = battle_player_y;
	battle_player_direction = battle_player_up;
	while(key != skey_clear){
		if(battle_player_x < screen_w/16){
			camera_x = 0;
		}else if(battle_player_x > BATTLE_MAP_WIDTH-screen_w/16){
			camera_x = BATTLE_MAP_WIDTH-screen_w/8;
		}else{
			camera_x = battle_player_x-screen_w/16;
		}
		if(battle_player_y < screen_h/16){
			camera_y = 0;
		}else if(battle_player_y > BATTLE_MAP_HEIGHT-screen_h/16){
			camera_y = BATTLE_MAP_HEIGHT-screen_h/8;
		}else{
			camera_y = battle_player_y-screen_h/16;
		}
		update_battle_screen();
		key = TL_get_key();
		switch(key){
			case skey_up:
				if(is_location_empty(battle_player_x, battle_player_y-1) && GBA_collision((battle_player_x-GBA_scroll_x)*8, (battle_player_y-1-GBA_scroll_y)*8) == 0){
					battle_player_y -= 1;
					x_temp = battle_player_x;
					y_temp = battle_player_y-1;
				}
				battle_player_direction = battle_player_up;
				break;
			case skey_right:
				if(is_location_empty(battle_player_x+1, battle_player_y) && GBA_collision((battle_player_x+1-GBA_scroll_x)*8, (battle_player_y-GBA_scroll_y)*8) == 0){
					battle_player_x +=1 ;
					x_temp = battle_player_x+1;
					y_temp = battle_player_y;
				}
				battle_player_direction = battle_player_right;
				break;
			case skey_left:
				if(is_location_empty(battle_player_x-1, battle_player_y) && GBA_collision((battle_player_x-1-GBA_scroll_x)*8, (battle_player_y-GBA_scroll_y)*8) == 0){
					battle_player_x -= 1;
					x_temp = battle_player_x-1;
					y_temp = battle_player_y;
				}
				battle_player_direction = battle_player_left;
				break;
			case skey_down:
				if(is_location_empty(battle_player_x, battle_player_y+1) && GBA_collision((battle_player_x-GBA_scroll_x)*8, (battle_player_y+1-GBA_scroll_y)*8) == 0){
					battle_player_y +=1 ;
					x_temp = battle_player_x;
					y_temp = battle_player_y+1;
				}
				battle_player_direction = battle_player_down;
				break;
			case skey_2nd:
				GBA_restore_map();
				draw_ennemies();
				battle_player_direction+=2*8;	// go to the attack sprite
				GBA_draw_mask_sprite((battle_player_x-GBA_scroll_x)*8, (battle_player_y-GBA_scroll_y)*8, 1, 8, battle_player_direction, GBA_CLIP_SPRITE);
				TL_gbuf_to_lcd();
				TL_delay(5);
				battle_player_direction-=2*8;	// go back to the normal sprite
				// if !is_location_empty(x_temp, y_temp){
					// someone has been touched
				// }
				break;
		}
		// IA
		for(i = 0; i<4; i++){
			if(ennemy[i].x < battle_player_x && is_location_empty(ennemy[i].x+1, ennemy[i].y) && GBA_collision((ennemy[i].x+1-GBA_scroll_x)*8, (ennemy[i].y-GBA_scroll_y)*8) == 0){
				if(ennemy[i].x+1 == battle_player_x && ennemy[i].y == battle_player_y)
					hit_player();
				else
					ennemy[i].x += 1;
			}else if(ennemy[i].x > battle_player_x && is_location_empty(ennemy[i].x-1, ennemy[i].y) && GBA_collision((ennemy[i].x-1-GBA_scroll_x)*8, (ennemy[i].y-GBA_scroll_y)*8) == 0){
				if(ennemy[i].x-1 == battle_player_x && ennemy[i].y == battle_player_y)
					hit_player();
				else
					ennemy[i].x -= 1;
			}
			if(ennemy[i].y < battle_player_y && is_location_empty(ennemy[i].x, ennemy[i].y+1) && GBA_collision((ennemy[i].x-GBA_scroll_x)*8, (ennemy[i].y+1-GBA_scroll_y)*8) == 0){
				if(ennemy[i].x == battle_player_x && ennemy[i].y+1 == battle_player_y)
					hit_player();
				else
					ennemy[i].y += 1;
			}else if(ennemy[i].y > battle_player_y && is_location_empty(ennemy[i].x, ennemy[i].y-1) && GBA_collision((ennemy[i].x-GBA_scroll_x)*8, (ennemy[i].y-1-GBA_scroll_y)*8) == 0){
				if(ennemy[i].x == battle_player_x && ennemy[i].y-1 == battle_player_y)
					hit_player();
				else
					ennemy[i].y -= 1;
			}
		}
	}
}

void update_battle_screen(void){
	GBA_init_map(camera_x, camera_y, 20, 20, tiles, battle_map);
	GBA_restore_map();
	GBA_draw_mask_sprite((battle_player_x-GBA_scroll_x)*8, (battle_player_y-GBA_scroll_y)*8, 1, 8, battle_player_direction, GBA_CLIP_SPRITE);
	draw_ennemies();
	TL_gbuf_to_lcd();
}

void draw_ennemies(void){
	for(i = 0; i<4; i++){
		GBA_draw_mask_sprite((ennemy[i].x-GBA_scroll_x)*8, (ennemy[i].y-GBA_scroll_y)*8, 1, 8, battle_ennemy, GBA_CLIP_SPRITE);
	}
}

char is_location_empty(unsigned char x, unsigned char y){	// return 1 (TRUE) if there's noone at the location, otherwise return 0 (FALSE)
	// check if an ennemy is there
	int flag = 1;
	for(j = 0; j<4; j++){
		if(ennemy[j].x == x && ennemy[j].y == y){
			flag = 0;
		}
	}
	return flag;
}

void hit_player(void){
	TL_rectangle_filled((battle_player_x-GBA_scroll_x)*8, (battle_player_y-GBA_scroll_y-1)*8, 10, 10, TL_RECT_FILL_BLACK);
	TL_rectangle_filled((battle_player_x-GBA_scroll_x)*8+1, (battle_player_y-GBA_scroll_y-1)*8+1, 8, 8, TL_RECT_FILL_WHITE);
	TL_gbuf_to_lcd();
	TL_delay(10);
}
Posté le 27/06/2013 à 16:34 Membre depuis le 03/06/2011, 520 messages
Uyy... ce code ! C'est vraiment plus facile de comprendre le C que l'asm ? Tous les calculs me donnent du vertige ! Je crois que l'asm est plus beau :P Mais c'est vrai t'as fait de bon progrès, bien que je suis navré pour ton petit homme, ces monstres semblent avoir pas mal de faim ! grin
Posté le 27/06/2013 à 21:26 Membre depuis le 15/03/2005, 3470 messages
Bien sûr que l'asm est plus beau et permet de faire de meilleurs optimisations, ça c'est clair, mais là c'est juste un test en C très mal programmé pour voir ce qu'on peut éventuellement faire sur TI avec.

De façons objective je pense que le C reste plus facile à comprendre que l'asm pour des non initiés, mais c'est tout tongue