todays work
This commit is contained in:
parent
a25e66b4ff
commit
5fa55e3943
|
|
@ -110,7 +110,7 @@ OUTPUT_FILE_DEP:= ./makedep.mk
|
||||||
./%.o: .././%.c
|
./%.o: .././%.c
|
||||||
@echo Building file: $<
|
@echo Building file: $<
|
||||||
@echo Invoking: AVR/GNU C Compiler : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2
|
@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: $<
|
@echo Finished building: $<
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -138,7 +138,7 @@ all: $(OUTPUT_FILE_PATH) $(ADDITIONAL_DEPENDENCIES)
|
||||||
$(OUTPUT_FILE_PATH): $(OBJS) $(USER_OBJS) $(OUTPUT_FILE_DEP)
|
$(OUTPUT_FILE_PATH): $(OBJS) $(USER_OBJS) $(OUTPUT_FILE_DEP)
|
||||||
@echo Building target: $@
|
@echo Building target: $@
|
||||||
@echo Invoking: AVR/GNU Linker : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2
|
@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: $@
|
@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" -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
|
"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
|
||||||
|
|
|
||||||
|
|
@ -51,9 +51,9 @@
|
||||||
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
|
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
|
||||||
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
|
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
|
||||||
<avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level>
|
<avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level>
|
||||||
|
<avrgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>True</avrgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>
|
||||||
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
|
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
|
||||||
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
|
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
|
||||||
<avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
|
|
||||||
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
|
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
|
||||||
<avrgcc.compiler.warnings.Undefined>True</avrgcc.compiler.warnings.Undefined>
|
<avrgcc.compiler.warnings.Undefined>True</avrgcc.compiler.warnings.Undefined>
|
||||||
<avrgcc.compiler.warnings.WarningsAsErrors>True</avrgcc.compiler.warnings.WarningsAsErrors>
|
<avrgcc.compiler.warnings.WarningsAsErrors>True</avrgcc.compiler.warnings.WarningsAsErrors>
|
||||||
|
|
@ -64,7 +64,8 @@
|
||||||
<Value>m</Value>
|
<Value>m</Value>
|
||||||
</ListValues>
|
</ListValues>
|
||||||
</avrgcc.linker.libraries.Libraries>
|
</avrgcc.linker.libraries.Libraries>
|
||||||
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
|
<avrgcc.linker.optimization.GarbageCollectUnusedSections>True</avrgcc.linker.optimization.GarbageCollectUnusedSections>
|
||||||
|
<avrgcc.linker.optimization.RelaxBranches>True</avrgcc.linker.optimization.RelaxBranches>
|
||||||
</AvrGcc>
|
</AvrGcc>
|
||||||
</ToolchainSettings>
|
</ToolchainSettings>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
|
||||||
|
|
@ -196,28 +196,35 @@ uint8_t mmc_write_sector ( uint32_t addr, uint8_t *Buffer )
|
||||||
return ( tmp );
|
return ( tmp );
|
||||||
}
|
}
|
||||||
|
|
||||||
//Wartet einen Moment und sendet einen Clock an die MMC/SD-Karte
|
SPDR = 0xFE; //Sendet Startbyte
|
||||||
for ( uint16_t a = 0; a < 100; a++ ) {
|
|
||||||
mmc_read_byte();
|
|
||||||
}
|
|
||||||
|
|
||||||
//Sendet Start Byte an MMC/SD-Karte
|
|
||||||
mmc_write_byte ( 0xFE );
|
|
||||||
|
|
||||||
//Schreiben des Bolcks (512Bytes) auf MMC/SD-Karte
|
//Schreiben des Bolcks (512Bytes) auf MMC/SD-Karte
|
||||||
for ( uint16_t a = 0; a < 512; a++ ) {
|
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
|
//CRC-Byte schreiben
|
||||||
mmc_write_byte ( 0xFF ); //Schreibt Dummy CRC
|
SPDR = 0xFF;
|
||||||
mmc_write_byte ( 0xFF ); //CRC Code wird nicht benutzt
|
while ( ! ( SPSR & ( 1 << SPIF ) ) );
|
||||||
|
SPDR = 0xFF;
|
||||||
|
while ( ! ( SPSR & ( 1 << SPIF ) ) );
|
||||||
|
|
||||||
//Fehler beim schreiben? (Data Response XXX00101 = OK)
|
//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
|
//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)
|
//set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv)
|
||||||
MMC_Disable();
|
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)
|
//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
|
//Lesen des Bolcks (normal 512Bytes) von MMC/SD-Karte
|
||||||
for ( uint16_t a = 0; a < Bytes; a++ ) {
|
for ( uint16_t a = 0; a < Bytes - 1; a++ ) {
|
||||||
*Buffer++ = mmc_read_byte();
|
SPDR = 0xff;
|
||||||
|
Buffer++;
|
||||||
|
while ( ! ( SPSR & ( 1 << SPIF ) ) );
|
||||||
|
*Buffer = SPDR;
|
||||||
}
|
}
|
||||||
|
|
||||||
//CRC-Byte auslesen
|
//CRC-Byte auslesen
|
||||||
mmc_read_byte();//CRC - Byte wird nicht ausgewertet
|
SPDR = 0xff;
|
||||||
mmc_read_byte();//CRC - Byte wird nicht ausgewertet
|
while ( ! ( SPSR & ( 1 << SPIF ) ) );
|
||||||
|
SPDR;
|
||||||
|
SPDR = 0xff;
|
||||||
|
while ( ! ( SPSR & ( 1 << SPIF ) ) );
|
||||||
|
SPDR;
|
||||||
|
|
||||||
//set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv)
|
//set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv)
|
||||||
MMC_Disable();
|
MMC_Disable();
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* P8000 WDC Emulator
|
* 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();
|
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 */
|
/* TODO: no direct access of par_table - use getter functions instead - but only after speed is sufficient */
|
||||||
/* +-------------------------------------------------------------- requested cylinder from P8000
|
/* +-------------------------------------------------------------- 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 ) );
|
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 )
|
uint8_t wdc_write_sector ( uint16_t addr, uint8_t *sector )
|
||||||
{
|
{
|
||||||
return mmc_write_sector ( addr, sector );
|
return mmc_write_sector ( addr, sector );
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* P8000 WDC Emulator
|
* 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_
|
#define WDC_IF_SDCARD_H_
|
||||||
|
|
||||||
uint8_t wdc_init_sdcard();
|
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_write_sector ( uint16_t addr, uint8_t *sector );
|
||||||
uint8_t wdc_read_sector ( uint16_t addr, uint8_t *sector );
|
uint8_t wdc_read_sector ( uint16_t addr, uint8_t *sector );
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
/*
|
/*
|
||||||
* P8000 WDC Emulator
|
* 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_
|
#ifndef WDC_IF_PIO_H_
|
||||||
#define 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_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*/
|
#define configure_port_data_write() DDR_DATA = 0xff /* programs the DATA-Port as Out-only for writing to the P8000*/
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,20 @@
|
||||||
/*
|
/*
|
||||||
* P8000 WDC Emulator
|
* 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
|
* 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
|
* - 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 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: 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]
|
* - Prio 3: put the whole par_table handling from wdc_ram.[ch] into wdc_par.[ch]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
@ -21,8 +26,18 @@
|
||||||
#include "wdc_if_sdcard.h"
|
#include "wdc_if_sdcard.h"
|
||||||
|
|
||||||
#define DEBUG 1
|
#define DEBUG 1
|
||||||
|
#undef MEASURE_SDCARD_TIME
|
||||||
|
|
||||||
void atmega_setup ( void );
|
void atmega_setup ( void );
|
||||||
|
|
||||||
|
#ifdef MEASURE_SDCARD_TIME
|
||||||
|
volatile uint32_t overflow = 0;
|
||||||
|
ISR ( TIMER0_OVF_vect )
|
||||||
|
{
|
||||||
|
overflow ++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int main ( void )
|
int main ( void )
|
||||||
{
|
{
|
||||||
uint16_t cmd_counter = 9;
|
uint16_t cmd_counter = 9;
|
||||||
|
|
@ -38,10 +53,45 @@ int main ( void )
|
||||||
|
|
||||||
uart_puts_p ( PSTR ( "P8000 WDC Emulator 0.01\n" ) );
|
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 */
|
/* load Parameter Table into RAM if valid */
|
||||||
blockno = 0;
|
blockno = 0;
|
||||||
data_counter = 512;
|
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 ) ) {
|
while ( wdc_read_sector ( blockno, data_buffer ) ) {
|
||||||
#if DEBUG >= 1
|
#if DEBUG >= 1
|
||||||
uart_puts_p ( PSTR ( "Block 0 of SD-Card not readable" ) );
|
uart_puts_p ( PSTR ( "Block 0 of SD-Card not readable" ) );
|
||||||
|
|
@ -177,15 +227,16 @@ int main ( void )
|
||||||
|
|
||||||
free ( data_buffer );
|
free ( data_buffer );
|
||||||
break;
|
break;
|
||||||
case CMD_FMT_BTT:
|
|
||||||
|
case CMD_FMTBTT_TRACK:
|
||||||
|
|
||||||
data_counter = 512;
|
data_counter = 512;
|
||||||
data_buffer = calloc ( data_counter, sizeof ( *data_buffer ) );
|
data_buffer = calloc ( data_counter, sizeof ( *data_buffer ) );
|
||||||
|
|
||||||
blockno = wdc_get_blockno ( cmd_buffer[2] | ( cmd_buffer[3] << 8 )
|
blockno = wdc_sector2sdblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 )
|
||||||
, cmd_buffer[4]
|
, cmd_buffer[4]
|
||||||
, cmd_buffer[5]
|
, cmd_buffer[5]
|
||||||
);
|
);
|
||||||
|
|
||||||
errorcode = 1;
|
errorcode = 1;
|
||||||
for ( i8 = 0; i8 < wdc_get_hdd_sectors(); i8++ ) {
|
for ( i8 = 0; i8 < wdc_get_hdd_sectors(); i8++ ) {
|
||||||
|
|
@ -245,10 +296,10 @@ int main ( void )
|
||||||
data_counter = 512;
|
data_counter = 512;
|
||||||
data_buffer = calloc ( data_counter, sizeof ( *data_buffer ) );
|
data_buffer = calloc ( data_counter, sizeof ( *data_buffer ) );
|
||||||
|
|
||||||
blockno = wdc_get_blockno ( cmd_buffer[2] | ( cmd_buffer[3] << 8 )
|
blockno = wdc_sector2sdblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 )
|
||||||
, cmd_buffer[4]
|
, cmd_buffer[4]
|
||||||
, cmd_buffer[5]
|
, cmd_buffer[5]
|
||||||
);
|
);
|
||||||
|
|
||||||
errorcode = 1;
|
errorcode = 1;
|
||||||
for ( i8 = 0; i8 < wdc_get_hdd_sectors(); i8++ ) {
|
for ( i8 = 0; i8 < wdc_get_hdd_sectors(); i8++ ) {
|
||||||
|
|
@ -271,16 +322,21 @@ int main ( void )
|
||||||
else
|
else
|
||||||
data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) );
|
data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) );
|
||||||
|
|
||||||
blockno = wdc_get_blockno ( cmd_buffer[2] | ( cmd_buffer[3] << 8 )
|
blockno = wdc_sector2sdblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 )
|
||||||
, cmd_buffer[4]
|
, cmd_buffer[4]
|
||||||
, cmd_buffer[5]
|
, cmd_buffer[5]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
i8 = 0;
|
||||||
errorcode = 1;
|
errorcode = 1;
|
||||||
for ( i16 = 0; i16 < data_counter; i16 += 512 ) {
|
for ( i16 = 0; i16 < data_counter; i16 += 512 ) {
|
||||||
errorcode = wdc_read_sector ( blockno, data_buffer );
|
errorcode = wdc_read_sector ( blockno, data_buffer );
|
||||||
if ( errorcode ) break;
|
if ( errorcode ) break;
|
||||||
|
i8++;
|
||||||
|
blockno++;
|
||||||
|
data_buffer += 512;
|
||||||
}
|
}
|
||||||
|
data_buffer -= ( 512 * i8 );
|
||||||
|
|
||||||
if ( errorcode )
|
if ( errorcode )
|
||||||
wdc_send_error();
|
wdc_send_error();
|
||||||
|
|
@ -288,6 +344,65 @@ int main ( void )
|
||||||
free ( data_buffer );
|
free ( data_buffer );
|
||||||
break;
|
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:
|
default:
|
||||||
#if DEBUG >= 1
|
#if DEBUG >= 1
|
||||||
uart_puts_p ( PSTR ( " Unknown command:" ) );
|
uart_puts_p ( PSTR ( " Unknown command:" ) );
|
||||||
|
|
@ -308,12 +423,13 @@ int main ( void )
|
||||||
|
|
||||||
free ( cmd_buffer );
|
free ( cmd_buffer );
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void atmega_setup ( void )
|
void atmega_setup ( void )
|
||||||
{
|
{
|
||||||
set_sleep_mode ( SLEEP_MODE_IDLE );
|
// set_sleep_mode ( SLEEP_MODE_IDLE );
|
||||||
uart_init();
|
uart_init();
|
||||||
wdc_init_ports();
|
wdc_init_ports();
|
||||||
while ( wdc_init_sdcard() ) {
|
while ( wdc_init_sdcard() ) {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* P8000 WDC Emulator
|
* 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_
|
#ifndef MAIN_H_
|
||||||
#define MAIN_H_
|
#define MAIN_H_
|
||||||
|
|
||||||
#define CMD_WR_WDC_RAM 0x18 /* write data to WDC RAM */
|
#define CMD_RD_SECTOR 0x01 /* read data beginning at given sector */
|
||||||
#define CMD_RD_WDC_RAM 0x08 /* read data from WDC RAM */
|
#define _CMD_WR_SECTOR 0x02 /* write sector */
|
||||||
#define CMD_RD_PARTAB 0x28 /* read Parameter block from WDC RAM */
|
#define _CMD_FMT_TRACK 0x04 /* format a track */
|
||||||
#define CMD_WR_PARTAB 0x78 /* write Parameter block to WDC RAM */
|
#define CMD_RD_WDC_RAM 0x08 /* read data from WDC RAM */
|
||||||
#define CMD_DL_BTTAB 0x48 /* delete Bad Track Table from WDC RAM */
|
#define NO_CMD_RDBTT_SECTOR 0x11 /* read sector taking BTT into account */
|
||||||
#define CMD_RD_BTTAB 0x58 /* read Bad Track Table from WDC RAM */
|
#define NO_CMD_WRBTT_SECTOR 0x12 /* write sector taking BTT into account */
|
||||||
#define CMD_WR_BTTAB 0x68 /* write Bad Track Table to WDC RAM */
|
#define NO_CMD_FMTRD_TRACK 0x14 /* format and reread a track */
|
||||||
#define CMD_FMT_BTT 0x24 /* format a track and provide BTT info */
|
#define CMD_WR_WDC_RAM 0x18 /* write data to WDC RAM */
|
||||||
#define CMD_ST_PARBTT 0xC2 /* store PAR and BTT on harddisk */
|
#define CMD_RD_BLOCK 0x21 /* read data beginning at given block */
|
||||||
#define CMD_RD_WDCERR 0x38 /* read error statistics */
|
#define CMD_WR_BLOCK 0x22 /* write data beginning at given block */
|
||||||
#define CMD_VER_TRACK 0x44 /* verify track */
|
#define CMD_FMTBTT_TRACK 0x24 /* format a track and provide BTT info */
|
||||||
#define CMD_RD_SECTOR 0x01 /* read data beginning at given sector */
|
#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_ */
|
#endif /* MAIN_H_ */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue