--- hatari/src/debug/debugInfo.c 2019/04/09 08:48:37 1.1 +++ hatari/src/debug/debugInfo.c 2019/04/09 08:49:26 1.1.1.2 @@ -19,10 +19,14 @@ const char DebugInfo_fileid[] = "Hatari #include "debugui.h" #include "dsp.h" #include "evaluate.h" +#include "file.h" +#include "gemdos.h" #include "ioMem.h" #include "m68000.h" #include "stMemory.h" #include "tos.h" +#include "screen.h" +#include "vdi.h" #include "video.h" @@ -45,6 +49,7 @@ const char DebugInfo_fileid[] = "Hatari #define COUNTRY_SPAIN 4 + /** * DebugInfo_GetSysbase: set osversion to given argument. * return sysbase address on success and zero on failure. @@ -94,6 +99,51 @@ static Uint32 DebugInfo_CurrentBasepage( return 0; } + +/** + * GetSegmentAddress: return segment address at given offset in + * TOS process basepage or zero if that is missing/invalid. + */ +static Uint32 GetSegmentAddress(unsigned offset) +{ + Uint32 basepage = DebugInfo_CurrentBasepage(); + if (!basepage) { + return 0; + } + if (!STMemory_ValidArea(basepage, BASEPAGE_SIZE) || + STMemory_ReadLong(basepage) != basepage) { + fprintf(stderr, "Basepage address 0x%06x is invalid!\n", basepage); + return 0; + } + return STMemory_ReadLong(basepage+offset); +} + +/** + * DebugInfo_GetTEXT: return current program TEXT segment address + * or zero if basepage missing/invalid. For virtual debugger variable. + */ +Uint32 DebugInfo_GetTEXT(void) +{ + return GetSegmentAddress(0x08); +} +/** + * DebugInfo_GetDATA: return current program DATA segment address + * or zero if basepage missing/invalid. For virtual debugger variable. + */ +Uint32 DebugInfo_GetDATA(void) +{ + return GetSegmentAddress(0x010); +} +/** + * DebugInfo_GetBSS: return current program BSS segment address + * or zero if basepage missing/invalid. For virtual debugger variable. + */ +Uint32 DebugInfo_GetBSS(void) +{ + return GetSegmentAddress(0x18); +} + + /** * DebugInfo_Basepage: show TOS process basepage information * at given address. @@ -154,12 +204,18 @@ static void DebugInfo_Basepage(Uint32 ba static void DebugInfo_OSHeader(Uint32 dummy) { Uint32 sysbase, gemblock, basepage; - Uint16 osversion, osconf; + Uint16 osversion, osconf, langbits; + const char *lang; + static const char langs[][3] = { + "us", "de", "fr", "uk", "es", "it", "se", "ch" /* fr */, "ch" /* de */, + "tr", "fi", "no", "dk", "sa", "nl", "cs", "hu" + }; sysbase = DebugInfo_GetSysbase(&osversion); if (!sysbase) { return; } + fprintf(stderr, "TOS OS header information:\n"); fprintf(stderr, "OS base addr : 0x%06x\n", sysbase); fprintf(stderr, "OS RAM end+1 : 0x%06x\n", STMemory_ReadLong(sysbase+0x0C)); fprintf(stderr, "TOS version : 0x%x\n", osversion); @@ -183,15 +239,23 @@ static void DebugInfo_OSHeader(Uint32 du fprintf(stderr, "OS DOS date : 0x%x\n", STMemory_ReadLong(sysbase+0x1E)); osconf = STMemory_ReadWord(sysbase+0x1C); - fprintf(stderr, "OS Conf bits : lang=%d, %s\n", osconf>>1, osconf&1 ? "PAL":"NTSC"); - fprintf(stderr, "Cookie Jar : 0x%06x\n", STMemory_ReadLong(COOKIE_JAR)); + langbits = osconf >> 1; + if (langbits == 127) { + lang = "all"; + } else if (langbits < ARRAYSIZE(langs)) { + lang = langs[langbits]; + } else { + lang = "unknown"; + } + fprintf(stderr, "OS Conf bits : 0x%04x (%s, %s)\n", osconf, lang, osconf&1 ? "PAL":"NTSC"); - /* last 3 OS header fields are only available as of TOS 1.02 */ if (osversion >= 0x0102) { + /* last 3 OS header fields are only available as of TOS 1.02 */ fprintf(stderr, "Memory pool : 0x%06x\n", STMemory_ReadLong(sysbase+0x20)); fprintf(stderr, "Kbshift addr : 0x%06x\n", STMemory_ReadLong(sysbase+0x24)); } else { - /* TODO: GEMDOS memory pool address for TOS 1.0? */ + /* TOS 1.0 */ + fprintf(stderr, "Memory pool : 0x0056FA\n"); fprintf(stderr, "Kbshift addr : 0x000E1B\n"); } basepage = DebugInfo_CurrentBasepage(); @@ -201,6 +265,62 @@ static void DebugInfo_OSHeader(Uint32 du } +/** + * DebugInfo_Cookiejar: display TOS Cookiejar content + */ +static void DebugInfo_Cookiejar(Uint32 dummy) +{ + int items; + + Uint32 jar = STMemory_ReadLong(COOKIE_JAR); + if (!jar) { + fprintf(stderr, "Cookiejar is empty.\n"); + return; + } + + fprintf(stderr, "Cookiejar contents:\n"); + items = 0; + while (STMemory_ValidArea(jar, 8) && STMemory_ReadLong(jar)) { + fprintf(stderr, "%c%c%c%c = 0x%08x\n", + STRam[jar], STRam[jar+1], STRam[jar+2], STRam[jar+3], + STMemory_ReadLong(jar+4)); + jar += 8; + items++; + } + fprintf(stderr, "%d items at 0x%06x.\n", items, STMemory_ReadLong(COOKIE_JAR)); +} + + +/** + * DebugInfo_Video: display video related information + */ +static void DebugInfo_Video(Uint32 dummy) +{ + const char *mode; + switch (OverscanMode) { + case OVERSCANMODE_NONE: + mode = "none"; + break; + case OVERSCANMODE_TOP: + mode = "top"; + break; + case OVERSCANMODE_BOTTOM: + mode = "bottom"; + break; + case OVERSCANMODE_TOP|OVERSCANMODE_BOTTOM: + mode = "top+bottom"; + break; + default: + mode = "unknown"; + } + fprintf(stderr, "Video base : 0x%x\n", VideoBase); + fprintf(stderr, "VBL counter : %d\n", nVBLs); + fprintf(stderr, "HBL line : %d\n", nHBL); + fprintf(stderr, "V-overscan : %s\n", mode); + fprintf(stderr, "Refresh rate : %d Hz\n", nScreenRefreshRate); + fprintf(stderr, "Frame skips : %d\n", nFrameSkips); +} + /* ------------------------------------------------------------------ * Falcon HW information */ @@ -215,34 +335,48 @@ static void DebugInfo_Videl(Uint32 dummy return; } - fprintf(stderr, "$FF8006 : monitor type : %02x\n", IoMem_ReadByte(0xff8006)); - fprintf(stderr, "$FF820E : offset to next line : %04x\n", IoMem_ReadWord(0xff820e)); - fprintf(stderr, "$FF8210 : VWRAP - line width : %04x\n", IoMem_ReadWord(0xff8210)); - fprintf(stderr, "$FF8260 : ST shift mode : %02x\n", IoMem_ReadByte(0xff8260)); - fprintf(stderr, "$FF8265 : Horizontal scroll register : %02x\n", IoMem_ReadByte(0xff8265)); - fprintf(stderr, "$FF8266 : Falcon shift mode : %04x\n", IoMem_ReadWord(0xff8266)); + fprintf(stderr, "$FF8006.b : monitor type : %02x\n", IoMem_ReadByte(0xff8006)); + fprintf(stderr, "$FF8201.b : Video Base Hi : %02x\n", IoMem_ReadByte(0xff8201)); + fprintf(stderr, "$FF8203.b : Video Base Mi : %02x\n", IoMem_ReadByte(0xff8203)); + fprintf(stderr, "$FF8205.b : Video Count Hi : %02x\n", IoMem_ReadByte(0xff8205)); + fprintf(stderr, "$FF8207.b : Video Count Mi : %02x\n", IoMem_ReadByte(0xff8207)); + fprintf(stderr, "$FF8209.b : Video Count Lo : %02x\n", IoMem_ReadByte(0xff8209)); + fprintf(stderr, "$FF820A.b : Sync mode : %02x\n", IoMem_ReadByte(0xff820a)); + fprintf(stderr, "$FF820D.b : Video Base Lo : %02x\n", IoMem_ReadByte(0xff820d)); + fprintf(stderr, "$FF820E.w : offset to next line : %04x\n", IoMem_ReadWord(0xff820e)); + fprintf(stderr, "$FF8210.w : VWRAP - line width : %04x\n", IoMem_ReadWord(0xff8210)); + fprintf(stderr, "$FF8260.b : ST shift mode : %02x\n", IoMem_ReadByte(0xff8260)); + fprintf(stderr, "$FF8264.w : Horizontal scroll register : %04x\n", IoMem_ReadWord(0xff8264)); + fprintf(stderr, "$FF8266.w : Falcon shift mode : %04x\n", IoMem_ReadWord(0xff8266)); fprintf(stderr, "\n"); - fprintf(stderr, "$FF8280 : HHC - Horizontal Hold Counter : %04x\n", IoMem_ReadWord(0xff8280)); - fprintf(stderr, "$FF8282 : HHT - Horizontal Hold Timer : %04x\n", IoMem_ReadWord(0xff8282)); - fprintf(stderr, "$FF8284 : HBB - Horizontal Border Begin : %04x\n", IoMem_ReadWord(0xff8284)); - fprintf(stderr, "$FF8286 : HBE - Horizontal Border End : %04x\n", IoMem_ReadWord(0xff8286)); - fprintf(stderr, "$FF8288 : HDB - Horizontal Display Begin : %04x\n", IoMem_ReadWord(0xff8288)); - fprintf(stderr, "$FF828A : HDE - Horizontal Display End : %04x\n", IoMem_ReadWord(0xff828a)); - fprintf(stderr, "$FF828C : HSS - Horizontal SS : %04x\n", IoMem_ReadWord(0xff828c)); - fprintf(stderr, "$FF828E : HFS - Horizontal FS : %04x\n", IoMem_ReadWord(0xff828e)); - fprintf(stderr, "$FF8290 : HEE - Horizontal EE : %04x\n", IoMem_ReadWord(0xff8290)); + fprintf(stderr, "$FF8280.w : HHC - Horizontal Hold Counter : %04x\n", IoMem_ReadWord(0xff8280)); + fprintf(stderr, "$FF8282.w : HHT - Horizontal Hold Timer : %04x\n", IoMem_ReadWord(0xff8282)); + fprintf(stderr, "$FF8284.w : HBB - Horizontal Border Begin : %04x\n", IoMem_ReadWord(0xff8284)); + fprintf(stderr, "$FF8286.w : HBE - Horizontal Border End : %04x\n", IoMem_ReadWord(0xff8286)); + fprintf(stderr, "$FF8288.w : HDB - Horizontal Display Begin : %04x\n", IoMem_ReadWord(0xff8288)); + fprintf(stderr, "$FF828A.w : HDE - Horizontal Display End : %04x\n", IoMem_ReadWord(0xff828a)); + fprintf(stderr, "$FF828C.w : HSS - Horizontal SS : %04x\n", IoMem_ReadWord(0xff828c)); + fprintf(stderr, "$FF828E.w : HFS - Horizontal FS : %04x\n", IoMem_ReadWord(0xff828e)); + fprintf(stderr, "$FF8290.w : HEE - Horizontal EE : %04x\n", IoMem_ReadWord(0xff8290)); fprintf(stderr, "\n"); - fprintf(stderr, "$FF82A0 : VFC - Vertical Frequency Counter : %04x\n", IoMem_ReadWord(0xff82a0)); - fprintf(stderr, "$FF82A2 : VFT - Vertical Frequency Timer : %04x\n", IoMem_ReadWord(0xff82a2)); - fprintf(stderr, "$FF82A4 : VBB - Vertical Border Begin : %04x\n", IoMem_ReadWord(0xff82a4)); - fprintf(stderr, "$FF82A6 : VBE - Vertical Border End : %04x\n", IoMem_ReadWord(0xff82a6)); - fprintf(stderr, "$FF82A8 : VDB - Vertical Display Begin : %04x\n", IoMem_ReadWord(0xff82a8)); - fprintf(stderr, "$FF82AA : VDE - Vertical Display End : %04x\n", IoMem_ReadWord(0xff82aa)); - fprintf(stderr, "$FF82AC : VSS - Vertical SS : %04x\n", IoMem_ReadWord(0xff82ac)); - fprintf(stderr, "\n"); - fprintf(stderr, "$FF82C0 : VCO - Video control : %04x\n", IoMem_ReadWord(0xff82c0)); - fprintf(stderr, "$FF82C2 : VMD - Video mode : %04x\n", IoMem_ReadWord(0xff82c2)); + fprintf(stderr, "$FF82A0.w : VFC - Vertical Frequency Counter : %04x\n", IoMem_ReadWord(0xff82a0)); + fprintf(stderr, "$FF82A2.w : VFT - Vertical Frequency Timer : %04x\n", IoMem_ReadWord(0xff82a2)); + fprintf(stderr, "$FF82A4.w : VBB - Vertical Border Begin : %04x\n", IoMem_ReadWord(0xff82a4)); + fprintf(stderr, "$FF82A6.w : VBE - Vertical Border End : %04x\n", IoMem_ReadWord(0xff82a6)); + fprintf(stderr, "$FF82A8.w : VDB - Vertical Display Begin : %04x\n", IoMem_ReadWord(0xff82a8)); + fprintf(stderr, "$FF82AA.w : VDE - Vertical Display End : %04x\n", IoMem_ReadWord(0xff82aa)); + fprintf(stderr, "$FF82AC.w : VSS - Vertical SS : %04x\n", IoMem_ReadWord(0xff82ac)); fprintf(stderr, "\n"); + fprintf(stderr, "$FF82C0.w : VCO - Video control : %04x\n", IoMem_ReadWord(0xff82c0)); + fprintf(stderr, "$FF82C2.w : VMD - Video mode : %04x\n", IoMem_ReadWord(0xff82c2)); + fprintf(stderr, "\n-------------------------\n"); + + fprintf(stderr, "Video base : %08x\n", (IoMem_ReadByte(0xff8201)<<16) + + (IoMem_ReadByte(0xff8203)<<8) + + IoMem_ReadByte(0xff820d)); + fprintf(stderr, "Video count : %08x\n", (IoMem_ReadByte(0xff8205)<<16) + + (IoMem_ReadByte(0xff8207)<<8) + + IoMem_ReadByte(0xff8209)); } /** @@ -252,124 +386,152 @@ static void DebugInfo_Crossbar(Uint32 du { char matrixDMA[5], matrixDAC[5], matrixDSP[5], matrixEXT[5]; char frqDMA[11], frqDAC[11], frqDSP[11], frqEXT[11]; + char frqSTE[30], frq25Mhz[30], frq32Mhz[30]; char dataSize[15]; + static const Uint32 Ste_SampleRates[4] = { + 6258, 12517, 25033, 50066 + }; + + static const Uint32 Falcon_SampleRates_25Mhz[15] = { + 49170, 32780, 24585, 19668, 16390, 14049, 12292, 10927, 9834, 8940, 8195, 7565, 7024, 6556, 6146 + }; + + static const Uint32 Falcon_SampleRates_32Mhz[15] = { + 62500, 41666, 31250, 25000, 20833, 17857, 15624, 13889, 12500, 11363, 10416, 9615, 8928, 8333, 7812 + }; + if (ConfigureParams.System.nMachineType != MACHINE_FALCON) { fprintf(stderr, "Not Falcon - no Crossbar!\n"); return; } - fprintf(stderr, "$FF8900 : Sound DMA control : %02x\n", IoMem_ReadByte(0xff8900)); - fprintf(stderr, "$FF8901 : Sound DMA control : %02x\n", IoMem_ReadByte(0xff8901)); - fprintf(stderr, "$FF8903 : Frame Start High : %02x\n", IoMem_ReadByte(0xff8903)); - fprintf(stderr, "$FF8905 : Frame Start middle : %02x\n", IoMem_ReadByte(0xff8905)); - fprintf(stderr, "$FF8907 : Frame Start low : %02x\n", IoMem_ReadByte(0xff8907)); - fprintf(stderr, "$FF8909 : Frame Count High : %02x\n", IoMem_ReadByte(0xff8909)); - fprintf(stderr, "$FF890B : Frame Count middle : %02x\n", IoMem_ReadByte(0xff890b)); - fprintf(stderr, "$FF890D : Frame Count low : %02x\n", IoMem_ReadByte(0xff890d)); - fprintf(stderr, "$FF890f : Frame End High : %02x\n", IoMem_ReadByte(0xff890f)); - fprintf(stderr, "$FF8911 : Frame End middle : %02x\n", IoMem_ReadByte(0xff8911)); - fprintf(stderr, "$FF8913 : Frame End low : %02x\n", IoMem_ReadByte(0xff8913)); + fprintf(stderr, "$FF8900.b : Sound DMA control : %02x\n", IoMem_ReadByte(0xff8900)); + fprintf(stderr, "$FF8901.b : Sound DMA control : %02x\n", IoMem_ReadByte(0xff8901)); + fprintf(stderr, "$FF8903.b : Frame Start High : %02x\n", IoMem_ReadByte(0xff8903)); + fprintf(stderr, "$FF8905.b : Frame Start middle : %02x\n", IoMem_ReadByte(0xff8905)); + fprintf(stderr, "$FF8907.b : Frame Start low : %02x\n", IoMem_ReadByte(0xff8907)); + fprintf(stderr, "$FF8909.b : Frame Count High : %02x\n", IoMem_ReadByte(0xff8909)); + fprintf(stderr, "$FF890B.b : Frame Count middle : %02x\n", IoMem_ReadByte(0xff890b)); + fprintf(stderr, "$FF890D.b : Frame Count low : %02x\n", IoMem_ReadByte(0xff890d)); + fprintf(stderr, "$FF890F.b : Frame End High : %02x\n", IoMem_ReadByte(0xff890f)); + fprintf(stderr, "$FF8911.b : Frame End middle : %02x\n", IoMem_ReadByte(0xff8911)); + fprintf(stderr, "$FF8913.b : Frame End low : %02x\n", IoMem_ReadByte(0xff8913)); fprintf(stderr, "\n"); - fprintf(stderr, "$FF8920 : Sound Mode Control : %02x\n", IoMem_ReadByte(0xff8920)); - fprintf(stderr, "$FF8921 : Sound Mode Control : %02x\n", IoMem_ReadByte(0xff8921)); - fprintf(stderr, "$FF8930 : DMA Crossbar Input Select Controller : %04x\n", IoMem_ReadWord(0xff8930)); - fprintf(stderr, "$FF8932 : DMA Crossbar Output Select Controller : %04x\n", IoMem_ReadWord(0xff8932)); + fprintf(stderr, "$FF8920.b : Sound Mode Control : %02x\n", IoMem_ReadByte(0xff8920)); + fprintf(stderr, "$FF8921.b : Sound Mode Control : %02x\n", IoMem_ReadByte(0xff8921)); + fprintf(stderr, "$FF8930.w : DMA Crossbar Input Select Controller : %04x\n", IoMem_ReadWord(0xff8930)); + fprintf(stderr, "$FF8932.w : DMA Crossbar Output Select Controller : %04x\n", IoMem_ReadWord(0xff8932)); fprintf(stderr, "\n"); - fprintf(stderr, "$FF8934 : External Sync Frequency Divider : %02x\n", IoMem_ReadByte(0xff8934)); - fprintf(stderr, "$FF8935 : Internal Sync Frequency Divider : %02x\n", IoMem_ReadByte(0xff8935)); - fprintf(stderr, "$FF8936 : Record Track select : %02x\n", IoMem_ReadByte(0xff8936)); - fprintf(stderr, "$FF8937 : Codec Input Source : %02x\n", IoMem_ReadByte(0xff8937)); - fprintf(stderr, "$FF8938 : Codec ADC Input : %02x\n", IoMem_ReadByte(0xff8938)); - fprintf(stderr, "$FF8939 : Gain Settings Per Channel : %02x\n", IoMem_ReadByte(0xff8939)); - fprintf(stderr, "$FF893A : Attenuation Settings Per Channel : %02x\n", IoMem_ReadByte(0xff893a)); - fprintf(stderr, "$FF893C : Codec Status : %04x\n", IoMem_ReadWord(0xff893c)); - fprintf(stderr, "$FF8940 : GPIO Data Direction : %04x\n", IoMem_ReadWord(0xff8940)); - fprintf(stderr, "$FF8942 : GPIO Data : %04x\n", IoMem_ReadWord(0xff8942)); + fprintf(stderr, "$FF8934.b : External Sync Frequency Divider : %02x\n", IoMem_ReadByte(0xff8934)); + fprintf(stderr, "$FF8935.b : Internal Sync Frequency Divider : %02x\n", IoMem_ReadByte(0xff8935)); + fprintf(stderr, "$FF8936.b : Record Track select : %02x\n", IoMem_ReadByte(0xff8936)); + fprintf(stderr, "$FF8937.b : Codec Input Source : %02x\n", IoMem_ReadByte(0xff8937)); + fprintf(stderr, "$FF8938.b : Codec ADC Input : %02x\n", IoMem_ReadByte(0xff8938)); + fprintf(stderr, "$FF8939.b : Gain Settings Per Channel : %02x\n", IoMem_ReadByte(0xff8939)); + fprintf(stderr, "$FF893A.b : Attenuation Settings Per Channel : %02x\n", IoMem_ReadByte(0xff893a)); + fprintf(stderr, "$FF893C.w : Codec Status : %04x\n", IoMem_ReadWord(0xff893c)); + fprintf(stderr, "$FF8940.w : GPIO Data Direction : %04x\n", IoMem_ReadWord(0xff8940)); + fprintf(stderr, "$FF8942.w : GPIO Data : %04x\n", IoMem_ReadWord(0xff8942)); fprintf(stderr, "\n"); /* DAC connexion */ - switch ((IoMem_ReadWord(0xff8932) >> 13) & 3) { - case 0 : strcpy(matrixDAC, "OOXO"); break; - case 1 : strcpy(matrixDAC, "OXOO"); break; - case 2 : strcpy(matrixDAC, "XOOO"); break; - case 3 : strcpy(matrixDAC, "OOOX"); break; + switch ((IoMem_ReadWord(0xff8932) >> 13) & 0x3) { + case 0 : + /* DAC connexion with DMA Playback */ + if ((IoMem_ReadWord(0xff8930) & 0x1) == 1) + strcpy(matrixDAC, "OOXO"); + else + strcpy(matrixDAC, "OOHO"); + break; + case 1 : + /* DAC connexion with DSP Transmit */ + if ((IoMem_ReadWord(0xff8930) & 0x10) == 0x10) + strcpy(matrixDAC, "OXOO"); + else + strcpy(matrixDAC, "OHOO"); + break; + case 2 : + /* DAC connexion with External Input */ + if ((IoMem_ReadWord(0xff8930) & 0x100) == 0x100) + strcpy(matrixDAC, "XOOO"); + else + strcpy(matrixDAC, "HOOO"); + break; + case 3 : + /* DAC connexion with ADC */ + strcpy(matrixDAC, "OOOX"); + break; } - + /* DMA connexion */ - switch ((IoMem_ReadWord(0xff8932) >> 1) & 3) { - case 0 : strcpy(matrixDMA, "OOXO"); break; - case 1 : strcpy(matrixDMA, "OXOO"); break; - case 2 : strcpy(matrixDMA, "XOOO"); break; - case 3 : strcpy(matrixDMA, "OOOX"); break; + switch (IoMem_ReadWord(0xff8932) & 0x7) { + case 0 : strcpy(matrixDMA, "OOHO"); break; + case 1 : strcpy(matrixDMA, "OOXO"); break; + case 2 : strcpy(matrixDMA, "OHOO"); break; + case 3 : strcpy(matrixDMA, "OXOO"); break; + case 4 : strcpy(matrixDMA, "HOOO"); break; + case 5 : strcpy(matrixDMA, "XOOO"); break; + case 6 : strcpy(matrixDMA, "OOOH"); break; + case 7 : strcpy(matrixDMA, "OOOX"); break; } /* DSP connexion */ - switch ((IoMem_ReadWord(0xff8932) >> 5) & 3) { - case 0 : strcpy(matrixDSP, "OOXO"); break; - case 1 : strcpy(matrixDSP, "OXOO"); break; - case 2 : strcpy(matrixDSP, "XOOO"); break; - case 3 : strcpy(matrixDSP, "OOOX"); break; + switch ((IoMem_ReadWord(0xff8932) >> 4) & 0x7) { + case 0 : strcpy(matrixDSP, "OOHO"); break; + case 1 : strcpy(matrixDSP, "OOXO"); break; + case 2 : strcpy(matrixDSP, "OHOO"); break; + case 3 : strcpy(matrixDSP, "OXOO"); break; + case 4 : strcpy(matrixDSP, "HOOO"); break; + case 5 : strcpy(matrixDSP, "XOOO"); break; + case 6 : strcpy(matrixDSP, "OOOH"); break; + case 7 : strcpy(matrixDSP, "OOOX"); break; } /* External input connexion */ - switch ((IoMem_ReadWord(0xff8932) >> 9) & 3) { - case 0 : strcpy(matrixEXT, "OOXO"); break; - case 1 : strcpy(matrixEXT, "OXOO"); break; - case 2 : strcpy(matrixEXT, "XOOO"); break; - case 3 : strcpy(matrixEXT, "OOOX"); break; + switch ((IoMem_ReadWord(0xff8932) >> 8) & 0x7) { + case 0 : strcpy(matrixEXT, "OOHO"); break; + case 1 : strcpy(matrixEXT, "OOXO"); break; + case 2 : strcpy(matrixEXT, "OHOO"); break; + case 3 : strcpy(matrixEXT, "OXOO"); break; + case 4 : strcpy(matrixEXT, "HOOO"); break; + case 5 : strcpy(matrixEXT, "XOOO"); break; + case 6 : strcpy(matrixEXT, "OOOH"); break; + case 7 : strcpy(matrixEXT, "OOOX"); break; } - /* HandShake mode test */ - if ((IoMem_ReadWord(0xff8932) & 7) == 2) { - matrixDMA[1] = 'H'; - } - - /* HandShake mode test */ - if ((IoMem_ReadWord(0xff8932) & 0xf) == 2) { - matrixDSP[2] = 'H'; - } - - /* DSP Frequency */ if ((IoMem_ReadByte(0xff8935) & 0xf) == 0) { strcpy(frqDSP, "(STe Freq)"); - }else { + strcpy(frqDMA, "(STe Freq)"); + strcpy(frqEXT, "(STe Freq)"); + strcpy(frqDAC, "(STe Freq)"); + } + else { + /* DSP Clock */ switch ((IoMem_ReadWord(0xff8930) >> 5) & 0x3) { case 0: strcpy(frqDSP, " (25 Mhz) "); break; case 1: strcpy(frqDSP, "(External)"); break; case 2: strcpy(frqDSP, " (32 Mhz) "); break; - default: strcpy(frqDSP, "undefined "); break;break; + default: strcpy(frqDSP, "undefined "); break; } - } - /* DMA Frequency */ - if ((IoMem_ReadByte(0xff8935) & 0xf) == 0) { - strcpy(frqDMA, "(STe Freq)"); - }else { + /* DMA Clock */ switch ((IoMem_ReadWord(0xff8930) >> 1) & 0x3) { case 0: strcpy(frqDMA, " (25 Mhz) "); break; case 1: strcpy(frqDMA, "(External)"); break; case 2: strcpy(frqDMA, " (32 Mhz) "); break; - default: strcpy(frqDMA, "undefined "); break;break; + default: strcpy(frqDMA, "undefined "); break; } - } - /* External Frequency */ - if ((IoMem_ReadByte(0xff8935) & 0xf) == 0) { - strcpy(frqEXT, "(STe Freq)"); - }else { + /* External Clock */ switch ((IoMem_ReadWord(0xff8930) >> 9) & 0x3) { case 0: strcpy(frqEXT, " (25 Mhz) "); break; case 1: strcpy(frqEXT, "(External)"); break; case 2: strcpy(frqEXT, " (32 Mhz) "); break; - default: strcpy(frqEXT, "undefined "); break;break; + default: strcpy(frqEXT, "undefined "); break; } - } - /* DAC Frequency */ - if ((IoMem_ReadByte(0xff8935) & 0xf) == 0) { - strcpy(frqDAC, "(STe Freq)"); - }else { + /* DAC Clock */ strcpy(frqDAC, " (25 Mhz) "); } @@ -381,6 +543,18 @@ static void DebugInfo_Crossbar(Uint32 du default: strcpy (dataSize, "undefined"); break; } + /* STE, 25Mhz and 32 Mhz sound frequencies */ + if ((IoMem_ReadByte(0xff8935) & 0xf) == 0) { + sprintf(frqSTE, "Ste Freq : %d Khz", Ste_SampleRates[IoMem_ReadByte(0xff8921) & 0x3]); + strcpy (frq25Mhz, "25 Mhz Freq : - Khz"); + strcpy (frq32Mhz, "32 Mzh Freq : - Khz"); + } + else { + strcpy (frqSTE, "Ste Freq : - Khz"); + sprintf(frq25Mhz, "25 Mhz Freq : %d Khz", Falcon_SampleRates_25Mhz[(IoMem_ReadByte(0xff8935) & 0xf) - 1]); + sprintf(frq32Mhz, "32 Mzh Freq : %d Khz", Falcon_SampleRates_32Mhz[(IoMem_ReadByte(0xff8935) & 0xf) - 1]); + } + /* Display the crossbar Matrix */ fprintf(stderr, " INPUT\n"); fprintf(stderr, "External Imp ---%c------%c------%c------%c\n", matrixDAC[0], matrixDMA[0], matrixDSP[0], matrixEXT[0]); @@ -390,10 +564,11 @@ static void DebugInfo_Crossbar(Uint32 du fprintf(stderr, "%s | | | |\n", frqDSP); fprintf(stderr, " | | | | %s\n", dataSize); fprintf(stderr, "DMA PlayBack ---%c------%c------%c------%c\n", matrixDAC[2], matrixDMA[2], matrixDSP[2], matrixEXT[2]); - fprintf(stderr, "%s | | | |\n", frqDMA); + fprintf(stderr, "%s | | | | Sound Freq :\n", frqDMA); + fprintf(stderr, " | | | | %s\n", frqSTE); + fprintf(stderr, "ADC ---%c------%c------%c------%c %s\n", matrixDAC[3], matrixDMA[3], matrixDSP[3], matrixEXT[3], frq25Mhz); + fprintf(stderr, "%s | | | | %s\n", frqDAC, frq32Mhz); fprintf(stderr, " | | | |\n"); - fprintf(stderr, "ADC ---%c------%c------%c------%c\n", matrixDAC[3], matrixDMA[3], matrixDSP[3], matrixEXT[3]); - fprintf(stderr, "%s | | | |\n", frqDAC); fprintf(stderr, " DAC DMA DSP External OUTPUT\n"); fprintf(stderr, " Record Record Out\n"); fprintf(stderr, "\n"); @@ -561,6 +736,49 @@ static Uint32 DebugInfo_RegAddrArgs(int /* ------------------------------------------------------------------ + * wrappers for command to parse debugger input file + */ + +/* file name to be given before calling the Parse function, + * needs to be set separately as it's a host pointer which + * can be 64-bit i.e. may not fit into Uint32. + */ +static char *parse_filename; + +/** + * Parse and exec commands in the previously given debugger input file + */ +static void DebugInfo_FileParse(Uint32 dummy) +{ + if (parse_filename) { + DebugUI_ParseFile(parse_filename); + } else { + fputs("ERROR: debugger input file name to parse isn't set!\n", stderr); + } +} + +/** + * Set which input file to parse. + * Return true if file exists, false on error + */ +static Uint32 DebugInfo_FileArgs(int argc, char *argv[]) +{ + if (argc != 1) { + return false; + } + if (!File_Exists(argv[0])) { + fprintf(stderr, "ERROR: given file '%s' doesn't exist!\n", argv[0]); + return false; + } + if (parse_filename) { + free(parse_filename); + } + parse_filename = strdup(argv[0]); + return true; +} + + +/* ------------------------------------------------------------------ * Debugger & readline TAB completion integration */ @@ -580,7 +798,7 @@ static void DebugInfo_Default(Uint32 dum } static const struct { - /* whether callback is used only for locking */ + /* if overlaps with other functionality, list only for lock command */ bool lock; const char *name; void (*func)(Uint32 arg); @@ -588,23 +806,29 @@ static const struct { Uint32 (*args)(int argc, char *argv[]); const char *info; } infotable[] = { + { false,"aes", AES_Info, NULL, "Show AES vector contents (with , show opcodes)" }, { false,"basepage", DebugInfo_Basepage, NULL, "Show program basepage info at given
" }, + { false,"cookiejar", DebugInfo_Cookiejar, NULL, "Show TOS Cookiejar contents" }, { false,"crossbar", DebugInfo_Crossbar, NULL, "Show Falcon crossbar HW register values" }, { true, "default", DebugInfo_Default, NULL, "Show default debugger entry information" }, { true, "disasm", DebugInfo_CpuDisAsm, NULL, "Disasm CPU from PC or given
" }, #if ENABLE_DSP_EMU { true, "dspdisasm", DebugInfo_DspDisAsm, NULL, "Disasm DSP from given
" }, { true, "dspmemdump",DebugInfo_DspMemDump, DebugInfo_DspMemArgs, "Dump DSP memory from given
" }, - { true, "dspregs", DebugInfo_DspRegister,NULL, "Show DSP register values" }, + { true, "dspregs", DebugInfo_DspRegister,NULL, "Show DSP registers values" }, #endif + { true, "file", DebugInfo_FileParse, DebugInfo_FileArgs, "Parse commands from given debugger input " }, + { false,"gemdos", GemDOS_Info, NULL, "Show GEMDOS HDD emu info (with , show opcodes)" }, { true, "memdump", DebugInfo_CpuMemDump, NULL, "Dump CPU memory from given
" }, { false,"osheader", DebugInfo_OSHeader, NULL, "Show TOS OS header information" }, { true, "regaddr", DebugInfo_RegAddr, DebugInfo_RegAddrArgs, "Show from CPU/DSP address pointed by " }, - { true, "registers", DebugInfo_CpuRegister,NULL, "Show CPU register values" }, - { false,"videl", DebugInfo_Videl, NULL, "Show Falcon Videl HW register values" } + { true, "registers", DebugInfo_CpuRegister,NULL, "Show CPU registers values" }, + { false,"vdi", VDI_Info, NULL, "Show VDI vector contents (with , show opcodes)" }, + { false,"videl", DebugInfo_Videl, NULL, "Show Falcon Videl HW registers values" }, + { false,"video", DebugInfo_Video, NULL, "Show Video related values" } }; -static int LockedFunction = 2; /* index for the "default" function */ +static int LockedFunction = 4; /* index for the "default" function */ static Uint32 LockedArgument; /**