SSブログ
English Version

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

 前回の記事で 0000H - 7FFFH バンク(以降、0000Hバンクと記す)と8000H - BFFFHバンク(以降、8000Hバンクと記す)を今回作成したシステムバス接続の拡張基板(Eborsy)に実装した外部メモリにアサインできることが判りました。今回は 0000H - BFFFH の外部メモリで動くプログラムから PC-G850V(以降、G850と記す) のBIOSをコールできるようにします。

 G850 は定期的に割込みが掛かっているので、各バンクメモリを外部メモリに切替えた状態でも割込み処理が動くようにする必要があります。初めに確認したいことは G850 の割り込みモードです。G850 の通常時にロジアナで観測した割込み処理の様子が下図です。

G850の通常時の割込み処理の様子 [sampling:25MHz]


 割込みを受け付けた部分を拡大したものが下図で "A1"のタイミングマーカー部が M1/ と IORQ/ が同時にアクティブになる Z80 の割込み応答シーケンスの始まりになります。

割込み受付部分の拡大 [sampling:25MHz]


 割り込みモード0の場合は この部分( T3 の立上り)でデータバス上の命令コードを読込みます(下図参照)。モード1の場合はデータバス上のコードは読込まず RST38 の動作を決め打ちで実行します。この直後の MREQ/のアサートはメモリリフレッシュで続けてメモリライトが 2 回発生しています。これはリターンアドレスをスタックに書き込んでいる動作なので モード2の可能性は無くなり、モード0で1バイト命令である RSTxx 命令を読込んだかモード1かの二つの可能性に絞られます。
 ここで再度タイミングマーカー部に注目すると D0 が '0' の状態になっています。RSTxx 命令は全て D0 は '1' なので G850 の割り込みモードはモード1と言うことになります。

Z80の割込みシーケンス


 因みに G850 の RSTxx のエントリ部のコードを確認すると下記のようになっていて 0038H が割込み時の実行アドレスということになります。末尾の 0066H は NMI のエントリですが、何もせずにリターンするようになっています。
      0000 : C3  F4  BF    JP  BFF4H  
      0008 : C9            RET        
      0010 : C9            RET        
      0018 : C9            RET        
      0020 : C9            RET        
      0028 : C9            RET        
      0030 : C3  03  BD    JP  BD03H  
      0038 : C3  37  BC    JP  BC37H  
      0066 : ED  45        RETN       


 割り込みモードが判ったので、0000Hバンクと8000Hバンクを外部メモリに切替えた状態での割込み受付シーケンスを次のように実装しました(下記は概要ですが割込み禁止区間等、実際には注意すべき部分が色々あります)。
  1. 0000Hバンクの外部メモリの0038H から 8000Hバンク外部メモリ上の割込み受付処理にジャンプする
  2. 割込み受付処理は外部メモリ用スタックを保存し、元のスタックに切替える
  3. 割込み受付処理は0000Hバンクを内部側に切替え 0000Hバンク内部メモリ内に事前に準備した割込み仲介処理にジャンプする
  4. 割込み仲介処理は8000Hバンクを内部側に切替え 0038H のジャンプ命令の飛び先(本来の割込み処理)をコールする
  5. 割込み仲介処理は本来の割込み処理からリターンされたら8000Hバンクを外部側に切替え、8000Hバンク上にある割込み受付処理2にジャンプする
  6. 割込み受付処理2はスタックを外部メモリ処理用に戻し、0000Hバンクを外部側に切替え後、リターンする

 また上記と類似なシーケンスで外部メモリ上で動作するプログラムから G850 の BIOS をコールするための受付処理と仲介処理を作りました。
 動作確認として、外部メモリ上で動作するプログラムから1文字出力の BIOS コール(0BE62H)を使って "He" の2文字を画面出力する処理を実行し、想定通りの表示になることを確認しました。

 今回作成したプログラムのリストを以下に示します。

外部メモリ上からのBIOSコール試験プログラム(Z80アセンブラ)
;+++++++++++++++++++++++++++++++++++++++++++ ; service call from external RAM for Eborsy ; Ver 0.01 2021/12/21 by skyriver ;+++++++++++++++++++++++++++++++++++++++++++ 0100 ORGAD EQU 0100H ; +++ G850 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 0050 USEBANK EQU 050H ; use bank No. 0004 BK00EXT EQU 004H ; code to set 0000 - 7FFFF to external RAM 0038 INTRST EQU 00038H ; interrupt entry address 0066 NINTENT EQU 00066H ; NMI entry address ; +++ IOS BIOS +++ BE62 sPOUT EQU 0BE62H ; A:out chara, DE:position 0095 PR80SIZ EQU Pr8000EN - Pr8000 0000' ASEG ORG ORGAD 0100 F3 Start: DI 0101 18 32 JR St00 0103 3A 8095 IntEnt: LD A,(SavBSel) 0106 D3 19 OUT (BANKSEL),A ; restore BANK selection 0108 CD DB 0CDH ; CALL code 0109 0000 INTADR: DW 0 010B F3 DI 010C DB 19 IN A,(BANKSEL) 010E F6 50 OR USEBANK 0110 D3 19 OUT (BANKSEL),A 0112 C3 8053 JP NewIn1 0115 3A 8096 SrvEnt: LD A,(SavAreg) 0118 F5 PUSH AF 0119 3A 8095 LD A,(SavBSel) 011C D3 19 OUT (BANKSEL),A ; restore BANK selection 011E FB EI 011F F1 POP AF 0120 CD DB 0CDH ; CALL code 0121 0000 IosADR: DW 0 0123 F5 PUSH AF 0124 DB 19 IN A,(BANKSEL) 0126 F6 50 OR USEBANK 0128 F3 DI 0129 D3 19 OUT (BANKSEL),A 012B C3 8080 JP IosSer1 ; return to IOCS system 012E 3A 8095 RETURN: LD A,(SavBSEL) 0131 D3 19 OUT (BANKSEL),A 0133 FB EI 0134 C9 RET 0135 AF St00: XOR A 0136 D3 80 OUT (AdrSdcs),A 0138 DB 19 IN A,(BANKSEL) 013A 4F LD C,A 013B F6 50 OR USEBANK 013D D3 19 OUT (BANKSEL),A ; select external bank 013F 79 LD A,C 0140 32 8095 LD (SavBSel),A 0143 ED 73 809B LD (SavSP),SP 0147 31 80DF LD SP,NewSP 014A 21 0158 LD HL,Pr80Cod 014D 11 8000 LD DE,Pr8000 0150 01 0095 LD BC,PR80SIZ 0153 ED B0 LDIR 0155 C3 8000 JP Pr8000 0158 Pr80Cod: .phase BNKADR 8000 2A 0039 Pr8000: LD HL,(INTRST + 1) 8003 22 0109 LD (INTADR),HL ; set interrupt proc address 8006 3E 04 LD A,BK00EXT 8008 D3 1B OUT (RAMSEL),A 800A 3E C3 LD A,0C3H 800C 32 0038 LD (INTRST),A 800F 21 8044 LD HL,NewInt 8012 22 0039 LD (INTRST + 1),HL 8015 21 45ED LD HL,045EDH ; RETN code 8018 22 0066 LD (0066H),HL ; set NMI entry code 801B 3E 01 LD A,1 801D D3 80 OUT (AdrSdcs),A 801F FB EI 8020 21 BE62 LD HL,sPOUT 8023 22 8099 LD (SrvAdr),HL 8026 3E 48 LD A,'H' 8028 11 0000 LD DE,0 802B CD 8062 CALL IosServ 802E 3E 65 LD A,'e' 8030 11 0001 LD DE,1 8033 CD 8062 CALL IosServ 8036 AF XOR A 8037 D3 80 OUT (AdrSdcs),A 8039 F3 EXIT: DI 803A AF XOR A 803B D3 1B OUT (RAMSEL),A 803D ED 7B 809B LD SP,(SavSP) 8041 C3 012E JP RETURN 8044 F5 NewInt: PUSH AF 8045 AF XOR A 8046 D3 1B OUT (RAMSEL),A ; set 0000 - 7FFF to internal 8048 ED 73 809D LD (SavSP1),SP 804C ED 7B 809B LD SP,(SavSP) 8050 C3 0103 JP IntEnt 8053 3E 04 NewIn1: LD A,BK00EXT 8055 D3 1B OUT (RAMSEL),A 8057 ED 73 809B LD (SavSP),SP 805B ED 7B 809D LD SP,(SavSP1) 805F F1 POP AF 8060 FB EI 8061 C9 RET ; call IOCS service ; SrvAdr <- call address 8062 IosServ: 8062 32 8096 LD (SavAreg),A 8065 AF XOR A 8066 F3 DI 8067 ED 73 809D LD (SavSP1),SP 806B ED 7B 809B LD SP,(SavSP) 806F D3 1B OUT (RAMSEL),A ; set 0000 - 7FFF to internal 8071 22 8097 LD (SavHL),HL 8074 2A 8099 LD HL,(SrvAdr) 8077 22 0121 LD (IosADR),HL 807A 2A 8097 LD HL,(SavHL) 807D C3 0115 JP SrvEnt 8080 IosSer1: 8080 F1 POP AF 8081 32 8096 LD (SavAreg),A 8084 3E 04 LD A,BK00EXT 8086 D3 1B OUT (RAMSEL),A 8088 3A 8096 LD A,(SavAreg) 808B ED 73 809B LD (SavSP),SP 808F ED 7B 809D LD SP,(SavSP1) 8093 FB EI 8094 C9 RET 8095 Pr8000EN: 8095 SavBSel: DS 1 8096 SavAreg: DS 1 8097 SavHL: DS 2 8099 SrvAdr: DS 2 809B SavSP: DS 2 809D SavSP1: DS 2 809F DS 40H 80DF NewSP: END


 上記の試験プログラム実行時のロジアナ画面が下図になります。SDCS/ が'0'の部分が試験プログラム実行中の区間です。

試験プログラム実行時のロジアナ画面 [sampling:25MHz]


 下図は試験プログラム実行中に割込みが入った箇所を拡大したものです。"A1"のタイミングマーカー部が割込み開始部分で"A2"マーカー以降が各バンクが内部側に切り替わった後の処理(外部メモリ用の MCS/ がアクティブにならない)になります。

試験プログラム実行中の割込み受付部の拡大 [sampling:25MHz]


 今回は少し短いですがここまでとします。


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

nice! 0

コメント 0

コメントを書く

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