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
 #include <stdio.h>
25
 #include <stdio.h>
26
 #include <string.h>
26
 #include <string.h>
27
 
27
 
28
+#include "gb/gb.h"
29
+#include "gb/hardware.h"
28
 #include "input.h"
30
 #include "input.h"
29
 #include "gbprinter.h"
31
 #include "gbprinter.h"
30
 
32
 
268
 }
270
 }
269
 
271
 
270
 uint8_t gbprinter_print_image(const uint8_t *image_map, const uint8_t *image,
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
     uint8_t tile_data[16];
275
     uint8_t tile_data[16];
273
     uint8_t rows = ((height + 1) >> 1) << 1;
276
     uint8_t rows = ((height + 1) >> 1) << 1;
274
     uint8_t pkt_count = 0;
277
     uint8_t pkt_count = 0;
336
         }
339
         }
337
     }
340
     }
338
 
341
 
339
-    if (pkt_count) {
342
+    if (pkt_count && done) {
340
         PRINTER_SEND_COMMAND(PRN_PKT_EOF);
343
         PRINTER_SEND_COMMAND(PRN_PKT_EOF);
341
 
344
 
342
         // setup printing if required
345
         // setup printing if required
358
     return PRINTER_SEND_COMMAND(PRN_PKT_STATUS);
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
 
31
 
32
 uint8_t gbprinter_detect(uint8_t delay) BANKED;
32
 uint8_t gbprinter_detect(uint8_t delay) BANKED;
33
 uint8_t gbprinter_print_image(const uint8_t *image_map, const uint8_t *image,
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
 uint8_t gbprinter_error(uint8_t status, char *buff);
37
 uint8_t gbprinter_error(uint8_t status, char *buff);
37
 
38
 
38
 BANKREF_EXTERN(gbprinter)
39
 BANKREF_EXTERN(gbprinter)

+ 1
- 1
src/main.c View File

87
         } else if (key_pressed(J_SELECT)) {
87
         } else if (key_pressed(J_SELECT)) {
88
             uint8_t status = gbprinter_detect(PRINTER_DETECT_TIMEOUT);
88
             uint8_t status = gbprinter_detect(PRINTER_DETECT_TIMEOUT);
89
             if (status == PRN_STATUS_OK) {
89
             if (status == PRN_STATUS_OK) {
90
-                status = gbprinter_screenshot();
90
+                status = gbprinter_screenshot(1);
91
             }
91
             }
92
 
92
 
93
             win_score_clear(2);
93
             win_score_clear(2);

Loading…
Cancel
Save