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の点灯状態が判らなくなる・・
[TOP] [ 前へ ] AKI80でCP/M [ 次へ ]
posted by skyriver at 09:59|
Comment(0)
|
Z80
|

|