ニャオニャオ21世紀

レトロゲーム(MSX、PCエンジン、ファミコン、メガドライブセガサターン)と、MSXのゲーム開発と、最新ゲーム(PS4、SWITCH)、身体(身体意識など)、ライフハック、電子工作ほか雑記を綴っています

MSX マシン語・アセンブラ(MSX PEN)のSCREEN1などの画面設定方法




スポンサーリンク



スポンサーリンク


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はこの文字列は、このアドレス(数字?)を意味しますという宣言です。

f:id:nyaonyaokun:20190602100047p:plain

 

解説

これだけを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さんのプログラムコンテストに送るべく、

マシン語でコツコツとプログラムを書いています^^

 

はじめてのマシン語プログラムをコンテストに送るなんて、

ちょっと無謀だったかなぁ(*´∀`*) 

 

でもそうじゃないとやらないので、ね^^

 

今現在は、マシン語で縦の画面スクロールが出来るようになりました。

ハイドライドのような画面切り替えにする予定なので、

あとちょっとですねぇ〜。

 

マップの圧縮もしないといけないし...

やることがいっぱい!

でもがんばります(*^^*)

 

 

掘り出し物があるかも(*´艸`*)

MSX | 通販ショップの駿河屋

 


「ニャオニャオ21世紀は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」

当サイトは第三者配信の広告サービス「Google Adsense グーグルアドセンス」を利用しています。 広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookie(クッキー)を使用することがあります。 Cookie(クッキー)を無効にする設定およびGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご覧ください