diff --git a/avr/usbload/inflate.c b/avr/usbload/inflate.c index dfaa291..ae47ef6 100644 --- a/avr/usbload/inflate.c +++ b/avr/usbload/inflate.c @@ -27,41 +27,32 @@ #include "ringbuffer.h" char inflate_done = 0; -char *mem; char *mem_ref; -int addr = 0; int addr_ref = 0; +int cnt_hit = 0; +int cnt = 0; + void inflate_init() { neginf_init(0); - mem = (char*)malloc(2<<15); mem_ref = (char*)malloc(2<<15); addr_ref = 0; - addr = 0; rb_init(); } void inflate_flush() { - while(!rb_isempty()){ - mem[addr++] = rb_get(); - printf("final fill addr=0x%06x size=%i\n",addr,rb_free()); - } - printf("write out.smc\n"); + rb_flush(); FILE *file; - file = fopen("out.smc","w"); - fwrite(mem,2<<15,1,file); - fclose(file); - printf("write out_ref.smc\n"); file = fopen("out_ref.smc","w"); fwrite(mem_ref,2<<15,1,file); fclose(file); - + printf("cnt=%i cnt_hit=%i\n",cnt,cnt_hit); } void neginf_cb_completed() @@ -71,32 +62,21 @@ void neginf_cb_completed() void neginf_cb_seq_byte(nbyte byte) { - mem_ref[addr_ref++] = byte; - - - if (rb_isfull()) - mem[addr++] = rb_get(); - - printf("addr=%x byte=%i size=%i\n",addr,byte, rb_free()); rb_put(byte); - //assert(!rb_isfull()); } void neginf_cb_copy(nsize from, nsize to, nint length) { int i; - - printf("neginf_cb_copy addr=0x%06x from=0x%06x to=0x%06x len=%i\n",addr,from, to, length); - + cnt++; + if ((to - from) < ( 1024 * 2 ) ){ + cnt_hit++; + } + printf("neginf_cb_copy from=0x%06x to=0x%06x dist=%i len=%i\n",from, to, (to - from), length); for (i=0; i o b-> x */ +#include +#include +#include + #include "ringbuffer.h" +#define ringbuffer_size 2048 +#define memory_size 65536 -static char buf[ringbuffer_size]; -int rb_count; - #define t &buf[ringbuffer_size - 1] #define b &buf[0] +char buf[ringbuffer_size]; +int rb_count; +char *memory; +int pos_mem; +int pos_head; + + //char *t = &buf[ringbuffer_size - 1]; //char *b = &buf[0]; char *r; // position from where we can read (if rb_count > 0) char *w; // next free position (if rb_count < ringbuffer_size)) -void rb_init(void) +void rb_init() { - r = b; - w = b; - rb_count = 0; - memset(buf,0,ringbuffer_size); + r = b; + w = b; + rb_count = 0; + memory = (char*)malloc(memory_size); + pos_mem = 0; + pos_head = 0; +} + +void rb_flush(){ + FILE *file; + + while(!rb_isempty()){ + memory[pos_mem++] = rb_get(); + } + printf("write out.smc\n"); + file = fopen("out.smc","w"); + fwrite(memory,memory_size,1,file); + fclose(file); } char rb_get(void) { rb_count--; - if (r > t) r = b; + if (r > t) + r = b; return *r++; } char rb_read(void) { - if (r > t) r = b; return *r++; } @@ -53,10 +77,16 @@ char rb_read(void) void rb_put(char el) { + pos_head++; rb_count++; + + if ( rb_count > ringbuffer_size) + memory[pos_mem++]=el; + + printf("rb_count=%i pos_head=0x%06x add_mem=0x%06x\n",rb_count, pos_head,pos_mem); + if (w > t){ - w = b; - printf("wrap around\n"); - } + w = b; + } *w++ = el; } diff --git a/avr/usbload/ringbuffer.h b/avr/usbload/ringbuffer.h index b6f7f6b..07e965b 100644 --- a/avr/usbload/ringbuffer.h +++ b/avr/usbload/ringbuffer.h @@ -14,5 +14,6 @@ extern int rb_count; void rb_init(void); void rb_put(char el); char rb_get(void); +void rb_flush(void); #endif