4 * Copyright (C) 2010 Alan R. Baldwin
5 * Copyright (C) 2022-2023 Philipp K. Krause
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
40 * Opcode Cycle Definitions
42 #define OPCY_SDP ((char) (0xFF))
43 #define OPCY_ERR ((char) (0xFE))
44 #define OPCY_SKP ((char) (0xFD))
46 /* OPCY_NONE ((char) (0x80)) */
47 /* OPCY_MASK ((char) (0x7F)) */
49 #define UN ((char) (OPCY_NONE | 0x00))
50 #define P1 ((char) (OPCY_NONE | 0x01))
51 #define P2 ((char) (OPCY_NONE | 0x02))
52 #define P3 ((char) (OPCY_NONE | 0x03))
53 #define P4 ((char) (OPCY_NONE | 0x04))
56 * stm8 Opcode Cycle Pages
59 static char stm8pg
[256] = {
60 /*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
61 /*--*--* - - - - - - - - - - - - - - - - */
62 /*00*/ 1, 1, 1, 1, 1,UN
, 1, 1, 1, 1, 1,UN
, 1, 1, 1, 1,
63 /*10*/ 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2,
64 /*20*/ 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
65 /*30*/ 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
66 /*40*/ 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
67 /*50*/ 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1,
68 /*60*/ 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
69 /*70*/ 1,UN
,P1
, 1, 1,UN
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
70 /*80*/ 11, 4,UN
, 9, 1, 2, 1, 5, 1, 2, 1,UN
, 1, 5,10,10,
71 /*90*/ P2
,P3
,P4
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
72 /*A0*/ 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 1,
73 /*B0*/ 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
74 /*C0*/ 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 2,
75 /*D0*/ 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 2,
76 /*E0*/ 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 2,
77 /*F0*/ 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 2
80 static char pg72
[256] = { /* P1: PreByte == 72 */
81 /*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
82 /*--*--* - - - - - - - - - - - - - - - - */
83 /*00*/ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
84 /*10*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
85 /*20*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
86 /*30*/ 4,UN
,UN
, 4, 4,UN
, 4, 4, 4, 4, 4,UN
, 4, 4, 4, 4,
87 /*40*/ 1,UN
,UN
, 1, 1,UN
, 1, 1, 1, 1, 1,UN
, 1, 1, 1, 1,
88 /*50*/ 1,UN
,UN
, 1, 1,UN
, 1, 1, 1, 1, 1,UN
, 1, 1, 1, 1,
89 /*60*/ 4,UN
,UN
, 4, 4,UN
, 4, 4, 4, 4, 4,UN
, 4, 4, 4, 4,
90 /*70*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
91 /*80*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
, 1,
92 /*90*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
93 /*A0*/ UN
,UN
, 2,UN
,UN
,UN
,UN
,UN
,UN
, 2,UN
,UN
,UN
,UN
,UN
,UN
,
94 /*B0*/ 2,UN
, 2,UN
,UN
,UN
,UN
,UN
,UN
, 2,UN
, 2,UN
,UN
,UN
,UN
,
95 /*C0*/ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 6, 5, 5,
96 /*D0*/ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 6, 5, 5,
97 /*E0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
98 /*F0*/ 2,UN
, 2,UN
,UN
,UN
,UN
,UN
,UN
, 2,UN
, 2,UN
,UN
,UN
,UN
,
101 static char pg90
[256] = { /* P2: PreByte == 90 */
102 /*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
103 /*--*--* - - - - - - - - - - - - - - - - */
104 /*00*/ UN
, 1, 1,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
105 /*10*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
106 /*20*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
, 1, 1,UN
,UN
, 1, 1, 1, 1,
107 /*30*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
108 /*40*/ 1,UN
, 4, 1, 1,UN
, 1, 1, 1, 1, 1,UN
, 1, 1, 1, 1,
109 /*50*/ 2,UN
,UN
, 2, 2,UN
, 2, 2, 2, 2, 2,UN
, 1, 2, 1, 1,
110 /*60*/ 1,UN
, 2, 1, 1,UN
, 1, 1, 1, 1, 1,UN
, 1, 1, 1, 1,
111 /*70*/ 1,UN
,UN
, 1, 1,UN
, 1, 1, 1, 1, 1,UN
, 1, 1, 1, 1,
112 /*80*/ UN
,UN
,UN
,UN
,UN
, 2,UN
,UN
,UN
, 2,UN
,UN
,UN
,UN
,UN
,UN
,
113 /*90*/ UN
,UN
,UN
, 1, 1, 1, 1, 1,UN
,UN
,UN
,UN
,UN
,UN
, 1, 1,
114 /*A0*/ UN
,UN
,UN
, 2,UN
,UN
,UN
, 1,UN
,UN
,UN
,UN
,UN
,UN
, 2, 1,
115 /*B0*/ UN
,UN
,UN
, 2,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
, 2, 2,
116 /*C0*/ UN
,UN
,UN
, 2,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
, 2, 2,
117 /*D0*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 2,
118 /*E0*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 2,
119 /*F0*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 2
122 static char pg91
[256] = { /* P3: PreByte == 91 */
123 /*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
124 /*--*--* - - - - - - - - - - - - - - - - */
125 /*00*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
126 /*10*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
127 /*20*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
128 /*30*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
129 /*40*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
130 /*50*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
131 /*60*/ 4,UN
,UN
, 4, 4,UN
, 4, 4, 4, 4, 4,UN
, 4, 4, 4, 4,
132 /*70*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
133 /*80*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
134 /*90*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
135 /*A0*/ 10,UN
,UN
,UN
,UN
,UN
,UN
, 1,UN
,UN
,UN
,UN
,UN
,UN
,UN
, 1,
136 /*B0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
137 /*C0*/ UN
,UN
,UN
, 5,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
, 5, 5,
138 /*D0*/ 4, 4, 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 5, 6, 5, 5,
139 /*E0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
140 /*F0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
143 static char pg92
[256] = { /* P4: PreByte == 92 */
144 /*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
145 /*--*--* - - - - - - - - - - - - - - - - */
146 /*00*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
147 /*10*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
148 /*20*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
149 /*30*/ 4,UN
,UN
, 4, 4,UN
, 4, 4, 4, 4, 4,UN
, 4, 4, 4, 4,
150 /*40*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
151 /*50*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
152 /*60*/ 4,UN
,UN
, 4, 4,UN
, 4, 4, 4, 4, 4,UN
, 4, 4, 4, 4,
153 /*70*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
154 /*80*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
, 8,UN
,UN
,
155 /*90*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
156 /*A0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
, 4,UN
,UN
,UN
,UN
, 6,UN
,UN
, 5,
157 /*B0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
, 5, 4,UN
,UN
,
158 /*C0*/ 4, 4, 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 5, 6, 5, 5,
159 /*D0*/ 4, 4, 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 5, 6, 5, 5,
160 /*E0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
161 /*F0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
164 static char *Page
[5] = {
165 stm8pg
, pg72
, pg90
, pg91
, pg92
169 * Process a machine op.
175 struct expr e1
, e2
, e3
;
183 op
= (int) mp
->m_valu
;
195 if(t2
== S_REG
&& r2
== XL
) { // swapped operand.
205 outab(OPCODE_SWAPOP
);
213 if(rf
== S_2OPSUB
) // Immediate operand invalid for sub and sbc.
261 if(rf
== S_1OPPUSH
&& t1
== S_IMM
) { // push #i
274 outab(op
+ (t1
== S_SPREL
? 0x01 : 0x03));
297 if(!comma(rf
!= S_2OPWSBC
&& rf
!= S_2OPWADC
)) { // Handle 1-op variants of sbcw and adcw
309 if(rf
== S_2OPWADD
&& t1
== S_REG
&& r1
== SP
&& t2
== S_IMM
&& !d_mode(&e2
)) { // addw sp, #d
314 else if(rf
== S_2OPWADD
&& t1
== S_REG
&& t2
== S_IMM
&& !d_mode(&e2
)) { // addw y, #d
321 if(t2
== S_REG
&& r1
== X
&& r2
== Y
|| t1
== S_SPREL
|| t1
== S_DIR
) { // swapped operands.
331 outab(OPCODE_SWAPOP
);
339 if(rf
== S_2OPWSUB
|| rf
== S_2OPWSBC
) // Immediate operand invalid for subw and sbcw.
371 if(rf
== S_1OPWPUSH
&& t1
== S_IMM
) { // pushw #ii
409 if(t1
== S_REG
&& !(t2
== S_REG
&& r2
== XL
)) {
434 else if (r1
== ZL
&& r2
== X
|| r1
== YL
&& r2
== Z
)
465 else if(t1
== S_REG
&& t2
== S_REG
&& r2
== XL
) { // Use swapop prefix
466 outab(OPCODE_SWAPOP
);
481 else if(t2
== S_REG
) {
500 if(r1
== Y
&& (r2
== XL
|| r2
== XH
|| r2
== ZL
|| r2
== ZH
))
502 else if (r1
== Z
&& r2
== YL
|| r1
== X
&& r2
== ZL
)
530 if (t1
== S_YREL
&& r2
== Z
)
549 if(t1
== S_REG
&& r1
== X
&& t2
== S_REG
&& r2
== Y
) {
553 else if(t1
== S_REG
&& r1
== Z
&& t2
== S_REG
&& r2
== Y
) {
557 else if(t1
== S_REG
&& r1
== X
&& t2
== S_REG
&& r2
== Z
) {
558 outab(OPCODE_ALTACC3
);
562 else if(t1
== S_REG
&& r1
== Z
&& t2
== S_REG
&& r2
== X
) {
563 outab(OPCODE_ALTACC2
);
567 else if(t1
== S_REG
&& r1
== SP
&& t2
== S_REG
&& r2
== Y
) { // ldw sp, y
568 outab(OPCODE_SWAPOP
);
572 else if (t1
== S_REG
&& t2
== S_REG
&& r2
== SP
) { // ldw y, sp
577 else if(t1
== S_REG
&& t2
== S_IX
&& (r1
== X
&& r2
== Y
|| r1
== Z
&& r2
== Y
|| r1
== Z
&& r2
== X
|| r1
== Y
&& r2
== Z
)) { // ldw x, (y)
578 if (r1
== Z
&& r2
== Y
)
579 outab (OPCODE_ALTACC5
);
580 else if (r1
== Z
&& r2
== X
)
581 outab (OPCODE_ALTACC3
);
582 else if (r1
== Y
&& r2
== Z
)
583 outab (OPCODE_ALTACC2
);
587 else if(t1
== S_REG
) {
591 if (!d_mode(&e2
)) { // ldw y, #d
622 if((r1
== Y
|| r1
== Z
|| r1
== X
) && r1
== r2
)
640 else if(t1
== S_IX
&& t2
== S_REG
&& (r1
== Y
&& r2
== X
|| r1
== Z
&& r2
== Y
|| r1
== X
&& r2
== Z
|| r1
== Y
&& r2
== Z
)) {
645 else if(t1
== S_YREL
&& t2
== S_REG
&& (r2
== X
|| r2
== Z
)) {
647 outab (OPCODE_ALTACC3
);
656 else if(t2
== S_REG
) {
710 if (t1
== S_REG
&& r1
== F
&& t2
== S_SPREL
) { // xch f, (n, sp)
732 if (!((r1
== XL
|| r1
== XH
) && r2
== Y
) && !(r1
== YL
&& r2
== Z
) && !(r1
== ZL
&& r2
== X
))
737 if (r1
== YL
&& r2
== YH
)
739 else if (r1
== XL
&& r2
== XH
) {
740 outab(OPCODE_ALTACC3
);
743 else if (r1
== ZL
&& r2
== ZH
) {
744 outab(OPCODE_ALTACC2
);
762 if (t1
== S_REG
&& t2
== S_IMM
) {
781 if(t1
!= S_REG
|| r1
!= X
)
783 if(t3
!= S_REG
|| r3
!= YL
)
819 if(t1
== S_REG
&& t2
== S_IX
&& (r1
== X
&& r2
== Y
|| r1
== Y
&& r2
== Z
|| r1
== Z
&& r2
== X
)) {
823 else if(t1
== S_REG
&& t2
== S_IX
&& (r1
== Z
&& r2
== Y
)) {
824 outab(OPCODE_ALTACC5
);
827 else if(t2
!= S_SPREL
|| ls_mode(&e2
))
844 if(rf
== S_0OPWSLL
&& comma(0)) {
851 if(t1
== S_REG
&& rf
!= S_0OPWDEC
) {
855 else if((rf
== S_0OPWRLC
|| rf
== S_0OPWDEC
) && t1
== S_SPREL
) {
874 if(t1
== S_REG
&& t2
== S_IMM
) {
902 int v3
= (int) e3
.e_addr
;
904 if(t1
== S_REG
&& t2
== S_DIR
&& t3
== S_IMM
&& (v3
<= 7)) {
914 outab(OPCODE_SWAPOP
);
919 int v1
= (int)(e1
.e_addr
- dot
.s_addr
+ 1);
920 if((v1
< -128) || (v1
> 127))
927 if(e1
.e_mode
!= S_USER
) {
936 if (t1
== S_REG
&& r1
== YH
)
938 else if (t1
== S_REG
&& r1
== XH
)
940 else if (t1
== S_REG
&& r1
== ZH
)
947 int v2
= (int)(e2
.e_addr
- dot
.s_addr
+ 1);
948 if((v2
< -128) || (v2
> 127))
955 if(e2
.e_mode
!= S_USER
) {
968 else if(t1
== S_IMM
) {
993 if(t1
== S_IX
&& t2
== S_REG
&& t3
== S_IMM
&&
994 (r1
== Y
&& r2
== XL
|| r1
== Y
&& r2
== XH
|| r1
== Z
&& r2
== YL
|| r1
== X
&& r2
== ZL
|| r1
== Y
&& r2
== ZH
)) {
1014 if(t1
== S_IX
&& r1
== Y
&& t2
== S_REG
&& r2
== ZL
&& t3
== S_REG
&& (r3
== XL
|| r3
== XH
)) {
1033 if(t1
== S_IX
&& r1
== Y
&& t2
== S_REG
&& r2
== Z
&& t3
== S_REG
&& r3
== X
)
1041 opcycles
= OPCY_ERR
;
1046 if (opcycles
== OPCY_NONE
) {
1047 opcycles
= stm8pg
[cb
[0] & 0xFF];
1048 if ((opcycles
& OPCY_NONE
) && (opcycles
& OPCY_MASK
)) {
1049 opcycles
= Page
[opcycles
& OPCY_MASK
][cb
[1] & 0xFF];
1055 * Disable Opcode Cycles with aerr()
1060 opcycles
= OPCY_SKP
;
1065 * Select the long or short addressing mode
1066 * based upon the expression type and value.
1067 * Return 1 for 16-bit offset, 0 for 8-bit offset.
1075 v
= (int) e
->e_addr
;
1077 * 1) area based arguments (e_base.e_ap != 0) use longer mode
1078 * 2) constant arguments (e_base.e_ap == 0) use
1079 * shorter mode if (arg & ~0xFF) == 0
1080 * longer mode if (arg & ~0xFF) != 0
1085 if (e
->e_base
.e_ap
) {
1089 if (e
->e_addr
>= dot
.s_addr
) {
1092 flag
= (v
& ~0xFF) ? 1 : 0;
1093 return(setbit(flag
) ? 1 : 0);
1095 return(getbit() ? 1 : 0);
1101 * Select the long or short immediate mode
1103 * based upon the expression type and value.
1104 * Return 1 for 16-bit, 0 for 8-bit.
1112 v
= (int) e
->e_addr
;
1114 * 1) area based arguments (e_base.e_ap != 0) use longer mode
1115 * 2) constant arguments (e_base.e_ap == 0) use
1116 * shorter mode if (arg & ~0x7F) == 0 or ~0x7f
1117 * longer mode otherwise
1122 if (e
->e_base
.e_ap
) {
1126 if (e
->e_addr
>= dot
.s_addr
) {
1129 flag
= (((v
& ~0x7f) & 0xffff) == (~0x7f & 0xffff) || (v
& ~0x7f) == 0) ? 0 : 1;
1130 return(setbit(flag
) ? 1 : 0);
1132 return(getbit() ? 1 : 0);
1138 * Generate an 'a' error if the absolute
1139 * value is not a valid unsigned or signed value.
1153 case 1: if ((v
& ~0x000000FFl
) && ((v
& ~0x000000FFl
) != ~0x000000FFl
)) aerr(); break;
1154 case 2: if ((v
& ~0x0000FFFFl
) && ((v
& ~0x0000FFFFl
) != ~0x0000FFFFl
)) aerr(); break;
1155 case 3: if ((v
& ~0x00FFFFFFl
) && ((v
& ~0x00FFFFFFl
) != ~0x00FFFFFFl
)) aerr(); break;
1156 case 4: if ((v
& ~0xFFFFFFFFl
) && ((v
& ~0xFFFFFFFFl
) != ~0xFFFFFFFFl
)) aerr(); break;
1158 case 1: if ((v
& ~0x000000FF) && ((v
& ~0x000000FF) != ~0x000000FF)) aerr(); break;
1159 case 2: if ((v
& ~0x0000FFFF) && ((v
& ~0x0000FFFF) != ~0x0000FFFF)) aerr(); break;
1160 case 3: if ((v
& ~0x00FFFFFF) && ((v
& ~0x00FFFFFF) != ~0x00FFFFFF)) aerr(); break;
1161 case 4: if ((v
& ~0xFFFFFFFF) && ((v
& ~0xFFFFFFFF) != ~0xFFFFFFFF)) aerr(); break;
1168 * Branch/Jump PCR Mode Check
1174 if (esp
->e_base
.e_ap
== dot
.s_area
) {
1177 if (esp
->e_flag
==0 && esp
->e_base
.e_ap
==NULL
) {
1179 * Absolute Destination
1181 * Use the global symbol '.__.ABS.'
1182 * of value zero and force the assembler
1183 * to use this absolute constant as the
1184 * base value for the relocation.
1187 esp
->e_base
.e_sp
= &sym
[1];
1193 * Machine specific initialization.
1206 hilo
= 0; // Little-endian
1216 * Store `b' in the next slot of the bit table.
1217 * If no room, force the longer form of the offset.
1236 * Get the next bit from the bit table.
1237 * If none left, return a `1'.
1238 * This will force the longer form of the offset.
1256 /* Emit prefix byte for alternative accumulator */
1258 void altacc(int reg
)
1262 outab(OPCODE_ALTACC1
);
1264 outab(OPCODE_ALTACC2
);
1266 outab(OPCODE_ALTACC3
);
1268 outab(OPCODE_ALTACC4
);
1270 outab(OPCODE_ALTACC5
);
1277 void altaccw(int reg
)
1281 outab(OPCODE_ALTACC3
);
1283 outab(OPCODE_ALTACC2
);
1290 void altaccw2(int reg0
, int reg1
)
1292 if(reg0
== Y
&& (reg1
== X
|| reg1
== XL
))
1294 else if (reg0
== Y
&& (reg1
== XH
))
1295 outab(OPCODE_ALTACC1
);
1296 else if (reg0
== Z
&& (reg1
== Y
|| reg1
== YL
))
1297 outab(OPCODE_ALTACC2
);
1298 else if (reg0
== X
&& (reg1
== Z
|| reg1
== ZL
))
1299 outab(OPCODE_ALTACC3
);
1300 else if (reg0
== Z
&& (reg1
== YH
))
1301 outab(OPCODE_ALTACC4
);
1302 else if (reg0
== Y
&& (reg1
== Z
|| reg1
== ZH
))
1303 outab(OPCODE_ALTACC5
);