So-net無料ブログ作成
English Version

レトロマイコン86ボードの構想(その3)V20の動作確認 [8086]

 今回は8088互換チップであるV20(uPD70108H)の簡単な動作確認を行ってみたので記録しておきます。
 前回のPIC24FJのPMP(パラレルマスタポート)機能の確認ではPICとメモリを実装した状態でしたが、ブレッドボードにV20の配線を追加したところ、不安定な状態でなかなか改善しなかったので古いブレッドボードをあまり使っていないものに交換し再度配線し直したところなんとか安定動作するようになりました。

 しかし後述するようにV20のクロックが8MHzの場合は安定に動作していますが、16MHzでは動作しません。

 V20の動作確認をするにあたり、ハンドアセンブルでは辛いのでアセンブラ環境が必要になりますが、free(BSDライセンス)でWindows環境でも使えるNASMを使うことにしました。
 NASMはダウンロードしたアーカイブファイルを解凍してpathを通せばいいだけなのでインストールも楽でWindowsのレジストリが変更されることもありません。

 リンカはVisualStudioのものが使えるようですが、単一のソースファイルであれば(複数ソースをリンクしないのであれば)、-o オプションでバイナリファイルを作成するとアセンブルされたコードの入ったファイルが生成されます。
 このバイナリファイルをPic24CPMの開発時に作成したpicleのステートメントに変換するツールを使いpicleのステートメントに変換し、picleソースに入れ込んでいます。

 ニーモニックの表記でメモリアクセス時は[]で囲むように統一されているのでワークエリアのアドレスなのか、中身なのか混乱することが無い等、インテルのニーモニックより改善されていて使い易くなっています。しかし英語のマニュアルが217ページあり、斜め読みするだけでもある程度の時間が必要です(プアなマニュアルよりは細かく記載されている方が絶対いいけどね)

 V20の動作確認のために下のリストのような簡単なものを作りました。

V20動作確認ソース
1 ;***************************** 2 ; Pic24V20 test 3 ; 2019/07/26 by skyriver 4 ;***************************** 5 6 7 CPU 8086 8 9 segment code 10 11 org 0200h 12 13 00000000 8CC8 start: mov ax, cs 14 00000002 8ED8 mov ds, ax 15 00000004 B83412 mov ax,1234h 16 00000007 A3[0D00] mov [data],ax 17 0000000A E9FDFF jmp $ 18 0000000D 90 data: nop 19 0000000E 90 nop 20 0000000F 90 nop 21 00000010 90 nop 22


 処理内容としてはプログラムの末尾に0x1234を書込むという単純なものです。
 メモリ(K6T4008C1B-DB70)は512KBのものを1個使用していて、V20のメモリ空間(1MB)の半分のサイズですが、V20のリセット直後の実行アドレスがメモリのエンド領域(0xffff0)なのでメモリ空間の後半に前半と同じイメージが見えてアクセスできるようにしています。

 アセンブルとpicleステートメントへの変換操作は

アセンブルとpicleステートメントへの変換操作
C:\src\picle\V20\asm\nasm>type asm.bat nasm -l %1.lst -o %1.bin %1.asm C:\src\picle\V20\asm\nasm>asm v20test C:\src\picle\V20\asm\nasm>nasm -l v20test.lst -o v20test.bin v20test.asm C:\src\picle\V20\asm\nasm>bin2state <v20test.bin >v20test.txt


こんな感じです。

 下記はV20動作テスト用のpicleソースを表示後、実行した際のログです。
 V20のプログラム実行により0x020dからの2バイトが想定通り0x1234に書き換えられていることが判ります。
 41行目でV20がリセット直後に実行する0xffff0アドレスに 0000:0200 へのファージャンプ命令を書込んでいます。

PMP機能確認用picleソース
:l 1:# V20 run test 2019/07/26 2:# by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7: 8:proc MemDsp( adr ) { 9: var i; 10: PmpSetAdr( adr ); 11: i = MemRd(); 12: PrnStr_("\n"); 13: PrnHex_(adr); 14: PrnStr_(" :"); 15: for ( i=0; i<8; i=i+1 ) { 16: PrnStr_(" "); 17: PrnHexB_(MemRd()); 18: } 19:} 20: 21: 22:proc m( data ) { 23: MemWr( data ); 24:} 25: 26: 27:proc main() { 28: var adr; 29: init(); 30: initPmp(); 31:# initSpi(); 32:# initSd(); 33: 34: LATA[0]=LATA[0]|1; # on reset:a0 35: BusReq(); 36: LATA[0]=LATA[0]&$fffe; # off reset:a0 37: 38: PmpOn(); 39: 40: PmpSetAdr($07f0); 41: m($ea);m($00);m($02);m($00);m($00); 42: 43: MemDsp($7f0); 44: 45: adr = $0200; 46: PmpSetAdr(adr); 47: 48: m($8c);m($c8);m($8e);m($d8);m($b8);m($34);m($12);m($a3); 49: m($0d);m($02);m($e9);m($fd);m($ff);m($90);m($90);m($90); 50: m($90); 51: 52: dump(adr); 53: PmpOff(); 54: 55: LATA[0]=LATA[0]|1; # on reset:a0 56: BusRelease(); 57: Timer_ = 1; 58: while ( Timer_ ); 59: LATA[0]=LATA[0]&$fffe; # off reset:a0 60: 61: Timer_ = 10; 62: while ( Timer_ ); 63: 64: BusReq(); 65: PmpOn(); 66: PrnStr_( "\n------------" ); 67: MemDsp($7f0); 68: dump(adr); 69: PmpOff(); 70:} :run 07F0 : EA 00 02 00 00 DD 61 FF 0200 : 8C C8 8E D8 B8 34 12 A3 0D 02 E9 FD FF 90 90 90 0210 : 90 90 22 CC 22 AD 61 FA B1 BB 1A E5 02 A7 08 FB 0220 : 35 AC 09 7D 9C 16 80 DD 42 BB 96 BB 04 3D D0 7B 0230 : 51 FB 5E D7 AA 23 C0 2F 51 34 1C F6 01 FD 16 FB 0240 : 70 7F 27 7B B0 3E 0A 56 42 F3 74 DB 40 5B 01 B6 0250 : 0A BE 6E BB 84 5E 48 D5 D3 DF 04 56 20 75 03 1A 0260 : 7C AA 0D 7C 8A BA C9 8F CE DD 3E E5 B8 FB 01 F7 0270 : 91 F8 E9 3A 03 EF 02 F6 CA F9 00 F7 45 EF 51 7E ------------ 07F0 : EA 00 02 00 00 DD 61 FF 0200 : 8C C8 8E D8 B8 34 12 A3 0D 02 E9 FD FF 34 12 90 0210 : 90 90 22 CC 22 AD 61 FA B1 BB 1A E5 02 A7 08 FB 0220 : 35 AC 09 7D 9C 16 80 DD 42 BB 96 BB 04 3D D0 7B 0230 : 51 FB 5E D7 AA 23 C0 2F 51 34 1C F6 01 FD 16 FB 0240 : 70 7F 27 7B B0 3E 0A 56 42 F3 74 DB 40 5B 01 B6 0250 : 0A BE 6E BB 84 5E 48 D5 D3 DF 04 56 20 75 03 1A 0260 : 7C AA 0D 7C 8A BA C9 8F CE DD 3E E5 B8 FB 01 F7 0270 : 91 F8 E9 3A 03 EF 02 F6 CA F9 00 F7 45 EF 51 7E :


 冒頭でも書いたように V20(16MHz対応版)のクロックを16MHにすると動作しなかったので8Mhzにして動作確認しています。
 それぞれのクロックでのメモリリード時の波形サンプルを下図に示します。この時のロジアナのサンプリング周波数は50MHzなので分解能は20nsです。

 16MHzの波形の方はアドレスラッチストローブ(LATCH)の立下りととアドレス線(AD0)の変化までの時間が20ns(50MHz相当)なので結線の接触抵抗が生じるブレッドボードでは厳しいかもしれません。回路的にはV20のクロックをジャンパピンにより8MHz/16MHzの切り換え可能にし、プリント基板化した際に16Mzで動作するか確認する予定です。

クロック8MHz時のメモリリード波形サンプル(結果:OK)


クロック16MHz時のメモリリード波形サンプル(結果:NG)


 今回使用しているV20は uPD70108HCZ-16 なのですがreset中のWR/、RD/信号に関して、マニュアルにはハイレベルに保たれると書かれていますが、今回使用しているものでは下図のロジアナ波形のOE/とWR/に示すようにRESETがハイレベルの時でもローレベル(プルアップするとハイレベルになったのでハイインピーダンス状態と思われる)でした。
 reset解除後、6バイト読込んでからジャンプ(A15:low)していますが、ジャンプ命令は5バイトなので最後の1バイトはプリフェッチによるアクセスですね。

 また、hold 時にASTBがハイインピーダンスにならないことも、今回のようにアドレスとデータを分離前のバスをPICで制御する場合は使いづらいです。ロジックICを使えば簡単に対応できますが、今回は抵抗を使って対処しています。

マニュアル記載内容


reset解除直後の波形サンプル



[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。