mirror of
https://github.com/cc65/cc65.git
synced 2025-08-14 14:26:27 +00:00
Implement packed mode
git-svn-id: svn://svn.cc65.org/cc65/trunk@5930 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
@@ -129,6 +129,7 @@ static void AssembleByte(unsigned bits, char val)
|
|||||||
}
|
}
|
||||||
/* handle end of line */
|
/* handle end of line */
|
||||||
if (bits == 8) {
|
if (bits == 8) {
|
||||||
|
if (bit_counter != 8) {
|
||||||
byte <<= bit_counter;
|
byte <<= bit_counter;
|
||||||
OutBuffer[OutIndex++] = byte;
|
OutBuffer[OutIndex++] = byte;
|
||||||
if (!OutIndex) {
|
if (!OutIndex) {
|
||||||
@@ -140,6 +141,51 @@ static void AssembleByte(unsigned bits, char val)
|
|||||||
Error ("Sprite is too large for the Lynx");
|
Error ("Sprite is too large for the Lynx");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
val <<= 8 - bits;
|
||||||
|
|
||||||
|
do {
|
||||||
|
byte <<= 1;
|
||||||
|
|
||||||
|
if (val & 0x80)
|
||||||
|
++byte;
|
||||||
|
|
||||||
|
if (!(--bit_counter)) {
|
||||||
|
OutBuffer[OutIndex++] = byte;
|
||||||
|
if (!OutIndex) {
|
||||||
|
Error ("Sprite is too large for the Lynx");
|
||||||
|
}
|
||||||
|
byte = 0;
|
||||||
|
bit_counter = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
val <<= 1;
|
||||||
|
|
||||||
|
} while (--bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void AssembleByteLiteral(unsigned bits, char val)
|
||||||
|
{
|
||||||
|
static char bit_counter = 8, byte = 0;
|
||||||
|
|
||||||
|
/* initialize */
|
||||||
|
if (!bits) {
|
||||||
|
OutIndex = 0;
|
||||||
|
bit_counter = 8;
|
||||||
|
byte = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* handle end of line */
|
||||||
|
if (bits == 8) {
|
||||||
|
if (bit_counter != 8) {
|
||||||
|
byte <<= bit_counter;
|
||||||
|
OutBuffer[OutIndex++] = byte;
|
||||||
|
if (!OutIndex) {
|
||||||
|
Error ("Sprite is too large for the Lynx");
|
||||||
|
}
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
val <<= 8 - bits;
|
val <<= 8 - bits;
|
||||||
@@ -217,28 +263,31 @@ static void encodeSprite(StrBuf *D, enum Mode M, char ColorBits, char ColorMask,
|
|||||||
unsigned char V = 0;
|
unsigned char V = 0;
|
||||||
signed i;
|
signed i;
|
||||||
signed count;
|
signed count;
|
||||||
|
unsigned char differ[16];
|
||||||
|
unsigned char *d_ptr;
|
||||||
|
|
||||||
AssembleByte(0, 0);
|
|
||||||
switch (M) {
|
switch (M) {
|
||||||
case smAuto:
|
case smAuto:
|
||||||
case smLiteral:
|
case smLiteral:
|
||||||
|
AssembleByteLiteral(0, 0);
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
/* Fetch next pixel index into pixel buffer */
|
/* Fetch next pixel index into pixel buffer */
|
||||||
AssembleByte(ColorBits, LineBuffer[i] & ColorMask);
|
AssembleByteLiteral(ColorBits, LineBuffer[i] & ColorMask);
|
||||||
}
|
}
|
||||||
|
AssembleByteLiteral(8, 0);
|
||||||
/* Write the buffer to file */
|
/* Write the buffer to file */
|
||||||
WriteOutBuffer(D);
|
WriteOutBuffer(D);
|
||||||
break;
|
break;
|
||||||
case smPacked:
|
case smPacked:
|
||||||
#if 0
|
AssembleByte(0, 0);
|
||||||
i = 0;
|
i = 0;
|
||||||
while (len) {
|
while (len) {
|
||||||
|
if (ChoosePackagingMode(len, i, LineBuffer)) {
|
||||||
|
/* Make runlength packet */
|
||||||
V = LineBuffer[i];
|
V = LineBuffer[i];
|
||||||
++i;
|
++i;
|
||||||
--len;
|
--len;
|
||||||
count = 0;
|
count = 0;
|
||||||
if (ChoosePackagingMode(len, i, LineBuffer)) {
|
|
||||||
/* Make runlength packet */
|
|
||||||
do {
|
do {
|
||||||
++count;
|
++count;
|
||||||
++i;
|
++i;
|
||||||
@@ -251,20 +300,16 @@ static void encodeSprite(StrBuf *D, enum Mode M, char ColorBits, char ColorMask,
|
|||||||
} else {
|
} else {
|
||||||
/* Make packed literal packet */
|
/* Make packed literal packet */
|
||||||
d_ptr = differ;
|
d_ptr = differ;
|
||||||
while (V != LastBuffer[i] && len && count != 15) {
|
V = LineBuffer[i++];
|
||||||
|
*d_ptr++ = V;
|
||||||
|
--len;
|
||||||
|
count = 0;
|
||||||
|
while (ChoosePackagingMode(len, i, LineBuffer) == 0 && len && count != 15) {
|
||||||
|
V = LineBuffer[i++];
|
||||||
*d_ptr++ = V;
|
*d_ptr++ = V;
|
||||||
++count;
|
++count;
|
||||||
V = LineBuffar[i];
|
|
||||||
++i;
|
|
||||||
--len;
|
--len;
|
||||||
}
|
}
|
||||||
if (!len || count == 15)
|
|
||||||
*d_ptr = V;
|
|
||||||
else if (V == LineBuffer[i]) {
|
|
||||||
--count;
|
|
||||||
--i;
|
|
||||||
++len;
|
|
||||||
}
|
|
||||||
|
|
||||||
AssembleByte(5, count | 0x10);
|
AssembleByte(5, count | 0x10);
|
||||||
d_ptr = differ;
|
d_ptr = differ;
|
||||||
@@ -274,8 +319,9 @@ static void encodeSprite(StrBuf *D, enum Mode M, char ColorBits, char ColorMask,
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
AssembleByte(8, 0);
|
AssembleByte(8, 0);
|
||||||
|
/* Write the buffer to file */
|
||||||
|
WriteOutBuffer(D);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case smShaped:
|
case smShaped:
|
||||||
|
Reference in New Issue
Block a user