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