]> git.sur5r.net Git - cc65/blob - src/cc65/opcodes.c
7bd8b50322eb887eb4dfc1ae9e858b3107c21e68
[cc65] / src / cc65 / opcodes.c
1 /*****************************************************************************/
2 /*                                                                           */
3 /*                                 opcodes.c                                 */
4 /*                                                                           */
5 /*                  Opcode and addressing mode definitions                   */
6 /*                                                                           */
7 /*                                                                           */
8 /*                                                                           */
9 /* (C) 2001-2002 Ullrich von Bassewitz                                       */
10 /*               Wacholderweg 14                                             */
11 /*               D-70597 Stuttgart                                           */
12 /* EMail:        uz@cc65.org                                                 */
13 /*                                                                           */
14 /*                                                                           */
15 /* This software is provided 'as-is', without any expressed or implied       */
16 /* warranty.  In no event will the authors be held liable for any damages    */
17 /* arising from the use of this software.                                    */
18 /*                                                                           */
19 /* Permission is granted to anyone to use this software for any purpose,     */
20 /* including commercial applications, and to alter it and redistribute it    */
21 /* freely, subject to the following restrictions:                            */
22 /*                                                                           */
23 /* 1. The origin of this software must not be misrepresented; you must not   */
24 /*    claim that you wrote the original software. If you use this software   */
25 /*    in a product, an acknowledgment in the product documentation would be  */
26 /*    appreciated but is not required.                                       */
27 /* 2. Altered source versions must be plainly marked as such, and must not   */
28 /*    be misrepresented as being the original software.                      */
29 /* 3. This notice may not be removed or altered from any source              */
30 /*    distribution.                                                          */
31 /*                                                                           */
32 /*****************************************************************************/
33
34
35
36 #include "stdlib.h"
37 #include <string.h>
38 #include <ctype.h>
39
40 /* common */
41 #include "check.h"
42 #include "cpu.h"
43
44 /* cc65 */
45 #include "codeinfo.h"
46 #include "error.h"
47 #include "opcodes.h"
48
49
50
51 /*****************************************************************************/
52 /*                                   Data                                    */
53 /*****************************************************************************/
54
55
56
57 /* Opcode description table */
58 const OPCDesc OPCTable[OPCODE_COUNT] = {
59
60     /* 65XX opcodes */
61     {   OP65_ADC,                               /* opcode */
62         "adc",                                  /* mnemonic */
63         0,                                      /* size */
64         REG_A,                                  /* use */
65         REG_A,                                  /* chg */
66         OF_SETF                                 /* flags */
67     },
68     {   OP65_AND,                               /* opcode */
69         "and",                                  /* mnemonic */
70         0,                                      /* size */
71         REG_A,                                  /* use */
72         REG_A,                                  /* chg */
73         OF_SETF                                 /* flags */
74     },
75     {   OP65_ASL,                               /* opcode */
76         "asl",                                  /* mnemonic */
77         0,                                      /* size */
78         REG_NONE,                               /* use */
79         REG_NONE,                               /* chg */
80         OF_SETF                                 /* flags */
81     },
82     {   OP65_BCC,                               /* opcode */
83         "bcc",                                  /* mnemonic */
84         2,                                      /* size */
85         REG_NONE,                               /* use */
86         REG_NONE,                               /* chg */
87         OF_CBRA                                 /* flags */
88     },
89     {   OP65_BCS,                               /* opcode */
90         "bcs",                                  /* mnemonic */
91         2,                                      /* size */
92         REG_NONE,                               /* use */
93         REG_NONE,                               /* chg */
94         OF_CBRA                                 /* flags */
95     },
96     {   OP65_BEQ,                               /* opcode */
97         "beq",                                  /* mnemonic */
98         2,                                      /* size */
99         REG_NONE,                               /* use */
100         REG_NONE,                               /* chg */
101         OF_CBRA | OF_ZBRA | OF_FBRA             /* flags */
102     },
103     {   OP65_BIT,                               /* opcode */
104         "bit",                                  /* mnemonic */
105         0,                                      /* size */
106         REG_A,                                  /* use */
107         REG_NONE,                               /* chg */
108         OF_SETF                                 /* flags */
109     },
110     {   OP65_BMI,                               /* opcode */
111         "bmi",                                  /* mnemonic */
112         2,                                      /* size */
113         REG_NONE,                               /* use */
114         REG_NONE,                               /* chg */
115         OF_CBRA | OF_FBRA                       /* flags */
116     },
117     {   OP65_BNE,                               /* opcode */
118         "bne",                                  /* mnemonic */
119         2,                                      /* size */
120         REG_NONE,                               /* use */
121         REG_NONE,                               /* chg */
122         OF_CBRA | OF_ZBRA | OF_FBRA             /* flags */
123     },
124     {   OP65_BPL,                               /* opcode */
125         "bpl",                                  /* mnemonic */
126         2,                                      /* size */
127         REG_NONE,                               /* use */
128         REG_NONE,                               /* chg */
129         OF_CBRA | OF_FBRA                       /* flags */
130     },
131     {   OP65_BRA,                               /* opcode */
132         "bra",                                  /* mnemonic */
133         2,                                      /* size */
134         REG_NONE,                               /* use */
135         REG_NONE,                               /* chg */
136         OF_UBRA                                 /* flags */
137     },
138     {   OP65_BRK,                               /* opcode */
139         "brk",                                  /* mnemonic */
140         1,                                      /* size */
141         REG_NONE,                               /* use */
142         REG_NONE,                               /* chg */
143         OF_NONE                                 /* flags */
144     },
145     {   OP65_BVC,                               /* opcode */
146         "bvc",                                  /* mnemonic */
147         2,                                      /* size */
148         REG_NONE,                               /* use */
149         REG_NONE,                               /* chg */
150         OF_CBRA                                 /* flags */
151     },
152     {   OP65_BVS,                               /* opcode */
153         "bvs",                                  /* mnemonic */
154         2,                                      /* size */
155         REG_NONE,                               /* use */
156         REG_NONE,                               /* chg */
157         OF_CBRA                                 /* flags */
158     },
159     {   OP65_CLC,                               /* opcode */
160         "clc",                                  /* mnemonic */
161         1,                                      /* size */
162         REG_NONE,                               /* use */
163         REG_NONE,                               /* chg */
164         OF_NONE                                 /* flags */
165     },
166     {   OP65_CLD,                               /* opcode */
167         "cld",                                  /* mnemonic */
168         1,                                      /* size */
169         REG_NONE,                               /* use */
170         REG_NONE,                               /* chg */
171         OF_NONE                                 /* flags */
172     },
173     {   OP65_CLI,                               /* opcode */
174         "cli",                                  /* mnemonic */
175         1,                                      /* size */
176         REG_NONE,                               /* use */
177         REG_NONE,                               /* chg */
178         OF_NONE                                 /* flags */
179     },
180     {   OP65_CLV,                               /* opcode */
181         "clv",                                  /* mnemonic */
182         1,                                      /* size */
183         REG_NONE,                               /* use */
184         REG_NONE,                               /* chg */
185         OF_NONE                                 /* flags */
186     },
187     {   OP65_CMP,                               /* opcode */
188         "cmp",                                  /* mnemonic */
189         0,                                      /* size */
190         REG_A,                                  /* use */
191         REG_NONE,                               /* chg */
192         OF_SETF | OF_CMP                        /* flags */
193     },
194     {   OP65_CPX,                               /* opcode */
195         "cpx",                                  /* mnemonic */
196         0,                                      /* size */
197         REG_X,                                  /* use */
198         REG_NONE,                               /* chg */
199         OF_SETF | OF_CMP                        /* flags */
200     },
201     {   OP65_CPY,                               /* opcode */
202         "cpy",                                  /* mnemonic */
203         0,                                      /* size */
204         REG_Y,                                  /* use */
205         REG_NONE,                               /* chg */
206         OF_SETF | OF_CMP                        /* flags */
207     },
208     {   OP65_DEA,                               /* opcode */
209         "dea",                                  /* mnemonic */
210         1,                                      /* size */
211         REG_A,                                  /* use */
212         REG_A,                                  /* chg */
213         OF_REG_INCDEC | OF_SETF                 /* flags */
214     },
215     {   OP65_DEC,                               /* opcode */
216         "dec",                                  /* mnemonic */
217         0,                                      /* size */
218         REG_NONE,                               /* use */
219         REG_NONE,                               /* chg */
220         OF_SETF                                 /* flags */
221     },
222     {   OP65_DEX,                               /* opcode */
223         "dex",                                  /* mnemonic */
224         1,                                      /* size */
225         REG_X,                                  /* use */
226         REG_X,                                  /* chg */
227         OF_REG_INCDEC | OF_SETF                 /* flags */
228     },
229     {   OP65_DEY,                               /* opcode */
230         "dey",                                  /* mnemonic */
231         1,                                      /* size */
232         REG_Y,                                  /* use */
233         REG_Y,                                  /* chg */
234         OF_REG_INCDEC | OF_SETF                 /* flags */
235     },
236     {   OP65_EOR,                               /* opcode */
237         "eor",                                  /* mnemonic */
238         0,                                      /* size */
239         REG_A,                                  /* use */
240         REG_A,                                  /* chg */
241         OF_SETF                                 /* flags */
242     },
243     {   OP65_INA,                               /* opcode */
244         "ina",                                  /* mnemonic */
245         1,                                      /* size */
246         REG_A,                                  /* use */
247         REG_A,                                  /* chg */
248         OF_REG_INCDEC | OF_SETF                 /* flags */
249     },
250     {   OP65_INC,                               /* opcode */
251         "inc",                                  /* mnemonic */
252         0,                                      /* size */
253         REG_NONE,                               /* use */
254         REG_NONE,                               /* chg */
255         OF_SETF                                 /* flags */
256     },
257     {   OP65_INX,                               /* opcode */
258         "inx",                                  /* mnemonic */
259         1,                                      /* size */
260         REG_X,                                  /* use */
261         REG_X,                                  /* chg */
262         OF_REG_INCDEC | OF_SETF                 /* flags */
263     },
264     {   OP65_INY,                               /* opcode */
265         "iny",                                  /* mnemonic */
266         1,                                      /* size */
267         REG_Y,                                  /* use */
268         REG_Y,                                  /* chg */
269         OF_REG_INCDEC | OF_SETF                 /* flags */
270     },
271     {   OP65_JCC,                               /* opcode */
272         "jcc",                                  /* mnemonic */
273         5,                                      /* size */
274         REG_NONE,                               /* use */
275         REG_NONE,                               /* chg */
276         OF_CBRA | OF_LBRA                       /* flags */
277     },
278     {   OP65_JCS,                               /* opcode */
279         "jcs",                                  /* mnemonic */
280         5,                                      /* size */
281         REG_NONE,                               /* use */
282         REG_NONE,                               /* chg */
283         OF_CBRA | OF_LBRA                       /* flags */
284     },
285     {   OP65_JEQ,                               /* opcode */
286         "jeq",                                  /* mnemonic */
287         5,                                      /* size */
288         REG_NONE,                               /* use */
289         REG_NONE,                               /* chg */
290         OF_CBRA | OF_LBRA | OF_ZBRA | OF_FBRA   /* flags */
291     },
292     {   OP65_JMI,                               /* opcode */
293         "jmi",                                  /* mnemonic */
294         5,                                      /* size */
295         REG_NONE,                               /* use */
296         REG_NONE,                               /* chg */
297         OF_CBRA | OF_LBRA | OF_FBRA             /* flags */
298     },
299     {   OP65_JMP,                               /* opcode */
300         "jmp",                                  /* mnemonic */
301         3,                                      /* size */
302         REG_NONE,                               /* use */
303         REG_NONE,                               /* chg */
304         OF_UBRA | OF_LBRA                       /* flags */
305     },
306     {   OP65_JNE,                               /* opcode */
307         "jne",                                  /* mnemonic */
308         5,                                      /* size */
309         REG_NONE,                               /* use */
310         REG_NONE,                               /* chg */
311         OF_CBRA | OF_LBRA | OF_ZBRA | OF_FBRA   /* flags */
312     },
313     {   OP65_JPL,                               /* opcode */
314         "jpl",                                  /* mnemonic */
315         5,                                      /* size */
316         REG_NONE,                               /* use */
317         REG_NONE,                               /* chg */
318         OF_CBRA | OF_LBRA | OF_FBRA             /* flags */
319     },
320     {   OP65_JSR,                               /* opcode */
321         "jsr",                                  /* mnemonic */
322         3,                                      /* size */
323         REG_NONE,                               /* use */
324         REG_NONE,                               /* chg */
325         OF_CALL                                 /* flags */
326     },
327     {   OP65_JVC,                               /* opcode */
328         "jvc",                                  /* mnemonic */
329         5,                                      /* size */
330         REG_NONE,                               /* use */
331         REG_NONE,                               /* chg */
332         OF_CBRA | OF_LBRA                       /* flags */
333     },
334     {   OP65_JVS,                               /* opcode */
335         "jvs",                                  /* mnemonic */
336         5,                                      /* size */
337         REG_NONE,                               /* use */
338         REG_NONE,                               /* chg */
339         OF_CBRA | OF_LBRA                       /* flags */
340     },
341     {   OP65_LDA,                               /* opcode */
342         "lda",                                  /* mnemonic */
343         0,                                      /* size */
344         REG_NONE,                               /* use */
345         REG_A,                                  /* chg */
346         OF_LOAD | OF_SETF                       /* flags */
347     },
348     {   OP65_LDX,                               /* opcode */
349         "ldx",                                  /* mnemonic */
350         0,                                      /* size */
351         REG_NONE,                               /* use */
352         REG_X,                                  /* chg */
353         OF_LOAD | OF_SETF                       /* flags */
354     },
355     {   OP65_LDY,                               /* opcode */
356         "ldy",                                  /* mnemonic */
357         0,                                      /* size */
358         REG_NONE,                               /* use */
359         REG_Y,                                  /* chg */
360         OF_LOAD | OF_SETF                       /* flags */
361     },
362     {   OP65_LSR,                               /* opcode */
363         "lsr",                                  /* mnemonic */
364         0,                                      /* size */
365         REG_NONE,                               /* use */
366         REG_NONE,                               /* chg */
367         OF_SETF                                 /* flags */
368     },
369     {   OP65_NOP,                               /* opcode */
370         "nop",                                  /* mnemonic */
371         1,                                      /* size */
372         REG_NONE,                               /* use */
373         REG_NONE,                               /* chg */
374         OF_NONE                                 /* flags */
375     },
376     {   OP65_ORA,                               /* opcode */
377         "ora",                                  /* mnemonic */
378         0,                                      /* size */
379         REG_A,                                  /* use */
380         REG_A,                                  /* chg */
381         OF_SETF                                 /* flags */
382     },
383     {   OP65_PHA,                               /* opcode */
384         "pha",                                  /* mnemonic */
385         1,                                      /* size */
386         REG_A,                                  /* use */
387         REG_NONE,                               /* chg */
388         OF_NONE                                 /* flags */
389     },
390     {   OP65_PHP,                               /* opcode */
391         "php",                                  /* mnemonic */
392         1,                                      /* size */
393         REG_NONE,                               /* use */
394         REG_NONE,                               /* chg */
395         OF_NONE                                 /* flags */
396     },
397     {   OP65_PHX,                               /* opcode */
398         "phx",                                  /* mnemonic */
399         1,                                      /* size */
400         REG_X,                                  /* use */
401         REG_NONE,                               /* chg */
402         OF_NONE                                 /* flags */
403     },
404     {   OP65_PHY,                               /* opcode */
405         "phy",                                  /* mnemonic */
406         1,                                      /* size */
407         REG_Y,                                  /* use */
408         REG_NONE,                               /* chg */
409         OF_NONE                                 /* flags */
410     },
411     {   OP65_PLA,                               /* opcode */
412         "pla",                                  /* mnemonic */
413         1,                                      /* size */
414         REG_NONE,                               /* use */
415         REG_A,                                  /* chg */
416         OF_SETF                                 /* flags */
417     },
418     {   OP65_PLP,                               /* opcode */
419         "plp",                                  /* mnemonic */
420         1,                                      /* size */
421         REG_NONE,                               /* use */
422         REG_NONE,                               /* chg */
423         OF_NONE                                 /* flags */
424     },
425     {   OP65_PLX,                               /* opcode */
426         "plx",                                  /* mnemonic */
427         1,                                      /* size */
428         REG_NONE,                               /* use */
429         REG_X,                                  /* chg */
430         OF_SETF                                 /* flags */
431     },
432     {   OP65_PLY,                               /* opcode */
433         "ply",                                  /* mnemonic */
434         1,                                      /* size */
435         REG_NONE,                               /* use */
436         REG_Y,                                  /* chg */
437         OF_SETF                                 /* flags */
438     },
439     {   OP65_ROL,                               /* opcode */
440         "rol",                                  /* mnemonic */
441         0,                                      /* size */
442         REG_NONE,                               /* use */
443         REG_NONE,                               /* chg */
444         OF_SETF                                 /* flags */
445     },
446     {   OP65_ROR,                               /* opcode */
447         "ror",                                  /* mnemonic */
448         0,                                      /* size */
449         REG_NONE,                               /* use */
450         REG_NONE,                               /* chg */
451         OF_SETF                                 /* flags */
452     },
453     {   OP65_RTI,                               /* opcode */
454         "rti",                                  /* mnemonic */
455         1,                                      /* size */
456         REG_NONE,                               /* use */
457         REG_NONE,                               /* chg */
458         OF_RET                                  /* flags */
459     },
460     {   OP65_RTS,                               /* opcode */
461         "rts",                                  /* mnemonic */
462         1,                                      /* size */
463         REG_NONE,                               /* use */
464         REG_NONE,                               /* chg */
465         OF_RET                                  /* flags */
466     },
467     {   OP65_SBC,                               /* opcode */
468         "sbc",                                  /* mnemonic */
469         0,                                      /* size */
470         REG_A,                                  /* use */
471         REG_A,                                  /* chg */
472         OF_SETF                                 /* flags */
473     },
474     {   OP65_SEC,                               /* opcode */
475         "sec",                                  /* mnemonic */
476         1,                                      /* size */
477         REG_NONE,                               /* use */
478         REG_NONE,                               /* chg */
479         OF_NONE                                 /* flags */
480     },
481     {   OP65_SED,                               /* opcode */
482         "sed",                                  /* mnemonic */
483         1,                                      /* size */
484         REG_NONE,                               /* use */
485         REG_NONE,                               /* chg */
486         OF_NONE                                 /* flags */
487     },
488     {   OP65_SEI,                               /* opcode */
489         "sei",                                  /* mnemonic */
490         1,                                      /* size */
491         REG_NONE,                               /* use */
492         REG_NONE,                               /* chg */
493         OF_NONE                                 /* flags */
494     },
495     {   OP65_STA,                               /* opcode */
496         "sta",                                  /* mnemonic */
497         0,                                      /* size */
498         REG_A,                                  /* use */
499         REG_NONE,                               /* chg */
500         OF_STORE                                /* flags */
501     },
502     {   OP65_STX,                               /* opcode */
503         "stx",                                  /* mnemonic */
504         0,                                      /* size */
505         REG_X,                                  /* use */
506         REG_NONE,                               /* chg */
507         OF_STORE                                /* flags */
508     },
509     {   OP65_STY,                               /* opcode */
510         "sty",                                  /* mnemonic */
511         0,                                      /* size */
512         REG_Y,                                  /* use */
513         REG_NONE,                               /* chg */
514         OF_STORE                                /* flags */
515     },
516     {   OP65_STZ,                               /* opcode */
517         "stz",                                  /* mnemonic */
518         0,                                      /* size */
519         REG_NONE,                               /* use */
520         REG_NONE,                               /* chg */
521         OF_STORE                                /* flags */
522     },
523     {   OP65_TAX,                               /* opcode */
524         "tax",                                  /* mnemonic */
525         1,                                      /* size */
526         REG_A,                                  /* use */
527         REG_X,                                  /* chg */
528         OF_XFR | OF_SETF                        /* flags */
529     },
530     {   OP65_TAY,                               /* opcode */
531         "tay",                                  /* mnemonic */
532         1,                                      /* size */
533         REG_A,                                  /* use */
534         REG_Y,                                  /* chg */
535         OF_XFR | OF_SETF                        /* flags */
536     },
537     {   OP65_TRB,                               /* opcode */
538         "trb",                                  /* mnemonic */
539         0,                                      /* size */
540         REG_A,                                  /* use */
541         REG_NONE,                               /* chg */
542         OF_SETF                                 /* flags */
543     },
544     {   OP65_TSB,                               /* opcode */
545         "tsb",                                  /* mnemonic */
546         0,                                      /* size */
547         REG_A,                                  /* use */
548         REG_NONE,                               /* chg */
549         OF_SETF                                 /* flags */
550     },
551     {   OP65_TSX,                               /* opcode */
552         "tsx",                                  /* mnemonic */
553         1,                                      /* size */
554         REG_NONE,                               /* use */
555         REG_X,                                  /* chg */
556         OF_XFR | OF_SETF                        /* flags */
557     },
558     {   OP65_TXA,                               /* opcode */
559         "txa",                                  /* mnemonic */
560         1,                                      /* size */
561         REG_X,                                  /* use */
562         REG_A,                                  /* chg */
563         OF_XFR | OF_SETF                        /* flags */
564     },
565     {   OP65_TXS,                               /* opcode */
566         "txs",                                  /* mnemonic */
567         1,                                      /* size */
568         REG_X,                                  /* use */
569         REG_NONE,                               /* chg */
570         OF_XFR                                  /* flags */
571     },
572     {   OP65_TYA,                               /* opcode */
573         "tya",                                  /* mnemonic */
574         1,                                      /* size */
575         REG_Y,                                  /* use */
576         REG_A,                                  /* chg */
577         OF_XFR | OF_SETF                        /* flags */
578     },
579 };
580
581
582
583 /*****************************************************************************/
584 /*                                   Code                                    */
585 /*****************************************************************************/
586
587
588
589 static int FindCmp (const void* Key, const void* Desc)
590 /* Compare function for FindOpcode */
591 {
592     return strcmp (Key, ((OPCDesc*)Desc)->Mnemo);
593 }
594
595
596
597 const OPCDesc* FindOP65 (const char* M)
598 /* Find the given opcode and return the opcode number. If the opcode was not
599  * found, return NULL.
600  */
601 {
602     unsigned I;
603     unsigned Len;
604
605     /* Check the length of the given string, then copy it into local
606      * storage, converting it to upper case.
607      */
608     char Mnemo[sizeof (OPCTable[0].Mnemo)];
609     Len = strlen (M);
610     if (Len >= sizeof (OPCTable[0].Mnemo)) {
611         /* Invalid length means invalid opcode */
612         return 0;
613     }
614     for (I = 0; I < Len; ++I) {
615         Mnemo[I] = tolower (M[I]);
616     }
617     Mnemo[I] = '\0';
618
619     /* Search for the mnemonic in the table and return the result */
620     return bsearch (Mnemo, OPCTable+OP65_FIRST, OP65_COUNT,
621                     sizeof (OPCTable[0]), FindCmp );
622 }
623
624
625
626 unsigned GetInsnSize (opc_t OPC, am_t AM)
627 /* Return the size of the given instruction */
628 {
629     /* Get the opcode desc and check the size given there */
630     const OPCDesc* D = &OPCTable[OPC];
631     if (D->Size != 0) {
632         return D->Size;
633     }
634
635     /* Check the addressing mode. */
636     switch (AM) {
637         case AM65_IMP:     return 1;
638         case AM65_ACC:     return 1;
639         case AM65_IMM:     return 2;
640         case AM65_ZP:      return 2;
641         case AM65_ZPX:     return 2;
642         case AM65_ABS:     return 3;
643         case AM65_ABSX:    return 3;
644         case AM65_ABSY:    return 3;
645         case AM65_ZPX_IND: return 2;
646         case AM65_ZP_INDY: return 2;
647         case AM65_ZP_IND:  return 2;
648         default:
649             Internal ("Invalid addressing mode");
650             return 0;
651     }
652 }
653
654
655
656 unsigned char GetAMUseInfo (am_t AM)
657 /* Get usage info for the given addressing mode (addressing modes that use
658  * index registers return REG_r info for these registers).
659  */
660 {
661     /* Check the addressing mode. */
662     switch (AM) {
663         case AM65_ACC:     return REG_A;
664         case AM65_ZPX:     return REG_X;
665         case AM65_ABSX:    return REG_X;
666         case AM65_ABSY:    return REG_Y;
667         case AM65_ZPX_IND: return REG_X;
668         case AM65_ZP_INDY: return REG_Y;
669         default:           return REG_NONE;
670     }
671 }
672
673
674
675 opc_t GetInverseBranch (opc_t OPC)
676 /* Return a branch that reverse the condition of the branch given in OPC */
677 {
678     switch (OPC) {
679         case OP65_BCC:  return OP65_BCS;
680         case OP65_BCS:  return OP65_BCC;
681         case OP65_BEQ:  return OP65_BNE;
682         case OP65_BMI:  return OP65_BPL;
683         case OP65_BNE:  return OP65_BEQ;
684         case OP65_BPL:  return OP65_BMI;
685         case OP65_BVC:  return OP65_BVS;
686         case OP65_BVS:  return OP65_BVC;
687         case OP65_JCC:  return OP65_JCS;
688         case OP65_JCS:  return OP65_JCC;
689         case OP65_JEQ:  return OP65_JNE;
690         case OP65_JMI:  return OP65_JPL;
691         case OP65_JNE:  return OP65_JEQ;
692         case OP65_JPL:  return OP65_JMI;
693         case OP65_JVC:  return OP65_JVS;
694         case OP65_JVS:  return OP65_JVC;
695         default:
696             Internal ("GetInverseBranch: Invalid opcode: %d", OPC);
697             return 0;
698     }
699 }
700
701
702
703 opc_t MakeShortBranch (opc_t OPC)
704 /* Return the short version of the given branch. If the branch is already
705  * a short branch, return the opcode unchanged.
706  */
707 {
708     switch (OPC) {
709         case OP65_BCC:
710         case OP65_JCC:  return OP65_BCC;
711         case OP65_BCS:
712         case OP65_JCS:  return OP65_BCS;
713         case OP65_BEQ:
714         case OP65_JEQ:  return OP65_BEQ;
715         case OP65_BMI:
716         case OP65_JMI:  return OP65_BMI;
717         case OP65_BNE:
718         case OP65_JNE:  return OP65_BNE;
719         case OP65_BPL:
720         case OP65_JPL:  return OP65_BPL;
721         case OP65_BVC:
722         case OP65_JVC:  return OP65_BVC;
723         case OP65_BVS:
724         case OP65_JVS:  return OP65_BVS;
725         case OP65_BRA:
726         case OP65_JMP:  return (CPU == CPU_65C02)? OP65_BRA : OP65_JMP;
727         default:
728             Internal ("MakeShortBranch: Invalid opcode: %d", OPC);
729             return 0;
730     }
731 }
732
733
734
735 opc_t MakeLongBranch (opc_t OPC)
736 /* Return the long version of the given branch. If the branch is already
737  * a long branch, return the opcode unchanged.
738  */
739 {
740     switch (OPC) {
741         case OP65_BCC:
742         case OP65_JCC:  return OP65_JCC;
743         case OP65_BCS:
744         case OP65_JCS:  return OP65_JCS;
745         case OP65_BEQ:
746         case OP65_JEQ:  return OP65_JEQ;
747         case OP65_BMI:
748         case OP65_JMI:  return OP65_JMI;
749         case OP65_BNE:
750         case OP65_JNE:  return OP65_JNE;
751         case OP65_BPL:
752         case OP65_JPL:  return OP65_JPL;
753         case OP65_BVC:
754         case OP65_JVC:  return OP65_JVC;
755         case OP65_BVS:
756         case OP65_JVS:  return OP65_JVS;
757         case OP65_BRA:
758         case OP65_JMP:  return OP65_JMP;
759         default:
760             Internal ("MakeLongBranch: Invalid opcode: %d", OPC);
761             return 0;
762     }
763 }
764
765
766
767 bc_t GetBranchCond (opc_t OPC)
768 /* Get the condition for the conditional branch in OPC */
769 {
770     switch (OPC) {
771         case OP65_BCC:  return BC_CC;
772         case OP65_BCS:  return BC_CS;
773         case OP65_BEQ:  return BC_EQ;
774         case OP65_BMI:  return BC_MI;
775         case OP65_BNE:  return BC_NE;
776         case OP65_BPL:  return BC_PL;
777         case OP65_BVC:  return BC_VC;
778         case OP65_BVS:  return BC_VS;
779         case OP65_JCC:  return BC_CC;
780         case OP65_JCS:  return BC_CS;
781         case OP65_JEQ:  return BC_EQ;
782         case OP65_JMI:  return BC_MI;
783         case OP65_JNE:  return BC_NE;
784         case OP65_JPL:  return BC_PL;
785         case OP65_JVC:  return BC_VC;
786         case OP65_JVS:  return BC_VS;
787         default:
788             Internal ("GetBranchCond: Invalid opcode: %d", OPC);
789             return 0;
790     }
791 }
792
793
794
795 bc_t GetInverseCond (bc_t BC)
796 /* Return the inverse condition of the given one */
797 {
798     switch (BC) {
799         case BC_CC:     return BC_CS;
800         case BC_CS:     return BC_CC;
801         case BC_EQ:     return BC_NE;
802         case BC_MI:     return BC_PL;
803         case BC_NE:     return BC_EQ;
804         case BC_PL:     return BC_MI;
805         case BC_VC:     return BC_VS;
806         case BC_VS:     return BC_VC;
807         default:
808             Internal ("GetInverseCond: Invalid condition: %d", BC);
809             return 0;
810     }
811 }
812
813
814
815