IDE@ CDROM@
;CDROM IDE INTERFACE
;TESTED ON MODELS CREATIVE SB CR-581-J (QUAD SPEED)
;& GOLDSTAR (LG) CRD-8400C (40X SPEED)
;
;SHORT PROGRAMME TO CONTROL A CDROM VIA THE IDE
;ONLY SENDS A FEW COMMANDS BUT ITS A START
;Ryan Pogge says:
;The next step is to read the TOC and create some type of list from that on the PIC
;looks like it is a matter of sending 8c 0 e 0 0 0 0 , and getting 9 bytes back.
;anyone who is interested I have a couple of links that may be of some use
;http://www.geocities.com/SiliconValley/Hardware/2342/mp3player.html this is a 68HC11 based MP3 player with an IDE CD-ROM, I suspect this will have mush pertinate info.
;http://www-stu.cai.cam.ac.uk/~atm26/electronics/panasoniccd.html list of error codes
;http://www.mp3ar.com/ (this is a cd based mp3 player with free source code!)
;http://www.spectsoft.com/mp3tech/ (good CD, MP3, and IDE stuff here)
;http://www.angelfire.com/ms/mp3player/page17.html
;http://www.faqs.org/faqs/pc-hardware-faq/enhanced-IDE/part2/
;http://pages.hotbot.com/cooking/anton_verheijen/main.html
;http://www.imbdev.com/ (MAS3507 proto boards)
;COMMANDS SENT DEPENDING ON PORTB PINS 5/4/3 & RE2
;EJECT/LOAD/PLAY STATED MSF/ STOP.
;CURRENTLY SUPPORTS NO INTERRUPT HANDLING OR ERROR CONDITIONS
;RETURNED FROM IDE
;SET YOUR CDROM TO MASTER DEVICE
;**********************************************************************
;SEE DOC ATA Packet Interface for CD-ROMs SFF-8020i
; Filename: COM1.asm
; Date:
; File Version: VER1
;
; Author:ROB BOARDMAN *
; Company:
;**********************************************************************
;USING 16MHZ CRYSTAL & PIC NO OTHER IC'S REQUIRED MAY WORK AT 20MHZ
;SOME PINS ON PORTB ARE SWITCH INPUTS
;IF USING RE2 AS SWITCH INPUT ADD PULLUP RESISTOR
;PIN CONNECTIONS
;
; PIC IDE *
; PORTA
; 0 37 CS0
; 1 38 CS1
; 2 35 A0
; 3 33 A1
; 4 36 A2
; 5 34 PDIAG
; PORTB
; 0 1 RESET
; 1 27 IORDY
; 2 31 IRQ
; 3
; 4
; 5
; 6
; 7
; PORTC
; 0 3 D0
; 1 5 D1
; 2 7 D2
; 3 9 D4
; 4 11 D5
; 5 13 D6
; 6 15 D7
; M. Adam Davis says:
; it looks like you've almost got the listing backwards...
; Is it supposed to be:
; PORTC
; 0 17 D0
; 1 15 D1
; 2 13 D2
; 3 11 D3
; 4 9 D4
; 5 7 D5
; 6 5 D6
; 7 3 D7
; PORTD
; 0 4 D8
; 1 6 D9
; 2 8 D10
; 3 10 D11
; 4 12 D12
; 5 14 D13
; 6 16 D14
; 7 18 D15
; PORTE
; 0 25 nDIOR
; 1 23 nDIOW
; 2 GND
; 19 GND
; 22 GND
; 24 GND
; 26 GND
; 30 GND
; 40 GND
;This example has a couple of switches connected for various CD functions as follows
;RB3 EJECT DISC internal pullup
;RB4 STOP DISC internal pullup
;RB5 PLAY DISC internal pullup
;RE2 LOAD DISC Note use pull resistor
;*************************************************************************
;*************************************************************************
;*************************************************************************
;*************************************************************************
list p=16f877 ; list directive to define processor
#include <p16f877.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF
;***** VARIABLE DEFINITIONS
DELAY0 EQU 0X2C
DELAY1 EQU 0X2D
DELAY2 EQU 0X2E
FLAGREG EQU 0X2F
#DEFINE ERROR 0X2F,0 ;ERROR STATUS
#DEFINE SECONDWR 0X2F,1
TEMP1 EQU 0X30
TEMP EQU 0X31
TEMP0 EQU 0X32
REGISTER EQU 0X33
ACCA EQU 0X34
PACK EQU 0X35
TEXT EQU 0X36
status_temp EQU 0X3E
w_temp EQU 0X3F
CTRL EQU 0
CMD EQU 1
DRIVE0 EQU 0
;**************************************************
;PIN ASSIGNMENTS TO IDE
#DEFINE nCS1FX 0X05,0
#DEFINE nCS3FX 0X05,1
#DEFINE DA0 0X05,2
#DEFINE DA1 0X05,3
#DEFINE DA2 0X05,4
#DEFINE nDASP 0X05,5
#DEFINE nDIOR 0X09,0
#DEFINE nDIOW 0X09,1
#DEFINE INTRQ 0X06,2
#DEFINE IORDY 0X06,1
#DEFINE RESET 0X06,0
;***************************************************
;THESE ARE SIGNALS WHICH END UP ON PORTA
;ADDRESSES VARIOUS REGISTERS WITHIN THE IDE DEVICE
COMMANDREG EQU B'00011110' ;WRITE
STATUSREG EQU B'00011110' ;READ
DATAREG EQU B'00000010'
;BITS WITHIN STATUS REG OF IDE
BSY EQU 7
DRQ EQU 3
;BITS WITHIN Interrupt Reason Register
CoD EQU 0
IO EQU 1
#DEFINE DELAYS
;**********************************************************************
ORG 0x000
NOP
clrf PCLATH ; ensure page bits are cleared
goto init ;
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;**************************************************************************
;**************************************************************************
; initialization routine
;SETUP ALL PORTS
init BSF STATUS,RP0 ;SET PAGE 1
MOVLW B'00100000' ;
MOVWF TRISA
MOVLW B'00111110' ;
MOVWF TRISB
MOVLW B'11111111'
MOVWF TRISC
MOVLW B'11111111'
MOVWF TRISD
MOVLW B'00000100'
MOVWF TRISE
MOVLW B'10000110'
MOVWF ADCON1
BCF OPTION_REG,NOT_RBPU ;PULLUPS ON
BCF STATUS,RP0 ;BACK TO PAGE 0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
;*********************************************************
BCF RESET ;SETUPS IDE AND RESETS
CALL PAUSE
bsf nCS1FX
BSF nCS3FX
BSF nDIOR
BSF nDIOW
CALL PAUSE
CALL PAUSE
BSF RESET
call PAUSE
CALL PAUSE
CALL PAUSE
CALL PAUSE
CALL PAUSE
CLRF FLAGREG
GOTO START
;***************************************
;***************************************
;***************************************
PAUSE
IFDEF DELAYS
CLRWDT
MOVLW .255 ;
MOVWF DELAY0 ;
DELLP DECFSZ DELAY0 ;
GOTO DELLP ;
ENDIF
RETURN
;************************************************************************
WRITEIDE BSF nDIOW ;PUTS DATA FROM TEMP0 & TEMP1 REGISTERS
MOVF REGISTER,W ;ON TO IDE DATABUS LINE D0-D15 THEN TOGGLES
MOVWF PORTA ;nDIOW PIN (WRITE INSTRUCTION)
BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISC
MOVWF TRISD
BCF STATUS,RP0
MOVF TEMP0,W
MOVWF PORTC
MOVF TEMP1,W
MOVWF PORTD
BCF nDIOW
BSF nDIOW
BSF STATUS,RP0 ;SET PAGE 1
MOVLW B'11111111' ;
MOVWF TRISC
MOVWF TRISD
BCF STATUS,RP0
RETURN
;******************************************************************
READIDE NOP ;READS IDE DATA BUS D0-D15
BCF nDIOR ;PLACES DATA INTO TEMP0 & TEMP1 REGISTERS
BSF nDIOR
MOVF PORTC,W
MOVWF TEMP0
MOVF PORTD,W
MOVWF TEMP1
RETURN
;********************************************************************
CHKCoD BCF ERROR ;CoD=1 IO=0
MOVLW B'10001010' ;ERROR CHECKING NOT YET SUPPORTED
MOVWF PORTA
CALL READIDE
BTFSS TEMP0,CoD
BSF ERROR
BTFSC TEMP0,IO
BSF ERROR
NOP
BTFSC ERROR
GOTO TEST5
RETURN
TEST5 INCF TEMP
GOTO CHKCoD
;*******************************************************************
CHKDRQ BCF ERROR ;BSY=0 DRQ=1
CALL RDSTATUS ;;ERROR CHECKING NOT YET SUPPORTED
BTFSC TEMP0,BSY
BSF ERROR
BTFSS TEMP0,DRQ
BSF ERROR
NOP
BTFSC ERROR
GOTO TEST6
RETURN
TEST6 INCF TEMP
GOTO CHKDRQ
;******************************************************************
;*******************************************************************
;ROUTINE SENDS 12 BYTE PACKET TO IDE DEVICE
SENDCOM CALL CHKSTATUS ;DO CHECK
;***********************************
MOVLW COMMANDREG ;POINT TO COMMAND REG THEN SEND
MOVWF REGISTER ;PACKET OPCODE COMMAND
MOVLW 0XA0
MOVWF TEMP0
CALL WRITEIDE
;************************************
;CHECK STATUS OF IDE
CALL CHKCoD ;CHK CoD & IO & BSY
CALL CHKDRQ ;WAIT FOR DRQ=1
;************************************
MOVLW DATAREG ;POINT TO DATA REGISTER THEN SEND
MOVWF REGISTER ;12 BYTES TO DATA REGISTER WITHIN IDE (1 PACKET)
CLRF ACCA
NXREG2 CALL PACKET
MOVWF TEMP0
INCF ACCA
INCF PACK
CALL PACKET
MOVWF TEMP1
CALL WRITEIDE
INCF PACK
INCF ACCA
MOVLW 0X0C
SUBWF ACCA, 0
BTFSS STATUS,Z
GOTO NXREG2
RETLW 00H
;END OF PACKET RETURN TO MAIN PROGRAM
;*******************************************************************
;12 BYTE LOOKUP TABLE FOR CDROM COMMANDS
;DEPENDING ON THE VALUE OF PACK LOOKUP JUMPS TO
;RETURNS WITH 1 OF 12 BYTES
;
PACKET MOVF PACK,W
BCF PCLATH,0
BCF PCLATH,1
MOVF PACK,0
ADDWF PCL
;*************************
RETLW 0X1B ;0 STOP DISC COMMAND
RETLW 0X00 ;1
RETLW 0X00 ;2
RETLW 0X00 ;3
RETLW 0X00 ;4
RETLW 0X00 ;5
RETLW 0X00 ;6
RETLW 0X00 ;7
RETLW 0X00 ;8
RETLW 0X00 ;9
RETLW 0X00 ;10
RETLW 0X00 ;11
;******************************************
RETLW 0X47 ;0 0XC0
RETLW 0X00 ;1 THIS EXAMPLE PLAYS AT 1min in for 30sec's
RETLW 0X00 ;2 PLAY DISC AT TIME STATED MIN SEC 1/75/SEC
RETLW 0X01 ;3 MINUTES STARTING POINT
RETLW 0X00 ;4 SECONDS STARTING POINT
RETLW 0X00 ;5 1/75 SEC STARTING POINT (N/A)
RETLW 0X01 ;6 MINUTES STOPING POINT
RETLW 0X1E ;7 SECONDS STOPING POINT
RETLW 0X00 ;8 1/75 STOPPING POINT (N/A)
RETLW 0X00 ;9
RETLW 0X00 ;10
RETLW 0X00 ;11
;******************************************
RETLW 0X1B ;0 0X18
RETLW 0X00 ;1 EJECT DISC COMMAND
RETLW 0X00 ;2
RETLW 0X00 ;3
RETLW 0X02 ;4
RETLW 0X00 ;5
RETLW 0X00 ;6
RETLW 0X00 ;7
RETLW 0X00 ;8
RETLW 0X00 ;9
RETLW 0X00 ;10
RETLW 0X00 ;11
;******************************************
RETLW 0X1B ;0 0X24
RETLW 0X00 ;1 LOAD DISC COMMAND
RETLW 0X00 ;2
RETLW 0X00 ;3
RETLW 0X03 ;4
RETLW 0X00 ;5
RETLW 0X00 ;6
RETLW 0X00 ;7
RETLW 0X00 ;8
RETLW 0X00 ;9
RETLW 0X00 ;10
RETLW 0X00 ;11
;******************************************
RETLW 0X43 ;0 0X30
RETLW 0X00 ;1
RETLW 0X00 ;2
RETLW 0X00 ;3
RETLW 0X00 ;4
RETLW 0X00 ;5
RETLW 0X00 ;6
RETLW 0X00 ;7
RETLW 0X08 ;8
RETLW 0X00 ;9
RETLW 0X00 ;10
RETLW 0X00 ;11
;******************************************
;******************************************
WRITEHD MOVLW B'10011010' ;WRITE TO HEAD DEVICE REG WITHIN IDE
MOVWF REGISTER
MOVLW B'10100000' ;SET CDROM HEAD REG TO MASTER
MOVWF TEMP0
CLRF TEMP1
CALL WRITEIDE
RETURN
RDHD MOVLW B'10011010' ;READS HEAD REG
MOVWF PORTA ;I USED THIS TO CHECK
CALL READIDE ;IF CDROM WAS SET AS MASTER
RETURN
RDSTATUS MOVLW B'10011110' ;READS STATUS REGISTER WITHIN IDE
MOVWF PORTA
CALL READIDE
RETURN
CHKSTATUS BCF ERROR
CALL RDSTATUS
BTFSC TEMP0,BSY
BSF ERROR
BTFSC TEMP0,DRQ
BSF ERROR
NOP
BTFSC ERROR
GOTO TEST4
RETURN
TEST4 INCF TEMP
GOTO CHKSTATUS
;*****************************************
;LOADS PACK REGISTER FOR LOOKUP TABLE
;THEN CALLS ROUTINE TO SEND 12 BYTES (1 PACKET)
PLAY MOVLW 0X0C
MOVWF PACK
CALL SENDCOM
RETURN
STOP MOVLW 0X00
MOVWF PACK
CALL SENDCOM
RETURN
EJECT MOVLW 0X18
MOVWF PACK
CALL SENDCOM
RETURN
LOADDISC MOVLW 0X24
MOVWF PACK
CALL SENDCOM
RETURN
;****************************************************************************
START CALL PAUSE
CALL CHKSTATUS
CALL PAUSE
NOP
CALL WRITEHD ;SETUP FOR MASTER DRIVE
NOP
CALL PAUSE
CALL RDHD ;READ DRIVEHEAD (CHECKING MASTER DRIVE SETTING)OPTIONAL
CALL PAUSE
;NOTE THERE IS NO DEBOUNCE SOFTWARE AT THE MOMENT
;SO RELEASE THE BUTTON QUICKLY
TEST1 BTFSS PORTB,5
CALL PLAY
BTFSS PORTB,4
CALL STOP
BTFSS PORTB,3
CALL EJECT
BCF ERROR
BTFSS PORTE,2
CALL LOADDISC
CALL PAUSE
CALL RDSTATUS
GOTO TEST1
END