シフトJIS変換


ずいぶん昔に書いたやつです(^^;

     
   

      1	0000			     code segment
      2				     assume cs:code
      3                                        
      4				     ;(1)JIS → SJIS (C) Aiichiro Hayashi
      5
      6	0000  05 A17E			     add ax,0a17eh
      7	0003  D0 EC			     shr ah,1
      8	0005  72 04			     jc	skip
      9	0007  3C DE				     cmp al,0deh
     10	0009  1C 5E				     sbb al,5eh
     11	000B			     skip:
     12	000B  80 F4 E0			     xor ah,0e0h
     13
     14				     ;(2)SJIS → JIS (C) Aiichiro Hayashi
     15
     16	000E  D0 E4			     shl ah,1
     17	0010  2C 1F			     sub al,1fh
     18	0012  78 04			     js	skip2
     19	0014  3C 61				     cmp al,61h
     20	0016  14 DE				     adc al,0deh
     21	0018			     skip2:
     22	0018  05 1FA1			     add ax,1fa1h
     23	001B  25 7F7F			     and ax,7f7fh
     24				     ;
     25
     26	001E			     code ends
     27
     28				     end
 
     

 著作権の放棄はしません(笑)が、これより短いのを知っているかたは教えてください(笑)。(1) はこれ以上は縮まらない感じですが、(2) はまだちょっと長すぎる気がしてます。最後の and というのは畳み込んでしまうわけですからロジックとしてはどこかに無駄があるように見えます。ただしSJISからJISだと変換上の境界点が多いですから、十数年を経てまだ縮めたいんですがなかなか縮まりません。これ以上は無理である可能性もあります。区分アフィン変換オペレータの集合(CPUの命令セット)が規定された状態から、目的とする区分アフィン変換を行なう最短手順を求める、という話になります。
 これを掲示しておいたところ、アセンブラのリストを送っていただいたのですが、アセンブルしてみたところ、どちらの変換も同じ長さになりました。検証の結果を報告するメールを返信したところ、存在しないアドレスであるとしてエラーが返って来ました。これはラクガキされたみたいでちょっと残念でした。面白いドメイン名だなとは思ったんですがドメインが実在じゃなきゃ単に詐称じゃん。洒落ならちゃんとお金かけて正規のもので洒落ないと。何でも常軌を逸していてちょっと見には妄想としか思えないのにそれが実は全て現実である、というようなのが粋で面白いわけです。
 なお、僕のこいつはGPLっつーことでいいと思います。こういう短いものに関するGPLを平易な言葉で書くとこんな様なことだと思います。「短いものなのでアナタが独自に思い付いたと主張されるならしょうがないかも知れませんが有名な先生がWebで最短とタイトルを付けて公開している物でも長さは(2)が同じで(1)はこれより長かったですし(1)も(2)も僕のと結構違いますしホントにアナタが僕と同じものを思い付いたの? で、僕はこのこれ以上縮まらない感じのプログラムの独占によってお金を得たい訳ではないので無償で使うのは構いませんが、アナタが僕のをパクった場合にはアナタが考えた訳でないので、パブリック(公開または販売)かプライベート(社内提出など)かを問わず、自分で考えたかの様に紹介、提出、販売するなど不当にアナタの著作権は主張しないで、他の人にも無償で使わせてあげてください。本来なら著作権を放棄してパブリックドメインに置いていいところですが、他の人にも自由に使わせることを強制するだけの為に僕の著作権を留保しますので、アナタが作ったのではないということをよく理解して、アナタが利益を独占しようとせず、誰でも無償で使える状態を崩してはいけないという僕の著作権者としての唯一の指示に従ってください。」
 これを改良するなどしてもっと短いものを考えたかたも同じ主張をされるように望みます。
 もちろん人に頼まれて探してこのページ見つけたんなら、 脳髄から血と汗と涙流しながらプログラム作る僕よりはずっとラクとは言え、 それでもとにかく多少の労力と検索ノウハウを他人に提供したわけなんで、 探した行為の費用は請求して構わないとは思います。 良くこんなページ見つけますよね。 誉めて遣わしちゃいますよホント。 よく作るよねってのは棚に上げて。
 なお、レジスタ順がどうしてAL,AHのバイト順でなくAH,ALなのかについて歴史的経緯を説明しなければいけない時代に来ていると思い追記しますが、8086の初期当時に日本語処理つまりJIS/SJISのコードを扱うことの一番多かった一番多数使われていたPC-9801シリーズというマシンがこの順でレジスタを使うのが自然であるようなシステムだったためです。このコードは21世紀ではなくPC-9801で5MHzの8086がまだ現役だったような時代に書いたためこのようになりましたが、いま書いたらレジスタの入れ替え等をして、当然細かな演算順序もコレとは違うような書きかたをすると思います。これを参考にしてそういう書きかたをするのも宜しいでしょう。今のCPUはギガヘルツ単位で1クロックに数命令実行するような物ですが、当時の最初のCPUはクロックが5メガヘルツでしかも数クロックでやっと1命令の実行が終わるという、いまのものより3桁は優に遅いものでした。しかも一度に16ビットまでしか計算できなかったわけですが。いま私の机には当時買ったマシンより安く買った64ビットマシンがあります。ただし同じ命令もそのまま動きます。単に速いという以外は。何しろ3桁遅いマシンでそこそこ処理をしたいという話ですから、しかもプログラマとしてベンチャーで開発を担当していて一番速くしたいということでこういうことになった。


i16(愛一郎)