revert between 56095 -> 55830 in arch
[AROS.git] / workbench / classes / datatypes / wav / bitpack_msb.c
blobbbeaf5114ad28f27b2547db143893d55dd9105b3
1 /*
2 * wave.datatype
3 * (c) Fredrik Wikstrom
4 */
6 #include <exec/types.h>
7 #include <dos/dos.h>
9 #include "endian.h"
10 #include "bitpack.h"
12 // MSb style BitPack functions:
14 extern const ULONG bp_mask[33];
16 ULONG bitpack_read1_msb (BitPack_buffer *b) {
17 ULONG ret=0;
18 if (b->ptr[0]&(0x80 >> b->endbit))
19 ret=1;
20 b->endbit++;
21 if (b->endbit==8) {
22 b->endbit=0;
23 b->ptr++;
24 b->endbyte++;
26 return (ret);
29 ULONG bitpack_read_msb (BitPack_buffer *b, LONG bits) {
30 ULONG ret;
32 bits += b->endbit;
34 ret=b->ptr[0]<<(24+b->endbit);
35 if (bits>8) {
36 ret|=b->ptr[1]<<(16+b->endbit);
37 if (bits>16) {
38 ret|=b->ptr[2]<<(8+b->endbit);
39 if (bits>24) {
40 ret|=b->ptr[3]<<(b->endbit);
41 if (bits>32) {
42 ret|=b->ptr[4]>>(8-b->endbit);
47 ret>>=(32-bits);
48 ret&=bp_mask[bits];
50 b->ptr+=(bits >> 3);
51 b->endbyte+=(bits >> 3);
52 b->endbit=bits&7;
54 return (ret);
57 #if BP_WRITE_CMDS
59 void bitpack_write1_msb (BitPack_buffer *b, ULONG val) {
60 if (val & 1) {
61 b->ptr[0]|=(0x80 >> b->endbit);
62 } else {
63 b->ptr[0]&=~(0x80 >> b->endbit);
65 b->endbit++;
66 if (b->endbit==8) {
67 b->endbit=0;
68 b->ptr++;
69 b->endbyte++;
73 void bitpack_write_msb (BitPack_buffer *b, ULONG val, LONG bits) {
74 val&=bp_mask[bits];
75 val<<=(32-bits);
76 bits+=b->endbit;
78 b->ptr[0]|=val>>(24+b->endbit);
79 if (bits>=8) {
80 b->ptr[1]=val>>(16+b->endbit);
81 if (bits>=16) {
82 b->ptr[2]=val>>(8+b->endbit);
83 if (bits>=32) {
84 if (b->endbit)
85 b->ptr[4]=val>>(b->endbit);
86 else
87 b->ptr[4]=0;
92 b->endbyte+=(bits>>3);
93 b->ptr+=(bits>>3);
94 b->endbit=bits&7;
97 #endif
99 #if BP_FAST_CMDS
101 void bitpack_iobits_msb (ExtBitPack_buffer *b, LONG bits) {
104 ULONG bitpack_fastread_msb (ExtBitPack_buffer *b) {
107 #if BP_WRITE_CMDS
109 void bitpack_fastwrite_msb (ExtBitPack_buffer *b, ULONG val) {
112 #endif
114 #endif