annotate Examples/6502/mc6502.tokio @ 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 % rewriten for Tokio
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
8
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
9 % MC6502 :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
10
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
11 '$function' bit(Bit,I) = ( I >> Bit ) /\ 1 :-true .
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
12 '$function' high(Word) = (Word>>8)/\hex("ff") :-true .
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
13 '$function' low(Word) = (Word/\hex("ff")) :-true .
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
14 '$function' signed(Data) = Signed :- signed(Data,Signed) .
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
15 '$function' byte(Word) = (Word/\hex("ff")) :-true .
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
16
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
17 signed(Data,Signed) :- Data >127,!, Signed = Data - 256.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
18 signed(Data,Data).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
19
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
20 :-op(600,xfy, xor).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
21 '$function' xor(A,B) = ( (-A) /\ B) \/ (A /\ (-B)) :-true .
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
22
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
23 :-static([
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
24 mem(_),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
25
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
26 % *PCSTATE
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
27
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
28 pc, % program counter
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
29 y, % Index register
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
30 x, % Index register
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
31 s, % stack pointer
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
32 dl, % Input data latch
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
33 a, % accumulator
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
34 ir, % Instruction register
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
35 p, % processor status
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
36
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
37 n, % Negative result
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
38 v, % Overflow
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
39 b, % Break command
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
40 d, % Decimal mode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
41 i, % Interrupt disable
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
42 z, % Zero
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
43 c, % Carry
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
44
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
45 irq, % Interrupt request
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
46 nmi, % Non-maskable interrupt
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
47 ifsync, % High when instruction fetch
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
48 rw, % Read/Write control pin
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
49 so, % set overflow pin
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
50 reset, % power up bit
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
51 ready % 1 means run, 0 means stop
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
52
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
53 ]).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
54
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
55 status_report :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
56 write(('pc=',*pc,' y=', *y, ' x=',*x , ' dl=', *dl,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
57 ' a=',*a,' ir=',*ir, ' rw=', *rw,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
58 ' s=',*s, ' c=', *c, ' z=' ,*z)).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
59
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
60
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
61 % ADDRESS.CALCULATION
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
62
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
63 immed(R):- % Immediate
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
64 R <- *pc,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
65 *pc <= *pc + 1.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
66
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
67 zp(R):- % Zero page
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
68 read(*pc,R) , *pc <= *pc + 1.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
69
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
70 abs(R):- % Absolute
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
71 ab(*pc + 1, *pc,R),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
72 *pc <= *pc + 2.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
73
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
74 indx(R):- % Indexed indirect - (IND, *x)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
75 read(*pc,R) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
76 R1 = R + *x, read_2(R1+1,R1,H,L) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
77 ab(H,L,R), *pc <= *pc + 1.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
78
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
79 indy(R):- % Indirect indexed - (IND), *y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
80 read(*pc,R) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
81 ab(R + 1,R ,R) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
82 R <- R + *y, *pc <= *pc + 1.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
83
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
84 zpx(R):- % Zero page indexed by *x
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
85 read(*pc,R1) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
86 R <- byte(R1 + *x), *pc <= *pc + 1.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
87
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
88 zpy(R):- % Zero page indexed by *y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
89 read(*pc,R1) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
90 R <- byte(R1 + *y), *pc <= *pc + 1.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
91
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
92 absy(R):- % absolute modified by *y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
93 ab(*pc + 1, *pc,R1) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
94 R <- R1 + *y , *pc <= *pc + 2.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
95
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
96 absx(R) :- % absolute modified by *x
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
97 ab(*pc + 1, *pc,R1) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
98 R <- R1 + *x , *pc <= *pc + 2.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
99
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
100
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
101 % *SERVICE.FACILITIES
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
102
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
103 push(Dbb) :- % Push a byte on the stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
104 write(hex("100") + *s, Dbb),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
105 *s <= *s - 1.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
106
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
107 pull(R):- % pull a byte off the stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
108 *s <= *s + 1 &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
109 read(hex("100") + *s,R).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
110
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
111 opex :- % Operation exception
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
112 *ready <= 0 && run.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
113
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
114 setnz(Ta):- % Set neg and zero condition code
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
115 Ta = 0,!, *z <= 1, *n <= 0.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
116 setnz(Ta):-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
117 Ta < 0,!, *z <= 0, *n <= 1.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
118 setnz(Ta):-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
119 Ta > 0,!, *z <= 0, *n <= 0.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
120
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
121 branch(0) :- *pc <= *pc + 1.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
122 branch(1) :- read(*pc,R) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
123 *pc <= *pc + 1 + signed(R). % Relative addressing
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
124
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
125 decimal_adjust(Tac):- % Used by sbc and adc
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
126 ( if (bit(7,*a) = bit(7,Tac))
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
127 then
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
128 *v <= bit(7,Tac) xor bit(7,*a),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
129 *c <= bit(8,Tac) ) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
130 ( if (*d = 1) then (
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
131 (if Tac /\ binary("1111") > 9 then
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
132 Tac <- (Tac/\hex("ff") + 6)) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
133 (if *c = 0 then *c <= bit(8,Tac)) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
134 (if (Tac /\ binary("11110000")>>4) > 9 then
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
135 Tac <- (Tac/\hex("ff") + hex("60"))) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
136 (if *c = 0 then *c <= bit(8,Tac))
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
137 )) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
138 *a <= byte(Tac) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
139 setnz(*a).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
140
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
141 ab(Adh,Adl,R):- % *address buffer
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
142 read_2(Adh,Adl,R1,R2),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
143 fin( R = R1<<8 + R2 ).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
144
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
145 % Read and write memory access routines
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
146
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
147 read(Adr,Value):- % Read from valid memory
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
148 *rw <= 1, Adr <- Adr &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
149 read_1(Adr,Value).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
150 read_1(Adr,Value):-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
151 *ready=0,!, int,Adr <- Adr && read_1(Adr,Value).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
152 read_1(Adr,Value) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
153 Value <- *mem(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
154
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
155 read_2(AdrH,AdrL,Vh,Vl) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
156 read(AdrH,Vh) && read(AdrL,Vl), Vh <- Vh.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
157
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
158 write(Adr,Value) :- % Write to valid memory
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
159 *rw <=0,Adr <- Adr,Value <-Value &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
160 *mem(Adr) <= Value.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
161
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
162 % Interrupt routines
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
163
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
164 intstk :- % Interrupt stack operations
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
165 push(high(*pc)) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
166 push(low(*pc)) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
167 push(*p), *i <= 1.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
168
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
169 int :- % Interrupt processing
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
170 *reset = 0,!,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
171 *reset <= 1,*irq <= 1,*nmi <= 1,*ready <= 1 &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
172 ab(hex("FFFD"), hex("FFFC"),R) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
173 *pc <= R, *i <= 1.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
174 int :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
175 *nmi = 0,!,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
176 *nmi <= 1 &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
177 intstk &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
178 ab(hex("FFFB"), hex("FFFA"),R) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
179 *pc <= R.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
180 int :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
181 (*b = 1 ; *irq = 0, *i = 0),!,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
182 intstk, *b <= 0 &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
183 ab(hex("FFFF"), hex("FFFE"),R) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
184 *pc <= R.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
185 int.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
186
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
187 % INSTRUCTION.INTERPRETATION
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
188 % Yes It is the main routine.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
189
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
190 run :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
191 (if *reset = 0 then int ) && % Initial startup
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
192 run1.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
193 run1 :- *ready = 0 ,! , empty.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
194 run1 :- *ifsync <= 1 && % Instruction fetch
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
195 read(*pc,R) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
196 *ir <= R , *pc <= *pc + 1, *ifsync <= 0 && % Execute
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
197 run_decode(*ir/\binary("11")) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
198 int &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
199 ( if *so=1 then *v <= 1), status_report &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
200 run.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
201
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
202 run_decode(binary("01")) :- !,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
203 I1 = (*ir>>5)/\binary("111"),group1(I1).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
204 run_decode(binary("10")) :- !,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
205 I1 = (*ir>>5)/\binary("111"),group2(I1).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
206 run_decode(binary("00")) :- !, group3(*ir).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
207 run_decode(binary("11")) :- !, opex.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
208
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
209 % Group 1 instruction decode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
210
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
211 group1( 0 ):- ora.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
212 group1( 1 ):- and.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
213 group1( 2 ):- eor.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
214 group1( 3 ):- adc.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
215 group1( 4 ):- sta.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
216 group1( 5 ):- lda.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
217 group1( 6 ):- cmp.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
218 group1( 7 ):- sbc.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
219
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
220 % Group 2 instruction decode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
221
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
222 group2( 0 ):- asl.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
223 group2( 1 ):- rol.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
224 group2( 2 ):- lsr.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
225 group2( 3 ):- ror.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
226 group2( 4 ):- stx. % Includes txa. txs
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
227 group2( 5 ):- ldx. % Includes tax. tsx
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
228 group2( 6 ):- dec. % Includes dex
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
229 group2( 7 ):- inc. % Includes no.op
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
230
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
231 % Group 3 instruction decode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
232
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
233 group3(hex("00")) :- !, brk. % Break
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
234 group3(hex("08")) :- !, php. % push status on stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
235 group3(hex("28")) :- !, plp. % pull status from stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
236 group3(hex("48")) :- !, pha. % push accumulator
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
237 group3(hex("68")) :- !, pla. % pull accumulator
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
238 group3(hex("10")) :- !, bpl. % Branch on plus
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
239 group3(hex("30")) :- !, bmi. % Branch on minus
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
240 group3(hex("50")) :- !, bvc. % Branch if overflow clear
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
241 group3(hex("70")) :- !, bvs. % Branch if overflow set
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
242 group3(hex("90")) :- !, bcc. % Branch on carry clear
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
243 group3(hex("D0")) :- !, bne. % Branch on not equal
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
244 group3(hex("F0")) :- !, beq. % Branch if equal
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
245 group3(hex("B0")) :- !, bcs. % Branch if carry set
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
246 group3(hex("18")) :- !, clc. % Clear carry
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
247 group3(hex("38")) :- !, sec. % set carry
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
248 group3(hex("58")) :- !, cli. % Clear interrupt enable
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
249 group3(hex("78")) :- !, sei. % set interrupt enable
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
250 group3(hex("B8")) :- !, clv. % Clear overflow
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
251 group3(hex("D8")) :- !, cld. % Clear decimal mode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
252 group3(hex("F8")) :- !, sed. % set decimal mode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
253 group3(hex("20")) :- !, jsr. % Jump to subroutine
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
254 group3(hex("24")) :- !, % Bit test - zero page
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
255 zp(Adr) && read(Adr,V) && bit(V).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
256 group3(hex("2C")) :- !, % Bit test - absolute
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
257 abs(Adr) && read(Adr,V) && bit(V).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
258 group3(hex("40")) :- !, rti. % Return from interrupt
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
259 group3(hex("4C")) :- !, jmp. % Jump - absolute
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
260 group3(hex("6C")) :- !, jmp. % Jump - indirect
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
261 group3(hex("60")) :- !, rts. % Return from subroutine
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
262 group3(hex("84")) :- !, % Store *y - zero page
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
263 zp(Adr) && sty(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
264 group3(hex("8C")) :- !, % Store *y - absolute
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
265 abs(Adr) && sty(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
266 group3(hex("94")) :- !, % Store *y - zero page, *x
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
267 zpx(Adr) && sty(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
268 group3(hex("88")) :- !, dey. % Decrement *y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
269 group3(hex("C8")) :- !, iny. % Increment *y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
270 group3(hex("E8")) :- !, inx. % Increment *x
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
271 group3(hex("98")) :- !, tya. % Transfer *y to *a
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
272 group3(hex("A8")) :- !, tay. % Transfer *a to *y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
273 group3(hex("A0")) :- !, % Load *y - immediate
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
274 immed(Adr) && ldy(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
275 group3(hex("A4")) :- !, % Load *y - zero page
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
276 zp(Adr) && ldy(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
277 group3(hex("AC")) :- !, % Load *y - absolute
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
278 abs(Adr) && ldy(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
279 group3(hex("B4")) :- !, % Load *y - zero page, *x
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
280 zpx(Adr) && ldy(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
281 group3(hex("BC")) :- !, % Load *y - absolute, *x
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
282 absz(Adr) && ldy(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
283 group3(hex("C0")) :- !, % Compare immediate to *y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
284 immed(Adr) && cpy(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
285 group3(hex("C4")) :- !, % Compare zero page to *y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
286 zp(Adr) && cpy(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
287 group3(hex("CC")) :- !, % Compare absolute to *y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
288 abs(Adr) && cpy(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
289 group3(hex("E0")) :- !, % Compare immediate to *x
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
290 immed(Adr) && cpx(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
291 group3(hex("E4")) :- !, % Compare zero page to *x
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
292 zp(Adr) && cpx(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
293 group3(hex("EC")) :- !, % Compare absolute to *x
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
294 abs(Adr) && cpx(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
295 group3(I) :- opex.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
296
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
297
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
298 % INSTRUCTION.EXECUTION
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
299
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
300 % Group 1 instruction execution
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
301
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
302 addrs1(Adr) :- % Group 1 address generation
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
303 I = (*ir >> 2 ) /\ binary("111"),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
304 addrs1(I,Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
305
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
306 addrs1( 0 , Adr):- indx(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
307 addrs1( 1 , Adr):- zp(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
308 addrs1( 2 , Adr):- immed(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
309 addrs1( 3 , Adr):- abs(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
310 addrs1( 4 , Adr):- indy(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
311 addrs1( 5 , Adr):- zpx(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
312 addrs1( 6 , Adr):- absy(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
313 addrs1( 7 , Adr):- absx(Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
314
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
315 ora :- % Or
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
316 addrs1(Adr) && read(Adr,R) && *a <= *a /\ R &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
317 setnz(*a).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
318
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
319 and :- % And
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
320 addrs1(Adr) && read(Adr,R) && *a <= *a /\ R &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
321 setnz(*a).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
322
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
323 eor :- % Exclusive or
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
324 addrs1(Adr) && read(Adr,R) && *a <= *a xor R &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
325 setnz(*a).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
326
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
327 adc :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
328 addrs1(Adr) && read(Adr,R) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
329 decimal_adjust(*a + *c + R). % add with carry
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
330
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
331 sta :- *ir \= hex("89"),!,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
332 addrs1(Adr) && write(Adr,*a). % store immediate
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
333
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
334 lda :- % Load accumulator
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
335 addrs1(Adr) && read(Adr,R) && *a <= R &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
336 setnz(*a).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
337
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
338 cmp :- % Compare
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
339 addrs1(Adr) && read(Adr,R) && setnz(*a - R) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
340 if *a > R then *c<=1 else *c<=0.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
341
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
342 sbc :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
343 addrs1(Adr) && read(Adr,R) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
344 decimal_adjust(*a + *c - R). % Sub/carry
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
345
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
346 % Group 2 addressing mode selection
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
347
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
348 % Group 2 gets and puts
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
349
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
350 get2(R1,Adr) :- % Get the correct operand and return it in R1
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
351 I = (*ir >> 2) /\ binary("111"),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
352 get2(I,R,Adr) ,fin( R1 = R + (*c << 8)).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
353
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
354 get2(1,R,Adr) :- zp(Adr) && Adr <- Adr, read(Adr,R).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
355 get2(2,R,Adr) :- R <- *a, Adr <- Adr.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
356 get2(3,R,Adr) :- abs(Adr) && Adr <- Adr, read(Adr,R).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
357 get2(5,R,Adr) :- zpx(Adr) && Adr <- Adr, read(Adr,R).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
358 get2(7,R,Adr) :- absx(Adr) && Adr <- Adr, read(Adr,R).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
359 get2(_,R,Adr) :- opex.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
360
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
361 put2(Ta,Adr) :- % put the operand in the proper location
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
362 I = (*ir >> 2) /\ binary("111"),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
363 put2(I,Ta,Adr),Ta<-Ta && setnz(Ta).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
364
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
365 put2(1,Ta,Adr) :- write(Adr, Ta).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
366 put2(3,Ta,Adr) :- write(Adr, Ta).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
367 put2(5,Ta,Adr) :- write(Adr, Ta).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
368 put2(7,Ta,Adr) :- write(Adr, Ta).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
369 put2(2,Ta,Adr) :- *a <= Ta.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
370 put2(_,Ta,Adr) :-opex.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
371
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
372 % Group 2 instruction execution
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
373
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
374 asl :- % Arithmetic shift left
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
375 get2(V,Adr) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
376 V1 = V << 1,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
377 *c <= (V1 >> 8) /\ 1,put2(byte(V1),Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
378
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
379 rol :- % rotate left
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
380 get2(V,Adr) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
381 V1 = (V << 1)+ *c,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
382 *c <= (V1 >> 8) /\ 1,put2(byte(V1),Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
383
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
384 lsr :- % Logical shift right
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
385 get2(V,Adr) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
386 V1 = (V >> 1)/\ hex("7f") ,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
387 *c <= V /\ 1, put2(byte(V1),Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
388
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
389 ror :- % Rotate right
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
390 get2(V,Adr) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
391 V1 = (V >> 1)/\ hex("7f") + ( (V /\ 1) << 8),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
392 *c <= V /\ 1 , put2(byte(V1),Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
393
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
394 stx :- % store index register
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
395 I = (*ir>>2)/\binary("111"),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
396 stx(I,*x).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
397
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
398 stx(1,X) :- zp(Adr) && write(Adr, X).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
399 stx(2,X) :- *a <= X. % Txa
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
400 stx(3,X) :- as(Adr) && write(Adr, X).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
401 stx(5,X) :- zpy(Adr) && write(Adr, X).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
402 stx(6,X) :- *s <= X. % Txs
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
403 stx(_,_) :- opex.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
404
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
405 ldx :- % Load index register
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
406 I = (*ir>>2)/\binary("111"),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
407 ldx(I,X) && *x <= X && setnz(*x).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
408
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
409 ldx(0,X) :- immed(Adr) && read(Adr,X).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
410 ldx(1,X) :- zp(Adr) && read(Adr,X).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
411 ldx(2,X) :- X <- *a. % Tax
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
412 ldx(3,X) :- abs(Adr) && read(Adr,X).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
413 ldx(4,X) :- opex.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
414 ldx(5,X) :- zpy(Adr) && read(Adr,X).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
415 ldx(6,X) :- X <- *s. % Tsx
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
416 ldx(7,X) :- absy(Adr) && read(Adr,X).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
417
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
418 dec :- % Decrement
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
419 *ir = hex("CA"),!, % Dex
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
420 X = *x - 1,*x <= X, setnz(X).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
421 dec :- get2(Value,Adr) && put2(Value - 1,Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
422
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
423 inc :- % Increment
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
424 *ir = hex("EA"),!. % EA no.op
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
425 inc :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
426 get2(Value,Adr) && put2(Value + 1,Adr).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
427
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
428 % Group 3 instruction execution
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
429
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
430 brk :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
431 *ready <= 0. % for Debug
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
432 % (*b <= 1, *pc <= *pc+1). % Break
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
433
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
434 php :- push(*p). % push processor status on stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
435 plp :- pull(A),*p <= A. % pull processor status from stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
436 pha :- push(*a). % push accumulator on stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
437 pla :- % pull accumulator from stack
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
438 pull(A) && *a <= A, setnz(A).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
439
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
440 bpl :- boolNot(*n,B),branch(B). % Branch on plus
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
441 bmi :- bool(*n,B),branch(B). % Branch on minus
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
442 bvc :- boolNot(*v,B),branch(B). % Branch on overflow clear
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
443 bvs :- bool(*v,B),branch(B). % Branch if overflow set
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
444 bcc :- boolNot(*c,B),branch(B). % Branch on carry clear
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
445 bne :- boolNot(*z,B),branch(B). % Branch if not equal
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
446 beq :- bool(*z,B),branch(B). % Branch on equal
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
447 bcs :- bool(*c,B),branch(B). % Branch on carry set
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
448
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
449 bool(1,1). bool(0,0).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
450 boolNot(1,0). boolNot(0,1).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
451
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
452 clc :- *c <= 0. % Clear carry flag
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
453 sec :- *c <= 1. % Set carry
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
454 cli :- *i <= 0. % Clear interrupt disable bit
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
455 sei :- *i <= 1. % Set interrupt disable status
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
456 clv :- *v <= 0. % Clear overflow
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
457 cld :- *d <= 0. % Clear decimal mode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
458 sed :- *d <= 1. % Set decimal mode
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
459
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
460 jsr :- % Jump to subroutine
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
461 push(high(*pc + 1)) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
462 push(low(*pc + 1)) &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
463 abs(Value) && *pc <= Value.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
464
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
465 bit(Ta) :- % Bit test
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
466 *n <= Ta, (if (Ta /\ *a)=0 then *z <= 1 else *z <= 0).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
467
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
468 rti :- % Return from interrupt
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
469 pull(P) && *p <= P &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
470 pull(P) && *pc<= P &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
471 pull(P) && *pc<= (P<<8)+ *pc, *b <= 0.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
472
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
473 jmp :- *ir = hex("6C"),!,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
474 abs(Value) && *pc <= Value &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
475 abs(Value) && *pc <= Value . % Indirect
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
476 jmp :- abs(Value) && *pc <= Value.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
477
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
478
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
479 % Group 3 instruction execution (page 2)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
480
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
481 rts :- % return from subroutine
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
482 pull(P) && *pc<= P &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
483 pull(P) && *pc<= (P<<8)+ *pc &&
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
484 *pc <= *pc+1.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
485
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
486 sty(X) :- write(X, *y). % Store index *y in memory
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
487
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
488 dey :- % Decrement index *y by one
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
489 Y = *y - 1,*y <= Y, setnz(Y).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
490
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
491 tya :- % Transfer index *y to accumulator
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
492 *a <= *y, setnz(*y).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
493
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
494 ldy(A) :- read(A,Value) && *y <= Value. % Load index *y with memory
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
495
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
496 tay :- % Transfer accumulator to index *y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
497 *y <= *a, setnz(*a).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
498
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
499 cpy(A) :- % Compare memory and index *y
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
500 read(A,Value) && setnz(*y - Value),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
501 (if *y > Value then *c <= 1 else *c <= 0).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
502
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
503 iny :- % Increment index *y by one
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
504 Y = *y + 1 , *y <= Y, setnz(*y).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
505
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
506 cpx(A) :- % Compare memory and index *x
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
507 read(A,Value) && setnz(*x - Value),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
508 (if *x > Value then *c <= 1 else *c <= 0).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
509
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
510 inx :- % Increment index *x by one
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
511 X = *x + 1, *x <= X, setnz(*x).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
512
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
513 % End of MC6502
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
514
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
515