home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 294.lha / copdis_v0.0a / copdis.c < prev    next >
C/C++ Source or Header  |  1989-10-08  |  15KB  |  405 lines

  1. /* copdis - standalone copper list disassembler
  2.  *
  3.  * by Karl Lehenbauer, April 1989
  4.  *
  5.  * This code is released to the public domain for any legal use.
  6.  *
  7.  * This is free software.  No warranties are expressed or implied.
  8.  *
  9.  *
  10.  * There should be a text file, copdis.doc, that describes the function
  11.  * of the program in greater detail.  If you don't have it, you've been
  12.  * ripped off!
  13.  *
  14.  * A quick summary: to disassemble a copper list, call copdis and pass it
  15.  * the address of the start of the copper list.  Note that this is not
  16.  * the address of the cprlst or CopList data structure, but the actual
  17.  * address of the first copper instruction.
  18.  *
  19.  * Some examples:
  20.  *
  21.  *  GfxBase's copinit list, this may not be right
  22.  *  copdis(GfxBase->copinit);    
  23.  *
  24.  *    Top Viewport's display instructions for the "long frame"
  25.  *  copdis(GfxBase->ActiView->ViewPort->DspIns->CopLStart);
  26.  *
  27.  *    Top Viewport's display instructions for the "short frame"
  28.  *  copdis(GfxBase->ActiView->ViewPort->DspIns->CopSStart);
  29.  *
  30.  *    Currently active LOF copper list
  31.  *  copdis(GfxBase->ActiView->LOFCprList->start);
  32.  *
  33.  *  Currently active SHF copper list:
  34.  *  copdis(GfxBase->ActiView->SHFCprList->start);
  35.  *
  36.  */
  37.  
  38. #include <functions.h>
  39. #include <stdio.h>
  40.  
  41. struct copregstruct
  42. {
  43.     char *regname;
  44.     char *longname;
  45.     short regid;
  46.     short flags;
  47. };
  48.  
  49. struct copinstruction 
  50. {
  51.     short ir1;
  52.     short ir2;
  53. };
  54.  
  55. #define COLOR 1
  56.  
  57. static struct copregstruct copregisters[] =
  58. {
  59.     {"bltddat","blitter destination early read (dummy address)",0,0},
  60.     {"dmaconr","DMA control (and blitter status) read",0x2,0},
  61.     {"vposr","read vert most signif. bit (and frame flop)",0x4,0},
  62.     {"vhposr","read vert and horiz. position of beam",0x6,0},
  63.     {"dskdatr","disk data early read (dummy address)",0x8,0},
  64.     {"joy0dat","joystick-mouse 0 data (vert,horiz)",0xa,0},
  65.     {"joy1dat","joystick-mouse 1 data (vert,horiz)",0xc,0},
  66.     {"clxdat","collision data (read and clear)",0xe,0},
  67.     {"adkconr","audio, disk control register read",0x10,0},
  68.     {"pot0dat","pot counter pair 0 data (vert,horiz)",0x12,0},
  69.     {"pot1dat","pot counter pair 1 data (vert,horiz)",0x14,0},
  70.     {"potgor","pot port data read",0x16,0},
  71.     {"serdatr","serial port data and status read",0x18,0},
  72.     {"dskbytr","disk data byte and status read",0x1a,0},
  73.     {"intenar","interrupt enable bits read",0x1c,0},
  74.     {"intreqr","interrupt request bits read",0x1e,0},
  75.  
  76.     {"dskpth","disk pointer (high 3 bits)",0x20,0},
  77.     {"dskptl","disk pointer (low 15 bits)",0x22,0},
  78.     {"dsklen","disk length",0x24,0},
  79.     {"dskdat","disk DMA data write",0x26,0},
  80.  
  81.     {"refptr","refresh pointer",0x28,0},
  82.     {"vposw","write vert most signif. bit (and frame flop)",0x2a,0},
  83.     {"vhposw","write vert and horiz position of beam",0x2c,0},
  84.     {"copcon","copper control register (CDANG)",0x2e,0},
  85.     {"serdat","serial port data and stop bits write",0x30,0},
  86.     {"serper","serial port period and control",0x32,0},
  87.     {"potgo","pot port data write and start",0x34,0},
  88.     {"joytest","write all four joystick-mouse counters",0x36,0},
  89.     {"strequ","strobe for horiz sync with vertical blank and EQU",0x38,0},
  90.     {"strvbl","strobe for horiz sync with vertical blank",0x3a,0},
  91.     {"strhor","strobe for horizontal sync",0x3c,0},
  92.     {"strlong","strobe for identification of long horiz. line",0x3e,0},
  93.  
  94.     {"bltcon0","blitter control register 0",0x40,0},
  95.     {"bltcon1","blitter control register 1",0x42,0},
  96.     {"bltafwm","blitter first word mask for source A",0x44,0},
  97.     {"bltalwm","blitter last word mask for source A",0x46,0},
  98.     {"bltcpth","blitter pointer to source C (high 3 bits)",0x48,0},
  99.     {"bltcptl","blitter pointer to source C (low 15 bits)",0x4a,0},
  100.     {"bltbpth","blitter pointer to source B (high 3 bits)",0x4c,0},
  101.     {"bltbptl","blitter pointer to source B (low 15 bits)",0x4e,0},
  102.     {"bltapth","blitter pointer to source A (high 3 bits)",0x50,0},
  103.     {"bltaptl","blitter pointer to source A (low 15 bits)",0x52,0},
  104.     {"bltdpth","blitter pointer to source D (high 3 bits)",0x54,0},
  105.     {"bltdptl","blitter pointer to source D (low 15 bits)",0x56,0},
  106.     {"bltsize","blitter start and size (window width, height)",0x58,0},
  107.     {"bltcmod","blitter modulo for source C",0x60,0},
  108.     {"bltbmod","blitter modulo for source B",0x62,0},
  109.     {"bltamod","blitter modulo for source A",0x64,0},
  110.     {"bltdmod","blitter modulo for source D",0x66,0},
  111.     {"bltcdat","blitter source C data",0x70,0},
  112.     {"bltbdat","blitter source B data",0x72,0},
  113.     {"bltadat","blitter source A data",0x74,0},
  114.  
  115.     {"dsksync","disk sync pattern for disk read",0x7e,0},
  116.  
  117.     {"cop1lch","copper first location (high 3 bits)",0x80,0},
  118.     {"cop1lcl","copper first location (low 15 bits)",0x82,0},
  119.     {"cop2lch","copper second location (high 3 bits)",0x84,0},
  120.     {"cop2lcl","copper second location (low 15 bits)",0x86,0},
  121.     {"copjmp1","restart copper at first location",0x88,0},
  122.     {"copjmp2","restart copper at second location",0x8a,0},
  123.     {"copins","copper instruction fetch identify",0x8c,0},
  124.     {"diwstrt","display window start (upper left vert-horiz position)",0x8e,0},
  125.     {"diwstop","display window stop (lower right vert-horiz position)",0x90,0},
  126.     {"ddfstrt","display bit plane data fetch start (horiz. position)",0x92,0},
  127.     {"ddfstop","display bit plane data fetch stop (horiz. position)",0x94,0},
  128.     {"dmacon","DMA control write (clear or set)",0x96,0},
  129.     {"clxcon","collision control",0x98,0},
  130.     {"intena","interrupt enable bits",0x9a,0},
  131.     {"intreq","interrupt request bits",0x9c,0},
  132.     {"adkcon","audio, disk, UART control",0x9e,0},
  133.  
  134.     {"aud0lch","audio channel 0 location (high 3 bits)",0xa0,0},
  135.     {"aud0lcl","audio channel 0 location (low 15 bits)",0xa2,0},
  136.     {"aud0len","audio channel 0 length",0xa4,0},
  137.     {"aud0per","audio channel 0 period",0xa6,0},
  138.     {"aud0vol","audio channel 0 volume",0xa8,0},
  139.     {"aud0dat","audio channel 0 data",0xaa,0},
  140.  
  141.     {"aud1lch","audio channel 1 location (high 3 bits)",0xb0,0},
  142.     {"aud1lcl","audio channel 1 location (low 15 bits)",0xb2,0},
  143.     {"aud1len","audio channel 1 length",0xb4,0},
  144.     {"aud1per","audio channel 1 period",0xb6,0},
  145.     {"aud1vol","audio channel 1 volume",0xb8,0},
  146.     {"aud1dat","audio channel 1 data",0xba,0},
  147.  
  148.     {"aud2lch","audio channel 2 location (high 3 bits)",0xc0,0},
  149.     {"aud2lcl","audio channel 2 location (low 15 bits)",0xc2,0},
  150.     {"aud2len","audio channel 2 length",0xc4,0},
  151.     {"aud2per","audio channel 2 period",0xc6,0},
  152.     {"aud2vol","audio channel 2 volume",0xc8,0},
  153.     {"aud2dat","audio channel 2 data",0xca,0},
  154.  
  155.     {"aud3lch","audio channel 3 location (high 3 bits)",0xd0,0},
  156.     {"aud3lcl","audio channel 3 location (low 15 bits)",0xd2,0},
  157.     {"aud3len","audio channel 3 length",0xd4,0},
  158.     {"aud3per","audio channel 3 period",0xd6,0},
  159.     {"aud3vol","audio channel 3 volume",0xd8,0},
  160.     {"aud3dat","audio channel 3 data",0xda,0},
  161.  
  162.     {"bpl1pth","blitter plane 1 pointer (high 3 bits)",0xe0,0},
  163.     {"bpl1ptl","blitter plane 1 pointer (low 15 bits)",0xe2,0},
  164.     {"bpl2pth","blitter plane 2 pointer (high 3 bits)",0xe4,0},
  165.     {"bpl2ptl","blitter plane 2 pointer (low 15 bits)",0xe6,0},
  166.     {"bpl3pth","blitter plane 3 pointer (high 3 bits)",0xe8,0},
  167.     {"bpl3ptl","blitter plane 3 pointer (low 15 bits)",0xea,0},
  168.     {"bpl4pth","blitter plane 4 pointer (high 3 bits)",0xec,0},
  169.     {"bpl4ptl","blitter plane 4 pointer (low 15 bits)",0xee,0},
  170.     {"bpl5pth","blitter plane 5 pointer (high 3 bits)",0xf0,0},
  171.     {"bpl5ptl","blitter plane 5 pointer (low 15 bits)",0xf2,0},
  172.     {"bpl6pth","blitter plane 6 pointer (high 3 bits)",0xf4,0},
  173.     {"bpl6ptl","blitter plane 6 pointer (low 15 bits)",0xf6,0},
  174.  
  175.     {"bplcon0","bit plane control bits",0x100,0},
  176.     {"bplcon1","bit plane scroll values for PF1 & PF2",0x102,0},
  177.     {"bplcon2","bit plane priority control",0x104,0},
  178.  
  179.     {"bpl1mod","bit plane modulo for odd planes",0x108,0},
  180.     {"bpl2mod","bit plane modulo for even planes",0x10a,0},
  181.  
  182.     {"bpl1dat","bit plane 1 data (parallel-to-serial convert)",0x110,0},
  183.     {"bpl2dat","bit plane 2 data (parallel-to-serial convert)",0x112,0},
  184.     {"bpl3dat","bit plane 3 data (parallel-to-serial convert)",0x114,0},
  185.     {"bpl4dat","bit plane 4 data (parallel-to-serial convert)",0x116,0},
  186.     {"bpl5dat","bit plane 5 data (parallel-to-serial convert)",0x118,0},
  187.     {"bpl6dat","bit plane 6 data (parallel-to-serial convert)",0x11a,0},
  188.  
  189.     {"spr0pth","sprite 0 pointer (high 3 bits)",0x120,0},
  190.     {"spr0ptl","sprite 0 pointer (low 15 bits)",0x122,0},
  191.     {"spr1pth","sprite 1 pointer (high 3 bits)",0x124,0},
  192.     {"spr1ptl","sprite 1 pointer (low 15 bits)",0x126,0},
  193.     {"spr2pth","sprite 2 pointer (high 3 bits)",0x128,0},
  194.     {"spr2ptl","sprite 2 pointer (low 15 bits)",0x12a,0},
  195.     {"spr3pth","sprite 3 pointer (high 3 bits)",0x12c,0},
  196.     {"spr3ptl","sprite 3 pointer (low 15 bits)",0x12e,0},
  197.     {"spr4pth","sprite 4 pointer (high 3 bits)",0x130,0},
  198.     {"spr4ptl","sprite 4 pointer (low 15 bits)",0x132,0},
  199.     {"spr5pth","sprite 5 pointer (high 3 bits)",0x134,0},
  200.     {"spr5ptl","sprite 5 pointer (low 15 bits)",0x136,0},
  201.     {"spr6pth","sprite 6 pointer (high 3 bits)",0x138,0},
  202.     {"spr6ptl","sprite 6 pointer (low 15 bits)",0x13a,0},
  203.     {"spr7pth","sprite 7 pointer (high 3 bits)",0x13c,0},
  204.     {"spr7ptl","sprite 7 pointer (low 15 bits)",0x13e,0},
  205.  
  206.     {"spr0pos","sprite 0 vert-horiz start position",0x140,0},
  207.     {"spr0ctl","sprite 0 vert stop position and control data",0x142,0},
  208.     {"spr0data","sprite 0 image data register A",0x144,0},
  209.     {"spr0datb","sprite 0 image data register B",0x146,0},
  210.     {"spr1pos","sprite 1 vert-horiz start position",0x148,0},
  211.     {"spr1ctl","sprite 1 vert stop position and control data",0x14a,0},
  212.     {"spr1data","sprite 1 image data register A",0x14c,0},
  213.     {"spr1datb","sprite 1 image data register B",0x14e,0},
  214.     {"spr2pos","sprite 2 vert-horiz start position",0x150,0},
  215.     {"spr2ctl","sprite 2 vert stop position and control data",0x152,0},
  216.     {"spr2data","sprite 2 image data register A",0x154,0},
  217.     {"spr2datb","sprite 2 image data register B",0x156,0},
  218.     {"spr3pos","sprite 3 vert-horiz start position",0x158,0},
  219.     {"spr3ctl","sprite 3 vert stop position and control data",0x15a,0},
  220.     {"spr3data","sprite 3 image data register A",0x15c,0},
  221.     {"spr3datb","sprite 3 image data register B",0x15e,0},
  222.     {"spr4pos","sprite 4 vert-horiz start position",0x160,0},
  223.     {"spr4ctl","sprite 4 vert stop position and control data",0x162,0},
  224.     {"spr4data","sprite 4 image data register A",0x164,0},
  225.     {"spr4datb","sprite 4 image data register B",0x166,0},
  226.     {"spr5pos","sprite 5 vert-horiz start position",0x168,0},
  227.     {"spr5ctl","sprite 5 vert stop position and control data",0x16a,0},
  228.     {"spr5data","sprite 5 image data register A",0x16c,0},
  229.     {"spr5datb","sprite 5 image data register B",0x16e,0},
  230.     {"spr6pos","sprite 6 vert-horiz start position",0x170,0},
  231.     {"spr6ctl","sprite 6 vert stop position and control data",0x172,0},
  232.     {"spr6data","sprite 6 image data register A",0x174,0},
  233.     {"spr6datb","sprite 6 image data register B",0x176,0},
  234.     {"spr7pos","sprite 7 vert-horiz start position",0x178,0},
  235.     {"spr7ctl","sprite 7 vert stop position and control data",0x17a,0},
  236.     {"spr7data","sprite 7 image data register A",0x17c,0},
  237.     {"spr7datb","sprite 7 image data register B",0x17e,0},
  238.  
  239.     {"color0","",0x180,COLOR},
  240.     {"color1","",0x182,COLOR},
  241.     {"color2","",0x184,COLOR},
  242.     {"color3","",0x186,COLOR},
  243.     {"color4","",0x188,COLOR},
  244.     {"color5","",0x18a,COLOR},
  245.     {"color6","",0x18c,COLOR},
  246.     {"color7","",0x18e,COLOR},
  247.     {"color8","",0x190,COLOR},
  248.     {"color9","",0x192,COLOR},
  249.     {"color10","",0x194,COLOR},
  250.     {"color11","",0x196,COLOR},
  251.     {"color12","",0x198,COLOR},
  252.     {"color13","",0x19a,COLOR},
  253.     {"color14","",0x19c,COLOR},
  254.     {"color15","",0x19e,COLOR},
  255.     {"color16","",0x1a0,COLOR},
  256.     {"color17","",0x1a2,COLOR},
  257.     {"color18","",0x1a4,COLOR},
  258.     {"color19","",0x1a6,COLOR},
  259.     {"color20","",0x1a8,COLOR},
  260.     {"color21","",0x1aa,COLOR},
  261.     {"color22","",0x1ac,COLOR},
  262.     {"color23","",0x1ae,COLOR},
  263.     {"color24","",0x1b0,COLOR},
  264.     {"color25","",0x1b2,COLOR},
  265.     {"color26","",0x1b4,COLOR},
  266.     {"color27","",0x1b6,COLOR},
  267.     {"color28","",0x1b8,COLOR},
  268.     {"color29","",0x1ba,COLOR},
  269.     {"color30","",0x1bc,COLOR},
  270.     {"color31","",0x1be,COLOR},
  271.     {"","",-1,0}
  272. };
  273.  
  274. struct copregstruct *find_copper_register_info(reg)
  275. int reg;
  276. {
  277.     struct copregstruct *regp;
  278.  
  279.     for (regp = &copregisters[0]; regp->regid != -1; regp++)
  280.     {
  281.         if (regp->regid == reg)
  282.             return(regp);
  283.     }
  284.     return(0);
  285. }
  286.  
  287. disassemble_copper_instruction(ip)
  288. struct copinstruction *ip;
  289. {
  290.     short vp, hp, ve, he, bfd;
  291.     int registerid;
  292.     struct copregstruct *regp;
  293.     char *regtext, *longtext;
  294.  
  295.     /* printf("instruction %x, %x\n",ip->ir1,ip->ir2); */
  296.  
  297.  
  298.     /* true if it's a branch or skip instruction */
  299.     if (ip->ir1 & 1)
  300.     {
  301.         /* branch or skip instruction */
  302.  
  303.         /* calculate vertical and horizontal position */
  304.         vp = (ip->ir1 >> 8) & 0xff;
  305.         hp = (ip->ir1 >> 1) & 0x7f;
  306.  
  307.         /* calculate vertical and horizontal position compare bits
  308.          * and blitter-finished-disable bit */
  309.         ve = (ip->ir2 >> 8) & 0x7f;
  310.         he = (ip->ir2 >> 1) & 0x7f;
  311.         bfd = (ip->ir2 & 0x8000);
  312.  
  313.         /* print the instruction type, check bit 0 of second word */
  314.         if (ip->ir2 & 1)
  315.         {
  316.             /* it's a skip */
  317.             printf("\tskip");
  318.         }
  319.         else
  320.         {
  321.             /* it's a wait */
  322.             printf("\twait");
  323.         }
  324.  
  325.         /* reverse sense of blitter finish wait disable to show blitter 
  326.          * finish wait -- that way we occasionally say "blitter" instead
  327.          * of almost always saying "no blitter"
  328.          */
  329.         if (!bfd)
  330.             printf("\tbf,");
  331.         else
  332.             printf("\t");
  333.  
  334.         /* print vertical and horizontal position */
  335.         printf("vpos=%d,hpos=%d",vp,hp);
  336.     printf("instruction %x, %x\n",ip->ir1,ip->ir2);
  337.  
  338.         /* if enable masks are not basically "all", print them */
  339.         if ((ve != 0x7f) || (he != 0x7f))
  340.         {
  341.             printf(",vcomp=%d,hcomp=%d\n",ve,he);
  342.         }
  343.     }
  344.     else
  345.     {
  346.         /* it's a move instruction */
  347.  
  348.         /* calculate register ID and look it up */
  349.         registerid = ip->ir1 & 0x1ff;
  350.         regp = find_copper_register_info(registerid);
  351.  
  352.         /* if we found the register in our table, print the text
  353.          * else whine about something we don't understand */
  354.         if (regp)
  355.         {
  356.             regtext = regp->regname;
  357.             longtext = regp->longname;
  358.         }
  359.         else
  360.         {
  361.             regtext = "UNKNOWN_OPCODE";
  362.             longtext = "";
  363.         }
  364.         printf("\tmove\t%x,%s",ip->ir2,regtext);
  365.  
  366.         if (*longtext != '\0')
  367.             printf("\t;%s",longtext);
  368.     }
  369.     printf("\n");
  370. }
  371.  
  372. /* have a go at disassembling a copper list */
  373. copdis(coplist)
  374. struct copinstruction *coplist;
  375. {
  376.  
  377.     /* check and refuse null list pointers */
  378.     if (coplist == (struct copinstruction *)NULL)
  379.     {
  380.         fprintf(stderr,"copdis: copper list pointer is null\n");
  381.         return;
  382.     }
  383.  
  384.     /* while we don't have an instruction of 0xffff 0xfffe, which is
  385.      * a de facto END PROGRAM instruction, print instructions.
  386.      *
  387.      * Use of do-while is in order that the END instruction is also
  388.      * disassembled.
  389.      *
  390.      * This should really have a sanity check (like no more than a few
  391.      * hundred instructions, and/or a length -- heck, it's in the cprlst
  392.      * and CopList structures anyway), but it doesn't, or at least not
  393.      * yet
  394.      */
  395.     do
  396.     {
  397.         disassemble_copper_instruction(coplist++);
  398.     }
  399.     while ((coplist->ir1 != 0xffff) && (coplist->ir2 != 0xfffe));
  400.  
  401.     /* and disassemble the WAIT 255 instruction */
  402.     disassemble_copper_instruction(coplist);
  403. }
  404.  
  405.