カピバラ父さんのプログラミング処方箋~データファイルの読み込み

ゲームプログラムを作るとき、スプライトキャラクタやマップなどの配列データを使って、 スプライトコントローラデバイスの初期設定や、メモリやVRAM上に地図を展開することがあります。

この配列データは、少量であれば、.dc.b という疑似命令を使って、 ソースコード中にダンプリストとして貼り付ける方法で参照することもできますが、 一般的には、データファイルからロードする方法をとります。

データファイルの準備

今回の説明では、データファイルの内容や形式については問いません。

実用上は、グラフィックエディタや、マップ等専用エディタで作成したデータということになります。

データ作成の際は、編集領域以外に参考資料の表示や全体図と拡大図など、多くの情報を確認するほうが作業しやすいので、 X68000用の編集ソフトではなく、他のOSで動くエディタアプリケーションを工夫して使う方が便利だと思います。

ともかく、そのようにして作成したデータファイルを、開発中のプログラムがあるディレクトリもしくは、 そのサブディレクトリに、なんとかしてコピーします。

xm6g.exe+windrv.sysで環境を作っていると簡単なのですが、X68000 Zの場合、 XDFイメージにファイルを入れて、SDカード経由でコピーするなど、 少し工夫が必要になります。

DOSでファイルを扱うための基礎知識

自作プログラムからファイルを読み込むために、知っておくべきDOSの用語があります。

ドライブ名とカレントドライブ

X68000には、標準で2台のフロッピーディスクドライブがあります。

開発環境を構築するようなユーザであれば、他にSCSIまたはSASIハードディスクドライブを使うと思います。

実機ユーザになると、MOディスクドライブやCD-ROMドライブなどを接続しているかもしれません。

あと、RAMディスク、SRAMディスクも使う人もいます。

Human68kでは、これらの装置ごとに(パーティッション分割していればボリュームごとに)、AからZの文字を 割り当てて区別します。

文字の割当ては任意ですが、フロッピーディスクから起動した場合は原則として、 フロッピーディスクドライブ0(左側)がAドライブ、ドライブ1(右側)がBドライブです。

ディスク上のファイルを指定するときは、ドライブ名からのファイル名(例えばA:\command.x)で 書くこともできますが、ドライブ名を省略した場合には、カレントドライブに注目します。

カレントドライブは、コマンドプロンプトで A> となっていればAドライブ、という方法でわかります。

カレントドライブを変えたい場合は、コマンドプロンプトからは B: のように入力します。

ディレクトリとパス名

ディスク上のファイルは、使用上関連性が高いもの同士をグループ化して保存します。

このグループのことをフォルダとかディレクトリとか呼びます。

ディレクトリの中には、ファイルだけでなくディレクトリも入れることができるため、 奥まった階層にあるファイルを指定するためには、「〇〇県●●市◎◎町」の要領で ファイルが存在するディレクトリの場所を指定します。この住所形式をパス名と言います。

パス名は、一番上の階層から完全な形で記述する「フルパス表記」の他に、 ご近所さんを示すときに、1階層上を表す記号「..」を使って「相対パス」を与えることもできます。
A> cd ..

ルートディレクトリとカレントディレクトリ

各ドライブの、最上位階層のディレクトリをルートディレクトリと言います。 それ以外はサブディレクトリと言います。

ルートディレクトリは「¥」で表され、記録できるファイルなどの数が固定です。

カレントディレクトリは、各ドライブが現在作業しているディレクトリのことで、 cdコマンドにフルパス名または相対パス名を伴って変更することができます。
A> cd bin

DOSコールによるファイルの読み込み

読み込み時にはOPEN,READ,CLOSEの3点セットを使います。以下に例を示します。
【sampleread.s】

	.include doscall.mac
*	_PRINT	equ	$ff09
*	_OPEN	equ	$ff3d
*	_READ	equ	$ff3f
*	_CLOSE	equ	$ff3e

	.text
start:
	lea	filename(pc),a1
	lea	buffer(pc),a2
	move.l	#65536,d1
	bsr	load_file
	tst	d0
	bmi	error

	pea	success_message(pc)
	DOS	_PRINT
	addq.l	#4,sp
	DOS	_EXIT

error:
	pea	error_message(pc)
	DOS	_PRINT
	addq.l	#4,sp
	rts
	
filename:	.dc.b	'FILE.DAT',0
normal_message:	.dc.b	'読み込み成功です。',$d,$a,0
error_message:	.dc.b	'ファイルが読めませんでした。',$d,$a,0
	.even

*** ファイル読み込み処理 ***
* in	a1:ファイル名
*	a2:読み込み先バッファ
*	d1:想定ファイルサイズ
* out	d0: 0=正常終了 それ以外(負数)=DOSのエラーコード
laod_file:
	clr	-(sp)	* 読み込みモード
	pea	(a1)
	DOS	_OPEN
	addq.l	#6,sp		* 8バイト以下のスタック補正の書き方

	tst	d0
	bmi	@f	* d0に負数が帰ってきたらエラー処理へ分岐
	
		move.l	d1,-(sp)	* 想定サイズ
		pea	(a2)		* 読み込み先
		move	d0,-(sp)	* d0に正数が帰ってきたらファイルハンドルとして扱う
		DOS	_READ
		DOS	_CLOSE
		lea	10(sp),sp	* 8バイトを超えるスタック補正の書き方
		moveq.l	#0,d0	* 正常終了
	@@:
	rts

	.bss
buffer:	.ds.b	65536

そろそろ、アセンブラで書かれたプログラムも見慣れてきたころではないでしょうか。

同様の処理を、C言語で書けばもっと短い行数で収まりますが、 アセンブラの良いところは、慣れるだけ使えるようになり、物事を覚えなくても手数で勝負 できるところじゃないかと思います。


プログラミング処方箋へ

Copyright©2026 カピバラ父さん