Dans mon précédent article sur le remapping de touches, forcé grâce à AutoHotkey, je précisais que l'underscore (ou tiret bas) n'était tout simplement pas mappé sur un clavier PC avec ActiveGS, problème découlant en fait de KEGS et de son aversion pour les claviers AZERTY ! Sur le moment, je pensais pouvoir faire avec (ou plutôt sans). Mais depuis, j'ai commencé à utiliser GS/Bug, le debugger de l'Apple IIGS. Or, avec GS/Bug, pour poser un breakpoint sur un tool (sorte d'API du GS), il faut soit indiquer le numéro de ce tool, soit utiliser son petit nom, précédé, je vous le donne en mille, d'un underscore ! Je devais donc trouver une solution pour ramener ce caractère moribond à la vie sur un clavier PC bien de chez nous ! Pour ce cas précis, AutoHotkey n'étant pas une solution (on ne peut tout simplement pas remapper ce qui n'est pas mappé à la base !), j'ai donc dû me tourner vers une approche plus radicale : modifier directement ActiveGS !
Le patch présenté ici est minimal : je n'ai effectivement remappé "en dur" qu'un seul et unique caractère (donc un seul octet à changer).
Pourquoi ne pas en profiter pour remapper tout le clavier directement dans ActiveGS me direz-vous ?
Tout simplement car la modification d'un octet est bien plus simple à effectuer que de redéfinir entièrement la table de mappage (ce qui aurait nécessité la révision d'une cinquantaine d'octets). ActiveGS est régulièrement mis à jour, il faudra donc effectuer la modification à chaque nouvelle version, ce qui peut vite devenir rébarbatif quand il y a beaucoup d'octets à changer. Et comme le script AutoHotkey fait parfaitement bien le boulot pour le remapping de tous les autres caractères, je n'ai donc modifié que l'underscore dans l'EXE en lui-même.
Concrètement, il m'a fallu d'abord localiser la table de mapping dans l'exécutable. Je passe sur les détails : cela n'aura été qu'une longue et fastidieuse analyse du code désassemblé d'ActiveGS (j'aurais d'ailleurs sans doute gagné du temps en cherchant visuellement la table directement dans l'EXE). Une fois ceci fait, ne restait plus qu'à trouver un emplacement pour notre underscore, le plus logique étant évidemment de le remettre à sa place (sur la touche "8" donc).
Problème : le mapping par défaut d'ActiveGS/KEGS prévoit que sur la touche 8 se trouve également le caractère "*" (étoile). Remplacer ce caractère étoile par notre underscore rend bien évidemment caduc le remapping de l'étoile vers la bonne touche PC par le script. Heureusement, l'étoile se trouvant aussi reportée sur le pavé numérique, il suffira donc (comme pour le signe -) d'utiliser cette touche pour notre script de remapping.
En ce qui concerne le script justement, il faudra utiliser au moins la version 0.53 à partir de laquelle la bidouille "underscore" est prise en compte. Je vous renvoie une nouvelle fois vers l'article correspondant pour les mises à jour et le téléchargement de la dernière version de ce script.
Allez, il est temps de passer à l'action. La modification expliquée ci-après ne concerne bien évidemment que la version standalone PC d'ActiveGS. Un éditeur hexadécimal est nécessaire.
Une fois ActiveGS.exe ouvert dans l'éditeur, il faut faire une recherche hexa sur la suite d'octets : 380000002A000000. Il n'existe normalement qu'une seule occurrence de cette chaîne.
Une fois localisée, il suffit alors de remplacer le 2A de cette chaîne par 5F (qui correspond au caractère underscore). N'oubliez pas de sauvegarder avant de quitter. Et travaillez toujours sur une copie, on ne le dira jamais assez !
Voici un récapitulatif des offsets où remplacer 2A par 5F suivant les versions d'ActiveGS. J'ai également incorporé l'offset pour GSport (autre adaptation de KEGS qui souffre du même problème). J'essaierai de mettre à jour cette liste au fur et à mesure des sorties de nouvelles versions.
- ActiveGS 3.5.894 : offset A98C0
- ActiveGS 3.5.903 (beta) : octet A98C0
- GSport 0.2a : offset 56FA8
Et pour finir, voilà le résultat sous GS/Bug ! Mais bien entendu l'underscore est dispo peu importe l'application tournant sur le GS et est accessible depuis la touche classique d'un clavier PC ! N'oubliez pas d'utiliser conjointement au patch le script de remapping...
envoyé le 01-11-2012 à 18 h 42 min
Que perd-on avec cette modification ?
Je voudrais communiquer aux développeurs sur ce pb : ne touche-t-il que les claviers AZERTY ? quel(s) impact(s) ?
merci,
av
envoyé le 01-11-2012 à 19 h 11 min
On ne perd rien car en conjonction avec le script AutoHotkey, on a maintenant un remapping complet vers un clavier PC AZERTY.
C’est juste une bidouille visant à compenser le mapping par défaut, basé sur le code de KEGS en fait qui ne reconnait que le clavier QWERTY.
Mais bien entendu, au niveau développeur, il ne s’agirait pas de régler le problème de cette manière. D’autant plus qu’ActiveGS, étant diffusé internationalement, ne peut pas non plus n’être configuré que pour un clavier AZERTY.
C’est peut-être là d’ailleurs que réside la problématique à laquelle se heurtent les développeurs.
Sur la version iOS, le clavier iPhone/iPad est pleinement fonctionnel par contre. Sans doute qu’au niveau de l’OS, cela pose moins de problèmes d’avoir à gérer différentes configurations de touches.
Sur MacOSX, je ne sais pas comment ça se passe…
Sur les versions plugin pour browsers, on souffre du même problème.
Ma petite bidouille n’est juste qu’un pis aller pour permettre d’utiliser ActiveGS de manière optimale (et il le mérite). Mais sur un clavier AZERTY, c’est vite l’enfer sans remapping.
Je n’ai aucun doute sur les compétences des développeurs d’ActiveGS (que je salue humblement). En fait, je crois que l’idée première d’ActiveGS, c’était d’avoir un plugin pour browser permettant de lancer des jeux ou des démos Apple II depuis un site Web avec une interaction clavier de fait limitée.
Mais cet émulateur est tellement bon qu’il était dommage de ne pouvoir en profiter à fond sur PC (pour programmer notamment). D’où mon bricolage !
Si tu peux faire remonter l’info, c’est évidemment une bonne chose !
envoyé le 03-11-2012 à 1 h 10 min
Bon, je suis allé regarder dans le code, car en effet, le mappage du clavier français est une catastrophe sous KEGS32. Les lettres A-Z, ça va, le reste il faut tâtonner.
Conclusion, un simple patch ne marchera pas. Il faut recoder un bout.
L’explication est simple. Le clavier AZERTY du PC n’a pas la même disposition des touches que le clavier AZERTY du IIgs.
Exemple : La (désormais) fameuse touche 8.
Sur le PC, la touche 8 (au dessus du U) peut afficher soit un 8 soit un _ (underscore). Sur le IIgs, la touche 8 peut afficher soit un 8 soit un ! (point exclamation).
Or le code de KEGS envoie le code Touche vers la routine gérant l’ADB, sans préciser la valeur de la touche. Sans même indiquer quel symbole de la touche on veut (haut=8 ou bas=_).
Donc si on patch, on va taper un ‘_’ sur le PC et on va voir arriver un ‘!’ sur le IIgs. Alors forcément, ça va cadrer avec le mappage du IIgs en AZERTY, mais c’est pas non plus ce qu’on veut.
L’objectif, c’est que si on tape un ‘_’ sur un clavier Azerty d’un PC, il faut transmettre à l’ADB le code ‘_’, et pas le code touche.
Conclusion, il nous faut un automate qui prend en entrée la valeur de la touche du PC (ici ‘_’) et qui renvoie le code ADB correspondant à ‘_’.
Donc, il faut faire la table des 0x7F codes ADB possibles. En se rappelant que par exemple pour la virgule (,), on peut aussi l’obtenir en utilisant la touche VK_DECIMAL du pavé numérique. Plusieurs touches (ou combinaisons) côté PC amènent au même code côté ADB.
Bon, j’ai commencé, j’ai pas fini. Je vous tiens au courant…
Olivier
envoyé le 03-11-2012 à 9 h 57 min
On peut modifier la table pour faire correspondre l’underscore avec la touche 8 (à la place du caractère « étoile » qu’on obtient sous ActiveGS « normalement »).
Je n’ai modifié que celui-là « en dur » car mon script AutoHotkey fait le remapping des autres touches à la volée.
Par contre en patchant, effectivement, on n’aura jamais quelques choses de propre à 100% car par exemple la touche sur clavier QWERTY « -/_ » ,dont la correspondance est définie dans la table d’ActiveGS, n’existe tout simplement pas sur AZERTY.
Le code ne peut donc jamais être envoyé et les caractères correspondants dans la table ne sont jamais atteints !
C’est d’ailleurs pour ça que les caractères « – » et « _ » n’ont pas de correspondance direct dans ActiveGS avec un clavier PC AZERTY, sauf en passant par le pavé numérique pour le signe moins. Mais rien pour l’underscore par contre d’où le patch décrit plus haut.
Attention je parle bien dans mon article (et ici) d’ActiveGS. J’ai supposé que c’était la même chose dans KEGS vu que le coeur d’ActiveGS est basé dessus mais il est possible qu’ActiveGS se comporte un peu différemment du code original pour ça.
Merci en tout cas Olivier de t’intéresser au problème 🙂
envoyé le 03-11-2012 à 18 h 20 min
Bon, j’ai fini ma table et je décode correctement le clavier français. Youpi !
Il faut maintenant injecter cela à la place du code gérant l’ADB dans KEGS32. Et là, évidemment les ennuies commencent. KEGS32 est à la fois le problème (trop mal programmé) mais aussi la solution (pratique d’avoir un IIgs en C avec les sources qu’on peut modifier).
C’est pas gagné, je contine…
Olivier
envoyé le 04-11-2012 à 0 h 38 min
Bon, ça marche.
Pas 100% tout partout mais c’est un début.
Je dois encore nettoyer du code et vérifier certaines touches (notamment le ¨ et le ~ qui ont tendance à s’inverser). Le ç qui ne vaut pas sortir et le Control Panel qui reste muet (mais bon, je crois avoir inversé Pomme Ouverte avec Option).
Maintenant Dodo, mais d’ici demain, on devrait avoir une beta qui marche.
Les touches du pavé numériques qui remarchent, là, c’est limite le grand bonheur.
Olivier
envoyé le 04-11-2012 à 10 h 01 min
Excellent ! Nous allons enfin avoir un émulateur IIGS qui, sans bidouille, utilise correctement un clavier PC AZERTY !
envoyé le 04-11-2012 à 11 h 07 min
Bon, je suis entrain de finaliser.
Ca m’aura au moins permis de corriger les quelques erreurs du Hardware Reference (caractères internationaux & table de caractères).
Je vais packager ça et renommer l’exe en Kegs32fr.exe comme ça on pourra toujours revenir à l’original en cas de doute.
Olivier
envoyé le 04-11-2012 à 13 h 43 min
Je viens de t’envoyer l’Exe et les sources.
Bon test !
Olivier
envoyé le 04-11-2012 à 15 h 31 min
Je l’ai bien envoyé, mais toi, tu ne l’as pas reçu !
Hi. This is the qmail-send program at mx1.ovh.net.
I’m afraid I wasn’t able to deliver your message to the following addresses.
This is a permanent error; I’ve given up. Sorry it didn’t work out.
:
user is over quota
envoyé le 04-11-2012 à 15 h 34 min
Effectivement je n’ai rien reçu du tout mais le « over quota » est assez étrange. Je ne reçois quasi rien sur cette adresse !
Peut-être la taille de la pièce jointe ?
Je te contacte directement pour te donner une autre adresse mail…