« 年末の娯楽 | トップページ | ダイシモチ2016 »

2016年1月 1日 (金)

プログラマの正月

昨日からずっとパソコンで遊んでいる私である。いつもと違って傍らにはビールとツマミ。充実した正月である。
時々、正月から何をやっているんだと思わないでもないのだが、そんなことをやっているのは私一人ではない。
偶然使っていたバイナリエディタ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 »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/24707/63300130

この記事へのトラックバック一覧です: プログラマの正月:

« 年末の娯楽 | トップページ | ダイシモチ2016 »

最近のトラックバック