Skip to content

Commit 3ed031f

Browse files
committed
Keep track of color on short prints optimization.
This fixes #104, and allows the optimizer to convert prints/puts with constant colors.
1 parent 53b1b2e commit 3ed031f

3 files changed

Lines changed: 66 additions & 9 deletions

File tree

src/compiler/peephole.cc

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -295,10 +295,20 @@ class peephole
295295
// Transforms print of small constant strings to sequence of BYTE_PUT
296296
void print_chars()
297297
{
298+
int print_color = 0;
298299
for(size_t i = 0; i < code.size(); i++)
299300
{
300301
current = i;
301-
if(mtok(0, "TOK_CSTRING") && mstring(1) < 3 && mtok(2, "TOK_PRINT_STR"))
302+
// Track current print color
303+
if(mtok(2, "TOK_BYTE_POKE") && mcbyte(3, "PRINT_COLOR"))
304+
{
305+
if(mtok(0, "TOK_NUM") && mword(1))
306+
print_color = val(1);
307+
else
308+
print_color = -1;
309+
}
310+
if(print_color >= 0 && mtok(0, "TOK_CSTRING") && mstring(1) < 3 &&
311+
mtok(2, "TOK_PRINT_STR"))
302312
{
303313
auto s = str(1);
304314
del(2);
@@ -307,7 +317,7 @@ class peephole
307317
for(char c : s)
308318
{
309319
ins_tok(0, "TOK_BYTE_PUT");
310-
ins_b(1, c & 0xFF);
320+
ins_b(1, (c ^ print_color) & 0xFF);
311321
current += 2;
312322
}
313323
}
@@ -1481,27 +1491,28 @@ class peephole
14811491
del(1);
14821492
continue;
14831493
}
1484-
// Join print constant strings with a PUT, except if
1485-
// the color is non-zero.
1494+
// Join print constant strings with a PUT, except if the color
1495+
// is not known.
14861496
// TOK_CSTRING / STR / TOK_PRINT_STR / TOK_NUM / X / TOK_PUT
14871497
// -> TOK_CSTRING / STR+X / TOK_PRINT_STR
14881498
if(mtok(0, "TOK_CSTRING") && mstring(1) < 255 &&
14891499
mtok(2, "TOK_PRINT_STR") && mtok(3, "TOK_NUM") && mword(4) &&
1490-
mtok(5, "TOK_PUT") && print_color == 0)
1500+
mtok(5, "TOK_PUT") && print_color >= 0)
14911501
{
1492-
set_string(1, str(1) + char(val(4)));
1502+
set_string(1, str(1) + char(val(4) ^ print_color));
14931503
del(5);
14941504
del(4);
14951505
del(3);
14961506
}
1497-
// Join print constant strings with a PUT
1507+
// Join print constant strings with a PUT, except if the color
1508+
// is not known.
14981509
// TOK_CSTRING / STR / TOK_PRINT_STR / TOK_BYTE_PUT / x
14991510
// -> TOK_CSTRING / STR+X / TOK_PRINT_STR
15001511
if(mtok(0, "TOK_CSTRING") && mstring(1) < 255 &&
15011512
mtok(2, "TOK_PRINT_STR") && mtok(3, "TOK_BYTE_PUT") &&
1502-
(mbyte(4) || mword(4)) && print_color == 0)
1513+
(mbyte(4) || mword(4)) && print_color >= 0)
15031514
{
1504-
set_string(1, str(1) + char(val(4)));
1515+
set_string(1, str(1) + char(val(4) ^ print_color));
15051516
del(4);
15061517
del(3);
15071518
}

testsuite/tests/print-color.bas

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,9 @@ GR.1
1616

1717
? 3, COLOR(32) "LOWERCASE" , "ALSO" ,
1818
? "NORMAL"
19+
20+
' Test small strings
21+
? #6, "NORMAL "; COLOR(0); "X"
22+
? #6, "COLOR32 "; COLOR(32); "X"
23+
? #6, "NORMAL "; COLOR(0); "AB"
24+
? #6, "COLOR32 "; COLOR(32); "AB"

testsuite/tests/print-color.chk

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,43 @@ SCREEN: plot 0,0 color 155
4141
NORMAL �������.
4242
NORMAL �������.
4343
3 lowercase also NORMAL
44+
SCREEN: plot 0,3 color 78
45+
SCREEN: plot 0,3 color 79
46+
SCREEN: plot 0,3 color 82
47+
SCREEN: plot 0,3 color 77
48+
SCREEN: plot 0,3 color 65
49+
SCREEN: plot 0,3 color 76
50+
SCREEN: plot 0,3 color 32
51+
SCREEN: plot 0,3 color 88
52+
SCREEN: plot 0,3 color 155
53+
SCREEN: plot 0,3 color 67
54+
SCREEN: plot 0,3 color 79
55+
SCREEN: plot 0,3 color 76
56+
SCREEN: plot 0,3 color 79
57+
SCREEN: plot 0,3 color 82
58+
SCREEN: plot 0,3 color 51
59+
SCREEN: plot 0,3 color 50
60+
SCREEN: plot 0,3 color 32
61+
SCREEN: plot 0,3 color 120
62+
SCREEN: plot 0,3 color 155
63+
SCREEN: plot 0,3 color 78
64+
SCREEN: plot 0,3 color 79
65+
SCREEN: plot 0,3 color 82
66+
SCREEN: plot 0,3 color 77
67+
SCREEN: plot 0,3 color 65
68+
SCREEN: plot 0,3 color 76
69+
SCREEN: plot 0,3 color 32
70+
SCREEN: plot 0,3 color 65
71+
SCREEN: plot 0,3 color 66
72+
SCREEN: plot 0,3 color 155
73+
SCREEN: plot 0,3 color 67
74+
SCREEN: plot 0,3 color 79
75+
SCREEN: plot 0,3 color 76
76+
SCREEN: plot 0,3 color 79
77+
SCREEN: plot 0,3 color 82
78+
SCREEN: plot 0,3 color 51
79+
SCREEN: plot 0,3 color 50
80+
SCREEN: plot 0,3 color 32
81+
SCREEN: plot 0,3 color 97
82+
SCREEN: plot 0,3 color 98
83+
SCREEN: plot 0,3 color 155

0 commit comments

Comments
 (0)