SSブログ
English Version

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

 前回の記事で 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] [ 前へ ] 連載記事一覧 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

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