From 7a8ae11ce10f230f8a8ca439156fab08f2865186 Mon Sep 17 00:00:00 2001 From: optixx Date: Mon, 26 Oct 2009 18:16:37 +0100 Subject: [PATCH] testing --- avr/usbload/Makefile.test | 18 +- avr/usbload/inflate.c | 53 +- avr/usbload/inflate_test.c | 3 +- avr/usbload/loader_test.c | 4463 ++++++++++++++++++------------------ avr/usbload/loader_test.h | 2 +- avr/usbload/ringbuffer.c | 62 + avr/usbload/ringbuffer.h | 18 + roms/qd16boot02_half.smc | Bin 0 -> 65536 bytes 8 files changed, 2360 insertions(+), 2259 deletions(-) create mode 100644 avr/usbload/ringbuffer.c create mode 100644 avr/usbload/ringbuffer.h create mode 100644 roms/qd16boot02_half.smc diff --git a/avr/usbload/Makefile.test b/avr/usbload/Makefile.test index 982f39f..d818d3e 100644 --- a/avr/usbload/Makefile.test +++ b/avr/usbload/Makefile.test @@ -1,6 +1,16 @@ all: gcc -c loader_test.c - gcc -c inflate.c - gcc -c neginf/neginf.c - gcc -c inflate_test.c - gcc -o inflate_test inflate.o neginf.o inflate_test.o loader_test.o + gcc -c inflate.c + gcc -c neginf/neginf.c + gcc -c inflate_test.c + gcc -c ringbuffer.c + gcc -o inflate_test inflate.o neginf.o inflate_test.o loader_test.o ringbuffer.o +loader: + python ../../scripts/conv_zip_test.py ../../roms/qd16boot02_half.smc + +test: + ./inflate_test + @md5sum out.smc + @md5sum out_ref.smc + @md5sum ../../roms/qd16boot02_half.smc + diff --git a/avr/usbload/inflate.c b/avr/usbload/inflate.c index 7aa168e..dfaa291 100644 --- a/avr/usbload/inflate.c +++ b/avr/usbload/inflate.c @@ -19,29 +19,49 @@ */ #include #include +#include #include "neginf/neginf.h" #include "inflate.h" +#include "assert.h" +#include "ringbuffer.h" char inflate_done = 0; char *mem; +char *mem_ref; + int addr = 0; +int addr_ref = 0; void inflate_init() { neginf_init(0); - mem = (char*)malloc(2<<16); + 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"); FILE *file; file = fopen("out.smc","w"); - fwrite(mem,2<<16,1,file); + 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); + } void neginf_cb_completed() @@ -51,18 +71,33 @@ void neginf_cb_completed() void neginf_cb_seq_byte(nbyte byte) { - mem[addr] = byte; - addr++; + + 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 from=0x%06x to=0x%06x len=%i\n",from, to, length); - for (i=0; i o + o <-w + x + x <-r +b-> x +*/ + +#include "ringbuffer.h" + + + + +static char buf[ringbuffer_size]; +int rb_count; + +#define t &buf[ringbuffer_size - 1] +#define b &buf[0] + +//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) +{ + r = b; + w = b; + rb_count = 0; + memset(buf,0,ringbuffer_size); +} + +char rb_get(void) +{ + rb_count--; + if (r > t) r = b; + return *r++; +} + + +char rb_read(void) +{ + + if (r > t) r = b; + return *r++; +} + + +void rb_put(char el) +{ + rb_count++; + if (w > t){ + w = b; + printf("wrap around\n"); + } + *w++ = el; +} diff --git a/avr/usbload/ringbuffer.h b/avr/usbload/ringbuffer.h new file mode 100644 index 0000000..b6f7f6b --- /dev/null +++ b/avr/usbload/ringbuffer.h @@ -0,0 +1,18 @@ + +#ifndef _RING_BUFFER_H_ +#define _RING_BUFFER_H_ + + +#define ringbuffer_size 32 + +extern int rb_count; + +#define rb_free() (ringbuffer_size - rb_count) +#define rb_isfull() (rb_count == ringbuffer_size) +#define rb_isempty() (rb_count == 0) + +void rb_init(void); +void rb_put(char el); +char rb_get(void); + +#endif diff --git a/roms/qd16boot02_half.smc b/roms/qd16boot02_half.smc new file mode 100644 index 0000000000000000000000000000000000000000..6d9ab23607f214346e296a951e66d47d0e79e500 GIT binary patch literal 65536 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