--- /dev/null
+/**
+ * File : bmp2tiles.c
+ * Author : Robin Krens <robin@robinkrens.nl>
+ * Date : 04.06.2022
+ * Last Modified Date: 12.06.2022
+ * Last Modified By : Robin Krens <robin@robinkrens.nl>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <SDL2/SDL_image.h>
+
+#define TILE_SZ 32
+#define FOURBBP_ROW 8
+#define FOURBPP_COL 8
+
+void bmp_info(SDL_Surface * img)
+{
+ SDL_PixelFormat * fmt;
+ fmt = img->format;
+ fprintf(stdout,"WIDTH: %d, HEIGHT: %d, BPP: %d\n", img->w, img->h, fmt->BitsPerPixel);
+}
+
+
+void generate_4bpp_tile_planar(unsigned char *buf, void * userdata, int sz)
+{
+ unsigned char * ptr = (unsigned char *) userdata;
+ for (int i = 0; i < 32; i+=4) {
+ /* fprintf(stdout, "userdata: pos: %d - %d\n", i, *ptr++); */
+ for (int j = 0; j < 4; ++j) {
+ for (int x = 0; x < 8; ++x) {
+ buf[i + j] = ptr[x] << j;
+ }
+ /* printf("%d: %x\n", i+j, buf[i+j]); */
+ }
+ ptr += 8;
+ }
+}
+
+void generate_4bpp_tile_packed(unsigned char *buf, void * userdata, int sz)
+{
+ unsigned char * ptr = (unsigned char *) userdata;
+ for (int i = 0; i < 32; i+=4) {
+ for (int j = 0; j < 4; ++j) {
+ buf[i+j] = ptr[0] << 4;
+ buf[i+j] |= ptr[1];
+ ptr += 2;
+ printf("%d: %x\n", i+j, buf[i+j]);
+ }
+ }
+}
+
+int main(void)
+{
+ SDL_Surface * rawbmp;
+ SDL_PixelFormat * fmt;
+ char filename[] = "test.bmp";
+ rawbmp = SDL_LoadBMP(filename);
+
+ if (!rawbmp) {
+ fprintf(stderr, "can not load .bmp file\n");
+ exit(EXIT_FAILURE);
+ }
+
+ bmp_info(rawbmp);
+
+ SDL_LockSurface(rawbmp);
+ rawbmp->userdata = rawbmp->pixels;
+ SDL_UnlockSurface(rawbmp);
+
+ unsigned char *tile_buf = malloc(sizeof(unsigned char) * TILE_SZ);
+
+ generate_4bpp_tile_packed(tile_buf, rawbmp->userdata, 64);
+
+ /* if (rawbmp->format->BitsPerPixel != 24) {
+ fprintf(stderr, "format %d not supported\n", rawbmp->format->BitsPerPixel);
+ exit(EXIT_FAILURE);
+ } */
+
+
+ SDL_FreeSurface(rawbmp);
+
+}
+++ /dev/null
-/**
- * File : romheader.c
- * Author : Robin Krens <robin@robinkrens.nl>
- * Date : 04.06.2022
- * Last Modified Date: 04.06.2022
- * Last Modified By : Robin Krens <robin@robinkrens.nl>
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-
-#define VERBOSE 1
-#define SEGMENT_SIZE 0x10000
-
-/* simple tool to pad 0xFF and to add ROM header
- * romheader structure is as follows: */
-
-struct __attribute__((__packed__)) rom_header {
- uint8_t jmpf;
- uint16_t label;
- uint16_t segment;
- uint8_t padding;
- uint8_t dev_id;
- uint8_t ws_type;
- uint8_t cart_nr;
- uint8_t padding2;
- uint8_t romsize;
- uint8_t ramsize;
- uint8_t wsspec;
- uint8_t padding3;
- uint16_t checksum;
-};
-
-static struct rom_header header = {
- .jmpf = 0xEA,
- .label = 0x0,
- .segment = 0xF000,
- .dev_id = 0x42,
- .ws_type = 0x01,
- .cart_nr = 0x01,
- .romsize = 0x03,
- .ramsize = 0x00,
- .wsspec = 0x04,
- .checksum = 0x0000
-};
-
-
-int main(void)
-{
- FILE *fp;
- /* open for appending, so seek postion is at end */
- fp = fopen("test.wsc", "a");
- if (fp == NULL) {
- perror("can not open file");
- exit(EXIT_FAILURE);
- }
-
- unsigned pos = ftell(fp);
- int gap = (SEGMENT_SIZE - pos) - sizeof(struct rom_header);
- if (gap <= 0)
- goto cleanup;
-
- char dummy[SEGMENT_SIZE + 1];
- memset(dummy, 0xFF, SEGMENT_SIZE);
-
- unsigned wc = fwrite(dummy, sizeof(char), gap, fp);
- wc += fwrite(&header, sizeof(char), sizeof(struct rom_header), fp);
-
- if (VERBOSE) {
- printf("size of struct: %ld\n", sizeof(struct rom_header));
- printf("pos: %d, gap to fill: %d\n", pos, gap);
- printf("written %d\n", wc);
- }
-
-cleanup:
-
- printf("done\n");
- fflush(fp);
- fclose(fp);
-}
-