KDOXG

8080Disassembler

Sep 13th, 2020 (edited)
557
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.00 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define setRegisterLetter(out,var1,var2,var3)   \
  4.     out = 0b01000000;   \
  5.     out |= !var1 & var3 | var1 & var2;  \
  6.     out |= (!(var1 | var2)) << 1;   \
  7.     out |= (!var1 & var2 | var2 & !var3 | var1 & !var2 & var3) << 2;    \
  8.     out |= (var1 & !(var2 & var3)) << 3
  9.  
  10.  
  11. int Disassembler8080(unsigned char *codebuffer, int pc)
  12. {
  13.     unsigned char *code = &codebuffer[pc];
  14.     int opbytes = 1;
  15.  
  16.     unsigned char bit1 = *code << 7; bit1 >>= 7;
  17.     unsigned char bit2 = *code << 6; bit2 >>= 7;
  18.     unsigned char bit3 = *code << 5; bit3 >>= 7;
  19.     unsigned char bit4 = *code << 4; bit4 >>= 7;
  20.     unsigned char bit5 = *code << 3; bit5 >>= 7;
  21.     unsigned char bit6 = *code << 2; bit6 >>= 7;
  22.     unsigned char bit7 = *code << 1; bit7 >>= 7;
  23.     unsigned char bit8 = *code >> 7;
  24.     unsigned char output = 0b00000000;
  25.  
  26.     printf("%04x :", pc);
  27.  
  28.  
  29.     if (!bit8 && bit7)
  30.     {       /*
  31.             B   C   D   E   H   L   M   A
  32.             B   01000010   
  33.             C   01000011
  34.             D   01000100
  35.             E   01000101
  36.             H   01001000
  37.             L   01001100
  38.             M   01001101
  39.             A   01000001
  40.             left    - bit6 bit5 bit4
  41.             right   - bit3 bit2 bit1
  42.             decod = 0010 - 000
  43.                     0011 - 001
  44.                     0100 - 010
  45.                     0101 - 011
  46.                     1000 - 100
  47.                     1100 - 101
  48.                     1101 - 110
  49.                     0001 - 111
  50.         */
  51.         if (*code == 0x76)      //HTL
  52.             printf("HTL\n");
  53.         else                    //MOV
  54.         {
  55.             printf("MOV     ");
  56.             setRegisterLetter(output,bit6,bit5,bit4);
  57.             printf("%c,", output);
  58.             setRegisterLetter(output,bit3,bit2,bit1);
  59.             printf("%c\n", output);
  60.         }
  61.         return opbytes;
  62.     }
  63.  
  64.     if (bit8 && !bit7)
  65.     {
  66.         if (bit6)
  67.         {
  68.             if (bit5 ^ bit4)    //XRA OR ORA
  69.             {
  70.                 if (bit4)       //if bit4 = 0, then bit5 = 1
  71.                     output = 'X';
  72.                 else
  73.                     output = 'O';
  74.                 printf("%cRA        ", output);
  75.                 setRegisterLetter(output,bit3,bit2,bit1);
  76.                 printf("%c\n", output);
  77.             }
  78.             else
  79.             {
  80.                 if (bit5)       //CMP
  81.                     printf("CMP     ");
  82.                 else            //ANA
  83.                     printf("ANA     ");
  84.                 setRegisterLetter(output,bit3,bit2,bit1);
  85.                 printf("%c\n", output);
  86.             }
  87.         }
  88.         else
  89.         {
  90.             if (bit5)
  91.             {
  92.                 if (bit4)           //SBB
  93.                     output = 'B';
  94.                 else                //SUB
  95.                     output = 'U';
  96.                 printf("S%cB        ", output);
  97.                 setRegisterLetter(output,bit3,bit2,bit1);
  98.                 printf("%c\n", output);
  99.             }
  100.             else                //ADD OR ADC
  101.             {
  102.                 output = 0b01000100 - bit4;     //if bit4 = 1, 0b01000100 ('D') - 1 = 0b01000011 ('C')
  103.                 printf("AD%c        ", output);
  104.                 setRegisterLetter(output,bit3,bit2,bit1);
  105.                 printf("%c\n", output);
  106.             }
  107.         }
  108.         return opbytes;
  109.     }
  110.    
  111.  
  112.     switch (*code)
  113.     {
  114.  
  115.     case 0x00:
  116.         printf("NOP");
  117.         break;
  118.  
  119.     case 0x01:
  120.         printf("LXI     B,#$%02x%02x", code[2], code[1]);
  121.         opbytes = 3;
  122.         break;
  123.  
  124.     case 0x02:
  125.         printf("STAX    B");
  126.         break;
  127.  
  128.     case 0x03:
  129.         printf("INX     B");
  130.         break;
  131.  
  132.     case 0x04:
  133.         printf("INR     B");
  134.         break;
  135.  
  136.     case 0x05:
  137.         printf("DCR     B");
  138.         break;
  139.  
  140.     case 0x06:
  141.         printf("MVI     B,#$%02x", code[1]);
  142.         opbytes = 2;
  143.         break;
  144.  
  145.     case 0x07:
  146.         printf("RLC");
  147.         break;
  148.  
  149.     case 0x08:
  150.         printf("NOP");
  151.         break;
  152.  
  153.     case 0x09:
  154.         printf("DAD     B");
  155.         break;
  156.  
  157.     case 0x0a:
  158.         printf("LDAX    B");
  159.         break;
  160.  
  161.     case 0x0b:
  162.         printf("DCX     B");
  163.         break;
  164.  
  165.     case 0x0c:
  166.         printf("INR     C");
  167.         break;
  168.  
  169.     case 0x0d:
  170.         printf("DCR     C");
  171.         break;
  172.  
  173.     case 0x0e:
  174.         printf("MVI     C,#$%02x", code[1]);
  175.         opbytes = 2;
  176.         break;
  177.  
  178.     case 0x0f:
  179.         printf("RRC");
  180.         break;
  181.  
  182.     case 0x10:
  183.         printf("NOP");
  184.         break;
  185.  
  186.     case 0x11:
  187.         printf("LXI     B,#$%02x%02x", code[2], code[1]);
  188.         opbytes = 3;
  189.         break;
  190.  
  191.     case 0x12:
  192.         printf("STAX    D");
  193.         break;
  194.  
  195.     case 0x13:
  196.         printf("INX     D");
  197.         break;
  198.  
  199.     case 0x14:
  200.         printf("INR     D");
  201.         break;
  202.  
  203.     case 0x15:
  204.         printf("DCR     D");
  205.         break;
  206.  
  207.     case 0x16:
  208.         printf("MVI     D,#$%02x", code[1]);
  209.         opbytes = 2;
  210.         break;
  211.  
  212.     case 0x17:
  213.         printf("RAL");
  214.         break;
  215.  
  216.     case 0x18:
  217.         printf("NOP");
  218.         break;
  219.  
  220.     case 0x19:
  221.         printf("DAD     D");
  222.         break;
  223.  
  224.     case 0x1a:
  225.         printf("LDAX    D");
  226.         break;
  227.  
  228.     case 0x1b:
  229.         printf("DCX     D");
  230.         break;
  231.  
  232.     case 0x1c:
  233.         printf("INR     E");
  234.         break;
  235.  
  236.     case 0x1d:
  237.         printf("DCR     E");
  238.         break;
  239.  
  240.     case 0x1e:
  241.         printf("MVI     E,#$%02x", code[1]);
  242.         opbytes = 2;
  243.         break;
  244.  
  245.     case 0x1f:
  246.         printf("RAR");
  247.         break;
  248.  
  249.     case 0x20:
  250.         printf("NOP");
  251.         break;
  252.  
  253.     case 0x21:
  254.         printf("LXI     H,#$%02x%02x", code[2], code[1]);
  255.         opbytes = 3;
  256.         break;
  257.  
  258.     case 0x22:
  259.         printf("SHLD    #%02x%02x", code[2], code[1]);
  260.         opbytes = 3;
  261.         break;
  262.  
  263.     case 0x23:
  264.         printf("INX     H");
  265.         break;
  266.  
  267.     case 0x24:
  268.         printf("INR     H");
  269.         break;
  270.  
  271.     case 0x25:
  272.         printf("DCR     H");
  273.         break;
  274.  
  275.     case 0x26:
  276.         printf("MVI     H,#$%02x", code[1]);
  277.         opbytes = 2;
  278.         break;
  279.  
  280.     case 0x27:
  281.         printf("DAA");
  282.         break;
  283.  
  284.     case 0x28:
  285.         printf("NOP");
  286.         break;
  287.  
  288.     case 0x29:
  289.         printf("DAD     H");
  290.         break;
  291.  
  292.     case 0x2a:
  293.         printf("LHLD    $%02x%02x", code[2], code[1]);
  294.         opbytes = 3;
  295.         break;
  296.  
  297.     case 0x2b:
  298.         printf("DCX     H");
  299.         break;
  300.  
  301.     case 0x2c:
  302.         printf("INR     L");
  303.         break;
  304.  
  305.     case 0x2d:
  306.         printf("DCR     L");
  307.         break;
  308.  
  309.     case 0x2e:
  310.         printf("MVI     L,#$%02x", code[1]);
  311.         opbytes = 2;
  312.         break;
  313.  
  314.     case 0x2f:
  315.         printf("CMA");
  316.         break;
  317.  
  318.     case 0x30:
  319.         printf("NOP");
  320.         break;
  321.  
  322.     case 0x31:
  323.         printf("LXI     SP,#$%02x%02x", code[2], code[1]);
  324.         opbytes = 3;
  325.         break;
  326.  
  327.     case 0x32:
  328.         printf("STA     #$%02x", code[2]);
  329.         opbytes = 3;
  330.         break;
  331.  
  332.     case 0x33:
  333.         printf("INX     SP");
  334.         break;
  335.  
  336.     case 0x34:
  337.         printf("INR     M");
  338.         break;
  339.  
  340.     case 0x35:
  341.         printf("DCR     M");
  342.         break;
  343.  
  344.     case 0x36:
  345.         printf("MVI     M,#$%02x", code[1]);
  346.         opbytes = 2;
  347.         break;
  348.  
  349.     case 0x37:
  350.         printf("STC");
  351.         break;
  352.  
  353.     case 0x38:
  354.         printf("NOP");
  355.         break;
  356.  
  357.     case 0x39:
  358.         printf("DAD     SP");
  359.         break;
  360.  
  361.     case 0x3a:
  362.         printf("LDA     #$%02x", code[2]);
  363.         opbytes = 3;
  364.         break;
  365.  
  366.     case 0x3b:
  367.         printf("DCX     SP");
  368.         break;
  369.  
  370.     case 0x3c:
  371.         printf("INR     A");
  372.         break;
  373.  
  374.     case 0x3d:
  375.         printf("DCR     A");
  376.         break;
  377.  
  378.     case 0x3e:
  379.         printf("MVI     A,#$%02x", code[1]);
  380.         opbytes = 2;
  381.         break;
  382.  
  383.     case 0x3f:
  384.         printf("CMC");
  385.         break;
  386.  
  387.     case 0xc0:
  388.         printf("RNZ");
  389.         break;
  390.  
  391.     case 0xc1:
  392.         printf("POP     B");
  393.         break;
  394.  
  395.     case 0xc2:
  396.         printf("JNZ     #$%02x", code[2]);
  397.         opbytes = 3;
  398.         break;
  399.  
  400.     case 0xc3:
  401.         printf("JMP     #$%02x", code[2]);
  402.         opbytes = 3;
  403.         break;
  404.  
  405.     case 0xc4:
  406.         printf("CNZ     #$%02x", code[2]);
  407.         opbytes = 3;
  408.         break;
  409.  
  410.     case 0xc5:
  411.         printf("PUSH        B");
  412.         break;
  413.  
  414.     case 0xc6:
  415.         printf("ADI         #$%02x", code[1]);
  416.         opbytes = 2;
  417.         break;
  418.  
  419.     case 0xc7:
  420.         printf("RST     0");
  421.         break;
  422.  
  423.     case 0xc8:
  424.         printf("RZ");
  425.         break;
  426.  
  427.     case 0xc9:
  428.         printf("RET");
  429.         break;
  430.  
  431.     case 0xca:
  432.         printf("JZ      #$%02x", code[2]);
  433.         opbytes = 3;
  434.         break;
  435.  
  436.     case 0xcb:
  437.         printf("NOP");
  438.         break;
  439.  
  440.     case 0xcc:
  441.         printf("CZ      #$%02x", code[2]);
  442.         opbytes = 3;
  443.         break;
  444.  
  445.     case 0xcd:
  446.         printf("CALL    #$%02x", code[2]);
  447.         opbytes = 3;
  448.         break;
  449.  
  450.     case 0xce:
  451.         printf("ACI     #$%02x", code[1]);
  452.         opbytes = 2;
  453.         break;
  454.  
  455.     case 0xcf:
  456.         printf("RST     1");
  457.         break;
  458.  
  459.     case 0xd0:
  460.         printf("RNC");
  461.         break;
  462.  
  463.     case 0xd1:
  464.         printf("POP     D");
  465.         break;
  466.  
  467.     case 0xd2:
  468.         printf("JNC     #$%02x", code[2]);
  469.         opbytes = 3;
  470.         break;
  471.  
  472.     case 0xd3:
  473.         printf("OUT     #$%02x", code[1]);
  474.         opbytes = 2;
  475.         break;
  476.  
  477.     case 0xd4:
  478.         printf("CNC     #$%02x", code[2]);
  479.         opbytes = 2;
  480.         break;
  481.  
  482.     case 0xd5:
  483.         printf("PUSH        D");
  484.         break;
  485.  
  486.     case 0xd6:
  487.         printf("SUI     #$%02x", code[1]);
  488.         opbytes = 2;
  489.         break;
  490.  
  491.     case 0xd7:
  492.         printf("RST     2");
  493.         break;
  494.  
  495.     case 0xd8:
  496.         printf("RC");
  497.         break;
  498.  
  499.     case 0xd9:
  500.         printf("NOP");
  501.         break;
  502.  
  503.     case 0xda:
  504.         printf("JC      #$%02x", code[2]);
  505.         opbytes = 3;
  506.         break;
  507.  
  508.     case 0xdb:
  509.         printf("IN      #$%02x", code[1]);
  510.         opbytes = 2;
  511.         break;
  512.  
  513.     case 0xdc:
  514.         printf("CC      #$%02x", code[2]);
  515.         opbytes = 3;
  516.         break;
  517.  
  518.     case 0xdd:
  519.         printf("NOP");
  520.         break;
  521.  
  522.     case 0xde:
  523.         printf("SBI     #$%02x", code[2]);
  524.         opbytes = 2;
  525.         break;
  526.  
  527.     case 0xdf:
  528.         printf("RST     3");
  529.         break;
  530.  
  531.     case 0xe0:
  532.         printf("RPO");
  533.         break;
  534.  
  535.     case 0xe1:
  536.         printf("POP     H");
  537.         break;
  538.  
  539.     case 0xe2:
  540.         printf("JPO     #$%02x", code[2]);
  541.         opbytes = 3;
  542.         break;
  543.  
  544.     case 0xe3:
  545.         printf("XTHL");
  546.         break;
  547.  
  548.     case 0xe4:
  549.         printf("CPO     #$%02x", code[2]);
  550.         opbytes = 3;
  551.         break;
  552.  
  553.     case 0xe5:
  554.         printf("PUSH        H");
  555.         break;
  556.  
  557.     case 0xe6:
  558.         printf("ANI     #$%02x", code[1]);
  559.         opbytes = 2;
  560.         break;
  561.  
  562.     case 0xe7:
  563.         printf("RST     4");
  564.         break;
  565.  
  566.     case 0xe8:
  567.         printf("RPE");
  568.         break;
  569.  
  570.     case 0xe9:
  571.         printf("PCHL");
  572.         break;
  573.  
  574.     case 0xea:
  575.         printf("JPE     #$%02x", code[2]);
  576.         opbytes = 3;
  577.         break;
  578.  
  579.     case 0xeb:
  580.         printf("XCHG");
  581.         break;
  582.  
  583.     case 0xec:
  584.         printf("CPE     #$%02x", code[2]);
  585.         opbytes = 3;
  586.         break;
  587.  
  588.     case 0xed:
  589.         printf("NOP");
  590.         break;
  591.  
  592.     case 0xee:
  593.         printf("XRI     #$%02x", code[1]);
  594.         opbytes = 2;
  595.         break;
  596.  
  597.     case 0xef:
  598.         printf("RST     5");
  599.         break;
  600.  
  601.     case 0xf0:
  602.         printf("RP");
  603.         break;
  604.  
  605.     case 0xf1:
  606.         printf("POP     PSW");
  607.         break;
  608.  
  609.     case 0xf2:
  610.         printf("JP      #$%02x", code[2]);
  611.         opbytes = 3;
  612.         break;
  613.  
  614.     case 0xf3:
  615.         printf("DI");
  616.         break;
  617.  
  618.     case 0xf4:
  619.         printf("CP      #$%02x", code[2]);
  620.         opbytes = 3;
  621.         break;
  622.  
  623.     case 0xf5:
  624.         printf("PUSH        PSW");
  625.         break;
  626.  
  627.     case 0xf6:
  628.         printf("ORI     #$%02x", code[1]);
  629.         break;
  630.  
  631.     case 0xf7:
  632.         printf("RST     6");
  633.         break;
  634.  
  635.     case 0xf8:
  636.         printf("RM");
  637.         break;
  638.  
  639.     case 0xf9:
  640.         printf("SPHL");
  641.         break;
  642.  
  643.     case 0xfa:
  644.         printf("JM      #$%02x", code[2]);
  645.         opbytes = 3;
  646.         break;
  647.  
  648.     case 0xfb:
  649.         printf("EI");
  650.         break;
  651.  
  652.     case 0xfc:
  653.         printf("CM      #$%02x", code[2]);
  654.         opbytes = 3;
  655.         break;
  656.  
  657.     case 0xfd:
  658.         printf("NOP");
  659.         break;
  660.  
  661.     case 0xfe:
  662.         printf("CPI     #$%02x", code[1]);
  663.         break;
  664.  
  665.     case 0xff:
  666.         printf("RST     7");
  667.         break;
  668.  
  669.     default:
  670.         printf("Nonexistent Opcode");
  671.         break;
  672.     }
  673.  
  674.     printf("\n");
  675.  
  676.     return opbytes;
  677. }
  678.  
  679. int main(int argc, char **argv)
  680. {
  681.  
  682.     FILE *f = fopen(argv[1], "rb");
  683.  
  684.     if (f == NULL)
  685.     {
  686.         printf("error: Couldn't open %s\n", argv[1]);
  687.         exit(1);
  688.     }
  689.  
  690.     //Get the file size and read it into a memory buffer
  691.     fseek(f, 0L, SEEK_END);
  692.     int fsize = ftell(f);
  693.     fseek(f, 0L, SEEK_SET);
  694.  
  695.     unsigned char *buffer = malloc(fsize);
  696.  
  697.     fread(buffer, fsize, 1, f);
  698.     fclose(f);
  699.  
  700.     int pc = 0;
  701.  
  702.     while (pc < fsize)
  703.     {
  704.         pc += Disassembler8080(buffer, pc);
  705.     }
  706.  
  707.     return 0;
  708. }
  709.  
Add Comment
Please, Sign In to add comment