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		

Questions:


file: /Techref/microchip/idecdrom.htm, 19KB, , updated: 2009年1月25日 23:01, local time: 2025年9月5日 10:40,
40.74.122.252:LOG IN

©2025 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE!

<A HREF="http://massmind.org/techref/microchip/idecdrom.htm"> microchip idecdrom</A>

After you find an appropriate page, you are invited to your to this massmind site! (posts will be visible only to you before review) Just type a nice message (short messages are blocked as spam) in the box and press the Post button. (HTML welcomed, but not the <A tag: Instead, use the link box to link to another page. A tutorial is available Members can login to post directly, become page editors, and be credited for their posts.


Link? Put it here:
if you want a response, please enter your email address:
Attn spammers: All posts are reviewed before being made visible to anyone other than the poster.
Did you find what you needed?

Welcome to massmind.org!

Welcome to massmind.org!

.

AltStyle によって変換されたページ (->オリジナル) /