]> git.sur5r.net Git - cc65/commitdiff
New atari builtin macro package that features a scrcode macro.
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 28 Aug 2005 21:42:03 +0000 (21:42 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 28 Aug 2005 21:42:03 +0000 (21:42 +0000)
Changed the scrcode macro from the cbm builtin macro package to accept
multiple arguments of different types.

git-svn-id: svn://svn.cc65.org/cc65/trunk@3598 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ca65/.cvsignore
src/ca65/macpack.c
src/ca65/macpack.h
src/ca65/macpack/atari.mac [new file with mode: 0644]
src/ca65/macpack/cbm.mac
src/ca65/make/gcc.mak

index 605aeec6f1962e219a444a389e65632be1a6618f..82678fd6f4a5fe96406245468831348f4220d1c8 100644 (file)
@@ -1,6 +1,7 @@
 .depend
 ca65
 .kdbgrc.ca65
+atari.inc
 cbm.inc
 cpu.inc
 generic.inc
index 6cf5c09d32c49a5e39d21dc6b27ca7a40bfcb362..a6ec607c140937d2527dd695d9483624fd322155 100644 (file)
@@ -52,6 +52,7 @@
 
 
 /* Predefined macro packages converted into C strings by a perl script */
+#include "atari.inc"
 #include "cbm.inc"
 #include "cpu.inc"
 #include "generic.inc"
@@ -63,6 +64,7 @@ static struct {
     char*       Package;
 } MacPackages[MAC_COUNT] = {
     /* Packages sorted by id */
+    { "atari",          MacAtari        },
     { "cbm",            MacCBM          },
     { "cpu",            MacCPU          },
     { "generic",        MacGeneric      },
index 75ca43b5c12608b9b2e4de95bfe1d28a442c49b5..73184c043ccb0d32be747178d21faca4d33e89f9 100644 (file)
@@ -46,6 +46,7 @@
 
 /* Constants for the predefined packages */
 enum {
+    MAC_ATARI,
     MAC_CBM,
     MAC_CPU,
     MAC_GENERIC,
diff --git a/src/ca65/macpack/atari.mac b/src/ca65/macpack/atari.mac
new file mode 100644 (file)
index 0000000..981bd10
--- /dev/null
@@ -0,0 +1,59 @@
+; Convert characters to screen codes
+
+; Helper macro that converts and outputs one character
+.macro _scrcode char
+        .if (char >= 0) .and (char <= 31)
+                .byte   (char + 64)
+        .elseif (char >= 32) .and (char <= 95)
+                .byte   (char - 32)
+        .elseif (char >= 96) .and (char <= 127)
+                .byte   char
+        .elseif (char >= 128) .and (char <= 159)
+                .byte   (char + 64)
+        .elseif (char >= 160) .and (char <= 223)
+                .byte   (char - 32)
+        .elseif (char >= 224) .and (char <= 255)
+                .byte   char
+        .else
+                .error  "scrcode: Character constant out of range"
+        .endif
+.endmacro
+
+.macro  scrcode arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9
+
+        ; Bail out if next argument is empty
+        .if     .blank (arg1)
+                .exitmacro
+        .endif
+
+        ; Check for a string
+        .if     .match ({arg1}, "")
+
+                ; Walk over all string chars
+                .repeat .strlen (arg1), i
+                        _scrcode        {.strat (arg1, i)}
+                .endrepeat
+
+        ; Check for a number
+        .elseif .match (.left (1, {arg1}), 0)
+
+                ; Just output the number
+                _scrcode        arg1
+
+        ; Check for a character
+        .elseif .match (.left (1, {arg1}), 'a')
+
+                ; Just output the character
+                _scrcode        arg1
+
+        ; Anything else is an error
+        .else
+
+                .error  "scrcode: invalid argument type"
+
+        .endif
+
+        ; Call the macro recursively with the remaining args
+        scrcode arg2, arg3, arg4, arg5, arg6, arg7, arg8
+.endmacro
+
index 6850c7b43e121da4c00fe0224a053fc6d72425bb..4685508d7ebe25fb4a37f6dd64710104435c5d2f 100644 (file)
@@ -1,22 +1,62 @@
 ; 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
+
+; Helper macro that converts and outputs one character
+.macro _scrcode char
+        .if (char >= '@' .and char <= 'z')
+                .byte   (char - '@')
+        .elseif (char >= 'A' .and char <= 'Z')
+                .byte   (char - 'A' + 65)
+        .elseif (char = '[')
+                .byte   27
+        .elseif (char = ']')
+                .byte   29
+        .elseif (char = '^')
+                .byte   30
+        .elseif (char = '_')
+                .byte   31
+        .elseif (char < 256)
+                .byte   char
+        .else
+                .error  "scrcode: Character constant out of range"
+        .endif
 .endmacro
 
+.macro  scrcode arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9
+
+        ; Bail out if next argument is empty
+        .if     .blank (arg1)
+                .exitmacro
+        .endif
+
+        ; Check for a string
+        .if     .match ({arg1}, "")
+
+                ; Walk over all string chars
+                .repeat .strlen (arg1), i
+                        _scrcode        {.strat (arg1, i)}
+                .endrepeat
+
+        ; Check for a number
+        .elseif .match (.left (1, {arg1}), 0)
+
+                ; Just output the number
+                _scrcode        arg1
+
+        ; Check for a character
+        .elseif .match (.left (1, {arg1}), 'a')
+
+                ; Just output the character
+                _scrcode        arg1
+
+        ; Anything else is an error
+        .else
+
+                .error  "scrcode: invalid argument type"
+
+        .endif
+
+        ; Call the macro recursively with the remaining args
+        scrcode arg2, arg3, arg4, arg5, arg6, arg7, arg8
+.endmacro
 
+                        
index 3eeecb781b3b8a3e2facfc6439a3c423d8fb67f0..897b09cb216c96c3b527f5e8e41ac1a4ae3e9bec 100644 (file)
@@ -59,7 +59,8 @@ OBJS =  anonname.o      \
 # -----------------------------------------------------------------------------
 # List of all macro files
 
-INCS = cbm.inc         \
+INCS = atari.inc       \
+        cbm.inc                \
        cpu.inc         \
        generic.inc     \
         longbranch.inc
@@ -102,6 +103,9 @@ depend dep: $(OBJS:.o=.c)
 # -----------------------------------------------------------------------------
 # Rules to make config includes
 
+atari.inc:     macpack/atari.mac
+       @$(CVT) $< $@ MacAtari
+
 cbm.inc:       macpack/cbm.mac
        @$(CVT) $< $@ MacCBM