Mercurial > repos > blastem
comparison svp.cpu @ 1615:28f80d1b343e
Support immediate operands for ld and alu ops in SVP. Support double indirect and immediate address modes for alu ops. Fixed DSL issues revealed by those changes
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 24 Sep 2018 19:09:16 -0700 |
parents | c9639139aedf |
children | 5e04f9f8bd85 |
comparison
equal
deleted
inserted
replaced
1614:c9639139aedf | 1615:28f80d1b343e |
---|---|
211 invalid P 0 | 211 invalid P 0 |
212 invalid P 2 | 212 invalid P 2 |
213 local tmp 32 | 213 local tmp 32 |
214 meta dst tmp | 214 meta dst tmp |
215 svp_pop | 215 svp_pop |
216 meta name "st" | 216 meta name "stack" |
217 svp_alu_op P tmp | 217 svp_alu_op P tmp |
218 | 218 |
219 PPP0000000000111 alu_p | 219 PPP0000000000111 alu_p |
220 invalid P 0 | 220 invalid P 0 |
221 invalid P 2 | 221 invalid P 2 |
229 svp_read_ext R | 229 svp_read_ext R |
230 lsl val 16 tmp | 230 lsl val 16 tmp |
231 meta name val | 231 meta name val |
232 svp_alu_op P tmp | 232 svp_alu_op P tmp |
233 | 233 |
234 PPP0001B000MMRR alu_ram | 234 PPP0001B0000MMRR alu_ram |
235 invalid P 0 | 235 invalid P 0 |
236 invalid P 2 | 236 invalid P 2 |
237 svp_ram_read M B R | 237 svp_ram_read M B R |
238 local tmp 32 | 238 local tmp 32 |
239 lsl val 16 tmp | 239 lsl val 16 tmp |
264 xor tmp a a | 264 xor tmp a a |
265 end | 265 end |
266 | 266 |
267 update_flags ZN | 267 update_flags ZN |
268 | 268 |
269 PPP0101B0000MMRR alu_ram_indirect | |
270 invalid P 0 | |
271 invalid P 2 | |
272 svp_ram_read M B R | |
273 svp_prog_ram_read scratch1 | |
274 local tmp 32 | |
275 lsl val 16 tmp | |
276 | |
277 switch P | |
278 case 1 | |
279 dis "sub ((%s%s))" reg modestr | |
280 sub tmp a a | |
281 | |
282 case 3 | |
283 dis "cmp ((%s%s))" reg modestr | |
284 cmp tmp a | |
285 | |
286 case 4 | |
287 dis "add ((%s%s))" reg modestr | |
288 add tmp a a | |
289 | |
290 case 5 | |
291 dis "and ((%s%s))" reg modestr | |
292 and tmp a a | |
293 | |
294 case 6 | |
295 dis "or ((%s%s))" reg modestr | |
296 or tmp a a | |
297 | |
298 case 7 | |
299 dis "eor ((%s%s))" reg modestr | |
300 xor tmp a a | |
301 end | |
302 | |
303 update_flags ZN | |
304 | |
269 PPP0000000001111 alu_al | 305 PPP0000000001111 alu_al |
270 invalid P 0 | 306 invalid P 0 |
271 invalid P 2 | 307 invalid P 2 |
272 local tmp 32 | 308 local tmp 32 |
273 lsl a 16 tmp | 309 lsl a 16 tmp |
274 | 310 |
275 meta name al | 311 meta name al |
276 svp_alu_op P tmp | 312 svp_alu_op P tmp |
313 | |
314 PPP0011JAAAAAAAA alu_ram_direct | |
315 invalid P 0 | |
316 invalid P 2 | |
317 if J | |
318 meta src ram1.A | |
319 else | |
320 meta src ram0.A | |
321 end | |
322 svp_alu_op P src | |
323 | |
324 PPP0010000000000 alu_immed | |
325 invalid P 0 | |
326 invalid P 2 | |
327 svp_op_fetch | |
328 svp_alu_op P scratch1 | |
277 | 329 |
278 1001000FCCCC0OOO cond_mod | 330 1001000FCCCC0OOO cond_mod |
279 svp_check_cond F C | 331 svp_check_cond F C |
280 if istrue | 332 if istrue |
281 | 333 |
300 | 352 |
301 000000000DDD0SSS ld_int_int | 353 000000000DDD0SSS ld_int_int |
302 dis "ld %s, %s" internal.D internal.S | 354 dis "ld %s, %s" internal.D internal.S |
303 mov internal.S internal.D | 355 mov internal.S internal.D |
304 | 356 |
305 000000000DDD0101 ld_int_st | 357 000000000DDD0101 ld_int_stack |
306 dis "ld %s, st" internal.D | 358 dis "ld %s, stack" internal.D |
307 meta dst internal.D | 359 meta dst internal.D |
308 svp_pop | 360 svp_pop |
309 | 361 |
310 0000000000110101 ld_a_st | 362 0000000000110101 ld_a_stack |
311 dis "ld a, st" | 363 dis "ld a, stack" |
312 local tmp 32 | 364 local tmp 32 |
313 meta dst tmp | 365 meta dst tmp |
314 svp_pop | 366 svp_pop |
315 lsl tmp 16 tmp | 367 lsl tmp 16 tmp |
316 and 0xFFFF a a | 368 and 0xFFFF a a |
317 or tmp a a | 369 or tmp a a |
318 | 370 |
319 0000000001110101 ld_p_st | 371 0000000001110101 ld_p_stack |
320 dis "ld p, st" | 372 dis "ld p, stack" |
321 local tmp 32 | 373 local tmp 32 |
322 meta dst tmp | 374 meta dst tmp |
323 svp_pop | 375 svp_pop |
324 lsl tmp 16 tmp | 376 lsl tmp 16 tmp |
325 and 0xFFFF p p | 377 and 0xFFFF p p |
326 or tmp p p | 378 or tmp p p |
327 | 379 |
328 0000000001010SSS ld_st_int | 380 0000000001010SSS ld_stack_int |
329 dis "ld st, %s" internal.S | 381 dis "ld stack, %s" internal.S |
330 svp_push internal.S | 382 svp_push internal.S |
331 | 383 |
332 0000000001010011 ld_st_a | 384 0000000001010011 ld_stack_a |
333 dis "ld st, a" | 385 dis "ld stack, a" |
334 local tmp 32 | 386 local tmp 32 |
335 lsr a 16 tmp | 387 lsr a 16 tmp |
336 svp_push tmp | 388 svp_push tmp |
337 | 389 |
338 0000000001010111 ld_st_p | 390 0000000001010111 ld_stack_p |
339 dis "ld st, p" | 391 dis "ld stack, p" |
340 local tmp 32 | 392 local tmp 32 |
341 lsr p 16 tmp | 393 lsr p 16 tmp |
342 svp_push tmp | 394 svp_push tmp |
343 | 395 |
344 0000000000000000 ld_n1_n1 | 396 0000000000000000 ld_n1_n1 |
492 local tmp 32 | 544 local tmp 32 |
493 lsl val 16 tmp | 545 lsl val 16 tmp |
494 and 0xFFFF p p | 546 and 0xFFFF p p |
495 or tmp p p | 547 or tmp p p |
496 | 548 |
497 0000001B0101MMPP ld_st_ram | 549 0000001B0101MMPP ld_stack_ram |
498 svp_ram_read M B P | 550 svp_ram_read M B P |
499 dis "ld st, (%s%s)" reg modestr | 551 dis "ld stack, (%s%s)" reg modestr |
500 svp_push val | 552 svp_push val |
553 | |
554 000010000DDD0000 ld_int_immed | |
555 svp_op_fetch | |
556 dis "ld %s, %X" internal.D scratch1 | |
557 mov scratch1 internal.D | |
558 | |
559 0000100000000000 ld_n1_immed | |
560 svp_op_fetch | |
561 dis "ld -, %X" scratch1 | |
562 | |
563 0000100000110000 ld_a_immed | |
564 local tmp 32 | |
565 svp_op_fetch | |
566 dis "ld a, %X" scratch1 | |
567 lsl 16 scratch1 tmp | |
568 and 0xFFFF a a | |
569 or tmp a a | |
570 | |
571 0000100001010000 ld_stack_immed | |
572 svp_op_fetch | |
573 dis "ld stack, %X" scratch1 | |
574 svp_push scratch1 | |
575 | |
576 0000100001110000 ld_p_immed | |
577 local tmp 32 | |
578 svp_op_fetch | |
579 dis "ld p, %X" scratch1 | |
580 lsl 16 scratch1 tmp | |
581 and 0xFFFF p p | |
582 or tmp p p | |
583 | |
584 000010001DDD0000 ld_ext_immed | |
585 svp_op_fetch | |
586 dis "ld %s, %X", external.D, scratch1 | |
587 meta src scratch1 | |
588 svp_write_ext D | |
589 switch D | |
590 case 7 | |
591 dis "ld al, %X" scratch1 | |
592 | |
593 default | |
594 dis "ld %s, %X" external.D scratch1 | |
595 end | |
501 | 596 |
502 0100100FCCCC0000 call_cond | 597 0100100FCCCC0000 call_cond |
503 svp_check_cond F C | 598 svp_check_cond F C |
504 svp_op_fetch | 599 svp_op_fetch |
505 | 600 |
512 svp_check_cond F C | 607 svp_check_cond F C |
513 svp_op_fetch | 608 svp_op_fetch |
514 if istrue | 609 if istrue |
515 mov scratch1 pc | 610 mov scratch1 pc |
516 end | 611 end |
612 | |
613 svp_prog_ram_read | |
614 arg src 16 | |
615 cycles 1 | |
616 cmp 1024 src | |
617 | |
618 if >=U | |
619 add src src scratch1 | |
620 ocall read_16 | |
621 | |
622 else | |
623 mov iram.src scratch1 | |
624 end | |
517 | 625 |
518 svp_op_fetch | 626 svp_op_fetch |
519 cycles 1 | 627 svp_prog_ram_read pc |
520 cmp 1024 pc | |
521 | |
522 if >=U | |
523 mov pc scratch1 | |
524 add scratch1 scratch1 scratch1 | |
525 ocall read_16 | |
526 | |
527 else | |
528 mov iram.pc scratch1 | |
529 end | |
530 add 1 pc pc | 628 add 1 pc pc |
531 | 629 |
532 svp_run_op | 630 svp_run_op |
533 svp_op_fetch | 631 svp_op_fetch |
534 dispatch scratch1 | 632 dispatch scratch1 |