]> git.sur5r.net Git - cc65/blob - src/cc65/opcodes.c
Cosmetic changes
[cc65] / src / cc65 / opcodes.c
1 /*****************************************************************************/
2 /*                                                                           */
3 /*                                 opcodes.c                                 */
4 /*                                                                           */
5 /*                  Opcode and addressing mode definitions                   */
6 /*                                                                           */
7 /*                                                                           */
8 /*                                                                           */
9 /* (C) 2001      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
43 /* cc65 */
44 #include "codeinfo.h"
45 #include "cpu.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_A,                                  /* use */
79         REG_A,                                  /* 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_A,                                  /* use */
366         REG_A,                                  /* 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_A,                                  /* use */
443         REG_A,                                  /* chg */
444         OF_SETF                                 /* flags */
445     },
446     {   OP65_ROR,                               /* opcode */
447         "ror",                                  /* mnemonic */
448         0,                                      /* size */
449         REG_A,                                  /* use */
450         REG_A,                                  /* 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_TAX,                               /* opcode */
517         "tax",                                  /* mnemonic */
518         1,                                      /* size */
519         REG_A,                                  /* use */
520         REG_X,                                  /* chg */
521         OF_XFR | OF_SETF                        /* flags */
522     },
523     {   OP65_TAY,                               /* opcode */
524         "tay",                                  /* mnemonic */
525         1,                                      /* size */
526         REG_A,                                  /* use */
527         REG_Y,                                  /* chg */
528         OF_XFR | OF_SETF                        /* flags */
529     },
530     {   OP65_TRB,                               /* opcode */
531         "trb",                                  /* mnemonic */
532         0,                                      /* size */
533         REG_A,                                  /* use */
534         REG_NONE,                               /* chg */
535         OF_SETF                                 /* flags */
536     },
537     {   OP65_TSB,                               /* opcode */
538         "tsb",                                  /* mnemonic */
539         0,                                      /* size */
540         REG_A,                                  /* use */
541         REG_NONE,                               /* chg */
542         OF_SETF                                 /* flags */
543     },
544     {   OP65_TSX,                               /* opcode */
545         "tsx",                                  /* mnemonic */
546         1,                                      /* size */
547         REG_NONE,                               /* use */
548         REG_X,                                  /* chg */
549         OF_XFR | OF_SETF                        /* flags */
550     },
551     {   OP65_TXA,                               /* opcode */
552         "txa",                                  /* mnemonic */
553         1,                                      /* size */
554         REG_X,                                  /* use */
555         REG_A,                                  /* chg */
556         OF_XFR | OF_SETF                        /* flags */
557     },
558     {   OP65_TXS,                               /* opcode */
559         "txs",                                  /* mnemonic */
560         1,                                      /* size */
561         REG_X,                                  /* use */
562         REG_NONE,                               /* chg */
563         OF_XFR                                  /* flags */
564     },
565     {   OP65_TYA,                               /* opcode */
566         "tya",                                  /* mnemonic */
567         1,                                      /* size */
568         REG_Y,                                  /* use */
569         REG_A,                                  /* chg */
570         OF_XFR | OF_SETF                        /* flags */
571     },
572 };
573
574
575
576 /*****************************************************************************/
577 /*                                   Code                                    */
578 /*****************************************************************************/
579
580
581
582 static int FindCmp (const void* Key, const void* Desc)
583 /* Compare function for FindOpcode */
584 {
585     return strcmp (Key, ((OPCDesc*)Desc)->Mnemo);
586 }
587
588
589
590 const OPCDesc* FindOP65 (const char* M)
591 /* Find the given opcode and return the opcode number. If the opcode was not
592  * found, return NULL.
593  */
594 {
595     unsigned I;
596     unsigned Len;
597
598     /* Check the length of the given string, then copy it into local
599      * storage, converting it to upper case.
600      */
601     char Mnemo[sizeof (OPCTable[0].Mnemo)];
602     Len = strlen (M);
603     if (Len >= sizeof (OPCTable[0].Mnemo)) {
604         /* Invalid length means invalid opcode */
605         return 0;
606     }
607     for (I = 0; I < Len; ++I) {
608         Mnemo[I] = tolower (M[I]);
609     }
610     Mnemo[I] = '\0';
611
612     /* Search for the mnemonic in the table and return the result */
613     return bsearch (Mnemo, OPCTable+OP65_FIRST, OP65_COUNT,
614                     sizeof (OPCTable[0]), FindCmp );
615 }
616
617
618
619 unsigned GetInsnSize (opc_t OPC, am_t AM)
620 /* Return the size of the given instruction */
621 {
622     /* Get the opcode desc and check the size given there */
623     const OPCDesc* D = &OPCTable[OPC];
624     if (D->Size != 0) {
625         return D->Size;
626     }
627
628     /* Check the addressing mode. */
629     switch (AM) {
630         case AM65_IMP:     return 1;
631         case AM65_ACC:     return 1;
632         case AM65_IMM:     return 2;
633         case AM65_ZP:      return 2;
634         case AM65_ZPX:     return 2;
635         case AM65_ABS:     return 3;
636         case AM65_ABSX:    return 3;
637         case AM65_ABSY:    return 3;
638         case AM65_ZPX_IND: return 2;
639         case AM65_ZP_INDY: return 2;
640         case AM65_ZP_IND:  return 2;
641         default:
642             Internal ("Invalid addressing mode");
643             return 0;
644     }
645 }
646
647
648
649 unsigned char GetAMUseInfo (am_t AM)
650 /* Get usage info for the given addressing mode (addressing modes that use
651  * index registers return REG_r info for these registers).
652  */
653 {
654     /* Check the addressing mode. */
655     switch (AM) {
656         case AM65_ACC:     return REG_A;
657         case AM65_ZPX:     return REG_X;
658         case AM65_ABSX:    return REG_X;
659         case AM65_ABSY:    return REG_Y;
660         case AM65_ZPX_IND: return REG_X;
661         case AM65_ZP_INDY: return REG_Y;
662         default:           return REG_NONE;
663     }
664 }
665
666
667
668 opc_t GetInverseBranch (opc_t OPC)
669 /* Return a branch that reverse the condition of the branch given in OPC */
670 {
671     switch (OPC) {
672         case OP65_BCC:  return OP65_BCS;
673         case OP65_BCS:  return OP65_BCC;
674         case OP65_BEQ:  return OP65_BNE;
675         case OP65_BMI:  return OP65_BPL;
676         case OP65_BNE:  return OP65_BEQ;
677         case OP65_BPL:  return OP65_BMI;
678         case OP65_BVC:  return OP65_BVS;
679         case OP65_BVS:  return OP65_BVC;
680         case OP65_JCC:  return OP65_JCS;
681         case OP65_JCS:  return OP65_JCC;
682         case OP65_JEQ:  return OP65_JNE;
683         case OP65_JMI:  return OP65_JPL;
684         case OP65_JNE:  return OP65_JEQ;
685         case OP65_JPL:  return OP65_JMI;
686         case OP65_JVC:  return OP65_JVS;
687         case OP65_JVS:  return OP65_JVC;
688         default:
689             Internal ("GetInverseBranch: Invalid opcode: %d", OPC);
690             return 0;
691     }
692 }
693
694
695
696 opc_t MakeShortBranch (opc_t OPC)
697 /* Return the short version of the given branch. If the branch is already
698  * a short branch, return the opcode unchanged.
699  */
700 {
701     switch (OPC) {
702         case OP65_BCC:
703         case OP65_JCC:  return OP65_BCC;
704         case OP65_BCS:
705         case OP65_JCS:  return OP65_BCS;
706         case OP65_BEQ:
707         case OP65_JEQ:  return OP65_BEQ;
708         case OP65_BMI:
709         case OP65_JMI:  return OP65_BMI;
710         case OP65_BNE:
711         case OP65_JNE:  return OP65_BNE;
712         case OP65_BPL:
713         case OP65_JPL:  return OP65_BPL;
714         case OP65_BVC:
715         case OP65_JVC:  return OP65_BVC;
716         case OP65_BVS:
717         case OP65_JVS:  return OP65_BVS;
718         case OP65_BRA:
719         case OP65_JMP:  return (CPU == CPU_65C02)? OP65_BRA : OP65_JMP;
720         default:
721             Internal ("MakeShortBranch: Invalid opcode: %d", OPC);
722             return 0;
723     }
724 }
725
726
727
728 opc_t MakeLongBranch (opc_t OPC)
729 /* Return the long version of the given branch. If the branch is already
730  * a long branch, return the opcode unchanged.
731  */
732 {
733     switch (OPC) {
734         case OP65_BCC:
735         case OP65_JCC:  return OP65_JCC;
736         case OP65_BCS:
737         case OP65_JCS:  return OP65_JCS;
738         case OP65_BEQ:
739         case OP65_JEQ:  return OP65_JEQ;
740         case OP65_BMI:
741         case OP65_JMI:  return OP65_JMI;
742         case OP65_BNE:
743         case OP65_JNE:  return OP65_JNE;
744         case OP65_BPL:
745         case OP65_JPL:  return OP65_JPL;
746         case OP65_BVC:
747         case OP65_JVC:  return OP65_JVC;
748         case OP65_BVS:
749         case OP65_JVS:  return OP65_JVS;
750         case OP65_BRA:
751         case OP65_JMP:  return OP65_JMP;
752         default:
753             Internal ("MakeLongBranch: Invalid opcode: %d", OPC);
754             return 0;
755     }
756 }
757
758
759
760 bc_t GetBranchCond (opc_t OPC)
761 /* Get the condition for the conditional branch in OPC */
762 {
763     switch (OPC) {
764         case OP65_BCC:  return BC_CC;
765         case OP65_BCS:  return BC_CS;
766         case OP65_BEQ:  return BC_EQ;
767         case OP65_BMI:  return BC_MI;
768         case OP65_BNE:  return BC_NE;
769         case OP65_BPL:  return BC_PL;
770         case OP65_BVC:  return BC_VC;
771         case OP65_BVS:  return BC_VS;
772         case OP65_JCC:  return BC_CC;
773         case OP65_JCS:  return BC_CS;
774         case OP65_JEQ:  return BC_EQ;
775         case OP65_JMI:  return BC_MI;
776         case OP65_JNE:  return BC_NE;
777         case OP65_JPL:  return BC_PL;
778         case OP65_JVC:  return BC_VC;
779         case OP65_JVS:  return BC_VS;
780         default:        
781             Internal ("GetBranchCond: Invalid opcode: %d", OPC);
782             return 0;
783     }
784 }
785
786
787
788 bc_t GetInverseCond (bc_t BC)
789 /* Return the inverse condition of the given one */
790 {
791     switch (BC) {
792         case BC_CC:     return BC_CS;
793         case BC_CS:     return BC_CC;
794         case BC_EQ:     return BC_NE;
795         case BC_MI:     return BC_PL;
796         case BC_NE:     return BC_EQ;
797         case BC_PL:     return BC_MI;
798         case BC_VC:     return BC_VS;
799         case BC_VS:     return BC_VC;
800         default:
801             Internal ("GetInverseCond: Invalid condition: %d", BC);
802             return 0;
803     }
804 }
805
806
807
808