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 へ戻る