MSX PENでアセンブラを書いていくときに、
画面設定などをすると思いますが、
その例を書きます。
アセンブラソースコード
;ワークエリア
RG0SAV:EQU 0xF3DF ;VDPレジスタR#0の値の入っているアドレス
FORCLR:EQU 0xF3E9 ;前景色の入っているアドレス
BAKCLR:EQU 0xF3EA ;背景色のアドレス
BDRCLR:EQU 0xF3EB ;周辺色のアドレス
LINL32:EQU 0xF3AF ;WIDTH文で設定するスクリーン1の1行の幅(アドレス)
CLIKSW:EQU 0xF3DB ;キークリックスイッチ(0:OFF 0以外:ON)アドレス
;BIOS
SETGRP:EQU 0x007E ;VDPのみをSCREEN2モードに初期化する
CHGMOD:EQU 0x005F ;スクリーンモードを変更する
ERAFNK:EQU 0x00CC ;ファンクションキーを非表示にする
ORG 0xD000 ;アドレスのD000H(16進数のD000)にプログラムを書き込む
MSXSET:
;COLOR 15,1,1
LD A,0FH
LD (FORCLR),A ;白色
LD A,01H
LD (BAKCLR),A ;黒色
LD (BDRCLR),A ;黒色
;SCREEN1,2
LD A,(RG0SAV+1)
OR 2
LD (RG0SAV+1),A ;スプライトモードを16X16に
LD A,1 ;SCREEN1
CALL CHGMOD ;スクリーンモード変更
CALL SETGRP ;多色刷りに使用
;WIDTH32
LD A,32
LD (LINL32),A
;ファンクションキー非表示
CALL ERAFNK
;カチカチ音を消す
LD A,0
LD (CLIKSW),A
(;はコメントです)
EQUはこの文字列は、このアドレス(数字?)を意味しますという宣言です。
解説
これだけをMSXPENのASM Codeに書き込みます。
そしてBASIC Codeに、
10 CLEAR 100,&HD000
20 DEFUSR=&HD000
30 BLOAD"program.bin"
40 A=USR(0)
50 END
と打ち込み、右下のRUNボタンをクリックすればOKです。
画面の設定、その他が出来たのではないでしょうか?
ちょっとむずかしいのが、
;SCREEN1,2
LD A,(RG0SAV+1)
OR 2
LD (RG0SAV+1),A ;スプライトモードを16X16に
(RG0SAVに設定したアドレスはVDPレジスタR#0で、
それにプラス1でR#1となります^^)
この部分ですね。
VDPのレジスタをいじるのですが、
スプライトモードはVDPのレジスタのR#1を変えることになります。
ここからはビット操作になるのですが、
レジスタのR#1は8ビットです。(0または1が、8個あるということ)
右から2番目のビットがスプライトのサイズ8x8か、16x16かを決めるところです。
ここで
右から2番めなら、2を(00000010)を入れてやれば?
LD A,02Hって。
しかし!
R#1のそれぞれのビットにいろいろと設定が入っているので、
そういう訳にはいかないんです^^;
そこで、
論理演算のORです。
ORは1と1は、1
1と0は、1
0と1は、1
0と0のみ0になるというものでした。
ということは、あらかじめ1が入っているビットをそのままもってきて、
特定のビットのみ1を追加できます。
11001001
00000010
のORをとると、
11001011
となるみたいに。
だからOR 2なのです。
まとめ
上記のアセンブラは、
BASICで書くとこうなります。
10 COLOR 15,1,1:SCREEN1,2,0:WIDTH32:KEYOFF
20 DEFUSR=&H7E:A=USR(0)
多色刷りをやらないのであれば、
SETGRP:EQU 0x007E ;VDPのみをSCREEN2モードに初期化する
CALL SETGRP ;多色刷りに使用
この2つをカットしてください。
近況報告:
BEEPさんのプログラムコンテストに送るべく、
マシン語でコツコツとプログラムを書いています^^
はじめてのマシン語プログラムをコンテストに送るなんて、
ちょっと無謀だったかなぁ(*´∀`*)
でもそうじゃないとやらないので、ね^^
今現在は、マシン語で縦の画面スクロールが出来るようになりました。
ハイドライドのような画面切り替えにする予定なので、
あとちょっとですねぇ〜。
マップの圧縮もしないといけないし...
やることがいっぱい!
でもがんばります(*^^*)
掘り出し物があるかも(*´艸`*)