{"id":417,"date":"2013-04-23T14:14:25","date_gmt":"2013-04-23T12:14:25","guid":{"rendered":"http:\/\/pockemul.free.fr\/?p=417"},"modified":"2019-06-22T22:42:29","modified_gmt":"2019-06-22T20:42:29","slug":"un-nouveau-modele-le-casio-fx-890pz-1z-1gr","status":"publish","type":"post","link":"https:\/\/pockemul.com\/index.php\/2013\/04\/23\/un-nouveau-modele-le-casio-fx-890pz-1z-1gr\/","title":{"rendered":"Un nouveau mod\u00e8le, le Casio FX-890P\/Z-1\/Z-1GR"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"http:\/\/pockemul.com\/forum\/z1gr-15.png\" alt=\"\" width=\"781\" height=\"384\" \/><br \/>\nTous le monde connait le dernier des pockets Casio \u00e9quip\u00e9 d&#8217;un processeur 16 bits (le 80L188EB). Lorsque je me suis lanc\u00e9 dans l&#8217;\u00e9mulation de ce pocket, je pensais na\u00efvement que cela serai assez simple, le processeur \u00e9tant tr\u00e9s bien document\u00e9.<!--more-->Assez rapidement, j&#8217;ai donc r\u00e9ussi \u00e0 obtenir le boot et tout semblait parfait si ce n&#8217;est qu&#8217;il indiquait une quantit\u00e9 de m\u00e9moire \u00e0 0Ko au RESET.<br \/>\nEn fait, le Casio ne savait pas calculer !<\/p>\n<p>En tra\u00e7ant les ports d&#8217;entr\u00e9es\/sorties du CPU il est rapidement apparu que des appels \u00e9taient effectu\u00e9s sur les ports 220h et 221h lors des fonctions de calculs.<br \/>\nJ&#8217;ai tout d&#8217;abord pens\u00e9 \u00e0 un FPU ou bien \u00e0 une puce sp\u00e9cialis\u00e9e pour g\u00e9rer la machine virtuelle COMET (le CASL rendu obligatoire par le minist\u00e8re de l&#8217;\u00e9ducation japonais)&#8230; Sans succ\u00e8s.<br \/>\nAlors, au grands maux les grands moyens : d\u00e9sassemblage complet de la ROM, localisation des proc\u00e9dures de calculs flottants et reverse engineering sur les algorithmes utilis\u00e9s pour l&#8217;addition, la multiplication, &#8230;<br \/>\nEt l\u00e0, tout commence \u00e0 s&#8217;\u00e9clairer. J\u2019ai isol\u00e9 plusieurs commandes envoy\u00e9es par le CPU pour manipuler les nombre flottants au format BCD. Les ing\u00e9nieurs de chez Casio ont donc cod\u00e9 dans une puce externe les fonctionnalit\u00e9s de manipulation de flottant en BCD car celles ci n&#8217;existent pas en natif dans le 80188. Ils y ont \u00e9t\u00e9 oblig\u00e9 car s&#8217;ils avaient d\u00e9velopp\u00e9 ces fonctions en natif dans le CPU, les temps de calculs auraient \u00e9t\u00e9 bien plus important que sur les g\u00e9n\u00e9rations pr\u00e9c\u00e9dentes (PB-1000, PB-2000,VX-3,VX-4). En effet le Toshiba HD61700 de ces pocket comporte un jeux d&#8217;instruction manipulant le multi-byte BCD.<br \/>\nCe probl\u00e8me \u00e9tait \u00e0 l&#8217;\u00e9poque r\u00e9solue sur les desktops \u00e9quip\u00e9s du 8088 par l&#8217;adjonction d&#8217;un 8087, mais aucun 8087 n&#8217;\u00e9tant compatible avec le 80L188EB du Z-1 (seul le 80C186EB accepte le 80C187), un mini FPU d\u00e9di\u00e9 au format flottant BCD Casio a \u00e9t\u00e9 impl\u00e9ment\u00e9.<br \/>\nBien, une fois le contexte (\u00e0 peu pr\u00e9s) d\u00e9termin\u00e9, il fallait donc trouver la liste et les fonctions de chaque commande.<br \/>\nLe Z-1 a 3 zones m\u00e9moire de 10h octets servant aux calculs, nous les appellerons X,Y et W:<\/p>\n<pre>X : 400h - 40Fh\nY : 410h - 40Fh\nW : 420h - 42Fh\nLe format est :\n Mantisse\u00a0 \u00a0 \u00a0 \u00a0 exposant\u00a0 signe\n00 00 00 00 00 00 00\u00a0 \u00a0 00\u00a0 \u00a0 \u00a0 \u00a000<\/pre>\n<p>Voir\u00a0<a href=\"http:\/\/www.pisi.com.pl\/piotr433\/pb1000fe.htm\">le site de notre ami piotr<\/a> qui d\u00e9crit ce format :<br \/>\nJ&#8217;ai commenc\u00e9 gr\u00e2ce \u00e0 l&#8217;analyse de la ROM \u00e0 trouver quelques commandes :<\/p>\n<pre> 41h : Mantisse X - Mantisse Y\u00a0\n 10h : X &lt;- 0\n 11h : Y &lt;- 0\n 80h : SWAP ( X &lt;-&gt; Y)\n 0Eh :\n0448h:\n0448h : Shift Right Mantisse X\n04C0h : Mantisse X + Mantisse Y\n04C1h : Mantisse X - Mantisse Y\n044Ah :\n044Ch :\n04C2h, 04C3h, 0490h, 0491h, 0499h, 049Ch, 054Eh, 05D0h, 0800h, 0801h,<\/pre>\n<p>Une fois cod\u00e9 en binaire, l&#8217;ensemble des commande a plus de sens :<\/p>\n<pre>0\u00a0 \/\u00a0 1\nBit 0 : Add\u00a0 \/ Sub\nBit 1 :\u00a0 \u00a0 X \/ Y\u00a0 \u00a0\u00a0 \u00a0\u00a0 charge le registre interne avec X ou Y\nBit 2 : Right\/Left\u00a0 \u00a0\u00a0 \u00a0Sens du shift\nBit 3 : no\u00a0 \u00a0\/ Shift\nBit 4 :\u00a0 \u00a0Exponent\nBit 5 : ???????????\nBit 6 :\u00a0 \u00a0Mantisse\n00\u00a0 \u00a000000000\u00a0 \u00a0 Add exponent and sign\n01\u00a0 \u00a000000001\u00a0 \u00a0 Sub exponents sign (X-Y)\n41\u00a0 \u00a001000001\u00a0 \u00a0sub mantisse (X - Y)\n43\u00a0 \u00a001000011\u00a0 \u00a0sub mantisse (Y - X)\n48\u00a0 \u00a001001000\u00a0 \u00a0Shift Right and src X\u00a0\n4A\u00a0 \u00a001001010\u00a0 \u00a0Shift Right and src Y\n4C\u00a0 \u00a001001100\u00a0 \u00a0Shift Left\n4E\u00a0 \u00a001001110\u00a0 \u00a0Shift Left and src Y\n90\u00a0 \u00a010010000\u00a0 \u00a0Add Exp 1\n91\u00a0 \u00a010010001\u00a0 \u00a0Sub Exp 1\n99\u00a0 \u00a010011001\u00a0 \u00a0Shift Right and sub Exp 1\n9c\u00a0 \u00a010011100\u00a0 \u00a0Shift Left and add Exp 1\nC0\u00a0 \u00a011000000\u00a0 \u00a0Add Mantisse and src X\nC1\u00a0 \u00a011000001\u00a0 \u00a0Sub Mantisse and src X\nC2\u00a0 \u00a011000010\u00a0 \u00a0Add Mantisse and src Y\nC3\u00a0 \u00a011000011\u00a0 \u00a0Sub Mantisse and src Y\nD0\u00a0 \u00a011010000\u00a0 \u00a0Cpy X to internal register\nbit 0 : X\u00a0 \/\u00a0 Y\nbit 2 : Write reg\nbit 3 : exchange reg ???\nbit 4 : clear\nport 221:\n04\u00a0 \u00a000000100\u00a0 \u00a0Write reg to X\n05\u00a0 \u00a000000101\u00a0 \u00a0Write reg to Y\n08\u00a0 \u00a000001000\u00a0 \u00a0exchange reg and X ???\n0E\u00a0 \u00a000001110\u00a0 \u00a0exchange reg and X ???\n10\u00a0 \u00a000010000\u00a0 \u00a0clear X\n11\u00a0 \u00a000010001\u00a0 \u00a0clear Y\n80\u00a0 \u00a010000000\u00a0 \u00a0swap X Y<\/pre>\n<p>Donc c&#8217;est assez simple. Il y a un registre interne qui peut \u00eatre charg\u00e9 et manipul\u00e9 par un OUT 220h.<br \/>\nUn out 221h permet d&#8217;\u00e9crire le registre interne sur X ou Y par les commandes 04h ou 05h. La commande 08h permet de faire un swap entre X et le registre interne.<br \/>\nTous les calculs positionnent aussi les flags Z et C qui sont lu par un IN 220h.<br \/>\nJe tiens \u00e0 remercie\u00a0<strong>dprtl <\/strong>(voir\u00a0<a href=\"http:\/\/silicium.org\/forum\/viewtopic.php?f=64&amp;t=31900\">http:\/\/silicium.org\/forum\/viewtopic.php?f=64&amp;t=31900<\/a>) qui m&#8217;a permis de trouver ou v\u00e9rifier les diff\u00e9rentes commandes en tra\u00e7ant les fonctions sur un vrai Z-1 (eh oui, je n&#8217;ai pas encore la b\u00eate).<br \/>\nLe seul doute qui subsiste concerne les commandes 0800h, 0801h et 0Eh. Nous n&#8217;arrivons pas \u00e0 les tracer sur le vrai et il reste un petit bug dans l&#8217;\u00e9mulation de ces commandes qui m&#8217;a oblig\u00e9 \u00e0 la mise en place TEMPORAIRE d&#8217;un HACK dans l&#8217;\u00e9mulation (oui, je sais, c\u2019est MAL).<br \/>\nVoil\u00e0, Il reste encore beaucoup de chose \u00e0 trouver sur le Z-1, notamment les autres ports I\/O, mais un gros morceau \u00e0 \u00e9t\u00e9 fait avec la partie calcul.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"http:\/\/pockemul.com\/forum\/z1gr-11.png\" alt=\"\" width=\"860\" height=\"558\" \/><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"http:\/\/pockemul.com\/forum\/z1gr-13.png\" alt=\"\" width=\"805\" height=\"377\" \/><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"http:\/\/pockemul.com\/forum\/z1gr-14.png\" alt=\"\" width=\"809\" height=\"382\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tous le monde connait le dernier des pockets Casio \u00e9quip\u00e9 d&#8217;un processeur 16 bits (le 80L188EB). Lorsque je me suis lanc\u00e9 dans l&#8217;\u00e9mulation de ce pocket, je pensais na\u00efvement que cela serai assez simple, le processeur \u00e9tant tr\u00e9s bien document\u00e9.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[30,31],"tags":[],"class_list":["post-417","post","type-post","status-publish","format-standard","hentry","category-casio","category-fx-890p"],"_links":{"self":[{"href":"https:\/\/pockemul.com\/index.php\/wp-json\/wp\/v2\/posts\/417"}],"collection":[{"href":"https:\/\/pockemul.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pockemul.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pockemul.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/pockemul.com\/index.php\/wp-json\/wp\/v2\/comments?post=417"}],"version-history":[{"count":2,"href":"https:\/\/pockemul.com\/index.php\/wp-json\/wp\/v2\/posts\/417\/revisions"}],"predecessor-version":[{"id":546,"href":"https:\/\/pockemul.com\/index.php\/wp-json\/wp\/v2\/posts\/417\/revisions\/546"}],"wp:attachment":[{"href":"https:\/\/pockemul.com\/index.php\/wp-json\/wp\/v2\/media?parent=417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pockemul.com\/index.php\/wp-json\/wp\/v2\/categories?post=417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pockemul.com\/index.php\/wp-json\/wp\/v2\/tags?post=417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}