JR-100とは

JR-100

JR-100は昭和56年に松下電器産業から発売された8bitマイコンである。定価は54800円。当時の日本のマイコンは「80系」と「68系」のどちらかで呼ばれることが多かったが、JR-100は6802互換のCPUである富士通のMB8861を搭載した「68系」である。
なお実際には松下通信工業株式会社(現パナソニックモバイルコミュニケーションズ株式会社)・電卓事業部が開発に携わっている。

このマシンの特徴は消しゴムキーボードとユーザ定義文字である。特にユーザ定義文字は高機能とはいえないJR-100で多くのゲームが作られた要因となったと考えられる。 ユーザ定義文字とは、特定のメモリアドレスに書きこんだ内容が文字のドットパターンとして反映された文字群で、プログラム中で自由に扱える。JR-100では32文字分の定義が行える。

JR-100: 全体

ハードウェア仕様

カタログスペック

CPU MN1800(6802相当) 890kHz とカタログに書いてあるが実際はMB8861
ROM 8KB
RAM 16KB(拡張バスを通じて32KBまで拡張可能)
VRAM 1KB
キーボード ソフトウェアスキャン。45キー。SHIFT, CTRL併用による5段シフト
画面構成 24行×32文字 モノクロ表示
文字構成 5×7ドットマトリックス文字 64種
8×8ドットセミグラフィック文字 64種
ユーザ定義 8×8ドットマトリックス文字 32種
ディスプレイインターフェース アトリビュート反転機能
コンポジットビデオ信号(75オーム1Vpp)またはRFコンバータ使用
カセットインターフェース FSK方式1200Hz(スペース)、2400Hz(マーク)
ボーレート600ボー

構成部品

CPU MB8861H (6800上位互換) 富士通のセカンドソース(オリジナル6800に独自拡張)
RAM M5K4116P-3 × 8個 (16KB) DRAM
ROM MB8364 × 1個 (8KB) EEPROM?
CRTコントローラ MB14392 おそらくカスタムのCRTコントローラ
VIA SY6522 入出力用のLSI
VRAM MN2114 × 2個 4bit×1024word, SRAM

まだまだ調査が足りないです。特にCRTコントローラと思われるMB14392の詳細な仕様が分かりません。JR-100向けのカスタムチップかもしれませんが。

また各LSIのデータシートをお持ちで、譲ってもよいという方、ご連絡をお待ちしています。

カセットインターフェース回路

カセットインターフェース回路の入力側を調べました。この回路を一言で言うとコンパレータ(2903)に音を入力して0Vと5Vの出力を得るA/Dコンバータです。この回路の特性を計算するためにPSPICE(Student版)でモデルを作って解析してみました。以下に回路図を示します。

PSPICE解析用カセットインターフェース回路
PSPICE解析用カセットインターフェース回路
回路図ではIC22がOPアンプのLM324となっていますが、シミュレーションではLM2903のモデルで行っています(実際の回路でも2903が使われている)。またダイオードD2とD3の実際の型番は不明ですので、適当なモデルを選びました。その他の抵抗とコンデンサの値は実際の値と同じにしてあります。

実際の回路では、コンパレータの出力が6522(VIA)の割り込み制御ピンにつながっていて、立ち上がりと立ち下がりのエッジを検出するようになっています。 カセットからの入力はR20の左側につながっています。シミュレーションでは、入力として1Vの方形波(V4)と振幅が0.3Vで周波数が10kHzのノイズ(V5)を与えます。

D2とD3をアノードとカソードをたすきに接続して入力電圧をクリップしているのかな?

さて、この回路をシミュレートした結果を以下に示します。

シミュレーション結果
シミュレーション結果

ちょっと見にくいですが、緑の波形が入力、赤が出力です。入力が1Vと-1付近にあるときは出力がそれぞれ-5Vと5Vに飽和していることが分かります。ただし入力が0V付近のときは、ノイズが増幅されて出力に出てきています。

ソフトウェア関連

メモリマップ

JR-100で利用できるアドレス空間は$0000〜$FFFFまでの64KBであり、以下の表のように使われる。

用途 開始アドレス 終了アドレス 備考
RAM $0000 $00FF BASICインタプリタ作業領域
$0100 $0245 スタック領域
$0246 $3FFF BASICプログラム領域
拡張RAM $4000 $7FFF 拡張BOXにより増設
拡張ROM $8000 $BFFF 拡張BOXにより増設; 2732相当品×4
ユーザ定義文字 $C000 $C0FF ユーザ定義文字
VRAM $C100 $C3FF CRT用ビデオRAM
(予備) $C400 $C7FF (予備)
I/O $C800 $C80F カセット/キーボード I/Oポート; 6522レジスタ
(予備) $C810 $CBFF
拡張I/Oポート $CC00 $CFFF 拡張BOXにより増設
プリンタ制御用ROM $D000 $D7FF 拡張BOXにより増設
増設機器用ROM $D800 $DFFF 拡張BOXにより増設; 2716相当品
キャラクタビットマップROM $E000 $E3FF
BASIC ROM $E400 $FFFF BASICインタプリタ格納

ビデオRAM

ビデオRAMは$C100〜$C3FFにマップされていて、これらのアドレスにデータを書き込むと、そのデータに対応する文字がアドレスに対応する位置に表示される。画面左上を原点(0, 0)とする座標(X, Y)とメモリアドレスAの対応関係は以下の通り。

アドレス = $C100 + X + Y * $20

ビデオメモリマップ
ビデオメモリマップ
この、横幅が32($20)文字というのをBASICインタプリタ内部では活用しています。たとえばカーソルを行の左端に移動させたいときは、カーソルアドレスの下位8ビットに$20をANDさせればよいことになり、このようなコードをあちこちで使用しています。

JR-100ではビデオRAMに書き込むコードとBASICのコマンドから与える文字Iコードは同一ではありません。キャラクタビットマップのところで示しているのは文字コードです。 以下に文字コードとビデオRAMのコードの関係を示します。

ビデオRAMコード 文字コード
$00〜$3F $20〜$5F
$40〜$5F $80〜$9F
$60〜$7F $E0〜$FF
$80〜$BF $20〜$5F(反転文字またはユーザ定義文字)
$C0〜$DF $80〜$9F(反転文字またはユーザ定義文字)
$E0〜$FF $E0〜$FF(反転文字またはユーザ定義文字)

BASICから反転文字を表示する場合、例えば”0″(文字コード$31)に対しては

のようにFLD関数を使いますが、POKE文で直接ビデオRAMに数値を書き込む場合は、

のようにビデオRAMコードを指定すれば表示できます。マシン語から反転文字やユーザ定義文字を表示させる場合に使うテクニックとなります。

なおBASICでビデオRAMコードと文字コードを変換する場合は次のようにすればよいです。

ユーザ定義文字

ユーザ定義文字は$C000〜$C0FFにマッピングされています。一文字当たり8バイト必要ですので、合計256 / 8 = 32文字分のユーザ定義文字を作ることができます。

しかし、実は$C100〜$C3FFの内容に応じて、さらに96文字分のユーザ定義文字を作ることもできます。この領域は前述の通りビデオRAM領域ですので、画面を書き換えるとユーザ定義文字の内容も変わってしまうという問題があり、あまり使途はないでしょう。

ユーザ定義文字のメモリマップ
ユーザ定義文字のメモリマップ
しかし例えば次の条件を満たせば新たに4文字のユーザ定義文字を使うことができます。
  • 画面の1行目を絶対に書き換えない。
  • 画面の1行目にノイズのような表示があっても気にならない。

I/O制御

JR-100でI/O制御を担当しているVIA(6522)のレジスタは$C800〜$C80Fにマップされている。アドレスとレジスタの対応は以下の通り。

アドレス レジスタ番号 レジスタ名
$C800 0 ORB/IRB
$C801 1 ORA/IRA
$C802 2 DDRB
$C803 3 DDRA
$C804 4 T1C-L
$C805 5 T1C-H
$C806 6 T1L-L
$C807 7 T1L-H
$C808 8 T2C-L
$C809 9 T2C-H
$C80A A SR
$C80B B ACR
$C80C C PCR
$C80D D IFR
$C80E E IER
$C80F F ORA/IRA

レジスタの意味については後日報告します。

JR-100では、任意の周波数の音声を出力する場合にこれらのレジスタを操作する必要があります。逆に、これらのレジスタを操作しないと音階を制御できません。具体的には、6522のタイマT1を用いて、方形波を出力します。

詳細は省略しますが、周波数Fの方形波を出力する場合、以下の式で求めた値をT1C-LとT1C-Hにセットした上で、ACRに$E0をセットすることで音の出力が始まり、ACRに$00をセットすると音出力が停止します。

C = 447443.12 / F ( = 894886.25 / F / 2) として、
T1C-L = C % 256 (Cの下位8ビット)
T1C-H = C / 256 (Cの上位8ビット)

例えば、880Hz(ラの音)を出したい場合は、C = 508となり、これを16進数で表すと$01FCとなりますので、

とすることで880Hzの方形波がスピーカから出力されます。なお$C804よりも$C805の方を後にセットしないと一瞬おかしな音がでることがあることに注意。6522のタイマ1の初期値は、T1C-Hへの値の代入と同時に行われるためです。

ここで、Cを求める式を簡単に説明しておきます。

JR-100のシステムクロックは894.88625kHz(14.31818MHzの水晶発信子の出力を16分周)となっていて、6522のタイマの基準となるクロックとしてその周波数が入力されます。 6522のタイマ1を、最初に設定したタイマ値が0になるたびに方形波出力ピン(PB7)の状態を反転させるように使っているので、結局タイマ1が2周すると方形波1周期分が生成されることになります。 したがって、システムクロックをFs、設定するタイマ値をCとすると、

タイマ1の2周分の時間 (1/Fs * C * 2) = 方形波1周期分の時間 (1/F)

したがって、

C = Fs / (2 * F) = 447443.12 / F

となります。

コントロールキーによる入力について

JR-100では、コントロールキーとアルファベットキーなどとを同時に押すことで、カーソル移動やスクリーンエディット機能を利用したり、BASICコマンドを簡単に入力できます。特にBASICコマンドの入力は、タッチタイプがしにくいJR-100のキーボードでBASICプログラムの入力をするのに非常に助けになります。

以下にマッピングを示します。

標準入力キー コントロールマッピング
1 (HOME)
2 VERIFY
3 SAVE
4 LOAD
5 (DELETE)
6 (←)
7 (↓)
8 (↑)
9 (→)
0 (INSERT)
(RUBOUT)
Q GOSUB
W RET
E END
R RUN
T THEN
Y LOCATE
U IF
I INPUT
O OPTION
P PRINT
A AUTO
S STOP
D DIM
F FOR
G GOTO
H POKE
J RND(
K READ
L LIST
; CHR$(
: REM
Z (L.INS)
X (CANCEL)
C (BREAK)
V (GRAPH)
B HCOPY
N NEXT
M CLS
, DATA
. PEEK(

括弧内はスクリーンエディット機能の呼び出しを表します。例えば「コントロール+6」でカーソルが左に移動します。 また括弧のついていないものはBASICコマンドの入力を表し、例えば「コントロール+P」でカーソル位置に「PRINT」という文字列が入力されます。

キャラクタビットマップ

JR-100の文字のビットマップを取り込んだものを以下に示します。

キャラクタコードのマップ
キャラクタコードのマップ

表の列が上位バイトを、行が下位バイトを表します。たとえば、$47というコードは`G’の文字を表します。

表から分かるように数字やアルファベットのほかに、グラフィック文字がデフォルトで多く用意されています。UFOや人型、トランプマーク、矢印などは自作プログラムで多用したのを覚えています。

なお、JR-100のキャラクタデータはアドレス$E000〜$E3FFに保存されています。実機をお持ちの方は覗いてみて下さい。

画像ライブラリ

まずJR-100の全景。写真の上に見えているのは自分で付けたリセットスイッチです。写真では分かりにくいのですが、キートップはすべてゴム製で、これが「消しゴムキーボード」と呼ばれた所以です。 PRINTやNEW、RUNのようなBASICの命令が各キーに割り当てられており、コントロールキーと一緒に押すことで一発で入力できます。まだタッチタイプができなかった当時は重宝しました。

私の持っているJR-100。自製のリセットスイッチが見える。
私の持っているJR-100。自製のリセットスイッチが見える。

次に蓋をあけたところ。主基板とキーボードはフラットケーブルで接続されています。

カバーを開けたところ
カバーを開けたところ

主基板はこんな感じ。CPUやメモリ以外は普通のTTLが使われています。部品点数が多くないので、これくらいなら基板のパターンから回路図を復元することができそうです。

主基板
主基板

CPUとVRAMを拡大したところ。JR-100のCPUであるMB8861(上)とVRAMである2114(右下)です。

CPUとVRAMの拡大図
CPUとVRAMの拡大図

メインRAMとして、4116が8個左上にあります。16kビット×8個で16KBとなります。

主メモリ
主メモリ

CPUの左側には謎のLSIが二つ並んでいます。これが何者なのかまだ分かっていません。ご存じのかたはご一報ください。CRTコントローラではないかと思っているのですが。

謎のLSI。CRTC?
謎のLSI。CRTC?

基盤の裏側で、CPUのリセット信号に関するピンとアースとをスイッチを介して結び、パターンを一ヶ所切断しています。当時中学生だった私はよく秋葉原でパーツを買ってきては電子工作していたため半田づけすることには自信があったのですが、さすがにパソコンの基板に手を入れるのは勇気がいりました。

基盤の裏側
基盤の裏側

エミュレータ

思い余ってJR-100エミュレータを作っています。詳細はJR-100エミュレータを見てください。

旧ページでいただいたコメント

  • SY6522のデータシートを発見しました。ご報告まで(^^) http://www.6502.org/documents/datasheets/synertek/まりす 2009-05-02 (土) 13:54:37
  • あれ?探されていたのはMB14392の方でしたね(^^;;不要でしたらコメント削除してください。 — まりす 2009-05-02 (土) 14:01:41
  • 情報ありがとうございます。6522の資料は持っていました。MB14392の方はほとんどあきらめています(^^; — けむしろう 2009-05-25 (月) 01:25:13
  • 拡張ユニットのマニュアルを発掘しました。メモリマップの補完をしておきます。 — まりす? 2010-02-21 (日) 04:20:53
  • $D000-$D7FF プリンタ制御用PROM — まりす 2010-02-21 (日) 04:23:07
  • $D800-$DFFF 増設機器用ROM(2716相当品) 2KB — まりす 2010-02-21 (日) 04:24:00
  • $8000-$BFFF ユーザー用PROM(2732相当品×4) 16KB — まりす 2010-02-21 (日) 04:25:08
  • $CC02 ジョイスティック入力レジスタ bit7,6:不定, bit5:0, bit4Switch, bit3:Down, bit2:Up, bit1:Left, bit0:Right — まりす 2010-02-21 (日) 04:28:23
  • ジョイスティックの各ボタン→bitは正論理(ON:1,OFF:0)です。 — まりす? 2010-02-21 (日) 04:31:23
  • まりすさん、貴重な情報ありがとうございます。私も拡張BOXは持っているのですがマニュアルが無くて調査に手間取っていました。 — けむしろう 2010-02-28 (日) 22:46:36
  • 懐かしいですねえ、JR-100。熱暴走?で壊れてしまい、捨ててしまいましたが、雑誌のプログラムを打ち込んだり自分でプログラムを作って遊びました・・・。 — りん 2010-03-22 (月) 07:48:57
  • りんさん、それを捨ててしまうなんてもったいない……。また入手できるといいですね。 — けむしろう 2010-03-29 (月) 00:45:49
  • を参照してhttp://www.old-computers.com/museum/computer.asp?st=1&c=320ジュニア- 100の詳細については — Murray Moffatt? 2010-08-13 (金) 08:32:20
  • こんにちは。久しぶりにJR-100で検索したらこちらにたどりつきました。プロフィール拝見しましたが、びっくりするくらい私もよく似た道を歩んでいますw。ベーマガでもがんばってたんですがねw。JR-100まだ自宅にありますよん。やっぱ愛着ありますよね。 — 伊藤武司 2011-05-20 (金) 22:50:29
  • こちらの情報を基にジョイスティックインターフェイスを作りました。IOアドレス$CC02正論理で正しく動作しました。 — にが 2016-07-23 (土) 23:09:44
  • 自サイトに製作記事をアップしています. — にが 2016-07-23 (土) 23:10:13
  • http://niga2.sytes.net/msx/index.html MSXを利用してCMT信号を実機に流し込むソフトも公開しています。 — にが 2016-07-23 (土) 23:12:57

投稿者: kemusiro

プログラミング、サーバ構築、電子工作、旅行が好きです。

コメントを残す

メールアドレスが公開されることはありません。