Précisions pour Crash

1) Compilation
2) Différences 82/83
3) règles\ajouts
4) routines utiles
5) quelques exemples de conversion

1) Compilation

Pour la ti82, là aussi il faut programmer pour un shell. J'utilise Crash.
Placez Crashsdk et Tasm ds le même répertoire (exemple Csdk). Placez votre fichier avec l'extension .asm uniquement.
Allez sous dos et tapez :
cd \Crshsdk [enter]
Crasm.bat nomdufichier (sans l'extension)

S'il y a des erreurs, elles vous sont indiqués. le programme générés sera automatiquement détecté par Crash.

Deux petites modifications sont nécessaires pour un plus grand confort de programmation :

- Dans le fichier Crasm.bat : remplacez la ligne : TASM -B -80  -Q -R16 %1.ASM par TASM -B -80 -I -Q -R16 %1.ASM

- Dans le fichier Crash82.inc : ligne 332 remplacez k_n par k_ns ou toute autre syntaxe. Le petit n correspond au n des suites.

Maintenant crash ne fera plus la différence entre majuscule et minuscule.

2) Différences 82/83

Voici le programme le plus simple pour Crash.

.INCLUDE CRASH82.INC
.DB "Efface Ecran",0
    ROM_call(CLEARLCD) ; efface l'écran
    CALL CR_KHAND ; saisie d'une touche, ici pour faire une pause
    RET
 

C'est facile vous voyez et en plus pas besoin de mettre un .end à la fin de votre programme.

Crash82.inc est très bien documenté (en anglais) donc si vous rencontrez un problème, consultez ce fichier.
Le seul hic c'est le peu de routines systèmes référencées, voici la liste de toutes celles déclarées dans Crash :
 

; Utilisez CALL pour appeler ces routines. Ce sont des fonctions présentes dans Crash

EXIT_2_TIOS ; Sort directement de Crash et efface l'écran (pour les sorties rapides en cours....
RAND ; retourne un nombre aléatoire dans a entre 0 et 127
CP_HL_BC ; Compares HL and BC
CR_KHAND ; équivalent de _getkey sur 83
CR_GRBCopy ;  copie plotsscreen (free_a1 pour Crash) à l'écran

L'avantage de Cr_Khand contrairement à key_hand ou _getkey (définie plus bas) est de ne pas planter la caltos lorsque vous appuyez sur 2nde+ON..
Cr_GRBCopy est encore en test donc tester cette fonction sur votre ti.

; Utilisez CALL pour ces routine systèmes
LD_HL_MHL ; = HL=(HL), A=L
CP_HL_DE ; = _cphlde sur 83
UNPACK_HL ; HL=int(HL/10), A=HL MOD 10 (mod= modulo, a contient le reste de la division de hl par 10)
DIV_HL_A ; HL=int(HL/A), A=HL MOD A
GET_KEY ;  = _getk sur 83
DISP_DELAY  ; = _lcd_busy sur 83
 

; utilisez ROM_CALL(xxx
; si vous trouvez des fonctions non incluses ici, définissez la dans votre programme comme avec la 83.
; Il faut juste faire attention, si les adresses proviennent d'une ti avec une rom version 19, il faut soustraire $1A (soit 26d ) de cette adresse.

TR_CHARPUT  ; = _putmap
TX_CHARPUT ; = _putc
D_ZT_STR ; = _puts
D_LT_STR = $373E ; _puts. Le 1er nombre avant la chaîne de caractère détermine le nombre de caractères à afficher, exemple .db 7, "Hello",0
D_HL_DECI = $387C ; = _disphl
NEXT_LINE = $377A ; = _newline
SCROLL_UP = $3786 ; Permet de réécrire une ligne de texte sur une autre ligne.

Exemple :

xor a
ld ($8C8F),a
ld a,6
ld ($8C90),a
rom_call(scroll_up) ; le texte de la première ligne sera réécrit à la 6ème ligne

M_CHARPUT = $37CE ; =
D_ZM_STR ; _vputs

D_LM_STR ; _vputs. Le 1er nombre avant la chaîne de caractère détermine le nombre de caractères à afficher, exemple .db 7, "Hello",0

CLEARLCD ; efface seulement l'écran
CLEARTEXT_W ; efface l'écran et la memoire texte (Textshadow sur 83)
CLEARTEXT_F  ; efface l'écran et la memoire texte (Textshadow sur 83). Je sais qu'il y a une petite diffèrence mais je suis incapable de vous la décrire.
CLEAR_DISP = $38CA ; efface l'écran mais pour la différence avec clearlcd........
BACKUP_DISP = $39C6 ; Copie l'écran dans le buffer apd (automatic powerdown)
RESTOR_DISP = $38DC ; Copie à l'écran le contenu du buffer apd
 

; Ces fonctions sont incluses dans crash pour ne pas trop perturber les programmateurs pour 83. Il est recommandé d'utiliser d'autres routines plus adaptées.

DISP_GRAPH ; = grbufcpy_v
KEY_HAND ; Get key using key handler (2nd, alpha, contraste). Si ON est pressé, la caltos crash. Utiliser
cr_khand à la place.
_GRBUFCPY_V = DISP_GRAPH ; Si vous écrivez rom_call(_grbufcpy), il n'y aura pas d'erreur.C'est pour cela que ces deux commandes sont définies ici.
_GETKEY = KEY_HAND

Les adresses mémoires définies Crash82.inc :

CURSOR_ROW ; = currow sur 83
CURSOR_COL  ; = curcol sur 83

CURSOR_X ; pencol sur 83
CURSOR_Y ; penrow sur 83
CRASH_VER ; version de Crash
VAT_START ; adresse mem au débute le VAT ( table des programmes )

Modes :

set 3, (iy+$05) : écriture noir sur blanc, res pour désactiver.

set 1,(iy+$0D) : Sauve les caractères écrits dans Text_mem, res pour que la sauvegarde ne s'effectue pas.

res 1,(iy+$05) : affiche seulement 6 lignes de texte, set pour les 7 lignes.

res 3,(iy+$05) : affiche les caractères dépassant les limites de l'écran.

set 3,(iy+$05) : les caractères sont Xor avec l'écran.

Voici les zones de mémoire, utilisable pour la programmation asm :

FREE_A1 = GRAPH_MEM ;768 octets, = plotsscreen sur 83
FREE_A2 = TEXT_MEM ;128 octets, =Textshadow sur 83
FREE_A3 = OP1 ; C'est la zone mem des op, si vous ne les utilisez pas.
FREE_B = TEXT_MEM2 ;128 octets, cette zone est effacé après un call cr_khand
FREE_C = APD_BUF ;768 octets, buffer apd (automatic powerdown)

3) Règles\Ajout

Crash peut lancer des programmes ayant une taille d'au maximum 27ko

Au démarrage de Crash, le programme efface graph_mem, textmem, cursor_x, cursor_y, cursor_row, cursor_pos et presque tous les registres. Cash active aussi les interruptions.

Crash peut exécuter des programmes pour Ash3.0
 
 

4) Routines Utiles

Comme il n'y a pas beaucoup de fcts dispo. Il faut les coder.

Pour afficher un sprite : C'est une routine de MovAx.

DrwSpr:
    LD IX, Ship ; get address to ship sprite, IX -> sprite
    LD A, (ShipX) ; x coord is ShipX
    LD HL, GRAPH_MEM+732 ; y coord is always 61, add Graph_mem+61*12
    LD D, 0 \ LD E, A ; Do x/8
    SRL E \ SRL E \ SRL E
    ADD HL, DE
    AND %00000111 ; Get the remainder of x/8
    JR Z, Aligned ; Is this sprite aligned to 8*n,y?
    LD E, 3 ; Line loop
    LD B, A ; B=how many bits to shift each line
    LD C, 0 ; C=empty
LineLoop:
    PUSH BC ; Shift loop
    LD A, (IX+0) ; Get sprite data
ShiftLoop:
    RRA \ RR C
    DJNZ ShiftLoop
    OR (HL) \ LD (HL), A ; Write line to graphbuf
    INC HL
    LD A, C
    OR (HL) \ LD (HL), A
    INC IX
    LD BC, 11 ; Calculate next line address
    ADD HL, BC ; Inc spritepointer
    POP BC
    DEC E
    JR NZ, LineLoop ; Next line
    RET
Aligned: ; Blit an aligned sprite to graphbuf
    LD B, 3
    LD DE, 12
AlignedLoop:
    LD A, (IX+0)
    OR (HL) ; xor=erase/blit
    LD (HL), A
    INC IX
    ADD HL, DE
    DJNZ AlignedLoop
RET

Voici une routine qui teste un pixel.

; ** GetPixel
; chargez les coord dans les registre b (x) et c (y)

; met à jour le flag Z (pixel-on)  ou NZ (pixel-off)

GetPixel:
PUSH HL
PUSH BC
FindPix:
LD A, B ; Save B (real X val)
LD B, 0
LD H, B
LD L, C
ADD HL, HL
ADD HL, BC
ADD HL, HL
ADD HL, HL
LD C, A
SRL C
SRL C
SRL C
ADD HL, BC
LD BC, GRAPH_MEM
ADD HL, BC
LD B, %10000000
AND %00000111
JR Z, GetPixDone
LD C, A
LD A, B
LD B, C
ShloopGetPix:
RRA
DJNZ ShloopGetPix
LD B, A
GetPixDone:
LD A, (HL)
AND B
POP BC
POP HL
RET