Derniers sujets | » Numbers par Ver2guerre Dim 02 Avr 2023, 00:47
» Mort ? par godbod Dim 22 Aoû 2021, 12:23
» Network, essai 1 par godbod Dim 09 Juil 2017, 02:18
» GODBOD par godbod Sam 08 Juil 2017, 14:05
» mon humeur par Ver2guerre Sam 30 Juil 2016, 19:44
» [A voir] Programme de traduction original : WikiTranslate par AdRiWeB Lun 01 Fév 2016, 04:50
» Reprise ? par Emyl Jeu 14 Juin 2012, 21:17
» Euh, ah ? par Ver2guerre Dim 27 Mai 2012, 12:11
» Problème TI 89 Titanium non visible après mise à jour par abdoukid Mer 23 Mai 2012, 13:37
» Y'a quelqu'un ? par Ver2guerre Sam 21 Avr 2012, 23:10
|
Qui est en ligne ? | Il y a en tout 4 utilisateurs en ligne :: 0 Enregistré, 0 Invisible et 4 Invités Aucun Le record du nombre d'utilisateurs en ligne est de 367 le Dim 18 Oct 2009, 00:16 |
| | Auteur | Message |
---|
tama Admin
Nombre de messages : 12376 Age : 32 Localisation : DTC ? :triso: Humeur : =) items : o Personalized field : huh ? oO Réputation : 3 Points : 9457 Date d'inscription : 08/08/2007
Profil TI: 84+, 89 tita, 89 tita TO: infini :p Spécialité: C 68k
| Sujet: [ASM 83+/84+] VAT Sam 05 Juil 2008, 16:59 | |
| Ouép j'suis à fond dessus en ce moment, après la manipulation de la VAT sur 68k en C, voici quelques trucs utiles pour la VAT sur z80, en ASM Mais avouez que c'est intéressant quand même de pouvoir :
- Créer des "AppVars" pour stocker des données, impossibles à modifier par la voie "classique" comme un programme ou une liste
- Créer n'importe quelle variable à condition de connaitre sa structure
- Effacer tous les programmes d'une TI rien qu'avec quelques lignes
- etc...
Bon, si ça vous intéresse, on continue, sinon bah précédent/quitter (en haut à droite !) J'ai la flemme de faire un tuto bien structuré comme il faut, alors j'vais faire un tuto un peu en vrac :pLa fonction qui nous intéresse est la fonction "ChkFindSym", cette fonction retourne beaucoup d'informations sur une variable qu'on lui a passé (de façon particulière), mais en contrepartie détruit tous les registres (pensez à les sauvegarder à l'aide de PUSH) Cette fonction prend en entrée le registre OP1, qui contiendra le nom de la variable qu'on veut manipuler - Citation :
X : euh, mais - Code:
-
LD OP1,"MAVAR"
ça marche pas ?
Evidemment, il y a une façon particulière d'entrer le nom dans OP1 D'abord, il faut passer par le registre HL pour ensuite entrer le nom dans OP1 grâce à l'instruction Mov9ToOP1 qui revient à l'instruction RST 20h, plus légère (préférez toujours l'instruction RST au BCALL lorsque cela est possible) - Citation :
On va donc passer par HL, mais que stocker dans HL ?
Bonne question. On va stocker les données dans un label, un peu comme lorsque vous mettez du texte à afficher avec PutS ensuite : On commence donc par .DB Et ensuite ? Le deuxième octet du label indique le type de variable à laquelle on souhaite accéder, ce type peut s'étendre sur 2 octets dans le cas d'une chaine ou d'une liste par exemple. Vient ensuite les octets pour le nom de la variable, puis il faut terminer tout ça par un 0 Si vous voulez créer une variable, il faut ensuite indiquer la taille de la variable dans HL avant de faire appel à la fonction adéquate (Createxxx) Voici ce qu'il faut entrer pour les types de variables les plus courants : Programme HL = taille en octets (CreateProg)
| ProgObj,nom,0 Exemple : .db ProgObj,"TUTO",0 pour le programme nommé "TUTO"
| Chaine de caractères HL = taille en octets (CreateString)
| StrngObj,tVarStrng,tchaine,0 Exemple : .db StrngObj, tVarStrng, tStr2,0 pour la chaine Str2
| AppVar HL = taille en octets (CreateAppVar)
| AppVarObj,nom,0 Exemple : .db AppVarObj,"MirageOS",0 pour la variable de l'application du même nom
| Image (CreatePic)
| PictObj, tVarPict, timage,0 Exemple : .db PictObj,tVarPict,tPic8,0 pour l'image 8
| Programme protégé (contre l'édition) HL = taille en octets (CreateProtProg)
| ProtProgObj,nom,0 Exemple : .db ProtProgObj,"PROT",0
| Liste HL = nombre d'éléments (CreateRList)
| ListObj,nom,0 Exemple : .db ListObj,"RAND",0 pour la liste RAND
|
Si vous créez une variable, l'appel à la fonction correspondante renverra généralement :
- HL qui pointe sur la partie de la VAT correspondant à cette variable pour les informations (archivé ? caché ? type ...)
- DE qui pointe sur le premier octet pour pouvoir ensuite écrire dedans
- OP4 qui contient le nom entré dans OP1
/!\ En général, les registres AF, BC, OP1 et OP2 seront détruits /!\
Si c'est pour lire, vous pouvez, une fois ceci fait, faire appel à l'instruction ChkFindSymCelle-ci renvoie un pointeur vers la VAT dans HL, vers les données dans DE, B permettra de savoir si la variable est archivé (flash : 1) ou dans la RAM (0), C la taille du nom de la variable Attention pour DE : elle pointe sur la 1ère donnée, mais les 2 premiers octets d'une variable correspondent à sa taille ! Il faut donc penser à incrémenter 2 fois DE à l'aide de "INC DE" Elle retourne le "flag" C (carry) si la variable n'a pas été trouvée Voici ainsi un exemple pour chercher si un programme portant le nom entré en Str1 existe : - Code:
-
;headers etc...
LD HL,Str1_name RST 20h ;=bcall(_Mov9ToOP1) bcall(_ChkFindSym) RET C ;quitte si Str1 n'a pas été trouvé
INC DE ;saute les 2 octets de taille INC DE
LD HL,Program+1 ;HL pointe sur le premier 0 de Program
Copy: ;copie les données de Str1 dans ;program LD HL,(DE) ;copie une donnée de "Str1" vers ;Program INC DE LD A,(DE) CP 0 ;compare la donnée suivante à 0 JR NZ,COPY ;si elle est non nulle on revient à ;Copy
;maintenant c'est gâteau : il ne reste plus qu'à vérifier à l'aide de ChkFindSym :
bcall(_ChkFindSym) JR C,NO ;flag C : non, elle n'existe pas ;on saute au label "NO"
LD HL,yes_msg ;oui, elle existe : on l'affiche bcall(_PutS) RET ;quitte
NO: ;non, elle n'existe pas LD HL,no_msg bcall(_PutS) RET ;quitte
Str1_name : .db StrngObj,tVarStrng,tStr1,0
Program: .db ProgObj,0,0,0,0,0,0,0,0,0 ;on laisse suffisamment de 0 ;pour le nom du programme (8 ; car. max) + 0 de fin
yes_msg: .db "Oui",0
no_msg: .db "Non",0
(non testé, il peut y avoir des erreurs) |
| | | tama Admin
Nombre de messages : 12376 Age : 32 Localisation : DTC ? :triso: Humeur : =) items : o Personalized field : huh ? oO Réputation : 3 Points : 9457 Date d'inscription : 08/08/2007
Profil TI: 84+, 89 tita, 89 tita TO: infini :p Spécialité: C 68k
| Sujet: Re: [ASM 83+/84+] VAT Sam 05 Juil 2008, 17:10 | |
| La deuxième fonction qui nous intéresse maintenant est la fonction FindAlphaUp (ou FindAlphaDown) qui est l'équivalent de la fonction SymFindFirst() et SymFindNext() (ou SymFindPrev()) en C pour 68k Elle sert, une fois le type de variable à trouver communiqué à la variable, à trouver la variable suivante de ce type Le type de variable doit également être communiqué dans OP1, avec éventuellement "la suite" dans le cas d'une liste par exemple : Le code suivant permet d'effacer tous les programmes présents dans la calculatrice : - Code:
-
;headers et tout le bazar
bcall(_ZeroOP1) ;initialise la recherche : met OP1 à zéro LD A,ProgObj ;on cherche des programmes LD (OP1),A FindPrgm: ;boucle pour la recherche bcall(_FindAlphaUp) ;cherche le programme suivant bcall(_DelVarArc) ;efface la variable RET C ;oops, plus de programmes trouvés, on quitte JR FindPrgm
Je ne sais pas si cela efface toutes les variables ou seulement celles dont le nom est avant celui du programme (par ordre alphabétique), j'ai pas envie de tester en tout cas
Bon, j'crois que c'est à peu près tout pour le moment, on verra si j'ai d'autres infos par la suite ^^ N'hésitez pas à laisser des commentaires, remarques, ou à poster si vous ne comprenez pas quelque chose ^^ tama 05/07/08 |
| | | Ver2guerre chasseur en chef
Nombre de messages : 3145 Age : 113 Localisation : Partout en même temps (V2g quantique) Loisirs : #pkill boulet Humeur : Happy :) items : Personalized field : 12 jetons Réputation : 8 Points : 7546 Date d'inscription : 15/09/2007
Profil TI: (TI-89Tita)^2+TI83Plus TO: 50 [2380 - 2%] {54} Spécialité: Autres
| Sujet: Re: [ASM 83+/84+] VAT Sam 05 Juil 2008, 17:16 | |
| Ah là là !! Si je maîtrisais les z80, je comprendrai ce tuto. Et dans ce cas, j'aurais honte pour toi, et je te refairais ton tuto, en "bien organisé et tout et tout"... Mais je ne maîtrise pas les z80. |
| | | tama Admin
Nombre de messages : 12376 Age : 32 Localisation : DTC ? :triso: Humeur : =) items : o Personalized field : huh ? oO Réputation : 3 Points : 9457 Date d'inscription : 08/08/2007
Profil TI: 84+, 89 tita, 89 tita TO: infini :p Spécialité: C 68k
| Sujet: Re: [ASM 83+/84+] VAT Sam 05 Juil 2008, 17:17 | |
| lol ^^ Sipho il devrait être capable de corriger les (nombreuses) erreurs |
| | | Contenu sponsorisé
| Sujet: Re: [ASM 83+/84+] VAT | |
| |
| | | |
Page 1 sur 1 | |
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
|
|