]> git.sur5r.net Git - cc65/blob - asminc/smc.inc
Fixed isgraph() and ispunct() (macroes and library functions).
[cc65] / asminc / smc.inc
1 ; smc.mac\r
2 ; ca65 Macro-Pack for Self Modifying Code (SMC)\r
3 ;\r
4 ; (c) Christian Krüger, latest change: 09-Nov-2011\r
5 ;\r
6 ; This software is provided 'as-is', without any expressed or implied\r
7 ; warranty.  In no event will the authors be held liable for any damages\r
8 ; arising from the use of this software.\r
9 ;\r
10 ; Permission is granted to anyone to use this software for any purpose,\r
11 ; including commercial applications, and to alter it and redistribute it\r
12 ; freely, subject to the following restrictions:\r
13 ;\r
14 ; 1. The origin of this software must not be misrepresented; you must not\r
15 ;    claim that you wrote the original software. If you use this software\r
16 ;    in a product, an acknowledgment in the product documentation would be\r
17 ;    appreciated but is not required.\r
18 ; 2. Altered source versions must be plainly marked as such, and must not\r
19 ;    be misrepresented as being the original software.\r
20 ; 3. This notice may not be removed or altered from any source\r
21 ;    distribution.\r
22 ;\r
23 \r
24 .define _SMCDesignator .mid(0, .tcount(label) - 1, label) .ident(.concat(.string(.right(1, label)), "_SMC"))\r
25 .define _SMCAlias .mid(0, .tcount(alias) - 1, alias) .ident(.concat(.string(.right(1, alias)), "_SMC"))\r
26 .define SMC_AbsAdr      $FADE\r
27 .define SMC_ZpAdr               $00\r
28 .define SMC_Opcode      nop\r
29 .define SMC_Value               $42\r
30 \r
31 .macro SMC_OperateOnValue opcode, label\r
32         opcode _SMCDesignator+1\r
33 .endmacro\r
34 \r
35 .macro SMC_OperateOnLowByte opcode, label\r
36         SMC_OperateOnValue opcode, label\r
37 .endmacro\r
38 \r
39 .macro SMC_OperateOnHighByte opcode, label\r
40         opcode _SMCDesignator + 2\r
41 .endmacro\r
42 \r
43 .macro SMC_Import alias\r
44 .import _SMCAlias\r
45 .endmacro\r
46 \r
47 .macro SMC_Export alias, label\r
48 .export _SMCAlias := _SMCDesignator\r
49 .endmacro\r
50 \r
51 .macro  SMC     label, statement\r
52 _SMCDesignator: statement\r
53 .endmacro\r
54 \r
55 .macro SMC_TransferOpcode       label, opcode, register\r
56 .if .paramcount = 2 .or .match ({register}, a)\r
57                         lda #opcode\r
58                         sta _SMCDesignator\r
59 .elseif .match ({register}, x)\r
60                         ldx #opcode\r
61                         stx _SMCDesignator\r
62 .elseif .match ({register}, y)\r
63                         ldy #opcode\r
64                         sty _SMCDesignator\r
65 .endif\r
66 .endmacro\r
67 \r
68 .macro SMC_LoadOpcode   label, register\r
69 .if .paramcount = 1 .or .match ({register}, a)\r
70                         lda _SMCDesignator\r
71 .elseif .match ({register}, x)\r
72                         ldx _SMCDesignator\r
73 .elseif .match ({register}, y)\r
74                         ldy _SMCDesignator\r
75 .endif\r
76 .endmacro\r
77 \r
78 .macro SMC_StoreOpcode  label, register\r
79 .if .paramcount = 1 .or .match ({register}, a)\r
80                         sta _SMCDesignator\r
81 .elseif .match ({register}, x)\r
82                         stx _SMCDesignator\r
83 .elseif .match ({register}, y)\r
84                         sty _SMCDesignator\r
85 .endif\r
86 .endmacro\r
87 \r
88 .macro SMC_ChangeBranch         label, destination, register\r
89 .if .paramcount = 2 .or .match ({register}, a)\r
90                         lda #(destination - _SMCDesignator -2)\r
91                         sta _SMCDesignator+1\r
92 .elseif .match ({register}, x)\r
93                         ldx #(destination - _SMCDesignator - 2)\r
94                         stx _SMCDesignator+1\r
95 .elseif .match ({register}, y)\r
96                         ldy #(destination - _SMCDesignator - 2)\r
97                         sty _SMCDesignator+1\r
98 .endif\r
99 .endmacro\r
100 \r
101 .macro SMC_TransferValue        label, value, register\r
102 .if .paramcount = 2 .or .match ({register}, a)\r
103                         lda value\r
104                         sta _SMCDesignator+1\r
105 .elseif .match ({register}, x)\r
106                         ldx value\r
107                         stx _SMCDesignator+1\r
108 .elseif .match ({register}, y)\r
109                         ldy value\r
110                         sty _SMCDesignator+1\r
111 .endif\r
112 .endmacro\r
113 \r
114 .macro SMC_LoadValue    label, register\r
115 .if .paramcount = 1 .or .match ({register}, a)\r
116                         lda _SMCDesignator+1\r
117 .elseif .match ({register}, x)\r
118                         ldx _SMCDesignator+1\r
119 .elseif .match ({register}, y)\r
120                         ldy _SMCDesignator+1\r
121 .endif\r
122 .endmacro\r
123 \r
124 .macro SMC_StoreValue   label, register\r
125 .if .paramcount = 1 .or .match ({register}, a)\r
126                         sta _SMCDesignator+1\r
127 .elseif .match ({register}, x)\r
128                         stx _SMCDesignator+1\r
129 .elseif .match ({register}, y)\r
130                         sty _SMCDesignator+1\r
131 .endif\r
132 .endmacro\r
133 \r
134 \r
135 .macro SMC_TransferLowByte      label, value, register\r
136 SMC_TransferValue label, value, register\r
137 .endmacro\r
138 \r
139 .macro SMC_LoadLowByte  label, register\r
140 SMC_LoadValue label, register\r
141 .endmacro\r
142 \r
143 .macro SMC_StoreLowByte label, register\r
144 SMC_StoreValue label, register\r
145 .endmacro\r
146 \r
147 .macro SMC_TransferHighByte     label, value, register\r
148 .if .paramcount = 2 .or .match ({register}, a)\r
149                         lda     value\r
150                         sta _SMCDesignator+2\r
151 .elseif .match ({register}, x)\r
152                         ldx value\r
153                         stx _SMCDesignator+2\r
154 .elseif .match ({register}, y)\r
155                         ldy value\r
156                         sty _SMCDesignator+2\r
157 .endif\r
158 .endmacro\r
159 \r
160 .macro SMC_LoadHighByte label, register\r
161 .if .paramcount = 1 .or .match ({register}, a)\r
162                         lda _SMCDesignator+2\r
163 .elseif .match ({register}, x)\r
164                         ldx _SMCDesignator+2\r
165 .elseif .match ({register}, y)\r
166                         ldy _SMCDesignator+2\r
167 .endif\r
168 .endmacro\r
169 \r
170 .macro SMC_StoreHighByte        label, register\r
171 .if .paramcount = 1 .or .match ({register}, a)\r
172                         sta _SMCDesignator+2\r
173 .elseif .match ({register}, x)\r
174                         stx _SMCDesignator+2\r
175 .elseif .match ({register}, y)\r
176                         sty _SMCDesignator+2\r
177 .endif\r
178 .endmacro\r
179 \r
180 \r
181 .macro SMC_TransferAddressSingle        label, address, register\r
182 .if .paramcount = 2 .or .match ((register), a)\r
183         .if (.match (.left (1, {address}), #))\r
184                 ; immediate mode\r
185         lda     #<(.right (.tcount ({address})-1, {address}))\r
186                 sta _SMCDesignator+1\r
187         lda #>(.right (.tcount ({address})-1, {address}))\r
188                 sta _SMCDesignator+2\r
189     .else\r
190         ; assume absolute or zero page\r
191                 lda     address\r
192                 sta _SMCDesignator+1\r
193                 lda 1+(address)\r
194                 sta _SMCDesignator+2\r
195         .endif\r
196 .elseif .match ((register), x)\r
197         .if (.match (.left (1, {address}), #))\r
198                 ; immediate mode\r
199         ldx     #<(.right (.tcount ({address})-1, {address}))\r
200                 stx _SMCDesignator+1\r
201         ldx #>(.right (.tcount ({address})-1, {address}))\r
202                 stx _SMCDesignator+2\r
203     .else\r
204         ; assume absolute or zero page\r
205                 ldx     address\r
206                 stx _SMCDesignator+1\r
207                 ldx 1+(address)\r
208                 stx _SMCDesignator+2\r
209         .endif\r
210 .elseif .match ((register), y)\r
211         .if (.match (.left (1, {address}), #))\r
212                 ; immediate mode\r
213         ldy     #<(.right (.tcount ({address})-1, {address}))\r
214                 sty _SMCDesignator+1\r
215         ldy #>(.right (.tcount ({address})-1, {address}))\r
216                 sty _SMCDesignator+2\r
217     .else\r
218         ; assume absolute or zero page\r
219                 ldy     address\r
220                 sty _SMCDesignator+1\r
221                 ldy 1+(address)\r
222                 sty _SMCDesignator+2\r
223         .endif\r
224 .endif\r
225 .endmacro\r
226 \r
227 \r
228 .macro SMC_TransferAddress      label, address\r
229 .if (.match (.left (1, {address}), #))\r
230         ; immediate mode\r
231         lda     #<(.right (.tcount ({address})-1, {address}))\r
232         sta _SMCDesignator+1\r
233         ldx #>(.right (.tcount ({address})-1, {address}))\r
234         stx _SMCDesignator+2\r
235 .else\r
236         ; assume absolute or zero page\r
237         lda     {address}\r
238         sta _SMCDesignator+1\r
239         ldx 1+{address}\r
240         stx _SMCDesignator)+2\r
241 .endif\r
242 .endmacro\r
243 \r
244 .macro SMC_StoreAddress label\r
245                 sta _SMCDesignator+1\r
246                 stx _SMCDesignator+2\r
247 .endmacro\r
248 \r
249 \r