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