You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
936 B
62 lines
936 B
/* i2c.c */ |
|
|
|
#include "common.h" |
|
#include "SDL.h" |
|
#include "SDL_gfxPrimitives.h" |
|
|
|
|
|
#define WHITE 0xffffffff |
|
#define BLACK 0x000000ff |
|
|
|
uint8_t i2c_xor; |
|
uint8_t page; |
|
uint8_t col; |
|
|
|
|
|
extern SDL_Surface *screen; |
|
|
|
void i2c_init(void) |
|
{ |
|
} |
|
|
|
void i2c_set_xor(char xor) |
|
{ |
|
i2c_xor = xor; |
|
} |
|
|
|
bool i2c_write(char address, char prefix, char bytes, char *data) |
|
{ |
|
uint8_t i, j; |
|
|
|
switch ((uint8_t) prefix) { |
|
case 0x80: |
|
switch (data[0] & 0xf0) { |
|
case 0xb0: |
|
page = data[0] & 0xf; |
|
break; |
|
case 0x00: |
|
col = (col & ~0xf) + (data[0] & 0xf); |
|
break; |
|
case 0x10: |
|
col = (col & 0xf) + ((data[0] & 0xf) << 4); |
|
break; |
|
} |
|
break; |
|
case 0x40: |
|
for (i = 0; i < bytes; i++) { |
|
uint8_t byte = data[i] ^ i2c_xor; |
|
for (j = 0; j < 8; j++) { |
|
pixelColor(screen, col, page*8 + j, (byte & 1)?WHITE:BLACK); |
|
byte = byte >> 1; |
|
} |
|
col++; |
|
if (col > 127) |
|
col = 0; |
|
} |
|
break; |
|
} |
|
|
|
|
|
return TRUE; |
|
} |
|
|
|
|