v0.77: bugfixes related to storing bytecode in Apple II aux memory

This commit is contained in:
Bobbi Webber-Manners 2018-06-06 15:42:05 -04:00
parent 4bc399f092
commit 6573b80928
14 changed files with 32 additions and 17 deletions

View File

@ -113,6 +113,9 @@ eightball_a2e.o: eightball.c eightballutils.h eightballvm.h
$(CC65BINDIR)/cc65 -Or -t apple2enh -D A2E -o eightball_a2e.s eightball.c $(CC65BINDIR)/cc65 -Or -t apple2enh -D A2E -o eightball_a2e.s eightball.c
$(CC65BINDIR)/ca65 -t apple2enh eightball_a2e.s $(CC65BINDIR)/ca65 -t apple2enh eightball_a2e.s
eightballzp_a2e.o: eightballzp_a2e.S
$(CC65BINDIR)/ca65 -t apple2enh eightballzp_a2e.S
eightballvm_a2e.o: eightballvm.c eightballutils.h eightballvm.h eightballvm_a2e.o: eightballvm.c eightballutils.h eightballvm.h
$(CC65BINDIR)/cc65 -r -Oirs -t apple2enh -D A2E -o eightballvm_a2e.s eightballvm.c $(CC65BINDIR)/cc65 -r -Oirs -t apple2enh -D A2E -o eightballvm_a2e.s eightballvm.c
$(CC65BINDIR)/ca65 -t apple2enh eightballvm_a2e.s $(CC65BINDIR)/ca65 -t apple2enh eightballvm_a2e.s
@ -128,8 +131,8 @@ eightballutils_a2e.o: eightballutils.c eightballutils.h
$(CC65BINDIR)/cc65 -Or -t apple2enh -D A2E -o eightballutils_a2e.s eightballutils.c $(CC65BINDIR)/cc65 -Or -t apple2enh -D A2E -o eightballutils_a2e.s eightballutils.c
$(CC65BINDIR)/ca65 -t apple2enh eightballutils_a2e.s $(CC65BINDIR)/ca65 -t apple2enh eightballutils_a2e.s
bin/eb: eightball_a2e.o eightballutils_a2e.o bin/eb: eightball_a2e.o eightballutils_a2e.o eightballzp_a2e.o
$(CC65BINDIR)/ld65 -m 8balla2e.map -o bin/eb -C apple2enh.cfg -D __HIMEM__=0xbf00 eightball_a2e.o eightballutils_a2e.o $(CC65LIBDIR)/apple2enh.lib $(CC65BINDIR)/ld65 -m 8balla2e.map -o bin/eb -C apple2enh.cfg -D __HIMEM__=0xbf00 eightball_a2e.o eightballutils_a2e.o eightballzp_a2e.o $(CC65LIBDIR)/apple2enh.lib
bin/ebvm: eightballvm_a2e.o eightballutils_a2e.o eightballvmzp_a2e.o bin/ebvm: eightballvm_a2e.o eightballutils_a2e.o eightballvmzp_a2e.o
$(CC65BINDIR)/ld65 -m 8ballvma2e.map -o bin/ebvm -C apple2enh.cfg -D __HIMEM__=0xbf00 eightballvm_a2e.o eightballutils_a2e.o eightballvmzp_a2e.o $(CC65LIBDIR)/apple2enh.lib $(CC65BINDIR)/ld65 -m 8ballvma2e.map -o bin/ebvm -C apple2enh.cfg -D __HIMEM__=0xbf00 eightballvm_a2e.o eightballutils_a2e.o eightballvmzp_a2e.o $(CC65LIBDIR)/apple2enh.lib

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -53,11 +53,10 @@
* Define EXTMEMCODE to enable extended memory support for object code. * Define EXTMEMCODE to enable extended memory support for object code.
* Works for Apple //e only at present, but easy to extend. * Works for Apple //e only at present, but easy to extend.
* EXTMEMCODE can only be enabled if EXTMEM is also enabled. * EXTMEMCODE can only be enabled if EXTMEM is also enabled.
* At present EXTMEMCODE is **BROKEN** due to apparent bug in cc65 ext mem driver
*/ */
#ifdef A2E #ifdef A2E
#define EXTMEM /* Enable/disable extended memory for source code */ #define EXTMEM /* Enable/disable extended memory for source code */
#undef EXTMEMCODE /* Enable/disable extended memory for object code */ #define EXTMEMCODE /* Enable/disable extended memory for object code */
#endif #endif
/* Shortcut define CC65 makes code clearer */ /* Shortcut define CC65 makes code clearer */
@ -1613,24 +1612,35 @@ struct em_copy emcopy;
char embuf[255]; char embuf[255];
char embuf2[255]; char embuf2[255];
char buf[3];
char b;
extern char *addrptr;
#pragma zpsym ("addrptr");
/*
* This inline assembler version avoids the memory corruption
* which results from using em_copyto() in this situation.
*/
void copybytetoaux(char *auxptr, char byte) { void copybytetoaux(char *auxptr, char byte) {
//char *p = em_map((unsigned int)auxptr >> 8); addrptr = auxptr; /* addrptr is in zero page */
//*(p + (unsigned char)auxptr) = byte; addrptr += 0x200; /* BASE address offset */
//em_commit(); b = byte;
__asm__("sta $c005"); /* Write to aux mem */
buf[0] = byte; __asm__("lda %v", b);
buf[1] = 0; __asm__("sta (%v)", addrptr); /* 65C02 instruction */
emcopy.buf = buf; __asm__("sta $c004"); /* Back to normal */
#if 0
b = byte;
emcopy.buf = &b;
emcopy.count = 1; emcopy.count = 1;
emcopy.offs = (unsigned char)auxptr; emcopy.offs = (unsigned char)auxptr;
emcopy.page = (unsigned int)auxptr >> 8; emcopy.page = (unsigned int)auxptr >> 8;
em_copyto(&emcopy); em_copyto(&emcopy);
#endif
} }
void copybytefromaux(char *auxptr) { void copybytefromaux(char *auxptr) {
emcopy.buf = buf; emcopy.buf = embuf;
emcopy.count = 1; emcopy.count = 1;
emcopy.offs = (unsigned char)auxptr; emcopy.offs = (unsigned char)auxptr;
emcopy.page = (unsigned int)auxptr >> 8; emcopy.page = (unsigned int)auxptr >> 8;
@ -1741,6 +1751,7 @@ void emitprmsg(void)
++rtPC; ++rtPC;
} }
copybytetoaux(codeptr++, 0); copybytetoaux(codeptr++, 0);
++rtPC;
#else #else
emit(VM_PRMSG); emit(VM_PRMSG);
++rtPC; ++rtPC;
@ -1749,6 +1760,7 @@ void emitprmsg(void)
++rtPC; ++rtPC;
} }
*codeptr++ = 0; *codeptr++ = 0;
/* TODO: For some reason I don't need ++rtPC here */
#endif #endif
} }
#ifdef A2E #ifdef A2E
@ -1812,7 +1824,7 @@ void writebytecode()
while (p < end) { while (p < end) {
#ifdef EXTMEMCODE #ifdef EXTMEMCODE
copybytefromaux(p); copybytefromaux(p);
q = buf; q = embuf;
#else #else
q = p; q = p;
#endif #endif
@ -2927,7 +2939,7 @@ unsigned char doelse()
/* /*
* Code to jump over ELSE block when IF condition is true * Code to jump over ELSE block when IF condition is true
*/ */
return_stack[returnSP + 1] = rtPC; return_stack[returnSP + 1] = rtPC + 1;
emit_imm(VM_JMPIMM, 0xffff); /* To be filled in later */ emit_imm(VM_JMPIMM, 0xffff); /* To be filled in later */
/* /*
@ -2978,7 +2990,7 @@ unsigned char doendif()
* actually an ELSE.) * actually an ELSE.)
*/ */
if (return_stack[returnSP + 1]) { if (return_stack[returnSP + 1]) {
emit_fixup(return_stack[returnSP + 1] + 1, rtPC); emit_fixup(return_stack[returnSP + 1], rtPC);
} }
} else { } else {
/* /*

View File

@ -37,7 +37,7 @@
/* */ /* */
/**************************************************************************/ /**************************************************************************/
#define VERSIONSTR "0.76" #define VERSIONSTR "0.77"
void print(char *str); void print(char *str);