aboutsummaryrefslogtreecommitdiff
path: root/utils/dumpmiles/dumpmiles.cpp
blob: a1a3816bc0741c3f13b84d86d82d7efe63649830 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//#ifdef __MINGW32__
//typedef struct vswprintf {} swprintf;
//#endif
#include <cstdio>
#include <vector>
#include <stdio.h>

static void LoadMiles(const char* fn)
{
    FILE* fp = std::fopen(fn, "rb");
    if(!fp)
    {
        std::fprintf(stderr, "ERROR: Can't open %s file!", fn);
        return;
    }

    std::fseek(fp, 0, SEEK_END);
    std::vector<unsigned char> data(ftell(fp));
    std::rewind(fp);
    size_t got = std::fread(&data[0], 1, data.size(), fp);
    std::fclose(fp);

    if(got == 0)
    {
        std::fprintf(stderr, "ERROR: Can't read %s file!", fn);
        return;
    }

    for(unsigned a=0; a<500; ++a)
    {
        unsigned gmnumber  = data[a*6+0];
        unsigned gmnumber2 = data[a*6+1];
        unsigned offset    = *(unsigned*)&data[a*6+2];

        if(gmnumber == 0xFF) break;
        //int gmno = gmnumber2==0x7F ? gmnumber+0x80 : gmnumber;
        unsigned length = data[offset] + data[offset+1]*256;
        //signed char notenum = data[offset+2];

        std::printf("%02X %02X ", gmnumber,gmnumber2); //, offset);
        for(unsigned b=0; b<length; ++b)
        {
            if(b > 3 && (b-3)%11 == 0) std::printf("\n                        ");
            std::printf("%02X ", data[offset+b]);
        }
        std::printf("\n");
    }
}

int main(int argc, const char* const* argv)
{
    if(argc < 2)
    {
        std::printf("Usage: \n"
                    "   %s filename.opl\n"
                    "or:\n"
                    "   %s filename.opl\n"
                    "\n", argv[0], argv[0]);
        return 1;
    }
    LoadMiles(argv[1]);
}