From fa25272ccd5f354f47944f524a0e178dba49c1f3 Mon Sep 17 00:00:00 2001 From: Piotr Fusik Date: Sun, 22 Apr 2007 21:16:22 +0200 Subject: [PATCH] xasm 3.0.1 release. --- doc/editors.htm | 136 ------------- syntax/extension.asx | 2 - syntax/xasm.cgsyn | 56 ------ syntax/xasm.chl | 55 ------ syntax/xasm.ini | 134 ------------- syntax/xasm.key | 17 -- syntax/xasm.scheme | 38 ---- syntax/xasm.spc | 14 -- syntax/xasm.stx | 133 ------------- www/cgenie.gif | Bin 12748 -> 0 bytes www/index.html | 207 ++++++++++---------- www/scite.png | Bin 0 -> 24929 bytes xasm.d | 83 ++++---- doc/xasm.htm => xasm.html | 223 ++++++++++------------ syntax/xasm.properties => xasm.properties | 3 +- 15 files changed, 251 insertions(+), 850 deletions(-) delete mode 100644 doc/editors.htm delete mode 100644 syntax/extension.asx delete mode 100644 syntax/xasm.cgsyn delete mode 100644 syntax/xasm.chl delete mode 100644 syntax/xasm.ini delete mode 100644 syntax/xasm.key delete mode 100644 syntax/xasm.scheme delete mode 100644 syntax/xasm.spc delete mode 100644 syntax/xasm.stx delete mode 100644 www/cgenie.gif create mode 100644 www/scite.png rename doc/xasm.htm => xasm.html (73%) rename syntax/xasm.properties => xasm.properties (89%) diff --git a/doc/editors.htm b/doc/editors.htm deleted file mode 100644 index c503fa8..0000000 --- a/doc/editors.htm +++ /dev/null @@ -1,136 +0,0 @@ - - - -Configuring editors for xasm - - - -

How to configure a text editor for a convenient use of xasm

-

This document describes, how to setup a text editor to:

- -

Of course these features are not available in the Windows Notepad, -so you must pick another text editor. Fortunately there are many -general-purpose text editors for Windows. I'll focus on the following:

- -

Highlighting xasm mnemonics

-

In the syntax subdirectory you'll find xasm syntax definitions -for all of these editors.

- -

Single-keystroke assembly

- -

Placing the cursor where an assembly error occured

-

This works same for all these editors: just double-click the line -with the error message.

- - diff --git a/syntax/extension.asx b/syntax/extension.asx deleted file mode 100644 index 405cde2..0000000 --- a/syntax/extension.asx +++ /dev/null @@ -1,2 +0,0 @@ -LANGSPEC:XASM.SPC -KEYWORDS:XASM.KEY diff --git a/syntax/xasm.cgsyn b/syntax/xasm.cgsyn deleted file mode 100644 index 95eeac0..0000000 --- a/syntax/xasm.cgsyn +++ /dev/null @@ -1,56 +0,0 @@ -# xasm syntax for Code-Genie 3.0 (www.code-genie.com) -# written by Piotr Fusik - -CaseInsensitive true - -FgColor #000000 - -BlockStart comment1 *\s -BlockEnd comment1 \n -Format comment1 b -FgColor comment1 #009300 - -BlockStart comment2 ; -BlockEnd comment2 \n -FgColor comment2 #009300 - -BlockStart comment3 |\s -BlockEnd comment3 \n -FgColor comment3 #009300 - -BlockStart string1 ' -BlockEnd string1 \n -BlockEnd string1 ' -BlockNotEnd string1 '' -FgColor string1 #800080 - -BlockStart string2 " -BlockEnd string2 \n -BlockEnd string2 " -BlockNotEnd string2 "" -FgColor string2 #800080 - -KeywordGroup keywords - adc add and asl bcc bcs beq bit - bmi bne bpl brk bvc bvs clc cld - cli clv cmp cpx cpy dec dex dey - dta eif eli els end eor equ ert - icl ift inc ini ins inw inx iny - jcc jcs jeq jmi jmp jne jpl jsr - jvc jvs lda ldx ldy lsr mva mvx - mvy mwa mwx mwy nop opt ora org - pha php pla plp rcc rcs req rmi - rne rol ror rpl rti rts run rvc - rvs sbc scc scs sec sed sei seq - smi sne spl sta stx sty sub svc - svs tax tay tsx txa txs tya -FgColor keywords #0000ff - -Nest comment1 -Nest comment2 -Nest comment3 -Nest string1 -Nest string2 -Nest keywords - -# eof diff --git a/syntax/xasm.chl b/syntax/xasm.chl deleted file mode 100644 index 8586bd0..0000000 --- a/syntax/xasm.chl +++ /dev/null @@ -1,55 +0,0 @@ -// xasm highlighter for ConTEXT v0.97.1 (www.fixedsys.com/context) -// written by Piotr Fusik - -Language: xasm -Filter: xasm files (*.asx)|*.asx -HelpFile: - -CaseSensitive: 0 - -LineComment: ; -BlockCommentBeg: -BlockCommentEnd: - -IdentifierBegChars: a..z A..Z _ -IdentifierChars: a..z A..Z _ 0..9 - -NumConstBegChars: 0..9 -NumConstChars: 0..9 abcdefABCDEF - -EscapeChar: - -KeyWords1: adc add and asl bcc bcs beq bit - bmi bne bpl brk bvc bvs clc cld - cli clv cmp cpx cpy dec dex dey - dta eif eli els end eor equ ert - icl ift inc ini ins inw inx iny - jcc jcs jeq jmi jmp jne jpl jsr - jvc jvs lda ldx ldy lsr mva mvx - mvy mwa mwx mwy nop opt ora org - pha php pla plp rcc rcs req rmi - rne rol ror rpl rti rts run rvc - rvs sbc scc scs sec sed sei seq - smi sne spl sta stx sty sub svc - svs tax tay tsx txa txs tya - -StringBegChar: ' -StringEndChar: ' -MultilineStrings: 0 - -UsePreprocessor: 0 - -CurrLineHighlighted: 0 - -SpaceCol: clWindowText clWindow -Keyword1Col: clBlue clWindow -Keyword2Col: clBlue clWindow -Keyword3Col: clBlue clWindow -IdentifierCol: clWindowText clWindow -CommentCol: clGreen clWindow -NumberCol: clWindowText clWindow -StringCol: clPurple clWindow -SymbolCol: clWindowText clWindow -PreprocessorCol: clWindowText clWindow -SelectionCol: clWhite clNavy -CurrentLineCol: clBlack clYellow diff --git a/syntax/xasm.ini b/syntax/xasm.ini deleted file mode 100644 index 9093dbd..0000000 --- a/syntax/xasm.ini +++ /dev/null @@ -1,134 +0,0 @@ -# xasm highlighter for PSPad 4.2.1 (pspad.zde.cz) -# written by Piotr Fusik -[Settings] -Name=xasm -HTMLGroup=0 -FileType=*.asx -CommentString= -ANSIComment=0 -PasComment=0 -SlashComment=0 -CComment=0 -SpecComment=0 -BasComment=1 -FoxComment=0 -REMComment=0 -ExclComment=0 -ByComment=0 -SharpComment=0 -SlashComment=0 -PerCentComment=0 -SinglQComment=0 -DblQComment=0 -SQLComment=0 -SingleQuote=1 -DoubleQuote=1 -Preprocessors=0 -IndentChar= -UnIndentChar= -TabWidth=0 -[KeyWords] -ADC= -ADD= -AND= -ASL= -BCC= -BCS= -BEQ= -BIT= -BMI= -BNE= -BPL= -BRK= -BVC= -BVS= -CLC= -CLD= -CLI= -CLV= -CMP= -CPX= -CPY= -DEC= -DEX= -DEY= -EOR= -INC= -INW= -INX= -INY= -JCC= -JCS= -JEQ= -JMI= -JMP= -JNE= -JPL= -JSR= -JVC= -JVS= -LDA= -LDX= -LDY= -LSR= -MVA= -MVX= -MVY= -MWA= -MWX= -MWY= -NOP= -ORA= -PHA= -PHP= -PLA= -PLP= -RCC= -RCS= -REQ= -RMI= -RNE= -ROL= -ROR= -RPL= -RTI= -RTS= -RVC= -RVS= -SBC= -SCC= -SCS= -SEC= -SED= -SEI= -SEQ= -SMI= -SNE= -SPL= -STA= -STX= -STY= -SUB= -SVC= -SVS= -TAX= -TAY= -TSX= -TXA= -TXS= -TYA= -[ReservedWords] -DTA= -EIF= -ELI= -ELS= -END= -EQU= -ERT= -ICL= -IFT= -INI= -INS= -OPT= -ORG= -RUN= diff --git a/syntax/xasm.key b/syntax/xasm.key deleted file mode 100644 index 3819406..0000000 --- a/syntax/xasm.key +++ /dev/null @@ -1,17 +0,0 @@ -[-COMMENT-:GLOBAL] -# xasm keyword file for Crimson Editor (www.crimsoneditor.com) -# written by Piotr Fusik -[KEYWORDS0:GLOBAL] -adc add and asl bcc bcs beq bit -bmi bne bpl brk bvc bvs clc cld -cli clv cmp cpx cpy dec dex dey -dta eif eli els end eor equ ert -icl ift inc ini ins inw inx iny -jcc jcs jeq jmi jmp jne jpl jsr -jvc jvs lda ldx ldy lsr mva mvx -mvy mwa mwx mwy nop opt ora org -pha php pla plp rcc rcs req rmi -rne rol ror rpl rti rts run rvc -rvs sbc scc scs sec sed sei seq -smi sne spl sta stx sty sub svc -svs tax tay tsx txa txs tya diff --git a/syntax/xasm.scheme b/syntax/xasm.scheme deleted file mode 100644 index 7ddd786..0000000 --- a/syntax/xasm.scheme +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - adc add and asl bcc bcs beq bit - bmi bne bpl brk bvc bvs clc cld - cli clv cmp cpx cpy dec dex dey - dta eif eli els end eor equ ert - icl ift inc ini ins inw inx iny - jcc jcs jeq jmi jmp jne jpl jsr - jvc jvs lda ldx ldy lsr mva mvx - mvy mwa mwx mwy nop opt ora org - pha php pla plp rcc rcs req rmi - rne rol ror rpl rti rts run rvc - rvs sbc scc scs sec sed sei seq - smi sne spl sta stx sty sub svc - svs tax tay tsx txa txs tya - - - - - - - - - - - -

xasm.atari.org

-

xasm is a 6502 cross-assembler. -It is mainly targeted at Atari 8-bit computers, -but it can be also used for programming -Atari 2600/5200/Lynx, Commodore C64, Apple ][ and others. -xasm is freeware.

-

Version 3.0.0 is a complete rewrite from the x86 assembly language -to the D programming language. -xasm is now available for Linux.

-

Features

-

Although xasm does not support user-defined macros, it has a rich -set of built-in facilities.

-

Here is some typical 6502 code (also valid in xasm):

-
-        lda #<dest
-        sta ptr
-        lda #>dest
-        sta ptr+1
-        ldx #192
-do_line
-        ldy #39
-do_byte
-        lda pattern,y
-        sta (ptr),y
-        dey
-        bpl do_byte
-        lda #40
-        clc
-        adc ptr
-        sta ptr
-        bcc skip
-        inc ptr+1
-skip
-        dex
-        bne do_line
-
-

And here is the same code rewritten in a xasm-specific way:

-
-        mwa     #dest ptr
-        ldx     #192
-do_line
-        ldy     #39
-        mva:rpl pattern,y (ptr),y-
-        lda #40
-        add:sta ptr
-        scc:inc ptr+1
-        dex:bne do_line
-
-

Usage

-

Although xasm comes with no editor, the documentation -describes integration (syntax highlighting and single-keystroke compilation) -with a few general-purpose text editors. Here is a screenshot -of the Code-Genie editor:

-

6502 code in Code-Genie

-

Download

-
- - - - - - - - - - - - -
FileSizeDescription
xasm-3.0.0-win32.zip98 KBxasm 3.0.0 for Windows
xasm-3.0.0-linux.tar.gz128 KBxasm 3.0.0 for Linux
xasm-3.0.0-src.zip16 KBxasm 3.0.0 source code
xasm261.zip25 KBxasm 2.6.1 for DOS/Windows
xasm252.zip38 KBxasm 2.5.2 for DOS/Windows (includes -X-BOOT, X-LOAD and X-HEAD)
-
-

Links

- -
-

Hosted by Atari Area

- - + + + + +xasm + + + + + + +

xasm - 6502 cross-assembler

+

xasm is a free tool for programming old 8-bit computers based on the 6502 processor.

+

History

+

First version of xasm was written in 1998. I needed a cross-assembler +that could understand the syntax of Quick Assembler +which I used for 8-bit Atari programming before I got a PC. +Initially xasm supported the syntax of QA and nothing more. +I quickly realized that I could extend the syntax to make it more expressive. +This led to xasm 2.0, still in 1998. I added some more features +next year. In 2002 I released many versions which contained +mostly bugfixes. In 2005 there were some minor enhancements and bug fixes, +as well as the whole assembler was rewritten from the x86 assembly language +it was initially written in to the +D programming language. +The rewrite introduced a bug, hopefully fixed in version 3.0.1 +released 22nd April 2007.

+

Syntax

+

6502 assembler code is usually full of LDA, STA, LDA, STA sequences. +With xasm you can use MVA as a shortcut for LDA/STA pair +or even MWA for 16-bit transfers. You can avoid defining labels +when you need short jumps, thanks to conditional skip +and repeat pseudo-instructions. You can put two instructions +that share their argument in one line. +These are just some of the features that help you program +in a more concise way. Let's look at typical 6502 code +(which is valid in xasm):

+
+        lda #<dest
+        sta ptr
+        lda #>dest
+        sta ptr+1
+        ldx #192
+do_line
+        ldy #39
+do_byte
+        lda pattern,y
+        sta (ptr),y
+        dey
+        bpl do_byte
+        lda #40
+        clc
+        adc ptr
+        sta ptr
+        bcc skip
+        inc ptr+1
+skip
+        dex
+        bne do_line
+
+

Using xasm features this code can be rewritten to:

+
+        mwa     #dest ptr
+        ldx     #192
+do_line
+        ldy     #39
+        mva:rpl pattern,y (ptr),y-
+        lda #40
+        add:sta ptr
+        scc:inc ptr+1
+        dex:bne do_line
+
+

Usage

+

xasm is a command-line tool so you additionally need a general-purpose text editor. +I use SciTE. +Syntax highlighting definition for it is included with xasm. +To install it, copy xasm.properties to the SciTE directory, +select Options / Open Global Options File, type import xasm +at the end and save the global configuration file.

+

xasm code in SciTE

+

Download

+ +

For other systems, such as GNU/Linux and MacOS X, install the latest D compiler +and compile xasm from source code.

+

Inflate

+

Need a good decompression routine for 6502? +See my inflate routine.

+

Links

+ + + diff --git a/www/scite.png b/www/scite.png new file mode 100644 index 0000000000000000000000000000000000000000..7aa7f444197ca91b91dc95124905dd58330a1334 GIT binary patch literal 24929 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 W1K9 -// See the homepage at http://xasm.atari.org. -// This source code is free, redistributable and modifiable -// under the terms of the Artistic License (attached as artistic.txt). +// xasm 3.0.1 by Piotr Fusik +// http://xasm.atari.org -private import std.math; -private import std.stream; -private import std.string; +import std.math; +import std.stream; +import std.cstream; +import std.string; version (Windows) { @@ -32,7 +31,7 @@ version (Windows) { const char[] OPTION_P_DESC = "Ignored for compatibility"; } -const char[] TITLE = "xasm 3.0.0"; +const char[] TITLE = "xasm 3.0.1"; char[] sourceFilename = null; @@ -214,10 +213,10 @@ bit getOption(char letter) { } void warning(char[] msg) { - if (!(line is null)) { - stderr.printf("%.*s\n", line); + if (line !is null) { + derr.printf("%.*s\n", line); } - stderr.printf("%.*s (%d) WARNING: %.*s\n", + derr.printf("%.*s (%d) WARNING: %.*s\n", currentLocation.filename, currentLocation.lineNo, msg ); @@ -310,7 +309,7 @@ char[] readLabel() { column--; break; } - return label >= "A" ? label : cast(char[]) null; + return label >= "A" ? label : null; } void readComma() { @@ -835,7 +834,7 @@ debug int testValue(char[] l) { line = l; column = 0; readValue(); - printf("Value of %.*s is %x\n", line, value); + dout.printf("Value of %.*s is %x\n", line, value); return value; } @@ -1008,8 +1007,8 @@ void readAddrMode() { return; } addrMode = AddrMode.INDIRECT; - return; - default: + return; + default: illegalCharacter(); } break; @@ -1111,7 +1110,7 @@ debug AddrMode testAddrMode(char[] l) { line = l; column = 0; readAddrMode(); - printf("Addressing mode of \"%.*s\" is %x\n", line, addrMode); + dout.printf("Addressing mode of \"%.*s\" is %x\n", line, addrMode); return addrMode; } @@ -1195,7 +1194,7 @@ void ensureListingFileOpen(char letter, char[] msg) { if (listingStream is null) { listingStream = openOutputFile(letter, ".lst"); if (!getOption('q')) { - printf(msg); + dout.printf(msg); } listingStream.printf(TITLE ~ "\r\n"); } @@ -1258,7 +1257,7 @@ void listCommentLine() { } void listLabelTable() { - if (!(optionParameters['t' - 'a'] is null) && !(listingStream is null)) { + if (optionParameters['t' - 'a'] !is null && listingStream !is null) { listingStream.close(); listingStream = null; } @@ -1292,7 +1291,7 @@ void objectByte(ubyte b) { if (objectStream is null) { objectStream = openOutputFile('o', ".obx"); if (!getOption('q')) { - printf("Writing object file...\n"); + dout.printf("Writing object file...\n"); } } try { @@ -1346,7 +1345,8 @@ void putByte(ubyte b) { objectByte(b); } if (pass2) { - debug; else { + debug { + }else { objectByte(b); } if (listingColumn < 29) { @@ -1357,15 +1357,17 @@ void putByte(ubyte b) { listingColumn = 30; } } - if (origin >= 0) { + if (optionHeaders) { + if (origin < 0) + throw new AssemblyError("No ORG specified"); assert(blockIndex >= 0); if (!pass2) { blockEnds[blockIndex] = cast(ushort) loadOrigin; } + } + if (origin >= 0) { origin++; loadingOrigin = ++loadOrigin; - } else if (optionHeaders) { - throw new AssemblyError("No ORG specified"); } } @@ -2074,7 +2076,6 @@ void assemblyDtaNumbers(char letter) { case 'r': assemblyDtaReal(); break; - } switch (readChar()) { case ')': @@ -2443,7 +2444,7 @@ void assemblyIns() { } void assemblyInstruction(char[] instruction) { - if (!inOpcode && origin < 0 && !(currentLabel is null) && instruction != "EQU") { + if (!inOpcode && origin < 0 && currentLabel !is null && instruction != "EQU") { throw new AssemblyError("No ORG specified"); } instructionBegin = true; @@ -2768,11 +2769,11 @@ debug ubyte[] testInstruction(char[] l) { line = l; column = 0; assemblyInstruction(readInstruction()); - printf("%.*s assembles to", line); + dout.printf("%.*s assembles to", line); foreach (ubyte b; objectBuffer) { - printf(" %02x", b); + dout.printf(" %02x", b); } - printf("\n"); + dout.printf("\n"); return objectBuffer; } @@ -2811,7 +2812,7 @@ void assemblyPair() { void assemblyLine() { debug { - printf("%.*s\n", line); + dout.printf("%.*s\n", line); } currentLocation.lineNo++; totalLines++; @@ -2823,7 +2824,7 @@ void assemblyLine() { } char[] label = readLabel(); currentLabel = null; - if (!(label is null)) { + if (label !is null) { if (!inFalseCondition()) { if (!pass2) { if (label in labelTable) { @@ -2930,7 +2931,7 @@ void assemblyFile(char[] filename) { if (filenameExt(filename) < 0) { filename ~= ".asx"; } - if (!(currentLocation is null)) { + if (currentLocation !is null) { locations ~= currentLocation; } if (getOption('p')) { @@ -3090,7 +3091,7 @@ int main(char[][] args) { } continue; } - if (!(sourceFilename is null)) { + if (sourceFilename !is null) { exitCode = 3; } sourceFilename = arg; @@ -3099,10 +3100,10 @@ int main(char[][] args) { exitCode = 3; } if (!getOption('q')) { - printf(TITLE ~ "\n"); + dout.printf(TITLE ~ "\n"); } if (exitCode != 0) { - printf( + dout.printf( "Syntax: xasm source [options]\n" "/c Include false conditionals in listing\n" "/d:label=value Define a label\n" @@ -3124,25 +3125,25 @@ int main(char[][] args) { listLabelTable(); } } catch (AssemblyError e) { - if (!(line is null)) { - stderr.printf("%.*s\n", line); + if (line !is null) { + derr.printf("%.*s\n", line); } - stderr.printf("%.*s (%d) ERROR: %.*s\n", + derr.printf("%.*s (%d) ERROR: %.*s\n", currentLocation.filename, currentLocation.lineNo, e.msg ); exitCode = 2; } - if (!(listingStream is null)) { + if (listingStream !is null) { listingStream.close(); } - if (!(objectStream is null)) { + if (objectStream !is null) { objectStream.close(); } if (exitCode <= 1 && !getOption('q')) { - printf("%d lines of source assembled\n", totalLines); + dout.printf("%d lines of source assembled\n", totalLines); if (objectBytes > 0) { - printf("%d bytes written to the object file\n", objectBytes); + dout.printf("%d bytes written to the object file\n", objectBytes); } } return exitCode; diff --git a/doc/xasm.htm b/xasm.html similarity index 73% rename from doc/xasm.htm rename to xasm.html index 602708e..f624bf5 100644 --- a/doc/xasm.htm +++ b/xasm.html @@ -1,8 +1,8 @@ - - + + + -xasm 3.0.0 +xasm 3.0.1 @@ -20,9 +20,8 @@ the .obx extension.

OPTIONS

/c
-
Enable listing false conditionals. -Lines skipped due to a false condition are not listed by default.
-
/d:label=value
+
List lines skipped due to a false condition.
+
/d:label=value
Define a label. label should be a valid label name. value may be any expression (it may use forward references @@ -30,49 +29,42 @@ to labels defined in the source file). You may use several /d options to define many labels from the command line.
/i
-
Disable listing included sources. Only main source file will be -listed.
+
Do not list included files. Only main source file will be listed.
/l[:filename]
-
Enable listing. If no filename is given, the listing is written +
Generate a listing. If no filename is given, the listing is written to source.lst, where source is the name of the source file -(without the extension).
+without the extension.
/o:filename
-
Specify object file name. The default is source.obx. +
Set object file name. The default is source.obx. You may use the null device (/o:nul) to generate no object file.
-
/p
+
/p
Print fully qualified file names in listing and error messages. -This option is useful for the Code-Genie editor, which can jump to the error -location only if the full path is given. -This option works only on Windows and is silently ignored on Linux.
-
/q
+This option works only on Windows and is silently ignored on other platforms. +
/q
Suppress info messages. -Prevents xasm from printing its name and the summary (how many lines -assembled and bytes written). Good if you are building a project from many -source files and don't want tons of messages.
+Quiet mode. Prevents xasm from printing the logo and the summary.
/t[:filename]
-
List label table. If no filename given, the table is appended +
List label table. If filename is omitted then the table is appended to the listing.
-
/u
-
Warn of unused labels. A warning message will be issued for each label, -whose value is never used.
+
/u
+
Issue a warning message for each label whose value is unused.

Alternatively, you may use Unix-style options, for example:

xasm -i -d DEBUG=1 -l listing.lst source.asx
 

SYNTAX

-

Source files should be plain ASCII files. Supported are LF, CR, CR/LF -and Atari line terminators. xasm is not case-sensitive, so you can mix -upper- and lower-case for labels and instructions.

+

Source files should be plain ASCII files. LF, CR, CR/LF and Atari line terminators +are supported. Labels and instructions are case-insensitive.

xasm is backward compatible with Quick Assembler. -If you want to assembly QA sources with xasm, simply replace ATASCII -specific characters with their integer representation. You also have to change -all OPT directives, but usually you only need to remove them.

+To compile QA sources with xasm, simply replace ATASCII-specific characters +with their integer codes. You also have to change all OPT directives, +but usually you can simply remove them.

A label is a symbol that represents a 32-bit signed integer. You can define a label by putting its name at the beginning of a line -(with no spaces before). If you do not use the EQU directive, +(with no spaces before). Unless you use the EQU directive, the label is assigned the current value of the origin counter.

-

Instructions and directives must be preceded with -whitespace. Note that in xasm you can use instruction and directive +

Instructions and directives must be preceded with some whitespace. +Note that in xasm you can use instruction and directive names as label names. For example

nop
 

defines a label called nop, whereas

@@ -85,23 +77,21 @@ of full comment lines:

* so it is label | and this too -

Lines with instructions (and some directives) +

Lines with instructions (and some directives) may be repeated. A single line may be assembled several times, for example:

:4 asl @
 table :32*5 dta 5
 
-

In lines with instructions or directives, a comment starts after -the instruction/directive has been successfully parsed. That is, xasm -does not require a special character to start a comment. However, -you still can use one, because it is usually required for correct syntax -highlighting in text editors.

+

In lines with instructions or directives, a comment starts immediately +after the instruction/directive has been successfully parsed. +That is, xasm does not require a special character to start a comment.

 lda foo ; this is a comment
  sta bar so it is
- tax #0  tax requires no operand, so #0 starts a comment
+ tax #0  tax has no operand, therefore #0 starts this comment
 
-

You may put two instructions on the same line. -In this case they have the same operand. For example:

+

You may put two instructions in one line +so they share the operand. For example:

 eor:sta foo
 

is equivalent to

@@ -110,29 +100,28 @@ In this case they have the same operand. For example:

Note that

 lda:tax #0
-

is allowed (#0 is a comment for tax).

+

is allowed because #0 is treated as a comment for tax.

EXPRESSIONS

Expressions are numbers combined with operators and brackets. You should use square brackets, because parentheses are reserved -for the indirect addressing.

-

Numbers are 32-bit signed integers, in the range of -$7fffffff..$7fffffff. -A number may be:

+for 6502 indirect addressing.

+

Numbers can be expressed as:

Abbreviations of Atari hardware registers are provided to save you the trouble of typing two extra characters (^4e vs $d40e) and to ease porting software between Atari 8-bit computers and the Atari 5200 console. These are very similar machines, one of the biggest differences is -different location of hardware registers.

+the location of hardware registers.

@@ -150,17 +139,17 @@ different location of hardware registers.

SyntaxChip Value in the Atari 8-bit
computer mode (opt g-)
$D40x$D40x

An op-code is the single-byte op-code of the instruction inside braces. -The operand of the instruction is discarded and is necessary only for -identifying the addressing mode. The instruction should begin just after +The operand of the instruction is discarded and is necessary only +to recognize the addressing mode. The instruction should begin right after the left brace and the right brace should immediately follow the operand or the instruction. -You can skip the operand if the addressing mode +You can skip the operand if the addressing mode is fixed. Examples: {lda #}, {jsr}, {bne}, {jmp ()}, {sta a:,x}.

You can use the line repeat counter (#) in the repeated lines. It counts the iterations starting from zero. Examples:

-
:3 dta # ; generates three bytes: 00, 01, 02.
+
:3 dta # ; generates three bytes: 0, 1, 2.
 line_lo :192 dta l(screen+40*#)
 line_hi :192 dta h(screen+40*#)
 dl :59 dta $4f,a(screen+40*#),0,$4f,a(screen+40*#),0
@@ -188,7 +177,7 @@ dl :59 dta $4f,a(screen+40*#),0,$4f,a(screen+40*#),0
 
  • && Logical AND
  • || Logical OR
  • -

    The following unary operators are supported:

    +

    The following unary operators are supported:

    ORG - change value of the origin counter
    -
    You can set some options applied to the new header (if headers are -enabled): +
    If Atari executable headers are enabled, you can use a prefix:
      -
    • a: tells xasm to always make a header, even it is -unnecessary, like in ORG *.
    • -
    • f: works same as a:, but additionally tells to generate -a $FF,$FF prefix before the header. xasm adds it -at the beginning of the file by default, so use this option only if you want -the $FF's somewhere inside.
    • +
    • a: starts a new block even if it is not necessary because +the new address equals the current address.
    • +
    • f: is same as a:, but additionally generates +a $FF,$FF prefix before the new header. The prefix is automatically +generated at the beginning of the file.
    Examples:
     org $600
    @@ -267,13 +253,12 @@ table org *+100
     In the latter example table points to 100 bytes
     of uninitialized data (label is assigned to *
     before the ORG directive is executed).
    -

    Starting with version 2.6.0, xasm supports code +

    Starting with version 2.6.0, xasm supports code that is relocated in the memory at runtime. Let's say you want your code -to be run at the zero page. Typically you can't load it directly into this -place, so you load it at a different address and then move at the runtime. -xasm differentiates between the address that it used -for code generation from the address that is used for generating -Atari executable headers. org r: affects only the former one. +to be located on the zero page. You can't normally load it directly into this +place, so you load it at a different address and then move in your program. +org r: changes the address that it used for code generation +but not the address used for generating Atari executable headers. Example:

     org $8000
      ldx #code_length-1
    @@ -292,8 +277,8 @@ because I think this is not useful. If you really need it, you can
     always type something like:

    where_am_i equ *-code_zpage+code_loaded
     
    -
    DTA - define data
    -
    There are various data types: +
    DTA - define data
    +
    • integers
        @@ -311,21 +296,20 @@ where:
      • center is a number which is added to every sine value
      • amp is the sine amplitude
      • size is the sine period
      • -
      • first,last define range of values in the table. +
      • first,last define the range of sine arguments. They are optional. The default are 0,size-1.
      Example: dta a(sin(0,1000,256,0,63)) defines a table of 64 words representing a quarter of sine with the amplitude of 1000.
    • real numbers: r(-1.23456e12)
      -Real numbers are written in the 6-byte Atari Floating-Point format.
    • +Real numbers are stored in the 6-byte Atari Floating-Point format.
    • text strings
      • ASCII strings: c'Text' or c"Text"
      • ANTIC strings: d'Text' or d"Text"
      A character string consists of any of characters surrounded by quotation -marks. Within a string, a single quotation mark character is -represented by two succesive quotation marks.
      +marks. You can include the quotation marks in the string by doubling them.
      Placing a * character after a string inverts the highest bit in every byte of the string.
    @@ -345,7 +329,7 @@ Examples: icl 'lib/fileio'
    Note: for portability, you should use only relative paths and slash -as the separator. This guarantees that your sources will compile under Windows +as the separator. This assures that your sources will compile under Windows and Linux.
    END - end assembling file
    Remaining part of the file is not assembled. If this statement does @@ -358,23 +342,20 @@ Example:
    INS - insert contents of file
    Copies every byte of the specified file into the object file and updates the origin counter, as if these bytes were defined with DTA.
    -You may specify a range of the inserted file. The syntax is following: +You may specify a range of the file to insert. The syntax is:
      ins 'file'[,offset[,length]]
     
    The first byte in a file has the offset of zero.
    -If the offset is negative, it is counted from the end of the file.
    +If the offset is negative, it counts from the end of the file.
    Examples:
      ins 'picture.raw'
      ins 'file',-256  insert last 256 bytes of file
      ins 'file',10,10 insert bytes 10..19 of file
     
    -
    RUN - generate run address
    -
    An Atari executable program should specify a run address. -A program may be loaded in many areas of the memory and started from any -address. -
     run addr
    +
    RUN - set run address in the Atari executable format
    +
     run addr
     
    is equivalent to:
     org $2e0
    @@ -383,18 +364,16 @@ is equivalent to:
     Example:
     
     run main
     
    -
    INI - generate init address
    -
    An Atari executable program may have some routines which are executed -during the loading process. There may be many init blocks in one file.
    -Example: +
    INI - set init address in the Atari executable format
    +
    Example:
     ini showpic
     
    -
    ERT - generate an error if an expression is true
    +
    ERT - generate error if expression evaluates to true
    Examples:
     ert *>$c000
      ert len1>$ff||len2>$ff
     
    -
    IFT - assemble if expression is +
    IFT - assemble if expression is true
    ELI - else if
    ELS - else
    @@ -433,11 +412,11 @@ to use a CLC before ADC for every simple addition.
    CLC and ADC.
    SUB - subtraction
    It is SEC and SBC.
    -
    RCC, RCS, REQ, RMI, RNE, RPL, RVC, +
    RCC, RCS, REQ, RMI, RNE, RPL, RVC, RVS - conditional repeat
    These are branches to the previous instruction. They take no operand, because the branch target -is the address of previously assembled instruction.
    +is the address of the previously assembled instruction.
    Example:
     ldx #0
      mva:rne $500,x $600,x+
    @@ -465,7 +444,7 @@ In the above example the word-sized variable $80 is incremented by 40.
    jumps
    These are a kind of 'long' branches. While standard branches (such as BNE) have range of -128..+127, these jumps have range -of all 64 kB.
    +of 64 kB.
    Example:
     jne dest
     
    is equivalent to: @@ -486,28 +465,28 @@ and substitutes two commands: mvx source dest = ldx source : stx dest mvy source dest = ldy source : sty dest
    -
    MWA, MWX, MWY - move word using +
    MWA, MWX, MWY - move word using accumulator, X or Y
    These pseudo-commands require two operands and are combinations of two MV*'s: one to move the low byte, and the other to move the high byte.
    You can't use indirect nor pseudo addressing mode with MW*. -Destination must be an absolute address (optionally indexed).
    -When source is also absolute, an mw* source dest will be: +Destination must be an absolute address, optionally indexed.
    +When source is also an absolute address, an mw* source dest expands to:
     mv* source  dest
      mv* source+1 dest+1
     
    -When source is an immediate, an mw* #immed dest will be: +When source is an immediate value, an mw* #immed dest expands to:
     mv* <immed dest
      mv* >immed dest+1
     
    When <immed equals >immed and immed -is not forward-referenced, xasm uses an optimization: +is not forward-referenced, xasm skips the second LD*:
     mv* <immed dest
      st* dest+1
     
    If possible, MWX and MWY use increment/decrement -commands. E.g. mwx #1 dest is assembled as: +commands. For example, mwx #1 dest expands to:
     ldx #1
      stx dest
      dex
    @@ -523,24 +502,24 @@ the @ character (as in Quick Assembler).

    which use the low/high byte of a 16-bit word constant. They are for Quick Assembler compatibility. You can use traditional #< and #>. -Note lda >$ff+5 loads 1 (>$104), +Note that lda >$ff+5 loads 1 (>$104), while lda #>$ff+5 loads 5 (0+5) to the accumulator, because the unary operator > has a higher priority than the binary plus.

    -

    In absolute addressing modes, xasm examines the expression -and uses zero-page addressing mode if it supposes it's possible. -You may override it with a: and z: prefixes.

    +

    You can explicitly choose absolute (a:) +and zero-page (z:) addressing modes.

    Examples:

      nop
      asl @
    - lda >$1234	assembles to lda #$12
    + lda >$1234  assembles to lda #$12
      lda $100,x
    - lda a:0	generates 16-bit address
    + lda 0       zero-page (8-bit address)
    + lda a:0     absolute (16-bit address)
      jmp ($0a)
      lda ($80),y
     
    -

    There are also pseudo addressing modes, which are similar to +

    There are pseudo addressing modes, which are similar to pseudo-commands. You may use them just like standard addressing modes in all 6502 commands and pseudo-commands, except for MWA, MWX and MWY:

    @@ -552,10 +531,16 @@ in all 6502 commands and pseudo-commands, except for cmd (z),y- = cmd (z),y : dey cmd (z,0) = ldx #0 : cmd (z,x) cmd (z),0 = ldy #0 : cmd (z),y -
    cmd (z),0+ = ldy #0 : cmd (z),y : iny + cmd (z),0+ = ldy #0 : cmd (z),y : iny cmd (z),0- = ldy #0 : cmd (z),y : dey
    -

    CHANGES

    +

    HISTORY

    +

    Version 3.0.1 (2007-04-22)

    +
      +
    • fixed a bug in OPT H- mode
    • +
    • made xasm compilable with the latest D compiler v1.010 +(there were incompatible changes in the D language and library)
    • +

    Version 3.0.0 (2005-05-22)