**************************************** * SNG v1.0 * * Shell avec Niveaux de Gris * * * * par Marc Plouhinec * * le 10/08/2004 * * site: http://thebestof.vze.com * * Email: mailto://m_plouhinec@yahoo.fr * * * **************************************** SOMMAIRE: 1 Introduction 2 Mode d'emploi 3 Programmer pour SNG 4 Comment programmer avec le son 5 Comment utiliser les interruptions 6 Les librairies 7 Comment utiliser les niveaux de gris 8 Editeur hexadécimal 9 Debuggeur 10 Listes des variables 1 Introduction: --------------- SNG signifie Shell avec Niveaux de Gris bien qu'il n'y a plus ces fonctions directement dans le shell. SNG est sous licence GPL ce qui signifie que vous pouvez le modifier et le distribuer librement. C'est un shell qui a pour but d'être aussi pratique pour les utilisateurs que pour les programmeurs, c'est pourquoi il possède des fonctions innovantes pour la TI-82 (gestion de librairies, installation d'interruptions, execution de code dans un buffer donné). Les programmes pour SNG sont disponible sur mon site (www.thebestof.tk ou marcplouhinec.free.fr) et sur ticalc.org. 2 Mode d'emploi: ----------------- Pour lancer un programme il suffit de le lancer comme un programme BASIC (attention à ne pas appeler un programme ASM par du code BASIC). Vous pouvez aussi utiliser une interface comme celle livrée avec SNG. 3 Programmer pour SNG: ------------------------ Le fichier "aide pour compiler pour SNG.bat" est là pour vous aider. Cliquez du bouton droit et selectionnez 'Edition' et remplacez 'test' par le nom de votre programme. N'oubliez pas de rajouter #include "sng10.inc" au début de votre programme. Le fichier sngdef.inc est une liste de fonctions pratiques, n'hésitez pas à l'utiliser. Pour les librairies c'est un peu différent, allez voir la partie "Les librairies". Si vous ne savez pas programmer en assembleur vous pouvez lire le tutoriel "ASM corner" à cette adresse: http://marcplouhinec.free.fr/calculatrices/ti/ti-82/tutoriel/progasm/Comment_programmer_en_ASM_sur_la_TI82.html 4 Comment programmer avec le son -------------------------------- Il faut d'abord brancher des écouteurs après s'être fabriqué un adaptateur. Dans le programme, il faut faire: LD HL,700 ;HL=ton LD DE,100 ;DE=durée CALL BEEP BEEP est une fonction que vous pouvez trouver dans sngdef.inc Allez voir la source du programme "son.asm" pour plus de détails. 5 Comment utiliser les interruptions ------------------------------------- Les interruptions sont un peu comme du multi-tâche, une ou plusieurs routines sont exécutées en même temps que le programme. Voila comment les utiliser: LD DE,nom_de_la_routine_à_exécuter_en_interruption CALL NEW_INTERRUPT boucle_générale: (...) JP NZ,boucle_générale LD A,0 ;A=numéro de l'interruption CALL STOP_INTERRUPT RET nom_de_la_routine_à_exécuter_en_interruption: (...) RET Allez voir la source du programme "interrupt.asm" pour plus de détails. 6 Les librairies ---------------- Les librairies sont des programmes contenant un regroupement de routines prêtes à l'emploi. Vous devez les initialiser avant de les utiliser (SNG adapte les adresses car une librairie n'est pas déplacée), vous devez aussi les désinitialiser quand vous n'en avez plus besoin. Vous pouvez utiliser au maximum 8 librairies en même temps. Du coté de l'utilisateur une librairie est un simple programme qu'il doit inclure pour faire marcher ses programmes. Du coté du programmeur c'est un peu plus compliqué mais ne vous inquitez pas, des macros sont là pour vous aider. Allez voir les programmes test4 (lib), test(graylib) et test2(graylib). 6.1 Programmer avec des librairies ---------------------------------- Un fichier .inc est associé à une librairie, il contient les macros et les adresses dont vous aurez besoin, vous devez simplement inclure ce fichier au début de votre programme. Pour utiliser une librairie vous devez l'initialiser avec la macro INITLIB (regarder le fichier .inc pour le nom exact), cette macro vérifie si la librairie est dans la calculette puis adapte les adresses; cette macro modifie le registre A, si tout s'est bien déroulé, A=1 sinon A=0. Ensuite il vous faut l'adresse où démarre le code de la librairie, pour cela utilisez la macro SEARCHLIB qui vous renvoie l'adresse du code dans HL. Quand vous voulez utiliser une routine de la librairie vous utiliser la macro LIBCALL(ROUTINE,AdresseDeLaLib), cette macro est générique, c'est à dire qu'elle fonctionne tout le temps mais elle n'est pas optimisée, pour optimiser un appel vous pouver y stocker l'adresse grace à la macro STOCKLIBCALL qui vous renvoie dans HL l'adresse de l'appel. Enfin pour désinitialiser la librairie utilisez la macro STOPLIB. Regardez l'exemple test.asm qui utilise la librairie GRAYLIB. 6.2 Programmer une librairie ---------------------------- Une librairie est un programme ASM qui doit respecter un minimum de règles au niveau de son organisation. Le fichier "aide pour compiler une lib pour SNG.bat" est là pour vous aider à compiler une librairie. Une librairie doit commencer par: |#include "sng10.inc" | .ORG $0000 puis par une table de routines de la librairie: | JP ROUTINE1 | JP ROUTINE2 | JP ROUTINE3 Ensuite programmez ces routines comme vous l'entendez, vous devez les terminer par un RET. Pour résumer voici la structure d'une librairie: |#include "sng10.inc" | .ORG $0000 | |;On créer une table de fonctions: | JP ROUTINE1 | JP ROUTINE2 | JP ROUTINE3 | |ROUTINE1: | ~~~~~ | RET | |ROUTINE2: | ~~~~~ | RET | |ROUTINE3: | ~~~~~ | RET | |.END Regarder GRAYLIB pour un exemple concret. Une fois la librairie programmée, vous devez faire un fichier .inc Placez-y les adresses des routines de votre librairie ainsi que les macros. Mettez obligatoirement ces macros en modifiant "NOMLIB",0 : |#DEFINE INITLIB LD DE,NomLib\ CALL INIT_LIBRARY | |;sortie: HL = adresse de la lib |#DEFINE SEARCHLIB LD HL,LIB_BUFFER\ChercheLib:\ PUSH HL\ PUSH DE\ LD DE,NomLib\ LD C,0\ CALL CP_STRING\ OR A\ JR NZ,ChaineTrouvee\ POP DE\ POP HL\ LD BC,10\ ADD HL,BC\ JR ChercheLib\NomLib .DB "NOMLIB",0\ChaineTrouvee:\ POP DE\ POP HL\ LD DE,8\ ADD HL,DE\ CALL LD_HL_MHL | |#DEFINE STOPLIB LD B,0\ LD HL,LIB_BUFFER\ChercheLib2:\ PUSH BC\ PUSH HL\ PUSH DE\ LD DE,NomLib\ LD C,0\ CALL CP_STRING\ OR A\ JR NZ,ChaineTrouvee2\ POP DE\ POP HL\ LD BC,10\ ADD HL,BC\ POP BC\ INC B\ JR ChercheLib2\ChaineTrouvee2:\ POP DE\ POP HL\ POP BC\ LD A,B\ CALL STOP_LIBRARY | |#DEFINE LIBCALL(adresse,AdresseLib) PUSH BC\ LD HL,(AdresseLib)\ LD BC,adresse\ ADD HL,BC\ POP BC\ CALL CALL_HL | |#DEFINE STOCKLIBCALL(adresse,AdresseLib) PUSH BC\ LD HL,(AdresseLib)\ LD BC,adresse\ ADD HL,BC\ POP BC 7 Comment utiliser les niveaux de gris: ---------------------------------------- Pour créer les niveaux de gris, SNG fait clignoter des pixels, les images sont enregistrées dans deux plans (le plan 0 pour le gris clair et le plan 1 pour le gris foncé). Si vous voulez faire du blanc, laisser les plans 0 et 1 vide. Si vous voulez faire du gris clair, remplissez seulement le plan 0. Si vous voulez faire du gris foncé, remplissez seulement le plan 1. Si vous voulez faire du noir, remplissez les deux plans. Pour utiliser les niveaux de gris vous devez d'abord inclure le fichier GRAYLIB.inc dans votre programme, ensuite vous devez allouer 768 octets pour PLANE_1, pour cela faites un label tout à la fin de votre programme nommé PLANE_1 puis utiliser la macro CREATEBUFFERANDTESTMEM1(768,PLANE_1) ou la macro CREATEBUFFERANDTESTMEM2(768,PLANE_1,LabelPasAssezdeMem). Ensuites initialisez la librairie GRAYLIB grace à: | INITGRAYLIB ; | OR A ;Initialise la librairie GRAYLIB, quitte si elle n'est pas dans la calculette | RET Z ; | | SEARCHGRAYLIB ; | LD (AdresseLib),HL ;Stocke dans AdresseLib l'adresse de la librairie Activez les niveaux de gris et effacer les buffers: | LD DE,PLANE_1 ; | LIBCALL(GRAYSCALE_ON,AdresseLib) ;Active les niveaux de gris | | LIBCALL(CLR_BUF,AdresseLib) ;Efface les buffers PLANE Pour désactiver les niveau de gris faites: | LIBCALL(GRAYSCALE_OFF,AdresseLib) ;Désactive les niveaux de gris Pour désinitialiser la librairie GRAYLIB faites: | STOPGRAYLIB Puis détruisez PLANE_1: | DELBUFFER(768,PLANE_1) Allez voir les sources des programmes "test" et "test2" pour mieux comprendre. 8 Editeur hexadécimal: ------------------------ SNDEDIT a 3 modes d'affichages: -Le premier est accessible avec la touche Y=, c'est le mode par défaut. (Allez voir à l'adresse $2AC0, il y a des chaines de caractères de TI OS) Les touches: -haut,bas,droite,gauche = déplacement du curseur -division = - $1000 -multiplication = + $1000 -moins = - $100 -plus = + $100 -chiffres et lettre (A à F) = modification d'un nombre hexadécimal -Le second est le mode image, il est accessible avec la touche WINDOW. (Allez voir dans le programme SNG et vous trouverez le titre du shell) Les touches: -haut,bas,droite,gauche = déplacement -Le troisième est le mode sprite, il est accessible avec la touche ZOOM. (Allez voir les adresses à partir de $590d, c'est là où sont enregistrés les caractères) Les touches: -haut,bas,droite,gauche = déplacement Important: Entre les adresses $4000 et $7FFF, c'est la ROM page 1. 9 Debuggeur: --------------- Le debuggeur SNGDEB peut désassembler et modifier un programme (Attention: ce programme ne fait pas la différence entre du code et des variables). Les touches: -haut,bas = déplacement du curseur -division = - $1000 -multiplication = + $1000 -moins = - $100 -plus = + $100 -enter = modification d'une instruction Comment modifier une instruction? On doit sélectionner l'instruction à modifier, appuyer sur 'ENTER', sélectionner la taille de l'instruction puis la choisir dans une liste (touches: haut,bas,plus,moins = déplacement du curseur). 10 Listes des variables ----------------------- Le programme SNGVAR affiche les variables et donne quelques détails. Il faut GRAYLIB pour faire fonctionner ce programme. Touches: -Haut selectionne la variable précédente -Bas selectionne la variable suivante -Enter donne des détail sur la variable -Mode quitte Envoyez-moi vos questions et vos suggestions!