diff --git a/doc/docbook/cmdref.sgm b/doc/docbook/cmdref.sgm
index d052970..6dbfb30 100644
--- a/doc/docbook/cmdref.sgm
+++ b/doc/docbook/cmdref.sgm
@@ -1,451 +1,451 @@
-
- Ophis Command Reference
-
- Command Modes
-
- These mostly follow the MOS Technology 6500
- Microprocessor Family Programming Manual, except
- for the Accumulator mode. Accumulator instructions are written
- and interpreted identically to Implied mode instructions.
-
-
- Implied: RTS
- Accumulator: LSR
- Immediate: LDA #$06
- Zero Page: LDA $7C
- Zero Page, X: LDA $7C,X
- Zero Page, Y: LDA $7C,Y
- Absolute: LDA $D020
- Absolute, X: LDA $D000,X
- Absolute, Y: LDA $D000,Y
- (Zero Page Indirect, X): LDA ($80, X)
- (Zero Page Indirect), Y: LDA ($80), Y
- (Absolute Indirect): JMP ($A000)
- Relative: BNE loop
- (Absolute Indirect, X): JMP ($A000, X) — Only available with 65C02 extensions
- (Zero Page Indirect): LDX ($80) — Only available with 65C02 extensions
-
-
-
- Basic arguments
-
- Most arguments are just a number or label. The formats for
- these are below.
-
-
- Numeric types
-
- Hex: $41 (Prefixed with $)
- Decimal: 65 (No markings)
- Octal: 0101 (Prefixed with zero)
- Binary: %01000001 (Prefixed with %)
- Character: 'A (Prefixed with single quote)
-
-
-
- Label types
-
- Normal labels are simply referred to by name. Anonymous
- labels may be referenced with strings of - or + signs (the
- label - refers to the immediate
- previous anonymous label, -- the
- one before that, etc., while +
- refers to the next anonymous label), and the special
- label ^ refers to the program
- counter at the start of the current instruction or directive.
-
-
- Normal labels are defined by
- prefixing a line with the label name and then a colon
- (e.g., label:). Anonymous labels
- are defined by prefixing a line with an asterisk
- (e.g., *).
-
-
- Temporary labels are only reachable from inside the
- innermost enclosing .scope
- statement. They are identical to normal labels in every
- way, except that they start with an underscore.
-
-
-
- String types
-
- Strings are enclosed in double quotation marks. Backslashed
- characters (including backslashes and double quotes) are
- treated literally, so the string "The man said,
- \"The \\ character is the backslash.\"" produces
- the ASCII sequence for The man said, "The \
- character is the backslash."
-
-
- Strings are generally only used as arguments to assembler
- directives—usually for filenames
- (e.g., .include) but also for string
- data (in association with .byte).
-
-
- It is legal, though unusual, to attempt to pass a string to
- the other data statements. This will produces a series of
- words/dwords where all bytes that aren't least-significant
- are zero. Endianness and size will match what the directive
- itself indicated.
-
-
-
-
- Compound Arguments
-
- Compound arguments may be built up from simple ones, using the
- standard +, -, *, and / operators, which carry the usual
- precedence. Also, the unary operators > and <, which
- bind more tightly than anything else, provide the high and low
- bytes of 16-bit values, respectively.
-
-
- Use brackets [ ] instead of parentheses ( ) when grouping
- arithmetic operations, as the parentheses are needed for the
- indirect addressing modes.
-
-
- Examples:
-
-
- $D000 evaluates to $D000
- $D000+32 evaluates to $D020
- $D000+$20 also evaluates to $D020
- <$D000+32 evaluates to $20
- >$D000+32 evaluates to $F0
- >[$D000+32] evaluates to $D0
- >$D000-275 evaluates to $CE
-
-
-
- Memory Model
-
- In order to properly compute the locations of labels and the
- like, Ophis must keep track of where assembled code will
- actually be sitting in memory, and it strives to do this in a
- way that is independent both of the target file and of the
- target machine.
-
-
- Basic PC tracking
-
- The primary technique Ophis uses is program counter
- tracking. As it assembles the code, it keeps
- track of a virtual program counter, and uses that to
- determine where the labels should go.
-
-
- In the absence of an .org directive, it
- assumes a starting PC of zero. .org
- is a simple directive, setting the PC to the value
- that .org specifies. In the simplest
- case, one .org directive appears at the
- beginning of the code and sets the location for the rest of
- the code, which is one contiguous block.
-
-
-
- Basic Segmentation simulation
-
- However, this isn't always practical. Often one wishes to
- have a region of memory reserved for data without actually
- mapping that memory to the file. On some systems (typically
- cartridge-based systems where ROM and RAM are seperate, and
- the target file only specifies the ROM image) this is
- mandatory. In order to access these variables symbolically,
- it's necessary to put the values into the label lookup
- table.
-
-
- It is possible, but inconvenient, to do this
- with .alias, assigning a specific
- memory location to each variable. This requires careful
- coordination through your code, and makes creating reusable
- libraries all but impossible.
-
-
- A better approach is to reserve a section at the beginning
- or end of your program, put an .org
- directive in, then use the .space
- directive to divide up the data area. This is still a bit
- inconvenient, though, because all variables must be
- assigned all at once. What we'd really like is to keep
- multiple PC counters, one for data and one for code.
-
-
- The .text
- and .data directives do this. Each
- has its own PC that starts at zero, and you can switch
- between the two at any point without corrupting the other's
- counter. In this way each function can have
- a .data section (filled
- with .space commands) and
- a .text section (that contains the
- actual code). This lets our library routines be almost
- completely self-contained - we can have one source file
- that could be .included by multiple
- projects without getting in anything's way.
-
-
- However, any given program may have its own ideas about
- where data and code go, and it's good to ensure with
- a .checkpc at the end of your code
- that you haven't accidentally overwritten code with data or
- vice versa. If your .data
- segment did start at zero, it's
- probably wise to make sure you aren't smashing the stack,
- too (which is sitting in the region from $0100 to
- $01FF).
-
-
- If you write code with no segment-defining statements in
- it, the default segment
- is text.
-
-
- The data segment is designed only
- for organizing labels. As such, errors will be flagged if
- you attempt to actually output information into
- a data segment.
-
-
-
- General Segmentation Simulation
-
- One text and data segment each is usually sufficient, but
- for the cases where it is not, Ophis allows for user-defined
- segments. Putting a label
- after .text
- or .data produces a new segment with
- the specified name.
-
-
- Say, for example, that we have access to the RAM at the low
- end of the address space, but want to reserve the zero page
- for truly critical variables, and use the rest of RAM for
- everything else. Let's also assume that this is a 6510
- chip, and locations $00 and $01 are reserved for the I/O
- port. We could start our program off with:
-
-
-.data
-.org $200
-.data zp
-.org $2
-.text
-.org $800
-
-
- And, to be safe, we would probably want to end our code
- with checks to make sure we aren't overwriting anything:
-
-
-.data
-.checkpc $800
-.data zp
-.checkpc $100
-
-
-
-
- Macros
-
- Assembly language is a powerful tool—however, there are
- many tasks that need to be done repeatedly, and with
- mind-numbing minor modifications. Ophis includes a facility
- for macros to allow this. Ophis macros
- are very similar in form to function calls in higher level
- languages.
-
-
- Defining Macros
-
- Macros are defined with the .macro
- and .macend commands. Here's a
- simple one that will clear the screen on a Commodore
- 64:
-
-
-.macro clr'screen
- lda #147
- jsr $FFD2
-.macend
-
-
-
- Invoking Macros
-
- To invoke a macro, either use
- the .invoke command or backquote the
- name of the routine. The previous macro may be expanded
- out in either of two ways, at any point in the
- source:
-
- .invoke clr'screen
- or
- `clr'screen
- will work equally well.
-
-
- Passing Arguments to Macros
-
- Macros may take arguments. The arguments to a macro are
- all of the word
type, though byte values may
- be passed and used as bytes as well. The first argument in
- an invocation is bound to the label
- _1, the second
- to _2, and so on. Here's a macro
- for storing a 16-bit value into a word pointer:
-
-
-.macro store16 ; `store16 dest, src
- lda #<_2
- sta _1
- lda #>_2
- sta _1+1
-.macend
-
-
- Macro arguments behave, for the most part, as if they were
- defined by .alias
- commands in the calling context.
- (They differ in that they will not produce duplicate-label
- errors if those names already exist in the calling scope,
- and in that they disappear after the call is
- completed.)
-
-
-
- Features and Restrictions of the Ophis Macro Model
-
- Unlike most macro systems (which do textual replacement),
- Ophis macros evaluate their arguments and bind them into the
- symbol table as temporary labels. This produces some
- benefits, but it also puts some restrictions on what kinds of
- macros may be defined.
-
-
- The primary benefit of this expand-via-binding
- discipline is that there are no surprises in the semantics.
- The expression _1+1 in the macro above
- will always evaluate to one more than the value that was
- passed as the first argument, even if that first argument is
- some immensely complex expression that an
- expand-via-substitution method may accidentally
- mangle.
-
-
- The primary disadvantage of the expand-via-binding
- discipline is that only fixed numbers of words and bytes
- may be passed. A substitution-based system could define a
- macro including the line LDA _1 and
- accept as arguments both $C000
- (which would put the value of memory location $C000 into
- the accumulator) and #$40 (which
- would put the immediate value $40 into the accumulator).
- If you really need this kind of
- behavior, a run a C preprocessor over your Ophis source,
- and use #define to your heart's
- content.
-
-
-
-
- Assembler directives
-
- Assembler directives are all instructions to the assembler
- that are not actual instructions. Ophis's set of directives
- follow.
-
-
- .advance address:
- Forces the program counter to
- be address. Unlike
- the .org
- directive, .advance outputs zeroes until the
- program counter reaches a specified address. Attempting
- to .advance to a point behind the current
- program counter is an assemble-time error.
- .alias label value: The
- .alias directive assigns an arbitrary value to a label. This
- value may be an arbitrary argument, but cannot reference any
- label that has not already been defined (this prevents
- recursive label dependencies).
- .byte arg [ , arg, ... ]:
- Specifies a series of arguments, which are evaluated, and
- strings, which are included as raw ASCII data. The final
- results of these arguments must be one byte in size. Seperate
- constants are seperated by comments.
- .checkpc address: Ensures that the
- program counter is less than or equal to the address
- specified, and emits an assemble-time error if it is not.
- This produces no code in the final binary - it is there to
- ensure that linking a large amount of data together does not
- overstep memory boundaries.
- .data [label]: Sets the segment to
- the segment name specified and disallows output. If no label
- is given, switches to the default data segment.
- .incbin filename: Inserts the
- contents of the file specified as binary data. Use it to
- include graphics information, precompiled code, or other
- non-assembler data.
- .include filename: Includes the
- entirety of the file specified at that point in the program.
- Use this to order your final sources.
- .org address: Sets the program
- counter to the address specified. This does not emit any
- code in and of itself, nor does it overwrite anything that
- previously existed. If you wish to jump ahead in memory,
- use .advance.
- .require filename: Includes the entirety
- of the file specified at that point in the program. Unlike .include,
- however, code included with .require will only be inserted once.
- The .require directive is useful for ensuring that certain code libraries
- are somewhere in the final binary. They are also very useful for guaranteeing that
- macro libraries are available.
- .space label size: This
- directive is used to organize global variables. It defines the
- label specified to be at the current location of the program
- counter, and then advances the program counter size
- steps ahead. No actual code is produced. This is equivalent
- to label: .org ^+size.
- .text [label]: Sets the segment to
- the segment name specified and allows output. If no label is
- given, switches to the default text segment.
- .word arg [ , arg, ... ]:
- Like .byte, but values are all treated as two-byte
- values and stored low-end first (as is the 6502's wont). Use
- this to create jump tables (an unadorned label will evaluate
- to that label's location) or otherwise store 16-bit
- data.
- .dword arg [ , arg, ...]:
- Like .word, but for 32-bit values.
- .wordbe arg [ , arg, ...]:
- Like .word, but stores the value in a big-endian format (high byte first).
- .dwordbe arg [ , arg, ...]:
- Like .dword, but stores the value high byte first.
- .scope: Starts a new scope block. Labels
- that begin with an underscore are only reachable from within
- their innermost enclosing .scope statement.
- .scend: Ends a scope block. Makes the
- temporary labels defined since the last .scope
- statement unreachable, and permits them to be redefined in a
- new scope.
- .macro name: Begins a macro
- definition block. This is a scope block that can be inlined
- at arbitrary points with .invoke. Arguments to the
- macro will be bound to temporary labels with names like
- _1, _2, etc.
- .macend: Ends a macro definition
- block.
- .invoke label [argument [,
- argument ...]]: invokes (inlines) the specified
- macro, binding the values of the arguments to the ones the
- macro definition intends to read. A shorthand for .invoke
- is the name of the macro to invoke, backquoted.
-
-
-
+
+ Ophis Command Reference
+
+ Command Modes
+
+ These mostly follow the MOS Technology 6500
+ Microprocessor Family Programming Manual, except
+ for the Accumulator mode. Accumulator instructions are written
+ and interpreted identically to Implied mode instructions.
+
+
+ Implied: RTS
+ Accumulator: LSR
+ Immediate: LDA #$06
+ Zero Page: LDA $7C
+ Zero Page, X: LDA $7C,X
+ Zero Page, Y: LDA $7C,Y
+ Absolute: LDA $D020
+ Absolute, X: LDA $D000,X
+ Absolute, Y: LDA $D000,Y
+ (Zero Page Indirect, X): LDA ($80, X)
+ (Zero Page Indirect), Y: LDA ($80), Y
+ (Absolute Indirect): JMP ($A000)
+ Relative: BNE loop
+ (Absolute Indirect, X): JMP ($A000, X) — Only available with 65C02 extensions
+ (Zero Page Indirect): LDX ($80) — Only available with 65C02 extensions
+
+
+
+ Basic arguments
+
+ Most arguments are just a number or label. The formats for
+ these are below.
+
+
+ Numeric types
+
+ Hex: $41 (Prefixed with $)
+ Decimal: 65 (No markings)
+ Octal: 0101 (Prefixed with zero)
+ Binary: %01000001 (Prefixed with %)
+ Character: 'A (Prefixed with single quote)
+
+
+
+ Label types
+
+ Normal labels are simply referred to by name. Anonymous
+ labels may be referenced with strings of - or + signs (the
+ label - refers to the immediate
+ previous anonymous label, -- the
+ one before that, etc., while +
+ refers to the next anonymous label), and the special
+ label ^ refers to the program
+ counter at the start of the current instruction or directive.
+
+
+ Normal labels are defined by
+ prefixing a line with the label name and then a colon
+ (e.g., label:). Anonymous labels
+ are defined by prefixing a line with an asterisk
+ (e.g., *).
+
+
+ Temporary labels are only reachable from inside the
+ innermost enclosing .scope
+ statement. They are identical to normal labels in every
+ way, except that they start with an underscore.
+
+
+
+ String types
+
+ Strings are enclosed in double quotation marks. Backslashed
+ characters (including backslashes and double quotes) are
+ treated literally, so the string "The man said,
+ \"The \\ character is the backslash.\"" produces
+ the ASCII sequence for The man said, "The \
+ character is the backslash."
+
+
+ Strings are generally only used as arguments to assembler
+ directives—usually for filenames
+ (e.g., .include) but also for string
+ data (in association with .byte).
+
+
+ It is legal, though unusual, to attempt to pass a string to
+ the other data statements. This will produces a series of
+ words/dwords where all bytes that aren't least-significant
+ are zero. Endianness and size will match what the directive
+ itself indicated.
+
+
+
+
+ Compound Arguments
+
+ Compound arguments may be built up from simple ones, using the
+ standard +, -, *, and / operators, which carry the usual
+ precedence. Also, the unary operators > and <, which
+ bind more tightly than anything else, provide the high and low
+ bytes of 16-bit values, respectively.
+
+
+ Use brackets [ ] instead of parentheses ( ) when grouping
+ arithmetic operations, as the parentheses are needed for the
+ indirect addressing modes.
+
+
+ Examples:
+
+
+ $D000 evaluates to $D000
+ $D000+32 evaluates to $D020
+ $D000+$20 also evaluates to $D020
+ <$D000+32 evaluates to $20
+ >$D000+32 evaluates to $F0
+ >[$D000+32] evaluates to $D0
+ >$D000-275 evaluates to $CE
+
+
+
+ Memory Model
+
+ In order to properly compute the locations of labels and the
+ like, Ophis must keep track of where assembled code will
+ actually be sitting in memory, and it strives to do this in a
+ way that is independent both of the target file and of the
+ target machine.
+
+
+ Basic PC tracking
+
+ The primary technique Ophis uses is program counter
+ tracking. As it assembles the code, it keeps
+ track of a virtual program counter, and uses that to
+ determine where the labels should go.
+
+
+ In the absence of an .org directive, it
+ assumes a starting PC of zero. .org
+ is a simple directive, setting the PC to the value
+ that .org specifies. In the simplest
+ case, one .org directive appears at the
+ beginning of the code and sets the location for the rest of
+ the code, which is one contiguous block.
+
+
+
+ Basic Segmentation simulation
+
+ However, this isn't always practical. Often one wishes to
+ have a region of memory reserved for data without actually
+ mapping that memory to the file. On some systems (typically
+ cartridge-based systems where ROM and RAM are seperate, and
+ the target file only specifies the ROM image) this is
+ mandatory. In order to access these variables symbolically,
+ it's necessary to put the values into the label lookup
+ table.
+
+
+ It is possible, but inconvenient, to do this
+ with .alias, assigning a specific
+ memory location to each variable. This requires careful
+ coordination through your code, and makes creating reusable
+ libraries all but impossible.
+
+
+ A better approach is to reserve a section at the beginning
+ or end of your program, put an .org
+ directive in, then use the .space
+ directive to divide up the data area. This is still a bit
+ inconvenient, though, because all variables must be
+ assigned all at once. What we'd really like is to keep
+ multiple PC counters, one for data and one for code.
+
+
+ The .text
+ and .data directives do this. Each
+ has its own PC that starts at zero, and you can switch
+ between the two at any point without corrupting the other's
+ counter. In this way each function can have
+ a .data section (filled
+ with .space commands) and
+ a .text section (that contains the
+ actual code). This lets our library routines be almost
+ completely self-contained - we can have one source file
+ that could be .included by multiple
+ projects without getting in anything's way.
+
+
+ However, any given program may have its own ideas about
+ where data and code go, and it's good to ensure with
+ a .checkpc at the end of your code
+ that you haven't accidentally overwritten code with data or
+ vice versa. If your .data
+ segment did start at zero, it's
+ probably wise to make sure you aren't smashing the stack,
+ too (which is sitting in the region from $0100 to
+ $01FF).
+
+
+ If you write code with no segment-defining statements in
+ it, the default segment
+ is text.
+
+
+ The data segment is designed only
+ for organizing labels. As such, errors will be flagged if
+ you attempt to actually output information into
+ a data segment.
+
+
+
+ General Segmentation Simulation
+
+ One text and data segment each is usually sufficient, but
+ for the cases where it is not, Ophis allows for user-defined
+ segments. Putting a label
+ after .text
+ or .data produces a new segment with
+ the specified name.
+
+
+ Say, for example, that we have access to the RAM at the low
+ end of the address space, but want to reserve the zero page
+ for truly critical variables, and use the rest of RAM for
+ everything else. Let's also assume that this is a 6510
+ chip, and locations $00 and $01 are reserved for the I/O
+ port. We could start our program off with:
+
+
+.data
+.org $200
+.data zp
+.org $2
+.text
+.org $800
+
+
+ And, to be safe, we would probably want to end our code
+ with checks to make sure we aren't overwriting anything:
+
+
+.data
+.checkpc $800
+.data zp
+.checkpc $100
+
+
+
+
+ Macros
+
+ Assembly language is a powerful tool—however, there are
+ many tasks that need to be done repeatedly, and with
+ mind-numbing minor modifications. Ophis includes a facility
+ for macros to allow this. Ophis macros
+ are very similar in form to function calls in higher level
+ languages.
+
+
+ Defining Macros
+
+ Macros are defined with the .macro
+ and .macend commands. Here's a
+ simple one that will clear the screen on a Commodore
+ 64:
+
+
+.macro clr'screen
+ lda #147
+ jsr $FFD2
+.macend
+
+
+
+ Invoking Macros
+
+ To invoke a macro, either use
+ the .invoke command or backquote the
+ name of the routine. The previous macro may be expanded
+ out in either of two ways, at any point in the
+ source:
+
+ .invoke clr'screen
+ or
+ `clr'screen
+ will work equally well.
+
+
+ Passing Arguments to Macros
+
+ Macros may take arguments. The arguments to a macro are
+ all of the word
type, though byte values may
+ be passed and used as bytes as well. The first argument in
+ an invocation is bound to the label
+ _1, the second
+ to _2, and so on. Here's a macro
+ for storing a 16-bit value into a word pointer:
+
+
+.macro store16 ; `store16 dest, src
+ lda #<_2
+ sta _1
+ lda #>_2
+ sta _1+1
+.macend
+
+
+ Macro arguments behave, for the most part, as if they were
+ defined by .alias
+ commands in the calling context.
+ (They differ in that they will not produce duplicate-label
+ errors if those names already exist in the calling scope,
+ and in that they disappear after the call is
+ completed.)
+
+
+
+ Features and Restrictions of the Ophis Macro Model
+
+ Unlike most macro systems (which do textual replacement),
+ Ophis macros evaluate their arguments and bind them into the
+ symbol table as temporary labels. This produces some
+ benefits, but it also puts some restrictions on what kinds of
+ macros may be defined.
+
+
+ The primary benefit of this expand-via-binding
+ discipline is that there are no surprises in the semantics.
+ The expression _1+1 in the macro above
+ will always evaluate to one more than the value that was
+ passed as the first argument, even if that first argument is
+ some immensely complex expression that an
+ expand-via-substitution method may accidentally
+ mangle.
+
+
+ The primary disadvantage of the expand-via-binding
+ discipline is that only fixed numbers of words and bytes
+ may be passed. A substitution-based system could define a
+ macro including the line LDA _1 and
+ accept as arguments both $C000
+ (which would put the value of memory location $C000 into
+ the accumulator) and #$40 (which
+ would put the immediate value $40 into the accumulator).
+ If you really need this kind of
+ behavior, a run a C preprocessor over your Ophis source,
+ and use #define to your heart's
+ content.
+
+
+
+
+ Assembler directives
+
+ Assembler directives are all instructions to the assembler
+ that are not actual instructions. Ophis's set of directives
+ follow.
+
+
+ .advance address:
+ Forces the program counter to
+ be address. Unlike
+ the .org
+ directive, .advance outputs zeroes until the
+ program counter reaches a specified address. Attempting
+ to .advance to a point behind the current
+ program counter is an assemble-time error.
+ .alias label value: The
+ .alias directive assigns an arbitrary value to a label. This
+ value may be an arbitrary argument, but cannot reference any
+ label that has not already been defined (this prevents
+ recursive label dependencies).
+ .byte arg [ , arg, ... ]:
+ Specifies a series of arguments, which are evaluated, and
+ strings, which are included as raw ASCII data. The final
+ results of these arguments must be one byte in size. Seperate
+ constants are seperated by comments.
+ .checkpc address: Ensures that the
+ program counter is less than or equal to the address
+ specified, and emits an assemble-time error if it is not.
+ This produces no code in the final binary - it is there to
+ ensure that linking a large amount of data together does not
+ overstep memory boundaries.
+ .data [label]: Sets the segment to
+ the segment name specified and disallows output. If no label
+ is given, switches to the default data segment.
+ .incbin filename: Inserts the
+ contents of the file specified as binary data. Use it to
+ include graphics information, precompiled code, or other
+ non-assembler data.
+ .include filename: Includes the
+ entirety of the file specified at that point in the program.
+ Use this to order your final sources.
+ .org address: Sets the program
+ counter to the address specified. This does not emit any
+ code in and of itself, nor does it overwrite anything that
+ previously existed. If you wish to jump ahead in memory,
+ use .advance.
+ .require filename: Includes the entirety
+ of the file specified at that point in the program. Unlike .include,
+ however, code included with .require will only be inserted once.
+ The .require directive is useful for ensuring that certain code libraries
+ are somewhere in the final binary. They are also very useful for guaranteeing that
+ macro libraries are available.
+ .space label size: This
+ directive is used to organize global variables. It defines the
+ label specified to be at the current location of the program
+ counter, and then advances the program counter size
+ steps ahead. No actual code is produced. This is equivalent
+ to label: .org ^+size.
+ .text [label]: Sets the segment to
+ the segment name specified and allows output. If no label is
+ given, switches to the default text segment.
+ .word arg [ , arg, ... ]:
+ Like .byte, but values are all treated as two-byte
+ values and stored low-end first (as is the 6502's wont). Use
+ this to create jump tables (an unadorned label will evaluate
+ to that label's location) or otherwise store 16-bit
+ data.
+ .dword arg [ , arg, ...]:
+ Like .word, but for 32-bit values.
+ .wordbe arg [ , arg, ...]:
+ Like .word, but stores the value in a big-endian format (high byte first).
+ .dwordbe arg [ , arg, ...]:
+ Like .dword, but stores the value high byte first.
+ .scope: Starts a new scope block. Labels
+ that begin with an underscore are only reachable from within
+ their innermost enclosing .scope statement.
+ .scend: Ends a scope block. Makes the
+ temporary labels defined since the last .scope
+ statement unreachable, and permits them to be redefined in a
+ new scope.
+ .macro name: Begins a macro
+ definition block. This is a scope block that can be inlined
+ at arbitrary points with .invoke. Arguments to the
+ macro will be bound to temporary labels with names like
+ _1, _2, etc.
+ .macend: Ends a macro definition
+ block.
+ .invoke label [argument [,
+ argument ...]]: invokes (inlines) the specified
+ macro, binding the values of the arguments to the ones the
+ macro definition intends to read. A shorthand for .invoke
+ is the name of the macro to invoke, backquoted.
+
+
+
diff --git a/tests/test65c02.oph b/tests/test65c02.oph
index 84604c2..ebaba8d 100644
--- a/tests/test65c02.oph
+++ b/tests/test65c02.oph
@@ -1,74 +1,74 @@
-; Test file for 65C02 extended opcode compliance
-; This odd little source file uses every addressing mode
-; of every opcode, and uses the opcode itself as the argument
-; to each instruction that takes one. The resulting binary's
-; bytes are thus in strictly increasing numerical order.
-
-; Some opcodes have multiple mnemonics; we provide both.
-
-; This file also doesn't include the 65C02's opcodes that
-; are also available in stock 6502s - see testbase.oph for
-; those.
- TSB $04 ; 04: TSB - Zero Page
- RMB0 $07 ; 07: RMB0 - Zero Page
- TSB $0C0C ; 0C: TSB - Absolute
- BBR0 ^+$11 ; 0F: BBR0 - Relative
- ORA ($12) ; 12: ORA - (Zero Page)
- TRB $14 ; 14: TRB - Zero Page
- RMB1 $17 ; 17: RMB1 - Zero Page
- INA ; 1A: INA - Implied
- INC ; INC - Implied
- TRB $1C1C ; 1C: TRB - Absolute
- BBR1 ^+$21 ; 1F: BBR1 - Relative
- RMB2 $27 ; 27: RMB2 - Zero Page
- BBR2 ^+$31 ; 2F: BBR2 - Relative
- AND ($32) ; 32: AND - (Zero Page)
- BIT $34, X ; 34: BIT - Zero Page, X
- RMB3 $37 ; 37: RMB3 - Zero Page
- DEA ; 3A: DEA - Implied
- DEC ; 3A: DEC - Implied
- BIT $3C3C,X ; 3C: BIT - Absolute, X
- BBR3 ^+$41 ; 3F: BBR3 - Relative
- RMB4 $47 ; 47: RMB4 - Zero Page
- BBR4 ^+$51 ; 4F: BBR4 - Relative
- EOR ($52) ; 52: EOR - (Zero Page)
- RMB5 $57 ; 57: RMB5 - Zero Page
- PHY ; 5A: PHY - Implied
- BBR5 ^+$61 ; 5F: BBR5 - Relative
- STZ $64 ; 64: STZ - Zero Page
- RMB6 $67 ; 67: RMB6 - Zero Page
- BBR6 ^+$71 ; 6F: BBR6 - Relative
- ADC ($72) ; 72: ADC - (Zero Page)
- STZ $74, X ; 74: STZ - Zero Page, X
- RMB7 $77 ; 77: RMB7 - Zero Page
- PLY ; 7A: PLY - Implied
- JMP ($7C7C, X) ; 7C: JMP - (Absolute, X)
- BBR7 ^+$81 ; 7F: BBR7 - Relative
- BRA ^-$7E ; 80: BRA - Relative
- SMB0 $87 ; 87: SMB0 - Zero Page
- BIT #$89 ; 89: BIT - Immediate
- BBS0 ^-$6F ; 8F: BBS0 - Relative
- STA ($92) ; 92: STA - (Zero Page)
- SMB1 $97 ; 97: SMB1 - Zero Page
- STZ $9C9C ; 9C: STZ - Absolute
- STZ $9E9E, X ; 9E: STZ - Absolute, X
- BBS1 ^-$5F ; 9F: BBS1 - Relative
- SMB2 $A7 ; A7: SMB2 - Zero Page
- BBS2 ^-$4F ; AF: BBS2 - Relative
- LDA ($B2) ; B2: LDA - (Zero Page)
- SMB3 $B7 ; B7: SMB3 - Zero Page
- BBS3 ^-$3F ; BF: BBS3 - Relative
- SMB4 $C7 ; C7: SMB4 - Zero Page
- WAI ; CB: WAI - Implied
- BBS4 ^-$2F ; CF: BBS4 - Relative
- CMP ($D2) ; D2: CMP - (Zero Page)
- SMB5 $D7 ; D7: SMB5 - Zero Page
- PHX ; DA: PHX - Implied
- STP ; DB: STP - Implied
- BBS5 ^-$1F ; DF: BBS5 - Relative
- SMB6 $E7 ; E7: SMB6 - Zero Page
- BBS6 ^-$0F ; EF: BBS6 - Relative
- SBC ($F2) ; F2: SBC - (Zero Page)
- SMB7 $F7 ; F7: SMB7 - Zero Page
- PLX ; FA: PLX - Implied
- BBS7 ^+$01 ; FF: BBS7 - Relative
+; Test file for 65C02 extended opcode compliance
+; This odd little source file uses every addressing mode
+; of every opcode, and uses the opcode itself as the argument
+; to each instruction that takes one. The resulting binary's
+; bytes are thus in strictly increasing numerical order.
+
+; Some opcodes have multiple mnemonics; we provide both.
+
+; This file also doesn't include the 65C02's opcodes that
+; are also available in stock 6502s - see testbase.oph for
+; those.
+ TSB $04 ; 04: TSB - Zero Page
+ RMB0 $07 ; 07: RMB0 - Zero Page
+ TSB $0C0C ; 0C: TSB - Absolute
+ BBR0 ^+$11 ; 0F: BBR0 - Relative
+ ORA ($12) ; 12: ORA - (Zero Page)
+ TRB $14 ; 14: TRB - Zero Page
+ RMB1 $17 ; 17: RMB1 - Zero Page
+ INA ; 1A: INA - Implied
+ INC ; INC - Implied
+ TRB $1C1C ; 1C: TRB - Absolute
+ BBR1 ^+$21 ; 1F: BBR1 - Relative
+ RMB2 $27 ; 27: RMB2 - Zero Page
+ BBR2 ^+$31 ; 2F: BBR2 - Relative
+ AND ($32) ; 32: AND - (Zero Page)
+ BIT $34, X ; 34: BIT - Zero Page, X
+ RMB3 $37 ; 37: RMB3 - Zero Page
+ DEA ; 3A: DEA - Implied
+ DEC ; 3A: DEC - Implied
+ BIT $3C3C,X ; 3C: BIT - Absolute, X
+ BBR3 ^+$41 ; 3F: BBR3 - Relative
+ RMB4 $47 ; 47: RMB4 - Zero Page
+ BBR4 ^+$51 ; 4F: BBR4 - Relative
+ EOR ($52) ; 52: EOR - (Zero Page)
+ RMB5 $57 ; 57: RMB5 - Zero Page
+ PHY ; 5A: PHY - Implied
+ BBR5 ^+$61 ; 5F: BBR5 - Relative
+ STZ $64 ; 64: STZ - Zero Page
+ RMB6 $67 ; 67: RMB6 - Zero Page
+ BBR6 ^+$71 ; 6F: BBR6 - Relative
+ ADC ($72) ; 72: ADC - (Zero Page)
+ STZ $74, X ; 74: STZ - Zero Page, X
+ RMB7 $77 ; 77: RMB7 - Zero Page
+ PLY ; 7A: PLY - Implied
+ JMP ($7C7C, X) ; 7C: JMP - (Absolute, X)
+ BBR7 ^+$81 ; 7F: BBR7 - Relative
+ BRA ^-$7E ; 80: BRA - Relative
+ SMB0 $87 ; 87: SMB0 - Zero Page
+ BIT #$89 ; 89: BIT - Immediate
+ BBS0 ^-$6F ; 8F: BBS0 - Relative
+ STA ($92) ; 92: STA - (Zero Page)
+ SMB1 $97 ; 97: SMB1 - Zero Page
+ STZ $9C9C ; 9C: STZ - Absolute
+ STZ $9E9E, X ; 9E: STZ - Absolute, X
+ BBS1 ^-$5F ; 9F: BBS1 - Relative
+ SMB2 $A7 ; A7: SMB2 - Zero Page
+ BBS2 ^-$4F ; AF: BBS2 - Relative
+ LDA ($B2) ; B2: LDA - (Zero Page)
+ SMB3 $B7 ; B7: SMB3 - Zero Page
+ BBS3 ^-$3F ; BF: BBS3 - Relative
+ SMB4 $C7 ; C7: SMB4 - Zero Page
+ WAI ; CB: WAI - Implied
+ BBS4 ^-$2F ; CF: BBS4 - Relative
+ CMP ($D2) ; D2: CMP - (Zero Page)
+ SMB5 $D7 ; D7: SMB5 - Zero Page
+ PHX ; DA: PHX - Implied
+ STP ; DB: STP - Implied
+ BBS5 ^-$1F ; DF: BBS5 - Relative
+ SMB6 $E7 ; E7: SMB6 - Zero Page
+ BBS6 ^-$0F ; EF: BBS6 - Relative
+ SBC ($F2) ; F2: SBC - (Zero Page)
+ SMB7 $F7 ; F7: SMB7 - Zero Page
+ PLX ; FA: PLX - Implied
+ BBS7 ^+$01 ; FF: BBS7 - Relative
diff --git a/tests/testdata.oph b/tests/testdata.oph
index f860bb7..0727b6e 100644
--- a/tests/testdata.oph
+++ b/tests/testdata.oph
@@ -1,7 +1,7 @@
-; This data file just dumps out $00-$0F repeatedly with different forms.
-
-.byte 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
-.word 256, $0302, $0504, $0706, $0908, $0b0a, $0d0c, $0f0e
-.dword $03020100, $07060504, $0b0a0908, $0f0e0d0c
-.wordbe 1, $0203, $0405, $0607, $0809, $0a0b, $0c0d, $0e0f
-.dwordbe $010203, $04050607, $08090a0b, $0c0d0e0f
+; This data file just dumps out $00-$0F repeatedly with different forms.
+
+.byte 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
+.word 256, $0302, $0504, $0706, $0908, $0b0a, $0d0c, $0f0e
+.dword $03020100, $07060504, $0b0a0908, $0f0e0d0c
+.wordbe 1, $0203, $0405, $0607, $0809, $0a0b, $0c0d, $0e0f
+.dwordbe $010203, $04050607, $08090a0b, $0c0d0e0f
diff --git a/tools/opcodes/op6502.txt b/tools/opcodes/op6502.txt
index 5f9c2a5..9e3e8c5 100644
--- a/tools/opcodes/op6502.txt
+++ b/tools/opcodes/op6502.txt
@@ -1,256 +1,256 @@
- 00: BRK - Implied
- 01: ORA - (Zero Page, X)
- 02:
- 03:
- 04:
- 05: ORA - Zero Page
- 06: ASL - Zero Page
- 07:
- 08: PHP - Implied
- 09: ORA - Immediate
- 0A: ASL - Implied
- 0B:
- 0C:
- 0D: ORA - Absolute
- 0E: ASL - Absolute
- 0F:
- 10: BPL - Relative
- 11: ORA - (Zero Page), Y
- 12:
- 13:
- 14:
- 15: ORA - Zero Page, X
- 16: ASL - Zero Page, X
- 17:
- 18: CLC - Implied
- 19: ORA - Absolute, Y
- 1A:
- 1B:
- 1C:
- 1D: ORA - Absolute, X
- 1E: ASL - Absolute, X
- 1F:
- 20: JSR - Absolute
- 21: AND - (Zero Page, X)
- 22:
- 23:
- 24: BIT - Zero Page
- 25: AND - Zero Page
- 26: ROL - Zero Page
- 27:
- 28: PLP - Implied
- 29: AND - Immediate
- 2A: ROL - Implied
- 2B:
- 2C: BIT - Absolute
- 2D: AND - Absolute
- 2E: ROL - Absolute
- 2F:
- 30: BMI - Relative
- 31: AND - (Zero Page), Y
- 32:
- 33:
- 34:
- 35: AND - Zero Page, X
- 36: ROL - Zero Page, X
- 37:
- 38: SEC - Implied
- 39: AND - Absolute, Y
- 3A:
- 3B:
- 3C:
- 3D: AND - Absolute, X
- 3E: ROL - Absolute, X
- 3F:
- 40: RTI - Implied
- 41: EOR - (Zero Page, X)
- 42:
- 43:
- 44:
- 45: EOR - Zero Page
- 46: LSR - Zero Page
- 47:
- 48: PHA - Implied
- 49: EOR - Immediate
- 4A: LSR - Implied
- 4B:
- 4C: JMP - Absolute
- 4D: EOR - Absolute
- 4E: LSR - Absolute
- 4F:
- 50: BVC - Relative
- 51: EOR - (Zero Page), Y
- 52:
- 53:
- 54:
- 55: EOR - Zero Page, X
- 56: LSR - Zero Page, X
- 57:
- 58: CLI - Implied
- 59: EOR - Absolute, Y
- 5A:
- 5B:
- 5C:
- 5D: EOR - Absolute, X
- 5E: LSR - Absolute, X
- 5F:
- 60: RTS - Implied
- 61: ADC - (Zero Page, X)
- 62:
- 63:
- 64:
- 65: ADC - Zero Page
- 66: ROR - Zero Page
- 67:
- 68: PLA - Implied
- 69: ADC - Immediate
- 6A: ROR - Implied
- 6B:
- 6C: JMP - (Absolute)
- 6D: ADC - Absolute
- 6E: ROR - Absolute
- 6F:
- 70: BVS - Relative
- 71: ADC - (Zero Page), Y
- 72:
- 73:
- 74:
- 75: ADC - Zero Page, X
- 76: ROR - Zero Page, X
- 77:
- 78: SEI - Implied
- 79: ADC - Absolute, Y
- 7A:
- 7B:
- 7C:
- 7D: ADC - Absolute, X
- 7E: ROR - Absolute, X
- 7F:
- 80:
- 81: STA - (Zero Page, X)
- 82:
- 83:
- 84: STY - Zero Page
- 85: STA - Zero Page
- 86: STX - Zero Page
- 87:
- 88: DEY - Implied
- 89:
- 8A: TXA - Implied
- 8B:
- 8C: STY - Absolute
- 8D: STA - Absolute
- 8E: STX - Absolute
- 8F:
- 90: BCC - Relative
- 91: STA - (Zero Page), Y
- 92:
- 93:
- 94: STY - Zero Page, X
- 95: STA - Zero Page, X
- 96: STX - Zero Page, Y
- 97:
- 98: TYA - Implied
- 99: STA - Absolute, Y
- 9A: TXS - Implied
- 9B:
- 9C:
- 9D: STA - Absolute, X
- 9E:
- 9F:
- A0: LDY - Immediate
- A1: LDA - (Zero Page, X)
- A2: LDX - Immediate
- A3:
- A4: LDY - Zero Page
- A5: LDA - Zero Page
- A6: LDX - Zero Page
- A7:
- A8: TAY - Implied
- A9: LDA - Immediate
- AA: TAX - Implied
- AB:
- AC: LDY - Absolute
- AD: LDA - Absolute
- AE: LDX - Absolute
- AF:
- B0: BCS - Relative
- B1: LDA - (Zero Page), Y
- B2:
- B3:
- B4: LDY - Zero Page, X
- B5: LDA - Zero Page, X
- B6: LDX - Zero Page, Y
- B7:
- B8: CLV - Implied
- B9: LDA - Absolute, Y
- BA: TSX - Implied
- BB:
- BC: LDY - Absolute, X
- BD: LDA - Absolute, X
- BE: LDX - Absolute, Y
- BF:
- C0: CPY - Immediate
- C1: CMP - (Zero Page, X)
- C2:
- C3:
- C4: CPY - Zero Page
- C5: CMP - Zero Page
- C6: DEC - Zero Page
- C7:
- C8: INY - Implied
- C9: CMP - Immediate
- CA: DEX - Implied
- CB:
- CC: CPY - Absolute
- CD: CMP - Absolute
- CE: DEC - Absolute
- CF:
- D0: BNE - Relative
- D1: CMP - (Zero Page), Y
- D2:
- D3:
- D4:
- D5: CMP - Zero Page, X
- D6: DEC - Zero Page, X
- D7:
- D8: CLD - Implied
- D9: CMP - Absolute, Y
- DA:
- DB:
- DC:
- DD: CMP - Absolute, X
- DE: DEC - Absolute, X
- DF:
- E0: CPX - Immediate
- E1: SBC - (Zero Page, X)
- E2:
- E3:
- E4: CPX - Zero Page
- E5: SBC - Zero Page
- E6: INC - Zero Page
- E7:
- E8: INX - Implied
- E9: SBC - Immediate
- EA: NOP - Implied
- EB:
- EC: CPX - Absolute
- ED: SBC - Absolute
- EE: INC - Absolute
- EF:
- F0: BEQ - Relative
- F1: SBC - (Zero Page), Y
- F2:
- F3:
- F4:
- F5: SBC - Zero Page, X
- F6: INC - Zero Page, X
- F7:
- F8: SED - Implied
- F9: SBC - Absolute, Y
- FA:
- FB:
- FC:
- FD: SBC - Absolute, X
- FE: INC - Absolute, X
- FF:
+ 00: BRK - Implied
+ 01: ORA - (Zero Page, X)
+ 02:
+ 03:
+ 04:
+ 05: ORA - Zero Page
+ 06: ASL - Zero Page
+ 07:
+ 08: PHP - Implied
+ 09: ORA - Immediate
+ 0A: ASL - Implied
+ 0B:
+ 0C:
+ 0D: ORA - Absolute
+ 0E: ASL - Absolute
+ 0F:
+ 10: BPL - Relative
+ 11: ORA - (Zero Page), Y
+ 12:
+ 13:
+ 14:
+ 15: ORA - Zero Page, X
+ 16: ASL - Zero Page, X
+ 17:
+ 18: CLC - Implied
+ 19: ORA - Absolute, Y
+ 1A:
+ 1B:
+ 1C:
+ 1D: ORA - Absolute, X
+ 1E: ASL - Absolute, X
+ 1F:
+ 20: JSR - Absolute
+ 21: AND - (Zero Page, X)
+ 22:
+ 23:
+ 24: BIT - Zero Page
+ 25: AND - Zero Page
+ 26: ROL - Zero Page
+ 27:
+ 28: PLP - Implied
+ 29: AND - Immediate
+ 2A: ROL - Implied
+ 2B:
+ 2C: BIT - Absolute
+ 2D: AND - Absolute
+ 2E: ROL - Absolute
+ 2F:
+ 30: BMI - Relative
+ 31: AND - (Zero Page), Y
+ 32:
+ 33:
+ 34:
+ 35: AND - Zero Page, X
+ 36: ROL - Zero Page, X
+ 37:
+ 38: SEC - Implied
+ 39: AND - Absolute, Y
+ 3A:
+ 3B:
+ 3C:
+ 3D: AND - Absolute, X
+ 3E: ROL - Absolute, X
+ 3F:
+ 40: RTI - Implied
+ 41: EOR - (Zero Page, X)
+ 42:
+ 43:
+ 44:
+ 45: EOR - Zero Page
+ 46: LSR - Zero Page
+ 47:
+ 48: PHA - Implied
+ 49: EOR - Immediate
+ 4A: LSR - Implied
+ 4B:
+ 4C: JMP - Absolute
+ 4D: EOR - Absolute
+ 4E: LSR - Absolute
+ 4F:
+ 50: BVC - Relative
+ 51: EOR - (Zero Page), Y
+ 52:
+ 53:
+ 54:
+ 55: EOR - Zero Page, X
+ 56: LSR - Zero Page, X
+ 57:
+ 58: CLI - Implied
+ 59: EOR - Absolute, Y
+ 5A:
+ 5B:
+ 5C:
+ 5D: EOR - Absolute, X
+ 5E: LSR - Absolute, X
+ 5F:
+ 60: RTS - Implied
+ 61: ADC - (Zero Page, X)
+ 62:
+ 63:
+ 64:
+ 65: ADC - Zero Page
+ 66: ROR - Zero Page
+ 67:
+ 68: PLA - Implied
+ 69: ADC - Immediate
+ 6A: ROR - Implied
+ 6B:
+ 6C: JMP - (Absolute)
+ 6D: ADC - Absolute
+ 6E: ROR - Absolute
+ 6F:
+ 70: BVS - Relative
+ 71: ADC - (Zero Page), Y
+ 72:
+ 73:
+ 74:
+ 75: ADC - Zero Page, X
+ 76: ROR - Zero Page, X
+ 77:
+ 78: SEI - Implied
+ 79: ADC - Absolute, Y
+ 7A:
+ 7B:
+ 7C:
+ 7D: ADC - Absolute, X
+ 7E: ROR - Absolute, X
+ 7F:
+ 80:
+ 81: STA - (Zero Page, X)
+ 82:
+ 83:
+ 84: STY - Zero Page
+ 85: STA - Zero Page
+ 86: STX - Zero Page
+ 87:
+ 88: DEY - Implied
+ 89:
+ 8A: TXA - Implied
+ 8B:
+ 8C: STY - Absolute
+ 8D: STA - Absolute
+ 8E: STX - Absolute
+ 8F:
+ 90: BCC - Relative
+ 91: STA - (Zero Page), Y
+ 92:
+ 93:
+ 94: STY - Zero Page, X
+ 95: STA - Zero Page, X
+ 96: STX - Zero Page, Y
+ 97:
+ 98: TYA - Implied
+ 99: STA - Absolute, Y
+ 9A: TXS - Implied
+ 9B:
+ 9C:
+ 9D: STA - Absolute, X
+ 9E:
+ 9F:
+ A0: LDY - Immediate
+ A1: LDA - (Zero Page, X)
+ A2: LDX - Immediate
+ A3:
+ A4: LDY - Zero Page
+ A5: LDA - Zero Page
+ A6: LDX - Zero Page
+ A7:
+ A8: TAY - Implied
+ A9: LDA - Immediate
+ AA: TAX - Implied
+ AB:
+ AC: LDY - Absolute
+ AD: LDA - Absolute
+ AE: LDX - Absolute
+ AF:
+ B0: BCS - Relative
+ B1: LDA - (Zero Page), Y
+ B2:
+ B3:
+ B4: LDY - Zero Page, X
+ B5: LDA - Zero Page, X
+ B6: LDX - Zero Page, Y
+ B7:
+ B8: CLV - Implied
+ B9: LDA - Absolute, Y
+ BA: TSX - Implied
+ BB:
+ BC: LDY - Absolute, X
+ BD: LDA - Absolute, X
+ BE: LDX - Absolute, Y
+ BF:
+ C0: CPY - Immediate
+ C1: CMP - (Zero Page, X)
+ C2:
+ C3:
+ C4: CPY - Zero Page
+ C5: CMP - Zero Page
+ C6: DEC - Zero Page
+ C7:
+ C8: INY - Implied
+ C9: CMP - Immediate
+ CA: DEX - Implied
+ CB:
+ CC: CPY - Absolute
+ CD: CMP - Absolute
+ CE: DEC - Absolute
+ CF:
+ D0: BNE - Relative
+ D1: CMP - (Zero Page), Y
+ D2:
+ D3:
+ D4:
+ D5: CMP - Zero Page, X
+ D6: DEC - Zero Page, X
+ D7:
+ D8: CLD - Implied
+ D9: CMP - Absolute, Y
+ DA:
+ DB:
+ DC:
+ DD: CMP - Absolute, X
+ DE: DEC - Absolute, X
+ DF:
+ E0: CPX - Immediate
+ E1: SBC - (Zero Page, X)
+ E2:
+ E3:
+ E4: CPX - Zero Page
+ E5: SBC - Zero Page
+ E6: INC - Zero Page
+ E7:
+ E8: INX - Implied
+ E9: SBC - Immediate
+ EA: NOP - Implied
+ EB:
+ EC: CPX - Absolute
+ ED: SBC - Absolute
+ EE: INC - Absolute
+ EF:
+ F0: BEQ - Relative
+ F1: SBC - (Zero Page), Y
+ F2:
+ F3:
+ F4:
+ F5: SBC - Zero Page, X
+ F6: INC - Zero Page, X
+ F7:
+ F8: SED - Implied
+ F9: SBC - Absolute, Y
+ FA:
+ FB:
+ FC:
+ FD: SBC - Absolute, X
+ FE: INC - Absolute, X
+ FF:
diff --git a/tools/opcodes/op65c02.txt b/tools/opcodes/op65c02.txt
index a672a2e..ebe8c94 100644
--- a/tools/opcodes/op65c02.txt
+++ b/tools/opcodes/op65c02.txt
@@ -1,256 +1,256 @@
- 00: BRK - Implied
- 01: ORA - (Zero Page, X)
- 02:
- 03:
- 04: TSB - Zero Page
- 05: ORA - Zero Page
- 06: ASL - Zero Page
- 07: RMB0 - Zero Page
- 08: PHP - Implied
- 09: ORA - Immediate
- 0A: ASL - Implied
- 0B:
- 0C: TSB - Absolute
- 0D: ORA - Absolute
- 0E: ASL - Absolute
- 0F: BBR0 - Relative
- 10: BPL - Relative
- 11: ORA - (Zero Page), Y
- 12: ORA - (Zero Page)
- 13:
- 14: TRB - Zero Page
- 15: ORA - Zero Page, X
- 16: ASL - Zero Page, X
- 17: RMB1 - Zero Page
- 18: CLC - Implied
- 19: ORA - Absolute, Y
- 1A: INA - Implied; INC - Implied
- 1B:
- 1C: TRB - Absolute
- 1D: ORA - Absolute, X
- 1E: ASL - Absolute, X
- 1F: BBR1 - Relative
- 20: JSR - Absolute
- 21: AND - (Zero Page, X)
- 22:
- 23:
- 24: BIT - Zero Page
- 25: AND - Zero Page
- 26: ROL - Zero Page
- 27: RMB2 - Zero Page
- 28: PLP - Implied
- 29: AND - Immediate
- 2A: ROL - Implied
- 2B:
- 2C: BIT - Absolute
- 2D: AND - Absolute
- 2E: ROL - Absolute
- 2F: BBR2 - Relative
- 30: BMI - Relative
- 31: AND - (Zero Page), Y
- 32: AND - (Zero Page)
- 33:
- 34: BIT - Zero Page, X
- 35: AND - Zero Page, X
- 36: ROL - Zero Page, X
- 37: RMB3 - Zero Page
- 38: SEC - Implied
- 39: AND - Absolute, Y
- 3A: DEA - Implied; DEC - Implied
- 3B:
- 3C: BIT - Absolute, X
- 3D: AND - Absolute, X
- 3E: ROL - Absolute, X
- 3F: BBR3 - Relative
- 40: RTI - Implied
- 41: EOR - (Zero Page, X)
- 42:
- 43:
- 44:
- 45: EOR - Zero Page
- 46: LSR - Zero Page
- 47: RMB4 - Zero Page
- 48: PHA - Implied
- 49: EOR - Immediate
- 4A: LSR - Implied
- 4B:
- 4C: JMP - Absolute
- 4D: EOR - Absolute
- 4E: LSR - Absolute
- 4F: BBR4 - Relative
- 50: BVC - Relative
- 51: EOR - (Zero Page), Y
- 52: EOR - (Zero Page)
- 53:
- 54:
- 55: EOR - Zero Page, X
- 56: LSR - Zero Page, X
- 57: RMB5 - Zero Page
- 58: CLI - Implied
- 59: EOR - Absolute, Y
- 5A: PHY - Implied
- 5B:
- 5C:
- 5D: EOR - Absolute, X
- 5E: LSR - Absolute, X
- 5F: BBR5 - Relative
- 60: RTS - Implied
- 61: ADC - (Zero Page, X)
- 62:
- 63:
- 64: STZ - Zero Page
- 65: ADC - Zero Page
- 66: ROR - Zero Page
- 67: RMB6 - Zero Page
- 68: PLA - Implied
- 69: ADC - Immediate
- 6A: ROR - Implied
- 6B:
- 6C: JMP - (Absolute)
- 6D: ADC - Absolute
- 6E: ROR - Absolute
- 6F: BBR6 - Relative
- 70: BVS - Relative
- 71: ADC - (Zero Page), Y
- 72: ADC - (Zero Page)
- 73:
- 74: STZ - Zero Page, X
- 75: ADC - Zero Page, X
- 76: ROR - Zero Page, X
- 77: RMB7 - Zero Page
- 78: SEI - Implied
- 79: ADC - Absolute, Y
- 7A: PLY - Implied
- 7B:
- 7C: JMP - (Absolute, X)
- 7D: ADC - Absolute, X
- 7E: ROR - Absolute, X
- 7F: BBR7 - Relative
- 80: BRA - Relative
- 81: STA - (Zero Page, X)
- 82:
- 83:
- 84: STY - Zero Page
- 85: STA - Zero Page
- 86: STX - Zero Page
- 87: SMB0 - Zero Page
- 88: DEY - Implied
- 89: BIT - Immediate
- 8A: TXA - Implied
- 8B:
- 8C: STY - Absolute
- 8D: STA - Absolute
- 8E: STX - Absolute
- 8F: BBS0 - Relative
- 90: BCC - Relative
- 91: STA - (Zero Page), Y
- 92: STA - (Zero Page)
- 93:
- 94: STY - Zero Page, X
- 95: STA - Zero Page, X
- 96: STX - Zero Page, Y
- 97: SMB1 - Zero Page
- 98: TYA - Implied
- 99: STA - Absolute, Y
- 9A: TXS - Implied
- 9B:
- 9C: STZ - Absolute
- 9D: STA - Absolute, X
- 9E: STZ - Absolute, X
- 9F: BBS1 - Relative
- A0: LDY - Immediate
- A1: LDA - (Zero Page, X)
- A2: LDX - Immediate
- A3:
- A4: LDY - Zero Page
- A5: LDA - Zero Page
- A6: LDX - Zero Page
- A7: SMB2 - Zero Page
- A8: TAY - Implied
- A9: LDA - Immediate
- AA: TAX - Implied
- AB:
- AC: LDY - Absolute
- AD: LDA - Absolute
- AE: LDX - Absolute
- AF: BBS2 - Relative
- B0: BCS - Relative
- B1: LDA - (Zero Page), Y
- B2: LDA - (Zero Page)
- B3:
- B4: LDY - Zero Page, X
- B5: LDA - Zero Page, X
- B6: LDX - Zero Page, Y
- B7: SMB3 - Zero Page
- B8: CLV - Implied
- B9: LDA - Absolute, Y
- BA: TSX - Implied
- BB:
- BC: LDY - Absolute, X
- BD: LDA - Absolute, X
- BE: LDX - Absolute, Y
- BF: BBS3 - Relative
- C0: CPY - Immediate
- C1: CMP - (Zero Page, X)
- C2:
- C3:
- C4: CPY - Zero Page
- C5: CMP - Zero Page
- C6: DEC - Zero Page
- C7: SMB4 - Zero Page
- C8: INY - Implied
- C9: CMP - Immediate
- CA: DEX - Implied
- CB: WAI - Implied
- CC: CPY - Absolute
- CD: CMP - Absolute
- CE: DEC - Absolute
- CF: BBS4 - Relative
- D0: BNE - Relative
- D1: CMP - (Zero Page), Y
- D2: CMP - (Zero Page)
- D3:
- D4:
- D5: CMP - Zero Page, X
- D6: DEC - Zero Page, X
- D7: SMB5 - Zero Page
- D8: CLD - Implied
- D9: CMP - Absolute, Y
- DA: PHX - Implied
- DB: STP - Implied
- DC:
- DD: CMP - Absolute, X
- DE: DEC - Absolute, X
- DF: BBS5 - Relative
- E0: CPX - Immediate
- E1: SBC - (Zero Page, X)
- E2:
- E3:
- E4: CPX - Zero Page
- E5: SBC - Zero Page
- E6: INC - Zero Page
- E7: SMB6 - Zero Page
- E8: INX - Implied
- E9: SBC - Immediate
- EA: NOP - Implied
- EB:
- EC: CPX - Absolute
- ED: SBC - Absolute
- EE: INC - Absolute
- EF: BBS6 - Relative
- F0: BEQ - Relative
- F1: SBC - (Zero Page), Y
- F2: SBC - (Zero Page)
- F3:
- F4:
- F5: SBC - Zero Page, X
- F6: INC - Zero Page, X
- F7: SMB7 - Zero Page
- F8: SED - Implied
- F9: SBC - Absolute, Y
- FA: PLX - Implied
- FB:
- FC:
- FD: SBC - Absolute, X
- FE: INC - Absolute, X
- FF: BBS7 - Relative
+ 00: BRK - Implied
+ 01: ORA - (Zero Page, X)
+ 02:
+ 03:
+ 04: TSB - Zero Page
+ 05: ORA - Zero Page
+ 06: ASL - Zero Page
+ 07: RMB0 - Zero Page
+ 08: PHP - Implied
+ 09: ORA - Immediate
+ 0A: ASL - Implied
+ 0B:
+ 0C: TSB - Absolute
+ 0D: ORA - Absolute
+ 0E: ASL - Absolute
+ 0F: BBR0 - Relative
+ 10: BPL - Relative
+ 11: ORA - (Zero Page), Y
+ 12: ORA - (Zero Page)
+ 13:
+ 14: TRB - Zero Page
+ 15: ORA - Zero Page, X
+ 16: ASL - Zero Page, X
+ 17: RMB1 - Zero Page
+ 18: CLC - Implied
+ 19: ORA - Absolute, Y
+ 1A: INA - Implied; INC - Implied
+ 1B:
+ 1C: TRB - Absolute
+ 1D: ORA - Absolute, X
+ 1E: ASL - Absolute, X
+ 1F: BBR1 - Relative
+ 20: JSR - Absolute
+ 21: AND - (Zero Page, X)
+ 22:
+ 23:
+ 24: BIT - Zero Page
+ 25: AND - Zero Page
+ 26: ROL - Zero Page
+ 27: RMB2 - Zero Page
+ 28: PLP - Implied
+ 29: AND - Immediate
+ 2A: ROL - Implied
+ 2B:
+ 2C: BIT - Absolute
+ 2D: AND - Absolute
+ 2E: ROL - Absolute
+ 2F: BBR2 - Relative
+ 30: BMI - Relative
+ 31: AND - (Zero Page), Y
+ 32: AND - (Zero Page)
+ 33:
+ 34: BIT - Zero Page, X
+ 35: AND - Zero Page, X
+ 36: ROL - Zero Page, X
+ 37: RMB3 - Zero Page
+ 38: SEC - Implied
+ 39: AND - Absolute, Y
+ 3A: DEA - Implied; DEC - Implied
+ 3B:
+ 3C: BIT - Absolute, X
+ 3D: AND - Absolute, X
+ 3E: ROL - Absolute, X
+ 3F: BBR3 - Relative
+ 40: RTI - Implied
+ 41: EOR - (Zero Page, X)
+ 42:
+ 43:
+ 44:
+ 45: EOR - Zero Page
+ 46: LSR - Zero Page
+ 47: RMB4 - Zero Page
+ 48: PHA - Implied
+ 49: EOR - Immediate
+ 4A: LSR - Implied
+ 4B:
+ 4C: JMP - Absolute
+ 4D: EOR - Absolute
+ 4E: LSR - Absolute
+ 4F: BBR4 - Relative
+ 50: BVC - Relative
+ 51: EOR - (Zero Page), Y
+ 52: EOR - (Zero Page)
+ 53:
+ 54:
+ 55: EOR - Zero Page, X
+ 56: LSR - Zero Page, X
+ 57: RMB5 - Zero Page
+ 58: CLI - Implied
+ 59: EOR - Absolute, Y
+ 5A: PHY - Implied
+ 5B:
+ 5C:
+ 5D: EOR - Absolute, X
+ 5E: LSR - Absolute, X
+ 5F: BBR5 - Relative
+ 60: RTS - Implied
+ 61: ADC - (Zero Page, X)
+ 62:
+ 63:
+ 64: STZ - Zero Page
+ 65: ADC - Zero Page
+ 66: ROR - Zero Page
+ 67: RMB6 - Zero Page
+ 68: PLA - Implied
+ 69: ADC - Immediate
+ 6A: ROR - Implied
+ 6B:
+ 6C: JMP - (Absolute)
+ 6D: ADC - Absolute
+ 6E: ROR - Absolute
+ 6F: BBR6 - Relative
+ 70: BVS - Relative
+ 71: ADC - (Zero Page), Y
+ 72: ADC - (Zero Page)
+ 73:
+ 74: STZ - Zero Page, X
+ 75: ADC - Zero Page, X
+ 76: ROR - Zero Page, X
+ 77: RMB7 - Zero Page
+ 78: SEI - Implied
+ 79: ADC - Absolute, Y
+ 7A: PLY - Implied
+ 7B:
+ 7C: JMP - (Absolute, X)
+ 7D: ADC - Absolute, X
+ 7E: ROR - Absolute, X
+ 7F: BBR7 - Relative
+ 80: BRA - Relative
+ 81: STA - (Zero Page, X)
+ 82:
+ 83:
+ 84: STY - Zero Page
+ 85: STA - Zero Page
+ 86: STX - Zero Page
+ 87: SMB0 - Zero Page
+ 88: DEY - Implied
+ 89: BIT - Immediate
+ 8A: TXA - Implied
+ 8B:
+ 8C: STY - Absolute
+ 8D: STA - Absolute
+ 8E: STX - Absolute
+ 8F: BBS0 - Relative
+ 90: BCC - Relative
+ 91: STA - (Zero Page), Y
+ 92: STA - (Zero Page)
+ 93:
+ 94: STY - Zero Page, X
+ 95: STA - Zero Page, X
+ 96: STX - Zero Page, Y
+ 97: SMB1 - Zero Page
+ 98: TYA - Implied
+ 99: STA - Absolute, Y
+ 9A: TXS - Implied
+ 9B:
+ 9C: STZ - Absolute
+ 9D: STA - Absolute, X
+ 9E: STZ - Absolute, X
+ 9F: BBS1 - Relative
+ A0: LDY - Immediate
+ A1: LDA - (Zero Page, X)
+ A2: LDX - Immediate
+ A3:
+ A4: LDY - Zero Page
+ A5: LDA - Zero Page
+ A6: LDX - Zero Page
+ A7: SMB2 - Zero Page
+ A8: TAY - Implied
+ A9: LDA - Immediate
+ AA: TAX - Implied
+ AB:
+ AC: LDY - Absolute
+ AD: LDA - Absolute
+ AE: LDX - Absolute
+ AF: BBS2 - Relative
+ B0: BCS - Relative
+ B1: LDA - (Zero Page), Y
+ B2: LDA - (Zero Page)
+ B3:
+ B4: LDY - Zero Page, X
+ B5: LDA - Zero Page, X
+ B6: LDX - Zero Page, Y
+ B7: SMB3 - Zero Page
+ B8: CLV - Implied
+ B9: LDA - Absolute, Y
+ BA: TSX - Implied
+ BB:
+ BC: LDY - Absolute, X
+ BD: LDA - Absolute, X
+ BE: LDX - Absolute, Y
+ BF: BBS3 - Relative
+ C0: CPY - Immediate
+ C1: CMP - (Zero Page, X)
+ C2:
+ C3:
+ C4: CPY - Zero Page
+ C5: CMP - Zero Page
+ C6: DEC - Zero Page
+ C7: SMB4 - Zero Page
+ C8: INY - Implied
+ C9: CMP - Immediate
+ CA: DEX - Implied
+ CB: WAI - Implied
+ CC: CPY - Absolute
+ CD: CMP - Absolute
+ CE: DEC - Absolute
+ CF: BBS4 - Relative
+ D0: BNE - Relative
+ D1: CMP - (Zero Page), Y
+ D2: CMP - (Zero Page)
+ D3:
+ D4:
+ D5: CMP - Zero Page, X
+ D6: DEC - Zero Page, X
+ D7: SMB5 - Zero Page
+ D8: CLD - Implied
+ D9: CMP - Absolute, Y
+ DA: PHX - Implied
+ DB: STP - Implied
+ DC:
+ DD: CMP - Absolute, X
+ DE: DEC - Absolute, X
+ DF: BBS5 - Relative
+ E0: CPX - Immediate
+ E1: SBC - (Zero Page, X)
+ E2:
+ E3:
+ E4: CPX - Zero Page
+ E5: SBC - Zero Page
+ E6: INC - Zero Page
+ E7: SMB6 - Zero Page
+ E8: INX - Implied
+ E9: SBC - Immediate
+ EA: NOP - Implied
+ EB:
+ EC: CPX - Absolute
+ ED: SBC - Absolute
+ EE: INC - Absolute
+ EF: BBS6 - Relative
+ F0: BEQ - Relative
+ F1: SBC - (Zero Page), Y
+ F2: SBC - (Zero Page)
+ F3:
+ F4:
+ F5: SBC - Zero Page, X
+ F6: INC - Zero Page, X
+ F7: SMB7 - Zero Page
+ F8: SED - Implied
+ F9: SBC - Absolute, Y
+ FA: PLX - Implied
+ FB:
+ FC:
+ FD: SBC - Absolute, X
+ FE: INC - Absolute, X
+ FF: BBS7 - Relative