/* */
/* */
/* */
-/* (C) 1998-2004 Ullrich von Bassewitz */
-/* Römerstrasse 52 */
-/* D-70794 Filderstadt */
-/* EMail: uz@cc65.org */
+/* (C) 1998-2005, Ullrich von Bassewitz */
+/* Römerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
-/* Predefined packages */
-
-/* Generic macros */
-static char MacGeneric[] =
- ".macro add Arg1, Arg2\n"
- " clc\n"
- " .if .paramcount = 2\n"
- " adc Arg1, Arg2\n"
- " .else\n"
- " adc Arg1\n"
- " .endif\n"
- ".endmacro\n"
- ".macro sub Arg1, Arg2\n"
- " sec\n"
- " .if .paramcount = 2\n"
- " sbc Arg1, Arg2\n"
- " .else\n"
- " sbc Arg1\n"
- " .endif\n"
- ".endmacro\n";
-
-/* Long branch macros */
-static char MacLongBranch[] =
- ".macro jeq Target\n"
- " .if .match(Target, 0)\n"
- " bne *+5\n"
- " jmp Target\n"
- " .elseif .def(Target) .and .const(Target) .and ((*+2)-(Target) <= 127)\n"
- " beq Target\n"
- " .else\n"
- " bne *+5\n"
- " jmp Target\n"
- " .endif\n"
- ".endmacro\n"
- ".macro jne Target\n"
- " .if .match(Target, 0)\n"
- " beq *+5\n"
- " jmp Target\n"
- " .elseif .def(Target) .and .const(Target) .and ((*+2)-(Target) <= 127)\n"
- " bne Target\n"
- " .else\n"
- " beq *+5\n"
- " jmp Target\n"
- " .endif\n"
- ".endmacro\n"
- ".macro jmi Target\n"
- " .if .match(Target, 0)\n"
- " bpl *+5\n"
- " jmp Target\n"
- " .elseif .def(Target) .and .const(Target) .and ((*+2)-(Target) <= 127)\n"
- " bmi Target\n"
- " .else\n"
- " bpl *+5\n"
- " jmp Target\n"
- " .endif\n"
- ".endmacro\n"
- ".macro jpl Target\n"
- " .if .match(Target, 0)\n"
- " bmi *+5\n"
- " jmp Target\n"
- " .elseif .def(Target) .and .const(Target) .and ((*+2)-(Target) <= 127)\n"
- " bpl Target\n"
- " .else\n"
- " bmi *+5\n"
- " jmp Target\n"
- " .endif\n"
- ".endmacro\n"
- ".macro jcs Target\n"
- " .if .match(Target, 0)\n"
- " bcc *+5\n"
- " jmp Target\n"
- " .elseif .def(Target) .and .const(Target) .and ((*+2)-(Target) <= 127)\n"
- " bcs Target\n"
- " .else\n"
- " bcc *+5\n"
- " jmp Target\n"
- " .endif\n"
- ".endmacro\n"
- ".macro jcc Target\n"
- " .if .match(Target, 0)\n"
- " bcs *+5\n"
- " jmp Target\n"
- " .elseif .def(Target) .and .const(Target) .and ((*+2)-(Target) <= 127)\n"
- " bcc Target\n"
- " .else\n"
- " bcs *+5\n"
- " jmp Target\n"
- " .endif\n"
- ".endmacro\n"
- ".macro jvs Target\n"
- " .if .match(Target, 0)\n"
- " bvc *+5\n"
- " jmp Target\n"
- " .elseif .def(Target) .and .const(Target) .and ((*+2)-(Target) <= 127)\n"
- " bvs Target\n"
- " .else\n"
- " bvc *+5\n"
- " jmp Target\n"
- " .endif\n"
- ".endmacro\n"
- ".macro jvc Target\n"
- " .if .match(Target, 0)\n"
- " bvs *+5\n"
- " jmp Target\n"
- " .elseif .def(Target) .and .const(Target) .and ((*+2)-(Target) <= 127)\n"
- " bvc Target\n"
- " .else\n"
- " bvs *+5\n"
- " jmp Target\n"
- " .endif\n"
- ".endmacro\n";
-
-/* Commodore specific macros */
-static char MacCBM[] =
- ".macro scrcode str\n"
- " .repeat .strlen(str), i\n"
- " .if (.strat(str, i) >= '@' .and .strat(str, i) <= 'z')\n"
- " .byte .strat(str, i) - '@'\n"
- " .elseif (.strat(str, i) >= 'A' .and .strat(str, i) <= 'Z')\n"
- " .byte .strat(str, i) - 'A' + 65\n"
- " .elseif (.strat(str, i) = '[')\n"
- " .byte 27\n"
- " .elseif (.strat(str, i) = ']')\n"
- " .byte 29\n"
- " .elseif (.strat(str, i) = '^')\n"
- " .byte 30\n"
- " .elseif (.strat(str, i) = '_')\n"
- " .byte 31\n"
- " .else\n"
- " .byte .strat(str, i)\n"
- " .endif\n"
- " .endrepeat\n"
- ".endmacro\n";
-
-/* CPU defines */
-static char MacCPU[] =
- "CPU_ISET_6502 = $01\n"
- "CPU_ISET_6502X = $02\n"
- "CPU_ISET_65SC02 = $04\n"
- "CPU_ISET_65C02 = $08\n"
- "CPU_ISET_65816 = $10\n"
- "CPU_ISET_SUNPLUS = $20\n"
- "CPU_ISET_SWEET16 = $40\n"
- "CPU_6502 = CPU_ISET_6502\n"
- "CPU_6502X = CPU_ISET_6502|CPU_ISET_6502X\n"
- "CPU_65SC02 = CPU_ISET_6502|CPU_ISET_65SC02\n"
- "CPU_65C02 = CPU_ISET_6502|CPU_ISET_65SC02|CPU_ISET_65C02\n"
- "CPU_65816 = CPU_ISET_6502|CPU_ISET_65SC02|CPU_ISET_65816\n"
- "CPU_SUNPLUS = CPU_ISET_SUNPLUS\n"
- "CPU_SWEET16 = CPU_ISET_SWEET16\n";
-
-
+/* Predefined macro packages converted into C strings by a perl script */
+#include "cbm.inc"
+#include "cpu.inc"
+#include "generic.inc"
+#include "longbranch.inc"
/* Table with pointers to the different packages */
static char* MacPackages [] = {
/* Check the parameter */
CHECK (Id < sizeof (MacPackages) / sizeof (MacPackages [0]));
- /* Insert the package */
- NewInputData (MacPackages [Id], 0);
+ /* Insert the package */
+ NewInputData (MacPackages[Id], 0);
}
--- /dev/null
+; Convert characters to screen codes
+.macro scrcode str
+ .repeat .strlen(str), i
+ .if (.strat(str, i) >= '@' .and .strat(str, i) <= 'z')
+ .byte .strat(str, i) - '@'
+ .elseif (.strat(str, i) >= 'A' .and .strat(str, i) <= 'Z')
+ .byte .strat(str, i) - 'A' + 65
+ .elseif (.strat(str, i) = '[')
+ .byte 27
+ .elseif (.strat(str, i) = ']')
+ .byte 29
+ .elseif (.strat(str, i) = '^')
+ .byte 30
+ .elseif (.strat(str, i) = '_')
+ .byte 31
+ .else
+ .byte .strat(str, i)
+ .endif
+ .endrepeat
+.endmacro
+
+
--- /dev/null
+#!/usr/bin/perl
+
+# Check number of params
+die "Usage: cvt-cfg.pl input output varname\n" unless ($#ARGV == 2);
+
+# Get the parameters
+$InputName = shift (@ARGV);
+$OutputName = shift (@ARGV);
+$VarName = shift (@ARGV);
+
+# Open both files
+open (IN, "<$InputName") or die "Cannot open $InputName\n";
+open (OUT, ">$OutputName") or die "Cannot open $OutputName\n";
+
+# Print the header to the output file
+print OUT "static char $VarName" . "[] = \n";
+
+# Read from input, print to output
+while ($Line = <IN>) {
+
+ # Remove the newline
+ chomp $Line;
+
+ # Separate an existing comment. No need to be overly clever, just ignore
+ # semicolons in strings.
+ if ($Line =~ /(.*?)(\s*)(;\s*)(.*?)\s*$/) {
+ $Line = $1;
+ $CommentSpace = $2;
+ $Comment = $4;
+ } else {
+ $CommentSpace = "";
+ $Comment = "";
+ }
+
+ # Remove leading and trailing spaces
+ $Line =~ s/^\s*|\s*$//g;
+
+ # Ignore empty lines
+ if ($Line eq "") {
+ if ($Comment ne "") {
+ print OUT "/* $Comment */\n";
+ }
+ next;
+ }
+
+ # Replace control chars
+ $Line =~ s/\\/\\\\/g;
+ $Line =~ s/\"/\\\"/g;
+ $Line =~ s/\'/\\\'/g;
+
+ # Print to output
+ print OUT "\"$Line\\n\"";
+
+ # Add a comment if we have one
+ if ($Comment ne "") {
+ print OUT "$CommentSpace/* $Comment */";
+ }
+
+ # Terminate the line
+ print OUT "\n";
+}
+
+# Terminate the variable declaration
+print OUT ";\n";
+
+# Close the files
+close IN;
+close OUT;
+
+# Done
+exit 0;
+
+
+
+
EBIND = emxbind
LDFLAGS =
+# Perl script for macro file conversion
+CVT=macpack/cvt-mac.pl
+
+# -----------------------------------------------------------------------------
+# List of all object files
+
OBJS = anonname.o \
asserts.o \
condasm.o \
toklist.o \
ulabel.o
+# -----------------------------------------------------------------------------
+# List of all macro files
+
+INCS = cbm.inc \
+ cpu.inc \
+ generic.inc \
+ longbranch.inc
+
+# -----------------------------------------------------------------------------
+
LIBS = $(COMMON)/common.a
EXECS = ca65
@$(MAKE) -f make/gcc.mak all
endif
-
-
-ca65: $(OBJS) $(LIBS)
+ca65: $(INCS) $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS)
@if [ $(OS2_SHELL) ] ; then $(EBIND) $@ ; fi
+inc: $(INCS)
+
clean:
rm -f *~ core *.lst
@echo "Creating dependency information"
$(CC) -I$(COMMON) -MM $^ > .depend
+# -----------------------------------------------------------------------------
+# Rules to make config includes
+
+cbm.inc: macpack/cbm.mac
+ @$(CVT) $< $@ MacCBM
+
+cpu.inc: macpack/cpu.mac
+ @$(CVT) $< $@ MacCPU
+
+generic.inc: macpack/generic.mac
+ @$(CVT) $< $@ MacGeneric
+
+longbranch.inc: macpack/longbranch.mac
+ @$(CVT) $< $@ MacLongBranch
+
+
+
+
+
+
+
+
+