|
@@ -25,6 +25,8 @@
|
25
|
25
|
#include <stdio.h>
|
26
|
26
|
#include <string.h>
|
27
|
27
|
|
|
28
|
+#include "gb/gb.h"
|
|
29
|
+#include "gb/hardware.h"
|
28
|
30
|
#include "input.h"
|
29
|
31
|
#include "gbprinter.h"
|
30
|
32
|
|
|
@@ -268,7 +270,8 @@ uint8_t gbprinter_detect(uint8_t delay) BANKED {
|
268
|
270
|
}
|
269
|
271
|
|
270
|
272
|
uint8_t gbprinter_print_image(const uint8_t *image_map, const uint8_t *image,
|
271
|
|
- int8_t pos_x, uint8_t width, uint8_t height) BANKED {
|
|
273
|
+ int8_t pos_x, uint8_t width, uint8_t height,
|
|
274
|
+ uint8_t done) BANKED {
|
272
|
275
|
uint8_t tile_data[16];
|
273
|
276
|
uint8_t rows = ((height + 1) >> 1) << 1;
|
274
|
277
|
uint8_t pkt_count = 0;
|
|
@@ -336,7 +339,7 @@ uint8_t gbprinter_print_image(const uint8_t *image_map, const uint8_t *image,
|
336
|
339
|
}
|
337
|
340
|
}
|
338
|
341
|
|
339
|
|
- if (pkt_count) {
|
|
342
|
+ if (pkt_count && done) {
|
340
|
343
|
PRINTER_SEND_COMMAND(PRN_PKT_EOF);
|
341
|
344
|
|
342
|
345
|
// setup printing if required
|
|
@@ -358,9 +361,25 @@ uint8_t gbprinter_print_image(const uint8_t *image_map, const uint8_t *image,
|
358
|
361
|
return PRINTER_SEND_COMMAND(PRN_PKT_STATUS);
|
359
|
362
|
}
|
360
|
363
|
|
361
|
|
-uint8_t gbprinter_screenshot(void) BANKED {
|
362
|
|
- return gbprinter_print_image(
|
363
|
|
- (const uint8_t *)0x9C00, (const uint8_t *)0x8800,
|
364
|
|
- 0,
|
365
|
|
- DEVICE_SCREEN_WIDTH, DEVICE_SCREEN_HEIGHT);
|
|
364
|
+uint8_t gbprinter_screenshot(uint8_t win) BANKED {
|
|
365
|
+ static uint8_t map_buff[2 * DEVICE_SCREEN_WIDTH];
|
|
366
|
+ static uint8_t tile_buff[2 * DEVICE_SCREEN_WIDTH * 16];
|
|
367
|
+
|
|
368
|
+ for (int y = 0; y < DEVICE_SCREEN_HEIGHT; y += 2) {
|
|
369
|
+ for (int y2 = 0; y2 < 2; y2++) {
|
|
370
|
+ for (int x = 0; x < DEVICE_SCREEN_WIDTH; x++) {
|
|
371
|
+ uint8_t tile = win ? get_win_tile_xy(x, y + y2) : get_bkg_tile_xy(x, y + y2);
|
|
372
|
+ map_buff[x + (y2 * DEVICE_SCREEN_WIDTH)] = (x + (y2 * DEVICE_SCREEN_WIDTH));
|
|
373
|
+ win ? get_win_data(tile, 1, tile_buff + ((x + (y2 * DEVICE_SCREEN_WIDTH)) * 16))
|
|
374
|
+ : get_bkg_data(tile, 1, tile_buff + ((x + (y2 * DEVICE_SCREEN_WIDTH)) * 16));
|
|
375
|
+ }
|
|
376
|
+
|
|
377
|
+ // black out rows we have sent, to indicate transfer progress
|
|
378
|
+ win ? fill_win_rect(0, y + y2, DEVICE_SCREEN_WIDTH, 1, 0)
|
|
379
|
+ : fill_bkg_rect(0, y + y2, DEVICE_SCREEN_WIDTH, 1, 0);
|
|
380
|
+ }
|
|
381
|
+
|
|
382
|
+ gbprinter_print_image(map_buff, tile_buff, 0, DEVICE_SCREEN_WIDTH, 2,
|
|
383
|
+ (y == (DEVICE_SCREEN_HEIGHT - 2)) ? 1 : 0);
|
|
384
|
+ }
|
366
|
385
|
}
|