"Stretching" a byte variable into two byte variables?
Hello :)
I don't know the exact term I need, so here's what I'm doing. Since I've created custom 8x8 fonts for ST7920, I also want it to be able to display bigger letters too. Stretching vertically is not a problem - just double the lines and that's all. But when it comes to horizontal stretching, I'm facing some issues. The code should work as follows - initial bitmap data, read from single byte in eeprom, should be "stretched" into two byte variables and written to display. The code below shows how I see it. But it has a lot of if-then lines, and my guess is, that there should be a something simpler to do this task. Any ideas?
Code:
'bytes in eeprom at left, what should be at output - at right
'this is a letter "A"
'A B C
'(eeprom) (MSB) (LSB)
'00111100 00001111 11110000
'01000010 00110000 00001100
'01000010 00110000 00001100
'01111110 00111111 11111100
'01000010 00110000 00001100
'01000010 00110000 00001100
IF A.0=0 THEN B.0=0:B.1=0
IF A.0=1 THEN B.0=1:B.1=1
IF A.1=0 THEN B.2=0:B.3=0
IF A.1=1 THEN B.2=1:B.3=1
IF A.2=0 THEN B.4=0:B.5=0
IF A.2=1 THEN B.4=1:B.5=1
IF A.3=0 THEN B.6=0:B.7=0
IF A.3=1 THEN B.6=1:B.7=1
IF A.4=0 THEN C.0=0:C.1=0
IF A.4=1 THEN C.0=1:C.1=1
IF A.5=0 THEN C.2=0:C.3=0
IF A.5=1 THEN C.2=1:C.3=1
IF A.6=0 THEN C.4=0:C.5=0
IF A.6=1 THEN C.4=1:C.5=1
IF A.7=0 THEN C.6=0:C.7=0
IF A.7=1 THEN C.6=1:C.7=1
Re: "Stretching" a byte variable into two byte variables?
sample the msb of your byte
if its set add three to your word var
shift left the byte var 1 bit the word 2 bits
repeat for all 8 bits
Re: "Stretching" a byte variable into two byte variables?
Re: "Stretching" a byte variable into two byte variables?
Re: "Stretching" a byte variable into two byte variables?
If you start off with B=0 and C=0 you can skip half those statements and only do the ones where A.x = 1
Re: "Stretching" a byte variable into two byte variables?
I wanted it to be shorter, by using loop and
X.Y=Z
but as I can see, you can't use another variable as bit reference, only static values.
Re: "Stretching" a byte variable into two byte variables?
uint16_t enlargeYourByte(uint8_t input) |
4 |
x = (x ^ (x << 4)) & 0x0f0f; |
5 |
x = (x ^ (x << 2)) & 0x3333; |
6 |
x = (x ^ (x << 1)) & 0x5555; |
This is how they do it in C. Can we port this to PBP ?
Re: "Stretching" a byte variable into two byte variables?
I think this does it:
Code:
Input VAR BYTE
Wide VAR WORD
X VAR WORD
Y VAR WORD
EnlargeYourByte:
X = Input
Y = Input << 4
X = X ^ Y
X = X & $0F0F
Y = X << 2
X = X ^ Y
X = X & $3333
Y = X << 1
X = X ^ Y
X = X & $5555
Wide = X << 1
RETURN
Re: "Stretching" a byte variable into two byte variables?
Code:
any_byte=101011 ;eg input any_byte-> 10101011
for any_cnt=0 to 7
any_word=any_word<<2
if any_byte.7 then any_word=any_word+3
any_byte=any_byte<<1
next
output any_word-> 1100110011001111
mikes
Code:
X VAR WORD
Y VAR WORD
;eg input any_byte-> 10101011
X = ani_r
Y = ani_r << 4
X = X ^ Y
X = X & $0F0F
Y = X << 2
X = X ^ Y
X = X & $3333
Y = X << 1
X = X ^ Y
X = X & $5555
ani_h = X << 1
output any_word-> 1000100010001010
not working
corrected
Code:
x = ani_r;
x = (x ^ (x << 4)) & $0f0f;
x = (x ^ (x << 2)) & $3333;
x = (x ^ (x << 1)) & $5555;
ani_h = x | (x << 1);
and works , probably quicker the my loop
Re: "Stretching" a byte variable into two byte variables?