OSDN Git Service

flash program seqence optimized
authornaruko <naruko@24ea1065-a21e-4ca1-99c9-f5125deb0858>
Sun, 15 Nov 2009 02:41:49 +0000 (02:41 +0000)
committernaruko <naruko@24ea1065-a21e-4ca1-99c9-f5125deb0858>
Sun, 15 Nov 2009 02:41:49 +0000 (02:41 +0000)
git-svn-id: svn+ssh://svn.osdn.net/svnroot/unagi@306 24ea1065-a21e-4ca1-99c9-f5125deb0858

kazzo/trunk/bus_access.c
kazzo/trunk/bus_access.h
kazzo/trunk/flashmemory.c

index d9c0060..e6ad1a4 100644 (file)
@@ -284,41 +284,54 @@ R/W   |--_______---
 A0-A14|-<vaild address>-
 D0-D7 |----<iii>---
 */
-void cpu_write_flash(uint16_t address, uint16_t length, const uint8_t *data)
+static inline void cpu_write_flash_waveform(uint16_t address, uint8_t data)
 {
-       direction_write();
-       while(length != 0){
-               uint8_t control = bit_get_negative(CPU_PHI2);
-               address_set(address);
-               if(0){ //R/W = /WE controlled write operation
-                       if((address & 0x8000) != 0){
-                               control &= bit_get_negative(CPU_ROMCS);
-                               BUS_CONTROL_OUT = control;
-                       }
-                       control &= bit_get_negative(CPU_RW);
-                       BUS_CONTROL_OUT = control;
-                       DATABUS_OUT = *data;
-                       data++;
-                       control |= 1 << CPU_RW; //R/W close
-                       BUS_CONTROL_OUT = control;
-               }else{ ///ROMCS = /CS controlled write operation
-                       control &= bit_get_negative(CPU_RW);
+       uint8_t control = bit_get_negative(CPU_PHI2);
+       address_set(address);
+       if(0){ //R/W = /WE controlled write operation
+               if((address & 0x8000) != 0){
+                       control &= bit_get_negative(CPU_ROMCS);
                        BUS_CONTROL_OUT = control;
-                       if((address & 0x8000) != 0){
-                               control &= bit_get_negative(CPU_ROMCS);
-                               BUS_CONTROL_OUT = control;
-                       }
-                       DATABUS_OUT = *data;
-                       data++;
-                       control |= 1 << CPU_ROMCS;
+               }
+               control &= bit_get_negative(CPU_RW);
+               BUS_CONTROL_OUT = control;
+               DATABUS_OUT = data;
+               control |= 1 << CPU_RW; //R/W close
+               BUS_CONTROL_OUT = control;
+       }else{ ///ROMCS = /CS controlled write operation
+               control &= bit_get_negative(CPU_RW);
+               BUS_CONTROL_OUT = control;
+               if((address & 0x8000) != 0){
+                       control &= bit_get_negative(CPU_ROMCS);
                        BUS_CONTROL_OUT = control;
                }
-               BUS_CONTROL_OUT = BUS_CLOSE;
+               DATABUS_OUT = data;
+               control |= 1 << CPU_ROMCS;
+               BUS_CONTROL_OUT = control;
+       }
+       BUS_CONTROL_OUT = BUS_CLOSE;
+}
+void cpu_write_flash(uint16_t address, uint16_t length, const uint8_t *data)
+{
+       direction_write();
+       while(length != 0){
+               cpu_write_flash_waveform(address, *data);
+               data++;
                address += 1;
                length--;
        }
 }
 
+void cpu_write_flash_order(const struct flash_order *t)
+{
+       int length = FLASH_PROGRAM_ORDER;
+       direction_write();
+       while(length != 0){
+               cpu_write_flash_waveform(t->address, t->data);
+               t++;
+               length--;
+       }
+}
 /*
 NTSC hardware timing
 Master clock fsc: 21.4772272 MHz
@@ -367,16 +380,30 @@ void cpu_write_6502(uint16_t address, uint16_t length, const uint8_t *data)
        }
 }
 
+static inline void ppu_write_waveform(uint16_t address, uint8_t data)
+{
+       address_set(address);//PPU memory /CS open
+       BUS_CONTROL_OUT = bit_get_negative(PPU_WR);
+       DATABUS_OUT = data;
+       BUS_CONTROL_OUT = BUS_CLOSE;
+       address_set(1 << 13); //PPU memory /CS close
+}
 void ppu_write(uint16_t address, uint16_t length, const uint8_t *data)
 {
        while(length != 0){
-               address_set(address);//PPU memory /CS open
-               BUS_CONTROL_OUT = bit_get_negative(PPU_WR);
-               DATABUS_OUT = *data;
+               ppu_write_waveform(address, *data);
                data++;
-               BUS_CONTROL_OUT = BUS_CLOSE;
-               address_set(1 << 13); //PPU memory /CS close
                address += 1;
                length--;
        }
 }
+
+void ppu_write_order(const struct flash_order *t)
+{
+       int length = FLASH_PROGRAM_ORDER;
+       while(length != 0){
+               ppu_write_waveform(t->address, t->data);
+               t++;
+               length--;
+       }
+}
index 2811f39..d8d7f9b 100644 (file)
@@ -15,6 +15,15 @@ enum compare_status{
 };
 enum compare_status cpu_compare(uint16_t address, uint16_t length, const uint8_t *data);
 enum compare_status ppu_compare(uint16_t address, uint16_t length, const uint8_t *data);
+enum{
+       FLASH_PROGRAM_ORDER = 3
+};
+struct flash_order{
+       uint16_t address;
+       uint8_t data;
+};
+void cpu_write_flash_order(const struct flash_order *t);
+void ppu_write_order(const struct flash_order *t);
 #include <util/delay.h>
 static inline void clock_wait(double clock)
 {
index 7d79ba7..4da3ca2 100644 (file)
@@ -5,9 +5,10 @@
 //---- global variable ----
 struct flash_seqence{
        void (*const writer)(uint16_t address, uint16_t length, const uint8_t *data);
+       void (*const programmer)(const struct flash_order *t);
        void (*const reader)(uint16_t address, uint16_t length, uint8_t *data);
        enum compare_status (*const compare)(uint16_t address, uint16_t length, const uint8_t *data);
-       enum{
+       enum status{
                IDLE = 0, 
                ERASE, ERASE_WAIT,
                PROGRAM, TOGGLE_FIRST, TOGGLE_CHECK
@@ -16,13 +17,16 @@ struct flash_seqence{
        uint16_t address, length, program_unit;
        const uint8_t *data;
        uint8_t toggle, retry_count;
+       struct flash_order program_command[FLASH_PROGRAM_ORDER];
 };
 static struct flash_seqence seqence_cpu = {
-       .status = IDLE, .reader = cpu_read, .writer = cpu_write_flash,
+       .status = IDLE, .reader = cpu_read, 
+       .writer = cpu_write_flash, .programmer = cpu_write_flash_order,
        .compare = cpu_compare
 };
 static struct flash_seqence seqence_ppu = {
-       .status = IDLE, .reader = ppu_read, .writer = ppu_write,
+       .status = IDLE, .reader = ppu_read, 
+       .writer = ppu_write, .programmer = ppu_write_order,
        .compare = ppu_compare
 };
 
@@ -41,6 +45,12 @@ static void config_set(uint16_t c000x, uint16_t c2aaa, uint16_t c5555, uint16_t
        t->command_2aaa = c2aaa;
        t->command_5555 = c5555;
        t->program_unit = unit;
+       t->program_command[0].address = c5555;
+       t->program_command[0].data = 0xaa;
+       t->program_command[1].address = c2aaa;
+       t->program_command[1].data = 0x55;
+       t->program_command[2].address = c5555;
+       t->program_command[2].data = 0xa0;
 };
 void flash_cpu_config(uint16_t c000x, uint16_t c2aaa, uint16_t c5555, uint16_t unit)
 {
@@ -51,8 +61,10 @@ void flash_ppu_config(uint16_t c000x, uint16_t c2aaa, uint16_t c5555, uint16_t u
        config_set(c000x, c2aaa, c5555, unit, &seqence_ppu);
 }
 
-static void program_assign(uint16_t address, uint16_t length, const uint8_t *data, struct flash_seqence *t)
+static void program_assign(enum status status, uint16_t address, uint16_t length, const uint8_t *data, struct flash_seqence *t)
 {
+       t->status = status;
+       t->request = status;
        t->address = address;
        t->length = length;
        t->data = data;
@@ -60,29 +72,21 @@ static void program_assign(uint16_t address, uint16_t length, const uint8_t *dat
 }
 void flash_cpu_program(uint16_t address, uint16_t length, const uint8_t *data)
 {
-       seqence_cpu.status = PROGRAM;
-       seqence_cpu.request = PROGRAM;
-       program_assign(address, length, data, &seqence_cpu);
+       program_assign(PROGRAM, address, length, data, &seqence_cpu);
 }
 void flash_ppu_program(uint16_t address, uint16_t length, const uint8_t *data)
 {
-       seqence_ppu.status = PROGRAM;
-       seqence_ppu.request = PROGRAM;
-       program_assign(address, length, data, &seqence_ppu);
+       program_assign(PROGRAM, address, length, data, &seqence_ppu);
 }
 #define NULL (0)
 void flash_cpu_erase(uint16_t address)
 {
-       seqence_cpu.status = ERASE;
-       seqence_cpu.request = ERASE;
        //length ¤Ë unit ¤òÅϤ·¤Æ toggle check ¸å IDLE ¤Ë¤Ê¤ë¤è¤¦¤Ë¤¹¤ë
-       program_assign(address, seqence_cpu.program_unit, NULL, &seqence_cpu);
+       program_assign(ERASE, address, seqence_cpu.program_unit, NULL, &seqence_cpu);
 }
 void flash_ppu_erase(uint16_t address)
 {
-       seqence_ppu.status = ERASE;
-       seqence_ppu.request = ERASE;
-       program_assign(address, seqence_ppu.program_unit, NULL, &seqence_ppu);
+       program_assign(ERASE, address, seqence_ppu.program_unit, NULL, &seqence_ppu);
 }
 
 //---- command write ----
@@ -110,10 +114,11 @@ static void command_execute(const struct flash_command *c, const struct flash_se
 }
 static void program(const struct flash_seqence *t)
 {
-       static const struct flash_command c[] = {
+/*     static const struct flash_command c[] = {
                {C5555, 0xaa}, {C2AAA, 0x55}, {C5555, 0xa0}, {END, 0}
        };
-       command_execute(c, t);
+       command_execute(c, t);*/
+       t->programmer(t->program_command);
        t->writer(t->address, t->program_unit, t->data);
 }