abse/gameboy-advance

A tscircuit package created by abse.

Version
0.0.45
License
unset
Stars
0

firmware/game-console/asset_diagnostics.c

#include "doomgeneric/i_system.h"
#include "doomgeneric/w_wad.h"
#include "hardware/xip_cache.h"
#include "wad_checksums.h"
#include <stdint.h>
#include <stdio.h>
#include <string.h>
static unsigned reads_ok;
#ifndef GBA_VERIFY_EVERY_ASSET_READ
#define GBA_VERIFY_EVERY_ASSET_READ 0
#endif
static uint32_t crc32(const void *data, unsigned size) {
    const uint8_t *p = data;
    uint32_t crc = ~0u;
    while (size--) {
        crc ^= *p++;
        for (int bit = 0; bit < 8; bit++)
            crc = (crc >> 1) ^ (0xedb88320u & -(crc & 1));
    }
    return ~crc;
}
static int expected(unsigned i) {
    return lumpinfo[i].wad_file->length == 4196020 &&
           i < sizeof(wad_expected) / sizeof(wad_expected[0]) &&
           lumpinfo[i].position == wad_expected[i].pos && lumpinfo[i].size == wad_expected[i].size;
}
void verify_lump_read(unsigned i, const void *data) {
    if (!GBA_VERIFY_EVERY_ASSET_READ || !expected(i))
        return;
    uint32_t actual = crc32(data, lumpinfo[i].size);
    if (actual != wad_expected[i].crc) {
        printf("ASSET_BAD_READ %.8s lump=%u addr=%p actual=%08lx expected=%08x\n", lumpinfo[i].name,
               i, data, (unsigned long)actual, wad_expected[i].crc);
        I_Error("Bad SD/PSRAM texture data: %.8s", lumpinfo[i].name);
    }
    reads_ok++;
}
void verify_asset_caches(void) {
    unsigned checked = 0, bad = 0;
    xip_cache_clean_all();
    xip_cache_invalidate_all();
    for (unsigned i = 0; i < numlumps; i++)
        if (expected(i) && lumpinfo[i].cache) {
            uint32_t actual = crc32(lumpinfo[i].cache, lumpinfo[i].size);
            checked++;
            if (actual != wad_expected[i].crc) {
                bad++;
                printf("ASSET_BAD_CACHE %.8s lump=%u addr=%p actual=%08lx expected=%08x\n",
                       lumpinfo[i].name, i, lumpinfo[i].cache, (unsigned long)actual,
                       wad_expected[i].crc);
            }
        }
    printf("ASSET_CHECK reads_ok=%u caches=%u cache_bad=%u\n", reads_ok, checked, bad);
}