annotate Examples/6502/isp.mc6502 @ 0:cfb7c6b24319

Initial revision
author kono
date Thu, 30 Aug 2007 14:57:44 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
1 ! ISPS Description of the MOS Technology MCS 6502 Microprocessor
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
2
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
3 ! G.W.Leive
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
4 ! 10 July 1978 ISPS Version
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
5 ! COPYRIGHT (C) 1978
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
6
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
7 MC6502 :=
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
8 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
9
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
10 **MP.STATE**
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
11 MACRO romlow:= |"F800 |,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
12 MACRO romhi := |"FFFF |,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
13 MACRO ramlow:= |"0000 |,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
14 MACRO ramhi := |"1000 |,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
15 MACRO maxb := |"FFFF |, ! High end of byte memory
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
16
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
17 Mb[0:maxb]<7:0>, ! Primary memory range
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
18 ram[ramlow:ramhi]<7:0> := mb[ramlow:ramhi]<7:0>, ! RAM
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
19 rom[romlow:romhi]<7:0> := mb[romlow:romhi]<7:0> ! ROM
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
20
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
21 **PC.STATE**
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
22
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
23 Pc<15:0>, ! Program counter
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
24
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
25 Y<7:0>, ! Index register
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
26 X<7:0>, ! Index register
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
27 S<7:0>, ! Stack pointer
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
28 Dl<7:0>, ! Input data latch
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
29 A<7:0>, ! Accumulator
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
30 Ir<7:0>, ! Instruction register
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
31 P<7:0>, ! Processor status
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
32 n<> := P<7>, ! Negative result
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
33 v<> := P<6>, ! Overflow
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
34 b<> := P<4>, ! Break command
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
35 d<> := P<3>, ! Decimal mode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
36 i<> := P<2>, ! Interrupt disable
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
37 z<> := P<1>, ! Zero
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
38 c<> := P<0>, ! Carry
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
39
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
40 Irq<>, ! Interrupt request
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
41 Nmi<>, ! Non-maskable interrupt
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
42 IFSync<>, ! High when instruction fetch
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
43 Rw<>, ! Read/Write control pin
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
44 So<>, ! Set overflow pin
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
45 Reset<>, ! Power up bit
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
46 Ready<> ! 1 means run, 0 means stop
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
47
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
48 **ADDRESS.CALCULATION**
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
49
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
50 immed()<15:0> := ! Immediate
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
51 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
52 immed = ab = Pc NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
53 Pc = Pc + 1
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
54 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
55
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
56 zp()<15:0> := ! Zero page
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
57 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
58 zp = ab = read(Pc) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
59 Pc = Pc + 1
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
60 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
61
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
62 abs()<15:0> := ! Absolute
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
63 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
64 abs = ab(Pc + 1, Pc) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
65 Pc = Pc + 2
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
66 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
67
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
68 indx()<15:0> := ! Indexed indirect - (IND, X)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
69 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
70 indx = ab((read(Pc) + X + 1)<7:0>, (read(Pc) + X)<7:0>) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
71 Pc = Pc + 1
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
72 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
73
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
74 indy()<15:0> := ! Indirect indexed - (IND), Y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
75 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
76 indy = ab = ab(read(Pc) + 1, read(Pc)) + Y NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
77 Pc = Pc + 1
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
78 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
79
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
80 zpx()<15:0> := ! Zero page indexed by X
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
81 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
82 zpx = ab = (read(Pc) + X)<7:0> NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
83 Pc = Pc + 1
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
84 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
85
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
86 zpy()<15:0> := ! Zero page indexed by Y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
87 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
88 zpy = ab = (read(Pc) + Y)<7:0> NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
89 Pc = Pc + 1
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
90 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
91
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
92
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
93 absy()<15:0> := ! Absolute modified by Y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
94 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
95 absy = ab = ab(Pc + 1, Pc) + Y NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
96 Pc = Pc + 2
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
97 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
98
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
99 absx()<15:0> := ! Ablolute modified by X
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
100 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
101 absx = ab = ab(Pc + 1, Pc) + X NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
102 Pc = Pc + 2
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
103 END
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
104
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
105 **SERVICE.FACILITIES**
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
106
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
107 push(dbb.<7:0>) := ! Push a byte on the stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
108 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
109 write(1@S, dbb.) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
110 S = S - 1
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
111 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
112
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
113 pull<7:0> := ! Pull a byte off the stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
114 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
115 S = S + 1 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
116 pull = read(1@S)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
117 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
118
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
119 opex := ! Operation exception
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
120 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
121 Ready = 0 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
122 RESTART run
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
123 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
124
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
125 setnz(ta.<7:0>) := ! Set neg and zero condition code
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
126 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
127 z = ta. EQL 0; n = ta.<7>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
128 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
129
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
130 branch(cond<>) :=
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
131 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
132 DECODE cond =>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
133 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
134 0 := Pc = Pc + 1,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
135 1 := Pc = (Pc + 1) + read(PC) ! Relative addressing
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
136 END
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
137 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
138
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
139 decimal.adjust(tac.<8:0>) := ! Used by sbc and adc
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
140 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
141 IF A<7> EQV read<7> => v = tac.<7> XOR A<7>; c = tac.<8> NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
142 IF d =>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
143 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
144 tac.<8> = 0 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
145 IF tac.<3:0> GTR{US} "9 => tac. = tac.<7:0> + "6 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
146 IF NOT c => c = tac.<8> NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
147 IF tac.<7:4> GTR{US} "9 => tac. = tac.<7:0> + "60 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
148 IF NOT c => c = tac.<8>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
149 END NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
150 A = tac.<7:0> NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
151 setnz(A)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
152 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
153
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
154 ab(adh.<15:0>, adl.<15:0>)<15:0> := ! Address buffer
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
155 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
156 ab<15:8> = read(adh.) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
157 ab<7:0> = read(adl.)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
158 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
159
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
160 ! Read and write memory access routines
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
161
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
162 read(ab.<15:0>)<7:0> := ! Read from valid memory
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
163 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
164 Rw = 1 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
165 IF NOT Ready => RESTART run NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
166 read = "FF NEXT ! Fake a nonexistant memory access
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
167 IF (ab. GEQ{US} ramlow) AND (ab. LEQ{US} ramhi) => read = ram[ab.];
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
168 IF (ab. GEQ{US} romlow) AND (ab. LEQ{US} romhi) => read = rom[ab.]
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
169 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
170
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
171 write(ab.<15:0>, dbb.<7:0>) := ! Write to valid memory
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
172 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
173 IF (ab. GEQ{US} ramlow) AND (ab. LEQ{US} ramhi) => ram[ab.] = dbb.;
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
174 Rw = 0
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
175 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
176
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
177 ! Interrupt routines
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
178
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
179 intstk := ! Interrupt stack operations
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
180 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
181 push(Pc<15:8>) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
182 push(Pc<7:0>) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
183 push(P) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
184 i = 1
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
185 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
186
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
187 int := ! Interrupt processing
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
188 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
189 IF NOT Reset =>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
190 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
191 Reset = Irq = Nmi = Ready = 1 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
192 Pc = ab("FFFD, "FFFC) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
193 i = 1 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
194 LEAVE int
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
195 END NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
196
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
197 IF NOT Nmi =>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
198 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
199 Nmi = 1 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
200 intstk() NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
201 Pc = ab("FFFB, "FFFA) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
202 LEAVE int
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
203 END NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
204
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
205 IF b OR (NOT Irq AND NOT i) =>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
206 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
207 intstk() NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
208 b = 0 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
209 Pc = ab("FFFF, "FFFE)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
210 END
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
211 END
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
212
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
213 **INSTRUCTION.INTERPRETATION**
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
214
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
215 run :=
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
216 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
217 IF NOT Reset => int() NEXT ! Initial startup
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
218 IF NOT ready => stop() NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
219 IFSync = 1 NEXT ! Instruction fetch
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
220 Ir = read(Pc) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
221 Pc = Pc + 1 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
222 IFSync = 0 NEXT ! Execute
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
223 DECODE IR<1:0> =>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
224 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
225 '01 := group1(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
226 '10 := group2(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
227 '00 := group3(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
228 '11 := opex()
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
229 END NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
230 int() NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
231 IF So => v = 1 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
232 RESTART RUN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
233 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
234
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
235 ! Group 1 instruction decode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
236
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
237 group1 :=
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
238 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
239 DECODE Ir<7:5> =>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
240 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
241 #0 := ora(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
242 #1 := and.(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
243 #2 := eor(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
244 #3 := adc(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
245 #4 := sta(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
246 #5 := lda(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
247 #6 := cmp(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
248 #7 := sbc()
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
249 END
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
250 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
251
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
252 ! Group 2 instruction decode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
253
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
254 group2 :=
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
255 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
256 DECODE Ir<7:5> =>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
257 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
258 #0 := asl(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
259 #1 := rol(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
260 #2 := lsr(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
261 #3 := ror(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
262 #4 := stx(), ! Includes txa, txs
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
263 #5 := ldx(), ! Includes tax, tsx
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
264 #6 := dec(), ! Includes dex
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
265 #7 := inc() ! Includes no.op
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
266 END
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
267 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
268
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
269 ! Group 3 instruction decode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
270
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
271 group3 :=
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
272 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
273 DECODE Ir =>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
274 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
275 "00 := brk(), ! Break
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
276 "08 := php(), ! Push status on stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
277 "28 := plp(), ! Pull status from stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
278 "48 := pha(), ! Push accumulator
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
279 "68 := pla(), ! Pull accumulator
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
280 "10 := bpl(), ! Branch on plus
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
281 "30 := bmi(), ! Branch on minus
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
282 "50 := bvc(), ! Branch if overflow clear
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
283 "70 := bvs(), ! Branch if overflow set
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
284 "90 := bcc(), ! Branch on carry clear
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
285 "D0 := bne(), ! Branch on not equal
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
286 "F0 := beq(), ! Branch if equal
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
287 "B0 := bcs(), ! Branch if carry set
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
288 "18 := clc(), ! Clear carry
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
289 "38 := sec(), ! Set carry
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
290 "58 := cli(), ! Clear interrupt enable
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
291 "78 := sei(), ! Set interrupt enable
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
292 "B8 := clv(), ! Clear overflow
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
293 "D8 := cld(), ! Clear decimal mode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
294 "F8 := sed(), ! Set decimal mode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
295 "20 := jsr(), ! Jump to subroutine
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
296 "24 := bit(read(zp())), ! Bit test - zero page
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
297 "2C := bit(read(abs())), ! Bit test - absolute
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
298 "40 := rti(), ! Return from interrupt
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
299 "4C := jmp(), ! Jump - absolute
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
300 "6C := jmp(), ! Jump - indirect
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
301 "60 := rts(), ! Return from subroutine
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
302 "84 := sty(zp()), ! Store Y - zero page
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
303 "8C := sty(abs()), ! Store Y - absolute
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
304 "94 := sty(zpx()), ! Store Y - zero page, X
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
305 "88 := dey(), ! Decrement Y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
306 "C8 := iny(), ! Increment Y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
307 "E8 := inx(), ! Increment X
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
308 "98 := tya(), ! Transfer Y to A
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
309 "A8 := tay(), ! Transfer A to Y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
310 "A0 := ldy(immed()), ! Load Y - immediate
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
311 "A4 := ldy(zp()), ! Load Y - zero page
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
312 "AC := ldy(abs()), ! Load Y - absolute
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
313 "B4 := ldy(zpx()), ! Load Y - zero page, X
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
314 "BC := ldy(absx()), ! Load Y - absolute, X
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
315 "C0 := cpy(immed()), ! Compare immediate to Y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
316 "C4 := cpy(zp()), ! Compare zero page to Y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
317 "CC := cpy(abs()), ! Compare absolute to Y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
318 "E0 := cpx(immed()), ! Compare immediate to X
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
319 "E4 := cpx(zp()), ! Compare zero page to X
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
320 "EC := cpx(abs()), ! Compare absolute to X
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
321 OTHERWISE := opex()
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
322 END
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
323 END
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
324
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
325 **INSTRUCTION.EXECUTION**
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
326
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
327 ! Group 1 instruction execution
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
328
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
329 addrs1()<15:0> := ! Group 1 address generation
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
330 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
331 DECODE Ir<4:2> =>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
332 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
333 #0 := addrs1 = indx(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
334 #1 := addrs1 = zp(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
335 #2 := addrs1 = immed(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
336 #3 := addrs1 = abs(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
337 #4 := addrs1 = indy(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
338 #5 := addrs1 = zpx(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
339 #6 := addrs1 = absy(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
340 #7 := addrs1 = absx()
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
341 END
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
342 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
343
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
344 ora := ! Or
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
345 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
346 A = A OR read(addrs1()) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
347 setnz(A)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
348 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
349
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
350 and. := ! And
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
351 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
352 A = A AND read(addrs1()) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
353 setnz(A)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
354 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
355
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
356 eor := ! Exclusive or
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
357 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
358 A = A XOR read(addrs1()) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
359 setnz(A)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
360 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
361
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
362 adc := (decimal.adjust(A +{US} c + read(addrs1()))), ! Add with carry
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
363
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
364 sta := (IF Ir NEQ{US} "89 => write(addrs1(),A)), ! Store immediate
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
365
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
366 lda := ! Load accumulator
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
367 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
368 A = read(addrs1()) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
369 setnz(A)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
370 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
371
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
372 cmp := ! Compare
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
373 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
374 setnz(A - read(addrs1())) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
375 c = A GEQ read
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
376 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
377
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
378 sbc := (decimal.adjust(A +{US} c + NOT read(addrs1()))), ! Sub/carry
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
379
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
380 ! Group 2 addressing mode selection
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
381
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
382 ! Group 2 gets and puts
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
383
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
384 get2()<8:0> := ! Get the correct operand and return it in "get2"
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
385 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
386 DECODE Ir<4:2> =>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
387 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
388 #1 := get2<7:0> = read(zp()),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
389 #2 := get2<7:0> = A,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
390 #3 := get2<7:0> = read(abs()),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
391 #5 := get2<7:0> = read(zpx()),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
392 #7 := get2<7:0> = read(absx()),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
393 OTHERWISE := opex()
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
394 END NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
395 get2<8> = c
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
396 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
397
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
398 put2(ta.<7:0>) := ! Put the operand in the proper location
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
399 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
400 DECODE Ir<4:2> =>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
401 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
402 [#1,#3,#5,#7] := write(ab, ta.),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
403 #2 := A = ta.,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
404 OTHERWISE := opex()
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
405 END NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
406 setnz(ta.)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
407 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
408
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
409 ! Group 2 instruction execution
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
410
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
411 asl := ! Arithmetic shift left
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
412 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
413 get2 = get2() SL0 1 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
414 c = get2<8>; put2(get2)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
415 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
416
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
417
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
418 rol := ! rotate left
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
419 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
420 get2 = get2() SLR 1 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
421 c = get2<8>; put2(get2)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
422 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
423
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
424 lsr := ! Logical shift right
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
425 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
426 c = get2<2> NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
427 get2 = get2<7:0> SR0 1 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
428 put2(get2)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
429 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
430
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
431 ror := ! Rotate right
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
432 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
433 get2 = get2() SRR 1 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
434 c = get2<8>; put2(get2)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
435 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
436
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
437 stx := ! Store index register
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
438 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
439 DECODE Ir<4:2> =>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
440 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
441 #1 := write(zp(), X),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
442 #2 := A = X, ! Txa
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
443 #3 := write(abs(), X),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
444 #5 := write(zpy(), X),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
445 #6 := S = X, ! Txs
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
446 OTHERWISE := opex()
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
447 END
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
448 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
449
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
450 ldx := ! Load index register
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
451 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
452 DECODE Ir<4:2> =>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
453 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
454 #0 := X = read(immed()),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
455 #1 := X = read(zp()),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
456 #2 := X = A, ! Tax
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
457 #3 := X = read(abs()),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
458 #4 := opex(),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
459 #5 := X = read(zpy()),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
460 #6 := X = S, ! Tsx
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
461 #7 := X = read(absy())
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
462 END NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
463 setnz(X)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
464 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
465
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
466 dec := ! Decrement
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
467 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
468 DECODE Ir EQL "CA =>
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
469 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
470 0 := put2(get2() - 1),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
471 1 := BEGIN ! Dex
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
472 X = X - 1 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
473 setnz(X)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
474 END
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
475 END
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
476 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
477
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
478 inc := ! Increment
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
479 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
480 IF Ir NEQ "EA => put2(get2() + 1) ! Op "EA => no.op
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
481 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
482
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
483 ! Group 3 instruction execution
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
484
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
485 brk := (b = 1; Pc = Pc+1), ! Break
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
486
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
487 php := (push(P)), ! Push processor status on stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
488 plp := (P = pull()), ! Pull processor status from stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
489 pha := (push(A)), ! Push accumulator on stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
490 pla := ! Pull accumulator from stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
491 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
492 A = pull() NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
493 setnz(A)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
494 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
495
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
496 bpl := (branch(NOT n)), ! Branch on plus
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
497 bmi := (branch(n)), ! Branch on minus
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
498 bvc := (branch(NOT v)), ! Branch on overflow clear
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
499 bvs := (branch(v)), ! Branch if overflow set
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
500 bcc := (Branch(NOT c)), ! Branch on carry clear
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
501 bne := (branch(NOT z)), ! Branch if not equal
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
502 beq := (branch(z)), ! Branch on equal
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
503 bcs := (branch(c)), ! Branch on carry set
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
504
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
505 clc := (c = 0), ! Clear carry flag
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
506 sec := (c = 1), ! Set carry
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
507 cli := (i = 0), ! Clear interrupt disable bit
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
508 sei := (i = 1), ! Set interrupt disable status
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
509 clv := (v = 0), ! Clear overflow
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
510 cld := (d = 0), ! Clear decimal mode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
511 sed := (d = 1), ! Set decimal mode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
512
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
513 jsr := ! Jump to subroutine
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
514 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
515 push((Pc + 1)<15:8>) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
516 push((Pc + 1)<7:0>) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
517 Pc = abs()
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
518 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
519
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
520 bit(ta.<7:0>) := ! Bit test
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
521 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
522 n = ta.<7>; v = ta.<6>; z = (ta. AND A) EQL 0
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
523 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
524
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
525 rti := ! Return from interrupt
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
526 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
527 P = pull() NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
528 Pc<7:0> = pull() NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
529 Pc<15:8> = pull(); b = 0
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
530 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
531
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
532 jmp := ! Jump
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
533 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
534 Pc = abs() NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
535 IF Ir EQL "6C => Pc = abs() ! Indirect
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
536 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
537
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
538 ! Group 3 instruction execution (page 2)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
539
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
540 rts := ! return from subroutine
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
541 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
542 Pc<7:0> = pull() NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
543 Pc<15:8> = pull() NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
544 Pc = Pc + 1
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
545 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
546
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
547 sty(ab.<15:0>) := (write(ab., Y)), ! Store index Y in memory
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
548
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
549 dey := ! Decrement index Y by one
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
550 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
551 Y = Y - 1 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
552 setnz(Y)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
553 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
554
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
555 tya := ! Transfer index Y to accumulator
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
556 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
557 A = Y NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
558 setnz(A)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
559 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
560
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
561 ldy(ab.<15:0>) := (Y = read(ab.)), ! Load index Y with memory
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
562
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
563 tay := ! Transfer accumulator to index Y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
564 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
565 Y = A NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
566 setnz(Y)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
567 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
568
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
569 cpy(ab.<15:0>) := ! Compare memory and index Y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
570 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
571 setnz(Y - read(ab.)) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
572 c = Y GEQ read
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
573 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
574
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
575 iny := ! Increment index Y by one
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
576 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
577 Y = Y + 1 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
578 setnz(Y)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
579 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
580
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
581 cpx(ab.<15:0>) := ! Compare memory and index X
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
582 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
583 setnz(X - read(ab.)) NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
584 c = X GEQ read
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
585 END,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
586
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
587 inx := ! Increment index X by one
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
588 BEGIN
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
589 X = X + 1 NEXT
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
590 setnz(X)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
591 END
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
592
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
593
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
594 END ! End of MC6502
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
595
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
596