1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-07 23:29:39 +00:00

Added basic frame for new target 'creativision'.

Kym Greenshields <kym.greenshields@gmail.com> has expressed interest
in contributing and maintaining support for the VTech CreatiVision system.

this resembles commit 8e6b8dd0af from oliver
This commit is contained in:
Oliver Schmidt 2013-11-25 22:52:04 +01:00 committed by mrdudz
parent a8d3b83c43
commit 54e09fdd03
7 changed files with 203 additions and 42 deletions

35
cfg/creativision.cfg Normal file
View File

@ -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__;
}

View File

@ -20,6 +20,7 @@ TARGETS = apple2 \
atarixl \
atari5200 \
atmos \
creativision \
$(CBMS) \
$(GEOS) \
gamate \

102
libsrc/creativision/crt0.s Normal file
View File

@ -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
; ------------------------------------------------------------------------

View File

@ -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);

View File

@ -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);
}

View File

@ -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 },
{ "geos-apple", CPU_65C02, 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 },
{ "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 },
{ "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 */

View File

@ -66,27 +66,28 @@ typedef enum {
TGT_CBM610,
TGT_OSIC1P,
TGT_PET,
TGT_BBC,
TGT_APPLE2,
TGT_APPLE2ENH,
TGT_GEOS_CBM,
TGT_GEOS_APPLE,
TGT_LUNIX,
TGT_ATMOS,
TGT_NES,
TGT_SUPERVISION,
TGT_BBC,
TGT_CREATIVISION,
TGT_GEOS_APPLE,
TGT_GEOS_CBM,
TGT_LUNIX,
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 */