Changeset 95
- Timestamp:
- Sep 21, 2010, 1:22:37 PM (10 years ago)
- Location:
- Deliverables/D4.1
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
Deliverables/D4.1/ASMInterpret.ml
r93 r95 419 419 let lift a f g = 420 420 let (x, y) = f a in 421 (g x, g x)421 (g x, g y) 422 422 423 423 let assembly1 = … … 425 425 ACALL (`ADDR11 w) -> 426 426 let (a10,a9,a8,b1) = from_word11 w in 427 [ (a10,a9,a8,true),(false,false,false,true); lift b1 from_byte from_nibble]427 [mk_byte_from_bits ((a10,a9,a8,true),(false,false,false,true)); b1] 428 428 | ADD (`A,`REG (r1,r2,r3)) -> 429 [ (false,false,true,false),(true,r1,r2,r3)]429 [mk_byte_from_bits ((false,false,true,false),(true,r1,r2,r3))] 430 430 | ADD (`A, `DIRECT b1) -> 431 [ (false,false,true,false),(false,true,false,true); lift b1 from_byte from_nibble]431 [mk_byte_from_bits ((false,false,true,false),(false,true,false,true)); b1] 432 432 | ADD (`A, `INDIRECT i1) -> 433 [ (false,false,true,false),(false,true,true,i1)]433 [mk_byte_from_bits ((false,false,true,false),(false,true,true,i1))] 434 434 | ADD (`A, `DATA b1) -> 435 [ (false,false,true,false),(false,true,false,false); lift b1 from_byte from_nibble]435 [mk_byte_from_bits ((false,false,true,false),(false,true,false,false)); b1] 436 436 | ADDC (`A, `REG(r1,r2,r3)) -> 437 [ (false,false,true,true),(true,r1,r2,r3)]437 [mk_byte_from_bits ((false,false,true,true),(true,r1,r2,r3))] 438 438 | ADDC (`A, `DIRECT b1) -> 439 [ (false,false,true,true),(false,true,false,true); lift b1 from_byte from_nibble]439 [mk_byte_from_bits ((false,false,true,true),(false,true,false,true)); b1] 440 440 | ADDC (`A,`INDIRECT i1) -> 441 [ (false,false,true,true),(false,true,true,i1)]441 [mk_byte_from_bits ((false,false,true,true),(false,true,true,i1))] 442 442 | ADDC (`A,`DATA b1) -> 443 [ (false,false,true,true),(false,true,false,false); lift b1 from_byte from_nibble]443 [mk_byte_from_bits ((false,false,true,true),(false,true,false,false)); b1] 444 444 | AJMP (`ADDR11 w) -> 445 445 let (a10,a9,a8,b1) = from_word11 w in 446 [ (a10,a9,a8,false),(false,false,false,true)]446 [mk_byte_from_bits ((a10,a9,a8,false),(false,false,false,true))] 447 447 | ANL (`U1 (`A, `REG (r1,r2,r3))) -> 448 [ (false,true,false,true),(true,r1,r2,r3)]448 [mk_byte_from_bits ((false,true,false,true),(true,r1,r2,r3))] 449 449 | ANL (`U1 (`A, `DIRECT b1)) -> 450 [ (false,true,false,true),(false,true,false,true); lift b1 from_byte from_nibble]450 [mk_byte_from_bits ((false,true,false,true),(false,true,false,true)); b1] 451 451 | ANL (`U1 (`A, `INDIRECT i1)) -> 452 [ (false,true,false,true),(false,true,true,i1)]452 [mk_byte_from_bits ((false,true,false,true),(false,true,true,i1))] 453 453 | ANL (`U1 (`A, `DATA b1)) -> 454 [ (false,true,false,true),(false,true,false,false); lift b1 from_byte from_nibble]454 [mk_byte_from_bits ((false,true,false,true),(false,true,false,false)); b1] 455 455 | ANL (`U2 (`DIRECT b1,`A)) -> 456 [ (false,true,false,true),(false,false,true,false); lift b1 from_byte from_nibble]456 [mk_byte_from_bits ((false,true,false,true),(false,false,true,false)); b1] 457 457 | ANL (`U2 (`DIRECT b1,`DATA b2)) -> 458 [ (false,true,false,true),(false,false,true,true); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]458 [mk_byte_from_bits ((false,true,false,true),(false,false,true,true)); b1; b2] 459 459 | ANL (`U3 (`C,`BIT b1)) -> 460 [ (true,false,false,false),(false,false,true,false); lift b1 from_byte from_nibble]460 [mk_byte_from_bits ((true,false,false,false),(false,false,true,false)); b1] 461 461 | ANL (`U3 (`C,`NBIT b1)) -> 462 [ (true,false,true,true),(false,false,false,false); lift b1 from_byte from_nibble]462 [mk_byte_from_bits ((true,false,true,true),(false,false,false,false)); b1] 463 463 | CJNE (`U1 (`A, `DIRECT b1), `REL b2) -> 464 [ (true,false,true,true),(false,true,false,true); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]464 [mk_byte_from_bits ((true,false,true,true),(false,true,false,true)); b1; b2] 465 465 | CJNE (`U1 (`A, `DATA b1), `REL b2) -> 466 [ (true,false,true,true),(false,true,false,false); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]466 [mk_byte_from_bits ((true,false,true,true),(false,true,false,false)); b1; b2] 467 467 | CJNE (`U2 (`REG(r1,r2,r3), `DATA b1), `REL b2) -> 468 [ (true,false,true,true),(true,r1,r2,r3); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]468 [mk_byte_from_bits ((true,false,true,true),(true,r1,r2,r3)); b1; b2] 469 469 | CJNE (`U2 (`INDIRECT i1, `DATA b1), `REL b2) -> 470 [ (true,false,true,true),(false,true,true,i1); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]470 [mk_byte_from_bits ((true,false,true,true),(false,true,true,i1)); b1; b2] 471 471 | CLR `A -> 472 [ (true,true,true,false),(false,true,false,false)]472 [mk_byte_from_bits ((true,true,true,false),(false,true,false,false))] 473 473 | CLR `C -> 474 [ (true,true,false,false),(false,false,true,true)]474 [mk_byte_from_bits ((true,true,false,false),(false,false,true,true))] 475 475 | CLR (`BIT b1) -> 476 [ (true,true,false,false),(false,false,true,false); lift b1 from_byte from_nibble]476 [mk_byte_from_bits ((true,true,false,false),(false,false,true,false)); b1] 477 477 | CPL `A -> 478 [ (true,true,true,true),(false,true,false,false)]478 [mk_byte_from_bits ((true,true,true,true),(false,true,false,false))] 479 479 | CPL `C -> 480 [ (true,false,true,true),(false,false,true,true)]480 [mk_byte_from_bits ((true,false,true,true),(false,false,true,true))] 481 481 | CPL (`BIT b1) -> 482 [ (true,false,true,true),(false,false,true,false); lift b1 from_byte from_nibble]482 [mk_byte_from_bits ((true,false,true,true),(false,false,true,false)); b1] 483 483 | DA `A -> 484 [ (true,true,false,true),(false,true,false,false)]484 [mk_byte_from_bits ((true,true,false,true),(false,true,false,false))] 485 485 | DEC `A -> 486 [ (false,false,false,true),(false,true,false,false)]486 [mk_byte_from_bits ((false,false,false,true),(false,true,false,false))] 487 487 | DEC (`REG(r1,r2,r3)) -> 488 [ (false,false,false,true),(true,r1,r2,r3)]488 [mk_byte_from_bits ((false,false,false,true),(true,r1,r2,r3))] 489 489 | DEC (`DIRECT b1) -> 490 [ (false,false,false,true),(false,true,false,true); lift b1 from_byte from_nibble]490 [mk_byte_from_bits ((false,false,false,true),(false,true,false,true)); b1] 491 491 | DEC (`INDIRECT i1) -> 492 [ (false,false,false,true),(false,true,true,i1)]492 [mk_byte_from_bits ((false,false,false,true),(false,true,true,i1))] 493 493 | DIV (`A, `B) -> 494 [ (true,false,false,false),(false,true,false,false)]494 [mk_byte_from_bits ((true,false,false,false),(false,true,false,false))] 495 495 | DJNZ (`REG(r1,r2,r3), `REL b1) -> 496 [ (true,true,false,true),(true,r1,r2,r3); lift b1 from_byte from_nibble]496 [mk_byte_from_bits ((true,true,false,true),(true,r1,r2,r3)); b1] 497 497 | DJNZ (`DIRECT b1, `REL b2) -> 498 [ (true,true,false,true),(false,true,false,true); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]498 [mk_byte_from_bits ((true,true,false,true),(false,true,false,true)); b1; b2] 499 499 | INC `A -> 500 [ (false,false,false,false),(false,true,false,false)]500 [mk_byte_from_bits ((false,false,false,false),(false,true,false,false))] 501 501 | INC (`REG(r1,r2,r3)) -> 502 [ (false,false,false,false),(true,r1,r2,r3)]502 [mk_byte_from_bits ((false,false,false,false),(true,r1,r2,r3))] 503 503 | INC (`DIRECT b1) -> 504 [ (false,false,false,false),(false,true,false,true); lift b1 from_byte from_nibble]504 [mk_byte_from_bits ((false,false,false,false),(false,true,false,true)); b1] 505 505 | INC (`INDIRECT i1) -> 506 [ (false,false,false,false),(false,true,true,i1)]506 [mk_byte_from_bits ((false,false,false,false),(false,true,true,i1))] 507 507 | INC `DPTR -> 508 [ (true,false,true,false),(false,false,true,true)]508 [mk_byte_from_bits ((true,false,true,false),(false,false,true,true))] 509 509 | JB (`BIT b1, `REL b2) -> 510 [ (false,false,true,false),(false,false,false,false); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]510 [mk_byte_from_bits ((false,false,true,false),(false,false,false,false)); b1; b2] 511 511 | JBC (`BIT b1, `REL b2) -> 512 [ (false,false,false,true),(false,false,false,false); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]512 [mk_byte_from_bits ((false,false,false,true),(false,false,false,false)); b1; b2] 513 513 | JC (`REL b1) -> 514 [ (false,true,false,false),(false,false,false,false); lift b1 from_byte from_nibble]514 [mk_byte_from_bits ((false,true,false,false),(false,false,false,false)); b1] 515 515 | JMP `IND_DPTR -> 516 [ (false,true,true,true),(false,false,true,true)]516 [mk_byte_from_bits ((false,true,true,true),(false,false,true,true))] 517 517 | JNB (`BIT b1, `REL b2) -> 518 [ (false,false,true,true),(false,false,false,false); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]518 [mk_byte_from_bits ((false,false,true,true),(false,false,false,false)); b1; b2] 519 519 | JNC (`REL b1) -> 520 [ (false,true,false,true),(false,false,false,false); lift b1 from_byte from_nibble]520 [mk_byte_from_bits ((false,true,false,true),(false,false,false,false)); b1] 521 521 | JNZ (`REL b1) -> 522 [ (false,true,true,true),(false,false,false,false); lift b1 from_byte from_nibble]522 [mk_byte_from_bits ((false,true,true,true),(false,false,false,false)); b1] 523 523 | JZ (`REL b1) -> 524 [ (false,true,true,false),(false,false,false,false); lift b1 from_byte from_nibble]524 [mk_byte_from_bits ((false,true,true,false),(false,false,false,false)); b1] 525 525 | LCALL (`ADDR16 w) -> 526 526 let (b1,b2) = from_word w in 527 [ (false,false,false,true),(false,false,true,false); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]527 [mk_byte_from_bits ((false,false,false,true),(false,false,true,false)); b1; b2] 528 528 | LJMP (`ADDR16 w) -> 529 529 let (b1,b2) = from_word w in 530 [ (false,false,false,false),(false,false,true,false); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]530 [mk_byte_from_bits ((false,false,false,false),(false,false,true,false)); b1; b2] 531 531 | MOV (`U1 (`A, `REG(r1,r2,r3))) -> 532 [ (true,true,true,false),(true,r1,r2,r3)]532 [mk_byte_from_bits ((true,true,true,false),(true,r1,r2,r3))] 533 533 | MOV (`U1 (`A, `DIRECT b1)) -> 534 [ (true,true,true,false),(false,true,false,true); lift b1 from_byte from_nibble]534 [mk_byte_from_bits ((true,true,true,false),(false,true,false,true)); b1] 535 535 | MOV (`U1 (`A, `INDIRECT i1)) -> 536 [ (true,true,true,false),(false,true,true,i1)]536 [mk_byte_from_bits ((true,true,true,false),(false,true,true,i1))] 537 537 | MOV (`U1 (`A, `DATA b1)) -> 538 [ (false,true,true,true),(false,true,false,false); lift b1 from_byte from_nibble]538 [mk_byte_from_bits ((false,true,true,true),(false,true,false,false)); b1] 539 539 | MOV (`U2 (`REG(r1,r2,r3), `A)) -> 540 [ (true,true,true,true),(true,r1,r2,r3)]540 [mk_byte_from_bits ((true,true,true,true),(true,r1,r2,r3))] 541 541 | MOV (`U2 (`REG(r1,r2,r3), (`DIRECT b1))) -> 542 [ (true,false,true,false),(true,r1,r2,r3); lift b1 from_byte from_nibble]542 [mk_byte_from_bits ((true,false,true,false),(true,r1,r2,r3)); b1] 543 543 | MOV (`U2 (`REG(r1,r2,r3), (`DATA b1))) -> 544 [ (false,true,true,true),(true,r1,r2,r3); lift b1 from_byte from_nibble]544 [mk_byte_from_bits ((false,true,true,true),(true,r1,r2,r3)); b1] 545 545 | MOV (`U3 (`DIRECT b1, `A)) -> 546 [ (true,true,true,true),(false,true,false,true); lift b1 from_byte from_nibble]546 [mk_byte_from_bits ((true,true,true,true),(false,true,false,true)); b1] 547 547 | MOV (`U3 (`DIRECT b1, `REG(r1,r2,r3))) -> 548 [ (true,false,false,false),(true,r1,r2,r3); lift b1 from_byte from_nibble]548 [mk_byte_from_bits ((true,false,false,false),(true,r1,r2,r3)); b1] 549 549 | MOV (`U3 (`DIRECT b1, `DIRECT b2)) -> 550 [ (true,false,false,false),(false,true,false,true); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]550 [mk_byte_from_bits ((true,false,false,false),(false,true,false,true)); b1; b2] 551 551 | MOV (`U3 (`DIRECT b1, `INDIRECT i1)) -> 552 [ (true,false,false,false),(false,true,true,i1); lift b1 from_byte from_nibble]552 [mk_byte_from_bits ((true,false,false,false),(false,true,true,i1)); b1] 553 553 | MOV (`U3 (`DIRECT b1, `DATA b2)) -> 554 [ (false,true,true,true),(false,true,false,true); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]554 [mk_byte_from_bits ((false,true,true,true),(false,true,false,true)); b1; b2] 555 555 | MOV (`U2 (`INDIRECT i1, `A)) -> 556 [ (true,true,true,true),(false,true,true,i1)]556 [mk_byte_from_bits ((true,true,true,true),(false,true,true,i1))] 557 557 | MOV (`U2 (`INDIRECT i1, `DIRECT b1)) -> 558 [ (true,false,true,false),(false,true,true,i1); lift b1 from_byte from_nibble]558 [mk_byte_from_bits ((true,false,true,false),(false,true,true,i1)); b1] 559 559 | MOV (`U2 (`INDIRECT i1, `DATA b1)) -> 560 [ (false,true,true,true),(false,true,true,i1); lift b1 from_byte from_nibble]560 [mk_byte_from_bits ((false,true,true,true),(false,true,true,i1)); b1] 561 561 | MOV (`U5 (`C, `BIT b1)) -> 562 [ (true,false,true,false),(false,false,true,false); lift b1 from_byte from_nibble]562 [mk_byte_from_bits ((true,false,true,false),(false,false,true,false)); b1] 563 563 | MOV (`U6 (`BIT b1, `C)) -> 564 [ (true,false,false,true),(false,false,true,false); lift b1 from_byte from_nibble]564 [mk_byte_from_bits ((true,false,false,true),(false,false,true,false)); b1] 565 565 | MOV (`U4 (`DPTR, `DATA16 w)) -> 566 566 let (b1,b2) = from_word w in 567 [ (true,false,false,true),(false,false,false,false); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]567 [mk_byte_from_bits ((true,false,false,true),(false,false,false,false)); b1; b2] 568 568 | MOVC (`A, `A_DPTR) -> 569 [ (true,false,false,true),(false,false,true,true)]569 [mk_byte_from_bits ((true,false,false,true),(false,false,true,true))] 570 570 | MOVC (`A, `A_PC) -> 571 [ (true,false,false,false),(false,false,true,true)]571 [mk_byte_from_bits ((true,false,false,false),(false,false,true,true))] 572 572 | MOVX (`U1 (`A, `EXT_INDIRECT i1)) -> 573 [ (true,true,true,false),(false,false,true,i1)]573 [mk_byte_from_bits ((true,true,true,false),(false,false,true,i1))] 574 574 | MOVX (`U1 (`A, `EXT_IND_DPTR)) -> 575 [ (true,true,true,false),(false,false,false,false)]575 [mk_byte_from_bits ((true,true,true,false),(false,false,false,false))] 576 576 | MOVX (`U2 (`EXT_INDIRECT i1, `A)) -> 577 [ (true,true,true,true),(false,false,true,i1)]577 [mk_byte_from_bits ((true,true,true,true),(false,false,true,i1))] 578 578 | MOVX (`U2 (`EXT_IND_DPTR, `A)) -> 579 [ (true,true,true,true),(false,false,false,false)]579 [mk_byte_from_bits ((true,true,true,true),(false,false,false,false))] 580 580 | MUL(`A, `B) -> 581 [ (true,false,true,false),(false,true,false,false)]581 [mk_byte_from_bits ((true,false,true,false),(false,true,false,false))] 582 582 | NOP -> 583 [ (false,false,false,false),(false,false,false,false)]583 [mk_byte_from_bits ((false,false,false,false),(false,false,false,false))] 584 584 | ORL (`U1(`A, `REG(r1,r2,r3))) -> 585 [ (false,true,false,false),(true,r1,r2,r3)]585 [mk_byte_from_bits ((false,true,false,false),(true,r1,r2,r3))] 586 586 | ORL (`U1(`A, `DIRECT b1)) -> 587 [ (false,true,false,false),(false,true,false,true); lift b1 from_byte from_nibble]587 [mk_byte_from_bits ((false,true,false,false),(false,true,false,true)); b1] 588 588 | ORL (`U1(`A, `INDIRECT i1)) -> 589 [ (false,true,false,false),(false,true,true,i1)]589 [mk_byte_from_bits ((false,true,false,false),(false,true,true,i1))] 590 590 | ORL (`U1(`A, `DATA b1)) -> 591 [ (false,true,false,false),(false,true,false,false); lift b1 from_byte from_nibble]591 [mk_byte_from_bits ((false,true,false,false),(false,true,false,false)); b1] 592 592 | ORL (`U2(`DIRECT b1, `A)) -> 593 [ (false,true,false,false),(false,false,true,false); lift b1 from_byte from_nibble]593 [mk_byte_from_bits ((false,true,false,false),(false,false,true,false)); b1] 594 594 | ORL (`U2 (`DIRECT b1, `DATA b2)) -> 595 [ (false,true,false,false),(false,false,true,true); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]595 [mk_byte_from_bits ((false,true,false,false),(false,false,true,true)); b1; b2] 596 596 | ORL (`U3 (`C, `BIT b1)) -> 597 [ (false,true,true,true),(false,false,true,false); lift b1 from_byte from_nibble]597 [mk_byte_from_bits ((false,true,true,true),(false,false,true,false)); b1] 598 598 | ORL (`U3 (`C, `NBIT b1)) -> 599 [ (true,false,true,false),(false,false,false,false); lift b1 from_byte from_nibble]599 [mk_byte_from_bits ((true,false,true,false),(false,false,false,false)); b1] 600 600 | POP (`DIRECT b1) -> 601 [ (true,true,false,true),(false,false,false,false); lift b1 from_byte from_nibble]601 [mk_byte_from_bits ((true,true,false,true),(false,false,false,false)); b1] 602 602 | PUSH (`DIRECT b1) -> 603 [ (true,true,false,false),(false,false,false,false); lift b1 from_byte from_nibble]603 [mk_byte_from_bits ((true,true,false,false),(false,false,false,false)); b1] 604 604 | RET -> 605 [ (false,false,true,false),(false,false,true,false)]605 [mk_byte_from_bits ((false,false,true,false),(false,false,true,false))] 606 606 | RETI -> 607 [ (false,false,true,true),(false,false,true,false)]607 [mk_byte_from_bits ((false,false,true,true),(false,false,true,false))] 608 608 | RL `A -> 609 [ (false,false,true,false),(false,false,true,true)]609 [mk_byte_from_bits ((false,false,true,false),(false,false,true,true))] 610 610 | RLC `A -> 611 [ (false,false,true,true),(false,false,true,true)]611 [mk_byte_from_bits ((false,false,true,true),(false,false,true,true))] 612 612 | RR `A -> 613 [ (false,false,false,false),(false,false,true,true)]613 [mk_byte_from_bits ((false,false,false,false),(false,false,true,true))] 614 614 | RRC `A -> 615 [ (false,false,false,true),(false,false,true,true)]615 [mk_byte_from_bits ((false,false,false,true),(false,false,true,true))] 616 616 | SETB `C -> 617 [ (true,true,false,true),(false,false,true,true)]617 [mk_byte_from_bits ((true,true,false,true),(false,false,true,true))] 618 618 | SETB (`BIT b1) -> 619 [ (true,true,false,true),(false,false,true,false); lift b1 from_byte from_nibble]619 [mk_byte_from_bits ((true,true,false,true),(false,false,true,false)); b1] 620 620 | SJMP (`REL b1) -> 621 [ (true,false,false,false),(false,false,false,false); lift b1 from_byte from_nibble]621 [mk_byte_from_bits ((true,false,false,false),(false,false,false,false)); b1] 622 622 | SUBB (`A, `REG(r1,r2,r3)) -> 623 [ (true,false,false,true),(true,r1,r2,r3)]623 [mk_byte_from_bits ((true,false,false,true),(true,r1,r2,r3))] 624 624 | SUBB (`A, `DIRECT b1) -> 625 [ (true,false,false,true),(false,true,false,true); lift b1 from_byte from_nibble]625 [mk_byte_from_bits ((true,false,false,true),(false,true,false,true)); b1] 626 626 | SUBB (`A, `INDIRECT i1) -> 627 [ (true,false,false,true),(false,true,true,i1)]627 [mk_byte_from_bits ((true,false,false,true),(false,true,true,i1))] 628 628 | SUBB (`A, `DATA b1) -> 629 [ (true,false,false,true),(false,true,false,false); lift b1 from_byte from_nibble]629 [mk_byte_from_bits ((true,false,false,true),(false,true,false,false)); b1] 630 630 | SWAP `A -> 631 [ (true,true,false,false),(false,true,false,false)]631 [mk_byte_from_bits ((true,true,false,false),(false,true,false,false))] 632 632 | XCH (`A, `REG(r1,r2,r3)) -> 633 [ (true,true,false,false),(true,r1,r2,r3)]633 [mk_byte_from_bits ((true,true,false,false),(true,r1,r2,r3))] 634 634 | XCH (`A, `DIRECT b1) -> 635 [ (true,true,false,false),(false,true,false,true); lift b1 from_byte from_nibble]635 [mk_byte_from_bits ((true,true,false,false),(false,true,false,true)); b1] 636 636 | XCH (`A, `INDIRECT i1) -> 637 [ (true,true,false,false),(false,true,true,i1)]637 [mk_byte_from_bits ((true,true,false,false),(false,true,true,i1))] 638 638 | XCHD(`A, `INDIRECT i1) -> 639 [ (true,true,false,true),(false,true,true,i1)]639 [mk_byte_from_bits ((true,true,false,true),(false,true,true,i1))] 640 640 | XRL(`U1(`A, `REG(r1,r2,r3))) -> 641 [ (false,true,true,false),(true,r1,r2,r3)]641 [mk_byte_from_bits ((false,true,true,false),(true,r1,r2,r3))] 642 642 | XRL(`U1(`A, `DIRECT b1)) -> 643 [ (false,true,true,false),(false,true,false,true); lift b1 from_byte from_nibble]643 [mk_byte_from_bits ((false,true,true,false),(false,true,false,true)); b1] 644 644 | XRL(`U1(`A, `INDIRECT i1)) -> 645 [ (false,true,true,false),(false,true,true,i1)]645 [mk_byte_from_bits ((false,true,true,false),(false,true,true,i1))] 646 646 | XRL(`U1(`A, `DATA b1)) -> 647 [ (false,true,true,false),(false,true,false,false); lift b1 from_byte from_nibble]647 [mk_byte_from_bits ((false,true,true,false),(false,true,false,false)); b1] 648 648 | XRL(`U2(`DIRECT b1, `A)) -> 649 [ (false,true,true,false),(false,false,true,false); lift b1 from_byte from_nibble]649 [mk_byte_from_bits ((false,true,true,false),(false,false,true,false)); b1] 650 650 | XRL(`U2(`DIRECT b1, `DATA b2)) -> 651 [ (false,true,true,false),(false,false,true,true); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]651 [mk_byte_from_bits ((false,true,true,false),(false,false,true,true)); b1; b2] 652 652 ;; 653 653 654 654 let get_address_of_register status (b1,b2,b3) = 655 let (_,_,rs1,rs0),_ = from_word status.psw in 655 let bu,bl = from_byte status.psw in 656 let (_,_,rs1,rs0) = from_nibble bu in 656 657 let base = 657 658 match rs1,rs0 with … … 661 662 | true,true -> 0x18 662 663 in 663 byte7_of_int (base + int_of_nibble (false,b1,b2,b3))664 vect_of_int (base + int_of_vect (mk_nibble false b1 b2 b3)) `Seven 664 665 ;; 665 666 666 667 let get_register status reg = 667 let addr = address_of_register status reg in668 let addr = get_address_of_register status reg in 668 669 Byte7Map.find addr status.low_internal_ram 669 670 ;; 670 671 671 672 let set_register status v reg = 672 let addr = address_of_register status reg in673 let addr = get_address_of_register status reg in 673 674 { status with low_internal_ram = 674 675 Byte7Map.add addr v status.low_internal_ram } … … 680 681 (match addr with 681 682 (false,r1,r2,r3),n1 -> 682 Byte7Map.find ( r1,r2,r3,n1) status.low_internal_ram683 Byte7Map.find (mk_byte7 r1 r2 r3 n1) status.low_internal_ram 683 684 | (true,r1,r2,r3),n1 -> 684 685 (*CSC: SFR access, TO BE IMPLEMENTED *) 685 686 assert false) 686 687 | `INDIRECT b -> 687 let addr = get_register status (false,false,b) in688 (match addrwith689 (false,r1,r2,r3), n1->690 Byte7Map.find ( r1,r2,r3,n1) status.low_internal_ram691 | (true,r1,r2,r3), n1->692 Byte7Map.find ( r1,r2,r3,n1) status.high_internal_ram)688 let (b1, b2) = from_byte (get_register status (false,false,b)) in 689 (match (from_nibble b1, b2) with 690 (false,r1,r2,r3),b2 -> 691 Byte7Map.find (mk_byte7 r1 r2 r3 b2) status.low_internal_ram 692 | (true,r1,r2,r3),b2 -> 693 Byte7Map.find (mk_byte7 r1 r2 r3 b2) status.high_internal_ram) 693 694 | `REG (b1,b2,b3) -> get_register status (b1,b2,b3) 694 695 | `A -> status.acc … … 696 697 | `DATA b -> b 697 698 | `A_DPTR -> 698 let dpr = status.dph,status.dpl in699 let dpr = mk_word status.dph status.dpl in 699 700 (* CSC: what is the right behaviour in case of overflow? 700 701 assert false for now. Try to understand what DEC really does *) 701 let addr = dpr ++ (int_of_vect `Eightstatus.acc) in702 let cry,addr = half_add dpr (mk_word (vect_of_int 0 `Eight) status.acc) in 702 703 WordMap.find addr status.external_ram 703 704 | `A_PC -> 704 705 (* CSC: what is the right behaviour in case of overflow? 705 706 assert false for now *) 706 let addr = status.pc ++ (int_of_vect `Eightstatus.acc) in707 let cry,addr = half_add status.pc (mk_word (vect_of_int 0 `Eight) status.acc) in 707 708 WordMap.find addr status.external_ram 708 709 | `IND_DPTR -> 709 let dpr = status.dph,status.dpl in710 let dpr = mk_word status.dph status.dpl in 710 711 WordMap.find dpr status.external_ram 711 712 ;; … … 722 723 (match addr with 723 724 (false,r1,r2,r3),n1 -> 724 let addr = (int_of_vect `Seven (r1,r2,r3,n1)) in 725 let addr' = vect_of_int ((addr / 8) + 32) in 726 nth_bit (addr mod 8) (Byte7Map.find addr' status.low_internal_ram) 727 | (true,r1,r2,r3),n1 -> 725 let addr = (int_of_vect (mk_byte7 r1 r2 r3 n1)) in 726 let addr' = vect_of_int ((addr / 8) + 32) `Seven in 727 let bit = get_bit (Byte7Map.find addr' status.low_internal_ram) (addr mod 8) in 728 (match bit with 729 None -> assert false 730 | Some bit' -> bit') 731 | (true,r1,r2,r3),n1 -> 728 732 (*CSC: SFR access, TO BE IMPLEMENTED *) 729 733 assert false) 730 734 in (match x with `BIT _ -> res | _ -> not res) 731 | `C -> 732 let ((b1,_,_,_),_) = status.psw in b1 735 | `C -> get_cy_flag status 733 736 734 737 let set_arg1 status v = … … 737 740 (match addr with 738 741 (false,r1,r2,r3),n1 -> 739 let addr = (int_of_vect `Seven (r1,r2,r3,n1)) in 740 let addr' = vect_of_int ((addr / 8) + 32) in 741 { status with low_internal_ram = 742 Byte7Map.add addr' (set_nth_bit (addr mod 8) v (Byte7Map.find addr' status.low_internal_ram)) status.low_internal_ram } 742 let addr = (int_of_vect (mk_byte7 r1 r2 r3 n1)) in 743 let addr' = vect_of_int ((addr / 8) + 32) `Seven in 744 let n_bit = set_bit (Byte7Map.find addr' status.low_internal_ram) (addr mod 8) v in 745 (match n_bit with 746 None -> assert false 747 | Some n_bit' -> 748 { status with low_internal_ram = Byte7Map.add addr' n_bit' status.low_internal_ram }) 743 749 | (true,r1,r2,r3),n1 -> 744 750 (*CSC: SFR access, TO BE IMPLEMENTED *) … … 746 752 assert false) 747 753 | `C -> 748 let ((_,b2,b3,b4),n2) = status.psw in 749 { status with psw = (v,b2,b3,b4),n2 } 754 let (n1,n2) = from_byte status.psw in 755 let (_,b2,b3,b4) = from_nibble n1 in 756 { status with psw = (mk_byte (mk_nibble v b2 b3 b4) n2) } 750 757 751 758 let set_arg8 status v = … … 755 762 (false,r1,r2,r3),n1 -> 756 763 { status with low_internal_ram = 757 Byte7Map.add ( r1,r2,r3,n1) v status.low_internal_ram }764 Byte7Map.add (mk_byte7 r1 r2 r3 n1) v status.low_internal_ram } 758 765 | (true,r1,r2,r3),n1 -> 759 766 (*CSC: SFR access, TO BE IMPLEMENTED *) … … 761 768 assert false) 762 769 | `INDIRECT b -> 763 let addr = get_register status (false,false,b) in764 (match addrwith770 let (b1, b2) = from_byte (get_register status (false,false,b)) in 771 (match (from_nibble b1, b2) with 765 772 (false,r1,r2,r3),n1 -> 766 773 { status with low_internal_ram = 767 Byte7Map.add ( r1,r2,r3,n1) v status.low_internal_ram }774 Byte7Map.add (mk_byte7 r1 r2 r3 n1) v status.low_internal_ram } 768 775 | (true,r1,r2,r3),n1 -> 769 776 { status with high_internal_ram = 770 Byte7Map.add ( r1,r2,r3,n1) v status.high_internal_ram })777 Byte7Map.add (mk_byte7 r1 r2 r3 n1) v status.high_internal_ram }) 771 778 | `REG (b1,b2,b3) -> 772 779 set_register status v (b1,b2,b3) … … 774 781 | `B -> { status with b = v } 775 782 | `IND_DPTR -> 776 let dpr = status.dph,status.dpl in783 let dpr = mk_word status.dph status.dpl in 777 784 { status with external_ram = 778 785 WordMap.add dpr v status.external_ram } … … 786 793 let set_flags status c ac ov = 787 794 { status with psw = 788 let (_c,oac,fo,rs1),(rs0,_ov,ud,p) = status.psw in 795 let bu,bl = from_byte status.psw in 796 let (_c,oac,fo,rs1),(rs0,_ov,ud,p) = from_nibble bu, from_nibble bl in 789 797 let ac = match ac with None -> oac | Some v -> v in 790 (c,ac,fo,rs1),(rs0,ov,ud,p)798 mk_byte (mk_nibble c ac fo rs1) (mk_nibble rs0 ov ud p) 791 799 } 792 800 ;; … … 800 808 ;; 801 809 810 (* 802 811 let execute1 status = 803 812 let instr,pc,ticks = fetch status.code_memory status.pc in … … 1166 1175 | NOP -> status 1167 1176 ;; 1177 *) -
Deliverables/D4.1/BitVectors.ml
r92 r95 15 15 | _ -> assert false 16 16 let mk_byte n1 n2 = n1 @ n2 17 let mk_byte_from_bits ((b1,b2,b3,b4),(b5,b6,b7,b8)) = ([b1;b2;b3;b4;b5;b6;b7;b8] : [`Eight] vect) 17 18 let from_byte = 18 19 function … … 53 54 let xor b1 b2 = b1 <> b2 54 55 let (-^-) l1 l2 = List.map2 xor l1 l2 55 let not l1 = List.map (not) l156 let complement l1 = List.map (not) l1 56 57 57 58 let iter_bits f v = String.concat "" (List.map f v) -
Deliverables/D4.1/BitVectors.mli
r92 r95 16 16 val from_byte7: byte7 -> bit * bit * bit * nibble 17 17 val mk_byte: nibble -> nibble -> byte 18 val mk_byte_from_bits: ((bit * bit * bit * bit) * (bit * bit * bit * bit)) -> byte 18 19 val from_byte: byte -> nibble * nibble 19 20 val mk_word: byte -> byte -> word … … 32 33 val (-|-): 'a vect -> 'a vect -> 'a vect 33 34 val (-^-): 'a vect -> 'a vect -> 'a vect 34 val not: 'a vect -> 'a vect35 val complement: 'a vect -> 'a vect 35 36 36 37 val iter_bits: (bit -> string) -> 'a vect -> string
Note: See TracChangeset
for help on using the changeset viewer.