亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ata_if.c

?? yampp的MP3資料 非常好大家來看一看
?? C
字號:

/*
  Copyright (C) 2001 Jesper Hansen <jesperh@telia.com>.

  This file is part of the yampp system.

  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  as published by the Free Software Foundation; either version 2
  of the License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software Foundation, 
  Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

#include <io.h>
#include <interrupt.h>
#include <progmem.h>

#include "types.h"
#include "delay.h"
#include "ata_if.h"
#include "uart.h"


//#define DEBUG_ATA	1

 
//----------------------------------------------------------------------------
// Select address and CS signals
//
// addressing bits
// 35 DA0	A0	0x01	Address Line 0
// 33 DA1	A1	0x02	Address Line 1
// 36 DA2	A2	0x04	Address Line 2
//
// chip selects
// 37 CS0	A3 	0x08	Command Block Select
// 38 CS1	A4	0x10	Control Block Select
//
//
//----------------------------------------------------------------------------
u08 SetAddress(u08 cs, u08 adr) 
{ 
	u16 i;
	
  	if (cs==CTRL)  
		i = adr+0x08;		// select A4 low -> CS1 -> CTRL
	else 
		i = adr+0x10;		// select A3 low -> CS0 -> CMD

	return *(u08 *) (i+0xE000);
	// dummy return to avoid optimization problems
}



//----------------------------------------------------------------------------
// Read data BYTE from Drive
//----------------------------------------------------------------------------
u08 ReadBYTE(u08 cs, u08 adr) 
{ 
  	u08 tmp; 

  	SetAddress(cs,adr); 

	cbi(MCUCR, SRE);	// disable RAM

	outp(0x00, DDRA);	// port A as input
	outp(0x00, DDRC);	// port C as input
	outp(0xff, PORTA);	// activate Pullups
	outp(0xff, PORTC);	// activate Pullups

	cbi(PORTB, 1);		// set DIOR lo
	asm volatile ("nop");	// allow pin change
	tmp = inp(PINA);	// read byte
	sbi(PORTB, 1);		// set DIOR hi
	sbi(MCUCR, SRE);	// enable RAM

  	return tmp;
}
 
 
//----------------------------------------------------------------------------
// Write data BYTE to Drive
//----------------------------------------------------------------------------
void WriteBYTE(u08 cs, u08 adr, u08 dat) 
{ 
  	SetAddress(cs,adr); 

	outp(0xff, DDRA);	// port A as output
	outp(0xff, DDRC);	// port C as output

	cbi(MCUCR, SRE);	// disable RAM
	asm volatile ("nop");	// allow pin change
	cbi(PORTB, 0);		// set DIOW lo
	asm volatile ("nop");	// allow pin change
	outp(dat, PORTA);	// write byte
	sbi(PORTB, 0);		// set DIOW hi
	sbi(MCUCR, SRE);	// enable RAM
}
 


void DiskErr(void)
{
	u08 b;

	sei();
	b = ReadBYTE(CMD,1);	
	PRINT("Error : "); 
	UART_Printfu08(b); 
	EOL();

/*	
	EOL();
	b = ReadBYTE(CMD,1);	
	PRINT("Error Reg : "); UART_Printfu08(b); EOL();
	b = ReadBYTE(CMD,2);
	PRINT("Sector Cnt: "); UART_Printfu08(b); EOL();
	b = ReadBYTE(CMD,3);
	PRINT("Sector Nbr: "); UART_Printfu08(b); EOL();
	b = ReadBYTE(CMD,4);
	PRINT("Cylindr Lo: "); UART_Printfu08(b); EOL();
	b = ReadBYTE(CMD,5);
	PRINT("Cylindr Hi: "); UART_Printfu08(b); EOL();
	b = ReadBYTE(CMD,6);
	PRINT("Device/Hd : "); UART_Printfu08(b); EOL();
	b = ReadBYTE(CMD,7);
	PRINT("Status    : "); UART_Printfu08(b); EOL();
*/
}


 
#define MINIBUFFERSIZE	16
u16 minibuffer[MINIBUFFERSIZE]; 

//----------------------------------------------------------------------------
// Read one or more sectors, identified by drive, head, track and sector
// Returns 0 if no error detected
//---------------------------------------------------------------------------- 
u08 ATA_Read_Sectors(	u08 Drive, 
                		u08 Head, 
                		u16 Track, 
                		u08 Sector,
                		u16 numsectors,
                		u08 *Buffer) 
{
  	u08 i,j,k;
  	u08 hi,lo,err = 0;
	u16 *pB = (u16*) Buffer;

  	// Prepare parameters...
  	WriteBYTE(CMD,6, 0xA0+(Drive ? 0x10:00)+Head); // CHS mode/Drive/Head

	while ( ( ReadBYTE(CMD,7) & (SR_BUSY|SR_DRDY) ) == SR_BUSY ); 	// Wait for ! BUSY

  	WriteBYTE(CMD,5, Track>>8);  	// MSB of track
  	WriteBYTE(CMD,4, Track);     	// LSB of track
  	WriteBYTE(CMD,3, Sector);    	// sector
  	WriteBYTE(CMD,2, numsectors); // # of sectors

  	// Issue read sector command...
  	WriteBYTE(CMD,7, 0x20);      // Read sector(s) command

	delay(5);					// wait 5 uS


	// for each sector requested 
//	for (i=0; i<(512/MINIBUFFERSIZE)*numsectors; i+=2) 	
	for (i=0; i<numsectors; i++) 	
	{

		// loop reading ALT STATUS until BUSY is cleared
		while ( ( ReadBYTE(CTRL,6) & SR_BUSY) == SR_BUSY ); 	// Wait for ! BUSY
	
	
		// then read STATUS register to reset interrupt
		err = ReadBYTE(CMD,7);
	
		if ( err & SR_ERR )		//fail on error
		{
			sei();
			PRINT("CMD ERR ");
			return 1;
		}

		if ( ! (err & SR_DRQ) )	// failure if DRQ not set
		{
			sei();
			PRINT("NO DATA ");
			return 1;
		}


		for (k=0; k < 256/MINIBUFFERSIZE; k++)
		{
			outp(0x00, DDRA);	// port A as input
			outp(0x00, DDRC);	// port C as input
			outp(0xff, PORTA);	// activate Pullups
			outp(0xff, PORTC);	// activate Pullups

			// setup addressing and chip selects
			SetAddress(CMD, 0); 

		
			cbi(MCUCR, SRE);	// disable RAM
	
			for (j=0;j<MINIBUFFERSIZE;j++)
			{	
				cbi(PORTB, 1);		// set DIOR lo
		
				asm volatile ("nop");	// allow pin change. This is absolutely needed !
			
				lo = inp(PINA);	// read lo byte
				hi = inp(PINC);	// read hi byte
			
				sbi(PORTB, 1);		// set DIOR hi
				
				minibuffer[j] = (hi<<8)+lo;
			}
	
			sbi(MCUCR, SRE);	// enable RAM
	
			for (j=0;j<MINIBUFFERSIZE;j++)
				*pB++ = minibuffer[j];
		}
	}
	

  // Return the error status

	return (err & SR_ERR) ? 1:0;
}


//----------------------------------------------------------------------------
// Read one sector or more sectors, identified by LBA (Logical Block Address)
// Returns 0 if no error detected
//---------------------------------------------------------------------------- 
u08 ATA_Read_Sectors_LBA(	u08 Drive, 
							u32 lba,
							u16 numsectors,
                       		u08 *Buffer)
{
   	u16 cyl, head, sect;
   	u08 r;

#ifdef DEBUG_ATA
	sei();
	PRINT("ATA LBA read ");
	UART_Printfu32(lba); UART_SendByte(' ');
	UART_Printfu16(numsectors); UART_SendByte(' ');
	UART_Printfu16((u16)Buffer); 
	EOL();
#endif

   	sect = (u16) ( lba & 0x000000ffL );
   	lba = lba >> 8;
   	cyl = (u16) ( lba & 0x0000ffff );
   	lba = lba >> 16;
   	head = ( (u16) ( lba & 0x0fL ) ) | 0x40;

   	r = ATA_Read_Sectors( Drive, head, cyl, sect, numsectors, Buffer );

	if (r)
		DiskErr();
   	return r;
}                            		


u08 ATA_SW_Reset(void)
{
//	PRINT("ATA SW RESET\r\n");
	WriteBYTE(CTRL, 6, 0x06);	// SRST and nIEN bits
    delay(10);	// 10uS delay
	WriteBYTE(CTRL, 6, 0x02);	// nIEN bit
    delay(10);	// 10 uS delay
    while ( (ReadBYTE(CMD,7) & (SR_BUSY|SR_DRDY)) == SR_BUSY ); // Wait for DRDY and not BUSY
  	return ReadBYTE(CMD, 7) + ReadBYTE(CMD, 1);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩免费看网站| 亚洲一区二区三区四区五区中文 | 91精品国产欧美一区二区18| 亚洲三级在线播放| bt7086福利一区国产| 国产婷婷一区二区| 激情五月婷婷综合网| 欧美大片日本大片免费观看| 免费观看91视频大全| 91精品国产入口| 一二三四区精品视频| www.久久久久久久久| 国产日韩欧美精品电影三级在线 | 国产精品美女久久久久久| 久久精品国产99国产| 国产欧美日韩精品a在线观看| 裸体一区二区三区| 精品久久99ma| 国产一区二区在线免费观看| 久久这里只有精品视频网| 韩国v欧美v日本v亚洲v| 3atv一区二区三区| 精品一区二区国语对白| 久久久一区二区三区| 国产91精品一区二区麻豆网站| 久久久国产一区二区三区四区小说| 激情图片小说一区| 欧美国产精品劲爆| 99久久久免费精品国产一区二区| 久久影视一区二区| 91香蕉视频mp4| 亚洲丰满少妇videoshd| 精品福利二区三区| 成人美女在线视频| 亚洲综合色噜噜狠狠| 日韩一二在线观看| 国产精品1区2区3区| 最好看的中文字幕久久| 欧美色欧美亚洲另类二区| 六月丁香综合在线视频| 欧美国产禁国产网站cc| 91麻豆自制传媒国产之光| 亚洲另类在线视频| 精品日产卡一卡二卡麻豆| eeuss影院一区二区三区| 亚洲国产一区二区在线播放| 日韩亚洲欧美在线| av一区二区不卡| 日韩高清不卡一区二区| 国产精品免费久久久久| 欧美午夜在线观看| 久久福利视频一区二区| 中文字幕免费不卡在线| 7777精品伊人久久久大香线蕉的 | 亚洲欧美另类综合偷拍| 3atv在线一区二区三区| av一区二区三区在线| 亚洲与欧洲av电影| 国产欧美日韩另类视频免费观看| 欧美日韩成人一区二区| 成人黄色大片在线观看| 青青草一区二区三区| 亚洲欧洲精品一区二区三区不卡| 欧美猛男gaygay网站| 成人sese在线| 蜜乳av一区二区三区| 亚洲免费av高清| 国产片一区二区| 日韩色在线观看| 欧美性感一类影片在线播放| 成人激情动漫在线观看| 久久国产精品72免费观看| 一区二区成人在线| 中文欧美字幕免费| 日韩久久久久久| 欧美一区国产二区| 欧美日韩免费在线视频| 一本一道综合狠狠老| 成人污视频在线观看| 韩国视频一区二区| 一区二区三区在线免费| 国产午夜精品一区二区三区四区| 久久一二三国产| 欧美剧情片在线观看| 色综合天天狠狠| 国产99精品国产| 国产一区二区三区蝌蚪| 麻豆免费看一区二区三区| 午夜欧美一区二区三区在线播放| 亚洲免费观看高清完整版在线观看 | 国产无人区一区二区三区| 欧美男同性恋视频网站| 91黄色免费版| 色天天综合久久久久综合片| 成人小视频在线观看| 免费成人深夜小野草| 丝瓜av网站精品一区二区| 一区二区三区视频在线看| 中文字幕日本不卡| 亚洲欧美日韩成人高清在线一区| 国产精品女人毛片| 国产精品理论片在线观看| 国产亚洲欧美在线| 国产欧美一二三区| 国产精品美女久久久久久| 亚洲日本va在线观看| 亚洲三级电影网站| 亚洲精品免费电影| 天天综合色天天综合| 蜜桃视频在线观看一区二区| 美女网站色91| 国产激情一区二区三区四区| 国产+成+人+亚洲欧洲自线| jizz一区二区| 欧美亚洲日本一区| 欧美三级三级三级爽爽爽| 91精品一区二区三区在线观看| 精品久久久久久无| 中文字幕一区二区三区不卡在线| 中文字幕在线不卡一区| 久久精子c满五个校花| 亚洲欧美一区二区在线观看| 亚洲精品美国一| 日精品一区二区| 国产成人免费xxxxxxxx| 色婷婷久久久久swag精品| 欧洲视频一区二区| 欧美午夜精品久久久| 日韩一区二区三区在线| 国产三级精品三级在线专区| 亚洲天堂免费看| 日韩va欧美va亚洲va久久| 国产乱子伦视频一区二区三区| 北条麻妃一区二区三区| 在线亚洲免费视频| 日韩一区二区三区四区| 久久综合久色欧美综合狠狠| 中文字幕 久热精品 视频在线| 亚洲国产裸拍裸体视频在线观看乱了| 蜜桃视频在线观看一区二区| 99视频一区二区| 欧美一级理论片| 亚洲欧美在线视频观看| 男女性色大片免费观看一区二区| 国产不卡在线播放| 欧洲在线/亚洲| 国产女同互慰高潮91漫画| 亚洲成人一二三| 成人av电影观看| 欧美军同video69gay| 一二三区精品视频| 99国产精品久| 国产精品午夜久久| 国产成人亚洲综合a∨婷婷 | 国产在线国偷精品产拍免费yy| 欧美在线看片a免费观看| 国产精品高潮呻吟久久| 国产一区二区电影| 精品三级在线看| 日本亚洲三级在线| 欧美老女人在线| 五月婷婷久久丁香| 欧美日韩在线播放三区四区| 亚洲专区一二三| 91福利在线播放| 亚洲一区二区三区爽爽爽爽爽| 色噜噜狠狠色综合欧洲selulu| 亚洲视频一区二区在线观看| 99视频精品在线| 亚洲欧美日韩在线| 日本精品视频一区二区| 一区av在线播放| 欧美日韩在线播放一区| 日韩电影免费在线观看网站| 91精品国产色综合久久不卡蜜臀| 欧美a级一区二区| 久久一区二区视频| 懂色av一区二区三区免费观看 | 欧美一级日韩免费不卡| 日韩激情在线观看| 26uuu久久综合| 成人激情小说乱人伦| 亚洲精品成人少妇| 欧美精品丝袜久久久中文字幕| 日韩不卡在线观看日韩不卡视频| 欧美xxx久久| 成人精品免费视频| 亚洲在线观看免费| 日韩午夜中文字幕| 国产99久久久国产精品潘金网站| 中文字幕亚洲成人| 欧美日韩日日摸| 国产中文字幕一区| 亚洲天堂网中文字| 91精品国产综合久久久久久| 久久成人免费电影| 中文字幕色av一区二区三区| 欧美四级电影网| 精品无人区卡一卡二卡三乱码免费卡| 国产色产综合色产在线视频|