Gigamix Online

懐かしの8bitおもちゃPC「MSX」を骨までしゃぶり尽くそう。MSXの最新ニュース、ブログ、自作ソフトの配布など。

間違いナイ!ボタン for MSX2

間違いない!僕の見た秩序。 のヨシナガさんが リアルへぇボタン に続き 長井秀和 間違いナイ!ボタン を発表していたので、今回もMSX版を作ってみました。今回は頑張って喋らせてみました。それも、 ひどいガラガラ声 で。

MSX2以降の実機、及びMSXPLAYerで動きます。ダウンロードは こちら

※事務所に怒られたらきっとすぐ消します。

VDPマクロを活用しましょう

うちのサークルで使っているMSXの開発環境 DMシステム2 の紹介がてら、ディスクイメージ版では開発素材も入れておきました。

そこで、タイマー割り込みでVDPコマンドを発行する「VDPマクロ」というDMシステム2の機能を紹介します。MSXのVDPコマンドは本来タイマー割り込み中に発行してはならないとされていますが、それはHMMMやLMMMなど、I/Oにドカドカと数値を出力してVDPのレジスタをオートインクリメントするコマンドの発行中にタイマー割り込みでまったく新しいコマンドを発行したらVDPが暴走→CPUも暴走してしまうからで、要はオートインクリメントしない処理の軽いVDPコマンドに関してはタイマー割り込み内でも発行できる(と僕は解釈しています)、わけです。

今回作ったVDPマクロは凄く単純です。内訳はこちら。

  • 212ラインモードから192ラインモードに切り替える
  • SCREEN 3に切り替える
  • SCREEN 3のパターンジェネレータテーブルを1ブロックずつ増やす→コマを切り替えるようにアニメーションする
  • すべてのコマを表示し終えたら、212ラインモードに戻す
  • SCREEN 5に切り替える
  • 終了

そのソースリストはこちら。(コンパイラMマガ1号 に同梱された、ASM.COM)

chgplt equ 0 ;0+n(0~63)

vdp equ 40h ;40h+n(0~46), xx

loop equ 70h ;70h+n(0~14)

looped equ 7Fh

lgwait equ 0C0h ;long wait (256 counts)

wait equ 0C1h ;0C0h+n(0~59)

newmcr equ 0FDh ;0FDh,xx,xx

mcrend equ 0FFh

org 0c000h

;blackout palette

plt0: defs 32

;screen 5 palette

plt1: defb 000h,000h,011h,001h,012h,001h,022h,001h

defb 032h,002h,043h,003h,053h,003h,064h,003h

defb 044h,004h,054h,004h,055h,005h,064h,004h

defb 064h,005h,074h,005h,075h,006h,076h,007h

;screen 3 palette

plt2: defb 000h,000h,011h,001h,021h,001h,022h,001h

defb 022h,002h,032h,002h,043h,003h,053h,003h

defb 054h,004h,064h,004h,065h,005h,074h,005h

defb 075h,005h,075h,006h,076h,006h,077h,007h

;blank palette

plt3: defs 32

;macro start

defb chgplt+128 ;chgplt(128+0)

;screen 3

defb vdp+9, 0 ;192 lines

defb vdp+0, 0

defb vdp+1, 68h ;screen 3

defb vdp+2, 58 ;pattern name table (E800h)

defb vdp+4, 16 ;pattern generator table (8000h)

defb chgplt+128+2 ;chgplt(128+2)

;animation

defb vdp+4, 16 ;frame 1

defb wait+3 ;wait 3/60sec.

defb vdp+4, 17 ;frame 2

defb wait+3

defb vdp+4, 18 ;frame 3

defb wait+3

defb vdp+4, 19 ;frame 4

defb wait+2

defb vdp+4, 20 ;frame 5

defb wait+2

defb vdp+4, 21 ;frame 6

defb wait+2

defb vdp+4, 22 ;frame 7

defb wait+2

defb vdp+4, 23 ;frame 8

defb wait+2

defb vdp+4, 24 ;frame 9

defb wait+2

defb vdp+4, 25 ;frame 10

defb wait+2

defb vdp+4, 26 ;frame 11

defb wait+2

defb vdp+4, 27 ;frame 12

defb wait+2

defb vdp+4, 28 ;frame 13

defb wait+10 ;wait 10/60sec.

;screen 5

defb vdp+9 ,80h ;212 lines

defb vdp+0, 06h

defb vdp+1, 60h ;screen 5

defb vdp+2, 1fh ;pattern name table (0000h)

defb chgplt+128+1 ;chgplt(128+1)

;macro end

defb mcrend

end

MSX BASIC上でまず画像データをVRAMに配置。このとき、スクリーンモードは SCREEN 5 にしておきます。SCREEN 3のアニメーション用データはページ1、PCMデータはページ2に配置。

このバイナリデータを0c000hに配置します。最初の128バイトはパレットデータで、実際のマクロはその後(0c080h)になります。そして

CALL VMON(&HC080)

という命令を実行すると、勝手にアニメーションしてくれます。勝手にアニメーションする間、予めVRAM上(SCREEN 5のページ2)に配置しておいたPCMデータを

CALL PCMON(@65536!,@65535!+10933,0)

という命令で再生します。これで、SCREEN 3のアニメーションしている裏で「間違いナイ!」と喋らせることが可能になります。

MSX版を作るのに頭を使うのはPCMやCGなどの素材をいかにMSX用に作り込むかということで、はっきり言ってプログラミングにはぜんぜん頭を使ってません。(^^;