MSXView用バイナリを作る

MSXViewはマウス操作のGUI環境。
元々はHALNOTEと呼ぶものでありDOS2用に改良されたものでソフトは互換性があり
HALNOTE用のアプリケーションはView環境でも動作するらしい。

MSXViewはシステムがROMに書かれておりアプリケーションはAPIを呼び出す事でGUI
機能を実行するらしい。
ソフト開発当初はアセンブラやLSIC-80が利用されたが後にMSX-Cなどでの開発が
サポートされた。
必要なヘッダライブラリはDatapack TR版にありMSX-C用にはViewKITなどのファイルが配布
され開発用のツールがあった。


実行形式の基本的な仕様は一般的なCP/Mと同様に0x100番地からバイナリが配置される。
ただしView用のソフトはGUIなどを扱うのでコマンドでは動作しない。
アプリケーションの種類は拡張子で区別され、アイコンなどは拡張子で変化する。
View上に表示されるファイルは拡張子は表示されない。
また実行形式としてはDAツールとViewアプリケーションの区別はない。

View用APIのライブラリコールは特殊で三つほどの種類があり、RST 8命令を呼ぶもの、RST 10と、
このほかに一般的なCとよく似たCALL命令によるAPI呼び出しがある。
RST命令を利用したAPI呼び出し規約は特殊で、引数などはRST命令の直後の2byteに配置
されるように埋め込む。このスタックを用いないAPI呼び出し方法は現在あまり見かけない。
現在一般的なCのSTDCALL呼び出し規約とは違いがある。
このためそのままC言語の関数として呼び出す事は出来ないのでラッパ関数を用いて
MSXView用APIライブラリ呼び出し関数群を実装することになる。
(ちなみにMSXViewではAPIのことを○○packと呼んでいる)


引数についてはRST命令後ろの2byteに機能番号を配置し、必要なレジスタにパラメータをセットして
RST8などを実行することでAPIを呼び出すという特殊なシステムコール呼び出しとなる。
またRST8とRST10では命令後の2byteのパラメータが若干異なっている。
RST8では2byte整数、RST10では1byte*2という形式らしい。
通常はこれらをC関数にラップして利用する。RST命令部分は引数が特殊のため開発当事は
インライン指定してコードを埋め込みしていたらしい。

VIEWパックと呼ぶライブラリAPI機能番号が0x123の場合の基本的な呼び出し方法は
アセンブラで示すと以下のようになる

	NOP
	RST 8
	.dw	0x0123
	NOP
	RET

APIライブラリの呼び出し方法や形式はそれぞれ異なるのでRST10やCALL命令を利用する
場合だと大きく違う。
詳細は資料(DatapackTR版やディスクにあるヘッダファイル)などを参照しないと
SDCCやそのほかの開発環境用のAPIヘッダを作る事は出来ないだろう。
ViewKITにはM80用のAPI関数のRELファイルが配布されているがソースはないので
これも詳細はわからない。

アプリケーションが使用可能なメモリは32KBが基本で、その範囲を超えるソフトについては
オーバーレイという手法で個別の機能を分割して実装するらしい。
一般的なGUIアプリケーションを作る場合は現在のWin32APIと同様にウインドウを
作りハンドルを得て管理し、イベントハンドラによるイベントループで各種操作を行う。
基本的にはイベント駆動型のアプリケーションとなり、イベントマネージャが提供する
関数からイベントを検出しながら動作するソフトの作り方となる。

View用アプリケーションソフトの構造そのものは現在のWindows用のイベントハンドラ
APIと変わらない。違いは8bit環境でシングルタスクであるということくらい。
マウスを使った簡単なサンプルは別途配布されていたViewKITなどのアーカイブに含まれる。
個別のバイナリのサイズは小さくあらかじめ用意されたAPIを呼ぶだけなのでコードは
APIを利用するルーチンとなる。


  • アセンブラによるアプリケーション例

ここでは単純にMSXViewを終了させるアプリケーションソフトを作成する。


;View用の実行形式テスト。
;生成するバイナリの拡張子は*.daか、または(xxなどにすること

	.area	_ASM(abs,con)
	.org	0x100

;
;RST8でコールする。機能番号はRST命令のあとの2byte
	rst 8
	.dw	301		;View終了API機能番号コード

	ret


アセンブルは以下のようにする

>sdasz80 -o view1.rel view1.asm
>sdld -i view1.ihx view1.rel
>hex2bin view1.ihx
>copy view1.bin view1.da


次にタイトル表示用のアプリを作る。ウインドウ関係の表示バックアップは
していないので画面消去はせず単にタイトル画面を表示するだけ


;View用の実行形式テスト。
;生成するバイナリの拡張子は*.daか、または(xxなどにすること

	.area	_ASM(abs,con)
	.org	0x100

;RST8でコールする。機能番号はRST命令の後ろ2byte
;
;引数なしのAPI機能
;301=終了
;372=タイトル表示

	rst 8
	.dw	372
	ret


最後に小さな一行ダイアログを表示させてみる

;View用の実行形式テスト。
;生成するバイナリの拡張子は*.daか、または(xxなどにすること

	.area	_ASM(abs,con)
	.org	0x100

;
;RST8でコールする。機能番号はRST命令のあとの2byte
;
;263=message dialog表示

	push	hl		;レジスタバックアップ
	push	bc
	push	de

	ld	bc,#0
	ld	de,#0
	ld	hl,#TEXT1	;表示文字列指定

	rst 8			;ViewAPIコール
	.dw	263			;API番号指定(Dialog)

	pop	de		;レジスタ復帰
	pop	bc
	pop	hl

	ret

TEXT1:
	.ascii	"ABCDEFGHI"
	.db	0x0




ViewAPIの終了機能をCで書き直すとするならば以下のようになるだろう
これらをすべてのAPIに書き直すとSDCCがView用の開発環境となるだろう。

void exitview(){
	__asm
		RST 8h
		.dw 0x301
		nop
	__endasm;
}

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2019年11月06日 15:44
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。