From 5fa55e39434b7ae84fdb2ad330bc2557e165ef42 Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Sat, 2 Jun 2012 23:04:30 +0000 Subject: [PATCH] todays work --- .../P8000_WDC_Emulator/Debug/Makefile | 4 +- .../P8000_WDC_Emulator.cproj | 5 +- .../P8000_WDC_Emulator/wdc_drv_mmc.c | 60 +++++-- .../P8000_WDC_Emulator/wdc_if_disk.c | 13 +- .../P8000_WDC_Emulator/wdc_if_disk.h | 5 +- .../P8000_WDC_Emulator/wdc_if_p8000.h | 4 +- .../P8000_WDC_Emulator/wdc_main.c | 148 ++++++++++++++++-- .../P8000_WDC_Emulator/wdc_main.h | 39 +++-- 8 files changed, 222 insertions(+), 56 deletions(-) diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile b/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile index bace23e..fb2a763 100755 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile @@ -110,7 +110,7 @@ OUTPUT_FILE_DEP:= ./makedep.mk ./%.o: .././%.c @echo Building file: $< @echo Invoking: AVR/GNU C Compiler : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2 - $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe$(QUOTE) -funsigned-char -funsigned-bitfields -O1 -fpack-struct -fshort-enums -g2 -Wall -Wundef -Werror -pedantic -pedantic-errors -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -mmcu=atmega1284p -o"$@" "$<" + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe$(QUOTE) -funsigned-char -funsigned-bitfields -O1 -ffunction-sections -fpack-struct -fshort-enums -Wall -Wundef -Werror -pedantic -pedantic-errors -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -mmcu=atmega1284p -o"$@" "$<" @echo Finished building: $< @@ -138,7 +138,7 @@ all: $(OUTPUT_FILE_PATH) $(ADDITIONAL_DEPENDENCIES) $(OUTPUT_FILE_PATH): $(OBJS) $(USER_OBJS) $(OUTPUT_FILE_DEP) @echo Building target: $@ @echo Invoking: AVR/GNU Linker : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2 - $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe$(QUOTE) -o$(OUTPUT_FILE_PATH_AS_ARGS) $(OBJS_AS_ARGS) $(USER_OBJS) $(LIBS) -Wl,-Map="P8000_WDC_Emulator.map" -Wl,--start-group -Wl,-lm -Wl,--end-group -mmcu=atmega1284p + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe$(QUOTE) -o$(OUTPUT_FILE_PATH_AS_ARGS) $(OBJS_AS_ARGS) $(USER_OBJS) $(LIBS) -Wl,-Map="P8000_WDC_Emulator.map" -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--gc-sections -mrelax -mmcu=atmega1284p @echo Finished building target: $@ "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature "P8000_WDC_Emulator.elf" "P8000_WDC_Emulator.hex" "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "P8000_WDC_Emulator.elf" "P8000_WDC_Emulator.eep" || exit 0 diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/P8000_WDC_Emulator.cproj b/P8000_WDC_Emulator/P8000_WDC_Emulator/P8000_WDC_Emulator.cproj index b0e7335..3c4dd7d 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/P8000_WDC_Emulator.cproj +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/P8000_WDC_Emulator.cproj @@ -51,9 +51,9 @@ True True Optimize (-O1) + True True True - Default (-g2) True True True @@ -64,7 +64,8 @@ m - Default (-Wa,-g) + True + True diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_drv_mmc.c b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_drv_mmc.c index 7c64c04..c7ed158 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_drv_mmc.c +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_drv_mmc.c @@ -196,28 +196,35 @@ uint8_t mmc_write_sector ( uint32_t addr, uint8_t *Buffer ) return ( tmp ); } - //Wartet einen Moment und sendet einen Clock an die MMC/SD-Karte - for ( uint16_t a = 0; a < 100; a++ ) { - mmc_read_byte(); - } - - //Sendet Start Byte an MMC/SD-Karte - mmc_write_byte ( 0xFE ); + SPDR = 0xFE; //Sendet Startbyte //Schreiben des Bolcks (512Bytes) auf MMC/SD-Karte for ( uint16_t a = 0; a < 512; a++ ) { - mmc_write_byte ( *Buffer++ ); + uint8_t data = *Buffer; + Buffer++; + while ( ! ( SPSR & ( 1 << SPIF ) ) ); + SPDR = data; //Sendet ein Byte } + while ( ! ( SPSR & ( 1 << SPIF ) ) ); //CRC-Byte schreiben - mmc_write_byte ( 0xFF ); //Schreibt Dummy CRC - mmc_write_byte ( 0xFF ); //CRC Code wird nicht benutzt + SPDR = 0xFF; + while ( ! ( SPSR & ( 1 << SPIF ) ) ); + SPDR = 0xFF; + while ( ! ( SPSR & ( 1 << SPIF ) ) ); //Fehler beim schreiben? (Data Response XXX00101 = OK) - if ( ( mmc_read_byte() & 0x1F ) != 0x05 ) return ( 1 ); + SPDR = 0xff; + while ( ! ( SPSR & ( 1 << SPIF ) ) ) {}; + if ( ( SPDR & 0x1F ) != 0x05 ) return ( 1 ); //Wartet auf MMC/SD-Karte Bussy - while ( mmc_read_byte() != 0xff ) {}; + while ( 1 ) { + SPDR = 0xff; + while ( ! ( SPSR & ( 1 << SPIF ) ) ) {}; + if ( SPDR == 0xff ) + break; + } //set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv) MMC_Disable(); @@ -236,15 +243,34 @@ void mmc_read_block ( uint8_t *cmd, uint8_t *Buffer, uint16_t Bytes ) } //Wartet auf Start Byte von der MMC/SD-Karte (FEh/Start Byte) - while ( mmc_read_byte() != 0xfe ) {}; + // while ( mmc_read_byte() != 0xfe ) {}; + while ( 1 ) { + SPDR = 0xff; + while ( ! ( SPSR & ( 1 << SPIF ) ) ) {}; + if ( SPDR == 0xfe ) + break; + } + + + SPDR = 0xff; + while ( ! ( SPSR & ( 1 << SPIF ) ) ); + *Buffer = SPDR; //Lesen des Bolcks (normal 512Bytes) von MMC/SD-Karte - for ( uint16_t a = 0; a < Bytes; a++ ) { - *Buffer++ = mmc_read_byte(); + for ( uint16_t a = 0; a < Bytes - 1; a++ ) { + SPDR = 0xff; + Buffer++; + while ( ! ( SPSR & ( 1 << SPIF ) ) ); + *Buffer = SPDR; } + //CRC-Byte auslesen - mmc_read_byte();//CRC - Byte wird nicht ausgewertet - mmc_read_byte();//CRC - Byte wird nicht ausgewertet + SPDR = 0xff; + while ( ! ( SPSR & ( 1 << SPIF ) ) ); + SPDR; + SPDR = 0xff; + while ( ! ( SPSR & ( 1 << SPIF ) ) ); + SPDR; //set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv) MMC_Disable(); diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.c b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.c index 8f0e4f9..d2a8438 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.c +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.c @@ -1,7 +1,7 @@ /* * P8000 WDC Emulator * - * $Id: wdc_if_disk.c,v 1.2 2012/06/02 00:51:55 olivleh1 Exp $ + * $Id: wdc_if_disk.c,v 1.3 2012/06/02 23:04:30 olivleh1 Exp $ * */ @@ -13,7 +13,7 @@ uint8_t wdc_init_sdcard() return mmc_init(); } -uint32_t wdc_get_blockno ( uint16_t req_cylinder, uint8_t req_head, uint8_t req_sector ) +uint32_t wdc_sector2sdblock ( uint16_t req_cylinder, uint8_t req_head, uint8_t req_sector ) { /* TODO: no direct access of par_table - use getter functions instead - but only after speed is sufficient */ /* +-------------------------------------------------------------- requested cylinder from P8000 @@ -26,6 +26,15 @@ uint32_t wdc_get_blockno ( uint16_t req_cylinder, uint8_t req_head, uint8_t req_ return ( ( req_cylinder * par_table[25] * par_table[26] ) + ( req_head * par_table[26] ) + ( req_sector - 1 ) ); } +uint32_t wdc_p8kblock2sdblock ( uint32_t blockno ) +{ + /* TODO: no direct access of par_table - use getter functions instead - but only after speed is sufficient */ + /* +----------------------------------------------- configured heads form the harddisk + * | +------------------------------- configured sectors for the harddisk + * | |*/ + return ( blockno + ( par_table[25] * par_table[26] ) ); +} + uint8_t wdc_write_sector ( uint16_t addr, uint8_t *sector ) { return mmc_write_sector ( addr, sector ); diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.h b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.h index 5425241..1873acd 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.h +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.h @@ -1,7 +1,7 @@ /* * P8000 WDC Emulator * - * $Id: wdc_if_disk.h,v 1.2 2012/06/02 00:51:55 olivleh1 Exp $ + * $Id: wdc_if_disk.h,v 1.3 2012/06/02 23:04:30 olivleh1 Exp $ * */ @@ -9,7 +9,8 @@ #define WDC_IF_SDCARD_H_ uint8_t wdc_init_sdcard(); -uint32_t wdc_get_blockno ( uint16_t req_cylinder, uint8_t req_head, uint8_t req_sector ); +uint32_t wdc_sector2sdblock ( uint16_t req_cylinder, uint8_t req_head, uint8_t req_sector ); +uint32_t wdc_p8kblock2sdblock ( uint32_t blockno ); uint8_t wdc_write_sector ( uint16_t addr, uint8_t *sector ); uint8_t wdc_read_sector ( uint16_t addr, uint8_t *sector ); diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.h b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.h index 1e4c872..1f88d05 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.h +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.h @@ -1,14 +1,14 @@ /* * P8000 WDC Emulator * - * $Id: wdc_if_p8000.h,v 1.2 2012/06/02 00:51:55 olivleh1 Exp $ + * $Id: wdc_if_p8000.h,v 1.3 2012/06/02 23:04:30 olivleh1 Exp $ * */ #ifndef WDC_IF_PIO_H_ #define WDC_IF_PIO_H_ -#define DELAY_PIO_US 500 +#define DELAY_PIO_US 400 #define configure_port_data_read() DDR_DATA = 0x00 /* programs the DATA-Port as Input-only for reading from the P8000*/ #define configure_port_data_write() DDR_DATA = 0xff /* programs the DATA-Port as Out-only for writing to the P8000*/ diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.c b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.c index 834076a..e46d037 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.c +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.c @@ -1,15 +1,20 @@ /* * P8000 WDC Emulator * - * $Id: wdc_main.c,v 1.6 2012/06/02 00:51:55 olivleh1 Exp $ + * $Id: wdc_main.c,v 1.7 2012/06/02 23:04:30 olivleh1 Exp $ * * TODO: - Prio 1: more commandcodes * - Prio 2: check if BTT is really cleaned when sa.format gets called all the time with a real drive + * ----------> no the old BTT from the previous formatting is shown + * ----------> check if after formatting, no BTT is written to the disk, the old BTT is still there * - Prio 2: respect BTT entries when calculating the block number to use. * - Prio 3: work out how PAR+BTT where originally stored on the harddisks and store them the same way * - Prio 3: put the whole par_table handling from wdc_ram.[ch] into wdc_par.[ch] */ +#include +#include + #include #include #include @@ -21,8 +26,18 @@ #include "wdc_if_sdcard.h" #define DEBUG 1 +#undef MEASURE_SDCARD_TIME + void atmega_setup ( void ); +#ifdef MEASURE_SDCARD_TIME +volatile uint32_t overflow = 0; +ISR ( TIMER0_OVF_vect ) +{ + overflow ++; +} +#endif + int main ( void ) { uint16_t cmd_counter = 9; @@ -38,10 +53,45 @@ int main ( void ) uart_puts_p ( PSTR ( "P8000 WDC Emulator 0.01\n" ) ); +#ifdef MEASURE_SDCARD_TIME + uint32_t starttime; + + sei(); + TIMSK0 |= ( 0x01 << TOIE0 ); + TCCR0B = ( 1 << CS01 ); // Prescaler 8 + TCNT0 = 0x00; + + uart_putdw_dec ( overflow ); + data_buffer = malloc ( 512 * sizeof ( *data_buffer ) ); + uart_putc ( 'w' ); + uart_putc ( '\n' ); + for ( i8 = 0; i8 < 5; i8++ ) { + for ( blockno = 200000, starttime = overflow; blockno < 205000; blockno++ ) { + errorcode = wdc_write_sector ( blockno, data_buffer ); + } + uart_putdw_dec ( overflow - starttime ); + uart_putc ( '\n' ); + } + uart_putc ( '\n' ); + + uart_putc ( 'r' ); + uart_putc ( '\n' ); + for ( i8 = 0; i8 < 5; i8++ ) { + for ( blockno = 200000, starttime = overflow; blockno < 205000; blockno++ ) { + errorcode = wdc_read_sector ( blockno, data_buffer ); + } + uart_putdw_dec ( overflow - starttime ); + uart_putc ( '\n' ); + } + uart_putc ( '\n' ); + + free ( data_buffer ); +#endif + /* load Parameter Table into RAM if valid */ blockno = 0; data_counter = 512; - data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) ); + data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) ); while ( wdc_read_sector ( blockno, data_buffer ) ) { #if DEBUG >= 1 uart_puts_p ( PSTR ( "Block 0 of SD-Card not readable" ) ); @@ -177,15 +227,16 @@ int main ( void ) free ( data_buffer ); break; - case CMD_FMT_BTT: + + case CMD_FMTBTT_TRACK: data_counter = 512; data_buffer = calloc ( data_counter, sizeof ( *data_buffer ) ); - blockno = wdc_get_blockno ( cmd_buffer[2] | ( cmd_buffer[3] << 8 ) - , cmd_buffer[4] - , cmd_buffer[5] - ); + blockno = wdc_sector2sdblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 ) + , cmd_buffer[4] + , cmd_buffer[5] + ); errorcode = 1; for ( i8 = 0; i8 < wdc_get_hdd_sectors(); i8++ ) { @@ -245,10 +296,10 @@ int main ( void ) data_counter = 512; data_buffer = calloc ( data_counter, sizeof ( *data_buffer ) ); - blockno = wdc_get_blockno ( cmd_buffer[2] | ( cmd_buffer[3] << 8 ) - , cmd_buffer[4] - , cmd_buffer[5] - ); + blockno = wdc_sector2sdblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 ) + , cmd_buffer[4] + , cmd_buffer[5] + ); errorcode = 1; for ( i8 = 0; i8 < wdc_get_hdd_sectors(); i8++ ) { @@ -271,16 +322,21 @@ int main ( void ) else data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) ); - blockno = wdc_get_blockno ( cmd_buffer[2] | ( cmd_buffer[3] << 8 ) - , cmd_buffer[4] - , cmd_buffer[5] - ); + blockno = wdc_sector2sdblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 ) + , cmd_buffer[4] + , cmd_buffer[5] + ); + i8 = 0; errorcode = 1; for ( i16 = 0; i16 < data_counter; i16 += 512 ) { errorcode = wdc_read_sector ( blockno, data_buffer ); if ( errorcode ) break; + i8++; + blockno++; + data_buffer += 512; } + data_buffer -= ( 512 * i8 ); if ( errorcode ) wdc_send_error(); @@ -288,6 +344,65 @@ int main ( void ) free ( data_buffer ); break; + case CMD_WR_BLOCK: + data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6]; + if ( data_counter % 512 > 0 ) + data_buffer = malloc ( ( data_counter + 512 - ( data_counter % 512 ) ) * sizeof ( *data_buffer ) ); + else + data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) ); + + blockno = wdc_p8kblock2sdblock ( ( ( uint32_t ) cmd_buffer[5] << 24 ) | ( ( uint32_t ) cmd_buffer[4] << 16 ) | ( ( uint16_t ) cmd_buffer[3] << 8 ) | cmd_buffer[2] ); + + wdc_receive_data ( data_buffer + , data_counter + ); + i8 = 0; + errorcode = 1; + for ( i16 = 0; i16 < data_counter; i16 += 512 ) { + errorcode = wdc_write_sector ( blockno, data_buffer ); + if ( errorcode ) break; + i8++; + blockno++; + data_buffer += 512; + } + data_buffer -= ( 512 * i8 ); + + if ( errorcode ) + wdc_send_error(); + + free ( data_buffer ); + break; + + case CMD_RD_BLOCK: + data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6]; + if ( data_counter % 512 > 0 ) + data_buffer = malloc ( ( data_counter + 512 - ( data_counter % 512 ) ) * sizeof ( *data_buffer ) ); + else + data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) ); + + blockno = wdc_p8kblock2sdblock ( ( ( uint32_t ) cmd_buffer[5] << 24 ) | ( ( uint32_t ) cmd_buffer[4] << 16 ) | ( ( uint16_t ) cmd_buffer[3] << 8 ) | cmd_buffer[2] ); + + i8 = 0; + errorcode = 1; + for ( i16 = 0; i16 < data_counter; i16 += 512 ) { + errorcode = wdc_read_sector ( blockno, data_buffer ); + if ( errorcode ) break; + i8++; + blockno++; + data_buffer += 512; + } + data_buffer -= ( 512 * i8 ); + + if ( errorcode ) + wdc_send_error(); + + wdc_send_data ( data_buffer + , data_counter + ); + + free ( data_buffer ); + break; + default: #if DEBUG >= 1 uart_puts_p ( PSTR ( " Unknown command:" ) ); @@ -308,12 +423,13 @@ int main ( void ) free ( cmd_buffer ); } + return 0; } void atmega_setup ( void ) { - set_sleep_mode ( SLEEP_MODE_IDLE ); + // set_sleep_mode ( SLEEP_MODE_IDLE ); uart_init(); wdc_init_ports(); while ( wdc_init_sdcard() ) { diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.h b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.h index c5c373a..2b24ae0 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.h +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.h @@ -1,7 +1,7 @@ /* * P8000 WDC Emulator * - * $Id: wdc_main.h,v 1.6 2012/06/02 00:51:55 olivleh1 Exp $ + * $Id: wdc_main.h,v 1.7 2012/06/02 23:04:30 olivleh1 Exp $ * */ @@ -9,17 +9,30 @@ #ifndef MAIN_H_ #define MAIN_H_ -#define CMD_WR_WDC_RAM 0x18 /* write data to WDC RAM */ -#define CMD_RD_WDC_RAM 0x08 /* read data from WDC RAM */ -#define CMD_RD_PARTAB 0x28 /* read Parameter block from WDC RAM */ -#define CMD_WR_PARTAB 0x78 /* write Parameter block to WDC RAM */ -#define CMD_DL_BTTAB 0x48 /* delete Bad Track Table from WDC RAM */ -#define CMD_RD_BTTAB 0x58 /* read Bad Track Table from WDC RAM */ -#define CMD_WR_BTTAB 0x68 /* write Bad Track Table to WDC RAM */ -#define CMD_FMT_BTT 0x24 /* format a track and provide BTT info */ -#define CMD_ST_PARBTT 0xC2 /* store PAR and BTT on harddisk */ -#define CMD_RD_WDCERR 0x38 /* read error statistics */ -#define CMD_VER_TRACK 0x44 /* verify track */ -#define CMD_RD_SECTOR 0x01 /* read data beginning at given sector */ +#define CMD_RD_SECTOR 0x01 /* read data beginning at given sector */ +#define _CMD_WR_SECTOR 0x02 /* write sector */ +#define _CMD_FMT_TRACK 0x04 /* format a track */ +#define CMD_RD_WDC_RAM 0x08 /* read data from WDC RAM */ +#define NO_CMD_RDBTT_SECTOR 0x11 /* read sector taking BTT into account */ +#define NO_CMD_WRBTT_SECTOR 0x12 /* write sector taking BTT into account */ +#define NO_CMD_FMTRD_TRACK 0x14 /* format and reread a track */ +#define CMD_WR_WDC_RAM 0x18 /* write data to WDC RAM */ +#define CMD_RD_BLOCK 0x21 /* read data beginning at given block */ +#define CMD_WR_BLOCK 0x22 /* write data beginning at given block */ +#define CMD_FMTBTT_TRACK 0x24 /* format a track and provide BTT info */ +#define CMD_RD_PARTAB 0x28 /* read Parameter block from WDC RAM */ +#define CMD_RD_WDCERR 0x38 /* read error statistics */ +#define CMD_VER_TRACK 0x44 /* verify track */ +#define CMD_DL_BTTAB 0x48 /* delete Bad Track Table from WDC RAM */ +#define CMD_RD_BTTAB 0x58 /* read Bad Track Table from WDC RAM */ +#define CMD_WR_BTTAB 0x68 /* write Bad Track Table to WDC RAM */ +#define CMD_WR_PARTAB 0x78 /* write Parameter block to WDC RAM */ +#define NO_CMD_VER_SECTOR 0x81 /* verify sector */ +#define NO_CMD_WRRD_SECTOR 0x82 /* write and reread sector */ +#define NO_CMD_DL_TRACK 0x84 /* delete a track */ +#define NO_CMD_WRRDBTT_SECTOR 0x92 /* write and reread sector taking BTT into account */ +#define NO_CMD_CP_BLOCK 0xa1 /* copy block from drive 1 to drive 0 */ +#define NO_CMD_WRRD_BLOCK 0xa2 /* wrid and reread block */ +#define CMD_ST_PARBTT 0xc2 /* store PAR and BTT on harddisk */ #endif /* MAIN_H_ */