SSブログ
English Version

HD64180Compact(その3)MBASICでASCIIART [Z80]

 HD64180 と USB 機能を有する 20 ピンの PIC を使った 3 チップ構成のボードの開発の続編です。
 前回の記事でジャンプ命令によるループができたことを書きましたが、後述するように Hello 表示と HexLoader も動いたので「CP/M-80でのBIOSエミュレートによるMBASICの起動」の記事で書いたように CP/M の BIOS をエミュレートして MBASIC を起動し ASCIIART を動かしてみました。
 今回開発の HD64180Compact と類似の構成で Z80 を実装した Z80PicCompact との実行時間比較も行ってみました。

No.machine environmentclocktimeratio
1Z80PicCompact12MHz95.4s1.00
2HD64180Compac(maximal Wait)6MHz314.1s3.29
3HD64180Compact(minimal Wait)6MHz165.2s1.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 表示画面


 下図が Hello 表示時のロジアナ波形のサンプルです。1文字を PIC に送信するのに 60us 程度の時間がかかっています。突発的に時間がかかっている部分は PIC 側が USB 関連の処理をしているためだと思います。

Hello 表示時のロジアナ波形例


 下図は Puts をコールする部分を拡大したもので WR/ が2回アクティブになっている部分(マーカー:0)がスタックへのリターンアドレスの書込み部分です。


ロジアナ波形の CALL 部の拡大図


 その後、毎回テストプログラムを PIC に書き込むのは面倒なので、PIC に HexLoader を書き込んだ状態で冒頭に書いた MBASIC と ASCIIART.BAS で実行速度の評価を行いました。


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

nice! 0

コメント 0

コメントを書く

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