地中海クルーズに行ってきましたので、動作確認が中断していました。下記は、乗船したMSCメラビリアです。5か国周遊をしてきました。
さて、CMTインタフェースの動作確認を行ったところ、CMT出力は問題なかったのですが、CMT入力の問題がみつかりました。設計当初、ゲート数の削減を行いましたが、フィルター部分の変更を忘れていました。幸いプリント基板の配線を切ったりするまでの対応は必要なく、ダイオードD1の極性入替と抵抗R7のプルアップへの変更で済みました。
下記は、JP2、JP3、JP4のハンダ付ショートとR7の実装変更部分です。また、基板表側のダイオードD1は、極性を入れ替えてください。
下記は、回路図上の変更箇所です。
CMTインタフェースの信号は、1200BPSである必要がありますが、このタイミングは、ソフトウェア・タイマーを使い作成していますので、CPUの動作速度に依存してしまいます。オリジナルのTK-80は、CPUクロックが2.048MHzで、バスサイクルにWAITを1サイクル入れています。一方、SBC8080では、CPUクロックが2.0MHzで、WAITサイクルは入っていません。SBC8085では、CPUクロックが3.0MHzで、WAITサイクルは入っていません。このような差を吸収するため、CPUの種類、CPU周波数の検出を行い、適切なソフトウェア・タイマーを動作させるようにしました。
①CPUの種類の検出
8085には、RIM命令が追加されています。8080では、NOP扱いになりますので、RIM命令でアキュームレータの値が変われば、8085であることを検出できます。
②CPU周波数の検出
CPU周波数検出のため、JP4を設けました。このジャンパは、8255のポートB1からCMT用の変調用信号を読み込むことができるようにしました。この信号は、無安定マルチバイブレータで作られ、CRの値やロジックの閾値電圧によって若干周波数偏差がありますが、1MHz単位程度の検出はできます。検出方法は、4サイクルの信号をループカウント値で求めています。検出結果は、電源立ち上げ時に約3秒間LED表示させるようにしました。
電源立ち上げ時のLED表示
8080 2.0MHz 1-Wait "8080" "2.0-1"
8080 2.0MHz 0-Wait "8080" "2.0-0"
8080 3.0MHz "8085" "3.0 "
8085 2.0MHz "8085" "2.0 "
8085 3.0MHz "8085" "3.0 "
8085 4.0MHz "8085" "4.0 "
8085 5.0MHz "8085" "5.0 "
③ソフトウェア・タイマー
オリジナルのTK-80モニター「BIT TIMER & CHATTERING TIMER」の内部では、125uSのタイマーを必要回数実行するようになっています。上記の7種類に対応した125uSのタイマーを用意し、動的切替できるようにしました。
以上の拡張機能パッチをオリジナルに当てることで、CMTインタフェースを正しく動作させることができます。
<font color="#ff0000">SBC8080 SUBボードのRAMが32KBより小さい場合問題があるため、更新しました。<font color="#000000">
下記は、そのソースコードです。
T125US EQU 8400H ; 125uS Timer Subroutine Pointer Address
MONST EQU 003BH ; TK-80 "INITIALIZE ROUTINE" Address
MONSP EQU 83D1H ; STACK for TK-80 monitor
TLOOP EQU 02E5H ; TK-80 "BIT TIMER & CHATTERING TIMER" Loop Entry Address
LED0 EQU 3FH ; Segment Value of "0"
LED5 EQU 6DH ; Segment Value of "5"
LED3P EQU 0CFH ; Segment Value of "3."
LED4P EQU 0E6H ; Segment Value of "4."
LED5P EQU 0EDH ; Segment Value of "5."
LED80 EQU 3F7FH ; Segment Values of "80"
LED_1 EQU 0640H ; Segment Values of "-1"
LED2P0 EQU 3FDBH ; Segment Values of "2.0"
LED3P0 EQU 3FCFH ; Segment Values of "3.0"
DIG1 EQU 83F8H ; Digit #1 LED Segment Data Address
DIG2 EQU 83F9H ; Digit #2 LED Segment Data Address
DIG3 EQU 83FAH ; Digit #3 LED Segment Data Address
DIG4 EQU 83FBH ; Digit #4 LED Segment Data Address
DIG5 EQU 83FCH ; Digit #5 LED Segment Data Address
DIG6 EQU 83FDH ; Digit #6 LED Segment Data Address
DIG7 EQU 83FEH ; Digit #7 LED Segment Data Address
DIG8 EQU 83FFH ; Digit #8 LED Segment Data Address
PPI_CW EQU 0FBH ; PPI 8255 Control Word I/O Address
PPI_PC EQU 0FEH ; PPI 8255 Port-C Register I/O Address
PPI_PB EQU 0FDH ; PPI 8255 Port-B Register I/O Address
ORG 0004H ; RESET routine
JMP START ; Patch Instruction
ORG 02DFH ; TK-80 "BIT TIMER & CHATTERING TIMER" 125uS Timer Entry Address
WAIT: PUSH H ; Patch Instruction
LHLD T125US ; Patch Instruction
PCHL ; Patch Instruction
NOP ; Patch Instruction
ORG 0300H ; TK-80 Extension
; for 8080(2MHz 1Wait,3MHz)/8085(2,3,4,5MHz) Entry Address
START: MVI A,92H ; Initialize PPI
OUT PPI_CW
MVI A,01H
OUT PPI_PC
LXI SP,MONSP; SETUP SP
MVI D,00H ; Sensing CPU Clock Frequency
LOOP1: INR D
JZ DONE
CALL TEST
JNZ LOOP1 ; Searching 1->0 edge of PB1(CMT Modulation Generator)
INR D
JZ DONE
LOOP2: INR D
JZ DONE
CALL TEST
JZ LOOP2 ; Searching 0->1 edge of PB1(CMT Modulation Generator)
INR D
JZ DONE
LOOP3: INR D
JZ DONE
CALL TEST
JNZ LOOP3 ; Searching 1->0 edge of PB1(CMT Modulation Generator)
INR D
JZ DONE
LOOP4: INR D
JZ DONE ; Searching 0->1 edge of PB1(CMT Modulation Generator)
CALL TEST
JZ LOOP4
DONE: MOV A,D
ORA A
JZ EXIT ; if timeout, exit TK-80 Extension
LXI H,LED80
SHLD DIG1 ; Set LED "80**" "****"
MVI A,55H
RIM ; 8085 instruction
CPI 55H ; Examine 8085 CPU
JNZ CPU85
CPU80: SHLD DIG3
LXI H,LED2P0 ; Set LED "****" "2.0**"
SHLD DIG5
LXI H,LED_1 ; Set LED "****" "**_1"
MOV A,D
LXI D,D80_1W ; Set 8080 2MHz 1Wait 125uS Timer Address
CPI 42H ; CPU Clock Frequency Threshold Value
JC I80_1W
CPI 5DH ; CPU Clock Frequency Threshold Value
JC I80_0W
I80_3M: LXI H,LED3P0 ; Set LED "****" "3.0**"
LXI D,D80_3M ; Set 8080 3MHz 125uS Timer Address
JMP VECT85
I80_0W: MVI H,LED0 ; Set LED "****" "***0"
LXI D,D80_0W ; Set 8080 2MHz 125uS Timer Address
I80_1W: SHLD DIG7
JMP VECT
CPU85: MVI H,LED5
SHLD DIG3
LXI H,LED2P0 ; Set LED "****" "2.0**"
MOV A,D
LXI D,D85_2M ; Set 8085 2MHz 125uS Timer Address
CPI 0B3H ; CPU Clock Frequency Threshold Value
JNC I85_5M
CPI 8BH ; CPU Clock Frequency Threshold Value
JNC I85_4M
CPI 62H ; CPU Clock Frequency Threshold Value
JC VECT85
I85_3M: MVI L,LED3P ; Set LED "****" "3.***"
LXI D,D85_3M ; Set 8085 3MHz 125uS Timer Address
JMP VECT85
I85_4M: MVI L,LED4P ; Set LED "****" "4.***"
LXI D,D85_4M ; Set 8085 4MHz 125uS Timer Address
JMP VECT85
I85_5M: MVI L,LED5P ; Set LED "****" "5.***"
LXI D,D85_5M ; Set 8085 5MHz 125uS Timer Address
VECT85: SHLD DIG5
MVI L,00H
MOV H,L ; Set LED "****" "** "
SHLD DIG7
VECT: XCHG
LDA T125US
CMP L
JNZ DISP
LDA T125US+1
CMP H
JZ EXIT ; Skip displaying LED
DISP: SHLD T125US
MVI A,80H
OUT PPI_PC
MVI A,4AH
TIMER: MVI D,0D8H
CALL WAIT
DCR A
JNZ TIMER
EXIT: JMP MONST
TEST: MOV B,D ; Searching 0->1 edge of PB1 and
; sensing PB1 after for while
SENCE1: IN PPI_PB
ANI 02H
JNZ SENCE1 ; Waiting for PB1 = 0
SENCE2: IN PPI_PB
ANI 02H
JZ SENCE2 ; Waiting for PB1 = 1 (0->1 edge)
DCR B
JNZ $-1 ; Waiting until B = 0
IN PPI_PB
ANI 02H ; Sensing PB1
RET
D80_1W: POP H ; 8080 2MHz 1Wait 125uS Timer(TK-80 Original Setting)
MVI E,08H
MVI E,08H
DCR E
JNZ $-1
JMP TLOOP
D80_0W: POP H ; 8080 2MHz 125uS Timer
NOP
MVI E,0BH
MVI E,0BH
DCR E
JNZ $-1
JMP TLOOP
D80_3M: POP H ; 8080 3MHz 125uS Timer
NOP
NOP
NOP
NOP
MVI E,13H
DCR E
JNZ $-1
JMP TLOOP
D85_2M: POP H ; 8085 2MHz 125uS Timer
NOP
NOP
NOP
NOP
MVI E,0BH
MVI E,0BH
DCR E
JNZ $-1
JMP TLOOP
D85_3M: POP H ; 8085 3MHz 125uS Timer
NOP
NOP
NOP
NOP
NOP
MVI E,14H
DCR E
JNZ $-1
JMP TLOOP
D85_4M: POP H ; 8085 4MHz 125uS Timer
NOP
NOP
NOP
MVI E,1DH
MVI E,1DH
DCR E
JNZ $-1
JMP TLOOP
D85_5M: POP H ; 8085 5MHz 125uS Timer
NOP
NOP
NOP
MVI E,26H
MVI E,26H
DCR E
JNZ $-1
JMP TLOOP
下記は、アセンブル後のパッチです。オリジナルに追加してROMを焼くことになります。
:03000400C3000333
:0602DF00E52A0084E9009D
:100300003E92D3FB3E01D3FE31D183160014CA4185
:1003100003CDDF03C20D0314CA410314CA4103CD48
:10032000DF03CA1B0314CA410314CA4103CDDF0310
:10033000C2290314CA410314CA4103CDDF03CA37DB
:10034000037AB7CADC03217F3F22F8833E5520FEA3
:1003500055C2820322FA8321DB3F22FC832140061F
:100360007A11F703FE42DA7C03FE5DDA770321CFD0
:100370003F111004C3B203263F11030422FE83C3BE
:10038000BB03266D22FA8321DB3F7A111E04FEB3E4
:10039000D2AD03FE8BD2A503FE62DAB2032ECF11DB
:1003A0002E04C3B2032EE6113D04C3B2032EED1199
:1003B0004C0422FC832E006522FE83EB3A0084BDB0
:1003C000C2CA033A0184BCCADC032200843E80D343
:1003D000FE3E4A16D8CDDF023DC2D303C33B0042E6
:1003E000DBFDE602C2E003DBFDE602CAE70305C26D
:1003F000EE03DBFDE602C9E11E081E081DC2FC0378
:10040000C3E502E1001E0B1E0B1DC20904C3E50279
:10041000E1000000001E131DC21704C3E502E10045
:100420000000001E0B1E0B1DC22704C3E502E100E5
:10043000000000001E141DC23604C3E502E10000E6
:10044000001E1D1E1D1DC24504C3E502E100000083
:0B0450001E261E261DC25404C3E50238
:00000001FF
下記は、電源投入時LED表示(TK-80 オリジナル相当)です。
下記は、電源投入時LED表示(8085 5MHz)です。
下記は、8085 5MHzでCMT録音後、8080 2MHz 1-Waitで無事読み込みが成功しました。
ということで、今後必要に応じ、基板の修正(Rev0.91)を行いたいと思います。
(再クロール更新:2022/12/22)