--- /dev/null
+; smc.mac\r
+; ca65 Macro-Pack for Self Modifying Code (SMC)\r
+;\r
+; (c) Christian Krüger, latest change: 09-Nov-2011\r
+;\r
+; This software is provided 'as-is', without any expressed or implied\r
+; warranty. In no event will the authors be held liable for any damages\r
+; arising from the use of this software.\r
+;\r
+; Permission is granted to anyone to use this software for any purpose,\r
+; including commercial applications, and to alter it and redistribute it\r
+; freely, subject to the following restrictions:\r
+;\r
+; 1. The origin of this software must not be misrepresented; you must not\r
+; claim that you wrote the original software. If you use this software\r
+; in a product, an acknowledgment in the product documentation would be\r
+; appreciated but is not required.\r
+; 2. Altered source versions must be plainly marked as such, and must not\r
+; be misrepresented as being the original software.\r
+; 3. This notice may not be removed or altered from any source\r
+; distribution.\r
+;\r
+\r
+.define _SMCDesignator .mid(0, .tcount(label) - 1, label) .ident(.concat(.string(.right(1, label)), "_SMC"))\r
+.define _SMCAlias .mid(0, .tcount(alias) - 1, alias) .ident(.concat(.string(.right(1, alias)), "_SMC"))\r
+.define SMC_AbsAdr $FADE\r
+.define SMC_ZpAdr $00\r
+.define SMC_Opcode nop\r
+.define SMC_Value $42\r
+\r
+.macro SMC_OperateOnValue opcode, label\r
+ opcode _SMCDesignator+1\r
+.endmacro\r
+\r
+.macro SMC_OperateOnLowByte opcode, label\r
+ SMC_OperateOnValue opcode, label\r
+.endmacro\r
+\r
+.macro SMC_OperateOnHighByte opcode, label\r
+ opcode _SMCDesignator + 2\r
+.endmacro\r
+\r
+.macro SMC_Import alias\r
+.import _SMCAlias\r
+.endmacro\r
+\r
+.macro SMC_Export alias, label\r
+.export _SMCAlias := _SMCDesignator\r
+.endmacro\r
+\r
+.macro SMC label, statement\r
+_SMCDesignator: statement\r
+.endmacro\r
+\r
+.macro SMC_TransferOpcode label, opcode, register\r
+.if .paramcount = 2 .or .match ({register}, a)\r
+ lda #opcode\r
+ sta _SMCDesignator\r
+.elseif .match ({register}, x)\r
+ ldx #opcode\r
+ stx _SMCDesignator\r
+.elseif .match ({register}, y)\r
+ ldy #opcode\r
+ sty _SMCDesignator\r
+.endif\r
+.endmacro\r
+\r
+.macro SMC_LoadOpcode label, register\r
+.if .paramcount = 1 .or .match ({register}, a)\r
+ lda _SMCDesignator\r
+.elseif .match ({register}, x)\r
+ ldx _SMCDesignator\r
+.elseif .match ({register}, y)\r
+ ldy _SMCDesignator\r
+.endif\r
+.endmacro\r
+\r
+.macro SMC_StoreOpcode label, register\r
+.if .paramcount = 1 .or .match ({register}, a)\r
+ sta _SMCDesignator\r
+.elseif .match ({register}, x)\r
+ stx _SMCDesignator\r
+.elseif .match ({register}, y)\r
+ sty _SMCDesignator\r
+.endif\r
+.endmacro\r
+\r
+.macro SMC_ChangeBranch label, destination, register\r
+.if .paramcount = 2 .or .match ({register}, a)\r
+ lda #(destination - _SMCDesignator -2)\r
+ sta _SMCDesignator+1\r
+.elseif .match ({register}, x)\r
+ ldx #(destination - _SMCDesignator - 2)\r
+ stx _SMCDesignator+1\r
+.elseif .match ({register}, y)\r
+ ldy #(destination - _SMCDesignator - 2)\r
+ sty _SMCDesignator+1\r
+.endif\r
+.endmacro\r
+\r
+.macro SMC_TransferValue label, value, register\r
+.if .paramcount = 2 .or .match ({register}, a)\r
+ lda value\r
+ sta _SMCDesignator+1\r
+.elseif .match ({register}, x)\r
+ ldx value\r
+ stx _SMCDesignator+1\r
+.elseif .match ({register}, y)\r
+ ldy value\r
+ sty _SMCDesignator+1\r
+.endif\r
+.endmacro\r
+\r
+.macro SMC_LoadValue label, register\r
+.if .paramcount = 1 .or .match ({register}, a)\r
+ lda _SMCDesignator+1\r
+.elseif .match ({register}, x)\r
+ ldx _SMCDesignator+1\r
+.elseif .match ({register}, y)\r
+ ldy _SMCDesignator+1\r
+.endif\r
+.endmacro\r
+\r
+.macro SMC_StoreValue label, register\r
+.if .paramcount = 1 .or .match ({register}, a)\r
+ sta _SMCDesignator+1\r
+.elseif .match ({register}, x)\r
+ stx _SMCDesignator+1\r
+.elseif .match ({register}, y)\r
+ sty _SMCDesignator+1\r
+.endif\r
+.endmacro\r
+\r
+\r
+.macro SMC_TransferLowByte label, value, register\r
+SMC_TransferValue label, value, register\r
+.endmacro\r
+\r
+.macro SMC_LoadLowByte label, register\r
+SMC_LoadValue label, register\r
+.endmacro\r
+\r
+.macro SMC_StoreLowByte label, register\r
+SMC_StoreValue label, register\r
+.endmacro\r
+\r
+.macro SMC_TransferHighByte label, value, register\r
+.if .paramcount = 2 .or .match ({register}, a)\r
+ lda value\r
+ sta _SMCDesignator+2\r
+.elseif .match ({register}, x)\r
+ ldx value\r
+ stx _SMCDesignator+2\r
+.elseif .match ({register}, y)\r
+ ldy value\r
+ sty _SMCDesignator+2\r
+.endif\r
+.endmacro\r
+\r
+.macro SMC_LoadHighByte label, register\r
+.if .paramcount = 1 .or .match ({register}, a)\r
+ lda _SMCDesignator+2\r
+.elseif .match ({register}, x)\r
+ ldx _SMCDesignator+2\r
+.elseif .match ({register}, y)\r
+ ldy _SMCDesignator+2\r
+.endif\r
+.endmacro\r
+\r
+.macro SMC_StoreHighByte label, register\r
+.if .paramcount = 1 .or .match ({register}, a)\r
+ sta _SMCDesignator+2\r
+.elseif .match ({register}, x)\r
+ stx _SMCDesignator+2\r
+.elseif .match ({register}, y)\r
+ sty _SMCDesignator+2\r
+.endif\r
+.endmacro\r
+\r
+\r
+.macro SMC_TransferAddressSingle label, address, register\r
+.if .paramcount = 2 .or .match ((register), a)\r
+ .if (.match (.left (1, {adress}), #))\r
+ ; immediate mode\r
+ lda #<(.right (.tcount ({adress})-1, {adress}))\r
+ sta _SMCDesignator+1\r
+ lda #>(.right (.tcount ({adress})-1, {adress}))\r
+ sta _SMCDesignator+2\r
+ .else\r
+ ; assume absolute or zero page\r
+ lda address\r
+ sta _SMCDesignator+1\r
+ lda 1+(address)\r
+ sta _SMCDesignator+2\r
+ .endif\r
+.elseif .match ((register), x)\r
+ .if (.match (.left (1, {adress}), #))\r
+ ; immediate mode\r
+ ldx #<(.right (.tcount ({adress})-1, {adress}))\r
+ stx _SMCDesignator+1\r
+ ldx #>(.right (.tcount ({adress})-1, {adress}))\r
+ stx _SMCDesignator+2\r
+ .else\r
+ ; assume absolute or zero page\r
+ ldx address\r
+ stx _SMCDesignator+1\r
+ ldx 1+(address)\r
+ stx _SMCDesignator+2\r
+ .endif\r
+.elseif .match ((register), y)\r
+ .if (.match (.left (1, {adress}), #))\r
+ ; immediate mode\r
+ ldy #<(.right (.tcount ({adress})-1, {adress}))\r
+ sty _SMCDesignator+1\r
+ ldy #>(.right (.tcount ({adress})-1, {adress}))\r
+ sty _SMCDesignator+2\r
+ .else\r
+ ; assume absolute or zero page\r
+ ldy address\r
+ sty _SMCDesignator+1\r
+ ldy 1+(address)\r
+ sty _SMCDesignator+2\r
+ .endif\r
+.endif\r
+.endmacro\r
+\r
+\r
+.macro SMC_TransferAddress label, address\r
+.if (.match (.left (1, {adress}), #))\r
+ ; immediate mode\r
+ lda #<(.right (.tcount ({adress})-1, {adress}))\r
+ sta _SMCDesignator+1\r
+ ldx #>(.right (.tcount ({adress})-1, {adress}))\r
+ stx _SMCDesignator+2\r
+.else\r
+ ; assume absolute or zero page\r
+ lda {address}\r
+ sta _SMCDesignator+1\r
+ ldx 1+{address}\r
+ stx _SMCDesignator)+2\r
+.endif\r
+.endmacro\r
+\r
+.macro SMC_StoreAddress label\r
+ sta _SMCDesignator+1\r
+ stx _SMCDesignator+2\r
+.endmacro\r
+\r
+\r
+++ /dev/null
-; smc.mac\r
-; ca65 Macro-Pack for Self Modifying Code (SMC)\r
-;\r
-; (c) Christian Krüger, latest change: 09-Nov-2011\r
-;\r
-; This software is provided 'as-is', without any expressed or implied\r
-; warranty. In no event will the authors be held liable for any damages\r
-; arising from the use of this software.\r
-;\r
-; Permission is granted to anyone to use this software for any purpose,\r
-; including commercial applications, and to alter it and redistribute it\r
-; freely, subject to the following restrictions:\r
-;\r
-; 1. The origin of this software must not be misrepresented; you must not\r
-; claim that you wrote the original software. If you use this software\r
-; in a product, an acknowledgment in the product documentation would be\r
-; appreciated but is not required.\r
-; 2. Altered source versions must be plainly marked as such, and must not\r
-; be misrepresented as being the original software.\r
-; 3. This notice may not be removed or altered from any source\r
-; distribution.\r
-;\r
-\r
-.define _SMCDesignator .mid(0, .tcount(label) - 1, label) .ident(.concat(.string(.right(1, label)), "_SMC"))\r
-.define _SMCAlias .mid(0, .tcount(alias) - 1, alias) .ident(.concat(.string(.right(1, alias)), "_SMC"))\r
-.define SMC_AbsAdr $FADE\r
-.define SMC_ZpAdr $00\r
-.define SMC_Opcode nop\r
-.define SMC_Value $42\r
-\r
-.macro SMC_OperateOnValue opcode, label\r
- opcode _SMCDesignator+1\r
-.endmacro\r
-\r
-.macro SMC_OperateOnLowByte opcode, label\r
- SMC_OperateOnValue opcode, label\r
-.endmacro\r
-\r
-.macro SMC_OperateOnHighByte opcode, label\r
- opcode _SMCDesignator + 2\r
-.endmacro\r
-\r
-.macro SMC_Import alias\r
-.import _SMCAlias\r
-.endmacro\r
-\r
-.macro SMC_Export alias, label\r
-.export _SMCAlias := _SMCDesignator\r
-.endmacro\r
-\r
-.macro SMC label, statement\r
-_SMCDesignator: statement\r
-.endmacro\r
-\r
-.macro SMC_TransferOpcode label, opcode, register\r
-.if .paramcount = 2 .or .match ({register}, a)\r
- lda #opcode\r
- sta _SMCDesignator\r
-.elseif .match ({register}, x)\r
- ldx #opcode\r
- stx _SMCDesignator\r
-.elseif .match ({register}, y)\r
- ldy #opcode\r
- sty _SMCDesignator\r
-.endif\r
-.endmacro\r
-\r
-.macro SMC_LoadOpcode label, register\r
-.if .paramcount = 1 .or .match ({register}, a)\r
- lda _SMCDesignator\r
-.elseif .match ({register}, x)\r
- ldx _SMCDesignator\r
-.elseif .match ({register}, y)\r
- ldy _SMCDesignator\r
-.endif\r
-.endmacro\r
-\r
-.macro SMC_StoreOpcode label, register\r
-.if .paramcount = 1 .or .match ({register}, a)\r
- sta _SMCDesignator\r
-.elseif .match ({register}, x)\r
- stx _SMCDesignator\r
-.elseif .match ({register}, y)\r
- sty _SMCDesignator\r
-.endif\r
-.endmacro\r
-\r
-.macro SMC_ChangeBranch label, destination, register\r
-.if .paramcount = 2 .or .match ({register}, a)\r
- lda #(destination - _SMCDesignator -2)\r
- sta _SMCDesignator+1\r
-.elseif .match ({register}, x)\r
- ldx #(destination - _SMCDesignator - 2)\r
- stx _SMCDesignator+1\r
-.elseif .match ({register}, y)\r
- ldy #(destination - _SMCDesignator - 2)\r
- sty _SMCDesignator+1\r
-.endif\r
-.endmacro\r
-\r
-.macro SMC_TransferValue label, value, register\r
-.if .paramcount = 2 .or .match ({register}, a)\r
- lda value\r
- sta _SMCDesignator+1\r
-.elseif .match ({register}, x)\r
- ldx value\r
- stx _SMCDesignator+1\r
-.elseif .match ({register}, y)\r
- ldy value\r
- sty _SMCDesignator+1\r
-.endif\r
-.endmacro\r
-\r
-.macro SMC_LoadValue label, register\r
-.if .paramcount = 1 .or .match ({register}, a)\r
- lda _SMCDesignator+1\r
-.elseif .match ({register}, x)\r
- ldx _SMCDesignator+1\r
-.elseif .match ({register}, y)\r
- ldy _SMCDesignator+1\r
-.endif\r
-.endmacro\r
-\r
-.macro SMC_StoreValue label, register\r
-.if .paramcount = 1 .or .match ({register}, a)\r
- sta _SMCDesignator+1\r
-.elseif .match ({register}, x)\r
- stx _SMCDesignator+1\r
-.elseif .match ({register}, y)\r
- sty _SMCDesignator+1\r
-.endif\r
-.endmacro\r
-\r
-\r
-.macro SMC_TransferLowByte label, value, register\r
-SMC_TransferValue label, value, register\r
-.endmacro\r
-\r
-.macro SMC_LoadLowByte label, register\r
-SMC_LoadValue label, register\r
-.endmacro\r
-\r
-.macro SMC_StoreLowByte label, register\r
-SMC_StoreValue label, register\r
-.endmacro\r
-\r
-.macro SMC_TransferHighByte label, value, register\r
-.if .paramcount = 2 .or .match ({register}, a)\r
- lda value\r
- sta _SMCDesignator+2\r
-.elseif .match ({register}, x)\r
- ldx value\r
- stx _SMCDesignator+2\r
-.elseif .match ({register}, y)\r
- ldy value\r
- sty _SMCDesignator+2\r
-.endif\r
-.endmacro\r
-\r
-.macro SMC_LoadHighByte label, register\r
-.if .paramcount = 1 .or .match ({register}, a)\r
- lda _SMCDesignator+2\r
-.elseif .match ({register}, x)\r
- ldx _SMCDesignator+2\r
-.elseif .match ({register}, y)\r
- ldy _SMCDesignator+2\r
-.endif\r
-.endmacro\r
-\r
-.macro SMC_StoreHighByte label, register\r
-.if .paramcount = 1 .or .match ({register}, a)\r
- sta _SMCDesignator+2\r
-.elseif .match ({register}, x)\r
- stx _SMCDesignator+2\r
-.elseif .match ({register}, y)\r
- sty _SMCDesignator+2\r
-.endif\r
-.endmacro\r
-\r
-\r
-.macro SMC_TransferAddressSingle label, address, register\r
-.if .paramcount = 2 .or .match ((register), a)\r
- .if (.match (.left (1, {adress}), #))\r
- ; immediate mode\r
- lda #<(.right (.tcount ({adress})-1, {adress}))\r
- sta _SMCDesignator+1\r
- lda #>(.right (.tcount ({adress})-1, {adress}))\r
- sta _SMCDesignator+2\r
- .else\r
- ; assume absolute or zero page\r
- lda address\r
- sta _SMCDesignator+1\r
- lda 1+(address)\r
- sta _SMCDesignator+2\r
- .endif\r
-.elseif .match ((register), x)\r
- .if (.match (.left (1, {adress}), #))\r
- ; immediate mode\r
- ldx #<(.right (.tcount ({adress})-1, {adress}))\r
- stx _SMCDesignator+1\r
- ldx #>(.right (.tcount ({adress})-1, {adress}))\r
- stx _SMCDesignator+2\r
- .else\r
- ; assume absolute or zero page\r
- ldx address\r
- stx _SMCDesignator+1\r
- ldx 1+(address)\r
- stx _SMCDesignator+2\r
- .endif\r
-.elseif .match ((register), y)\r
- .if (.match (.left (1, {adress}), #))\r
- ; immediate mode\r
- ldy #<(.right (.tcount ({adress})-1, {adress}))\r
- sty _SMCDesignator+1\r
- ldy #>(.right (.tcount ({adress})-1, {adress}))\r
- sty _SMCDesignator+2\r
- .else\r
- ; assume absolute or zero page\r
- ldy address\r
- sty _SMCDesignator+1\r
- ldy 1+(address)\r
- sty _SMCDesignator+2\r
- .endif\r
-.endif\r
-.endmacro\r
-\r
-\r
-.macro SMC_TransferAddress label, address\r
-.if (.match (.left (1, {adress}), #))\r
- ; immediate mode\r
- lda #<(.right (.tcount ({adress})-1, {adress}))\r
- sta _SMCDesignator+1\r
- ldx #>(.right (.tcount ({adress})-1, {adress}))\r
- stx _SMCDesignator+2\r
-.else\r
- ; assume absolute or zero page\r
- lda {address}\r
- sta _SMCDesignator+1\r
- ldx 1+{address}\r
- stx _SMCDesignator)+2\r
-.endif\r
-.endmacro\r
-\r
-.macro SMC_StoreAddress label\r
- sta _SMCDesignator+1\r
- stx _SMCDesignator+2\r
-.endmacro\r
-\r
-\r
<date>2012-02-19
<abstract>
-The 'smc.mac' macro package for ca65 eases the use, increases the safeness and
+The 'smc.inc' macro package for ca65 eases the use, increases the safeness and
self-explanation of 'self-modifying-code' (SMC).
</abstract>
The ca65 SMC macro package consists of two files:
<itemize>
-<item><tt>smc.mac</tt>
+<item><tt>smc.inc</tt>
<item><tt>opcodes.inc</tt>
</itemize>