Browse Source

fix gbprinter score screenshot feature

Thomas B 1 month ago
parent
commit
427e285da5
3 changed files with 30 additions and 10 deletions
  1. 26
    7
      src/gbprinter.c
  2. 3
    2
      src/gbprinter.h
  3. 1
    1
      src/main.c

+ 26
- 7
src/gbprinter.c View File

@@ -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
 }

+ 3
- 2
src/gbprinter.h View File

@@ -31,8 +31,9 @@
31 31
 
32 32
 uint8_t gbprinter_detect(uint8_t delay) BANKED;
33 33
 uint8_t gbprinter_print_image(const uint8_t *image_map, const uint8_t *image,
34
-                              int8_t pos_x, uint8_t width, uint8_t height) BANKED;
35
-uint8_t gbprinter_screenshot(void) BANKED;
34
+                              int8_t pos_x, uint8_t width, uint8_t height,
35
+                              uint8_t done) BANKED;
36
+uint8_t gbprinter_screenshot(uint8_t win) BANKED;
36 37
 uint8_t gbprinter_error(uint8_t status, char *buff);
37 38
 
38 39
 BANKREF_EXTERN(gbprinter)

+ 1
- 1
src/main.c View File

@@ -87,7 +87,7 @@ static void highscore(uint8_t is_black) NONBANKED {
87 87
         } else if (key_pressed(J_SELECT)) {
88 88
             uint8_t status = gbprinter_detect(PRINTER_DETECT_TIMEOUT);
89 89
             if (status == PRN_STATUS_OK) {
90
-                status = gbprinter_screenshot();
90
+                status = gbprinter_screenshot(1);
91 91
             }
92 92
 
93 93
             win_score_clear(2);

Loading…
Cancel
Save