{"id":902,"date":"2014-01-12T14:28:47","date_gmt":"2014-01-12T13:28:47","guid":{"rendered":"http:\/\/blog.blockos.org\/?p=902"},"modified":"2014-09-21T17:05:42","modified_gmt":"2014-09-21T16:05:42","slug":"roger-quartermain-et-les-parchemins-perdus-de-lere-heisei","status":"publish","type":"post","link":"https:\/\/blog.blockos.org\/?p=902","title":{"rendered":"Roger Quartermain et les parchemins perdus de l&#8217;\u00e8re Heisei."},"content":{"rendered":"<blockquote><p>This is a french translation of <a href=http:\/\/blog.blockos.org\/?p=811>Roger Quartermain and the lost script of the Heisei era<\/a> originally published on <a href=http:\/\/www.romhack.org\/>ROMHack forum<\/a>(a french forum about videogame fan translations).<\/p><\/blockquote>\n<p>Roger est heureux. Il a r\u00e9cemment fait l&#8217;acquisition \u00e0 vil prix d&#8217;un jeu PC-Engine CDROM, \u201cNishimura Kyotaro Mystery.: Hokutosei No Onna\u201d. Selon toute vraisemblance, il s&#8217;agirait d&#8217;un jeu d&#8217;enqu\u00eate polici\u00e8re comme <a href=http:\/\/nekofan.free.fr\/murderclubtest.htm>J.B. Harold Murder Club<\/a>, <a href=http:\/\/en.wikipedia.org\/wiki\/Jake_Hunter>Jake Hunter<\/a>, <a href=http:\/\/fr.wikipedia.org\/wiki\/Phoenix_Wright>Ace Attorney<\/a>, <a href=http:\/\/www.lankhor.net\/jeux.php?jeu=15&#038;menu=presentation>Le Manoir de Mortevielle<\/a> ou encore <a href=http:\/\/www.lankhor.net\/jeux.php?jeu=16&#038;menu=presentation>Maupiti Island<\/a>.<br \/>\nIl fut publi\u00e9 \u00e0 l&#8217;aube de l&#8217;ann\u00e9e 1990 par Naxat (maintenant Kaga Create).<br \/>\nAlors qu&#8217;il glisse d\u00e9licatement le disque dans sa bonne vieille DUO, il se rappelle que certains jeux offrent la possibilit\u00e9 de changer la langue. Par exemple, la version japonaise de J.B Harold Murder Club <a href=https:\/\/iwasateenagepcenginefan.wordpress.com\/2011\/02\/16\/so-uh-how-do-i-play-j-b-harold-murder-club-in-english\/#comments>peut \u00eatre jou\u00e9 en anglais<\/a>. Malheureusement une telle option est introuvable dans Hokutosei No Onna&#8230; Qu&#8217;\u00e0 cela ne tienne! Roger Quatermain attrape ses bottes, son chapeau et plonge vaillamment dans les entrailles sombres et fumeuses du jeu.<br \/>\nL&#8217;introduction montre un pauvre quidam se faire poignarder, deux jeunes femmes insouciantes se rendant \u00e0 une gare et un personnage louche en train de les espionner.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/Nishimura-0000.png\" \/> <img decoding=\"async\" src=\"http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/Nishimura-0013.png\"\/><br \/>\n<img decoding=\"async\" src=\"http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/Nishimura-0004.png\"\/> <img decoding=\"async\" src=\"http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/Nishimura-0005.png\"\/><br \/>\n<img decoding=\"async\" src=\"http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/Nishimura-0006.png\"\/> <img decoding=\"async\" src=\"http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/Nishimura-0007.png\"\/><\/div>\n<p>S&#8217;agissant d&#8217;un jeu CDRom, ce dernier utilise la fonction du BIOS pour afficher le texte. Roger saisit  <a href=http:\/\/debuglife.free.fr\/docs\/Hu7CD_final.7z>ses vieilles notes<\/a> et les parcourt fr\u00e9n\u00e9tiquement en qu\u00eate d&#8217;informations sur une quelconque routine d&#8217;affichage de texte. Et la voici! <strong>ex_fnt<\/strong> \u00e0 l&#8217;adresse <strong>$e060<\/strong>. Il d\u00e9gaine alors <a href=http:\/\/mednafen.sourceforge.net\/>son \u00e9mulateur favori<\/a> et positionne un point d&#8217;arr\u00eat \u00e0 l&#8217;adresse indiqu\u00e9e.<\/p>\n<div style=\"text-align:center;\"><a href=http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/debugger00.png><img decoding=\"async\" src=\"http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/debugger00-300x241.png\"\/><\/a><\/div>\n<p>Le point d&#8217;arr\u00eat est atteint apr\u00e8s l&#8217;introduction sur ce qui semble \u00eatre l&#8217;\u00e9cran de s\u00e9lection des sauvegardes \u00e0 charger.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/Nishimura-00081.png\"\/> <a href=http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/debugger01.png><img decoding=\"async\" src=\"http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/debugger01-300x241.png\"\/><\/a><\/div>\n<p>Contrairement \u00e0 ce qu&#8217;il pouvait laisser entendre Roger n&#8217;est pas int\u00e9ress\u00e9 par <strong>ex_fnt<\/strong> mais par le code appelant cette routine. Pour ce faire il place des points d&#8217;arr\u00eats sur toutes les instructions <strong>rts<\/strong> d&#8217;<strong>ex_fnt<\/strong>. Une br\u00e8ve pression sur la touche <strong>R<\/strong> l&#8217;am\u00e8ne sur <strong>$f1e2<\/strong>. Une autre pression sur la touche <strong>S<\/strong> l&#8217;envoie sur l&#8217;appelant.<\/p>\n<div style=\"text-align:center;\"><a href=http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/debugger02.png><img decoding=\"async\" src=\"http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/debugger02-300x241.png\"\/><\/a><\/div>\n<p>Il se retrouve donc \u00e0 <strong>$566b<\/strong>.<\/p>\n<div style=\"text-align:center;\"><a href=http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/debugger03.png><img decoding=\"async\" src=\"http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/debugger03-300x241.png\"\/><\/a><\/div>\n<p>D&#8217;apr\u00e8s les notes, le symbole shift-jis est charg\u00e9 depuis <strong>$41<\/strong>, <strong>$42<\/strong> vers <strong>$f8<\/strong> et <strong>$f9<\/strong>. La logique lui dicte donc de placer un point d&#8217;arr\u00eat en \u00e9criture sur les adresses <strong>$41<\/strong> et <strong>$42<\/strong>.<\/p>\n<div style=\"text-align:center;\"><a href=http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/debugger04.png><img decoding=\"async\" src=\"http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/debugger04-300x241.png\"\/><\/a><\/div>\n<p>Le point d&#8217;arr\u00eat est lev\u00e9 en <strong>$5b20<\/strong>. Le code est somme toute assez simple.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">5b1c: ldy #$00\r\n      lda ($3c), Y\r\n5b20: sta $41\r\n      iny\r\n      lda ($3c), Y\r\n      iny\r\n      sta $42<\/pre>\n<p>L&#8217;\u00e9tape suivante consiste \u00e0 chercher o\u00f9 le pointeur <strong>$3c<\/strong> est initialis\u00e9. Roger place donc un autre point d&#8217;arr\u00eat <strong>$3c<\/strong> et <strong>$3d<\/strong>.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">5a18: lda #$90\r\n      bra $5a22\r\n      lda #$40\r\n      bra $5a22\r\n      lda #$80\r\n5a22: sta $c0\r\n5a24: sty $3d\r\n      cpy #$00\r\n      beq $5a2f\r\n      stx $3c\r\n      smb5 $c0\r\n      rts<\/pre>\n<p>Malheureusement le code appelant est tout sauf trivial. Par contre la bonne nouvelle est que le texte n&#8217;est pas compress\u00e9. En notant attentivement les valeurs stock\u00e9es en <strong>$41<\/strong> et <strong>$42<\/strong>, Roger r\u00e9ussit \u00e0 extraire la cha\u00eene:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">40 81 40 81 40 81 C7 82 CC 82 54 8B E4 88 59 8C 96 8E C5 82 6E 8E DF 82 DC 82 B7 82 A9 82 48 81 0D 00 FF 00<\/pre>\n<p>Le boutisme doit \u00eatre invers\u00e9. Heureusement il a sous le coude un script Perl fort utile, <a href=http:\/\/cires.colorado.edu\/~braup\/software\/swap_endian>swap_endian.pl<\/a>. Les 4 derniers caract\u00e8res ressemblent \u00e0 des codes de contr\u00f4le. Sa grande et longue exp\u00e9rience lui permet de d\u00e9duire que <strong>00 0D<\/strong> doit symboliser un <strong>saut de ligne<\/strong> et <strong>00 FF<\/strong> la <strong>fin du texte<\/strong>. Voici la cha\u00eene d\u00e9cod\u00e9e.<br \/>\n<center><code>\u3000\u3000\u3000\u3069\u306e\u4e80\u4e95\u5211\u4e8b\u3067\u59cb\u3081\u307e\u3059\u304b\uff1f<\/code><\/center><br \/>\nMais tout cela ne lui dit pas o\u00f9 le pointeur <strong>$3c<\/strong> est initialis\u00e9. Roger sait que sur CDRom le code est d&#8217;abord transf\u00e9r\u00e9 en RAM avant d&#8217;\u00eatre ex\u00e9cut\u00e9. Cela signifie aussi que le code peut \u00eatre auto-modifiable. Et manque de chance, c&#8217;est le cas ici. Roger doit encore mettre un point d&#8217;arr\u00eat \u00e0 l&#8217;emplacement o\u00f9 le saut est effectu\u00e9 et suivre le fil d&#8217;ex\u00e9cution jusqu&#8217;\u00e0 atteindre l&#8217;emplacement o\u00f9 le pointeur est initialis\u00e9. Plusieurs heures passent et il \u00e9choue finalement en <strong>$724d<\/strong> <\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">724d: ldx #$fc\r\n      ldy #$74\r\n      jmp $5a18<\/pre>\n<p>Il red\u00e9marre le jeu en ne laissant qu&#8217;un point d&#8217;arr\u00eat sur <strong>$41<\/strong> et <strong>$42<\/strong>. Comme pr\u00e9vu il se retrouve l\u00e0 o\u00f9 il a d\u00e9couvert la premi\u00e8re chaine. Il d\u00e9cide donc de continuer son chemin et se retrouve en <strong>$acb4<\/strong>. <\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">acae: lda $4f\r\n      asl A\r\n      tay\r\n      lda ($50), Y\r\nacb4: sta $41\r\n      iny\r\n      lda ($50), Y\r\n      beq $acd8\r\n      sta $42\r\n      lda $2922\r\n      sta $3f\r\n      lda $2923\r\n      sta $40\r\n      lda #$01\r\n      jsr $5655<\/pre>\n<p> Le pointeur <strong>$50<\/strong> est initialis\u00e9 en <strong>$ac92<\/strong>. <\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">ac8a: tay\r\n      lda $312a, Y\r\n      asl\r\nac8e: tay\r\nac90: lda ($9f), Y\r\n      sta $50\r\n      iny\r\n      lda ($9f), Y\r\n      sta $51<\/pre>\n<p>Ainsi donc le pointeur est initialis\u00e9 \u00e0 partir d&#8217;une table. Ses valeurs sont<\/p>\n<ul>\n<li>b1b6<\/li>\n<li>bdb6<\/li>\n<li>cdb6<\/li>\n<li>d9b6<\/li>\n<li>e7b6<\/li>\n<\/ul>\n<p>Par chance les indexes pour ces pointeurs sont 2,3,4,5,6. Roger cherche dans l&#8217;iso la cha\u00eene <strong>b1 b6 bd b6 cb b6 d9 b6 e7 b6<\/strong>. Il la trouve \u00e0 l&#8217;offset <strong>$11f49<\/strong>. L&#8217;endroit semble baigner dans une soupe de pointeurs. Quelques octets plus loin il reconnait du texte en shit-jis. Il commence en <strong>$11f53<\/strong>. La &#8220;soupe&#8221; doit donc contenir des valeurs ressemblant \u00e0 <strong>$53Xf<\/strong>. Il remonte et trouve <strong>$53af<\/strong> \u00e0 <strong>$11d45<\/strong>. Tadam, il a sa premi\u00e8re table et son premier bloc de texte. Comme tout les pointeurs sont en ordre croissant, Roger en conclue que la liste contenant les noms des options est stock\u00e9e de <strong>$11f53<\/strong> \u00e0 <strong>$126f4<\/strong>. Il remarque d&#8217;autres symboles shift-jis \u00e0 la suite. Ils vont de <strong>$126f5<\/strong> \u00e0 <strong>$132f5<\/strong>.<br \/>\nUne fois les options affich\u00e9es, Il passe sur un autre \u00e9cran o\u00f9 un vieux briscard de la crim&#8217; lui taille le bout de gras.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"http:\/\/blog.blockos.org\/wp-content\/uploads\/2013\/03\/Nishimura-0009.png\"\/><\/div>\n<p>Une fois encore il met un point d&#8217;arr\u00eat sur <strong>$41<\/strong> et <strong>$42<\/strong>. Mais \u00e0 cet instant il se rappelle de <strong>$5a18<\/strong>. Cela commence par: <\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">5a18: lda #$90\r\n      bra $5a22\r\n5a1c: lda #$40\r\n      bra $5a22\r\n5a20: lda #$80\r\n5a22: sta $c0<\/pre>\n<p> Il peut donc y arriver depuis <strong>$5a18<\/strong>, <strong>$5a1c<\/strong> ou <strong>$5a20<\/strong>. Cela lui donne 3 points d&#8217;arr\u00eat. <strong>$5a20<\/strong> est le grand gagnant et comme il s&#8217;en doutait il y arrive par un bout de code auto-g\u00e9n\u00e9r\u00e9 (<strong>$59ab<\/strong>). Une longue et p\u00e9nible route se pr\u00e9pare \u00e0 l&#8217;horizon. Et p\u00e9nible elle est. N\u00e9anmoins, Il d\u00e9couvre que <strong>$5a20<\/strong> est atteint depuis <strong>$6c5e<\/strong>. <\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">6c5e: ldy $a5\r\n      lda ($a8), Y\r\n      sta $00\r\n      iny\r\n      lda ($a8), Y\r\n      sta $01\r\n      iny\r\n      sty $a5\r\n      and $00\r\n      cmp #$ff\r\n      beq $6c79\r\n      ldx $00\r\n      ldy $01\r\n      jmp $5a20<\/pre>\n<p> La premi\u00e8re phrase du vieux briscard se trouve en <strong>$89c9<\/strong> (<strong>$1339c9<\/strong> dans l&#8217;iso). Cette adresse provient d&#8217;une table point\u00e9e par <strong>$a8<\/strong>. Lui m\u00eame initialis\u00e9 en <strong>$707e<\/strong>. <\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">707e: lda #$00\r\n      sta $00\r\n      lda #$80\r\n      sta $01\r\n      lda ($00), Y\r\n      sta $a8\r\n      iny\r\n      lda ($00), Y\r\n      sta $a9\r\n      stz $a5\r\n      stz $a6\r\n      lda #$03\r\n      jmp $619c<\/pre>\n<p> Le pointeur est stock\u00e9 en <strong>$13308c<\/strong>. Roger est perplexe. Il  ne s&#8217;agit pas d&#8217;une simple table de pointeur. Elle contient d&#8217;autres donn\u00e9es. Que signifient-elles? Mais il est ext\u00e9nu\u00e9 et il y a <a href=http:\/\/www.rottentomatoes.com\/m\/night_of_the_creeps>Extra Sangsues<\/a> sur le c\u00e2ble.<br \/>\nIl s&#8217;\u00e9tire, ferme l&#8217;\u00e9mulateur et son portable et se pr\u00e9pare pour 90 minutes de pur puissance.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is a french translation of Roger Quartermain and the lost script of the Heisei era originally published on ROMHack forum(a french forum about videogame fan translations). Roger est heureux. Il a r\u00e9cemment fait l&#8217;acquisition \u00e0 vil prix d&#8217;un jeu PC-Engine CDROM, \u201cNishimura Kyotaro Mystery.: Hokutosei No Onna\u201d. Selon toute\u2026 <a class=\"continue-reading-link\" href=\"https:\/\/blog.blockos.org\/?p=902\">Continue reading<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6],"tags":[27,30,19],"_links":{"self":[{"href":"https:\/\/blog.blockos.org\/index.php?rest_route=\/wp\/v2\/posts\/902"}],"collection":[{"href":"https:\/\/blog.blockos.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.blockos.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.blockos.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.blockos.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=902"}],"version-history":[{"count":11,"href":"https:\/\/blog.blockos.org\/index.php?rest_route=\/wp\/v2\/posts\/902\/revisions"}],"predecessor-version":[{"id":947,"href":"https:\/\/blog.blockos.org\/index.php?rest_route=\/wp\/v2\/posts\/902\/revisions\/947"}],"wp:attachment":[{"href":"https:\/\/blog.blockos.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.blockos.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.blockos.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}