;********************************************************
;														*
;	#　M16C Start_up Kit moniter S/W	 				*
;														*
;	FILENAME: mon_cnt.a30								*
;	Ver		: 1.00.00									*
;	CPU		: M16C										*
;	FUNCTION: Control module of M16C start_up kit moniter *
;			  	(1)Initilaize moniter program			*
;	SPEC	: 1/1 Non Wait								*
;			  Microprocessor mode						*
;	OPTION	: "PDB" 0 : for KDB30						*
;					1 : for PDB30						*
;			  "DBG" 0 : for Normal useing 				*
;					1 : for Debug of moniter program	*
;														*
;	CRAETE	: 1999.3.1									*
;														*
; 	Copyright(c) 1995-1999 MITSUBISHI ELECTRIC Co. 		*
; 	and MITSUBISHI ELECTRIC SEMICONDUCTOR SYSTEM Co.	*
;	All Rights Reserved.								*
;														*
;********************************************************
;=======================================================
;	1.CPU status at reset start
;		(1)ﾌﾟﾛｾｯｻﾓｰﾄﾞ	: microprocessor mode
;		(2)R/Wﾓｰﾄﾞ		: RD,WRH,WRL
;		(3)BCLK			: Output enable
;		(4)Main clock devision		: 
;		(5)Wait			: SET for ROM area
;=======================================================
;
;	1.Initialize process of moniter program
;		(1)Power ON process
;		(2)UART1 initilaize
;		(3)Reset command process
;	2.Control main program
;	3.Sub modules
;		(1)Data analyze module 
;		(2)Command process module
;		(3)Error process
;		(4)Data send module
;		(5)User program excute moduleﾕｰｻﾞﾌﾟﾛｸﾞﾗﾑﾓｼﾞｭｰﾙ
;
;========================================================
RESET:
;-----------------------------------
;	Base value of moniter program set
;-----------------------------------
; ----- ISP -----
	LDC			#C_ISP_INI,ISP		; set Interrupt stack pointa
; ----- set Processor mode -----
	BSET:G		PRC1				; set Write Enable Processor mode register
	MOV.B:G		#00000000b,PM0
	MOV.B:G		#00001000b,05h		; No-Wait
	BCLR:G		PRC1				; set Write Disable Processor mode register
; ----- set System clock -----
	BSET:G		PRC0				;  set Write Enable System clock control register
	MOV.B:G		#C_CM0,CM0			; CM0
	MOV.B:G		#C_CM1,CM1			; CM1
	BCLR:G		PRC0				;  set Write Disable System clock control register
;
	MOV.B		#C_CM0,M_CM0
	MOV.B		#C_CM1,M_CM1
; ----- check reset mode -----
	
	LDE.W		wrst_inf,R0			; Load reset information
	CMP.W		#C_RSTINF_UREST,R0	; user request ?
	JEQ			L_USR_RESET			; --> YES
; ----- POWER ON RESET & RESET ON BOARD -----
L_PON_REST:
	MOV.W		#0,R0				; Initial data
	MOV.W		#Vram_s	>> 16,A1	; TOP address
	MOV.W		#Vram_s & 0FFFFH,A0	;
L_RAM_CLR:
	STE.W		R0,[A1A0]			; data set by 2byte
	ADD.W		#2,A0				; dest address update
	CMP.W		#(Vram_e & 0FFFFH),A0	; End ?
	JLTU		L_RAM_CLR			; --> NO
; ----- Initial data set for moniter program -----
	MOV.B		#C_CMD_ERR0,R0L		; [brtn_sts]
	STE.B		R0L,brtn_sts		; excution status(default)
	MOV.B		#C_CMD_0,R0L		; [bbps_data]
	STE.B		R0L,bbps_data		; Baurate = 9600bps(fixed)
	MOV.B		#C_CMD_1,R0L		; [bstp_data]
	STE.B		R0L,bstp_data		; STOP bit = 2(fixed)
	MOV.B		#C_CTYPE_CHANGE,R0L	; [bstp_data]
	STE.B		R0L,bcmd_type		; Command type 
; ----- I/F information between moniter and  user -----
	MOV.B		#C_LED_OFF,R0L		; [Vrun_led]
	STE.B		R0L,bled_sw			; LED output enable = OFF
	STE.B		R0L,bmon_bk			; backup = OFF
; ----- USR RESET initialize -----
L_USR_RESET:
;---------------- UART0 -------------------			
;
	MOV.B	#00000101B,U1MR	;				
	MOV.B	#00010000B,U1C0	;CTS RTS function disable
	MOV.B	#00000011B,UCON	;		

;---------------------------------------------------------------*****
;	set baud rate generater
;---------------------------------------------------------------*****

;	MOV.B	#26,U1BRG	;for  38400 BPS(16M)
;	MOV.B	#19,U1BRG	;for  38400 BPS(12M)
;	MOV.B	#16,U1BRG	;for  38400 BPS(10M)
;	MOV.B	#12,U1BRG	;for  38400 BPS(8M)	
;	MOV.b	#9,U1BRG	;for  38400 BPS(6M)	
;
;	MOV.B	#52,U1BRG	;for  9660 BPS(8M)	
;----- test ok -----
;	MOV.B	#51,U1BRG	;for  19200 BPS(16M:5V)
;	MOV.B	#52,U1BRG	;for  19200 BPS(16M:5V)
;	MOV.B	#50,U1BRG	;for  19200 BPS(16M:5V)
;	MOV.B	#49,U1BRG	;for  19200 BPS(16M:5V)
;----- test ok -----
;	MOV.B	#25,U1BRG	;for  38400 BPS(16M:5V)
;	MOV.B	#24,U1BRG	;for  38400 BPS(16M:5V)
;----- test ok -----
;	MOV.B	#32,U1BRG	;for  19200 BPS(10M:3V)
;	MOV.B	#33,U1BRG	;for  19200 BPS(10M:3V)
;	MOV.B	#31,U1BRG	;for  19200 BPS(10M:3V)
;	MOV.B	#30,U1BRG	;for  19200 BPS(10M:3V)
	MOV.B	#15,U1BRG	;for  38400 BPS(10M:3V)

;---------------------------------------------------------------****			
	MOV.B	#7,S1TIC	; send interrupt priority level 7
	MOV.B	#7,S1RIC	; receice interrupt priority level 7	
	LDINTB	#MON_INTB	; set Interrupt vecter table

;******************* Initialize for Frash memory ********************
;
	BSET	5,03B7H						; Select USER ROM

;----------------------------------------------
;	Initialize for usr program information
;----------------------------------------------
	JSR.A		S_REG_INIT			; Initialize registers
;----------------------------------------------
;	Complate of initialize for usr program information
;----------------------------------------------
	MOV.W		#C_RSTINF_COMPLT,R0	; Complate of moniter program initialize
	STE.W		R0,wrst_inf			;
;
;-----------------------------------
;	Initialize for DEBUG information
;		P7_0 	: Status of momoniter excute
;		  _1	:
;		  _2	: Status of NMI RUN
;		  _3	:
;		  _4	: ERR
;		  _5	:
;		  _6	: for overhead measurement
;		  _7	:
;-----------------------------------
.IF DBG==ON
	MOV.W		#0,R0				; Initial data
	MOV.W		#Vdbg_s	>> 16,A1	; Top address
	MOV.W		#Vdbg_s & 0FFFFH,A0	;
L_DBG_CLR:
	STE.W		R0,[A1A0]			; data set by 2byte
	ADD.W		#2,A0				; update address
	CMP.W		#(Vdbg_e & 0FFFFH)+2,A0	; END check ?
	JLTU		L_DBG_CLR			; --> NO
; ----- Initialize of I/O port -----
	MOV.B		#0FFH,PD7			; P7 output select
	MOV.B		#0,P7				;
.ENDIF
;
;========================================================
;	NAME	: L_CNT_MAIN
;	FUNCTION: Control main process
;	INPUT	: NONE
;	OUTPUT	: NONE
;	USED_REG: [R0] : work 		[FB] : NOT USED
;			  [R1] : work 		[SB] : NOT USED
;			  [R2] : work 
;			  [R3] : work 
;			  [A0] : work 
;			  [A1] : work 
;========================================================
	BSET	RE_U1C1					; Set receive enable (at complate initialize)
	FSET	I
	MOV.B	#0,F_INTB				;INTB TEST;ham
L_CNT_MAIN:
; ----- IDLE -----
;
	FSET	I						; alltime set I-FLG
;	LDIPL	#6						; Interrupt mask without UART1
;	
	LDE.W		wmoj_req,R1			; Load module REQ flag
	CMP.W		#0,R1				; No request ?
	JEQ			L_CNT_MAIN			; --> YES (IDLE)
; ----- Receice control module excute -----
.IF DBG==ON
	BSET:G		P7_0				;
.ENDIF
	LDE.W		wmoj_req,R1			; Load module REQ flag
	BTST		F_MOJ_CNTL,R1		; Receice control module excute ?
	JEQ			L_CNT_CHK			; --> NO
	JMP			moj_cntl			; --> [Receice control module excute]
; ----- Receive data analyze module excute -----
L_CNT_CHK:
	LDE.W		wmoj_req,R1			; Load module REQ flag
	BTST		F_MOJ_CHK,R1		; Receive data analyze module excute ?
	JEQ			L_CNT_CMD			; --> NO
	JMP			moj_chk				; --> [Receive data analyze module excute]
; ----- Command process module excute ｺﾏﾝﾄﾞ対応ﾓｼﾞｭｰﾙ -----
L_CNT_CMD:
	LDE.W		wmoj_req,R1			;
	BTST		F_MOJ_CMD,R1		; Command process module excute ?
	JEQ			L_CNT_LED			; --> NO
	JMP			moj_cmd				; --> [Command process module]
; ----- RUN LED control module excute -----
L_CNT_LED:
	LDE.W		wmoj_req,R1			;
	BTST		F_MOJ_LED,R1		; RUN LED control module excute ?
	JEQ			L_CNT_USR			; --> NO
	JMP			moj_led				; --> [RUN LED control module excute]
; ----- User program excute (within special page area) -----
L_CNT_USR:
	LDE.W		wmoj_req,R1			;
	BTST		F_MOJ_USR,R1		; User program excute ?
	JEQ			L_CNT_ETC			; --> NO
	JMP			moj_usr				; --> [User program excute]
; ----- E.T.C -----
L_CNT_ETC:
	LDE.W		wmoj_req,R1			; Special area select = OFF
	BCLR		F_MOJ_SPC,R1		;
	STE.W		R1,wmoj_req			;>
.IF DBG==ON
	BCLR:G		P7_0				;
.ENDIF
;

		
	JMP.B		L_CNT_MAIN			; --> LOOP
;****************************************************************************************
;
;========================================================
;	NAME	: moj_cntl
;	FUNCTION: Receice control module
;				This program control receive data
;	INPUT	: brcv_buf	: Top data of receive data buffer
;			  wrcv_cnt	: Recevie data count (OLD)
;			  wmoj_req	: module REQ flag
;	OUTPUT	: brcv_dat	: Receive data
;			  wrcv_cnt	: Recevie data count(NEW)
;	USED_REG: [R0]	: module REQ flag,work 
;			  [R1] 	: Recevie data count(work )
;========================================================
moj_cntl:
; ----- Get Receive data -----
	LDE.B		brcv_buf,R0L		; Load Top data of receive data buffer
	STE.B		R0L,brcv_dat		;> Receive data
	JSR.A		S_RCVBUF_EDIT		; Update  receive data buffer
;
	LDE.W		wrcv_cnt,R1			; Load Recevie data count
	SUB.W		#1,R1				; -1
	STE.W		R1,wrcv_cnt			;>Update Recevie data count
; ----- Check receive data number -----
	LDE.W		wmoj_req,R0			; Load module REQ flag
	BSET		F_MOJ_CHK,R0		; Receive data analyze module excute = ON
	CMP.W		#0,R1				; End of data ?
	JEQ			L_CNTL_NOWAIT		; --> YES
; ----- Not end of data -----
.IF 1
	JSR.A		S_MON_ERR			; --> ERR
.ENDIF
	BSET		F_MOJ_CNTL,R0		; Receice control module excute = ON
	JMP.B		L_CNTL_EXIT			; --> ALL
L_CNTL_NOWAIT:
	BCLR		F_MOJ_CNTL,R0		; Receice control module excute = OFF
L_CNTL_EXIT:
	STE.W		R0,wmoj_req			;>
	JMP			L_CNT_CHK			; --> jmp to control main 
;
;========================================================
;	NAME	: moj_chk
;	FUNCTION: Receive data analyze module
;				analyze receive data
;	INPUT	: wmoj_req : module REQ flag
;			  brcv_dat : Receive data
;			  wrcv_cntl: Receive control flag
;			  werr_inf : ERR information
;	OUTPUT	: wmoj_req : module REQ flag
;			  wrcv_cntl: Receive control flag
;			  werr_inf : ERR information
;			  wnow_cmd : command
;			  brcv_cmd1: CMD1
;			  bstage_no: Stage No.
;			  bnow_code: recevie code of NOW
;	USED_REG: [R0] : Receive data(1Byte)
;			  [R1] : module REQ flag,work 
;			  [R2] : Receive control flag(1Word)
;========================================================
moj_chk:
; ----- ﾓｼﾞｭｰﾙ制御関連 -----
	LDE.W		wmoj_req,R1			; Load module REQ flag
	BCLR		F_MOJ_CHK,R1		; Receive data analyze module excute = OFF
	LDE.B		brcv_dat,R0L		; Load Receive data
	LDE.W		wrcv_cntl,R2		; Load Receive control flag
	BTST		F_RCVMD_ASCII,R2	; ASCII data receive ?
	JEQ			L_CHK_ASCII			; --> YES(ASCII)
;--------------------------------------------------------
;	<Binary mode > control code & flow control check
;--------------------------------------------------------
	BTST		F_RCVMD_ESC,R2		; at ESC sequence ?
	JEQ			L_CHK_BINFREE		; --> NO
; ----- at ESC sequence  -----
	CMP.B		#C_CMD_EXON,R0L		; [XON] receive  ?
	JNE			L_CHK_ESCXOFF		; --> NO
	MOV.B		#C_CMD_XON,R0L		; Normal data [11]
	JMP			L_CHK_BINOK			; --> ALL
L_CHK_ESCXOFF:
	CMP.B		#C_CMD_EXOFF,R0L	; [XOFF] receive  ?
	JNE			L_CHK_ESCESC		; --> NO
	MOV.B		#C_CMD_XOFF,R0L		; Normal data [13]
	JMP			L_CHK_BINOK			; --> ALL
L_CHK_ESCESC:
	CMP.B		#C_CMD_EESC,R0L		; [ESC] receive  ?
	JNE			L_CHK_ESCINIT		; --> NO
	MOV.B		#C_CMD_ESC,R0L		; Normal data [1B]
	JMP			L_CHK_BINOK			; --> ALL
L_CHK_ESCINIT:
	CMP.B		#C_CMD_EINIT,R0L	; [INIT] receive  ?
	JNE			L_CHK_BINNG			; --> NO(Error data)
	MOV.B		#C_CMD_INIT,R0L		; Normal data [21]
	JMP			L_CHK_BINOK			; --> ALL
; ----- 通常のBinaryﾃﾞｰﾀ受信 -----
L_CHK_BINFREE:
	CMP.B		#C_CMD_ESC,R0L		; [ESC] receive  ?
	JNE			L_CHK_BINXON		; --> NO
	BSET		F_RCVMD_ESC,R2		; ESC sequence = ON
	BCLR		F_MOJ_CMD,R1		; Command process module REQ = OFF
	JMP.W		L_CHK_SUMGET		; --> ALL
L_CHK_BINXON:
	CMP.B		#C_CMD_XON,R0L		; [XON] receive  ?
	JNE			L_CHK_BINXOFF		; --> NO
	BCLR		F_RCVMD_XOFF,R2		; XOFF receive = OFF
	BSET		F_RCVMD_XON,R2		; XON receive = ON
	JMP			L_CHK_BINELG		; --> ALL(special code)
L_CHK_BINXOFF:
	CMP.B		#C_CMD_XOFF,R0L		; [XOFF] receive  ?
	JNE			L_CHK_BININIT		; --> NO
	BCLR		F_RCVMD_XON,R2		; XON receive = OFF
	BSET		F_RCVMD_XOFF,R2		; XOFF receive = ON
	JMP			L_CHK_BINELG		; --> ALL(special code)
L_CHK_BININIT:
	CMP.B		#C_CMD_EINIT,R0L	; [INIT] receive  ?
	JNE			L_CHK_BINOK			; --> NO(Normal)
	BSET		F_RCVMD_INIT,R2		; INIT receive = ON
; ----- special code以外ﾊﾞｲﾅﾘﾃﾞｰﾀ-----
L_CHK_BINOK:					; Normal data
	BCLR		F_RCVMD_ESC,R2		; ESC sequence  = OFF
	STE.B		R0L,bnow_code		; save current receive code
	BSET		F_MOJ_CMD,R1		; Command process module REQ = ON
L_CHK_SUMGET:
	JSR.A		S_CHKSUM_R			; calcu. sumcheck data
	JMP.W		L_CHK_EXIT			; --> ALL(EXIT)
L_CHK_BINNG:					; Error data
L_CHK_BINELG:					; special code
	BCLR		F_RCVMD_ESC,R2		; ESC sequence  = OFF
	BCLR		F_MOJ_CMD,R1		; Command process module REQ = OFF
	JMP.W		L_CHK_EXIT			; --> ALL(EXIT)
;---------------------------------------------------
;	<ASCII mode > check control code flow control
;		[SP][END][RCVE]
;			Normal data 
;---------------------------------------------------
L_CHK_ASCII:
	CMP.B		#C_CMD_ESC,R0L		; [ESC] receive  ?
	JNE			L_CHK_START			; --> NO
	JMP.W		L_CHK_ELG			; --> ALL(special code)
L_CHK_START:
	CMP.B		#C_CMD_START,R0L	; [START] receive  ?
	JNE			L_CHK_BATSTA		; --> NO
	AND.W		#0FF1FH,R2			; CMD1/CMD2/decision = OFF
	BSET		F_RCVMD_CMD1,R2		; CMD1 wait = ON
	JMP			L_CHK_ELG			; --> ALL(special code)
L_CHK_BATSTA:
	CMP.B		#C_CMD_BATSTA,R0L	; [BATSTA] receive  ?
	JNE			L_CHK_BATEND		; --> NO
	BSET		F_RCVMD_SINGLE,R2	; Continuos receive = ON
	JMP			L_CHK_ELG			; --> ALL(special code)
L_CHK_BATEND:
	CMP.B		#C_CMD_BATEND,R0L	; [BATEND] receive  ?
	JNE			L_CHK_XON			; --> NO
	BCLR		F_RCVMD_SINGLE,R2	; Continuos receive = OFF(single data)
	JMP			L_CHK_ELG			; --> ALL(special code)
L_CHK_XON:
	CMP.B		#C_CMD_XON,R0L		; [XON] receive  ?
	JNE			L_CHK_XOFF			; --> NO
	BCLR		F_RCVMD_XOFF,R2		; XOFF receive = OFF
	BSET		F_RCVMD_XON,R2		; XON receive = ON
	JMP			L_CHK_ELG			; --> ALL(special code)
L_CHK_XOFF:
	CMP.B		#C_CMD_XOFF,R0L		; [XOFF] receive  ?
	JNE			L_CHK_INIT			; --> NO
	BCLR		F_RCVMD_XON,R2		; XON receive = OFF
	BSET		F_RCVMD_XOFF,R2		; XOFF receive = ON
	JMP			L_CHK_ELG			; --> ALL(special code)
L_CHK_INIT:
	CMP.B		#C_CMD_INIT,R0L		; [INIT] receive  ?
	JNE			L_CHK_CMD			; --> NO
	BSET		F_RCVMD_INIT,R2		; INIT receive = ON
	JMP			L_CHK_ELG			; --> ALL(special code)
; ----- CMD1 CMD2検出-----
L_CHK_CMD:
	BTST		F_RCVMD_CMD1,R2		; [CMD1] wait ?
	JEQ			L_CHK_CMD2			; --> NO
; ----- [CMD1] -----
	AND.W		#0FF1FH,R2			;
	BSET		F_RCVMD_CMD2,R2		; CMD2 wait = ON
	STE.B		R0L,brcv_cmd1		; CMD1 data save
	JMP			L_CHK_EXIT			; --> ALL
L_CHK_CMD2:
	BTST		F_RCVMD_CMD2,R2		; [CMD2] wait ?
	JEQ			L_CHK_DATA			; --> NO
; ----- [CMD2] -----
	AND.W		#0FF1FH,R2			;
	BSET		F_RCVMD_CMDON,R2	; Command decision = ON
	LDE.B		brcv_cmd1,R0H		; Load CMD1(H)
	STE.W		R0,wnow_cmd			; save decision command (2Byte)
	MOV.B		#0,R0L				; stage No. = 0
	STE.B		R0L,bstage_no		;
	JMP			L_CHK_EXIT			; --> ALL
; ----- ｺﾏﾝﾄﾞ確定時のﾃﾞｰﾀ値 -----
L_CHK_DATA:						; Normal ASCII data
	BTST		F_RCVMD_CMDON,R2	; Command decision ?
	JEQ			L_CHK_NG			; --> NO(Error data)
	BSET		F_MOJ_CMD,R1		; Command process module REQ = ON
	STE.B		R0L,bnow_code		; save current decision receive code
	JMP.B		L_CHK_EXIT			; --> ALL
; ----- Error code -----
L_CHK_NG:
; ----- special code-----
L_CHK_ELG:
; ---- @Undefine -----
;----------------------------------------
;	End of Receive data analyze module excute
;----------------------------------------
; ----- save EDIT data -----
L_CHK_EXIT:
	STE.W		R2,wrcv_cntl		; Receive control flag
	STE.W		R1,wmoj_req			; module REQ flag
;
	JMP			L_CNT_CMD			; --> jmp to control main
;
;========================================================
;	NAME	: moj_cmd
;	FUNCTION: Command process module
;				each command process
;	INPUT	: wmoj_req	: module REQ flag
;			  wnow_cmd  : current decision command (ASCII)
;	OUTPUT	: wmoj_req	: module REQ flag
;	RETURN	: NONE
;	USED_REG: [R0] work 
;			  [R1] work 
;			  [A0] work 
; 			  [A1] work 
;========================================================
moj_cmd:
; ----- Module control flag -----
	LDE.W		wmoj_req,R1			; Load module REQ flag
	BCLR		F_MOJ_CMD,R1		; Command process module excute = OFF
	STE.W		R1,wmoj_req			;
; ----- Calcu. mode table address -----
;							; calcu. upper address
	LDE.W		wnow_cmd,R1			; Load current decison command
	MOV.B		R1H,R0L				; calcu. upper address
	JSR.A		S_ATOH				; ASCII -> HEX
	SHL.B		#4,R0L				; X16
	MOV.B		R0L,R1H				;
;							; calcu. lower address
	MOV.B		R1L,R0L				; 
	JSR.A		S_ATOH				; ASCII -> HEX
	ADD.B		R1H,R0L				; get table No.[R0L]
	AND.W		#00FFH,R0			;
	SHL.W		#2,R0				; get table address(X4)
	MOV.W		R0,A0				;
; ----- 各ｺﾏﾝﾄﾞ対応処理へ -----
	JMPI.A		T_CMD_TBL[A0]		; -->jmp to each process
L_CMD_EXIT:
	JMP			L_CNT_LED			; --> jmp to control main
;
;========================================================
;	NAME	: moj_usr
;	FUNCTION: User program
;			  recover user program excute information for stack
;			  and excute user program by excuted REIT
;	INPUT	: NONE
;	OUTPUT	: NONE
;	RETURN	: NONE
;	USED_REG: [R0]
;========================================================
moj_usr:
	

; ----- judement of special area or usr program area -----
	LDE.W		wmoj_req,R0			; Load module REQ flag
	BTST		F_MOJ_SPC,R0		; at special area ?
	JEQ			L_USR_SET			; --> NO
;-----------------------------------
;	Recover for special area
;------------------------------------
; ----- reset special area excute flag -----
	BCLR		F_MOJ_SPC,R0		; special area excute flag = OFF
	STE.W		R0,wmoj_req			;>
; ----- [SP] register recover -----
	LDE.W		wspc_isp,R0			;
	LDC			R0,ISP				; [ISP]
; ----- Special area information recover -----
	LDE.W		wspc_r1,R1			; [R1]
	LDE.W		wspc_r2,R2			; [R2]
	LDE.W		wspc_r3,R3			; [R3]
	LDE.W		wspc_a0,A0			; [A0]
	LDE.W		wspc_a1,A1			; [A1]
; ----- return information (Special area) recover -----
	FCLR	I					;2/10
	PUSH.W		R0					; keep area for REIT(4byte)
	PUSH.W		R0					;  　
; ----- return information set -----
	LDE.B		bspc_pcl,R0L		; PC(L)
	LDE.B		bspc_pcm,R0H		; PC(M)
	MOV.B		R0L,0[SP]			;
	MOV.B		R0H,1[SP]			;
	LDE.B		bspc_flgl,R0L		; FLG(L)
	LDE.B		bspc_flgpch,R0H		; FLG/PC(H)
	MOV.B		R0L,2[SP]			;
	MOV.B		R0H,3[SP]			;
	LDE.W		wspc_r0,R0			; [R0](注)
	FSET	I					
	JMP.W		L_USR_EXIT			; --> ALL
;-----------------------------------
;	Recover for user program 
;------------------------------------
	
L_USR_SET:
	
; ----- [SP] register recover -----
	LDE.W		wusr_isp,R0			;
	LDC			R0,ISP				; [ISP]
; ----- User stack recover -----
	FSET		U					; Select User stack
	LDE.W		wusr_usp,R0			;
	LDC			R0,SP				; [USP]
	FCLR		U
; ----- User program information recover -----
	FSET		B				; <bank-1>
	LDE.W		wusr_r1b,R1			; [R1]
	LDE.W		wusr_r2b,R2			; [R2]
	LDE.W		wusr_r3b,R3			; [R3]
	LDE.W		wusr_a0b,A0			; [A0]
	LDE.W		wusr_a1b,A1			; [A1]
	LDE.W		wusr_fbb,R0			;
	LDC			R0,FB				; [FB]
	LDE.W		wusr_r0b,R0			; [R0]
;								; <bank-0>
	FCLR		B
	LDE.W		wusr_r1,R1			; [R1]
	LDE.W		wusr_r2,R2			; [R2]
	LDE.W		wusr_r3,R3			; [R3]
	LDE.W		wusr_a0,A0			; [A0]
	LDE.W		wusr_a1,A1			; [A1]
	LDE.W		wusr_fb,R0			;
	LDC			R0,FB				; [FB]
	LDE.W		wusr_sb,R0			;
	LDC			R0,SB				; [SB]
; ----- return information (User program) recover -----
	PUSH.W		R0					; keep area for REIT (4byte)
	PUSH.W		R0					;  　"
; ----- return information set -----
	LDE.B		busr_pcl,R0L		; PC(L)
	LDE.B		busr_pcm,R0H		; PC(M)
	MOV.B		R0L,0[SP]			;
	MOV.B		R0H,1[SP]			;
.IF DBG==ON
	MOV.B		R0L,dbg_pcl			;
	MOV.B		R0H,dbg_pcm			;
.ENDIF
	LDE.B		busr_flgl,R0L		; FLG(L)
	LDE.B		busr_flgpch,R0H		; FLG/PC(H)
	MOV.B		R0L,2[SP]			;
	MOV.B		R0H,3[SP]			;
.IF DBG==ON
	MOV.B		R0L,dbg_flgl		;
	MOV.B		R0H,dbg_flgpch		;
	BCLR:G		P7_0				;
.ENDIF
	LDE.W		wusr_r0,R0			; [R0]
L_USR_EXIT:
; ----- Return to user program by stack data -----
	

;------	CM0/CM1 save ----------

	BSET	0,PRCR
	MOV.B	MU_CM0,CM0
	MOV.B	MU_CM1,CM1
	BCLR	0,PRCR
	REIT							; --> to user program

;========================================================
;	NAME	: moj_led
;	FUNCTION: RUN LED control module
;			  at FREE RUN mode control LED ON/OFF or OFF
;	INPUT	: NONE
;	OUTPUT	: NONE
;	RETURN	: NONE
;	USED_REG: [R0][R1]
;========================================================
moj_led:
; ----- ﾕｰｻﾞI/F 変化判定 -----
	LDE.B		bled_sw,R0L			; Load LED output enable
	LDE.B		bmon_bk,R1L			; Load RUN LED BKUP
	CMP.B		R1L,R0L				; Change ?
	JEQ			led_mon_chk			; --> NO
	LDE.B		bled_sw,R0L			; Load LED output enable
	CMP.B		#C_LED_ON,R0L		; ON(FREE mode) ?
	JNE			led_samp_chg		; --> NO
; ----- LED ON(FREEﾓｰﾄﾞ)へ変更時 -----
	MOV.B		#C_LED_ON,R0L		;
	STE.B		R0L,bmon_bk			;>
	JMP.B		led_onoff_chk		; --> ALL
led_samp_chg:
	CMP.B		#C_LED_OFF,R0L		; OFF(SAMPLING mode) ?
	JNE			led_exit			; --> NO
; ----- LED OFF(SAMPLING ﾓｰﾄﾞ)へ変更時 -----
	MOV.B		#C_LED_OFF,R0L		;
	STE.B		R0L,bmon_bk			;>
	JMP.B		led_exit			;
; ----- MON_MOD 判定-----
led_mon_chk:
	LDE.B		bled_sw,R0L			; Load LED output enable
	CMP.B		#C_LED_ON,R0L		; ON(FREEmode) ?
	JNE			led_exit			; --> NO
; ----- 点灯条件判定 -----
led_onoff_chk:
	LDE.W		wmoj_req,R0			; Load module REQ flag
	BTST		F_MOJ_USR,R0		; User program excute request ?
	JNZ			led_on				; --> YES
;	BCLR		P8_0				; P8_0 = OFF
	JMP.B		led_exit			; --> ALL
led_on:
led_exit:
	JMP.W		L_CNT_USR			; jmp to control main
;
;********************************************************
;														*
;	FILENAME: mon_cnt.a30								*
;														*
; 	Copyright(c) 1995-1999 MITSUBISHI ELECTRIC Co. 		*
; 	and MITSUBISHI ELECTRIC SEMICONDUCTOR SYSTEM Co.	*
;	All Rights Reserved.								*
;														*
;********************************************************
