Android 用ポケコンエミュレータで LC-3 コンパイラが動いたとの連絡を頂いたので紹介させていただきます。

Pokecom GO

LC-3 について幾つか質問もいただいたのですがだいぶ忘れていました。資料が残っていると思うので発掘できたら紹介させていただきます。

また LC-3 の配布に関しては自由に行っていただいて構いません。ダンプリスト、バイナリ等、任意に掲載していただいて結構です。


SHARP のポケットコンピュータに使われた CPU SC61860 は、小型でポケットに入る電卓サイズの機種に搭載されています。小型&安価な機種ながら、8bit でマシン語が使えることから人気が出ました。それ以前のポケットコンピュータ PC-1211/10 は 4bit CPU が使われており BASIC しか使えませんでした。また最上位機種 PC-1500/1501 はより強力な CPU を搭載しており性能が高かったものの、サイズも大きく高価でした。

PC-1250/51/45/55 当時のポケコン向け BASIC は非常に低速で、アクションゲームのようなリアルタイムな処理はほぼ不可能でした。数値演算はすべて10進数の BCD で行われており、内部表現は単精度で 8byte も消費します。整数型はありませんし CPU Clock も 576KHz です。

画面に任意の dot pattern を表示することができず、表示できるのは ASCII の A~Z 大文字のみ。しかも BASIC 演算実行中は画面の表示が強制的に off になり、画面に文字列を表示できるのは表示命令で実行が止まっているときだけです。

サウンドも予め内蔵されている BEEP 音を一定期間鳴らすことしかできず、音程等はありませんでした。

しかしながら隠し機能だったマシン語を使うことで、これらのこれらの制限がほぼなくなることが判明します。PC-1250/51 向けのマシン語解析記事が当時の雑誌に掲載され、さまざまなゲームも作られるようになります。

マシン語を活用すると動作も高速でリアルタイムなキー入力も可能。常時画面表示を ON にしたまま任意のドットパターンを表示することができました。サイクル計算次第では任意の音程のサウンド再生も可能です。

ただ上記の通り RAM が圧倒的に足りません。RAM は不揮発性でストレージを兼ねていましたが、外部記憶装置はカセットテープなので外部から容易に読み込むこともできません。

そのため当時のマシン語プログラミングは動作効率よりもいかにサイズを減らすかが重要でした。1byte 減らすためには何でもしました。

例えば相対ジャンプは前後 8bit 範囲 (= 9bit 512byte 範囲) にしか飛べないので、リロケータブル前提で大きなプログラムを作る場合は途中に中継地点が必要です。無駄な命令が増えるので、条件付きジャンプだったとしても同じ番地に戻る命令があればそこを再利用します。もちろん飛ぶ前にフラグが誤動作する組み合わせにならないように、前後の命令を入れ替えるなどして調整します。

A:
           ; 目的位置

B:
  102Dnn   ; DP を破壊しても良い前提で中継地点を埋め込む。2Dnn が A: に飛ぶ命令


  41       ; I--
  29nn     ; JRNZ ; 中継地点の B: +1 に飛ぶ。



A:
           ; 目的位置

C:
  2Bnn     ; JRNC ; たまたま同じ A: に飛ぶ別の命令 (条件付き)


  41       ; I--
  29nn     ; JRNZ ; C: に飛ぶ。41 により C=0 が保証されている

これで中継地点が不要となり 3byte 減ります。CMP/INC/DEC 系はフラグを破壊するので、代わりに BIT TEST や 5A/D2 (SHIFT) を使うのもありです。リロケータブル化が不要な場合でも絶対ジャンプと比べると 1byte 削減になります。

CPU の未定義な挙動も使いました。そのため CPU エミュレータを作るには、ドキュメント化されていない CPU の内部挙動まである程度再現する必要があるかもしれません。

有名なところだと特定の命令で Q レジスタに定数(レジスタ番号)が格納されることでしょう。

1302    Q=02

もし A を破壊しても構わなければ INC A を代わりに使うことができます。これで 1byte 減ります。

42      A++   (副作用で Q=02)

35 命令は PC を使ってメモリ内容を読み出すことができます。PC が破壊されると困るので、内部で一時的にスタックに PC を保存しているようです。そのため 35 命令を使うとスタックに PC の痕跡が残ります。

ただし PC の読み出しなら 35 命令を使わなくても、内RAM 内ROM 内の任意の 37 (RTN) を一度呼び出せば良いので、あまり使わなかったように思います。


SC61860 は RAM にアクセスするには必ず特定のレジスタを経由しなければなりませんでした。DP もしくは PC です。

メモリアクセス可能なレジスタ

Register 内ROM 外ROM 外RAM VRAM
DP -- Y Y Y
PC Y Y Y --

内ROM (CPU 内蔵 ROM) はプロテクトがかかっており通常のデータアクセス用 DP では読み出すことができませんでした。ですがプログラムの実行はできるので、PC は当然読み出すことが可能です。35 命令は PC を使うことで、本来読み出せないはずの内 ROM の内容を読み込むことができます。

マシン語モニタを作る場合は DP ではなく常に PC (35命令) を使えばよいかというとそうではなく、今度は VRAM を読むことができません。すべてのメモリにアクセスするには、DP, PC 両方を併用する必要があります。ちなみに PC は VRAM にアクセス出来ないので、VRAM にマシン語コードを書き込んでも実行できませんでした。


byte 削減のために一番活用したのはやはり 内ROM で、少しでも都合が良い命令並びがあれば積極的に 内ROM CALL を多用していました。たった 3byte の命令並びでも、内ROM CALL だと 2byte で済むからです。


関連エントリ
24年ぶりに「おくやくん」が移植されました。ポケコン PC-1245
BASICコンパイラと手書き原稿の時代
28年前のモバイル PC-1211 他
20年前のモバイル PC-1417G


VR
oga at 21:01
Windows MR も SteamVR に対応したので、Dell Visor で HTC Vive 向けのソフトをプレイしてみました。思ったよりも遜色なく動くものが多く Fallout 4 VR も遊べます。コントローラにタッチパッドがあるおかげで操作方法も Vive と同じです。

null

1. Steam で「 SteamVR 」を install
2. Steam で「 Windows Mixed Reality for SteamVR 」を install
3. Windows の Start Menu から「Mixed Reality ポータル」を起動
4. 3. が「準備完了」になってから Steam 上で「 SteamVR 」を起動
  (Steam 右上タイトルバーにある [VR] ボタンでも OK)
5. SteamVR 用のソフトウエアを起動 (Fallout 4 VR 等)

↓アイコンが Windows MR Device の形に

null


終了時は「Mixed Reality ポータル」を一番最後に閉じる必要があります。

1. SteamVR 用のソフトウエア終了
2. SteamVR (Steam VR Monitor) を閉じる
3. Steam のウィンドウを閉じる
4.「Mixed Reality ポータル」を閉じる


Windows MR Controller の Home ボタン (Windows Button) だと Windows ポータルに戻ってしまいます。代わりに左スティックの押し込み (L3/ThumbButton) で Steam の Home を呼び出すことができます。ヘッドホンのボリューム調整はここです。また右スティックの押し込みでコントローラの左右入れ替えができました。


Dell Visor で気になった点も幾つか

◎ HTC Vive でプレイしたときよりも若干視野が狭く感じる

HTC Vive のように物理 IPD 調整ができず、マージンも少ないので位置合わせがシビアでした。Dell Visor は上に跳ね上げられるのが特徴ですが、PSVR のように前後位置を調節できるわけではないです。

◎ ヘッドトラッキングの処理落ちあり (首を振ったとき滑らかではない)

処理落ちかインサイドアウトのトラッキングエラーか不明です。Vive と比べると動きによっては酔いやすいかもしれません。特に激しく首を動かす場合など。
使用した PC は Ryzen 7 1800X + GeForce GTX 1070 です。もともと Fallout 4 VR の推奨スペックは 1080/Vega64 以上なので GPU 不足の可能性が高いです。トラッキングの違い&ディスプレイ解像度が高いことから、Vive 向け推奨スペックよりも高い PC 性能が必要になるかもしれません。

◎ コントローラのタッチパッドが Vive より小さく操作ミスしやすい

これは仕方ないのですが、面積が小さいのでタッチを使ったカーソル移動とアイテム選択がやりづらい場合がありました。

↓コントローラの比較。Windows MR (写真左) は円形タッチパッドの面積が小さい。

null

↓VR ヘッドセットの比較

null

上 HTC VIve, Daydream View (2017), 下段 PSVR, Dell Visor


関連エントリ
Windows Mixed Reality Dell Visor (VR HMD)
HTC Vive (VR ヘッドマウントディスプレイ) の接続


VR
oga at 00:56
Google Daydream View の発売がようやく日本でも始まりました。購入できるのは 2017 年モデルの新型です。

Google Daydream

null

ZenFone AR 購入から半年、Tango + Daydream マルチ機能のうち残り半分をようやく活用できるようになりました。(同時に Tango サポート打ち切りの残念なお知らせもありました)

Cardboard は QR code で認識しますが、Daydream View は NFC でデバイスを特定しているようです。Daydream 利用時は NFC を有効化しておく必要があります。

Motion Controller は片手用、一つだけでポジショントラッキングはありません。トリガボタンもなく、操作にはクリック可能なタッチパッドが用いられます。クリック可能なタッチパッドはモーションコントローラの標準になりつつあるようです。

クリック可能なタッチパッド搭載モーションコントローラ↓

Device Menu Trigger
HTC Vive Y Y
Windows MR Y Y
Gear VR Y Y
Google Daydream Y --
Apple TV Y --
DUALSHOCK 4 Y Y

スマートフォンを固定する蓋の部分は放熱用の穴が空いています。初期型 (2016年モデルの Daydream view) は押さえつけて固定するためのただの蓋でしたが、新型はより密着して熱を逃がすヒートシンクを兼ねているようです。

null

初期型はヘッドセット内部の空間を利用してコントローラを収納することができました。新型は放熱構造のため中に格納することができず、後頭部にコントローラ固定用のベルトが設けられています。

Cardboard 等のスマートフォンを使った簡易型 VR と比べると、モーションコントローラがあるので操作しやすくなっています。ストアからアプリを落として起動する一連の操作もヘッドセットつけたまま行うことができました。

Daydream 対応スマートフォンはどれも最近のハイエンド機種で、その大半が Snapdragon の 820 (Adreno 530) 以上が用いられています。据え置き機向け VR と比べると流石に見劣りしますが、モバイル向け VR としては一定の性能が保たれています。

Daydream 対応 Android Device

Daydream 対応機種に使われている SoC と GPU

SoC GPU
Snapdragon 820 Adreno 530
Snapdragon 821 Adreno 531
Snapdragon 835 Adreno 540
Exynos 9 Octa Mail-G71 MP20
Kirin 960 Mali-G71 MP8

いずれも RAM 4GB 以上で OLED 搭載


関連エントリ
Windows Mixed Reality Dell Visor (VR HMD)
ASUS ZenFone AR (Daydream/Tango)
Gear VR Controller


VR
oga at 22:47
Dell Visor VRP100 を購入しました。Windows MR 対応の VR ヘッドセットです。

null

Steam VR を HTC が製造しているように、Microsoft の Windows MR 対応ヘッドセットを各社リリースしています。その一つが Dell Visor です。他にも Acer, HP, Fujitsu など多くのデイバスが登場しています。

MR という名前ですが、できることは他の VR System と変わりません。完全にレンダリングされた(非透過な)スクリーンに、両手 2個分のモーションコントローラーを使うことができます。それぞれ 6DoF でポジショントラッキング可能なので、機能的には HTC Vive, Oculus Rift, PSVR といったハイエンド系 VR デバイスと同等になります。

6DoF + 6DoF Tracking Motion Controller
HTC Vive LightHouse Vive Controlelr, Vive Tracker
Oculus Rift IR Camera Oculus Touch
PlayStatio VR RGB Camera PS Move, Dualshock 4
Windows MR InsideOut Windows MR Controller

特徴は HMD に内蔵した Camera だけでトラッキングを行うことです。そのため外部にレーザー灯台の設置や Camera 等のセンサーが不要です。セットアップが簡単です。

反面、周囲の明るさの影響を受けたり、Motion Controller のトラッキング範囲に制限が生じるなど制約もあります。例えばコントローラーは、HMD の Camera から見えている範囲でないと位置の特定ができません。基本的に HMD の前面になければならず、腕を真下や真上に上げるとトラッキング範囲から外れてしまうことになります。

また利用するには Windows 10 の Fall Creators Update (1709) 以降が必要です。Windows 10 Creators Update (1703) でもヘッドセットは認識しますが、Motion Controller を使うことができませんでした。


以下実際に使ってみてわかったことなど。


● 箱が大きい

店頭で受け取ったら Dell Visor は予想より大きな箱で少々慌てました。最近の HTC Vive や Oculus Rift の箱はかなり小さくなっています。外部センサーが無いためか、付属物はとても少なく軽量です。持ち運び自体は苦になりませんでした。


● Bluetooth 必須なので注意!

購入後に気がついたのですが、PC 側に Bluetooth 4.0 LE が必要です。モーションコントローラの接続に必要になります。開発者版には Controller がなかったので気が付きませんでした。

ちなみに HTC Vive や Oculus Rift は HMD にワイヤレス機能が内蔵されており、何も用意しなくてもモーションコントローラを認識できます。

手持ちの古い Bluetooth 2.0 アダプタでも一応接続できましたが、バッテリー消費を考えると 4.0 LE 対応アダプタを買い直した方が良いかもしれません。


● ヘッドセットと接続

USB3.0, HDMI の 2つのコネクタにつなぐだけなので非常に簡単です。ソフトウエアの導入も Windows が勝手に行うので、表示される手順に従いセットアップを進めるだけです。

コントローラの認識に失敗した場合は手動ペアリングもできます。

 1. 設定 -> デバイス -> Bluetooth とその他のデバイス
 2. Bluetooth またはその他のデバイスを追加する。
 3. Bluetooth (マウス、キーボード、ペンまたはその他の種類の ~)

もしペアリングでキーをきかれたら「0000」


Dell Visor には Vive や Oculus のような物理的な IPD 調節はありませんでした。ソフトウエア設定のみとなっています。

コントローラーは Oculus Touch 同様明確に左右の区別があります。乾電池式です。片方に単3 x2 で合計 4本。

VR 用にヘッドホンも必要です。HTC Vive や PSVR のようにイヤホンも付属していないので、別と用意しておく必要があります。


● 液晶ディスプレイ

これまで HTC Vive, Oculus Rift, PSVR, GearVR, Google Daydream 対応スマートフォン、いずれも有機 EL ディスプレイが用いられていました。Windows MR は LCD 搭載機種が大半を占めています。反応速度から VR は有機 EL でなければならないといった制限は今後なくなっていくのかもしれません。


● 使用感など

HMD もコントローラも全体的にコストダウンのあとが見えて高級感はありませんでした。Bluetooth アダプタやヘッドホンなど、始めるために追加コストが必要になる場合もあるので割高に感じます。Windows MR デバイスは 5~6万円で売られているので、5万円で買える Oculus Rift の方が満足度が高いでしょう。

HTC Vive の場合は対応ソフトも多く、VR 自体の質の高さ、コントローラの反応速度や精度など、性能が良いけど値段も高い高級機としての位置づけになっています。

Windows MR の場合、他と差別化できるくらい値段が安くなれば、PC で手軽に体験できる VR デバイスとして一つの選択肢になるかもしれません。


関連エントリ
ASUS ZenFone AR (Daydream/Tango)
Gear VR Controller
HTC Vive (VR ヘッドマウントディスプレイ) の接続

関連ページ
HMD VR / AR Device spec 一覧


ついに GeForce GTX400/500 (Fermi) 世代の GPU が Direct3D 12 に対応したようです。2年間待ちました。手持ちの GeForce GTX560 Ti で早速プログラムを走らせてみましたが問題なく動いています。

PC Watch: NVIDIAの最新ドライバでFermi世代のGPUがDirectX 12対応に

FeatureLevel は 11_0 なので基本的な機能は Kepler 世代と大きな違いはないようです。ただし ResourceBinding Tire が 1 なので、Shader から一度に参照できるリソースの個数に上限があります。低レベル API のメリットの一つがリソース数制限の撤廃ですが、Tier 1 の場合は D3D11 と変わらないことになります。

詳細は下記ページよりどうぞ。表に GeForce GTX 560 Ti を追加しました。

Direct3D 12 (DirectX 12) Windows 詳細

これで GeForce は Direct3D 11 世代の GPU がすべて DirectX12 対応となりました。なお Fermi は Vulkan には対応していないようです。

Direct3D 11 世代 GPU の対応 API まとめ↓ (Vulkan は Windows の場合のみ)

GPU FL Tier D3D12 Vulkan Metal GL
GeForce GTX 400/500 (Fermi) 11_0 1 Y N N 4.5
GeForce GTX 600/700 (Kepler) 11_0 2 Y Y Y 4.5
GeForce GTX 750 (Maxwell1) 11_0 2 Y Y Y 4.5
GeForce GTX 900 (Maxwell2) 12_1 2 Y Y Y 4.5
GeForce GTX 1000 (Pascal) 12_1 2 Y Y Y 4.5
RADEON HD 5000 11_0 - N N N 4.5
RADEON HD 6000 11_0 - N N N 4.5
RADEON HD 7000 (GCN 1.0) 11_1 3 Y Y Y 4.5
RADEON Rn 200/300 (GCN 1.1) 12_0 3 Y Y Y 4.5
RADEON R9 285/380 (GCN 1.2) 12_0 3 Y Y Y 4.5
RADEON RX 400/500 (GCN Polaris) 12_0 3 Y Y Y 4.5
Intel HD Graphics (Gen 7) Ivy Bridge 11_0 - N N Y 4.0
Intel HD Graphics (Gen 7.5) Haswell 11_1 1 Y N Y 4.3
Intel HD Graphics (Gen 8) Broadwell 11_1 1 Y N Y 4.4
Intel HD Graphics (Gen 9) Skylake 12_1 3 Y Y Y 4.4
・FL = Feature Level

D3D11 世代で D3D12 に対応していない GPU は Intel HD Graphics 4000 系 (Ivy Bridge) と GCN より前の RADEON になります。そもそも D3D12 や Vulkan といった低レベル API の元になっているのは GCN 向けに作られた Mantle なので、AMD の場合は仕方がないともいえます。

GPU ごとの対応 API については、下記のページも参照してください。

GPU 世代対応表

Windows の更新とともに Direct3D 12 にも修正が入っているようです。Creators Update の 1703 では ID3DDevice2 が追加されています。Version の違いをまとめてみました。

Windows Version Windows SDK D3D12Device Interface
Windows 10 1703 10.0.15063.0 ID3D12Device2
Windows 10 1607 10.0.14393.0 ID3D12Device1
Windows 10 1511 10.0.10586.0 ID3D12Device
Windows 10 1507 10.0.10240.0 ID3D12Device


関連エントリ
2015/06/29: Direct3D 12 (DirectX12) GPU と API の対応表
2015/06/26: DirectX 12 (Direct3D 12) と GPU の対応

関連ページ
Direct3D 12 (DirectX 12) Windows 詳細
GPU 世代対応表


<<前のページ(日付が新しい方向) | 次のページ(日付が古い方向)>>