JR−200
密かにFIND氏の協力に感謝します
JR-200のスペック
CPU | MN1800A クロック CRTCの動作によって変化 |
SOUND | MN1271のカウンタによる3声+クリック音 |
ROM | 16K(拡張可) |
RAM | 32KB(拡張可) |
値段のわりにかなりコンパクトにまとまったマシン
JR−100にあった不満が解消されユーザーインタフェイスも向上されている
背面にある音量ボリュームも使い勝手が良い
ただし本体下にあるディップスイッチが少しだけ使い辛いが
あまり使用しないので気にはならない
ただリセットスイッチは欲しかった
ROMバージョン5.00(シリアル20100743)の解析となります
メインCPU MN1800A
1.5MHzタイプでMN6802のクロック周りを変更したものになり
外部クロックと同期を取れる様になっています
MN6802とソフトウェア・フルコンパチとなっています
内蔵RAMは$0000−$007Fの128バイト(32バイトはバックアップ可)
ただしJR−200ではジャンパでNM1800の選択時にLに固定されているので
内臓RAMは使用されていません
クロックはCRTCからTCLKを元に供給されていますが
分周されているわけではありません(CRTCの動作によって変化する
サブCPU MN1544CJR
主にキー入力、アスキーコード変換+JOY端子入力を行いデータをメインCPUに転送します
ただし起動時のみCGデータ、本体下にあるボレートSWのリードを行います
通常キー入力があれば対応するアスキーコード送信、/KONが発生
/KONはMN1271のPI0からIRQとなります
メインCPUはIRQ内の処理でバッファに転送されていきます
転送終了(受信完了)をMN1544へ知らせるには
PB0の/KACK(キーアクノリッジ)を1→0→1
パワーオン時
1.メインCPUから/KTESTを送信
2.サブCPUがROMデータからCGデータをPAへ1バイト送信
/KONを送信
3.メインCPUが/KON割り込みを受け取ったら、データ取得
/KACKを送信
4.これをCGデータ2KB分+ボーレトSW(1バイト)読み込む
通常
1.キーが押されるとサブCPUがそのキーに対応するアスキーコードをPAへ送信
/KONを送信
2.メインCPUが/KON割り込みを受け取ったら、データ取得
/KACKを送信
/KSTAT 1=ニュトラルモード、0=BASICモード
リピートは1から繰り返される
BREAKキーが押された場合は/NMIが発生
JOY端子入力
1./KSTAT=0にしてメインCPUから/KTESTを送信
2.キーが押されるとサブCPUがそのキーに対応するアスキーコードをPAへ送信
/KONを送信
3.メインCPUが/KON割り込みを受け取ったら、データ取得
/KACKを送信 STICK(0)
4.サブCPUがJOY1の内容をPAへ送信、/KONを送信
5.メインCPUが/KON割り込みを受け取ったら、データ取得
/KACKを送信 STICK(1)
6.サブCPUがJOY2の内容をPAへ送信、/KONを送信
7.メインCPUが/KON割り込みを受け取ったら、データ取得
/KACKを送信 STICK(2)
8.通常入力へ
ジョイスティック端子
・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・
|ピン|JOY 1|JOY 2| |
|−−+−−−−−+−−−−−+−−−−−−−−−−−−−−−|
| 1|KIN0 |KIN0 |入力 1=オフ 、0=オン |
| 2|KIN1 |KIN1 |入力 1=オフ 、0=オン |
| 3|KIN2 |KIN2 |入力 1=オフ 、0=オン |
| 4|KIN3 |KIN3 |入力 1=オフ 、0=オン |
| 5|+5V |+5V | |
| |−−−−−+−−−−−+−−−−−−−−−−−−−−−|
| 6|KIN4 |KIN4 |入力 1=オフ 、0=オン |
| 7|KIN5 |KIN5 |入力 1=オフ 、0=オン |
| 8|KST8 |KST9 |出力 1=入力不可、0=入力可|
| 9|GND |GND | |
・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・
注意するのは8番ピンのKSTn
MN1544のキー読み込みの延長上にあり
KSTnが’0’になるとKINnのオン・オフが判るようになっています
よくある連射パッドを繋げるとパッドのGNDが8ピンの場合
他のキー(KST0−7)が選択されるときに’1’になり電源のショートとなります
GNDが9ピンの場合
他のキー(KST0−7)が選択されるときにKIN0〜5は
他のキーストローブのオン・オフをしている事になり
キーボードを押した事と同じになりMN1544は文字を出力する誤動作となります
BASICプログラム入力の不具合
本来なら大丈夫なハズなのにエラーが出てしまう場合があります
<例>PiO ’85年 3月号 WATARIANの場合
210 IF PEEK($7004)<>0 THEN PC=PC+PEEK($7004)*50:
LOCATE 25,9:PRINT PC:SOUND 2000,1
という行はLINE too long errorで
入力出来ませんので本来ならPRINTを?にすれば良いハズですが
今度はSyntax errorが出てしまいます
そこでPEEK($7004)が2つあるので
前半1つをPEEK($0)にします
コレで入力は出来ましたがプログラム通りではありません
今度はMONでモニタに移り、
$0の部分を直接$7004にするのですが
BASICプログラム($0800以降)なので
そのままでは該当する行番号を探すのも大変です
そこで前の行にREM @@@@と入れておくと
ダンプで40 40 40 40がある所が
目当て前の行番号の目印となります
アドレス可変(打ち込みミスやREM分を省略等)の場合があるので
アドレス部分は省略してあります
210行なので$00、$D2がすぐみつかるハズです
その場所の2バイト後ろに
F1 00 00 00
があるハズでPEEK($0)の$0に相当します
コレを$7004相当にするのですが
計算するのも面倒なので
同じ行に$7004相当があるので参照します
F1 8F 60 08
に変更してBASICに戻りLISTをとって確認します
間違いがなければ前の行に入れた目印の行があれば削除します
外部バス端子
DB0〜DB7 入出力 データバス
A0〜A15 出力 アドレスバス
/DRAMSEL 入力 外部DRAMセレクト
/Eφ2 出力 CPUクロックφ2
/DRAMnIN 出力 CRTCから外部DRAMへデータ出力
/DRAMnOUT 入力 外部DRAMからCRTCへデータ入力
ADSEL 出力 メモリアドレスセレクト
TCAS 出力 外部DRAM CASタイミング
/RAS 出力 外部DRAM RASタイミング
/KILL 入力 ROM0禁止信号 ($A000〜$BFFF)
ER//W 出力 CPU リード/ライト
BA 出力 CPU BA
/HALT 入力 CPU HALT
/VMA 出力 CPU VMA反転
/SYSINT 入力 PIA システム割り込み
/USRINT 入力 PIA ユーザー割り込み
/Eφ2S 出力 周辺デバイスクロック
/ERESET 出力 周辺リセット
プリンタ端子
PDATA7〜PDATA0 出力 データバス
/STROBE 出力 ストローブ信号
/INITIAL 出力 H→Lでプリンタの初期化
BUSY 入力 1=BUSY 、0=READY(N.Cの場合0)
PSEL 入力 1=エプソン製、0=松下製 (N.Cの場合0)
*GNDを除く全ての端子はインバータで反転される(片方向通信)
ソフト側でデータ、コントロールは反転し入出力する
そのままPIAからDATA出力すると反転データとして出力される
ただしROMルーチンコールでは反転してアクセスされるので
パラメータは通常のデータとして出力する
RGB/コンポジット出力端子
1:N.C
2:GND
3:VIDEO 出力
4:/HSYNC 出力
5:/VSYNC 出力
6: R 出力
7: G 出力
8: B 出力
テープレコーダ端子
1:GND
2:GND
3:GND
4:REC 出力
5:MON 入力
6:REM1
7:REM2
8:GND
割り込み
NMI($E790)BREAKキー(MN1544)
IRQ($E7E2)MN1271 TCB TEMPO (タイマ)
TCE 0.1秒カウンタ(タイマ)
PI0 /KON (MN1544からデータ受信)
PI1 /SYSINI (外部バス)
PD シリアル (RS−232C、CMT)
PI2 /USERINT(外部バス)
SWI($E7DC)システムでは使用していない(ユーザー用?)
拡張ROM
$D800〜$DFFFの2KBが拡張エリア
$D800が$7Eがあれば$D800にジャンプするようになっており
$7EはJMP命令なので$D801〜$D802のアドレスを実行します
拡張ROMチェックの後、同様にBASICのROMチェックが行なわれ
$A000が$7Eがあれば$A000にジャンプするようになっており
ねければモニタが起動されるようになっています
拡張RAM
$8000〜$9FFFが拡張可能
外部バスのKILL信号によって
$A000〜$BFFFのROMを使用禁止可
そこをRAMにすると最大48KB($0000〜$BFFF)なります
$A000〜$BFFFをRAMまたは使用禁止で起動すると
モニタのみが起動します
VRAM
CRTCのクロック14.31818MHz(TCLK)を基準に
CLK1(CPU)、CLK2S(NM1271)のクロックを出力します
分周されず状況(DRAM W/R、CRTCアクセス)によってクロックは変化します
ディスプレイコード
アスキーコードの場合
$00=NULL 、$03=BREAK 、$08=RUB OUT
$0B=HOME 、$0C=CLS 、$0D=RETURN
$13=INS 、$14=英数 、$16=HCOPY
$18=CANSEL 、$1A=LINS 、
$1C=カーソル 右 、$1D=カーソル 左
$1E=カーソル 上 、$1F=カーソル 下
$7F=DEL 、$80=GRAPH 、$A0=カナ
$C000−$C0FF $20〜$3FのPCG定義領域
ディスプレイコード$20〜$3Fのキャラクタ定義場所
1キャラクタ8バイト*32キャラクタ 計256バイト
$C100〜$C3FF ディスプレイコードエリア
ディスプレイコードを書き込むことによって文字を表示します
$C400〜$C4FF $40〜$5FのPCG定義領域
ディスプレイコード$40〜$5Fのキャラクタ定義場所
1キャラクタ8バイト*32キャラクタ 計256バイト
$C500〜$C7FF アトリビュートエリア
ディスプレコードエリアの文字のセミグラフィックまたは
ノーマル・PCG、カラーの設定を行ないます
ノーマル・PCGの場合ディスプレイコードと1対1になり
d7:M1 0
d6:M0 1=ノーマルモード、0=ユーザー定義モード
d5:BG
d4:BR
d3:BB
d2:FG
d1:FR
d0:FB
セミグラフィクの場合
ディスプレイコードエリアがグラフィック画面偶数行
アトリビュート エリアがグラフィック画面奇数行とみなし
通常1キャラクタは8×8ドットの文字を
2×2ドットのグラフィックとして表示します
ディスプレイコードエリア(画面偶数行)
d7:−
d6:−
d5:右上ドット カラーG
d4:右上ドット カラーR
d3:右上ドット カラーB
d2:左上ドット カラーG
d1:左上ドット カラーR
d0:左上ドット カラーB
アトリビュートエリア(画面奇数行)
d7:M1 1
d6:M0 0
d5:右下ドット カラーG
d4:右下ドット カラーR
d3:右下ドット カラーB
d2:左下ドット カラーG
d1:左下ドット カラーR
d0:左下ドット カラーB
CRAM(キャラクタRAM)
CGROM(フォント)を持っておらずCRAMがCGROMの代わりとなります
CGデータはMN1544内蔵ROMにありシステム初期設定でCGが定義されます
1.KTESTを1→0→1
2.MN1544からデータが1バイト送られMN1544から/KON出力(IRQ)
3.データを読み込んだら/KACKを1→0→1(MN1544にデータ受信完了を知らせる)
4.2と3を計2KB分繰り返す
5.更に1バイト同様に読む(ボーレートスイッチの読み込み)
*電源を入れたとき(MN1544リセット)のみしか転送できない?
リアルタイムカウンタ
MN1271のカウンタE プリスケーラ1/8で使用
IRQで100ms毎に割り込みが掛かる
MN1271 CLK2S(Basicタイミング)
TCLK=14.31818MHz
(1/TCLK/*10+(1/TCLK*11*2))/3
=(0.069841*10+0.069841*11*2)/3
=(0.69841+1.536502)/3
=0.74497(約0.745ms)
タイマ値=(カウンタE値+1)×プリスケーラ分×CLK2S 0.000745
<例>
100ms=(カウンタE値+1)×8×0.000745ms
100ms=(カウンタE値+1)×0.00596
カウンタE値+1=100÷0.00596
カウンタE値 =約16778 ($418A)
シリアル インタフェース
テープレコーダ(CMT)
MN1271のパラレル、シリアル、タイマA(シリアルのクロック)を利用して制御します
またボーレートスイッチを見てワークの設定を行なっているだけなので
ソフトウェアで切り替えが可能
PD5+SDO(WRITE)
PD7 (READ)
PD6 (リモート)
FSK方式 600/2400ボー
1:GND
2:GND
3:GND
4:REC
5:MON
6:REM1
7:REM2
8:GND
RS−232C(オプション)
回路図は参考程度にして下さい
調歩同期方式、半2重通信
転送速度 75/110/150/300/600/1200/2400/4800/9600(スイッチで選択)
データ長 7Bit/8Bit(ソフトウェアで選択)
ストップビット 1Bit/2Bit(ソフトウェアで選択)
パリティ 無し/奇数/偶数 (ソフトウェアで選択)
JR−200 CN10
1:TXD (SDO)
2:RXD (SDI)
3:/CS (PD0)
4:/DR (PD1)
5:/CD (PD2)
6:/RS (PD3)
7:/ER (PD4)
8:RS232(PD5)
9:BCLK1(入力 MN1271 STへ)
10:TCF (TCF)
11:+5V
12:GND
BCLK1はTCF(110ボー)または外部のクロック回路(8640C)のクロック
サウンド
MN1271(CLK2S=0.745MHz)のカウンタTCC、TCD、TCFを使用します
またカウンタ端子の出力の際、内蔵F・Fで1/2に分周される
キークリック音はMN1544で常に発生され
MN1271のPB6で合成のオン・オフを指定します
<BASICのPLAY文用>
・−−−−−−−−−−−−−−−−−++−−−−−−−−−−−−−−−−−・
|コード|音階1| 周波数|カウンタ||コード|音階4| 周波数|カウンタ|
|−−−+−−−+−−−−+−−−−||−−−+−−−+−−−−+−−−−|
|$01| C | 66|*$9F||$25| C | 523| $9F|
|$02| C#| 70|*$96||$26| C#| 552| $96|
|$03| D | 73|*$8E||$27| D | 584| $8E|
|$04| D#| 78|*$86||$28| D#| 620| $86|
|$05| E | 83|*$7E||$29| E | 660| $7E|
|$06| F | 87|*$77||$2A| F | 700| $77|
|$07| F#| 93|*$70||$2B| F#| 736| $70|
|$08| G | 96|*$6A||$2C| G | 792| $6A|
|$09| G#| 104|*$64||$2D| G#| 832| $64|
|$0A| A | 110|*$5E||$2E| A | 880| $5E|
|$0B| A#| 117|*$59||$2F| A#| 932| $59|
|$0C| B | 123|*$54||$30| B | 988| $54|
|===+===+====|====||===+===+====+====|
|コード|音階2| 周波数|カウンタ||コード|音階5| 周波数|カウンタ|
|−−−+−−−+−−−−|====||−−−+−−−+−−−−|−−−−|
|$0D| C | 130|*$4F||$31| C |1046| $4F|
|$0E| C#| 138|*$4B||$32| C#|1104| $4B|
|$0F| D | 146|*$47||$33| D |1168| $47|
|$10| D#| 155|*$43||$34| D#|1240| $43|
|$11| E | 165|*$3E||$35| E |1320| $3E|
|$12| F | 175|*$3B||$36| F |1400| $3B|
|$13| F#| 184|*$38||$37| F#|1472| $38|
|$14| G | 196|*$34||$38| G |1584| $34|
|$15| G#| 208|*$31||$39| G#|1664| $31|
|$16| A | 220|*$2E||$3A| A |1760| $2E|
|$17| A#| 233|*$2C||$3B| A#|1864| $2C|
|$18| B | 247|*$29||$3C| B |1976| $29|
|===+===+====|====|・−−−−−−−−−−−−−−−−−・
|コード|音階3| 周波数|カウンタ| *カウンタ値 プリスケーラ1/64
|−−−+−−−+−−−−|====| それ以外は 1/8
|$19| C | 261|*$27| ・−−−−−−−−−−−・
|$1A| C#| 276|*$25| | 音 符 |データ|
|$1B| D | 292|*$23| |−−−−−−−+−−−|
|$1C| D#| 310|*$21| | 16分音符|$06|
|$1D| E | 330|*$FD| |付点16分音符|$09|
|$1E| F | 350| $EF| | 8分音符|$0C|
|$1F| F#| 368| $E3| |付点 8分音符|$12|
|$20| G | 396| $D5| | 4分音符|$18|
|$21| G#| 416| $C9| |付点 4分音符|$24|
|$22| A | 440| $BD| | 2分音符|$30|
|$23| A#| 466| $B3| |付点 2分音符|$48|
|$24| B | 494| $A9| | 全音符|$60|
・−−−−−−−−−−−−−−−−−・ ・−−−−−−−−−−−・
PLAY文に使用するデータフォーマット
音符データ、コード、[音符データ、コード]、...$00(エンドマーク)
I/Oポート
$C800:MN1271 PADDR PAデータ方向 MN1544キーデータ
d7:d7 1=出力、0=入力
d6:d6 1=出力、0=入力
d5:d5 1=出力、0=入力
d4:d4 1=出力、0=入力
d3:d3 1=出力、0=入力
d2:d2 1=出力、0=入力
d1:d1 1=出力、0=入力
d0:d0 1=出力、0=入力
$C801:MN1271 PAIOR PAデータ MN1544キーデータ
d7:d7 (入力)
d6:d6 (入力)
d5:d5 (入力)
d4:d4 (入力)
d3:d3 (入力)
d2:d2 (入力)
d1:d1 (入力)
d0:d0 (入力)
$C802:MN1271 PBDDR PBデータ方向 周辺コントロール
d7:d7 1=出力、0=入力
d6:d6 1=出力、0=入力
d5:d5 1=出力、0=入力
d4:d4 1=出力、0=入力
d3:d3 1=出力、0=入力
d2:d2 1=出力、0=入力
d1:d1 1=出力、0=入力
d0:d0 1=出力、0=入力
$C803:MN1271 PBIOR PBデータ 周辺コントロール
d7:d7 (出力)MN1544 /KSTAT
d6:d6 (出力)MN1544 クリックのゲート 1=オン、0=オフ
d5:d5 (入力)プリンタ /PSEL*
d4:d4 (入力)プリンタ /BUSY*
d3:d3 (出力)プリンタ /INIT*
d2:d2 (出力)プリンタ STROBE*
d1:d1 (出力)MN1544 /KTEST
d0:d0 (出力)MN1544 /KACK
*LS04で入出力は反転される
/KSTAT 1=ニュートラルモード (例)^Aが押された場合$01
0=BASIC モード (例)^Aが押された場合AUTOのアスキーコード
/PSEL プリンタ選択 1=エプソン製、0=松下製
/BUSY 1=READY、0=BUSYまたは接続していない
/KTEST CGROMデータ、ボーレートSWの読み出し開始
/KACK 受信した事をMN1544に知らせる 1→0→1
$C804:MN1271 PCDDR PCデータ方向 プリンタデータ
d7:d7 1=出力、0=入力
d6:d6 1=出力、0=入力
d5:d5 1=出力、0=入力
d4:d4 1=出力、0=入力
d3:d3 1=出力、0=入力
d2:d2 1=出力、0=入力
d1:d1 1=出力、0=入力
d0:d0 1=出力、0=入力
$C805:MN1271 PCIOR PCデータ プリンタデータ
d7:/PDATA7(出力)*LS04を通して反転して出力される
d6:/PDATA6(出力)
d5:/PDATA5(出力)
d4:/PDATA4(出力)
d3:/PDATA3(出力)
d2:/PDATA2(出力)
d1:/PDATA1(出力)
d0:/PDATA0(出力)
$C806:MN1271 PDDDR PDデータ方向 シリアルデバイス コントロール
d7:d7 1=出力、0=入力
d6:d6 1=出力、0=入力
d5:d5 1=出力、0=入力
d4:d4 1=出力、0=入力
d3:d3 1=出力、0=入力
d2:d2 1=出力、0=入力
d1:d1 1=出力、0=入力
d0:d0 1=出力、0=入力
$C807:MN1271 PDIOR PDデータ シリアルデバイス コントロール
d7:d7 (入力)CMT READ
d6:d6 (出力)CMT REM 1=オフ、0=オン
d5:d5 (出力)SDO選択 1=RS−232C SD、0=CMT WRITE(CTXD)
d4:d4 (出力)RS−232C /ER
d3:d3 (出力)RS−232C /RS
d2:d2 (入力)RS−232C /CD
d1:d1 (入力)RS−232C /DR
d0:d0 (入力)RS−232C /CS
$C808:MN1271 PIMDR
d7:0
d6:PI2データ方向 1=出力、0=入力
d5:PI1データ方向 1=出力、0=入力
d4:PI0データ方向 1=出力、0=入力
d3:0
d2:PI2モード
d1:PI1モード
d0:PI0モード
+−−−−−−−−−−−−−−−−−−−−−−−−+
|方 向|モード| 機 能 |
|−−−+−−−+−−−−−−−−−−−−−−−−|
| 1 | 1 |パルス出力モード |
| 1 | 0 |レベル出力モード |
| 0 | 1 |入力信号立上がりエッジ検出モード|
| 0 | 0 |入力信号立下がりエッジ検出モード|
+−−−−−−−−−−−−−−−−−−−−−−−−+
$C809:MN1271 PIIOR PIデータ
d7:0
d6:PI2の値(入力)/USERINT
d5:PI1の値(入力)/SYSINT
d4:PI0の値(入力)/KON
d3:0
d2:PI2データ(出力)
d1:PI1データ(出力)
d0:PI0データ(出力)
$C80A:MN1271 PIEDR
d7:リセットビット
d6:0
d5:0
d4:0
d3:0
d2:PI2エッジ検出フラグ
d1:PI1エッジ検出フラグ
d0:PI0エッジ検出フラグ
$C80B:MN1271 SCS1R シリアルI/Oコントロール ステータス1
d7:d7 (出力)モード 1=UART、0=CART*
d6:d6 (出力)0
d5:d5 (出力)0
d4:d4 (出力)UART分周比 1=1/16、0=1
d3:d3 (出力)データビット長 1=8ビット、7ビット
d2:d2 (出力)パリティ選択 1=あり 、0=なし
d1:d1 (出力)パリティ 1=奇数 、0=偶数
d0:d0 (出力)ストップビット長 1=2ビット、0=1ビット
*CARTの場合 d6−d0は使用しない
$C80C:MN1271 SCS2R シリアルI/Oコントロール ステータス2
d7:d7 (出力)シリアルIF 1=許可、0=禁止
d6:d6 (出力)割り込み 1=許可、0=禁止
d5:d5 (出力)送信データ 1=フル、0=エンプティ
d4:d4 (出力)送受モード設定 1=送信、0=受信
d3:d3 (出力)クロック 1=内部、0=外部*
d2:d2 (出力)データビット量d2 111=7、110=6、101=5、100=4
d1:d1 (出力)データビット量d1 011=3、010=2、001=1、000=8
d0:d0 (出力)データビット量d0/付加したパリティ値*
*内部=カウンタAを使用、外部=ST端子を使用
*CARTの場合データビット量、UARTの場合パリティ
d7:d7
d6:d6
d5:d5 (入力)受信データ 1=フル 、0=エンプティ
d4:d4
d3:d3 (入力)BUSY 1=BUSY、0=READY
d2:d2 (入力)オーバーランエラー 1=あり 、0=なし
d1:d1 (入力)フレーミングエラー 1=あり 、0=なし
d0:d0 (入力)パリティエラー 1=あり 、0=なし
$C80D:MN1271 STBR(出力)
d7:SDO /d7 *反転して出力される
d6:SDO /d6 600ボーの波形データ (1バイトで1ビットの波形)
d5:SDO /d5 ’1’=$AA LHLHLHLH
d4:SDO /d4 ’0’=$CC LLHHLLHH
d3:SDO /d3 2400ボーの波形データ(2ビットで1ビットの波形)
d2:SDO /d2 ’1’= LH または HL
d1:SDO /d1 ’0’= LL または HH
d0:SDO /d0
MN1271 SRBR(入力)
d7:SDI d7
d6:SDI d6
d5:SDI d5
d4:SDI d4
d3:SDI d3
d2:SDI d2
d1:SDI d1
d0:SDI d0
$C80E:MN1271 TACSR(出力) タイマカウンタA CMT、RS−232C
d7:0
d6:割り込み 1=許可、0=禁止
d5:ボロー 1=あり、0=なし
d4:プリスケーラ 11=1/256、10=1/64
d3:プリスケーラ 01=1/8 、00=1
d2:0
d1:0
d0:カウント 1=許可、0=禁止
$C80F:MN1271 TAWSR(出力) タイマカウンタA データ
MN1271 TACTR(入力) タイマカウンタA データ
$C810:MN1271 TBCSR(出力) タイマカウンタB TEMPO用
d7:0
d6:割り込み 1=許可、0=禁止
d5:ボロー 1=あり、0=なし
d4:プリスケーラ 11=1/256、10=1/64
d3:プリスケーラ 01=1/8 、00=1
d2:0
d1:0
d0:カウント 1=許可、0=禁止
$C811:MN1271 TBWSR(出力) タイマカウンタB データ
MN1271 TBCTR(入力) タイマカウンタB データ
$C812:MN1271 TCCSR(出力) タイマカウンタC サウンド用
d7:0
d6:割り込み 1=許可、0=禁止
d5:ボロー 1=あり、0=なし
d4:プリスケーラ 11=1/256、10=1/64
d3:プリスケーラ 01=1/8 、00=1
d2:d2 111=???、110=矩形波出力オン、101=???、100=???
d1:d1 011=???、010=矩形波出力オフ、001=???、000=何もしない
d0:d0
$C813:MN1271 TCESR(出力) タイマカウンタC データ
MN1271 TCCTR(入力) タイマカウンタC データ
$C814:MN1271 TDCSR(出力) タイマカウンタD サウンド用
d7:0
d6:割り込み 1=許可、0=禁止
d5:ボロー 1=あり、0=なし
d4:プリスケーラ 11=1/256、10=1/64
d3:プリスケーラ 01=1/8 、00=1
d2:d2 111=???、110=矩形波出力オン、101=???、100=???
d1:d1 011=???、010=矩形波出力オフ、001=???、000=何もしない
d0:d0
$C815:MN1271 TDWSR(出力) タイマカウンタD データ
MN1271 TDCTR(入力) タイマカウンタD データ
$C816:MN1271 TECSR(出力) タイマカウンタE カウンタ0.1秒用
d7:0
d6:割り込み 1=許可 、0=禁止
d5:ボロー 1=あり 、0=なし
d4:パルス転送 1=あり 、0=なし
d3:プリスケーラ 1=1/8、0=1
d2:d2 111=???、110=矩形波出力オン、101=???、100=???
d1:d1 011=???、010=矩形波出力オフ、001=???、000=何もしない
d0:d0
$C817:MN1271 TEHBR(出力) タイマカウンタE データ H
MN1271 TEHCR(入力) タイマカウンタE データ H
$C818:MN1271 TELBR(出力) タイマカウンタE データ L
MN1271 TELCR(入力) タイマカウンタE データ L
$C819:MN1271 TFCSR(出力) タイマカウンタF サウンド、RS−232C用
d7:0
d6:割り込み 1=許可 、0=禁止
d5:ボロー 1=あり 、0=なし
d4:パルス転送 1=なし 、0=あり
d3:プリスケーラ 1=1/8 、0=1
d2:d2 111=???、110=矩形波出力オン、101=???、100=???
d1:d1 011=???、010=矩形波出力オフ、001=???、000=何もしない
d0:d0
$C81A:MN1271 TFHBR(出力) タイマカウンタF データ H
MN1271 TFHCR(入力) タイマカウンタF データ H
$C81B:MN1271 TFLBR(出力) タイマカウンタF データ L
MN1271 TFLCR(入力) タイマカウンタF データ L
$C81C:MN1271 IRQ1R(入力) 割り込みステータス1
d7:IRQ1RまたはIRQ2Rの割り込み要求
d6:シリアルIF割り込み 1=あり、0=なし
d5:0
d4:0
d3:0
d2:PI2割り込み 1=あり、0=なし /USERINT
d1:PI1割り込み 1=あり、0=なし /SYSINT
d0:PI0割り込み 1=あり、0=なし /KON
$C81D:MN1271 IRQ2R(入力) 割り込みステータス2
d7:IRQ1RまたはIRQ2Rの割り込み要求
d6:0
d5:TCF割り込み 1=あり、0=なし サウンド、RS−232C用
d4:TCE割り込み 1=あり、0=なし カウンタ0.1秒用
d3:TCD割り込み 1=あり、0=なし サウンド用
d2:TCC割り込み 1=あり、0=なし サウンド用
d1:TCB割り込み 1=あり、0=なし TEMPO用
d0:TCA割り込み 1=あり、0=なし CMT.RS−232C用
$C81E:MN1271 IE1R(出力) 割り込みマスク1
d7:0
d6:シリアルIF割り込みマスク 1=しない、0=する
d5:0
d4:0
d3:0
d2:PI2割り込みマスク 1=しない、0=する /USERINT
d1:PI1割り込みマスク 1=しない、0=する /SYSINT (DISK)
d0:PI0割り込みマスク 1=しない、0=する /KON
$C81F:MN1271 IE2R(出力) 割り込みマスク2
d7:0
d6:0
d5:TCF割り込みマスク 1=しない、0=する
d4:TCE割り込みマスク 1=しない、0=する
d3:TCD割り込みマスク 1=しない、0=する
d2:TCC割り込みマスク 1=しない、0=する
d1:TCB割り込みマスク 1=しない、0=する
d0:TCA割り込みマスク 1=しない、0=する
$CA00:CRTC ボーダーカラー
d7:
d6:
d5:
d4:
d3:
d2:G
d1:R
d0:B
メモリマップ
$0000〜$7FFF 本体RAM
$8000〜$9FFF 拡張メモリ
$A000〜$BFFF ROM0 BASIC(外部バスから使用禁止可)
$C000〜$C0FF PCGパターンエリア1 (CHR $20〜$3F)
$C100〜$C3FF ディスプレイコードエリア
$C400〜$C4FF PCGパターンエリア2 (CHR $40〜$5F)
$C500〜$C7FF アトリビュートエリア
$C800〜$C9FF MN1271 I/Oポート
$CA00〜$CBFF CRTC I/Oポート
$CC00〜$CFFF 拡張用 I/Oポート
$D000〜$D7FF キャラクタRAM(ノーマルモードのCG)
$D800〜$DFFF 拡張ROM
$E000〜$FFFF ROM1 カーネル(モニタ、I/Oルーチン)
$0000 :PBデータ d7 /STAT2 1=ニュートラル、0=BASIC
d6 クリック 1=オン 、0=オフ
d4 −
d3 −
d2 −
d1 −
d0 −
$0001 :STICK(0)の内容(アスキーコード)
$0002 :STICK(1)の内容(JOY1)
$0003 :STICK(2)の内容(JOY2)
$0004〜$0005:DECカウンタ 0.1秒単位(カウンタ 1秒用)
$0006〜$0007:DECカウンタ 1秒単位
$0008 :プリンタフラグ $FF=オン、$00=オフ
$0009 :カーソルX
$000A :カーソルY
$000B :BREAKキーフラグ
$00 =オフ NMI処理を実行しない
$01〜$FF=オン NMI処理を実行する
$000C :キーデータ ^C=$03、それ以=$00
$000D :MN1544 キーバッファの長さ$00−$20($00=データ無し)
$000E :カラーアトリビュトデータ
$000F :カーソルのキャラクタ
$0010 :カーソルのキャラクタ・アトリビュート
$0011 :カーソル点滅消去カウンタ
$0012 :カーソル点滅消去カウンタ設定値
$0013 :AUTOフラグ $00=オフ、$01=オン
$0014〜$0015:AUTO 次に発生する行番号
$0016〜$0017:AUTO 増加する値
$0018〜$0019:汎用
$001A〜$001B:汎用
$001C〜$001D:汎用
$001E〜$001F:MON用アドレス 16進数データ
$0020 :カーソル位置のキャラクタ
$0021 :カーソル位置のキャラクタ・アトリビュート
$0022−$0023:カーソル位置のディスプレコードアドレス(VRAM)
$0024−$0025:カーソル位置から最終文字アドレス(VRAM)
$0026 :カーソル位置から最終文字までの行数−1
$0027 :INSモード $00=オフ、$FF=オン
$0028 :
$0029 :
$002A :
$002B :CMTボーレートスイッチ $64=600ボー、$00=2400ボー
$002C :TEMPO (TCBデータ)
$002D :PLAY Ch−A長さ
$002E :PLAY Ch−B長さ
$002F :PLAY Ch−C長さ
$0030〜$0031:PLAY Ch−Aデータ ポインタ($0000で演奏しない)
$0032〜$0033:PLAY Ch−Bデータ ポインタ($0000で演奏しない)
$0034〜$0035:PLAY Ch−Cデータ ポインタ($0000で演奏しない)
$0036 :BEEP用
$0037〜$0038:BEEP用周波数データ(TCF)
$0039 :TEMPO用
$003A〜$003B:PLAY周波数設定用
$003C :PLAY音符
$003D〜$003E:
$003F :
$0042 :プリンタヘッド位置
$0043〜$0044:汎用ポインタ(BASIC PC等)
$0045〜$0046:実行中のBASIC PC
$0047〜$0048:行番号
$0049〜$004A:
$004B〜$004C:POKE等の16進アドレス、文字列のデータアドレス
$004D〜$004E:プログラム1行の長さ
$004F〜$0050:
$0051〜$0052:
$0053〜$0054:
$0055〜$0056:
$0057〜$0058:キーバッファ 最終ポインタ
$005D〜$005E:
$005F〜$0060:
$0061〜$0062:
$0063〜$0064:
$0065〜$0066:
$0067 :
$0068 :プログラム1行の長さ
$0069〜$006A:BASICプログラム先頭ポインタ
$006B〜$006C:フリーエリア最終
$006D〜$006E:
$006F〜$0070:
$0071〜$0072:変数領域先頭ポインタ
$0073〜$0074:RANDOMIZE用(TCEのデータを加工)
$0075〜$0076:16進数データ
$0077 :テキスト最下位ラインフラグ $00=オフ、$FF=オン
$007D〜$007E:
$0085〜$0087:
$008E〜$0090:
$00A1〜$00A2:
$00AD〜00AE:
$00B1〜$00B2:
$00B7〜$00C1:汎用ワーク
$00C6〜$00C7:サウンド周波数データ設定用
$00C8 :ファイルタイプ
$00C9 :CMTヘッダ +0 $02
$00CA :CMTヘッダ +1 $0A
$00CB :CMTヘッダ +2 ブロックNo.nn
$00CC :CMTヘッダ +3 データサイズ ただし$00は256バイトになる
$00CD :CMTヘッダ +4 $FF
$00CE :CMTヘッダ +5 $FF
$00CF :CMTボーレート $64=600ボー、$00=2400ボー
$00D0 :CMT用
$00D1 :CMT用
$00D2 :CMT用
$00D3 :$00=LOAD、$FF=VERIFY
$00D4 :CMT用
$00D5 :CMT用
$00D6〜$00D7:CMTパラメータ ポインタ (ファイルネーム16文字、先頭アドレス、最終アドレス)
$00D9〜$00DA:
$00DB :CMT/RS−232C用 PD比較
$00DC〜$00DD:
$00DE :CMTウェイト、CMTチェックサム
$00DF :$00=プリントモード、$80=HCOPYモード
$00E4〜$00E5:RS−232C ライトバッファ ポインタ
$00E6〜$00E7:
$0100〜$0101:NMI フックポインタ$0000($0000でフックを行なわない)
$0102〜$0103:SWI フックポインタ$0000($0000でフックを行なわない)
$0104〜$0105:IRQ フックポインタ$0000($0000でフックを行なわない)
$0106〜$0107:IRQサブPI1 フックポインタ$0000($0000でフックを行なわない)
$0108〜$0109:IRQサブシリアルフックポインタ$0000($0000でフックを行なわない)
$010A〜$010B:IRQサブPI2 フック$ポインタ0000($0000でフックを行なわない)
$010C〜$010D:DECカウンタ 0.1秒前のフックポインタ
$010E〜$010F:DECカウンタ 1秒後のフックポインタ
$0110〜$0111:モニタコマンドリストフックポインタ$FFE6
$0112〜$0113:PRINT用
$0114〜$0115:現在のMN1544バッファ リードポインタ(キュー方式)
$0116〜$0117:現在のMN1544バッファ ライトポインタ(キュー方式)
$0118〜$0119:中間言語変換出来ないときのフックポインタ$0000($0000で実行しない)
$012A〜$012C:拡張用エラーメッセージ フック
$012D〜$012F:CMT/RS−232C アクセス用フック (JMP $E000)
$0130〜0131:BREAK(NMI復帰)ポインタ
BASIC ROM起動 =$AF1B
BASIC ROM禁止で起動=$EA99 MON
$0134〜$0135:BASICラインインプット フックポインタ $EDC2
$0136〜$0137:ファイルデバイスネーム ポインタ
$B080=’CAS1:’
$B085=’COM1:’
$0138〜$0139:BASICプログラム1行入力フックポインタ $BD10
$0150〜$016F:汎用バッファ
$0150 :STICK(0)の内容
$0151 :STICK(1)の内容
$0152 :STICK(2)の内容
$018E〜$01DE:1LINEプログラム アスキーバッファ、入力した文字列
$01DF〜 :1LINEプログラム 中間言語バッファ
$019E〜$019F:CMT先頭アドレス
$01A0〜$01A1:CMT最終アドレス
$0302〜$0321:データバッファ
$0322 :CMT用右上キャラクタ保存用
〜$07FF:スタック
$0800〜$7FFF:BASICプログラム領域
$00、次の行のアドレス上位、次の行のアドレス下位、行番号2バイト、プログラム、
ENDマーク$00、$00、$00
変数最大2バイト アスキーコード
$C0 =文字列
$F1 =16進数
$F1以降=10進数
$C000〜$C0FF:PCGパターンエリア1
$C100〜$C3FF:ディスプレイコードエリア
d7:ディスプレイコードd7
d6:ディスプレイコードd6
d5:ディスプレイコードd5またはG ドットカラー0
d4:ディスプレイコードd4またはR
d3:ディスプレイコードd3またはB
d2:ディスプレイコードd2またはG ドットカラー1
d1:ディスプレイコードd1またはR
d0:ディスプレイコードd0またはB
$C400〜$C4FF:PCGパターンエリア2
$C500〜$C7FF:アトリビュートエリア
d7:M1 モード 11= − 、10=セミグラフィック モード
d6:M0 01=ユーザ定義モード、00=ノーマルモード
d5:BG 背景カラー またはドットカラー2
d4:BR
d3:BB
d2:FG キャラクタカラーまたはドットカラー3
d1:FR
d0:FB
$C800〜$C9FF:MN1271 I/Oポート
$CA00〜$CBFF:CRTC I/Oポート
$CC00〜$CFFF:拡張用 I/Oポート
$D000〜$D7FF:キャラクタRAM
$D800〜$DFFF:拡張ROM
$E000:シリアルI/O
入力:A=タスクnn $00−$0A
X=パラメータのポインタ
出力:状況による
使用:A、B、X
CMTまたはRS−232Cのアクセスを行います
タスクnn
$00 LOAD
$01 SAVE
$02 VERIFY
$03 MLOAD
$04 MSAVE
$05 OPEN ”O”
$06 PRINT#
$07 CLOSE ”O”
$08 OPEN ”I”
$09 INPUT#
$0A CLOSE ”I”
$E49D:PBIORの設定
入力:B=設定データ(d5−d0)
出力:X=VRAMアドレス
$0022=VRAMアドレス上位
$0023=VRAMアドレス下位
使用:なし
PB(周辺コントロール)のd7、d6とBレジスタのd5−d0の値を
合成してPBに出力します
d4−d5はプリンタの入力なので実際に合成するのは
下位4ビットになります
$E86A:MN1544コマンド送信
入力:A=$02 /KEYTEST
$01 /KSTS2
$0000=PB d7、d6データ
出力:$0000=PB d7、d6データ(d5−d0はクリアされる)
使用:A
MN1544のクリック音のゲート、/KSTAT2と
Aレジスタで指定の制御信号をMN1544へ送信
信号は’1’→’0’→’1’
$E8C1:JSR (X)
入力:X=コールするアドレスポインタ($0000でコールしない)
使用:X
Xをポインタとしてサブルーチンコールします
またAレジスタは保持されます
$EA74−$EA98:TC、TDデータ(8ビットカウンタ サウンド用)
$EB79:カーソル位置のVRAMアドレス変換
入力:$0009=カーソルX
$000A=カーソルY
出力:X=カーソル位置のVRAMアドレス
$0022=VRAMアドレス上位
$0023=VRAMアドレス下位
使用:X
$EB93:指定したVRAMのATBアドレス取得
入力:X=ディスプレイコードアドレス
出力:X=ATBアドレス
使用:X、B
$0018=ATBアドレス上位
$0019=ATBアドレス下位
指定したVRAMに対応するATBアドレスを取得します
実際にはX=X+$0400を実行
$EBE7:アスキーコード 1バイトPRINT
入力:A=アスキーコード
$0008=出力デバイス
$00 CRTのみ
$01〜$7F PRTのみ
$80〜$FF=CRT+PRT
$000E=カラーアトリビュートデータ
使用:状況による(X、A、Bは保持される)
1文字表示または印字します
コントロールコードの場合は各コードの実行
$EC7F:画面クリア+アトリビュート初期化
入力:$000E=カラーアトリビュトデータ
出力:$0009=$00 カーソルX
$000A=$00 カーソルY
使用:X、A、B
$0018=汎用 VRAMアドレス上位
$0019=汎用 VRAMアドレス下位
$001A=汎用 次のVRAMアドレス上位、ATBアドレス上位
$001B=汎用 次のVRAMアドレス下位、ATBアドレス下位
1画面をクリアして、アトリビュートを$000Eの内容で埋め
カーソル位置を左上にセットします
$ECE2:データクリア
入力:X=クリアするアドレス
B=長さ
使用:X、B
指定したアドレスからBレジスタ分だけ$00を書き込みます
$ECE6:32バイトデータを埋める
入力:X=埋めるアドレス
A=埋めるデータ
使用:X、B
指定したアドレスから任意のデータを32回書き込みます
主に画面1ライン描画に使用
$ECE9:データを埋める
入力:X=埋めるアドレス
A=埋めるデータ
B=長さ
使用:X、B
指定したアドレスから任意のデータを書き込みます
注意するのは最後にPULAが実行されるので
単独でコールする前にPSHA等で調節する必要があります
$EEE7:16進数1バイト→アスキーコード2バイト変換
入力:X=16進数データポインタ
出力:X=16進数データポインタ+1
A=16進数d7〜4のアスキーコード
B=16進数d3〜0のアスキーコード
使用:X、A、B
$EF0F:16ビット、8ビット加算 X=X+B
入力:X=加算されるデータ
B=加算するデータ
出力:X=演算結果
$0018=演算結果上位
$0019=演算結果下位
使用:X
$EF15:16ビット、8ビット減算 X=X−B
入力:X=減算されるデータ
B=減算するデータ
出力:X=演算結果
$0018=演算結果上位
$0019=演算結果下位
使用:X
$005B=演算用上位
$005C=演算用下位
$EF1B:16ビット加算 X=X+AB
入力:X=加算されるデータ
A=加算するデータ上位
B=加算するデータ上位
出力:X=演算結果
$0018=演算結果上位
$0019=演算結果下位
使用:X
$EF2C:16ビット減算 X=X−AB
入力:X=減算されるデータ
A=減算するデータ上位
B=減算するデータ下位
出力:X=演算結果
$0018=演算結果上位
$0019=演算結果下位
使用:X
$005B=演算用上位
$005C=演算用下位
$EF80:ABと(X)の比較
入力:A=データ上位
B=データ下位
X=比較データポインタ
出力:Zf=1 データ=比較データ
0 データ≠比較データ
Cf=1 データ<比較データ
0 データ>比較データ
使用:なし
$FB19:文字列→16進数変換
入力:$00A1=10進数文字列ポインタ上位
$00A2=10進数文字列ポインタ下位
出力:$0075=16進数データ上位
$0076=16進数データ下位
B=$00 変換完了
$0D 変換不可(文字列に16進数のアスキー文字が無かった)
使用:A、B、X
文字列を16進数データに変換します
変換データは大文字変換されd3−0のデータとして左シフトされ
以降のデータも同様に左シフトされていきます
<例> ’0123’、$00 → $0123、B=$00
’ZZZZ’、$00 → $0000、B=$0D
$FE86:16進数→10進数文字列出力
入力:X=16進数データポインタ
出力:X=16進数データポインタ+2
$00B7=$01 変換した文字列ポインタ上位
$00B8=$70 変換した文字列ポインタ下位
B=変換した文字列の長さ
$0170以降 変換した10進数(アスキーコード)
使用:A、B、X
$00B7=演算用 文字列ポインタ上位
$00B8=演算用 文字列ポインタ下位
$00B9=演算用 変換する文字列出力ポインタ上位
$00BA=演算用 変換する文字列出力ポインタ下位
$00BB=演算用 減算カウントデータ
$00BC=演算用 文字列の長さ
$00BE=演算用 16進数データポインタ上位
$00BF=演算用 16進数データポインタ下位
$00C0=演算用 10進変換データポインタ上位、X退避上位
$00C1=演算用 10進変換データポインタ下位、X退避下位
Xレジスタをデータポインタとして2バイトのデータを16進数として取得
その16進数データを$00B7のデータポインタ($0170)として
変換した10進数データを書き込みます
データを変換するだけで表示はされません
$FEE0〜$FF95:エラーメッセージ
$FF96〜$FFA3:Break in lineデータ
$FFA4〜$FFE5:BASICメッセージデータ
$FFE6〜$FFFE:モニタコマンドデータ
$FFF5〜$FFF7:ロムバージョン
$FFF8〜$FFF9:IRQ $E7E2
$FFFA〜$FFFB:SWI $E7DC
$FFFC〜$FFFD:NMI $E790
$FFFE〜$FFFF:RESET $E6E4
Home へ戻る