From 09e50d433da2354b91fab27b4eb1ddaee69c87dc Mon Sep 17 00:00:00 2001 From: Greg King Date: Sun, 9 Nov 2014 06:32:11 -0500 Subject: [PATCH 01/20] * Changed the way that Atmos programs are started. - Put a BASIC-language stub at the beginning. - Removed the Autostart flag. Those changes make it easy to give command-line arguments to a program. * Made the Atmos configure file accept a special symbol definition on ld65's command line. We can use "__RAMEND__" to increase the amount of RAM that's available to programs. --- cfg/atmos.cfg | 20 +++++++++++----- doc/atmos.sgml | 52 +++++++++++++++++++++++++++++------------- libsrc/atmos/bashdr.s | 24 +++++++++++++++++++ libsrc/atmos/crt0.s | 37 ++++++++++-------------------- libsrc/atmos/tapehdr.s | 30 ++++++++++++++++++++++++ 5 files changed, 116 insertions(+), 47 deletions(-) create mode 100644 libsrc/atmos/bashdr.s create mode 100644 libsrc/atmos/tapehdr.s diff --git a/cfg/atmos.cfg b/cfg/atmos.cfg index 137c0e9a9..062711b96 100644 --- a/cfg/atmos.cfg +++ b/cfg/atmos.cfg @@ -1,22 +1,30 @@ SYMBOLS { - __STACKSIZE__: type = weak, value = $0800; # 2k stack + __TAPEHDR__: type = import; + __BASHDR__: type = import; + __PROGFLAG__: type = weak, value = $00; # $00=BASIC, $80=machine code + __AUTORUN__: type = weak, value = $00; # $C7=run, $00=only load + __STACKSIZE__: type = weak, value = $0800; # 2K stack + __RAMEND__: type = weak, value = $9800; # graphics RAM not grabbed +# __RAMEND__: type = weak, value = $B400; # graphics RAM grabbed } MEMORY { ZP: file = "", define = yes, start = $00E2, size = $001A; - TAPEHDR: file = %O, type = ro, start = $0000, size = $0011; - RAM: file = %O, define = yes, start = $0500, size = $9300 - __STACKSIZE__; + TAPEHDR: file = %O, type = ro, start = $0000, size = $001F; + BASHEAD: file = %O, define = yes, start = $0501, size = $000D; + RAM: file = %O, define = yes, start = __BASHEAD_LAST__, size = __RAMEND__ - __RAM_START__ - __STACKSIZE__; } SEGMENTS { + ZEROPAGE: load = ZP, type = zp; TAPEHDR: load = TAPEHDR, type = ro; + BASHDR: load = BASHEAD, type = ro, define = yes, optional = yes; STARTUP: load = RAM, type = ro; LOWCODE: load = RAM, type = ro, optional = yes; - INIT: load = RAM, type = ro, define = yes, optional = yes; CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; + INIT: load = RAM, type = ro, define = yes, optional = yes; DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = bss, define = yes; + ZPSAVE: load = RAM, type = rw, define = yes; BSS: load = RAM, type = bss, define = yes; - ZEROPAGE: load = ZP, type = zp; } FEATURES { CONDES: type = constructor, diff --git a/doc/atmos.sgml b/doc/atmos.sgml index 805fc7a03..ab63c667b 100644 --- a/doc/atmos.sgml +++ b/doc/atmos.sgml @@ -7,7 +7,7 @@ , , -2014-03-27 +2014-09-23 An overview over the Atmos runtime system as it is implemented for the cc65 C @@ -32,27 +32,37 @@ more than one platform. Please see the function reference for more information. + Binary format

The standard binary output format generated by the linker for the Atmos target -is a machine language program with a 17 byte tape header including a cc65 tag. -The standard load and autostart address is $500. +is a machine language program with a one-line BASIC stub that jumps to the +machine-language part through Memory layout

-In the standard setup, cc65 generated programs use the memory from -$500 to $9800, so nearly 37K of memory (including the stack) is +In the standard setup, cc65-generated programs use the memory from +$0501 to $9800; so, nearly 37K of memory (including the stack) is available. ROM calls are possible without further precautions. +If your program needs more memory, and it won't use TGI graphics, then you can +use the ld65 command-line option,

@@ -117,7 +127,8 @@ The names in the parentheses denote the symbols to be used for static linking of Graphics drivers

-The default drivers, @@ -175,13 +186,14 @@ No mouse drivers are currently available for the Atmos. Disk I/O

-The existing library for the Atmos doesn't implement C file -I/O. There are hacks for the @@ -202,7 +214,13 @@ following functions (and a few others): Function keys

-These are defined to be FUNCT + number key. +They are defined to be FUNCT + a number key. + + +Capitals Lock

+ +The "CAPS Lock" mode is turned off while the program is running. The previous +mode (usually turned on) is restored when the program stops. Passing arguments to the program

@@ -211,10 +229,12 @@ Command-line arguments can be passed to - CALL#500:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5 + RUN:REM arg1 " ARG2 IS QUOTED" ARG3 "" ARG5 +You must turn Arguments are separated by spaces. Arguments may be quoted. Leading and trailing spaces around an argument are ignored. Spaces within diff --git a/libsrc/atmos/bashdr.s b/libsrc/atmos/bashdr.s new file mode 100644 index 000000000..e09bc9fec --- /dev/null +++ b/libsrc/atmos/bashdr.s @@ -0,0 +1,24 @@ +; +; 2010-11-14, Ullrich von Bassewitz +; 2014-09-06, Greg King +; +; This module supplies a small BASIC stub program that uses CALL +; to jump to the machine-language code that follows it. +; + + ; The following symbol is used by the linker config. file + ; to force this module to be included into the output file. + .export __BASHDR__:abs = 1 + + +.segment "BASHDR" + + .addr Next + .word .version ; Line number + .byte $BF,'#' ; CALL token, mark number as hexadecimal + .byte <(Start >> 8 ) + '0' + (Start >> 8 > $09) * $07 + .byte <(Start >> 4 & $0F) + '0' + (Start >> 4 & $0F > $09) * $07 + .byte <(Start & $0F) + '0' + (Start & $0F > $09) * $07 + .byte $00 ; End of BASIC line +Next: .addr $0000 ; BASIC program end marker +Start: diff --git a/libsrc/atmos/crt0.s b/libsrc/atmos/crt0.s index 1d919f348..63961bfe8 100644 --- a/libsrc/atmos/crt0.s +++ b/libsrc/atmos/crt0.s @@ -2,39 +2,18 @@ ; Startup code for cc65 (Oric version) ; ; By Debrune Jérôme and Ullrich von Bassewitz -; 2014-08-22, Greg King +; 2014-11-09, Greg King ; .export _exit .export __STARTUP__ : absolute = 1 ; Mark as startup .import initlib, donelib .import callmain, zerobss - .import __RAM_START__, __RAM_SIZE__ - .import __ZPSAVE_LOAD__, __STACKSIZE__ + .import __RAM_START__, __RAM_SIZE__, __STACKSIZE__ .include "zeropage.inc" .include "atmos.inc" -; ------------------------------------------------------------------------ -; Oric tape header - -.segment "TAPEHDR" - - .byte $16, $16, $16 ; Sync bytes - .byte $24 ; End of header marker - - .byte $00 ; $2B0 - .byte $00 ; $2AF - .byte $80 ; $2AE Machine code flag - .byte $C7 ; $2AD Autoload flag - .dbyt __ZPSAVE_LOAD__ - 1 ; $2AB - .dbyt __RAM_START__ ; $2A9 - .byte $00 ; $2A8 - .byte ((.VERSION >> 8) & $0F) + '0' - .byte ((.VERSION >> 4) & $0F) + '0' - .byte (.VERSION & $0F) + '0' - .byte $00 ; Zero terminated compiler version - ; ------------------------------------------------------------------------ ; Place the startup code in a special segment. @@ -79,7 +58,7 @@ L1: lda sp,x ; Call the module destructors. This is also the exit() entry. -_exit: jsr donelib ; Run module destructors +_exit: jsr donelib ; Restore the system stuff. @@ -104,7 +83,15 @@ L2: lda zpsave,x .segment "ZPSAVE" -zpsave: .res zpspace +zpsave: + +; This padding is needed by a bug in the ROM. +; (The CLOAD command starts BASIC's variables table on top of the last byte +; that was loaded [instead of at the next address].) + + .byte 0 + + .res zpspace - 1 ; ------------------------------------------------------------------------ diff --git a/libsrc/atmos/tapehdr.s b/libsrc/atmos/tapehdr.s new file mode 100644 index 000000000..b8562eb02 --- /dev/null +++ b/libsrc/atmos/tapehdr.s @@ -0,0 +1,30 @@ +; +; Based on code by Debrune Jérôme +; 2013-08-15, Greg King +; + + ; The following symbol is used by the linker config. file + ; to force this module to be included into the output file. + .export __TAPEHDR__:abs = 1 + + .import __BASHDR_LOAD__, __ZPSAVE_LOAD__, __AUTORUN__, __PROGFLAG__ + + +; ------------------------------------------------------------------------ +; Oric cassette-tape header + +.segment "TAPEHDR" + + .byte $16, $16, $16 ; Sync bytes + .byte $24 ; Beginning-of-header marker + + .byte $00 ; $2B0 + .byte $00 ; $2AF + .byte <__PROGFLAG__ ; $2AE Language flag ($00=BASIC, $80=machine code) + .byte <__AUTORUN__ ; $2AD Auto-run flag ($C7=run, $00=only load) + .dbyt __ZPSAVE_LOAD__ ; $2AB Address of end of file + .dbyt __BASHDR_LOAD__ ; $2A9 Address of start of file + .byte $00 ; $2A8 + + ; File name (a maximum of 17 characters), zero-terminated + .asciiz .sprintf("%u", .time) From 0ee891c1068aaf4538ae4a2a555a4dc43d8ad413 Mon Sep 17 00:00:00 2001 From: Greg King Date: Sun, 23 Nov 2014 15:29:16 -0500 Subject: [PATCH 02/20] Completed the coding of da65's SEGMENT feature. Before this commit, we could define segment ranges; but, the disassembler wouldn't do anything with those definitions. Now, da65 will put ".segment" directives into its output. Fixed da65's document. --- doc/da65.sgml | 122 ++++++++++++++++++++++---------------------- src/da65/attrtab.c | 56 ++++++++++++-------- src/da65/attrtab.h | 66 +++++++++++++----------- src/da65/data.c | 12 ++--- src/da65/infofile.c | 3 -- src/da65/main.c | 26 ++++++++-- src/da65/output.c | 54 +++++++++++++------- src/da65/output.h | 21 ++++---- src/da65/segment.c | 60 ++++++++++++++++------ src/da65/segment.h | 15 ++++-- 10 files changed, 261 insertions(+), 174 deletions(-) diff --git a/doc/da65.sgml b/doc/da65.sgml index 2b8cdb2a3..df8cd7772 100644 --- a/doc/da65.sgml +++ b/doc/da65.sgml @@ -2,12 +2,14 @@

da65 Users Guide -<author><url url="mailto:uz@cc65.org" name="Ullrich von Bassewitz"> -<date>2003-08-08 +<author> +<url url="mailto:uz@cc65.org" name="Ullrich von Bassewitz">,<newline> +<url url="mailto:greg.king5@verizon.net" name="Greg King"> +<date>2014-11-23 <abstract> -da65 is a 6502/65C02 disassembler that is able to read user supplied -information about its input data for better results. The output is ready for +da65 is a 6502/65C02 disassembler that is able to read user-supplied +information about its input data, for better results. The output is ready for feeding into ca65, the macro assembler supplied with the cc65 C compiler. </abstract> @@ -23,7 +25,7 @@ the cc65 C compiler and generates output that is suitable for the ca65 macro assembler. Besides generating output for ca65, one of the design goals was that the user -is able to feed additional information about the code into the disassembler +is able to feed additional information about the code into the disassembler, for improved results. This information may include the location and size of tables, and their format. @@ -106,11 +108,16 @@ Here is a description of all the command line options: <tag><tt>--cpu type</tt></tag> Set the CPU type. The option takes a parameter, which may be one of + <itemize> + <item>6502 + <item>6502x + <item>65sc02 + <item>65c02 + <item>huc6280 + </itemize> - 6502, 6502x, 65sc02, 65c02, huc6280 - - 6502x is the NMOS 6502 with illegal opcodes. huc6280 is the CPU of the PC - engine. Support for the 65816 is currently not available. + 6502x is for the NMOS 6502 with unofficial opcodes. huc6280 is the CPU of + the PC engine. Support for the 65816 currently is not available. <label id="option--formfeeds"> @@ -125,7 +132,7 @@ Here is a description of all the command line options: <tag><tt>-g, --debug-info</tt></tag> This option adds the <tt/.DEBUGINFO/ command to the output file, so the - assembler will generate debug information when reassembling the generated + assembler will generate debug information when re-assembling the generated output. @@ -241,7 +248,7 @@ unsupported. The disassembler works by creating an attribute map for the whole address space ($0000 - $FFFF). Initially, all attributes are cleared. Then, an external info file (if given) is read. Disassembly is done in several passes. -In all passes with the exception of the last one, information about the +In all passes, with the exception of the last one, information about the disassembled code is gathered and added to the symbol and attribute maps. The last pass generates output using the information from the maps. @@ -275,19 +282,19 @@ braces. Attributes have a name followed by a value. The syntax of the value depends on the type of the attribute. String attributes are places in double quotes, numeric attributes may be specified as decimal numbers or hexadecimal with a leading dollar sign. There are also attributes where the attribute -value is a keyword, in this case the keyword is given as is (without quotes or +value is a keyword; in this case, the keyword is given as-is (without quotes or anything). Each attribute is terminated by a semicolon. <tscreen><verb> - group-name { attribute1 attribute-value; attribute2 attribute-value; } + group-name { attribute1 attribute-value; attribute2 attribute-value; } </verb></tscreen> <sect1>Comments<p> -Comments start with a hash mark (<tt/#/) and extend from the position of +Comments start with a hash mark (<tt/#/); and, extend from the position of the mark to the end of the current line. Hash marks inside of strings will -of course <em/not/ start a comment. +<em/not/ start a comment, of course. <sect1>Specifying global options<label id="global-options"><p> @@ -543,18 +550,17 @@ disassembled code. The following attributes are recognized: <tag><tt>END</tt></tag> Followed by a numerical value. Specifies the end address of the segment. The - end address is last the address that is part of the segment. + end address is the last address that is a part of the segment. <tag><tt>NAME</tt></tag> The attribute is followed by a string value which gives the name of the segment. </descrip> -All attributes are mandatory. Segments may not overlap. Since there is no -explicit "end this segment" pseudo op, the disassembler cannot notify the -assembler that one segment has ended. This may lead to errors if you don't -define your segments carefully. As a rule of thumb, if you're using segments, -your should define segments for all disassembled code. +All attributes are mandatory. Segments must not overlap. The disassembler will +change back to the (default) <tt/.code/ segment after the end of each defined +segment. That might not be what you want. As a rule of thumb, if you're using +segments, you should define segments for all disassembled code. <sect1>Specifying Assembler Includes<label id="infofile-asminc"><p> @@ -563,8 +569,8 @@ The <tt/ASMINC/ directive is used to give the names of input files containing symbol assignments in assembler syntax: <tscreen><verb> - Name = value - Name := value + Name = value + Name := value </verb></tscreen> The usual conventions apply for symbol names. Values may be specified as hex @@ -613,48 +619,46 @@ directives explained above: }; # One segment for the whole stuff - SEGMENT { START $E000; END $FFFF; NAME kernal; }; + SEGMENT { START $E000; END $FFFF; NAME "kernal"; }; - RANGE { START $E612; END $E631; TYPE Code; }; - RANGE { START $E632; END $E640; TYPE ByteTable; }; - RANGE { START $EA51; END $EA84; TYPE RtsTable; }; - RANGE { START $EC6C; END $ECAB; TYPE RtsTable; }; - RANGE { START $ED08; END $ED11; TYPE AddrTable; }; + RANGE { START $E612; END $E631; TYPE Code; }; + RANGE { START $E632; END $E640; TYPE ByteTable; }; + RANGE { START $EA51; END $EA84; TYPE RtsTable; }; + RANGE { START $EC6C; END $ECAB; TYPE RtsTable; }; + RANGE { START $ED08; END $ED11; TYPE AddrTable; }; - # Zero page variables - LABEL { NAME "fnadr"; ADDR $90; SIZE 3; }; - LABEL { NAME "sal"; ADDR $93; }; - LABEL { NAME "sah"; ADDR $94; }; - LABEL { NAME "sas"; ADDR $95; }; + # Zero-page variables + LABEL { NAME "fnadr"; ADDR $90; SIZE 3; }; + LABEL { NAME "sal"; ADDR $93; }; + LABEL { NAME "sah"; ADDR $94; }; + LABEL { NAME "sas"; ADDR $95; }; # Stack - LABEL { NAME "stack"; ADDR $100; SIZE 255; }; + LABEL { NAME "stack"; ADDR $100; SIZE 255; }; # Indirect vectors - LABEL { NAME "cinv"; ADDR $300; SIZE 2; }; # IRQ - LABEL { NAME "cbinv"; ADDR $302; SIZE 2; }; # BRK - LABEL { NAME "nminv"; ADDR $304; SIZE 2; }; # NMI + LABEL { NAME "cinv"; ADDR $300; SIZE 2; }; # IRQ + LABEL { NAME "cbinv"; ADDR $302; SIZE 2; }; # BRK + LABEL { NAME "nminv"; ADDR $304; SIZE 2; }; # NMI # Jump table at end of kernal ROM - LABEL { NAME "kscrorg"; ADDR $FFED; }; - LABEL { NAME "kplot"; ADDR $FFF0; }; - LABEL { NAME "kiobase"; ADDR $FFF3; }; - LABEL { NAME "kgbye"; ADDR $FFF6; }; + LABEL { NAME "kscrorg"; ADDR $FFED; }; + LABEL { NAME "kplot"; ADDR $FFF0; }; + LABEL { NAME "kiobase"; ADDR $FFF3; }; + LABEL { NAME "kgbye"; ADDR $FFF6; }; # Hardware vectors - LABEL { NAME "hanmi"; ADDR $FFFA; }; - LABEL { NAME "hares"; ADDR $FFFC; }; - LABEL { NAME "hairq"; ADDR $FFFE; }; + LABEL { NAME "hanmi"; ADDR $FFFA; }; + LABEL { NAME "hares"; ADDR $FFFC; }; + LABEL { NAME "hairq"; ADDR $FFFE; }; </verb></tscreen> - - <sect>Copyright<p> -da65 (and all cc65 binutils) are (C) Copyright 1998-2007 Ullrich von -Bassewitz. For usage of the binaries and/or sources the following +da65 (and all cc65 binutils) is (C) Copyright 1998-2011, Ullrich von +Bassewitz. For usage of the binaries and/or sources, the following conditions do apply: This software is provided 'as-is', without any expressed or implied @@ -666,20 +670,16 @@ including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: <enum> -<item> The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. -<item> Altered source versions must be plainly marked as such, and must not - be misrepresented as being the original software. -<item> This notice may not be removed or altered from any source - distribution. +<item> The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +<item> Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. +<item> This notice may not be removed or altered from any source + distribution. </enum> </article> - - - - diff --git a/src/da65/attrtab.c b/src/da65/attrtab.c index 1cfb5ba45..d288d1298 100644 --- a/src/da65/attrtab.c +++ b/src/da65/attrtab.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2000-2006 Ullrich von Bassewitz */ -/* Römerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 2000-2014, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -66,6 +66,18 @@ void AddrCheck (unsigned Addr) +attr_t GetAttr (unsigned Addr) +/* Return the attribute for the given address */ +{ + /* Check the given address */ + AddrCheck (Addr); + + /* Return the attribute */ + return AttrTab[Addr]; +} + + + int SegmentDefined (unsigned Start, unsigned End) /* Return true if the atSegment bit is set somewhere in the given range */ { @@ -79,14 +91,26 @@ int SegmentDefined (unsigned Start, unsigned End) -int HaveSegmentChange (unsigned Addr) -/* Return true if the segment change attribute is set for the given address */ +int IsSegmentEnd (unsigned Addr) +/* Return true if a segment ends at the given address */ { - /* Check the given address */ - AddrCheck (Addr); + return (GetAttr (Addr) & atSegmentEnd) != 0x0000; +} - /* Return the attribute */ - return (AttrTab[Addr] & atSegmentChange) != 0; + + +int IsSegmentStart (unsigned Addr) +/* Return true if a segment starts at the given address */ +{ + return (GetAttr (Addr) & atSegmentStart) != 0x0000; +} + + + +int HaveSegmentChange (unsigned Addr) +/* Return true if the segment change attributes are set for the given address */ +{ + return (GetAttr (Addr) & (atSegmentStart | atSegmentEnd)) != 0x0000; } @@ -145,18 +169,6 @@ void MarkAddr (unsigned Addr, attr_t Attr) -attr_t GetAttr (unsigned Addr) -/* Return the attribute for the given address */ -{ - /* Check the given address */ - AddrCheck (Addr); - - /* Return the attribute */ - return AttrTab[Addr]; -} - - - attr_t GetStyleAttr (unsigned Addr) /* Return the style attribute for the given address */ { diff --git a/src/da65/attrtab.h b/src/da65/attrtab.h index c9fb9c35f..b2dc6c455 100644 --- a/src/da65/attrtab.h +++ b/src/da65/attrtab.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2000-2006 Ullrich von Bassewitz */ -/* Römerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 2000-2014, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -47,33 +47,34 @@ typedef enum attr_t { /* Styles */ - atDefault = 0x0000, /* Default style */ - atCode = 0x0001, - atIllegal = 0x0002, - atByteTab = 0x0003, /* Same as illegal */ - atDByteTab = 0x0004, - atWordTab = 0x0005, - atDWordTab = 0x0006, - atAddrTab = 0x0007, - atRtsTab = 0x0008, - atTextTab = 0x0009, - atSkip = 0x000A, /* Skip code completely */ + atDefault = 0x0000, /* Default style */ + atCode = 0x0001, + atIllegal = 0x0002, + atByteTab = 0x0003, /* Same as illegal */ + atDByteTab = 0x0004, + atWordTab = 0x0005, + atDWordTab = 0x0006, + atAddrTab = 0x0007, + atRtsTab = 0x0008, + atTextTab = 0x0009, + atSkip = 0x000A, /* Skip code completely */ /* Label flags */ - atNoLabel = 0x0000, /* No label for this address */ - atExtLabel = 0x0010, /* External label */ - atIntLabel = 0x0020, /* Internally generated label */ - atDepLabel = 0x0040, /* Dependent label */ - atUnnamedLabel = 0x0080, /* Unnamed label */ + atNoLabel = 0x0000, /* No label for this address */ + atExtLabel = 0x0010, /* External label */ + atIntLabel = 0x0020, /* Internally generated label */ + atDepLabel = 0x0040, /* Dependent label */ + atUnnamedLabel = 0x0080, /* Unnamed label */ - atLabelDefined = 0x0100, /* True if we defined the label */ + atLabelDefined = 0x0100, /* True if we defined the label */ - atStyleMask = 0x000F, /* Output style */ - atLabelMask = 0x00F0, /* Label information */ + atStyleMask = 0x000F, /* Output style */ + atLabelMask = 0x00F0, /* Label information */ /* Segment */ - atSegment = 0x0100, /* Code is in a segment */ - atSegmentChange = 0x0200, /* Either segment start or segment end */ + atSegment = 0x0100, /* Code is in a segment */ + atSegmentEnd = 0x0200, /* Segment end */ + atSegmentStart = 0x0400, /* Segment start */ } attr_t; @@ -87,11 +88,20 @@ typedef enum attr_t { void AddrCheck (unsigned Addr); /* Check if the given address has a valid range */ +attr_t GetAttr (unsigned Addr); +/* Return the attribute for the given address */ + int SegmentDefined (unsigned Start, unsigned End); /* Return true if the atSegment bit is set somewhere in the given range */ +int IsSegmentEnd (unsigned Addr); +/* Return true if a segment ends at the given address */ + +int IsSegmentStart (unsigned Addr); +/* Return true if a segment starts at the given address */ + int HaveSegmentChange (unsigned Addr); -/* Return true if the segment change attribute is set for the given address */ +/* Return true if the segment change attributes are set for the given address */ unsigned GetGranularity (attr_t Style); /* Get the granularity for the given style */ @@ -102,9 +112,6 @@ void MarkRange (unsigned Start, unsigned End, attr_t Attr); void MarkAddr (unsigned Addr, attr_t Attr); /* Mark an address with an attribute */ -attr_t GetAttr (unsigned Addr); -/* Return the attribute for the given address */ - attr_t GetStyleAttr (unsigned Addr); /* Return the style attribute for the given address */ @@ -114,5 +121,4 @@ attr_t GetLabelAttr (unsigned Addr); /* End of attrtab.h */ - #endif diff --git a/src/da65/data.c b/src/da65/data.c index f4c37818f..7355e60d1 100644 --- a/src/da65/data.c +++ b/src/da65/data.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2000-2007 Ullrich von Bassewitz */ -/* Roemerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 2000-2014, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -65,12 +65,12 @@ static unsigned GetSpan (attr_t Style) attr_t Attr; if (MustDefLabel(PC+Count)) { break; - } + } Attr = GetAttr (PC+Count); if ((Attr & atStyleMask) != Style) { break; } - if ((Attr & atSegmentChange)) { + if ((Attr & (atSegmentStart | atSegmentEnd))) { break; } ++Count; diff --git a/src/da65/infofile.c b/src/da65/infofile.c index 4ee1ffd79..7d8e69384 100644 --- a/src/da65/infofile.c +++ b/src/da65/infofile.c @@ -748,9 +748,6 @@ static void SegmentSection (void) if (Start < 0) { InfoError ("Start address is missing"); } - if (Start == End) { - InfoError ("Segment is empty"); - } if (Start > End) { InfoError ("Start address of segment is greater than end address"); } diff --git a/src/da65/main.c b/src/da65/main.c index a819f9771..05c4a7bfd 100644 --- a/src/da65/main.c +++ b/src/da65/main.c @@ -6,7 +6,7 @@ /* */ /* */ /* */ -/* (C) 1998-2011, Ullrich von Bassewitz */ +/* (C) 1998-2014, Ullrich von Bassewitz */ /* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ @@ -60,6 +60,7 @@ #include "opctable.h" #include "output.h" #include "scanner.h" +#include "segment.h" @@ -356,6 +357,14 @@ static void OneOpcode (unsigned RemainingBytes) /* Get the output style for the current PC */ attr_t Style = GetStyleAttr (PC); + /* If a segment begins here, then name that segment. + ** Note that the segment is named even if its code is being skipped, + ** because some of its later code might not be skipped. + */ + if (IsSegmentStart (PC)) { + StartSegment (GetSegmentStartName (PC), GetSegmentAddrSize (PC)); + } + /* If we have a label at this address, output the label and an attached ** comment, provided that we aren't in a skip area. */ @@ -371,7 +380,7 @@ static void OneOpcode (unsigned RemainingBytes) ** - ...if we have enough bytes remaining for the code at this address. ** - ...if the current instruction is valid for the given CPU. ** - ...if there is no label somewhere between the instruction bytes. - ** If any of these conditions is false, switch to data mode. + ** If any of those conditions is false, switch to data mode. */ if (Style == atDefault) { if (D->Size > RemainingBytes) { @@ -383,7 +392,14 @@ static void OneOpcode (unsigned RemainingBytes) } else { unsigned I; for (I = 1; I < D->Size; ++I) { - if (HaveLabel (PC+I) || HaveSegmentChange (PC+I)) { + if (HaveLabel (PC+I)) { + Style = atIllegal; + MarkAddr (PC, Style); + break; + } + } + for (I = 1; I < D->Size - 1u; ++I) { + if (HaveSegmentChange (PC+I)) { Style = atIllegal; MarkAddr (PC, Style); break; @@ -455,6 +471,10 @@ static void OneOpcode (unsigned RemainingBytes) break; } + + if (IsSegmentEnd (PC - 1)) { + EndSegment (); + } } diff --git a/src/da65/output.c b/src/da65/output.c index 9098d7d37..4daacb1ee 100644 --- a/src/da65/output.c +++ b/src/da65/output.c @@ -6,7 +6,7 @@ /* */ /* */ /* */ -/* (C) 2000-2009, Ullrich von Bassewitz */ +/* (C) 2000-2014, Ullrich von Bassewitz */ /* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ @@ -63,6 +63,8 @@ static unsigned Col = 1; /* Current column */ static unsigned Line = 0; /* Current line on page */ static unsigned Page = 1; /* Current output page */ +static const char* SegmentName = 0; /* Name of current segment */ + /*****************************************************************************/ @@ -223,23 +225,6 @@ void DefConst (const char* Name, const char* Comment, unsigned Addr) -void StartSegment (const char* Name, unsigned AddrSize) -/* Start a segment */ -{ - if (Pass == PassCount) { - Output (".segment"); - Indent (ACol); - if (AddrSize == ADDR_SIZE_DEFAULT) { - Output ("\"%s\"", Name); - } else { - Output ("\"%s\": %s", Name, AddrSizeToStr (AddrSize)); - } - LineFeed (); - } -} - - - void DataByteLine (unsigned ByteCount) /* Output a line with bytes */ { @@ -335,6 +320,39 @@ void SeparatorLine (void) +void StartSegment (const char* Name, unsigned AddrSize) +/* Start a segment */ +{ + if (Pass == PassCount) { + LineFeed (); + Output (".segment"); + Indent (ACol); + SegmentName = Name; + Output ("\"%s\"", Name); + if (AddrSize != ADDR_SIZE_DEFAULT) { + Output (": %s", AddrSizeToStr (AddrSize)); + } + LineFeed (); + LineFeed (); + } +} + + + +void EndSegment (void) +/* End a segment */ +{ + LineFeed (); + Output ("; End of \"%s\" segment", SegmentName); + LineFeed (); + SeparatorLine (); + Output (".code"); + LineFeed (); + LineFeed (); +} + + + void UserComment (const char* Comment) /* Output a comment line */ { diff --git a/src/da65/output.h b/src/da65/output.h index ad5f8d34e..13ea0cc85 100644 --- a/src/da65/output.h +++ b/src/da65/output.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2000-2007 Ullrich von Bassewitz */ -/* Roemerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 2000-2014, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -74,12 +74,6 @@ void DefForward (const char* Name, const char* Comment, unsigned Offs); void DefConst (const char* Name, const char* Comment, unsigned Addr); /* Define an address constant */ - -void StartSegment (const char* Name, unsigned AddrSize); -/* Start a segment */ - -void EndSegment (void); -/* End a segment */ void OneDataByte (void); /* Output a .byte line with the current code byte */ @@ -99,6 +93,12 @@ void DataDWordLine (unsigned ByteCount); void SeparatorLine (void); /* Print a separator line */ +void StartSegment (const char* Name, unsigned AddrSize); +/* Start a segment */ + +void EndSegment (void); +/* End a segment */ + void UserComment (const char* Comment); /* Output a comment line */ @@ -111,5 +111,4 @@ void OutputSettings (void); /* End of output.h */ - #endif diff --git a/src/da65/segment.c b/src/da65/segment.c index cad2096ff..12d4cf656 100644 --- a/src/da65/segment.c +++ b/src/da65/segment.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2007 Ullrich von Bassewitz */ -/* Roemerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 2007-2014, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -58,18 +58,15 @@ typedef struct Segment Segment; struct Segment { Segment* NextStart; /* Pointer to next segment */ - Segment* NextEnd; /* Pointer to next segment */ unsigned long Start; - unsigned long End; unsigned AddrSize; char Name[1]; /* Name, dynamically allocated */ }; -/* Tables containing the segments. A segment is inserted using it's hash -** value. Collision is done by single linked lists. +/* Table containing the segments. A segment is inserted using its hash +** value. Collisions are handled by single-linked lists. */ static Segment* StartTab[HASH_SIZE]; /* Table containing segment starts */ -static Segment* EndTab[HASH_SIZE]; /* Table containing segment ends */ @@ -90,20 +87,53 @@ void AddAbsSegment (unsigned Start, unsigned End, const char* Name) /* Fill in the data */ S->Start = Start; - S->End = End; S->AddrSize = ADDR_SIZE_ABS; memcpy (S->Name, Name, Len + 1); - /* Insert the segment into the hash tables */ + /* Insert the segment into the hash table */ S->NextStart = StartTab[Start % HASH_SIZE]; StartTab[Start % HASH_SIZE] = S; - S->NextEnd = EndTab[End % HASH_SIZE]; - EndTab[End % HASH_SIZE] = S; /* Mark start and end of the segment */ - MarkAddr (Start, atSegmentChange); - MarkAddr (End, atSegmentChange); + MarkAddr (Start, atSegmentStart); + MarkAddr (End, atSegmentEnd); /* Mark the addresses within the segment */ MarkRange (Start, End, atSegment); } + + + +char* GetSegmentStartName (unsigned Addr) +/* Return the name of the segment which starts at the given address */ +{ + Segment* S = StartTab[Addr % HASH_SIZE]; + + /* Search the collision list for the exact address */ + while (S != 0) { + if (S->Start == Addr) { + return S->Name; + } + S = S->NextStart; + } + + return 0; +} + + + +unsigned GetSegmentAddrSize (unsigned Addr) +/* Return the address size of the segment which starts at the given address */ +{ + Segment* S = StartTab[Addr % HASH_SIZE]; + + /* Search the collision list for the exact address */ + while (S != 0) { + if (S->Start == Addr) { + return S->AddrSize; + } + S = S->NextStart; + } + + return 0; +} diff --git a/src/da65/segment.h b/src/da65/segment.h index 14700ba99..b1423bb41 100644 --- a/src/da65/segment.h +++ b/src/da65/segment.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2007 Ullrich von Bassewitz */ -/* Roemerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 2007-2014, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -47,8 +47,13 @@ void AddAbsSegment (unsigned Start, unsigned End, const char* Name); /* Add an absolute segment to the segment table */ +char* GetSegmentStartName (unsigned Addr); +/* Return the name of the segment which starts at the given address */ + +unsigned GetSegmentAddrSize (unsigned Addr); +/* Return the address size of the segment which starts at the given address */ + /* End of segment.h */ - #endif From 155f00f25e7d484cf136dbbc397cf2ed3080b740 Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Sun, 30 Nov 2014 00:40:45 -0500 Subject: [PATCH 03/20] Fixed the detection of where to start and stop segments. --- src/da65/attrtab.c | 8 -------- src/da65/attrtab.h | 3 --- src/da65/main.c | 26 ++++++++++++++++---------- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/da65/attrtab.c b/src/da65/attrtab.c index d288d1298..a9143584a 100644 --- a/src/da65/attrtab.c +++ b/src/da65/attrtab.c @@ -107,14 +107,6 @@ int IsSegmentStart (unsigned Addr) -int HaveSegmentChange (unsigned Addr) -/* Return true if the segment change attributes are set for the given address */ -{ - return (GetAttr (Addr) & (atSegmentStart | atSegmentEnd)) != 0x0000; -} - - - unsigned GetGranularity (attr_t Style) /* Get the granularity for the given style */ { diff --git a/src/da65/attrtab.h b/src/da65/attrtab.h index b2dc6c455..18515ce49 100644 --- a/src/da65/attrtab.h +++ b/src/da65/attrtab.h @@ -100,9 +100,6 @@ int IsSegmentEnd (unsigned Addr); int IsSegmentStart (unsigned Addr); /* Return true if a segment starts at the given address */ -int HaveSegmentChange (unsigned Addr); -/* Return true if the segment change attributes are set for the given address */ - unsigned GetGranularity (attr_t Style); /* Get the granularity for the given style */ diff --git a/src/da65/main.c b/src/da65/main.c index 05c4a7bfd..8c37e1ae2 100644 --- a/src/da65/main.c +++ b/src/da65/main.c @@ -348,6 +348,8 @@ static void OptVersion (const char* Opt attribute ((unused)), static void OneOpcode (unsigned RemainingBytes) /* Disassemble one opcode */ { + unsigned I; + /* Get the opcode from the current address */ unsigned char OPC = GetCodeByte (PC); @@ -380,7 +382,8 @@ static void OneOpcode (unsigned RemainingBytes) ** - ...if we have enough bytes remaining for the code at this address. ** - ...if the current instruction is valid for the given CPU. ** - ...if there is no label somewhere between the instruction bytes. - ** If any of those conditions is false, switch to data mode. + ** - ...if there is no segment change between the instruction bytes. + ** If any one of those conditions is false, switch to data mode. */ if (Style == atDefault) { if (D->Size > RemainingBytes) { @@ -390,16 +393,15 @@ static void OneOpcode (unsigned RemainingBytes) Style = atIllegal; MarkAddr (PC, Style); } else { - unsigned I; - for (I = 1; I < D->Size; ++I) { - if (HaveLabel (PC+I)) { + for (I = PC + D->Size; --I > PC; ) { + if (HaveLabel (I) || IsSegmentStart (I)) { Style = atIllegal; MarkAddr (PC, Style); break; } } - for (I = 1; I < D->Size - 1u; ++I) { - if (HaveSegmentChange (PC+I)) { + for (I = 0; I < D->Size - 1u; ++I) { + if (IsSegmentEnd (PC + I)) { Style = atIllegal; MarkAddr (PC, Style); break; @@ -422,7 +424,6 @@ static void OneOpcode (unsigned RemainingBytes) */ if (D->Size <= RemainingBytes) { /* Output labels within the next insn */ - unsigned I; for (I = 1; I < D->Size; ++I) { ForwardLabel (I); } @@ -469,11 +470,16 @@ static void OneOpcode (unsigned RemainingBytes) DataByteLine (1); ++PC; break; - } - if (IsSegmentEnd (PC - 1)) { - EndSegment (); + /* Change back to the default CODE segment if + ** a named segment stops at the current address. + */ + for (I = D->Size; I >= 1; --I) { + if (IsSegmentEnd (PC - I)) { + EndSegment (); + break; + } } } From 1446d99b14a45a4b1f7899a81926f381a442f240 Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Sun, 30 Nov 2014 00:51:09 -0500 Subject: [PATCH 04/20] Clarified a segment error message. --- src/da65/infofile.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/da65/infofile.c b/src/da65/infofile.c index 7d8e69384..e8ce66cf7 100644 --- a/src/da65/infofile.c +++ b/src/da65/infofile.c @@ -6,7 +6,7 @@ /* */ /* */ /* */ -/* (C) 2000-2011, Ullrich von Bassewitz */ +/* (C) 2000-2014, Ullrich von Bassewitz */ /* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ @@ -754,7 +754,7 @@ static void SegmentSection (void) /* Check that segments do not overlap */ if (SegmentDefined ((unsigned) Start, (unsigned) End)) { - InfoError ("Segments cannot overlap"); + InfoError ("Segments must not overlap"); } /* Remember the segment data */ From 8d5bb552818ec7b52426be223e1c1ab837021147 Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Wed, 3 Dec 2014 12:02:48 -0500 Subject: [PATCH 05/20] Made some descriptions less ambiguous. --- doc/atmos.sgml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/atmos.sgml b/doc/atmos.sgml index ab63c667b..a9d59a407 100644 --- a/doc/atmos.sgml +++ b/doc/atmos.sgml @@ -7,7 +7,7 @@ <url url="mailto:uz@cc65.org" name="Ullrich von Bassewitz">,<newline> <url url="mailto:polluks@sdf.lonestar.org" name="Stefan A. Haubenthal">,<newline> <url url="mailto:greg.king5@verizon.net" name="Greg King"> -<date>2014-09-23 +<date>2014-12-03 <abstract> An overview over the Atmos runtime system as it is implemented for the cc65 C @@ -219,8 +219,9 @@ They are defined to be FUNCT + a number key. <sect1>Capitals Lock<p> -The "CAPS Lock" mode is turned off while the program is running. The previous -mode (usually turned on) is restored when the program stops. +The keyboard's "CAPS Lock" mode is turned off while the program is running. +The previous mode (usually, CAPS Lock turned on [because Oric BASIC keywords +must be UPPER-case]) is restored when the program stops. <sect1>Passing arguments to the program<p> @@ -234,7 +235,7 @@ supported directly by BASIC, the following syntax was chosen: <enum> <item>You must turn <tt/CAPS/ lock off (tap CTRL-T) when you want to type - lower-case arguments. + lower-case arguments (but, <tt/RUN/ and <tt/REM/ must be UPPER-case). <item>Arguments are separated by spaces. <item>Arguments may be quoted. <item>Leading and trailing spaces around an argument are ignored. Spaces within From d9df576fa6e894a2d6321084dd5423549b5176ba Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Sat, 13 Dec 2014 09:52:39 -0500 Subject: [PATCH 06/20] Used an easier-to-remember way of creating a program that uses graphics RAM for other purposes. --- cfg/atmos.cfg | 6 +++--- doc/atmos.sgml | 21 +++++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/cfg/atmos.cfg b/cfg/atmos.cfg index 062711b96..691bd467d 100644 --- a/cfg/atmos.cfg +++ b/cfg/atmos.cfg @@ -2,10 +2,10 @@ SYMBOLS { __TAPEHDR__: type = import; __BASHDR__: type = import; __PROGFLAG__: type = weak, value = $00; # $00=BASIC, $80=machine code - __AUTORUN__: type = weak, value = $00; # $C7=run, $00=only load + __AUTORUN__: type = weak, value = $00; # $00=only load, $C7=run __STACKSIZE__: type = weak, value = $0800; # 2K stack - __RAMEND__: type = weak, value = $9800; # graphics RAM not grabbed -# __RAMEND__: type = weak, value = $B400; # graphics RAM grabbed + __GRAB__: type = weak, value = 0; # 0=don't grab graphics RAM, 1=grab graphics RAM + __RAMEND__: type = weak, value = $9800 + $1C00 * __GRAB__; } MEMORY { ZP: file = "", define = yes, start = $00E2, size = $001A; diff --git a/doc/atmos.sgml b/doc/atmos.sgml index a9d59a407..913e50ed7 100644 --- a/doc/atmos.sgml +++ b/doc/atmos.sgml @@ -7,7 +7,7 @@ <url url="mailto:uz@cc65.org" name="Ullrich von Bassewitz">,<newline> <url url="mailto:polluks@sdf.lonestar.org" name="Stefan A. Haubenthal">,<newline> <url url="mailto:greg.king5@verizon.net" name="Greg King"> -<date>2014-12-03 +<date>2014-12-05 <abstract> An overview over the Atmos runtime system as it is implemented for the cc65 C @@ -50,9 +50,9 @@ In the standard setup, cc65-generated programs use the memory from available. ROM calls are possible without further precautions. If your program needs more memory, and it won't use TGI graphics, then you can -use the ld65 command-line option, <tt/-D __RAMEND__=$B400/, when building the -program, to "grab" the graphics screen RAM. Then, nearly 44K of memory is -available. +use the ld65 command-line option, <tt/-D __GRAB__=1/, when building the +program, to include the graphics screen RAM. Then, nearly 44K of memory +($0501 to $B400) is available. Special locations: @@ -100,7 +100,7 @@ structures; accessing the struct fields will access the chip registers. <descrip> <tag><tt/VIA/</tag> - Access to the VIA (versatile interface adapter) chip is available via the + Access to the VIA (Versatile Interface Adapter) chip is available via the <tt/VIA/ variable. The structure behind this variable is explained in <tt/_6522.h/. </descrip><p> @@ -217,7 +217,7 @@ following functions (and a few others): They are defined to be FUNCT + a number key. -<sect1>Capitals Lock<p> +<sect1>Capitals lock<p> The keyboard's "CAPS Lock" mode is turned off while the program is running. The previous mode (usually, CAPS Lock turned on [because Oric BASIC keywords @@ -246,6 +246,15 @@ supported directly by BASIC, the following syntax was chosen: </enum> +<sect1>Automatic starting<p> + +Usually, a cc65-built program just will sit quietly in memory, after it is +CLOADed. It waits for you to start it (by typing BASIC's <tt/RUN/ command). +But, if you want to create a program that will start running immediately after +it is loaded, then you can use the linker command-line option +<tt/-D __AUTORUN__=$C7/. + + <sect1>Interrupts<p> The runtime for the Atmos uses routines marked as <tt/.INTERRUPTOR/ for From b9c1087cc2febf5789f7bc59dc9ff52f50ce3b3b Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Wed, 17 Dec 2014 11:57:45 -0500 Subject: [PATCH 07/20] Added make code to build the optimized versions. --- test/misc/Makefile | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/test/misc/Makefile b/test/misc/Makefile index b18d9165e..bb9fa404b 100644 --- a/test/misc/Makefile +++ b/test/misc/Makefile @@ -33,30 +33,28 @@ TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oi.prg) TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oir.prg) TESTS += $(SOURCES:%.c=$(WORKDIR)/%.or.prg) -# FIXME: actually use/build differently optimized programs here - all: $(TESTS) # should compile, but then hangs in an endless loop $(WORKDIR)/endless%prg: endless.c - $(CL65) $(CC65FLAGS) $< -o $@ + $(CL65) $(subst .,,($*:.o%=-O%)) $(CC65FLAGS) $< -o $@ ! $(SIM65) $(SIM65FLAGS) $@ # these need reference data that cant be generated by a host compiled program # in a useful way $(WORKDIR)/limits%prg: limits.c - $(CL65) $(CC65FLAGS) $< -o $@ + $(CL65) $(subst .,,($*:.o%=-O%)) $(CC65FLAGS) $< -o $@ $(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/limits.out $(DIFF) $(WORKDIR)/limits.out limits.ref # the rest are tests that fail currently for one reason or another $(WORKDIR)/fields%prg: fields.c @echo "FIXME: " $@ "will currently fail" - $(CL65) $(CC65FLAGS) $< -o $@ + $(CL65) $(subst .,,($*:.o%=-O%)) $(CC65FLAGS) $< -o $@ -$(SIM65) $(SIM65FLAGS) $@ $(WORKDIR)/sitest%prg: sitest.c @echo "FIXME: " $@ "will currently fail" - -$(CL65) $(CC65FLAGS) $< -o $@ + -$(CL65) $(subst .,,($*:.o%=-O%)) $(CC65FLAGS) $< -o $@ -$(SIM65) $(SIM65FLAGS) $@ clean: From ad56b6abe94129d014f62eab5a51d6e3e61bb5d5 Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Wed, 17 Dec 2014 15:59:29 -0500 Subject: [PATCH 08/20] Made the makefiles' clean target remove the object files from the source directory. --- test/err/Makefile | 2 +- test/misc/Makefile | 2 +- test/ref/Makefile | 2 +- test/val/Makefile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/err/Makefile b/test/err/Makefile index 40ccfcb59..a6d590515 100644 --- a/test/err/Makefile +++ b/test/err/Makefile @@ -49,4 +49,4 @@ $(WORKDIR)/%.or.prg: %.c ! $(CL65) -Or $(CC65FLAGS) $< -o $@ clean: @$(RM) $(TESTS) - @$(RM) $(SOURCES:%.c=$(WORKDIR)/%.o) + @$(RM) $(SOURCES:.c=.o) diff --git a/test/misc/Makefile b/test/misc/Makefile index bb9fa404b..7af8c0cb1 100644 --- a/test/misc/Makefile +++ b/test/misc/Makefile @@ -59,7 +59,7 @@ $(WORKDIR)/sitest%prg: sitest.c clean: @$(RM) $(TESTS) - @$(RM) $(SOURCES:%.c=$(WORKDIR)/%.o) + @$(RM) $(SOURCES:.c=.o) @$(RM) $(SOURCES:%.c=$(WORKDIR)/%.out) diff --git a/test/ref/Makefile b/test/ref/Makefile index b752adc1d..39336aa52 100644 --- a/test/ref/Makefile +++ b/test/ref/Makefile @@ -86,7 +86,7 @@ $(WORKDIR)/%.or.prg: %.c $(WORKDIR)/%.ref clean: @$(RM) $(TESTS) - @$(RM) $(SOURCES:%.c=$(WORKDIR)/%.o) + @$(RM) $(SOURCES:.c=.o) @$(RM) $(SOURCES:%.c=$(WORKDIR)/%.out) @$(RM) $(SOURCES:%.c=$(WORKDIR)/%.ref) @$(RM) $(SOURCES:%.c=$(WORKDIR)/%.host) diff --git a/test/val/Makefile b/test/val/Makefile index 2e0aca278..c9afbbd86 100644 --- a/test/val/Makefile +++ b/test/val/Makefile @@ -67,4 +67,4 @@ $(WORKDIR)/%.or.prg: %.c clean: @$(RM) $(TESTS) - @$(RM) $(SOURCES:%.c=$(WORKDIR)/%.o) + @$(RM) $(SOURCES:.c=.o) From d9c8c1de457e2b8964c2828fbf2fdd0988e17de2 Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Wed, 17 Dec 2014 16:30:09 -0500 Subject: [PATCH 09/20] Create the makefile variable REFS in the same way that TESTS is made. --- test/err/Makefile | 1 + test/misc/Makefile | 3 +-- test/ref/Makefile | 5 +++-- test/val/Makefile | 1 + 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/test/err/Makefile b/test/err/Makefile index a6d590515..46ce4c9cc 100644 --- a/test/err/Makefile +++ b/test/err/Makefile @@ -20,6 +20,7 @@ WORKDIR := ./../../testwrk .PHONY: all clean SOURCES := $(wildcard *.c) + TESTS := $(SOURCES:%.c=$(WORKDIR)/%.prg) TESTS += $(SOURCES:%.c=$(WORKDIR)/%.o.prg) TESTS += $(SOURCES:%.c=$(WORKDIR)/%.os.prg) diff --git a/test/misc/Makefile b/test/misc/Makefile index 7af8c0cb1..64fcc8759 100644 --- a/test/misc/Makefile +++ b/test/misc/Makefile @@ -24,6 +24,7 @@ DIFF := $(WORKDIR)/bdiff .PHONY: all clean SOURCES := $(wildcard *.c) + TESTS := $(SOURCES:%.c=$(WORKDIR)/%.prg) TESTS += $(SOURCES:%.c=$(WORKDIR)/%.o.prg) TESTS += $(SOURCES:%.c=$(WORKDIR)/%.os.prg) @@ -61,5 +62,3 @@ clean: @$(RM) $(TESTS) @$(RM) $(SOURCES:.c=.o) @$(RM) $(SOURCES:%.c=$(WORKDIR)/%.out) - - diff --git a/test/ref/Makefile b/test/ref/Makefile index 39336aa52..df13a28cc 100644 --- a/test/ref/Makefile +++ b/test/ref/Makefile @@ -26,9 +26,10 @@ CFLAGS := -O2 -Wall -W -Wextra -fwrapv -fno-strict-overflow .PHONY: all clean -REFS := $(patsubst %.c,$(WORKDIR)/%.ref,$(wildcard *.c)) - SOURCES := $(wildcard *.c) + +REFS := $(SOURCES:%.c=$(WORKDIR)/%.ref) + TESTS := $(SOURCES:%.c=$(WORKDIR)/%.prg) TESTS += $(SOURCES:%.c=$(WORKDIR)/%.o.prg) TESTS += $(SOURCES:%.c=$(WORKDIR)/%.os.prg) diff --git a/test/val/Makefile b/test/val/Makefile index c9afbbd86..f4e0d28b2 100644 --- a/test/val/Makefile +++ b/test/val/Makefile @@ -22,6 +22,7 @@ WORKDIR := ./../../testwrk .PHONY: all clean SOURCES := $(wildcard *.c) + TESTS := $(SOURCES:%.c=$(WORKDIR)/%.prg) TESTS += $(SOURCES:%.c=$(WORKDIR)/%.o.prg) TESTS += $(SOURCES:%.c=$(WORKDIR)/%.os.prg) From 15a22bd1c819f6f82dca15bee379741561ba6389 Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Wed, 17 Dec 2014 17:35:18 -0500 Subject: [PATCH 10/20] All regression-tests subdirectories are cleaned before the first test starts, so that 'make continue' won't see debris when it moves to the next directory. --- test/Makefile | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/test/Makefile b/test/Makefile index b942cbcdf..579fc8b92 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,7 +1,9 @@ # toplevel makefile for the regression tests -MAKE := make --no-print-dir +# You can comment this special target when you debug the regression tests. +# Then, make will give you more progress reports. +.SILENT: ifneq ($(shell echo),) CMD_EXE = 1 @@ -21,21 +23,17 @@ endif WORKDIR := ../testwrk -.PHONY: dotests clean +.PHONY: all dotests continue mostly-clean clean all: dotests $(WORKDIR): - @$(MKDIR) $(WORKDIR) + $(MKDIR) $(WORKDIR) -$(WORKDIR)/bdiff$(EXE): $(WORKDIR) - @$(CC) -o $(WORKDIR)/bdiff$(EXE) bdiff.c +$(WORKDIR)/bdiff$(EXE): bdiff.c | $(WORKDIR) + $(CC) -O2 -o $@ $< -dotests: $(WORKDIR)/bdiff$(EXE) - @$(MAKE) -C val clean all - @$(MAKE) -C ref clean all - @$(MAKE) -C err clean all - @$(MAKE) -C misc clean all +dotests: mostly-clean continue continue: $(WORKDIR)/bdiff$(EXE) @$(MAKE) -C val all @@ -43,10 +41,12 @@ continue: $(WORKDIR)/bdiff$(EXE) @$(MAKE) -C err all @$(MAKE) -C misc all -clean: +mostly-clean: @$(MAKE) -C val clean @$(MAKE) -C ref clean @$(MAKE) -C err clean @$(MAKE) -C misc clean - @$(RM) $(WORKDIR)/bdiff$(EXE) - @$(RMDIR) $(WORKDIR) + +clean: mostly-clean + $(RM) $(WORKDIR)/bdiff$(EXE) + $(RMDIR) $(WORKDIR) From e414e89b64e4e9318d6b4588bdeeaa8d8c722d22 Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Wed, 17 Dec 2014 17:44:39 -0500 Subject: [PATCH 11/20] Use simply-defined make variables. --- test/Makefile | 12 ++++++------ test/err/Makefile | 7 ++++--- test/misc/Makefile | 16 ++++++++-------- test/ref/Makefile | 8 ++++---- test/val/Makefile | 8 ++++---- 5 files changed, 26 insertions(+), 25 deletions(-) diff --git a/test/Makefile b/test/Makefile index 579fc8b92..0f96a38f8 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,24 +1,24 @@ -# toplevel makefile for the regression tests +# top-level makefile for the regression tests # You can comment this special target when you debug the regression tests. # Then, make will give you more progress reports. .SILENT: ifneq ($(shell echo),) - CMD_EXE = 1 + CMD_EXE := 1 endif ifdef CMD_EXE RM := del /f EXE := .exe - MKDIR = mkdir - RMDIR = rmdir + MKDIR := mkdir + RMDIR := rmdir else RM := rm -f EXE := - MKDIR = mkdir -p - RMDIR = rmdir + MKDIR := mkdir -p + RMDIR := rmdir endif WORKDIR := ../testwrk diff --git a/test/err/Makefile b/test/err/Makefile index 46ce4c9cc..29c47ef3e 100644 --- a/test/err/Makefile +++ b/test/err/Makefile @@ -2,10 +2,10 @@ # makefile for the tests that MUST NOT compile ifneq ($(shell echo),) - CMD_EXE = 1 + CMD_EXE := 1 endif -CC65FLAGS = -t sim6502 +CC65FLAGS := -t sim6502 CL65 := $(if $(wildcard ../../bin/cl65*),../../bin/cl65,cl65) @@ -15,7 +15,7 @@ else RM := rm -f endif -WORKDIR := ./../../testwrk +WORKDIR := ../../testwrk .PHONY: all clean @@ -48,6 +48,7 @@ $(WORKDIR)/%.oir.prg: %.c ! $(CL65) -Oir $(CC65FLAGS) $< -o $@ $(WORKDIR)/%.or.prg: %.c ! $(CL65) -Or $(CC65FLAGS) $< -o $@ + clean: @$(RM) $(TESTS) @$(RM) $(SOURCES:.c=.o) diff --git a/test/misc/Makefile b/test/misc/Makefile index 64fcc8759..c473f5f85 100644 --- a/test/misc/Makefile +++ b/test/misc/Makefile @@ -2,11 +2,11 @@ # makefile for the remaining tests that need special care in one way or another ifneq ($(shell echo),) - CMD_EXE = 1 + CMD_EXE := 1 endif -CC65FLAGS = -t sim6502 -SIM65FLAGS = -x 200000000 +CC65FLAGS := -t sim6502 +SIM65FLAGS := -x 200000000 CL65 := $(if $(wildcard ../../bin/cl65*),../../bin/cl65,cl65) SIM65 := $(if $(wildcard ../../bin/sim65*),../../bin/sim65,sim65) @@ -17,7 +17,7 @@ else RM := rm -f endif -WORKDIR := ./../../testwrk +WORKDIR := ../../testwrk DIFF := $(WORKDIR)/bdiff @@ -41,7 +41,7 @@ $(WORKDIR)/endless%prg: endless.c $(CL65) $(subst .,,($*:.o%=-O%)) $(CC65FLAGS) $< -o $@ ! $(SIM65) $(SIM65FLAGS) $@ -# these need reference data that cant be generated by a host compiled program +# these need reference data that can't be generated by a host-compiled program, # in a useful way $(WORKDIR)/limits%prg: limits.c $(CL65) $(subst .,,($*:.o%=-O%)) $(CC65FLAGS) $< -o $@ @@ -50,13 +50,13 @@ $(WORKDIR)/limits%prg: limits.c # the rest are tests that fail currently for one reason or another $(WORKDIR)/fields%prg: fields.c - @echo "FIXME: " $@ "will currently fail" + @echo "FIXME: " $@ "currently will fail." $(CL65) $(subst .,,($*:.o%=-O%)) $(CC65FLAGS) $< -o $@ -$(SIM65) $(SIM65FLAGS) $@ $(WORKDIR)/sitest%prg: sitest.c - @echo "FIXME: " $@ "will currently fail" + @echo "FIXME: " $@ "currently will fail." -$(CL65) $(subst .,,($*:.o%=-O%)) $(CC65FLAGS) $< -o $@ - -$(SIM65) $(SIM65FLAGS) $@ +# -$(SIM65) $(SIM65FLAGS) $@ clean: @$(RM) $(TESTS) diff --git a/test/ref/Makefile b/test/ref/Makefile index df13a28cc..66ff94e28 100644 --- a/test/ref/Makefile +++ b/test/ref/Makefile @@ -3,11 +3,11 @@ # compared with reference output ifneq ($(shell echo),) - CMD_EXE = 1 + CMD_EXE := 1 endif -CC65FLAGS = -t sim6502 -SIM65FLAGS = -x 200000000 +CC65FLAGS := -t sim6502 +SIM65FLAGS := -x 200000000 CL65 := $(if $(wildcard ../../bin/cl65*),../../bin/cl65,cl65) SIM65 := $(if $(wildcard ../../bin/sim65*),../../bin/sim65,sim65) @@ -18,7 +18,7 @@ else RM := rm -f endif -WORKDIR := ./../../testwrk +WORKDIR := ../../testwrk DIFF := $(WORKDIR)/bdiff diff --git a/test/val/Makefile b/test/val/Makefile index f4e0d28b2..bd88797e5 100644 --- a/test/val/Makefile +++ b/test/val/Makefile @@ -2,11 +2,11 @@ # makefile for the regression tests that return an error code on failure ifneq ($(shell echo),) - CMD_EXE = 1 + CMD_EXE := 1 endif -CC65FLAGS = -t sim6502 -SIM65FLAGS = -x 200000000 +CC65FLAGS := -t sim6502 +SIM65FLAGS := -x 200000000 CL65 := $(if $(wildcard ../../bin/cl65*),../../bin/cl65,cl65) SIM65 := $(if $(wildcard ../../bin/sim65*),../../bin/sim65,sim65) @@ -17,7 +17,7 @@ else RM := rm -f endif -WORKDIR := ./../../testwrk +WORKDIR := ../../testwrk .PHONY: all clean From 244eeedcfc82c2582e057a46c61d58a5e9b6e631 Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Thu, 18 Dec 2014 14:15:24 -0500 Subject: [PATCH 12/20] Shortenned the code that creates the TESTS make variable. And, fixed the variable-substitution that creates the CC65 optimization option. --- test/err/Makefile | 10 +--------- test/misc/Makefile | 18 +++++------------- test/ref/Makefile | 11 +---------- test/val/Makefile | 10 +--------- 4 files changed, 8 insertions(+), 41 deletions(-) diff --git a/test/err/Makefile b/test/err/Makefile index 29c47ef3e..4e12323fd 100644 --- a/test/err/Makefile +++ b/test/err/Makefile @@ -20,15 +20,7 @@ WORKDIR := ../../testwrk .PHONY: all clean SOURCES := $(wildcard *.c) - -TESTS := $(SOURCES:%.c=$(WORKDIR)/%.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.o.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.os.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osi.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osir.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oi.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oir.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.or.prg) +TESTS := $(foreach option,. .o. .os. .osi. .osir. .oi. .oir. .or.,$(SOURCES:%.c=$(WORKDIR)/%$(option)prg)) all: $(TESTS) diff --git a/test/misc/Makefile b/test/misc/Makefile index c473f5f85..b04321c33 100644 --- a/test/misc/Makefile +++ b/test/misc/Makefile @@ -24,38 +24,30 @@ DIFF := $(WORKDIR)/bdiff .PHONY: all clean SOURCES := $(wildcard *.c) - -TESTS := $(SOURCES:%.c=$(WORKDIR)/%.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.o.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.os.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osi.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osir.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oi.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oir.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.or.prg) +TESTS := $(foreach option,. .o. .os. .osi. .osir. .oi. .oir. .or.,$(SOURCES:%.c=$(WORKDIR)/%$(option)prg)) all: $(TESTS) # should compile, but then hangs in an endless loop $(WORKDIR)/endless%prg: endless.c - $(CL65) $(subst .,,($*:.o%=-O%)) $(CC65FLAGS) $< -o $@ + $(CL65) $(subst .,,$(*:.o%=-O%)) $(CC65FLAGS) $< -o $@ ! $(SIM65) $(SIM65FLAGS) $@ # these need reference data that can't be generated by a host-compiled program, # in a useful way $(WORKDIR)/limits%prg: limits.c - $(CL65) $(subst .,,($*:.o%=-O%)) $(CC65FLAGS) $< -o $@ + $(CL65) $(subst .,,$(*:.o%=-O%)) $(CC65FLAGS) $< -o $@ $(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/limits.out $(DIFF) $(WORKDIR)/limits.out limits.ref # the rest are tests that fail currently for one reason or another $(WORKDIR)/fields%prg: fields.c @echo "FIXME: " $@ "currently will fail." - $(CL65) $(subst .,,($*:.o%=-O%)) $(CC65FLAGS) $< -o $@ + $(CL65) $(subst .,,$(*:.o%=-O%)) $(CC65FLAGS) $< -o $@ -$(SIM65) $(SIM65FLAGS) $@ $(WORKDIR)/sitest%prg: sitest.c @echo "FIXME: " $@ "currently will fail." - -$(CL65) $(subst .,,($*:.o%=-O%)) $(CC65FLAGS) $< -o $@ + -$(CL65) $(subst .,,$(*:.o%=-O%)) $(CC65FLAGS) $< -o $@ # -$(SIM65) $(SIM65FLAGS) $@ clean: diff --git a/test/ref/Makefile b/test/ref/Makefile index 66ff94e28..3e7a5ad6c 100644 --- a/test/ref/Makefile +++ b/test/ref/Makefile @@ -27,17 +27,8 @@ CFLAGS := -O2 -Wall -W -Wextra -fwrapv -fno-strict-overflow .PHONY: all clean SOURCES := $(wildcard *.c) - REFS := $(SOURCES:%.c=$(WORKDIR)/%.ref) - -TESTS := $(SOURCES:%.c=$(WORKDIR)/%.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.o.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.os.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osi.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osir.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oi.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oir.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.or.prg) +TESTS := $(foreach option,. .o. .os. .osi. .osir. .oi. .oir. .or.,$(SOURCES:%.c=$(WORKDIR)/%$(option)prg)) all: $(REFS) $(TESTS) diff --git a/test/val/Makefile b/test/val/Makefile index bd88797e5..2efcbd0de 100644 --- a/test/val/Makefile +++ b/test/val/Makefile @@ -22,15 +22,7 @@ WORKDIR := ../../testwrk .PHONY: all clean SOURCES := $(wildcard *.c) - -TESTS := $(SOURCES:%.c=$(WORKDIR)/%.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.o.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.os.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osi.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.osir.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oi.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.oir.prg) -TESTS += $(SOURCES:%.c=$(WORKDIR)/%.or.prg) +TESTS := $(foreach option,. .o. .os. .osi. .osir. .oi. .oir. .or.,$(SOURCES:%.c=$(WORKDIR)/%$(option)prg)) all: $(TESTS) From 1a0a872bd6a6ac19b5e14231696bf6a8f14944cf Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Thu, 18 Dec 2014 14:30:35 -0500 Subject: [PATCH 13/20] Made sure that parallel-building the regression-tests doesn't start a test before all of the directories are clean. --- test/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/Makefile b/test/Makefile index 0f96a38f8..27f7ff456 100644 --- a/test/Makefile +++ b/test/Makefile @@ -33,6 +33,8 @@ $(WORKDIR): $(WORKDIR)/bdiff$(EXE): bdiff.c | $(WORKDIR) $(CC) -O2 -o $@ $< +.NOTPARALLEL: + dotests: mostly-clean continue continue: $(WORKDIR)/bdiff$(EXE) From d61feae7f8e61d02297c1b48ea93bf68bfdb31ef Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Wed, 7 Jan 2015 10:51:48 -0500 Subject: [PATCH 14/20] Added a comment. --- libsrc/atmos/tapehdr.s | 1 + 1 file changed, 1 insertion(+) diff --git a/libsrc/atmos/tapehdr.s b/libsrc/atmos/tapehdr.s index b8562eb02..b67f69d81 100644 --- a/libsrc/atmos/tapehdr.s +++ b/libsrc/atmos/tapehdr.s @@ -7,6 +7,7 @@ ; to force this module to be included into the output file. .export __TAPEHDR__:abs = 1 + ; These symbols, also, come from the configuration file. .import __BASHDR_LOAD__, __ZPSAVE_LOAD__, __AUTORUN__, __PROGFLAG__ From 22e06c41d1608ee1b4f79353b7f2b21b831de29c Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Thu, 8 Jan 2015 03:51:20 -0500 Subject: [PATCH 15/20] Fixed a bug that had padded Atmos binaries with 25 bytes too many. --- cfg/atmos.cfg | 3 ++- libsrc/atmos/crt0.s | 9 ++++++--- libsrc/atmos/tapehdr.s | 6 +++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/cfg/atmos.cfg b/cfg/atmos.cfg index 691bd467d..5bb61bb26 100644 --- a/cfg/atmos.cfg +++ b/cfg/atmos.cfg @@ -23,7 +23,8 @@ SEGMENTS { RODATA: load = RAM, type = ro; INIT: load = RAM, type = ro, define = yes, optional = yes; DATA: load = RAM, type = rw; - ZPSAVE: load = RAM, type = rw, define = yes; + ZPSAVE1: load = RAM, type = rw, define = yes; + ZPSAVE2: load = RAM, type = bss; BSS: load = RAM, type = bss, define = yes; } FEATURES { diff --git a/libsrc/atmos/crt0.s b/libsrc/atmos/crt0.s index 63961bfe8..ecbc00391 100644 --- a/libsrc/atmos/crt0.s +++ b/libsrc/atmos/crt0.s @@ -2,7 +2,7 @@ ; Startup code for cc65 (Oric version) ; ; By Debrune Jérôme <jede@oric.org> and Ullrich von Bassewitz <uz@cc65.org> -; 2014-11-09, Greg King +; 2015-01-08, Greg King ; .export _exit @@ -31,7 +31,8 @@ L1: lda sp,x jsr zerobss -; Unprotect screen columns 0 and 1. +; Currently, color isn't supported on the text screen. +; Unprotect screen columns 0 and 1 (where each line's color codes would sit). lda STATUS sta stsave @@ -81,7 +82,7 @@ L2: lda zpsave,x ; ------------------------------------------------------------------------ -.segment "ZPSAVE" +.segment "ZPSAVE1" zpsave: @@ -91,6 +92,8 @@ zpsave: .byte 0 +.segment "ZPSAVE2" + .res zpspace - 1 ; ------------------------------------------------------------------------ diff --git a/libsrc/atmos/tapehdr.s b/libsrc/atmos/tapehdr.s index b67f69d81..d90c908eb 100644 --- a/libsrc/atmos/tapehdr.s +++ b/libsrc/atmos/tapehdr.s @@ -1,6 +1,6 @@ ; ; Based on code by Debrune Jérôme <jede@oric.org> -; 2013-08-15, Greg King +; 2015-01-08, Greg King ; ; The following symbol is used by the linker config. file @@ -8,7 +8,7 @@ .export __TAPEHDR__:abs = 1 ; These symbols, also, come from the configuration file. - .import __BASHDR_LOAD__, __ZPSAVE_LOAD__, __AUTORUN__, __PROGFLAG__ + .import __BASHDR_LOAD__, __ZPSAVE1_LOAD__, __AUTORUN__, __PROGFLAG__ ; ------------------------------------------------------------------------ @@ -23,7 +23,7 @@ .byte $00 ; $2AF .byte <__PROGFLAG__ ; $2AE Language flag ($00=BASIC, $80=machine code) .byte <__AUTORUN__ ; $2AD Auto-run flag ($C7=run, $00=only load) - .dbyt __ZPSAVE_LOAD__ ; $2AB Address of end of file + .dbyt __ZPSAVE1_LOAD__ ;$2AB Address of end of file .dbyt __BASHDR_LOAD__ ; $2A9 Address of start of file .byte $00 ; $2A8 From 43342366ed1bc365f9dd6918bd160b8e60dcd073 Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Thu, 8 Jan 2015 17:07:28 -0500 Subject: [PATCH 16/20] Added comments that say why the ZPSAVE1 and ZPSAVE2 segments must be together. --- cfg/atmos.cfg | 4 ++-- libsrc/atmos/crt0.s | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cfg/atmos.cfg b/cfg/atmos.cfg index 5bb61bb26..a1f935efa 100644 --- a/cfg/atmos.cfg +++ b/cfg/atmos.cfg @@ -23,8 +23,8 @@ SEGMENTS { RODATA: load = RAM, type = ro; INIT: load = RAM, type = ro, define = yes, optional = yes; DATA: load = RAM, type = rw; - ZPSAVE1: load = RAM, type = rw, define = yes; - ZPSAVE2: load = RAM, type = bss; + ZPSAVE1: load = RAM, type = rw, define = yes; # ZPSAVE1, ZPSAVE2 must be together + ZPSAVE2: load = RAM, type = bss; # see "libsrc/atmos/crt0.s" BSS: load = RAM, type = bss, define = yes; } FEATURES { diff --git a/libsrc/atmos/crt0.s b/libsrc/atmos/crt0.s index ecbc00391..61f40cc9a 100644 --- a/libsrc/atmos/crt0.s +++ b/libsrc/atmos/crt0.s @@ -92,6 +92,9 @@ zpsave: .byte 0 +; The segments "ZPSAVE1" and "ZPSAVE2" always must be together. +; They create a single object (the zpsave buffer). + .segment "ZPSAVE2" .res zpspace - 1 From 2ef83bd66ceb7947a79c08e1cee213de03ec96cb Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Fri, 9 Jan 2015 13:55:16 -0500 Subject: [PATCH 17/20] Mentioned, in the Atmos document, the extra byte at the end of program binaries. --- doc/atmos.sgml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/atmos.sgml b/doc/atmos.sgml index 913e50ed7..68f7f9d65 100644 --- a/doc/atmos.sgml +++ b/doc/atmos.sgml @@ -7,7 +7,7 @@ <url url="mailto:uz@cc65.org" name="Ullrich von Bassewitz">,<newline> <url url="mailto:polluks@sdf.lonestar.org" name="Stefan A. Haubenthal">,<newline> <url url="mailto:greg.king5@verizon.net" name="Greg King"> -<date>2014-12-05 +<date>2015-01-09 <abstract> An overview over the Atmos runtime system as it is implemented for the cc65 C @@ -37,9 +37,11 @@ information. The standard binary output format generated by the linker for the Atmos target is a machine language program with a one-line BASIC stub that jumps to the -machine-language part through <tt/CALL/. It has a 24-byte tape header. -It means that a file can be loaded as a BASIC program, and started with RUN. -The standard load address is $501. +machine-language part through <tt/CALL/. It has one sacrificial byte attached +to the end (a bug in the Oric ROM means that BASIC can put a variable on top +of the last byte that was loaded). It has a 24-byte tape header. A file can +be CLOADed as a BASIC program, and started by typing <tt/RUN/. The standard +load address is $501. From fccd2bf66a834bd8682720705a4b56bdfe9df001 Mon Sep 17 00:00:00 2001 From: Greg King <gregdk@users.sf.net> Date: Fri, 9 Jan 2015 22:19:35 -0500 Subject: [PATCH 18/20] Added more info to a comment. --- libsrc/atmos/crt0.s | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libsrc/atmos/crt0.s b/libsrc/atmos/crt0.s index 61f40cc9a..e789b28c2 100644 --- a/libsrc/atmos/crt0.s +++ b/libsrc/atmos/crt0.s @@ -2,7 +2,7 @@ ; Startup code for cc65 (Oric version) ; ; By Debrune Jérôme <jede@oric.org> and Ullrich von Bassewitz <uz@cc65.org> -; 2015-01-08, Greg King +; 2015-01-09, Greg King ; .export _exit @@ -89,6 +89,7 @@ zpsave: ; This padding is needed by a bug in the ROM. ; (The CLOAD command starts BASIC's variables table on top of the last byte ; that was loaded [instead of at the next address].) +; This is overlaid on a buffer, so that it doesn't use extra space in RAM. .byte 0 From d3b2b3df6b9fc37d62d8138b5b9a5af251030227 Mon Sep 17 00:00:00 2001 From: Wayne LaBelle <wylab@wylab.com> Date: Sun, 11 Jan 2015 16:10:34 -0500 Subject: [PATCH 19/20] Move SBC to correct location in 6280 instruction table --- src/ca65/instr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ca65/instr.c b/src/ca65/instr.c index 6acf8c94f..500db1985 100644 --- a/src/ca65/instr.c +++ b/src/ca65/instr.c @@ -713,9 +713,9 @@ static const struct { { "ROR", 0x000006F, 0x62, 1, PutAll }, { "RTI", 0x0000001, 0x40, 0, PutAll }, { "RTS", 0x0000001, 0x60, 0, PutAll }, - { "SBC", 0x080A66C, 0xe0, 0, PutAll }, { "SAX", 0x0000001, 0x22, 0, PutAll }, { "SAY", 0x0000001, 0x42, 0, PutAll }, + { "SBC", 0x080A66C, 0xe0, 0, PutAll }, { "SEC", 0x0000001, 0x38, 0, PutAll }, { "SED", 0x0000001, 0xf8, 0, PutAll }, { "SEI", 0x0000001, 0x78, 0, PutAll }, From a0c4ca9bd76c6c2b35863c5cbe846436a58f06c3 Mon Sep 17 00:00:00 2001 From: Oliver Schmidt <ol.sc@web.de> Date: Tue, 20 Jan 2015 21:00:44 +0100 Subject: [PATCH 20/20] Fixed file name of Windows binary snapshot. Although we're using Mingw-w64 to build the Windows binaries they are in fact 32-bit binaries - which is just fine. However the file name should reflect that. --- Makefile.travis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.travis b/Makefile.travis index 78ded63e6..4c0f688f8 100644 --- a/Makefile.travis +++ b/Makefile.travis @@ -24,7 +24,7 @@ endif SF_USER = oliverschmidt SF_HOST = frs.sourceforge.net -SF_FILE = /home/frs/project/cc65/cc65-snapshot-win64.zip +SF_FILE = /home/frs/project/cc65/cc65-snapshot-win32.zip SCPFLAGS = -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -q