xref: /plan9/sys/src/cmd/aux/flashfs/utils.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier #include <u.h>
2*9a747e4fSDavid du Colombier #include <libc.h>
3*9a747e4fSDavid du Colombier #include "flashfs.h"
4*9a747e4fSDavid du Colombier 
5*9a747e4fSDavid du Colombier char*	prog;
6*9a747e4fSDavid du Colombier ulong	sectsize;
7*9a747e4fSDavid du Colombier ulong	nsects;
8*9a747e4fSDavid du Colombier uchar*	sectbuff;
9*9a747e4fSDavid du Colombier int	readonly;
10*9a747e4fSDavid du Colombier ulong	delta;
11*9a747e4fSDavid du Colombier int	eparity;
12*9a747e4fSDavid du Colombier 
13*9a747e4fSDavid du Colombier uchar	magic[]	= { MAGIC0, MAGIC1, MAGIC2, FFSVERS };
14*9a747e4fSDavid du Colombier 
15*9a747e4fSDavid du Colombier int
16*9a747e4fSDavid du Colombier putc3(uchar *buff, ulong v)
17*9a747e4fSDavid du Colombier {
18*9a747e4fSDavid du Colombier 	if(v < (1 << 7)) {
19*9a747e4fSDavid du Colombier 		buff[0] = v;
20*9a747e4fSDavid du Colombier 		return 1;
21*9a747e4fSDavid du Colombier 	}
22*9a747e4fSDavid du Colombier 
23*9a747e4fSDavid du Colombier 	if(v < (1 << 13)) {
24*9a747e4fSDavid du Colombier 		buff[0] = 0x80 | (v >> 7);
25*9a747e4fSDavid du Colombier 		buff[1] = v & ((1 << 7) - 1);
26*9a747e4fSDavid du Colombier 		return 2;
27*9a747e4fSDavid du Colombier 	}
28*9a747e4fSDavid du Colombier 
29*9a747e4fSDavid du Colombier 	if(v < (1 << 21)) {
30*9a747e4fSDavid du Colombier 		buff[0] = 0x80 | (v >> 15);
31*9a747e4fSDavid du Colombier 		buff[1] = 0x80 | ((v >> 8) & ((1 << 7) - 1));
32*9a747e4fSDavid du Colombier 		buff[2] = v;
33*9a747e4fSDavid du Colombier 		return 3;
34*9a747e4fSDavid du Colombier 	}
35*9a747e4fSDavid du Colombier 
36*9a747e4fSDavid du Colombier 	fprint(2, "%s: putc3 fail 0x%lux, called from 0x%lux\n", prog, v, getcallerpc(&buff));
37*9a747e4fSDavid du Colombier 	abort();
38*9a747e4fSDavid du Colombier 	return -1;
39*9a747e4fSDavid du Colombier }
40*9a747e4fSDavid du Colombier 
41*9a747e4fSDavid du Colombier int
42*9a747e4fSDavid du Colombier getc3(uchar *buff, ulong *p)
43*9a747e4fSDavid du Colombier {
44*9a747e4fSDavid du Colombier 	int c, d;
45*9a747e4fSDavid du Colombier 
46*9a747e4fSDavid du Colombier 	c = buff[0];
47*9a747e4fSDavid du Colombier 	if((c & 0x80) == 0) {
48*9a747e4fSDavid du Colombier 		*p = c;
49*9a747e4fSDavid du Colombier 		return 1;
50*9a747e4fSDavid du Colombier 	}
51*9a747e4fSDavid du Colombier 
52*9a747e4fSDavid du Colombier 	c &= ~0x80;
53*9a747e4fSDavid du Colombier 	d = buff[1];
54*9a747e4fSDavid du Colombier 	if((d & 0x80) == 0) {
55*9a747e4fSDavid du Colombier 		*p = (c << 7) | d;
56*9a747e4fSDavid du Colombier 		return 2;
57*9a747e4fSDavid du Colombier 	}
58*9a747e4fSDavid du Colombier 
59*9a747e4fSDavid du Colombier 	d &= ~0x80;
60*9a747e4fSDavid du Colombier 	*p = (c << 15) | (d << 8) | buff[2];
61*9a747e4fSDavid du Colombier 	return 3;
62*9a747e4fSDavid du Colombier }
63*9a747e4fSDavid du Colombier 
64*9a747e4fSDavid du Colombier ulong
65*9a747e4fSDavid du Colombier get4(uchar *b)
66*9a747e4fSDavid du Colombier {
67*9a747e4fSDavid du Colombier 	return	(b[0] <<  0) |
68*9a747e4fSDavid du Colombier 		(b[1] <<  8) |
69*9a747e4fSDavid du Colombier 		(b[2] << 16) |
70*9a747e4fSDavid du Colombier 		(b[3] << 24);
71*9a747e4fSDavid du Colombier }
72*9a747e4fSDavid du Colombier 
73*9a747e4fSDavid du Colombier void
74*9a747e4fSDavid du Colombier put4(uchar *b, ulong v)
75*9a747e4fSDavid du Colombier {
76*9a747e4fSDavid du Colombier 	b[0] = v >>  0;
77*9a747e4fSDavid du Colombier 	b[1] = v >>  8;
78*9a747e4fSDavid du Colombier 	b[2] = v >> 16;
79*9a747e4fSDavid du Colombier 	b[3] = v >> 24;
80*9a747e4fSDavid du Colombier }
81