--- /dev/null
+#include <stdint.h>
+
+/* code from http://www.faqs.org/faqs/compression-faq/part1/section-26.html,
+ * presumed public domain */
+
+uint32_t crc32_table[256];
+
+uint32_t crc32(uint8_t *buf, int len)
+{
+ uint8_t *p;
+ uint32_t crc;
+
+ crc = 0xffffffff; /* preload shift register, per CRC-32 spec */
+ for (p = buf; len > 0; ++p, --len)
+ crc = (crc << 8) ^ crc32_table[(crc >> 24) ^ *p];
+ return ~crc; /* transmit complement, per CRC-32 spec */
+}
+
+/*
+ * Build auxiliary table for parallel byte-at-a-time CRC-32.
+ */
+#define CRC32_POLY 0x04c11db7 /* AUTODIN II, Ethernet, & FDDI */
+
+void crc32_init()
+{
+ int i, j;
+ uint32_t c;
+
+ for (i = 0; i < 256; ++i) {
+ for (c = i << 24, j = 8; j > 0; --j)
+ c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1);
+ crc32_table[i] = c;
+ }
+}
#include <stdint.h>
#include <fb.h>
+#include <crc32.h>
uint32_t checksum_rect_generic32(int x, int y, int width, int height) {
*/
int scanline = fb->curmode.xres * 4;
- uint32_t * lineaddr;
- int i, j;
+ unsigned char * lineaddr;
+ int i;
uint32_t sum = 0;
for (i = 0; i < height; i++) {
- lineaddr = (uint32_t *)(fb->fbaddr + (i + y) * scanline);
+ lineaddr = fb->fbaddr + (i + y) * scanline;
- for (j = 0; j < width; j++) {
- sum += lineaddr[j + x];
- }
+ sum ^= crc32(lineaddr, width * 4);
}
return sum;
for (cy = y; cy < (y + height); cy++)
{
fbuf = (unsigned int *)fb->fbaddr;
- fbuf += y * (fb->curmode.xres) + x;
+ fbuf += cy * (fb->curmode.xres) + x;
for (cx = x; cx < (x + width); cx++)
*(ibuf++) = *(fbuf++);
}
#include <paging.h>
#include <minilib.h>
#include <stdint.h>
+#include <output.h>
+#include <smram.h>
static unsigned char _font[256 * 32];
void text_init()
{
unsigned char oldread;
+ smram_state_t old_state = smram_save_state();
outb(0x3CE, 0x05 /* Mode register */);
outb(0x3CF, inb(0x3CF) & ~(0x10 /* Odd/even */));
outb(0x3CE, 0x04 /* Read register */);
oldread = inb(0x3CF);
outb(0x3CF, 0x02 /* Font plane */);
+ smram_aseg_set_state(SMRAM_ASEG_SMMCODE);
memcpy(_font, p2v(0xB8000), sizeof(_font));
+ smram_restore_state(old_state);
outb(0x3CF, oldread);
}
void text_render(char *buf, int x, int y, int w, int h)
{
- unsigned char *video = p2v(0xB8000);
+ unsigned char *video = (unsigned char *)0xB8000;
unsigned int textx = x / 9;
unsigned int texty = y / 14;
unsigned int cx, cy;
unsigned char ch, at, font;
+ smram_state_t old_state = smram_save_state();
+ outputf("text_render: buf %08x, (%d,%d),(%d,%d)", buf, x, y, w, h);
+
+ smram_aseg_set_state(SMRAM_ASEG_SMMCODE);
for (cy = y; cy < (y + h); cy++)
{
texty = cy / 14;
*(buf++) = 0;
}
}
+ smram_restore_state(old_state);
}
uint32_t text_checksum(int x, int y, int w, int h)
{
- unsigned char *video = p2v(0xB8000);
+ unsigned char *video = (unsigned char *)0xB8000;
unsigned int textx = x / 9;
unsigned int texty = y / 14;
int cx, cy;
unsigned char ch, at;
uint32_t cksm = 0;
+ smram_state_t old_state = smram_save_state();
+
+ outputf("checksum: (%d,%d),(%d,%d)", x,y,w,h);
+
+ smram_aseg_set_state(SMRAM_ASEG_SMMCODE);
for (cy = y; cy < (y + h); cy++)
{
}
}
+ smram_restore_state(old_state);
+
+ outputf("checksum: %08x", cksm);
+
return cksm;
}