diff --git a/Makefile.mk b/Makefile.mk index 298b487..a44c4cf 100644 --- a/Makefile.mk +++ b/Makefile.mk @@ -6,8 +6,13 @@ DSITEST_PROG = dsitest AFPMOUNTER_OBJS = afpmounter.o callat.o endian.o AFPMOUNTER_PROG = afpmounter -.PHONY: default -default: $(DSITEST_PROG) $(AFPMOUNTER_PROG) +DUMPCMDTBL_OBJS = dumpcmdtbl.o asmglue.o +DUMPCMDTBL_PROG = dumpcmdtbl + +PROGS = $(DSITEST_PROG) $(AFPMOUNTER_PROG) $(DUMPCMDTBL_PROG) + +.PHONY: $(PROGS) +default: $(PROGS) $(DSITEST_PROG): $(DSITEST_OBJS) occ $(CFLAGS) -o $@ $(DSITEST_OBJS) @@ -15,12 +20,12 @@ $(DSITEST_PROG): $(DSITEST_OBJS) $(AFPMOUNTER_PROG): $(AFPMOUNTER_OBJS) occ $(CFLAGS) -o $@ $(AFPMOUNTER_OBJS) -endian.o: endian.asm - occ $(CFLAGS) -c $< +$(DUMPCMDTBL_PROG): $(DUMPCMDTBL_OBJS) + occ $(CFLAGS) -o $@ $(DUMPCMDTBL_OBJS) -callat.o: callat.asm - occ $(CFLAGS) -c $< +%.macros: %.asm + macgen $< $@ /lang/orca/Libraries/ORCAInclude/m16.* .PHONY: clean clean: - $(RM) $(DSITEST_OBJS) $(DSITEST_PROG) $(AFPMOUNTER_PROG) $(AFPMOUNTER_OBJS) > .null + $(RM) $(PROGS) *.o *.root > .null diff --git a/asmglue.asm b/asmglue.asm new file mode 100644 index 0000000..f71b3c4 --- /dev/null +++ b/asmglue.asm @@ -0,0 +1,29 @@ + case on + mcopy asmglue.macros + +LCBANK2 gequ $C083 +STATEREG gequ $C068 + +ForceLCBank2 start + short i,m + lda >STATEREG ;get original state reg. + tax + lda >LCBANK2 ;force LC bank 2 + lda >LCBANK2 + long i,m + txa + rtl + end + +RestoreStateReg start + short m + plx + pla + ply + pha + phx + tya + sta >STATEREG + long m + rtl + end diff --git a/asmglue.h b/asmglue.h new file mode 100644 index 0000000..1159d4a --- /dev/null +++ b/asmglue.h @@ -0,0 +1,12 @@ +#ifndef ASMGLUE_H +#define ASMGLUE_H + +#include + +extern Word ForceLCBank2(void); +extern void RestoreStateReg(Word); + +void IncBusyFlag(void) inline(0, 0xE10064); +void DecBusyFlag(void) inline(0, 0xE10068); + +#endif diff --git a/asmglue.macros b/asmglue.macros new file mode 100644 index 0000000..bd531fa --- /dev/null +++ b/asmglue.macros @@ -0,0 +1,40 @@ + macro +&l long &a,&b + lclb &i + lclb &m +&a amid &a,1,1 +&m setb ("&a"="M").or.("&a"="m") +&i setb ("&a"="I").or.("&a"="i") + aif c:&b=0,.a +&b amid &b,1,1 +&m setb ("&b"="M").or.("&b"="m").or.&m +&i setb ("&b"="I").or.("&b"="i").or.&i +.a +&l rep #&m*32+&i*16 + aif .not.&m,.b + longa on +.b + aif .not.&i,.c + longi on +.c + mend + macro +&l short &a,&b + lclb &i + lclb &m +&a amid &a,1,1 +&m setb ("&a"="M").or.("&a"="m") +&i setb ("&a"="I").or.("&a"="i") + aif c:&b=0,.a +&b amid &b,1,1 +&m setb ("&b"="M").or.("&b"="m").or.&m +&i setb ("&b"="I").or.("&b"="i").or.&i +.a +&l sep #&m*32+&i*16 + aif .not.&m,.b + longa off +.b + aif .not.&i,.c + longi off +.c + mend diff --git a/dumpcmdtbl.c b/dumpcmdtbl.c new file mode 100644 index 0000000..6a970bd --- /dev/null +++ b/dumpcmdtbl.c @@ -0,0 +1,24 @@ +#include +#include +#include "asmglue.h" + +LongWord *cmdTable = (LongWord *)0xE1D600; + +LongWord cmdTableCopy[256]; + +int main(void) { + int i; + Word savedStateReg; + + IncBusyFlag(); + savedStateReg = ForceLCBank2(); + for (i = 0; i <= 0xFF; i++) { + cmdTableCopy[i] = cmdTable[i]; + } + RestoreStateReg(savedStateReg); + DecBusyFlag(); + + for (i = 0; i <= 0xFF; i++) { + printf("%02x: %08lx\n", i, cmdTableCopy[i]); + } +}