From d12779e8d782e420e3e10c2b727cc1fd5e4adfaa Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Tue, 12 Jun 2012 17:34:14 +0000 Subject: [PATCH] First step towards PATA support. Rename files to better fit into the architecture --- .../P8000_WDC_Emulator/Debug/Makefile | 57 +++++---- .../P8000_WDC_Emulator/Debug/makedep.mk | 12 +- .../Hardware/P8000_WDC_Emulator.pdf | Bin 33806 -> 33913 bytes .../Hardware/P8000_WDC_Emulator.sch | 115 +++++++++--------- .../P8000_WDC_Emulator.cproj | 26 ++-- P8000_WDC_Emulator/P8000_WDC_Emulator/uart.c | 2 +- .../P8000_WDC_Emulator/wdc_avr.c | 62 ++++++++++ .../P8000_WDC_Emulator/wdc_avr.h | 73 +++++++++++ .../P8000_WDC_Emulator/wdc_config.h | 12 +- .../P8000_WDC_Emulator/wdc_drv_mmc.c | 15 +-- .../P8000_WDC_Emulator/wdc_drv_mmc.h | 8 +- .../P8000_WDC_Emulator/wdc_if_disk.c | 10 +- .../P8000_WDC_Emulator/wdc_if_disk.h | 14 +-- .../P8000_WDC_Emulator/wdc_if_disk_perf.c | 6 +- .../P8000_WDC_Emulator/wdc_if_p8000.c | 48 ++------ .../P8000_WDC_Emulator/wdc_if_p8000.h | 27 +--- .../P8000_WDC_Emulator/wdc_main.c | 28 ++--- .../P8000_WDC_Emulator/wdc_par.c | 4 +- 18 files changed, 312 insertions(+), 207 deletions(-) create mode 100644 P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_avr.c create mode 100644 P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_avr.h diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile b/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile index 68e6d5c..5334723 100755 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile @@ -35,12 +35,13 @@ SUBDIRS := # Add inputs and outputs from these tool invocations to the build variables C_SRCS += \ -../main.c \ -../mmc.c \ -../mmc_perf.c \ +../wdc_avr.c \ +../wdc_main.c \ +../wdc_drv_mmc.c \ +../wdc_drv_mmc_perf.c \ ../uart.c \ -../wdc_if_pio.c \ -../wdc_if_sdcard.c \ +../wdc_if_p8000.c \ +../wdc_if_disk.c \ ../wdc_par.c \ ../wdc_ram.c @@ -52,45 +53,49 @@ ASM_SRCS += OBJS += \ -main.o \ -mmc.o \ -mmc_perf.o \ +wdc_avr.o \ +wdc_main.o \ +wdc_drv_mmc.o \ +wdc_drv_mmc_perf.o \ uart.o \ -wdc_if_pio.o \ -wdc_if_sdcard.o \ +wdc_if_p8000.o \ +wdc_if_disk.o \ wdc_par.o \ wdc_ram.o OBJS_AS_ARGS += \ -main.o \ -mmc.o \ -mmc_perf.o \ +wdc_avr.o \ +wdc_main.o \ +wdc_drv_mmc.o \ +wdc_drv_mmc_perf.o \ uart.o \ -wdc_if_pio.o \ -wdc_if_sdcard.o \ +wdc_if_p8000.o \ +wdc_if_disk.o \ wdc_par.o \ wdc_ram.o C_DEPS += \ -main.d \ -mmc.d \ -mmc_perf.d \ +wdc_avr.d \ +wdc_main.d \ +wdc_drv_mmc.d \ +wdc_drv_mmc_perf.d \ uart.d \ -wdc_if_pio.d \ -wdc_if_sdcard.d \ +wdc_if_p8000.d \ +wdc_if_disk.d \ wdc_par.d \ wdc_ram.d C_DEPS_AS_ARGS += \ -main.d \ -mmc.d \ -mmc_perf.d \ +wdc_avr.d \ +wdc_main.d \ +wdc_drv_mmc.d \ +wdc_drv_mmc_perf.d \ uart.d \ -wdc_if_pio.d \ -wdc_if_sdcard.d \ +wdc_if_p8000.d \ +wdc_if_disk.d \ wdc_par.d \ wdc_ram.d @@ -121,6 +126,8 @@ 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 diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/makedep.mk b/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/makedep.mk index 6a82325..4895925 100755 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/makedep.mk +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/makedep.mk @@ -2,17 +2,19 @@ # Automatically-generated file. Do not edit or delete the file ################################################################################ -main.c +wdc_avr.c -mmc.c +wdc_main.c -mmc_perf.c +wdc_drv_mmc.c + +wdc_drv_mmc_perf.c uart.c -wdc_if_pio.c +wdc_if_p8000.c -wdc_if_sdcard.c +wdc_if_disk.c wdc_par.c diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/Hardware/P8000_WDC_Emulator.pdf b/P8000_WDC_Emulator/P8000_WDC_Emulator/Hardware/P8000_WDC_Emulator.pdf index b80d4fa2eb99d1caae3148d2208fe21981626433..0d0b5525b77a2934112747b267a6403218d29231 100644 GIT binary patch delta 31926 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 delta 31826 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 diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/Hardware/P8000_WDC_Emulator.sch b/P8000_WDC_Emulator/P8000_WDC_Emulator/Hardware/P8000_WDC_Emulator.sch index fb3a8e7..edb9282 100755 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/Hardware/P8000_WDC_Emulator.sch +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/Hardware/P8000_WDC_Emulator.sch @@ -174,7 +174,7 @@ T 67100 33100 9 8 1 0 0 0 1 T 68500 33100 9 8 1 0 0 0 1 1 T 71000 33400 9 7 1 0 0 0 1 -$Revision: 1.12 $ / $Date: 2012/06/10 21:03:24 $ +$Revision: 1.13 $ / $Date: 2012/06/12 17:34:14 $ T 71000 33100 9 8 1 0 0 0 1 Oliver Lehmann N 50600 59400 51200 59400 4 @@ -573,7 +573,7 @@ T 35200 56500 5 10 1 1 0 6 1 pinlabel=\_TE\_ } N 31900 56400 35200 56400 4 -N 31900 58500 36400 58500 4 +N 31900 58500 36300 58500 4 { T 35600 58600 5 10 1 1 0 0 1 pinlabel=\_TR\_ @@ -686,35 +686,13 @@ T 42000 52500 5 10 1 1 0 0 1 pinlabel=\_RDY\_ } N 31900 57000 35200 57000 4 -N 39300 60600 40100 60600 4 -N 40100 60600 40100 59400 4 -C 40000 59100 1 0 0 gnd-1.sym -C 39300 60000 1 90 0 npn-3.sym -{ -T 38800 60900 5 10 0 0 90 0 1 -device=NPN_TRANSISTOR -T 39200 61100 5 10 1 1 0 0 1 -refdes=1T1 -T 39200 60800 5 10 1 1 0 0 1 -pinlabel=BC548A -} -N 31900 60600 38300 60600 4 +N 31900 60600 36300 60600 4 { T 35600 60700 5 10 1 1 0 0 1 pinlabel=\_ASTB\_ } -C 38700 59500 1 270 0 resistor-1.sym -{ -T 39100 59200 5 10 0 0 270 0 1 -device=RESISTOR -T 39000 59100 5 10 1 1 0 0 1 -refdes=4R1 -T 39000 58900 5 10 1 1 0 0 1 -value=1k8 -} N 38800 56400 41600 56400 4 -N 38800 56400 38800 58600 4 -N 38800 59500 38800 60000 4 +N 38800 56400 38800 60400 4 C 35200 57000 1 270 0 busripper-1.sym { T 35200 57400 5 8 0 0 0 0 1 @@ -730,29 +708,6 @@ T 42000 51900 5 10 1 1 0 0 1 pinlabel=\_RST\_ } N 47300 51800 42000 51800 4 -N 37400 58500 38200 58500 4 -N 38200 58500 38200 57300 4 -C 38100 57000 1 0 0 gnd-1.sym -C 37400 57900 1 90 0 npn-3.sym -{ -T 36900 58800 5 10 0 0 90 0 1 -device=NPN_TRANSISTOR -T 37300 59000 5 10 1 1 0 0 1 -refdes=1T1 -T 37300 58700 5 10 1 1 0 0 1 -pinlabel=BC548A -} -C 36800 57400 1 270 0 resistor-1.sym -{ -T 37200 57100 5 10 0 0 270 0 1 -device=RESISTOR -T 37100 57000 5 10 1 1 0 0 1 -refdes=4R1 -T 37100 56800 5 10 1 1 0 0 1 -value=1k8 -} -N 36900 57400 36900 57900 4 -N 36900 56100 36900 56500 4 N 41100 46600 47900 46600 4 T 41200 46800 9 10 1 0 0 0 1 /RDWR TO ATA @@ -1670,7 +1625,7 @@ C 47900 45900 1 0 0 7432-1.sym T 48500 46800 5 10 0 0 0 0 1 device=7432 T 48200 46800 5 10 1 1 0 0 1 -refdes=D6 +refdes=D7 T 48500 48200 5 10 0 0 0 0 1 footprint=DIP14 } @@ -1679,7 +1634,7 @@ C 50700 45000 1 0 0 7404-1.sym T 51300 45900 5 10 0 0 0 0 1 device=7404 T 51000 45900 5 10 1 1 0 0 1 -refdes=D5 +refdes=D8 T 51300 48500 5 10 0 0 0 0 1 footprint=DIP14 } @@ -1689,7 +1644,7 @@ C 47900 44500 1 0 0 7432-1.sym T 48500 45400 5 10 0 0 0 0 1 device=7432 T 48200 45400 5 10 1 1 0 0 1 -refdes=D6 +refdes=D7 T 48500 46800 5 10 0 0 0 0 1 footprint=DIP14 T 47900 44500 5 10 0 1 0 6 1 @@ -1713,7 +1668,7 @@ C 47900 43500 1 180 1 7432-1.sym T 48500 42600 5 10 0 0 180 6 1 device=7432 T 48200 42600 5 10 1 1 180 6 1 -refdes=D6 +refdes=D7 T 48500 41200 5 10 0 0 180 6 1 footprint=DIP14 T 47900 43500 5 10 0 0 180 6 1 @@ -1724,7 +1679,7 @@ C 47900 42100 1 180 1 7432-1.sym T 48500 41200 5 10 0 0 180 6 1 device=7432 T 48200 41200 5 10 1 1 180 6 1 -refdes=D6 +refdes=D7 T 48500 39800 5 10 0 0 180 6 1 footprint=DIP14 T 47900 42100 5 10 0 1 180 0 1 @@ -1739,7 +1694,7 @@ C 50700 42000 1 0 0 7404-1.sym T 51300 42900 5 10 0 0 0 0 1 device=7404 T 51000 42900 5 10 1 1 0 0 1 -refdes=D5 +refdes=D8 T 51300 45500 5 10 0 0 0 0 1 footprint=DIP14 T 50700 42000 5 10 0 0 0 0 1 @@ -1841,7 +1796,7 @@ device=none T 41600 56200 5 10 1 1 0 6 1 pinlabel=TR } -N 36900 56100 41600 56100 4 +N 38500 56100 41600 56100 4 C 41600 49000 1 270 0 busripper-1.sym { T 41600 49400 5 8 0 0 0 0 1 @@ -1862,7 +1817,7 @@ C 39000 49200 1 0 0 7404-1.sym T 39600 50100 5 10 0 0 0 0 1 device=7404 T 39300 50100 5 10 1 1 0 0 1 -refdes=D5 +refdes=D8 T 39600 52700 5 10 0 0 0 0 1 footprint=DIP14 T 39000 49200 5 10 0 0 0 0 1 @@ -1975,3 +1930,49 @@ T 70800 42200 5 10 1 1 90 0 1 value=10k } N 52300 45500 52300 41500 4 +C 37600 60100 1 0 1 7403-1.sym +{ +T 37100 61000 5 10 0 0 0 6 1 +device=7403 +T 37300 61000 5 10 1 1 0 6 1 +refdes=D9 +T 37100 62400 5 10 0 0 0 6 1 +footprint=DIP14 +} +N 37600 60400 38800 60400 4 +C 35600 63300 1 90 1 busripper-1.sym +{ +T 35600 63700 1 8 0 0 0 6 1 +device=none +T 35600 63400 5 10 1 1 0 0 1 +pinlabel=\_RDY\_ +} +N 35600 63300 41200 63300 4 +N 41200 63300 41200 60800 4 +N 41200 60800 40300 60800 4 +C 37600 58000 1 0 1 7403-1.sym +{ +T 37100 58900 5 10 0 0 0 6 1 +device=7403 +T 37300 58900 5 10 1 1 0 6 1 +refdes=D9 +T 37100 60300 5 10 0 0 0 6 1 +footprint=DIP14 +T 37600 58000 5 10 0 0 0 0 1 +slot=2 +} +N 37600 58700 38500 58700 4 +N 38500 58700 38500 56100 4 +N 37600 58300 38500 58300 4 +C 40300 60300 1 0 1 7404-1.sym +{ +T 39700 61200 5 10 0 0 0 6 1 +device=7404 +T 40000 61200 5 10 1 1 0 6 1 +refdes=D8 +T 39700 63800 5 10 0 0 0 6 1 +footprint=DIP14 +T 40300 60300 5 10 0 0 0 6 1 +slot=4 +} +N 37600 60800 39200 60800 4 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 b427cd0..ff56132 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/P8000_WDC_Emulator.cproj +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/P8000_WDC_Emulator.cproj @@ -72,22 +72,28 @@ - + compile - + compile - + compile - + compile - + compile - + + compile + + + compile + + compile @@ -96,16 +102,16 @@ compile - + compile - + compile - + compile - + compile diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/uart.c b/P8000_WDC_Emulator/P8000_WDC_Emulator/uart.c index 7c0dde1..81cb235 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/uart.c +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/uart.c @@ -14,7 +14,7 @@ #include #include "uart.h" -#include "config.h" +#include "wdc_config.h" /* some mcus have multiple uarts */ #ifdef UDR0 diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_avr.c b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_avr.c new file mode 100644 index 0000000..060b151 --- /dev/null +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_avr.c @@ -0,0 +1,62 @@ +/*- + * Copyright (c) 2012 Oliver Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +/* + * $Id: wdc_avr.c,v 1.1 2012/06/12 17:34:14 olivleh1 Exp $ + */ + + +#include +#include "wdc_config.h" +#include "wdc_avr.h" + +void wdc_init_avr() +{ + /* configure the P8000 interface */ + configure_pin_status0(); + configure_pin_status1(); + configure_pin_status2(); + configure_pin_te(); + configure_pin_wdardy(); + configure_pin_tr(); + configure_pin_reset(); + + configure_port_data_read(); + + /* configure the address decoder */ + configure_pin_addr0(); + configure_pin_addr1(); + configure_pin_addr2(); + + init_addressdecoder(); + + /* configure the MMC interface */ + configure_pin_miso(); + configure_pin_sck(); + configure_pin_mosi(); + configure_pin_mmc_cs(); +} \ No newline at end of file diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_avr.h b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_avr.h new file mode 100644 index 0000000..9d900b9 --- /dev/null +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_avr.h @@ -0,0 +1,73 @@ +/*- + * Copyright (c) 2012 Oliver Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +/* + * $Id: wdc_avr.h,v 1.1 2012/06/12 17:34:14 olivleh1 Exp $ + */ + + +#ifndef WDC_AVR_H_ +#define WDC_AVR_H_ + +#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_pin_status0() DDR_INFO |= ( 1 << PIN_INFO_STATUS0 ) +#define configure_pin_status1() DDR_INFO |= ( 1 << PIN_INFO_STATUS1 ) +#define configure_pin_status2() DDR_INFO |= ( 1 << PIN_INFO_STATUS2 ) +#define configure_pin_te() DDR_INFO &= ~( 1 << PIN_INFO_TE ) +#define configure_pin_wdardy() DDR_INFO &= ~( 1 << PIN_INFO_WDARDY ) +#define configure_pin_tr() DDR_INFO |= ( 1 << PIN_INFO_TR ) +#define configure_pin_reset() DDR_INFO &= ~( 1 << PIN_INFO_RST ) + +#define port_data_set(x) ( PORT_DATA = ( x ) ) +#define port_info_set(x) ( PORT_INFO = ( x ) ) +#define port_data_get() PIN_DATA +#define port_info_get() PIN_INFO + +/* functions dealing with the 74138 address decoder */ +#define configure_pin_addr0() DDR_ADRDEC |= ( 1 << PIN_ADRDEC_ADDR0 ) +#define configure_pin_addr1() DDR_ADRDEC |= ( 1 << PIN_ADRDEC_ADDR1 ) +#define configure_pin_addr2() DDR_ADRDEC |= ( 1 << PIN_ADRDEC_ADDR2 ) + +#define init_addressdecoder() PORT_ADRDEC &= ~( ( 1 << PIN_ADRDEC_ADDR0 ) | ( 1 << PIN_ADRDEC_ADDR1 ) | ( 1 << PIN_ADRDEC_ADDR2 ) ) +#define enable_p8000_transeiver() PORT_ADRDEC |= ( 1 << PIN_ADRDEC_ADDR0 ) +#define disable_p8000_transeiver() PORT_ADRDEC &= ~( 1 << PIN_ADRDEC_ADDR0 ) + +/* functions dealing with the MMC interface */ + +#define configure_pin_miso() DDR_MMC &= ~ ( 1 << PIN_MMC_MISO ) +#define configure_pin_sck() DDR_MMC |= ( 1 << PIN_MMC_SCK ) +#define configure_pin_mosi() DDR_MMC |= ( 1 << PIN_MMC_MOSI ) +#define configure_pin_mmc_cs() DDR_MMC |= ( 1 << PIN_MMC_CS ) + +#define mmc_disable() PORT_MMC|= (1< -#include "config.h" -#include "mmc.h" +#include "wdc_config.h" +#include "wdc_avr.h" +#include "wdc_drv_mmc.h" #include "uart.h" #define wait_till_send_done() while ( ! ( SPSR & ( 1 << SPIF ) ) ) @@ -39,8 +40,6 @@ #define send_dummy_byte() SPDR = 0xFF; wait_till_send_done() #define recv_byte() SPDR #define xmit_byte(x) SPDR = x -#define mmc_disable() PORT_MMC|= (1< -#include "mmc.h" +#include "wdc_drv_mmc.h" #include "uart.h" #include "wdc_par.h" -uint8_t wdc_init_sdcard() +uint8_t wdc_init_disk() { return mmc_init(); } -uint32_t wdc_sector2sdblock ( uint16_t req_cylinder, uint8_t req_head, uint8_t req_sector ) +uint32_t wdc_sector2diskblock ( uint16_t req_cylinder, uint8_t req_head, uint8_t req_sector ) { return ( ( req_cylinder * wdc_get_hdd_heads() * wdc_get_hdd_sectors() ) + ( req_head * wdc_get_hdd_sectors() ) + ( req_sector - 1 ) ); } -uint32_t wdc_p8kblock2sdblock ( uint32_t blockno ) +uint32_t wdc_p8kblock2diskblock ( uint32_t blockno ) { return ( blockno + ( wdc_get_hdd_heads() * wdc_get_hdd_sectors() ) ); 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 4e23c42..1bf62ab 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.h +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.h @@ -26,15 +26,15 @@ */ /* - * $Id: wdc_if_disk.h,v 1.6 2012/06/07 18:01:02 olivleh1 Exp $ + * $Id: wdc_if_disk.h,v 1.7 2012/06/12 17:34:14 olivleh1 Exp $ */ -#ifndef WDC_IF_SDCARD_H_ -#define WDC_IF_SDCARD_H_ +#ifndef WDC_IF_DISK_H_ +#define WDC_IF_DISK_H_ -extern uint8_t wdc_init_sdcard(); -extern uint32_t wdc_sector2sdblock ( uint16_t req_cylinder, uint8_t req_head, uint8_t req_sector ); -extern uint32_t wdc_p8kblock2sdblock ( uint32_t blockno ); +extern uint8_t wdc_init_disk(); +extern uint32_t wdc_sector2diskblock ( uint16_t req_cylinder, uint8_t req_head, uint8_t req_sector ); +extern uint32_t wdc_p8kblock2diskblock ( uint32_t blockno ); extern uint8_t wdc_write_sector ( uint32_t addr, uint8_t *sector ); extern uint8_t wdc_read_sector ( uint32_t addr, uint8_t *sector ); extern uint8_t wdc_read_multiblock ( uint32_t addr, uint8_t *sector, uint8_t numblocks ); @@ -42,4 +42,4 @@ extern uint8_t wdc_write_multiblock ( uint32_t addr, uint8_t *sector, uint8_t nu #define WDC_BLOCKLEN 512 -#endif /* WDC_IF_SDCARD_H_ */ \ No newline at end of file +#endif /* WDC_IF_DISK_H_ */ \ No newline at end of file diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk_perf.c b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk_perf.c index 5950e18..7d72f10 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk_perf.c +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk_perf.c @@ -26,7 +26,7 @@ */ /* - * $Id: wdc_if_disk_perf.c,v 1.4 2012/06/09 19:47:31 olivleh1 Exp $ + * $Id: wdc_if_disk_perf.c,v 1.5 2012/06/12 17:34:14 olivleh1 Exp $ */ #include @@ -36,8 +36,8 @@ #include #include #include -#include "config.h" -#include "wdc_if_sdcard.h" +#include "wdc_config.h" +#include "wdc_if_disk.h" #include "wdc_ram.h" #include "uart.h" diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.c b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.c index dd60903..8350519 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.c +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.c @@ -26,37 +26,18 @@ */ /* - * $Id: wdc_if_p8000.c,v 1.8 2012/06/10 21:11:03 olivleh1 Exp $ + * $Id: wdc_if_p8000.c,v 1.9 2012/06/12 17:34:14 olivleh1 Exp $ */ -#include "config.h" -#include +#include "wdc_config.h" +#include #include -#include "wdc_if_pio.h" +#include "wdc_avr.h" +#include "wdc_if_p8000.h" #include "wdc_par.h" -#include "uart.h" #define nop() __asm__ __volatile__ ("nop" ::) -void wdc_init_ports() -{ - configure_pin_status0(); - configure_pin_status1(); - configure_pin_status2(); - configure_pin_astb(); - configure_pin_te(); - configure_pin_wdardy(); - configure_pin_tr(); - configure_pin_reset(); - DDRD |= ( ( 1 << PIND5 ) ); - DDRD |= ( ( 1 << PIND6 ) ); - DDRD |= ( ( 1 << PIND7 ) ); - PORTD &= ~ ( ( 1 << PIND5 ) ); - PORTD &= ~ ( ( 1 << PIND6 ) ); - PORTD &= ~ ( ( 1 << PIND7 ) ); - configure_port_data_read(); -} - void wdc_wait_for_reset() { while ( !isset_info_reset() ) { @@ -81,12 +62,10 @@ uint8_t wdc_read_data_from_p8k ( uint8_t *buffer, uint16_t count, uint8_t wdc_st return 0; while ( !isset_info_wdardy() ); do { + enable_p8000_transeiver(); /* this also generates /ASTB in the moment /WDARDY gets low with a 7403 */ while ( isset_info_wdardy() ); - PORTD |= ( ( 1 << PIND5 ) ); - nop(); - nop(); buffer[datacnt] = ( uint8_t ) port_data_get(); - PORTD &= ~ ( ( 1 << PIND5 ) ); + disable_p8000_transeiver(); /* this additionally brings /ASTB to high */ while ( !isset_info_wdardy() ); datacnt++; } while ( datacnt < count ); @@ -106,24 +85,21 @@ void wdc_write_data_to_p8k ( uint8_t *buffer, uint16_t count, uint8_t wdc_status configure_port_data_write(); while ( !isset_info_wdardy() ); do { + enable_p8000_transeiver(); /* this also generates /ASTB in the moment /WDARDY gets low with a 7403 */ while ( isset_info_wdardy() ); - PORTD |= ( ( 1 << PIND5 ) ); - nop(); - nop(); port_data_set ( buffer[datacnt] ); - PORTD &= ~ ( ( 1 << PIND5 ) ); - while ( !isset_info_wdardy() ); + disable_p8000_transeiver(); /* this additionally brings /ASTB to high */ + while ( !isset_info_wdardy() ); datacnt++; } while ( datacnt < count ); while ( isset_info_wdardy() ); - PORTD |= ( ( 1 << PIND5 ) ); + enable_p8000_transeiver(); nop(); - PORTD &= ~ ( ( 1 << PIND5 ) ); + disable_p8000_transeiver(); configure_port_data_read(); while ( !isset_info_wdardy() ); port_info_set ( INFO_CLEAR ); - } uint8_t wdc_receive_cmd ( uint8_t *buffer, uint16_t count ) 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 b121b76..ad8dd04 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.h +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.h @@ -26,31 +26,14 @@ */ /* - * $Id: wdc_if_p8000.h,v 1.9 2012/06/10 21:03:23 olivleh1 Exp $ + * $Id: wdc_if_p8000.h,v 1.10 2012/06/12 17:34:14 olivleh1 Exp $ */ -#ifndef WDC_IF_PIO_H_ -#define WDC_IF_PIO_H_ +#ifndef WDC_IF_P8000_H_ +#define WDC_IF_P8000_H_ #define DELAY_PIO_US 550 -#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_pin_status0() DDR_INFO |= (1 << PIN_INFO_STATUS0) -#define configure_pin_status1() DDR_INFO |= (1 << PIN_INFO_STATUS1) -#define configure_pin_status2() DDR_INFO |= (1 << PIN_INFO_STATUS2) -#define configure_pin_astb() DDR_INFO |= (1 << PIN_INFO_ASTB) -#define configure_pin_te() DDR_INFO &= ~(1 << PIN_INFO_TE) -#define configure_pin_wdardy() DDR_INFO &= ~(1 << PIN_INFO_WDARDY) -#define configure_pin_tr() DDR_INFO |= (1 << PIN_INFO_TR) -#define configure_pin_reset() DDR_INFO &= ~(1 << PIN_INFO_RST) - -#define port_data_set(x) (PORT_DATA = (x)) -#define port_info_set(x) (PORT_INFO = (x)) -#define port_data_get(x) PIN_DATA -#define port_info_get(x) PIN_INFO - /* input pin handling */ #define isset_info_reset() ((PIN_INFO) & (1 << PIN_INFO_RST)) #define isset_info_te() ((PIN_INFO) & (1 << PIN_INFO_TE)) @@ -60,14 +43,12 @@ #define DATA_CLEAR 0x00 #define INFO_CLEAR 0x00 -#define INFO_ASTB (1 << PIN_INFO_ASTB) /* 0x08 */ #define INFO_STAT_GCMD (1 << PIN_INFO_STATUS0) /* 0x01 */ #define INFO_STAT_RDATA (1 << PIN_INFO_STATUS1) /* 0x02 */ #define INFO_STAT_WDATA ((1 << PIN_INFO_STATUS0) | (1 << PIN_INFO_STATUS1)) /* 0x03 */ #define INFO_STAT_ERROR ((1 << PIN_INFO_STATUS0) | (1 << PIN_INFO_STATUS1) | (1 << PIN_INFO_STATUS2)) /* 0x07 */ #define INFO_TR (1 << PIN_INFO_TR) /* 0x40 */ -extern void wdc_init_ports(); extern void wdc_wait_for_reset(); extern uint8_t wdc_receive_cmd ( uint8_t *buffer, uint16_t count ); extern void wdc_receive_data ( uint8_t *buffer, uint16_t count ); @@ -75,4 +56,4 @@ extern void wdc_send_data ( uint8_t *buffer, uint16_t count ); extern void wdc_send_error(); extern void wdc_send_errorcode ( uint8_t error ); -#endif /* WDC_IF_PIO_H_ */ \ No newline at end of file +#endif /* WDC_IF_P8000_H_ */ \ No newline at end of file diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.c b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.c index 19a225f..06e07e2 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.c +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.c @@ -29,7 +29,7 @@ /* * P8000 WDC Emulator * - * $Id: wdc_main.c,v 1.26 2012/06/10 21:10:44 olivleh1 Exp $ + * $Id: wdc_main.c,v 1.27 2012/06/12 17:34:14 olivleh1 Exp $ * * TODO: - right now, BTT entries are not taken into account */ @@ -41,16 +41,16 @@ #include #include #include -#include "config.h" -#include "main.h" +#include "wdc_config.h" +#include "wdc_main.h" #ifdef DEBUG #include "uart.h" #endif +#include "wdc_avr.h" #include "wdc_ram.h" #include "wdc_par.h" -#include "wdc_if_pio.h" -#include "wdc_if_sdcard.h" - +#include "wdc_if_p8000.h" +#include "wdc_if_disk.h" void atmega_setup ( void ); @@ -94,7 +94,6 @@ main ( void ) blockno = 0; data_counter = WDC_BLOCKLEN; wdc_read_sector ( blockno, data_buffer ); - if ( data_buffer[0] == 'W' && data_buffer[1] == 'D' && data_buffer[2] == 'C' && @@ -175,7 +174,7 @@ main ( void ) case CMD_WR_BLOCK: data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6]; - blockno = wdc_p8kblock2sdblock ( ( ( uint32_t ) cmd_buffer[5] << 24 ) | ( ( uint32_t ) cmd_buffer[4] << 16 ) | ( ( uint16_t ) cmd_buffer[3] << 8 ) | cmd_buffer[2] ); + blockno = wdc_p8kblock2diskblock ( ( ( 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 ); @@ -193,7 +192,7 @@ main ( void ) case CMD_RD_BLOCK: data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6]; - blockno = wdc_p8kblock2sdblock ( ( ( uint32_t ) cmd_buffer[5] << 24 ) | ( ( uint32_t ) cmd_buffer[4] << 16 ) | ( ( uint16_t ) cmd_buffer[3] << 8 ) | cmd_buffer[2] ); + blockno = wdc_p8kblock2diskblock ( ( ( uint32_t ) cmd_buffer[5] << 24 ) | ( ( uint32_t ) cmd_buffer[4] << 16 ) | ( ( uint16_t ) cmd_buffer[3] << 8 ) | cmd_buffer[2] ); errorcode = 1; if ( data_counter == WDC_BLOCKLEN ) { @@ -298,7 +297,7 @@ main ( void ) data_counter = WDC_BLOCKLEN; memset ( &data_buffer[0], 0x00, data_counter ); - blockno = wdc_sector2sdblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 ) + blockno = wdc_sector2diskblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 ) , cmd_buffer[4] , cmd_buffer[5] ); @@ -356,7 +355,7 @@ main ( void ) case CMD_VER_TRACK: data_counter = WDC_BLOCKLEN; - blockno = wdc_sector2sdblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 ) + blockno = wdc_sector2diskblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 ) , cmd_buffer[4] , cmd_buffer[5] ); @@ -373,7 +372,7 @@ main ( void ) case CMD_RD_SECTOR: data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6]; - blockno = wdc_sector2sdblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 ) + blockno = wdc_sector2diskblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 ) , cmd_buffer[4] , cmd_buffer[5] ); @@ -417,9 +416,8 @@ void atmega_setup ( void ) { set_sleep_mode ( SLEEP_MODE_IDLE ); uart_init(); - wdc_init_ports(); - if ( wdc_init_sdcard() ) { + wdc_init_avr(); + if ( wdc_init_disk() ) { wdc_set_no_disk(); } - } \ No newline at end of file diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_par.c b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_par.c index 25389f1..13c7bda 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_par.c +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_par.c @@ -26,11 +26,11 @@ */ /* - * $Id: wdc_par.c,v 1.4 2012/06/09 19:47:31 olivleh1 Exp $ + * $Id: wdc_par.c,v 1.5 2012/06/12 17:34:14 olivleh1 Exp $ */ #include -#include "main.h" +#include "wdc_main.h" #include "wdc_par.h" #include "uart.h"