RL78/G23をCS+とE2-Liteでデバッグ中、インターバルタイマ割込みでbreakしない

はじめまして!RL78/G23初心者のNitarouです。元々は78K0/KD2とPM+でアセンブラで作成したプログラムをRL78で使える前提で取り組みましたがCS+(CC-RL)はかなり手ごわいです。インターバルタイマ割込みでbreak設定しても止まりません。エミュレータはE2-Liteです。下記プログラムを添付しますので、解決策をご教示お願い致します。

;
;***************************************
;* RAM MEMORY MAP 0FBF00H-0FFEDFH
;***************************************
;
.data .DSEG DATA
;
RREG0: .DS 4
RREG1: .DS 2
RREG2: .DS 2
ZAD1: .DS 2
ZADM1: .DS 2
ZAD2: .DS 2
ZADM2: .DS 2
ZADD: .DS 2
GAD1: .DS 2
GADM1: .DS 2
GAD2: .DS 2
GADM2: .DS 2
GASADD: .DS 2
GASDT: .DS 2
GDDSP: .DS 2
BBCNVD: .DS 2
REGA: .DS 2
REGB: .DS 6
AVCTZ: .DS 2
AVCNTZ: .DS 2
AVCTG: .DS 2
AVCNTG: .DS 2
;
MNF: .DS 1
DPF: .DS 1
DG4D: .DS 1
DG3D: .DS 1
DG2D: .DS 1
DG1D: .DS 1
DATP6: .DS 1
;
;
;**************************************
;* INITIAL SET
;**************************************
;
.SECTION .sdata, SDATA
.L_section_sdata:
;
.SECTION .text, TEXT
;
START .VECTOR 0x00000
;
INTTM00 .VECTOR 0x00020 ;タイマ割り込み
;
OPT .CSEG OPT_BYTE
.DB 0x00
.DB 0xFC ;LVD0 2.67V
.DB 0xEC ;高速メインモード2MHz
.DB 0x85 ;オンチップデバッグ許可
;
.CSEG
;
START:
DI
SEL RB0
MOV CMC,#0x00 ;低消費発振
;
MOV OSTS,#0x04 ;発振安定時間1.6~3.2ms
MOV CSC,#0xC0 ;高速オンチップオシレータ動作
MOV CKC,#0x00 ;高速オンチップオシレータ選択
MOV HOCODIV,#0x04 ;オンチップオシレータ周波数2MHz
MOV PER0,#0x21 ;PER0(F00F0H)ADCEN,TAU0EN"1"
MOVW AX,#0x0000
MOVW !TPS0,AX ;TPS0(F01B6H,F01B7H)
MOVW AX,#0x0A0F
MOVW !TT0,AX ;カウント動作停止
SET1 TMMK00 ;TAU0割込み禁止
CLR1 TMIF00 ;割込み要求フラグクリア
SET1 TMPR100 ;INTTM00の割込み優先順位レベル3
SET1 TMPR000
MOVW AX,#0x0000
MOVW !TMR00,AX ;TMR00(F0190H,F0191H)
MOVW AX,#0x0005
MOVW !TMR01,AX ;TMR01
MOVW AX,#0x0003 ;タイマカウント開始
MOVW !TS0,AX ;TS0(F01B2H,F01B3H)
MOV TIS1,#0x03
MOV TOE0,#0x03 ;ch.01出力許可
OST_CK:
NOP
START0:
NOP
START1:
CLR1 SELLOSC
MOVW TDR00,#1000 ;周期(0.25秒)
CLR1 TMIF00
CLR1 TMMK00
MOV PMCA2,#0xC0 ;P26,P27アナログ入力設定
;
;**********************************************
;* PORT SET
;**********************************************
;
MOV PM0,#0xFF ;P0.0-7 入力
MOV PU0,#0x0F ;PU0(F0030H) P0.0-3 PU抵抗付加
MOV PM1,#0x0F ;P1.0-3 入力
;P1.4-7 出力
MOV PU1,#0x0F ;PU1(F0031H) P1.0-3 PU抵抗付加
MOV PM2,#0xC0 ;P2.6-7 入力
;P2.0-5 出力
MOV PM3,#0xFF ;P3.0入力
MOV PU3,#0x01 ;PU3(F0033H) P3.0 PU抵抗付加
MOV PM4,#0xFF ;P4.0-1 入力
MOV PU4,#0x03 ;PU4(F0034H) P4.0-1 PU抵抗付加
MOV PM5,#0xFC ;P5.0-1 出力
MOV PM6,#0xFF ;P6.0-3 入力
MOV PM7,#0xF0 ;P7.0-3 出力
;P7.4-7 入力
MOV PU7,#0xF0 ;PU7(F0037H) P7.4-7 PU抵抗付加
MOV PM12,#0xFF
MOV PU12,#0x01 ;PU12(F003CH)
MOV PM14,#0xFF
MOV PU14,#0x01 ;PU14(F003EH)
;
MOV ADM0,#0x00
MOV ADM1,#0x00
MOV ADM2,#0x00
CLR1 ADMK
CLR1 PIF4
CLR1 PMK4
CLR1 EGP0.4
SET1 EGN0.4
;
;*********************************************
;* MAIN PROGRAM
;*********************************************
;
EI
MAIN1:
NOP
NOP
NOP
NOP
NOP
BR $MAIN1
;
;*********************************************
;* タイマ割込
;*********************************************
;
INTTM00:
SEL RB1
CALL !ZDTI
CALL !GDTI
CALL !CALGAS
CALL !GASDSP
NOP
RETI
;
;
;*********************************************
; Zero Data Average
;*********************************************
;
ZDTI:
CALL !AVZCTCL
MOVW HL,!ZAD1
MOVW BC,#8
CALL !CLRMEM
MOV A,#30
ZDTS:
SUB A,#1
MOV !AVCTZ,A
CALL !ZDTI0
MOVW AX,!ZAD2
XCHW AX,BC
MOVW AX,!ZADM2
CALL !SADD16
MOVW !ZADM2,AX
MOVW HL,!AVCTZ
MOV A,[HL]
CMP A,#0
BNZ $ZDTS
MOVW AX,!ZADM2
MOV C,#30
CALL !SDIV16
MOVW !ZADD,AX
RET
;
ZDTI0:
CALL !AVCTCLZ
MOVW HL,!ZAD1
MOVW BC,#6
CALL !CLRMEM
MOV A,#30
ZDTS0:
SUB A,#1
MOV !AVCNTZ,A
CALL !ADZERO
MOVW AX,!ZAD1
XCHW AX,BC
MOVW AX,!ZADM1
CALL !SADD16
MOVW !ZADM1,AX
MOVW HL,!AVCNTZ
MOV A,[HL]
CMP A,#0
BNZ $ZDTS0
MOVW AX,!ZADM1
MOV C,#30
CALL !SDIV16
MOVW !ZAD2,AX
RET
;
GDTI:
CALL !AVGCTCL
MOVW HL,!GAD1
MOVW BC,#16
CALL !CLRMEM
MOV A,#30
GDTS:
SUB A,#1
MOV !AVCTG,A
CALL !GDTI0
MOVW AX,!GAD2
XCHW AX,BC
MOVW AX,!GADM2
CALL !SADD16
MOVW !GADM2,AX
MOVW HL,!AVCTG
MOV A,[HL]
CMP A,#0
BNZ $GDTS
MOVW AX,!GADM2
MOV C,#30
CALL !SDIV16
MOVW !GASADD,AX
RET
;
GDTI0:
CALL !AVCTCLG
MOVW HL,!GAD1
MOVW BC,#16
CALL !CLRMEM
MOV A,#30
GDTS0:
SUB A,#1
MOV !AVCNTG,A
CALL !ADGAS
MOVW AX,!GAD1
XCHW AX,BC
MOVW AX,!GADM1
CALL !SADD16
MOVW !GADM1,AX
MOVW HL,!AVCNTG
MOV A,[HL]
CMP A,#0
BNZ $GDTS0
MOVW AX,!GADM1
MOV C,#30
CALL !SDIV16
MOVW !GAD2,AX
RET
;
;*********************************************
;* A/D
;*********************************************
;
ADZERO:
MOV ADS,#7
SET1 ADIF
SET1 ADCE
CALL TIMER
CLR1 ADIF
SET1 ADCS
ADZ0:
BTCLR ADIF,$ADZ1
BR $ADZ0
ADZ1:
MOVW AX,ADCR
CLR1 ADCS
CLR1 ADCE
MOV C,#***
CALL !SDIV16
MOVW !RREG1,AX
MOVW BC,AX
MOVW AX,#234
MOVW !RREG2,AX
MULHU
MOVW !RREG0,AX
MOVW AX,BC
MOVW !RREG0+2,AX
MOVW AX,!RREG0
MOV C,#100
CALL !SDIV16
MOVW !ZAD1,AX
RET
;
ADGAS:
MOV ADS,#6
SET1 ADIF
SET1 ADCE
CALL TIMER
CLR1 ADIF
SET1 ADCS
ADG0:
BTCLR ADIF,$ADG1
BR $ADG0
ADG1:
MOVW AX,ADCR
CLR1 ADCS
CLR1 ADCE
MOV C,#***
CALL !SDIV16
MOVW !GAD1,AX
RET
;
TIMER:
MOV D,#0xFF
J40: MOV E,#0xFF
J41: DEC E
BNZ $J41
DEC D
BNZ $J40
RET
;
;********************************************
;* CALC GAS
;********************************************
;
CALGAS:
MOV A,P6
AND A,#0x0F
MOV !DATP6,A
CP15: CMP !DATP6,#15 ;1111 FS=1000
BNZ $CP14
CLR1 !DPF.0
CALL !CALC
MOVW AX,!RREG0
MOV C,#60
CALL !SDIV16
MOVW !GDDSP,AX
RET
;
CP14: CMP !DATP6,#14 ;1110 FS=300
BNZ $CP13
CLR1 !DPF.0
CALL !CALC
MOVW AX,!RREG0
MOV C,#200
CALL !SDIV16
MOVW !GDDSP,AX
RET
;

CP13: CMP !DATP6,#13 ;1101 FS=200
BNZ $CP12
CLR1 !DPF.0
CALL !CALC
MOVW AX,!RREG0
MOV C,#30
CALL !SDIV16
MOV C,#10
CALL !SDIV16
MOVW !GDDSP,AX
RET
;
CP12: CMP !DATP6,#12 ;1100 FS=150
BNZ $CP11
CLR1 !DPF.0
CALL !CALC
MOVW AX,!RREG0
MOV C,#40
CALL !SDIV16
MOV C,#10
CALL !SDIV16
MOVW !GDDSP,AX
RET
;
CP11: CMP !DATP6,#11 ;1011 FS=100
BNZ $CP10
CLR1 !DPF.0
CALL !CALC
MOVW AX,!RREG0
MOV C,#60
CALL !SDIV16
MOV C,#10
CALL !SDIV16
MOVW !GDDSP,AX
RET
;
CP10: CMP !DATP6,#10 ;1010 FS=50
BNZ $CP9
CLR1 !DPF.0
CALL !CALC
MOVW AX,!RREG0
MOV C,#12
CALL !SDIV16
MOV C,#100
CALL !SDIV16
MOVW !GDDSP,AX
RET
;
CP9: CMP !DATP6,#9 ;1001 FS=30
BNZ $CP8
CLR1 !DPF.0
CALL !CALC
MOVW AX,!RREG0
MOV C,#20
CALL !SDIV16
MOV C,#100
CALL !SDIV16
MOVW !GDDSP,AX
RET
;
CP8: CMP !DATP6,#8 ;1000 FS=20
BNZ $CP7
CLR1 !DPF.0
CALL !CALC
MOVW AX,!RREG0
MOV C,#30
CALL !SDIV16
MOV C,#100
CALL !SDIV16
MOVW !GDDSP,AX
RET
;
CP7: CMP !DATP6,#7 ;0111 FS=30.0
BNZ $CP6
SET1 !DPF.0
CALL !CALC
MOVW AX,!RREG0
MOV C,#20
CALL !SDIV16
MOV C,#10
CALL !SDIV16
MOVW !GDDSP,AX
RET
;
CP6: CMP !DATP6,#6 ;0110 FS=25.0
BNZ $CP5
SET1 !DPF.0
CALL !CALC_OX
MOVW AX,!RREG0
MOV C,#241
CALL !SDIV16
MOVW !GDDSP,AX
RET
;
CP5: CMP !DATP6,#5 ;0101 FS=20.0
BNZ $CP4
SET1 !DPF.0
CALL !CALC
MOVW AX,!RREG0
MOV C,#30
CALL !SDIV16
MOV C,#10
CALL !SDIV16
MOVW !GDDSP,AX
RET
;
CP4: CMP !DATP6,#4 ;0100 FS=10.0
BNZ $CP3
SET1 !DPF.0
CALL !CALC
MOVW AX,!RREG0
MOV C,#30
CALL !SDIV16
MOV C,#20
CALL !SDIV16
MOVW !GDDSP,AX
RET
;
CP3: CMP !DATP6,#3 ;0011 FS=5.0
BNZ $CP2
SET1 !DPF.0
CALL !CALC
MOVW AX,!RREG0
MOV C,#12
CALL !SDIV16
MOV C,#100
CALL !SDIV16
MOVW !GDDSP,AX
RET
;
CP2: CMP !DATP6,#2 ;0010 FS=2.0
BNZ $CP1
SET1 !DPF.0
CALL !CALC
MOVW AX,!RREG0
MOV C,#30
CALL !SDIV16
MOV C,#100
CALL !SDIV16
MOVW !GDDSP,AX
RET
;
CP1: CMP !DATP6,#1 ;0001 FS=1.0
BNZ $CP0
SET1 !DPF.0
CALL !CALC
MOVW AX,!RREG0
MOV C,#60
CALL !SDIV16
MOV C,#100
CALL !SDIV16
MOVW !GDDSP,AX
RET
;
CP0: SET1 !DPF.0
CALL !CALC
MOVW AX,!RREG0
MOV C,#60
CALL !SDIV16
MOV C,#100
CALL !SDIV16
MOVW !GDDSP,AX
RET
;
CALC:
MOVW AX,!GASADD
MOVW DE,AX
MOVW HL,!ZADD
CALL !ZCP2B
BC $MNDP_S
CLR1 !MNF.1
BR $CALC_0
MNDP_S:
SET1 !MNF.1
MOVW AX,!GASADD
XCHW AX,BC
MOVW AX,!ZADD
CALL !SSUB16
MOVW !GASDT,AX
BR $CALC_1
CALC_0:
MOVW AX,!ZADD
XCHW AX,BC
MOVW AX,!GASADD
CALL !SSUB16
MOVW !GASDT,AX
CALC_1:
MOVW AX,#5
MOVW DE,AX
MOVW HL,!GASDT
CALL !ZCP2B
BC $NORM_DP
MOVW AX,#0
MOVW !GASDT,AX
NORM_DP:
MOVW AX,!GASDT
MOVW !RREG1,AX
MOVW AX,#128
MOVW !RREG2,AX
MOVW BC,AX
MOVW AX,!RREG1
MULHU
MOVW !RREG0+2,AX
MOVW AX,BC
MOVW !RREG0,AX
RET
;
CALC_OX:
MOVW AX,!GASADD
MOVW DE,AX
MOVW HL,!ZADD
CALL !ZCP2B
BC $MNDP_OX_S
CLR1 !MNF.1
BR $CALC_OX_0
MNDP_OX_S:
SET1 !MNF.1
MOVW AX,!GASADD
XCHW AX,BC
MOVW AX,!ZADD
CALL !SSUB16
MOVW !GASDT,AX
BR $CALC_OX_1
CALC_OX_0:
MOVW AX,!ZADD
XCHW AX,BC
MOVW AX,!GASADD
CALL !SSUB16
MOVW !GASDT,AX
CALC_OX_1:
MOVW AX,!GASDT
MOVW !RREG1,AX
MOVW AX,#128
MOVW !RREG2,AX
MOVW BC,AX
MOVW AX,!RREG1
MULHU
MOVW !RREG0,AX
MOVW AX,BC
MOVW !RREG0+2,AX
RET
;
;********************************************
; Data Clear
;********************************************
;
AVZCTCL:
MOVW HL,!AVCTZ
MOVW BC,#1
CALL !CLRMEM
RET
;
AVCTCLZ:
MOVW HL,!AVCNTZ
MOVW BC,#1
CALL !CLRMEM
RET
;
AVGCTCL:
MOVW HL,!AVCTG
MOVW BC,#1
CALL !CLRMEM
RET
;
AVCTCLG:
MOVW HL,!AVCNTG
MOVW BC,#1
CALL !CLRMEM
RET
;
CLRMEM:
NOP
NOP
CLRM:
MOV A,#0
MOV [HL],A
INCW HL
DECW BC
MOV A,B
OR A,C
BNZ $CLRM
RET
;
;********************************************
;* GAS DISPLAY
;********************************************
;
GASDSP:
NOP
MOV A,!DPF
BT A.0,$DPDP
BR $GASDP0
DPDP: SET1 P1.4
BR $GASDP1
GASDP0: CLR1 P1.4
;
GASDP1: MOV A,!MNF
BT A.1,$MNDP
BR $NMDP
MNDP: SET1 P1.5
BR $NMDP0
;
NMDP: CLR1 P1.5
NMDP0:
MOVW AX,!GDDSP
CMPW AX,#999
BH $THDDP_0
MOVW AX,!GDDSP
CMPW AX,#99
BH $HRDDP_0
MOVW AX,!GDDSP
CMPW AX,#9
BH $TENDP_0
BR $SGLDP_0
THDDP_0:
MOVW AX,!GDDSP
MOVW !REGA,AX
CALL !B_DCONV
MOV A,!REGB+0
MOV !DG4D,A
MOV A,!REGB+1
MOV !DG3D,A
MOV A,!REGB+2
MOV !DG2D,A
MOV A,!REGB+3
MOV !DG1D,A
BR $LCDDRV_1
HRDDP_0:
MOVW AX,!GDDSP
MOVW !REGA,AX
CALL !B_DCONV
MOV A,!REGB
MOV !DG4D,A
MOV A,!REGB+1
MOV !DG3D,A
MOV A,!REGB+2
MOV !DG2D,A
MOV !DG1D,#0x0F
BR $LCDDRV_1
TENDP_0:
MOVW AX,!GDDSP
MOVW !REGA,AX
CALL !B_DCONV
MOV A,!REGB
MOV !DG4D,A
MOV A,!REGB+1
MOV !DG3D,A
MOV !DG2D,#0x0F
MOV !DG1D,#0x0F
BR $LCDDRV_1
SGLDP_0:
MOV A,!DPF
BT A.0,$MODZZ
BR $MODZ
LCDDRV_1:
BR $LCDDRV
MODZ:
CLR1 P1.4
MOVW AX,!GDDSP
MOVW !REGA,AX
CALL !B_DCONV
MOV A,!REGB
MOV !DG4D,A
MOV !DG3D,#0x0F
MOV !DG2D,#0x0F
MOV !DG1D,#0x0F
BR $LCDDRV
MODZZ:
SET1 P1.4
MOVW AX,!GDDSP
MOVW !REGA,AX
CALL !B_DCONV
MOV A,!REGB
MOV !DG4D,A
MOV !DG3D,#0x00
MOV !DG2D,#0x0F
MOV !DG1D,#0x0F
BR $LCDDRV
;
LCDDRV:
MOV A,!DG1D
MOV P7,A
SET1 P5.1
SET1 P5.0
CLR1 P1.6
SET1 P1.7
NOP
CLR1 P1.7
MOV A,!DG2D
MOV P7,A
CLR1 P5.1
SET1 P5.0
CLR1 P1.6
SET1 P1.7
NOP
CLR1 P1.7
MOV A,!DG3D
MOV P7,A
SET1 P5.1
CLR1 P5.0
CLR1 P1.6
SET1 P1.7
NOP
CLR1 P1.7
MOV A,!DG4D
MOV P7,A
CLR1 P5.1
CLR1 P5.0
CLR1 P1.6
SET1 P1.7
NOP
CLR1 P1.7
RET
;
SADD16:
XCH A,X
ADD A,C
XCH A,X
ADDC A,B
RET
;
SSUB16:
XCH A,X
SUB A,C
XCH A,X
SUBC A,B
RET
;
ZCP2B:
PUSH DE
CALL !ZSB2B_1
BC $ZCP2B1
MOV A,D
OR A,E
BZ $ZCP2B1
MOV B,A
XOR A,B
INC A
ZCP2B1: POP DE
RET
;
ZSB2B_1:
MOV A,E
SUB A,[HL]
MOV E,A
INCW HL
MOV A,D
SUBC A,[HL]
MOV D,A
DECW HL
RET
;
SMULT16:
MOV A,#0
MOV !RREG0,A
MOV !(RREG0+1),A
MOV B,#16
JMLT120:
CLR1 CY
MOV A,!RREG0
ROLC A,1
MOV !RREG0,A
MOV A,!(RREG0+1)
ROLC A,1
MOV !(RREG0+1),A
MOV A,!RREG1
ROLC A,1
MOV !RREG1,A
MOV A,!(RREG1+1)
ROLC A,1
MOV !(RREG1+1),A
BNC $JMLT220
MOV A,!RREG2
ADD A,!RREG0
MOV !RREG0,A
MOV A,!(RREG2+1)
ADDC A,!(RREG0+1)
MOV !(RREG0+1),A
MOV A,#0
ADDC A,!RREG1
MOV !RREG1,A
JMLT220:
DEC B
BNZ $JMLT120
RET
;
SDIV16:
MOVW DE,AX
MOV X,#0
MOV B,#16
JDIV160:
MOV A,X
ADD X,A
MOV A,E
ADDC E,A
MOV A,D
ADDC D,A
MOV A,#0
ADDC A,X
SUB A,C
MOV X,A
MOV A,E
BT A.0,$JDIV180
BC $JDIV170
OR A,#0x01
MOV E,A
BR $JDIV180
JDIV170:
MOV A,C
ADD X,A
JDIV180:
DEC B
BNZ $JDIV160
MOV A,X
MOV C,A
MOVW AX,DE
RET
;
B_DCONV:
MOVW AX,!REGA
MOV B,#4
MOV C,#0
MOVW HL,!REGB
NOP
B_D1:
MOVW DE,#10
DIVHU
NOP
XCHW AX,DE
MOV [HL+C],A
INC C
XCHW AX,DE
DEC B
BNZ $B_D1
MOV A,X
MOV [HL+C],A
RET

  • チョコです。

    具体的なデバイスは何でしょうか?

    以下の2つの命令はSFRが2ndSFR領域なので、単純にこの記述ではエラーになります。

    他にも、同じ種類のエラーになる記述がありそうです。

    また、以下の初期設定の部分は気になります。TDR00に値が設定されていないのにタイマが起動されています。

    その後にも、以下のような設定で0.25秒とありますが、2MHzを1001カウントしても周期は1ミリ秒にしかならないのでは。

    他にも気になるところはありますが、全部を読む気にはなりません。

    プロジェクト・ファイルがあれば、ビルドして、もっとチェックできるとおもわれますが。

    以上

  • チョコです。

    78K0/KD2は、8ビットMCUでRL78/G23は16ビットMCUです。16+ビット化に伴い内蔵周辺機能が追加されています。その結果SFRが256バイト(メモリの最後)に収まらなくなって、2ndSFRにも配置されるようになりました。78K0では、SFRはそのまま名前だけで指定できますが、RL78では2ndSFRの場合には、名前の頭に"!"を付ける必要があります。

    また、メモリ空間が64kを超えるためにCALL命令のオペランドにも"!addr1"のように、名前の頭に"!"を付ける必要があります。

    書かれていたプログラムに、このような修正を行い、ビルドは通るようになりました。

    そこで、デバッガとしてシミュレータを使って、確認してみました。

    そのときの状態が以下の画面イメージです。

    また、メモリの0x20番地の16ビットを見ると0189となっているので、そのアドレスを確認すると、以下のようになっていましたので、ここにブレーク・ポイントを設定してみました。

    何も考えずに、ブレーク・ポイントを有効にして実行してみました。

    その結果が下に示す画面イメージです。

    きちんと、INTTM00でブレークがかかっています。

    ここで、右下の部分を拡大したものを下に示します。

    x00189番地でブレークして、実行時間が528.000μ秒かかっていることが分かります

    初期化等の時間がかかっていいることもあり、500μよりは長くなっています。

    この状態で、そのまま実行させると、暴走しているようで戻ってきません。

    実行を停止してみると下のようにプログラムの」ないところでした。

    プログラムの細かなところをチェックする気はないのですが、本来なら、プログラムの最初で設定するSPの設定がソース上に見当たりません。また、起動時のCPUの制御レジスタを見るとありえない値になっています。これは、シミュレータが勝手に決めた値、実際のSPの値は不定となります。

    この書き込みを参考にして、デバッグを進めてください。

    以上

  • G23_ASM_TEST.zip

    チョコです。

    Nitarouさんのレスポンスがないので、こちらで勝手にプロジェクトを作成して、簡単な評価を行いました。プロジェクトのzipファイルを添付しておきます。

    前回の書き込みで、スタックポインタ(SP)が設定されていないのでうまく動かないと指摘しましたが、そこの部分を修正しておきました。下に示すのが、スタック領域を32バイト確保したところです。

    下に示すのは、SPの設定を行っているところです。

    この状態で、ビルドして、シミュレータにダウンロードしてみました。

    前回と同様にINTTM00でブレークしたのが下の画面イメージです。前回と同じく526.5μ秒かかっています。

    このまま、実行を再開すると、下のような結果になりました。

    時間が330m秒かかって、TM00のカウント値(TCR00)が103と明らかに異常です。

    この理由は、TM00のインターバル時間よりも、INTTM00の処理時間の方が長いという割り込み処理ではやってはいけない処理になっていることが判断できます。

    そこで、下のように、サブルーチンコールの処理時間をブレークポイントを設定することで測定してみます。

    1回実行すると、下のようになりました。サブルーチンZDTIの処理でほぼ165m秒かかっていることが分かります。

    同様に、GDTIの処理時間もほぼ165m秒かかっていることが分かります。

    CALGASの実行で、523μ秒かかっています。

    GASDSPの実行では、ほぼ106μ秒ksksっています。

    ということで、周期がTM00ではなく、その処理時間で決まってしまっている状態です。周期を250m秒となるように、TPS0レジスタと、TDR00レジスタの設定値を見直すべきです。

    これ以上は、プログラムの詳細にはいってしまうので、コメントしません。ここまでの、基本的な内容を見直してください。

    以上

  • チョコさん、ありがとうございます。

    インターバルタイマの時間、等を見直しましてデバッグを行うとAD変換プログラムでbreakしません。

    ADIFの確認ができないからと思われますが、解決方法をご教示ください。

    Nitarou

    添付ファイルの添付方法をご指導ください。

    • ADZERO:
      MOV ADS,#7
      SET1 ADIF
      SET1 ADCE
      CALL TIMER
      CLR1 ADIF
      SET1 ADCS
      ADZ0:
      BTCLR ADIF,$ADZ1
      BR $ADZ0
      ADZ1:
      MOVW AX,ADCR
      CLR1 ADCS
  • チョコです。

    >ADIFの確認ができないからと思われますが、解決方法をご教示ください。

    割り込みについての考え違いがあります。A/Dの初期設定は以下のようになっています。

    問題は下の129行目にあります。これはA/D変換の割り込みのマスクを解除(=ベクタ割り込み許可)しています。これでは、A/D変換が完了してINTADが発生すると、INTADの割り込みが受付けられてINTADのベクタに分岐し、ADIFフラグはクリアされてしまいます。ここらの仕組みは78K0でも同じだったはずです。つまり、今回の使い方では、ADMKはクリアしてはいけません。必ずADMKはセット(マスクをセット=ベクタ割り込みは禁止)しておく必要があります。

    しかも、割り込みベクタとしては、以下の2つしか定義していません。

    実際にメモリを確認すると、以下のように他の割り込みベクタは定義されていません。

    そのため、INTADが受付けされると0x0000番地に分岐して、そこの内容を命令としてフェッチして以降は暴走することが考えられます。

    繰り返しになりますが、ADIFをポーリングする場合には、必ずADMKはセットしないといけません。

    下に示す処理にはいくつか問題があります。272行目は無駄な処理です。

    色んなところでサブルーチンTIMERを呼び出しています。このサブルーチンの先頭と最後にブレークポイントを設定して実行時間を測定してみました。

    その結果は、以下のように163m秒と長すぎると思われます。

     

    また、前回指摘したINTTM00の周期よりINTTM00割り込み処理時間が長いと、他の処理はできません。これは、INTADとINTTM00では、INTTM00の優先順位が高いので、INTADが発生してもINTTM00が優先され、その間に次のINTTM00が発生するので、INTADでの暴走はおこりませんが。

    とにかくいくつかの問題が重なっているのが現状のステータスです。

    >添付ファイルの添付方法をご指導ください。

    マウスカーソル位置は投稿画面の一番上か一番下に動かしておいた方がいいでしょう。

    下の画面イメージにあるように、投稿画面の下側のツール・バーの「Insert」をクリックしてプルアップメニューの「Image/Video/file」をクリックします。

    すると、下に示すウィンドウが開くので、「Upload」をクリックすると、ファイルを指定するウィンドウが開きます。

    そこで、以下のように指定します。

    すると、以下の画面のように、指定したファイルが指定されます。ここで「OK」をクリックします。

    以上

  • チョコさん、大変お世話になっております。

    タイマクロックをTPS0に0x0009を書き込んで時間を長くして、ADの変換時間はADM0の値をfclkに指定してみました。VECTORはINTADとして0x00034を指定しました。CLR1 ADMKは削除しました。

    ADIFの検出がまだできませんので、お忙しいところ恐れ入りますが、ご指導ください。

    fileの添付に挑戦しましたが上手く添付できませんでした。申し訳ありません。

    ;
    ;***************************************
    ;* RAM MEMORY MAP 0FBF00H-0FFEDFH
    ;***************************************
    ;
    .data .DSEG DATA
    ; stack area
    STACK: .DS 48
    STACKEND:
    ;
    RREG0: .DS 4
    RREG1: .DS 2
    RREG2: .DS 2
    ZAD1: .DS 2
    ZADM1: .DS 2
    ZAD2: .DS 2
    ZADM2: .DS 2
    ZADD: .DS 2
    GAD1: .DS 2
    GADM1: .DS 2
    GAD2: .DS 2
    GADM2: .DS 2
    GASADD: .DS 2
    GASDT: .DS 2
    GDDSP: .DS 2
    BBCNVD: .DS 2
    REGA: .DS 2
    REGB: .DS 6
    AVCTZ: .DS 2
    AVCNTZ: .DS 2
    AVCTG: .DS 2
    AVCNTG: .DS 2
    ;
    MNF: .DS 1
    DPF: .DS 1
    DG4D: .DS 1
    DG3D: .DS 1
    DG2D: .DS 1
    DG1D: .DS 1
    DATP6: .DS 1
    ;
    ;
    ;**************************************
    ;* INITIAL SET
    ;**************************************
    ;
    .SECTION .sdata, SDATA
    .L_section_sdata:
    ;
    .SECTION .text, TEXT
    ;
    START .VECTOR 0x00000 ;start
    ;
    INTTM00 .VECTOR 0x00020 ;タイマ割り込み
    ;
    INTAD .VECTOR 0x00034 ;AD割込み
    ;
    OPT .CSEG OPT_BYTE
    .DB 0x00
    .DB 0xFC ;LVD0 2.67V
    .DB 0xEC ;高速メインモード2MHz
    .DB 0x85 ;オンチップデバッグ許可
    ;
    .CSEG
    ;
    START:
    MOVW SP, #LOWW STACKEND
    ;
    DI
    SEL RB0
    MOV CMC,#0x00 ;低消費発振
    ;
    MOV OSTS,#0x04 ;発振安定時間1.6~3.2ms
    MOV CSC,#0xC0 ;高速オンチップオシレータ動作
    MOV CKC,#0x00 ;高速オンチップオシレータ選択
    MOV !HOCODIV,#0x04 ;オンチップオシレータ周波数2MHz
    MOV !PER0,#0x21 ;PER0(F00F0H)ADCEN,TAU0EN"1"
    MOVW AX,#0x0009
    MOVW !TPS0,AX ;TPS0(F01B6H,F01B7H)
    MOVW AX,#0x0A0F
    MOVW !TT0,AX ;カウント動作停止
    SET1 TMMK00 ;TAU0割込み禁止
    CLR1 TMIF00 ;割込み要求フラグクリア
    SET1 TMPR100 ;INTTM00の割込み優先順位レベル3
    SET1 TMPR000
    MOVW AX,#0x0000
    MOVW !TMR00,AX ;TMR00(F0190H,F0191H)
    MOVW AX,#0x0005
    MOVW !TMR01,AX ;TMR01
    MOVW AX,#0x0001 ;タイマカウント開始
    MOVW !TS0,AX ;TS0(F01B2H,F01B3H)
    MOV !TIS1,#0x03
    MOV !TOE0,#0x03 ;ch.01出力許可
    OST_CK:
    NOP
    START0:
    NOP
    START1:
    CLR1 SELLOSC
    MOVW TDR00,#1000 ;周期(0.25秒)
    CLR1 TMIF00
    CLR1 TMMK00
    MOV !PMCA2,#0xC0 ;P26,P27アナログ入力設定
    ;
    ;**********************************************
    ;* PORT SET
    ;**********************************************
    ;
    MOV PM0,#0xFF ;P0.0-7 入力
    MOV !PU0,#0x0F ;PU0(F0030H) P0.0-3 PU抵抗付加
    MOV PM1,#0x0F ;P1.0-3 入力
    ;P1.4-7 出力
    MOV !PU1,#0x0F ;PU1(F0031H) P1.0-3 PU抵抗付加
    MOV PM2,#0xC0 ;P2.6-7 入力
    ;P2.0-5 出力
    MOV PM3,#0xFF ;P3.0入力
    MOV !PU3,#0x01 ;PU3(F0033H) P3.0 PU抵抗付加
    MOV PM4,#0xFF ;P4.0-1 入力
    MOV !PU4,#0x03 ;PU4(F0034H) P4.0-1 PU抵抗付加
    MOV PM5,#0xFC ;P5.0-1 出力
    MOV PM6,#0xFF ;P6.0-3 入力
    MOV PM7,#0xF0 ;P7.0-3 出力
    ;P7.4-7 入力
    MOV !PU7,#0xF0 ;PU7(F0037H) P7.4-7 PU抵抗付加
    MOV PM12,#0xFF
    MOV !PU12,#0x01 ;PU12(F003CH)
    MOV PM14,#0xFF
    MOV !PU14,#0x01 ;PU14(F003EH)
    ;
    MOV ADM0,#0x28 ;AD変換時間fclk
    MOV ADM1,#0x08 ;fclk (2MHz)
    MOV !ADM2,#0x00
    ;
    CLR1 PIF4
    CLR1 PMK4
    CLR1 EGP0.4
    SET1 EGN0.4
    ;
    ;*********************************************
    ;* MAIN PROGRAM
    ;*********************************************
    ;
    EI
    MAIN1:
    NOP
    NOP
    NOP
    NOP
    NOP
    BR $MAIN1
    ;
    ;*********************************************
    ;* タイマ割込
    ;*********************************************
    ;
    INTTM00:
    SEL RB1
    CALL !ZDTI
    CALL !GDTI
    CALL !CALGAS
    CALL !GASDSP
    NOP
    RETI
    ;
    INTAD:
    MOVW AX,ADCR
    RETI
    ;
    ;*********************************************
    ; Zero Data Average
    ;*********************************************
    ;
    ZDTI:
    CALL !AVZCTCL
    MOVW HL,!ZAD1
    MOVW BC,#8
    CALL !CLRMEM
    MOV A,#30
    ZDTS:
    SUB A,#1
    MOV !AVCTZ,A
    CALL !ZDTI0
    MOVW AX,!ZAD2
    XCHW AX,BC
    MOVW AX,!ZADM2
    CALL !SADD16
    MOVW !ZADM2,AX
    MOVW HL,!AVCTZ
    MOV A,[HL]
    CMP A,#0
    BNZ $ZDTS
    MOVW AX,!ZADM2
    MOV C,#30
    CALL !SDIV16
    MOVW !ZADD,AX
    RET
    ;
    ZDTI0:
    CALL !AVCTCLZ
    MOVW HL,!ZAD1
    MOVW BC,#6
    CALL !CLRMEM
    MOV A,#30
    ZDTS0:
    SUB A,#1
    MOV !AVCNTZ,A
    CALL !ADZERO
    MOVW AX,!ZAD1
    XCHW AX,BC
    MOVW AX,!ZADM1
    CALL !SADD16
    MOVW !ZADM1,AX
    MOVW HL,!AVCNTZ
    MOV A,[HL]
    CMP A,#0
    BNZ $ZDTS0
    MOVW AX,!ZADM1
    MOV C,#30
    CALL !SDIV16
    MOVW !ZAD2,AX
    RET
    ;
    GDTI:
    CALL !AVGCTCL
    MOVW HL,!GAD1
    MOVW BC,#16
    CALL !CLRMEM
    MOV A,#30
    GDTS:
    SUB A,#1
    MOV !AVCTG,A
    CALL !GDTI0
    MOVW AX,!GAD2
    XCHW AX,BC
    MOVW AX,!GADM2
    CALL !SADD16
    MOVW !GADM2,AX
    MOVW HL,!AVCTG
    MOV A,[HL]
    CMP A,#0
    BNZ $GDTS
    MOVW AX,!GADM2
    MOV C,#30
    CALL !SDIV16
    MOVW !GASADD,AX
    RET
    ;
    GDTI0:
    CALL !AVCTCLG
    MOVW HL,!GAD1
    MOVW BC,#16
    CALL !CLRMEM
    MOV A,#30
    GDTS0:
    SUB A,#1
    MOV !AVCNTG,A
    CALL !ADGAS
    MOVW AX,!GAD1
    XCHW AX,BC
    MOVW AX,!GADM1
    CALL !SADD16
    MOVW !GADM1,AX
    MOVW HL,!AVCNTG
    MOV A,[HL]
    CMP A,#0
    BNZ $GDTS0
    MOVW AX,!GADM1
    MOV C,#30
    CALL !SDIV16
    MOVW !GAD2,AX
    RET
    ;
    ;*********************************************
    ;* A/D
    ;*********************************************
    ;
    ADZERO:
    MOV ADS,#7
    SET1 ADCE
    CALL TIMER
    CLR1 ADIF
    SET1 ADCS
    ADZ0:
    BTCLR ADIF,$ADZ1
    BR $ADZ0
    ADZ1:
    MOVW AX,ADCR
    CLR1 ADCS
    CLR1 ADCE
    MOV C,#***
    CALL !SDIV16
    MOVW !RREG1,AX
    MOVW BC,AX
    MOVW AX,#234
    MOVW !RREG2,AX
    MULHU
    MOVW !RREG0,AX
    MOVW AX,BC
    MOVW !RREG0+2,AX
    MOVW AX,!RREG0
    MOV C,#100
    CALL !SDIV16
    MOVW !ZAD1,AX
    RET
    ;
    ADGAS:
    MOV ADS,#6
    SET1 ADCE
    CALL TIMER
    CLR1 ADIF
    SET1 ADCS
    ADG0:
    BTCLR ADIF,$ADG1
    BR $ADG0
    ADG1:
    MOVW AX,ADCR
    CLR1 ADCS
    CLR1 ADCE
    MOV C,#***
    CALL !SDIV16
    MOVW !GAD1,AX
    RET
    ;
    TIMER:
    MOV D,#0x03
    J40: MOV E,#0x03
    J41: DEC E
    BNZ $J41
    DEC D
    BNZ $J40
    RET
    ;
    ;********************************************
    ;* CALC GAS
    ;********************************************
    ;
    CALGAS:
    MOV A,P6
    AND A,#0x0F
    MOV !DATP6,A
    CP15: CMP !DATP6,#15 ;1111 FS=1000
    BNZ $CP14
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#60
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP14: CMP !DATP6,#14 ;1110 FS=300
    BNZ $CP13
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#200
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;

    CP13: CMP !DATP6,#13 ;1101 FS=200
    BNZ $CP12
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#30
    CALL !SDIV16
    MOV C,#10
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP12: CMP !DATP6,#12 ;1100 FS=150
    BNZ $CP11
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#40
    CALL !SDIV16
    MOV C,#10
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP11: CMP !DATP6,#11 ;1011 FS=100
    BNZ $CP10
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#60
    CALL !SDIV16
    MOV C,#10
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP10: CMP !DATP6,#10 ;1010 FS=50
    BNZ $CP9
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#12
    CALL !SDIV16
    MOV C,#100
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP9: CMP !DATP6,#9 ;1001 FS=30
    BNZ $CP8
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#20
    CALL !SDIV16
    MOV C,#100
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP8: CMP !DATP6,#8 ;1000 FS=20
    BNZ $CP7
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#30
    CALL !SDIV16
    MOV C,#100
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP7: CMP !DATP6,#7 ;0111 FS=30.0
    BNZ $CP6
    SET1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#20
    CALL !SDIV16
    MOV C,#10
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP6: CMP !DATP6,#6 ;0110 FS=25.0
    BNZ $CP5
    SET1 !DPF.0
    CALL !CALC_OX
    MOVW AX,!RREG0
    MOV C,#241
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP5: CMP !DATP6,#5 ;0101 FS=20.0
    BNZ $CP4
    SET1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#30
    CALL !SDIV16
    MOV C,#10
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP4: CMP !DATP6,#4 ;0100 FS=10.0
    BNZ $CP3
    SET1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#30
    CALL !SDIV16
    MOV C,#20
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP3: CMP !DATP6,#3 ;0011 FS=5.0
    BNZ $CP2
    SET1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#12
    CALL !SDIV16
    MOV C,#100
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP2: CMP !DATP6,#2 ;0010 FS=2.0
    BNZ $CP1
    SET1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#30
    CALL !SDIV16
    MOV C,#100
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP1: CMP !DATP6,#1 ;0001 FS=1.0
    BNZ $CP0
    SET1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#60
    CALL !SDIV16
    MOV C,#100
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP0: SET1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#60
    CALL !SDIV16
    MOV C,#100
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CALC:
    MOVW AX,!GASADD
    MOVW DE,AX
    MOVW HL,!ZADD
    CALL !ZCP2B
    BC $MNDP_S
    CLR1 !MNF.1
    BR $CALC_0
    MNDP_S:
    SET1 !MNF.1
    MOVW AX,!GASADD
    XCHW AX,BC
    MOVW AX,!ZADD
    CALL !SSUB16
    MOVW !GASDT,AX
    BR $CALC_1
    CALC_0:
    MOVW AX,!ZADD
    XCHW AX,BC
    MOVW AX,!GASADD
    CALL !SSUB16
    MOVW !GASDT,AX
    CALC_1:
    MOVW AX,#5
    MOVW DE,AX
    MOVW HL,!GASDT
    CALL !ZCP2B
    BC $NORM_DP
    MOVW AX,#0
    MOVW !GASDT,AX
    NORM_DP:
    MOVW AX,!GASDT
    MOVW !RREG1,AX
    MOVW AX,#128
    MOVW !RREG2,AX
    MOVW BC,AX
    MOVW AX,!RREG1
    MULHU
    MOVW !RREG0+2,AX
    MOVW AX,BC
    MOVW !RREG0,AX
    RET
    ;
    CALC_OX:
    MOVW AX,!GASADD
    MOVW DE,AX
    MOVW HL,!ZADD
    CALL !ZCP2B
    BC $MNDP_OX_S
    CLR1 !MNF.1
    BR $CALC_OX_0
    MNDP_OX_S:
    SET1 !MNF.1
    MOVW AX,!GASADD
    XCHW AX,BC
    MOVW AX,!ZADD
    CALL !SSUB16
    MOVW !GASDT,AX
    BR $CALC_OX_1
    CALC_OX_0:
    MOVW AX,!ZADD
    XCHW AX,BC
    MOVW AX,!GASADD
    CALL !SSUB16
    MOVW !GASDT,AX
    CALC_OX_1:
    MOVW AX,!GASDT
    MOVW !RREG1,AX
    MOVW AX,#128
    MOVW !RREG2,AX
    MOVW BC,AX
    MOVW AX,!RREG1
    MULHU
    MOVW !RREG0,AX
    MOVW AX,BC
    MOVW !RREG0+2,AX
    RET
    ;
    ;********************************************
    ; Data Clear
    ;********************************************
    ;
    AVZCTCL:
    MOVW HL,!AVCTZ
    MOVW BC,#1
    CALL !CLRMEM
    RET
    ;
    AVCTCLZ:
    MOVW HL,!AVCNTZ
    MOVW BC,#1
    CALL !CLRMEM
    RET
    ;
    AVGCTCL:
    MOVW HL,!AVCTG
    MOVW BC,#1
    CALL !CLRMEM
    RET
    ;
    AVCTCLG:
    MOVW HL,!AVCNTG
    MOVW BC,#1
    CALL !CLRMEM
    RET
    ;
    CLRMEM:
    NOP
    NOP
    CLRM:
    MOV A,#0
    MOV [HL],A
    INCW HL
    DECW BC
    MOV A,B
    OR A,C
    BNZ $CLRM
    RET
    ;
    ;********************************************
    ;* GAS DISPLAY
    ;********************************************
    ;
    GASDSP:
    NOP
    MOV A,!DPF
    BT A.0,$DPDP
    BR $GASDP0
    DPDP: SET1 P1.4
    BR $GASDP1
    GASDP0: CLR1 P1.4
    ;
    GASDP1: MOV A,!MNF
    BT A.1,$MNDP
    BR $NMDP
    MNDP: SET1 P1.5
    BR $NMDP0
    ;
    NMDP: CLR1 P1.5
    NMDP0:
    MOVW AX,!GDDSP
    CMPW AX,#999
    BH $THDDP_0
    MOVW AX,!GDDSP
    CMPW AX,#99
    BH $HRDDP_0
    MOVW AX,!GDDSP
    CMPW AX,#9
    BH $TENDP_0
    BR $SGLDP_0
    THDDP_0:
    MOVW AX,!GDDSP
    MOVW !REGA,AX
    CALL !B_DCONV
    MOV A,!REGB+0
    MOV !DG4D,A
    MOV A,!REGB+1
    MOV !DG3D,A
    MOV A,!REGB+2
    MOV !DG2D,A
    MOV A,!REGB+3
    MOV !DG1D,A
    BR $LCDDRV_1
    HRDDP_0:
    MOVW AX,!GDDSP
    MOVW !REGA,AX
    CALL !B_DCONV
    MOV A,!REGB
    MOV !DG4D,A
    MOV A,!REGB+1
    MOV !DG3D,A
    MOV A,!REGB+2
    MOV !DG2D,A
    MOV !DG1D,#0x0F
    BR $LCDDRV_1
    TENDP_0:
    MOVW AX,!GDDSP
    MOVW !REGA,AX
    CALL !B_DCONV
    MOV A,!REGB
    MOV !DG4D,A
    MOV A,!REGB+1
    MOV !DG3D,A
    MOV !DG2D,#0x0F
    MOV !DG1D,#0x0F
    BR $LCDDRV_1
    SGLDP_0:
    MOV A,!DPF
    BT A.0,$MODZZ
    BR $MODZ
    LCDDRV_1:
    BR $LCDDRV
    MODZ:
    CLR1 P1.4
    MOVW AX,!GDDSP
    MOVW !REGA,AX
    CALL !B_DCONV
    MOV A,!REGB
    MOV !DG4D,A
    MOV !DG3D,#0x0F
    MOV !DG2D,#0x0F
    MOV !DG1D,#0x0F
    BR $LCDDRV
    MODZZ:
    SET1 P1.4
    MOVW AX,!GDDSP
    MOVW !REGA,AX
    CALL !B_DCONV
    MOV A,!REGB
    MOV !DG4D,A
    MOV !DG3D,#0x00
    MOV !DG2D,#0x0F
    MOV !DG1D,#0x0F
    BR $LCDDRV
    ;
    LCDDRV:
    MOV A,!DG1D
    MOV P7,A
    SET1 P5.1
    SET1 P5.0
    CLR1 P1.6
    SET1 P1.7
    NOP
    CLR1 P1.7
    MOV A,!DG2D
    MOV P7,A
    CLR1 P5.1
    SET1 P5.0
    CLR1 P1.6
    SET1 P1.7
    NOP
    CLR1 P1.7
    MOV A,!DG3D
    MOV P7,A
    SET1 P5.1
    CLR1 P5.0
    CLR1 P1.6
    SET1 P1.7
    NOP
    CLR1 P1.7
    MOV A,!DG4D
    MOV P7,A
    CLR1 P5.1
    CLR1 P5.0
    CLR1 P1.6
    SET1 P1.7
    NOP
    CLR1 P1.7
    RET
    ;
    SADD16:
    XCH A,X
    ADD A,C
    XCH A,X
    ADDC A,B
    RET
    ;
    SSUB16:
    XCH A,X
    SUB A,C
    XCH A,X
    SUBC A,B
    RET
    ;
    ZCP2B:
    PUSH DE
    CALL !ZSB2B_1
    BC $ZCP2B1
    MOV A,D
    OR A,E
    BZ $ZCP2B1
    MOV B,A
    XOR A,B
    INC A
    ZCP2B1: POP DE
    RET
    ;
    ZSB2B_1:
    MOV A,E
    SUB A,[HL]
    MOV E,A
    INCW HL
    MOV A,D
    SUBC A,[HL]
    MOV D,A
    DECW HL
    RET
    ;
    SMULT16:
    MOV A,#0
    MOV !RREG0,A
    MOV !(RREG0+1),A
    MOV B,#16
    JMLT120:
    CLR1 CY
    MOV A,!RREG0
    ROLC A,1
    MOV !RREG0,A
    MOV A,!(RREG0+1)
    ROLC A,1
    MOV !(RREG0+1),A
    MOV A,!RREG1
    ROLC A,1
    MOV !RREG1,A
    MOV A,!(RREG1+1)
    ROLC A,1
    MOV !(RREG1+1),A
    BNC $JMLT220
    MOV A,!RREG2
    ADD A,!RREG0
    MOV !RREG0,A
    MOV A,!(RREG2+1)
    ADDC A,!(RREG0+1)
    MOV !(RREG0+1),A
    MOV A,#0
    ADDC A,!RREG1
    MOV !RREG1,A
    JMLT220:
    DEC B
    BNZ $JMLT120
    RET
    ;
    SDIV16:
    MOVW DE,AX
    MOV X,#0
    MOV B,#16
    JDIV160:
    MOV A,X
    ADD X,A
    MOV A,E
    ADDC E,A
    MOV A,D
    ADDC D,A
    MOV A,#0
    ADDC A,X
    SUB A,C
    MOV X,A
    MOV A,E
    BT A.0,$JDIV180
    BC $JDIV170
    OR A,#0x01
    MOV E,A
    BR $JDIV180
    JDIV170:
    MOV A,C
    ADD X,A
    JDIV180:
    DEC B
    BNZ $JDIV160
    MOV A,X
    MOV C,A
    MOVW AX,DE
    RET
    ;
    B_DCONV:
    MOVW AX,!REGA
    MOV B,#4
    MOV C,#0
    MOVW HL,!REGB
    NOP
    B_D1:
    MOVW DE,#10
    DIVHU
    NOP
    XCHW AX,DE
    MOV [HL+C],A
    INC C
    XCHW AX,DE
    DEC B
    BNZ $B_D1
    MOV A,X
    MOV [HL+C],A
    RET
    ;

  • チョコです。

    貼り付けられたプログラムは、そのままではビルドでエラーが出るので、そこは修正してビルドしてみました。

    ADZERO:とADZ1:にブレークポイントを設定して実行したところ、ADZEROでブレークして、実行させると、きちんとADZ1でブレークしました。

    その間の実行時間は73.5μ秒でした。

    つまり、ADIFはきちんとセットはされていることになります。

    どのように、確認したのでしょうか。もしかしたら、ADIFビットの値を目視で確認しているのではないでしょうか。

    このプログラムでは、"BTCLR ADIF,$ADZ1”でADIFをチェックしているので、次の”BR $ADZ0”のところでADIFがセットされてないなら、ADIFがセットされていてもBTCLR ADIF,でクリアされてしまいます。

    BTCLR ADIF,の動作をよく考えてください。

    できれば、この命令ではなく、普通の条件付き分岐命令を使った方がデバッグはやり易いですよ。

    以上

  • チョコさん、BTCLR命令の件、BT命令に変更してみました。

    まだ上手くbreakしません。INTADを.VECTORで定義したのが原因でしょうか?

    ご指導ください。

    ;
    ;***************************************
    ;* RAM MEMORY MAP 0FBF00H-0FFEDFH
    ;***************************************
    ;
    .data .DSEG DATA
    ; stack area
    STACK: .DS 48
    STACKEND:
    ;
    RREG0: .DS 4
    RREG1: .DS 2
    RREG2: .DS 2
    ZAD1: .DS 2
    ZADM1: .DS 2
    ZAD2: .DS 2
    ZADM2: .DS 2
    ZADD: .DS 2
    GAD1: .DS 2
    GADM1: .DS 2
    GAD2: .DS 2
    GADM2: .DS 2
    GASADD: .DS 2
    GASDT: .DS 2
    GDDSP: .DS 2
    BBCNVD: .DS 2
    REGA: .DS 2
    REGB: .DS 6
    AVCTZ: .DS 2
    AVCNTZ: .DS 2
    AVCTG: .DS 2
    AVCNTG: .DS 2
    ;
    MNF: .DS 1
    DPF: .DS 1
    DG4D: .DS 1
    DG3D: .DS 1
    DG2D: .DS 1
    DG1D: .DS 1
    DATP6: .DS 1
    ;
    ;
    ;**************************************
    ;* INITIAL SET
    ;**************************************
    ;
    .SECTION .sdata, SDATA
    .L_section_sdata:
    ;
    .SECTION .text, TEXT
    ;
    START .VECTOR 0x00000 ;start
    ;
    INTTM00 .VECTOR 0x00020 ;タイマ割り込み
    ;
    INTAD .VECTOR 0x00034 ;AD割込み
    ;
    OPT .CSEG OPT_BYTE
    .DB 0x00
    .DB 0xFC ;LVD0 2.67V
    .DB 0xEC ;高速メインモード2MHz
    .DB 0x85 ;オンチップデバッグ許可
    ;
    .CSEG
    ;
    START:
    MOVW SP, #LOWW STACKEND
    ;
    DI
    SEL RB0
    MOV CMC,#0x00 ;低消費発振
    ;
    MOV OSTS,#0x04 ;発振安定時間1.6~3.2ms
    MOV CSC,#0xC0 ;高速オンチップオシレータ動作
    MOV CKC,#0x00 ;高速オンチップオシレータ選択
    MOV !HOCODIV,#0x04 ;オンチップオシレータ周波数2MHz
    MOV !PER0,#0x21 ;PER0(F00F0H)ADCEN,TAU0EN"1"
    MOVW AX,#0x0009
    MOVW !TPS0,AX ;TPS0(F01B6H,F01B7H)
    MOVW AX,#0x0A0F
    MOVW !TT0,AX ;カウント動作停止
    SET1 TMMK00 ;TAU0割込み禁止
    CLR1 TMIF00 ;割込み要求フラグクリア
    SET1 TMPR100 ;INTTM00の割込み優先順位レベル3
    SET1 TMPR000
    MOVW AX,#0x0000
    MOVW !TMR00,AX ;TMR00(F0190H,F0191H)
    MOVW AX,#0x0005
    MOVW !TMR01,AX ;TMR01
    MOVW AX,#0x0001 ;タイマカウント開始
    MOVW !TS0,AX ;TS0(F01B2H,F01B3H)
    MOV !TIS1,#0x03
    MOV !TOE0,#0x03 ;ch.01出力許可
    OST_CK:
    NOP
    START0:
    NOP
    START1:
    CLR1 SELLOSC
    MOVW TDR00,#1000 ;周期(0.25秒)
    CLR1 TMIF00
    CLR1 TMMK00
    MOV !PMCA2,#0xC0 ;P26,P27アナログ入力設定
    ;
    ;**********************************************
    ;* PORT SET
    ;**********************************************
    ;
    MOV PM0,#0xFF ;P0.0-7 入力
    MOV !PU0,#0x0F ;PU0(F0030H) P0.0-3 PU抵抗付加
    MOV PM1,#0x0F ;P1.0-3 入力
    ;P1.4-7 出力
    MOV !PU1,#0x0F ;PU1(F0031H) P1.0-3 PU抵抗付加
    MOV PM2,#0xC0 ;P2.6-7 入力
    ;P2.0-5 出力
    MOV PM3,#0xFF ;P3.0入力
    MOV !PU3,#0x01 ;PU3(F0033H) P3.0 PU抵抗付加
    MOV PM4,#0xFF ;P4.0-1 入力
    MOV !PU4,#0x03 ;PU4(F0034H) P4.0-1 PU抵抗付加
    MOV PM5,#0xFC ;P5.0-1 出力
    MOV PM6,#0xFF ;P6.0-3 入力
    MOV PM7,#0xF0 ;P7.0-3 出力
    ;P7.4-7 入力
    MOV !PU7,#0xF0 ;PU7(F0037H) P7.4-7 PU抵抗付加
    MOV PM12,#0xFF
    MOV !PU12,#0x01 ;PU12(F003CH)
    MOV PM14,#0xFF
    MOV !PU14,#0x01 ;PU14(F003EH)
    ;
    MOV ADM0,#0x28 ;AD変換時間fclk
    MOV ADM1,#0x08 ;fclk (2MHz)
    MOV !ADM2,#0x00
    ;
    CLR1 PIF4
    CLR1 PMK4
    CLR1 EGP0.4
    SET1 EGN0.4
    ;
    ;*********************************************
    ;* MAIN PROGRAM
    ;*********************************************
    ;
    EI
    MAIN1:
    NOP
    NOP
    NOP
    NOP
    NOP
    BR $MAIN1
    ;
    ;*********************************************
    ;* タイマ割込
    ;*********************************************
    ;
    INTTM00:
    SEL RB1
    CALL !ZDTI
    CALL !GDTI
    CALL !CALGAS
    CALL !GASDSP
    NOP
    RETI
    ;
    INTAD:
    MOVW AX,ADCR
    RETI
    ;
    ;*********************************************
    ; Zero Data Average
    ;*********************************************
    ;
    ZDTI:
    CALL !AVZCTCL
    MOVW HL,!ZAD1
    MOVW BC,#8
    CALL !CLRMEM
    MOV A,#30
    ZDTS:
    SUB A,#1
    MOV !AVCTZ,A
    CALL !ZDTI0
    MOVW AX,!ZAD2
    XCHW AX,BC
    MOVW AX,!ZADM2
    CALL !SADD16
    MOVW !ZADM2,AX
    MOVW HL,!AVCTZ
    MOV A,[HL]
    CMP A,#0
    BNZ $ZDTS
    MOVW AX,!ZADM2
    MOV C,#30
    CALL !SDIV16
    MOVW !ZADD,AX
    RET
    ;
    ZDTI0:
    CALL !AVCTCLZ
    MOVW HL,!ZAD1
    MOVW BC,#6
    CALL !CLRMEM
    MOV A,#30
    ZDTS0:
    SUB A,#1
    MOV !AVCNTZ,A
    CALL !ADZERO
    MOVW AX,!ZAD1
    XCHW AX,BC
    MOVW AX,!ZADM1
    CALL !SADD16
    MOVW !ZADM1,AX
    MOVW HL,!AVCNTZ
    MOV A,[HL]
    CMP A,#0
    BNZ $ZDTS0
    MOVW AX,!ZADM1
    MOV C,#30
    CALL !SDIV16
    MOVW !ZAD2,AX
    RET
    ;
    GDTI:
    CALL !AVGCTCL
    MOVW HL,!GAD1
    MOVW BC,#16
    CALL !CLRMEM
    MOV A,#30
    GDTS:
    SUB A,#1
    MOV !AVCTG,A
    CALL !GDTI0
    MOVW AX,!GAD2
    XCHW AX,BC
    MOVW AX,!GADM2
    CALL !SADD16
    MOVW !GADM2,AX
    MOVW HL,!AVCTG
    MOV A,[HL]
    CMP A,#0
    BNZ $GDTS
    MOVW AX,!GADM2
    MOV C,#30
    CALL !SDIV16
    MOVW !GASADD,AX
    RET
    ;
    GDTI0:
    CALL !AVCTCLG
    MOVW HL,!GAD1
    MOVW BC,#16
    CALL !CLRMEM
    MOV A,#30
    GDTS0:
    SUB A,#1
    MOV !AVCNTG,A
    CALL !ADGAS
    MOVW AX,!GAD1
    XCHW AX,BC
    MOVW AX,!GADM1
    CALL !SADD16
    MOVW !GADM1,AX
    MOVW HL,!AVCNTG
    MOV A,[HL]
    CMP A,#0
    BNZ $GDTS0
    MOVW AX,!GADM1
    MOV C,#30
    CALL !SDIV16
    MOVW !GAD2,AX
    RET
    ;
    ;*********************************************
    ;* A/D
    ;*********************************************
    ;
    ADZERO:
    MOV ADS,#7
    SET1 ADCE
    CALL TIMER
    CLR1 ADIF
    SET1 ADCS
    ADZ0:
    BT ADIF,$ADZ1
    BR $ADZ0
    ADZ1:
    MOVW AX,ADCR
    CLR1 ADCS
    CLR1 ADCE
    MOV C,#***
    CALL !SDIV16
    MOVW !RREG1,AX
    MOVW BC,AX
    MOVW AX,#234
    MOVW !RREG2,AX
    MULHU
    MOVW !RREG0,AX
    MOVW AX,BC
    MOVW !RREG0+2,AX
    MOVW AX,!RREG0
    MOV C,#100
    CALL !SDIV16
    MOVW !ZAD1,AX
    RET
    ;
    ADGAS:
    MOV ADS,#6
    SET1 ADCE
    CALL TIMER
    CLR1 ADIF
    SET1 ADCS
    ADG0:
    BTCLR ADIF,$ADG1
    BR $ADG0
    ADG1:
    MOVW AX,ADCR
    CLR1 ADCS
    CLR1 ADCE
    MOV C,#***
    CALL !SDIV16
    MOVW !GAD1,AX
    RET
    ;
    TIMER:
    MOV D,#0x03
    J40: MOV E,#0x03
    J41: DEC E
    BNZ $J41
    DEC D
    BNZ $J40
    RET
    ;
    ;********************************************

  • チョコです。

    今回は一部分だけなので、ビルドが通りません。

    そのため、プログラムだけを眺めて判断するしかありません。

    少なくとも、今回提示された範囲では、ADMKは操作されてないので、初期状態(ADMKは1)だとすると、INTADの割り込みベクトルを設定していても影響しません。

    ADZEROでは、BT命令に変更されており、ADIFはセットされたままになりますが、ADGASではまだBTCLR命令が使われています。ここらの影響がどうなっているかは分かりません。

    まだ上手くbreakしません。」が何をもってそう判断しているのかが分からないと、コメントしようがありません。どこにブレークポイントを設定しているかを明確にしてください。

    情報がすくな過ぎます。

    以上

  • チョコさん、お忙しいところ申し訳ありません。

    当方で確認したのは、ADZ0でbreakして、ADZ1にbreak設定してADZ0から実行してADZ1まで走らない状態で強制停止するとBT ADIF,$ADZ1のところでループしている状態でした。説明不足で申し訳ありません。宜しくお願い致します。

    ;
    ;***************************************
    ;* RAM MEMORY MAP 0FBF00H-0FFEDFH
    ;***************************************
    ;
    .data .DSEG DATA
    ; stack area
    STACK: .DS 48
    STACKEND:
    ;
    RREG0: .DS 4
    RREG1: .DS 2
    RREG2: .DS 2
    ZAD1: .DS 2
    ZADM1: .DS 2
    ZAD2: .DS 2
    ZADM2: .DS 2
    ZADD: .DS 2
    GAD1: .DS 2
    GADM1: .DS 2
    GAD2: .DS 2
    GADM2: .DS 2
    GASADD: .DS 2
    GASDT: .DS 2
    GDDSP: .DS 2
    BBCNVD: .DS 2
    REGA: .DS 2
    REGB: .DS 6
    AVCTZ: .DS 2
    AVCNTZ: .DS 2
    AVCTG: .DS 2
    AVCNTG: .DS 2
    ;
    MNF: .DS 1
    DPF: .DS 1
    DG4D: .DS 1
    DG3D: .DS 1
    DG2D: .DS 1
    DG1D: .DS 1
    DATP6: .DS 1
    ;
    ;
    ;**************************************
    ;* INITIAL SET
    ;**************************************
    ;
    .SECTION .sdata, SDATA
    .L_section_sdata:
    ;
    .SECTION .text, TEXT
    ;
    START .VECTOR 0x00000 ;start
    ;
    INTTM00 .VECTOR 0x00020 ;タイマ割り込み
    ;
    INTAD .VECTOR 0x00034 ;AD割込み
    ;
    OPT .CSEG OPT_BYTE
    .DB 0x00
    .DB 0xFC ;LVD0 2.67V
    .DB 0xEC ;高速メインモード2MHz
    .DB 0x85 ;オンチップデバッグ許可
    ;
    .CSEG
    ;
    START:
    MOVW SP, #LOWW STACKEND
    ;
    DI
    SEL RB0
    MOV CMC,#0x00 ;低消費発振
    ;
    MOV OSTS,#0x04 ;発振安定時間1.6~3.2ms
    MOV CSC,#0xC0 ;高速オンチップオシレータ動作
    MOV CKC,#0x00 ;高速オンチップオシレータ選択
    MOV !HOCODIV,#0x04 ;オンチップオシレータ周波数2MHz
    MOV !PER0,#0x21 ;PER0(F00F0H)ADCEN,TAU0EN"1"
    MOVW AX,#0x0009
    MOVW !TPS0,AX ;TPS0(F01B6H,F01B7H)
    MOVW AX,#0x0A0F
    MOVW !TT0,AX ;カウント動作停止
    SET1 TMMK00 ;TAU0割込み禁止
    CLR1 TMIF00 ;割込み要求フラグクリア
    SET1 TMPR100 ;INTTM00の割込み優先順位レベル3
    SET1 TMPR000
    MOVW AX,#0x0000
    MOVW !TMR00,AX ;TMR00(F0190H,F0191H)
    MOVW AX,#0x0005
    MOVW !TMR01,AX ;TMR01
    MOVW AX,#0x0001 ;タイマカウント開始
    MOVW !TS0,AX ;TS0(F01B2H,F01B3H)
    MOV !TIS1,#0x03
    MOV !TOE0,#0x03 ;ch.01出力許可
    OST_CK:
    NOP
    START0:
    NOP
    START1:
    CLR1 SELLOSC
    MOVW TDR00,#1000 ;周期(0.25秒)
    CLR1 TMIF00
    CLR1 TMMK00
    MOV !PMCA2,#0xC0 ;P26,P27アナログ入力設定
    ;
    ;**********************************************
    ;* PORT SET
    ;**********************************************
    ;
    MOV PM0,#0xFF ;P0.0-7 入力
    MOV !PU0,#0x0F ;PU0(F0030H) P0.0-3 PU抵抗付加
    MOV PM1,#0x0F ;P1.0-3 入力
    ;P1.4-7 出力
    MOV !PU1,#0x0F ;PU1(F0031H) P1.0-3 PU抵抗付加
    MOV PM2,#0xC0 ;P2.6-7 入力
    ;P2.0-5 出力
    MOV PM3,#0xFF ;P3.0入力
    MOV !PU3,#0x01 ;PU3(F0033H) P3.0 PU抵抗付加
    MOV PM4,#0xFF ;P4.0-1 入力
    MOV !PU4,#0x03 ;PU4(F0034H) P4.0-1 PU抵抗付加
    MOV PM5,#0xFC ;P5.0-1 出力
    MOV PM6,#0xFF ;P6.0-3 入力
    MOV PM7,#0xF0 ;P7.0-3 出力
    ;P7.4-7 入力
    MOV !PU7,#0xF0 ;PU7(F0037H) P7.4-7 PU抵抗付加
    MOV PM12,#0xFF
    MOV !PU12,#0x01 ;PU12(F003CH)
    MOV PM14,#0xFF
    MOV !PU14,#0x01 ;PU14(F003EH)
    ;
    MOV ADM0,#0x28 ;AD変換時間fclk
    MOV ADM1,#0x08 ;fclk (2MHz)
    MOV !ADM2,#0x00
    ;
    CLR1 PIF4
    CLR1 PMK4
    CLR1 EGP0.4
    SET1 EGN0.4
    ;
    ;*********************************************
    ;* MAIN PROGRAM
    ;*********************************************
    ;
    EI
    MAIN1:
    NOP
    NOP
    NOP
    NOP
    NOP
    BR $MAIN1
    ;
    ;*********************************************
    ;* タイマ割込
    ;*********************************************
    ;
    INTTM00:
    SEL RB1
    CALL !ZDTI
    CALL !GDTI
    CALL !CALGAS
    CALL !GASDSP
    NOP
    RETI
    ;
    INTAD:
    MOVW AX,ADCR
    RETI
    ;
    ;*********************************************
    ; Zero Data Average
    ;*********************************************
    ;
    ZDTI:
    CALL !AVZCTCL
    MOVW HL,!ZAD1
    MOVW BC,#8
    CALL !CLRMEM
    MOV A,#30
    ZDTS:
    SUB A,#1
    MOV !AVCTZ,A
    CALL !ZDTI0
    MOVW AX,!ZAD2
    XCHW AX,BC
    MOVW AX,!ZADM2
    CALL !SADD16
    MOVW !ZADM2,AX
    MOVW HL,!AVCTZ
    MOV A,[HL]
    CMP A,#0
    BNZ $ZDTS
    MOVW AX,!ZADM2
    MOV C,#30
    CALL !SDIV16
    MOVW !ZADD,AX
    RET
    ;
    ZDTI0:
    CALL !AVCTCLZ
    MOVW HL,!ZAD1
    MOVW BC,#6
    CALL !CLRMEM
    MOV A,#30
    ZDTS0:
    SUB A,#1
    MOV !AVCNTZ,A
    CALL !ADZERO
    MOVW AX,!ZAD1
    XCHW AX,BC
    MOVW AX,!ZADM1
    CALL !SADD16
    MOVW !ZADM1,AX
    MOVW HL,!AVCNTZ
    MOV A,[HL]
    CMP A,#0
    BNZ $ZDTS0
    MOVW AX,!ZADM1
    MOV C,#30
    CALL !SDIV16
    MOVW !ZAD2,AX
    RET
    ;
    GDTI:
    CALL !AVGCTCL
    MOVW HL,!GAD1
    MOVW BC,#16
    CALL !CLRMEM
    MOV A,#30
    GDTS:
    SUB A,#1
    MOV !AVCTG,A
    CALL !GDTI0
    MOVW AX,!GAD2
    XCHW AX,BC
    MOVW AX,!GADM2
    CALL !SADD16
    MOVW !GADM2,AX
    MOVW HL,!AVCTG
    MOV A,[HL]
    CMP A,#0
    BNZ $GDTS
    MOVW AX,!GADM2
    MOV C,#30
    CALL !SDIV16
    MOVW !GASADD,AX
    RET
    ;
    GDTI0:
    CALL !AVCTCLG
    MOVW HL,!GAD1
    MOVW BC,#16
    CALL !CLRMEM
    MOV A,#30
    GDTS0:
    SUB A,#1
    MOV !AVCNTG,A
    CALL !ADGAS
    MOVW AX,!GAD1
    XCHW AX,BC
    MOVW AX,!GADM1
    CALL !SADD16
    MOVW !GADM1,AX
    MOVW HL,!AVCNTG
    MOV A,[HL]
    CMP A,#0
    BNZ $GDTS0
    MOVW AX,!GADM1
    MOV C,#30
    CALL !SDIV16
    MOVW !GAD2,AX
    RET
    ;
    ;*********************************************
    ;* A/D
    ;*********************************************
    ;
    ADZERO:
    MOV ADS,#7
    SET1 ADCE
    CALL TIMER
    CLR1 ADIF
    SET1 ADCS
    ADZ0:
    BT ADIF,$ADZ1
    BR $ADZ0
    ADZ1:
    MOVW AX,ADCR
    CLR1 ADCS
    CLR1 ADCE
    MOV C,#***
    CALL !SDIV16
    MOVW !RREG1,AX
    MOVW BC,AX
    MOVW AX,#234
    MOVW !RREG2,AX
    MULHU
    MOVW !RREG0,AX
    MOVW AX,BC
    MOVW !RREG0+2,AX
    MOVW AX,!RREG0
    MOV C,#100
    CALL !SDIV16
    MOVW !ZAD1,AX
    RET
    ;
    ADGAS:
    MOV ADS,#6
    SET1 ADCE
    CALL TIMER
    CLR1 ADIF
    SET1 ADCS
    ADG0:
    BT ADIF,$ADG1
    BR $ADG0
    ADG1:
    MOVW AX,ADCR
    CLR1 ADCS
    CLR1 ADCE
    MOV C,#***
    CALL !SDIV16
    MOVW !GAD1,AX
    RET
    ;
    TIMER:
    MOV D,#0x03
    J40: MOV E,#0x03
    J41: DEC E
    BNZ $J41
    DEC D
    BNZ $J40
    RET
    ;
    ;********************************************
    ;* CALC GAS
    ;********************************************
    ;
    CALGAS:
    MOV A,P6
    AND A,#0x0F
    MOV !DATP6,A
    CP15: CMP !DATP6,#15 ;1111 FS=1000
    BNZ $CP14
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#60
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP14: CMP !DATP6,#14 ;1110 FS=300
    BNZ $CP13
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#200
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;

    CP13: CMP !DATP6,#13 ;1101 FS=200
    BNZ $CP12
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#30
    CALL !SDIV16
    MOV C,#10
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP12: CMP !DATP6,#12 ;1100 FS=150
    BNZ $CP11
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#40
    CALL !SDIV16
    MOV C,#10
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP11: CMP !DATP6,#11 ;1011 FS=100
    BNZ $CP10
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#60
    CALL !SDIV16
    MOV C,#10
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP10: CMP !DATP6,#10 ;1010 FS=50
    BNZ $CP9
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#12
    CALL !SDIV16
    MOV C,#100
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP9: CMP !DATP6,#9 ;1001 FS=30
    BNZ $CP8
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#20
    CALL !SDIV16
    MOV C,#100
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP8: CMP !DATP6,#8 ;1000 FS=20
    BNZ $CP7
    CLR1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#30
    CALL !SDIV16
    MOV C,#100
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP7: CMP !DATP6,#7 ;0111 FS=30.0
    BNZ $CP6
    SET1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#20
    CALL !SDIV16
    MOV C,#10
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP6: CMP !DATP6,#6 ;0110 FS=25.0
    BNZ $CP5
    SET1 !DPF.0
    CALL !CALC_OX
    MOVW AX,!RREG0
    MOV C,#241
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP5: CMP !DATP6,#5 ;0101 FS=20.0
    BNZ $CP4
    SET1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#30
    CALL !SDIV16
    MOV C,#10
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP4: CMP !DATP6,#4 ;0100 FS=10.0
    BNZ $CP3
    SET1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#30
    CALL !SDIV16
    MOV C,#20
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP3: CMP !DATP6,#3 ;0011 FS=5.0
    BNZ $CP2
    SET1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#12
    CALL !SDIV16
    MOV C,#100
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP2: CMP !DATP6,#2 ;0010 FS=2.0
    BNZ $CP1
    SET1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#30
    CALL !SDIV16
    MOV C,#100
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP1: CMP !DATP6,#1 ;0001 FS=1.0
    BNZ $CP0
    SET1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#60
    CALL !SDIV16
    MOV C,#100
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CP0: SET1 !DPF.0
    CALL !CALC
    MOVW AX,!RREG0
    MOV C,#60
    CALL !SDIV16
    MOV C,#100
    CALL !SDIV16
    MOVW !GDDSP,AX
    RET
    ;
    CALC:
    MOVW AX,!GASADD
    MOVW DE,AX
    MOVW HL,!ZADD
    CALL !ZCP2B
    BC $MNDP_S
    CLR1 !MNF.1
    BR $CALC_0
    MNDP_S:
    SET1 !MNF.1
    MOVW AX,!GASADD
    XCHW AX,BC
    MOVW AX,!ZADD
    CALL !SSUB16
    MOVW !GASDT,AX
    BR $CALC_1
    CALC_0:
    MOVW AX,!ZADD
    XCHW AX,BC
    MOVW AX,!GASADD
    CALL !SSUB16
    MOVW !GASDT,AX
    CALC_1:
    MOVW AX,#5
    MOVW DE,AX
    MOVW HL,!GASDT
    CALL !ZCP2B
    BC $NORM_DP
    MOVW AX,#0
    MOVW !GASDT,AX
    NORM_DP:
    MOVW AX,!GASDT
    MOVW !RREG1,AX
    MOVW AX,#128
    MOVW !RREG2,AX
    MOVW BC,AX
    MOVW AX,!RREG1
    MULHU
    MOVW !RREG0+2,AX
    MOVW AX,BC
    MOVW !RREG0,AX
    RET
    ;
    CALC_OX:
    MOVW AX,!GASADD
    MOVW DE,AX
    MOVW HL,!ZADD
    CALL !ZCP2B
    BC $MNDP_OX_S
    CLR1 !MNF.1
    BR $CALC_OX_0
    MNDP_OX_S:
    SET1 !MNF.1
    MOVW AX,!GASADD
    XCHW AX,BC
    MOVW AX,!ZADD
    CALL !SSUB16
    MOVW !GASDT,AX
    BR $CALC_OX_1
    CALC_OX_0:
    MOVW AX,!ZADD
    XCHW AX,BC
    MOVW AX,!GASADD
    CALL !SSUB16
    MOVW !GASDT,AX
    CALC_OX_1:
    MOVW AX,!GASDT
    MOVW !RREG1,AX
    MOVW AX,#128
    MOVW !RREG2,AX
    MOVW BC,AX
    MOVW AX,!RREG1
    MULHU
    MOVW !RREG0,AX
    MOVW AX,BC
    MOVW !RREG0+2,AX
    RET
    ;
    ;********************************************
    ; Data Clear
    ;********************************************
    ;
    AVZCTCL:
    MOVW HL,!AVCTZ
    MOVW BC,#1
    CALL !CLRMEM
    RET
    ;
    AVCTCLZ:
    MOVW HL,!AVCNTZ
    MOVW BC,#1
    CALL !CLRMEM
    RET
    ;
    AVGCTCL:
    MOVW HL,!AVCTG
    MOVW BC,#1
    CALL !CLRMEM
    RET
    ;
    AVCTCLG:
    MOVW HL,!AVCNTG
    MOVW BC,#1
    CALL !CLRMEM
    RET
    ;
    CLRMEM:
    NOP
    NOP
    CLRM:
    MOV A,#0
    MOV [HL],A
    INCW HL
    DECW BC
    MOV A,B
    OR A,C
    BNZ $CLRM
    RET
    ;
    ;********************************************
    ;* GAS DISPLAY
    ;********************************************
    ;
    GASDSP:
    NOP
    MOV A,!DPF
    BT A.0,$DPDP
    BR $GASDP0
    DPDP: SET1 P1.4
    BR $GASDP1
    GASDP0: CLR1 P1.4
    ;
    GASDP1: MOV A,!MNF
    BT A.1,$MNDP
    BR $NMDP
    MNDP: SET1 P1.5
    BR $NMDP0
    ;
    NMDP: CLR1 P1.5
    NMDP0:
    MOVW AX,!GDDSP
    CMPW AX,#999
    BH $THDDP_0
    MOVW AX,!GDDSP
    CMPW AX,#99
    BH $HRDDP_0
    MOVW AX,!GDDSP
    CMPW AX,#9
    BH $TENDP_0
    BR $SGLDP_0
    THDDP_0:
    MOVW AX,!GDDSP
    MOVW !REGA,AX
    CALL !B_DCONV
    MOV A,!REGB+0
    MOV !DG4D,A
    MOV A,!REGB+1
    MOV !DG3D,A
    MOV A,!REGB+2
    MOV !DG2D,A
    MOV A,!REGB+3
    MOV !DG1D,A
    BR $LCDDRV_1
    HRDDP_0:
    MOVW AX,!GDDSP
    MOVW !REGA,AX
    CALL !B_DCONV
    MOV A,!REGB
    MOV !DG4D,A
    MOV A,!REGB+1
    MOV !DG3D,A
    MOV A,!REGB+2
    MOV !DG2D,A
    MOV !DG1D,#0x0F
    BR $LCDDRV_1
    TENDP_0:
    MOVW AX,!GDDSP
    MOVW !REGA,AX
    CALL !B_DCONV
    MOV A,!REGB
    MOV !DG4D,A
    MOV A,!REGB+1
    MOV !DG3D,A
    MOV !DG2D,#0x0F
    MOV !DG1D,#0x0F
    BR $LCDDRV_1
    SGLDP_0:
    MOV A,!DPF
    BT A.0,$MODZZ
    BR $MODZ
    LCDDRV_1:
    BR $LCDDRV
    MODZ:
    CLR1 P1.4
    MOVW AX,!GDDSP
    MOVW !REGA,AX
    CALL !B_DCONV
    MOV A,!REGB
    MOV !DG4D,A
    MOV !DG3D,#0x0F
    MOV !DG2D,#0x0F
    MOV !DG1D,#0x0F
    BR $LCDDRV
    MODZZ:
    SET1 P1.4
    MOVW AX,!GDDSP
    MOVW !REGA,AX
    CALL !B_DCONV
    MOV A,!REGB
    MOV !DG4D,A
    MOV !DG3D,#0x00
    MOV !DG2D,#0x0F
    MOV !DG1D,#0x0F
    BR $LCDDRV
    ;
    LCDDRV:
    MOV A,!DG1D
    MOV P7,A
    SET1 P5.1
    SET1 P5.0
    CLR1 P1.6
    SET1 P1.7
    NOP
    CLR1 P1.7
    MOV A,!DG2D
    MOV P7,A
    CLR1 P5.1
    SET1 P5.0
    CLR1 P1.6
    SET1 P1.7
    NOP
    CLR1 P1.7
    MOV A,!DG3D
    MOV P7,A
    SET1 P5.1
    CLR1 P5.0
    CLR1 P1.6
    SET1 P1.7
    NOP
    CLR1 P1.7
    MOV A,!DG4D
    MOV P7,A
    CLR1 P5.1
    CLR1 P5.0
    CLR1 P1.6
    SET1 P1.7
    NOP
    CLR1 P1.7
    RET
    ;
    SADD16:
    XCH A,X
    ADD A,C
    XCH A,X
    ADDC A,B
    RET
    ;
    SSUB16:
    XCH A,X
    SUB A,C
    XCH A,X
    SUBC A,B
    RET
    ;
    ZCP2B:
    PUSH DE
    CALL !ZSB2B_1
    BC $ZCP2B1
    MOV A,D
    OR A,E
    BZ $ZCP2B1
    MOV B,A
    XOR A,B
    INC A
    ZCP2B1: POP DE
    RET
    ;
    ZSB2B_1:
    MOV A,E
    SUB A,[HL]
    MOV E,A
    INCW HL
    MOV A,D
    SUBC A,[HL]
    MOV D,A
    DECW HL
    RET
    ;
    SMULT16:
    MOV A,#0
    MOV !RREG0,A
    MOV !(RREG0+1),A
    MOV B,#16
    JMLT120:
    CLR1 CY
    MOV A,!RREG0
    ROLC A,1
    MOV !RREG0,A
    MOV A,!(RREG0+1)
    ROLC A,1
    MOV !(RREG0+1),A
    MOV A,!RREG1
    ROLC A,1
    MOV !RREG1,A
    MOV A,!(RREG1+1)
    ROLC A,1
    MOV !(RREG1+1),A
    BNC $JMLT220
    MOV A,!RREG2
    ADD A,!RREG0
    MOV !RREG0,A
    MOV A,!(RREG2+1)
    ADDC A,!(RREG0+1)
    MOV !(RREG0+1),A
    MOV A,#0
    ADDC A,!RREG1
    MOV !RREG1,A
    JMLT220:
    DEC B
    BNZ $JMLT120
    RET
    ;
    SDIV16:
    MOVW DE,AX
    MOV X,#0
    MOV B,#16
    JDIV160:
    MOV A,X
    ADD X,A
    MOV A,E
    ADDC E,A
    MOV A,D
    ADDC D,A
    MOV A,#0
    ADDC A,X
    SUB A,C
    MOV X,A
    MOV A,E
    BT A.0,$JDIV180
    BC $JDIV170
    OR A,#0x01
    MOV E,A
    BR $JDIV180
    JDIV170:
    MOV A,C
    ADD X,A
    JDIV180:
    DEC B
    BNZ $JDIV160
    MOV A,X
    MOV C,A
    MOVW AX,DE
    RET
    ;
    B_DCONV:
    MOVW AX,!REGA
    MOV B,#4
    MOV C,#0
    MOVW HL,!REGB
    NOP
    B_D1:
    MOVW DE,#10
    DIVHU
    NOP
    XCHW AX,DE
    MOV [HL+C],A
    INC C
    XCHW AX,DE
    DEC B
    BNZ $B_D1
    MOV A,X
    MOV [HL+C],A
    RET
    ;