📄 ata_wc.asm
字号:
list p=16f877,r=hex
include "pic16f877.inc"
include "main.inc"
include "ata.inc"
global AtaUpdate
global AtaInit
extern Delay1ms
extern Delay10ms
extern Delay200ms
extern Delay5s
_rom1 code
AtaUpdate:
movf KeyEvent,w
xorlw 0x00
btfsc status,z
return
bsf portd,LED_STATUS
movlw D'10'
movwf AtaErrorRetries
btfsc KeyState,KEY_STATE_OPEN_CLOSE
goto Iu2
btfss KeyEvent,KEY_EVENT_PLAY_STOP
goto Iu2
btfsc KeyState,KEY_STATE_PLAY_STOP
goto Kst
Kpl: call AtaCmdReadToc
movf TrackStartMSF_M,w
movwf AtaPacket+3
movf TrackStartMSF_S,w
movwf AtaPacket+4
movf TrackStartMSF_F,w
movwf AtaPacket+5
call AtaCmdPlayAudio
bsf KeyState,KEY_STATE_PLAY_STOP
bcf KeyState,KEY_STATE_PAUSE_ONOFF
goto IuEnd
Kst: call AtaCmdStopAudio
bcf KeyState,KEY_STATE_PLAY_STOP
goto IuEnd
Iu2: btfsc KeyState,KEY_STATE_OPEN_CLOSE
goto Iu3
btfsc KeyState,KEY_STATE_PAUSE_ONOFF
goto Iu3
btfss KeyEvent,KEY_EVENT_NEXT
goto Iu3
incf TrackStartNr,f
btfss KeyState,KEY_STATE_PLAY_STOP
goto IuEnd
call AtaCmdReadSubChannel
incf TrackCurrentNr,w
movwf TrackStartNr
call AtaCmdReadToc
movf TrackStartMSF_M,w
movwf AtaPacket+3
movf TrackStartMSF_S,w
movwf AtaPacket+4
movf TrackStartMSF_F,w
movwf AtaPacket+5
call AtaCmdPlayAudio
goto IuEnd
Iu3: btfsc KeyState,KEY_STATE_OPEN_CLOSE
goto Iu4
btfsc KeyState,KEY_STATE_PAUSE_ONOFF
goto Iu4
btfss KeyEvent,KEY_EVENT_PREVIOUS
goto Iu4
decf TrackStartNr,f
btfss KeyState,KEY_STATE_PLAY_STOP
goto IuEnd
call AtaCmdReadSubChannel
decf TrackCurrentNr,w
movwf TrackStartNr
call AtaCmdReadToc
movf TrackStartMSF_M,w
movwf AtaPacket+3
movf TrackStartMSF_S,w
movwf AtaPacket+4
movf TrackStartMSF_F,w
movwf AtaPacket+5
call AtaCmdPlayAudio
goto IuEnd
Iu4: btfss KeyEvent,KEY_EVENT_OPEN_CLOSE
goto Iu5
btfsc KeyState,KEY_STATE_OPEN_CLOSE
goto Kcl
Kop: btfsc KeyState,KEY_EVENT_PLAY_STOP
call AtaCmdStopAudio
call AtaCmdOpenDoor
bsf KeyState,KEY_STATE_OPEN_CLOSE
goto IuEnd
Kcl: call AtaCmdCloseDoor
call AtaCmdStopAudio
bcf KeyState,KEY_STATE_PLAY_STOP
bcf KeyState,KEY_STATE_PAUSE_ONOFF
bcf KeyState,KEY_STATE_OPEN_CLOSE
movlw 0x01
movwf TrackStartNr
goto IuEnd
Iu5: btfsc KeyState,KEY_STATE_OPEN_CLOSE
goto IuEnd
btfss KeyEvent,KEY_EVENT_PAUSE_ONOFF
goto IuEnd
btfss KeyState,KEY_STATE_PLAY_STOP
goto IuEnd
btfsc KeyState,KEY_STATE_PAUSE_ONOFF
goto Kpf
Kpo: call AtaCmdPauseOn
bsf KeyState,KEY_STATE_PAUSE_ONOFF
goto IuEnd
Kpf: call AtaCmdPauseOff
bcf KeyState,KEY_STATE_PAUSE_ONOFF
goto IuEnd
IuEnd:
bcf portd,LED_STATUS
return
AtaInit:
bsf portd,LED_STATUS
call AtaReset
call Delay5s
call Delay5s
movlw D'12'
movwf AtaCounter
movlw AtaPacket
movwf fsr
Ai1: clrf indf
incf fsr,f
decfsz AtaCounter,f
goto Ai1
call AtaCmdStopAudio
#ifdef LCD
call AtaCmdInquiry
#endif
bcf portd,LED_STATUS
return
AtaReset:
bcf portd,ATA_RST
call Delay200ms
bsf portd,ATA_RST
call Delay200ms
return
AtaCmdStopAudio:
movlw 0x4e
movwf AtaPacket
call AtaWritePacket
call AtaReadPacketEmpty
xorlw 0x01
btfss status,z
return
decfsz AtaErrorRetries,f
goto AtaCmdStopAudio
call AtaReset
return
AtaCmdPauseOn:
movlw 0x4b
movwf AtaPacket
call AtaWritePacket
call AtaReadPacketEmpty
btfsc status,z
return
decfsz AtaErrorRetries,f
goto AtaCmdPauseOn
call AtaReset
return
AtaCmdPauseOff:
movlw 0x4b
movwf AtaPacket
movlw 0x01
movwf AtaPacket+8
call AtaWritePacket
call AtaReadPacketEmpty
btfsc status,z
return
decfsz AtaErrorRetries,f
goto AtaCmdPauseOff
call AtaReset
return
AtaCmdPlayAudio:
movlw 0x47
movwf AtaPacket
movf TrackLeadOutMSF_M,w
movwf AtaPacket+6
movf TrackLeadOutMSF_S,w
movwf AtaPacket+7
movf TrackLeadOutMSF_F,w
movwf AtaPacket+8
call AtaWritePacket
call AtaReadPacketEmpty
btfsc status,z
return
decfsz AtaErrorRetries,f
goto AtaCmdPlayAudio
call AtaReset
return
AtaCmdCloseDoor:
movlw 0x1b
movwf AtaPacket
movlw 0x03
movwf AtaPacket+4
call AtaWritePacket
call AtaReadPacketEmpty
btfsc status,z
return
decfsz AtaErrorRetries,f
goto AtaCmdCloseDoor
call AtaReset
return
AtaCmdOpenDoor:
movlw 0x1b
movwf AtaPacket
movlw 0x02
movwf AtaPacket+4
call AtaWritePacket
call AtaReadPacketEmpty
btfsc status,z
return
decfsz AtaErrorRetries,f
goto AtaCmdOpenDoor
call AtaReset
return
#ifdef LCD
AtaCmdInquiry:
movlw 0x12
movwf AtaPacket
movlw 0xff
movwf AtaPacket+4
call AtaWritePacket
call AtaReadPacketInquiry
btfsc status,z
return
decfsz AtaErrorRetries,f
goto AtaCmdInquiry
call AtaReset
return
#endif
AtaCmdReadToc:
movlw 0x43
movwf AtaPacket
movlw 0x02
movwf AtaPacket+1
movlw 0xff
movwf AtaPacket+7
movlw 0xff
movwf AtaPacket+8
call AtaWritePacket
call AtaReadPacketToc
btfsc status,z
return
decfsz AtaErrorRetries,f
goto AtaCmdReadToc
call AtaReset
return
AtaCmdReadSubChannel:
movlw 0x42
movwf AtaPacket
movlw 0x02
movwf AtaPacket+1
movlw 0x40
movwf AtaPacket+2
movlw 0x01
movwf AtaPacket+3
movlw 0xff
movwf AtaPacket+7
movlw 0xff
movwf AtaPacket+8
call AtaWritePacket
call AtaReadPacketSubChannel
btfsc status,z
return
decfsz AtaErrorRetries,f
goto AtaCmdReadSubChannel
call AtaReset
return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -