Logicielsmoto.com

Nous sommes le 22 Juil 2019, 10:44

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 6 messages ] 
Auteur Message
MessagePosté: 27 Aoû 2014, 17:15 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1110
Localisation: Brest
Bon alors voilà, vous avez fait un programme en basic 1 ou 2 sur TO et vous aimeriez que le ctrl-c ne permette plus de stopper l’exécution du programme. Comment faire ?

Et bien après avoir tracé les appels à $E809 (KTST) et desassemblé une partie des deux basic j'ai trouvé une stratégie qui marche.

Pour le basic 2:
Code:
poke &h67F6,mki$(&h3262)+chr$(&h39)

Pour le basic 1:
Code:
poke &h6294,&h32:poke &h6295,&h62:poke &h6296,&h39

Pourquoi ca marche ? Et bien voyons le cas du basic1 (le 2 est identique sauf que les adresses sont décalées). Le basic 1 appele $E809 en $32BE à partir d'un point d'entrée en $32BB:
Code:
32BA 39         RTS                   
...
32BB BD6294     JSR    $6294 (POINT ENTREE SCRUTATION CLAVIER PAR LE BASIC)             
32BE BDE809     JSR    $E809 (KTST: touche appuyée ?)             
32C1 24F7       BCC    $32BA (NON ==> RTS)             
32C3 3404       PSHS   B     (ICI: touche appuyée)
... (Reste du code: Appel GETC, détection CTRL-C, etc)

Ce qui est intéressant est le JSR $6294 juste avant. Il pointe sur un RTS en page 0 du basic. Les pokes que je fais remplacent ce RTS par
Code:
6294 3262       LEAS   $02,S               
6296 39         RTS                       
(on écrase des zones non accédées de la page 0 apparemment)

Ce qu'il se passe c'est que le code ASM dépile le retour en $32BE, ce qui fait que le RTS retourne directement à l’appelant de $32BB, sans passer par les routines KTST et GETC. Bref: les ctrl-c et stop ne sont plus détectés.

Résultat: on ne peut plus stopper ou pauser le programme basic! Bien entendu les inkey$ et input$ continuent de fonctionner comme avant car on a juste modifier la scrutation du clavier entre l’exécution de deux instruction basic. Cadeau bonux: le basic est en plus un poil plus rapide! :cool:

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 27 Aoû 2014, 23:02 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
Samuel Devulder a écrit:
Bon alors voilà, vous avez fait un programme en basic 1 ou 2 sur TO et vous aimeriez que le ctrl-c ne permette plus de stopper l’exécution du programme. Comment faire ?

Samuel, tu es un petit coquin ;)

Samuel Devulder a écrit:
Pour le basic 2:
Code:
poke &h67F6,mki$(&h3262)+chr$(&h39)

poke &h67F6,"2b9" est pas mal aussi. Avec son pendant PEEK$ (découvert par Obsidian).

Samuel Devulder a écrit:
Résultat: on ne peut plus stopper ou pauser le programme basic! Bien entendu les inkey$ et input$ continuent de fonctionner comme avant car on a juste modifier la scrutation du clavier entre l’exécution de deux instruction basic.

Certes, mais l'effet de l'instruction ON KEY n'existe plus :L Ainsi que l'effet de CNT+C ou STOP sur des LIST ou tout autre commande en mode direct (re :L )

Samuel Devulder a écrit:
Cadeau bonux: le basic est en plus un poil plus rapide! :cool:

Ah, les optimisations de l'interpréteur Basic! Un vieux rève de programmeur...

Pour bien faire, il faudrait plutôt installer un programme complet, et l'indirection jumperait dessus :

Code:
PRG     LEAS    2,S             Vide la pile du PC de retour
        JSR     $E809           Lecture rapide du clavier
        PSHS    B                |
        BHS     OUT             Sort si pas d'inkey
        JSR     $E806           Lecture du clavier
        TSTB                    | Sort si pas d'inkey
        BEQ     OUT             |
        CMPB    #$03             | Sort si CNT+C
        BEQ     OUT              |
        CMPB    #$02            | Sort si STOP
        BEQ     OUT             |
        STB     $6B61           Sauve code pour ON KEY
OUT     PULS    B,PC             |

avec $65B1 pour le code ON KEY sous Basic 1.0. Mais ça n'est évidemment plus aussi cool...

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 27 Aoû 2014, 23:30 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1110
Localisation: Brest
Prehisto a écrit:
Samuel Devulder a écrit:
Pour le basic 2:
Code:
poke &h67F6,mki$(&h3262)+chr$(&h39)

poke &h67F6,"2b9" est pas mal aussi. Avec son pendant PEEK$ (découvert par Obsidian).

En fait "2b9" c'est exactement ce qu'affiche mki$(&h3262)+chr$(&h39) en bien plus court! Je n'ai pas eu la curiosité d'afficher la chaine jusqu'à ce que tu en parles. Et du coup je me demande si je n'étais pas tombé sur ce "2b9" par le passé dans les D7 d'introduction du TO9. Cette chaine me dit quelque chose de familier maintenant que je la vois dans un poke.

C'est quoi le pendant PEEK$ découvert par Obsidian ?

Citation:
Certes, mais l'effet de l'instruction ON KEY n'existe plus :L Ainsi que l'effet de CNT+C ou STOP sur des LIST ou tout autre commande en mode direct (re :L )

Yep, il ne faut ajouter ce poke que si on est sur la production du programme final. L'idéal serait de protéger ce poke par un test vérifiant si le programme est protégé par SAVE,P. Du coup en mode débug on peut encore faire break, mais en mode production, la scrutation clavier est désactivée.

Le fait que on KEY ne marche pas est par contre ennuyeux en effet. Perso je ne l'ai pas souvent utilisé, et lorsque je l'ai fait, j'ai trouvé qu'un test sur le INKEY$ dans la boucle principale permet de plus facilement de protéger les variables.

Citation:
Pour bien faire, il faudrait plutôt installer un programme complet, et l'indirection jumperait dessus :

Code:
PRG     LEAS    2,S             Vide la pile du PC de retour
        JSR     $E809           Lecture rapide du clavier
        PSHS    B                |
        BHS     OUT             Sort si pas d'inkey
        JSR     $E806           Lecture du clavier
        TSTB                    | Sort si pas d'inkey
        BEQ     OUT             |
        CMPB    #$03             | Sort si CNT+C
        BEQ     OUT              |
        CMPB    #$02            | Sort si STOP
        BEQ     OUT             |
        STB     $6B61           Sauve code pour ON KEY
OUT     PULS    B,PC             |

avec $65B1 pour le code ON KEY sous Basic 1.0. Mais ça n'est évidemment plus aussi cool...

C'est beaucoup plus propre en effet. Mais il faut trouver un peu plus d'octets dispo en mémoire pour planquer le code et mettre un saut direct vers PRG en $67F6.

Quand je vois que le basic tapes dans $6B61, je me demande jusqu'où il utilise la partie basse de la mémoire ? $7000 ou plus ?

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 28 Aoû 2014, 08:43 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
Samuel Devulder a écrit:
C'est quoi le pendant PEEK$ découvert par Obsidian ?
C'est une instruction cachée du Basic 512, dégottée par Obsidian donc, qui a fait le sujet d'un article dans la revue ContacThoms en son temps, sous la forme, par exemple :
Code:
?PEEK$(0,24)
Le premier paramètre indique l'adresse, le deuxième le nombre de caractères, et l'instruction renvoie une chaîne de caractères. Ce qui, dans notre cas, affiche :
Code:
 BASIC 512 MICROSOFT 1.0


Samuel Devulder a écrit:
Le fait que on KEY ne marche pas est par contre ennuyeux en effet. Perso je ne l'ai pas souvent utilisé, et lorsque je l'ai fait, j'ai trouvé qu'un test sur le INKEY$ dans la boucle principale permet de plus facilement de protéger les variables.
Rarement utilisé, mais probablement ou par ignorance, ou pour des raisons d'incompatibilité.

Samuel Devulder a écrit:
Quand je vois que le basic tapes dans $6B61, je me demande jusqu'où il utilise la partie basse de la mémoire ? $7000 ou plus ?
Oui, au-delà $7000. La raison pour laquelle le Basic 512 n"accepte pas de CLEAR sec en deça de quelque chose comme &h71C3, et encore plus bas pour le Basic 1.0.

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 28 Aoû 2014, 08:52 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1110
Localisation: Brest
Prehisto a écrit:
C'est une instruction cachée du Basic 512, dégottée par Obsidian donc, qui a fait le sujet d'un article dans la revue ContacThoms en son temps, sous la forme, par exemple :
Code:
?PEEK$(0,24)
Le premier paramètre indique l'adresse, le deuxième le nombre de caractères, et l'instruction renvoie une chaîne de caractères. Ce qui, dans notre cas, affiche :
Code:
 BASIC 512 MICROSOFT 1.0

C'est géant ca! Il faut que je l'essaye pour mon animation en basic façon stores vénitiens.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 28 Aoû 2014, 09:20 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
Samuel Devulder a écrit:
Mais il faut trouver un peu plus d'octets dispo en mémoire pour planquer le code et mettre un saut direct vers PRG en $67F6.
Si tu veux littéralement "planquer" du code avec le Basic 512, l'adresse $6187 peut t'intéresser. Dixit le Désassemblage du Basic 512 par Obsidian : "Cette adresse est ensuite utilisée comme base pour toute opération de l'ordre de CLEAR ou assimilé. La bonne méthode, donc, pour installer un programme résident protégé et inamovible, comme le sont les drivers, est d'augmenter la valeur en 6187 de la taille du programme résident à installer, pour recopier ce dernier en l'espace ainsi libéré. Le programme résident se trouve alors juste après les variables du Basic et juste avant l'espace réservé pour les opérations du Basic, et est ainsi protégé contre toute restructuration ou redimensionnement par CLEAR ou autre."

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 6 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
cron
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com