標準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
前へ
次へ
ホームページトップへ戻る