📄 mpc_eep.asm
字号:
;-----------------------------------------------;
; EEPROM - Save volume setting
save_volume:
ldi r17,eeVolume ; Compare stored value to current value
rcall read_eep ;
lds r17,Volume ;
cp r16,r17 ; /
breq PC+4 ; If changed, save current value
mov r16,r17 ;
ldi r17,eeVolume ;
rcall write_eep ; /
ret
;-----------------------------------------------;
; EEPROM - Load volume setting
load_volume:
ldi r17,eeVolume ; Read EEPROM
rcall read_eep ; /
cpi r16,VOLMAX-3 ; If too large, reset volume value
brcs PC+2 ;
ldi r16,0x20 ; /
sts Volume,r16
ret
;-----------------------------------------------;
; EEPROM - Save resume status
save_track:
sbrc _PbStat,1 ; Save track parms (r10-r15)
rjmp PC+3 ;
ldi r16,-1 ;
mov _CntH,r16 ;
ldiw X,10 ;
ldi r17,eeTrkPrm ;
ld r16,X+ ;
rcall write_eep ;
inc r17 ;
cpi r17,eeTrkPrm+6 ;
brcs PC-4 ; /
lds r16,TocCrc ; Save TOC CRC
ldi r17,eeTocCrc ;
rcall write_eep ;
lds r16,TocCrc+1 ;
ldi r17,eeTocCrc+1 ;
rcall write_eep ; /
lds r16,TrkIdx ; Save track index
ldi r17,eeTrack ;
rcall write_eep ; /
lds r16,Random ; Save random base
ldi r17,eeRandom ;
rcall write_eep ; /
ret
;-----------------------------------------------;
; EEPROM - Load resume status
;
; Call: none
; Ret: Track = Start track index
; r18 = Previous random base
; Z = 1:Start from top of track
; _PageX,_CntX = invalid
; 0:Start from stopped position
; _PageX,_CntX = track parms to start
load_track:
sts TrkIdx,_0 ; 1st track
clr r18 ; Clear random base (incremental play)
ldi r17,eeTocCrc ; Check medium change (compare TOC CRC).
rcall read_eep ; if changed, start from 1st track.
lds r17,TocCrc ;
cp r16,r17 ;
brne ldt_err ;
ldi r17,eeTocCrc+1 ;
rcall read_eep ;
lds r17,TocCrc+1 ;
cp r16,r17 ;
brne ldt_err ; /
ldi r17,eeTrack ; Check terminated status
rcall read_eep ; if not saved, start from 1st track.
cpi r16,-1 ; else load track index to resume
breq ldt_err ;
sts TrkIdx,r16 ; /
ldi r16,-1 ; Erase previous track status
cli ;
rcall write_eep ;
sei ; /
ldi r17,eeRandom ; Load random base
rcall read_eep ;
mov r18,r16 ; /
ldiw Z,10 ; Load track parms (r10-r15)
ldi r17,eeTrkPrm ; if in track gap, start from top of track.
rcall read_eep ;
st Z+,r16 ;
inc r17 ;
cpi r17,eeTrkPrm+6 ;
brcs PC-4 ;
cpi r16,-1 ; /
ret
ldt_err:sez
ret
;-----------------------------------------------;
; EEPROM - Read/Write EEPROM
;
; Call: r16 = Data for write
; r17 = EEPROM address
; Ret: r16 = Read data
;
; NOTE: All interrupts must be stopped when
; write_eep routine being executed.
read_eep:
out EEARL,r17
sbi EECR,EERE
in r16,EEDR
ret
write_eep:
out EEARL,r17
out EEDR,r16
sbi EECR,EEMWE
sbi EECR,EEWE
sbic EECR,EEWE
rjmp PC-1
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -