19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include "flashfs.h"
49a747e4fSDavid du Colombier
59a747e4fSDavid du Colombier char* prog;
69a747e4fSDavid du Colombier ulong sectsize;
79a747e4fSDavid du Colombier ulong nsects;
89a747e4fSDavid du Colombier uchar* sectbuff;
99a747e4fSDavid du Colombier int readonly;
109a747e4fSDavid du Colombier ulong delta;
119a747e4fSDavid du Colombier int eparity;
129a747e4fSDavid du Colombier
139a747e4fSDavid du Colombier uchar magic[] = { MAGIC0, MAGIC1, MAGIC2, FFSVERS };
149a747e4fSDavid du Colombier
159a747e4fSDavid du Colombier int
putc3(uchar * buff,ulong v)169a747e4fSDavid du Colombier putc3(uchar *buff, ulong v)
179a747e4fSDavid du Colombier {
189a747e4fSDavid du Colombier if(v < (1 << 7)) {
199a747e4fSDavid du Colombier buff[0] = v;
209a747e4fSDavid du Colombier return 1;
219a747e4fSDavid du Colombier }
229a747e4fSDavid du Colombier
239a747e4fSDavid du Colombier if(v < (1 << 13)) {
249a747e4fSDavid du Colombier buff[0] = 0x80 | (v >> 7);
259a747e4fSDavid du Colombier buff[1] = v & ((1 << 7) - 1);
269a747e4fSDavid du Colombier return 2;
279a747e4fSDavid du Colombier }
289a747e4fSDavid du Colombier
299a747e4fSDavid du Colombier if(v < (1 << 21)) {
309a747e4fSDavid du Colombier buff[0] = 0x80 | (v >> 15);
319a747e4fSDavid du Colombier buff[1] = 0x80 | ((v >> 8) & ((1 << 7) - 1));
329a747e4fSDavid du Colombier buff[2] = v;
339a747e4fSDavid du Colombier return 3;
349a747e4fSDavid du Colombier }
359a747e4fSDavid du Colombier
36*74f16c81SDavid du Colombier fprint(2, "%s: putc3 fail 0x%lux, called from %#p\n", prog, v, getcallerpc(&buff));
379a747e4fSDavid du Colombier abort();
389a747e4fSDavid du Colombier return -1;
399a747e4fSDavid du Colombier }
409a747e4fSDavid du Colombier
419a747e4fSDavid du Colombier int
getc3(uchar * buff,ulong * p)429a747e4fSDavid du Colombier getc3(uchar *buff, ulong *p)
439a747e4fSDavid du Colombier {
449a747e4fSDavid du Colombier int c, d;
459a747e4fSDavid du Colombier
469a747e4fSDavid du Colombier c = buff[0];
479a747e4fSDavid du Colombier if((c & 0x80) == 0) {
489a747e4fSDavid du Colombier *p = c;
499a747e4fSDavid du Colombier return 1;
509a747e4fSDavid du Colombier }
519a747e4fSDavid du Colombier
529a747e4fSDavid du Colombier c &= ~0x80;
539a747e4fSDavid du Colombier d = buff[1];
549a747e4fSDavid du Colombier if((d & 0x80) == 0) {
559a747e4fSDavid du Colombier *p = (c << 7) | d;
569a747e4fSDavid du Colombier return 2;
579a747e4fSDavid du Colombier }
589a747e4fSDavid du Colombier
599a747e4fSDavid du Colombier d &= ~0x80;
609a747e4fSDavid du Colombier *p = (c << 15) | (d << 8) | buff[2];
619a747e4fSDavid du Colombier return 3;
629a747e4fSDavid du Colombier }
639a747e4fSDavid du Colombier
649a747e4fSDavid du Colombier ulong
get4(uchar * b)659a747e4fSDavid du Colombier get4(uchar *b)
669a747e4fSDavid du Colombier {
679a747e4fSDavid du Colombier return (b[0] << 0) |
689a747e4fSDavid du Colombier (b[1] << 8) |
699a747e4fSDavid du Colombier (b[2] << 16) |
709a747e4fSDavid du Colombier (b[3] << 24);
719a747e4fSDavid du Colombier }
729a747e4fSDavid du Colombier
739a747e4fSDavid du Colombier void
put4(uchar * b,ulong v)749a747e4fSDavid du Colombier put4(uchar *b, ulong v)
759a747e4fSDavid du Colombier {
769a747e4fSDavid du Colombier b[0] = v >> 0;
779a747e4fSDavid du Colombier b[1] = v >> 8;
789a747e4fSDavid du Colombier b[2] = v >> 16;
799a747e4fSDavid du Colombier b[3] = v >> 24;
809a747e4fSDavid du Colombier }
81