ITTO Soft プレゼンテーション



 昔々、私は1本のマシン語ツールを作成しました。
 そのツールは、個人的にはとても使いでのある多機能なツールでした。
 傍目にはきっと、全くつまらなくて使えないツールなのでしょうが、個人的にはとても思い入れのある優秀なツールでした。
 Web上では全く公開する気はなかったのですが、ちょっと公開してみようという気になったので、公開してみることにします。
 で、どうせ公開するなら大袈裟にやったるか!ということで、ちょっと派手目に公開してみようと思います。


グラフィック圧縮・展開ツール


はじめに

 最初、夢幻の心臓のようなゲームを作ろうとしたのですが、いざ、プログラミングの時、グラフィックのデータの保存に困ってしまいました。 Z's STAFFでは、1枚のディスクにグラフィックデータは3枚まで、というのはわかっていたのですが、部分セーブしたデータがBASICからは読み込めないということを知らなかったのです (部分セーブすれば、それだけたくさんのデータが入ると期待していたのに・・・)。 というわけで、このプログラムが出来たのでした。


例

プログラムの特徴

・1ラインごとにバイト単位で圧縮する。
・圧縮する際に、圧縮対象を自由に指定できる。(赤画面のみ、400ラインモード時に偶数列のみ、など)
・圧縮・展開プログラムは、自由なアドレスに再配置が可能。
・圧縮する範囲を8ドット単位で指定できる。
・範囲指定を利用して、画像の移動や複数画像の表示などが行える。
・展開速度が高速。(大体1〜数秒)

参考)
 右上図は、範囲指定を利用した場合の使用例。
例 オンメモリ(データ1=&HB000〜&HD113:8.3KB、データ2=&HD114〜&HEFA9:7.7KB)でデータを扱っているので、 それぞれ自由な位置への表示が何回でも行えます。
 なお、圧縮サイズの目安としては、640×200、8色モードの時で、
・三国志II タイトル画面:11.5KB(圧縮率=24%)
・アルガーナ オープニング画面:14.0KB(圧縮率=29%)
といった感じとなっています。


動作環境

 CZ−8CB01、CZ−8FB01、CZ−8FB02
 S−OS”SWORD”

 その他のシステムや言語(CZ-8FB03やNEW BASICなど)については未確認ですが、システムに依存していないので大丈夫だと思います。


入力方法

 各BASICから、
  CLEAR &HA000
を実行後、マシン語入力ツールまたはマシン語モニタから、それぞれ入力して下さい。

・・・といいたい所ですが、ここはWeb上でした。(^^;)
というわけで、各オブジェクトファイルはこちらに置いておきます。 それぞれダウンロードした後、各自自由な方法でX1へ転送して下さい。
 転送の方法は、大体次のようなものが考えられるでしょう。

・X1用通信ソフトを使い、RS-232C経由でダウンロードを行う。
・X1上で動作する、メディアコンバート用ソフトを使用する。

 ちなみに私は、X1turboZ+INTEGRAL.X1 − X68000 − MO − Windows という経路でやりとりを行っています。
 やっぱり一般的には、通信ソフトを使う方が楽でしょうね。 SPSのX1用通信ソフトは、まだ売っているようですし、今後もX1と他のPC間でやり取りをすることが予想されるので、持っていて損はないような気がします。

ダウンロード : Filename=a_t_l.lzh (7.0KB)
LZHファイル中のファイル構成については、LHA展開後に作成されるREADME.TXTを参照して下さい。

参考)私がやった、具体的な転送方法
1.FATフォーマットしたMOに、Win95に付属のファイルマネージャーで対象プログラムをコピー。
2.X68フォーマット(もしくはFATフォーマット)した5インチ2HDディスクに、MOから対象プログラムをコピー。
3.INTEGRAL.X1を起動し、HuBASICフォーマットされたフロッピーディスクへ、「-T1」または「-T0」オプションを使用してコピー。
  アスキーファイル:COPY A:ASSYUKU.ASM B:ASSYUKU.ASM -T0
  オブジェクトファイル:COPY A:ASSYUKU.OBJ B:ASSYUKU.OBJ -T1
4.アスキーファイルは、S-OSよりテキストファイルとして読み込みが可能。
  アセンブルする場合は、ZEDA-3を使用し、AコマンドのみでOK。
5.オブジェクトファイルは、HuBASICからLOADM出来るが、LOADM時に読み込み先アドレスを指定しないと、ディスクエラーが出る。


使い方

圧縮:
 所定のアドレスに各パラメータを出力後、&HA000をコールすると、圧縮を始めます。
 パラメータとそのアドレスについては、[付録.1 −パラメータ一覧−]を参照して下さい。

展開:
 これには、2通りの使い方があります。
 ふつうは、データを読み込んだ後&HA500をコールすれば、自動的にデータを展開し、画面に出力します。 (この際、KAKUNOの中身とデータの格納されているアドレスが一致しているようにして下さい。以下、同じ。)
 2番目の使い方は、X0,Y0に数値を代入し、&HA503をコールします。 すると、(X0,Y0)を始点とする場所に、グラフィックを表示します。 これを使って、グラフィックの移動が楽に行えます。

LOADER:
 所定のアドレスに各パラメータを出力後、&HA700をコールします。 すると、圧縮や展開のプログラムが、他のアドレスに再配置されます。 再配置されたら、そこの部分をセーブして下さい。 なお、LOADERを使う際は、必ず&HA000/&HA500版(つまり、再配置前のプログラム)に対して行って下さい。


プログラムの説明

 ただ単に、1ラインごとにバイト単位で圧縮しているだけです。(いわゆるランレングスというやつです、多分。)
 具体的には、まずG-RAMデータの中から使われていないバイトコードを探し、これを圧縮記号として[圧縮フォーマット]のように圧縮していきます。 圧縮記号が見つからない場合は、圧縮をしないでそのままメモリ上にデータを落とします。
 LOADERは、アドレスが直接書かれている所(JRやJP、CALLの後ろ1/2バイトデータ)を覚えておき、指定した移動先アドレスで動作するように移動差を加減しているだけです。 (かなり強引なリロケータブルの実現方法です。)


圧縮フォーマット

 データのフォーマットは、「先頭部+データ部」という構成になっています。詳細は、以下の通りです。

 先頭部
  SADR(2):X2:X3:Y2:HOSEI(2):MKIGOU:KIGOU:LINE:RGB:WIDTH:DATA・・
※SADRからWIDTHまでは、ヘッダ情報(12バイト)。カッコ内はバイト数。バイト数の記載のないものは、1バイト。)

 データ部...
  DATA 非連続データ
  DATA:DATA 非連続データ+非連続データ
  圧縮記号:DATA:カウンタ 連続データ

 例えば、A,B,B,B,B,B,B,D,D,C,C,C,A(圧縮記号="2")の場合、
  A,2,B,6,D,D,2,C,3、A
のようになります。


エラーチェック

 誤値入力の際のエラーチェックは、LINE(&HA30A)、RGB(&HA30B)、それに、展開プログラムのX0(&HA6D0)、Y0(&HA6D1)のみ行っています。 これらは、誤値入力があると何もせずにRETURNしてきます。 それ以外のものについては、気を付けて入力して下さい。 特に、WIDTH(圧縮する画面の桁数。&HA305)とX1(範囲指定時のX座標の終点。&HA308)の大小関係などには十分注意して下さい。
 あと、圧縮中にデータがメモリにいっぱいになった時は、MNO(&HA07C)に1を出力してRETURNしてきますので、プログラムでここをチェックした方がよいでしょう。


最後に

 ついに、世間に公開してしまいました。
 まぁ、Oh!Xでボツをくらった作品なので、それなりといえばそれなりな作品ではあります。 が、私的には、非常に気に入っていたツールでした。いわゆる、自分の子供はかわいいというやつなのかもしれませんが。

 上の内容は、基本的にはOh!Xに投稿した内容そのままです。さすがに、入力方法だけは変更してますが。
 あ、あと、特徴の部分も変えてますね。社会人になって、アピールすべきポイントを表現できるようになってきた、という所でしょうか。

 今回、この原稿をあらためて読み返してみて、当時はソフトウェアに対して結構しっかりした考え方を持ってたんだなと、少しびっくりしてしまいました。 というのは、まさか原稿中にエラーチェックに関する記述があるとは思っていなかったので。
 ちょっとだけ、私が何故、今の部署に配属されたのか分かったような気がしました。

 では、最後の最後に、原稿の「最後に」を載せて終わりにしたいと思います。 一部、訳のわからない記述がありますが、気にしないで下さいね。(私自身も意味不明なので、修正のしようがないのです・・・(^^;))

 というわけで、2月号には多大な期待をかけていただけに、あまりにも(X1には)あさってな内容に、しばらく呆然としてしまいました (最後のPIC.Rは参考になりそうだったが、内容が理解出来ないし、プログラムも読めませんでした)。 しかし、結果的には初めてマシン語プログラムを完成出来たので、非常によかったのだと思います。 マシン語について興味を持ったのがあの85年11月号からでしたから、5年近くもたってしまったわけです (XANADUがすべていけないんだ!)。 とにかく、やっとマシン語の楽しさがわかってきましたので、これからどんどんX1を底の底まで活用していきたいと思います。 というわけで、これからもよろしく!!


参考文献

試験に出るX1 祝 一平 著 Oh!MZ 各号
マシン語プログラミング入門 渡辺 英之・沼倉 均 共著 M.I.A


その他、特記事項

 問い合わせが来るとも思えないのですが、一応断っておきます。基本的に、ノーサポートです。 (X1への転送の仕方などについても、同様とします。)
 ソースを添付してますので、興味がある方やバグに困っている方は、各自で対処願います。


付録.1 − パラメータ一覧 −


圧縮用パラメータ

パラメータ アドレス 説明 初期値
WIDTH &HA305 圧縮する画面の桁数。40 or 80。
80
X0 &HA306 画面の範囲指定。X座標始点。0〜78。
0
Y0 &HA307 画面の範囲指定。Y座標始点。0〜23。
0
X1 &HA308 画面の範囲指定。X座標終点。1〜79。
79
Y1 &HA309 画面の範囲指定。Y座標終点。1〜24。
24
LINE &HA30A 画面のライン数。
1
    1...200ライン、2...G-RAM BANK0、
3...G-RAM BANK1、4...400ライン
 
RGB &HA30B 圧縮するG-RAMの内容。
7
    1...Blue、2...Red、3...Green、
4...B+R、5...R+G、6...B+G、
7...B+R+G
 
KAKUNO &HA30C 圧縮データを格納するアドレス。
&HB000
CAD &HA30E システムの使用最終アドレス。
&HEFFF
以下、チェック用パラメータ
LASTAD &HA07A 圧縮したデータの最終格納アドレス。
&HB000
    下位、上位の順。
 
MNO &HA07C メモリ状態のチェック。
    0...メモリに余裕あり。
1...メモリに余裕なし。
 

※座標の指定は、ドット単位ではなくキャラクター単位なので、注意して下さい。


展開用パラメータ

パラメータ アドレス 説明 初期値
X0 &HA6D0 画像を移動する際の移動先のX座標の始点。
Y0 &HA6D1 画像を移動する際の移動先のY座標の始点。
KAKUNO &HA6D2 圧縮データの格納されているアドレス。
&HB000

LOADER用パラメータ

パラメータ アドレス 説明 初期値
IDOSAK &HA776 移動(リロケート)先のアドレスを指定。
    下位、上位の順。
 
VER &HA778 移動(リロケート)対象プログラムを指定。
    1...圧縮、2...展開
 


付録.2 − メモリマップ −


メモリマップ


付録.3 − サンプルプログラム(BASICからの使用) −

・圧縮プログラム サンプル

100 CLEAR &HA000
110 XO=0 : Y0=0 : X1=79 : Y1=24 : KAKUNO1=&HB0 : KAKUNO2=&H0 : KAKUNO=&HB000
120 WTH=80 : LNE=1 : RGB=7 : CAD1=&HEF : CAD2=&HFF : FILENAME$="SAMPLE"
130 LOADM "ASSYUKU.OBJ",&HA000
140 ' パラメータ設定
150 POKE &HA305,WTH
160 POKE &HA306,X0
170 POKE &HA307,Y0
180 POKE &HA308,X1
190 POKE &HA309,Y1
200 POKE &HA30A,LNE
210 POKE &HA30B,RGB
220 POKE &HA30C,KAKUNO2:POKE &HA30D,KAKUNO1:' 下位、上位
230 POKE &HA30E,CAD2:POKE &HA30F,CAD1: ' 下位、上位
240 '
250 CALL &HA000 : ' 圧縮実行
260 '
270 E=PEEK(&HA07C):IF E=1 THEN PRINT "NO MEMORY!":END
280 A=PEEK(&HA07A)
290 B=PEEK(&HA07B):D=B*256
300 LASTAD=D+A
310 SAVEM FILENAME$,KAKUNO,LASTAD,KAKUNO

説明)
・キャラクター座標で(0,0)-(79,24)の範囲を、RGB全てのスクリーンに対して圧縮する。
・圧縮データは、&HB000の位置より置かれる。
・「NO MEMORY!」エラーが出た場合、RGB=4(B+R)と3(G)に分割して出力するなどする。


・展開プログラム サンプル

100 CLEAR &HA500:CLS4
110 X0=0:Y0=0:KAKUNO1=&HB0:KAKUNO2=&H0:KAKUNO=&HB000
120 FILENAME$="SAMPLE2"
130 LOADM"TENKAI.OBJ",&HA500
140 LOADM FILENAME$
150 POKE &HA6D2,KAKUNO2:POKE &HA6D3,KAKUNO1
160 ' POKE &HA6D0,X0:POKE &HA6D1,Y0
170 CALL &HA500: ' X0,Y0を使用する場合は、160行をコメントアウトし、コール先を&HA503に変更。

説明)
・圧縮プログラムで圧縮・セーブされたデータを呼び出し、画面に表示する。
・座標を指定して画像を出力させたい場合は、170行のコメント行のように変更する。
・一度読み込んだデータは、メモリに残っている間ならいつでも展開を行うことが出来る。
 (これにより、同一画像の複数位置出力(移動)が行える。)


以上



戻る