added 'uniconverter' to convert various speccy assembler files to text
[urasm.git] / uniconverter / src / cvtmasm / masm.c
blob9a773205a9d30b45873060051308edd4c0ec073d
1 #include "masm.h"
3 #include <ctype.h>
4 #include <string.h>
7 static const char *token[] = {
8 "A", "B" , "C", "D", "E", "H", "L", "I", "R", "XH", "XL", "YH", "YL", "IX", "IY", "AF'",
9 "AF", "HL", "DE", "BC", "M", "NC", "NV", "NZ", "P", "PE", "PO", "V", "Z", "SP", "{ ", "ORG ",
10 "PHASE ", "UNPHASE", "AND ", "ADC ", "SBC ", "ADD ", "SUB ", "XOR ", "OR ", "CP ", "LD ", "IM ", "RST ", "EI", "DI", "EXX",
11 "EXA", "INF", "LDIR", "LDDR", "OTIR", "OTDR", "OUTI", "OUTD", "RETI", "RETN", "INIR", "INDR", "CPIR", "CPDR", "NEG", "CPD",
12 "CPI", "IND", "INI", "LDD", "LDI", "CCF", "CPL", "DAA", "HALT", "NOP", "RLA", "RLCA", "RRA", "RRCA", "SCF", "RLD",
13 "RRD", "EX ", "RET", "CALL ", "JP ", "PUSH ", "POP ", "INC ", "DEC ", "OUT ", "IN ", "DJNZ ", "JR ", "BIT ", "RLC ", "RRC ",
14 "RL ", "RR ", "SLA ", "SRA ", "SLI ", "SRL ", "RES ", "SET ", "EQU ", "BEGIN ", "END", "INCBIN ", "INCLUDE ", "DB ", "DEFB ", "DEFS ",
15 "DEFW ", "DS ", "DW ", "DOWN", "UP", "SYSTEM", "STOPKEY", "?", "?", "?", "?", "?", "?", "?", "?", "?"
19 #define GETBYTE(_dst) do { \
20 if (--buflen < 0) { free(buf); return -1; } \
21 (_dst) = *from++; \
22 } while (0)
25 #define PUTCH(_ch) do { \
26 uint8_t _xch = (uint8_t)(_ch); \
27 if (fwrite(&_xch, 1, 1, fo) != 1) { free(buf); return -1; } \
28 } while (0)
31 static int extract (FILE *fo, FILE *fi) {
32 int buflen;
33 uint8_t *buf;
34 const uint8_t *from;
36 if ((buf = loadWholeFile(fi, &buflen)) == NULL) return -1;
37 if ((buflen -= sizeof(HOBHeader)) < 0) { free(buf); return -1; }
39 from = buf+sizeof(HOBHeader);
40 while (buflen > 0) {
41 uint8_t len;
43 GETBYTE(len);
44 if (len == 0xFF) break;
45 if (!len) {
46 PUTCH('\n');
47 continue;
49 for (int i = 0; i < len; ++i) {
50 if (buflen < 1) break;
51 if (*from < 0x20) {
52 if (*from == 0x0A && i != len-1) {
53 uint8_t spc;
55 ++from; --buflen;
56 ++i;
57 GETBYTE(spc);
58 for (int j = 0; j < spc; ++j) PUTCH(' ');
59 } else {
60 PUTCH(*from);
62 } else if (*from < 0x80) {
63 PUTCH(*from);
64 } else {
65 const char *ptr = token[*from-0x80];
66 while (*ptr) PUTCH(*ptr++);
68 ++from; --buflen;
69 if (buflen < 1) break;
71 PUTCH('\n');
72 if (buflen < 1) break;
73 if (*from != len) break;
74 ++from; --buflen;
76 free(buf);
77 return 0;
81 static const int detect (FILE *fi, const char *fname, const HOBHeader *hdr) {
82 if (!(hdr->type == 'a' && (hdr->start == 38667)) &&
83 !(hdr->type == 'a' && (hdr->start == 38821))) return 0;
84 return 1;
88 ////////////////////////////////////////////////////////////////////////////////
89 static CvtMethods mtlist;
92 CvtMethods *cvt_masm (void) {
93 mtlist.name = "Masm assembler";
94 mtlist.fmtname = "masm";
95 mtlist.extract = extract;
96 mtlist.detect = detect;
97 return &mtlist;