;*********************************************************************************
;	GMS81032 EXAMPLE PROGRAM WITH uPD6121G FORMAT
;	2002.6.19.	HeeJin Ryu	

;;;;;;;;;;;;;;;    REGISTER DEFINE ;;;;;;;;;;

R0	  EQU       0C0H		;PORT R0 REGISTER
R00       EQU       0,0C0H
R01       EQU       1,0C0H
R02       EQU       2,0C0H
R03       EQU       3,0C0H
R04       EQU       4,0C0H
R05       EQU       5,0C0H
R06       EQU       6,0C0H
R07       EQU       7,0C0H
R0DD      EQU       0C1H		;PORT R0 DATA I/O DIRECTION REGISTER
R1        EQU       0C2H		;PORT R1 REGISTER
R10       EQU       0,0C2H		
R11       EQU       1,0C2H
R12       EQU       2,0C2H
R13       EQU       3,0C2H
R14       EQU       4,0C2H
R15       EQU       5,0C2H
R16       EQU       6,0C2H
R17       EQU       7,0C2H
R1DD      EQU       0C3H		;PORT R1 DATA I/O DIRECTION REGISTER
R2        EQU       0C4H		;PORT R2 REGISTER
R20       EQU       0,0C4H
R21       EQU       1,0C4H
R22       EQU       2,0C4H
R23       EQU       3,0C4H
R24       EQU       4,0C4H
R2DD      EQU       0C5H		;PORT R2 DATA I/O DIRECTION REGISTER
CKCTLR    EQU       0C7H		;CLOCK CONTROL REGISTER
BITR      EQU       0C7H		;BASIC INTERVAL TIMER REGISTER
WDTR      EQU       0C8H		;WATCHDOG TIMER REGISTER
PMR1      EQU       0C9H      		;PORT R1 MODE REGISTER
IMOD      EQU       0CAH      		;INTERRUPT MODE REGISTER
IEDS      EQU       0CBH      		;EXTERNAL INTERRUPT EDGE SELECTION
WDTCL     EQU       6,0C8H

IENL      EQU       0CCH		;INTERRUPT ENABLE REGISTER LOW
IEWDT     EQU       6,0CCH    		;WATCHDOG TIMER INTERRUPT ENABLE FLAG
IEBIT     EQU       5,0CCH    		;BASIC INTERVAL TIMER INTERRUPT ENABLE FLAG

IRQL      EQU       0CDH      		;INTERRUPT REQUEST FLAG REGISTER LOW
IRQWDT    EQU       6,0CDH    		;WATCHDOG TIMER INTERRUPT REQUEST FLAG 
IRQBIT    EQU       5,0CDH    		;BASIC INTERVAL TIMER INTERRUPT REQUEST FLAG 

IENH      EQU       0CEH
IEKSCN    EQU       7,0CEH    		;EXTERNAL INT.0 ENABLE
IEE1      EQU       6,0CEH    		;EXTERNAL INT.1 ENABLE
IEE2      EQU       5,0CEH    		;EXTERNAL INT.2 ENABLE
IET0      EQU       3,0CEH    		;TIMER0 INT. ENABLE
IET1      EQU       2,0CEH    		;TIMER1 INT. ENABLE
IET2      EQU       1,0CEH    		;TIMER2 INT. ENABLE

IRQH      EQU       0CFH
IRQKSCN   EQU       7,0CFH    		;EXTERNAL INT.0 REQUST FLAG
IRQE1     EQU       6,0CFH    		;EXTERNAL INT.1 REQUST FLAG
IRQE2     EQU       5,0CFH    		;EXTERNAL INT.2 REQUST FLAG
IRQT0     EQU       3,0CFH    		;TIMER0 INT. REQUST FLAG
IRQT1     EQU       2,0CFH    		;TIMER1 INT. REQUST FLAG
IRQT2     EQU       1,0CFH    		;TIMER2 INT. REQUST FLAG

TM0       EQU       0D0H     		;TIMER0 MODE REGISTER
T0IFS     EQU       3,0D0H    		;TIMER0 INT EVE. 2ND SELECTION
T0MOD     EQU       4,0D0H    		;TIMER0 SING/MODULO-N
T0CN      EQU       5,0D0H    		;TIMER0 CONTINUOUS/PAUSE
T0ST      EQU       6,0D0H    		;TIMER0 START/STOP
CAP0      EQU       7,0D0H    		;TIMER0 TIMER.COUNTER/INPUT CAPTURE

TM1       EQU       0D1H
T1IFS     EQU       4,0D1H    		;TIMER1 INT EVE. 2ND SELECTION
T1MOD     EQU       5,0D1H    		;TIMER1 SING/MODULO-N
T1CN      EQU       6,0D1H    		;TIMER1 CONTINUOUS/PAUSE
T1ST      EQU       7,0D1H    		;TIMER1 START/STOP

TM2       EQU       0D2H
T2CN      EQU       3,0D2H    		;TIMER2 CONTINUOUS/PAUSE
T2ST      EQU       4,0D2H    		;TIMER2 SRATR/STOP

T0HMD     EQU       0D3H      		;TIMER0 HIGH-MSB DATA REGISTER
T0HLD     EQU       0D4H      		;TIMER0 HIGH-LSB DATA REGISTER
T0LMD     EQU       0D5H      		;TIMER0 LOW-MSB DATA REGISTER
T0LLD     EQU       0D6H      		;TIMER0 LOW-LSB DATA REGISTER

T1HD      EQU       0D7H      		;TIMER1 HIGH DATA REGISTER
T1LD      EQU       0D8H      		;TIMER1 LOW DATA REGISTER

T2DR      EQU       0D9H      		;TIMER2 DATA REGISTER
TM01      EQU       0DAH      		;TIMER0/TIMER1 MODE REGISTER
SMRR0     EQU       0DCH      		;STANDBY RELEASE REGISTER R0
SMRR1     EQU       0DDH      		;STANDBY RELEASE REGISEER R1
R1ODC     EQU       0DEH      		;PORT R1 OPEN DRAIN ASSIGN REGISTER


;;;;;;;;; VECTOR TABLE ;;;;;;;;;;;;;;;;;;;;;;;

          ORG       0FFE6H
          DW        UNUSE     		;B.I.T
          DW        UNUSE     		;W.D.T
          DW        UNUSE     		;A/D CON
          DW        UNUSE     		;TIMER3
          DW        UNUSE     		;TIMER2
          DW        UNUSE     		;TIMER1
          DW        UNUSE     		;TIMER0
          DW        UNUSE     		;EXTERNAL INT 3
          DW        UNUSE     		;EXTERNAL INT 2
          DW        UNUSE     		;EXTERNAL INT 1
          DW        UNUSE     		;EXTERNAL INT 0
          DW        UNUSE     		;KEY SCAN
          DW        RESET


;;;;;;;;;; MACRO DEFINE  ;;;;;;;;;;;;;;;;;;;;;;;;;;;

SAVE      MACRO
          PUSH      A
          PUSH      X
          PUSH      Y
          PUSH      PSW
          ENDM

RESRORE   MACRO
          POP       PSW
          POP       Y
          POP       X
          POP       A
          ENDM

;;;;;;;;;;;;;;RAM DEFINE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

STAT      DS        1			;STATUS RAM	
NOKYF     EQU       0,STAT		;NO KEY FLAG
SECONDF   EQU       1,STAT		;KEY SCAN TWO TIMES CHECK FLAG
REPEATF   EQU       2,STAT		;REPEAT CHECK FLAG

KEYNUM	  DS        1			;KEY NUMBER
NEWKEY    DS        1			;PRESSED KEY POSITION
BACKEY    DS        1			;BACK-UP KEY POSITION
OLDKEY    DS        1			;ANOTHER BACK-UP KEY POSITION FOR REPEAT

TOTLKY    DS        1			;NUMBER OF PRESSED KEY
PRTDAT    DS        1			;TEMPORARY DATA
STROBE    DS        1           	;KEYSCAN STROBE 
DLYCOUNT  DS        1			;DLYCOUNT RAM

DATA	  DS        1			;CSUTOM 
DATA1	  DS        1			;CUSTOM BAR
DATA2	  DS        1			;DATA 
DATA3	  DS        1			;DATA BAR

;;;;;;;; MAIN PROGRAM  ;;;;;;;;;;;;;;;;;;;;;;

          	ORG     0C000H			;16K ROM START

RESET:    	CLRG
          	LDX     #0FEH			;STACK POINTER INITIALIZE
          	TXSP				;SP. <--#0FEH
          	CALL    RAMCLEAR		;RAM CLEAR

NOKYR:    	CALL    !REG_INI		;REGISER INITIALIZE
          	CLR1    IRQKSCN			;CLEAR KEYSCAN INT. REQUEST FLAG
          	STOP

          	NOP				;AFTER WAKE-UP TWO NOP INSTRUCTION ARE NEEDED
          	NOP

MAIN:     	LDM     R1,#0FFH        	; OUTPUT HIGH
          	LDM     BACKEY,#0
          	LDM     OLDKEY,#0
          	LDM     STAT,#0
MAIN1:
	  	CALL    !LINESCAN		;KEY SCAN
		LDM	WDTR,#7FH		;WDT CLEAR & THE VALUE 3FH
						;INTERVAL OF WDT= 3FH*16.384uS=1032MS
	  	LDA     #50
DELAYAG:  	CALL    !DELAY			;TIME DELAY FOR 2ND KEY SCANNING
	  	DEC     A
	  	BNE     DELAYAG

KEYCHK:   	LDA     TOTLKY
          	BEQ     NOKYROUT		;NO KEY
          	CMP     #1
          	BEQ     NORMALR			;ONE KEY
          	BRA     MAIN			;DOUBLE KEY

NOKYROUT: 	BBS     NOKYF,RESET
          	SET1    NOKYF
          	BRA     MAIN1
	   				
RAMCLEAR: 	LDA     #0
          	LDX     #0
RAMCLR:   	STA     {X}+			;RAM CLEAR
          	CMPX    #0C0H			;0000H~00BFH 
          	BNE     RAMCLR
          	RET

NORMALR:  	BBC     SECONDF,SAVEKEY

          	LDA     NEWKEY			;COMPARE 1ST KEY WITH 2ND KEY
          	CMP     BACKEY
          	BEQ     OKMOD1

SAVEKEY:  	SET1    SECONDF
          	LDA     NEWKEY			;SAVE 1ST KEY
          	STA     BACKEY
          	JMP     MAIN1

OKMOD1:   	LDA     BACKEY			;REPEAT CHECK
          	CMP     OLDKEY
          	BEQ     OKMOD2
          	CLR1    REPEATF
OKMOD2:		STA     OLDKEY

		LDM	DATA,#04H		;CUSTOM 
		LDM	DATA1,#0FBH		;CUSTOM BAR
		LDA	NEWKEY
		TAY
		LDA	!NEC_DATA+Y
		STA	DATA+2			;DATA
		STA	DATA+3
		COM	DATA+3			;DATA BAR

		LDM	T1HD,#24H		; CARRIER DEFINE,250nS*24H=9000nS
		LDM	T1LD,#46H		; 250nS*46H=17500nS

		LDM	T0HMD,#23H		; HEADER DEFINE,1uS*2328H=9000uS
		LDM	T0HLD,#28H
		LDM	T0LMD,#11H		; 1194H*1uS=4500uS
		LDM	T0LLD,#94H

  		
		LDM	TM01,#00H
 		LDM	TM0,#00H
		LDM	TM1,#00H
	
		CLR1	IRQT0
		CLR1	IRQT1
		
		BBC	REPEATF,FULL_DATA
		BBC	IRQT2,$			;108mS WAITING
		CLR1	IRQT2
		JMP	RPT_DATA

FULL_DATA: 	LDM	TM2,#00H
	        CLR1	IRQT2
		LDM	T2DR,#0D3H		;TIMER2, 512uS*D3H=108.032uS
                LDM	TM2,#0001_1110B		;TIMER2 START AFTER CLEAR,CONTI,PS11,512uS
   		
		LDM	TM1,#1101_0000B		;TIMER START AFTER CLEAR,CONTI,MODULO,
						;INT. EVERY 2ND COUNTER, PS0 ,250nS
		LDM	TM0,#0110_1010B		;TIMER,TIMER0 START AFTER CLEAR,CONTI,
						;MODULO,2ND, PS2, 1uS
		LDM	TM01,#1100_1100B	;TOUT LOGIC OUTPUT, REMOUT OUTPUT HIGH,
						;TIMER0 OUTPUT HIGH, TIMER1 OUTPUT HIGH,
						;AND OF TO & T1
		BBC	IRQT0,$			; HEAD OUTPUT
		CLR1	IRQT0

		LDX	#0			;BYTE COUNTER
		LDY	#0			;BIT COUNTER
		LDM	T0HMD,#02H		;MARK PULSE 560uS
		LDM	T0HLD,#30H	
	
	
PULSE_DATA:	CALL	!PULSE_OUT
		LDY	#0
		INC	X
		CMPX	#4
		BNE	PULSE_DATA

END_PULSE:	LDM	TM0,#0110_0010B		;2ND-->EVE
		BBC	IRQT0,$
		CLR1	IRQT0
		LDM	TM01,#00H		;REMOUT END
		LDM	TM0,#00H
		LDM	TM1,#00H
		SET1	REPEATF
		JMP	MAIN1

PULSE_OUT:	ROR	DATA+X
		BCC	LOW_BIT			;BIT0

HIGB_BIT:	LDM	T0LMD,#06H		;1690uS
		LDM	T0LLD,#9AH
		BRA	COMEND

LOW_BIT:	LDM	T0LMD,#02H		;565uS
		LDM	T0LLD,#35H

COMEND:		BBC	IRQT0,$
		CLR1	IRQT0
		INC	Y
		CMPY	#8
		BNE	PULSE_OUT
		RET

RPT_DATA:	LDM	T0LMD,#08H		;HEAD LOW CHANGE 4.5-->2.25
		LDM	T0LLD,#0CAH		
		LDM	TM1,#1101_0000B		;TIMER START AFTER CLEAR,CONTI,MODULO,
						;INT. EVERY 2ND COUNTER, PS0 ,250nS
		LDM	TM0,#0110_1010B		;TIMER,TIMER0 START AFTER CLEAR,CONTI,
						;MODULO,2ND, PS2, 1uS
		LDM	TM01,#1100_1100B	;TOUT LOGIC OUTPUT, REMOUT OUTPUT HIGH,
						;TIMER0 OUTPUT HIGH, TIMER1 OUTPUT HIGH,
						;AND OF TO & T1
		BBC	IRQT0,$
		CLR1	IRQT0
		LDM	T0HMD,#02H		;MARK PULSE 560uS
		LDM	T0HLD,#30H	
		BRA	END_PULSE

;;;;;;;;;;;;;;;;;;;;;;;;;;
LINESCAN: 	LDM 	KEYNUM,#0
          	LDM     NEWKEY,#0
          	LDM     PRTDAT,#0
          	LDM     TOTLKY,#0
          	LDM     STROBE,#0
          	LDM     DLYCOUNT,#0

          	LDM     STROBE,#1111_1110B
KEYAG:    	LDA     STROBE
          	STA     R1
          	CALL    !DELAY
          	LDA     R0                  	;READ INPUT
          	LDM     R1,#0FFH
          	STA     PRTDAT			;R0 INPUT IMSI DATA
          	CMP     #0FFH
          	BEQ     NOKYPRE
          	BRA     SAVEDATA

NOKYPRE:  	CLRC
          	LDA     #8
          	ADC     KEYNUM
          	STA     KEYNUM              	;KEYNUM=KEYNUM+8

NEXTAG:   	LDA	#0FFH
	  	STA	R1
	  	CALL	!DELAY
	  	SETC
          	ROL     STROBE              
          	LDA     STROBE
          	CMP     #7FH		
          	BNE     KEYAG
	  	RET

SAVEDATA: 	LDX     #8
SAVEDT1:  	SETC
          	ROR     PRTDAT
          	BCS     INCKEY              	; THIS IS NOT PRESSED

          	INC     TOTLKY              	; THIS IS PRESSED
          	LDA     KEYNUM
          	STA     NEWKEY

INCKEY:   	INC     KEYNUM
          	DEC     X
          	BNE     SAVEDT1
          	BRA     NEXTAG


DELAY:    	LDM     DLYCOUNT,#10
CONDLY:   	DEC     DLYCOUNT
          	BNE     CONDLY
          	RET

REG_INI:  	DI
          	LDM     CKCTLR,#0011_1101B  	;WDT-ON,ENPCK-ON,16uS STANDBY RELEASE TIME (PS8)
          	LDM     R1ODC,#1111_1111B   	;R1 PORT OPEN DRAIN.
          	LDM     R1DD,#1111_1111B    	;R1 OUTPUT
          	LDM     R0DD,#0000_0000B    	;R0 INPUT
          	LDM     IENH,#1000_0000B    	;KEY SCAN
          	LDM     IENL,#0000_0000B    	
          	LDM     IRQH,#0000_0000B    	
          	LDM     SMRR0,#1111_1111B    	;R0 STANDBY RELEASE
          	LDM     R1,#0000_0000       	
          	RET

UNUSE:    	NOP
		RETI

;;;;;;NEC DATA LOOK UP TABLE
NEC_DATA:	
		DB 00H,01H,02H,03H,04H,05H,06H,07H
		DB 08H,09H,0AH,0BH,0CH,0DH,0EH,0FH
		DB 10H,11H,12H,13H,14H,15H,16H,17H
		DB 18H,19H,1AH,1BH,1CH,1DH,1EH,1FH
		DB 20H,21H,22H,23H,24H,25H,26H,27H
		DB 28H,29H,2AH,2BH,2CH,2DH,2EH,2FH
		DB 30H,31H,32H,33H,34H,35H,36H,37H
		DB 38H,39H,3AH,3BH,3CH,3DH,3EH,3FH

		END				;NOTICE PROGRAM END  	
	
