0000 ; 0000 ; KBC−Z05サンプルプログラム (3) 0000 ; RTCの時刻をRS−232で送信する 0000 ; (RTCの定周期割込みモード使用) 0000 0000 ;******* I/Oアドレス 0000 0000 RTC EQU 00H ;RTC 先頭番地 000D RTC_D EQU RTC+0DH ;RTC コントロールレジスタD 000E RTC_E EQU RTC+0EH ;RTC コントロールレジスタE 000F RTC_F EQU RTC+0FH ;RTC コントロールレジスタF 0000 0010 CTC0 EQU 10H ;CTCチャネル0 0018 SIOAD EQU 18H ;SIO チャネルA データ 0019 SIOAC EQU 19H ;SIO チャネルA コマンド 001C PIOAD EQU 1CH ;PIO Aポート データ 001D PIOAC EQU 1DH ;PIO Aポート コマンド 0000 0000 ;******* プログラム本体 0000 0000 ORG 0 0000 310000 LD SP,0000H ;スタックポインタ設定 0003 3E00 LD A,INTTBL/256 ;CTCの割込みテーブル上位を 0005 ED47 LD I,A ;Iレジスタに入れる 0007 ED5E IM 2 ;割込みモード2に設定 0009 0009 ;******* CTC(ボーレイト・ジェネレータに使用)の初期化 0009 0009 3E17 LD A,00010111B ;CTC0をタイマモードに設定 000B D310 OUT (CTC0),A ;プリスケーラ 1/16 000D 3E03 LD A,3 ;タイムコンスタント 000F D310 OUT (CTC0),A ;9600bps(×16モード) 0011 0011 ;******* SIO チャネルAの初期化 0011 0011 21A200 LD HL,S_CMD ;コマンドのアドレス 0014 0609 LD B,S_CLEN ;コマンドの長さ 0016 0E19 LD C,SIOAC ;出力ポート 0018 EDB3 OTIR 001A 001A ;******* PIO Aポートの初期化 001A 001A 21AB00 LD HL,P_CMD ;コマンドのアドレス 001D 0605 LD B,P_CLEN ;コマンドの長さ 001F 0E1D LD C,PIOAC ;出力ポート 0021 EDB3 OTIR 0023 0023 ;******* RTCの初期化 0023 0023 3E07 LD A,0111B ;TEST=0, 24/12=24, 0025 D30F OUT (RTC_F),A ;STOP=1, RESET=1 0027 3E06 LD A,0110B ;t0,t1:1秒, INT/STD=INT, 0029 D30E OUT (RTC_E),A ;MASK=0 002B CD7F00 CALL R_WAIT ;BUSY処理 002E 002E ; ******* 時刻の設定 002E 002E 0E0C LD C,RTC+0CH ;Cを週桁に設定 0030 21B000 LD HL,RTCDATA 0033 060D LD B,13 ;データの数 0035 EDA3 RTC_L1: OUTI ;RTCデータの設定 0037 2803 JR Z,RTC_L2 0039 0D DEC C 003A 18F9 JR RTC_L1 ;週桁から1秒桁まで 003C 003C FB RTC_L2: EI 003D 3E87 LD A,10000111B ;PIO割込み許可 003F D31D OUT (PIOAC),A 0041 0041 3E00 LD A,0000B ;HOLD解除 0043 D30D OUT (RTC_D),A 0045 3E04 LD A,0100B ;TEST=0, 24/12=24, STOP=0, 0047 D30F OUT (RTC_F),A ;RESET=0 計時を開始する 0049 0049 18FE LOOP: JR LOOP ;RTC→PIOの 004B ;1秒間隔の割込み待ち 004B 004B ;******* メインプログラムはここで終わり 004B 004B ;******* PIO割込み処理ルーチン 004B F5 PIO_INT:PUSH AF 004C C5 PUSH BC 004D 004D 0E0C LD C,RTC+0CH ;Cを週桁に設定 004F CD7F00 CALL R_WAIT ;BUSY処理 0052 0052 ED78 READ_L1:IN A,(C) 0054 E60F AND 00001111B ;上位4ビットをマスク 0056 C630 ADD A,'0' ;アスキー数字に変換 0058 CD7400 CALL SIOAOUT ;RS−232に出力する 005B 0D DEC C ;次の桁 005C 79 LD A,C 005D FEFF CP RTC-1 ;1秒桁を越えたか 005F 20F1 JR NZ,READ_L1 ;まだなら続ける 0061 0061 3E00 LD A,0000B ;HOLD解除で計時再開 0063 D30D OUT (RTC_D),A ;IRQ FLAG=0でSTD.Pを 0065 ;開放にする 0065 3E0D LD A,0DH ;CR送出 0067 CD7400 CALL SIOAOUT 006A 3E0A LD A,0AH ;LF送出 006C CD7400 CALL SIOAOUT 006F 006F C1 POP BC 0070 F1 POP AF 0071 FB EI 0072 ED4D RETI 0074 0074 ;******* SIO データ送出ルーチン 0074 0074 F5 SIOAOUT:PUSH AF 0075 DB19 SIOA_L1:IN A,(SIOAC) ;RR0リード 0077 CB57 BIT 2,A ;送信バッファー空きか? 0079 28FA JR Z,SIOA_L1 007B F1 POP AF ;A=送出するデータ 007C D318 OUT (SIOAD),A ;レジスタへ書き込む 007E C9 RET 007F 007F ;******* RTC BUSYの処理ルーチン 007F 007F F5 R_WAIT: PUSH AF 0080 3E01 R_L1: LD A,0001B ;30ADJ=0, IRQFLAG=0, 0082 D30D OUT (RTC_D),A ;HOLDする 0084 DB0D IN A,(RTC_D) ;BUSYビットを読む 0086 CB4F BIT 1,A ;BUSYビットは0か? 0088 2809 JR Z,WAITEND ;Yes,リターン 008A 3E00 LD A,0000B ;HOLD一時解除する 008C D30D OUT (RTC_D),A 008E CD9500 CALL WAIT190 ;190μS待つ 0091 18ED JR R_L1 0093 F1 WAITEND:POP AF 0094 C9 RET 0095 0095 ;******* 約190μ秒 ウエイトのルーチン 0095 0095 F5 WAIT190:PUSH AF 0096 3E56 LD A,86 0098 3D WAIT_L1:DEC A 0099 20FD JR NZ,WAIT_L1 009B F1 POP AF 009C C9 RET 009D 009D ;******* PIO 割込み処理ルーチンテーブル 009D 009D ORG ($ AND 0FFF0H)+16 00A0 4B00 INTTBL:DW PIO_INT 00A2 00A2 ;******* SIO チャネルA イニシャライズ・データテーブル 00A2 00A2 18 S_CMD: DEFB 18H ;リセット 00A3 0100 DEFB 1,00000000B ;WR1,全割り込み禁止 00A5 03C1 DEFB 3,11000001B ;WR3,受信イネーブル Data=8bit 00A7 0444 DEFB 4,01000100B ;WR4, Clock=x16 Stop=1 00A9 056A DEFB 5,01101010B ;WR5,送信イネーブル Data=8bit 0009 S_CLEN EQU $-S_CMD ;SIO チャネルAコマンドデータ数 00AB 00AB ;******* PIO Aポート イニシャライズ・データテーブル 00AB 00AB CF P_CMD: DEFB 11001111B ;モード制御語(モード3) 00AC 01 DEFB 00000001B ;データ入出力制御語(1=入力) 00AD 17 DEFB 00010111B ;割り込み制御語 00AE FE DEFB 11111110B ;割込みマスク語 PA0のみ有効 00AF A0 DEFB INTTBL AND 0FFH ;割込みテーブル 0005 P_CLEN EQU $-P_CMD ;PIO コマンド数 00B0 00B0 ;******* RTC初期データ(1993年1月1日金曜日 12時34分56秒) 00B0 00B0 05090300 RTCDATA:DEFB 5,9,3,0,1,0,1,1,2,3,4,5,6 00B4 01000101 00B8 02030405 00BC 06 00BD 00BD END