diff --git a/README.md b/README.md index c1ba2c9..c089279 100644 --- a/README.md +++ b/README.md @@ -43,4 +43,4 @@ To build and run: make all make run -The makefiles use `re2c`, `flex`, `bison`, `gcc`, `cpp`, and `xa`. Will eventually provide a `./configure`. +The makefiles use `re2c`, `flex`, `bison`, `gcc`, `cpp`, `xa`, `grep`, and `sed`. Will eventually provide a `./configure`. diff --git a/common/Makefile b/common/Makefile index 19231b6..3993c6f 100644 --- a/common/Makefile +++ b/common/Makefile @@ -6,9 +6,12 @@ system.obj: common.obj page6.obj common.obj: rom.h common.h common.asm xa -C -M common.asm -l common.lbl -o common.obj -page6.obj: rom.h macros.h page6.src +page6.obj: rom.h macros.h globals.h page6.src cpp -P page6.src | $(XAPP) > page6.asm xa -C -M page6.asm -l page6.lbl -o page6.obj +globals.h: common.obj + grep -E -v '^(_|CMN_CD|CMN_DT|FN_FX)' common.lbl | sed -e 's/, 0, 0x0000//' -e 's/, / = /' -e 's/ 0x/ \x24/' > globals.h + clean: - rm -f page6.asm common.obj page6.obj common.lbl page6.lbl system.obj + rm -f globals.h page6.asm common.obj page6.obj common.lbl page6.lbl system.obj diff --git a/common/common.asm b/common/common.asm index c03745c..fe73653 100644 --- a/common/common.asm +++ b/common/common.asm @@ -117,7 +117,31 @@ _1 RTS ; done .) _LDD .( ; LDD r xxyy 2r yy xx Rr <- (xxyy) - load register directly from address - RTS + LDY #0 ; set up address in I0 + LDA (_PC),Y + STA _I0 + INY + LDA (_PC),Y + STA _I0+1 + DEY ; transfer four bytes over + LDA (_I0),Y + STA _R0,X + INY + LDA (_I0),Y + STA _R0+1,X + INY + LDA (_I0),Y + STA _R0+2,X + INY + LDA (_I0),Y + STA _R0+3,X + LDA #2 ; update program counter + CLC + ADC _PCL + STA _PCL + BCC _1 + INC _PCH +_1 RTS ; done .) _SVD .( ; SVD r xxyy 3r yy xx (xxyy) <- Rr - save register directly to address diff --git a/common/macros.h b/common/macros.h index f2b0dc5..8663732 100644 --- a/common/macros.h +++ b/common/macros.h @@ -42,35 +42,35 @@ ; macros #define ESC .BYTE _ESC_C #define RTN .BYTE _RTN_C -#define BRS(o) .BYTE _BRS_C, <(o - * - 3), >(o - * - 3) -#define BRA(o) .BYTE _BRA_C, <(o - * - 3), >(o - * - 3) -#define BRE(o) .BYTE _BRE_C, <(o - * - 3), >(o - * - 3) -#define BRG(o) .BYTE _BRG_C, <(o - * - 3), >(o - * - 3) -#define BRL(o) .BYTE _BRL_C, <(o - * - 3), >(o - * - 3) -#define BRZ(o) .BYTE _BRZ_C, <(o - * - 3), >(o - * - 3) -#define BRP(o) .BYTE _BRP_C, <(o - * - 3), >(o - * - 3) -#define BRN(o) .BYTE _BRN_C, <(o - * - 3), >(o - * - 3) -#define BRO(o) .BYTE _BRO_C, <(o - * - 3), >(o - * - 3) -#define BRU(o) .BYTE _BRU_C, <(o - * - 3), >(o - * - 3) -#define CPR(p, q) .BYTE _CPR_C, p * 16 + q -#define LDI(p, q) .BYTE _LDI_C, p * 16 + q -#define SVI(p, q) .BYTE _SVI_C, p * 16 + q -#define CMR(p, q) .BYTE _CMR_C, p * 16 + q -#define SET(r, v) .BYTE _SET_C + r, _SET_V(#v) -#define LDD(r, a) .BYTE _LDD_C + r, <(a), >(a) -#define SVD(r, a) .BYTE _SVD_C + r, <(a), >(a) -#define PSH(r) .BYTE _PSH_C + r -#define POP(r) .BYTE _POP_C + r -#define EXC(r) .BYTE _EXC_C + r -#define INR(r) .BYTE _INR_C + r -#define DCR(r) .BYTE _DCR_C + r -#define TST(r) .BYTE _TST_C + r -#define ADD(r, p, q) .BYTE _ADD_C + r, p * 16 + q -#define SUB(r, p, q) .BYTE _SUB_C + r, p * 16 + q -#define MUL(r, p, q) .BYTE _MUL_C + r, p * 16 + q -#define DIV(r, p, q) .BYTE _DIV_C + r, p * 16 + q -#define MOD(r, p, q) .BYTE _MOD_C + r, p * 16 + q -#define EXT(f) .BYTE _EXT_C + f +#define BRS(o) .BYTE _BRS_C, <((o) - * - 3), >((o) - * - 3) +#define BRA(o) .BYTE _BRA_C, <((o) - * - 3), >((o) - * - 3) +#define BRE(o) .BYTE _BRE_C, <((o) - * - 3), >((o) - * - 3) +#define BRG(o) .BYTE _BRG_C, <((o) - * - 3), >((o) - * - 3) +#define BRL(o) .BYTE _BRL_C, <((o) - * - 3), >((o) - * - 3) +#define BRZ(o) .BYTE _BRZ_C, <((o) - * - 3), >((o) - * - 3) +#define BRP(o) .BYTE _BRP_C, <((o) - * - 3), >((o) - * - 3) +#define BRN(o) .BYTE _BRN_C, <((o) - * - 3), >((o) - * - 3) +#define BRO(o) .BYTE _BRO_C, <((o) - * - 3), >((o) - * - 3) +#define BRU(o) .BYTE _BRU_C, <((o) - * - 3), >((o) - * - 3) +#define CPR(p, q) .BYTE _CPR_C, (p) * 16 + (q) +#define LDI(p, q) .BYTE _LDI_C, (p) * 16 + (q) +#define SVI(p, q) .BYTE _SVI_C, (p) * 16 + (q) +#define CMR(p, q) .BYTE _CMR_C, (p) * 16 + (q) +#define SET(r, v) .BYTE _SET_C + (r), _SET_V(#v) +#define LDD(r, a) .BYTE _LDD_C + (r), <(a), >(a) +#define SVD(r, a) .BYTE _SVD_C + (r), <(a), >(a) +#define PSH(r) .BYTE _PSH_C + (r) +#define POP(r) .BYTE _POP_C + (r) +#define EXC(r) .BYTE _EXC_C + (r) +#define INR(r) .BYTE _INR_C + (r) +#define DCR(r) .BYTE _DCR_C + (r) +#define TST(r) .BYTE _TST_C + (r) +#define ADD(r, p, q) .BYTE _ADD_C + (r), (p) * 16 + (q) +#define SUB(r, p, q) .BYTE _SUB_C + (r), (p) * 16 + (q) +#define MUL(r, p, q) .BYTE _MUL_C + (r), (p) * 16 + (q) +#define DIV(r, p, q) .BYTE _DIV_C + (r), (p) * 16 + (q) +#define MOD(r, p, q) .BYTE _MOD_C + (r), (p) * 16 + (q) +#define EXT(f) .BYTE _EXT_C + (f) ; header, begin and end of blocks #define HDR(a) .WORD a, _END_##a - a:* = * - 4:a .( diff --git a/common/page6.src b/common/page6.src index e767536..0c80aa8 100644 --- a/common/page6.src +++ b/common/page6.src @@ -1,15 +1,14 @@ #include "rom.h" #include "macros.h" +#include "globals.h" * = $600 HDR(DEMO) CMN - SET(R0, $b8 + 28) - SET(R2, -999999.999) - SET(R7, 1048575.999) - LDI(R1, R0) - SVI(R0, R2) + LDD(R0, PLS_1) + LDD(R1, MNS_1) + ADD(R2, R0, R1) ESC BRK