goo blog サービス終了のお知らせ 

[FM]FULLMSX for BLOG

詳しいMSXパソコンなどの情報はホームページで!
https://fullmsx.web.fc2.com/

MSXマシン語適当講座 BIT命令 チートなビット操作 BASICで試してみる

2011-11-23 20:08:13 | MSXマシン語適当講座

 またまた問題になってきました。
今回は本格的にビット操作命令を解説します。
ビットは0,1をリセット、セットする命令、
 何ビット目を読むかという命令です。
実はパソコンはビット演算から生まれて計算ができました。
 でも、チートなビット演算はどのように使うのかがわかりません。
今回はビットを見てみましょう。
□□□■■■■■
これは1Fhです。
4ビットを境にして上位下位ビットという所に注目します。
上位は□□□■で1hです。下位は■■■■です。Fhです。
これに7ビットをセットします。

SET 7,A

そうすると■□□■で1hが9hになりましたね。
では確認してみましょう。

BIT  7,A

これを実行するとZフラグが変化します。

RES  7,A

これで元に戻ります。
さて、今回はこの命令を活用してみます。

CレジスタFh、Bレジスタの3Ehを
FEHに変える場合はAレジスタは0、
3Fhに変える場合はAレジスタは1になります。
前回からつなげるとプログラムは3番目になります。
ビット演算とは一言で言えば…
「そんなのズルいぞ!ちゃんと計算しろ!」と、
言いたくなりそうな感じがします。
2番目はBASICにしたものを書いてからマシン語にします。

;A:  0-HI 1-LOW
             LD    A,0
             LD    B,3Eh
             LD    C,Fh
             CP    1
             JP     Z,BIT1              
             LD    A,C

BIT0     :CALL BIT00
             CALL BIT01
             CALL BIT02
             CALL BIT03 
             RET
BIT1     :LD    A,C
             CALL BIT10
             CALL BIT11
             CALL BIT12
             CALL BIT13
             RET

;4BIT_MOVE_HI
BIT00:   BIT    0,A
             JR      Z,ZERO00
             SET   4,B
             RET
ZERO00:RES   4,B
             RET
BIT01:   BIT    1,A
             JR      Z,ZERO01
             SET   5,B
             RET
ZERO01:RES   5,B
             RET
BIT02:   BIT    2,A
             JR      Z,ZERO02
             SET   6,B
             RET
ZERO02:RES   6,B
             RET
BIT03:   BIT    3,A
             JR      Z,ZERO03
             SET   7,B
             RET
ZERO03:RES   7,B
             RET
;4BIT_MOVE_LOW
BIT10:    BIT 0,A
              JR Z,ZERO10
              SET 0,B
              RET
ZERO10: RES 0,B
              RET
BIT11:    BIT 1,A
              JR Z,ZERO11
              SET 1,B
              RET
ZERO11: RES 1,B
              RET
BIT12:    BIT 2,A
              JR Z,ZERO12
              SET 2,B
              RET
ZERO12: RES 2,B
              RET
BIT013:  BIT 3,A
              JR Z,ZERO13
              SET 3,B
              RET
 ZERO13:RES 3,B
              RET

 かなり適当ですがフラグを調べるとzフラグが変化するだけなので、
サブルーチンでやってみました。
最初にAレジスタに0か1かを入れて分岐させるようにしました。
プログラムをする時はzフラグにしますがプログラムの途中ですから

Aレジスタに代入することにしています。
 4ビットを1ビットごとに調べてコピーしています。
さて、プログラム2に戻ります。
まぁ、プログラムは今までと同じ命令の繰り返しです。

100 X=1:Y=100
110 A=x:B=0:H=0
120 REM
130 'MOD1
140 IF A=1 GOTO 240
150 'z \ & div/0
160 IF A=0 GOTO 240
170 A=A-2
180 B=B+1
190 'C MOD
200 IF A<2 GOTO 230
210 '
220 GOTO 160
230 PRINT B,A

という感じです。
140行は座標が1で割れない場合の分岐です。
160行は数が割り切れて0、または数値が0の分岐です。
200行は割り切れない場合の分岐です。
と、このようなプログラムをマシン語化して次回はやります、
MSXBASICはマシン語作成の補助として使うことができますね。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MSXマシン語適当講座 「ながっ!」SCREEN7,5のビットマップの読み書き ゼロ除算 その1 えーっ!

2011-11-22 18:16:21 | MSXマシン語適当講座

 前々々回の講座「8ビットから4ビットに分ける」の続きです。VRAMのデータを読み出して、
たとえば0Fhでしたら、色コード0hとFhを得るためのプログラムをつくりました。

ちょっとスプライトの話をします。ビットマップのほかVRAMにはスプライトにもエリアがあります。
SPRITE$(1)と指定してデータを入れますが、
SCREEN5のVRAMに直接書き込むなら、
&H7800からスプライトパターンジェネレータというエリアに書き込みます。
第2パラメータをSCREEN5,2と設定しないと16ドットデータになりませんので注意が必要です。
16ドットの場合は左半分と右半分で32バイト(8ドットが4つの&H20)のデータになります。

 さて、今回はいよいよ、ビットマップの読み書きをBIOSを通してやってみたいと思います。
まず、「BASICではどのようなプログラムになるのか?」を書きたいと思います。

10 SCREEN 5
20 PSET(100,100),&HF
30 I$=Input$(1)

というプログラムを

10 SCREEN 5
20 PSET(100,100),&HF
30 C=POINT(100,100)
40 SCREEN 0
50 PRINT C
60 I$=INPUT$(1)

のようなプログラミングを
ちょっと長くなりますがマシン語で設定をしてみます。

MSX2テクニカルハンドブックか
MSXマガジン永久保存版3号のp188に載っています。
このBIOSではVDPを変えることができるコマンドがあります。
以前にDEFUSR=&H7E:A=USR(0)で多色刷りモードにする
コマンドはVRAMがSCREEN1でVDPがSCREEN2になりますね。

最初に手書きかテキストで入力しながらプログラムを組みます。
このBIOSのエントリを使います。
CHGMOD:005Fh
NRDVRM:0174h
NWRVRM:0177h
0D000hにこのプログラムがあるので、
さらにデータエリアを0D100hに設定します。
これは私が設定したので、0D200hでも0D400hでも
アドレスはどこでも設定できます。
(HL)はPOKE命令として見てください。

0D100 X座標(100=64h)
0D101 Y座標(100=64h)
0D102 色コード(15=0Fh)

LD      A,05h
CALL  005Fh

LD      A,64h
LD     HL,0D100h
LD      (HL),A
LD      A,64h
LD      HL,0D101h
LD      (HL),A
LD      A,0Fh
LD      HL.0D102h
LD      (HL),A

ここまでで、画面をSCREEN5に切り替えて
0D100hと0D101hに100、0D102hに15を入れました。
さて、ここからが山場です。
SCREEN5は256×212ですが、VRAMマップは
128バイトが各212バイトの構成です。なお、SCREEN7は512バイトですね。
X座標の100は50バイト目に書き込むことになります。
この50を出すことにします。カウントはBレジスタにします。
 これを2で割ります。カウント(INC B)しながら-2、(DEC 2)して
CP 2としてNC(ノンキャリア)であれば繰り返し(ループ)で計算します。
そうすると、Bが50と出ます。CP 2でZフラグ(余り1)が成立する場合は
101とかになるわけですね。
さらに、Y座標でY座標の計算を入れます。
こんな具合にVRAMの書き込みアドレスを確定していきます。

もう1つの山は座標が0(ゼロ)というのがあります。
これがPCでは厄介なもので0÷0=×と計算できないゼロ割りになってしまいます。
要するに計算をしないで答えになる例外を考えます。

たとえば1~20の通常は合計を出すとして、4の項目にデータがなく割り算が数式にある時などに
DIV/0と表示されて、Excelなどで集計ができないエラーがありますね。

 これもプログラムします。やっぱり長いので^^;
次回は計算をしてアドレスを出すことにします。では。

と、いいながら大きな問題がありました。
SCREEN5は1バイトを2ドットにしているので、たとえば100と101の2つの座標のある
アドレスの部分書き換えになります。
34hとういうデータに1ドットにfhを加えるとf4hか3fhになります。
問題はこの4hと3hを読みこまないとf0hとか0fhになって正しく表示できませんね。
MSXBASICではINSTRだったりMID$だったりするイメージが浮かんだりして
 見えない岩山が出てきたようです。はたして、SCREEN5の読み書きはいつできるのか?(おい)
短くできるか難題のような感じです。「MSXBASICはすごくラクなんだ」と実感します。

と、いうわけでやっぱりラクをするには「BITかな?」は避けて通れませんね。
 8ビットレジスタと16ビットレジスタの連携したプログラムも考えてみます。
 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MSXマシン語適当講座 Hello,World! マシン語モニタで入力

2011-11-15 00:23:26 | MSXマシン語適当講座

 今回はマシン語中級向けの話になります。ちょっと説明が難しいかもしれません。
でもわかれば、もっと広くPCを使えるようになります。
MSXBASICでは配列変数ができるといろいろな事ができます。

今回はSUPER-Xを使っていきます。
SUPER-Xは裏RAMにプログラムがありますから、
普通にBASICを使う場合はラクに使うことができます。
前回のデータエリアの話に続いてマシン語のデータ構造の説明をちょっとだけします。
これから、データエリアのことも話すのでここまでしておきます。
マシン語には配列変数はありませんので作ります。(え?)
「Hello,World!」はマシン語モニタで指定したアドレスから文字を入れます。
 ですから、Hello,World!は12文字ですから文字を入れたアドレスから+0Chまでが
データの範囲(領域)になります。
改行コードの「¥n(13)」まで表示させます。これで文字の長さを変えることができます。
いろいろな文字をメモリに入れて最後にコード13を入れるとRET Zで終わりにします。

ORG 0D000h
(アセンブラの擬似命令)

LD HL,0D200h
 (D200hがデータが格納されているポインタになる)
LD A,(HL)
 (0D003Hになる。)
CP 13
 (0DH=CR)
RET Z
 (CPが13になるとZ=1で、RETになる。) 
CALL 00A2h
 (BIOSコールCHPUT、キャラクタプット)
INC HL
 (文字データのアドレスを+1加算)
JR F6H
 (SUPER-XではJR 0D003H)

HLレジスタを使ってみましたが、HLが入ればメモリ操作という感じで
わかりやすくなった気がします。次にマシン語モニタで文字を入れていきます。
なお、今回からはJPではなくJRを使います。好きなアドレスにロードしてみてください。
JR F6Hと調べる必要がありましたが、SUPER-Xを使えばJR F6Hではなく、
JR 0D003Hと実アドレスで表示してくれます。

しかも、ワンラインアセンブラでJR命令を使うとF6Hとコード化します。
ということはアセンブラでJPを使っていたところを
JRに書き換えれば1バイト節約できますね。(おい)
「Sherryさんたちが、SHEM開発のときにJR命令がボソボソ言っていたのは」
「これだったのかな。こういう機能を入れようかとか言ったような気がする。」

D200hからA D200で「Hello,World!」と入れ、ダンプでD20Chに0D(13)を入れます。
BASICの場合はPRINT HEX$(PEEK(&HAD200))になります。アドレスの数値を16進数へ変換しています。

「なぜDEFを使わないか」と言うと、仮にアセンブラで使って逆アセンブラをかけるとプログラムが化けます。
これはDB命令などは擬似命令といいメモリに文字、数値を書き込むためです。
この書き込んだ文字がソースの途中からアセンブラニーモニックに化けて読みづらくなります。
逆アセンブラには擬似命令はありません。

プログラムが完成しましたら、
動作しなくなること(暴走)がありますからBSAVEします。
GコマンドでG D000または

BASICで
DEFUSR=&HD000:A=USR(0)
で実行します。
Hello,World!
Ok
となります。では、マシン語モニタのダンプに戻り0Dを0Eに書き換えます。
書き換えるアドレスがわかればBASICではPOKE &H<アドレス>,0Eになります。


A=USR(0)
を実行しますと、意味不明な文字が表示されました。
このように、0Dを忘れると次の0Dまで表示してしまいますね。

実はこれがPCのバグの正体でもあります。
「ゲームのバグはおそらく終了コードがなく次のコードに行ってしまったために
たまたまの大バグだったのでしょう。」
「また、宇宙船の操作パネルをずれて調べるとバグるのは宇宙船の操作パネルの位置を
メーカー側が修正したのに以前の定義した座標の判定が残ってしまったものだろうと思います。」
こんなふうにフェイルセーフしていないとPCが動かなくなってしまうのがマシン語の怖いところです。
MSXBASICでマシン語を実行するとマシン語を間違えればリセットがかかりますが、
無限ループになったり、不可解な文字などが発生してリセットすることにもなります。

Windowsはエラーが発生すると直ぐにスレッドを停止してアプリを閉じたり応答がありませんと出ます。
先読みをしてエラーがないかをチェックします。

バグがあっても途中から復帰するゲームはなかなかのプログラマと思いますね。
しかしバグったデータが残ったりして不具合になるリスクもあるので、
まぁリセットにもっていくのが賢明でしょう。

今回はデータエリア(プログラムのワークエリア)に文字を入れて遊んでみました。
条件つきRETも初めて使いましたが、安心してBASICに戻ることができました!

最後に1chipMSXをモニタしているとMSDOS5という文字列が見つかりました。
何でしょうか、調べてみるとおもしろいかもしれません。

プログラムが完成しましたら、
動作しなくなること(暴走)がありますからBSAVEします。

「どうもこの講座はうますぎる」と思う方もいますが、
まだ、これでも序の口(え?)ですから、
まぁ一人でも多くの方にZ80のアセンブラをなんとなく知ってもらうためです。
MSXシステムとなるとソースを見ても何をやっているのかサッパリというのが本音です。
でもマシン語の基本が少しわかれば、カンタンにマシン語にできるか、できないかという
プログラムの特性がわかると思います。
いろいろと改良したり手を加えるならBASICでいい部分も多くあります。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MSX2でアニメを アセンブラの快適な入力法 演算命令で試す LEFT$を使う お知らせ3

2011-03-12 00:01:24 | MSXマシン語適当講座

このようにアセンブラは256種類のオペコードがあって、
1つ1つ選びながらでは大変な時間がかかります。

そこで、アセンブラができる方ならばESCキーから
コンソールで検索をすることができます。
実は数日前に準備していたもので、
ちょっと説明します。


画像が100%では全く編集できないので拡大しました!

実行をすると2つのキャラクタを選択します。

テスト版ではLD A,と検索をしても0ヒットでした。
問題になったのはLDとAの間の空白でした。
ここを改良して、自動で水平タブで区切るようにしました。
例えば6桁目の場合、LDの場合はスペースを4つで6桁になります。
SUBの場合は7桁になります。そこで、

I$=LEFT$(I$,6)で6桁以下を切ってしまうことができます。

これでLD A,とかSUB Aとかスペースが入りオートフォーマットされます。

さらにSの変数に検索フラグを加えて、
検索の動作と通常の入力動作を切り替えるようにしました。

2バイトコードの検索とキーワードの検索方法を変えました。
キーワードの場合は3バイトコード以上を入力します。

さらにLD A,でもLD A,nとかLD A,Bとか多くのコマンドがあります。
このような場合は検索が終わってから、再検索を行うことができます。
検索中は時間がかかりますので、水色のプログレスバーを作りました。

こんなことも★

 東北地方から離れていますが、本が床に大量に落ちていたりと
まだ、仕事が終わっても片付けをしています。その後ですが、

 予想通り、東北の荷物はキャンセルになりました。電話応対に大変です!
音信不通で店の状態がわからないので保留している状態です。
一日一回、電話していたりといろいろと大変です。福島も困ってしまいます^^;
ご存知のように流通は日本海側から青森経由の盛岡になっていますが、
これは救援物資のルートで現在、一般の荷物は足止めされています。

東北に配送できるか、できないかは流通が混乱しているので何とも言えません。
仕事は残業が続いている状態でブログの更新は当分中止したいと思います。

 ケータイの緊急地震速報はちょっとビックリしますが、
備えることができるのでよいですね。
 ブログでは節電対策のためPCの使用を控えます。

昼はセブンイレブンも店内照明はかなり暗く、
さらに自動ドアは開いたままで空調は使っていない感じです。
病院も外来受診時間外のような明るさです。
夜はコンビニエンスストア、スーパーも閉店間際のような明るさで
何の店だかわからない程です。

関東では計画停電が始まりました。

地デジはPCを起動させている状態で録画するので、
とりあえず、数千円の地デジチューナとDVDレコーダで
DVD-RWで録画することにしてします。
BlueMSXは使わないで1chipMSX、MSX2などを使います。

PCは電熱器程度のワット数になっているものを
MSXを使用することによって発熱量を10分の1以下に落とします。
私は1chipMSX改ですから、MSX2+相当でテキストを書くことができます。
オンライン書き込みは今回くらいで止めたいと思います。

津波のかなりの残酷さを知りました。
町がなくなった地域もあり、部分的な被害が出た地域もあります。
死亡者も計り知れないものになっています。

東北地方から離れているからと油断してはいけません。
実は3月11日の最初の小さな地震が三陸沖の地震で
その数秒後の地震が茨城県沖のようです!
2つの地震が同時に起こった例のない地震でした。
M9.0 東北関東大震災と地震の規模と名称が変更されました!

地震の片付け、掃除などをやっていて
さいたま市にある会社ですが、鉄骨で鉄骨に損傷はなかったのですが、
地震の時に鉄骨と鉄骨の間柱のいわゆる軽天(けいてん)が曲がって
石膏ボードが落下しました。鉄骨の揺れで曲がったんでしょうね。
仙台に行った事があります。映像で仙台を見ると信じられない感じです。

夕方になって
ダウンロードの準備を始めて何とかダウンロードできるようになりました。
開発中のモニタアセンブラはBIOSのコールなどの動作チェックを確認しました。
ダウンロードしたファイルはMSXファイルになっています。

入力を終えたら、ESCキー、ESCキーで操作コマンドに入ります。
BSAVEと入力するとTEST.BINで保存されます。
実行はBLOAD"TEST.BIN",Rです。

ダウンロード先:FULLMSXサイト

---

週刊アスキーが届かない物流状況になっています。

私も読者だったりしますが、

>物流システムが回復していないため、
>週刊アスキーが届いていない地域が多数あるという報告を受けました。
>被災地域での通信インフラが十分に回復したと
>判断できた時点で全記事ページをPDF化し、
>公式サイト『週アスPLUS』にて無償公開することにしました。

これは東日本の物流システムが十分に回復するまでの間の措置のようです。

3/23現在の雑誌の物流の状況は発売日よりも
3日ほど遅れて入荷する雑誌があるようです。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MSX2でアニメを Z80の逆アセンブラ表示をつくる 入力のしかた

2011-03-10 19:23:38 | MSXマシン語適当講座

前回からヘルプを入れたチュートリアル風のアセンブラシステム制作に挑戦しています。
MSXにはSCREEN8では00~FFまで色をVRAMで表示させることができます。
よくMSX2でVRAM128KBという表示を見たことがありますね。
でも「RAMが64KBって何で少ないんだろう?」と思ったことがあります。
64KBは0000h~FFFFhまでのエリアなんです。8ビット機で計算の限界というわけです。
VRAMは64KB以下を切り替えて動作させています。
これがページでSCREEN5以降ではVRAM128KBをフル活用できます。
そこで、64KBを画像、64KBをデータとして使っていけることになります。(たぶん)

とりあえず、FULLMSXサイトにあるZ80の変換表のテキストから
MSXでヘルプメッセージを入力して作って、
アセンブラアシスタントの男の子と女の子を選択できる画面を作って
今はこの画面の制作になります。

VRAMの9000hから入力方式は16進数をデフォルトにしてみましょう。
9000hから9008hくらいの限られた範囲になっていますが、
次のページへとりあえず、進むようになっています。
アドレスの表示とニーモニックとマシン語の作成ができました。

入力が終わった行は暗くしてみました。構文はデタラメですが、
Z80のマシン語コード雰囲気はこんな感じになります。

例えばLD BC,nnの場合は正しくは
レジスタペアにすうちをいれます。というふうに表示します。
ここでEnterキーを押すとこのnnを入力するコンソールが出ます。

ここでhという16進数の指定の表示が出ます。
BCレジスタに数値をいれる命令のオブジェクトが決まったので
数値を入れるオペランドの設定に入ります。

将来的にはアスキーキャラクタのcとか
バイナリのbとか選択できるようにしたいです。

アセンブラではD000hを0D000hというきまりがありますが、
ここではD000と入力するとオートフォーマットされます。

このようにD000がZ80のマシン語コード化すると
00D0とリトルエンディアンになっているところもわかってくる。

こんなことも★

デモ版からテスト版に変えていきました。
ヘルプもこのようにチュートリアルのような感じが出てきました。

使った感じはオペコードがわかっていれば
思った命令が出てくるところがあります。
LDで検索するとLDが山のようにヒットしますので、
時間がかかります。
とは言ってもこのプログラムができれば

ハンドアセンブルよりも、かなりラクです!

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MSX2でアニメを オペコードにコメントを 検索して選択 JPの例 JR命令とか

2011-03-08 21:23:30 | MSXマシン語適当講座

ごらんのようにオペコードにメッセージコメントを書くことができます。

例えばJPを入力すると 条件付きのジャンプもヒットします。

0:シュウリョウで検索を終了します。

無条件ジャンプはC3ですね。

JP 0D450h

と記述する場合は

JP nn

という表記になっています。

このように書きます。

こんなことも★

一時期よりも仕事は早上がりになってきましたが、
まだまだ忙しいです。

やってみたい事と言えば相対アドレスのジャンプ機能を入れたいです。
今まで絶対アドレスでやっていましたが、JR命令でできるところが多いです。
JR命令はJR 01hの場合はこのアドレスから+1飛んだアドレスで
すなわち次の次のアドレスにジャンプします。
逆アセンブラではラベルが使えないのでジャンプ先を数値で表しています。

JR命令を作成中にアドレスを移動すると
数値が変わっていく感じが見えると、ちょっとおもしろいですね。

今はニーモニックとオペコードを左にずらして9000h
固定でアドレスを表示させました。
BASICで例えると9000行のプログラムみたいな雰囲気です。
選択画面も長押しでヘルプ表示をカットして高速化させてみました。
BlueMSXは速いので1chipMSX環境を前提に設計しています。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MSX2でアニメを 整合性チェック BEEP音でテスト 実行までの流れ

2011-03-07 18:44:09 | MSXマシン語適当講座

プログラミングはMSX-DOS環境がある1chipMSXで行ってみました!

オペコードとニーモニックが正常に入力されているかのチェックです。
入力された数値と合っていればテキストは正常ということです。
データの欠損、不正な値などが含まれている場合はエラーで停止します。

このようにテキストでチェックしても見落とす場合があります。
正確な重要なデータを必要とする場合に目視のほかにPCで検査します。
2エラーありましたが、チェックは終わりました。

早速、コードCDを書き換えました。ちょっと文字長をみてみました。
この程度の長さまで書けるので、わかりやすいですね。

とりあえず、C9を実行して試したのですが、あまりスッキリしないので、
BEEP音を出すプログラムで動作検証を再度やってみます。

こんなことも★

今度はショートのマシン語が機能するかを試します。
まだ、ラベルの準備をしていないので、絶対アドレス指定でBIOSを実行させます。
MSXマガジン永久保存版3号p194にBEEPがあります。アドレスが017Dhです。
プログラムを実行するとポッと音が鳴ります。

MSXBASICでは8000hにするとMSXBASICプログラムにカブってしまうので、
9000hにロードさせます。さらっと考えると

ORG 9000h
CALL 00C0h
RET

これがラベルになると

BEEP     EQU  00C0h
            ORG  9000h
            CALL BEEP
            RET

となります。さて、ハンドアセンブラで始めていきます。

10 SCREEN8
20 VPOKE &H9000,&HCD
30 VPOKE &H9001,&HC0
40 VPOKE &H9002,&H00
50 VPOKE &H9003,&HC9
90 BSAVE"BEEP.BIN",&H9000,&H9003,S

SオプションでVRAMに保存します。
実行するとBINファイルができます。これを

BLOAD"BEEP.BIN",R

MSXから音が出ます。

流れとして、開始アドレスを9000hに固定させます。
本体プログラムは拡張性と自動化を重視するためBASICで作ります。
この為にフリーエリアを多く使うためにマシン語領域が減ります。
そこで、VRAMを仮想のマシン語のメモリ領域として配置する方法を採用します。
9000hに設定したのはマシン語を実行後にBASICデバッグするためです。
この領域は0000h~D400hまで使うことが出来ます。
と、いう考えがあるのですが、
これ以上は~ボロが出ますのでこのへんにしておきます。
ある程度、動作チェックが済みしだい機能を拡張させていくことにします。
オンラインエディタは手抜きじゃないのか?Delキーで改行が増えたりしているなぁ。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MSXでアニメを アセンブラを作る アセンブラちゃん? テキスト不具合?

2011-03-06 06:42:23 | MSXマシン語適当講座

前回から気になっていた事をはじめました。
web講座ではMSXのアセンブラツール群を紹介してきました。
今回はMSXのマシン語のおおまかな命令とプログラミングの流れが
わかってきましたので、自作してみようと思います。
アセンブラアシスタント第2弾!女性をイメージしてみます。
今度はななめドットを使って横向きに描いてみました。

最初は短いオペコードを書いて
マシン語を実行させるという目標で今回もやってみます。

GWで使ったウィーザード形式を今回も使っていきます。
まず、何かキーを押せばオペコードが次々と表示されます。
順番はオペコード、擬似命令という順番ですが、
後ろから、ORG、DBと表示させるようにも考えています。

「どうやって使うの?どういう書き方?」
という悩みも一気に解消です/

もちろん、オペコードをCDと入れるとCALL というふうにもできます。
オートフォーマットでソースを作成して残します。

     ORG    0D000h
D000
     JR      FEh
D000 18           FE

この時にマシン語に変換させる仕組みにします。
自由なフォーマットで書いて、オペコードに自動で変換する
従来の方式に比べて私のツールはちょっと辛口かもしれませんが、
ダンプリストが段々とわかってきます。

アセンブラくんのメッセージは初心者の説明とは違い、
ちょっとかじった程度の中辛な説明にします。
と、言っても
「していされたアドレスはプログラムがありません。」
「プログラムがぼうそうするかもしれません。」
というメッセージで英語よりはわかりやすいと思います。
でも、慣れてくると「うるさいなぁ。」となりそうです;
私もBASICにどっぷり浸かるとマシン語を忘れがちで、
マシン語プログラミングに復帰する時にラクラク入れるように
アシストして欲しいという願いでもあります。

今日はオペコードの表示とヘルプを完成させる予定です。
うまくいけばBIOSをCALLして実行させてみたかったのですが、
やっぱりオペコード00~FFまで選択するのは、
かなり時間がかかってしまうので、まず、直接入力から
アセンブラアシスタントに自動検索させてみる機能を入れます。

例えばJPとかLD A,とかでも検索します。

FULLMSX:MSX2グラフィックプログラミング講座
http://wood-art.main.jp/www-hp/fullmsx/msxi-hi1.html

FULLMSX:マシン語
http://wood-art.main.jp/www-hp/fullmsx/mon.html

こんなことも★

ちょっとFULLMSXからインストラクション表をコピーして
1chipMSXを使ってMSX-DOS2のAKIDでMSXひらがなで
テキストを作成していました。
SDカードからDiskmgrのDSKファイルに取り込んで
BlueMSXで実行するとFile not foundになりました。
どうやら、この方式ではFATが狂っているようです。
そこで、PCに新しいフォルダを作って、ここにSDカードのファイルを入れて

BlueMSXのBドライブのディレクトリ挿入から

RAMDISK(4048)
COPY"B:"TO"H:"
COPY"H:"TO"A:"

で、BlueMSXでDSKファイルに書き込みました。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MSX2でアニメを カラーコードスキャン カラーダンプリストを作る アセンブラくん

2011-03-05 19:10:33 | MSXマシン語適当講座

画像から線の色を変えるプログラムは
MSXBASICではかなり遅いので、マシン語化を考えています。
ちょっとマンネリ化したMSXのマシン語をよくしたいというのも
あってマシン語のツールを作ってみようかなと思います。

マシン語モニタの製作の具体案が固まりそうです。
今回はアセンブラを入力して、メモリに配置するまでの限定した用途にします。
ディスアセンブル機能は今のところ考えていません。
アセンブラモードはSCREEN8、4行25桁のメッセージの横に
ゆるキャラを入れて命令のヘルプを入れてみたい。
当時は小学生からマシン語が組めたので、そういう感じに描いた。

ダンプモードはSCREEN7で
ダンプリストを色分けと点滅させてMS-DOSライクな画面を作りたいです。

SC7-mon.basの画面

左はアドレス、CDはCALL、C9はRET、00はデータなしと色分けしてみました。
いまのところはメモリからの16進ダンプのみですが、VRAMにページ1にプログラム、
ページ0にダンプ表示ができれば@8000という表記でVRAMのダンプにしたいです。
SCREEN7の特性を生かして256バイトのデータを表示させます。

MSXのBLOADはメモリのデータ、VRAMのデータともに
BSAVEのデータをVRAMで表示したり、メモリに書き込んだり
できることがわかりBSAVEの相性は今のところ問題ないようです。
SCREEN8で実験していることはVRAM上で
マシン語プログラムを配置したいメモリのアドレスに書き、
プログラムをVRAMとして保存して、
Sオプションを外すだけでRAMに配置させて実行させる仕組みを試んでいます。
こうすればマシン語実行中にBASICプログラムがない状態でできます。

ゆるキャラがあると少しやわらかいイメージが出ますね。
アシスタントセレクトがあり
asm-kun.cp8 と asm.cp8

 

sc8-asm.basの画面

こんな感じにアシストしてくれれば、かなり便利そうな感じがします!

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする