main svp.cpu
  1info
  2	prefix svp_
  3	opcode_size 16
  4	body svp_run_op
  5	header svp.h
  6	include svp_util.c
  7	
  8regs
  9	internal 16 scratch2 x y pad0 st pad1 pc
 10	a 32
 11	scratch1 32
 12	rom ptr16
 13	stack 16 stack0 stack1 stack2 stack3 stack4 stack5
 14	stackidx 8
 15	p 32
 16	external 16 pm0 pm1 pm2 xst pm4 ext5 pmc
 17	pointers0 8 r0 r1 r2 r3 
 18	pointers1 8 r4 r5 r6 r7
 19	pm_address 32 5
 20	pm_mode 8 5
 21	
 22	iram 16 1024
 23	ram0 16 256
 24	ram1 16 256
 25	zflag 8
 26	nflag 8
 27	rpl 16
 28	
 29flags
 30	register st
 31	Z 13 zero zflag
 32	N 15 sign nflag
 33	R 0-2 none rpl
 34	
 35svp_pop
 36	mov stack.stackidx dst
 37	add 1 stackidx stackidx
 38	switch stackidx
 39	case 6
 40	mov 0 stackidx
 41	end
 42	
 43svp_push
 44	arg src 16
 45	sub 1 stackidx stackidx
 46	switch stackidx
 47	case 0xFF
 48	mov 5 stackidx
 49	end
 50	mov src stack.stackidx
 51	
 52svp_ram_read
 53	arg mode 16
 54	arg banki 16
 55	arg regi 16
 56	local idx 16
 57	
 58	switch banki
 59	case 0
 60	meta bank ram0
 61	meta reg pointers0.regi
 62	
 63	default
 64	meta bank ram1
 65	meta reg pointers1.regi
 66	end
 67	
 68	mov reg idx
 69	switch mode
 70	case 0
 71	meta modestr ""
 72	
 73	case 1
 74	meta modestr +!
 75	add 1 reg reg
 76	
 77	case 2
 78	#loop decremenet
 79	meta modestr -
 80	
 81	if rpl
 82		local tmp 16
 83		mov reg tmp
 84		lsl 1 rpl rpl
 85		sub 1 rpl rpl
 86		local mask 16
 87		not rpl mask
 88		and reg mask reg
 89		sub 1 tmp tmp
 90		and rpl tmp tmp
 91		or tmp reg reg
 92	else
 93		sub 1 reg reg
 94	end
 95	
 96	case 3
 97	#loop increment
 98	meta modestr +
 99	
100	and 7 st rpl
101	if rpl
102		local tmp 16
103		mov reg tmp
104		lsl 1 rpl rpl
105		sub 1 rpl rpl
106		local mask 16
107		not rpl mask
108		and reg mask reg
109		add 1 tmp tmp
110		and rpl tmp tmp
111		or tmp reg reg
112	else
113		sub 1 reg reg
114	end
115	end
116	
117	and 255 idx idx
118	meta val bank.idx
119	
120svp_read_ext
121	arg regidxr 16
122	switch regidxr
123	case 7
124	meta val a
125	
126	default
127	#TODO: PMAR stuff
128	meta val external.regidxr
129	end
130	
131svp_write_ext
132	arg regidxw 16
133	switch regidxw
134	case 7
135	and 0xFFFF0000 a a
136	or src a a
137	
138	default
139	#TODO: PMAR stuff
140	mov src external.regidxw
141	end
142	
143svp_alu_op
144	arg P 16
145	arg param 32
146	
147	switch P
148	case 1
149	dis "sub %s" name
150	sub param a a
151	
152	case 3
153	dis "cmp %s" name
154	cmp param a
155	
156	case 4
157	dis "add %s" name
158	add param a a
159	
160	case 5
161	dis "and %s" name
162	and param a a
163	
164	case 6
165	dis "or %s" name
166	or param a a
167	
168	case 7
169	dis "eor %s" name
170	xor param a a
171	end
172	update_flags ZN
173	
174svp_check_cond
175	arg fval 16
176	arg cond 16
177	local invert 8
178	switch cond
179	case 0
180	meta flag 1
181	
182	case 5
183	meta flag zflag
184	
185	case 7
186	meta flag nflag
187	
188	default
189	meta flag 0
190	end
191	
192	if fval
193	meta istrue flag
194	
195	else
196	lnot flag invert
197	meta istrue invert
198	
199	end
200	
201PPP0000000000000 alu_n1
202	invalid P 0
203	invalid P 2
204	meta name "-"
205	svp_alu_op P 0xFFFF0000
206	
207PPP0000000000RRR alu_r
208	invalid P 0
209	invalid P 2
210	local tmp 32 
211	lsl internal.R 16 tmp
212	meta name internal.R
213	svp_alu_op P tmp
214	
215PPP0000000000011 alu_a
216	invalid P 0
217	invalid P 2
218	svp_alu_op P a
219	
220PPP0000000000101 alu_stack
221	invalid P 0
222	invalid P 2
223	local tmp 32
224	meta dst tmp
225	svp_pop
226	meta name "stack"
227	svp_alu_op P tmp
228	
229PPP0000000000111 alu_p
230	invalid P 0
231	invalid P 2
232	meta name p
233	svp_alu_op P p
234	
235PPP0000000001RRR alu_ext
236	invalid P 0
237	invalid P 2
238	local tmp 32
239	svp_read_ext R
240	lsl val 16 tmp
241	meta name val
242	svp_alu_op P tmp
243	
244PPP0001B0000MMRR alu_ram
245	invalid P 0
246	invalid P 2
247	svp_ram_read M B R
248	local tmp 32
249	lsl val 16 tmp
250	
251	switch P
252	case 1
253	dis "sub (%s%s)" reg modestr
254	sub tmp a a
255	
256	case 3
257	dis "cmp (%s%s)" reg modestr
258	cmp tmp a
259	
260	case 4
261	dis "add (%s%s)" reg modestr
262	add tmp a a
263	
264	case 5
265	dis "and (%s%s)" reg modestr
266	and tmp a a
267	
268	case 6
269	dis "or (%s%s)" reg modestr
270	or tmp a a
271	
272	case 7
273	dis "eor (%s%s)" reg modestr
274	xor tmp a a
275	end
276	
277	update_flags ZN
278	
279PPP0101B0000MMRR alu_ram_indirect
280	invalid P 0
281	invalid P 2
282	svp_ram_read M B R
283	svp_prog_ram_read val
284	local tmp 32
285	lsl scratch1 16 tmp
286	
287	switch P
288	case 1
289	dis "sub ((%s%s))" reg modestr
290	sub tmp a a
291	
292	case 3
293	dis "cmp ((%s%s))" reg modestr
294	cmp tmp a
295	
296	case 4
297	dis "add ((%s%s))" reg modestr
298	add tmp a a
299	
300	case 5
301	dis "and ((%s%s))" reg modestr
302	and tmp a a
303	
304	case 6
305	dis "or ((%s%s))" reg modestr
306	or tmp a a
307	
308	case 7
309	dis "eor ((%s%s))" reg modestr
310	xor tmp a a
311	end
312	
313	update_flags ZN
314	
315PPP0000000001111 alu_al
316	invalid P 0
317	invalid P 2
318	local tmp 32
319	lsl a 16 tmp
320	
321	meta name al
322	svp_alu_op P tmp
323	
324PPP0011JAAAAAAAA alu_ram_direct
325	invalid P 0
326	invalid P 2
327	if J
328	meta src ram1.A
329	else
330	meta src ram0.A
331	end
332	svp_alu_op P src
333	
334PPP0010000000000 alu_immed
335	invalid P 0
336	invalid P 2
337	svp_op_fetch
338	svp_alu_op P scratch1
339	
3401001000FCCCC0OOO cond_mod
341	svp_check_cond F C
342	if istrue
343
344	switch O
345	case 2
346	asr a 1 a
347	update_flags ZN
348	
349	case 3
350	lsl a 1 a
351	update_flags ZN
352	
353	case 6
354	neg a a
355	update_flags ZN
356	
357	case 7
358	abs a a
359	update_flags N
360	end
361	end
362
363000000000DDD0SSS ld_int_int
364	dis "ld %s, %s" internal.D internal.S
365	mov internal.S internal.D
366	
367000000000DDD0101 ld_int_stack
368	dis "ld %s, stack" internal.D 
369	meta dst internal.D
370	svp_pop
371	
3720000000000110101 ld_a_stack
373	dis "ld a, stack"
374	local tmp 32
375	meta dst tmp
376	svp_pop
377	lsl tmp 16 tmp
378	and 0xFFFF a a
379	or tmp a a
380	
3810000000001110101 ld_p_stack
382	dis "ld p, stack"
383	local tmp 32
384	meta dst tmp
385	svp_pop
386	lsl tmp 16 tmp
387	and 0xFFFF p p
388	or tmp p p
389	
3900000000001010SSS ld_stack_int
391	dis "ld stack, %s" internal.S
392	svp_push internal.S
393	
3940000000001010011 ld_stack_a
395	dis "ld stack, a"
396	local tmp 32
397	lsr a 16 tmp
398	svp_push tmp
399	
4000000000001010111 ld_stack_p
401	dis "ld stack, p"
402	local tmp 32
403	lsr p 16 tmp
404	svp_push tmp
405	
4060000000000000000 ld_n1_n1
407	#nop?
408	dis "ld -, -"
409	
4100000000000000SSS ld_n1_int
411	#nop?
412	dis "nop??"
413	
4140000000000110111 ld_a_p
415	dis "ld a, p"
416	mov p a
417	
4180000000001110011 ld_p_a
419	dis "ld p, a"
420	mov a p
421	
4220000000000110011 ld_a_a
423	dis "ld a, a"
424	mov a a
425	
4260000000001110111 ld_p_p
427	dis "ld p, p"
428	mov p p
429
430000000000DDD0111 ld_int_p
431	local tmp 32
432	lsr p 16 tmp
433	mov tmp internal.D
434	dis "ld %s, p" internal.D
435	
436000000000DDD0111 ld_int_a
437	local tmp 32
438	lsr a 16 tmp
439	mov tmp internal.D
440	dis "ld %s, a" internal.D
441	
4420000000001110SSS ld_p_int
443	local tmp 32
444	lsl internal.S 16 tmp
445	mov tmp p
446	dis "ld p, %s" internal.S
447	
4480000000000110SSS ld_a_int
449	local tmp 32
450	lsl internal.S 16 tmp
451	mov tmp a
452	dis "ld a, %s" internal.S
453	
454000000000DDD0000 ld_int_n1
455	dis "ld %s, -" internal.D
456	mov 0xFFFF internal.D
457	
4580000000000110000 ld_a_n1
459	dis "ld a, -"
460	and 0xFFFF a a
461	or 0xFFFF0000 a a
462	
4630000000001110000 ld_p_n1
464	dis "ld p, -"
465	and 0xFFFF p p
466	or 0xFFFF0000 p p
467
468000000000DDD1SSS ld_int_ext
469	svp_read_ext S
470	dis "ld %s, %s" internal.D val
471	mov val internal.D
472	
4730000000000111SSS ld_a_ext
474	svp_read_ext S
475	dis "ld a, %s" val
476	local tmp 32
477	lsl val 16 tmp
478	and 0xFFFF a a
479	or tmp a a
480	
4810000000001111SSS ld_p_ext
482	svp_read_ext S
483	dis "ld p, %s" val
484	local tmp 32
485	lsl val 16 tmp
486	and 0xFFFF p p
487	or tmp p p
488	
489000000001DDD0SSS ld_ext_int
490	meta src internal.S
491	svp_write_ext D
492	switch D
493	case 7
494	dis "ld al, %s" src
495	
496	default
497	dis "ld %s, %s" external.D src
498	end
499	
500000000001DDD0011 ld_ext_a
501	local tmp 32
502	lsr a 16 tmp
503	meta src tmp
504	svp_write_ext D
505	switch D
506	case 7
507	dis "ld al, a"
508	
509	default
510	dis "ld %s, a" external.D
511	end
512	
513000000001DDD0111 ld_ext_p
514	local tmp 32
515	lsr p 16 tmp
516	meta src tmp
517	svp_write_ext D
518	switch D
519	case 7
520	dis "ld al, p"
521	
522	default
523	dis "ld %s, p" external.D
524	end
525	
526	
527000000001DDD1SSS ld_ext_ext
528	svp_read_ext S
529	meta src val
530	svp_write_ext D
531	switch D
532	case 7
533	dis "ld al, %s" src
534	default
535	dis "ld %s, %s" external.D src
536	end
537	
5380000001B0DDDMMPP ld_int_ram
539	svp_ram_read M B P
540	dis "ld %s, (%s%s)" internal.D reg modestr
541	mov val internal.D
542	
5430000001B0011MMPP ld_a_ram
544	svp_ram_read M B P
545	dis "ld a, (%s%s)" reg modestr
546	local tmp 32
547	lsl val 16 tmp
548	and 0xFFFF a a
549	or tmp a a
550	
5510000001B0111MMPP ld_p_ram
552	svp_ram_read M B P
553	dis "ld p, (%s%s)" reg modestr
554	local tmp 32
555	lsl val 16 tmp
556	and 0xFFFF p p
557	or tmp p p
558	
5590000001B0101MMPP ld_stack_ram
560	svp_ram_read M B P
561	dis "ld stack, (%s%s)" reg modestr
562	svp_push val
563	
564000010000DDD0000 ld_int_immed
565	svp_op_fetch
566	dis "ld %s, %X" internal.D scratch1
567	mov scratch1 internal.D
568	
5690000100000000000 ld_n1_immed
570	svp_op_fetch
571	dis "ld -, %X" scratch1
572
5730000100000110000 ld_a_immed
574	local tmp 32
575	svp_op_fetch
576	dis "ld a, %X" scratch1
577	lsl 16 scratch1 tmp
578	and 0xFFFF a a
579	or tmp a a
580	
5810000100001010000 ld_stack_immed
582	svp_op_fetch
583	dis "ld stack, %X" scratch1
584	svp_push scratch1
585
5860000100001110000 ld_p_immed
587	local tmp 32
588	svp_op_fetch
589	dis "ld p, %X" scratch1
590	lsl 16 scratch1 tmp
591	and 0xFFFF p p
592	or tmp p p
593	
594000010001DDD0000 ld_ext_immed
595	svp_op_fetch
596	dis "ld %s, %X", external.D, scratch1
597	meta src scratch1
598	svp_write_ext D
599	switch D
600	case 7
601	dis "ld al, %X" scratch1
602	
603	default
604	dis "ld %s, %X" external.D scratch1
605	end
606	
6070100100FCCCC0000 call_cond
608	svp_check_cond F C
609	svp_op_fetch
610	
611	if istrue
612	svp_push pc
613	mov scratch1 pc
614	end
615	
6160100110FCCCC0000 bra_cond
617	svp_check_cond F C
618	svp_op_fetch
619	if istrue
620	mov scratch1 pc
621	end
622	
623svp_prog_ram_read
624	arg src 16
625	cycles 1
626	cmp 1024 src
627	
628	if >=U
629	add src src scratch1
630	ocall prog_read_16
631	
632	else
633	mov iram.src scratch1
634	end
635
636svp_op_fetch
637	svp_prog_ram_read pc
638	add 1 pc pc
639	
640svp_run_op
641	svp_op_fetch
642	dispatch scratch1