📄 adpcm_def.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 + -