2025年06月01日

AKI80でCP/M(その2)割込み動作試験


1.はじめに
 前回の記事で秋月さんが販売しているAKI-80を改造して CP/M が動作するようになったことを書きましたが、今回は割込み動作を確認しましたので記録しておきます。前回の記事に書いたように割込み対応の回路部分は今回開発したプリント基板のAki80Adapterを製造依頼した後に変更し、AKI-80の本体側に追加したものです。


2.タイマ割込み
 CPU(TMPZ84C015)に内蔵されているうカウンタ/タイマ(以降、CTCと記す)を使ったタイマ割込みで割込み動作試験を行いました。
 CTCには4つのチャンネルがあり、今回は2番目のch1を使ってみます。CTCのコントロールレジスタのビットアサインは下図のようになっています、

CTCのコントロールレジスタ(TOSHIBAのデータシートから抜粋)

 試験内容としては「5ms毎にタイマ割込みを発生させ、割込み処理内でワードデータをインクリメントする」という簡易なものです。
 下図は試験時の画面です。0x0100,0x0102 がそれぞれタイマ割込み設定と停止の処理で0x0104がカウンタです。想定通りカウンタがインクリメントされているので割込み処理は問題なく動作しているようです。
 尚、アセンブラルーチンのロードはGAME言語で作成した自作モニタ(Gamon)を使い、試験処理もGAME言語で記述しています。

タイマ割込み試験時の画面

 タイマ割込み設定処理のソースは下記の通りです。Z80での通常のmode2割込み処理です。

タイマ割込み設定処理(Z80アセンブラ)
;++++++++++++++++++++++++++++++++++++ ; AKI80 timer interrupt test ; Ver 0.01 2025/05/30 by skyriver ;++++++++++++++++++++++++++++++++++++ C INCLUDE Aki80Ada.inc C ;++++++++++++++++++++++++++++++++++++ C ; definitions for Aki80Adaptor C ; Ver 0.01 2025/05/22 by skyriver C ;++++++++++++++++++++++++++++++++++++ C C ifndef AKI80ADA C C AKI80ADA EQU 1 C C C DATPORT EQU 0ECH ; data port C CMDPORT EQU 0EDH ; command port C C C ; +++ status bit allign +++ C RXRDY_B EQU 01H C TXRDY_B EQU 80H C SDERR_B EQU 02H C C C ; +++ mode command +++ C SIO_CHAR EQU 1 ; char mode C SIO_STR EQU 2 ; put string C SD_SECT EQU 3 ; set sector C SD_RD EQU 4 ; read block C SD_WRBUF EQU 5 ; write data to buffer C SD_WR EQU 6 ; write block C SD_INI EQU 12H ; init SD C C C ; **** internal I/O **** C C CTCCH0 EQU 10H ; CTC C CTCCH1 EQU 11H ; CTC C CTCCH2 EQU 12H ; CTC C CTCCH3 EQU 13H ; CTC C C WDTER EQU 0F0H ; watch dog timer & standby mode C WDTCR EQU (WDTER + 1) ; make WDT disable/clear C INTPR EQU 0F4H ; int priority C C endif 0000' ASEG ORG 0100H 0100 18 04 START: JR SetInt ; set interrupt by CTC 0102 18 21 EXIT: JR StopInt ; stop interrupt 0104 0000 TIMCNT: DW 0 ; interrupt counter ; set CTC int 0106 F3 SetInt: DI 0107 ED 5E IM 2 0109 3E 01 LD A,high IntVec 010B ED 47 LD I,A 010D CD 0118 CALL IniCtc 0110 21 0000 LD HL,0 0113 22 0104 LD (TimCnt),HL 0116 FB EI 0117 C9 RET ; set CTC 0118 3E 38 IniCtc: LD A,low IntVec 011A D3 10 OUT (CTCCH0),A ; set vector addr 011C 3E A7 LD A,10100111B ; enable int,timer,pre:256, 011E D3 11 OUT (CTCCH1),A 0120 3E F0 LD A,240 ; 12.288*1000000/256/240=200[Hz] = 5ms 0122 D3 11 OUT (CTCCH1),A 0124 C9 RET ; stop CTC int 0125 StopInt: 0125 3E 03 LD A,00000011B ; reset channel 0127 D3 11 OUT (CTCCH1),A 0129 C9 RET ; timer interrupt 012A IntCtc: ;; PUSH AF 012A E5 PUSH HL 012B 2A 0104 LD HL,(TIMCNT) 012E 23 INC HL 012F 22 0104 LD (TIMCNT),HL 0132 E1 POP HL ;; POP AF 0133 FB IntNul: EI 0134 ED 4D RETI ORG ($+0007H) AND 0FFF8H 0138 IntVec: 0138 0133 DW IntNul 013A 012A DW IntCtc 013C 0133 DW IntNul 013E 0133 DW IntNul END


3.リアルタイムモニタ
 タイマ割込みが動くことが確認できたので「リアルタイムモニタ(ZealMon)の製作」の記事で書いたZ80用リアルタイムモニタのデモを動かしてみました。前述の記事ではタイマ割込みができる動作環境が無かったのでWeb上で動作するMSX環境のMSXPenを使用しましたが、今回のAKI-80により実機上での確認が可能になりました(今では他にも自作のHD64180Compact環境でも可能)。
 デモを実行した画面のキャプチャが下図になります。想定通りに動きました。

★追記 2025/06/03 {
 下図で複数のタスクが同時に表示する時に交互表示ではなく2文字連続表示になっています。理由は次の通りです。CP/M側の処理をコールすることで文字表示を行っており、CP/M側の処理はスレッドセーフ性が保証されないためCP/M側の処理をコール中はタスクスイッチを行わないようにしています。
}

リアルタイムモニタ(ZealMon)のデモ実行画面

 X(旧Twitter)に投稿したメッセージに添付したリアルタイムモニタのデモ動画を貼っておきます。



4.ケース
 今回はAKI-80を改造し、裏側にも追加配線がある状態なので保護する意味でもケースを作成しようと思っているのですが、Aki80Adapterを装着した状態だと直方体のケースに収まり辛いです。割込み試験を優先したので暫定的に底面だけを保護するボトムケースを作成してみました。
 下の写真はボトムケースに入れた状態でCP/Mを動かしている時の様子です。チップの文字が見えるようにライティングするとLEDの点灯状態が判らなくなる・・

ボトムケースに入ったCP/M動作中のAKI-80


[TOP] [ 前へ ] AKI80でCP/M [ 次へ ]

posted by skyriver at 09:59| Comment(0) | Z80 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください