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

📄 adpcm_def.asm

📁 ADPCM汇编程序
💻 ASM
字号:

; =========================================================
PLAY_VOLUME_ADJ_PROC	FUNCTION
		MOVE	[PLAY_PREDICTED_SAMPLE],AX

		CMP	[AUDIO_VOLUME_REG],VOLUME_MAX
		JNE	@F
		JUMP	@PLAY_VOLUME_ADJ_QUIT
@
		MOVE    X,[AUDIO_VOLUME_REG]
		SHL     X
		AND     X,00011110B
		JUMP    [@PLAY_VOLUME_TBL_INDEX+X]
@PLAY_VOLUME_TBL_INDEX
		DW      @PLAY_VOLUME_00
		DW      @PLAY_VOLUME_01
		DW      @PLAY_VOLUME_02
		DW      @PLAY_VOLUME_03
		DW      @PLAY_VOLUME_04
		DW      @PLAY_VOLUME_05
		DW      @PLAY_VOLUME_06
		DW      @PLAY_VOLUME_07
		DW      @PLAY_VOLUME_08
		DW      @PLAY_VOLUME_09
		DW      @PLAY_VOLUME_0A
		DW      @PLAY_VOLUME_0B
		DW      @PLAY_VOLUME_0C
		DW      @PLAY_VOLUME_0D
		DW      @PLAY_VOLUME_0E
		DW      @PLAY_VOLUME_0F
@PLAY_VOLUME_00
		MOVEW   [PLAY_PREDICTED_SAMPLE],(32768)           ; SILENCE LEVEL
		JUMP	@PLAY_VOLUME_ADJ_QUIT
@PLAY_VOLUME_01
		MOVE    AX,[PLAY_PREDICTED_SAMPLE]
		SHR     AX
		SHR     AX
		SHR     AX
		ADD     AX,(32768-((32768/16)*2))
		MOVE    [PLAY_PREDICTED_SAMPLE],AX
		JUMP	@PLAY_VOLUME_ADJ_QUIT
@PLAY_VOLUME_02
		MOVE    AX,[PLAY_PREDICTED_SAMPLE]
		SHR     AX
		SHR     AX
		SHR     AX
		MOVE    [PLAY_PREDICTED_SAMPLE],AX
		SHR     AX
		ADD     AX,(32768-((32768/16)*3))
		ADD     [PLAY_PREDICTED_SAMPLE],AX
		JUMP	@PLAY_VOLUME_ADJ_QUIT
@PLAY_VOLUME_03
		MOVE    AX,[PLAY_PREDICTED_SAMPLE]
		SHR     AX
		SHR     AX
		ADD     AX,(32768-((32768/16)*4))
		MOVE    [PLAY_PREDICTED_SAMPLE],AX
		JUMP	@PLAY_VOLUME_ADJ_QUIT
@PLAY_VOLUME_04
		MOVE    AX,[PLAY_PREDICTED_SAMPLE]
		SHR     AX
		SHR     AX
		MOVE    [PLAY_PREDICTED_SAMPLE],AX
		SHR     AX
		SHR     AX
		ADD     AX,(32768-((32768/16)*5))
		ADD     [PLAY_PREDICTED_SAMPLE],AX
		JUMP	@PLAY_VOLUME_ADJ_QUIT
@PLAY_VOLUME_05
		MOVE    AX,[PLAY_PREDICTED_SAMPLE]
		SHR     AX
		SHR     AX
		MOVE    [PLAY_PREDICTED_SAMPLE],AX
		SHR     AX
		ADD     AX,(32768-((32768/16)*6))
		ADD     [PLAY_PREDICTED_SAMPLE],AX
		JUMP	@PLAY_VOLUME_ADJ_QUIT
@PLAY_VOLUME_06
		MOVE    AX,[PLAY_PREDICTED_SAMPLE]
		SHR     AX
		MOVE    [PLAY_PREDICTED_SAMPLE],AX
		SHR     AX
		SHR     AX
		SHR     AX
		SUB     [PLAY_PREDICTED_SAMPLE],AX
		ADDW    [PLAY_PREDICTED_SAMPLE],(32768-((32768/16)*7))
		JUMP	@PLAY_VOLUME_ADJ_QUIT
@PLAY_VOLUME_07
		MOVE    AX,[PLAY_PREDICTED_SAMPLE]
		SHR     AX
		ADD     AX,(32768-((32768/16)*8))
		MOVE    [PLAY_PREDICTED_SAMPLE],AX
		JUMP	@PLAY_VOLUME_ADJ_QUIT
@PLAY_VOLUME_08
		MOVE    AX,[PLAY_PREDICTED_SAMPLE]
		SHR     AX
		MOVE    [PLAY_PREDICTED_SAMPLE],AX
		SHR     AX
		SHR     AX
		SHR     AX
		ADD     AX,(32768-((32768/16)*9))
		ADD     [PLAY_PREDICTED_SAMPLE],AX
		JUMP	@PLAY_VOLUME_ADJ_QUIT
@PLAY_VOLUME_09
		MOVE    AX,[PLAY_PREDICTED_SAMPLE]
		SHR     AX
		MOVE    [PLAY_PREDICTED_SAMPLE],AX
		SHR     AX
		SHR     AX
		ADD     AX,(32768-((32768/16)*10))
		ADD     [PLAY_PREDICTED_SAMPLE],AX
		JUMP	@PLAY_VOLUME_ADJ_QUIT
@PLAY_VOLUME_0A
		MOVE    AX,[PLAY_PREDICTED_SAMPLE]
		SHR     AX
		SHR     AX
		SUB     [PLAY_PREDICTED_SAMPLE],AX
		SHR     AX
		SHR     AX
		SUB     [PLAY_PREDICTED_SAMPLE],AX
		ADDW    [PLAY_PREDICTED_SAMPLE],(32768-((32768/16)*11))
		JUMP	@PLAY_VOLUME_ADJ_QUIT
@PLAY_VOLUME_0B
		MOVE    AX,[PLAY_PREDICTED_SAMPLE]
		SHR     AX
		SHR     AX
		SUB     [PLAY_PREDICTED_SAMPLE],AX
		ADDW    [PLAY_PREDICTED_SAMPLE],(32768-((32768/16)*12))
		JUMP	@PLAY_VOLUME_ADJ_QUIT 
@PLAY_VOLUME_0C
		MOVE    AX,[PLAY_PREDICTED_SAMPLE]
		SHR     AX
		SHR     AX
		SHR     AX
		SUB     [PLAY_PREDICTED_SAMPLE],AX
		SHR     AX
		SUB     [PLAY_PREDICTED_SAMPLE],AX
		ADDW    [PLAY_PREDICTED_SAMPLE],(32768-((32768/16)*13))
		JUMP	@PLAY_VOLUME_ADJ_QUIT
@PLAY_VOLUME_0D
		MOVE    AX,[PLAY_PREDICTED_SAMPLE]
		SHR     AX
		SHR     AX
		SHR     AX
		SUB     [PLAY_PREDICTED_SAMPLE],AX
		ADDW    [PLAY_PREDICTED_SAMPLE],(32768-((32768/16)*14))
		JUMP	@PLAY_VOLUME_ADJ_QUIT
@PLAY_VOLUME_0E
		MOVE    AX,[PLAY_PREDICTED_SAMPLE]
		SHR     AX
		SHR     AX
		SHR     AX
		SHR     AX
		SUB     [PLAY_PREDICTED_SAMPLE],AX
		ADDW    [PLAY_PREDICTED_SAMPLE],(32768-((32768/16)*15))
		JUMP	@PLAY_VOLUME_ADJ_QUIT
@PLAY_VOLUME_0F
 
@PLAY_VOLUME_ADJ_QUIT
		MOVE	AX,[PLAY_PREDICTED_SAMPLE]
		RET
PLAY_VOLUME_ADJ_PROC   ENDF


; ==============================================================================
; ==============================================================================
RAMP_UP_PROC	 FUNCTION
		JBNZ	[USER_FLAG],_RAMP_UP_FLAG,@F

		OR	[USER_FLAG],_RAMP_UP_FLAG

		MOVE	AX,8000H
		MOVE	[LEFT_DAC],AX
		MOVE	[RIGHT_DAC],AX

;;--------------------------------------------------------
		OR    [SYSTEM_CONTROL],00001000B      ; DAC ON
		NOP
		OR    [SYSTEM_CONTROL],00001100B      ; EQ ON				
		NOP                                     

	MOVE	A,[PREDICTED_SAMPLE+1]
	MOVE	X,[PREDICTED_SAMPLE]

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~SOUND DEAL~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        			
		IF	SOUND_FUNCTION	SOUND_HAVLE
			SHR	AX
			ADD	A,80H
			MOVE	X,A
		ELSEIF	SOUND_FUNCTION	SOUND_ADD
			MOVE	X,80H
		ELSEIF	SOUND_FUNCTION	NONE
			MOVE	X,80H
		ENDIF	
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  

	CALL	ADPCM_RAMP_DAC_TO_LEVEL
;	CALL	DELAY_PROC                      ; WAIT DAC READY       
	OR      [SYSTEM_CONTROL],00001110B      ; AMP ON
;--------------------------------------------------------

@
		NOP
		RET
RAMP_UP_PROC	 ENDF
; ==============================================================================
DELAY_PROC		FUNCTION
			MOVE	[temp_ram],0
@@                	AND	[USER_FLAG],~_10MS_FLAG_FOR_DELAY
@                	JBZ	[USER_FLAG],_10MS_FLAG_FOR_DELAY,@B
			ADD	[temp_ram],1
			CMP	[temp_ram],3
			JC	@@B
    			RET
DELAY_PROC		ENDF
; ==============================================================================
RAMP_DOWN_PROC	FUNCTION

		AND	[USER_FLAG],~_RAMP_UP_FLAG

       	        move	x,80h
		Call	ADPCM_RAMP_DAC_TO_LEVEL
		MOVE    A,00H
              	MOVE    [LEFT_DAC],A
      	        MOVE	[RIGHT_DAC],A
;		CALL	DELAY_PROC

		AND    	[SYSTEM_CONTROL],11111101B      ; AMP OFF
		NOP
		AND    	[SYSTEM_CONTROL],11111001B      ; EQ OFF
		NOP
		AND	[SYSTEM_CONTROL],11110001B      ; ADC OFF
		NOP


		RET
RAMP_DOWN_PROC	ENDF
; ------------------------------------------------------------------------------
ADPCM_RAMP_DAC_TO_LEVEL		FUNCTION		; INPUT : X = TARGET LEVEL

		MOVE	[LEFT_DAC], 0
		MOVE	[RIGHT_DAC], 0

		MOVE	A, [LEFT_DAC+1]
		CMP	A, X
		JNE	ADPCM_NEED_RAMP
		MOVE	A, [RIGHT_DAC+1]
		CMP	A, X
		JNE	ADPCM_NEED_RAMP
		RET

ADPCM_NEED_RAMP		PUSH	PSR		; BACKUP PSR		
		PUSH	[IRQ_ENABLE]		; BACKUP IRQ_ENABLE 
		PUSH	[TIMER_CONTROL]		; BACKUP TIMER_CONTROL
		PUSH	[TIMER1_RELOAD]		; BACKUP TIMER1_RELOAD		
		PUSH	[TIMER1_DATA]			; BACKUP TIMER1_DATA
		; ---------------------------------------
		CLI
		MOVE	[TIMER1_RELOAD],(SYSTEM_CLOCK/64/(1024*1000/RAMP_TIME))-1
		MOVE	[TIMER1_DATA],0		; RESET TIMER VALUE
		MOVE	[TIMER_CONTROL],11100000B		; ENABLE T1(SYS_CLK/64)
		MOVE	[IRQ_ENABLE],00000010B		; ENABLE T1

ADPCM_WAIT_RAMP_T1_IRQ
	  	JBZ	[IRQ_STATUS],00000010B,ADPCM_WAIT_RAMP_T1_IRQ
		MOVE	[IRQ_STATUS],11111101B		; T1 ISR EOI

		CMP	X, [LEFT_DAC+1]
		JA	ADPCM_LEFT_RAMP_UP
		JE	ADPCM_CHK_RIGHT_RAMP
ADPCM_LEFT_RAMP_DOWN		SUBW	[LEFT_DAC],0020H
		JUMP	ADPCM_CHK_RIGHT_RAMP
ADPCM_LEFT_RAMP_UP
		ADDW	[LEFT_DAC],0020H
		; ---------------------------------------
ADPCM_CHK_RIGHT_RAMP
		CMP	X, [RIGHT_DAC+1]
		JA	ADPCM_RIGHT_RAMP_UP
		JE	ADPCM_CHK_RAMP_OK
ADPCM_RIGHT_RAMP_DOWN
		SUBW	[RIGHT_DAC],0020H
		JUMP	ADPCM_WAIT_RAMP_T1_IRQ
ADPCM_RIGHT_RAMP_UP
		ADDW	[RIGHT_DAC],0020H
		JUMP	ADPCM_WAIT_RAMP_T1_IRQ
		; ---------------------------------------
ADPCM_CHK_RAMP_OK
		CMP	X, [LEFT_DAC+1]
		JNE	ADPCM_WAIT_RAMP_T1_IRQ

		POP	[TIMER1_DATA]		; RESTORE TIMER1_DATA
		POP	[TIMER1_RELOAD]		; RESTORE TIMER1_RELOAD
		POP	[TIMER_CONTROL]		; RESTORE TIMER_CONTROL
		POP	[IRQ_ENABLE]		; RESTORE IRQ_ENABLE
		POP	PSR			  ; RESTORE PSR

		RET
ADPCM_RAMP_DAC_TO_LEVEL		ENDF


;-------------------------------------------------------------------------------
CHIP_INIT		FUNCTION
		MOVE	A, MTR_VALUE
		MOVE	MTR, A
		
		;disable watch_dog
		MOVE    [WATCH_DOG_CONTROL],010H	  ; DISABLE WATCH_DOG
		
		MOVE	A, DPLL_VALUE
		MOVE	[DPLL_CONTROL], A
		CALL	WAIT_CLOCK_STABLE		; 单

⌨️ 快捷键说明

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