プログラマの正月
昨日からずっとパソコンで遊んでいる私である。いつもと違って傍らにはビールとツマミ。充実した正月である。
時々、正月から何をやっているんだと思わないでもないのだが、そんなことをやっているのは私一人ではない。
偶然使っていたバイナリエディタFavBinEdit、ゲームのBGMプレイヤhootなど、使っていたソフトウエアが、相次いでバージョンアップしたのだ。
インターネットの向こうでは、作者がちょうど開発を続けているいうことである。
ちょっと用があってメールしたら、数分後に返事が届いて驚いた。頼もしい話である。
そういえば、バイナリエディタで解析していたReviverをのぞいていたら、懐かしいコードを見つけた。
ED 79 03 ED 79 03 ED 79 03...
ただED 79 03が80回も並んでいるだけである。
Z80のニーモニックだとこうなる。
top:
OUT (C),A
INC BC
OUT (C),A
INC BC
OUT (C),A
INC BC
本来、OUT (C),A という命令は、I/OポートのC番地に、Aレジスタの値を出力する命令である。
Z80というCPUでは、こっそりBレジスタもポートに接続されており、じつはOUT (BC),Aというポートにデータを出力する用に作られていた。
X1というパソコンは、このポートBCを利用してV-RAMを接続していたから、V-RAMに描画したいものがあれば、OUT (C),Aのように出力することになる。
たとえば60×8ドット分のデータを出力するには、普通はこんなコードを書く。
LD D,40
loop:
OUT (C),A
INC BC
DEC D
JP NZ,loop
しかしこれでは1バイトを出力する度に、カウントダウンや、ジャンプ命令を実行することになり、実行速度が落ちる。
そこで1ライン640ドット(=80バイト)分を出力する処理を80回そのまま並べておき、top+(20×3)番地にジャンプするのだ。
こうすればループにかかる処理がなくなって高速化できる。
« 年末の娯楽 | トップページ | ダイシモチ2016 »
「パソコン・インターネット」カテゴリの記事
« 年末の娯楽 | トップページ | ダイシモチ2016 »
コメント