Sunflat のブログ

ソフトウェア開発についての話題が多いかも

MSX-BASICのVPOKE命令で遊ぼう

※この記事はMSX Advent Calendar 2015の9日目の記事です。

www.adventar.org

こんにちは、sunflatです。 好きなMSX-BASICの命令はVPOKE命令です。

というわけで、今日はVPOKE命令で遊んでみましょう。

VPOKE命令とは

VPOKE命令は、VRAMにデータを直接書き込むための命令です。

MSXは画面表示のためにVDP(ビデオ・ディスプレイ・プロセッサ)というグラフィックチップを搭載しており、このVDPで使われるメモリがVRAMです。例えばMSX1規格の場合、16KBのVRAMが搭載されています。

VRAMにデータを書き込むことにより、フォント(文字の形状)のデータ、画面の表示内容、スプライト(画面上に表示されるキャラクター)の画像などを変更できます。

フォントのデータを変更してみる

今回は、フォントのデータを変更して遊んでみることにします。

早速プログラムを入力していきましょう。AUTO命令を使うと、行番号を10刻みで自動で振ってくれるので便利ですね。

f:id:sunflat:20151209081854p:plain

このプログラムは、フォントの画像データを、右に1ピクセルずらしたものと重ね合わせることにより、文字を太くします。(ついでに結果表示のため、全ての文字を画面に表示)

MSXのSCREEN 1(画面モード)では、文字の画像は8x8ピクセルです。横8ピクセルを1バイトで表現し、それが縦8ピクセル分続くため、フォントのデータは1文字あたり8バイトで表現できます。

VRAMの先頭(0番地)から、各文字8バイトづつ、256文字分のフォントのデータが格納されています。これを書き換えています。

プログラムの簡単な解説

20行では文字コード(変数I)に対するFORループ、30行では文字の画像の縦座標(変数J)に対するFORループを開始しています。

40行ではVRAMのアドレスを計算し、50行ではVPEEK関数を使って現在のフォントデータを1バイト読み込み、60行では現在のフォントデータ(横8ピクセル分)を右に1ビットシフト(2で整数除算)してORを取った結果を、VPOKE命令を使って再び元の場所に書き込んでいます。

90行では、結果を表示するために、画面に全ての文字を表示しています。VRAMの&H1800番地以降には、画面に表示する文字の文字コードが格納されています(&Hは16進数を表す。&H1880番地は画面5行目に相当)。

実行

早速、RUN命令で実行してみましょう。 f:id:sunflat:20151208201305p:plain

…。

…あれ、MSXってこんなに遅かったかな?

そういえば、MSX-BASICの変数は、デフォルトでは浮動小数点型なのでした。変数の型を整数型にして、少し高速化してみましょう。

行番号を15にすれば、10行と20行の間に挿入されます。

f:id:sunflat:20151208204003p:plain

再び実行!

f:id:sunflat:20151208211955p:plain

おおー、文字が太くなりました。成功です。

今度は、少しアレンジしてみて、文字の上側4ピクセルはそのままで、下側4ピクセルだけを太くしてみましょう。30行の J=0J=4に修正するだけです。

f:id:sunflat:20151208212542p:plain

再び実行!

f:id:sunflat:20151208212947p:plain

レトロな感じのフォントになりましたね。

次は、フォントの画像データを右にずらす量を、1ピクセルではなく2ピクセルにしてみます。

30行を元に戻し、60行のB ¥ 2B ¥ 4にするだけです。

f:id:sunflat:20151208213558p:plain

再び実行!

f:id:sunflat:20151208213805p:plain

飾り文字っぽい、おしゃれなフォントになりましたね。

最後に、縦1ピクセルごとに、太くする行と太くしない行を繰り返す感じでアレンジしてみます。

60行を元に戻し、30行の末尾にSTEP 2をつけるだけです。

f:id:sunflat:20151208213946p:plain

再び実行!

f:id:sunflat:20151208214031p:plain

文字がいい感じにかすれて、歴史を感じさせるフォントになりましたね。

まとめと発展

というわけで、VPOKE命令を使ってVRAMを書き換えることにより、フォントのデータを変更するテクニックを紹介しました。

もう少し高度なテクニックを使うと、フォント1文字の縦1ピクセル分(横8ピクセル)ごとに、描画色と背景色を変えたりすることもできます(通称、多色刷りモード)。

これを使うと、VRAMに文字コードを書き込むだけで、一見カラフルな画像を(1ピクセルづつ描画する場合と比較して)高速に表示することができ、MSX向けのゲームの背景描画などでよく使います(参考)。

というわけで、MSX-BASICでゲーム等を作る時には、VPOKE命令を活用して表現の幅を広げていきましょう!

はてなブックマークの「おすすめユーザー」と「iOS / Androidアプリ のバナー」を消す方法

自分自身のブックマークのサイドバーに表示されるやつ。

ブックマークの「設定」画面の「デザイン」タブの「スタイルシート」の箇所に以下を記入して、「スタイルシートを変更する」ボタンを押せばOK

iOS / Androidアプリ のやつは、タイトル部分は残ってしまう

#user-sidebar-recommend { display:none; }
.appstore-link { display:none; }

MacにClamAVをインストールする(homebrew使用)

Mac OSXでのウィルススキャンにはClamXavを使っていたのだが、有料化してしまった。

一度払うだけならいいんだけど、そのうちVer.3が出てまた払わされるだろうし、リアルタイムスキャン機能は使わずに定期的にフルスキャンをかけるだけだったので、ClamXavはアンインストールして、直接ClamAVを使ってみることにした。

インストールにはHomebrewを使った。

brew install clamav

ウィルス定義用ディレクトリを別に作ってみる(なんとなく)

mkdir -p /usr/local/var/lib/clamav

freshclam.confの作成(ウィルス定義更新コマンド用)

cd /usr/local/etc/clamav/
cp freshclam.conf.sample freshclam.conf
vim freshclam.conf

freshclam.confを編集

  • Example の行をコメントアウト
  • DatabaseDirectory で、ウィルス定義用ディレクトリを指定
# Comment or remove the line below.
#Example

# Path to the database directory.
# WARNING: It must match clamd.conf's directive!
# Default: hardcoded (depends on installation options)
DatabaseDirectory /usr/local/var/lib/clamav

ウィルス定義の更新

freshclam

いざ、フルスキャン!

  • ここでは、/dev/ 以下のディレクトリと、 *.vmdk, *.vdi のファイルは対象外にしている
  • ログを ~/Desktop/clamscan.log に書き出している
clamscan --exclude-dir="^/dev/" --exclude="\.vmdk$|\.vdi$" -r / | tee ~/Desktop/clamscan.log

次に再度フルスキャンする時には、clamavのupgradeと、ウィルス定義の更新も忘れずに。

なんか、freshclam で定義を更新する時にエラーがでるっぽい

Downloading bytecode.cvd [100%]
ERROR: Database load killed by signal 11
ERROR: Failed to load new database

一つ前のバージョンのClamAVでは発生しないらしい。ほっとけば、そのうち直るかなぁ

おまけ

  • フルスキャンは時間がかかるので、省エネルギー設定で自動スリープしない設定にしておき、スキャン終了後に自動でスリープコマンドを実行させると良いかも。次回起動時に省エネルギー設定を戻すのを忘れずに
clamscan パラメータ色々 ; osascript -e 'tell application "Finder" to sleep'
  • ちなみに、clamd は、プロセスを常駐させておいて、何度もスキャンを繰り返すような場合に使う。今回はフルスキャンを1回するだけなので使わなかった。

自作ゲーム配布方法の歴史

2000年頃のインターネットを懐かしむ会(インターネット老人会)というイベントで発表したので、スライドを貼っておきます。

Chromeだと埋め込みスライドのボタンが効かないっぽいので、下のリンク先で見てください)

書ききれなかったけど、他にも、ベクター PACK5000 とかの、CD-ROMに沢山のフリーソフトシェアウェア(無料アプリ・有料アプリのこと)が収録されたムックとかもありましたね。

Vimで、ファイルの存在するディレクトリ単位で、インデントの設定とかを変える

Haxe用の使いやすそうなエディタを調べていくうちに、vaxeというVimプラグインがなかなか良さげな感じだったので、結局 Vimを使い始めることにした。

ファイルタイプごとにインデントの設定を変えるには、vimrcに、例えば autocmd FileType haxe setlocal noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 などと書いておけば良い。 しかし、ファイルタイプに加えて、さらにプロジェクト単位で、インデントの設定を変えたくなることがよくある。(参加しているプロジェクトごとにインデントの規則が違うとか、ある日突然好きなインデントのタイプが変わったとか)

そこで、localvimrc というvimプラグインを入れて、プロジェクトごと(ファイルが存在するディレクトリごと)に追加のvimrcを設定できるようにしてみた。

プロジェクトのトップディレクトリに .lvimrc というファイルを作っておくと、そのディレクトリ以下(サブディレクトリ含む)のファイルを開いたときに、自動的に .lvimrc の内容を実行してくれるので、ここにインデントの設定などを書いておけば良い。

NeoBundleを使っているので、vimrcに、プラグインの場所を追加してインストール

" vimrcに追記
NeoBundle 'embear/vim-localvimrc'


デフォルトのままだと、毎回 .lvimrc を実行するか聞かれて面倒なので、選択を保存する設定にする。ただし、あらかじめ空のファイル ~/.localvimrc_persistent を作成しておく必要があるみたい。

" vimrcに追記
let g:localvimrc_persistent=2


デフォルトのままだと、sandboxで実行されるため、インデントの設定とかを変えられないようなので、無効にしておく(実はsandboxが何なのかよく分かっていない...)

" vimrcに追記
let g:localvimrc_sandbox=0


あとは、プロジェクトのトップディレクトリに、以下のような .lvimrc をおけば、このプロジェクト専用のインデントの設定ができる。(この例の場合、filetypeがhaxeの場合のみインデントの設定を変更している)

if &filetype=='haxe'
    setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4
endif


やったね!

Windows 8 で簡単シャットダウン

Windows 8をシャットダウンするのが面倒臭いので、ショートカットを作った。

以下のファイルを"confirm-shutdown.js"等の名前で作成し

var sh = new ActiveXObject("WScript.Shell");
if (sh.Popup("Are you sure you want to shutdown?",0, "Confirmation", 1+32) == 1) {
    sh.Exec("shutdown -s -t 0")
}

"wscript.exe [confirm-shutdown.jsのパス]"という内容のショートカットを作っておく。起動すると、シャットダウンを確認するダイアログが出る

おまけ1

こっちのほうがいいかも?(試してない)
http://crystaldew.info/2012/07/16/windows-8-sleep-shortcut/

おまけ2

Windows8アプリを出したよ
http://www.sunflat.net/windows/

Haxe NME

NMEという、Haxe言語用のクロスプラットフォームライブラリがあり、Flash風のAPIを使って書いた単一のコードから、Flashhtml5iOSandroidmacwindowsなど、色々なプラットフォーム向けの実行ファイルを出力できる。

JavaScript (中略) ハッカソンに参加したので、NMEを使って生成されたアプリの、いくつかのプラットフォーム上での実行時間を比較してみた。

比較には、id:yoshihiro503さん作のAOBench Haxe版を、NME用に移植したものを使った。ソースはこちらhtml5版の生成されたアプリはこちら


実行にかかった時間(ms)

10回(iPhone 4shtml5のみ3回)測定した平均値です。

MacBook Pro (15-inch Mid 2010, Core i7 2.66GHz) で実行
html5 (JavaScript) Chrome html5 (JavaScript) Safari Mac nativeアプリ (C++) Flash
1574.1 ms 2812.3 ms 1092.9 ms 3601.8 ms
iPhone 4s で実行
html5 (JavaScript) Safari iOS nativeアプリ (C++)
47691.3 ms 7271.2 ms
感想

NME のセットアップメモ

追記:NMEのインストーラを使うと、いくつかの手順やコマンドの名前を省略てきて便利なようです(コメント欄参照)。

haxelibのインストール方法はこちら

Mac上でのNMEのセットアップ手順(うろ覚え)

sudo haxelib install nme
sudo haxelib run nme setup html5
   (jeashライブラリをインストール)
sudo haxelib run nme setup flash
sudo haxelib run nme setup ios
  (XCode4を別途インストール)
sudo haxelib run nme setup mac
sudo haxelib install hxcpp
  (これを忘れると、Source Path "libstd..." does not exists、などのエラーが出る)
sudo /usr/bin/xcode-select -switch  /Applications/Xcode.app/Contents/Developer
  (これを忘れると、/Developer パスが無いと言われる)

実行

haxelib run nme test application.nmml html5
haxelib run nme test application.nmml flash
haxelib run nme test application.nmml mac
haxelib run nme test application.nmml ios