From 0d852247f1662c836ba8772909e932b08e68fd7b Mon Sep 17 00:00:00 2001 From: ggn Date: Tue, 20 Dec 2022 23:48:39 +0200 Subject: [PATCH] Added support for C64 .PRG output format (#194) --- 6502.c | 31 +++++++++++++++++++++++++++++++ 6502.h | 2 ++ object.c | 5 +++++ rmac.c | 5 +++++ rmac.h | 1 + 5 files changed, 44 insertions(+) diff --git a/6502.c b/6502.c index c523086..5d1d7c7 100644 --- a/6502.c +++ b/6502.c @@ -587,3 +587,34 @@ void m6502raw(int ofd) uint32_t unused = write(ofd, p + l[0], l[1] - l[0]); } } + +// +// Generate a C64 .PRG output file +// +void m6502c64(int ofd) +{ + uint8_t header[2]; + uint32_t unused; + + CHUNK *ch = sect[M6502].scode; + + // If no 6502 code was generated, bail out + if ((ch == NULL) || (ch->challoc == 0)) + return; + + if (currentorg != &orgmap[1][0]) + { + // More than one 6502 section created, this is not allowed + error("when generating C64 .PRG files only one org section is allowed - aborting"); + return; + } + + SETLE16(header, 0, orgmap[0][0]); + register uint8_t *p = ch->chptr; + + // Write header + unused = write(ofd, header, 2); + // Write the data + unused = write(ofd, p + orgmap[0][0], orgmap[0][1] - orgmap[0][0]); + +} \ No newline at end of file diff --git a/6502.h b/6502.h index bddf065..453c66b 100644 --- a/6502.h +++ b/6502.h @@ -19,6 +19,8 @@ extern void Init6502(); extern int d_6502(); extern void m6502cg(int op); extern void m6502obj(int ofd); +extern void m6502raw(int ofd); +extern void m6502c64(int ofd); #endif // __6502_H__ diff --git a/object.c b/object.c index 6a69fcf..6dbf9c5 100644 --- a/object.c +++ b/object.c @@ -831,6 +831,11 @@ for(int j=0; j