⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.asm

📁 Holtek audio decoder , Dongle 参考范例
💻 ASM
📖 第 1 页 / 共 3 页
字号:
		;call	RX_mode_set
	
		NOP		
		clr wdt
		
Timer_0_ISR_END:	
		MOV		A,isr_tmr0_bp		;restone bp
		MOV		BP,A		
		MOV		A,isr_tmr0_tblp		;restore TBLP
		MOV		TBLP,A
		MOV		A,isr_tmr0_mp0		;restore MP0
		MOV		MP0,A
		MOV		A,isr_tmr0_mp1		;restore MP1
		MOV		MP1,A
		MOV		A,isr_tmr0_status	;restore STATUS
		MOV		STATUS,A
		MOV		A,isr_tmr0_acc		;restore ACC
		;SET		TMR0C.4			;start timer0

		RETI

;***************************************************************
;		Timer_1_ISR
;		1.Timer time = 21.2 ms
;		2.Do this procedure is 3.6ms
;***************************************************************
Timer_1_ISR:
		CLR		TMR1C.4
		SET		INTC0.@INTC0_EMI

		MOV		isr_tmr1_acc,A		;save ACC
		MOV		A,STATUS
		MOV		isr_tmr1_status,A	;save status
		MOV		A,MP1
		MOV		isr_tmr1_mp1,A		;save mp1
		MOV		A,MP0
		MOV		isr_tmr1_mp0,A		;save mp0
		MOV		A,TBLP
		MOV		isr_tmr1_tblp,A		;save TBLP
		MOV		A,BP
		MOV		isr_tmr1_bp,A		;save bp
				
		clr	BP		
		
		clr	wdt	
		SET		TMR1_KEY_FG
		IF	UseMediaKey
		call		Key_Debounced
		ENDIF
		call		Run_Volume_Step

		MOV		A,isr_tmr1_bp		;restone bp
		MOV		BP,A
		MOV		A,isr_tmr1_tblp		;restore TBLP
		MOV		TBLP,A
		MOV		A,isr_tmr1_mp0		;restore MP0
		MOV		MP0,A
		MOV		A,isr_tmr1_mp1		;restore MP1
		MOV		MP1,A
		MOV		A,isr_tmr1_status	;restore STATUS
		MOV		STATUS,A
		MOV		A,isr_tmr1_acc		;restore ACC

Timer_1_ISR_End:
		SET		TMR1C.4
		RETI

;***************************************************************
;		USB_ISR : USB Interrupt Routine
;		1.Back up every status register
;		2.check which endpoint is interrupt
;***************************************************************
USB_ISR:
		CLR		INTC0.@INTC0_EEI	;disable USB interrupt
		;modify 2006-09-11
		CLR		ET1I
		SET		INTC0.@INTC0_EMI

		MOV		isr_usb_acc,A		;save ACC
		MOV		A,STATUS
		MOV		isr_usb_status,A	;save status
		MOV		A,MP1
		MOV		isr_usb_mp1,A		;save mp1
		MOV		A,MP0
		MOV		isr_usb_mp0,A		;save mp0
		MOV		A,TBLP
		MOV		isr_usb_tblp,A		;save TBLP
		MOV		A,BP
		MOV		isr_usb_bp,A		;save bp

		clr	BP
		
		clr	wdt
		;;Check Which FIFO is interrupt
		JMP		Check_Access_FIFO		

USB_ISR_END:
		MOV		A,isr_usb_bp		;restone bp
		MOV		BP,A
		MOV		A,isr_usb_tblp		;restore TBLP
		MOV		TBLP,A
		MOV		A,isr_usb_mp0		;restore MP0
		MOV		MP0,A
		MOV		A,isr_usb_mp1		;restore MP1
		MOV		MP1,A
		MOV		A,isr_usb_status	;restore STATUS
		MOV		STATUS,A
		MOV		A,isr_usb_acc		;restore ACC

		;modify 2006-08-18
		;CLR		INTC0.@INTC0_EMI
		SET		ET1I
		SET		INTC0.@INTC0_EEI


		RETI


;***************************************************************
;		USB_EPX_ISR
;***************************************************************
Check_Access_FIFO:
		clr wdt	
		SZ		USR.@USR_EP0F
		JMP		USB_EP0_ISR
		SZ		USR.@USR_EP1F
		JMP		USB_EP1_ISR
		SZ		USR.@USR_EP2F
		JMP		USB_EP2_ISR
		SZ		USR.@USR_EP3F
		JMP		USB_EP3_ISR
		SZ		USR.@USR_EP4F
		JMP		USB_EP4_ISR

		JMP		USB_ISR_END

;-----------------------------------------------------
;EPNPOINT 0
;-----------------------------------------------------
USB_EP0_ISR:
		;modify 2006-07-27
		;CLR		USR.@USR_EP0F	;Fix Bus Enumeration Stress

;;case1
		SZ		MISC.@MISC_SCMD			;check setup token      
		JMP		USB_EP0_SETUP_TOKEN                                     
                
		SZ		MISC.@MISC_LEN0			;check out ack token    
		JMP		USB_EP0_OUT_ACK_TOKEN                                   

		CALL		FIFO0_RD_CHECK                                          
		SZ		bFlag_FIFO_Ready                                        
		JMP		USB_EP0_OUT_TOKEN 
		;clr		MISC.@MISC_REQ

		CALL		FIFO0_WR_CHECK                                          
		SZ		bFlag_FIFO_Ready                                        
		JMP		USB_EP0_IN_TOKEN		;else is in token       
		;clr		MISC.@MISC_REQ

		;modify 2006-08-28
		CLR		USR.@USR_EP0F	;Fix OHCI Volume

  		JMP		USB_EP0_ISR_END   


;;case2
;;		SZ		MISC.@MISC_SCMD			;check setup token      
;;		JMP		USB_EP0_SETUP_TOKEN                                     
;;                
;;		SZ		MISC.@MISC_LEN0			;check out ack token    
;;		JMP		USB_EP0_OUT_ACK_TOKEN                                   
;;
;;		CALL		FIFO0_RD_CHECK                                          
;;		SZ		bFlag_FIFO_Ready                                        
;;		JMP		USB_EP0_OUT_TOKEN 
;;		;clr		MISC.@MISC_REQ
;;
;;		CALL		FIFO0_WR_CHECK                                          
;;		SZ		bFlag_FIFO_Ready                                        
;;		JMP		USB_EP0_IN_TOKEN		;else is in token       
;;		;clr		MISC.@MISC_REQ
;;
;;
;;  		JMP		USB_EP0_ISR_END   


;;case3
;;		call		FIFO0_RD_CHECK
;;		sz		bFlag_FIFO_Ready
;;		jmp		Have_Data_Out
;;		
;;		call		FIFO0_WR_CHECK
;;		sz		bFlag_FIFO_Ready
;;		jmp		USB_EP0_IN_TOKEN
;;		
;;		jmp		USB_EP0_ISR_END
;;
;;Have_Data_Out:
;;		sz		MISC.@MISC_SCMD
;;		jmp		USB_EP0_SETUP_TOKEN
;;		sz		MISC.@MISC_LEN0
;;		jmp		USB_EP0_OUT_ACK_TOKEN
;;		
;;		jmp		USB_EP0_OUT_TOKEN





USB_EP0_SETUP_TOKEN:					;PARSE SETUP TOKEN
		clr wdt
		CALL		StageOne
		JMP		USB_EP0_ISR_END

USB_EP0_IN_TOKEN:
		clr wdt
		;modify 2006-08-28
		CLR		USR.@USR_EP0F	;Fix OHCI Volume
		CALL		control_read
		JMP		USB_EP0_ISR_END

USB_EP0_OUT_ACK_TOKEN:
		;modify 2006-08-28
		CLR		USR.@USR_EP0F	;Fix OHCI Volume
		clr wdt
		clr		MISC.@MISC_LEN0
;;		call		Delay_3us
		JMP		USB_EP0_ISR_END
		


USB_EP0_OUT_TOKEN:
		;modify 2006-08-28
		CLR		USR.@USR_EP0F	;Fix OHCI Volume
		clr wdt
		clr		acc
		xor		a,nCmdIndex1
		sz		z
		jmp		USB_EP0_ISR_END

USB_EP0_OUT_TOKEN_Loop:
		clr wdt
		CALL		Check_Real_Cmd
		sz		bFlag_Real_Cmd
		jmp		USB_EP0_OUT_TOKEN_End

		clr wdt	
		CALL		FIFO0_RD_CHECK
		SNZ		bFlag_FIFO_Ready
		JMP		USB_EP0_OUT_TOKEN_Loop
		
		CALL		READ_FIFO0
		NOP
		CALL		Send_Hand_Shake


		;decode command
		;//parse Cmd , 21H = SetReport Out Data
		mov		a,21H
		xor		a,nCmdIndex1
		sz		z
		jmp		ProcessOutData

		;//parse Cmd , 18H = Speaker Mute Control
		mov		a,18H
		xor		a,nCmdIndex1
		sz		z
		jmp		Implement_Speaker_Mute

		;//parse Cmd , 19H = Mic Mute Control
		mov		a,19H
		xor		a,nCmdIndex1
		sz		z
		jmp		Implement_Mic_Mute


		;//parse Cmd , 28H = Speaker Volume Control
		mov		a,28H
		xor		a,nCmdIndex1
		sz		z
		jmp		Implement_Speaker_Volume

		;//parse Cmd , 29H = Mic Volume Control
		mov		a,29H
		xor		a,nCmdIndex1
		sz		z
		jmp		Implement_Mic_Volume



		;//unknow command
		jmp		USB_EP0_OUT_TOKEN_End
		
USB_EP0_OUT_TOKEN_End:
		clr		nCmdIndex1
		JMP		USB_EP0_ISR_END


Implement_Speaker_Mute:
		clr wdt
		sz		FIFO_out1.0
		clr		USVC.7			;mute
		snz		FIFO_out1.0
		set		USVC.7			;unmute

		sz		FIFO_out1.0
		set		bFlag_Audio_Mute	;mute
		snz		FIFO_out1.0
		clr		bFlag_Audio_Mute	;unmute

		snz		bFlag_Audio_Mute
		jmp		Implement_Speaker_Mute_1
		
		mov		a,Min_Volume
		mov		USVC,a
		
		clr		USVC.7
		
		
Implement_Speaker_Mute_1:
		jmp		USB_EP0_OUT_TOKEN_End


Implement_Mic_Mute:
		clr wdt
		sz		FIFO_OUT1.0
		clr		PGA_CTRL.7	;mute
		snz		FIFO_OUT1.0
		set		PGA_CTRL.7	;unmute
		
		sz		FIFO_out1.0
		set		bFlag_Mic_Mute	;mute
		snz		FIFO_out1.0
		clr		bFlag_Mic_Mute	;unmute
		
		
		jmp		USB_EP0_OUT_TOKEN_End
		

		

Implement_Speaker_Volume:
		clr wdt
		kmov		VolumeH_Save,FIFO_out1
		kmov		VolumeL_Save,FIFO_out2
Implement_Speaker_Volume_End:
		jmp		USB_EP0_OUT_TOKEN_End		

Implement_Mic_Volume:
		clr wdt
		mov		a,7FH
		xor		a,FIFO_OUT2
		sz		z
		jmp		Implement_Mic_Volume_Set_Max
				
		mov		a,80H
		xor		a,FIFO_OUT2
		sz		z
		jmp		Implement_Mic_Volume_Set_Min
	
		kmov		FIFO_TEMP,FIFO_OUT2
		jmp		Implement_Mic_Volume_1
		
Implement_Mic_Volume_Set_Max:		
		clr wdt
		kmov		FIFO_TEMP,MIC_Max_Volume
		jmp		Implement_Mic_Volume_1
Implement_Mic_Volume_Set_Min:		
		clr wdt
		kmov		FIFO_TEMP,MIC_Min_Volume
		jmp		Implement_Mic_Volume_1
Implement_Mic_Volume_1:
		clr wdt
		mov		a,80H
		and		a,PGA_CTRL
		
		or		a,FIFO_TEMP
		mov		PGA_CTRL,a
Implement_Mic_Volume_End:
		jmp		USB_EP0_OUT_TOKEN_END

USB_EP0_ISR_END:
		;modify 2006-07-27
		CLR		USR.@USR_EP0F		;Fix Bus Enumeration Stress
		JMP		USB_ISR_END
;-----------------------------------------------------
;EPNPOINT 1 Interrupt
;-----------------------------------------------------
USB_EP1_ISR:
		;check the data is in fifo ?
		;CALL		FIFO1_RD_CHECK
		;SNZ		bFlag_FIFO_Ready
		;JMP		USB_EP1_ISR_END
		;CALL		Read_FIFO1


		;;CALL		FIFO1_WR_CHECK
		;;SNZ		bFlag_FIFO_Ready
		;;JMP		USB_EP1_ISR_END
		;;MOV		A,00H
		;;MOV		FIFO_OUT1,A
		;;MOV		A,01H
		;;MOV		FIFO_SendLen,A
		;;CALL		WRITE_FIFO1		



USB_EP1_ISR_END:
		CLR		USR.@USR_EP1F
		JMP		USB_ISR_END
;-----------------------------------------------------
;EPNPOINT 2 Interrupt
;-----------------------------------------------------
USB_EP2_ISR:
		;;SET		ET0I		;enable timer0
		;;SET		TMR0C.4		;Enable timer0 counter
		
		;modify 2006-07-27
		;SET		ET1I
		;SET		TMR1C.4

		clr		MISC.@MISC_ISOEN		;close ISO(output) interrupt


USB_EP2_ISR_END:
		CLR		USR.@USR_EP2F		
		JMP		USB_ISR_END
;-----------------------------------------------------
;EPNPOINT 3 Interrupt
;-----------------------------------------------------
USB_EP3_ISR:
		clr		MISC.@MISC_ISIEN		;close ISO(input) interrupt
USB_EP3_ISR_END:
		CLR		USR.@USR_EP3F
		JMP		USB_ISR_END
;-----------------------------------------------------
;EPNPOINT 4 Interrupt
;-----------------------------------------------------
USB_EP4_ISR:
		
USB_EP4_ISR_END:
		CLR		USR.@USR_EP4F
		JMP		USB_ISR_END

;***************************************************************
;		Stage  One  ....  Test bmRequestType
;		CALL   FIFO_RD_CHECK  will return bFlag_FIFO_Ready?(1=Ready,0=not ready)
;***************************************************************
StageOne:
		clr wdt		

		CALL		FIFO0_RD_CHECK
		SNZ		bFlag_FIFO_Ready
		JMP		StageOne_End		; the EP0 FIFO RD is not ready		
		CALL		Read_FIFO0		; Read EP0 Command
		clr		MISC.@MISC_SCMD
		clr		MISC.@MISC_LEN0

		;modify 2006-08-28
		CLR		USR.@USR_EP0F	;Fix OHCI Volume
		
		clr wdt
		nop

		MOV		A,FIFO_TYPE
		XOR		A,00H
		SZ		Z			;FIFO_TYPE=00H
		JMP		Request_Type00

		MOV		A,FIFO_TYPE
		XOR		A,01H
		SZ		Z			;FIFO_TYPE=01H
		JMP		Request_Type01

		MOV		A,FIFO_TYPE
		XOR		A,02H
		SZ		Z			;FIFO_TYPE=02H
		JMP		Request_Type02

		MOV		A,FIFO_TYPE
		XOR		A,80H
		SZ		Z			;FIFO_TYPE=80H
		JMP		Request_Type80

		MOV		A,FIFO_TYPE
		XOR		A,81H
		SZ		Z			;FIFO_TYPE=81H
		JMP		Request_Type81

		MOV		A,FIFO_TYPE
		XOR		A,82H
		SZ		Z			;FIFO_TYPE=82H
		JMP		Request_Type82

;===============================================================
;HID & Audio
;===============================================================
		MOV		A,FIFO_TYPE
		XOR		A,21H
		SZ		Z
		JMP		Request_Type21

;Volume Control
		clr wdt
		MOV		A,FIFO_TYPE
		XOR		A,0A1H
		SZ		Z
		JMP		Request_TypeA1

		JMP		SendStall0


StageOne_End:
		;modify 2006-08-28
		CLR		USR.@USR_EP0F	;Fix OHCI Volume		
		RET


;***************************************************************
;		USB	 Stage2 
;		
;***************************************************************
;Device to Host with device as recipient
;===============================================================
;Request_Type00
;bRequest 	Function
; 1			Clear Feature
; 3			Set Feature
; 5			Set Address
; 7			not support
; 9			Set Configuration
;===============================================================
;===============================================================
Request_TYPE00:
;Set the device address to a non-zero value
;Set address
		clr wdt
		MOV		A,FIFO_REQUEST
		XOR		A,set_address
		SZ		Z
		JMP		SetAddress

;Set Configuration
		MOV		A,FIFO_REQUEST
		XOR		A,set_configuration
		;---------------------		
		;modify 2006-07-27	
		SNZ		Z
		JMP		Request_TYPE00_NEXT
		SET		ET1I
		SET		TMR1C.4	
		;---------------------
		JMP		SetConfiguration

;Clear Feature
;The HT82A822R return ACK without ERROR
;---------------------
;modify 2006-07-27
Request_TYPE00_NEXT:
;---------------------
		MOV		A,FIFO_REQUEST
		XOR		A,clear_feature
		SZ		Z
		JMP		ClearFeature

;Set Feature
		clr wdt
		MOV		A,FIFO_REQUEST
		XOR		A,set_feature
		SZ		Z
		JMP		SetFeature

		JMP		SendStall0
;===============================================================
Request_Type01:
		clr wdt
		MOV		A,FIFO_REQUEST
		XOR		A,set_interface
		SZ		Z
		JMP		SetInterface

		JMP		SendStall0		
;===============================================================
Request_Type02:
		clr wdt
		MOV		A,FIFO_REQUEST
		XOR		A,clear_feature
		SZ		Z
		JMP		ClearFeature_Endpoint

		MOV		A,FIFO_REQUEST
		XOR		A,set_feature
		SZ		Z
		JMP		SetFeature_Endpoint

		

		JMP		SendStall0		
	
		

;===============================================================
Request_TYPE80:
;Get Status
;Get Descriptor		80 06
		clr wdt
		MOV		A,FIFO_REQUEST
		XOR		A,get_descriptor
		SZ		Z
		JMP		GetDescriptor

;Get Configuration		80 08
		clr wdt
		MOV		A,FIFO_REQUEST
		XOR		A,get_configuration
		SZ		Z
		JMP		GetConfiguration

;Get Status(DEVICE)			80 00
		clr wdt
		MOV		A,FIFO_REQUEST
		XOR		A,get_status
		SZ		Z
		JMP		GetStatus

		JMP		SendStall0

;===============================================================
Request_TYPE81:
;get status
;get interface -> not support
;HID class defines one more request for bmRequestType=81
;get HID descriptor
		clr wdt
		MOV		A,FIFO_REQUEST
		XOR		A,get_descriptor

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -