SSブログ
English Version

ポケコン(G850)用拡張基板(その2)確認事項 [ポケコン]

 前回の記事で書いた PC-G850 用の拡張基板(Eborsy)が届いているので部品実装しました。
 下の写真がトップ面で右下の白いコネクタは aitendo さんから購入した PC-G850 のシステムバスに適合するものです。各信号は確認し易いようにボトム面に実装したピンソケットに出していて、信号名をトップ面にもシルク印刷しましたが、薄暗い場所では字が小さくて良く見えませんw

Bborsy 部品実装後(トップ面)


 ボトム面が下の写真で、GALとメモリ等を実装しています。SDコネクタから怪しげな線が GAL のソケットの下に這い出ていますが、基板製造依頼後に気が付いた SPI の DI 信号線です^^;
 最初は接続していたはずなのですが、いつの間にか無くなっていました。再発防止の意味でも原因分析と対策が必要なので、記憶を辿ってみるにSDコネクタ部を1回書き直す必要があり、変更前の画面表示をキャプチャし、それを参考に変更した際に抜けてしまったようです。今後はある程度の変更が生じる場合、変更前のCADファイを残して変更後に比較するようにしたいと思います。

Bborsy 部品実装後(ボトム面)


 それでは今の時点で確認できたことを以下に列挙します。

  1. IORQ/でGALが動作可能か?
     結果:可能

    [詳細]
     前回の記事でも書いたように、この基板を作成しようと思った動機は GAL のクロック信号として IORQ/ を使えると思い付いたからです(特に Wincupl のシミュレータを使っているとクロックは周期的なものであるという固定観念が付いてしまうw)。
     GAL はクロックの立上りエッジでレジスタをラッチするので WR/ 信号を認識するために WR/信号に少しディレーをかけて GAL に入力しています(Z80は IORQ/とWR/の立上りはほぼ同時)
     始めに SDカードの チップセレクト信号である SDCS/ を I/O 命令で設定できるか確認してみました。試験用のプログラムは下記になります。

    SDCS/ 設定試験プログラム(Z80アセンブラ)
    ;+++++++++++++++++++++++++++++++++++ ; test program for Eborsy ; Ver 0.01 2021/12/18 by skyriver ;+++++++++++++++++++++++++++++++++++ 0100 ORGAD EQU 0100H ; +++ 850 I/O +++ 0017 INTMASK EQU 017H ; interrupt mask ; +++ GAL I/O address +++ 0080 AdrSdcs EQU 80H ; set SDCS(D0) 0081 AdrSpiD EQU 81H ; write/read SPI data(D0) 0000' ASEG ORG ORGAD 0100 DB 17 Start: IN A,(INTMASK) 0102 5F LD E,A 0103 AF XOR A 0104 D3 17 OUT (INTMASK),A ; no effect 0106 F3 DI 0107 01 0000 LD BC,0000H 010A AF XOR A 010B D3 80 LOOP: OUT (AdrSdcs),A 010D EE 01 XOR 1 010F 10 FA DJNZ LOOP 0111 0D DEC C 0112 20 F7 JR NZ,LOOP 0114 7B LD A,E 0115 D3 17 OUT (INTMASK),A 0117 FB EI 0118 C9 RET END

     PC-850V は周期的にかなり割込み処理が行われているので割込み禁止の状態で実行しました。念のために 17H ポートで割込みマスクもかけていますが、このマスクは掛けなくても変化はないようでした(周期的にかかっている割込みには NMI は無いと思われる)
     前述の WR/ のディレー状況をロジアナで確認した結果が下図です。

    WR/と GAL 用 WRdlay/ 信号 [sampling:100MHz]

     立上りエッジの遅れは立下りに比べてかなり少なくっています。全体的な図が下図で、SDCS/ 設定のために OUT命令が繰返されていることが判ります。SDCS/をトグルで変更しているはずなのですが SDCS/ に変化は見られません^^;

    SDCS/ 設定プログラム実行結果 [sampling:25MHz]

     前述のWR/ の立上りのディレー時間が少ないためかと思いディレー用コンデンサを 22pF から 68pF に変更後のロジアナ波形が下図になります。

    WR/と GAL 用 WRdlay/ 信号(68 pFに変更後) [sampling:100MHz]

     立上りエッジのディレーは多くなりましたが SDCS/ が設定できないという状況は変わりませんでした。基本に返り、GAL の仕様を確認したところ、遅れ無し(th)でも問題無いようです。

    GAL22V10 Specification 1

    GAL22V10 Specification 2

     WR/ のディレー幅に問題ないことが判ったので GAL のcuplソースを再確認し、修正したところ、SDCS/ が設定できるようになりました^^;

    SDCS/ 設定OK1 [sampling:32MHz]

    SDCS/ 設定OK2 [sampling:32MHz]


  2. C000Hバンク切替えで外部メモリアサイン可能か?
     結果:可能性は見いだせなかった

    [詳細]
     SDCS/ が設定できるようになり、トリガやマーキングに使えるので作業が少し楽になりました。今回作成した C000H バンク切替え試験プログラムは下記でバンクを 0~15 に切替えそれぞれ 100H バイトをバッファにコピーするというものです。
     また、このプログラムを実行する際はデータバスの LSB(D0)を 10K でプルアップしているので、もし対応メモリが無く、データバスがフローティング状態になった場合には リード時に D0 が 1 に固定されるはずです。特にバンク0は N/A(Not Available?)と記されていたので期待したいところです(詳細は前回の記事を参照して下さい)

    バンク(C000H)切替え試験プログラム(Z80アセンブラ)
    ;+++++++++++++++++++++++++++++++++++ ; Bank C000H test for Eborsy ; Ver 0.01 2021/12/18 by skyriver ;+++++++++++++++++++++++++++++++++++ 0100 ORGAD EQU 0100H ; +++ 850 I/O +++ 0017 INTMASK EQU 017H ; interrupt mask 0019 BANKSEL EQU 019H ; select bank 8000h,c000h ; +++ GAL I/O address +++ 0080 AdrSdcs EQU 80H ; set SDCS(D0) 0081 AdrSpiD EQU 81H ; write/read SPI data(D0) ; +++ memory adress +++ C000 BNKADR EQU 0C000H 1000 SAVADR EQU 01000H 0000' ASEG ORG ORGAD 0100 F3 Start: DI 0101 21 1000 LD HL,SAVADR 0104 1E FF LD E,0FFH 0106 3E 20 LD A,high SAVADR + 010H 0108 73 Ini: LD (HL),E 0109 23 INC HL 010A BC CP H 010B C2 0108 JP NZ,Ini 010E 3E 01 LD A,1 0110 D3 80 OUT (AdrSdcs),A ; set SDCS:0 0112 DB 19 IN A,(BANKSEL) 0114 F5 PUSH AF 0115 11 1000 LD DE,SAVADR 0118 E6 F0 AND 0F0H 011A D3 19 Loop: OUT (BANKSEL),A 011C 21 C000 LD HL,BNKADR 011F 01 0100 LD BC,0100H 0122 ED B0 LDIR 0124 3C INC A 0125 F5 PUSH AF 0126 E6 0F AND 0FH 0128 CA 012F JP Z,NEXT 012B F1 POP AF 012C C3 011A JP Loop 012F F1 NEXT: POP AF 0130 AF XOR A 0131 D3 80 OUT (AdrSdcs),A ; set SDCS:1 0133 F1 POP AF 0134 D3 19 OUT (BANKSEL),A ; restore setting 0136 FB EI 0137 C9 RET END

     実行中のロジアナ波形が下図になります。SDCS/ が 0 の部分がバンク切替えしている箇所になります。BK0,BK1にバンク番号の下位 2bit が出力されているのが面白いですね。

    バンク(C000H)切替え試験実行中のロジアナ波形1 [sampling:25MHz]

     拡大したものが下図で BK0 が出力されているのはブロック転送中の3回目のメモリリードなので C000H のバンク内をリードしている時になります。

    バンク(C000H)切替え試験実行中のロジアナ波形2 [sampling:25MHz]

     C000H のバンクを切り替えながら各バンクの先頭 100H バイトをコピーした結果が下記になります(モニタでHex出力したものをZSIDで読込みダンプコマンドで表示しました)
     期待していた バンク0 もプログラムが詰まっています。バンク10(1A00H)、バンク11(1B00H)、バンク12(1C00H)の3つのバンクで同じ内容が読めているのも面白いですね。

    バンク(C000H)切替え試験プログラム結果
    #d1000 1000: C3 AD 13 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 1010: 21 31 7F CB 8E 21 18 7F 18 12 21 31 7F CB 96 21 !1...!....!1...! 1020: 20 7F 18 08 21 31 7F CB 86 21 10 7F 3E 00 77 2C ...!1...!..>.w, 1030: 77 2C 77 2C 77 2C 77 2C 77 2C 77 2C 77 C9 21 31 w,w,w,w,w,w,w.!1 1040: 7F CB 8E 21 18 7F 06 08 3E 00 77 2C 10 FC 2E 1A ...!....>.w,.... 1050: CB E6 C9 21 19 7F 18 0D 21 21 7F 18 08 21 29 7F ...!....!!...!). 1060: 18 03 21 11 7F 7E E6 F0 77 2C 06 06 3E 00 77 2C ..!..~..w,..>.w, 1070: 10 FC C9 21 18 7F 18 03 21 10 7F 36 00 2C 7E E6 ...!....!..6.,~. 1080: 0F 77 C9 C3 32 85 CB 9E CB 4E 28 02 CB DE 11 28 .w..2....N(....( 1090: 7F 18 22 C3 59 85 CB 8E CB 5E 28 02 CB CE 11 18 ..".Y....^(..... 10A0: 7F 21 28 7F C3 19 81 C3 70 85 CB 86 CB 4E 28 02 .!(.....p....N(. #d1100 1100: 3E 01 D3 1A 31 FE 7F 3E 8B D3 7B 3E A0 D3 7A 3E >...1..>..{>..z> 1110: 01 D3 69 3E FF D3 16 AF D3 1B D3 11 D3 12 3E 02 ..i>..........>. 1120: D3 1E 06 D2 CB 47 CB 47 10 FA DB 1D 4F 06 0A 10 .....G.G....O... 1130: FE DB 1D A1 1F DA D6 BC 3E 03 D3 1E 21 03 79 CB ........>...!.y. 1140: 86 21 40 7F 3E 5A 77 BE 28 28 DB 19 E6 0F F6 40 .!@.>Zw.((.....@ 1150: D3 19 3E 01 D3 69 11 00 80 21 DA C3 06 11 1A BE ..>..i...!...... 1160: 20 07 13 23 10 F8 C3 10 80 3E 01 D3 19 D3 69 C3 ..#.....>....i. 1170: D6 BC 3E 01 32 00 79 CD D6 BF CD D3 BF 21 27 7F ..>.2.y......!'. 1180: 3E A5 06 06 BE 20 0B 23 10 FA BE 28 08 3E 5A BE >.... .#...(.>Z. 1190: 28 03 CD 9D C0 21 00 79 36 01 C3 CC C0 3E C3 32 (....!.y6....>.2 11A0: 00 00 21 F4 BF 22 01 00 21 03 00 06 3D AF 77 23 ..!.."..!...=.w# #d1200 1200: CD 00 DC 38 09 CD 9D FE C9 00 00 00 00 00 21 1D ...8..........!. 1210: 7F 11 15 7F 01 02 00 ED B0 1A 86 12 A7 C9 CD 00 ................ 1220: DC DA 8C 83 CD 97 FE C9 00 00 00 00 00 CD 91 FE ................ 1230: C9 00 00 00 00 00 00 00 00 CD 8B FE C9 00 00 00 ................ 1240: 00 00 00 00 00 CD 85 FE C9 00 00 00 00 00 00 00 ................ 1250: 00 00 00 00 CD 7F FE C9 00 00 00 00 00 CD 79 FE ..............y. 1260: C9 00 00 00 00 00 CD 73 FE C9 00 00 00 00 00 CD .......s........ 1270: 6D FE C9 00 00 00 00 00 CD 67 FE C9 00 00 00 00 m........g...... 1280: 00 CD 61 FE C9 00 00 00 00 00 CD 5B FE C9 00 00 ..a........[.... 1290: 00 00 00 CD 55 FE C9 00 00 00 00 00 CD 4F FE C9 ....U........O.. 12A0: 00 00 00 00 00 CD 49 FE C9 00 00 00 00 00 CD 43 ......I........C #d1300 1300: 7B FE 00 30 02 1E 00 7A FE 06 38 02 16 05 7E B7 {..0...z..8...~. 1310: C8 FE 0D 28 15 FE 0C 28 25 FE 10 38 1E D5 E5 CD ...(...(%..8.... 1320: 5F BE E1 D1 1C 7B FE 18 38 11 1E 00 14 7A FE 06 _....{..8....z.. 1330: 38 09 E5 D5 CD EB BF D1 E1 16 05 23 18 D0 E5 D5 8..........#.... 1340: CD 68 C3 D1 E1 18 F4 E5 F5 CD 72 C3 F1 57 FE 06 .h........r..W.. 1350: 38 00 1E 00 06 18 E1 7E B7 C8 FE 0D C8 E5 D5 C5 8......~........ 1360: CD 5F BE C1 D1 E1 1C 23 10 ED C9 F5 3A E3 7E E6 ._.....#....:.~. 1370: FD 18 06 F5 3A E3 7E F6 02 32 E3 7E F1 C5 D5 E5 ....:.~..2.~.... 1380: FE 20 30 24 FE 05 28 1C FE 1D 28 32 FE 1C 28 33 . 0$..(...(2..(3 1390: FE 08 28 34 FE 09 28 35 FE 12 28 36 FE 0C 28 37 ..(4..(5..(6..(7 13A0: FE 0B 28 33 E1 D1 C1 C9 FE F9 30 F8 CD B9 C2 CD ..(3......0..... #d1400 1400: 20 20 20 20 20 20 20 2A CD 05 C7 D0 CD 0C C7 D0 *........ 1410: FE 23 D8 FE 2A 3F D0 FE 2D C8 FE 40 C8 FE 5E D8 .#..*?..-..@..^. 1420: FE 60 3F D0 C8 FE 7C 3F D0 FE 7D C8 FE A1 D8 FE .`?...|?..}..... 1430: E0 3F C9 21 11 79 CB 86 CD F5 C6 FE 42 20 05 CB .?.!.y......B .. 1440: C6 CD F5 C6 DD 2B FE 0D 20 2C DD E5 CD F9 BD DD .....+.. ,...... 1450: E1 F5 CD 57 C0 F1 C9 21 7D 79 CB 86 CD 33 C7 20 ...W...!}y...3. 1460: 15 21 65 79 CB 96 3E 20 06 90 11 00 00 CD EE BF .!ey..> ........ 1470: AF 3D 32 23 79 C9 DD 23 C3 79 83 C5 D5 06 91 21 .=2#y..#.y.....! 1480: 00 7E E5 3E 20 77 23 10 FC 21 00 00 22 0E 79 CD .~.> w#..!..".y. 1490: B1 C4 20 14 3A 11 79 1F 30 0E CD DC C0 30 FB 21 .. .:.y.0....0.! 14A0: 0E 79 35 37 20 2D 18 30 CD DC C0 38 2B 3E 1E CD .y57 -.0...8+>.. #d1500 1500: 3A 65 79 E6 01 32 65 79 CD 18 C1 CD 3F C1 DD 56 :ey..2ey....?..V 1510: 4A DD 5E 4B CD 8B C2 DD 56 02 DD 5E 03 CD A7 C2 J.^K....V..^.... 1520: CD D6 C1 21 00 00 39 DD 74 0A DD 75 0B CD 4C C2 ...!..9.t..u..L. 1530: D8 3E 0B CD B0 E3 CD 0F C2 3E 07 30 08 CD B0 E3 .>.......>.0.... 1540: CD E1 D5 18 FB DD CB 4E 56 28 08 3E 15 CD DB D6 .......NV(.>.... 1550: DA BE DE 3E 0C CD 75 E5 CD C0 C2 DD CB 4C C6 DD ...>..u......L.. 1560: CB 4E 56 20 06 DD CB 4E 5E 28 05 3E 0F CD 75 E5 .NV ...N^(.>..u. 1570: CD D6 C1 CD 0F C2 CD C2 DC CD C0 C2 DD CB 4E 46 ..............NF 1580: 28 44 CD C8 DD 3E 0D CD B0 E3 DD 66 39 DD 6E 3A (D...>.....f9.n: 1590: 7C B5 20 28 3E 30 CD DB D6 FE 50 28 09 FE D0 28 |. (>0....P(...( 15A0: 05 CD E4 D5 18 EE 3E 0D DD 77 01 31 FE 7F DD E5 ......>..w.1.... #d1600 1600: 7B 84 3E C9 32 38 00 CD 02 D0 3E 00 32 01 79 32 {.>.28....>.2.y2 1610: 02 79 32 04 79 3A 03 79 E6 00 32 03 79 CD F2 C9 .y2.y:.y..2.y... 1620: 21 74 C0 11 00 00 06 90 CD F1 BF CD 02 D0 3E 06 !t............>. 1630: 32 00 79 CD 42 D3 FE 2C CA 04 C1 FE 2D CA 5B D3 2.y.B..,....-.[. 1640: FE 2E CA 8D D3 FE 34 CA DD D3 FE 35 CA 24 C3 FE ......4....5.$.. 1650: 36 CA 71 C2 FE 3C CA 92 C3 FE 3D CA 3A C4 FE 3E 6.q..<....=.:..> 1660: CA 8E CD FE 24 CA 71 D0 FE 01 CA 5F C2 FE 7E CA ....$.q...._..~. 1670: 5F C2 18 BF 2A 20 50 43 2D 47 38 35 30 56 20 56 _...* PC-G850V V 1680: 31 2E 30 32 20 43 48 45 43 4B 20 2A 31 3A 54 4F 1.02 CHECK *1:TO 1690: 54 41 4C 20 20 20 20 20 32 3A 52 41 4D 20 20 20 TAL 2:RAM 16A0: 20 20 20 20 33 3A 52 4F 4D 20 20 20 20 20 20 20 3:ROM #d1700 1700: 21 00 00 22 00 7C 22 01 7C 3E 20 11 00 00 06 60 !..".|".|> ....` 1710: CD EE BF CD 43 C0 38 22 CD 03 C2 CD EF C0 38 1A ....C.8"......8. 1720: CD 1B C2 CD 8E C1 2A 00 7C 11 01 00 19 22 00 7C ......*.|....".| 1730: 3A 02 7C CE 00 32 02 7C 18 CF CD FD BC FE 51 20 :.|..2.|......Q 1740: F9 18 C6 ED 5B 00 7C 3A 30 79 67 24 2E 00 73 23 ....[.|:0yg$..s# 1750: 72 23 13 3E 00 BD 20 F6 3E 78 BC 20 F1 ED 5B 00 r#.>.. .>x. ..[. 1760: 7C 3A 30 79 67 24 2E 00 4E 23 46 23 E5 60 69 A7 |:0yg$..N#F#.`i. 1770: ED 52 E1 20 49 13 7D FE 00 20 ED 7C FE 78 20 E8 .R. I.}.. .|.x . 1780: 21 AD C0 11 00 00 06 11 CD F1 BF 21 E8 7C 3A 02 !..........!.|:. 1790: 7C CD D0 C0 3A 01 7C CD D0 C0 3A 00 7C CD D0 C0 |...:.|...:.|... 17A0: 21 E8 7C 11 12 00 06 06 CD F1 BF A7 C9 52 41 4D !.|..........RAM #d1800 1800: 31 FE 7F 21 65 79 CB 96 AF 32 00 7C 32 01 7C 32 1..!ey...2.|2.|2 1810: 9A 77 CD 6F D4 CD 8D C4 CD 84 C3 31 FE 7F CD 39 .w.o.......1...9 1820: C4 CD 57 C4 CD 27 C5 FE 0D 28 F0 FE 05 28 EC FE ..W..'...(...(.. 1830: 0C 28 E8 FE 0B 28 E4 FE 43 28 0E FE 54 28 0F FE .(...(..C(..T(.. 1840: 47 28 16 FE 53 28 1C 18 D8 CD 80 C0 18 D3 CD 7B G(..S(.........{ 1850: C0 3E 01 32 02 7C C3 0F C2 CD 7B C0 AF 32 02 7C .>.2.|....{..2.| 1860: C3 0F C2 3A 01 7C B7 28 06 AF 32 01 7C 18 B2 CD ...:.|.(..2.|... 1870: AD BE 38 AD 3E 01 32 01 7C 18 A6 3A 00 7C B7 C0 ..8.>.2.|..:.|.. 1880: CD 77 C4 2A 73 79 22 24 7C 2A E3 79 23 22 26 7C .w.*sy"$|*.y#"&| 1890: 2A FC 79 2B 11 F0 00 B7 ED 52 22 28 7C CD 85 CC *.y+.....R"(|... 18A0: 3A 03 7C B7 20 08 3E 01 32 00 7C C3 82 C4 21 B0 :.|. .>.2.|...!. #d1900 1900: 21 00 00 39 22 2E 7C 2A 2A 7C ED 5B 26 7C B7 ED !..9".|**|.[&|.. 1910: 52 28 0D 4D 44 2A 26 7C AF 77 23 0B 79 B0 20 F8 R(.MD*&|.w#.y. . 1920: AF 32 03 7C 32 43 7C 32 44 7C 21 00 00 22 45 7C .2.|2C|2D|!.."E| 1930: 2A 2A 7C 22 30 7C 2A 2C 7C 22 32 7C 22 34 7C 22 **|"0|*,|"2|"4|" 1940: 36 7C 2A 28 7C 22 38 7C 18 06 CD 85 BC 08 FA FF 6|*(|"8|........ 1950: CD B5 BF 20 F5 21 50 C0 E5 2A 38 7C 7E 2B FE 05 ... .!P..*8|~+.. 1960: 30 13 FE 01 28 1D FE 02 28 2C FE 04 28 3F FE 03 0...(...(,..(?.. 1970: 28 47 C3 34 C1 22 38 7C EB 21 16 E6 4F 06 00 09 (G.4."8|.!..O... 1980: 09 09 E9 7E 2B 56 2B 5E 2B 22 38 7C ED 53 49 7C ...~+V+^+"8|.SI| 1990: 21 16 E9 C3 7C C0 7E 2B 56 2B 5E 2B 22 38 7C 2A !...|.~+V+^+"8|* 19A0: 36 7C 19 22 49 7C EB 21 16 E9 C3 7C C0 7E 2B 22 6|."I|.!...|.~+" #d1a00 1A00: 44 4D 21 00 00 3E 10 29 CB 21 CB 10 30 01 19 3D DM!..>.).!..0..= 1A10: 20 F5 C9 21 00 00 3E 10 CB 23 CB 12 CB 15 CB 14 ..!..>..#...... 1A20: B7 ED 42 30 03 09 18 01 13 3D 20 EC C9 06 00 7E ..B0.....= ....~ 1A30: B7 28 04 23 04 18 F8 78 C9 1A BE 20 09 B7 20 02 .(.#...x... .. . 1A40: 37 C9 23 13 18 F3 B7 C9 EB 1A BE 20 09 B7 20 02 7.#........ .. . 1A50: AF C9 13 23 18 F3 96 C9 1A 77 B7 28 04 23 13 18 ...#.....w.(.#.. 1A60: F7 C9 22 30 7C 7E E6 0F 87 6F 26 00 01 04 7C 09 .."0|~...o&...|. 1A70: 22 32 7C 7E 23 66 6F 22 65 7D 7D B4 28 19 23 23 "2|~#fo"e}}.(.## 1A80: 23 23 EB 2A 30 7C CD 39 C0 38 47 2A 65 7D 7E 23 ##.*0|.9.8G*e}~# 1A90: 66 6F 22 65 7D 18 E3 2A 30 7C CD 2D C0 C6 05 CD fo"e}..*0|.-.... 1AA0: 59 C5 22 65 7D 2A 65 7D 23 23 AF 77 23 77 ED 5B Y."e}*e}##.w#w.[ #d1b00 1B00: 44 4D 21 00 00 3E 10 29 CB 21 CB 10 30 01 19 3D DM!..>.).!..0..= 1B10: 20 F5 C9 21 00 00 3E 10 CB 23 CB 12 CB 15 CB 14 ..!..>..#...... 1B20: B7 ED 42 30 03 09 18 01 13 3D 20 EC C9 06 00 7E ..B0.....= ....~ 1B30: B7 28 04 23 04 18 F8 78 C9 1A BE 20 09 B7 20 02 .(.#...x... .. . 1B40: 37 C9 23 13 18 F3 B7 C9 EB 1A BE 20 09 B7 20 02 7.#........ .. . 1B50: AF C9 13 23 18 F3 96 C9 1A 77 B7 28 04 23 13 18 ...#.....w.(.#.. 1B60: F7 C9 22 30 7C 7E E6 0F 87 6F 26 00 01 04 7C 09 .."0|~...o&...|. 1B70: 22 32 7C 7E 23 66 6F 22 65 7D 7D B4 28 19 23 23 "2|~#fo"e}}.(.## 1B80: 23 23 EB 2A 30 7C CD 39 C0 38 47 2A 65 7D 7E 23 ##.*0|.9.8G*e}~# 1B90: 66 6F 22 65 7D 18 E3 2A 30 7C CD 2D C0 C6 05 CD fo"e}..*0|.-.... 1BA0: 59 C5 22 65 7D 2A 65 7D 23 23 AF 77 23 77 ED 5B Y."e}*e}##.w#w.[ #d1c00 1C00: 44 4D 21 00 00 3E 10 29 CB 21 CB 10 30 01 19 3D DM!..>.).!..0..= 1C10: 20 F5 C9 21 00 00 3E 10 CB 23 CB 12 CB 15 CB 14 ..!..>..#...... 1C20: B7 ED 42 30 03 09 18 01 13 3D 20 EC C9 06 00 7E ..B0.....= ....~ 1C30: B7 28 04 23 04 18 F8 78 C9 1A BE 20 09 B7 20 02 .(.#...x... .. . 1C40: 37 C9 23 13 18 F3 B7 C9 EB 1A BE 20 09 B7 20 02 7.#........ .. . 1C50: AF C9 13 23 18 F3 96 C9 1A 77 B7 28 04 23 13 18 ...#.....w.(.#.. 1C60: F7 C9 22 30 7C 7E E6 0F 87 6F 26 00 01 04 7C 09 .."0|~...o&...|. 1C70: 22 32 7C 7E 23 66 6F 22 65 7D 7D B4 28 19 23 23 "2|~#fo"e}}.(.## 1C80: 23 23 EB 2A 30 7C CD 39 C0 38 47 2A 65 7D 7E 23 ##.*0|.9.8G*e}~# 1C90: 66 6F 22 65 7D 18 E3 2A 30 7C CD 2D C0 C6 05 CD fo"e}..*0|.-.... 1CA0: 59 C5 22 65 7D 2A 65 7D 23 23 AF 77 23 77 ED 5B Y."e}*e}##.w#w.[ #d1d00 1D00: 26 7C 3A 24 79 6F 3A 27 79 BD CA FD C0 3A 25 79 &|:$yo:'y....:%y 1D10: 95 3C 4F 3A 24 79 3D 32 24 79 2B 18 0E 3A 24 79 .<O:$y=2$y+..:$y 1D20: 26 7C 6F 3A 25 79 95 CA FD C0 4F 06 00 54 5D 23 &|o:%y....O..T]# 1D30: ED B0 3A 25 79 3D 32 25 79 CD DC BC 18 32 21 65 ..:%y=2%y....2!e 1D40: 79 CB 4E C2 FD C0 21 26 79 3A 25 79 BE D0 26 7C y.N...!&y:%y..&| 1D50: 3A 24 79 6F 3A 25 79 95 C8 4F 06 00 54 3A 25 79 :$yo:%y..O..T:%y 1D60: 6F 5F 2D D5 ED B8 3A 9B 77 12 D1 1C 7B 32 25 79 o_-...:.w...{2%y 1D70: 2A 22 79 E5 CD 58 BC 3A 25 79 32 13 7F CD 55 BC *"y..X.:%y2...U. 1D80: CD 52 BC 3A 20 79 32 6F 79 E1 ED 5B 22 79 7C 92 .R.: y2oy..["y|. 1D90: D8 28 40 47 3A DA 79 CB 57 28 21 1C 3E 18 93 28 .(@G:.y.W(!.>..( 1DA0: 0A 38 08 D5 47 3E 20 CD EE BF D1 2A 3A 7F 23 23 .8..G> ....*:.## #d1e00 1E00: CD 50 C5 28 2C 21 36 7F CB 4E 20 25 DD E5 E1 CD .P.(,!6..N %.... 1E10: 44 C1 38 1D CD BB BF 38 12 CD 0D BF 3A 12 7F 38 D.8....8....:..8 1E20: 03 3A 17 7F B7 28 05 CD 2B BF B7 C9 CD 79 BF 18 .:...(..+....y.. 1E30: 03 C3 D1 BB DD E5 E1 23 3E 01 32 0A 7F 23 7E FE .......#>.2..#~. 1E40: FF 28 2E 23 23 E5 CD AD C1 FE FE 28 28 FE 3A 20 .(.##......((.: 1E50: 19 23 7E FE FE 20 13 23 7E FE 76 20 0D 3A 0A 7F .#~.. .#~.v .:.. 1E60: 3D 32 0A 7F 28 3C 3C 32 0A 7F E1 5E 16 00 19 18 =2..(<<2...^.... 1E70: CC CD 4F CB C9 23 7E FE 4D 28 12 FE 56 20 EB CD ..O..#~.M(..V .. 1E80: 44 C1 38 E6 3A 0A 7F 3C 32 0A 7F 18 DD 3A 0A 7F D.8.:..<2....:.. 1E90: 3D 32 0A 7F 20 D4 E1 5E 16 00 19 2B E5 DD E1 B7 =2.. ..^...+.... 1EA0: 18 D2 CD AD C1 FE FE 20 14 23 7E FE 56 20 0E E5 ....... .#~.V .. #d1f00 1F00: CD 1F C3 FE 30 CA 1A C0 FE 31 CA 1A C0 FE 0D CA ....0....1...... 1F10: 2E C0 FE 3A CA 2E C0 C3 79 83 D6 30 F5 CD 1F C3 ...:....y..0.... 1F20: FE 0D CA 31 C0 FE 3A CA 31 C0 F1 C3 79 83 3E 00 ...1..:.1...y.>. 1F30: F5 DD 2B DB 60 E6 03 C2 5B C0 F1 CD 61 C0 D0 C2 ..+.`...[...a... 1F40: 56 C0 FE 01 C2 4C C0 3E 84 C3 7B 83 B7 3A 35 7F V....L.>..{..:5. 1F50: CB EF 32 35 7F C9 3E 86 C3 7B 83 F1 3E 72 C3 7B ..25..>..{..>r.{ 1F60: 83 C5 D5 E5 DD E5 FD E5 F5 CD CA BF F1 CD C5 C0 ................ 1F70: DA A6 C0 CD 12 C3 CD 06 C3 CD 06 C3 CD 06 C3 3A ...............: 1F80: 2B C3 47 C5 CD 68 C1 CD AF C1 C1 DA A6 C0 10 F3 +.G..h.......... 1F90: CD 06 C3 CD 06 C3 CD 06 C3 F5 CD 44 BE F1 FD E1 ...........D.... 1FA0: DD E1 E1 D1 C1 C9 C2 C2 C0 B7 20 0D CD 06 C3 CD .......... ..... #

 今時点で確認できたことは以上になります。結果だけを書けば簡潔にまとまるのですが、後で参照できるように作業メモとしてロジアナ波形等も付けたことで雑多感が滲み出だしてきましたので今回はここまでと致します。


★追記 2122/01/01
 「ポケコン(G850)用拡張基板(その6)確認事項5」の記事にバンク No. 16 から 63 までを再調査した結果を記載しました。


[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

Pic24MC68Kマイコン(その5)S-record ローダーの制作 [68K]

 前回の記事で書いたように PIC と MC68K のインターフェース動作が確認できたので MC68K 側のメモリにプログラムをダウンロードするためのモトローラ S-record フォーマットファイルのダウンローダーを準備します。

 今回は「3チップ構成68Kマイコンの構想(その3)Sレコード簡易ローダーの製作」の記事で書いた、以前 68008 環境で行ったことを 68000 環境に合わせて変更するだけなので既にある道を歩いているようなものです。

 まずは MC68K 側のプログラムですが、PIC とのインターフェース部分等を若干変更しました。アセンブル環境は EASy68K を使っています。

S-record ローダーの MC68K側プログラム(アセンブラ)
000FFC00 Starting Address Assembler used: EASy68K Editor/Assembler v5.16.01 Created On: 2021/12/17 19:05:20 00000000 1 ************************************** 00000000 2 * S-record loader for Pic24MC68K 00000000 3 * ver 0.01 2021/12/17 by skyriver 00000000 4 ************************************** 00000000 5 00000000 6 00000000 =000FFDF0 7 PICWRK EQU $0ffdf0 ; PIC service work area 00000000 =000FFE00 8 PICDMA EQU $0ffe00 ; DMA for PIC 00000000 9 00000000 =00000000 10 FC_EXIT equ 0 * EXIT CP/M 00000000 =00000001 11 FC_CONST equ 1 * CONST 00000000 =00000002 12 FC_CONIN equ 2 * CONIN 00000000 =00000003 13 FC_CONOUT equ 3 * CONOUT 00000000 =00000004 14 FC_READ equ 4 * READ SD Card 00000000 =00000005 15 FC_WRITE equ 5 * WRITE SD Card 00000000 =00000006 16 FC_PUNCH equ 6 * PUNCH 00000000 =00000007 17 FC_READER equ 7 * READER 00000000 18 00000000 19 * ++++ work area for PIC Interface 00000000 =000FFDF0 20 FuncNo equ PICWRK ; ds 1 : function No 00000000 =000FFDF1 21 CoData equ PICWRK+1 ; ds 1 : conout data 00000000 =000FFDF2 22 RetVal equ PICWRK+2 ; ds 1 : return value 00000000 =000FFDF3 23 SelDk equ PICWRK+3 ; ds 1 00000000 =000FFDF4 24 Track equ PICWRK+4 ; ds 2 00000000 =000FFDF6 25 DmaAdr equ PICWRK+6 ; ds 2 00000000 =000FFDF8 26 Sector equ PICWRK+8 ; ds 1 00000000 27 00000000 28 000FFC00 29 org $0ffc00 000FFC00 30 000FFC00 227C 000FFDF0 31 start: move.l #PICWRK,a1 000FFC06 6100 0082 32 loop: bsr conin 000FFC0A B03C 0053 33 cmp.b #'S',d0 000FFC0E 66F6 34 bne loop 000FFC10 35 000FFC10 6100 0078 36 bsr conin 000FFC14 3200 37 move d0,d1 000FFC16 0400 0030 38 sub.b #'0',d0 000FFC1A 67EA 39 beq loop * if type 0 000FFC1C B03C 0004 40 cmp.b #4,d0 000FFC20 6C00 0056 41 bge exit 000FFC24 42 000FFC24 6100 0072 43 bsr conout 000FFC28 4242 44 clr d2 000FFC2A 1400 45 move.b d0,d2 * save type to d2 000FFC2C 6100 003E 46 bsr Hex2 * get length 000FFC30 4243 47 clr d3 000FFC32 1600 48 move.b d0,d3 * save counter 000FFC34 5503 49 sub.b #2,d3 * dec for sum 000FFC36 4284 50 clr.l d4 000FFC38 51 000FFC38 6100 0032 52 getadr: bsr Hex2 000FFC3C E18C 53 lsl.l #8,d4 000FFC3E 8800 54 or.b d0,d4 000FFC40 5303 55 sub.b #1,d3 000FFC42 51CA FFF4 56 dbf d2,getadr 000FFC46 57 000FFC46 2044 58 move.l d4,a0 000FFC48 6100 0022 59 getdat: bsr hex2 000FFC4C 10C0 60 move.b d0,(a0)+ 000FFC4E 51CB FFF8 61 dbf d3,getdat 000FFC52 60B2 62 bra loop 000FFC54 63 000FFC54 64 000FFC54 65 * input hex 1chara 000FFC54 66 * d0.b -> data 000FFC54 6100 0034 67 Hex1: bsr conin 000FFC58 B03C 0039 68 cmp.b #'9',d0 000FFC5C 6E00 0008 69 bgt Hex1_1 000FFC60 0400 0030 70 sub.b #'0',d0 000FFC64 4E75 71 rts 000FFC66 0400 0037 72 Hex1_1: sub.b #$37,d0 000FFC6A 4E75 73 rts 000FFC6C 74 000FFC6C 75 000FFC6C 76 * input hex 1byte(2chara) 000FFC6C 77 * d0.b -> data 000FFC6C 61E6 78 Hex2: bsr Hex1 000FFC6E 2200 79 move.l d0,d1 000FFC70 E909 80 lsl.b #4,d1 000FFC72 61E0 81 bsr Hex1 000FFC74 8041 82 or d1,d0 000FFC76 4E75 83 rts 000FFC78 84 000FFC78 85 000FFC78 6100 0010 86 exit: bsr conin 000FFC7C B03C 000D 87 cmp.b #13,d0 * check line end 000FFC80 66F6 88 bne exit 000FFC82 12BC 0000 89 move.b #FC_EXIT,(a1) 000FFC86 4E70 90 reset 000FFC88 60FE 91 bra * 000FFC8A 92 000FFC8A 93 000FFC8A 94 * console in 000FFC8A 95 * d0.w -> data 000FFC8A 12BC 0002 96 conin: move.b #FC_CONIN,(a1) 000FFC8E 4240 97 clr d0 000FFC90 4E70 98 reset 000FFC92 1029 0002 99 move.b (RetVal-PICWRK)(a1),d0 000FFC96 4E75 100 rts 000FFC98 101 000FFC98 102 000FFC98 103 * console out 000FFC98 104 * d1.b <- data 000FFC98 105 * 000FFC98 0041 0300 106 conout: ori.w #FC_CONOUT*256,d1 000FFC9C 3281 107 move.w d1,(a1) 000FFC9E 4E70 108 reset 000FFCA0 4E75 109 rts 000FFCA2 110 000FFCA2 111 end start No errors detected No warnings generated


 試験用のダウンロード対象のデータは次のような簡略なものにしました。実行コードではないので冒頭の"start"ラベルは不要なのですが、END ステートメントの後にラベルを書かないと warning が表示されるのでその回避用です。

S-record ローダーの試験用データ(アセンブラ)
00000200 Starting Address Assembler used: EASy68K Editor/Assembler v5.16.01 Created On: 2021/12/17 19:05:10 00000000 1 *************************************** 00000000 2 * sample data to test S-record loader 00000000 3 * Ver 0.01 2021/12/17 by skyriver 00000000 4 *************************************** 00000000 5 00000000 =00000200 6 ADRS EQU $000200 00000000 7 00000000 8 00000200 9 org ADRS 00000200 10 00000200= 00 01 02 03 04 05 ... 11 start: dc.b 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 00000210= 30 31 32 33 34 35 ... 12 dc.b '0123456789ABCDEF' 00000220= 0123 1234 2345 3... 13 dc.w $0123,$1234,$2345,$3456,$4567,$5678,$6789,$789A 00000230= 0000 0000 0000 0... 14 dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 00000250 15 00000250 16 end start No errors detected No warnings generated


 アセンブルした結果、出力された S-record ファイルの内容が下記になります。

アセンブルして出力された S-record データ
S021000036384B50524F47202020323043524541544544204259204541535936384B6D
S1230200000102030405060708090A0B0C0D0E0F30313233343536373839414243444546C0
S12302200123123423453456456756786789789A00000000000000000000000000000000E2
S113024000000000000000000000000000000000AA
S804000200F9


 PIC 側のプログラムと実行結果が下記になります。PIC 側のプログラムには上記の MC68K のプログラムのアセンブル結果内容を変換して貼り付けています。プログラム起動後Teratermで S-record ファイルの内容をコピペ操作をしています。S-record ローダーは1レコード毎にレコードタイプを出力するようにしています(末尾の"111"部分)。

S-record ローダーのプログラムリストと実行結果(picle言語)
:l 1:# S-record loader for Pic24MC68K 2:# Ver 0.01 2021/12/17 by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7:var ProgStart,ProgWrk,WrkVal,_WrkVal,_PicDma,WrkTrk; 8:var EscFlg,EscY; 9: 10: 11:proc PicSrv() { 12: var i,fno,rval; 13: 14: while (1) { 15:# while (LATA[-1]&1) {} # wait reset 16: while ((LATA[-1]&3) = 3) {} # wait reset 17: if ( (LATA[-1]&2) = 0 ) { 18: PrnStr_( "\nHALT!" ); 19: break; 20: } 21: PmpOn(); 22: PmpSetAdr(ProgWrk); 23: fno = MemRd(); # dummy 24: WrkVal[0] = MemRd(); 25: WrkVal[1] = MemRd(); 26: fno = _WrkVal[1]; # Func No 27: rval = 0; 28: 29: if (fno=1) { # CONST 30: if (InpChk_()) { 31: rval = $ff; 32: } 33: } 34: else if (fno=2) { # CONIN 35: rval = InpChar_(); 36: } 37: else if (fno=3) { # CONOUT 38: PrnChar_( _WrkVal[0] ); 39: } 40: else if (fno=0) { 41: break; 42: } else { 43: PrnStr_("\nFunc err:"); 44: PrnHexB_( fno ); 45: break; 46: } 47: _WrkVal[3] = rval; 48: PmpSetAdr(ProgWrk+1); 49: MemWr(WrkVal[1]); 50: 51: PmpOff(); 52: BusRelease(); 53: } 54:} 55: 56: 57:proc m( dat ) { 58: MemWr( dat ); 59:} 60: 61: 62:proc main() { 63: init(); 64: initPmp(); 65: initSpi(); 66:# initSd(); 67: 68: ProgStart = $0600; # start addr(68K:0ffc00) 69: ProgWrk = $06f8; # work addr(68K:0ffdf0) 70: _PicDma = $0700; # Dma addr(68K:0ffe00) 512 71: WrkVal = Alloc( 2 ); 72: _WrkVal = WrkVal; 73: WrkTrk = Alloc( 2 ); 74: 75: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 76: 77: PmpOn(); 78: PmpSetAdr(0); 79: MemWr($000f);# stack 80: MemWr($fc00); 81: MemWr($000f); # PC 82: MemWr($fc00); 83: 84: PmpSetAdr(ProgStart); 85: 86: m($227c);m($000f);m($fdf0);m($6100); 87: m($0082);m($b03c);m($0053);m($66f6); 88: m($6100);m($0078);m($3200);m($0400); 89: m($0030);m($67ea);m($b03c);m($0004); 90: m($6c00);m($0056);m($6100);m($0072); 91: m($4242);m($1400);m($6100);m($003e); 92: m($4243);m($1600);m($5503);m($4284); 93: m($6100);m($0032);m($e18c);m($8800); 94: m($5303);m($51ca);m($fff4);m($2044); 95: m($6100);m($0022);m($10c0);m($51cb); 96: m($fff8);m($60b2);m($6100);m($0034); 97: m($b03c);m($0039);m($6e00);m($0008); 98: m($0400);m($0030);m($4e75);m($0400); 99: m($0037);m($4e75);m($61e6);m($2200); 100: m($e909);m($61e0);m($8041);m($4e75); 101: m($6100);m($0010);m($b03c);m($000d); 102: m($66f6);m($12bc);m($0000);m($4e70); 103: m($60fe);m($12bc);m($0002);m($4240); 104: m($4e70);m($1029);m($0002);m($4e75); 105: m($0041);m($0300);m($3281);m($4e70); 106: m($4e75); 107: 108: PrnStr_( "\n S-record loader start\n" ); 109: 110: PmpOff(); 111: BusRelease(); 112: LATA[-2]=LATA[-2]|$3; # off reset:a0, halt:a1 113: 114: PicSrv(); 115: 116: PmpOn(); 117: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 118:} :run S-record loader start 111 :


 問題無くダウンロードされているか簡易的に作ったメモリダンププログラムでメモリの内容を確かめてみます。PIC 側のメモリアドレスは MC68K の 1/2 なので、0x0100 からダンプすれば確かめられるはずです。
 末尾のダンプリストを見ると問題無くダウンロードされているみたいですね。

簡易メモリダンププログラムでダウンロード結果の確認(picle言語)
:l 1:# memori dump for Pic24MC68K 2:# Ver 0.01 2021/12/17 by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7: 8:func GetHex() { 9: var adrs,c,cnt; 10: 11: adrs = 0; 12: cnt = 0; 13: do { 14: c = InpChar_(); 15: if ( (c >= 'a') & (c <= 'z') ) { 16: c = c - $20; 17: } 18: if ( ((c >= '0')&(c<='9')) | ((c>='A')&(c<='F')) ) { 19: PrnChar_( c ); 20: cnt = cnt + 1; 21: c = c - '0'; 22: if ( c > 9 ) { 23: c = c + ('0' - 'A' + 10); 24: } 25: adrs = adrs * 16 + c; 26: } 27: else if ( (c = 'H'-$40) & (cnt > 0) ) { 28: cnt = cnt - 1; 29: adrs = adrs / 16; 30: PrnChar_( c ); 31: PrnChar_( ' ' ); 32: PrnChar_( c ); 33: } 34: else if ( c = $1b ) { 35: adrs = $ffff; 36: break; 37: } 38: } while ( c <> $0d ); 39: return = adrs; 40:} 41: 42: 43:proc main() { 44: var adrs; 45: init(); 46: initPmp(); 47: initSpi(); 48:# initSd(); 49: 50: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 51: PmpOn(); 52: 53: while ( 1 ) { 54: PrnStr_( "\nadrs : " ); 55: adrs = GetHex(); 56: if ( adrs = $ffff ) { 57: break; 58: } 59: dump( adrs ); 60: } 61:} :run adrs : 100 0100 : 0001 0203 0405 0607 0809 0A0B 0C0D 0E0F 0108 : 3031 3233 3435 3637 3839 4142 4344 4546 0110 : 0123 1234 2345 3456 4567 5678 6789 789A 0118 : 0000 0000 0000 0000 0000 0000 0000 0000 0120 : 0000 0000 0000 0000 0000 0000 0000 0000 0128 : 9E16 2155 E84D 0E91 A69F BB61 9880 0125 0130 : 28E1 6A36 ABB4 BA24 6891 3C94 AAD5 F89D 0138 : 00E6 FA6A 8C94 7B25 BE24 7217 2E42 B256 adrs :


 次はいよいよ CP/M-68K の移植ですね。でもその前にブレッドボードに SDコネクタを付けないと・・w


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

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

Pic24MC68Kマイコン(その4)PICとMC68Kのインターフェース処理 [68K]

 前回の記事で書いたようにブレッドボード上で MC68K が漸く動くようになったので今回はPCとのインターフェース部分の動作確認について書いてみます。

 基本的には以前 68008でやったことを踏襲しますが、メモリアクセス用のデータバスが16bitになったことで3番目にあった文字出力時の出力データ(CoData)を機能番号(FuncNo)の次に移動して MC68K から1回のアクセスで設定できるように変更しました。
 アセンブラ環境は EASy68 の EDIT68K を使っています。アセンブラが出力するSフォーマットファイルをバイナリ変更後に自作の bin2state ツールで picleソース内に貼れる形式に変換しています。

PICとのインターフェース試験用のMC68K側のhello出力処理(アセンブラ)
000FFC00 Starting Address Assembler used: EASy68K Editor/Assembler v5.16.01 Created On: 2021/12/15 20:53:39 00000000 1 * Hello Test for Pic24MC68K(PIC interface test) 00000000 2 * Ver 0.01 2021/12/14 by skyriver 00000000 3 00000000 4 00000000 =000FFDF0 5 PICWRK EQU $0ffdf0 ; PIC service work area 00000000 =000FFE00 6 PICDMA EQU $0ffe00 ; DMA for PIC 00000000 7 00000000 =0000000D 8 CR EQU 13 00000000 =0000000A 9 LF EQU 10 00000000 10 00000000 11 00000000 =00000000 12 FC_EXIT equ 0 ; EXIT CP/M 00000000 =00000001 13 FC_CONST equ 1 ; CONST 00000000 =00000002 14 FC_CONIN equ 2 ; CONIN 00000000 =00000003 15 FC_CONOUT equ 3 ; CONOUT 00000000 =00000004 16 FC_READ equ 4 ; READ SD Card 00000000 =00000005 17 FC_WRITE equ 5 ; WRITE SD Card 00000000 =00000006 18 FC_PUNCH equ 6 ; PUNCH 00000000 =00000007 19 FC_READER equ 7 ; READER 00000000 20 00000000 21 ; ++++ work area for PIC Interface 00000000 =000FFDF0 22 FuncNo equ PICWRK ; ds 1 : function No 00000000 =000FFDF1 23 CoData equ PICWRK+1 ; ds 1 : conout data 00000000 =000FFDF2 24 RetVal equ PICWRK+2 ; ds 1 : return value 00000000 =000FFDF3 25 SelDk equ PICWRK+3 ; ds 1 00000000 =000FFDF4 26 Track equ PICWRK+4 ; ds 2 00000000 =000FFDF6 27 DmaAdr equ PICWRK+6 ; ds 2 00000000 =000FFDF8 28 Sector equ PICWRK+8 ; ds 1 00000000 29 000FFC00 30 org $0ffc00 000FFC00 31 000FFC00 32 000FFC00 33 000FFC00 2C7C 000FFC20 34 Start: move.l #StartMsg,a6 000FFC06 4241 35 clr d1 000FFC08 121E 36 Loop: move.b (a6)+,d1 000FFC0A 6700 0008 37 beq Exit 000FFC0E 38 000FFC0E 6100 0022 39 bsr Conout 000FFC12 60F4 40 bra Loop 000FFC14 41 000FFC14 13FC 0000 000FFDF0 42 Exit: move.b #FC_EXIT,FuncNo 000FFC1C 4E70 43 reset 000FFC1E 60FE 44 bra * 000FFC20 45 000FFC20 46 000FFC20 47 StartMsg: 000FFC20= 0D 0A 68 65 6C 6C ... 48 dc.b CR,LF,'hello, world',CR,LF,0 000FFC31 49 000FFC31 50 000FFC31 51 ; write to console 000FFC31 52 ; d1.b <- out data(d1.b8-15=0) 000FFC31 53 000FFC32 0041 0300 54 Conout: ori.w #FC_CONOUT*256,d1 000FFC36 33C1 000FFDF0 55 move.w d1,FuncNo 000FFC3C 4E70 56 reset 000FFC3E 4E75 57 rts 000FFC40 58 000FFC40 59 000FFC40 60 end Start No errors detected No warnings generated


 今回の環境では MC68K 自体はビッグエンディアンですがPIC内処理はリトルエンディアンです。更にPICのPMP機能でメモリアクセスする際はビッグエンディアンになり、かつアドレス値は MS68K の 1/2 と言うややこしい状態になっています。

 試験プログラムを実行してみると出力文字列を最後まで出し切らないうちに暴走して HALT してしまう状態でした。
 ロジアナで動作を追ってみると MC68K のメモリ書込み処理(スタックへのリターン値書込み)が最初の内は問題無いのですが時間が経つと上手くいかなくなるようで一文字出力処理からのリターンで予期せぬアドレスに飛んでいるようです。

 今回実施したことを全て書くと雑多なメモになってしまうので主要な確認事項と対策を以下に列挙します。
  1. PIC側PMPのPMWR/信号の設定
     5V系のICに接続するにも関わらず、オープンドレイン設定になっていませんでした^^;
     74HC に対して highレベルが 3V 程度では厳しいです Fig.1
     設定をオープンドレインに変更しました

  2. PMWR/のプルアップ抵抗
     10Kでプルアップしていましたが、ロジアナで観察するとメモリ書込み時にhighレベルに上がりきれない部分が見つかりました Fig.2
     プルアップ抵抗を1Kに変更して動作が良くなりました Fig.3(2.7KではNGでした)

  3. PMPのTimerMの設定
     PMWR/信号幅がが80ns程度で短すぎるので PMP の TimerM の値を1から2に変更しまた
     変更後のPMWR/の信号幅は160ns程度になりました Fig4

 参考に東芝の「LogicIC_ HC_Series Application Note 2021-01-31」から引用した74HCシリーズの入出力電圧の規格を貼っておきます。

Fig.1 74HCシリーズのスレッショルド


 下図で赤丸印の部分が2個のPMWR/信号が結合してしまっている箇所です。

Fig.2 PICのメモリライト(PMWR/のプルアップ10K)[sampling:25MHz]


 PMWR/のプルアップ抵抗を10Kから1Kに変更後のロジアナ波形が下図になります。1Kは小さ過ぎるような気もしますが動作上は問題無くなりました。試しにメモリチップを交換してみましたが状況は変わりませんでした。

Fig.3 PICのメモリライト(PMWR/のプルアップ1K)[sampling:25MHz]


 ライト信号の幅が細すぎてマージンが少ないのでPMPの TimerM の設定を1から2に変更しました。変更後のロジアナ波形が下図で PMWR/ の信号幅がもともとの 80ns から 160ns 程度に増加しました。

Fig.4 PICのメモリライト(TimerMを2に変更後)[sampling:25MHz]


 参考に MC68K が動作中のロジアナ波形も貼っておきます。
 BR/(バスリクエスト)がhighの部分が MC68K が動作している部分で、MC68K はPICへサービス要求(今回の場合1文字出力)を依頼する場合は RESET命令を実行することで RESET/ 信号を一定時間 low にします。
 PIC側は RESET/ 信号を監視していてlowを検出するとバスリクエストして MC68K の要求内容を処理します。

Fig.5 MC68K と PIC の処理実行部のロジアナ波形 [sampling:25MHz]


 最後に今回使用したメモリ試験プログラムと実行結果を貼っておきます。
 末尾でダンプ表示後にある "hello, world" が冒頭で書いた MC68K のプログラムの要求に従って PIC が出力した文字列になります。

PICとのインターフェース試験用のMC68K側のhello出力処理(picle言語)
:l 1:# HelloTest for Pic24MC68K 2:# Ver 0.01 2021/12/15 by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7:var ProgStart,ProgWrk,WrkVal,_WrkVal,_PicDma,WrkTrk; 8:var EscFlg,EscY; 9: 10: 11:proc PicSrv() { 12: var i,fno,rval; 13: 14: while (1) { 15:# while (LATA[-1]&1) {} # wait reset 16: while ((LATA[-1]&3) = 3) {} # wait reset 17: if ( (LATA[-1]&2) = 0 ) { 18: PrnStr_( "\nHALT!" ); 19: break; 20: } 21: PmpOn(); 22: PmpSetAdr(ProgWrk); 23: fno = MemRd(); # dummy 24: WrkVal[0] = MemRd(); 25: WrkVal[1] = MemRd(); 26: fno = _WrkVal[1]; # Func No 27: rval = 0; 28: 29: if (fno=1) { # CONST 30: if (InpChk_()) { 31: rval = $ff; 32: } 33: } 34: else if (fno=2) { # CONIN 35: rval = InpChar_(); 36: } 37: else if (fno=3) { # CONOUT 38: PrnChar_( _WrkVal[0] ); 39: } 40: else if (fno=0) { 41: break; 42: } else { 43: PrnStr_("\nFunc err:"); 44: PrnHexB_( fno ); 45: break; 46: } 47: _WrkVal[3] = rval; 48: PmpSetAdr(ProgWrk+1); 49: MemWr(WrkVal[1]); 50: 51: PmpOff(); 52: BusRelease(); 53: } 54:} 55: 56: 57:proc m( dat ) { 58: MemWr( dat ); 59:} 60: 61: 62:proc main() { 63: init(); 64: initPmp(); 65: initSpi(); 66:# initSd(); 67: 68: ProgStart = $0600; # start addr(68K:0ffc00) 69: ProgWrk = $06f8; # work addr(68K:0ffdf0) 70: _PicDma = $0700; # Dma addr(68K:0ffe00) 512 71: WrkVal = Alloc( 2 ); 72: _WrkVal = WrkVal; 73: WrkTrk = Alloc( 2 ); 74: 75: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 76: 77: PmpOn(); 78: PmpSetAdr(0); 79: MemWr($000f);# stack 80: MemWr($fc00); 81: MemWr($000f); # PC 82: MemWr($fc00); 83: 84: PmpSetAdr(ProgStart); 85: 86: 87: m($2c7c);m($000f);m($fc20);m($4241); 88: m($121e);m($6700);m($0008);m($6100); 89: m($0022);m($60f4);m($13fc);m($0000); 90: m($000f);m($fdf0);m($4e70);m($60fe); 91: m($0d0a);m($6865);m($6c6c);m($6f2c); 92: m($2077);m($6f72);m($6c64);m($0d0a); 93: m($00ff);m($0041);m($0300);m($33c1); 94: m($000f);m($fdf0);m($4e70);m($4e75); 95: 96: dump(0); 97: dump(ProgStart); 98: PmpOff(); 99: BusRelease(); 100: LATA[-2]=LATA[-2]|$3; # off reset:a0, halt:a1 101: 102: PicSrv(); 103: 104: PmpOn(); 105: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 106:} :run 0000 : 000F FC00 000F FC00 54F7 60E9 9559 067D 0008 : 785D 7A3A 0A45 2A5A 901C C2CF FA5F 227E 0010 : A65D AE41 D351 C541 2200 BB54 AAE6 AD19 0018 : 8752 AC47 AA06 8AC5 E771 BF15 CC07 FB11 0020 : 3405 2E1C F05F EDB5 22E5 BE71 0B50 A270 0028 : 28C9 2EB5 E855 2670 AA5F AAFD BA56 AA44 0030 : AA72 A94F 83AC EA41 BADF 4A63 DAB5 8876 0038 : 8644 EFFE A305 D747 095D A316 E875 2A51 0600 : 2C7C 000F FC20 4241 121E 6700 0008 6100 0608 : 0022 60F4 13FC 0000 000F FDF0 4E70 60FE 0610 : 0D0A 6865 6C6C 6F2C 2077 6F72 6C64 0D0A 0618 : 00FF 0041 0300 33C1 000F FDF0 4E70 4E75 0620 : FA64 88C5 2B80 B8C1 F254 4AF5 8877 921C 0628 : AFD1 A4C5 AE45 EA91 8BC5 324F 2347 945D 0630 : 7355 623D AE71 675F 0E1B AC1C 8A99 2B83 0638 : 22C5 F813 DE56 E8D4 A651 F971 8656 BA23 hello, world :



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

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

Pic24MC68Kマイコン(その3)68Kからのメモリアクセス [68K]

 前回の記事で書いたようにPICからのメモリアクセス動作は問題無いようなのですが、MC68K がうまく動かない状態だったので調べてみた結果等を書いてみます。

 始めに評価環境についてですが、下の写真はブレッドボードで評価中の MC68K で1枚のブレッドボードの大半を占有していて幅広なので配線を挿す場所が上下ともに1列しかないのでロジアナが繋ぎ辛いですw
 前回の記事でも書いた 元の刻印(だと思いたい)を消さずに16MHzにクロックアップした型名を刻印している主張の強いまがい品を使っていますが、後述のように少なくとも 8MHz では動くようです。

ブレッドボード上の MC68K


★追記 2021/12/22 {
 16MHz で動かしてみた際のロジアナ画面が下図になります。
 もしかしたら選別品で16Mhzでも動作するのでは?・・という一縷の望みを持っていましたが世の中そう甘くはありませんでした。16MHzでは謎の動作をしてだんまり後、HALTしました。

偽16MHz版 MC68HC000 の16MHz動作試験結果
}

 話を MC68K からのメモリアクセス確認に戻します。
 PIC からのアドレス線は下図のように A10 が最上位アドレスで オープンドレイン出力し、+5V でプルアップしています。
 更に A11 ~ A18 を 抵抗を介して A10 に接続しています。こうすることで MC68K がリセット後にアクセスする0番からのスタックとPCの初期値及びCP/M-68KのBIOSで使用予定の PIC と MC68K のパラメータ渡し用の実装メモリ末尾の領域を PIC 側からアクセス可能にしています。
実装しているメモリチップは 512K x 16bit なのでアドレス線は A0 - A18 の19本あります。

PIC側のアドレス生成回路


 メモリ上に設定するPCの初期値をPIC側の 0400H に相当する 07F40H に設定して動かしてみましたが MC68K が暴走する状態でした(MC68Kへの供給クロックは 8MHz)。
 そこでメモリ後半への切り替えを考えなくてもいいように PC初期値を 0008H にしてプログラムコードを 0008H 以降に設定した上で実行状態をロジアナで観察すると 0003H の PC の下位ワードを読込んだ後に、そのまま 0004H から実行しているようなので PCの初期値を 0010H に変更することでうまく動きました。
 MC68K から出ているアドレス線は A1 - A22 でA0が無く、A0の情報は上位/下位バイトを指定する LB#/UB# に置き換わっているのです。つまり MC68K のアドレスは バイト単位で振られているということです。
 PIC側は ワード(2バイト)単位でアドレスが振られるのでPIC側のアドレスを2倍すると MC68K のアドレスに対応するようになるということです。

 従って、PIC側と MC68K 側とのメモリアドレスの対応は下表のようになります。

PICMC68K
 0000 - 03FF  000000 - 0007FF 
 0400 - 07FF  0FF800 - 0FFFFF 


 開始アドレスを 0010H にした場合のロジアナ波形を貼っておきます。

00000010Hから開始した際の全体波形(サンプリング:25MHz)


 HALT/信号が highレベルになっている箇所が MC68Kが動作している部分で、拡大したものが下図になります。RESET/がlowレベルになっている部分は MC68K が RESET 命令を実行したことにより発生したものです(立ち上がり部分が画面に入っていませんが lowの時間は15.64us)

MC68K動作部の拡大波形(サンプリング:25MHz)


 実行した試験プログラムと実行結果は下記の通りで、最後の方にある実行後のメモリダンプを見ると 0010H が MC68Kにより想定通り 1234H に書き換えられていることが判ります。

MC68Kが0010H開始アドレスの試験プログラムと実行結果(picle言語)
:l 1:# Pic24MC68K memory write test Ver 0.01 2021/12/12 2:# ver 0.01 by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7:var ProgWrk,_WrkVal,_PicDma,SdSec; 8:var EscFlg,EscY; 9: 10: 11: 12:proc main() { 13: var adr,dat,i; 14: init(); 15: initPmp(); 16: initSpi(); 17:# initSd(); 18: 19: PrnStr_( "init done\n" ); 20: 21: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 ProgWrk=$fdf0; 22: _WrkVal=Alloc(5); 23: SdSec=_WrkVal+2; # long SdSectorNo 24: _PicDma=$fe00; 25: 26: PmpOn(); 27: 28: PrnStr_( "Pmp on\n" ); 29: 30: PmpSetAdr(0); 31: MemWr($0008); # stack 32: MemWr($0000); 33: 34:# MemWr($0007); # PC 35:# MemWr($fc00); 36: MemWr($0000); # PC 37:# MemWr($0008); 38: MemWr($0010); 39: 40:# PmpSetAdr($10); 41:# dat = 1; 42:# for ( i = 0; i < 16; i = i + 1 ) { 43:# MemWr( dat ); 44:# dat = dat * 2; 45:# } 46: 47:# adr = $0400; # 68K's ADR:000ff800 48: adr = $0008; # 68K's ADR:00000010 49: 50: PmpSetAdr(adr); 51: MemWr($303c); # move #$1234,d0 52: MemWr($1234); 53: 54:# MemWr($33c0); # move.w d0,$0007fc08 55:# MemWr($0007); 56:# MemWr($fc08); 57: 58: MemWr($33c0); # move.w d0,$00000020 59: MemWr($0000); 60: MemWr($0020); 61: 62: 63: MemWr($4e70); # reset 64: MemWr($60fe); # bra * 65: 66: MemWr($ffff); 67: MemWr($ffff); # change 1234 by 68K 68: MemWr($ffff); 69: 70: Rdump( 0 ); 71:# Rdump( adr ); 72: 73: PmpOff(); 74: BusRelease(); 75: LATA[-2]=LATA[-2]|$3; # off reset:a0, halt:a1 76: 77: Timer_=4; 78: while (Timer_) {} # 40ms wait 79: 80: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 81: PrnStr_( "\n-------" ); 82: Rdump(adr); 83:} :run init done Pmp on 0000 : 0008 0000 0000 0010 BA79 B355 EB6D 8F50 0008 : 303C 1234 33C0 0000 0020 4E70 60FE FFFF 0010 : FFFF FFFF C934 BFE5 8B45 985C A095 5A35 0018 : 5C97 A861 2E5D 885D E669 9B14 B655 6EB5 0020 : 8857 2E77 8C40 6A15 3A9B 29D4 BE84 6A0C 0028 : A167 8257 B633 2D50 66D7 3311 2A47 1B42 0030 : EE08 3B59 6E5D A125 AA15 886A 0DF0 EBE5 0038 : 6D51 A214 6B71 B23D AAB9 BFC5 9E94 841D ------- 0008 : 303C 1234 33C0 0000 0020 4E70 60FE FFFF 0010 : 1234 FFFF C934 BFE5 8B45 985C A095 5A35 0018 : 5C97 A861 2E5D 885D E669 9B14 B655 6EB5 0020 : 8857 2E77 8C40 6A15 3A9B 29D4 BE84 6A0C 0028 : A167 8257 B633 2D50 66D7 3311 2A47 1B42 0030 : EE08 3B59 6E5D A125 AA15 886A 0DF0 EBE5 0038 : 6D51 A214 6B71 B23D AAB9 BFC5 9E94 841D 0040 : 9A17 72E0 4E4C 2294 CE44 BAF9 AD42 8CD9 :


 メモリ前半での動作が上手くいったので、最初にやりたかったメモリ後半での MC68K のメモリライト試験を行った際のロジアナ波形と操作ログを貼っておきます。
 こちらも結果は想定通りで、okでした。

000ff800Hから開始した際の全体波形(サンプリング:25MHz)


MC68Kが0010H開始アドレスの試験プログラムと実行結果(picle言語)
:l 1:# Pic24MC68K memory write test Ver 0.01 2021/12/12 2:# ver 0.01 by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7:var ProgWrk,_WrkVal,_PicDma,SdSec; 8:var EscFlg,EscY; 9: 10: 11: 12:proc main() { 13: var adr,dat,i; 14: init(); 15: initPmp(); 16: initSpi(); 17:# initSd(); 18: 19: PrnStr_( "init done\n" ); 20: 21: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 ProgWrk=$fdf0; 22: _WrkVal=Alloc(5); 23: SdSec=_WrkVal+2; # long SdSectorNo 24: _PicDma=$fe00; 25: 26: PmpOn(); 27: 28: PrnStr_( "Pmp on\n" ); 29: 30: PmpSetAdr(0); 31: MemWr($0010); # stack 32: MemWr($0000); 33: 34: MemWr($000f); # PC 35: MemWr($f800); 36:# MemWr($0000); # PC 37:# MemWr($0010); 38: 39:# PmpSetAdr($10); 40:# dat = 1; 41:# for ( i = 0; i < 16; i = i + 1 ) { 42:# MemWr( dat ); 43:# dat = dat * 2; 44:# } 45: 46: adr = $0400; # 68K's ADR:000ff800 47:# adr = $0008; # 68K's ADR:00000010 48: 49: PmpSetAdr(adr); 50: MemWr($303c); # move #$1234,d0 51: MemWr($1234); 52: 53: MemWr($33c0); # move.w d0,$000ff810 54: MemWr($000f); 55: MemWr($f810); 56: 57:# MemWr($33c0); # move.w d0,$00000020 58:# MemWr($0000); 59:# MemWr($0020); 60: 61: 62: MemWr($4e70); # reset 63: MemWr($60fe); # bra * 64: 65: MemWr($ffff); 66: MemWr($ffff); # change 1234 by 68K 67: MemWr($ffff); 68: 69: Rdump( 0 ); 70: Rdump( adr ); 71: 72: PmpOff(); 73: BusRelease(); 74: LATA[-2]=LATA[-2]|$3; # off reset:a0, halt:a1 75: 76: Timer_=4; 77: while (Timer_) {} # 40ms wait 78: 79: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 80: PrnStr_( "\n-------" ); 81: Rdump(adr); 82:} :run init done Pmp on 0000 : 0010 0000 000F F800 BA79 B355 EB6D 8F50 0008 : 303C 1234 33C0 0000 0020 4E70 60FE FFFF 0010 : 1234 FFFF C934 BFE5 8B45 985C A095 5A35 0018 : 5C97 A861 2E5D 885D E669 9B14 B655 6EB5 0020 : 8857 2E77 8C40 6A15 3A9B 29D4 BE84 6A0C 0028 : A167 8257 B633 2D50 66D7 3311 2A47 1B42 0030 : EE08 3B59 6E5D A125 AA15 886A 0DF0 EBE5 0038 : 6D51 A214 6B71 B23D AAB9 BFC5 9E94 841D 0400 : 303C 1234 33C0 000F F810 4E70 60FE FFFF 0408 : FFFF FFFF 2F14 CDDE FA55 A273 9513 26CD 0410 : B850 A327 C277 BB10 2205 6A15 A249 EA34 0418 : A81D ABD5 9AFB 6A65 A651 D914 A2F6 F965 0420 : 6904 B85F 1901 2B41 0B9D 8A74 EA45 EC57 0428 : 2D5F 1A59 E250 2885 2324 AB10 6F11 D0D3 0430 : 2259 2381 8ED7 F2F9 A273 7C97 2870 2B1D 0438 : A252 E285 9975 0370 FE5D A8D4 B3C6 A315 ------- 0400 : 303C 1234 33C0 000F F810 4E70 60FE FFFF 0408 : 1234 FFFF 2F14 CDDE FA55 A273 9513 26CD 0410 : B850 A327 C277 BB10 2205 6A15 A249 EA34 0418 : A81D ABD5 9AFB 6A65 A651 D914 A2F6 F965 0420 : 6904 B85F 1901 2B41 0B9D 8A74 EA45 EC57 0428 : 2D5F 1A59 E250 2885 2324 AB10 6F11 D0D3 0430 : 2259 2381 8ED7 F2F9 A273 7C97 2870 2B1D 0438 : A252 E285 9975 0370 FE5D A8D4 B3C6 A315 :


 次回はいよいよ PIC と MC68K とのインターフェース処理の動作確認ですね。


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



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

Pic24MC68Kマイコン(その2)PICからのメモリアクセス [68K]

 最初に通販ネタですが、今回使用予定のメモリAS6C8016(512Kx16bit)は通販での偽物に対するリスクヘッジで二つの店舗から2個ずつ購入しています。
 yahooニュースの見分け困難!半導体の『模倣品』流通…真贋判定会社は大忙し「約3割が模倣品の懸念」を見ると外観で偽物チップを見分ける上で一番重要視されるのがインデックスマークの有無(偽物は表面を削るのでマークが消える)だそうです。

模倣品流通のニュース


 下の写真は今回購入したメモリです。確認のためにそれぞれの店舗から購入したチップを並べて比較してみるとDIP変換基板に半田付けした方はインデックスマークが・・・無いorz

購入したメモリチップ


 ハードディバッグ時に偽チップの可能性まで考えるのは効率が悪いのでブレッドボード上のメモリを早々にインデックスマーク有りのチップに変えました。

 また、CPU本体の MC68HC000P16 も千円以下の安価な物を幾つか海外の通販で購入していますが、最近届いたものが下の写真のように元の刻印を消しもしないである意味正々堂々としたまがい品でしたw
 元の刻印のようにP12であれば私の所有しているDIPのMC68HCの中では最高速度かもしれないのでまだいいのですが "P12" も偽刻印で実は・・ってことにならないか不安です。

最近届いた MC68HC000P16 P12


 今回も前回の記事と同様に通販での偽物ネタから入ってしまいましたが、本題のPICからのメモリアクセスの検証結果についてメモを残しておきたいと思います。

 始めにPICから供給する68K用のクロックの確認からです。PICからは16MHzと8MHzを供給して68Kのクロックをどちらにするかジャンパーピンで切り替えられるようにする予定です。
 下図がロジアナで確認した結果で、ロジアナのサンプリングとの関係でピッタリの数値ではないですが想定通り出ているようです。

PICからのクロック信号(サンプリング:100MHz)


 PICからのメモリリードとライト時のロジアナ波形が下図になります。PICのパラレルマスタポート(PMP)モジュールのマスターモードを使用してアクセスしています。ウエイトのパラメータ設定はアクセス時の前段/中段/後段の3つ設定できるようになっていて、下図は中段(WAITM)のみ1の設定で前段と後段はゼロの状態です。
 SelUpper/はPIC側の8bitデータバスと68K側の上位バイトバスを接続しているHC245をアクティブにするための信号です。

PICからのメモリリード(サンプリング:50MHz)

PICからのメモリライト(サンプリング:50MHz)


 メモリをアクセスする上では問題無い波形に見えるのでメモリライト&リードのテストプログラムを実行してみました。
 下記が実行結果で問題無くメモリにアクセスできているようですね。

メモリ試験プログラムと実行結果(picle言語)
:l 1:# Pic24MC68K PicMemCheck Ver 0.01 2021/12/08 2:# ver 0.01 by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7: 8:proc main() { 9: var i,dat; 10: init(); 11: initPmp(); 12: initSpi(); 13:# initSd(); 14: 15: PrnStr_( "init done\n" ); 16: 17: LATA[-2]=LATA[-2]&$fffC; # on reset:a0 halt:a1 18: 19: PmpOn(); 20: 21: PrnStr_( "Pmp on\n" ); 22: 23: PmpSetAdr(0); 24: dat = 1; 25: for ( i = 0; i < 16; i = i + 1 ) { 26: MemWr( dat ); 27: dat = dat * 2; 28: } 29: dat = 1; 30: for ( i = 0; i < 16; i = i + 1 ) { 31: MemWr( ~dat ); 32: dat = dat * 2; 33: } 34: 35: PrnStr_( "Write mem\n" ); 36: 37: Rdump( $00 ); 38: Rdump( $40 ); 39: exit(); 40:} :run init done Pmp on Write mem 0000 : 0001 0002 0004 0008 0010 0020 0040 0080 0008 : 0100 0200 0400 0800 1000 2000 4000 8000 0010 : FFFE FFFD FFFB FFF7 FFEF FFDF FFBF FF7F 0018 : FEFF FDFF FBFF F7FF EFFF DFFF BFFF 7FFF 0020 : 8857 2E76 8E40 6A15 1ADB 29D4 BE84 6A0D 0028 : A167 0257 B69B 6FF1 6657 3611 2A43 1B52 0030 : EF31 7B59 6EDD A124 AA15 906A ADF8 EB65 0038 : 6C51 AA14 6B75 B01C A9B9 BFC5 DE94 853D 0040 : 8807 72A0 4E4C 22B6 CE44 B9F9 EF42 8CD9 0048 : 6355 0ADC 2ED0 AE50 2255 C2CC 2222 8D31 0050 : 0EF8 E813 F975 FA5D BAB5 7915 B355 2A47 0058 : 2C75 4753 D335 BA45 A9F9 9AF5 CA55 114F 0060 : B37E 0A03 0C26 8BD9 2B47 AA51 BD74 AE95 0068 : 2175 0E55 3B14 4ED8 E63D 22D5 E897 3EF7 0070 : EA16 F9CD 86F9 2445 8AC0 B86F 377F C949 0078 : EA0D BB19 92D5 F06F E341 E867 B565 CA63 :


 因みに上で書いた中段のウェイトをゼロにした場合のロジアナ波形が下記で、メモリテストプログラムの結果もNGだったのでウェイトパラメータは中段のみ1で前段と後段はゼロで決定です。

ウェイト無しでのPICからのメモリリード(サンプリング:50MHz)

ウェイト無しでのPICからのメモリライト(サンプリング:50MHz)


 次の段階として MC68Kを動かしてみたいのですが、リセットがうまくかからないようで動作が変です^^;
 68Kのマニュアルを再度チェックしたところ、68Kをリセットするためには RESET#のみならず、HALT# もアクティブにする必要があることに気が付きました(HALTは使わないものとして16MHzのクロック出力のためのピンを追加しましたorz)
 いつものことではありますがPICのピン不足に悩んでしまいます。今回使用するメモリはライト時に OE# はdon't care(詳細は前回の記事を参照)なので下記の変更をすることにしました。

変更内容
                -+-
                 |
                 >
                 > 10K 追加
                 >
                 |
  68K:RESET/ ----+------------- PIC:RA0

                -+-
                 |
                 >
                 > 10K
                 >
                 |   ↓変更
  68K:HALT/  ----+------------- PIC:RA1(BG/ 入力から変更)


 ・HC368 Y2(5pin) の接続先を MCS/ から AS/に変更
 ・PICの11ピン(MRD/)を RB13として BG/入力に変更


 変更後のメモリリード/ライト時のロジアナ波形が下図になります。想定通りですね。メモリ試験プログラムの結果もOKでした。

変更後のPICからのメモリリード(サンプリング:50MHz)

変更後のPICからのメモリライト(サンプリング:50MHz)


 それでもまだ68Kがうまく動かないのようなので続きは次回のお楽しみということで今回はここまでにします。



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

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