標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第367回]

●USB接続も動作確認できました

先週末に、残っておりましたUSB接続関係のパーツその他を皆様にお送りしたのですが、さっそくMS様から、「ざっとしてみただけですが、うまく動作しましたよ」というメールをいただきました。
MS様。さっそくメールをお送りいただきありがとうございました。
これで、とりあえずの全ての動作をご確認いただけたことになります。
おかげでやっと気が楽になりました。

昨年の7月にこの連載を始めてからというもの、ずっとプレッシャーがかかった状態でしたので、ほんとうに久しぶりに緊張感から開放されて、やっと少しくつろいだ気分を味わっています。

でも、まだ書きかけで、そのままになってしまったところや、まだまだ書いておきたいところなどもありますので、この連載自体はまだもう少しの間はとりとめもなく続いていきそうです。
そうそう、せっかく皆様にキットを完成していただいて、ちゃんと動作するということを実証していただいたことですし、回路の不具合、誤配線などもご指摘いただきましたので、それらをきちんと直して、今度は第2回のご注文のご予約をいただきたいと思っておりますので、この機会にぜひご予約のメールをいただきますようお願いいたします。詳細はこちらでご案内をさせていただいております。

●リモートキー入力プログラムリストです

前回、Windowsパソコンのフルキーボードからの入力を、USBでTK80回路に送り、5×5キーの入力の代わりにする、というプログラムを紹介しました。
前回はちょっと時間がなくて、プログラムリストをお見せしないで終ってしまいましたので、ここでお見せすることにいたします。

TK80回路側のRAMにあらかじめ読み込ませておくプログラムです。


2009/10/16  8:19  remote80.txt
END=F062
              ;;;remote for mycpu80(tk80)
              ;; 09/10/14 09/10/15 10/16
              ;
                ORG $F000
              ;
                RGDSP=$01A1
                SOUT=$027C
                SIN=$02A0
                SOUTEND=$02B3
                D2=$02EA
                DATA=$FFEC
                ADRES=$FFEE
              ;
F000 3EFF     LOOP:MVI A,FF
F002 D398       OUT 98
F004 CDA002   LDDATA:CALL SIN
F007 FE41       CPI 41;A
F009 CA21F0     JZ ADRSSET
F00C 2AEEFF     LHLD ADRES
F00F FE57       CPI 57;W
F011 CA54F0     JZ WRINC
F014 FE49       CPI 49;I
F016 CA5BF0     JZ RDINC
F019 FE44       CPI 44;D
F01B CA5FF0     JZ RDDEC
F01E C304F0     JMP LDDATA
              ;
F021 CDA002   ADRSSET:CALL SIN
F024 67         MOV H,A
F025 CDA002     CALL SIN
F028 6F         MOV L,A
              ;wait
F029 CDEA02   DTOUT:CALL D2
F02C 3EFB       MVI A,FB
F02E D398       OUT 98
              ;
F030 22EEFF     SHLD ADRES
F033 7C         MOV A,H
F034 CD7C02     CALL SOUT
F037 7D         MOV A,L
F038 CD7C02     CALL SOUT
F03B 3AECFF     LDA DATA
F03E 57         MOV D,A
F03F 7E         MOV A,M
F040 5F         MOV E,A
F041 D5         PUSH D
F042 CD7C02     CALL SOUT
F045 CDB302     CALL SOUTEND
F048 D1         POP D
F049 EB         XCHG
F04A 22ECFF     SHLD DATA
F04D EB         XCHG
F04E CDA101     CALL RGDSP
F051 C300F0     JMP LOOP
              ;
F054 CDA002   WRINC:CALL SIN
F057 77         MOV M,A
F058 32ECFF     STA DATA
F05B 23       RDINC:INX H
F05C C329F0     JMP DTOUT
              ;
F05F 2B       RDDEC:DCX H
F060 C329F0     JMP DTOUT
              ;END
ADRES        =FFEE  ADRSSET      =F021  D2           =02EA  
DATA         =FFEC  DTOUT        =F029  LDDATA       =F004  
LOOP         =F000  RDDEC        =F05F  RDINC        =F05B  
RGDSP        =01A1  SIN          =02A0  SOUT         =027C  
SOUTEND      =02B3  WRINC        =F054  

このプログラムでCALLしている、SIN、SOUTはTK80モニタのルーチンで、[LOAD][STORE]キーの処理のためのルーチンですが、このような使い方もできるのです(陰の主役はPICですけれど)。

そうそう。TK80回路の説明書の内容紹介もまだ途中のままでした。

☆☆☆TK80回路の操作説明の続きです☆☆☆

●MYCPU80(TK80回路)操作説明書 7章  メモリマップ・I/Oマップ

●1. メモリマップ

TK80回路はモニタROM(32KB)とRAM(32KB)で構成されています。
モニタROMは32KB(キロバイト)の27C256ですが、ほとんどは使われていません。実際にモニタプログラムに使用されているのは、たったの756バイト(0.756KB)です。



●2. システムワークエリア

IC261のRAMのうちFFC7〜FFFFはモニタプログラムのワークエリアとして使用されます。この範囲はモニタプログラムの専用エリアなので、ユーザーがプログラムなどを書くことはできません。
参考までにそのワークエリアのメモリマップを示します。
なお、これらはモニタプログラムがそれぞれの目的のために管理するエリアなので、通常はユーザーが意識する必要はありません。しかしより高度なプログラムを書く場合などには、知っておくと便利なこともあります。

FFFF LED表示用セグメントデータバッファ bW
FFFE LED表示用セグメントデータバッファ bV
FFFD LED表示用セグメントデータバッファ bU
FFFC LED表示用セグメントデータバッファ bT
FFFB LED表示用セグメントデータバッファ bS
FFFA LED表示用セグメントデータバッファ bR
FFF9 LED表示用セグメントデータバッファ bQ
FFF8 LED表示用セグメントデータバッファ bP
FFF7 LED表示用データレジスタ bS
FFF6 LED表示用データレジスタ bR
FFF5 LED表示用データレジスタ bQ
FFF4 LED表示用データレジスタ bP
FFF3 キー入力フラグ
FFF2  ブレイクカウンタ
FFF1  ブレイクアドレス(H)
FFF0  ブレイクアドレス(L)
FFEF  アドレスレジスタ(H)
FFEE  アドレスレジスタ(L)
FFED  データレジスタ(H)
FFEC  データレジスタ(L)
FFEB  CPUレジスタセーブエリア  A
FFEA  CPUレジスタセーブエリア  F
FFE9  CPUレジスタセーブエリア  B
FFE8  CPUレジスタセーブエリア  C
FFE7  CPUレジスタセーブエリア  D
FFE6  CPUレジスタセーブエリア  E
FFE5  CPUレジスタセーブエリア  H
FFE4  CPUレジスタセーブエリア  L
FFE3  CPUレジスタセーブエリア  SP(H)
FFE2  CPUレジスタセーブエリア  SP(L)
FFE1  CPUレジスタセーブエリア  PC(H)
FFE0  CPUレジスタセーブエリア  PC(L)
FFDF  RST6ジャンプ先アドレス(H)
FFDE  RST6ジャンプ先アドレス(L)
FFDD  RST6ジャンプコード(C3)
FFDC  RST5ジャンプ先アドレス(H)
FFDB  RST5ジャンプ先アドレス(L)
FFDA  RST5ジャンプコード(C3)
FFD9  RST4ジャンプ先アドレス(H)
FFD8  RST4ジャンプ先アドレス(L)
FFD7  RST4ジャンプコード(C3)
FFD6  RST3ジャンプ先アドレス(H)
FFD5  RST3ジャンプ先アドレス(L)
FFD4  RST3ジャンプコード(C3)
FFD3  RST2ジャンプ先アドレス(H)
FFD2  RST2ジャンプ先アドレス(L)
FFD1  RST2ジャンプコード(C3)
FFD0
  |
FFC7
 モニタ用スタックエリア
FFC6
  |
ユーザー用スタックエリア


●3. RSTジャンプテーブル

 システムワークエリアの中に、RST6〜RST2ジャンプテーブルがあります。
これはユーザーがプログラム中でRST命令を使ったり、あるいは割り込み処理を行ったときに、ユーザー領域にジャンプさせるためのものです。
割込みには通常はRST7を使うのですが、TK80回路ではRST7をステップ動作に使用しているためにユーザーが使うことはできません。
 TK80回路でユーザーに開放されているのはRST6〜RST2です。
 RST命令のエントリアドレスは0000〜0038の間のアドレスで8バイトごとに置かれています。
 TK80回路ではそのアドレスはTK80モニタROMの領域なので、そこにユーザーが任意のジャンプ命令などを自由に書き込むことはできません。
 そのための対策として、ROMに置かれている本来のRST命令のエントリアドレスには、上のメモリマップにあるRAMのアドレスへのジャンプ命令が書かれています。
 たとえばアドレス0010はRST2のエントリアドレスですが、TK80モニタROMの0010には下のように書かれています。

0010 C3D1FF JMP RST2

ユーザープログラムの中でRST2命令が実行されると(あるいは割込みによってRST2が実行されると)、RAMのFFD1番地にジャンプします。
ユーザープログラムの先頭で、FFD1〜FFD3にユーザーが希望するRST2の処理ルーチンへのジャンプ命令を書き込むようにしておくことによって、ユーザーがRST命令を利用することができるようになります。
たとえば8200にジャンプさせたい場合には、FFD1にC3を、FFD2に00を、FFD3に82を書き込んでからRUNさせます。あるいはユーザープログラムの先頭に次の命令を書いておきます)


3EC3    MVI A,C3
32D1FF  STA $FFD1
210082  MVI H,$8200
22D2FF  SHLD $FFD2

●4. I/Oマップ

 TK80回路ではI/Oアドレスとして94〜9Fを使っています。
 なぜそのような半端なアドレスを使っているかといいますと、デコード回路が簡単になるという理由からだけです。
 さらにデコード回路を簡略化するために、アドレスラインの下位2ビットA1、A0はデコードされていません。
 そのためI/Oアドレスの94〜97、98〜9B、9C〜9Fは同じセレクト回路をアクティブにします。
 また入力と出力の別々の回路に同じI/Oアドレスを割り付けています。これはシステムが占有するI/Oアドレスを少なくするという目的からです。

 TK80回路のI/Oマップです。
A0〜FF 未使用
9C〜9F 5×5キーマトリクスラインセレクト(出力)
      5×5キーマトリクスデータ(入力)
98〜9B 8ビット出力ポート
         ビット0〜ビット3 PIC16F88コントロール
         ビット4 スピーカー出力
         ビット5〜7 ユーザー用出力
      8ビット入力ポート
         ビット0〜2 PIC16F88コントロール
         ビット3〜7 ユーザー用入力
94〜97 PIC16F88とのデータ送受信(入力および出力)
00〜93 未使用

2009.10.19upload

前へ
次へ
ホームページトップへ戻る