[言語] MSX-DOS
命令セット一覧:Z80マシン語/MSX-DOS上級編20011年3月第16改訂版
[FULLMSX.COM]
[やってみましょうBASIC]-[グラフィック]-[サウンドとミュージック]-[マシン語]-[ダウンロード]
mon-girl
<< MSXの動画による使い方もご覧ください >>
SUPER-Xでマシン語モニタ:
http://zoome.jp/fullmsx-movies/diary/4/
SUPER-Xのダウンロードできるサイトがありません。
現在、MSX版のZ80のマシン語モニタアセンブラを制作中です。
FULLMSX:MONASM
逆アセンブラ方式の記述であれば
BIOSのコールなど小さなプログラムを実行できます。
実行はMSXパソコンで使用できるMSXファイルになっています。
ORG機能が備わっていないため9000hからになります。
基本的な命令とBIOSのコールなどできますが、保存ができません。
<< monasm20110313.lzh を ダウンロード >>
開発の状況はモニタ、アセンブラを制作しています。
ダウンロードするとマシン語モニタはメモリの内容を表示させることができます。
FULLMSX:MON 1000H
MSXテキストでは00~07Hと08H~FHまでの32文字の表示ですが、
制作中のものはSCREEN7では横ドットがハイレゾになって64文字の表示になり
MSX2で88のような小さな文字を表示することができるわけです。
画面は1000HのMSXのBASICのROMの内容です。
コンソール部もSCREEN7で表示できます。
■体験してみたい
マシン語は誰でもプログラムできます!体験してみてください。
やってみましょうZ80マシン語 初心者でマシン 語を始めたい人向けです
MSXマシン語適当講座その1 マシン語からBASICの変数を取得、LD、CALL、INC
MSXマシン語適当講座その2 SUPER-X、実行、アセンブラ、ソースを書く
MSXマシン語適当講座その3 一時的にレジスタを使う、フラグ、レジスタ、転送
MSXでマシン語BASIC 中級編 ハンド アセンブルからの話題です。続編へのリンクあり。
*命令セット一覧:Z80マシン語/MSX-DOS上級編 Z80、モニタアセンブラ、テキストエディタ
やってみましょう!MSXBASIC
http://www.geocities.jp/fullmsx2/u-yan/mon.html
http://www.geocities.jp/fullmsx2/u-yan/msxi-hi1.html
http://www.geocities.jp/fullmsx2/u-yan/mb-quick.html
ドナドナを聴きながら
http://www.geocities.jp/galfned/mou/mou.htm
http://www.geocities.p/galfned/xanadu/xanadu.htm
★はじめに
マシン語はどんなパソコンでもあります。MSXはWindowsより古いパソコンです。
コードを書き換えた経験はありませんか?
一般には0~10の数字ですが、パソコンでは0~15の数字です。
これは2進数が進化して16進数になったものです。
マシン語は決められたコードで書くことができれば
MSXBASICよりも高速に動作することができます。
ではどういうことか?と、言えばたとえば
電源ボタンを押せば、リモコンからテレビに
信号が送られます。このように動作の手順をコードにしています。
例えば地デジの1チャンネルとか、入力切替えとかありますね。
このコードを読むことができる小さなメモリがリモコンに入っています。
このコードを読んで、送信させることで、ビデオデッキの受信機が読み取ります。
言語はこの機械的な操作を補助させて言語拡張にすることで、
マシン語を言語にして簡略化させることができます。
そして、このように外部で操作できるようにするために入出力して通信できる
I/Oポートを使います。
MSXBASICが遅いのはBASIC言語をマシン語に実行させながら
変換するインタプリタという処理をするために
速度が遅くなることが一般的に知られています。
BASICはカンタンな命令でマシン語を動作させる魅力があります。
C言語はソースをマシン語すべて変換させて行うコンパイルが遅いですが、
実行中はマシン語に変換することがないので、コンパイル後の動作は速いです。
■Z80のCPUは
処理能力が8ビットという代表的なCPUです。ご存知のように
0と1で1ビットの処理の2通り、00と01と10と11で2ビットの4通りのように
ゼロとイチが8つ並ぶ通りの処理を行えます。これは16進数で参照してください。
このようなCPUはPC8801、MZ、X1など多くのパソコンに搭載されていました。
ハードウェアを単純にしてソフトウェアを複雑にしていたのが昔のPCです。
現在とは正反対で処理は遅いのですが凄い技術を使ったものが多いです。
ただZ80のCPUから大きく拡張されたハードウェアを操作する事には変わりはないです。
マシン語をCPU(中央演算装置)に命令を送ることができれば
理論的にはどんなPCもハードウェアも動かせます。
また、ハードウェアを使わないでメモリとCPUだけを使えば
MSX以外の他機種でも動作させることができます。
この場合はメモリマップに従ってプログラミングします。
ORGのロード域が変わりますが意外と安易にできると思います。
Z80インストラクション表:http://www.geocities.jp/fullmsx2/u-yan/msx-mac1.html
■マシン語モニタ
マシン語モニタはメモリとレジスタの情報を表示するソフトです。
レジスタは電卓の1234567890というものを16進数値であらわし
メモリはレジスタの数値を記憶領域を指定して記憶するものです。
数値をメモリ/レジスタにロード。レジスタからメモリ(アドレス)にロード。
メモリ(アドレス)からレジスタにロードというLD(ロード)表記から
MOV(ムーブ)移動表記にインテル製では変わっていますが、
実行した後にメモリ、レジスタに正しく数値が入っているかを
確認することができるプログラムです。
またプログラムではなく画像データまたは文字コードもアドレスに書くことができます。
メモリには何でも入れることができる特長があります。
16進数:
http://www.geocities.jp/fullmsx2/u-yan/basic/hexa.htm
MSX-DOS:SHEM
MSX-DOSのフリーソフトウェアSHEMのマシン語モニタ画面
SHEM::
http://www.geocities.jp/fullmsx2/u-yan/shem.html
MSXのゼロはゼロスラッシュになっています。これは数値の0です。
画面は0100Hから1バイトごとにE7 ED 5B 06 00 21…となっています。
EDが0100Hで5Dが0102Hです。ADRSがアドレスで
0105Hは0100H+5で21が入っています。
16進数の右側はASCIIのコードです。
ここにMSXと書けば
書いたアドレスに16進数のコードが入ります。
さらに16進数コードで矢印パターンを書くと
GraphicWindowにグラフィックが表示されます。
画面はRes:でレジスタペアで表記されています。
HLはHレジスタとLレジスタのペアとなります。
Fはフラグの数値が入り、右からFのビット情報が
順に呼んでいくと、
AFレジスタ、
サインフラグ(S)、
ゼロフラグ(Z)、
なし(-)
ハーフキャリーフラグ(H)、
なし(-)、
パリティオーバーフローフラグ(P)
減算フラグ(N)、
キャリーフラグ(C)となり
BCレジスタ、
DEレジスタ、
HLレジスタ、
IXレジスタ、
IYレジスタ
です。
下段の情報はMSX-ROMのスロット情報です。
あとはアレやコレやと初心者にはどうでもいい情報ですが、長く使っていく方には便利な情報になっています。
レジスタは00HからFFHまでですが、
レジスタペアは0000HからFFFFHの数値を使うことができます。
0150H以降が00になっています。
もし、何かを書くならばこの00の領域に書くとよいでしょうね。
詳しくは後ほど解説しています。
■Z80命令変換表
高性能なアセンブラがない場合はハンドアセンブルになります。
最初は00~FFのニーモニックの1バイトコードが記されていますが、
CBとDDとEDとFDはCB XXとXXは00~FFのコードで
2バイト以上のコードになります。
さらにDDCB、FDCBの場合で例えばSLA (IX+d)は26ですが
このdに02Hが入る場合はDDCB0226となります。
これはインデックスレジスタの特殊な例ですから一般的には不要でしょう。
Z80マシン語ニーモニック変換表:
http://www.geocities.jp/fullmsx2/u-yan/msx-mac1.html
■MSXのマシン語モニタは難しい?
確かに何が何だかわからないかもしれませんが、
メモリに何が入っているかを見たり、書き込んだりできます。
もちろん、マシン語を見るための画面です。
マシン語は計算したりメモリ操作するもので、
データはデータエリアを作って文字をあらかじめ入れておきます。
MSXパソコンのメモリを調べていくとエラーメッセージなどが
入っている場所があったりします。
上の画像は16進コード、MSXの文字コードなど何のコードが
入っているかを見ることができます。
モニタによって表示は異なりますが、基本的に同じような機能があります。
Z80のCPUについてはZ80 - Wikipedia を参考にしてください。
今回はSEO対策ということでMSX-DOS編とBASIC編と分けて解説をしています。
MSXパソコンは今のPCに比べておもちゃのマシン語ですが味わってみてください。
■開発環境を選ぶ
この16通りの数値を言語化してわかりやすくしたものがニーモニックと呼ばれるものです。
このニーモニックから16進数に変換して組み込むものがアセンブラです。
MSXでは残念な事にモニタアセンブラが内蔵されていません。
16進数:
http://www.geocities.jp/fullmsx2/u-yan/basic/hexa.htm
ここで述べている内蔵というのはボードの中に記憶装置(ROM)を指しています。
記憶装置のデータを実行するプログラムをソフトウェアと呼んでいました。
今現在のPCの内蔵はオンボード、ハードウェアのロジック回路に組み込まれた
もので本質は全く異なります。
そこで、いずれかのソフトウェアを揃える必要があります。
1.プログラムをテキストファイルに書く、ファイル書き込み方式
2.モニタアセンブラから書く、メモリ直接変換方式
3.BASICから行番号方式で書く、メモリー書き込み方式
プログラムをテキストファイルに書く方法ですすめていきます。
ここからはマシン語MSX-DOS 上級編です。
当時DOSがなかった時代にはテープで行っていました。
当時の記憶媒体はパソコンの補助するものとしていました。
ですから、パソコンの機能をそのまま使うことができました。
MSX-DOSは記憶媒体を補助するものという考え方だろうと思います。
これは記憶媒体のディスクの機能をそのまま使うことができる考え方です。
このようにすればパソコンが異なってもMS-DOS互換のフォーマットが
あれば移植などが行いやすくなったのでしょうね。
MSX-DOS2はあまり普及しなかったのですが、
MS-DOSで動作するプログラムをMSXに移植したりしたものが多くあります。
当時の一般的なMS-DOSのプログラミングはCOM(EXE)ファイルを書いて、
DATファイルかOBJファイルを読み込むという流れでやっていたようです。
MS-DOSは16ビットOSでCが快適に動作していたからでしょう。
残念ながらMSX-DOS2では8ビットのOS(CP/M)からの流れがあり、
テープがディスクに引き継いだマシン語プログラムが主流になっています。
どちらかと言えばPC-8801程度の開発環境が大半ではないかと、思います。
MS-DOS以前のマシンを調べることには適していると思います。
■テキストエディタ
テキストエディタで1行に1つの命令をプログラムとして書き、ソースリストを作ります。
テキストファイルはASCII(半角英数)コードを使うことができます。
ASCIIコードはMSX-DOS、CP/M、MS-DOSなど異なるPC環境でも使うことができます。
MSX-DOSではディスク操作と限定されますがMSXBASICよりもメモリが少ないために
MSXBASICのマシン語エリアよりも広いエリアを使うことができます。
MSX-DOS TOOLSでは行単位で文字を操作するコマンドがあります。
メモリが少なく、ファイルを操作したり、コマンドを作ったりすることができるようになった為に
大規模なソフト開発ができるようになりました。
この環境であれば、まずメモリの制約を受けることは少ないでしょう。
自由にプログラミングできます。アセンブラは無理でもMSXでC言語もあります。
V&Z2editor ViperとZeroさんの開発しVZライクなエディタ(ASCATさんサイト)
APED AKID/KIDライクなエディタ
Wikipedia:WZeditor
テキストエディタは1つのファイルはもちろん、ファイルを追加して途中からでも加えることができます。
MSXBASICのマシン語と違ってメモリに書き込まないために自由にソースを組むことができます。
昔のほとんどのエディタはラインエディタベースで作られているため
カット&アンドコピーペーストができませんでしたが、このエディタであれば楽にできるでしょう。
また、プログラムを行単位で編集したい場合はテキストカッターを探すとよいでしょう。
後はMSX-DOS TOOLSのユーティリティか、自前で組むかでしょうね。
★テキストエディタで日本語入力の表示をしたい
;入力枠消去
LD A,03H
ソースコード入力は日本語で書くことが多いのではないでしょうか?
8ビットのMSXマシンではシフトJISの2バイト系コードの入力には
適さない環境ですが、拡張したものが漢字BASICです。
MSX2で漢字ROMがあれば表示は可能です。
MSX2+以降のマシンでは漢字BASIC有効にします。
■マシン語モニタ・アセンブラ
SUPER-X 「SUPER-X」はMSXBASIC用の高機能なモニタ・デバッガです。
SHEM プログラマ必須の高機能なMSX-DOSマシン語モニタです。おすすめです。
SUPER-XはMSXBASICからのマシン語モニタですが、いろいろと使えます。
MSX-DOS(2)であればSHEMがよいでしょうね。
SHEMの特集もしています。
http://www.geocities.jp/fullmsx2/u-yan/shem.html
マシン語の2進数を16進数の表にして操作できるのが、マシン語モニタです。
このページでは16進数コードをマシン語として話していますが^^;
私の知り合いの紅茶さんがA1WXでMSX-DOSで開発していて、
SHEMの作者であるSherryさんはA1GTでしたが、
こんな感じでMSX2+程度のマシンであれば十分です。
■MSXの書籍から
まぁ何とかなるなら、この方法もあります。
最初はMSXマガジン永久保存版1 p177にあるMSX self assembler、もっとMSXを極めるならば
MSXマガジン永久保存版3 p118にあるM80のあるMSX-DOS2 TOOLSもよいでしょう。
MSX-DOS(2) TOOLS
http://www.geocities.jp/fullmsx2/u-yan/msxdos-tools.html
■マシン語モニタ基本命令
一般的なZ80マシン語モニタのコマンドです。
A(アセンブラ)-アセンブラ
B(ベーシック)-BASICに戻る。
D(ダンプ)-ダンプ。メモリの内容を表示する
S(サブスティテュート)-メモリの内容を変更する
X(イグザミン)-レジスタの内容の表示と変更する
G(ゴー)-マシン語プログラムを実行する
R(リード)-VRAMからVRAMへ転送
L(リスト)-プリンタ
参考ですがWindowsXP/Vista/7でもデバッグモード(モニタ)があります。
cmdでコマンドプロンプトに入って、debugコマンドで入ります。
QでMS-DOSへ戻ります。
★シンプルなタイプ
D000 00 11
D001 20 22
D002 03 33
D003 00 _
1アドレスごとに表示するモニタもある。左からアドレス、書き換え前のコード、後のコードになっている。
_をカーソルにしてみた。入力は2バイト入力してRETURNを繰り返す。
1つ前のアドレスへ修正したい場合
D004 00 33^_
と、^を入れると、
D003 33 _
になる。さらに.の場合は
D003 33 C9.
とする。
◆高性能なモニタなら、
例:D(ダンプ)のA000Hの場合
>DA000
0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F -CHR-
A000:4D 53 58 20 42 41 53 49 20 76 65 72 73 69 6F 6E MSX BASIC version
と何がなんだかよくわかりませんが、これはメモリのA000~A00Fの内容をモニタしたものです。
CHRはキャラクタコード256種類を表示させています。
A000:4D 53 58 20 42 41 53 49 20 76 65 72 73 69 6F 6E MSX BASIC version
コードとキャラクタコードの表示があります。
入力は続けてコード、またはキャラクタを入力できます。
★ASCIIコードを調べる
右のキャラクタのMSXのMは4Dですが、
この4Dを調べる方法はBASICで
? chr$("&H4D")
M
となり、Mを調べたい場合は
? hex$(asc("M"))
4D
このようにマシン語は変数などはありません。いたってシンプルなものです。
ニーモニックを判別してマシン語に変換。その後、モニターから実行することができます。
コメント:おすすめはM80のテキストファイルでしょうね。慣れてくればSHEMの逆アセンブラ方式でもOKになります。
■アセンブル
マシン語(オペレーションコード)をわかりやすくしたものをニーモニックと呼びます。
POPとかLDとかCALLとかのことですね。ニーモニックを記述する方法は
テキストファイル、BASICファイルの場合はジャンプの記述はラベルで、
どちらもテキスト形式として保存します。アドレスは決まっていないので再配置が可能です。
アセンブラ方式はフリーエリアにロードするアドレスを変えることがことができます。
普通はORG命令であらかじめ番地を決めますが、
MSX-DOS TOOLSでは複数のソース(ライブラリ)を1つのソース(オブジェクト)に構築もできます。
それがリンカです。
その後、アセンブラを実行してエラーチェック後にマシン語に変換されます。
メモリ直接書き込みの場合はメモリダンプされたものがアセンブルする逆アセンブラで
ジャンプの記述はアドレスで、バイナリ形式として保存します。
アドレスは決まっているので再配置はできません。
このようなプログラムは逆アセンブラでソースファイルに戻します。
◆アドレスを決める
自分で変数、文字情報、オブジェクトと領域を決めていかなければなりません。
でも難しくはありません。全てアドレスです。ユーザーエリア内で決めればよいです。
文字データであれば128バイト、変数データであれば12バイトくらいとワークエリアを仮に決めます。
D321HとD322Hの間にプログラムを加えたい場合など
プログラムを加えたい場合はD322H以降のプログラムのアドレスをずらすブロック転送を使います。
◆メモリのデータ
データは「1つアドレスを読んで、この座標に文字を表示」という繰り返しで表示します。
EOFなどがないので、ASCIIの終了コードなどに決めます。
BASICがわからなくても、「マシン語(アセンブラ)?あ~わかるよ。」という意外な方が多いです。
マシン語はモニタするだけで全て見ることができます。
決められたコードのパターンがありますから、コレを書き換えれば
例えばPORT1接続をPORT2接続にできます。
■ソースコードの入力
ORG 100H
LD A,00H
LD C,01FH
CALL 0005H
残念ながらWindowsではTTFで微妙に狂いますが
TABキーで水平タブを使えば揃います。揃えていくと見栄えがよくなります。
最初はシステムコールなどを使ってMSX-DOSでいたずらをする程度から
始めると飽きがこないでしょう。こんな感じでよいです。
◆バイト数とステート
インストラクション表があれば
使用するバイト数とステート(処理の単位)を少なくすることで
さらに高速に処理をさせることができます。
◆Z80には掛け算命令はない
掛け算命令がないCPUではBレジスタ×Cレジスタを
バイナリに分解して筆算をします。
Aレジスタは計算用に空けておきます。
ここでつまずくところは2の繰り上がりの時です。
アセンブラでのかけ算例
私もわからなくなってしまうことがありますが、
このように整理するとわかります。
加算の方法は2はバイナリで10とやってはいけませんよっ。
1+1=0で繰り上がり1、1+1+1=1で繰り上がり1
1+1+1+1=0で繰り上がり2の1、1で
1+1+1+1+1=1で繰り上がり2の1、1となります。
通常の10進の筆算よりも面倒なところがありますが、
このように1を足していきます。
■アセンブラの実行方法
CP/MのZASMをMSX-DOSで実行する方法です。
A>ZASM ZTYPE.ASZ -C
Z80アセンブラZASM:
http://www.vector.co.jp/soft/dos/prog/se010314.html
どうやらパソコン通信版CP/M80とパッケージが異なるようです。
MSX-DOSはMS-DOSバージョン3と互換性があるらしいのですが、
CP/M版のみ実行が可能でMSX-DOSはどうなっているのか
比較しないとよくわからないです。
■環境を考える
これでソースを書くエディタ、マシン語モニタ、アセンブラが決まってきたと思います。
フロッピーから必要なファイルを仮想ドライブに置きます。
MSX-DOS2が起動できる環境でラムディスクをマウントして仮想ドライブ(H:\)を有効にする。
MACファイル、DATファイルをHドライブにコピーする。
KAIHATU.BATを作成すればKAIHATUで実行できるようになる。
■環境を設定する
MSX-DOS(2)を使ってもラムディスクでした。
MSX-DOS1はラムディスク機能がないのですが、フリーソフトでラクにラムディスクが使えます。
なお、1chipMSXではSDカードのアクセスが速いのでそのまま設定でよいです。
このソフトはMSX -DOS(2)フリーソフト編で紹介しています。
A>COPY CON KAIHATU.BAT
RAMDISK 4048
COPY *.MAC H: + COPY *.DAT H:
COPY L80.COM + M80.COM H:
^Z
1 file copied.
最後の^zはCTRL+Zで閉じる。
こんな具合で入れていきます。
■ラムディスクドライブH:を使う
ラムディスクはパソコンが起動中に使うことができますが
電源を切ったり、パソコンが暴走するとデータが消えます。
1.プロンプトの設定
H:\U-YAN\TEST\のアドレスにいるようでしたら
H>SET PROMPT ON
H:\U-YAN\TEST\>
のほうがいいかもしれません。シンプルに戻したい場合は
H>SET PROMPT OFF
H>
でもよいです。
2.別のドライブからカレントへコピーする
たとえばA:\U-YAN\C.ASMをコピーしたい場合
H>COPY A:\U-YAN\C.ASM *.*
と最後に*.*を加えます。
3.別のドライブへコピーする
たとえばC.ASMをA:\U-YAN\TEST\へコピーしたい場合
H>COPY C.ASM A:\U-YAN\TEST\
となります。
これは仮保存したものを保存したい場合に
ファイルをコピーします。
4.ラムディスクを開放する
メモリマッパを使ったアプリケーションを使いたい場合などに
ラムディスクを使わないようにするにはデータをコピーした後に
H>A:
A>RAMDISK 0
ここでYを押します。これでH:\ドライブは消えました。
5.リセットしてもラムディスクを復帰するようにする
暴走して誤動作した場合は通常はリセットされて初期化されますが、
起動中の状態にラムディスクを戻すようにするRRAMDISKのフリーソフトがありました。
MSXパソコンはリセットしても消える部分は一部分ですから、
消えない領域にデータを保存する技があったりします。
そういえば…
イースのタイトルなどの画像をキャプチャしたりすることが流行りましたね。
6.その他の設定方法
詳しくはよ り高度なMSX-DOS2を参照してください。このへんにしておきます。
※RRAMDISKコマンドは1chipMSXでは動作しません。
■アセンブラソースの見方
ニーモニック以外にプログラムを補助するマクロ機能が加わっています。
逆アセンブラと違いアセンブラソースはアドレスをラベルになったり
アセンブラ、マクロを操作する命令、BASICなどの簡易言語などがあります。
ここでは代表的なコマンドを載せて置きます。
WHITE EQU 15
EQUate、イコールと呼びます。
SimpleASMなどでは
WHITE: EQU 15
と書く場合もあります。
WHITEと書くと15という数値に変わります。
たとえば
LD A,WHITE
という記述ができますが、再定義する場合は
MAX ASET 15
と、再定義できるコマンドもあります。
ORG 0D000H
オリジンは0D000Hにオブジェクトを配置します。
CAPSON: POP AF
これはジャンプポイントのラベルです。
PUBLIC CIRCLE2
これはCIRCLE2というマシン語サブソースを作ります。
長いプログラムになる場合に分割して使うことができます。
EXTRN CIRCLE2
これはCIRCLE2というマシン語サブソースをコールします。
DB ’U-YAN’
データバイト。これはU-YANというデータを入れます。
プログラムエリアの後にワークエリアを加えて
U-YANと書き込んでください。DBはDEFBと書く場合もあります。
DS 16
データーストレージで16は16個データ用に空ける意味です。
■MSXパソコンの調べかた
数行でマシン語ソースができる。
もっとMSXを知りたいならば下のリンクを辿って見よう。
http://ngs.no.coocan.jp/doc/wiki.cgi/TechHan
MSX2テクニカルハンドブックのwiki
さらにMSX2テクニカルハンドブックをユーザーが補足した
MSXテクニカルガイドブックもあります。
http://fetish-jp.org/ascat/index.htm
http://www.ascat.jp/index.htm
MSXでよくわからない事の参考になります。PDFファイルで全文読むことができます。
星印の見出しは 専門用語が多くMSX-DOS、モニタアセンブラの操作の経験がある
マシン語中級者向けに書かれています。
見出しが競合しているのですが、そろそろページを分割しないと(ボソ)
■ROMとRAM
これから、さらにMSXパソコンのシステムに入ってみましょう。
MSXユーザーの知りたい情報の1つでもあります!
スロットを操作してみるであります!よく考えないと後々とんでもないことになる部分です。
誰でもわかる程度に書きましたが、まだ不十分かもしれません。
ROM(リードオンリーメモリ)は読むことができるメモリです。
ROMには内臓ROMと外付けROMがあります。
外付けROMはと「ROMを差し込む(カートリッジ)ことで動作することができる」
画期的なものでした。
それがシンプルになってPCの中に差し込むカバーのいらないボードがあります。
このメモリに書き込むことをROMに焼くといいます。
MSXは今までROMにBASICインタプリタとRAMに動作に必要なデータの構成で
0000H~7FFFHまでがROM 32K、8000H~FFFFHまでがRAM 32Kでした。
■MSXのROMと拡張スロット
スロット切り替えどういうものでしょうか?
メモリスロットには読むだけのメモリ(ROM),読み書きできるメモリ(RAM)の
大きく分けて2つの種類があります。
スロット切り替えはメモリスロット0000-FFFFhの64KBを4つに
切り替えて使うことができます。
メモリ構成が
#0がROM,ROM,なし,なし
#1がRAM,RAM,RAM.RAM
とある場合
メモリスロットがROM,ROM,RAM,RAM とか
メモリスロットがRAM,RAM,RAM,RAM とか
考えられますね。、これをインタースロットコールと呼びます。
ね?ここまではわかるでしょう?
ROM(#0)とRAM(#1)の2つを例えましたが、実際には0#~3#の4つあります。
これが1つメモリスロットに16KBの4ページ(MSXの4セグメント)の構成で
説明すると例えばMAIN(#0)、MAIN(#0)、#3-0、#3-0
これがMSXのBASICの起動状態です。
そして、このメモリは
さらに基本スロットが4つですからROMかRAMを4つ置けます。
さらにさらにこの1つのスロットに4つのスロットを拡張できます。
Sherryさん口調のような感じですが^^;ほとんどSHEMの解説のような…
MAINで基本スロットの1番目、SUBで基本スロットの2番の拡張スロットの3番
とできます。これがMSX2+までの説明です。
■MSXのROM構成
MSX2を例にしてみます。4つのROMは0(ゼロ)を含む0,1,2,3です。
スロット0:MAIN-ROM(32K)
スロット1:ROMカートリッジ1
スロット2:ROMカートリッジ2
スロット3:RAM(64K)
MSXBASICの場合はMAIN(0),MAIN(0),RAM(3),RAM(3)になっています。
MSXBASICで使用できるのはRAMは通常32KBまでですが、
MSXBASICのワークエリアがありますので25298バイト程度と少ないです。
起動時に出る64KBはこのスロット3のRAMの容量を計算していますが、
実際にはRAM,RAMの32KBですね?残りはMAINですから通常では使えません。
この領域32KBを通称:裏RAMと呼びます。これを拡張するのがCALLMEMINIです。
そして、MSX2+になるとスロット3が4つに分かれて拡張されます。
スロット3-0:RAM(64K)
スロット3-1:SUB-ROM、漢字ドライバ、単漢字辞書
スロット3-2:なし、DISK-ROM(option)
スロット3-3:なし、MUSIC(option)
となります。
MSXグラフィックプログラミング講座:第6回スロット指定のしかた
http://www.geocities.jp/fullmsx2/u-yan/msxi-hi2.html
■メモリマッパとは
この1セグメント16KBを256個で切り替える方式で
64KBのDRAMを切り替えることで最大4096KBまで拡張できる。
MSXturboRは256KB、1chipMSXで2MB、1chipMSX改で4MB
になる。メモリマッパをアクセスするにはマッパBIOSを使う。
1chipMSXでは#3-0がRAMスロットになっている。
そのほかにメガROMはゲームで128KB(1メガ)、
512KB(4メガ)などがあります。これも切り替えて使っています。
■MSX常駐ソフトの可能性
MSX-DOS2でMSXのメモリ管理が大きく変わってきたこで
PC-9801などに見られた、いつでも起動可能な「常駐ソフト」
というアプリケーションが可能になりました。
Windowsでは右下のボリュームなどのお馴染みのアイコンですね。
MSXで特長のソフトといえば割り込みフックを使ったMGSDRVの音楽演奏機能です。
有効にすることでMSX-DOS2またはMSXBASICでもMGSデータを演奏することができます。
これは高度な例ですが、
例えばですね、MSX2ではメモリディスクのCALLMEMINI命令があります。
コールメミニ、正式にはコール、メモリ、イニシャライズでしょうね。
これを使えばMSXBASICのプログラムを裏RAMのメモリに保存できます。
SAVE"MEM:INC.BAS"という具合です。
要するに使っていないアドレスを使うようにすれば常駐のようにできます。
■MSXのメモリ管理の構成
MSXは0000H~FFFFHの64KBを4つを切り替える
スロット切り替え(インタースロットコール)と呼ばれる方法が一般的でした。(前述)
スロットは0000H~FFFFHの64KB以上の管理ができないことから
MSXturboR以降で16Kバイト(0000H~3FFFH)ごとの4つを切り替える
メモリマッパという別の方式が採用されました。
このメモリマッパは1セグメントで64ページの切り替えで64セグメント
メモリマッパRAM搭載量に限られますが、
64*4の最大256セグメント(4MB)まで扱うことができます。
これでスロット1かスロット2に64KB以上のRAMを差し込むことができます。
1chipMSXでも動作可能です。
■OSがない、ファイルがなくても起動できるパソコン
MS-DOSでAUTOEXEC.BATとかCONFIG.SYSがないと動かないと思ってはいないでしょうか?
プログラムのハードウェアの操作する部分ではトラック、セクタという単位で読み書きをしています。
フォーマットというのはMS-DOS方式で読み書きを行うということです。
ブートセクタにMSX-DOSありか?なしかの情報を書き込むエリアがあります。
ここで判別して、ある場合はMSX-DOS.SYSを読み込むというわけです。
ない場合はMSX-DOSではないとディスク異常になりますが、
指定がない限りは上から順に読み込んでいきます。
そこにマシン語プログラムで指定したセクタに移動するなどの事をすればいいのです。
このようなディスクの中を見る時にセクターダンプというものを使います。
ですからよく、ファイル名のような謎のデータがあったりします。
シフトJISだったりキャラクターデータだったりすることもあります。
ディスクファイルの構造、システムコールなどわかってくれば
自分だけのOSを作ることも夢ではないでしょう。
■COMファイルの解析しかた★
MSX-DOSはMSX版のMS-DOSです。
MS-DOSシステムを解析した経験があれば違いがわかります。
ファイルの読み書きできる逆アセンブラと言えば
開発環境は「ほおじゃあ」を使います。
http://sakuramail.net/fswold/tool.html
■解析元のマスターファイルを残す★
まず、U.COMならばU3.COMという仮ファイルにコピー
してマスターファイルU.COMを残しておきます。
このU3.COMが解析用のファイルになります。
■モニタアセンブラの操作★
このファイルを「ほおじゃあ」に読み込みます。
開始アドレスから逆アセンブラします。
これでアセンブラソースが表示されました。
■HOJAでソースの解析★
アセンブラの書式はプログラムの後にワークエリアが一般的なものです。
ここで話すワークエリアはMSXシステムワークエリアの話ではなくて
ユーザーが作ったワークエリアのことです。
ワークエリアは文字表示データなどプログラムに使用するデータです。
またソースの種類によっては絶対ジャンプで飛ばしている場合があります。
これは初期設定の処理をプログラム、データとモジュールにしている
プロセスごとにソースが分かれている場合を指します。
この場合、プログラムがどこのアドレスにあるか調べる必要があります。
ジャンプしたアドレスから逆アセンブラしないとプログラムかデータか判別がつきません。
アセンブラソースを出力したASMファイルのソースをチェックして書き換えたら、
M80、L80のアセンブラを実行します。
■バイナリファイルとアスキーファイルの違い★
MSXBASICから読み込む場合はバイナリファイルをアスキーファイルに読み込みます。
通常の方法では
0030cd2233441aで止まり後が読めません。
これを
0030cd2233441acdd3e83230c9
まで読み込めるようにします。解説すると
これも裏テクでEOF(1AH)をカットする方法です。
通常MSXのアスキーファイルは終了コードでファイルを閉じますが、
バイナリファイルは終了コードはありませんし、テキストファイルは終了コードがないです。
そこで終了コードを検出した場合、一発エラー回避でレコードを変えて読み込みを行います。
逆にヘッダ部を作りたい場合です。
ファイルの頭にタイトル名を入れたりして以後のデータを表示しないようにする
やり方もあります。
これは何かの時に参考にしてください。
■COMファイルをRAMに読み込むプログラムなら
SHEMまたはSUPER-Xでロードコマンドを使います。
開始番地0100HからA000H以降に変更します。
■1バイトごとに読み出す方法
アスキーファイルは256文字を越えるとDirect statement in fileというエラーに遭ってしまいます。
ですから、1バイトごとにA$=INPUT(1,#1)で、1つ1つ読み込みオペコードを表示していきます。
どうもEOFに引っかかり簡単にはいかないようです。
ひきつづきFile-R.BASを作っていきます。
■MSX-DOSはかなり奥が深い
MSX-DOSは かなり奥が深い ので簡単な設定を載せてみます。
うまい上達方法はMSX-DOSのシステムコールなどをうまく使った
MSX-DOSの補助的なプログラムを作り、それから本格的にやりましょう。
まずはMSX-DOSをマシン語から見てみることから始めましょう。
終わりにマシン語とはどんなマシン、ハードウェアにも存在しています。
他機種でCPU命令がわからなくても、こういう動作になるとか今まで知らなかった事が見えてきます。
今までパソコンがわからなかったが、プログラミングをすると何となくPCの不具合の見当がつきそうな事もあります。
BASICでマシン語はいかがだったでしょうか?
簡単すぎる説明で不足なところが多かったのですが、
こんな感じでテクニカルハンドブックなどでラーニングしてみてください。
マクロ入りソースは他のアセンブラには使えません。
とりあえず、心当たりの人を探して見ました。
http://www.interq.or.jp/white/white/fswold/data.html
http://sakuramail.net/fswold/data.html
Z80アセンブラ講座を青河さんがやってました。MSX-DOS TOOLSからやりたい人向けです。
■ブログなど
M80のソースを見ることができます。MSXのマシン語開発の雰囲気が味わえます。
KIKI氏のMSXの周辺機器関連の記事。2007 年8月の記事がちょうどいいです。
Dr.KIKKIE (KIKI) MSX DeuxLaque
MARIO-NET,NATSUME-NETのMSX記事。
MSX パソコン通信ログ
■その他のZ80アセンブラ講座
Z80アセンブラ 講座入門編 SYSTEMAXさんのZ80アセンブラ講座
新日本プログラミ ング情報 Z80教室。リスト表など
■最後に
マシン語をマスターしたい方のためにページを作り始めました。
講座ではMSX-DOSからVRAMの使い方を解説します。
マシン語BASIC中級編からの続編でSCREEN5を使って
ビットマップに点を打つことからスプライトまで
ベテラン向けのかなり多くのテクニックを載せています。
「AレジスタだったりBレジスタだったりCレジスタだったりと」
「圧倒されてしまうんじゃ?」
そういう事はあまり、ありません。Aレジスタを使って
同じような反復する命令で書いていますので
テクニックと言ってもSHEMを使ったりBASICを使ったりと
プログラミングは少ないです。技術は道具と腕です!
プログラムは2の次でツールを使いこなすことが先です。
どこのマシン語ページよりも覚えやすいと思います。
ただ徐々にレベルが上がってくる感じがするでしょうね。
きっとマシン語の道も拓けると思います。
第18回まで解説しています。
2010/06/13現在
やってみましょう!MSXBASIC
http://www.geocities.jp/fullmsx2/u-yan/mon.html
http://www.geocities.jp/fullmsx2/u-yan/msxi-hi1.html
http://www.geocities.jp/fullmsx2/u-yan/mb-quick.html
ドナドナを聴きながら
http://www.geocities.jp/galfned/mou/mou.htm
http://www.geocities.p/galfned/xanadu/xanadu.htm