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;
}
最終更新:2019年11月06日 15:44