Use special crt routines for printing

This commit is contained in:
Dreaded_X 2021-01-18 18:00:35 +01:00
parent 2cd6fafe2e
commit cc28b4629d

View File

@ -4,7 +4,7 @@
#define WIDTH 12 #define WIDTH 12
#define HEIGHT 18 #define HEIGHT 18
#define SPEED 20 #define SPEED 4
const char* tetromino[7]; const char* tetromino[7];
@ -15,6 +15,9 @@ uint16_t score = 0;
uint8_t cleared[HEIGHT-1] = {0}; uint8_t cleared[HEIGHT-1] = {0};
__sfr __at (0x1F) status;
__sfr __at (0x1E) key;
void construct_shapes() { void construct_shapes() {
tetromino[0] = "..X." tetromino[0] = "..X."
"..X." "..X."
@ -97,17 +100,67 @@ uint8_t does_piece_fit(uint8_t shape, uint8_t rotation, int8_t px, uint8_t py) {
return 1; return 1;
} }
void draw_part(uint8_t i) {
if (i == 9) {
put_string_fast("\033[0m");
} else if (i == 8) {
put_string_fast("\033[33m");
} else if (i > 0) {
put_string_fast("\033[9");
put_char_fast('0'+i);
put_char_fast('m');
}
switch (i) {
case 0:
put_char_fast(' ');
break;
case 8:
put_char_fast(0xCD);
break;
case 9:
put_char_fast(0xB0);
break;
default:
put_char_fast(0xDB);
break;
}
}
uint8_t next_shape = 0; uint8_t next_shape = 0;
uint8_t current_shape = 0; uint8_t current_shape = 0;
uint8_t current_rotation = 0; uint8_t current_rotation = 0;
int8_t current_x = WIDTH/2-2; int8_t current_x = WIDTH/2-2;
uint8_t current_y = 0; uint8_t current_y = 0;
inline void draw_next_shape() {
// Draw next part
for (uint8_t y = 0; y < 4; ++y) {
put_string_fast("\033[");
put_char_fast('3' + y);
put_string_fast(";15H");
for (uint8_t x = 0; x < 4; ++x) {
if (tetromino[next_shape][rotate(x, y, 0)] == 'X') {
draw_part(next_shape + 1);
} else {
draw_part(0);
}
}
}
}
void new_shape() { void new_shape() {
current_shape = next_shape; current_shape = next_shape;
do { do {
next_shape = random() & 0x07; next_shape = random() & 0x07;
} while (next_shape == 7); } while (next_shape == 7);
draw_next_shape();
} }
void render() { void render() {
@ -128,54 +181,9 @@ void render() {
} }
} }
__sfr __at (0x02) cout;
void draw_part(uint8_t i) {
if (i == 9) {
cout = '\033';
cout = '[';
cout = '0';
cout = 'm';
} else if (i == 8) {
cout = '\033';
cout = '[';
cout = '3';
cout = '3';
cout = 'm';
} else if (i > 0) {
cout = '\033';
cout = '[';
cout = '9';
cout = 48+i;
cout = 'm';
}
switch (i) {
case 0:
cout = ' ';
break;
case 8:
cout = 0xCD;
break;
case 9:
cout = 0xB0;
break;
default:
cout = 0xDB;
break;
}
}
void draw() { void draw() {
// Move to the start of the field // Move to the start of the field
cout = '\033'; put_string_fast("\033[2;2H");
cout = '[';
cout = '2';
cout = ';';
cout = '2';
cout = 'H';
// Draw the screen // Draw the screen
for (uint8_t y = 0; y < HEIGHT; ++y) { for (uint8_t y = 0; y < HEIGHT; ++y) {
@ -183,56 +191,23 @@ void draw() {
uint8_t i = screen[y*WIDTH + x]; uint8_t i = screen[y*WIDTH + x];
draw_part(i); draw_part(i);
} }
cout = '\n'; put_string_fast("\n\r ");
cout = '\r';
cout = ' ';
}
// Draw next part
for (uint8_t y = 0; y < 4; ++y) {
cout = '\033';
cout = '[';
cout = '3' + y;
cout = ';';
cout = '1';
cout = '5';
cout = 'H';
for (uint8_t x = 0; x < 4; ++x) {
if (tetromino[next_shape][rotate(x, y, 0)] == 'X') {
draw_part(next_shape + 1);
} else {
draw_part(0);
}
} }
} }
cout = '\033'; inline void draw_score() {
cout = '['; put_string_fast("\033[8;15H");
cout = '8'; put_string_fast("\033[0m");
cout = ';';
cout = '1';
cout = '5';
cout = 'H';
// Print the score // Print the score
uint32_t r = uint16_to_bcd(score); uint32_t r = uint16_to_bcd(score);
for (uint8_t j = 0; j < 6; ++j) { for (uint8_t j = 0; j < 6; ++j) {
cout = '0' + ((r >> (20 - j*4)) & 0xF); put_char_fast('0' + ((r >> (20 - j*4)) & 0xF));
} }
cout = '\033';
cout = '[';
cout = '0';
cout = 'm';
} }
uint8_t counter = SPEED; uint8_t counter = SPEED;
__sfr __at (0x1F) status;
__sfr __at (0x1E) key;
__sfr __at (0xFF) debug;
uint8_t loop() { uint8_t loop() {
// Check if a key has been pressed // Check if a key has been pressed
uint8_t bonus = 0; uint8_t bonus = 0;
@ -321,14 +296,11 @@ uint8_t loop() {
if (cc) { if (cc) {
score += 10*cc*cc + bonus; score += 10*cc*cc + bonus;
} draw_score();
if (cc) {
debug = (score >> 8) & 0xFF;
debug = score & 0xFF;
} }
new_shape(); new_shape();
draw_next_shape();
current_y = 0; current_y = 0;
current_x = WIDTH/2-2; current_x = WIDTH/2-2;
current_rotation = 0; current_rotation = 0;
@ -379,6 +351,9 @@ void main() {
// Clear the screen // Clear the screen
put_string("\033[2J"); put_string("\033[2J");
draw_next_shape();
draw_score();
// @todo We need to be able to turn the cursor on/off // @todo We need to be able to turn the cursor on/off
while (loop()); while (loop());