2022年10月10日

超小型Z80マイコン(その4)GAME言語で動作確認

 前回の記事で Z80 からの表示要求により hello 表示ができたことを書きましたが、色々弄っていると動作が不安定であることが判りました^^;

 データバスへの出力タイミングやウェイトの開放タイミング等を見直し、漸く安定動作するようになり、動作確認のために GAME 言語を入れてみました。
 前回の記事で書いた boot ROM 機能では最大 256 バイトのコードまでしか対応できないので、これを何回か繰り返して大きなサイズに対応する方法も考えられますが、以前作成した 256 バイトに収まる Hex ファイルのローダーを移植してみることにしました。

 下記が Hex ファイルローダーのソースリストになります。ロード完了後に ロード対象の開始アドレスにジャンプする機能を追加しました。








Z80PicCompacy 用 Hex ファイルローダー( Z80 アセンブラ)

;*********************************
; HexLoader for Z80PicCompact
; Ver0.01 2022/10/09 by skyriver
;*********************************

0100 STACK EQU 0100H

0000 DATPORT EQU 0
0001 CMDPORT EQU 1


0000' ASEG
ORG 0100H

0100 31 0100 HexLd: LD SP,STACK
0103 21 017B LD HL,HexMsg
0106 CD 019A CALL Puts

0109 CD 0194 START: CALL RGETC
010C FE 3A CP ':'
010E 20 F9 JR NZ,START

0110 CD 0165 CALL RDBYTE ; get byte count
0113 47 LD B,A
0114 CD 0172 CALL RDWORD ; get address
0117 22 01A2 LD (STADR),HL
011A 18 0E JR LOAD01


011C CD 0194 LOAD: CALL RGETC
011F FE 3A CP ':'
0121 20 F9 JR NZ,LOAD

0123 CD 0165 CALL RDBYTE ; get byte count
0126 47 LD B,A
0127 CD 0172 CALL RDWORD ; get address
012A CD 0165 LOAD01: CALL RDBYTE ; get record type
012D 5F LD E,A ; save type
012E FE 01 CP 1
0130 20 07 JR NZ,LOAD02

0132 CD 014E CALL DSPTYP ; end of data
0135 2A 01A2 LD HL,(STADR)
0138 E9 JP (HL)

0139 B7 LOAD02: OR A
013A 20 0C JR NZ,LdErr ; data record

013C CD 0165 RDDATA: CALL RDBYTE
013F 77 LD (HL),A
0140 23 INC HL
0141 10 F9 DJNZ RDDATA

0143 CD 014E CALL DSPTYP
0146 18 D4 JR LOAD



0148 21 018D LdErr: LD HL,ErrMsg ; error occur
014B C3 019A JP Puts


014E CD 0165 DSPTYP: CALL RDBYTE ; read check sum
0151 CD 0194 CALL RGETC ; read delimitor
0154 7B LD A,E ; get type
0155 C6 30 ADD A,'0'
0157 C3 0197 JP RPUTC


; read hex nible
; A -> data

015A CD 0194 RDNBL: CALL RGETC
015D D6 30 SUB '0'
015F FE 0A CP 10
0161 D8 RET C

0162 C6 F9 ADD A,10 + '0' - 'A'
0164 C9 RET


; read byte data
; A -> byte data

0165 CD 015A RDBYTE: CALL RDNBL
0168 07 RLCA
0169 07 RLCA
016A 07 RLCA
016B 07 RLCA
016C 4F LD C,A
016D CD 015A CALL RDNBL
0170 B1 OR C
0171 C9 RET


; read hex word
; HL -> data

0172 CD 0165 RDWORD: CALL RDBYTE
0175 67 LD H,A
0176 CD 0165 CALL RDBYTE
0179 6F LD L,A
017A C9 RET

017B 48 65 78 4C HexMsg: DB 'HexLoader Start',13,10,0
017F 6F 61 64 65
0183 72 20 53 74
0187 61 72 74 0D
018B 0A 00
018D 20 65 72 72 ErrMsg: DB ' err',13,10,0
0191 0D 0A 00

0194 DB 00 RGETC: IN A,(DATPORT)
0196 C9 RET



0197 D3 00 RPUTC: OUT (DATPORT),A
0199 C9 RET

019A 7E Puts: LD A,(HL)
019B 23 INC HL
019C B7 OR A
019D C8 RET Z

019E D3 00 OUT (DATPORT),A
01A0 18 F8 JR Puts

01A2 STADR: DS 2

END


Macros:

Symbols:
0001 CMDPORT 0000 DATPORT 014E DSPTYP
018D ERRMSG 0100 HEXLD 017B HEXMSG
0148 LDERR 011C LOAD 012A LOAD01
0139 LOAD02 019A PUTS 0165 RDBYTE
013C RDDATA 015A RDNBL 0172 RDWORD
0194 RGETC 0197 RPUTC 0100 STACK
01A2 STADR 0109 START



No Fatal error(s)




 GAME 言語のコンソール入出力部分も Z80PicCompact に合わせて変更する必要がありますが、下記のように極めてシンプルなものになります。






GAME 言語用の入出力処理( Z80 アセンブラ)

8C96 CD 8C9F GETCH: CALL CONIN
8C99 C3 8CA2 PUTCH: JP CONOUT
8C9C C3 8CA5 KBHIT: JP CONSTS
8C9F DB 00 CONIN: IN A,(DATPORT)
8CA1 C9 RET

8CA2 D3 00 CONOUT: OUT (DATPORT),A
8CA4 C9 RET

8CA5 DB 01 CONSTS: IN A,(CMDPORT)
8CA7 0F RRCA
8CA8 C9 RET



 動作確認のために所有している GAME 言語のソースの中で一番大きなもの(=コンパイラ)を使って確認した結果、安定に動作することが確認できました。表題からは GAME 言語でチェックプログラムでも作ったのかと思われた方もいらっしゃったかもしれませんがコンパイラを動かしてみたという落ちでしたw

 今回使用している USB 機能内蔵 PIC での CDC(Communication Device Class) クラスでは usb_device_cdc.c 内にある CDCInitEP() の処理内で line_coding.dwDTERate にボーレートを 9600 で設定している部分があるのですが、この値に関わらずパソコンとの通信速度は爆速です。TeraTerm 側の通信速度設定の影響も受けないようです。

 Twitterに投稿した動画付きコメントを貼っておきます。GAME 言語のコンパイラをコンパイルしているだけですが、ロードの爆速ぶりとコンパイラのなつかしさを堪能してください。






[TOP] [ 前へ ] 超小型Z80マイコン [ 次へ ]
posted by skyriver at 16:05| Comment(0) | Z80 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください