JR−100
マカオさんの協力感謝します。
サウンド、テープへ
JR-100のスペック
MPU | MB8861N 89488Hz |
SOUND | VIAを使用した方形波 1声 |
ROM | 8K(拡張可) |
RAM | 16KB(拡張可) |
MPUはMB8861Nを使用
周辺デバイスはVIA 6522が画面以外を受け持つようになり非常にコストパフォーマンスが高い
低価格機種にありがちなすぐにメモリ不足に悩まされる事もない
不満点としてリアルタイマ割り込みが欲しかったのとリセットスイッチが無い事ぐらい
BASICのコマンドにRESET命令があるがあまり意味が無い
拡張ROM
少なくともプリンタの制御ROMは外部から載せられる様に設計されており
$D000が$00だったらプリンタ制御ROMがあると判断して
$D001はイニシャライズ
$D004は1文字出力
$D007はHCOPYのフックとなっているようです
拡張RAM
16Kバイト拡張可能で外部バスを通して拡張します。
またBASICで本体内のRAMと連続してチェックしている事から
アドレスは$4000ー$7FFFになります(拡張端子からD−RAMを接続可)
割り込み
本体内では使用していません外部端子にでています
またRAM上に飛ぶのでフックで拡張ハード用の設定が出来るようになっています
本体のみのBASICの設定では全てBASICのコマンド待ちへ飛ぶようになっています
MB8861Nのロットによっては38ピンの動作が違い、割り込み関係が変わるのですが
38ピンはオープン、本体では割り込みを使用しないので気にする事はありません
$00F7:IRQ($E5A3)
$00FA:SWI($E5A3)
$00D7:NMI($E5A3)
PCG、VRAM
アスキーコードとVRAMコード
アスキーコード内のコントロールコード
$03 BREAK $10 DEL
$08 RUBOUT $11 カーソル下
$09 INS $12 カーソル上
$0B GRAPH $13 カーソル右
$0C HOME $14 カーソル左
$0D RETURN $18 CANSEL
$19 L.INS
$1A HCOPY
アスキーコード$80(VRAMコード$40)は画面クリアの文字
アスキーコード$EA(VRAMコード$6A)はカーソルの文字
$C000−$C3FFまで$C000−$C0FFがPCG定義領域
サイクルスチールによりMPUを止める事なく定義、表示が可能のようです
$C000−$C0FFまでが実質定義エリアで$C100−$C3FFが表示エリア(VRAM)
128キャラクタ中$00−$1Fの32キャラクタを定義出来るようになっています
33キャラクタデータ以降は表示エリア(VRAM)と重なる形になっています
つまり$20以降のPCG定義データが画面にキャラクタコードとして表示される事になります
VRAMデータBit7でハードで反転文字やPCGにするようになっています(CMODEで切り換わる)

テキストは32×24
6522 VIA
パラレルポートではキーボード、サウンド、カセット、CGROMの切り換えを行います
タイマはサウンド、カセットで使用します
I/Oは$C800−$C80Fまでになります
PB7で方形波を出力、PB6でチェックしています
$C800:PB出力 ORB
d7: −
d6: −
d5:CMODE
d4: −
d3: −
d2: −
d1: −
d0: −
$C800:PB入力 IRB
d7:BEEP
d6:BEEP
d5: −
d4:キーデータ D4
d3:キーデータ D3
d2:キーデータ D2
d1:キーデータ D1
d0:キーデータ D0
$C801:PA出力 ORA
d7: −
d6: −
d5: −
d4: −
d3:キーセレクト D3
d2:キーセレクト D2
d1:キーセレクト D1
d0:キーセレクト D0
$C801:PA入力 IRA
d7:未使用
d6:未使用
d5:未使用
d4:未使用
d3: −
d2: −
d1: −
d0: −
$C802:PBデータ方向 DDRB 1=出力、0=入力
d7:0 PB7 入力
d6:0 PB6 入力
d5:1 PB5 出力
d4:0 PB4 入力
d3:0 PB3 入力
d2:0 PB2 入力
d1:0 PB1 入力
d0:0 PB0 入力
$C803:PAデータ方向 DDRA 1=出力、0=入力
d7:0 PA7 入力
d6:0 PA6 入力
d5:0 PA5 入力
d4:1 PA4 出力
d3:1 PA3 出力
d2:1 PA2 出力
d1:1 PA1 出力
d0:1 PA0 出力
$C804:T1L−L(出力) ラッチ下位書き込み
T1C−L(入力) カウンタ下位読み込み、T1割り込みフラグ リセット
$C805:T1C−H(出力) ラッチ上位、カウンタ上位書き込み、ラッチカウンタ下位へ転送
T1割り込みフラグ リセット
(入力) 上位カウンタ読み込み
$C806:T1L−L(出力) ラッチ下位書き込み
(入力) ラッチ下位読み込み
$C807:T1L−H(出力) カウンタ上位書き込み、T1割り込みフラグ リセット
(入力) ラッチ上位読み込み
$C808:T2L−L(出力)
T2C−L(入力)
$C809:T2C−H(出力)
(入力)
$C80A:SR(シフト・レジスタ)
CMT ’0’を書き込む場合$66
’1’を書き込む場合$AA
$C80B:ACR(補助コントロールレジスタ)
d7:T1コントロール
d6:T1コントロール
d5:T2コントロール
d4:シフトレジスタコントロール
d3:シフトレジスタコントロール
d2:シフトレジスタコントロール
d1:PBラッチイネーブル
d0:PAラッチイネーブル
T1コントロール
11=フリーランニング連続割り込み発生、PB7=パルス出力
10=ワンショットモード 、PB7=パルス出力
01=連続割り込み発生 、PB7=ディスエーブル
* 00=ワンショットモード 、PB7=ディスエーブル
T2コントロール
1=PB6の入力パルスを設定した数だけカウント
* 0=ワンショットモードのインターバルタイマ
シフトレジスタコントロール
111=外部クロックによる シフト出力
110=システムクロックによる シフト出力
101=タイマ2による シフト出力
100=タイマ2によるフリーランニング出力
011=外部クロックによる シフト入力
010=システムクロックによる シフト入力
001=タイマ2による シフト入力
*000=シフトレジスタ ディスエーブル入力
PBラッチイネーブル
1=CB1により入力または出力をラッチ
0=出力データがラッチ
PAラッチイネーブル
1=CA1により入力または出力をラッチ
0=出力データがラッチ
$C80C:PCR(ペリフェラルコントロールレジスタ)
d7:CB2コントロール
d6:CB2コントロール
d5:CB2コントロール
d4:CB1コントロール
d3:CA2コントロール
d2:CA2コントロール
d1:CA2コントロール
d0:CA1コントロール
CB2コントロール
*111=マニュアル出力モード CB2をHにする
110=マニュアル出力モード CB2をLにする
101=パルス出力モード ORB書き込み後の1サイクルだけCB2がLになる
100=ハンドシェイク出力モード CB2はORB書き込みでL
CB1入力パルスのアクティブ・トランジシマンでH
011=単独割込み入力モード IFR3はCB2入力パルスの立ち上がりでセット
ORBの読み書きでクリアされない
010=割込み入力モード IFR3はCB2入力パルスの立ち上がりでセット
ORBの読み書きでクリア
001=単独割込み入力モード IFR3はCB2入力パルスの立ち下がりでセット
ORBの読み書きでクリアされない
000=割込み入力モード IFR3はCB2入力パルスの立ち下がりでセット
ORBの読み書きでクリア
CB1コントロール
* 1=CB1の割込み入力のアクティブトランジョン 立ち上がりセット
0=CB1の割込み入力のアクティブトランジョン 立ち下りでセット
CA2コントロール
*111=マニュアル出力モード CA2をHにする
110=マニュアル出力モード CA2をLにする
101=パルス出力モード ORA書き込み後の1サイクルだけCA2がLになる
100=ハンドシェイク出力モード CA2はORA書き込みでL
CA1入力パルスのアクティブ・トランジシマンでH
011=独立割込み入力モード IFR0はCA2入力パルスの立ち上がりでセット
ORAの読み書きでクリアされない
010=入力モード IFR0はCA2入力パルスの立ち上がりでセット
ORAの読み書きでクリア
001=独立割込み入力モード IFR0はCA2入力パルスの立ち下がりでセット
ORAの読み書きでクリアされない
000=入力モード IFR0はCA2入力パルスの立ち下がりでセット
ORAの読み書きでクリア
CA1コントロール
1=CA1の割込み入力のアクティブトランジョン 立ち上がりセット
* 0=CA1の割込み入力のアクティブトランジョン 立ち下りでセット
$C80D:IFR
d7:1=割込み有り 、割込み無し
d6:1=T1のタイムアウト 、0=T1下位カウンタまたは上位カウンタの書き込みを行った
d5:1=T2のタイムアウト 、0=T2下位カウンタまたは上位カウンタの書き込みを行った
d4:1=CB1のアクティブトランジョン、0=ORBの読み書きを行った
d3:1=CB2のアクティブトランジョン、0=ORBの読み書きを行った
d2:1=シフト8回終了 、0=SR の読み書きを行った
d1:1=CA1のアクティブトランジョン、0=ORAの読み書きを行った
d0:1=CA2のアクティブトランジョン、0=ORAの読み書きを行った
$C80E:IER
d7:セットモード 1=セット 、0=リセット (入力では常に0)
d6:T1割込み 1=指定する、0=指定しない
d5:T2割込み 1=指定する、0=指定しない
d4:CB1割込み 1=指定する、0=指定しない
d3:CB2割込み 1=指定する、0=指定しない
d2:SR割込み 1=指定する、0=指定しない
d1:CA1割込み 1=指定する、0=指定しない
d0:CA2割込み 1=指定する、0=指定しない
$C80F:ORA ハンドシェイクに影響されない
キーボード
VIAポートAのBit3−0がキーセレクト出力
VIAポートBのBit4−0がキーデータ入力となります
$C801にキーセレクト0−8を出力して
$C800のBit4−0を読めばキーデータが読めます
1=押されていない
0=押されている
クロックジェネレータ兼CRTC
拡張端子のEAnは16KB拡張RAM用のアドレスになります
メモリマップ
解析ROMはV1.0 CRC:951d08a1
$0000−$3FFF 本体内RAM 16Kバイト
$4000−$7FFF 拡張RAM 16Kバイト
$8000−$BFFF 拡張ROM 16Kバイト
$C000−$CFFF I/O領域
$C000−$C0FF PCG定義用エリア
$C100−$C3FF PCG定義用エリア 兼VRAM
$C400−$C7FF 不明 (空き?)
$C800−$CBFF 本体内 I/Oポート
$CC00−$CFFF 拡張用 I/Oポート
$D000−$D7FF 拡張ROM 2Kバイト(プリンタ用)
$D800−$DFFF 拡張ROM 2Kバイト
$E000−$FFFF 本体内ROM 8Kバイト
$0000 :キークリック $00=オフ、$01=オン
$0001 :BEEP T1Lの値(T1Hは$00で固定) デフォルト値$AA
$0002−$0003:乱数
$0004−$0005:プログラム スタートアドレス $0246
$0006−$0007:プログラム エンドアドレス
$0008−$0009:配列エンドアドレス
$000A−$000B:2文字変数アドレス
$000C−$000D:文字列変数アドレス
$000E−$000F;プログラム サブ用スタック ポインタ
$0010−$0011:FOR、NEXT用スタック ポインタ
$0012−$0013:RAM領域エンドアドレス
$0014 :BASIC フラグ (1でオン)
d7:PICK
d6:LPRINT
d5:文字出力
d4:GRAPH
d3:AUTO
d2:FLD
d1: −
d0:INPUT文
$0015 :空き
$0016−$0017:カーソル ポインタ(VRAMアドレス)
$0018−$0019:画面ポインタ(スクリーンエディット)
$001A−$001B:BASICコマンド ポインタ $F898
$001C−$001D:BASICステートメント ポインタ $F8C9
$001E−$001F:16進数変換、Xレジスタ退避用
$0020−$0021:行番号
$0022−$0023:プログラム ポインタ、キーバッファ ポインタ
$0024−$0025:スタック ポインタ退避
$0026−$0027:行番号ポインタ
$0028−$0029:キーバッファ エンドアドレス
$002A :カーソルに重なる文字
$002B :OVFフラグ
$002C :文字数カウンタ
$002D :符号フラグ
$002E−$002F:DATA文 ポインタ
$0030−$0075:キーバッファ (CMTルーチンと共用)
$0076−$007F:演算用 スタック
$0077 :CMT用 フラグ $00=LOAD、$01=VERIFY
$0080−$0081:演算用 スタックポインタ
$0082−$0083:1文字変数A
$0084−$0085:1文字変数B
$0086−$0087:1文字変数C
$0088−$0089:1文字変数D
$008A−$008B:1文字変数E
$008C−$008D:1文字変数F
$008E−$008F:1文字変数G
$0090−$0091:1文字変数H
$0092−$0093:1文字変数I
$0094−$0095:1文字変数J
$0096−$0097:1文字変数K
$0098−$0099:1文字変数L
$009A−$009B:1文字変数M
$009C−$009D:1文字変数N
$009E−$009F:1文字変数O
$00A0−$00A1:1文字変数P
$00A2−$00A3:1文字変数Q
$00A4−$00A5:1文字変数R
$00A6−$00A7:1文字変数S
$00A8−$00A9:1文字変数T
$00AA−$00AB:1文字変数U
$00AC−$00AD:1文字変数V
$00AE−$00AF:1文字変数W
$00B0−$00B1:1文字変数X
$00B2−$00B3:1文字変数Y
$00B4−$00B5:1文字変数Z
$00B6−$00D3:サブルーチン用 スタック
$00D4−$00E2:演算用ワークエリア
$00E3−$00F6:空き
$00F7−$00F9:IRQフック $E5A3(BASICコマンド待ち)
$00FA−$00FC:SWIフック $E5A3
$00FD−$00FE:NMIフック $E5A3
$0100−$0107:空き
$0108− :FOR、NEXT用 スタック
−$0244:MPUスタック
$0245 :$00
$0246− :BASICプログラム
$E000−$E3FF:キャラクタデータ
$E400 :RESET
$E41E :NEW
$E426 :CLEAR
$E435 :データ クリア
入力:X=クリア($00を書き込む)するデータアドレス
B=長さ
$E504:HCOPY
$E526:AUTO
$E545:STOP
$E5A3:END、BASIC コマンド待ち
$E652:REM
$E698:フリーエリアの計算
出力:B=フリーエリアバイト数 上位
A=フリーエリアバイト数 下位
$E67B:IF
$E6AB:RUN
$E756:LPRINT
$E758:PRINT
$E78F:TAB(
$E901:INITP
$E916:’:’のチェック
入力:X=検索する アドレス
出力:X=見つかったアドレス
A=アスキーデータ
Cf=1 アスキーデータ$00以外($20を除く)
0 $00
Zf=1 アスキーデータ$3A
0 $3A以外
$EE1Bをコールして取得したアスキーデータが’:’($3A)のチェックを行います
$E95C:ABS(
$EB0C:MOD(
$EB2C:RND(
$EB41:USR(
$EC9A:DIM
$EE1B:スキップ スペース、アスキーデータの取得
入力:X=検索する アドレス
出力:X=見つかったアドレス
A=アスキーコード
Zf=1 アスキーデータ$00
0 $00、$20以外
指定したアドレスのデータを取得して
アスキーデータ$20以外が取得されるまでデータを取得します
$EE80:LEFT$(
$EE88:RIGHT$(
$EEA2:MID$(
$EF38:POKE
$EF4D:PEEK(
$EF63:PICK
$EF6F:FRE(
$EF74:SGN(
$EF95:SPC(
$EFAB:LEN(
$EFB7:ASC(
$EFBF:VAL(
$EFD3:FLD(
$EFEA:OPTION
$EFF0:OVF0
$EFF3:OVF1
$EFF7:CMODE0
$EFFA:CMODE1
$F000:BEEP1
$F018:BEEP
$F021:BEEP0
$F033:DATA
$F08B:READ
$F0F3:RESTORE
$F120:FIND”
$F147:HEX$(
$F175:HPOS(
$F185:VPOS(
$F19F:LOCATE
$F1EC:CHR$(
$F1FD:THEN
$F21E:CONT
$F22A:RET
$F255:GOTO
$F256:GOSUB
$F26E:LET
$F294:FOR
$F2F8:NEXT
$F330:X=X+8
入力:X
出力:X+8
$F332:X=X+4
入力:X
出力:X+4
$F333:X=X+3
入力:X
出力:X+3
$F33A:INPUT
$F3BA:空白表示
$F3BC:1文字表示
入力:A=アスキーコード
$F3BF:LLIST
$F3C2:LIST
$F432:文字列表示
入力:X=文字列データ アドレス(エンドマークは最後の文字のBit7を1にする)
文字列はアスキーコード
$F43A:エラー処理
入力:B=エラーNo.$00−$13
出力:$0014=$00 BASIC フラグ
エラー表示、BEEP、表示する行番号があれば表示して
スタックを$0244
BASICのコマンド待ちへジャンプします
$F47C:CLSエントリ
$F47F:VRAMクリア
出力:$0016=$C1 カーソルポジション上位
$0017=$00 カーソルポジション下位
使用:B
$00D9=Xレジスタ退避上位
$00DA=Xレジスタ退避上位
$C100−$C3FFを$40で埋め
カーソルポジションをホームポジション($C100)にします
$F4E3:MLOAD
$F4EF:LOAD
$F4FC:VERIFY
$F508:SAVE
$F517:MSAVE
$F777:スクロール
出力:X=$C3E0
使用:A、B、X
$0016:カーソル ポインタ(VRAMアドレス)上位
$0017:カーソル ポインタ(VRAMアドレス)下位
$0018:画面ポインタ(スクリーンエディット)上位
$0019:画面ポインタ(スクリーンエディット)下位
画面を上へ一行スクロールします
最下位行はアスキー$80(ディスプレイ$40)が埋まります
$F79E:VIA初期化
出力:X=$C800(VIAのポート)
使用:B、X
PA、PBの入出力方向の設定を行ないます
DDRA $C803=$1F
DDRB $C802=$20
$F7A9:BASICキー入力
出力:A=キーデータ(何も押されていない場合は$00)
使用:A、B、X
$0014:BASIC フラグ
$00D9=スタック退避上位
$00DA=スタック退避上位
$00DB=キーインデックス
$00DD=Xレジスタ退避上位
$00DE=Xレジスタ退避上位
$00DF=キーデータ
$00E0=キーセレクト
|
$FA6A−$FAF0 キーマトリクス データ
$FAF1−$FBBF エラーメッセージ
$FC91:CMT1バイトライト、チェックサムの加算
入力:CMTに書き込むアドレス
出力:$0073 加算されたチェックサム
$FCAB:CMT ’1’×nn ライト(スタートビットの書き込み)
入力:B=nn
$FCB1:CMT ビット単位のライト
入力:A=ライトデータ
B=書き込むビット数
1バイト書き込む場合 A=データ、B=$08
’1’を255個書き込む場合 A=$FF、B=$FF
$FCD4:CMT ’1’×255 ライト
$FE47:CMT スタートビットを読む
入力:B=$04
$FE0E:CMT 1バイトリード、チェックサムの加算
出力:A=リードデータ
$0073 加算されたチェックサム
$FED7:CMTオープン
キーセレクト0(^C BREAKのスキャンの為)
ポート$C804−$C80Fの内容をフタックに保存
VIAをCMT用の設定(IER $7F)を行います
$FED7:CMTクローズ
BEEP、オ−プン時に保存したポート$C804−$C80Fをスタックから復活
画面、右上の1文字をクリアを行います
BASICプログラム
BASICプログラムの格納は他機種のような中間言語を使用せず、アスキーで格納されています。
1行は行番号(2バイト)、プログラム(アスキー)、行の終わりは$00
最後の行は、行番号(2バイト)、プログラム(アスキー)、行の終わりは$00、$DF,$DF
プログラムの後に配列になります。
配列は変数名(1バイト)、次の配列のアドレス、パラメータ、パラメータ、配列の内容となり
配列の変数名が$DFで終わりを示します。
配列の後は2文字の変数で、
変数名(2バイト)、内容(2バイト)
変数名が$DFで終わり
次が未使用で$00*34
文字列で変数名(1バイト)、長さ、32文字分の文字列
変数名が$DFで終わりになります。
Home へ戻る