diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile b/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile index ef86d7a..95ad55b 100755 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile @@ -36,7 +36,10 @@ SUBDIRS := # Add inputs and outputs from these tool invocations to the build variables C_SRCS += \ ../main.c \ -../uart.c +../uart.c \ +../wdc_if_pio.c \ +../wdc_if_sdcard.c \ +../wdc_ram.c PREPROCESSING_SRCS += @@ -47,22 +50,34 @@ ASM_SRCS += OBJS += \ main.o \ -uart.o +uart.o \ +wdc_if_pio.o \ +wdc_if_sdcard.o \ +wdc_ram.o OBJS_AS_ARGS += \ main.o \ -uart.o +uart.o \ +wdc_if_pio.o \ +wdc_if_sdcard.o \ +wdc_ram.o C_DEPS += \ main.d \ -uart.d +uart.d \ +wdc_if_pio.d \ +wdc_if_sdcard.d \ +wdc_ram.d C_DEPS_AS_ARGS += \ main.d \ -uart.d +uart.d \ +wdc_if_pio.d \ +wdc_if_sdcard.d \ +wdc_ram.d OUTPUT_FILE_PATH +=P8000_WDC_Emulator.elf @@ -79,10 +94,16 @@ 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 -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 -fpack-struct -fshort-enums -g2 -Wall -Wundef -Werror -pedantic -pedantic-errors -c -std=gnu99 -save-temps -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -mmcu=atmega1284p -o"$@" "$<" @echo Finished building: $< diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/makedep.mk b/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/makedep.mk index d365230..84642ee 100755 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/makedep.mk +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/makedep.mk @@ -6,3 +6,9 @@ main.c uart.c +wdc_if_pio.c + +wdc_if_sdcard.c + +wdc_ram.c + 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 029362b..a24869c 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/P8000_WDC_Emulator.cproj +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/P8000_WDC_Emulator.cproj @@ -45,26 +45,28 @@ - True - True - True - True - True - Optimize (-O1) - True - True - Default (-g2) - True - True - True - True - - - m - - - Default (-Wa,-g) - + True + True + True + True + True + Optimize (-O1) + True + True + Default (-g2) + True + True + True + True + True + True + + + m + + + Default (-Wa,-g) + @@ -83,6 +85,24 @@ compile + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + \ No newline at end of file diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.c b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.c new file mode 100644 index 0000000..050c99d --- /dev/null +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.c @@ -0,0 +1,11 @@ +/* + * P8000 WDC Emulator + * + * $Id: wdc_if_disk.c,v 1.1 2012/05/31 20:21:51 olivleh1 Exp $ + * + */ + +void wdc_init_sdcard() +{ + asm("nop"); +} \ No newline at end of file diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.h b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.h new file mode 100644 index 0000000..d66c916 --- /dev/null +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk.h @@ -0,0 +1,13 @@ +/* + * P8000 WDC Emulator + * + * $Id: wdc_if_disk.h,v 1.1 2012/05/31 20:21:51 olivleh1 Exp $ + * + */ + +#ifndef WDC_IF_SDCARD_H_ +#define WDC_IF_SDCARD_H_ + +void wdc_init_sdcard(); + +#endif /* WDC_IF_SDCARD_H_ */ \ No newline at end of file diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.c b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.c new file mode 100644 index 0000000..f422313 --- /dev/null +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.c @@ -0,0 +1,123 @@ +/* + * P8000 WDC Emulator + * + * $Id: wdc_if_p8000.c,v 1.1 2012/05/31 20:21:51 olivleh1 Exp $ + * + */ + +#include "config.h" +#include +#include +#include "wdc_if_pio.h" + +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(); + + configure_port_data_read(); +} + +void wdc_wait_for_reset() +{ + while ( !isset_info_reset() ) { + port_data_set ( DATA_CLEAR ); + port_info_set ( INFO_CLEAR ); + } + +} + +void wdc_read_data_from_p8k ( uint8_t *buffer, uint16_t count, uint8_t wdc_status ) +{ + uint16_t datacnt; + + _delay_us ( DELAY_PIO_US ); + + configure_port_data_read(); + datacnt = 0; + port_info_set ( wdc_status ); + while ( !isset_info_te() ); + while ( !isset_info_wdardy() ); + do { + while ( isset_info_wdardy() ); + port_info_set ( INFO_ASTB | wdc_status ); + buffer[datacnt] = ( uint8_t ) port_data_get(); + port_info_set ( wdc_status ); + while ( !isset_info_wdardy() ); + datacnt++; + } while ( datacnt < count ); + port_info_set ( INFO_CLEAR ); + +} + +void wdc_write_data_to_p8k ( uint8_t *buffer, uint16_t count, uint8_t wdc_status ) +{ + uint16_t datacnt = 0; + + _delay_us ( DELAY_PIO_US ); + + port_info_set ( INFO_TR | wdc_status ); + while ( isset_info_te() ); + configure_port_data_write(); + while ( !isset_info_wdardy() ); + do { + while ( isset_info_wdardy() ); + port_info_set ( INFO_TR | INFO_ASTB | wdc_status ); + port_data_set ( buffer[datacnt] ); + port_info_set ( INFO_TR | wdc_status ); + while ( !isset_info_wdardy() ); + + datacnt++; + } while ( datacnt < count ); + while ( isset_info_wdardy() ); + port_info_set ( INFO_TR | INFO_ASTB | wdc_status ); + asm ( "nop" ); + asm ( "nop" ); + port_info_set ( INFO_TR | wdc_status ); + configure_port_data_read(); + while ( !isset_info_wdardy() ); + port_info_set ( INFO_CLEAR ); + +} + +void wdc_receive_cmd ( uint8_t *buffer, uint16_t count ) +{ + wdc_read_data_from_p8k ( buffer + , count + , INFO_STAT_GCMD + ); +} + +void wdc_receive_data ( uint8_t *buffer, uint16_t count ) +{ + wdc_read_data_from_p8k ( buffer + , count + , INFO_STAT_RDATA + ); +} + +void wdc_send_data ( uint8_t *buffer, uint16_t count ) +{ + wdc_write_data_to_p8k ( buffer + , count + , INFO_STAT_WDATA + ); +} + +void wdc_send_error() +{ + uint8_t data_buffer[1]; + + data_buffer[0] = 0x01; + + wdc_write_data_to_p8k ( data_buffer + , 1 + , INFO_STAT_ERROR + ); +} \ No newline at end of file diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.h b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.h new file mode 100644 index 0000000..ce9862a --- /dev/null +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_p8000.h @@ -0,0 +1,53 @@ +/* + * P8000 WDC Emulator + * + * $Id: wdc_if_p8000.h,v 1.1 2012/05/31 20:21:51 olivleh1 Exp $ + * + */ + +#ifndef WDC_IF_PIO_H_ +#define WDC_IF_PIO_H_ + +#define DELAY_PIO_US 500 + +#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)) +#define isset_info_wdardy() ((PIN_INFO) & (1 << PIN_INFO_WDARDY)) + +/* output pin handling */ +#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 */ + +void wdc_init_ports(); +void wdc_wait_for_reset(); +void wdc_receive_cmd(uint8_t *buffer, uint16_t count); +void wdc_receive_data(uint8_t *buffer, uint16_t count); +void wdc_send_data(uint8_t *buffer, uint16_t count); +void wdc_send_error(); + +#endif /* WDC_IF_PIO_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 04cff22..35a019a 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.c +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.c @@ -1,209 +1,175 @@ /* * P8000 WDC Emulator * - * $Id: wdc_main.c,v 1.4 2012/05/30 20:07:10 olivleh1 Exp $ - * - */ + * $Id: wdc_main.c,v 1.5 2012/05/31 20:21:51 olivleh1 Exp $ + * + */ - -#include "config.h" #include #include #include #include -#include -#include -#include #include "main.h" #include "uart.h" +#include "wdc_ram.h" +#include "wdc_if_pio.h" +#include "wdc_if_sdcard.h" + #define DEBUG 1 -void atmega_setup(void); -void wdc_read_data_from_p8k(uint8_t **data_buffer, uint8_t data_count); -void wdc_write_data_to_ram(uint8_t **data_buffer, uint16_t data_address, uint8_t data_count); +void atmega_setup ( void ); -int main(void) +int main ( void ) { - uint8_t cmdbuffer[9]; - uint8_t cmdcnt; - uint8_t buffer[9]; - uint8_t datacnt; + uint16_t cmd_counter = 9; uint16_t data_counter; - uint16_t data_address; uint8_t *data_buffer = NULL; + uint8_t *cmd_buffer = NULL; atmega_setup(); - - uart_puts_p(PSTR("P8000 WDC Emulator 0.01\n")); - while(1) - { + uart_puts_p ( PSTR ( "P8000 WDC Emulator 0.01\n" ) ); - while( !isset_info_reset() ) - { - port_data_set( DATA_CLEAR ); - port_info_set( INFO_CLEAR ); - } + while ( 1 ) { - configure_port_data_read(); - cmdcnt = 0; - port_info_set( INFO_STAT_GCMD ); - - while ( !isset_info_te() ); - while ( !isset_info_wdardy() ); - while ( cmdcnt < 9 ) - { - while ( isset_info_wdardy() ); - port_info_set( INFO_ASTB | INFO_STAT_GCMD ); - cmdbuffer[cmdcnt] = port_data_get(); - port_info_set( INFO_STAT_GCMD ); - while ( !isset_info_wdardy() ); - cmdcnt++; - } - port_info_set( INFO_CLEAR ); + wdc_wait_for_reset(); - switch( cmdbuffer[0] ) - { + cmd_buffer = malloc ( cmd_counter * sizeof ( *cmd_buffer ) ); + + wdc_receive_cmd ( cmd_buffer + , cmd_counter + ); + + +#ifdef DEBUG + uart_puts_p ( PSTR ( " CMD Buffer:" ) ); + uart_putc_hex ( cmd_buffer[0] ); + uart_putc_hex ( cmd_buffer[1] ); + uart_putc_hex ( cmd_buffer[2] ); + uart_putc_hex ( cmd_buffer[3] ); + uart_putc_hex ( cmd_buffer[4] ); + uart_putc_hex ( cmd_buffer[5] ); + uart_putc_hex ( cmd_buffer[6] ); + uart_putc_hex ( cmd_buffer[7] ); + uart_putc_hex ( cmd_buffer[8] ); + uart_putc ( '\n' ); +#endif + + switch ( cmd_buffer[0] ) { case CMD_WR_WDC_RAM: - data_counter = (cmdbuffer[7]<<8)|cmdbuffer[6]; + data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6]; + data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) ); - wdc_read_data_from_p8k(&data_buffer - ,data_counter + wdc_receive_data ( data_buffer + , data_counter + ); + + wdc_write_data_to_ram ( data_buffer + , convert_ram_address ( ( cmd_buffer[2] << 8 ) | cmd_buffer[1] ) + , data_counter ); - wdc_write_data_to_ram(&data_buffer - ,convert_ram_address((cmdbuffer[2]<<8)+cmdbuffer[1]) - ,data_counter - ); - - free(data_buffer); + free ( data_buffer ); break; case CMD_RD_WDC_RAM: - data_counter = (cmdbuffer[7]<<8)|cmdbuffer[6]; - data_address = convert_ram_address((cmdbuffer[2]<<8)+cmdbuffer[1]); - do - { - data_counter--; - buffer[+data_counter] = wdc_ram[data_address+data_counter]; - } while (data_counter > 0); + data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6]; + data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) ); - _delay_us(560); + wdc_read_data_from_ram ( data_buffer + , convert_ram_address ( ( cmd_buffer[2] << 8 ) | cmd_buffer[1] ) + , data_counter + ); - data_counter = (cmdbuffer[7]<<8)|cmdbuffer[6]; - datacnt = 0; + wdc_send_data ( data_buffer + , data_counter + ); - port_info_set( INFO_TR |INFO_STAT_WDATA ); - while ( isset_info_te() ); - configure_port_data_write(); - while ( !isset_info_wdardy() ); - while ( datacnt < data_counter ) - { - while ( isset_info_wdardy() ); - port_info_set( INFO_TR | INFO_ASTB | INFO_STAT_WDATA ); - port_data_set(buffer[datacnt]); - port_info_set( INFO_TR |INFO_STAT_WDATA ); - while ( !isset_info_wdardy() ); + free ( data_buffer ); + break; - datacnt++; - } - while ( isset_info_wdardy() ); - port_info_set( INFO_TR | INFO_ASTB | INFO_STAT_WDATA ); - asm("nop"); - port_info_set( INFO_TR |INFO_STAT_WDATA ); - configure_port_data_read(); - port_info_set( INFO_CLEAR ); + case CMD_RD_PARTAB: + + data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6]; + data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) ); + + wdc_read_partab ( data_buffer + , data_counter ); + + wdc_send_data ( data_buffer + , data_counter + ); + + free ( data_buffer ); + break; + + case CMD_WR_PARTAB: + + data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6]; + data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) ); + + wdc_receive_data ( data_buffer + , data_counter + ); + + wdc_write_partab ( data_buffer + , data_counter ); + + free ( data_buffer ); + break; + + case CMD_DL_BTTAB: + + wdc_del_bttab(); + break; + + case CMD_RD_BTTAB: + + data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6]; + data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) ); + + wdc_read_bttab ( data_buffer + , data_counter ); + + wdc_send_data ( data_buffer + , data_counter + ); + + free ( data_buffer ); + break; + + case CMD_WR_BTTAB: + + data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6]; + data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) ); + + wdc_receive_data ( data_buffer + , data_counter + ); + + wdc_write_bttab ( data_buffer + , data_counter ); + + free ( data_buffer ); break; default: - _delay_us(560); - port_info_set( INFO_TR | INFO_STAT_ERROR ); - while ( isset_info_te() ); - configure_port_data_write(); - while ( !isset_info_wdardy() ); - while ( isset_info_wdardy() ); - port_info_set( INFO_TR | INFO_ASTB | INFO_STAT_ERROR ); - port_data_set(0x01); - port_info_set( INFO_TR | INFO_STAT_ERROR ); - while ( !isset_info_wdardy() ); - while ( isset_info_wdardy() ); - port_info_set( INFO_TR | INFO_ASTB | INFO_STAT_ERROR ); - asm("nop"); - asm("nop"); - port_info_set( INFO_TR | INFO_STAT_ERROR ); - configure_port_data_read(); - while ( !isset_info_wdardy() ); - port_info_set( INFO_CLEAR ); + + wdc_send_error(); break; } -#ifdef DEBUG - uart_puts_p(PSTR(" CMD Buffer:")); - uart_putc_hex(cmdbuffer[0]); - uart_putc_hex(cmdbuffer[1]); - uart_putc_hex(cmdbuffer[2]); - uart_putc_hex(cmdbuffer[3]); - uart_putc_hex(cmdbuffer[4]); - uart_putc_hex(cmdbuffer[5]); - uart_putc_hex(cmdbuffer[6]); - uart_putc_hex(cmdbuffer[7]); - uart_putc_hex(cmdbuffer[8]); - uart_putc('\n'); -#endif + + free ( cmd_buffer ); } return 0; } -void atmega_setup(void) +void atmega_setup ( void ) { - set_sleep_mode(SLEEP_MODE_IDLE); - - configure_pin_status0(); - configure_pin_status1(); - configure_pin_status2(); - configure_pin_astb(); - configure_pin_te(); - configure_pin_wdardy(); - configure_pin_tr(); - configure_pin_reset(); - - configure_port_data_read(); - + set_sleep_mode ( SLEEP_MODE_IDLE ); + wdc_init_ports(); + wdc_init_sdcard(); uart_init(); -} - -void wdc_read_data_from_p8k(uint8_t **data_buffer, uint8_t data_count) -{ - int datacnt = 0; - - (*data_buffer) = (uint8_t *)malloc(data_count); - - _delay_us(560); - - configure_port_data_read(); - port_info_set( INFO_STAT_RDATA ); - while ( !isset_info_te() ); - while ( !isset_info_wdardy() ); - do - { - while ( isset_info_wdardy() ); - port_info_set( INFO_ASTB | INFO_STAT_RDATA ); - (*data_buffer)[datacnt] = port_data_get(); - port_info_set( INFO_STAT_RDATA ); - while ( !isset_info_wdardy() ); - - datacnt++; - } while ( datacnt < data_count ); - - port_info_set( INFO_CLEAR ); -} - -void wdc_write_data_to_ram(uint8_t **data_buffer, uint16_t data_address, uint8_t data_count) -{ - do - { - data_count--; - wdc_ram[data_address+data_count] = (*data_buffer)[data_count]; - } while (data_count > 0); } \ No newline at end of file diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.h b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.h index c05fc79..97a1381 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.h +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.h @@ -1,51 +1,20 @@ /* * P8000 WDC Emulator * - * $Id: wdc_main.h,v 1.4 2012/05/30 16:41:00 olivleh1 Exp $ - * - */ + * $Id: wdc_main.h,v 1.5 2012/05/31 20:21:51 olivleh1 Exp $ + * + */ #ifndef MAIN_H_ #define MAIN_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_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)) -#define isset_info_wdardy() ((PIN_INFO) & (1 << PIN_INFO_WDARDY)) - -/* output pin handling */ -#define DATA_CLEAR 0x00 -#define INFO_CLEAR 0x00 - -#define INFO_ASTB (1 << PIN_INFO_ASTB) -#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 0x40 - #define CMD_WR_WDC_RAM 0x18 /* P8000 Command: write data to WDC RAM */ #define CMD_RD_WDC_RAM 0x08 /* P8000 Command: read data from WDC RAM */ +#define CMD_RD_PARTAB 0x28 /* P8000 Command: read Parameter block from WDC RAM */ +#define CMD_WR_PARTAB 0x78 /* P8000 Command: write Parameter block to WDC RAM */ +#define CMD_DL_BTTAB 0x48 /* P8000 Command: delete Bad Track Table from WDC RAM */ +#define CMD_RD_BTTAB 0x58 /* P8000 Command: read Bad Track Table from WDC RAM */ +#define CMD_WR_BTTAB 0x68 /* P8000 Command: write Bad Track Table to WDC RAM */ -unsigned char wdc_ram[2048]; -#define convert_ram_address(x) ((x) - 0x2000) /* The S-RAM of the original WDC hardware starts at 0x2000. - We use an array as RAM here and no direct RAM access */ #endif /* MAIN_H_ */ diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_ram.c b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_ram.c new file mode 100644 index 0000000..a30b658 --- /dev/null +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_ram.c @@ -0,0 +1,74 @@ +/* + * P8000 WDC Emulator + * + * $Id: wdc_ram.c,v 1.1 2012/05/31 20:21:51 olivleh1 Exp $ + * + */ + +#include + +uint8_t par_table[200] = { 'W', 'D', 'C', '_', '4', '.', '2', 0x00, 'R', 'O', 'B', ' ', 'K', '5', '5', '0', + '4', '.', '5', '0', 0x00, 0x00, 0x00, 0x00, 0x04, 0x05, 0x12, 0x00, 0x04, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x01, 0x00, 0x01, 0x01, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; +uint8_t bt_table[125]; +unsigned char wdc_ram[2048]; + + +void wdc_write_data_to_ram ( uint8_t *buffer, uint16_t address, uint16_t count ) +{ + do { + count--; + wdc_ram[address + count] = buffer[count]; + } while ( count > 0 ); +} + +void wdc_read_data_from_ram ( uint8_t *buffer, uint16_t address, uint16_t count ) +{ + + do { + count--; + buffer[count] = wdc_ram[address + count]; + } while ( count > 0 ); + +} + +void wdc_read_partab ( uint8_t *buffer, uint16_t count ) +{ + do { + count--; + buffer[count] = par_table[count]; + } while ( count > 0 ); +} + +void wdc_write_partab ( uint8_t *buffer, uint16_t count ) +{ + do { + count--; + par_table[count + 8] = buffer[count]; + } while ( count > 0 ); +} + +void wdc_del_bttab() +{ + uint8_t i; + for ( i = 0; i < 125; i++ ) + bt_table[i] = 0x00; +} + +void wdc_read_bttab ( uint8_t *buffer, uint16_t count ) +{ + do { + count--; + buffer[count] = bt_table[count]; + } while ( count > 0 ); +} + +void wdc_write_bttab ( uint8_t *buffer, uint16_t count ) +{ + do { + count--; + bt_table[count] = buffer[count]; + } while ( count > 0 ); +} \ No newline at end of file diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_ram.h b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_ram.h new file mode 100644 index 0000000..5213aa9 --- /dev/null +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_ram.h @@ -0,0 +1,23 @@ +/* + * P8000 WDC Emulator + * + * $Id: wdc_ram.h,v 1.1 2012/05/31 20:21:51 olivleh1 Exp $ + * + */ + +#ifndef WDC_RAM_H_ +#define WDC_RAM_H_ + +void wdc_write_data_to_ram ( uint8_t *buffer, uint16_t address, uint16_t count ); +void wdc_read_data_from_ram ( uint8_t *buffer, uint16_t address, uint16_t count ); + +void wdc_read_partab ( uint8_t *buffer, uint16_t count ); +void wdc_write_partab ( uint8_t *buffer, uint16_t count ); + +void wdc_del_bttab(); +void wdc_read_bttab ( uint8_t *buffer, uint16_t count ); +void wdc_write_bttab ( uint8_t *buffer, uint16_t count ); + +#define convert_ram_address(x) ((x) - 0x2000) /* The S-RAM of the original WDC hardware starts at 0x2000. We use an array as RAM here and no direct RAM access */ + +#endif /* WDC_RAM_H_ */ \ No newline at end of file