From 54e09fdd0369fe4388956ca7ed65528af1675bd7 Mon Sep 17 00:00:00 2001
From: Oliver Schmidt
Date: Mon, 25 Nov 2013 22:52:04 +0100
Subject: [PATCH] Added basic frame for new target 'creativision'.
Kym Greenshields has expressed interest
in contributing and maintaining support for the VTech CreatiVision system.
this resembles commit 8e6b8dd0afed52c1963ea29c4921157693463cbe from oliver
---
cfg/creativision.cfg | 35 +++++++++++++
libsrc/Makefile | 1 +
libsrc/creativision/crt0.s | 102 +++++++++++++++++++++++++++++++++++++
src/ca65/main.c | 38 +++++++++-----
src/cc65/main.c | 38 +++++++++-----
src/common/target.c | 14 ++---
src/common/target.h | 13 ++---
7 files changed, 201 insertions(+), 40 deletions(-)
create mode 100644 cfg/creativision.cfg
create mode 100644 libsrc/creativision/crt0.s
diff --git a/cfg/creativision.cfg b/cfg/creativision.cfg
new file mode 100644
index 000000000..9122ccd42
--- /dev/null
+++ b/cfg/creativision.cfg
@@ -0,0 +1,35 @@
+SYMBOLS {
+ __STACKSIZE__: type = weak, value = $0180;
+}
+MEMORY {
+ ZP: file = "", define = yes, start = $0020, size = $00E0;
+ RAM: file = "", define = yes, start = $01FA, size = $0206;
+ ROM: file = %O, define = yes, start = $B000, size = $1000;
+}
+SEGMENTS {
+ ZEROPAGE: load = ZP, type = zp;
+ ZP: load = ZP, type = zp, optional = yes;
+ VECTORS: load = ROM, run = RAM, type = rw, define = yes;
+ DATA: load = ROM, run = RAM, type = rw, define = yes, start = $0204;
+ BSS: load = RAM, type = bss, define = yes;
+ CODE: load = ROM, type = ro;
+ INIT: load = ROM, type = ro;
+ RODATA: load = ROM, type = ro;
+ AUDIO: load = ROM, type = ro, optional = yes, start = $BF00;
+ SETUP: load = ROM, type = ro, start = $BFE8;
+}
+FEATURES {
+ CONDES: type = constructor,
+ label = __CONSTRUCTOR_TABLE__,
+ count = __CONSTRUCTOR_COUNT__,
+ segment = INIT;
+ CONDES: type = destructor,
+ label = __DESTRUCTOR_TABLE__,
+ count = __DESTRUCTOR_COUNT__,
+ segment = RODATA;
+ CONDES: type = interruptor,
+ label = __INTERRUPTOR_TABLE__,
+ count = __INTERRUPTOR_COUNT__,
+ segment = RODATA,
+ import = __CALLIRQ__;
+}
diff --git a/libsrc/Makefile b/libsrc/Makefile
index a4101aecd..364b266c8 100644
--- a/libsrc/Makefile
+++ b/libsrc/Makefile
@@ -20,6 +20,7 @@ TARGETS = apple2 \
atarixl \
atari5200 \
atmos \
+ creativision \
$(CBMS) \
$(GEOS) \
gamate \
diff --git a/libsrc/creativision/crt0.s b/libsrc/creativision/crt0.s
new file mode 100644
index 000000000..ccae38e81
--- /dev/null
+++ b/libsrc/creativision/crt0.s
@@ -0,0 +1,102 @@
+;
+; Startup code for cc65 (CreatiVision version)
+;
+
+ .export _exit
+ .export __STARTUP__ : absolute = 1 ; Mark as startup
+ .import zerobss, copydata
+ .import initlib, donelib, callmain
+ .import __VECTORS_LOAD__, __VECTORS_RUN__, __VECTORS_SIZE__
+ .import __ZP_LAST__, __STACKSIZE__, __RAM_START__
+
+ .include "zeropage.inc"
+
+; ------------------------------------------------------------------------
+
+entry:
+ ; Init the CPU
+ sei
+ cld
+
+ ; Copy the IRQ vectors
+ ldx #<__VECTORS_SIZE__ - 1
+: lda __VECTORS_LOAD__,x
+ sta __VECTORS_RUN__,x
+ dex
+ bpl :-
+
+ ; Setup the CPU stack ptr
+ ldx #<__RAM_START__ - 1
+ txs
+
+ ; Start interrupts
+ cli
+
+ ; Clear the BSS data
+ jsr zerobss
+
+ ; Copy data from ROM to RAM
+ jsr copydata
+
+ ; Setup the argument stack ptr
+ lda #<(__ZP_LAST__ + __STACKSIZE__)
+ ldx #>(__ZP_LAST__ + __STACKSIZE__)
+ sta sp
+ stx sp+1
+
+ ; Call module constructors
+ jsr initlib
+
+ ; Call main()
+ jsr callmain
+
+ ; Call module destructors. This is also the _exit entry.
+_exit: jsr donelib
+
+ ; TODO: Replace with some sort of reset
+loop: jmp loop
+
+; ------------------------------------------------------------------------
+; Define the IRQ vectors.
+
+.segment "VECTORS"
+
+irq1: jmp $FF3F
+irq2: jmp $FF52
+
+; ------------------------------------------------------------------------
+; Define CART setup values for BIOS.
+
+.segment "SETUP"
+
+ ; BIOS Jump Start
+ ; This is where the entry point of the program needs to be
+ .addr entry
+ .addr irq2
+
+ .res 4
+
+ ; VDP Setup
+ ; This sets to Graphics Mode 1
+ .byte $00 ; Register 0
+ .byte $C0 ; Register 1 16K RAM, Active Display, Mode 1
+ .byte $04 ; Register 2 Name Table at $1000 - $12FF
+ .byte $60 ; Register 3 Colour Table at $1800 - $181F
+ .byte $00 ; Register 4 Pattern Table at $0000 - $07FF
+ .byte $10 ; Register 5 Sprite Attribute at $0800 - $087F
+ .byte $01 ; Register 6 Sprite Pattern
+ .byte $F1 ; Register 7 Text colour Foreground / background
+
+ .res 4
+
+ ; BIOS Vector after NMI or RESET
+ ; Keeping with retail cartridges, we jump back to BIOS ROM and have it
+ ; setup zeropage etc, and show the Creativision logo and copyright.
+ .addr $F808
+
+ ; BIOS Short Interrupt Handler
+ ; Vectored from BIOS ROM:FE2C. This should contain a pointer to the user's
+ ; BIOS interrupt handler.
+ .addr irq1
+
+; ------------------------------------------------------------------------
diff --git a/src/ca65/main.c b/src/ca65/main.c
index 0016c46f3..b25d5ad9f 100644
--- a/src/ca65/main.c
+++ b/src/ca65/main.c
@@ -251,10 +251,6 @@ static void SetSys (const char* Sys)
CBMSystem ("__PET__");
break;
- case TGT_BBC:
- NewSymbol ("__BBC__", 1);
- break;
-
case TGT_APPLE2:
NewSymbol ("__APPLE2__", 1);
break;
@@ -274,31 +270,41 @@ static void SetSys (const char* Sys)
NewSymbol ("__GEOS_CBM__", 1);
break;
+ case TGT_ATMOS:
+ NewSymbol ("__ATMOS__", 1);
+ break;
+
+ case TGT_BBC:
+ NewSymbol ("__BBC__", 1);
+ break;
+
+ case TGT_CREATIVISION:
+ NewSymbol ("__CREATIVISION__", 1);
+ break;
+
case TGT_GEOS_APPLE:
NewSymbol ("__GEOS__", 1);
NewSymbol ("__GEOS_APPLE__", 1);
break;
+ case TGT_GEOS_CBM:
+ /* Do not handle as a CBM system */
+ NewSymbol ("__GEOS__", 1);
+ NewSymbol ("__GEOS_CBM__", 1);
+ break;
+
case TGT_LUNIX:
NewSymbol ("__LUNIX__", 1);
break;
- case TGT_ATMOS:
- NewSymbol ("__ATMOS__", 1);
+ case TGT_LYNX:
+ NewSymbol ("__LYNX__", 1);
break;
case TGT_NES:
NewSymbol ("__NES__", 1);
break;
- case TGT_SUPERVISION:
- NewSymbol ("__SUPERVISION__", 1);
- break;
-
- case TGT_LYNX:
- NewSymbol ("__LYNX__", 1);
- break;
-
case TGT_SIM6502:
NewSymbol ("__SIM6502__", 1);
break;
@@ -315,6 +321,10 @@ static void SetSys (const char* Sys)
NewSymbol ("__PCE__", 1);
break;
+ case TGT_SUPERVISION:
+ NewSymbol ("__SUPERVISION__", 1);
+ break;
+
default:
AbEnd ("Invalid target name: `%s'", Sys);
diff --git a/src/cc65/main.c b/src/cc65/main.c
index abe2af56e..c4a5c3788 100644
--- a/src/cc65/main.c
+++ b/src/cc65/main.c
@@ -207,10 +207,6 @@ static void SetSys (const char* Sys)
cbmsys ("__PET__");
break;
- case TGT_BBC:
- DefineNumericMacro ("__BBC__", 1);
- break;
-
case TGT_APPLE2:
DefineNumericMacro ("__APPLE2__", 1);
break;
@@ -230,31 +226,41 @@ static void SetSys (const char* Sys)
DefineNumericMacro ("__GEOS_CBM__", 1);
break;
+ case TGT_ATMOS:
+ DefineNumericMacro ("__ATMOS__", 1);
+ break;
+
+ case TGT_BBC:
+ DefineNumericMacro ("__BBC__", 1);
+ break;
+
+ case TGT_CREATIVISION:
+ DefineNumericMacro ("__CREATIVISION__", 1);
+ break;
+
case TGT_GEOS_APPLE:
DefineNumericMacro ("__GEOS__", 1);
DefineNumericMacro ("__GEOS_APPLE__", 1);
break;
+ case TGT_GEOS_CBM:
+ /* Do not handle as a CBM system */
+ DefineNumericMacro ("__GEOS__", 1);
+ DefineNumericMacro ("__GEOS_CBM__", 1);
+ break;
+
case TGT_LUNIX:
DefineNumericMacro ("__LUNIX__", 1);
break;
- case TGT_ATMOS:
- DefineNumericMacro ("__ATMOS__", 1);
+ case TGT_LYNX:
+ DefineNumericMacro ("__LYNX__", 1);
break;
case TGT_NES:
DefineNumericMacro ("__NES__", 1);
break;
- case TGT_SUPERVISION:
- DefineNumericMacro ("__SUPERVISION__", 1);
- break;
-
- case TGT_LYNX:
- DefineNumericMacro ("__LYNX__", 1);
- break;
-
case TGT_SIM6502:
DefineNumericMacro ("__SIM6502__", 1);
break;
@@ -271,6 +277,10 @@ static void SetSys (const char* Sys)
DefineNumericMacro ("__PCE__", 1);
break;
+ case TGT_SUPERVISION:
+ DefineNumericMacro ("__SUPERVISION__", 1);
+ break;
+
default:
AbEnd ("Unknown target system type %d", Target);
}
diff --git a/src/common/target.c b/src/common/target.c
index e89010123..cc5d41206 100644
--- a/src/common/target.c
+++ b/src/common/target.c
@@ -134,7 +134,7 @@ static const unsigned char CTPET[256] = {
/* One entry in the target map */
typedef struct TargetEntry TargetEntry;
struct TargetEntry {
- char Name[12]; /* Target name */
+ char Name[13]; /* Target name */
target_t Id; /* Target id */
};
@@ -154,6 +154,7 @@ static const TargetEntry TargetMap[] = {
{ "c64", TGT_C64 },
{ "cbm510", TGT_CBM510 },
{ "cbm610", TGT_CBM610 },
+ { "creativision", TGT_CREATIVISION},
{ "gamate", TGT_GAMATE },
{ "geos", TGT_GEOS_CBM },
{ "geos-apple", TGT_GEOS_APPLE },
@@ -192,20 +193,21 @@ static const TargetProperties PropertyTable[TGT_COUNT] = {
{ "cbm610", CPU_6502, BINFMT_BINARY, CTPET },
{ "osic1p", CPU_6502, BINFMT_BINARY, CTOSI },
{ "pet", CPU_6502, BINFMT_BINARY, CTPET },
- { "bbc", CPU_6502, BINFMT_BINARY, CTNone },
{ "apple2", CPU_6502, BINFMT_BINARY, CTNone },
{ "apple2enh", CPU_65C02, BINFMT_BINARY, CTNone },
- { "geos-cbm", CPU_6502, BINFMT_BINARY, CTNone },
+ { "atmos", CPU_6502, BINFMT_BINARY, CTNone },
+ { "bbc", CPU_6502, BINFMT_BINARY, CTNone },
+ { "creativision", CPU_6502, BINFMT_BINARY, CTNone },
{ "geos-apple", CPU_65C02, BINFMT_BINARY, CTNone },
+ { "geos-cbm", CPU_6502, BINFMT_BINARY, CTNone },
{ "lunix", CPU_6502, BINFMT_O65, CTNone },
- { "atmos", CPU_6502, BINFMT_BINARY, CTNone },
- { "nes", CPU_6502, BINFMT_BINARY, CTNone },
- { "supervision", CPU_65SC02, BINFMT_BINARY, CTNone },
{ "lynx", CPU_65C02, BINFMT_BINARY, CTNone },
+ { "nes", CPU_6502, BINFMT_BINARY, CTNone },
{ "sim6502", CPU_6502, BINFMT_BINARY, CTNone },
{ "sim65c02", CPU_65C02, BINFMT_BINARY, CTNone },
{ "pce", CPU_HUC6280, BINFMT_BINARY, CTNone },
{ "gamate", CPU_6502, BINFMT_BINARY, CTNone },
+ { "supervision", CPU_65SC02, BINFMT_BINARY, CTNone },
};
/* Target system */
diff --git a/src/common/target.h b/src/common/target.h
index 6366b725f..c266a4408 100644
--- a/src/common/target.h
+++ b/src/common/target.h
@@ -66,27 +66,28 @@ typedef enum {
TGT_CBM610,
TGT_OSIC1P,
TGT_PET,
- TGT_BBC,
TGT_APPLE2,
TGT_APPLE2ENH,
- TGT_GEOS_CBM,
+ TGT_ATMOS,
+ TGT_BBC,
+ TGT_CREATIVISION,
TGT_GEOS_APPLE,
+ TGT_GEOS_CBM,
TGT_LUNIX,
- TGT_ATMOS,
- TGT_NES,
- TGT_SUPERVISION,
TGT_LYNX,
+ TGT_NES,
TGT_SIM6502,
TGT_SIM65C02,
TGT_PCENGINE,
TGT_GAMATE,
+ TGT_SUPERVISION,
TGT_COUNT /* Number of target systems */
} target_t;
/* Collection of target properties */
typedef struct TargetProperties TargetProperties;
struct TargetProperties {
- const char Name[12]; /* Name of the target */
+ const char Name[13]; /* Name of the target */
cpu_t DefaultCPU; /* Default CPU for this target */
unsigned char BinFmt; /* Default binary format for this target */
const unsigned char* CharMap; /* Character translation table */
--
2.39.5