From 2c975d36424c4d04e998f8f8b1633ad56ed9476a Mon Sep 17 00:00:00 2001 From: Oliver Schmidt Date: Wed, 4 Jun 2014 23:50:18 +0200 Subject: [PATCH] Create static drivers directly from source files. Up to now static drivers were created via co65 from dynamic drivers. However there was an issue with that approach: The dynamic drivers are "o65 simple files" which obligates that they start with the 'code' segment. However dynamic drivers need to start with the module header - which is written to. For dynamic drivers this isn't more than a conceptual issue because they are always contain a 'data' segment and may therefore only be loaded into writable memory. However when dynamic drivers are converted to static drivers using co65 then that issue becomes a real problem as then the 'code' segment may end up in non-writable memory - and thus writing to the module header fails. Instead of changing the way dynamic drivers work I opted to rather make static driver creation totally independent from dynamic drivers. This allows to place the module header in the 'data' segment (see 'module.mac'). --- asminc/module.mac | 13 ++++++++++ doc/ca65.sgml | 17 ++++++++----- libsrc/Makefile | 36 +++++++++++++-------------- libsrc/apple2/emd/a2.auxmem.s | 8 +++++- libsrc/apple2/joy/a2.stdjoy.s | 8 +++++- libsrc/apple2/mou/a2.stdmou.s | 8 +++++- libsrc/apple2/ser/a2.ssc.s | 8 +++++- libsrc/apple2/tgi/a2.hi.s | 8 +++++- libsrc/apple2/tgi/a2.lo.s | 8 +++++- libsrc/atari/emd/atr130.s | 7 +++++- libsrc/atari/joy/atrmj8.s | 7 +++++- libsrc/atari/joy/atrstd.s | 7 +++++- libsrc/atari/mou/atrjoy.s | 7 +++++- libsrc/atari/mou/atrst.s | 27 +++++++++++++++++++- libsrc/atari/mou/atrtt.s | 7 +++++- libsrc/atari/ser/atrrdev.s | 8 +++++- libsrc/atari/tgi/atari_tgi_common.inc | 15 ++++++++++- libsrc/atari5200/joy/atr5200std.s | 4 ++- libsrc/atmos/joy/atmos-pase.s | 4 ++- libsrc/atmos/ser/atmos-acia.s | 5 +++- libsrc/atmos/tgi/atmos-228-200-3.s | 3 ++- libsrc/atmos/tgi/atmos-240-200-2.s | 3 ++- libsrc/c128/emd/c128-georam.s | 4 +-- libsrc/c128/emd/c128-ram.s | 4 +-- libsrc/c128/emd/c128-ram2.s | 4 +-- libsrc/c128/emd/c128-ramcart.s | 4 +-- libsrc/c128/emd/c128-reu.s | 4 +-- libsrc/c128/emd/c128-vdc.s | 4 +-- libsrc/c128/joy/c128-ptvjoy.s | 4 ++- libsrc/c128/joy/c128-stdjoy.s | 3 ++- libsrc/c128/mou/c128-1351.s | 4 ++- libsrc/c128/mou/c128-inkwell.s | 4 ++- libsrc/c128/mou/c128-joy.s | 4 ++- libsrc/c128/mou/c128-pot.s | 4 ++- libsrc/c128/ser/c128-swlink.s | 4 ++- libsrc/c128/tgi/c128-vdc.s | 5 ++-- libsrc/c128/tgi/c128-vdc2.s | 5 ++-- libsrc/c16/emd/c16-ram.s | 3 ++- libsrc/c16/joy/c16-stdjoy.s | 3 ++- libsrc/c64/emd/c64-c256k.s | 3 ++- libsrc/c64/emd/c64-dqbb.s | 3 ++- libsrc/c64/emd/c64-georam.s | 3 ++- libsrc/c64/emd/c64-isepic.s | 3 ++- libsrc/c64/emd/c64-ram.s | 3 ++- libsrc/c64/emd/c64-ramcart.s | 3 ++- libsrc/c64/emd/c64-reu.s | 3 ++- libsrc/c64/emd/c64-vdc.s | 3 ++- libsrc/c64/emd/dtv-himem.s | 3 ++- libsrc/c64/joy/c64-hitjoy.s | 4 ++- libsrc/c64/joy/c64-numpad.s | 3 ++- libsrc/c64/joy/c64-ptvjoy.s | 4 ++- libsrc/c64/joy/c64-stdjoy.s | 3 ++- libsrc/c64/mou/c64-1351.s | 4 ++- libsrc/c64/mou/c64-inkwell.s | 4 ++- libsrc/c64/mou/c64-joy.s | 4 ++- libsrc/c64/mou/c64-pot.s | 4 ++- libsrc/c64/ser/c64-swlink.s | 4 ++- libsrc/c64/tgi/c64-hi.s | 4 +-- libsrc/cbm510/emd/cbm510-ram.s | 3 ++- libsrc/cbm510/joy/cbm510-std.s | 3 ++- libsrc/cbm510/mou/cbm510-inkwl.s | 4 ++- libsrc/cbm510/mou/cbm510-joy.s | 4 ++- libsrc/cbm510/ser/cbm510-std.s | 4 ++- libsrc/cbm610/emd/cbm610-ram.s | 3 ++- libsrc/cbm610/ser/cbm610-std.s | 4 ++- libsrc/geos-cbm/emd/geos-vdc.s | 4 ++- libsrc/geos-cbm/joy/geos-stdjoy.s | 6 +++-- libsrc/geos-cbm/tgi/geos-tgi.s | 6 +++-- libsrc/lynx/joy/lynx-stdjoy.s | 3 ++- libsrc/lynx/ser/lynx-comlynx.s | 5 +++- libsrc/lynx/tgi/lynx-160-102-16.s | 4 ++- libsrc/nes/joy/nes-stdjoy.s | 4 ++- libsrc/nes/tgi/nes-64-56-2.s | 4 ++- libsrc/pet/joy/pet-ptvjoy.s | 13 ++++++---- libsrc/pet/joy/pet-stdjoy.s | 4 ++- libsrc/plus4/joy/plus4-stdjoy.s | 7 +++++- libsrc/plus4/ser/plus4-stdser.s | 4 ++- libsrc/vic20/joy/vic20-ptvjoy.s | 5 +++- libsrc/vic20/joy/vic20-stdjoy.s | 3 ++- 79 files changed, 332 insertions(+), 115 deletions(-) create mode 100644 asminc/module.mac diff --git a/asminc/module.mac b/asminc/module.mac new file mode 100644 index 000000000..d844ec104 --- /dev/null +++ b/asminc/module.mac @@ -0,0 +1,13 @@ +.ifndef DYN_DRV + DYN_DRV = 1 +.endif + +.macro module_header module_label + .if DYN_DRV + .segment "HEADER" + .else + .data + .export module_label + module_label: + .endif +.endmacro diff --git a/doc/ca65.sgml b/doc/ca65.sgml index b222b4aac..32cf0b80b 100644 --- a/doc/ca65.sgml +++ b/doc/ca65.sgml @@ -4321,16 +4321,14 @@ The package defines the following macros: .MACPACK atari

-The atari macro package will define a macro named .MACPACK cbm

-The cbm macro package will define a macro named .MACPACK cpu

@@ -4386,6 +4384,13 @@ it is possible to determine if the instruction is supported, which is the case for the 65SC02, 65C02 and 65816 CPUs (the latter two are upwards compatible to the 65SC02). + +.MACPACK module

+ +This macro package defines a macro named Predefined constants

diff --git a/libsrc/Makefile b/libsrc/Makefile index 75e5c3681..6a801695a 100644 --- a/libsrc/Makefile +++ b/libsrc/Makefile @@ -207,38 +207,39 @@ endif define DRVTYPE_template $1_SRCDIR = $$(SRCDIR)/$1 -$1_OBJDIR = ../libwrk/$$(TARGET)/$1 +$1_STCDIR = ../libwrk/$$(TARGET) +$1_DYNDIR = ../libwrk/$$(TARGET)/$1 $1_DRVDIR = ../$1 -$1_OBJPAT = $$($1_OBJDIR)/$$(OBJPFX)%.o +$1_SRCPAT = $$($1_SRCDIR)/$$(OBJPFX)%.s +$1_STCPAT = $$($1_STCDIR)/$$(OBJPFX)%-$1.o +$1_DYNPAT = $$($1_DYNDIR)/$$(OBJPFX)%.o $1_DRVPAT = $$($1_DRVDIR)/$$(DRVPFX)%.$1 -$1_STCPAT = ../libwrk/$$(TARGET)/$$(DRVPFX)%-$1.o -$1_OBJS := $$(patsubst $$($1_SRCDIR)/%.s,$$($1_OBJDIR)/%.o,$$(wildcard $$($1_SRCDIR)/*.s)) +$1_SRCS := $$(wildcard $$($1_SRCDIR)/*.s) +$1_STCS = $$(patsubst $$($1_SRCPAT),$$($1_STCPAT),$$($1_SRCS)) +$1_DYNS = $$(patsubst $$($1_SRCPAT),$$($1_DYNPAT),$$($1_SRCS)) +$1_DRVS = $$(patsubst $$($1_DYNPAT),$$($1_DRVPAT),$$($1_DYNS)) -$1_DRVS = $$(patsubst $$($1_OBJPAT),$$($1_DRVPAT),$$($1_OBJS)) +$$($1_STCPAT): $$($1_SRCPAT) + @echo $$(TARGET) - $$< - static + @$$(CA65) -t $$(TARGET) -D DYN_DRV=0 $$(CA65FLAGS) --create-dep $$(@:.o=.d) -o $$@ $$< -$1_STCS = $$(patsubst $$($1_DRVPAT),$$($1_STCPAT),$$($1_DRVS)) +OBJS += $$($1_STCS) +DEPS += $$($1_STCS:.o=.d) -$$($1_OBJS): | $$($1_OBJDIR) +$$($1_DYNS): | $$($1_DYNDIR) -$$($1_DRVPAT): $$($1_OBJPAT) $$(ZPOBJ) | $$($1_DRVDIR) +$$($1_DRVPAT): $$($1_DYNPAT) $$(ZPOBJ) | $$($1_DRVDIR) @echo $$(TARGET) - $$(