home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 13 / AACD13.ISO / AACD / Games / WHDLoad / Src / gci / WHDLoadGCI.c < prev    next >
C/C++ Source or Header  |  2000-08-10  |  11KB  |  353 lines

  1. /*****************************************************************************
  2. ;  :Module.    WHDLoadGCI.c
  3. ;  :Author.    Bert Jahn
  4. ;  :EMail.    jah@fh-zwickau.de
  5. ;  :Address.    Franz-Liszt-Straße 16, Rudolstadt, 07404, Germany
  6. ;  :Version.    $Id: WHDLoadGCI.c 0.9 2000/06/04 20:55:21 jah Exp $
  7. ;  :History.    18.07.98 started
  8. ;        13.12.98 immediate terminate if dump loading fails
  9. ;        02.03.00 expmem stuff added
  10. ;             multiple memory windows
  11. ;  :Copyright.    All Rights Reserved
  12. ;  :Language.    C
  13. ;  :Translator.    GCC 2.90.27
  14. ****************************************************************************/
  15.  
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19.  
  20. #include <exec/memory.h>
  21. #include <libraries/mui.h>
  22.  
  23. #include <clib/alib_protos.h>
  24. #include <clib/exec_protos.h>
  25. #include <clib/gadtools_protos.h>
  26. #include <clib/muimaster_protos.h>
  27. #include <proto/muimaster.h>
  28.  
  29. #include "whddump.h"
  30. #include "WHDLoadGCI.h"
  31.  
  32. /****************************************************************************/
  33.  
  34. /****************************************************************************/
  35. /* defines                                                                    */
  36. /****************************************************************************/
  37.  
  38. /****************************************************************************/
  39. /* extern functions                                                            */
  40. /****************************************************************************/
  41.  
  42. void    make_win_info    (void);
  43. void    make_win_cpu    (void);
  44. void    make_win_cust    (void);
  45.  
  46. void    wmem_make    (int);
  47. void *    wmem_init    (void);
  48. void    wmem_finit    (void);
  49. void    wmem_goto    (int);
  50.  
  51. void    freedump    (void);
  52. BOOL    loaddump    (STRPTR name);
  53.  
  54. /****************************************************************************/
  55. /* static variables                                                            */
  56. /****************************************************************************/
  57.  
  58. extern struct Library *SysBase,*DOSBase;
  59. struct Library *IntuitionBase;
  60. struct Library *MUIMasterBase;
  61. struct Library *UtilityBase;
  62.  
  63. APTR app = NULL;        /* application */
  64. APTR win;            /* main window */
  65.  
  66. struct whddump_header    * header = NULL;
  67. char            * term = NULL;
  68. struct whddump_cpu    * cpu = NULL;
  69. struct whddump_custom    * custom = NULL;
  70. struct whddump_cia    * ciaa = NULL;
  71. struct whddump_cia    * ciab = NULL;
  72. APTR            * slave = NULL;
  73. APTR            * mem = NULL;
  74. APTR            * emem = NULL;
  75.  
  76. const char* StringHexAccept = "$0123456789abcdefABCDEF";
  77.  
  78. /****************************************************************************/
  79. /* function declarations                                                    */
  80. /****************************************************************************/
  81.  
  82. void    main2        (void);
  83.  
  84. /****************************************************************************/
  85.  
  86. struct NewMenu MenuData[] =
  87. {
  88.     MENUBASE
  89.     { NM_END,NULL,0,0,0,(APTR)0 },
  90. };
  91.  
  92. /****************************************************************************/
  93.  
  94. #ifdef _DCC
  95. int brkfunc(void) { return(0); }
  96. int wbmain(struct WBStartup *wb_startup) {
  97.     extern int main(int argc, char *argv[]);
  98.     return (main(0, (char **)wb_startup));
  99. }
  100. #endif
  101.  
  102. #ifdef __SASC
  103. int CXBRK(void) { return(0); }
  104. int _CXBRK(void) { return(0); }
  105. void chkabort(void) {}
  106. #endif
  107.  
  108. /****************************************************************************/
  109.  
  110. #define btst(i,n) ((i >> n) & 1)
  111.  
  112. char * dmacon_h (void) {
  113.     static char s[252];
  114.     int v = custom->wdcu_regs[0x002/2];
  115.     sprintf(s,MUIX_C MUIX_B "dmacon" MUIX_N MUIX_R "\nBlitter Busy = %d\n"
  116.     "Blitter Zero = %d\nBlitter Priority = %d\nDMA Enable = %d\n"
  117.     "Bitplane Enable = %d\nCopper Enable = %d\nBlitter Enable = %d\n"
  118.     "Sprite Enable = %d\nDisk Enable = %d\nAudio 3 Enable = %d\n"
  119.     "Audio 2 Enable = %d\nAudio 1 Enable = %d\nAudio 0 Enable = %d",
  120.     btst(v,14),btst(v,13),btst(v,10),btst(v,9),btst(v,8),btst(v,7),btst(v,6),
  121.     btst(v,5),btst(v,4),btst(v,3),btst(v,2),btst(v,1),btst(v,0) );
  122.     /*printf("%ld\n",strlen(s));*/
  123.     return s;
  124. }
  125.  
  126. char * int_h (int v, char *s, const char *name) {
  127.     sprintf(s,MUIX_C MUIX_B "int%s" MUIX_N MUIX_R "\nInterrupt Enable = %d\n"
  128.     "CIA-B, Expansion = %d\nDisk = %d\nSerial full = %d\n"
  129.     "Audio 3 = %d\nAudio 2 = %d\nAudio 1 = %d\nAudio 0 = %d\nBlitter = %d\n"
  130.     "Vertical Blank = %d\nCopper = %d\nCIA-A, Expansion = %d\nSoft = %d\n"
  131.     "Disk = %d\nSerial empty = %d",
  132.     name,btst(v,14),btst(v,13),btst(v,12),btst(v,11),btst(v,10),btst(v,9),
  133.     btst(v,8),btst(v,7),btst(v,6),btst(v,5),btst(v,4),btst(v,3),btst(v,2),
  134.     btst(v,1),btst(v,0) );
  135.     /*printf("%ld\n",strlen(s));*/
  136.     return s;
  137. }
  138. char * intena_h (void) {
  139.     static char s[228];
  140.     return int_h(custom->wdcu_regs[0x01c/2],s,"ena");
  141. }
  142. char * intreq_h (void) {
  143.     static char s[228];
  144.     return int_h(custom->wdcu_regs[0x01e/2],s,"req");
  145. }
  146.  
  147. char * sr_h (void) {
  148.     static char s[56];
  149.     int v = cpu->wdc_sr;
  150.     sprintf(s,"Status Register\nT=%d S=%d M=%d I=%d X=%d N=%d Z=%d V=%d C=%d",
  151.     (v>>14)&3,btst(v,13),btst(v,12),(v>>8)&7,btst(v,4),
  152.     btst(v,3),btst(v,2),btst(v,1),btst(v,0) );
  153.     /*printf("%ld\n",strlen(s));*/
  154.     return s;
  155. }
  156.  
  157. /****************************************************************************/
  158.  
  159. int main(int argc,char *argv[]) {
  160.  
  161.     IntuitionBase = OpenLibrary("intuition.library",39);
  162.     UtilityBase = OpenLibrary("utility.library",39);
  163.     MUIMasterBase = OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN);
  164.  
  165.     if ( IntuitionBase && UtilityBase && MUIMasterBase ) {
  166.         if (argc == 2) loaddump(argv[1]); else loaddump(NULL);
  167.         if (header) {
  168.  
  169.             if (wmem_init()) {
  170.     
  171.                 main2();
  172.  
  173.             
  174.                 wmem_finit();
  175.             }
  176.             freedump();
  177.         }
  178.     }
  179.  
  180.     CloseLibrary(MUIMasterBase);
  181.     exit(0);
  182. }
  183.  
  184. /****************************************************************************/
  185.  
  186. void main2() {
  187.  
  188.     APTR win1;
  189.     APTR
  190.         regd0,regd1,regd2,regd3,regd4,regd5,regd6,regd7,
  191.         rega0,rega1,rega2,rega3,rega4,rega5,rega6,
  192.         regsr,regssp,regusp,regpc,morecpu,
  193.         cudmacon,cuintena,cuintreq,morecust,
  194.         morecias,moremem,moreemem,moreslave,moreinfo,
  195.         a_quit,a_restart,a_cont;
  196.     ULONG signals;
  197.     BOOL running = TRUE;
  198.  
  199.     app = ApplicationObject,
  200.         MUIA_Application_Title,        "WHDLoad GCI",
  201.         MUIA_Application_Version,    "$VER: WHDLoad GCI 1.1 (" __DATE__ ")",
  202.         MUIA_Application_Copyright,    "©1998-2000 by Wepl",
  203.         MUIA_Application_Author,    "Wepl",
  204.         MUIA_Application_Description,    "WHDload Visualisation and Debugging.",
  205.         MUIA_Application_Base,        "WHDLoadGCI",
  206.         MUIA_Application_Menustrip,    MUI_MakeObject(MUIO_MenustripNM,MenuData,0),
  207.         MUIA_Application_Window,    win1 = WindowObject,
  208.             MUIA_Window_Title, "WHDLoad GCI",
  209.             MUIA_Window_ID   , MAKE_ID('M','A','I','N'),
  210.             WindowContents, VGroup,
  211.                 Child, HGroup,
  212.                     Child, HGroup, GroupFrameT("CPU"), MUIA_Group_Columns, 4, MUIA_Weight, 20,
  213.                         RegisterC(regd0,"D0:",NULL,cpu->wdc_regs[0],8),
  214.                         RegisterC(rega0,"A0:",NULL,cpu->wdc_regs[8],8),
  215.                         RegisterC(regd1,"D1:",NULL,cpu->wdc_regs[1],8),
  216.                         RegisterC(rega1,"A1:",NULL,cpu->wdc_regs[9],8),
  217.                         RegisterC(regd2,"D2:",NULL,cpu->wdc_regs[2],8),
  218.                         RegisterC(rega2,"A2:",NULL,cpu->wdc_regs[10],8),
  219.                         RegisterC(regd3,"D3:",NULL,cpu->wdc_regs[3],8),
  220.                         RegisterC(rega3,"A3:",NULL,cpu->wdc_regs[11],8),
  221.                         RegisterC(regd4,"D4:",NULL,cpu->wdc_regs[4],8),
  222.                         RegisterC(rega4,"A4:",NULL,cpu->wdc_regs[12],8),
  223.                         RegisterC(regd5,"D5:",NULL,cpu->wdc_regs[5],8),
  224.                         RegisterC(rega5,"A5:",NULL,cpu->wdc_regs[13],8),
  225.                         RegisterC(regd6,"D6:",NULL,cpu->wdc_regs[6],8),
  226.                         RegisterC(rega6,"A6:",NULL,cpu->wdc_regs[14],8),
  227.                         RegisterC(regd7,"D7:",NULL,cpu->wdc_regs[7],8),
  228.                         RegisterC(regusp,"USP:","User Stack Pointer",cpu->wdc_usp,8),
  229.                         RegisterC(regsr,"SR:",sr_h(),cpu->wdc_sr,4),
  230.                         RegisterC(regssp,"SSP:","Supervisor Stack Pointer",cpu->wdc_ssp,8),
  231.                         RegisterC(regpc,"PC:","Program Counter",cpu->wdc_pc,8),
  232.                         Child, Label2(""), Child, morecpu = SimpleButton("More"),
  233.                         End,
  234.                     Child, VGroup, MUIA_Weight, 10,
  235.                         Child, VGroup, GroupFrameT("Custom"),
  236.                             Child, HGroup, MUIA_Group_Columns, 2,
  237.                                 RegisterC(cudmacon,"dmacon:",dmacon_h(),custom->wdcu_regs[0x002/2],4),
  238.                                 RegisterC(cuintena,"intena:",intena_h(),custom->wdcu_regs[0x01c/2],4),
  239.                                 RegisterC(cuintreq,"intreq:",intreq_h(),custom->wdcu_regs[0x01e/2],4),
  240.                                 End,
  241.                             Child, morecust = SimpleButton("More"),
  242.                             End,
  243.                         Child, VGroup, GroupFrameT("Misc"),
  244.                             Child, morecias = SimpleButton("Cia's"),
  245.                             Child, moremem = SimpleButton("BaseMem"),
  246.                             ChildIf(emem), moreemem = SimpleButtonIf(emem,"ExpMem"),
  247.                             Child, moreslave = SimpleButton("Slave"),
  248.                             Child, moreinfo = SimpleButton("Info"),
  249.                             End,
  250.                         End,
  251.                     End,
  252.                 ChildIf(term), term ? TextObject, TextFrame,
  253.                     MUIA_Background, MUII_TextBack,
  254.                     MUIA_Text_Contents, term,
  255.                     End : NULL,
  256.                 Child, HGroup, GroupFrameT("Actions"), MUIA_Group_SameWidth, TRUE,
  257.                     Child, a_quit = SimpleButton("Quit"),
  258.                     Child, a_restart = SimpleButton("Restart"),
  259.                     Child, a_cont = SimpleButton("Continue"),
  260.                     End,
  261.                 End,
  262.             End,
  263.         End;
  264.  
  265.     if (app) {
  266.  
  267.     win = win1;
  268.  
  269.     DoMethod(win1,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
  270.  
  271.     DoMethod(morecpu,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MORECPU);
  272.     DoMethod(morecust,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MORECUST);
  273.     DoMethod(moremem,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MOREMEM);
  274.     DoMethod(moreemem,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MOREEMEM);
  275.     DoMethod(moreslave,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MORESLAVE);
  276.     DoMethod(moreinfo,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MOREINFO);
  277.  
  278.     DoMethod(a_quit,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
  279.  
  280.     set(win1,MUIA_Window_Open,TRUE);
  281.     
  282. /*
  283. ** Input loop...
  284. */
  285.  
  286.     while (running)
  287.     {
  288.         ULONG id = DoMethod(app,MUIM_Application_Input,&signals);
  289.  
  290.         switch (id)
  291.         {
  292.             case MEN_QUIT:
  293.             case MUIV_Application_ReturnID_Quit:
  294.                 running = FALSE;
  295.                 break;
  296.  
  297.             case MEN_ABOUT:
  298.                 MUI_Request(app,win1,0,NULL,"OK","\33cWHDLoad Graphical Coders Interface\n"
  299.                     "©1998-2000 Wepl\nAll Rights Reserved.");
  300.                 break;
  301.             case MEN_ABOUTMUI:
  302.                 DoMethod(app,MUIM_Application_AboutMUI,win);
  303.                 break;
  304.  
  305.             case MEN_GOTO0:
  306.             case MEN_GOTO1:
  307.             case MEN_GOTO2:
  308.             case MEN_GOTO3:
  309.             case MEN_GOTO4:
  310.             case MEN_GOTO5:
  311.             case MEN_GOTO6:
  312.             case MEN_GOTO7:
  313.             case MEN_GOTO8:
  314.             case MEN_GOTO9:
  315.                 wmem_goto( id - MEN_GOTO0 );
  316.                 break;
  317.  
  318.             case MAIN_MORECPU:
  319.                 make_win_cpu();
  320.                 break;
  321.             case MAIN_MORECUST:
  322.                 make_win_cust();
  323.                 break;
  324.             case MAIN_MOREMEM:
  325.                 wmem_make(0);
  326.                 break;
  327.             case MAIN_MOREEMEM:
  328.                 if (emem) {
  329.                     wmem_make(header->wdh_ExpMemLog);
  330.                 }
  331.                 break;
  332.             case MAIN_MORESLAVE:
  333.                 wmem_make(header->wdh_SlaveLog);
  334.                 break;
  335.             case MAIN_MOREINFO:
  336.                 make_win_info();
  337.                 break;
  338.         }
  339.         if (running && signals) Wait(signals);
  340.     }
  341.  
  342.     set(win1,MUIA_Window_Open,FALSE);
  343.  
  344. /*
  345. ** Shut down...
  346. */
  347.  
  348.     MUI_DisposeObject(app);
  349.  
  350.     }
  351. }
  352.  
  353.