HD64180 と USB 機能を有する 20 ピンの PIC を使った 3 チップ構成のボードの開発の続編です。
前回の記事でジャンプ命令によるループができたことを書きましたが、後述するように Hello 表示と HexLoader も動いたので「
CP/M-80でのBIOSエミュレートによるMBASICの起動」の記事で書いたように CP/M の BIOS をエミュレートして MBASIC を起動し ASCIIART を動かしてみました。
今回開発の HD64180Compact と類似の構成で Z80 を実装した
Z80PicCompact との実行時間比較も行ってみました。
No. | machine environment | clock | time | ratio |
1 | Z80PicCompact | 12MHz | 95.4s | 1.00 |
2 | HD64180Compac(maximal Wait) | 6MHz | 314.1s | 3.29 |
3 | HD64180Compact(minimal Wait) | 6MHz | 165.2s | 1.73 |
最初にソフト制御可能なメモリと I/O アクセス時の WAIT 設定を行わず(リセット直後の状態では WAIT ステート数がメモリ:3、IO:4)実行したところ(上表のNo2)かなり遅い結果でしたが、WAIT を最小の設定(メモリ:0、IO:1)にした結果(上表のNo3)、Z80PicCompact のクロックから比例計算した Z80 の速度の 1.15(=95.4x2/165.2)倍になり、ASCIIART.BAS の実行では
HD64180 は Z80 より 1.15 倍速いことになります。尚、リフレッシュは禁止の設定にしています。HD64180 には 8bit の乗算命令もあるのでこれを活用できる場面では速度差が更に大きくなると思います。
WAIT を最小に設定して ASCIIART.BAS を実行した際の画面のキャプチャーが下図です。PIC に実装した BootROM 機能により Z80 側で HexLoader が起動し、その後 BIOS エミュと MBASIC の Hex ファイルを読み込ませています。
HD64180Compact での ASCIIART 実行画面( WAIT 最小設定時)
|
|
上記の比較表のエビデンスとして HD64180Compact(最大 WAIT)と Z80PicCompact での ASCIIART 実行時の画面キャプチャーも貼っておきます。
HD64180Compact での ASCIIART 実行画面(WAIT 最大設定時)
|
|
Z80PicCompact での ASCIIART 実行画面
|
|
CP/M の BIOS エミュレートのソースも短いので貼っておきます。HD64180 の拡張命令は macro 定義して使いました。
CP/M BIOS エミュレーター(Z80 アセンブラ)
|
; CP/M-80 BIOS emulator for Z80PicCompact
; Ver 0.01 2023/01/14 by skyriver
; based on CP/M-80 bios for Z80GAL
; Ver 0.01 2020/11/07 by skyriver
; Ver 0.02 2021/10/02 by skyriver
; save BC-reg at CONOUT
; test for Emurate CP/M BIOS environment 2023/05/15
; change for HD64180Compact
;++++ CP/M parameter ++++
0006 MAXDSK EQU 6 ;number of drives.
0040 MAX_SEC EQU 64 ;sectors/track
0006 MAX_SIF EQU 6 ; MAX_SEC = 1 << MAX_SIF
0040 MSIZE EQU 64 ;size of available RAM in KB
B000 BIAS EQU (MSIZE-20) * 1024
E400 CCP EQU 3400H+BIAS ;base of cpm ccp
EC06 BDOS EQU CCP+806H ;base of bdos
FA00 BIOS EQU CCP+1600H ;base of bios
0004 CDISK EQU 0004H ;current disk number (0 ... 15)
0003 IOBYTE EQU 0003H ;intel iobyte
0080 BUFF EQU 0080H ;default buffer address
000D CR EQU 13
000A LF EQU 10
0080 SECSIZE EQU 128 ; sector size
0800 CPMBKSZ EQU 2048 ; CP/M block size
0200 SDBLKSZ EQU 512 ; SD card block size
0038 RSTAD EQU 038H ; interrupt entry adr
0100 CPM_AP EQU 0100H ; CP/M app entry
.LIST
.Z80
0000' ASEG
ORG BIOS
FA00 C3 FA56 JP BOOT
FA03 WBOOTE:
FA03 C3 FAA0 JP WBOOT
FA06 C3 FA87 JP CONST
FA09 C3 FA8F JP CONIN
FA0C C3 FA92 JP CONOUT
FA0F C3 FAA1 JP LIST
FA12 C3 FAA1 JP PUNCH
FA15 C3 FAA1 JP READER
FA18 C3 FAA1 JP HOME
FA1B C3 FAA1 JP SELDSK
FA1E C3 FAA1 JP SETTRK
FA21 C3 FAA1 JP SETSEC
FA24 C3 FAA1 JP SETDMA
FA27 C3 FAA1 JP READ
FA2A C3 FAA1 JP WRITE
FA2D C3 FAA1 JP LISTST
FA30 C3 FAA1 JP SECTRAN
FA33 StMsg:
FA33 0D 0A 36 DB CR,LF,MSIZE/10+'0'
FA36 34 DB (MSIZE mod 10) + '0'
FA37 6B 20 43 50 DB 'k CP/M Ver 2.2 BIOS Emulator'
FA3B 2F 4D 20 56
FA3F 65 72 20 32
FA43 2E 32 20 42
FA47 49 4F 53 20
FA4B 45 6D 75 6C
FA4F 61 74 6F 72
FA53 0D 0A 00 DB CR,LF,0
FA56 F3 BOOT: DI
FA57 ED 56 IM 1
FA59 31 0100 LD SP,CPM_AP
FA5C AF XOR A
FA5D 32 0080 LD (BUFF),A ; clear command line
OUT0 (HDDCNTL),Areg ; set wait mem:0 IO:0
FA60 ED 39 32 + DB 0EDH,(Areg shl 3) OR 1,(HDDCNTL)
FA63 3E C9 LD A,0C9H
FA65 32 0038 LD (RSTAD),A
FA68 21 FA33 LD HL,StMsg
FA6B CD FA96 CALL Puts
;; JR GOCPM
FA6E GOCPM:
FA6E 3E C3 LD A,0C3H
FA70 32 0000 LD (0),A
FA73 21 FA03 LD HL,WBOOTE
FA76 22 0001 LD (1),HL
FA79 32 0005 LD (5),A
FA7C 21 EC06 LD HL,BDOS
FA7F 22 0006 LD (6),HL
FA82 36 C9 LD (HL),0C9H ; return code
FA84 C3 0100 JP CPM_AP
;
; check console key data
; A -> 0ffh:data exist 00h:none
FA87 CONST:
FA87 DB FF IN A,(CMDPORT) ; get status
FA89 E6 01 AND RXRDY_B
FA8B C8 RET Z ; no data
FA8C 3E FF LD A,0FFH
FA8E C9 RET
;
; input console
; A -> key data
FA8F DB FE CONIN: IN A,(DATPORT)
FA91 C9 RET
; out console
; C <- data
FA92 79 CONOUT: LD A,C
FA93 D3 FE OUT (DATPORT),A
FA95 C9 RET
; print string
; HL <- string addr
FA96 Puts:
FA96 7E LD A,(HL)
FA97 B7 OR A
FA98 C8 RET Z
FA99 4F LD C,A
FA9A CD FA92 CALL CONOUT
FA9D 23 INC HL
FA9E 18 F6 JR Puts
FAA0 76 WBOOT: HALT
FAA1 LIST:
FAA1 PUNCH:
FAA1 READER:
FAA1 HOME:
FAA1 SELDSK:
FAA1 SETTRK:
FAA1 SETSEC:
FAA1 SETDMA:
FAA1 READ:
FAA1 WRITE:
FAA1 LISTST:
FAA1 SECTRAN:
FAA1 C9 RETURN: RET
END
|
[補足]
以降に Hello 表示の際のデータをメモとして記録しておきます。下記は Z80 側のソースです。EnPic で PIC が提供するサービスが有効になり、DisPic で無効になります。
Hello 表示プログラム(Z80 アセンブラ)
|
;++++++++++++++++++++++++++++++++++++
; hello program for Z80PicCompact
; Ver 0.01 2024/02/23 by skyriver
;++++++++++++++++++++++++++++++++++++
.LIST
1000 STACK EQU 1000H
0000' ASEG
ORG 0100H
0100 31 1000 START: LD SP,STACK
0103 AF XOR A
OUT0 (HDDCNTL),Areg ; set wait mem:0 IO:0
0104 ED 39 32 + DB 0EDH,(Areg shl 3) OR 1,(HDDCNTL)
EnPic ; enable PIC I/O
0107 ED 38 00 + DB 0EDH,Areg shl 3,(HDCNTLA0)
010A E6 EF + AND 0EFH
010C F3 + DI
010D ED 39 00 + DB 0EDH,(Areg shl 3) OR 1,(HDCNTLA0)
0110 3E 01 LD A,SIO_CHAR
OUT0 (CMDPORT),Areg ; set character mode
0112 ED 39 FF + DB 0EDH,(Areg shl 3) OR 1,(CMDPORT)
0115 21 0130 LD HL,msg
0118 CD 0127 CALL Puts
DisPic
011B ED 38 00 + DB 0EDH,Areg shl 3,(HDCNTLA0)
011E F6 10 + OR 10H
0120 FB + EI
0121 ED 39 00 + DB 0EDH,(Areg shl 3) OR 1,(HDCNTLA0)
0124 C3 0124 JP $
; PUTS : put string to serial
; HL <- message address
0127 7E Puts: LD A,(HL)
0128 23 INC HL
0129 B7 OR A
012A C8 RET Z
OUT0 (DATPORT),Areg
012B ED 39 FE + DB 0EDH,(Areg shl 3) OR 1,(DATPORT)
012E 18 F7 JR PUTS
0130 68 65 6C 6C msg: DB "hello, world", 13, 10, 0
0134 6F 2C 20 77
0138 6F 72 6C 64
013C 0D 0A 00
END
|
下記が初めて Hello 表示した際の画面です^^
Z80PicCompact の環境を若干変更することで動作しました。
下図が Hello 表示時のロジアナ波形のサンプルです。1文字を PIC に送信するのに 60us 程度の時間がかかっています。突発的に時間がかかっている部分は PIC 側が USB 関連の処理をしているためだと思います。
下図は Puts をコールする部分を拡大したもので WR/ が2回アクティブになっている部分(マーカー:0)がスタックへのリターンアドレスの書込み部分です。
その後、毎回テストプログラムを PIC に書き込むのは面倒なので、PIC に HexLoader を書き込んだ状態で冒頭に書いた MBASIC と ASCIIART.BAS で実行速度の評価を行いました。
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
コメント 0