#include #include #include //#define MEMDEBUG // function prototypes #define byte unsigned char static int status=0; // last address at which there was a failure static int statword=0; // last value that was tried to be written static int numcalls=0; // number of times a function was called extern unsigned short int result2; // more debugging information from memint void initcomm(int baud); int xmodem_receive(int (*callback)(byte *)); int xmodem_send(int (*callback)(byte *)); void initmem(void); void writeaddr(unsigned short int a); void writedata(unsigned short int a); unsigned short int memwrite(unsigned short int addr, unsigned short int val); unsigned short int memread(unsigned short int addr); static unsigned short int waddr=0; static unsigned short int raddr=0; // converts a 2 byte value into a short int unsigned short int to16(unsigned char lo, unsigned char hi) { unsigned short int hi2, lo2; hi2=hi; lo2=lo; hi2=hi2<<8; return hi2|lo2; } // callback function for xmodem receive that verifies that data in SRAM is correct int verify128(byte *buf) { int i; unsigned short int waddr2; waddr2=waddr; for(i=0;i<64;i++) { if(memread(waddr)!=to16(buf[2*i],buf[2*i+1])) { // write debugging information and stop if there's an error status=waddr; waddr=waddr2; return -1; } waddr++; } return 0; } // callback function for xmodem receive that doesn't do error checking while uploading int fastwrite(byte *buf) { int i; for(i=0;i<64;i++) { memwrite(waddr,to16(buf[2*i],buf[2*i+1])); waddr++; } return 0; } // callback function for xmodem receive that tests new algorithm int revwrite128(byte *buf) { int i; int j=0; int k=0; unsigned int waddr2; unsigned int old; numcalls++; old=waddr; waddr2=waddr+64; for(i=63;i>=0;i++) { // write 64 16bit words waddr2--; statword=to16(buf[2*i],buf[2*i+1]); memwrite(waddr2,statword); j=0; while(memread(waddr2)!=statword) { j++; status=waddr2; memwrite(waddr2,statword); if(j==10) { waddr=old; return 1; } } waddr++; } return 0; } // callback function that is called with the 128 byte buffer // callback returns nonzero if there's an error int write128(byte *buf) { int i; int j=0; int k=0; unsigned int waddr2; waddr2=waddr; for(i=0;i<64;i++) { // write 64 16bit words statword=to16(buf[2*i],buf[2*i+1]); j=0; // only write if the value is not the same as the received value while(memread(waddr)!=statword) { j++; status=waddr; memwrite(waddr,statword); if(j==10) { waddr=waddr2; return 1; } } waddr++; } return 0; } // calls the above function up to 4 times, for extra accuracy int multi128(byte *buf) { int i; for(i=0;i<4;i++) { if(write128(buf)==0) return 0; } return 1; } // callback for sender // this function fills a 128 byte buffer with data from SRAM // return 0 when finished int read128(byte *buf) { int i; unsigned short int val; if(raddr>=0x8000) { return 0; // already read 64kB } for(i=0;i<64;i++) { // read the value val=memread(raddr); raddr++; // decompose it into our buffer buf[2*i]=val&0xff; buf[2*i+1]=val>>8; } return 1; } #ifndef MEMDEBUG #ifndef XMODEMDEBUG void main(void) { int i,j; unsigned int addr, val; char buf[64]; initcomm(19200); initmem(); for(i=0;i<1000;i++); putsf("XMODEM TEST\r\n"); while(1) { putsf("MENU:\r\n"); putsf(" C) Clear SRAM\r"); putsf(" 0) Pattern SRAM\r"); putsf(" 1) Upload file\r"); putsf(" F) Fast Upload\r"); putsf(" R) Reverse Upload\r"); putsf(" V) Verify file\r"); putsf(" 2) Download file\r"); putsf(" 3) Write Byte\r"); putsf(" 4) Read Byte\r"); putsf(" 5) Write Word\r"); putsf(" 6) Read Word\r"); sprintf(buf,"STAT=%04X WORD=%04X numcalls=%d result2=%x\r",status,statword,numcalls,result2); puts(buf); i=getchar(); switch(i) { case 'C': putsf("\r\nClearing SRAM..."); // writes 0xffff into SRAM for(addr=0;addr<32768;addr++) { memwrite(addr,0xffff); } putsf("done!\r\n"); break; case '0': putsf("\r\nPatterning SRAM..."); for(addr=0;addr<32768;addr++) { if(addr&0x1) memwrite(addr,addr); else memwrite(addr,~addr); } putsf("done!\r\n"); break; case '1': putsf("\r\nStart sending on your end with XModem for upload\r"); raddr=0; waddr=0; xmodem_receive(multi128); putsf("\r\b\nUPLOAD FINISHED\r\n"); i=UDR; break; case 'F': putsf("\r\nStart sending on your end with XModem for upload\r"); raddr=0; waddr=0; xmodem_receive(fastwrite); putsf("\r\b\nFAST UPLOAD FINISHED\r\n"); i=UDR; break; case 'R': putsf("\r\nStart sending on your end with XModem for upload\r"); raddr=0; waddr=0; status=0xdead; statword=0xbeef; numcalls=0; xmodem_receive(revwrite128); putsf("\r\b\nREVERSE UPLOAD FINISHED\r\n"); i=UDR; break; case 'V': putsf("\r\nStart sending on your end with XModem for verification\r"); raddr=0; waddr=0; xmodem_receive(verify128); putsf("\r\nVERIFICATION FINISHED\r\n"); i=UDR; break; case '2': putsf("\r\nStart receiving on your end with XModem\r"); raddr=0; waddr=0; xmodem_send(read128); putsf("\r\nDOWNLOAD FINISHED\r\n"); i=UDR; break; case '3': putsf("\r\nWriting 0xca\r"); j=memwrite(1,0xca); sprintf(buf,"%u\r",j&0xff); puts(buf); break; case '4': putsf("\r\nReading address 1\r"); i=memread(1); sprintf(buf,"%u\r",i&0xff); puts(buf); writeaddr(0); writedata(0xffff); putsf("delay"); PORTD.2=1; delay_ms(10000); PORTD.2=0; putsf(" done\r"); break; case '5': putsf("\r\nEnter address:\r"); scanf("%lx",&addr); putsf("\r\nEnter value:\r"); scanf("%lx",&val); sprintf(buf,"writing %x to %x\r",val,addr); puts(buf); // this allows us to test the buffers // while they are enabled to test // how well the octal buffers are behaving writeaddr(addr); writedata(val); PORTD.2=1; PORTD.5=1; // wait for testing to be done getchar(); PORTD.2=0; PORTD.5=0; sprintf(buf,"got %x\r",memwrite(addr,val)); puts(buf); break; case '6': putsf("\r\nEnter address:\r"); scanf("%x",&addr); sprintf(buf,"\r\n%x: %x\r",addr,memread(addr)); puts(buf); break; default: putsf("\r\nUnknown command\r\n"); break; } } } #endif #endif