SSブログ
English Version

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

 前回の記事で書いたように C000H - FFFFH バンクを外部メモリへアサインできる可能性は見出せなかった(ネット上にも可能という情報は見当たらない)と言う結果でしたが、今回はネット情報でも可能と書かれている 8000H - BFFFH バンク(以降、8000Hバンクと記す)と 0000H-7FFFH バンク(以降、0000Hバンクと記す)に対する外部メモリのアサインについて確認した結果をメモしておきたいと思います。

  1. 8000Hバンク切替え動作の確認
     結果:外部メモリにアサインできた

    [詳細]
     バンクメモリを外部メモリにアサイする動作を確認する上で、まずは GAL に外部メモリの制御ロジックを入れる必要があります。ついでに後述する 0000Hバンクのメモリ切替えロジックも一緒に実装することにします。

    • 0000Hバンク用の外部メモリ
       1BH ポートの bit2 を 1 にすると バンク内のメモリアクセス時にシステムバスの CERAM2(以降 RAMと記す)が '1'になり、システムバスに接続した外部メモリをアクセスできるようになります。
       今回の Eborsy(システムバス用拡張ボード)に実装している外部メモリは 128K バイトの容量でメモリチップの上位アドレス A14 - A16 を GAL から出力される RA14 - RA16 に接続しています。また、外部メモリのチップセレクト信号も GAL出力の MCS/ に接続しています。
       このバンクには、外部メモリの 0000H - 7FFFH を割り振ることにすると MCS/ は システムバスの MREQ/ と RAM がアクティブな時にアサートしなければならないので
         MCS = RAM & MREQ  でこの時
          RA16 = 0
          RA15 = 0
          RA14 = A14(システムバス上のアドレス信号)
      とすればいいことになります。

    • 8000Hバンク用の外部メモリ
       このバンクアクセス時に外部メモリが有効な場合にはシステムバス上の CEROM2/(以降 ROM/ と記す)が 0 になるので
         MCS = CEROM2 & MREQ  でこの時
          RA16 = 1
          RA15 = BK1
          RA14 = BK0
      とすれば外部メモリの後半をこのバンクに割り当てられることになります。

      ★追記 2021/12/23
       ※ RAM と CEROM2 は既に MREQ/ と ANDされているようなので MREQ/ は無くても可


     上述のロジックを追記したものを Wincupl のシミュレータで確認した画面が下図になります。

    GALに実装したロジックのシミュレーション結果

     追加したロジックは論理式のみでレジスタを使用しないので確認のために clock は不要です。RAM(CERAM2)とROM(!CEROM2)のペアで状態が3通りになっていますが、左側から 8000Hバンクが有効、0000Hバンクが有効、両方有効(MREQ がアクティブな瞬間に両者が有効な状態は実際にはあり得ない)の状態です。MCS,RA14-RA15 の各信号が前述のロジックどおりになっていることが判ります。

     8000Hバンク切替えの動作確認のために作った試験プログラムが下記で、バンク番号を 0 ~ 7 の 8 通りに順次切替えてそれぞれ 8 回ずつバンク内のメモリをリード/ライトしています。

    80H バンクの切替え試験プログラム(Z80アセンブラ)
    ;+++++++++++++++++++++++++++++++++++ ; Bank 8000H test for Eborsy ; Ver 0.01 2021/12/20 by skyriver ;+++++++++++++++++++++++++++++++++++ 0100 ORGAD EQU 0100H ; +++ 850 I/O +++ 0017 INTMASK EQU 017H ; interrupy 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 +++ 8000 BNKADR EQU 08000H 0000' ASEG ORG ORGAD 0100 F3 Start: DI 0101 DB 19 IN A,(BANKSEL) 0103 57 LD D,A 0104 E6 0F AND 0FH 0106 5F LD E,A 0107 3E 01 LD A,1 0109 D3 80 OUT (AdrSdcs),A ; set SDCS:0 010B AF XOR A 010C B3 Loop: OR E 010D D3 19 OUT (BANKSEL),A 010F E6 F0 AND 0F0H 0111 21 8000 LD HL,BNKADR 0114 06 08 LD B,8 0116 4E Lo10: LD C,(HL) 0117 71 LD (HL),C 0118 23 INC HL 0119 10 FB DJNZ Lo10 011B C6 10 ADD A,10H 011D FE 80 CP 80H 011F C2 010C JP NZ,Loop 0122 AF XOR A 0123 D3 80 OUT (AdrSdcs),A ; set SDCS:1 0125 7A LD A,D 0126 D3 19 OUT (BANKSEL),A ; restore setting 0128 FB EI 0129 C9 RET END

     下図が試験プログラム実行時のロジアナ画面です。SDCS/ が0の部分がバンクメモリをリード/ライトしている部分になります。バンク番号が 1 ~ 3 の場合でも BK0 と BK1 及び ROM/ が出力されているのは予想外でした。

    80H バンク切替え試験時のロジアナ画面(全体) [sampling:25MHz]

     下図はバンク番号として 7 を設定時のメモリアクセス部分を拡大したものです。想定通りの波形で、問題無いですね。

    80H バンク切替え試験時のロジアナ画面(拡大) [sampling:25MHz]


  2. 0000Hバンク切替え動作の確認
     結果:外部メモリにアサインできた

    [詳細]
     0000Hバンクを切替えると今まで試験プログラムが動作していたメモリ領域が見えなくなるので試験プログラムを一旦 8000Hバンクに移動した後に 0000Hバンクを切替える必要があります。移動先のバンク番号は 1 とし、移動した試験プログラムでは 0000Hバンクを外部メモリ側に切替える前後で、それぞれ 32 回ずつ 0000Hバンク内のメモリをリード/ライトするようにしました。更にスタックも8000Hバンク上にに切り替え、試験プログラムをコールする(今まではジャンプのみ)ようにしました。

    0000Hバンクの切替え試験プログラム1(Z80アセンブラ)
    ;+++++++++++++++++++++++++++++++++++ ; Bank 0000H select test for Eborsy ; Ver 0.01 2021/12/20 by skyriver ;+++++++++++++++++++++++++++++++++++ 0100 ORGAD EQU 0100H ; +++ 850 I/O +++ 0017 INTMASK EQU 017H ; interrupy mask 0019 BANKSEL EQU 019H ; select bank 8000h,c000h 001B RAMSEL EQU 01BH ; set RAM CE 00H:internal 04H:system bus ; +++ GAL I/O address +++ 0080 AdrSdcs EQU 80H ; set SDCS(D0) 0081 AdrSpiD EQU 81H ; write/read SPI data(D0) ; +++ memory adress +++ 8000 BNKADR EQU 08000H 8100 STACKSV EQU 08100H 8200 STACK EQU 08200H 0026 ProgSiz EQU (ProgEn - PRogSt) 0000' ASEG ORG ORGAD 0100 F3 Start: DI 0101 3E 01 LD A,1 0103 D3 80 OUT (AdrSdcs),A ; set SDCS:0 0105 AF XOR A 0106 D3 80 OUT (AdrSdcs),A ; set SDCS:1 0108 DB 19 IN A,(BANKSEL) 010A 32 0159 LD (BankDat),A ; save bank setting 010D E6 0F AND 0FH 010F F6 50 OR 50H 0111 D3 19 OUT (BANKSEL),A ; enable bank1 0113 ED 73 8100 LD (STACKSV),SP 0117 31 8200 LD SP,STACK 011A 21 0133 LD HL,ProgSt 011D 11 8000 LD DE,BNKADR 0120 01 0026 LD BC,ProgSiz 0123 ED B0 LDIR ; move check program 0125 CD 8000 CALL BNKADR 0128 ED 7B 8100 LD SP,(STACKSV) 012C 3A 0159 LD A,(BankDat) 012F D3 19 OUT (BANKSEL),A ; restore setting 0131 FB EI 0132 C9 RET 0133 ProgSt: .phase BNKADR 8000 3E 01 LD A,1 8002 D3 80 OUT (AdrSdcs),A ; set SDCS:0 8004 21 0000 LD HL,0 8007 06 20 LD B,32 8009 56 Loop1: LD D,(HL) 800A 72 LD (HL),D 800B 23 INC HL 800C 10 FB DJNZ Loop1 800E DB 1B IN A,(RAMSEL) 8010 5F LD E,A 8011 F6 04 OR 04H 8013 D3 1B OUT (RAMSEL),A ; select 0000-7FFF to system bus 8015 21 0000 LD HL,0 8018 06 20 LD B,32 801A 56 Loop2: LD D,(HL) 801B 72 LD (HL),D 801C 23 INC HL 801D 10 FB DJNZ Loop2 801F AF XOR A 8020 D3 80 OUT (AdrSdcs),A ; set SDCS:1 8022 7B LD A,E 8023 D3 1B OUT (RAMSEL),A ; restore setting 8025 C9 RET .dephase 0159 ProgEn: 0159 BankDat: 0159 DS 1 ; original bank setting data END

     試験プログラム実行時のロジアナ画面が下図です。試験プログラム開始時にマーキングとして SDCS/ を一瞬 0 に設定し、8000Hバンク上に移動した試験プログラムが実行中は SDCS/ を 0 にしています。RAM から判るように、0000Hバンクは SDCS/ が 0 の期間の前半が内部側、後半が外部側に切り替えられています。

    00H バンク切替え試験時のロジアナ画面(全体) [sampling:25MHz]

     下図は 0000Hバンクが内部側の時にバンク内メモリをアクセスしている部分を拡大したものです。RAM 信号は 0 のままで想定通りです。BK0 が動いているのが面白いですね。

    00H バンク切替え試験時のロジアナ画面(切替え前) [sampling:25MHz]

     下図は 0000H バンクが外部側に設定されている時のバンク内メモリアクセスの状況です。バンク内メモリをアクセス時に想定通り RAM が 1 になっています。

    00H バンク切替え試験時のロジアナ画面(切替え後) [sampling:25MHz]

     アクセスだけでは不十分(Z80はM1サイクル時に最もメモリアクセスが速い)なので下記のような 0000Hバンクの外部メモリ側で動作する試験プログラムを作成し確認し(遊んでみ)ました。そろそろデバッガが欲しくなるくらいの複雑さになってきましたがまだ大丈夫ですw

    1. SDCS/を一瞬 0 にしてマーキング
    2. 8000Hバンクをバンク番号 1 に設定
    3. スタックを 8000Hバンク上に切り直し
    4. 8000Hバンクに試験プログラムを転送後、コール
    5. 8000Hバンク上の試験プログラムでは SDCS/ を一瞬 0 にマーキング
    6. 0000Hバンクを外部側に設定
    7. 0000Hバンクに試験プログラムを転送し、コール
    8. 0000Hバンク上の試験プログラムは開始時に SDCS/ を 0 に設定
    9. 0000Hバンク内メモリと 8000Hバンク内メモリを交互に 32 回リード/ライト
    10. SDCS/ を 1 に設定し、リターン
    11. 8000Hバンク上の試験プログラムは 自身のリターン先アドレスに76H(HALT)命令をライト
    12. 0000Hバンクを内部側に切替えし、リターン
    13. 0000Hバンク上のもともとあった試験プログラムはスタックを元の値に戻し、リターン

    試験プログラムのリストは下記になります。

    0000Hバンクの切替え試験プログラム2(Z80アセンブラ)
    ;+++++++++++++++++++++++++++++++++++ ; Bank 0000H run test for Eborsy ; Ver 0.01 2021/12/20 by skyriver ;+++++++++++++++++++++++++++++++++++ 0100 ORGAD EQU 0100H ; +++ 850 I/O +++ 0017 INTMASK EQU 017H ; interrupy mask 0019 BANKSEL EQU 019H ; select bank 8000h,c000h 001B RAMSEL EQU 01BH ; set RAM CE 00H:internal 04H:system bus ; +++ GAL I/O address +++ 0080 AdrSdcs EQU 80H ; set SDCS(D0) 0081 AdrSpiD EQU 81H ; write/read SPI data(D0) ; +++ memory adress +++ 0000 RAMADR EQU 00000H ; start address of RAM area 8000 BNKADR EQU 08000H ; start address of bank area 8100 BNKWRK EQU 08100H ; work area in bank 004A ProgSiz EQU (BkPgEn - BkPgSt) ; bank prog size 001A RamPSz EQU (RamPEn - RamPSt) ; RAM prog size 0000' ASEG ORG ORGAD 0100 F3 Start: DI 0101 3E 01 LD A,1 0103 D3 80 OUT (AdrSdcs),A ; set SDCS:0 0105 AF XOR A 0106 D3 80 OUT (AdrSdcs),A ; set SDCS:1 0108 DB 19 IN A,(BANKSEL) 010A 32 017D LD (BankDat),A ; save bank setting 010D E6 0F AND 0FH 010F F6 50 OR 50H 0111 D3 19 OUT (BANKSEL),A ; enable bank1 0113 ED 73 8101 LD (StackSv),SP ; save stack 0117 31 810D LD SP,StackTop 011A 21 0133 LD HL,BkPgSt 011D 11 8000 LD DE,BNKADR 0120 01 004A LD BC,ProgSiz 0123 ED B0 LDIR ; move check program 0125 CD 8000 CALL BNKADR 0128 ED 7B 8101 RetAd: LD SP,(StackSv) ; return addres from bank prog 012C 3A 017D LD A,(BankDat) 012F D3 19 OUT (BANKSEL),A ; restore setting 0131 FB EI 0132 C9 RET 0133 BkPgSt: ; bank prog code's start address .phase BNKADR 8000 3E 01 LD A,1 8002 D3 80 OUT (AdrSdcs),A ; set SDCS:0 8004 AF XOR A 8005 D3 80 OUT (AdrSdcs),A ; set SDCS:1 8007 DB 1B IN A,(RAMSEL) 8009 32 8100 LD (RamDat),A 800C F6 04 OR 04H 800E D3 1B OUT (RAMSEL),A ; select 0000-7FFF to system bus 8010 21 8030 LD HL,RamPCod 8013 11 0163 LD DE,RamPSt 8016 01 001A LD BC,RamPSz 8019 ED B0 LDIR ; copy RAM prog code to RAM 801B CD 0163 CALL RamPSt 801E 3E 76 LD A,076H ; HALT code 8020 32 0128 LD (RetAd),A 8023 3A 8100 LD A,(RamDat) 8026 D3 1B OUT (RAMSEL),A ; restore setting 8028 C9 RET 8029 DS (( $ + 0FH ) AND 0FFF0H) - $ 8030 RamPCod: ; RAM program code start address .dephase 0163 RamPSt: ; RAM code start address 0163 3E 01 LD A,1 0165 D3 80 OUT (AdrSdcs),A ; set SDCS:0 0167 21 0000 LD HL,RAMADR 016A 11 8000 LD DE,BNKADR 016D 06 20 LD B,32 016F 7E Loop: LD A,(HL) 0170 77 LD (HL),A 0171 EB EX DE,HL 0172 7E LD A,(HL) 0173 77 LD (HL),A 0174 EB EX DE,HL 0175 23 INC HL 0176 13 INC DE 0177 10 F6 DJNZ Loop 0179 AF XOR A 017A D3 80 OUT (AdrSdcs),A ; set SDCS:1 017C C9 RET 017D RamPEn: ; RAM prog end address 017D BkPgEn: ; bank prog code's end address 017D BankDat: 017D DS 1 ; original bank setting data ; ** work area in bank ** 8100 RamDat EQU BNKWRK ; DS 1 ; original RAM select data 8101 StackSv EQU RamDat + 1 ; DS 2 ; original stack ; DS 10 ; for stack 810D StackTop EQU StackSv + 12 ; END

     実行時のロジアナ画面が下記になります。想定通りで問題ないですね・・ ^^

    0000Hバンク内プログラム実行時のロジアナ画面(全体) [sampling:25MHz]

     0000Hバンクの外部メモリ側で動作中の試験プログラムが 0000Hバンクと 8000Hバンクのメモリを交互にリード/ライトしている部分を拡大したものが下図になります。
     RAM と ROM 信号で測定マーカーを付けている箇所がそれぞれ 0000Hバンクと 8000Hバンクをリード/ライトしている部分で想定通りで問題無しです。

    0000Hバンク内プログラム実行時のロジアナ画面(拡大) [sampling:25MHz]


 以上が今時点で確認できた内容になります。最後の方は説明の記述が息切れ気味になっている感がありますが今回はこの辺で筆を置きたいと思います。


[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

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