●移植された!

「おくやくん」 は SHARP のポケットコンピュータ、PC-1245/50/51/55 で動くゲームです。
工学社の雑誌、PiO 1985年の 11月号に掲載されたので、もう 24年も前になります。
その古いゲームを、なんと 24年の時を経て他の機種に移植してくれた方が現れました。
下記ページで公開されています。

「ポケットコンピューター」について

こちらには新たに移植された PC-1450 版、PC-1260/61/62 版(*1)がありますし、
16ステージ分オンメモリに改良された PC-1251/55 向けも掲載されています。
BASIC による PC-G801/E200 版もあります。

ページに掲載されているプログラムは音声形式 WAVE ファイルで、これをカセット
インターフェースから読み込ませるとポケコン本体に転送できるという仕組みです。

このカセットインターフェース用のセーブ音を聞くだけでもう懐かしくて涙が出そうです。


●電卓みたいなコンピュータ

SHARP のポケコン PC-1245/50/51/55 や PC-1260/61/62 は非常に小さくて薄くて
ただの電卓にしか見えません。

今更こんな写真を見せられても、コンピュータとして使い物になるのかと疑問に思う方が
きっと多いことでしょう。
いや当時もそう思いました。

でもそこが魅力の一つでもあります。
見かけは薄っぺらな関数電卓なのに、BASIC だけでなくマシン語プログラムが走り、
高速なゲームが動いてサウンドの演奏もできます。当時としてはどれも驚くべきもの。
見た目のギャップと実力の差、中に詰まった感じが良かったのです。


●ゲーム内容

横画面のアスレチックぽい仕様となっていますが、実際は迷路ゲームです。
画面が 1行しかないことを逆手に取り、先が読めず決断を迫られることと、若干の
暗記力が必要でした。

一番の特徴はドット単位の上下スクロールです。
VRAM 構造上の制約もあったため、掲載時はまだ珍しかったように思います。
2D 風のフィールドを移動できてマシン語で比較的高速に動作するし、
内容もかなり緩いゲーム性だったこと、コンストラクションモードがあって自由に
面データを作れたのが良かったのかもしれません。


●おくやくん作成の話と機械語プログラミング

このゲームを作った目的はやっぱりスムーズな上下スクロールでした。
ただ最初はそこまで深く考えていなかったため、あまりきれいな作りではありません。
結局はライン単位でパターンを展開しているし、スクロールにキャラが付いてこない
ところも不完全です。
もっときちんと作っておけば良かったと、ここだけがずっと心残りでした。
完全に 2D 空間を滑らかにスクロール出来たのは、その後の別のゲーム
トロピカルアイランドだったように思います。

おくやくん はほぼ全部マシン語で書かれています。
アセンブラもパソコンも無かったので、紙に手でプログラムを書いていました。
ニモニックは使わずに 16進数で命令を並べ、自分で相対ジャンプを数えて、ある程度
出来たらマシン語モニタで直接 RAM に命令を書き込んでいきます。

これだとあとから大きな修正ができないので、プログラミングは完全にボトムアップです。
キー入力ルーチンやサウンド部分から始めて、パターン転送ルーチンなど小さい部品を
作り、テストしながらメモリ上に配置していきます。
ゲームとして全体が繋がるのは最後でした。
RAM が 2~10KByte しかなかったおかげか、こんな方法でも十分だったのです。


記憶メディアはカセットテープしかなかったものの、ポケコンは今で言うスリープ相当。
RAM の内容はバッテリーで保持されています。
ファイルやディスクといった概念もなく、メモリを書き換えたらそれがすべてです。
プログラムもエディットしたステージデータもずっと RAM 上に保存されています。

そのためプログラム実行時は最初に必ず初期化ルーチンが必要で、ワークエリアを
クリアしたり、パラメータの初期値を転送しなければなりません。
いつも最後に作るのがこの部分でした。

その頃には RAM エリアはすでに後ろまでいっぱい使い切っており、たいてい入る場所
が無くなっています。そこで逆にアドレスの前方に伸ばしていきます。ぎりぎりまで
BASIC エリアを浸食するようになるわけです。
プログラムの一番先頭にワーク初期化用のデータテーブルがあったり、プログラムの
スタートアドレスが途中の中途半端な番地になっているのもそのため。

ちなみに 「おくやくん」 というのは当時の友人、奥山君のこと。


●ポケコンユーザー

移植してくれた柳田さんありがとうございました。
今後他の機種へも移植を行っていくとのことです。

今年の 2月にもLC-3 コンパイラが欲しいとの問い合わせもあって、意外にもまだまだ
ポケコンを使ってる方が結構いらっしゃるようです。
このように問い合わせのメールをいただく度にいつも驚いています。
そして謝ります。すみません、コンパイラはまだ用意できてませんでした。


*1: PC-1260 には過去にも移植版があったようです。森岡氏 PC-1260


関連エントリ
BASICコンパイラと手書き原稿の時代
28年前のモバイル PC-1211 他
20年前のモバイル PC-1417G


Ubuntu のデスクトップ環境はよくできています。
設定とかウィンドウ上のダイアログだけで済んでしまうし、普通に使っている分には
Windows とあまり変わらない印象です。

もちろんコマンドシェルを使った方がやれることが多いだろうし、以前から Linux や Unix 系
OS を使っている方ならコマンドを打ち込んだ方が早いかもしれません。
そのため古くから使っている人だけでなく、ネット上に蓄積されている情報もコマンドで作業する
ものが多くなっています。
今後誰でも使える環境を目指すなら、コマンドに頼らない GUI だけで活用するノウハウも
必要になってくるのではないでしょうか。


● VPN の設定

通知スペースにある 無線LAN のアイコンをクリックすると「VPN 接続」という項目があります。
そのまま設定できそうですができませんでした。何らかのマネージャーを登録する必要があるようです。

ここでは PPTP を使っています。

・アプリケーションの追加と削除から PPTP で検索
・PPTP VPN Connection Manager が見つかったのでインストール
 (チェックボックスにチェックを入れて、変更の適用)

これで通知スペースのネットワークアイコンから「VPN 接続」を選べるようになりました。

・VPN の設定から [追加]
・VPN 接続タイプで PPTP を選択して [作成]
・必要な項目を書き込む

「VPN 接続」のメニューに書き込んだ項目が追加されました。
これでうまくいきそうに見えますがつながりません。

エラーが出ているようですが、右上の通知も一瞬で消えるので原因もよくわからないまま。
ログアウトして再ログインしてもだめでした。

しばらく悩んだものの、結局再起動したらあっさりつながりました。
ネットワークアイコンにもログイン状況を示すアニメーションや鍵マークが表示されて
VPN で繋がっています。


●クイックスタートボタンを無効化する

本体支える場所が少ないのでクイックスタートボタンをよく触ってしまいます。
下記の設定で無効化できることがわかりました。

設定 → キーボード・ショートカット → デスクトップ →「Run a defined commnd」

XF86HomePage, XF86WWW, XF86Mail, 0xca と書かれているのがそれぞれ
HOME, Web, Mail, ☆ ボタンに相当するようです。
個別に選択して [BS] キーを押すと「無効」になります。
設定を変更したら、いったんログアウトして再ログインし直すと反映されます。
元に戻すには、個別に選択して対応するキーを押せば OK です。


● Flash プラグイン

ブラウザが落ちやすくなったので結局無効にしてしまいました。
ツール → アドオン → プラグイン → Shockwave Flash 無効化


●片手だけタッチタイプで使う

(1) 両手とも5本指

テーブルに置いた状態では、両手でキーボードをたたいています。
パソコンと同じようにホームポジションに手を置きながら。
オプティカルポイントは人差し指で操作です。

(2) 親指のみ

電車の中など立って使う場合は、両手で持って親指でオプティカルポイントを操作しています。
この場合キーボードも親指打ちになります。

でもこれだと中央のキーを打ちづらいしあまり速く打てないので、文章を打つ場合は
右手だけ 5本指を使うようになりました。

(3) 親指+5本指

左手は本体のホールド兼用で、左側のキーを親指で打ちます。
右手はホームポジションに乗せて、そのまま (1) と同じようにタッチタイプします。
オプティカルポイントは人差し指や中指で。

この打ち方のメリットは右手側のキーだけ見なくても速く打てることと、左手の親指が届かない
真ん中のキーを右手でカバーできることです。
デメリットは本体を支える左手が疲れること。
左右逆でもよいかもしれません。


●NetWalker

個人的にはタッチタイプできる絶妙なサイズのキーボードで、予想に反して手放せないものと
なりつつあります。

親指打ちに特化されたキーボードだと、上のような組み合わせた持ち方&打ち方は出来ないし、
これ以上キーボードが大きくなるとおそらく本体も重くて片手で支えられなくなります。
複数の打ち方を使い分けられる別のジャンルと割り切ってよいのではないでしょうか。
Netbook が買える価格帯であることを考えると決して万人には勧められませんし、それぞれ
個別に見ていくと中途半端に見えるかもしれません。
だけど今まで無かったこの中途半端なサイズを求める人にはぴったりかもしれません。

今後キーの質が改良されるのは望むべきことですが、サイズとか他のところはあまり大きく
変えないで欲しいというのが今の感想です。


関連エントリ
NetWalker PC-Z1 と親指シフト入力
NetWalker PC-Z1 Bluetooth とキーカスタムその他
NetWalker PC-Z1 意外にいける
Netwalker PC-Z1 買いました


コメントをいただきましたのでこちらにも書いておきます。
NetWalker は購入後、何のソフトを入れなくても最初から親指シフト入力が可能です。
もしかして富士通以外のメーカー PC で親指シフト入力に最初から対応しているのは、
これが初だったりするんでしょうか。
実は Anthy が親指シフト入力に対応しているおかげです。

設定から
 システム → 設定 → SCIM入力メソッドの設定 → IMエンジン → Anthy

入力方式: 親指シフト入力方式

に切り替えれば OK です。

以後デフォルトが「親指シフト入力」になりますし、この状態でも [Alt] + [ローマ字] を押せば

ローマ字入力 → かな入力 → 親指シフト入力

と順番に切り替わります。細かいカスタマイズも出来ます。

ただし難点もいくつかあります。

・NetWalker のキーの出来(つくり)が悪くてタッチタイプするにはかなり練習が必要
・キーボードの周囲がせり上がっていて、下段のキーを親指で押しづらい
・[ね,][ほ.] のキーが小さい
・カスタマイズしないと [ん;] のキーが遠い

幸いなことにキーの入れ替えは標準の機能で出来ます。親指シフト入力向け (?) の
キー入れ替えはこちら をどうぞ。
USB や Bluetooth の外付けキーボードを使えば問題ないかもしれません。

キーボードの周囲の縁はいつか削ろうと思ってます。

↓削りました
netwalker_01.jpg


関連エントリ
NetWalker PC-Z1 Bluetooth とキーカスタムその他
NetWalker PC-Z1 意外にいける
Netwalker PC-Z1 買いました


Atom と比べてみました。
あくまで参考程度でお願いします。

  ALU    FPU    MEM1   MEM4
  9.32   5.17   4.24   3.20     (1)  Core i7 920 2.67GHz
 29.41  29.36  43.83  27.43     (2)  Atom Z540 1.86GHz
 68.68  68.73  46.70  36.45     (3)  Atom Z540 800MHz
 42.88  44.09  39.45  20.03     (4)  Atom N270 1.60GHz
 37.82 209.76  56.35  30.68     (5)  Cortex-A8 800MHz NEON
 37.84 209.79  58.17  30.69     (6)  Cortex-A8 800MHz VFP
 37.83 252.80  56.34  30.75     (7)  Cortex-A8 800MHz soft
 42.96 211.02  55.86  30.52     (8)  Cortex-A8 800MHz NEON + Thumb-2
 42.85 212.18  55.87  30.53     (9)  Cortex-A8 800MHz VFP + Thumb-2
 42.92 267.23  55.84  30.54     (10) Cortex-A8 800MHz soft + Thumb-2

単位は秒、値が小さい方が高速

テストは基本的にただのループかつシングルスレッドのみです。
数値は Real Time なので厳密なコードのみの実行速度ではないです。

ALU 全部キャッシュに収まる整数演算とループ
FPU スカラーの浮動小数演算を含んだループ
MEM1 8bit 単位のメモリアクセス
MEM4 32bit 単位のメモリアクセス

(5)~(10) が NetWalker です。
浮動小数演算以外はほぼ Atom と近い範囲で、クロック差があるにもかかわらずかなり
善戦しています。おそらく整数演算に関してはシングルスレッドかつキャッシュに入る場合、
同クロックの Atom よりも高速です。

ただし実際の動作速度は CPU core の速度だけでなく、メモリや SSD 等他のデバイスの
影響が大きいので、これだけで判断することは出来ません。

また Atom は HT 前提のパイプライン設計なので、シングルスレッドではその性能を
出し切れていないともいえます。
同じように (1) の Core i7 も 8 スレッドのうち 1つだです。ちなみに (1) は
同時に VirtualBox の仮想 PC が動いていたりとかなりの悪条件で走らせました。

計測も Real 時間なので、バックグラウンドで動いているタスクの影響を少なからず
受けているといえます。この場合 HT を持っている Atom の方が若干有利に働くかも
しれません。

(3) は Z540 の電源設定を変更して、上限 800MHz で動かしたものです。
ALU FPU 時間はクロック数に比例して遅くなりました。MEM1/MEM4 はそれほど変化が
ないようです。この点から MEM1/4 の実行速度は CPU core の速度度よりも、メモリ
アクセス時間の割合の方が大きいと考えられます。

(2)/(3) と (4) はクロック比と速度が一致していません。これはおそらくコンパイラ
の差です。最適化の傾向が異なっており、ループ内の演算に無駄があり畳み込める
条件では gcc の方が高速でした。また VC は SSE 命令を使っており、gcc は
-msse4 をつけても FPU 命令に展開されています。

MEM1 は 1byte 単位で 32MByte を読み書きしています。
MEM4 は 4byte 単位で 64MByte アクセスしています。
よってループ回数は MEM4 が半分になります。
(4) の結果を見ると MEM4 は MEM1 のちょうど半分の時間で完了しているので、
このテストではデータサイズが速度に影響を与えていないようです。

浮動小数演算はただのスカラー演算です。遅すぎて、設定ミスとか例外が発生してるの
ではないかと疑いました。一応 vfp,neon,soft と 3通り試しています。
取りあえずエミュレーションよりは速いことがわかります。
きちんと SIMD を活用すれば、もう少しそれなりの速度が出るのかもしれません。

Thumb-2 の効果は確認できました。16/32bit 命令が混在しており、FP 命令呼び出しも
特に速度が落ちていないようです。

浮動小数演算以外は思ったよりも速いです。浮動小数演算が著しく遅いのは、
プログラムのミスなのかまだ良くわかっていません。

ARM の浮動小数演算に関しては下記ページを参考にさせていただきました。
ひまじめ 組み込みLInux


(2009/09/30 追記) 続き>> NetWalker PC-Z1 Cortex-A8 浮動小数演算の実行速度


(1) PC
Core i7 920 2.67GHz
Windows7 RTM x64, VC2008 x86 -arch:SSE2

(2) VAIO type P
Atom Z540 1.86GHz
Windows7 RC x86, VC2008 x86 -arch:SSE2

(3) VAIO type P
Atom Z540 1.86GHz (800MHz)
Windows7 RC x86, VC2008 x86 -arch:SSE2

(4) EeePC 901
Atom N270 1.6GHz
Ubuntu 9.04 x86, gcc-4.3.3 -mssse3

(5) NetWalker PC-Z1
i.MX515 Cortex-A8 800MHz NEON
Ubuntu 9.04 armel, gcc-4.3.3 -mfloat-abi=softfp -mfpu=neon

(6) NetWalker PC-Z1
i.MX515 Cortex-A8 800MHz VFP
Ubuntu 9.04 armel, gcc-4.3.3 -mfloat-abi=softfp -mfpu=vfp

(7) NetWalker PC-Z1
i.MX515 Cortex-A8 800MHz soft
Ubuntu 9.04 armel, gcc-4.3.3 -mfloat-abi=soft

(8) NetWalker PC-Z1
i.MX515 Cortex-A8 800MHz NEON + Thumb-2
Ubuntu 9.04 armel, gcc-4.3.3 -mfloat-abi=softfp -mfpu=neon -mthumb

(9) NetWalker PC-Z1
i.MX515 Cortex-A8 800MHz VFP + Thumb-2
Ubuntu 9.04 armel, gcc-4.3.3 -mfloat-abi=softfp -mfpu=vfp -mthumb

(10) NetWalker PC-Z1
i.MX515 Cortex-A8 800MHz soft + Thumb-2
Ubuntu 9.04 armel, gcc-4.3.3 -mfloat-abi=soft -mthumb

(2009/09/30 追記) 続き>> NetWalker PC-Z1 Cortex-A8 浮動小数演算の実行速度


関連エントリ
NetWalker PC-Z1 Bluetooth とキーカスタムその他
NetWalker PC-Z1 意外にいける
Netwalker PC-Z1 買いました
タッチタイプの境界
NetWalker PC-Z1


●Bluetooth

Bluetooth アダプタ Princeton PTM-UBT3S, PLANEX BT-Mini2EDR を使ってみました。

・システム → システム管理 → Synaptic パッケージマネージャー
・gnome-bluetooth をインストール指定 → 適用
・いったんログアウトして再ログイン

アダプタを接続すると通知スペースに Bluetooth のアイコンが表示されるので
そこからペアリング等を行います。または システム → 設定 → Bluetooth 。

ペアリングしたもの。
マウス SONY VGP-BMS33, キーボード REUDO RBK-2100BTJ

二回ほどサスペンド後にアダプタを認識してないことがありましたが、
電源入れ直し等で復活。以降は今のところ動いています。


●キーボード

購入時からキーボードの配列のカスタマイズを考えていました。
本当は uinput を使いたいのですが module uinput.ko が無かったので取りあえず
xmodmap を使います。

$ xmodmap -pke > $HOME/.Xmodmap

以降 .Xmodmap の書き換えでキー配列の入れ替えができます。
書き換えた内容はログインし直しで適用されるはずです。
その場で確認するなら

$ xmdomap $HOME/.Xmodmap

上のコマンド実行だけだとサスペンド後に配列が戻ってしまいます。
再ログインしておけばサスペンド後も有効となります。
$HOME に .Xmodmap で始まるファイルが複数ある場合、ログイン時にどれを用いるか
選択画面が出ます。

実際に設定してみます。
例えば [/?] (61) と [;+] (47) を入れ替えるなら 61 と 47 を交換します。

!keycode  47 = semicolon plus semicolon plus semicolon plus
keycode  61 = semicolon plus semicolon plus semicolon plus

!keycode  61 = slash question slash question slash question
keycode  47 = slash question slash question slash question

Shift や Control キーを入れ替える場合はモディファイヤの再登録が必要です。

[ J ][ K ][ L ][/? ][Ent]
 [ M ][<,][>.][ ↑ ][Sft]

  ↓

[ J ][ K ][ L ][;+ ][Ent]
 [ M ][<,][>.][ /? ][ ↑]

例えば内蔵キーボードの右下部分を上記のように並べ替えるには

! ファイル先頭で remove
remove shift = Shift_R

!keycode  47 = semicolon plus semicolon plus semicolon plus
keycode  61 = semicolon plus semicolon plus semicolon plus

!keycode  61 = slash question slash question slash question
keycode  111 = slash question slash question slash question

!keycode  62 = Shift_R NoSymbol Shift_R NoSymbol Shift_R
keycode  47 = Shift_R NoSymbol Shift_R NoSymbol Shift_R

!keycode 111 = Up NoSymbol Up NoSymbol Up
keycode 62 = Up NoSymbol Up NoSymbol Up

! ファイル最後で add し直し
add shift = Shift_R


●キーボードカスタマイズ uinput

User Input を利用するとプログラムでキーの挙動をカスタマイズすることが可能です。
下記のページを参考にさせていただきました。

Linux Input Subsystemの使い方

x86 PC の Ubuntu 上で試してみました。
入力を遅延判定させた場合のバッファリングとかそのフラッシュなど、Windows /
WindowsMobile 上で ctrlswapminiem1key を作っていたときとほとんど同じ感覚です。
おそらく同等のプログラムの移植も可能だと思います。
日本語入力の状態が取得できれば親指シフト入力も対応できるでしょう。

(2009/10/03 追記: 親指シフトについてはこちらをどうぞ)

NetWalker 向けのプログラムも作ったのですが uinput が使えずまだ試しておりません。
実際のプログラム例は下記の通りです。
これは [A] と [B] を交換するだけです。サンプルにあった hook_main.c/.h をそのまま
使わせていただきました。hook_main.c をリンクするだけで動作します。

// swap_AB.c
// swap_AB /dev/input/event*
#include  <stdio.h>
#include  <linux/input.h>
#include  <linux/uinput.h>
#include  <sys/ioctl.h>
#include  "hook_main.h"

const char*  name= "swap_AB";
const char*  version_information= "swap_AB";
const char*  description= "swap_AB";

static int   keyboard_fd= 0;

void* init_event_handler( int number_of_event_device_files, int* event_fds )
{
    ioctl( keyboard_fd= *event_fds, EVIOCGRAB, 1 );
    return  NULL;
}

void finalize_event_hander( void* user_data )
{
    ioctl( keyboard_fd, EVIOCGRAB, 0 );
}

void handle_event( int fd, struct input_event event, void* user_data )
{
    int	vk= event.code;
    if( event.type == EV_KEY ){
        switch( vk ){
        case KEY_A:
            vk= KEY_B;
            break;
        case KEY_B:
            vk= KEY_A;
            break;
        }
    }
    send_event( event.type, vk, event.value );
}

void set_event_bits( int ui_fd )
{
    int	i;
    ioctl( ui_fd, UI_SET_EVBIT, EV_KEY );
    for( i= 0 ; i< 256 ; i++ ){
        ioctl( ui_fd, UI_SET_KEYBIT, i );
    }
}


●その他気がついたことなど

最初すぐにバッテリーが減ったように見えるけど、ステータスでは「バッテリー容量:中」。
容量とアイコンの見た目が合っていません。

フラッシュメモリの容量は 4GB ですが、初期状態の空きはおよそ 2.7GB でした。
カタログには「ユーザーエリア 2GB」と書かれているので若干余裕があります。

RAM 容量は 512MB、利用可能な空間は 480MB。
Firefox、ドキュメントビューア、コンソールを起動して消費メモリは 200MB くらい。
ページを複数開いてもまだまだ大丈夫です。

「パネルへ追加」から「CPU 周波数の計測モニタ」を追加してみました。
CPU クロックはピーク時 800MHz で、アイドル時は 160MHz まで落ちているようです。

上パネルの時計の設定から都市を登録しておくと天気や温度も表示されます。

[Fn]+[8] で画面のバックライトだけ消すことが可能です。

黒い色を買ったせいか汚れは結構目立ちます。
ストラップをつけられるのは便利です。手でもって使う場合も安心。

仕様一覧によるとフレームバッファは 16bit 65536色です。


関連エントリ
NetWalker PC-Z1 意外にいける
Netwalker PC-Z1 買いました
タッチタイプの境界
NetWalker PC-Z1


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