JR-100とは

jr100.jpg

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

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

ハードウェア仕様

カタログスペック

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

構成部品

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

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

また各LSIのデータシートをお持ちで、譲ってもよいというかたがいらっしゃったらけむしろうまでご連絡ください。

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

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

なおPSPICEは日本語版を買うと数十万円するのですが、私は無料のStudent版(英語)を使っています。これでも簡単な回路の解析をするには十分です。

curcuit.png

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

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

私はハードウェアについては素人ですので回路の解説はできません。知っているのは、D2とD3をアノードとカソードをたすきに接続して入力電圧をクリップしていることくらいです。まだまだ勉強が足りません。

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

result.png

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

ソフトウェア関連

メモリマップ

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

用途開始アドレス終了アドレス備考
RAM$0000$00FFBASICインタプリタ作業領域
$0100$0245スタック領域
$0246$3FFFBASICプログラム領域
拡張RAM$4000$7FFF拡張BOXにより増設
拡張ROM$8000$BFFF拡張BOXにより増設; 2732相当品×4
ユーザ定義文字$C000$C0FFユーザ定義文字
VRAM$C100$C3FFCRT用ビデオ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$FFFFBASICインタプリタ格納

ビデオRAM

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

A = $C100 + X + Y * $20

display.gif

この、横幅が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)に対しては

LOCATE Y,X:PRINT FLD(1);"0"

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

POKE $C100+X+Y*$20, $91

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

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

ユーザ定義文字

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

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

font.gif

しかし例えば次の条件を満たせば新たに4文字のユーザ定義文字を使うことができます。

  • 画面の1行目を絶対に書き換えない。
  • 画面の1行目にノイズのような表示があっても気にならない。

I/O制御

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

アドレスレジスタ番号レジスタ名
$C8000ORB/IRB
$C8011ORA/IRA
$C8022DDRB
$C8033DDRA
$C8044T1C-L
$C8055T1C-H
$C8066T1L-L
$C8077T1L-H
$C8088T2C-L
$C8099T2C-H
$C80AASR
$C80BBACR
$C80CCPCR
$C80DDIFR
$C80EEIER
$C80FFORA/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となりますので、

POKE $C80B,$E0:POKE $C804,$FC:POKE $C805,$01

とすることで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)
2VERIFY
3SAVE
4LOAD
5(DELETE)
6(←)
7(↓)
8(↑)
9(→)
0(INSERT)
-(RUBOUT)
QGOSUB
WRET
EEND
RRUN
TTHEN
YLOCATE
UIF
IINPUT
OOPTION
PPRINT
AAUTO
SSTOP
DDIM
FFOR
GGOTO
HPOKE
JRND(
KREAD
LLIST
;CHR$(
:REM
Z(L.INS)
X(CANCEL)
C(BREAK)
V(GRAPH)
BHCOPY
NNEXT
MCLS
,DATA
.PEEK(

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

キャラクタビットマップ

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

table.png

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

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

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

画像ライブラリ

JR-100の全景

jr100a.jpg

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

ふたをあけたところ

jr100b.jpg

主基板とキーボードはフラットケーブルで接続されています。

主基板

jr100c.jpg

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

CPUとVRAM

jr100d.jpg

JR-100のCPUであるMB8861(上)とVRAMである2114(右下)です。

メインRAM

jr100e.jpg

主メモリの4116が8個左上にあります。16kビット×8個で16KBとなります。

謎のLSI(たぶんCRTC)

jr100f.jpg

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

基板の裏側

jr100g.jpg

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

エミュレータ

  • 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


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-05-20 (金) 22:50:29 (1834d)