From: Jean-Paul Mari Date: Wed, 8 Nov 2017 23:14:02 +0000 (-0500) Subject: Added a Local browser window for local variables X-Git-Tag: v2.1.3-R3~4 X-Git-Url: http://git.hcoop.net/clinton/Virtual-Jaguar-Rx.git/commitdiff_plain/0203b5fd6f49dbc4f4244417c095882eb9882d49 Added a Local browser window for local variables --- diff --git a/VS2015/GeneratedFiles/qrc_virtualjaguar.cpp b/VS2015/GeneratedFiles/qrc_virtualjaguar.cpp index 06f18ab..86302cf 100644 --- a/VS2015/GeneratedFiles/qrc_virtualjaguar.cpp +++ b/VS2015/GeneratedFiles/qrc_virtualjaguar.cpp @@ -23553,6 +23553,360 @@ static const unsigned char qt_resource_data[] = { 0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xf8,0xff,0x1,0xfe,0x6f,0x2d,0xc, 0xe2,0xe,0x37,0x99,0x61,0xad,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42, 0x60,0x82, + // C:/Projects/Emulator/virtualjaguar/res/Local.png + 0x0,0x0,0x15,0xe5, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x80,0x0,0x0,0x0,0x80,0x8,0x2,0x0,0x0,0x0,0x4c,0x5c,0xf6,0x9c, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc3,0x0,0x0,0xe,0xc3,0x1,0xc7,0x6f, + 0xa8,0x64,0x0,0x0,0x15,0x7a,0x49,0x44,0x41,0x54,0x78,0x5e,0xed,0x9d,0x79,0x43, + 0x22,0xc9,0xb2,0xc5,0x47,0x4,0x17,0x50,0x36,0x11,0xed,0xee,0x99,0xfb,0x3d,0xdf, + 0xfb,0xe7,0x7d,0xd7,0x7b,0xa7,0x47,0x59,0xc5,0x8d,0xc5,0xa5,0x7d,0xbf,0x13,0x91, + 0xb5,0xa0,0x7d,0x19,0xec,0x6,0xa,0x7b,0xea,0x74,0x76,0x81,0xb5,0x91,0x19,0x27, + 0x4e,0x44,0x66,0x55,0x52,0xec,0xdc,0xdc,0x7d,0xfb,0x2d,0x47,0x76,0x28,0x84,0xd7, + 0x1c,0x19,0x21,0x27,0x20,0x63,0xe4,0x4,0x64,0x8c,0x9c,0x80,0x8c,0x91,0x13,0x90, + 0x31,0x72,0x2,0x32,0x46,0x4e,0x40,0xc6,0xc8,0x9,0xc8,0x18,0x39,0x1,0x19,0x23, + 0x27,0x20,0x63,0xe4,0x4,0x64,0x8c,0x9c,0x80,0x8c,0x91,0x13,0x90,0x31,0x72,0x2, + 0x32,0xc6,0xd2,0x97,0xa3,0x5f,0xc2,0xeb,0xba,0xb0,0x13,0x5e,0x37,0x87,0xed,0x68, + 0x51,0xae,0x80,0x8c,0x91,0x13,0x90,0x31,0x72,0x2,0x32,0xc6,0xbb,0x73,0xc0,0xcb, + 0xcb,0xcb,0xf3,0xf3,0xf3,0xb7,0x6f,0xb6,0xd0,0x52,0x2f,0x61,0xdb,0x42,0xec,0xec, + 0xec,0x14,0xa,0xbb,0xbb,0xbb,0x85,0xd4,0x72,0x37,0x6c,0x3,0x99,0xe6,0x80,0xf9, + 0x16,0x69,0x49,0x33,0xc3,0xb6,0x85,0x88,0x1a,0x93,0xb4,0x88,0x66,0x86,0x6d,0xcb, + 0xb5,0xe8,0xdd,0x4,0x50,0xc1,0x87,0x87,0xd9,0x3,0x98,0xcd,0xfc,0xe5,0xf1,0xf1, + 0x21,0x6c,0x5b,0x88,0xc2,0x4e,0x61,0x6f,0x7f,0x7f,0x4f,0x48,0x96,0xef,0xad,0xee, + 0x2a,0x91,0x72,0x29,0xb5,0xc3,0x1b,0x15,0x35,0xed,0xdb,0xcb,0x52,0x66,0x29,0x95, + 0xd4,0x10,0xb5,0x24,0x6a,0x5a,0xe2,0x55,0x6b,0x22,0xe0,0xf1,0xf1,0x71,0x3c,0xbe, + 0x1f,0x8f,0xc7,0x93,0x89,0x96,0xbc,0x9f,0x4c,0x26,0x61,0xdb,0x42,0x50,0xb3,0x72, + 0xb9,0x52,0x6,0x87,0x95,0x43,0xbd,0xe8,0xfd,0x96,0x10,0x10,0x1a,0xc2,0x22,0x6a, + 0x14,0x7e,0x16,0x36,0x2f,0xc4,0xe1,0x21,0x4d,0x51,0x43,0xe,0xf,0xad,0x69,0xe5, + 0x4a,0xa9,0x54,0xa,0xdb,0xd6,0x44,0x0,0x7e,0x7f,0x7b,0x7b,0x73,0x73,0x73,0x6d, + 0xcb,0x9b,0xdb,0xdb,0xeb,0xbb,0xbb,0xdb,0xb0,0x6d,0x21,0x8a,0xbb,0xa5,0x6a,0xb5, + 0x7a,0x4c,0x39,0xae,0xe9,0xd,0xef,0xaa,0xb5,0x84,0x80,0x25,0xb1,0x42,0x9e,0x52, + 0x4,0xa4,0x9b,0x63,0xaf,0x37,0x4f,0xcf,0x8f,0x61,0xf3,0x42,0x1c,0x1d,0x1d,0xa7, + 0x9b,0xc3,0x72,0x7f,0x7f,0x3f,0x6c,0x5b,0x13,0x1,0xf8,0xfb,0x68,0x34,0x4,0x57, + 0x57,0x83,0xab,0x2b,0x2d,0xaf,0x47,0xa3,0xb0,0x6d,0x21,0x50,0x6b,0xa3,0xd1,0x6c, + 0x34,0x9b,0x5a,0xaa,0x9c,0xb0,0x24,0x70,0x86,0xcd,0x4b,0x62,0xd,0x4,0x10,0xf2, + 0xbd,0x21,0xb6,0x1c,0x5e,0xa9,0x69,0xc3,0x25,0xe3,0x6a,0xad,0x5e,0xf7,0x86,0xb0, + 0x6c,0x36,0x9b,0xf5,0x7a,0x13,0x4d,0x84,0x6d,0x6b,0x22,0xe0,0xfe,0xfe,0xbe,0xdf, + 0xef,0xf6,0x7a,0xdd,0x7e,0xaf,0xd3,0xe3,0x4d,0xb7,0x3b,0x18,0xf6,0xc3,0xb6,0x85, + 0x20,0x3e,0x9e,0x9e,0xb6,0x4f,0x4f,0xcf,0x4e,0x5b,0xfc,0xb3,0x37,0xa7,0xed,0x2d, + 0x21,0x80,0xe6,0xf4,0x7a,0x9d,0x3e,0xcb,0x7e,0x8f,0x37,0xfc,0x49,0x1e,0x8,0x9b, + 0x17,0xe2,0xa4,0x49,0x53,0xda,0xa7,0xad,0x76,0xcb,0x9a,0xd3,0x6a,0xb5,0x2b,0x95, + 0x4a,0xd8,0xb6,0x26,0x2,0x8,0x38,0x97,0x97,0x7f,0x5d,0x5c,0xfc,0x75,0x79,0xf1, + 0xd7,0xc5,0x25,0xcb,0xaf,0xdd,0x6e,0x27,0x6c,0x5b,0x88,0xfd,0xfd,0x83,0x4f,0x9f, + 0x3e,0x9f,0x7f,0xfa,0xf2,0xe9,0x9c,0x7f,0x9f,0xcf,0xcf,0xbf,0x9c,0x9f,0x7f,0x4a, + 0x52,0xd6,0x92,0x58,0x3,0x1,0x84,0xfb,0xcb,0xcb,0x8b,0xcb,0xcb,0xaf,0xd6,0x22, + 0xfe,0x7d,0xa5,0x75,0xb3,0xd9,0x34,0x6c,0x5e,0x88,0x76,0xfb,0xcc,0x5a,0x44,0xbb, + 0x3e,0xab,0x75,0xe7,0x9f,0x9,0x4a,0x61,0xdb,0x72,0x55,0x7d,0xf7,0x38,0x0,0x7f, + 0x21,0xf,0x4f,0xa7,0xd3,0xfb,0xfb,0x3b,0x42,0x27,0x6a,0xed,0xf7,0x7b,0x83,0x41, + 0x9f,0x32,0x1c,0xe,0x28,0x41,0xc8,0x6f,0x30,0x1a,0x5d,0x11,0x67,0x39,0x8a,0x63, + 0xe9,0x68,0xd0,0xd5,0xf3,0x13,0x12,0x82,0x1d,0x9c,0xf9,0xbf,0x81,0x8d,0x61,0xa7, + 0xe5,0x7a,0x87,0xef,0x5,0x95,0xa1,0x4a,0xde,0x28,0x2a,0x49,0x55,0xbf,0x7,0xb5, + 0xcb,0xdb,0xe8,0xed,0xa5,0xe1,0xac,0xc1,0x8,0xde,0x28,0xcc,0x42,0x55,0xc3,0x19, + 0x97,0xc6,0xbb,0x15,0xc0,0xe7,0x7d,0xfd,0xfa,0x9f,0x3f,0xff,0xfc,0xcf,0xd7,0x3f, + 0xff,0xfd,0xe7,0x57,0x2d,0xf1,0x17,0x52,0x7f,0x51,0x8,0x4b,0xfe,0xa2,0xd3,0x1f, + 0xe,0x88,0x40,0x76,0x3a,0x3b,0xfb,0x84,0xc3,0x9c,0x6b,0x9,0x3e,0xb7,0xdb,0xe7, + 0x24,0x61,0xeb,0x78,0x3f,0x87,0xfe,0x37,0x1d,0xf0,0x6f,0x2f,0x91,0xef,0xc4,0x19, + 0x7a,0xc7,0x3a,0xd9,0xf6,0x3f,0x7a,0xf7,0xee,0xec,0xfd,0x16,0x29,0x5,0x74,0xbb, + 0x97,0xc8,0xba,0xc3,0xa2,0x73,0xd1,0xb9,0xbc,0xe8,0x74,0x2e,0xe8,0x6b,0x84,0xcd, + 0x11,0x70,0x82,0xc7,0xc7,0xa7,0xa7,0x27,0xfd,0xf7,0x25,0x16,0xc7,0xeb,0xbf,0xfc, + 0xfe,0xaf,0xdf,0xbf,0xfc,0xa1,0xe5,0xef,0x7f,0x7c,0xf9,0xf2,0x7,0xa9,0x38,0x1c, + 0xb0,0x5c,0x5,0x77,0xff,0xe7,0x7f,0xff,0x2f,0xbc,0x5d,0xe,0x51,0x2f,0xe8,0xe6, + 0xf6,0xe6,0x9a,0xff,0x2c,0xe1,0x9f,0xe,0xf0,0xc1,0x81,0x7a,0x64,0x47,0x95,0x23, + 0x6a,0x50,0xab,0xd5,0xe9,0xf,0x20,0xc6,0x74,0x61,0x7d,0xab,0x75,0xda,0x68,0x9e, + 0x90,0xb7,0x78,0xcf,0x1a,0x3a,0x6d,0x58,0xdc,0x1a,0x42,0xf7,0x1b,0xd1,0x4f,0x27, + 0xfc,0x9b,0x4d,0x79,0x8b,0x3f,0x6a,0x9d,0xa0,0x71,0x6,0xf4,0x48,0x7,0x66,0x33, + 0x4c,0xcf,0x88,0x67,0x5,0x4,0xa4,0xc0,0x67,0xf3,0x49,0xd8,0xd4,0x5d,0x98,0x4f, + 0xa0,0x31,0xe9,0xca,0x7b,0x6d,0x69,0x26,0xfe,0x85,0x3,0xec,0xfc,0xb6,0x23,0x67, + 0x79,0x7e,0x66,0x3d,0x6d,0x49,0x17,0x22,0xad,0x9f,0x73,0x73,0x4,0xdc,0xdd,0xdd, + 0x1d,0xc8,0xfc,0x95,0x23,0xaa,0x73,0x5c,0x55,0xbf,0xa0,0xd9,0xa4,0x2a,0x71,0xd5, + 0xbd,0x1c,0x57,0x6b,0xcd,0xe6,0x49,0xad,0xde,0xa8,0x55,0x6b,0x95,0xa3,0x63,0x92, + 0x15,0x7,0xd1,0x6,0x33,0x3f,0x90,0xf5,0x27,0xe3,0x7b,0x58,0x70,0xbb,0xf3,0xff, + 0x51,0xff,0x21,0xe0,0xf1,0x5,0x89,0x58,0xf0,0x61,0x30,0x2d,0x9,0xac,0x94,0x0, + 0xc2,0x1a,0x55,0xc0,0xbb,0x9,0x82,0x7c,0x86,0xce,0x5f,0x2c,0xd2,0xa5,0x7f,0x55, + 0x7f,0xdc,0x4b,0xd6,0x47,0x7c,0x16,0x87,0x9f,0x9f,0x9f,0xa8,0x1d,0xeb,0xd3,0xd6, + 0xa7,0x64,0x40,0x0,0xfd,0x22,0xbc,0xc3,0xad,0x8f,0xef,0xe3,0xe3,0xad,0x93,0x16, + 0x55,0x89,0xab,0xee,0x85,0x21,0x0,0x1b,0x7d,0x7d,0xb9,0x52,0xc1,0xc5,0x8,0x4a, + 0xb8,0xbf,0xc6,0x9d,0x72,0x7e,0x59,0xff,0x7e,0x7c,0x7,0xd,0xb2,0x3e,0x22,0x60, + 0xb,0x76,0xf1,0x91,0xb6,0x5b,0x5f,0x17,0x33,0x64,0x7d,0xc,0x91,0x84,0xb8,0x55, + 0x10,0x61,0xbe,0xff,0x8c,0xc0,0x74,0xb5,0xa4,0x58,0xdc,0x2b,0xed,0x59,0x8b,0xe6, + 0xea,0x5f,0x3e,0x2c,0xb3,0x95,0x9d,0xdd,0xfa,0xb8,0x5,0xf5,0xa6,0xd5,0xb1,0xe9, + 0xbd,0xbc,0x97,0x80,0x77,0x27,0xe1,0xef,0x2,0x9b,0x20,0x2,0xaa,0xc,0x1,0xf4, + 0xcc,0xda,0x67,0x67,0xc4,0xfa,0x57,0x85,0x95,0x6c,0x62,0x7,0x76,0x63,0x67,0xe, + 0xe1,0x40,0x1a,0x43,0xe3,0xb1,0x38,0xc,0x30,0xfe,0xbc,0x33,0x46,0x35,0x1a,0xe2, + 0xd,0x43,0x3c,0x96,0x77,0x37,0xf4,0xbb,0xd8,0x64,0xca,0x98,0x3d,0x3e,0x3d,0x4a, + 0xc,0xfe,0xa9,0xab,0xc3,0xf,0xd7,0xff,0xe7,0xb1,0x1a,0x2,0x70,0xc9,0xfd,0xfd, + 0xc3,0x4a,0x45,0xd,0x68,0x9e,0x9c,0x90,0x5d,0xcf,0xc9,0xb3,0xf3,0x85,0x95,0x6c, + 0x52,0x3,0x2a,0x47,0xec,0xcc,0x21,0x1c,0x48,0x66,0x43,0x4,0x84,0x1b,0x1c,0xdf, + 0x7b,0x20,0x36,0x16,0x15,0x7,0xb2,0xbe,0x2d,0x59,0x2d,0x2,0x26,0x22,0x0,0xc7, + 0x23,0x5f,0xbb,0x20,0x56,0x88,0x1f,0xae,0xff,0xcf,0x63,0x5,0x4,0x10,0x19,0xa8, + 0xd,0x4e,0x81,0x1e,0xa9,0xdf,0xc9,0x49,0x8b,0xba,0xbe,0x72,0x1f,0xa,0x2b,0xd9, + 0xc4,0xe,0xec,0xc6,0xce,0x1c,0xc2,0x81,0x92,0x33,0xa,0x50,0x6,0x18,0x8f,0xc7, + 0x64,0x13,0x62,0x9b,0xbb,0xbf,0x59,0x5f,0xee,0xaf,0xc2,0xa6,0xe9,0x74,0x8c,0xe4, + 0x61,0xb,0xfd,0xaf,0xb6,0x33,0xfa,0x33,0xf5,0xf,0xa7,0xf8,0x9,0xac,0x46,0x1, + 0x51,0x68,0xf6,0x6b,0x83,0x24,0x64,0x5d,0xa4,0x7a,0x55,0xa8,0x74,0xa9,0xb4,0xe7, + 0x23,0x2f,0xcb,0xbd,0xf4,0xbb,0x15,0xf8,0x81,0x5f,0xd7,0x23,0x97,0x18,0xee,0xbc, + 0xa4,0xc1,0x5a,0xdb,0x4d,0x85,0xa3,0xac,0xd3,0xa2,0xdc,0x0,0x1f,0xde,0x7d,0xfd, + 0x49,0x4a,0x96,0xa9,0x3f,0xab,0xd8,0x64,0x1d,0xa1,0x12,0x3b,0x73,0x48,0x38,0xf8, + 0xe7,0xb0,0x9a,0xb3,0x2c,0x9,0xb7,0xbb,0x65,0x5c,0x19,0xda,0x42,0x8d,0xfb,0xf8, + 0x2d,0x7f,0x42,0x81,0x95,0xc0,0x44,0x8a,0x12,0xe0,0xac,0x68,0x37,0x7f,0xc3,0x36, + 0xce,0x82,0x26,0x38,0x21,0x29,0x71,0x4d,0x3,0xb4,0xd,0x60,0x73,0x4,0x60,0xa3, + 0x40,0x0,0xf1,0x66,0x42,0xb8,0x21,0xca,0x78,0xbe,0xbd,0x4d,0xbb,0x79,0xc,0x37, + 0x3c,0xf0,0x8d,0xb6,0x74,0x68,0x7f,0x82,0xd2,0x64,0x3a,0x36,0x1d,0x48,0x4,0xe4, + 0x92,0xf0,0x31,0x1f,0xd,0x1b,0x26,0x20,0xf4,0xde,0xd4,0xe3,0xb9,0xc7,0xfb,0x75, + 0xed,0x37,0x56,0x80,0x59,0x3b,0x58,0x3f,0x86,0xad,0x4,0xee,0xf8,0xf2,0xfd,0xb0, + 0xb4,0x7e,0x11,0x5c,0xd2,0x8f,0x25,0x8b,0x68,0xfc,0xfc,0x31,0xb1,0x76,0x2,0xb0, + 0x7b,0x8c,0x10,0xfa,0x4d,0x1,0xd8,0xd1,0xdc,0x5f,0xf9,0x36,0x22,0x0,0xbf,0xe, + 0x8,0x66,0xf,0x60,0x93,0x2d,0x4d,0x8,0xb2,0xbe,0xfa,0x45,0x77,0xe4,0x6d,0xd4, + 0xe4,0xa,0xd0,0xd,0x2c,0x28,0x78,0x57,0x21,0x83,0x2e,0x53,0xd6,0x8c,0x8d,0xe6, + 0x0,0xba,0x3c,0xa6,0x0,0x27,0x20,0x84,0x20,0xb,0x29,0x71,0xe,0x48,0x60,0x46, + 0x8f,0x11,0x71,0x10,0x4a,0x18,0x19,0xcc,0x1e,0xa6,0x96,0x3,0x56,0xdc,0x2f,0xda, + 0x24,0xb2,0xc9,0x1,0x98,0xf,0xa3,0x13,0x7f,0x22,0x5,0x8,0x18,0xd8,0x39,0x30, + 0x5b,0x27,0x6f,0x7c,0xa3,0x2d,0x81,0xd8,0xe2,0x85,0x13,0x68,0xcc,0x1c,0x14,0xa0, + 0xab,0x8,0xe1,0x63,0x3e,0x1a,0xd6,0x4b,0x80,0x5,0x9e,0x0,0x1f,0xf4,0xea,0xca, + 0x83,0x7a,0x41,0x18,0x37,0x84,0xa0,0xb4,0xfb,0xd3,0x2d,0x8d,0x21,0x15,0x24,0x70, + 0x6e,0xb4,0x8f,0x41,0x37,0xa2,0x39,0x8f,0x86,0x66,0xd6,0x13,0xe5,0xfc,0xe1,0x23, + 0xdf,0x80,0x2d,0x5e,0x81,0x34,0x2c,0x6,0x6d,0x5,0xd6,0x45,0x40,0x30,0xb7,0x75, + 0x3a,0xb1,0x17,0x99,0x36,0x36,0x37,0xfe,0x1b,0x5b,0x7c,0x3a,0x9d,0x92,0x93,0x1f, + 0xa2,0x2b,0x91,0x66,0x1a,0x81,0x31,0x4e,0xc,0x7a,0xdc,0xde,0x4d,0xdf,0xd5,0xe5, + 0xee,0xbd,0x62,0x69,0xbf,0xb4,0xc7,0x90,0x82,0xa1,0x10,0xa3,0x8a,0xbd,0x42,0xa1, + 0xb8,0x53,0x8,0xd7,0xe6,0x38,0x9a,0x73,0x90,0x10,0x60,0x84,0xf3,0x3d,0x3e,0x7e, + 0x7b,0x78,0x54,0xd0,0xd3,0x25,0x3d,0x81,0x4f,0x83,0x36,0xbb,0xd6,0xa4,0x4f,0xdc, + 0x8a,0xee,0xd3,0xba,0x8,0xc0,0x94,0x76,0x91,0x87,0x94,0x6b,0x17,0x79,0x14,0x70, + 0xfc,0xea,0x2,0xfe,0x4e,0x1,0xf2,0x64,0x1c,0x59,0x57,0x3c,0xed,0x42,0x7b,0xec, + 0xc8,0x6e,0x4d,0x7f,0xe3,0x30,0xa,0x8a,0x98,0x7b,0x17,0x2,0x8a,0xfb,0xa5,0xd2, + 0x21,0x34,0xec,0x16,0x29,0x25,0xd6,0x17,0x74,0x61,0x6e,0xc7,0x3d,0x9d,0xde,0xd0, + 0x37,0xac,0xff,0xc,0xfd,0x2f,0x8f,0xe2,0xe0,0x19,0x53,0xf3,0x11,0xaa,0x89,0x30, + 0xa1,0x3e,0x38,0x5,0xa4,0x88,0x72,0xd,0xe2,0x32,0x96,0xc2,0x1a,0x15,0x60,0x17, + 0x6c,0x43,0xbc,0x81,0x0,0xa5,0xdc,0x70,0x69,0xe1,0xb5,0x2,0x9c,0x0,0xe,0x9, + 0x7,0xcf,0x9b,0xde,0x96,0x8c,0x3c,0x21,0xc0,0x15,0x70,0x10,0x8a,0x14,0x50,0x62, + 0x13,0xdb,0xd9,0x87,0xa3,0xc4,0x41,0xac,0x0,0x71,0x60,0x4,0x90,0xf6,0x13,0x5, + 0xd8,0x40,0x3a,0x1e,0x45,0x6b,0x2,0xd6,0x2f,0xab,0x80,0x10,0x82,0xd4,0xe8,0x10, + 0x82,0x3c,0xdf,0x6,0x5,0x78,0x3c,0x57,0x28,0x9f,0xf,0x41,0x6e,0x4a,0x20,0xf3, + 0x1b,0xe4,0xfe,0x8a,0x41,0x1e,0x82,0xf6,0x23,0x5,0x1c,0xa0,0x80,0x82,0x8,0x50, + 0x8,0x62,0x77,0x53,0x9d,0x2e,0xe9,0x2b,0xa,0x79,0x8,0x7a,0x22,0x4,0xe1,0x4, + 0x4f,0x76,0x79,0x5b,0xe6,0xc7,0x19,0xf8,0x9f,0x56,0x80,0x34,0xe7,0x19,0xc1,0xcb, + 0xc6,0xb1,0xc6,0x10,0x64,0xa,0xa0,0xb1,0x16,0x82,0x8,0x3d,0x16,0x82,0xe2,0x1c, + 0xe0,0xc,0xa4,0x15,0x90,0xce,0xa5,0xd8,0xdd,0x97,0x1,0xba,0x19,0x59,0x2c,0xee, + 0x96,0x14,0x82,0xc8,0x1,0xa5,0x83,0x28,0x7,0x88,0x0,0x42,0x10,0xbb,0xb0,0x3f, + 0x47,0x13,0x51,0x38,0xd,0xa1,0xe5,0xe9,0xf9,0x85,0x1c,0x60,0xa,0xa0,0x1a,0x52, + 0x80,0x8,0x50,0xe,0x60,0xfc,0xec,0x4,0x58,0xe,0xf8,0x85,0x43,0x10,0x36,0xf5, + 0x10,0x14,0x29,0x20,0xe9,0xf3,0x98,0x2,0x44,0x80,0x2b,0xc0,0xba,0x92,0xc9,0x35, + 0x35,0xb7,0xa6,0x19,0x5e,0x8,0xa,0x50,0x1e,0xb6,0x10,0x84,0x8,0xf6,0x82,0x2, + 0x94,0x84,0x77,0x83,0x2,0xe4,0xca,0x96,0x84,0x63,0x5,0x84,0x10,0x84,0xf5,0xa9, + 0x87,0x0,0x1,0x7e,0x2d,0x6f,0x46,0x5e,0x66,0x54,0x4e,0x98,0xfc,0x95,0x93,0xb0, + 0x5d,0x78,0x88,0x43,0x10,0x12,0xd0,0xe5,0x65,0xbb,0xf2,0x23,0xe,0x14,0x80,0x96, + 0xeb,0x5,0x1,0xb3,0xbf,0x42,0x90,0x29,0xc0,0xdc,0x5f,0x4,0x90,0x93,0xe3,0x1c, + 0xa0,0x86,0x70,0xb8,0x3e,0x17,0xee,0x95,0x3,0x94,0x84,0xd5,0xb,0xb2,0x24,0xec, + 0xe6,0xc7,0xfa,0xa,0x41,0x41,0x1,0x73,0x9a,0xcb,0xa,0x6b,0x24,0x0,0x83,0xd2, + 0x42,0x68,0x50,0x2e,0xc0,0xe5,0xc,0xbc,0xe1,0xf,0x7,0x1b,0xdc,0xa,0xec,0x99, + 0xb6,0xfe,0x5b,0x70,0x32,0x45,0x15,0xa0,0x13,0xb9,0x33,0xdb,0x2d,0xe4,0x68,0xac, + 0xe6,0x9,0x26,0x2a,0xb7,0xd6,0xdd,0xba,0xf1,0x88,0x47,0xe6,0x77,0xd6,0xcd,0x9, + 0x4c,0x7f,0x1a,0x46,0xa4,0xb9,0xf,0x1,0x90,0xfa,0x2e,0xae,0xc6,0x3a,0xb0,0x2e, + 0x2,0xde,0x85,0xe0,0xe7,0x29,0xf8,0x7a,0x6c,0xe1,0xc0,0x40,0xb8,0xed,0x64,0x82, + 0xf1,0x6e,0x6e,0x6f,0xae,0x46,0x57,0xfd,0xab,0x61,0x6f,0x30,0xe8,0xf6,0xfb,0x9a, + 0xa0,0xd7,0xed,0x5e,0x76,0x3b,0x97,0x9d,0xce,0x85,0xde,0x74,0x2f,0x7b,0xbd,0xcb, + 0x7e,0xff,0x72,0xd0,0xef,0xc,0x6,0x9d,0xe1,0xa0,0x7b,0x35,0xec,0xfb,0xb4,0xc3, + 0xd1,0xe8,0xea,0xda,0x0,0x3b,0x71,0x4f,0xcc,0x99,0x80,0x54,0xd7,0x84,0xd2,0xf2, + 0x66,0x39,0xc8,0x9e,0x80,0xd8,0xdc,0x6e,0x7a,0xe0,0x7f,0xba,0xe9,0x1,0x5e,0xe9, + 0x23,0x3a,0xdd,0x45,0xd0,0x2d,0x33,0x11,0x80,0x65,0x21,0x0,0x2b,0x6b,0x26,0x61, + 0xf7,0xb2,0xd3,0xd5,0x64,0x9e,0x6e,0xe7,0x82,0xf7,0xfd,0x5e,0xc4,0x81,0x11,0x30, + 0x1c,0xf6,0xae,0xae,0xfa,0xa3,0xd1,0xf0,0x5a,0x4,0x8c,0x34,0x9d,0x20,0x4a,0x45, + 0x8a,0x81,0xd6,0x2f,0x8a,0xa5,0x40,0xc7,0x14,0xf3,0x7b,0x5,0x36,0x83,0xad,0x50, + 0x0,0x70,0xbb,0xc7,0xd6,0x8f,0x11,0x8,0x78,0xb2,0x4b,0x78,0xba,0x7e,0x61,0xb3, + 0xf1,0x4c,0x1,0x18,0xb7,0xdf,0xef,0x60,0x6e,0xbc,0xbe,0x83,0x2,0x2e,0xa1,0x81, + 0xf7,0xc6,0x1,0xee,0x6f,0x65,0x38,0x7c,0xa5,0x80,0x11,0xa,0x80,0x1,0x53,0x0, + 0xee,0x2f,0x5,0x70,0xe6,0x74,0x56,0xe0,0xe3,0x36,0xd9,0x1f,0xcd,0x98,0x80,0xb4, + 0xdd,0x59,0xc6,0xb0,0x8d,0xdf,0x9,0x41,0xf7,0x1e,0x82,0x46,0x7d,0xfc,0x1a,0x7, + 0xc7,0xd0,0x28,0xc0,0x8,0x8,0xa,0x8,0x21,0xa8,0x47,0x8,0xba,0x1c,0xc6,0xa, + 0x18,0xe,0x46,0x46,0xc0,0x68,0x74,0x6d,0x13,0x6a,0x94,0x15,0x5c,0x1,0x74,0xc3, + 0x42,0xbf,0x28,0xe9,0x98,0xd2,0x33,0x4d,0xd,0xe,0xd6,0x8c,0x2d,0x52,0x80,0xdb, + 0x3d,0xb6,0x3e,0x70,0xeb,0xbb,0x2,0xac,0x43,0xab,0xee,0xac,0x87,0xa0,0xab,0x61, + 0x57,0x51,0xc8,0x72,0x0,0x2e,0x8f,0xe9,0x9d,0x3,0xde,0x5b,0xfc,0x11,0x37,0xa, + 0x41,0x41,0x1,0xfd,0xab,0x51,0x50,0x0,0xc7,0xc7,0xa,0x50,0xe,0x50,0xbf,0x48, + 0x39,0x80,0xfe,0xc1,0x3f,0x51,0x1,0x20,0x36,0xbd,0xbf,0x8f,0x97,0x98,0xde,0x97, + 0xc0,0x42,0xd0,0xcc,0xae,0x69,0xe0,0xbe,0x10,0xd0,0x33,0x5,0x98,0xf5,0x83,0x2, + 0x34,0xad,0x93,0x37,0x29,0x5,0x84,0x24,0x6c,0x39,0x20,0x28,0xc0,0x43,0x50,0x2a, + 0x7,0x78,0x12,0x4e,0x14,0xe0,0x63,0x63,0xf3,0xff,0xd,0x61,0xbb,0x14,0xe0,0x8, + 0xab,0xe6,0x14,0x90,0xe,0x41,0xd8,0x70,0x68,0x22,0xe8,0xf,0x6,0xbd,0x38,0xa, + 0xd1,0x11,0x8a,0xac,0x1f,0xb9,0x7f,0x9c,0x81,0x21,0x80,0x24,0xec,0x9,0xc0,0xe2, + 0x4f,0xa4,0x0,0x25,0x61,0xcb,0x1,0xa1,0x17,0xf4,0xeb,0x28,0x80,0x91,0x51,0x91, + 0x61,0xeb,0xde,0xfe,0xc1,0x81,0xbe,0x45,0xa5,0x29,0x94,0xd5,0xda,0xb1,0x7d,0x89, + 0xe7,0xe8,0xd8,0x27,0xfb,0x1d,0x55,0x2a,0x15,0x96,0xac,0x61,0x7d,0xb5,0x5a,0xaf, + 0xd6,0x1a,0xb5,0x7a,0x93,0xe5,0xd1,0x51,0xf5,0xb0,0x5c,0xd9,0xdf,0x67,0xc0,0xa5, + 0x71,0x16,0x67,0xe3,0x54,0xfc,0xc9,0xee,0xec,0xa6,0xa9,0x8f,0xad,0xb3,0x93,0x56, + 0xbb,0xd1,0x6c,0xd5,0x1b,0x8d,0x6a,0xad,0xce,0x29,0x38,0x95,0x4d,0x1b,0xd1,0x37, + 0xe5,0xd8,0x39,0x9e,0x36,0xe2,0x8c,0x6a,0x20,0xad,0x59,0x27,0x9a,0xb7,0xd,0xd8, + 0x47,0xb3,0x4f,0x84,0x3,0x83,0xe,0x64,0x75,0x32,0xdf,0x24,0xf1,0x81,0xb5,0x63, + 0x5d,0x4,0x14,0xa,0x3b,0x34,0x99,0xb6,0x6,0x2,0x30,0xd2,0xb1,0x5b,0xbf,0x7a, + 0x1c,0xac,0x6f,0x85,0x77,0xda,0x24,0xe,0x6a,0xd5,0x7a,0xad,0xd6,0xa8,0x56,0x1b, + 0xd8,0xb9,0x7c,0x28,0x2,0x60,0x10,0x73,0x60,0x41,0x8c,0xc7,0x9f,0xe5,0x32,0x47, + 0xeb,0x2b,0x41,0x10,0x40,0x69,0x42,0x0,0x84,0x41,0xaa,0x4d,0x5d,0xc6,0x90,0xd8, + 0x11,0xd3,0x62,0x62,0xec,0xc8,0x51,0x51,0x4d,0x64,0x7d,0x0,0x1,0xc0,0xac,0xef, + 0x30,0xa,0x8c,0x3,0xaa,0xc9,0xdf,0x6c,0xf5,0x3,0x77,0x36,0xc8,0xc0,0x1a,0x15, + 0x40,0x8b,0xf7,0x4a,0x92,0x40,0x59,0x9e,0x2e,0x13,0xcb,0xd0,0xc1,0xfd,0x29,0x78, + 0xad,0x33,0x20,0x2,0x34,0xb3,0xb5,0x6,0x1,0x18,0xb4,0x1e,0x29,0xe0,0x10,0x53, + 0x6,0x5,0xec,0x6,0x2,0xd8,0xad,0xd1,0x68,0xb5,0x4e,0x21,0xa0,0x1d,0x11,0xc0, + 0xfe,0x10,0xe0,0x13,0xa7,0x70,0x64,0x7d,0x47,0x1,0x3b,0x2e,0x50,0x40,0xf8,0x6e, + 0x69,0xb0,0x3e,0x47,0x25,0xa,0x60,0xbf,0x5f,0x47,0x1,0xba,0x76,0x13,0x87,0x20, + 0x45,0x1a,0x7d,0x95,0x10,0xe3,0xf2,0x36,0x52,0x40,0x24,0x0,0x11,0x50,0xc7,0xf7, + 0xf1,0xef,0x38,0x4,0x71,0x28,0x6,0xc3,0x20,0x58,0x91,0x33,0x89,0x0,0x45,0xb2, + 0x7a,0xdd,0x14,0x70,0x92,0x52,0x80,0x11,0x90,0x28,0x20,0x71,0x64,0x3,0x6,0x7d, + 0x45,0x80,0x99,0xff,0x95,0x2,0x9c,0x0,0x3b,0x50,0x13,0xd0,0x4d,0x3,0x5e,0xd6, + 0x8c,0x35,0x2b,0x40,0x21,0x8,0x6,0xb0,0x34,0x56,0x76,0x5,0xe8,0x8b,0x1b,0x18, + 0xde,0x9,0x88,0x18,0x60,0xbd,0x2b,0x80,0x10,0x54,0x67,0xe7,0x43,0xb,0x41,0x25, + 0x85,0xa0,0x24,0x7,0x60,0x65,0x76,0xb,0xa,0x38,0x3d,0x6b,0x34,0x4f,0xc3,0x77, + 0x3d,0x8e,0x13,0x5,0xc4,0x4,0xc8,0x91,0x43,0x4d,0x82,0x2,0x0,0x9b,0xd8,0x81, + 0x28,0x15,0x5b,0xdf,0x8,0xf0,0x3,0x91,0xce,0x2f,0x95,0x3,0x2c,0x9,0x4b,0x2, + 0x21,0x9,0x5b,0x8,0x92,0xb1,0xb0,0xb8,0xcc,0x1e,0x85,0x20,0x22,0xb8,0xac,0x6f, + 0x79,0xd8,0x42,0x50,0x92,0x84,0xf1,0x58,0xce,0x83,0x35,0x3c,0x4,0x55,0x14,0x82, + 0xe2,0x1c,0xd0,0x26,0x19,0x93,0x91,0x95,0x84,0xc3,0xd7,0x3d,0xa4,0x0,0xf7,0xf1, + 0x60,0xc7,0x37,0xd6,0xf7,0xad,0xb2,0xbf,0x20,0x2,0xec,0xa8,0x39,0x5,0x90,0x73, + 0xbc,0x9,0x9b,0xc1,0xfa,0x14,0xe0,0x49,0x38,0x15,0x82,0x62,0x5,0x18,0x7,0x89, + 0x2,0xd8,0x62,0xf4,0xa8,0x17,0x84,0x2,0x6a,0x4a,0xc2,0x41,0x1,0x9e,0x3,0xe2, + 0x24,0x2c,0x1e,0x51,0xc0,0x9,0xee,0xff,0x36,0x4,0xbd,0x52,0x0,0x15,0xf0,0x6a, + 0x0,0xe7,0x20,0x26,0xc0,0xec,0xcf,0xbe,0x8e,0xa0,0x0,0x23,0xc0,0xb2,0xb7,0xa5, + 0x7d,0x6f,0xc5,0x6,0xb0,0x46,0x2,0x52,0xcd,0x8e,0x1a,0x2c,0x87,0xd3,0x4c,0x63, + 0xec,0xe5,0xb6,0x37,0x21,0x28,0x22,0x5,0x4a,0x8e,0x8e,0x22,0x53,0x1e,0xe0,0xa8, + 0x1c,0x6d,0x2,0xb0,0x9e,0x4c,0x12,0xd0,0x2c,0xa9,0x7,0x70,0x94,0x17,0x8f,0x69, + 0x7e,0x78,0xd9,0xe7,0x37,0xeb,0xd3,0xd8,0xdf,0xe6,0x36,0x8b,0xec,0xb9,0x7d,0xf8, + 0x8,0xb7,0xbb,0x27,0xed,0x10,0xb5,0xa8,0xf5,0x26,0xad,0xf,0xd6,0x45,0xc0,0x5b, + 0xd0,0x30,0x1a,0x49,0x83,0x69,0x36,0xed,0xb7,0xbc,0xe0,0xf9,0xa0,0xe2,0x16,0x91, + 0xc5,0xc4,0x12,0x96,0x97,0x55,0x22,0x8b,0x98,0x23,0xeb,0x70,0x2f,0x76,0xf3,0x45, + 0x7d,0xdc,0xe4,0x54,0x3a,0x93,0xa7,0xf1,0x9a,0x4a,0x2d,0x55,0xf4,0x85,0x35,0xc1, + 0xbe,0x98,0xdf,0x3c,0x69,0x36,0xf5,0xad,0x76,0x44,0xc3,0x21,0x1c,0x88,0x67,0x70, + 0x1e,0xaf,0x5e,0x56,0xd8,0x10,0x1,0x66,0xc1,0x60,0x35,0xd4,0xa0,0xae,0x29,0x9d, + 0x7a,0x59,0x5f,0xce,0xeb,0x29,0xd4,0x3c,0xd6,0xb2,0x21,0xf9,0xb0,0x24,0x9f,0x8c, + 0x9,0xe0,0x78,0xde,0x0,0xf4,0x40,0x6c,0x27,0x4e,0x17,0x77,0xb,0x11,0x1,0x26, + 0x8,0xf,0x62,0xca,0x22,0x73,0xd6,0xf7,0x62,0x4,0x34,0x9b,0x7a,0x9a,0x40,0xb, + 0x26,0x9c,0x0,0xb4,0x81,0xa4,0x10,0xa9,0x55,0x30,0x33,0x6c,0x50,0x1,0xe1,0x1b, + 0x70,0xea,0x50,0x2a,0x2e,0xc8,0x6f,0xab,0x47,0x8a,0x1e,0xfe,0x8,0x15,0xd9,0x5f, + 0x2,0xb0,0xfe,0x48,0xa4,0x0,0x19,0x3d,0x3a,0x5c,0xa,0x50,0xf,0xb1,0xc0,0x79, + 0x48,0xcb,0x5,0x76,0x73,0x5,0xf8,0xa9,0xa4,0x0,0x2f,0x96,0x4b,0x54,0xa0,0x20, + 0xb2,0xbe,0xbb,0x3f,0x79,0x3b,0x56,0x0,0x75,0xc0,0x17,0x7e,0x65,0x5,0xc8,0x64, + 0xb2,0x9a,0x19,0xd1,0x96,0xb1,0x2,0xe,0x15,0xc9,0x89,0xe0,0x16,0x82,0xa2,0xa0, + 0x6c,0x21,0x8,0xa7,0x54,0x8,0x22,0x2e,0x8b,0x1,0x75,0x49,0xc4,0x80,0x1d,0x2f, + 0x2,0x78,0x31,0x11,0xcc,0x87,0x20,0x89,0xe9,0x4d,0x8,0x92,0xf5,0x45,0x80,0x5, + 0x21,0xb9,0x7f,0x2a,0x4,0xe9,0x8b,0x76,0xd4,0x81,0xba,0x48,0x1,0xa1,0xa2,0x56, + 0x36,0x8e,0xcd,0x29,0x80,0xe6,0xc5,0x56,0x8b,0x7b,0x46,0x1e,0x82,0xd0,0x80,0x99, + 0xdf,0x35,0xe0,0xc,0x58,0x2,0x96,0x4,0xc2,0xd1,0x46,0xa1,0xe2,0xf,0xeb,0x28, + 0xc5,0x62,0x12,0x82,0xec,0x54,0x84,0xa0,0x58,0x1,0x71,0x14,0xb2,0xf8,0x53,0x77, + 0x5,0x80,0xf9,0x10,0x74,0xa8,0x10,0x84,0xca,0xc2,0xf9,0x33,0xc2,0x6,0x73,0x40, + 0x14,0x82,0x2c,0x7,0xb8,0xd9,0x5c,0x1,0xf6,0xc0,0x23,0x4a,0x62,0x7f,0xf6,0x9a, + 0x4f,0xc2,0x1c,0xec,0x14,0x98,0x2,0x18,0x1d,0xb3,0x95,0xe,0x67,0x50,0x80,0x11, + 0xf0,0xc6,0xfa,0x73,0xa,0xc0,0xee,0x11,0x1,0xd6,0x73,0xad,0x1c,0x53,0x87,0xa0, + 0x80,0x4c,0xb1,0xc1,0x1c,0x90,0xf4,0x82,0xa2,0x14,0xe0,0xbd,0x20,0xb,0x41,0x51, + 0x16,0x16,0x3,0x44,0x21,0xef,0x1b,0x26,0x49,0xd8,0x39,0xb0,0x1c,0x10,0x14,0x30, + 0x9f,0x84,0x6d,0x28,0x17,0x5b,0x9f,0xe8,0x1f,0xd2,0x6f,0xf4,0x2f,0xe1,0x80,0xb1, + 0x1b,0xfb,0x28,0x4,0xb9,0x2,0xfe,0x39,0x4,0xfc,0xc,0x9e,0x9e,0x9e,0x66,0x33, + 0x3d,0xca,0x44,0xb7,0x2,0x86,0x83,0x6e,0xb7,0xd3,0xe9,0xd8,0xd,0x0,0xbb,0x7, + 0x10,0x97,0x7e,0xaf,0x3b,0xe8,0xf7,0x86,0x83,0xbe,0xee,0x41,0xda,0xed,0x17,0xa0, + 0xc7,0x9c,0xd8,0xf3,0x4d,0xfa,0xf6,0x2c,0x20,0x3d,0xe2,0x64,0x38,0xb8,0xb9,0xb9, + 0x1e,0x8f,0xef,0x67,0xb3,0xd9,0xf3,0x72,0x8f,0x26,0x5b,0x1f,0x3e,0x0,0x1,0x2f, + 0x76,0x4f,0x78,0x3a,0x9d,0xde,0xdf,0x41,0xc0,0x8,0x53,0x62,0xeb,0x4e,0xe7,0x42, + 0x4f,0x36,0x89,0x1e,0x6e,0x42,0x61,0xa5,0xd9,0xb7,0xeb,0xf,0xce,0xb1,0xbb,0xf0, + 0x58,0x5f,0xf,0x98,0x31,0xeb,0x77,0x7b,0x46,0x1b,0x4b,0xd6,0xd8,0x33,0x66,0x20, + 0x60,0xca,0x99,0xc3,0xc7,0x64,0x84,0x8f,0xa2,0x0,0x3d,0xa1,0xe8,0x4e,0xa,0x18, + 0xe1,0xe0,0x3e,0xb,0x28,0x2e,0xba,0x17,0x6f,0x6a,0xc0,0xb8,0xf6,0xf0,0xa2,0x5e, + 0x44,0xc0,0x95,0x31,0x60,0x4,0xe8,0xa1,0x58,0x1d,0xed,0xd6,0x33,0x2,0xae,0xf5, + 0x90,0x97,0x5c,0x1,0x4b,0x21,0x52,0x80,0x66,0x5,0x49,0x1,0xc3,0x3e,0x86,0x94, + 0xe3,0x47,0xbe,0x1f,0x68,0xe8,0x5e,0x48,0x1,0x44,0x21,0x53,0xc0,0xe8,0x6a,0x48, + 0x4,0xba,0xd2,0xe3,0xed,0x44,0x80,0x3d,0x5d,0xd,0x5,0x5c,0x44,0xa,0x18,0x8d, + 0xef,0xef,0x1f,0x66,0xd3,0x67,0x14,0xf0,0xc2,0x67,0x44,0x65,0xe3,0xf8,0x50,0x39, + 0xc0,0x42,0x90,0x2b,0xc0,0xe2,0x8f,0xcd,0x5,0x92,0x1a,0x34,0x2b,0x42,0xa,0x8, + 0x21,0x48,0x51,0x9e,0xd0,0x6f,0xf1,0xdf,0x14,0xa0,0xf8,0xdf,0xd,0x99,0xc3,0x8, + 0xb8,0x26,0x4,0x91,0x3,0xa6,0xb3,0xa7,0x5c,0x1,0xcb,0x20,0xe4,0x0,0x57,0x80, + 0xe7,0x80,0x48,0x1,0xf1,0x84,0x14,0xe5,0x80,0x10,0x82,0xa2,0x1c,0x20,0x9,0xb8, + 0x2,0x7a,0x8a,0x41,0xbd,0x4e,0xc7,0xf2,0x84,0x14,0x70,0x7d,0x8d,0x2,0x14,0x82, + 0xf2,0x1c,0xf0,0xb7,0xb0,0x10,0x64,0x39,0x20,0x4a,0xc2,0xd8,0xd1,0x8d,0x1e,0x4c, + 0x6f,0xee,0xef,0xc6,0xc5,0xd3,0x87,0x51,0xe,0xb8,0xe,0xa,0x90,0x4,0x48,0x1, + 0xf8,0xbe,0x72,0x40,0x92,0x84,0xc9,0x1,0xd3,0x3c,0x7,0xbc,0x86,0x86,0x5a,0x1a, + 0xaf,0xe9,0xe2,0xb3,0x8d,0x18,0x34,0x64,0xf3,0xb,0x67,0xac,0x64,0x64,0xc0,0x3e, + 0xf6,0x88,0x39,0x54,0xa1,0x29,0xd7,0x78,0x31,0xdc,0x4c,0x26,0xe3,0x89,0x4d,0xf2, + 0xb1,0x2,0x34,0xdb,0xc7,0xdf,0xc4,0x33,0xa8,0x6d,0x76,0xb4,0x66,0x4,0xb1,0x86, + 0xad,0x36,0x19,0x74,0xee,0x7b,0x51,0x99,0x60,0xeb,0x8,0xc0,0xc4,0xc,0xc4,0x30, + 0x3b,0x83,0x5b,0x86,0x4f,0xad,0x56,0xfb,0xfc,0xfc,0xd3,0xdb,0x72,0x7a,0x7a,0x76, + 0x72,0x72,0xca,0xf0,0xaa,0x56,0xab,0x1d,0x1f,0x6b,0x28,0xc7,0x28,0xe,0x92,0x9c, + 0x27,0x86,0x57,0xf1,0x8,0x6e,0xcb,0xb1,0x8d,0x4,0x94,0x4a,0x7b,0x10,0x70,0x7c, + 0x74,0x5c,0xaf,0x37,0x21,0x40,0xcf,0x5a,0x7c,0x53,0xda,0x6d,0x8,0xd0,0x75,0x5, + 0x8,0x60,0x38,0x5d,0x2e,0xeb,0x71,0x38,0xc,0x8c,0x19,0x1e,0xbb,0x50,0x40,0x38, + 0xe3,0x76,0x63,0xb,0x43,0x10,0xa,0xd8,0x2b,0x97,0xf,0x8f,0x83,0x2,0x4e,0x5f, + 0x3d,0x38,0xc9,0x4b,0xbb,0x7d,0xae,0x67,0x30,0x86,0x7b,0xc2,0xba,0xa3,0xe0,0xa, + 0x70,0x2,0x72,0x5,0xfc,0x38,0x12,0x5,0x68,0xa,0x8a,0x9e,0xc,0x7c,0x7e,0xa6, + 0x47,0x8d,0xbe,0x2a,0x89,0x2,0xa2,0x59,0x11,0xf1,0x85,0xa4,0x98,0x80,0xf,0xc1, + 0xc1,0x76,0xe6,0x0,0x11,0x80,0x59,0x17,0x2a,0x20,0xe4,0x80,0xaa,0x85,0x20,0x32, + 0x75,0x5a,0x1,0x16,0x81,0xf2,0x10,0xf4,0x43,0xc0,0x70,0xa6,0x0,0x85,0x20,0xcf, + 0x1,0xaf,0x7c,0xdf,0xb,0x49,0xd8,0x42,0x50,0x23,0x4a,0xc2,0x7a,0x8,0x66,0x9c, + 0x3,0xf2,0x10,0xf4,0xe3,0x80,0x0,0xef,0x5,0xfd,0x5d,0xe,0x88,0x93,0x70,0x98, + 0x9a,0xf8,0xaa,0x17,0x94,0x2b,0xe0,0x67,0xe0,0x1,0x1c,0x28,0x92,0x7c,0x17,0xc9, + 0x2c,0x95,0xf8,0x7e,0x80,0x3d,0x2f,0xb9,0x62,0x8f,0x84,0x35,0x32,0xa4,0x6,0x34, + 0x1,0x37,0x30,0x4,0x4f,0x36,0xad,0xfa,0x94,0x82,0xb0,0xd8,0x93,0xf5,0xec,0x3, + 0x55,0xe1,0x33,0x33,0xc2,0xc7,0x70,0x93,0xb7,0x80,0x3,0x3c,0x9d,0xa1,0x9a,0x11, + 0xa0,0xfb,0x61,0xb5,0x2a,0x4,0xd4,0x78,0x6f,0x63,0x2,0x45,0x24,0x8,0x80,0x9, + 0x36,0xeb,0x6e,0x59,0xbd,0xd1,0xb2,0xe7,0x51,0x12,0xbb,0x9a,0x27,0xba,0x2b,0x9, + 0x2f,0xec,0xb3,0xbb,0xa2,0xe7,0xaf,0xfe,0x30,0x3e,0x2c,0x1,0x7a,0xd8,0x67,0x69, + 0x7f,0x2f,0xdc,0x92,0xc4,0xf4,0xf8,0x38,0x3c,0x58,0x38,0xf2,0x79,0x57,0xea,0x11, + 0xa1,0x90,0x8a,0x66,0x94,0x2a,0x9a,0xd9,0x3,0x41,0xcf,0x28,0xcd,0xe6,0x9,0xa9, + 0x1b,0xad,0x30,0xd2,0x26,0x5c,0x85,0x33,0x66,0x84,0xf5,0x13,0x90,0xbe,0xd8,0xbb, + 0xa0,0x90,0x32,0xdf,0x53,0x8,0x4e,0xc5,0x12,0xa,0x90,0x8b,0x6b,0x7a,0x45,0x78, + 0x64,0x7b,0xad,0x12,0xcf,0xad,0x3b,0x8,0xa,0x80,0x1e,0xb6,0x12,0x76,0x9c,0x80, + 0x53,0x23,0x0,0xb9,0x88,0x80,0x83,0x37,0x21,0xe8,0x55,0xad,0x28,0x6b,0xc6,0x87, + 0xe,0x41,0xa5,0x54,0x8,0xd2,0xd4,0xd2,0x6a,0x98,0x68,0x44,0xe,0x8,0xa,0xc0, + 0xc7,0xe3,0x10,0x74,0xa2,0x5f,0x1b,0x39,0x6f,0x13,0x82,0x50,0x80,0x42,0x90,0x14, + 0x90,0x87,0xa0,0x1f,0x84,0x14,0x50,0x2c,0xbe,0x9,0x41,0x7a,0x30,0x7e,0x1c,0x82, + 0x22,0x5,0xcc,0x85,0x20,0x57,0x80,0x85,0x20,0xe5,0x80,0x7f,0x40,0x8,0x5a,0xf, + 0xe6,0x93,0x70,0x1c,0x82,0xc8,0x1,0x51,0x8,0xb2,0xc7,0xc,0x2b,0x42,0x95,0x23, + 0x5,0x48,0x2,0xe7,0x21,0x7,0x54,0xeb,0xa6,0x80,0x5f,0x25,0x9,0x7f,0xb3,0xe7, + 0x72,0x44,0xd7,0x87,0xfd,0x42,0xb0,0x5f,0x19,0x4e,0x17,0xff,0x3e,0x62,0xf8,0x3e, + 0xf4,0x4f,0x5e,0x7,0x56,0x17,0x15,0xe3,0x11,0x86,0x14,0x87,0xb0,0x33,0x36,0x2f, + 0x23,0x6,0xe8,0xc0,0xb2,0x56,0x4,0xdc,0x1f,0x4a,0xc8,0xcc,0x70,0x63,0x24,0x69, + 0x8a,0x3c,0xeb,0x5c,0x22,0x1c,0xd,0x91,0x9c,0x6d,0xf3,0xf5,0x8f,0xb1,0x2,0x2, + 0xe2,0x59,0xb,0xf1,0xd,0x93,0xe4,0x8e,0x55,0xaa,0xb0,0x92,0x4d,0xec,0xc0,0x6e, + 0xec,0xcc,0x21,0x1c,0x18,0x4e,0xb1,0xa,0x40,0x9,0xf1,0xc4,0x82,0x92,0x77,0xfc, + 0x1b,0xcd,0x66,0x8b,0xde,0x3f,0x16,0x37,0x67,0xa7,0xc3,0xf3,0xfd,0xe7,0x9d,0x67, + 0x5b,0xff,0xd5,0x28,0x80,0xda,0xcc,0x66,0xe1,0xa6,0xf9,0x70,0x30,0xa0,0xae,0x76, + 0xbb,0x76,0xae,0xb0,0x92,0x4d,0xec,0x60,0xb7,0xa2,0x26,0x1c,0x12,0xe,0x5e,0x11, + 0x8c,0x80,0x10,0x94,0xe2,0x91,0x57,0x3d,0xf9,0xd2,0xab,0xfc,0x9d,0xcc,0x11,0xf6, + 0x9e,0x47,0x86,0xf5,0x5f,0xd,0x1,0xc8,0x17,0xa7,0x8,0xf3,0x76,0x86,0x7d,0xbb, + 0xfb,0xfd,0xc6,0x83,0x3a,0x1d,0x36,0xa9,0x1,0xe6,0x41,0x1c,0x12,0xe,0x5e,0x11, + 0x9c,0x0,0x29,0x20,0x1a,0xfa,0xda,0x57,0x68,0x5c,0x1,0x65,0xa2,0x94,0xbe,0xf0, + 0xf4,0x5f,0x2e,0x10,0x65,0x58,0xff,0x95,0xfc,0x88,0xcf,0x2d,0x2d,0x2f,0xe8,0xc9, + 0x55,0x21,0x98,0x3e,0x3c,0x3e,0xd8,0xb3,0x94,0xf4,0x4c,0x9e,0xb8,0x4c,0xa6,0x13, + 0xd4,0x8e,0x9d,0xe8,0x7a,0x6b,0xc,0x85,0xa9,0xf6,0xf,0x92,0x98,0xf0,0x7d,0xcb, + 0x2c,0x1,0x1b,0x16,0x50,0x8,0x8,0xfe,0xe3,0x1a,0xfc,0xa5,0xaf,0xe6,0xec,0xea, + 0xb,0x49,0x74,0x8a,0x88,0xf8,0x10,0xe0,0x1d,0xd3,0x30,0x1f,0xdd,0xf,0x89,0xc0, + 0x81,0x7a,0x12,0x91,0xee,0x58,0xde,0xf8,0x7d,0xfc,0xfe,0xa0,0x4f,0xbb,0x5e,0xd5, + 0xff,0x56,0xf,0x6a,0x19,0xb1,0xf,0xef,0xc7,0xe3,0x31,0x22,0x20,0x1f,0xc0,0xb4, + 0x7a,0xc0,0xa9,0x42,0xa3,0xc2,0x79,0x53,0x1f,0xb1,0x0,0x2b,0xc,0x41,0x61,0xe2, + 0x94,0x62,0x28,0x9a,0xd5,0x6f,0xd3,0xcd,0x15,0x56,0x86,0x18,0x6a,0x77,0xc3,0xd7, + 0x18,0x82,0x62,0x5,0x34,0x14,0x82,0xc8,0xbf,0xde,0xe1,0x91,0x2,0x16,0x85,0xa0, + 0x6c,0xea,0xbf,0x2,0x2,0xa2,0x24,0x26,0x2f,0xa,0xd,0x98,0x9f,0xb5,0xe0,0x85, + 0x95,0xde,0x0,0x93,0xb0,0x62,0xe8,0x4a,0x92,0x58,0x8c,0x24,0x4,0x45,0x39,0xc0, + 0x93,0x30,0x39,0x40,0x4,0xe8,0x47,0x47,0x4a,0x89,0xe0,0x52,0xc8,0xb6,0xfe,0x2b, + 0x53,0x80,0x62,0xa8,0x27,0xb1,0x61,0x9f,0x8,0xfa,0xca,0x7d,0x28,0xac,0x64,0x93, + 0x1a,0x60,0x3f,0xfc,0xc7,0x21,0xe1,0xe0,0x15,0x1,0xe3,0x12,0x76,0x50,0x0,0xe6, + 0x36,0x2,0x1a,0x4a,0xc2,0x71,0xe,0xb0,0x5e,0xd0,0x2,0x5,0x64,0x55,0xff,0xad, + 0xf9,0x31,0xcf,0xe5,0x22,0xe6,0x52,0xf8,0xae,0x5f,0xbe,0x3d,0x7f,0xb4,0x1b,0x49, + 0xcb,0x4c,0x9c,0xcd,0x8f,0x79,0x6e,0xcd,0xcf,0xd9,0x66,0x47,0x0,0x1d,0x87,0x8f, + 0xf4,0x73,0xb6,0xc,0x8,0xd7,0xf2,0x83,0xce,0x99,0x12,0xe0,0xd,0xb1,0xe5,0xd6, + 0xff,0xa0,0x73,0xd4,0xd,0xd5,0x73,0xa7,0xec,0xe1,0x47,0xea,0x86,0x86,0x6d,0xb, + 0xf1,0x37,0x3f,0x69,0x9e,0x1d,0x1,0xe4,0xd2,0x74,0x73,0xec,0x75,0x8b,0x7f,0xd2, + 0xfc,0x31,0xff,0x51,0xff,0x14,0x74,0x5,0xca,0x1a,0xa2,0xef,0x6a,0x5a,0xa3,0x18, + 0x7c,0x84,0x6d,0x6b,0x22,0x40,0xe3,0x2c,0xfb,0x1,0x4,0xcd,0xca,0xb4,0x97,0x25, + 0xd5,0x5a,0xd8,0x29,0xd0,0x45,0xd9,0x13,0x92,0xe5,0x96,0x10,0xa0,0x76,0x78,0xa3, + 0xa2,0xa6,0xe9,0x57,0x81,0x96,0x0,0x71,0x55,0x37,0x1d,0xa2,0x5,0x2f,0xef,0xed, + 0x56,0xbc,0x9b,0x0,0xaa,0x6b,0xd7,0x2,0x6d,0xa1,0xe5,0xb2,0xd7,0x5,0xb1,0x35, + 0xa3,0x65,0x9b,0xae,0x10,0x2f,0x53,0xd7,0xe2,0xb3,0x23,0x0,0xcc,0xb7,0x48,0xcb, + 0x25,0xfb,0xf8,0x51,0x63,0x92,0x16,0xbd,0xd7,0xa5,0xde,0x4d,0xc0,0xba,0x90,0x29, + 0x1,0x6b,0xc1,0x72,0x2d,0x5a,0xcd,0x40,0x2c,0xc7,0xf,0x23,0x27,0x20,0x63,0xe4, + 0x4,0x64,0x8c,0xa5,0x73,0x40,0x8e,0xf5,0x20,0x57,0x40,0xc6,0xc8,0x9,0xc8,0x18, + 0x39,0x1,0x19,0x23,0x27,0x20,0x63,0xe4,0x4,0x64,0x8c,0x9c,0x80,0x8c,0x91,0x13, + 0x90,0x31,0x72,0x2,0x32,0x46,0x4e,0x40,0xc6,0xc8,0x9,0xc8,0x18,0x39,0x1,0x19, + 0x23,0x27,0x20,0x63,0xe4,0x4,0x64,0x8c,0x9c,0x80,0x4c,0xf1,0xdb,0x6f,0xff,0xf, + 0x6a,0xda,0x2d,0x85,0x79,0x3a,0xd1,0x86,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44, + 0xae,0x42,0x60,0x82, // C:/Projects/Emulator/virtualjaguar/res/homebrew-file.png 0x0,0x1,0x52,0x7a, 0x89, @@ -66466,6 +66820,11 @@ static const unsigned char qt_resource_name[] = { 0x0,0x73, 0x0,0x6b,0x0,0x75,0x0,0x6e,0x0,0x6b,0x0,0x62,0x0,0x6f,0x0,0x61,0x0,0x72,0x0,0x64,0x0,0x2d,0x0,0x66,0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x2e,0x0,0x70, 0x0,0x6e,0x0,0x67, + // Local.png + 0x0,0x9, + 0x9,0x7f,0xf1,0xe7, + 0x0,0x4c, + 0x0,0x6f,0x0,0x63,0x0,0x61,0x0,0x6c,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, // homebrew-file.png 0x0,0x11, 0xe,0x84,0x9e,0x27, @@ -66679,93 +67038,95 @@ static const unsigned char qt_resource_struct[] = { // : 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1, // :/res - 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x2c,0x0,0x0,0x0,0x2, + 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x2d,0x0,0x0,0x0,0x2, // :/res/power-on-red.png - 0x0,0x0,0x3,0x94,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0xc,0x89, + 0x0,0x0,0x3,0xac,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0x22,0x72, // :/res/upper-right.png - 0x0,0x0,0x1,0xa,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x1f,0x15, + 0x0,0x0,0x1,0x22,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x34,0xfe, // :/res/vj_title_small.png - 0x0,0x0,0x4,0xa8,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0xa8,0xd2, + 0x0,0x0,0x4,0xc0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0xbe,0xbb, // :/res/test-pattern.jpg 0x0,0x0,0x0,0x4c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x2,0xf1,0xae, // :/res/alpine-file.png 0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0, // :/res/help.html - 0x0,0x0,0x5,0x92,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xf,0xd3,0x76, + 0x0,0x0,0x5,0xaa,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xf,0xe9,0x5f, // :/res/test-pattern-pal.jpg - 0x0,0x0,0x3,0xd6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0x1e,0x24, + 0x0,0x0,0x3,0xee,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0x34,0xd, // :/res/tool-risc-dis.png - 0x0,0x0,0x1,0x70,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x3c,0x59, + 0x0,0x0,0x1,0x88,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x52,0x42, // :/res/fullscreen.png - 0x0,0x0,0x2,0xfe,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x8,0x64,0x5b, + 0x0,0x0,0x3,0x16,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x8,0x7a,0x44, // :/res/zoom200.png - 0x0,0x0,0x2,0xe2,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x8,0x5e,0xe2, + 0x0,0x0,0x2,0xfa,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x8,0x74,0xcb, // :/res/wrench.png - 0x0,0x0,0x5,0x3a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xf,0xb6,0x8, + 0x0,0x0,0x5,0x52,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xf,0xcb,0xf1, // :/res/tool-op.png - 0x0,0x0,0x5,0x76,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xf,0xd1,0x21, + 0x0,0x0,0x5,0x8e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xf,0xe7,0xa, // :/res/blur-on.png - 0x0,0x0,0x3,0xba,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0x1b,0x6e, + 0x0,0x0,0x3,0xd2,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0x31,0x57, // :/res/tool-68k-dis.png - 0x0,0x0,0x1,0x4a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x39,0x7a, + 0x0,0x0,0x1,0x62,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x4f,0x63, // :/res/upper-left.png - 0x0,0x0,0x5,0x54,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xf,0xcf,0x2c, + 0x0,0x0,0x5,0x6c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xf,0xe5,0x15, // :/res/tool-cpu.png - 0x0,0x0,0x1,0xd6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x49,0x9d, + 0x0,0x0,0x1,0xee,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x5f,0x86, // :/res/zoom100.png - 0x0,0x0,0x2,0x94,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x8,0x54,0xdf, + 0x0,0x0,0x2,0xac,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x8,0x6a,0xc8, // :/res/frame-advance.png - 0x0,0x0,0x0,0xe2,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x16,0xd9, + 0x0,0x0,0x0,0xfa,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x2c,0xc2, // :/res/power-on-green.png - 0x0,0x0,0x4,0x7e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0x99,0xac, + 0x0,0x0,0x4,0x96,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0xaf,0x95, // :/res/pal.png - 0x0,0x0,0x2,0xce,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x8,0x5b,0xea, + 0x0,0x0,0x2,0xe6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x8,0x71,0xd3, // :/res/unknown-file.png - 0x0,0x0,0x4,0xd2,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0xde,0xd1, + 0x0,0x0,0x4,0xea,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0xf4,0xba, // :/res/zoom300.png - 0x0,0x0,0x0,0xc6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x11,0x4a, + 0x0,0x0,0x0,0xde,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x27,0x33, // :/res/StepOver.png - 0x0,0x0,0x2,0x1a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0xc0,0x77, + 0x0,0x0,0x2,0x32,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0xd6,0x60, // :/res/software.png - 0x0,0x0,0x4,0x4,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0x7b,0x9d, + 0x0,0x0,0x4,0x1c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0x91,0x86, // :/res/Restart.png 0x0,0x0,0x0,0x30,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x2,0xe4,0x84, // :/res/generic.png - 0x0,0x0,0x2,0x5a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0xca,0x1b, + 0x0,0x0,0x2,0x72,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0xe0,0x4, // :/res/pause-off.png - 0x0,0x0,0x1,0xb6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x44,0x56, + 0x0,0x0,0x1,0xce,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x5a,0x3f, // :/res/blur-off.png - 0x0,0x0,0x2,0xb0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x8,0x59,0xb0, + 0x0,0x0,0x2,0xc8,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x8,0x6f,0x99, // :/res/label-blank.png - 0x0,0x0,0x5,0x16,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xf,0x4d,0x6c, + 0x0,0x0,0x5,0x2e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xf,0x63,0x55, // :/res/cart-blank.png - 0x0,0x0,0x3,0x72,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xa,0x69,0xff, + 0x0,0x0,0x3,0x8a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xa,0x7f,0xe8, // :/res/ELF-file.png - 0x0,0x0,0x2,0x76,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0xd0,0x18, + 0x0,0x0,0x2,0x8e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0xe6,0x1, + // :/res/Local.png + 0x0,0x0,0x0,0x9e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x5,0xbe,0xcc, // :/res/Watch.png - 0x0,0x0,0x4,0x22,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0x7c,0xa7, + 0x0,0x0,0x4,0x3a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0x92,0x90, // :/res/vj-icon.png - 0x0,0x0,0x1,0x2e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x21,0x25, + 0x0,0x0,0x1,0x46,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x37,0xe, // :/res/power-off.png - 0x0,0x0,0x4,0x3a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0x87,0xdc, + 0x0,0x0,0x4,0x52,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0x9d,0xc5, // :/res/tool-stack.png - 0x0,0x0,0x2,0x38,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0xc8,0x7d, + 0x0,0x0,0x2,0x50,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0xde,0x66, // :/res/ntsc.png - 0x0,0x0,0x3,0x5c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xa,0x67,0x23, + 0x0,0x0,0x3,0x74,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xa,0x7d,0xc, // :/res/compact-disc.png - 0x0,0x0,0x1,0xf4,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x4c,0x7, + 0x0,0x0,0x2,0xc,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x61,0xf0, // :/res/insert.png - 0x0,0x0,0x3,0x20,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x8,0x68,0x2a, + 0x0,0x0,0x3,0x38,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x8,0x7e,0x13, // :/res/tool-memory.png - 0x0,0x0,0x4,0x5a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0x96,0xf8, + 0x0,0x0,0x4,0x72,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xe,0xac,0xe1, // :/res/controller.png - 0x0,0x0,0x3,0x3a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x8,0x72,0xef, + 0x0,0x0,0x3,0x52,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x8,0x88,0xd8, // :/res/homebrew-file.png - 0x0,0x0,0x0,0x9e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x5,0xbe,0xcc, + 0x0,0x0,0x0,0xb6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x5,0xd4,0xb5, // :/res/pause-on.png - 0x0,0x0,0x1,0x98,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x3f,0x14, + 0x0,0x0,0x1,0xb0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x7,0x54,0xfd, // :/res/StepInto.png - 0x0,0x0,0x4,0xf8,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xf,0x47,0x0, + 0x0,0x0,0x5,0x10,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0xf,0x5c,0xe9, // :/res/skunkboard-file.png 0x0,0x0,0x0,0x72,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x3,0x20,0xe5, diff --git a/VS2015/virtualjaguar.vcxproj b/VS2015/virtualjaguar.vcxproj index 9c32923..43fc984 100644 --- a/VS2015/virtualjaguar.vcxproj +++ b/VS2015/virtualjaguar.vcxproj @@ -280,6 +280,7 @@ + @@ -315,6 +316,7 @@ + @@ -400,6 +402,24 @@ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\obj\moc_%(Filename).cpp" -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -D__GCCWIN32__ -DQT_NO_DEBUG -DQT_OPENGL_LIB -DNDEBUG -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -D_UNICODE "-I." "-I.\..\src" "-I.\..\src\gui" "-I.\obj" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include\QtOpenGL" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include\QtWidgets" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include\QtGui" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include\QtANGLE" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include\QtCore" "-Ic:\Qt\Qt5.5.1\msvc2015_64\mkspecs\win32-msvc2015" "-IC:\SDK\OpenGL\include" "-IC:\SDK\SDL\SDL-1.2.15\include" "-IC:\SDK\DWARF\libdwarf-VS2015\include" "-IC:\SDK\Elf\libelf-0.8.13-VS2015\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtOpenGL" "-IC:\SDK\zlib\zlib-1.2.8-VS2015\include" + + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing localbrowser.h... + .\obj\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\obj\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -D__GCCWIN32__ -DQT_OPENGL_ES_2 -DQT_OPENGL_ES_2_ANGLE -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_OPENGL_LIB "-I." "-I.\..\src" "-I.\..\src\gui" "-I.\obj" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtOpenGL" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtWidgets" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtGui" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtANGLE" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtCore" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\mkspecs\win32-msvc2015" "-IC:\SDK\SDL-1.2.15\include" "-IC:\SDK\mesa-11.2.0-rc4\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtOpenGL" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing localbrowser.h... + .\obj\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\obj\moc_%(Filename).cpp" -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -D__GCCWIN32__ -DQT_OPENGL_LIB -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -D_UNICODE "-I." "-I.\..\src" "-I.\..\src\gui" "-I.\obj" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include\QtOpenGL" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include\QtWidgets" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include\QtGui" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include\QtANGLE" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include\QtCore" "-Ic:\Qt\Qt5.5.1\msvc2015_64\mkspecs\win32-msvc2015" "-IC:\SDK\OpenGL\include" "-IC:\SDK\SDL\SDL-1.2.15\include" "-IC:\SDK\DWARF\libdwarf-VS2015\include" "-IC:\SDK\Elf\libelf-0.8.13-VS2015\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtOpenGL" "-IC:\SDK\zlib\zlib-1.2.8-VS2015\include" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing localbrowser.h... + .\obj\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\obj\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -D__GCCWIN32__ -DQT_NO_DEBUG -DQT_OPENGL_ES_2 -DQT_OPENGL_ES_2_ANGLE -DNDEBUG -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_OPENGL_LIB "-I." "-I.\..\src" "-I.\..\src\gui" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtOpenGL" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtWidgets" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtGui" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtANGLE" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtCore" "-I.\obj" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\mkspecs\win32-msvc2015" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtOpenGL" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing localbrowser.h... + .\obj\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\obj\moc_%(Filename).cpp" -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -D__GCCWIN32__ -DQT_NO_DEBUG -DQT_OPENGL_LIB -DNDEBUG -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -D_UNICODE "-I." "-I.\..\src" "-I.\..\src\gui" "-I.\obj" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include\QtOpenGL" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include\QtWidgets" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include\QtGui" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include\QtANGLE" "-Ic:\Qt\Qt5.5.1\msvc2015_64\include\QtCore" "-Ic:\Qt\Qt5.5.1\msvc2015_64\mkspecs\win32-msvc2015" "-IC:\SDK\OpenGL\include" "-IC:\SDK\SDL\SDL-1.2.15\include" "-IC:\SDK\DWARF\libdwarf-VS2015\include" "-IC:\SDK\Elf\libelf-0.8.13-VS2015\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtOpenGL" "-IC:\SDK\zlib\zlib-1.2.8-VS2015\include" + $(QTDIR)\bin\moc.exe;%(FullPath) @@ -1319,6 +1339,11 @@ endlocal true + + + true + + diff --git a/VS2015/virtualjaguar.vcxproj.filters b/VS2015/virtualjaguar.vcxproj.filters index a81331e..be8f25f 100644 --- a/VS2015/virtualjaguar.vcxproj.filters +++ b/VS2015/virtualjaguar.vcxproj.filters @@ -289,6 +289,12 @@ Source Files\gui\tab + + Generated Files + + + Source Files\debugger + @@ -497,6 +503,9 @@ Docs + + Resource Files + @@ -577,6 +586,9 @@ Header Files\gui\tab + + Header Files\debugger + diff --git a/VS2015/virtualjaguar.vcxproj.user b/VS2015/virtualjaguar.vcxproj.user index 57837dc..02f8cf4 100644 --- a/VS2015/virtualjaguar.vcxproj.user +++ b/VS2015/virtualjaguar.vcxproj.user @@ -7,7 +7,7 @@ PATH=$(QTDIR)\bin%3b$(PATH) C:\Qt\Qt5.5.1\msvc2015_64 - C:\Projects\quake2\JagCake\Debug\JagCake_Debug.elf + C:\Projects\Lib-M68K\Lib-Test-M68K\Debug\LibTestM68K_Debug.elf --debugger WindowsLocalDebugger $(OutDir) diff --git a/docs/vj_ReleaseNotes.txt b/docs/vj_ReleaseNotes.txt index 2a73b3b..42bea30 100644 --- a/docs/vj_ReleaseNotes.txt +++ b/docs/vj_ReleaseNotes.txt @@ -24,6 +24,7 @@ Release 3 (WiP) 15) Improved the .heap section detection to avoid a detection error -- Depend vlink version, .heap section may have an Alloc flag 16) Fixed a crash when DWARF information does references to missing source code files +17) Added a Local browser window for local variables Release 2 (3rd September 2017) ------------------------------ @@ -90,7 +91,7 @@ Known issues 2) The BPM (Breapoint) remains stuck on his address when user wants to continue the code execution -- Need to trace over the BPM or unset the BPM 3) To handle DWARF 2 issues with GCC, the code must be compiled with the -gdwarf-2 option -4) The Watch variables list may display not available (N/A) type information +4) The Local & Watch variables list may display not available (N/A) type information -- Such missing information may be included in future release 5) The 2MB mirroring is no longer applied in case of --dram-max option usage 6) Stack must reflect the --dram-max option usage otherwise the stack may be corrupted diff --git a/res/Local.png b/res/Local.png new file mode 100644 index 0000000..dd0b93c Binary files /dev/null and b/res/Local.png differ diff --git a/src/debugger/DBGManager.cpp b/src/debugger/DBGManager.cpp index 044bd03..cf2847c 100644 --- a/src/debugger/DBGManager.cpp +++ b/src/debugger/DBGManager.cpp @@ -25,10 +25,6 @@ #include "memory.h" -// -char *DBGManager_GetVariableValueFromAdr(uint32_t Adr, uint32_t TypeEncoding, uint32_t TypeByteSize); - - // struct Value { @@ -114,13 +110,28 @@ char *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error) } -// Get number of external variables +// Get number of local variables +// Return 0 if none has been found +size_t DBGManager_GetNbLocalVariables(size_t Adr) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return DWARFManager_GetNbLocalVariables(Adr); + } + else + { + return 0; + } +} + + +// Get number of global variables // Return 0 if none has been found -size_t DBGManager_GetNbExternalVariables(void) +size_t DBGManager_GetNbGlobalVariables(void) { if ((DBGType & DBG_ELFDWARF)) { - return DWARFManager_GetNbExternalVariables(); + return DWARFManager_GetNbGlobalVariables(); } else { @@ -143,14 +154,14 @@ size_t DBGManager_GetAdrFromSymbolName(char *SymbolName) } -// Get external variable's Address based on his Name +// Get global variable's Address based on his Name // Return found Address // Return NULL if no Address has been found -size_t DBGManager_GetExternalVariableAdrFromName(char *VariableName) +size_t DBGManager_GetGlobalVariableAdrFromName(char *VariableName) { if ((DBGType & DBG_ELFDWARF)) { - return DWARFManager_GetExternalVariableAdrFromName(VariableName); + return DWARFManager_GetGlobalVariableAdrFromName(VariableName); } else { @@ -159,12 +170,72 @@ size_t DBGManager_GetExternalVariableAdrFromName(char *VariableName) } +// Get local variable's type encoding based on his address and Index +// Return the type encoding found +// Return 0 if no type encoding has been found +size_t DBGManager_GetLocalVariableTypeEncoding(size_t Adr, size_t Index) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return DWARFManager_GetLocalVariableTypeEncoding(Adr, Index); + } + else + { + return 0; + } +} + + +// +int DBGManager_GetLocalVariableOffset(size_t Adr, size_t Index) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return DWARFManager_GetLocalVariableOffset(Adr, Index); + } + else + { + return 0; + } +} + + +// Get local variable's type byte size based on his address and Index +// Return the type's byte size found +// Return 0 if no type's byte size has been found +size_t DBGManager_GetLocalVariableTypeByteSize(size_t Adr, size_t Index) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return DWARFManager_GetLocalVariableTypeByteSize(Adr, Index); + } + else + { + return 0; + } +} + + +// +size_t DBGManager_GetLocalVariableTypeTag(size_t Adr, size_t Index) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return DWARFManager_GetLocalVariableTypeTag(Adr, Index); + } + else + { + return 0; + } +} + + // -size_t DBGManager_GetExternalVariableTypeTag(size_t Index) +size_t DBGManager_GetGlobalVariableTypeTag(size_t Index) { if ((DBGType & DBG_ELFDWARF)) { - return DWARFManager_GetExternalVariableTypeTag(Index); + return DWARFManager_GetGlobalVariableTypeTag(Index); } else { @@ -173,14 +244,14 @@ size_t DBGManager_GetExternalVariableTypeTag(size_t Index) } -// Get external variable's type name based on his Index +// Get global variable's type name based on his Index // Return type name's text pointer found // Return NULL if no type name has been found -char *DBGManager_GetExternalVariableTypeName(size_t Index) +char *DBGManager_GetGlobalVariableTypeName(size_t Index) { if ((DBGType & DBG_ELFDWARF)) { - return DWARFManager_GetExternalVariableTypeName(Index); + return DWARFManager_GetGlobalVariableTypeName(Index); } else { @@ -189,14 +260,14 @@ char *DBGManager_GetExternalVariableTypeName(size_t Index) } -// Get external variable's Address based on his Index +// Get global variable's Address based on his Index // Return the Address found // Return 0 if no Address has been found -size_t DBGManager_GetExternalVariableAdr(size_t Index) +size_t DBGManager_GetGlobalVariableAdr(size_t Index) { if ((DBGType & DBG_ELFDWARF)) { - return DWARFManager_GetExternalVariableAdr(Index); + return DWARFManager_GetGlobalVariableAdr(Index); } else { @@ -205,14 +276,14 @@ size_t DBGManager_GetExternalVariableAdr(size_t Index) } -// Get external variable's type byte size based on his Index +// Get global variable's type byte size based on his Index // Return the type's byte size found // Return 0 if no type's byte size has been found -size_t DBGManager_GetExternalVariableTypeByteSize(size_t Index) +size_t DBGManager_GetGlobalVariableTypeByteSize(size_t Index) { if ((DBGType & DBG_ELFDWARF)) { - return DWARFManager_GetExternalVariableTypeByteSize(Index); + return DWARFManager_GetGlobalVariableTypeByteSize(Index); } else { @@ -221,14 +292,14 @@ size_t DBGManager_GetExternalVariableTypeByteSize(size_t Index) } -// Get external variable's type encoding based on his Index +// Get global variable's type encoding based on his Index // Return the type encoding found // Return 0 if no type encoding has been found -size_t DBGManager_GetExternalVariableTypeEncoding(size_t Index) +size_t DBGManager_GetGlobalVariableTypeEncoding(size_t Index) { if ((DBGType & DBG_ELFDWARF)) { - return DWARFManager_GetExternalVariableTypeEncoding(Index); + return DWARFManager_GetGlobalVariableTypeEncoding(Index); } else { @@ -237,20 +308,20 @@ size_t DBGManager_GetExternalVariableTypeEncoding(size_t Index) } -// Get external variable value based on his Index +// Get global variable value based on his Index // Return value as a text pointer // Note: Pointer may point on a 0 lenght text -char *DBGManager_GetExternalVariableValue(size_t Index) +char *DBGManager_GetGlobalVariableValue(size_t Index) { - uint32_t Adr = 0; - uint32_t TypeEncoding = DBG_NO_TYPEENCODING; - uint32_t TypeByteSize = 0; + size_t Adr = 0; + size_t TypeEncoding = DBG_NO_TYPEENCODING; + size_t TypeByteSize = 0; if ((DBGType & DBG_ELFDWARF)) { - Adr = DWARFManager_GetExternalVariableAdr(Index); - TypeEncoding = DWARFManager_GetExternalVariableTypeEncoding(Index); - TypeByteSize = DWARFManager_GetExternalVariableTypeByteSize(Index); + Adr = DWARFManager_GetGlobalVariableAdr(Index); + TypeEncoding = DWARFManager_GetGlobalVariableTypeEncoding(Index); + TypeByteSize = DWARFManager_GetGlobalVariableTypeByteSize(Index); } return DBGManager_GetVariableValueFromAdr(Adr, TypeEncoding, TypeByteSize); @@ -260,7 +331,7 @@ char *DBGManager_GetExternalVariableValue(size_t Index) // Get variable value based on his Adresse, Encoding Type and Size // Return value as a text pointer // Note: Pointer may point on a 0 lenght text if Adress is NULL -char *DBGManager_GetVariableValueFromAdr(uint32_t Adr, uint32_t TypeEncoding, uint32_t TypeByteSize) +char *DBGManager_GetVariableValueFromAdr(size_t Adr, size_t TypeEncoding, size_t TypeByteSize) { Value V; char *Ptrvalue = value; @@ -277,7 +348,7 @@ char *DBGManager_GetVariableValueFromAdr(uint32_t Adr, uint32_t TypeEncoding, ui jaguarMainRAM[Adr + TypeByteSize - 1] = 0x10; #endif #if 1 - for (uint32_t i = 0, j = TypeByteSize; i < TypeByteSize; i++, j--) + for (size_t i = 0, j = TypeByteSize; i < TypeByteSize; i++, j--) { V.C[i] = jaguarMainRAM[Adr + j - 1]; } @@ -370,14 +441,78 @@ char *DBGManager_GetVariableValueFromAdr(uint32_t Adr, uint32_t TypeEncoding, ui } -// Get external variable name based on his Index +// Get local variable's type name based on his Index +// Return type name's text pointer found +// Return NULL if no type name has been found +char *DBGManager_GetLocalVariableTypeName(size_t Adr, size_t Index) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return DWARFManager_GetLocalVariableTypeName(Adr, Index); + } + else + { + return NULL; + } +} + + +// Get local variable Op based on his Index +// Return variable Op's found +// Return 0 if no variable Op has been found +size_t DBGManager_GetLocalVariableOp(size_t Adr, size_t Index) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return DWARFManager_GetLocalVariableOp(Adr, Index); + } + else + { + return 0; + } +} + + +// Get local variable name based on his Index +// Return variable name's text pointer found +// Return NULL if no variable name has been found +char *DBGManager_GetLocalVariableName(size_t Adr, size_t Index) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return DWARFManager_GetLocalVariableName(Adr, Index); + } + else + { + return NULL; + } +} + + +// Get global variable name based on his Index // Return variable name's text pointer found // Return NULL if no variable name has been found -char *DBGManager_GetExternalVariableName(size_t Index) +char *DBGManager_GetGlobalVariableName(size_t Index) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return DWARFManager_GetGlobalVariableName(Index); + } + else + { + return NULL; + } +} + + +// Get function name from address +// Return function name found +// Return NULL if no function name has been found +char *DBGManager_GetFunctionName(size_t Adr) { if ((DBGType & DBG_ELFDWARF)) { - return DWARFManager_GetExternalVariableName(Index); + return DWARFManager_GetFunctionName(Adr); } else { @@ -405,7 +540,7 @@ size_t DBGManager_GetNumLineFromAdr(size_t Adr, size_t Tag) // Get symbol name from address // Return text pointer on the symbol name found // Return NULL if no symbol name has been found -char *DBGManager_GetSymbolnameFromAdr(size_t Adr) +char *DBGManager_GetSymbolNameFromAdr(size_t Adr) { char *Symbolname; diff --git a/src/debugger/DBGManager.h b/src/debugger/DBGManager.h index 87e0900..e671e27 100644 --- a/src/debugger/DBGManager.h +++ b/src/debugger/DBGManager.h @@ -23,6 +23,16 @@ typedef enum { DBG_END_TAG }DBGTAG; +// +typedef enum { + DBG_TAG_TYPE_structure = 0x1, + DBG_TAG_TYPE_pointer = 0x2, + DBG_TAG_TYPE_subrange = 0x4, + DBG_TAG_TYPE_array = 0x8, + DBG_TAG_TYPE_const = 0x10, + DBG_TAG_TYPE_typedef = 0x20 +}DBGTAGTYPE; + // Encoding based in the DW_ATE_... list from the dwarf.h // Except for the DBG_ATE_ptr typedef enum { @@ -46,6 +56,167 @@ typedef enum { DBG_END_TYPEENCODING }DBGTYPEENCODING; +// Encoding based in the DW_OP_... list from the dwarf.h +typedef enum { + DBG_NO_OP, + DBG_OP_addr = 0x03, + DBG_OP_deref = 0x06, + DBG_OP_const1u = 0x08, + DBG_OP_const1s = 0x09, + DBG_OP_const2u = 0x0a, + DBG_OP_const2s = 0x0b, + DBG_OP_const4u = 0x0c, + DBG_OP_const4s = 0x0d, + DBG_OP_const8u = 0x0e, + DBG_OP_const8s = 0x0f, + DBG_OP_constu = 0x10, + DBG_OP_consts = 0x11, + DBG_OP_dup = 0x12, + DBG_OP_drop = 0x13, + DBG_OP_over = 0x14, + DBG_OP_pick = 0x15, + DBG_OP_swap = 0x16, + DBG_OP_rot = 0x17, + DBG_OP_xderef = 0x18, + DBG_OP_abs = 0x19, + DBG_OP_and = 0x1a, + DBG_OP_div = 0x1b, + DBG_OP_minus = 0x1c, + DBG_OP_mod = 0x1d, + DBG_OP_mul = 0x1e, + DBG_OP_neg = 0x1f, + DBG_OP_not = 0x20, + DBG_OP_or = 0x21, + DBG_OP_plus = 0x22, + DBG_OP_plus_uconst = 0x23, + DBG_OP_shl = 0x24, + DBG_OP_shr = 0x25, + DBG_OP_shra = 0x26, + DBG_OP_xor = 0x27, + DBG_OP_bra = 0x28, + DBG_OP_eq = 0x29, + DBG_OP_ge = 0x2a, + DBG_OP_gt = 0x2b, + DBG_OP_le = 0x2c, + DBG_OP_lt = 0x2d, + DBG_OP_ne = 0x2e, + DBG_OP_skip = 0x2f, + DBG_OP_lit0 = 0x30, + DBG_OP_lit1 = 0x31, + DBG_OP_lit2 = 0x32, + DBG_OP_lit3 = 0x33, + DBG_OP_lit4 = 0x34, + DBG_OP_lit5 = 0x35, + DBG_OP_lit6 = 0x36, + DBG_OP_lit7 = 0x37, + DBG_OP_lit8 = 0x38, + DBG_OP_lit9 = 0x39, + DBG_OP_lit10 = 0x3a, + DBG_OP_lit11 = 0x3b, + DBG_OP_lit12 = 0x3c, + DBG_OP_lit13 = 0x3d, + DBG_OP_lit14 = 0x3e, + DBG_OP_lit15 = 0x3f, + DBG_OP_lit16 = 0x40, + DBG_OP_lit17 = 0x41, + DBG_OP_lit18 = 0x42, + DBG_OP_lit19 = 0x43, + DBG_OP_lit20 = 0x44, + DBG_OP_lit21 = 0x45, + DBG_OP_lit22 = 0x46, + DBG_OP_lit23 = 0x47, + DBG_OP_lit24 = 0x48, + DBG_OP_lit25 = 0x49, + DBG_OP_lit26 = 0x4a, + DBG_OP_lit27 = 0x4b, + DBG_OP_lit28 = 0x4c, + DBG_OP_lit29 = 0x4d, + DBG_OP_lit30 = 0x4e, + DBG_OP_lit31 = 0x4f, + DBG_OP_reg0 = 0x50, + DBG_OP_reg1 = 0x51, + DBG_OP_reg2 = 0x52, + DBG_OP_reg3 = 0x53, + DBG_OP_reg4 = 0x54, + DBG_OP_reg5 = 0x55, + DBG_OP_reg6 = 0x56, + DBG_OP_reg7 = 0x57, + DBG_OP_reg8 = 0x58, + DBG_OP_reg9 = 0x59, + DBG_OP_reg10 = 0x5a, + DBG_OP_reg11 = 0x5b, + DBG_OP_reg12 = 0x5c, + DBG_OP_reg13 = 0x5d, + DBG_OP_reg14 = 0x5e, + DBG_OP_reg15 = 0x5f, + DBG_OP_reg16 = 0x60, + DBG_OP_reg17 = 0x61, + DBG_OP_reg18 = 0x62, + DBG_OP_reg19 = 0x63, + DBG_OP_reg20 = 0x64, + DBG_OP_reg21 = 0x65, + DBG_OP_reg22 = 0x66, + DBG_OP_reg23 = 0x67, + DBG_OP_reg24 = 0x68, + DBG_OP_reg25 = 0x69, + DBG_OP_reg26 = 0x6a, + DBG_OP_reg27 = 0x6b, + DBG_OP_reg28 = 0x6c, + DBG_OP_reg29 = 0x6d, + DBG_OP_reg30 = 0x6e, + DBG_OP_reg31 = 0x6f, + DBG_OP_breg0 = 0x70, + DBG_OP_breg1 = 0x71, + DBG_OP_breg2 = 0x72, + DBG_OP_breg3 = 0x73, + DBG_OP_breg4 = 0x74, + DBG_OP_breg5 = 0x75, + DBG_OP_breg6 = 0x76, + DBG_OP_breg7 = 0x77, + DBG_OP_breg8 = 0x78, + DBG_OP_breg9 = 0x79, + DBG_OP_breg10 = 0x7a, + DBG_OP_breg11 = 0x7b, + DBG_OP_breg12 = 0x7c, + DBG_OP_breg13 = 0x7d, + DBG_OP_breg14 = 0x7e, + DBG_OP_breg15 = 0x7f, + DBG_OP_breg16 = 0x80, + DBG_OP_breg17 = 0x81, + DBG_OP_breg18 = 0x82, + DBG_OP_breg19 = 0x83, + DBG_OP_breg20 = 0x84, + DBG_OP_breg21 = 0x85, + DBG_OP_breg22 = 0x86, + DBG_OP_breg23 = 0x87, + DBG_OP_breg24 = 0x88, + DBG_OP_breg25 = 0x89, + DBG_OP_breg26 = 0x8a, + DBG_OP_breg27 = 0x8b, + DBG_OP_breg28 = 0x8c, + DBG_OP_breg29 = 0x8d, + DBG_OP_breg30 = 0x8e, + DBG_OP_breg31 = 0x8f, + DBG_OP_regx = 0x90, + DBG_OP_fbreg = 0x91, + DBG_OP_bregx = 0x92, + DBG_OP_piece = 0x93, + DBG_OP_deref_size = 0x94, + DBG_OP_xderef_size = 0x95, + DBG_OP_nop = 0x96, + DBG_OP_push_object_address = 0x97, /* DWARF3 */ + DBG_OP_call2 = 0x98, /* DWARF3 */ + DBG_OP_call4 = 0x99, /* DWARF3 */ + DBG_OP_call_ref = 0x9a, /* DWARF3 */ + DBG_OP_form_tls_address = 0x9b, /* DWARF3f */ + DBG_OP_call_frame_cfa = 0x9c, /* DWARF3f */ + DBG_OP_bit_piece = 0x9d, /* DWARF3f */ + DBG_OP_implicit_value = 0x9e, /* DWARF4 */ + DBG_OP_stack_value = 0x9f, /* DWARF4 */ + DBG_END_OP +} +DBGOP; + // extern void DBGManager_Init(void); @@ -54,24 +225,36 @@ extern void DBGManager_Reset(void); extern void DBGManager_Close(void); // -extern char *DBGManager_GetSymbolnameFromAdr(size_t Adr); +extern char *DBGManager_GetSymbolNameFromAdr(size_t Adr); extern char *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error); extern size_t DBGManager_GetNumLineFromAdr(size_t Adr, size_t Tag); extern char *DBGManager_GetLineSrcFromAdr(size_t Adr, size_t Tag); extern char *DBGManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine); extern char *DBGManager_GetLineSrcFromNumLineBaseAdr(size_t Adr, size_t NumLine); - -// External variables manager -extern size_t DBGManager_GetNbExternalVariables(void); -extern char *DBGManager_GetExternalVariableName(size_t Index); -extern size_t DBGManager_GetExternalVariableTypeEncoding(size_t Index); -extern char *DBGManager_GetExternalVariableTypeName(size_t Index); -extern size_t DBGManager_GetExternalVariableTypeByteSize(size_t Index); -extern size_t DBGManager_GetExternalVariableAdr(size_t Index); -extern size_t DBGManager_GetExternalVariableAdrFromName(char *VariableName); extern size_t DBGManager_GetAdrFromSymbolName(char *SymbolName); -extern char *DBGManager_GetExternalVariableValue(size_t Index); -extern size_t DBGManager_GetExternalVariableTypeTag(size_t Index); +extern char *DBGManager_GetFunctionName(size_t Adr); +extern char *DBGManager_GetVariableValueFromAdr(size_t Adr, size_t TypeEncoding, size_t TypeByteSize); + +// Global variables manager +extern size_t DBGManager_GetNbGlobalVariables(void); +extern char *DBGManager_GetGlobalVariableName(size_t Index); +extern size_t DBGManager_GetGlobalVariableTypeEncoding(size_t Index); +extern char *DBGManager_GetGlobalVariableTypeName(size_t Index); +extern size_t DBGManager_GetGlobalVariableTypeByteSize(size_t Index); +extern size_t DBGManager_GetGlobalVariableAdr(size_t Index); +extern size_t DBGManager_GetGlobalVariableAdrFromName(char *VariableName); +extern char *DBGManager_GetGlobalVariableValue(size_t Index); +extern size_t DBGManager_GetGlobalVariableTypeTag(size_t Index); + +// Local variables manager +extern size_t DBGManager_GetNbLocalVariables(size_t Adr); +extern char *DBGManager_GetLocalVariableName(size_t Adr, size_t Index); +extern size_t DBGManager_GetLocalVariableTypeEncoding(size_t Adr, size_t Index); +extern char *DBGManager_GetLocalVariableTypeName(size_t Adr, size_t Index); +extern size_t DBGManager_GetLocalVariableTypeByteSize(size_t Adr, size_t Index); +extern size_t DBGManager_GetLocalVariableTypeTag(size_t Adr, size_t Index); +extern size_t DBGManager_GetLocalVariableOp(size_t Adr, size_t Index); +extern int DBGManager_GetLocalVariableOffset(size_t Adr, size_t Index); #endif // __DBGMANAGER_H__ diff --git a/src/debugger/DWARFManager.cpp b/src/debugger/DWARFManager.cpp index 573292c..16e096a 100644 --- a/src/debugger/DWARFManager.cpp +++ b/src/debugger/DWARFManager.cpp @@ -21,6 +21,7 @@ // //#define DEBUG_NumCU 0x6 // CU number to debug or undefine it +//#define DEBUG_VariableName "argc" // Variable name to look for or undefine it // Source line internal structure @@ -46,7 +47,12 @@ struct BaseTypeStruct // Variables internal structure struct VariablesStruct { - size_t Addr; // Variable memory address + size_t Op; // Variable's DW_OP + union + { + size_t Addr; // Variable memory address + int Offset; // Variable stack offset (signed) + }; char *PtrName; // Variable's name size_t TypeOffset; // Offset pointing on the Variable's Type size_t TypeByteSize; // Variable's Type byte size @@ -62,10 +68,13 @@ struct SubProgStruct size_t NumLineSrc; size_t StartPC; size_t LowPC, HighPC; + size_t FrameBase; char *PtrLineSrc; - char *PtrSubprogramName; - size_t NbLinesSrc; - DMIStruct_LineSrc *PtrLinesSrc; + char *PtrSubprogramName; // Sub program name + size_t NbLinesSrc; // Number of lines source used by the sub program + DMIStruct_LineSrc *PtrLinesSrc; // Pointer of the lines source for the sub program + size_t NbVariables; // Variables number + VariablesStruct *PtrVariables; // Pointer to the local variables list information structure }S_SubProgStruct; // Compilation Unit internal structure @@ -84,7 +93,7 @@ struct CUStruct size_t NbTypes; BaseTypeStruct *PtrTypes; size_t NbVariables; // Variables number - VariablesStruct *PtrVariables; // Pointer to the variables list information structure + VariablesStruct *PtrVariables; // Pointer to the global variables list information structure }S_CUStruct; @@ -103,6 +112,7 @@ void DWARFManager_InitDMI(void); void DWARFManager_CloseDMI(void); bool DWARFManager_ElfClose(void); char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile, size_t NumLine); +void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables); // @@ -186,6 +196,13 @@ void DWARFManager_CloseDMI(void) while (PtrCU[NbCU].NbSubProgs--) { + while (PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables--) + { + free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrName); + free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrTypeName); + } + free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables); + free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc); free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName); } @@ -220,11 +237,11 @@ void DWARFManager_InitDMI(void) Dwarf_Addr return_lowpc, return_highpc, return_lineaddr; Dwarf_Block *return_block; Dwarf_Signed atcnt, cnt; - Dwarf_Die return_sib, return_die; + Dwarf_Die return_sib, return_die, return_sub, return_subdie; Dwarf_Off return_offset; Dwarf_Line *linebuf; FILE *SrcFile; - size_t i, j, k, TypeOffset; + size_t i, j, k; char *return_string; char *Ptr; char *SourceFilename = NULL; @@ -380,6 +397,7 @@ void DWARFManager_InitDMI(void) { } + // Check if the CU has child if (dwarf_child(return_sib, &return_die, &error) == DW_DLV_OK) { do @@ -409,9 +427,16 @@ void DWARFManager_InitDMI(void) case DW_AT_location: if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK) { - if (return_block->bl_len == 5) + PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].Op = (*((unsigned char *)(return_block->bl_data))); + + switch (return_block->bl_len) { + case 5: PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].Addr = (*((unsigned char *)(return_block->bl_data) + 1) << 24) + (*((unsigned char *)(return_block->bl_data) + 2) << 16) + (*((unsigned char *)(return_block->bl_data) + 3) << 8) + (*((unsigned char *)(return_block->bl_data) + 4)); + break; + + default: + break; } dwarf_dealloc(dbg, return_block, DW_DLA_BLOCK); } @@ -427,9 +452,14 @@ void DWARFManager_InitDMI(void) case DW_AT_name: if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK) { - PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName = (char *)calloc(strlen(return_string) + 1, 1); - strcpy(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName, return_string); - dwarf_dealloc(dbg, return_string, DW_DLA_STRING); +#ifdef DEBUG_VariableName + if (!strcmp(return_string, DEBUG_VariableName)) +#endif + { + PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName = (char *)calloc(strlen(return_string) + 1, 1); + strcpy(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName, return_string); + dwarf_dealloc(dbg, return_string, DW_DLA_STRING); + } } break; @@ -535,7 +565,7 @@ void DWARFManager_InitDMI(void) { switch (return_attr) { - case DW_AT_low_pc: + case DW_AT_low_pc: if (dwarf_lowpc(return_die, &return_lowpc, &error) == DW_DLV_OK) { PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].StartPC = return_lowpc; @@ -543,21 +573,28 @@ void DWARFManager_InitDMI(void) } break; - case DW_AT_high_pc: + case DW_AT_high_pc: if (dwarf_highpc(return_die, &return_highpc, &error) == DW_DLV_OK) { PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].HighPC = return_highpc; } break; - case DW_AT_decl_line: + case DW_AT_decl_line: if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK) { PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NumLineSrc = return_uvalue; } break; - case DW_AT_name: + case DW_AT_frame_base: + if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].FrameBase = return_uvalue; + } + break; + + case DW_AT_name: if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK) { PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName = (char *)calloc(strlen(return_string) + 1, 1); @@ -593,6 +630,103 @@ void DWARFManager_InitDMI(void) } } + if (dwarf_child(return_die, &return_subdie, &error) == DW_DLV_OK) + { + do + { + return_sub = return_subdie; + if ((dwarf_tag(return_subdie, &return_tagval, &error) == DW_DLV_OK)) + { + switch (return_tagval) + { + case DW_TAG_formal_parameter: + case DW_TAG_variable: + if (dwarf_attrlist(return_subdie, &atlist, &atcnt, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables = (VariablesStruct *)realloc(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables, ((PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables + 1) * sizeof(VariablesStruct))); + memset(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables, 0, sizeof(VariablesStruct)); + + for (Dwarf_Signed i = 0; i < atcnt; ++i) + { + if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK) + { + if (dwarf_attr(return_subdie, return_attr, &return_attr1, &error) == DW_DLV_OK) + { + switch (return_attr) + { + case DW_AT_location: + if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].Op = *((unsigned char *)(return_block->bl_data)); + + switch (return_block->bl_len) + { + case 1: + break; + + case 2: + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].Offset = *((char *)(return_block->bl_data) + 1); + + if (return_tagval == DW_TAG_variable) + { + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].Offset -= 0x80; + } + break; + + default: + break; + } + dwarf_dealloc(dbg, return_block, DW_DLA_BLOCK); + } + break; + + case DW_AT_type: + if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK) + { + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].TypeOffset = return_offset; + } + break; + + case DW_AT_name: + if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK) + { +#ifdef DEBUG_VariableName + if (!strcmp(return_string, DEBUG_VariableName)) +#endif + { + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrName = (char *)calloc(strlen(return_string) + 1, 1); + strcpy(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrName, return_string); + dwarf_dealloc(dbg, return_string, DW_DLA_STRING); + } + } + break; + + default: + break; + } + } + } + + dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR); + } + + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables++; + + dwarf_dealloc(dbg, atlist, DW_DLA_LIST); + } + break; + + case DW_TAG_label: + break; + + default: + break; + } + } + } + while (dwarf_siblingof(dbg, return_sub, &return_subdie, &error) == DW_DLV_OK); + } + PtrCU[NbCU].NbSubProgs++; } break; @@ -601,7 +735,8 @@ void DWARFManager_InitDMI(void) break; } } - } while (dwarf_siblingof(dbg, return_sib, &return_die, &error) == DW_DLV_OK); + } + while (dwarf_siblingof(dbg, return_sib, &return_die, &error) == DW_DLV_OK); } // Release the memory used by the source lines @@ -703,98 +838,18 @@ void DWARFManager_InitDMI(void) } } - // Init variables information based on types information + // Init global variables information based on types information for (i = 0; i < PtrCU[NbCU].NbVariables; i++) { - PtrCU[NbCU].PtrVariables[i].PtrTypeName = (char *)calloc(1000, 1); - TypeOffset = PtrCU[NbCU].PtrVariables[i].TypeOffset; + DWARFManager_InitInfosVariable(PtrCU[NbCU].PtrVariables + i); + } - for (j = 0; j < PtrCU[NbCU].NbTypes; j++) + // Init local variables information based on types information + for (i = 0; i < PtrCU[NbCU].NbSubProgs; i++) + { + for (j = 0; j < PtrCU[NbCU].PtrSubProgs[i].NbVariables; j++) { - if (TypeOffset == PtrCU[NbCU].PtrTypes[j].Offset) - { - switch (PtrCU[NbCU].PtrTypes[j].Tag) - { - case DW_TAG_structure_type: - PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x1; - if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) - { - j = -1; - } - else - { - if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x2)) - { - strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, " *"); - } - } - break; - - case DW_TAG_pointer_type: - PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x2; - PtrCU[NbCU].PtrVariables[i].TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize; - PtrCU[NbCU].PtrVariables[i].TypeEncoding = 0x10; - if (!(TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) - { - strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "void *"); - } - else - { - j = -1; - } - break; - - case DW_TAG_typedef: - PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x20; - strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName); - if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) - { - j = -1; - } - break; - - case DW_TAG_subrange_type: - PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x4; - break; - - case DW_TAG_array_type: - PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x8; - if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) - { - j = -1; - } - break; - - case DW_TAG_const_type: - PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x10; - strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "const "); - if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) - { - j = -1; - } - break; - - case DW_TAG_base_type: - strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName); - if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x2)) - { - strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, " *"); - } - else - { - PtrCU[NbCU].PtrVariables[i].TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize; - PtrCU[NbCU].PtrVariables[i].TypeEncoding = PtrCU[NbCU].PtrTypes[j].Encoding; - } - if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x8)) - { - strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "[]"); - } - break; - - default: - break; - } - } + DWARFManager_InitInfosVariable(PtrCU[NbCU].PtrSubProgs[i].PtrVariables + j); } } } @@ -809,6 +864,104 @@ void DWARFManager_InitDMI(void) } +// +void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables) +{ + size_t j, TypeOffset; + + PtrVariables->PtrTypeName = (char *)calloc(1000, 1); + TypeOffset = PtrVariables->TypeOffset; + + for (j = 0; j < PtrCU[NbCU].NbTypes; j++) + { + if (TypeOffset == PtrCU[NbCU].PtrTypes[j].Offset) + { + switch (PtrCU[NbCU].PtrTypes[j].Tag) + { + case DW_TAG_structure_type: + PtrVariables->TypeTag |= 0x1; + if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) + { + j = -1; + } + else + { + if ((PtrVariables->TypeTag & 0x2)) + { + strcat(PtrVariables->PtrTypeName, " *"); + } + } + break; + + case DW_TAG_pointer_type: + PtrVariables->TypeTag |= 0x2; + PtrVariables->TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize; + PtrVariables->TypeEncoding = 0x10; + if (!(TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) + { + strcat(PtrVariables->PtrTypeName, "void *"); + } + else + { + j = -1; + } + break; + + case DW_TAG_typedef: + PtrVariables->TypeTag |= 0x20; + strcat(PtrVariables->PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName); + if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) + { + j = -1; + } + break; + + case DW_TAG_subrange_type: + PtrVariables->TypeTag |= 0x4; + break; + + case DW_TAG_array_type: + PtrVariables->TypeTag |= 0x8; + if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) + { + j = -1; + } + break; + + case DW_TAG_const_type: + PtrVariables->TypeTag |= 0x10; + strcat(PtrVariables->PtrTypeName, "const "); + if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset)) + { + j = -1; + } + break; + + case DW_TAG_base_type: + strcat(PtrVariables->PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName); + if ((PtrVariables->TypeTag & 0x2)) + { + strcat(PtrVariables->PtrTypeName, " *"); + } + else + { + PtrVariables->TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize; + PtrVariables->TypeEncoding = PtrCU[NbCU].PtrTypes[j].Encoding; + } + if ((PtrVariables->TypeTag & 0x8)) + { + strcat(PtrVariables->PtrTypeName, "[]"); + } + break; + + default: + break; + } + } + } +} + + // Get symbol name based from address // Return NULL if no symbol name exists char *DWARFManager_GetSymbolnameFromAdr(size_t Adr) @@ -874,9 +1027,204 @@ char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile, size_t NumLine) } -// Get Compilation Unit / External variables numbers +// Get number of variables referenced by the function range address +size_t DWARFManager_GetNbLocalVariables(size_t Adr) +{ + size_t i, j; + + for (i = 0; i < NbCU; i++) + { + if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) + { + for (j = 0; j < PtrCU[i].NbSubProgs; j++) + { + if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) + { + return PtrCU[i].PtrSubProgs[j].NbVariables; + } + } + } + } + + return 0; +} + + +// Get local variable name based on his index (starting by 1) +// Return name's pointer text found +// Return NULL if not found +char *DWARFManager_GetLocalVariableName(size_t Adr, size_t Index) +{ + size_t i, j; + + for (i = 0; i < NbCU; i++) + { + if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) + { + for (j = 0; j < PtrCU[i].NbSubProgs; j++) + { + if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) + { + return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].PtrName; + } + } + } + } + + return NULL; +} + + +// Get local variable's type tag based on his index (starting by 1) +// Return 0 if not found +size_t DWARFManager_GetLocalVariableTypeTag(size_t Adr, size_t Index) +{ + size_t i, j; + + for (i = 0; i < NbCU; i++) + { + if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) + { + for (j = 0; j < PtrCU[i].NbSubProgs; j++) + { + if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) + { + return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].TypeTag; + } + } + } + } + + return 0; +} + + +// +int DWARFManager_GetLocalVariableOffset(size_t Adr, size_t Index) +{ + size_t i, j; + + for (i = 0; i < NbCU; i++) + { + if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) + { + for (j = 0; j < PtrCU[i].NbSubProgs; j++) + { + if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) + { + return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].Offset; + } + } + } + } + + return 0; +} + + +// Get local variable Type Byte Size based on his address and index (starting by 1) +// Return 0 if not found +// May return 0 if there is no Type Byte Size linked to the variable's address and index +size_t DWARFManager_GetLocalVariableTypeByteSize(size_t Adr, size_t Index) +{ + size_t i, j; + + for (i = 0; i < NbCU; i++) + { + if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) + { + for (j = 0; j < PtrCU[i].NbSubProgs; j++) + { + if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) + { + return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].TypeByteSize; + } + } + } + } + + return 0; +} + + +// Get local variable Type Encoding based on his address and index (starting by 1) +// Return 0 if not found +// May return 0 if there is no Type Encoding linked to the variable's address and index +size_t DWARFManager_GetLocalVariableTypeEncoding(size_t Adr, size_t Index) +{ + size_t i, j; + + for (i = 0; i < NbCU; i++) + { + if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) + { + for (j = 0; j < PtrCU[i].NbSubProgs; j++) + { + if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) + { + return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].TypeEncoding; + } + } + } + } + + return 0; +} + + +// Get local variable Op based on his address and index (starting by 1) +// Return 0 if not found +// May return 0 if there isn't Op linked to the variable's index +size_t DWARFManager_GetLocalVariableOp(size_t Adr, size_t Index) +{ + size_t i, j; + + for (i = 0; i < NbCU; i++) + { + if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) + { + for (j = 0; j < PtrCU[i].NbSubProgs; j++) + { + if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) + { + return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].Op; + } + } + } + } + + return 0; +} + + +// Get local variable type name based on his index (starting by 1) +// Return NULL if not found +// May return NULL if there is not type linked to the variable's index +char *DWARFManager_GetLocalVariableTypeName(size_t Adr, size_t Index) +{ + size_t i, j; + + for (i = 0; i < NbCU; i++) + { + if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) + { + for (j = 0; j < PtrCU[i].NbSubProgs; j++) + { + if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) + { + return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].PtrTypeName; + } + } + } + } + + return NULL; +} + + +// Get Compilation Unit / global variables numbers // Return variables number -size_t DWARFManager_GetNbExternalVariables(void) +size_t DWARFManager_GetNbGlobalVariables(void) { size_t NbVariables = 0, i; @@ -889,10 +1237,10 @@ size_t DWARFManager_GetNbExternalVariables(void) } -// Get external variable type name based on his index (starting by 1) +// Get global variable type name based on his index (starting by 1) // Return NULL if not found // May return NULL if there is not type linked to the variable's index -char *DWARFManager_GetExternalVariableTypeName(size_t Index) +char *DWARFManager_GetGlobalVariableTypeName(size_t Index) { size_t i; @@ -915,9 +1263,9 @@ char *DWARFManager_GetExternalVariableTypeName(size_t Index) } -// Get external variable's type tag based on his index (starting by 1) +// Get global variable's type tag based on his index (starting by 1) // Return 0 if not found -size_t DWARFManager_GetExternalVariableTypeTag(size_t Index) +size_t DWARFManager_GetGlobalVariableTypeTag(size_t Index) { size_t i; @@ -940,9 +1288,9 @@ size_t DWARFManager_GetExternalVariableTypeTag(size_t Index) } -// Get external variable byte size based on his index (starting by 1) +// Get global variable byte size based on his index (starting by 1) // Return 0 if not found -size_t DWARFManager_GetExternalVariableTypeByteSize(size_t Index) +size_t DWARFManager_GetGlobalVariableTypeByteSize(size_t Index) { size_t i; @@ -965,9 +1313,9 @@ size_t DWARFManager_GetExternalVariableTypeByteSize(size_t Index) } -// Get external variable encoding based on his index (starting by 1) +// Get global variable encoding based on his index (starting by 1) // Return 0 if not found -size_t DWARFManager_GetExternalVariableTypeEncoding(size_t Index) +size_t DWARFManager_GetGlobalVariableTypeEncoding(size_t Index) { size_t i; @@ -990,9 +1338,9 @@ size_t DWARFManager_GetExternalVariableTypeEncoding(size_t Index) } -// Get external variable address based on his index (starting by 1) +// Get global variable address based on his index (starting by 1) // Return 0 if not found -size_t DWARFManager_GetExternalVariableAdr(size_t Index) +size_t DWARFManager_GetGlobalVariableAdr(size_t Index) { size_t i; @@ -1015,10 +1363,10 @@ size_t DWARFManager_GetExternalVariableAdr(size_t Index) } -// Get external variable memory address based on his name +// Get global variable memory address based on his name // Return 0 if not found // Note: Return the first occurence found -size_t DWARFManager_GetExternalVariableAdrFromName(char *VariableName) +size_t DWARFManager_GetGlobalVariableAdrFromName(char *VariableName) { size_t i, j; @@ -1040,10 +1388,10 @@ size_t DWARFManager_GetExternalVariableAdrFromName(char *VariableName) } -// Get external variable name based on his index (starting by 1) +// Get global variable name based on his index (starting by 1) // Return name's pointer text found // Return NULL if not found -char *DWARFManager_GetExternalVariableName(size_t Index) +char *DWARFManager_GetGlobalVariableName(size_t Index) { size_t i; @@ -1146,6 +1494,30 @@ size_t DWARFManager_GetNumLineFromAdr(size_t Adr, size_t Tag) } +// Get function name based on address and his range +// Return NULL if no function name has been found +char *DWARFManager_GetFunctionName(size_t Adr) +{ + size_t i, j; + + for (i = 0; i < NbCU; i++) + { + if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) + { + for (j = 0; j < PtrCU[i].NbSubProgs; j++) + { + if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) + { + return PtrCU[i].PtrSubProgs[j].PtrSubprogramName; + } + } + } + } + + return NULL; +} + + // Get text line from source based on address and num line (starting by 1) // Return NULL if no text line has been found char *DWARFManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine) diff --git a/src/debugger/DWARFManager.h b/src/debugger/DWARFManager.h index 2ef7131..f7f9744 100644 --- a/src/debugger/DWARFManager.h +++ b/src/debugger/DWARFManager.h @@ -1,32 +1,43 @@ - - -#ifndef __DWARFMANAGER_H__ -#define __DWARFMANAGER_H__ - - -// -extern bool DWARFManager_Reset(void); -extern bool DWARFManager_Close(void); -extern void DWARFManager_Init(void); -extern int DWARFManager_ElfInit(Elf *ElfPtr); - -// -extern char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error); -extern size_t DWARFManager_GetNumLineFromAdr(size_t Adr, size_t Tag); -extern char *DWARFManager_GetSymbolnameFromAdr(size_t Adr); -extern char *DWARFManager_GetLineSrcFromAdr(size_t Adr, size_t Tag); -extern char *DWARFManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine); -extern char *DWARFManager_GetLineSrcFromNumLineBaseAdr(size_t Adr, size_t NumLine); - -// External variables manager -extern size_t DWARFManager_GetNbExternalVariables(void); -extern char *DWARFManager_GetExternalVariableName(size_t Index); -extern size_t DWARFManager_GetExternalVariableTypeEncoding(size_t Index); -extern char *DWARFManager_GetExternalVariableTypeName(size_t Index); -extern size_t DWARFManager_GetExternalVariableTypeByteSize(size_t Index); -extern size_t DWARFManager_GetExternalVariableAdr(size_t Index); -extern size_t DWARFManager_GetExternalVariableAdrFromName(char *VariableName); -extern size_t DWARFManager_GetExternalVariableTypeTag(size_t Index); - - -#endif // __DWARFMANAGER_H__ + + +#ifndef __DWARFMANAGER_H__ +#define __DWARFMANAGER_H__ + + +// +extern bool DWARFManager_Reset(void); +extern bool DWARFManager_Close(void); +extern void DWARFManager_Init(void); +extern int DWARFManager_ElfInit(Elf *ElfPtr); + +// +extern char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error); +extern size_t DWARFManager_GetNumLineFromAdr(size_t Adr, size_t Tag); +extern char *DWARFManager_GetSymbolnameFromAdr(size_t Adr); +extern char *DWARFManager_GetLineSrcFromAdr(size_t Adr, size_t Tag); +extern char *DWARFManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine); +extern char *DWARFManager_GetLineSrcFromNumLineBaseAdr(size_t Adr, size_t NumLine); +extern char *DWARFManager_GetFunctionName(size_t Adr); + +// Global variables manager +extern size_t DWARFManager_GetNbGlobalVariables(void); +extern char *DWARFManager_GetGlobalVariableName(size_t Index); +extern size_t DWARFManager_GetGlobalVariableTypeEncoding(size_t Index); +extern char *DWARFManager_GetGlobalVariableTypeName(size_t Index); +extern size_t DWARFManager_GetGlobalVariableTypeByteSize(size_t Index); +extern size_t DWARFManager_GetGlobalVariableAdr(size_t Index); +extern size_t DWARFManager_GetGlobalVariableAdrFromName(char *VariableName); +extern size_t DWARFManager_GetGlobalVariableTypeTag(size_t Index); + +// Local variables manager +extern size_t DWARFManager_GetNbLocalVariables(size_t Adr); +extern char *DWARFManager_GetLocalVariableName(size_t Adr, size_t Index); +extern size_t DWARFManager_GetLocalVariableTypeEncoding(size_t Adr, size_t Index); +extern char *DWARFManager_GetLocalVariableTypeName(size_t Adr, size_t Index); +extern size_t DWARFManager_GetLocalVariableTypeByteSize(size_t Adr, size_t Index); +extern size_t DWARFManager_GetLocalVariableTypeTag(size_t Adr, size_t Index); +extern size_t DWARFManager_GetLocalVariableOp(size_t Adr, size_t Index); +extern int DWARFManager_GetLocalVariableOffset(size_t Adr, size_t Index); + + +#endif // __DWARFMANAGER_H__ diff --git a/src/debugger/allwatchbrowser.cpp b/src/debugger/allwatchbrowser.cpp index 86bef50..302b462 100644 --- a/src/debugger/allwatchbrowser.cpp +++ b/src/debugger/allwatchbrowser.cpp @@ -1,170 +1,170 @@ -// -// allwatch.cpp - All Watch -// -// by Jean-Paul Mari -// -// JPM = Jean-Paul Mari -// -// Who When What -// --- ---------- ----------------------------------------------------------- -// JPM 12/07/2017 Created this file -// - -// STILL TO DO: -// - -#include "debugger/allwatchbrowser.h" -#include "memory.h" -#include "debugger/DBGManager.h" - - -AllWatchBrowserWindow::AllWatchBrowserWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog), - layout(new QVBoxLayout), text(new QTextBrowser), -// layout(new QVBoxLayout), text(new QLabel), -// refresh(new QPushButton(tr("Refresh"))), -// address(new QLineEdit), -// go(new QPushButton(tr("Go"))), -// memBase(0), - NbWatch(0), - PtrWatchInfo(NULL) -{ - setWindowTitle(tr("All Watch")); - -// address->setInputMask("hhhhhh"); -// QHBoxLayout * hbox1 = new QHBoxLayout; -// hbox1->addWidget(refresh); -// hbox1->addWidget(address); -// hbox1->addWidget(go); - - // Need to set the size as well... -// resize(560, 480); - - QFont fixedFont("Lucida Console", 8, QFont::Normal); -// QFont fixedFont("", 8, QFont::Normal); - fixedFont.setStyleHint(QFont::TypeWriter); - text->setFont(fixedFont); -//// layout->setSizeConstraint(QLayout::SetFixedSize); - setLayout(layout); - - layout->addWidget(text); -// layout->addWidget(refresh); -// layout->addLayout(hbox1); - -// connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents())); -// connect(go, SIGNAL(clicked()), this, SLOT(GoToAddress())); -} - - -// -AllWatchBrowserWindow::~AllWatchBrowserWindow(void) -{ - NbWatch = 0; - free(PtrWatchInfo); -} - - -// -void AllWatchBrowserWindow::RefreshContents(void) -{ - char string[1024]; -// char buf[64]; - QString WatchAll; - - if (isVisible()) - { - if (!NbWatch) - { - if (NbWatch = DBGManager_GetNbExternalVariables()) - { - PtrWatchInfo = (WatchInfo *)calloc(NbWatch, sizeof(WatchInfo)); -#ifdef _MSC_VER -#pragma message("Warning: !!! Need to check the memory desalocation for PtrWatchInfo !!!") -#else - #warning "!!! Need to do the memory desalocation for PtrWatchInfo !!!" -#endif // _MSC_VER - - for (uint32_t i = 0; i < NbWatch; i++) - { - PtrWatchInfo[i].PtrVariableName = DBGManager_GetExternalVariableName(i + 1); - PtrWatchInfo[i].addr = DBGManager_GetExternalVariableAdr(i + 1); - PtrWatchInfo[i].TypeTag = DBGManager_GetExternalVariableTypeTag(i + 1); - if (!strlen(PtrWatchInfo[i].PtrVariableBaseTypeName = DBGManager_GetExternalVariableTypeName(i + 1))) - { - PtrWatchInfo[i].PtrVariableBaseTypeName = (char *)"N/A"; - } - } - } - } - - for (uint32_t i = 0; i < NbWatch; i++) - { - if (PtrWatchInfo[i].PtrVariableName && PtrWatchInfo[i].PtrVariableBaseTypeName) - { - sprintf(string, "%i : %s | %s | 0x%06X | %s", (i + 1), PtrWatchInfo[i].PtrVariableBaseTypeName, PtrWatchInfo[i].PtrVariableName, (unsigned int)PtrWatchInfo[i].addr, (PtrWatchInfo[i].TypeTag & 0x8) ? "" : DBGManager_GetExternalVariableValue(i + 1)); - WatchAll += QString(string); - sprintf(string, "
"); - WatchAll += QString(string); - } - } - - text->clear(); - text->setText(WatchAll); - } -} - - -#if 0 -void AllWatchBrowserWindow::keyPressEvent(QKeyEvent * e) -{ - if (e->key() == Qt::Key_Escape) - hide(); - else if (e->key() == Qt::Key_PageUp) - { - memBase -= 480; - - if (memBase < 0) - memBase = 0; - - RefreshContents(); - } - else if (e->key() == Qt::Key_PageDown) - { - memBase += 480; - - if (memBase > (0x200000 - 480)) - memBase = 0x200000 - 480; - - RefreshContents(); - } - else if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus) - { - memBase -= 16; - - if (memBase < 0) - memBase = 0; - - RefreshContents(); - } - else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Equal) - { - memBase += 16; - - if (memBase > (0x200000 - 480)) - memBase = 0x200000 - 480; - - RefreshContents(); - } -} -#endif - - -#if 0 -void AllWatchBrowserWindow::GoToAddress(void) -{ - bool ok; - QString newAddress = address->text(); - memBase = newAddress.toUInt(&ok, 16); - RefreshContents(); -} -#endif - +// +// allwatchbrowser.cpp - All Watch +// +// by Jean-Paul Mari +// +// JPM = Jean-Paul Mari +// +// Who When What +// --- ---------- ----------------------------------------------------------- +// JPM 12/07/2017 Created this file +// + +// STILL TO DO: +// + +#include "debugger/allwatchbrowser.h" +#include "memory.h" +#include "debugger/DBGManager.h" + + +AllWatchBrowserWindow::AllWatchBrowserWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog), + layout(new QVBoxLayout), text(new QTextBrowser), +// layout(new QVBoxLayout), text(new QLabel), +// refresh(new QPushButton(tr("Refresh"))), +// address(new QLineEdit), +// go(new QPushButton(tr("Go"))), +// memBase(0), + NbWatch(0), + PtrWatchInfo(NULL) +{ + setWindowTitle(tr("All Watch")); + +// address->setInputMask("hhhhhh"); +// QHBoxLayout * hbox1 = new QHBoxLayout; +// hbox1->addWidget(refresh); +// hbox1->addWidget(address); +// hbox1->addWidget(go); + + // Need to set the size as well... +// resize(560, 480); + + QFont fixedFont("Lucida Console", 8, QFont::Normal); +// QFont fixedFont("", 8, QFont::Normal); + fixedFont.setStyleHint(QFont::TypeWriter); + text->setFont(fixedFont); +//// layout->setSizeConstraint(QLayout::SetFixedSize); + setLayout(layout); + + layout->addWidget(text); +// layout->addWidget(refresh); +// layout->addLayout(hbox1); + +// connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents())); +// connect(go, SIGNAL(clicked()), this, SLOT(GoToAddress())); +} + + +// +AllWatchBrowserWindow::~AllWatchBrowserWindow(void) +{ + NbWatch = 0; + free(PtrWatchInfo); +} + + +// +void AllWatchBrowserWindow::RefreshContents(void) +{ + char string[1024]; +// char buf[64]; + QString WatchAll; + + if (isVisible()) + { + if (!NbWatch) + { + if (NbWatch = DBGManager_GetNbGlobalVariables()) + { + PtrWatchInfo = (WatchInfo *)calloc(NbWatch, sizeof(WatchInfo)); +#ifdef _MSC_VER +#pragma message("Warning: !!! Need to check the memory desalocation for PtrWatchInfo !!!") +#else + #warning "!!! Need to do the memory desalocation for PtrWatchInfo !!!" +#endif // _MSC_VER + + for (uint32_t i = 0; i < NbWatch; i++) + { + PtrWatchInfo[i].PtrVariableName = DBGManager_GetGlobalVariableName(i + 1); + PtrWatchInfo[i].addr = DBGManager_GetGlobalVariableAdr(i + 1); + PtrWatchInfo[i].TypeTag = DBGManager_GetGlobalVariableTypeTag(i + 1); + if (!strlen(PtrWatchInfo[i].PtrVariableBaseTypeName = DBGManager_GetGlobalVariableTypeName(i + 1))) + { + PtrWatchInfo[i].PtrVariableBaseTypeName = (char *)"N/A"; + } + } + } + } + + for (uint32_t i = 0; i < NbWatch; i++) + { + if (PtrWatchInfo[i].PtrVariableName && PtrWatchInfo[i].PtrVariableBaseTypeName) + { + sprintf(string, "%i : %s | %s | 0x%06X | %s", (i + 1), PtrWatchInfo[i].PtrVariableBaseTypeName, PtrWatchInfo[i].PtrVariableName, (unsigned int)PtrWatchInfo[i].addr, (PtrWatchInfo[i].TypeTag & 0x8) ? "" : DBGManager_GetGlobalVariableValue(i + 1)); + WatchAll += QString(string); + sprintf(string, "
"); + WatchAll += QString(string); + } + } + + text->clear(); + text->setText(WatchAll); + } +} + + +#if 0 +void AllWatchBrowserWindow::keyPressEvent(QKeyEvent * e) +{ + if (e->key() == Qt::Key_Escape) + hide(); + else if (e->key() == Qt::Key_PageUp) + { + memBase -= 480; + + if (memBase < 0) + memBase = 0; + + RefreshContents(); + } + else if (e->key() == Qt::Key_PageDown) + { + memBase += 480; + + if (memBase > (0x200000 - 480)) + memBase = 0x200000 - 480; + + RefreshContents(); + } + else if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus) + { + memBase -= 16; + + if (memBase < 0) + memBase = 0; + + RefreshContents(); + } + else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Equal) + { + memBase += 16; + + if (memBase > (0x200000 - 480)) + memBase = 0x200000 - 480; + + RefreshContents(); + } +} +#endif + + +#if 0 +void AllWatchBrowserWindow::GoToAddress(void) +{ + bool ok; + QString newAddress = address->text(); + memBase = newAddress.toUInt(&ok, 16); + RefreshContents(); +} +#endif + diff --git a/src/debugger/allwatchbrowser.h b/src/debugger/allwatchbrowser.h index 03b70b8..7c4391c 100644 --- a/src/debugger/allwatchbrowser.h +++ b/src/debugger/allwatchbrowser.h @@ -1,54 +1,53 @@ -// -// allwatch.h: All Watch -// -// by James Hammons -// (C) 2012 Underground Software -// - -#ifndef __ALLWATCHBROWSER_H__ -#define __ALLWATCHBROWSER_H__ - -#include -#include - -class AllWatchBrowserWindow: public QWidget -{ - Q_OBJECT - - // - struct WatchInfo - { - //size_t TypeEncoding; - //size_t TypeByteSize; - size_t addr; - size_t TypeTag; - char *PtrVariableName; - char *PtrVariableBaseTypeName; - }S_WatchInfo; - - public: - AllWatchBrowserWindow(QWidget *parent = 0); - ~AllWatchBrowserWindow(void); - - public slots: -// void DefineAllKeys(void); - void RefreshContents(void); -// void GoToAddress(void); - - protected: -// void keyPressEvent(QKeyEvent *); - - private: - QVBoxLayout *layout; -// QTextBrowser * text; -// QLabel *text; - QTextBrowser *text; -// QPushButton *refresh; -// QLineEdit *address; -// QPushButton *go; - WatchInfo *PtrWatchInfo; -// int32_t memBase; - size_t NbWatch; -}; - -#endif // __ALLWATCHBROWSER_H__ +// +// allwatchbrowser.h: All Watch +// +// by Jean-Paul Mari +// + +#ifndef __ALLWATCHBROWSER_H__ +#define __ALLWATCHBROWSER_H__ + +#include +#include + +class AllWatchBrowserWindow: public QWidget +{ + Q_OBJECT + + // + struct WatchInfo + { + //size_t TypeEncoding; + //size_t TypeByteSize; + size_t addr; + size_t TypeTag; + char *PtrVariableName; + char *PtrVariableBaseTypeName; + }S_WatchInfo; + + public: + AllWatchBrowserWindow(QWidget *parent = 0); + ~AllWatchBrowserWindow(void); + + public slots: +// void DefineAllKeys(void); + void RefreshContents(void); +// void GoToAddress(void); + + protected: +// void keyPressEvent(QKeyEvent *); + + private: + QVBoxLayout *layout; +// QTextBrowser * text; +// QLabel *text; + QTextBrowser *text; +// QPushButton *refresh; +// QLineEdit *address; +// QPushButton *go; + WatchInfo *PtrWatchInfo; +// int32_t memBase; + size_t NbWatch; +}; + +#endif // __ALLWATCHBROWSER_H__ diff --git a/src/debugger/brkWin.cpp b/src/debugger/brkWin.cpp index becd7d8..8ad3cc8 100644 --- a/src/debugger/brkWin.cpp +++ b/src/debugger/brkWin.cpp @@ -1,226 +1,226 @@ -// -// brkWin.cpp - Breakpoints -// -// by Jean-Paul Mari -// -// JPM = Jean-Paul Mari -// -// Who When What -// --- ---------- ----------------------------------------------------------- -// JPM 30/08/2017 Created this file -// - -// STILL TO DO: -// - -#include "debugger/brkWin.h" -//#include "memory.h" -#include "debugger/DBGManager.h" - - -// -BrkWindow::BrkWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog), - layout(new QVBoxLayout), text(new QTextBrowser), -// layout(new QVBoxLayout), text(new QLabel), -// refresh(new QPushButton(tr("Refresh"))), - address(new QLineEdit) -// go(new QPushButton(tr("Go"))), -// memBase(0), -// NbWatch(0), -// PtrWatchInfo(NULL) -{ - setWindowTitle(tr("Breakpoints window")); - -#if 0 -// address->setInputMask("hhhhhh"); -// QHBoxLayout * hbox1 = new QHBoxLayout; -// hbox1->addWidget(refresh); -// hbox1->addWidget(address); -// hbox1->addWidget(go); - - // Need to set the size as well... -// resize(560, 480); - - QFont fixedFont("Lucida Console", 8, QFont::Normal); -// QFont fixedFont("", 8, QFont::Normal); - fixedFont.setStyleHint(QFont::TypeWriter); - text->setFont(fixedFont); -//// layout->setSizeConstraint(QLayout::SetFixedSize); - setLayout(layout); - - layout->addWidget(text); -// layout->addWidget(refresh); -// layout->addLayout(hbox1); - -// connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents())); -// connect(go, SIGNAL(clicked()), this, SLOT(GoToAddress())); -#endif -} - - -// -BrkWindow::~BrkWindow(void) -{ -#if 0 - NbWatch = 0; - free(PtrWatchInfo); -#endif -} - - -// -void BrkWindow::RefreshContents(void) -{ -#if 0 - char string[1024]; -// char buf[64]; - QString WatchAll; - - if (isVisible()) - { - if (!NbWatch) - { - if (NbWatch = DBGManager_GetNbExternalVariables()) - { - PtrWatchInfo = (WatchInfo *)calloc(NbWatch, sizeof(WatchInfo)); -#ifdef _MSC_VER -#pragma message("Warning: !!! Need to check the memory desalocation for PtrWatchInfo !!!") -#else - #warning "!!! Need to do the memory desalocation for PtrWatchInfo !!!" -#endif // _MSC_VER - - for (uint32_t i = 0; i < NbWatch; i++) - { - PtrWatchInfo[i].PtrVariableName = DBGManager_GetExternalVariableName(i + 1); - PtrWatchInfo[i].addr = DBGManager_GetExternalVariableAdr(i + 1); - PtrWatchInfo[i].TypeTag = DBGManager_GetExternalVariableTypeTag(i + 1); - if (!strlen(PtrWatchInfo[i].PtrVariableBaseTypeName = DBGManager_GetExternalVariableTypeName(i + 1))) - { - PtrWatchInfo[i].PtrVariableBaseTypeName = (char *)"N/A"; - } - } - } - } - - for (uint32_t i = 0; i < NbWatch; i++) - { - if (PtrWatchInfo[i].PtrVariableName && PtrWatchInfo[i].PtrVariableBaseTypeName) - { - sprintf(string, "%i : %s | %s | 0x%06X | %s", (i + 1), PtrWatchInfo[i].PtrVariableBaseTypeName, PtrWatchInfo[i].PtrVariableName, PtrWatchInfo[i].addr, (PtrWatchInfo[i].TypeTag & 0x8) ? "" : DBGManager_GetExternalVariableValue(i + 1)); - WatchAll += QString(string); - sprintf(string, "
"); - WatchAll += QString(string); - } - } - - text->clear(); - text->setText(WatchAll); - } -#endif -} - - -// -void BrkWindow::keyPressEvent(QKeyEvent * e) -{ - if (e->key() == Qt::Key_Escape) - { - hide(); - } - else - { - if (e->key() == Qt::Key_PageUp) - { -#if 0 - memBase -= 480; - - if (memBase < 0) - memBase = 0; - - RefreshContents(); -#endif - } - else - { - if (e->key() == Qt::Key_PageDown) - { -#if 0 - memBase += 480; - - if (memBase > (0x200000 - 480)) - memBase = 0x200000 - 480; - - RefreshContents(); -#endif - } - else - { - if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus) - { -#if 0 - memBase -= 16; - - if (memBase < 0) - memBase = 0; - - RefreshContents(); -#endif - } - else - { - if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Equal) - { -#if 0 - memBase += 16; - - if (memBase > (0x200000 - 480)) - memBase = 0x200000 - 480; - - RefreshContents(); -#endif - } - else - { - if (e->key() == Qt::Key_Return) - { - GoToAddress(); - } - } - } - } - } - } -} - - -// -void BrkWindow::RefreshBrkList(size_t Address) -{ -} - - -// Go to the requested address -// Address can be an hexa, decimal or a symbol name -void BrkWindow::GoToAddress(void) -{ - size_t Address; - bool ok; - QString newAddress; - - newAddress = address->text(); - - if ((newAddress.at(0) == QChar('0')) && (newAddress.at(1) == QChar('x'))) - { - Address = newAddress.toUInt(&ok, 16); - } - else - { - if (!(Address = DBGManager_GetAdrFromSymbolName(newAddress.toLatin1().data()))) - { - Address = newAddress.toUInt(&ok, 10); - } - } - - RefreshBrkList(Address); -} - +// +// brkWin.cpp - Breakpoints +// +// by Jean-Paul Mari +// +// JPM = Jean-Paul Mari +// +// Who When What +// --- ---------- ----------------------------------------------------------- +// JPM 30/08/2017 Created this file +// + +// STILL TO DO: +// + +#include "debugger/brkWin.h" +//#include "memory.h" +#include "debugger/DBGManager.h" + + +// +BrkWindow::BrkWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog), + layout(new QVBoxLayout), text(new QTextBrowser), +// layout(new QVBoxLayout), text(new QLabel), +// refresh(new QPushButton(tr("Refresh"))), + address(new QLineEdit) +// go(new QPushButton(tr("Go"))), +// memBase(0), +// NbWatch(0), +// PtrWatchInfo(NULL) +{ + setWindowTitle(tr("Breakpoints window")); + +#if 0 +// address->setInputMask("hhhhhh"); +// QHBoxLayout * hbox1 = new QHBoxLayout; +// hbox1->addWidget(refresh); +// hbox1->addWidget(address); +// hbox1->addWidget(go); + + // Need to set the size as well... +// resize(560, 480); + + QFont fixedFont("Lucida Console", 8, QFont::Normal); +// QFont fixedFont("", 8, QFont::Normal); + fixedFont.setStyleHint(QFont::TypeWriter); + text->setFont(fixedFont); +//// layout->setSizeConstraint(QLayout::SetFixedSize); + setLayout(layout); + + layout->addWidget(text); +// layout->addWidget(refresh); +// layout->addLayout(hbox1); + +// connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents())); +// connect(go, SIGNAL(clicked()), this, SLOT(GoToAddress())); +#endif +} + + +// +BrkWindow::~BrkWindow(void) +{ +#if 0 + NbWatch = 0; + free(PtrWatchInfo); +#endif +} + + +// +void BrkWindow::RefreshContents(void) +{ +#if 0 + char string[1024]; +// char buf[64]; + QString WatchAll; + + if (isVisible()) + { + if (!NbWatch) + { + if (NbWatch = DBGManager_GetNbGlobalVariables()) + { + PtrWatchInfo = (WatchInfo *)calloc(NbWatch, sizeof(WatchInfo)); +#ifdef _MSC_VER +#pragma message("Warning: !!! Need to check the memory desalocation for PtrWatchInfo !!!") +#else + #warning "!!! Need to do the memory desalocation for PtrWatchInfo !!!" +#endif // _MSC_VER + + for (uint32_t i = 0; i < NbWatch; i++) + { + PtrWatchInfo[i].PtrVariableName = DBGManager_GetGlobalVariableName(i + 1); + PtrWatchInfo[i].addr = DBGManager_GetExternalVariableAdr(i + 1); + PtrWatchInfo[i].TypeTag = DBGManager_GetExternalVariableTypeTag(i + 1); + if (!strlen(PtrWatchInfo[i].PtrVariableBaseTypeName = DBGManager_GetGlobalVariableTypeName(i + 1))) + { + PtrWatchInfo[i].PtrVariableBaseTypeName = (char *)"N/A"; + } + } + } + } + + for (uint32_t i = 0; i < NbWatch; i++) + { + if (PtrWatchInfo[i].PtrVariableName && PtrWatchInfo[i].PtrVariableBaseTypeName) + { + sprintf(string, "%i : %s | %s | 0x%06X | %s", (i + 1), PtrWatchInfo[i].PtrVariableBaseTypeName, PtrWatchInfo[i].PtrVariableName, PtrWatchInfo[i].addr, (PtrWatchInfo[i].TypeTag & 0x8) ? "" : DBGManager_GetExternalVariableValue(i + 1)); + WatchAll += QString(string); + sprintf(string, "
"); + WatchAll += QString(string); + } + } + + text->clear(); + text->setText(WatchAll); + } +#endif +} + + +// +void BrkWindow::keyPressEvent(QKeyEvent * e) +{ + if (e->key() == Qt::Key_Escape) + { + hide(); + } + else + { + if (e->key() == Qt::Key_PageUp) + { +#if 0 + memBase -= 480; + + if (memBase < 0) + memBase = 0; + + RefreshContents(); +#endif + } + else + { + if (e->key() == Qt::Key_PageDown) + { +#if 0 + memBase += 480; + + if (memBase > (0x200000 - 480)) + memBase = 0x200000 - 480; + + RefreshContents(); +#endif + } + else + { + if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus) + { +#if 0 + memBase -= 16; + + if (memBase < 0) + memBase = 0; + + RefreshContents(); +#endif + } + else + { + if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Equal) + { +#if 0 + memBase += 16; + + if (memBase > (0x200000 - 480)) + memBase = 0x200000 - 480; + + RefreshContents(); +#endif + } + else + { + if (e->key() == Qt::Key_Return) + { + GoToAddress(); + } + } + } + } + } + } +} + + +// +void BrkWindow::RefreshBrkList(size_t Address) +{ +} + + +// Go to the requested address +// Address can be an hexa, decimal or a symbol name +void BrkWindow::GoToAddress(void) +{ + size_t Address; + bool ok; + QString newAddress; + + newAddress = address->text(); + + if ((newAddress.at(0) == QChar('0')) && (newAddress.at(1) == QChar('x'))) + { + Address = newAddress.toUInt(&ok, 16); + } + else + { + if (!(Address = DBGManager_GetAdrFromSymbolName(newAddress.toLatin1().data()))) + { + Address = newAddress.toUInt(&ok, 10); + } + } + + RefreshBrkList(Address); +} + diff --git a/src/debugger/heapallocatorbrowser.cpp b/src/debugger/heapallocatorbrowser.cpp index 07eadcd..83ed9c7 100644 --- a/src/debugger/heapallocatorbrowser.cpp +++ b/src/debugger/heapallocatorbrowser.cpp @@ -1,226 +1,226 @@ -// -// allwatch.cpp - All Watch -// -// by Jean-Paul Mari -// -// JPM = Jean-Paul Mari -// -// Who When What -// --- ---------- ----------------------------------------------------------- -// JPM 01/08/2017 Created this file -// - -// STILL TO DO: -// - -#include "debugger/heapallocatorbrowser.h" -#include "memory.h" -#include "debugger/DBGManager.h" -#include "m68000/m68kinterface.h" - - -HeapAllocatorBrowserWindow::HeapAllocatorBrowserWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog), -layout(new QVBoxLayout), text(new QTextBrowser), -// layout(new QVBoxLayout), text(new QLabel), -// refresh(new QPushButton(tr("Refresh"))), -// address(new QLineEdit), -// go(new QPushButton(tr("Go"))), -// memBase(0), -// NbWatch(0), -// PtrWatchInfo(NULL) -Adr(0) -//PtrAdr(NULL) -{ - setWindowTitle(tr("Heap Allocation")); - -// address->setInputMask("hhhhhh"); -// QHBoxLayout * hbox1 = new QHBoxLayout; -// hbox1->addWidget(refresh); -// hbox1->addWidget(address); -// hbox1->addWidget(go); - - // Need to set the size as well... -// resize(560, 480); - - QFont fixedFont("Lucida Console", 8, QFont::Normal); -// QFont fixedFont("", 8, QFont::Normal); - fixedFont.setStyleHint(QFont::TypeWriter); - text->setFont(fixedFont); -//// layout->setSizeConstraint(QLayout::SetFixedSize); - setLayout(layout); - - layout->addWidget(text); -// layout->addWidget(refresh); -// layout->addLayout(hbox1); - -// connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents())); -// connect(go, SIGNAL(clicked()), this, SLOT(GoToAddress())); -} - - -// -HeapAllocatorBrowserWindow::~HeapAllocatorBrowserWindow(void) -{ -// NbWatch = 0; -// free(PtrAdr); -} - - -// -void HeapAllocatorBrowserWindow::RefreshContents(void) -{ - char string[1024]; -// char buf[64]; - QString HA; - size_t Adr68K; - size_t Error = 0; - HeapAllocation HeapAllocation; - - if (isVisible()) - { - if (Adr68K = Adr) - { - do - { - if ((Adr68K >= 0x4000) && (Adr68K < 0x200000)) - { - memcpy(&HeapAllocation, &jaguarMainRAM[Adr68K], sizeof(HeapAllocation)); - - if (HeapAllocation.size = ((HeapAllocation.size & 0xff) << 24) + ((HeapAllocation.size & 0xff00) << 8) + ((HeapAllocation.size & 0xff0000) >> 8) + ((HeapAllocation.size & 0xff000000) >> 24)) - { - if (HeapAllocation.size <= (0x200000 - 0x4000)) - { - if ((HeapAllocation.used = ((HeapAllocation.used & 0xff) << 8) + ((HeapAllocation.used & 0xff00) >> 8)) <= 1) - { - HeapAllocation.nextalloc = ((HeapAllocation.nextalloc & 0xff) << 24) + ((HeapAllocation.nextalloc & 0xff00) << 8) + ((HeapAllocation.nextalloc & 0xff0000) >> 8) + ((HeapAllocation.nextalloc & 0xff000000) >> 24); - - if ((HeapAllocation.nextalloc >= 0x4000) && (HeapAllocation.nextalloc < 0x200000)) - { - sprintf(string, "0x%06x | 0x%06x (%i) | %s | 0x%06x
", Adr68K, HeapAllocation.size - sizeof(HeapAllocation), HeapAllocation.size - sizeof(HeapAllocation), HeapAllocation.used ? "Allocated" : "Free", HeapAllocation.nextalloc); - Adr68K = HeapAllocation.nextalloc; - } - else - { - sprintf(string, "
Unable to determine the next memory allocation"); - Error = 1; - } - } - else - { - sprintf(string, "
Unable to determine if the allocated memory is used or not"); - Error = 2; - } - } - else - { - sprintf(string, "
Memory bloc size has a problem"); - Error = 3; - } - } - else - { - sprintf(string, "
Memory allocations browsing successfully completed"); - } - } - else - { - sprintf(string, "
Memory allocations may have a problem"); - Error = 4; - } - - HA += QString(string); - - } while (HeapAllocation.size && !Error); - } - else - { - if (Adr = DBGManager_GetAdrFromSymbolName((char *)"__HeapBase")) - { - if (Adr68K = DBGManager_GetExternalVariableAdrFromName((char *)"alloc")) - { - if (!(Adr68K = (jaguarMainRAM[Adr68K] << 24) + (jaguarMainRAM[Adr68K + 1] << 16) + (jaguarMainRAM[Adr68K + 2] << 8) + (jaguarMainRAM[Adr68K + 3])) || ((Adr68K < 0x4000) || (Adr68K >= 0x200000))) - { - sprintf(string, "Memory allocator not yet initialised"); - Adr = 0; - } - else - { - return RefreshContents(); - //sprintf(string, "Memory allocator has been initialised"); - } - } - else - { - sprintf(string, "Memory allocator is not compatible"); - Adr = 0; - } - } - else - { - sprintf(string, "Memory allocator doesn't exist"); - } - - HA += QString(string); - } - - text->clear(); - text->setText(HA); - } -} - - -#if 0 -void HeapAllocatorBrowserWindow::keyPressEvent(QKeyEvent * e) -{ - if (e->key() == Qt::Key_Escape) - hide(); - else if (e->key() == Qt::Key_PageUp) - { - memBase -= 480; - - if (memBase < 0) - memBase = 0; - - RefreshContents(); - } - else if (e->key() == Qt::Key_PageDown) - { - memBase += 480; - - if (memBase > (0x200000 - 480)) - memBase = 0x200000 - 480; - - RefreshContents(); - } - else if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus) - { - memBase -= 16; - - if (memBase < 0) - memBase = 0; - - RefreshContents(); - } - else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Equal) - { - memBase += 16; - - if (memBase > (0x200000 - 480)) - memBase = 0x200000 - 480; - - RefreshContents(); - } -} -#endif - - -#if 0 -void HeapAllocatorBrowserWindow::GoToAddress(void) -{ - bool ok; - QString newAddress = address->text(); - memBase = newAddress.toUInt(&ok, 16); - RefreshContents(); -} -#endif - +// +// allwatch.cpp - All Watch +// +// by Jean-Paul Mari +// +// JPM = Jean-Paul Mari +// +// Who When What +// --- ---------- ----------------------------------------------------------- +// JPM 01/08/2017 Created this file +// + +// STILL TO DO: +// + +#include "debugger/heapallocatorbrowser.h" +#include "memory.h" +#include "debugger/DBGManager.h" +#include "m68000/m68kinterface.h" + + +HeapAllocatorBrowserWindow::HeapAllocatorBrowserWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog), +layout(new QVBoxLayout), text(new QTextBrowser), +// layout(new QVBoxLayout), text(new QLabel), +// refresh(new QPushButton(tr("Refresh"))), +// address(new QLineEdit), +// go(new QPushButton(tr("Go"))), +// memBase(0), +// NbWatch(0), +// PtrWatchInfo(NULL) +Adr(0) +//PtrAdr(NULL) +{ + setWindowTitle(tr("Heap Allocation")); + +// address->setInputMask("hhhhhh"); +// QHBoxLayout * hbox1 = new QHBoxLayout; +// hbox1->addWidget(refresh); +// hbox1->addWidget(address); +// hbox1->addWidget(go); + + // Need to set the size as well... +// resize(560, 480); + + QFont fixedFont("Lucida Console", 8, QFont::Normal); +// QFont fixedFont("", 8, QFont::Normal); + fixedFont.setStyleHint(QFont::TypeWriter); + text->setFont(fixedFont); +//// layout->setSizeConstraint(QLayout::SetFixedSize); + setLayout(layout); + + layout->addWidget(text); +// layout->addWidget(refresh); +// layout->addLayout(hbox1); + +// connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents())); +// connect(go, SIGNAL(clicked()), this, SLOT(GoToAddress())); +} + + +// +HeapAllocatorBrowserWindow::~HeapAllocatorBrowserWindow(void) +{ +// NbWatch = 0; +// free(PtrAdr); +} + + +// +void HeapAllocatorBrowserWindow::RefreshContents(void) +{ + char string[1024]; +// char buf[64]; + QString HA; + size_t Adr68K; + size_t Error = 0; + HeapAllocation HeapAllocation; + + if (isVisible()) + { + if (Adr68K = Adr) + { + do + { + if ((Adr68K >= 0x4000) && (Adr68K < 0x200000)) + { + memcpy(&HeapAllocation, &jaguarMainRAM[Adr68K], sizeof(HeapAllocation)); + + if (HeapAllocation.size = ((HeapAllocation.size & 0xff) << 24) + ((HeapAllocation.size & 0xff00) << 8) + ((HeapAllocation.size & 0xff0000) >> 8) + ((HeapAllocation.size & 0xff000000) >> 24)) + { + if (HeapAllocation.size <= (0x200000 - 0x4000)) + { + if ((HeapAllocation.used = ((HeapAllocation.used & 0xff) << 8) + ((HeapAllocation.used & 0xff00) >> 8)) <= 1) + { + HeapAllocation.nextalloc = ((HeapAllocation.nextalloc & 0xff) << 24) + ((HeapAllocation.nextalloc & 0xff00) << 8) + ((HeapAllocation.nextalloc & 0xff0000) >> 8) + ((HeapAllocation.nextalloc & 0xff000000) >> 24); + + if ((HeapAllocation.nextalloc >= 0x4000) && (HeapAllocation.nextalloc < 0x200000)) + { + sprintf(string, "0x%06x | 0x%06x (%i) | %s | 0x%06x
", Adr68K, HeapAllocation.size - sizeof(HeapAllocation), HeapAllocation.size - sizeof(HeapAllocation), HeapAllocation.used ? "Allocated" : "Free", HeapAllocation.nextalloc); + Adr68K = HeapAllocation.nextalloc; + } + else + { + sprintf(string, "
Unable to determine the next memory allocation"); + Error = 1; + } + } + else + { + sprintf(string, "
Unable to determine if the allocated memory is used or not"); + Error = 2; + } + } + else + { + sprintf(string, "
Memory bloc size has a problem"); + Error = 3; + } + } + else + { + sprintf(string, "
Memory allocations browsing successfully completed"); + } + } + else + { + sprintf(string, "
Memory allocations may have a problem"); + Error = 4; + } + + HA += QString(string); + + } while (HeapAllocation.size && !Error); + } + else + { + if (Adr = DBGManager_GetAdrFromSymbolName((char *)"__HeapBase")) + { + if (Adr68K = DBGManager_GetGlobalVariableAdrFromName((char *)"alloc")) + { + if (!(Adr68K = (jaguarMainRAM[Adr68K] << 24) + (jaguarMainRAM[Adr68K + 1] << 16) + (jaguarMainRAM[Adr68K + 2] << 8) + (jaguarMainRAM[Adr68K + 3])) || ((Adr68K < 0x4000) || (Adr68K >= 0x200000))) + { + sprintf(string, "Memory allocator not yet initialised"); + Adr = 0; + } + else + { + return RefreshContents(); + //sprintf(string, "Memory allocator has been initialised"); + } + } + else + { + sprintf(string, "Memory allocator is not compatible"); + Adr = 0; + } + } + else + { + sprintf(string, "Memory allocator doesn't exist"); + } + + HA += QString(string); + } + + text->clear(); + text->setText(HA); + } +} + + +#if 0 +void HeapAllocatorBrowserWindow::keyPressEvent(QKeyEvent * e) +{ + if (e->key() == Qt::Key_Escape) + hide(); + else if (e->key() == Qt::Key_PageUp) + { + memBase -= 480; + + if (memBase < 0) + memBase = 0; + + RefreshContents(); + } + else if (e->key() == Qt::Key_PageDown) + { + memBase += 480; + + if (memBase > (0x200000 - 480)) + memBase = 0x200000 - 480; + + RefreshContents(); + } + else if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus) + { + memBase -= 16; + + if (memBase < 0) + memBase = 0; + + RefreshContents(); + } + else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Equal) + { + memBase += 16; + + if (memBase > (0x200000 - 480)) + memBase = 0x200000 - 480; + + RefreshContents(); + } +} +#endif + + +#if 0 +void HeapAllocatorBrowserWindow::GoToAddress(void) +{ + bool ok; + QString newAddress = address->text(); + memBase = newAddress.toUInt(&ok, 16); + RefreshContents(); +} +#endif + diff --git a/src/debugger/localbrowser.cpp b/src/debugger/localbrowser.cpp new file mode 100644 index 0000000..3b8d816 --- /dev/null +++ b/src/debugger/localbrowser.cpp @@ -0,0 +1,248 @@ +// +// localbrowser.cpp - Local variables +// +// by Jean-Paul Mari +// +// JPM = Jean-Paul Mari +// +// Who When What +// --- ---------- ----------------------------------------------------------- +// JPM 11/03/2017 Created this file +// + + +#include "debugger/localbrowser.h" +#include "memory.h" +#include "debugger/DBGManager.h" +#include "settings.h" +#include "m68000/m68kinterface.h" + + +// +LocalBrowserWindow::LocalBrowserWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog), + layout(new QVBoxLayout), text(new QTextBrowser), +// layout(new QVBoxLayout), text(new QLabel), +// refresh(new QPushButton(tr("Refresh"))), +// address(new QLineEdit), +// go(new QPushButton(tr("Go"))), +// memBase(0), + NbLocal(0), + FuncName((char *)calloc(1, 1)), + LocalInfo(NULL) +{ + setWindowTitle(tr("Local")); + +// address->setInputMask("hhhhhh"); +// QHBoxLayout * hbox1 = new QHBoxLayout; +// hbox1->addWidget(refresh); +// hbox1->addWidget(address); +// hbox1->addWidget(go); + + // Need to set the size as well... +// resize(560, 480); + + QFont fixedFont("Lucida Console", 8, QFont::Normal); +// QFont fixedFont("", 8, QFont::Normal); + fixedFont.setStyleHint(QFont::TypeWriter); + text->setFont(fixedFont); +//// layout->setSizeConstraint(QLayout::SetFixedSize); + setLayout(layout); + + layout->addWidget(text); +// layout->addWidget(refresh); +// layout->addLayout(hbox1); + +// connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents())); +// connect(go, SIGNAL(clicked()), this, SLOT(GoToAddress())); +} + + +// +LocalBrowserWindow::~LocalBrowserWindow(void) +{ + free(LocalInfo); + free(FuncName); +// NbLocal = 0; +} + + +// +bool LocalBrowserWindow::UpdateInfos(void) +{ + size_t Adr; + char *Ptr; + + if (NbLocal = DBGManager_GetNbLocalVariables(Adr = m68k_get_reg(NULL, M68K_REG_PC))) + { + if (Ptr = DBGManager_GetFunctionName(Adr)) + { + if (strcmp(FuncName, Ptr)) + { + FuncName = (char *)realloc(FuncName, strlen(Ptr) + 1); + strcpy(FuncName, Ptr); + + LocalInfo = (WatchInfo *)realloc(LocalInfo, (sizeof(WatchInfo) * NbLocal)); + for (size_t i = 0; i < NbLocal; i++) + { + if (LocalInfo[i].PtrVariableName = DBGManager_GetLocalVariableName(Adr, i + 1)) + { + LocalInfo[i].Op = DBGManager_GetLocalVariableOp(Adr, i + 1); + LocalInfo[i].Adr = NULL; + LocalInfo[i].TypeTag = DBGManager_GetLocalVariableTypeTag(Adr, i + 1); + LocalInfo[i].PtrVariableBaseTypeName = DBGManager_GetLocalVariableTypeName(Adr, i + 1); + LocalInfo[i].TypeEncoding = DBGManager_GetLocalVariableTypeEncoding(Adr, i + 1); + LocalInfo[i].TypeByteSize = DBGManager_GetLocalVariableTypeByteSize(Adr, i + 1); + LocalInfo[i].Offset = DBGManager_GetLocalVariableOffset(Adr, i + 1); + } + } + } + + return true; + } + } + + *FuncName = 0; + + return false; +} + + +// +void LocalBrowserWindow::RefreshContents(void) +{ + char string[1024]; +// char buf[64]; + QString Local; + char Value[100]; + char *PtrValue; +// size_t NbWatch, Adr; +// WatchInfo PtrLocalInfo; + + if (isVisible()) + { + if (UpdateInfos()) + { +//#ifdef _MSC_VER + //#pragma message("Warning: !!! Need to check the memory desalocation for LocalInfo !!!") +//#else + //#warning "!!! Need to do the memory desalocation for LocalInfo !!!" +//#endif // _MSC_VER +//#ifdef _MSC_VER + //#pragma message("Warning: !!! Need to check the memory desalocation for FuncName !!!") +//#else + //#warning "!!! Need to do the memory desalocation for FuncName !!!" +//#endif // _MSC_VER + + for (size_t i = 0; i < NbLocal; i++) + { + if (LocalInfo[i].PtrVariableName) + { + if (((LocalInfo[i].Op >= DBG_OP_breg0) && (LocalInfo[i].Op <= DBG_OP_breg31))) + { + LocalInfo[i].Adr = m68k_get_reg(NULL, M68K_REG_A6) + LocalInfo[i].Offset; + + if ((LocalInfo[i].Adr >= 0) && (LocalInfo[i].Adr < vjs.DRAM_size)) + { + PtrValue = DBGManager_GetVariableValueFromAdr(LocalInfo[i].Adr, LocalInfo[i].TypeEncoding, LocalInfo[i].TypeByteSize); + } + else + { + PtrValue = NULL; + } + } + else + { + if ((LocalInfo[i].Op >= DBG_OP_reg0) && (LocalInfo[i].Op <= DBG_OP_reg31)) + { + PtrValue = itoa(m68k_get_reg(NULL, (m68k_register_t)((size_t)M68K_REG_D0 + (LocalInfo[i].Op - DBG_OP_reg0))), Value, 10); + } + else + { + PtrValue = NULL; + } + } + + sprintf(string, "%i : %s | %s | ", (i + 1), (LocalInfo[i].PtrVariableBaseTypeName ? LocalInfo[i].PtrVariableBaseTypeName : (char *)"N/A"), LocalInfo[i].PtrVariableName); + Local += QString(string); + if ((unsigned int)LocalInfo[i].Adr) + { + sprintf(string, "0x%06X", (unsigned int)LocalInfo[i].Adr); + } + else + { + sprintf(string, "%s", (char *)"N/A"); + } + Local += QString(string); + sprintf(string, " | %s", (!PtrValue ? (char *)"N/A" : PtrValue)); + Local += QString(string); + sprintf(string, "
"); + Local += QString(string); + } + } + + text->clear(); + text->setText(Local); + } + else + { + text->clear(); + } + } +} + + +#if 0 +void LocalBrowserWindow::keyPressEvent(QKeyEvent * e) +{ + if (e->key() == Qt::Key_Escape) + hide(); + else if (e->key() == Qt::Key_PageUp) + { + memBase -= 480; + + if (memBase < 0) + memBase = 0; + + RefreshContents(); + } + else if (e->key() == Qt::Key_PageDown) + { + memBase += 480; + + if (memBase > (0x200000 - 480)) + memBase = 0x200000 - 480; + + RefreshContents(); + } + else if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus) + { + memBase -= 16; + + if (memBase < 0) + memBase = 0; + + RefreshContents(); + } + else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Equal) + { + memBase += 16; + + if (memBase > (0x200000 - 480)) + memBase = 0x200000 - 480; + + RefreshContents(); + } +} +#endif + + +#if 0 +void LocalBrowserWindow::GoToAddress(void) +{ + bool ok; + QString newAddress = address->text(); + memBase = newAddress.toUInt(&ok, 16); + RefreshContents(); +} +#endif + diff --git a/src/debugger/localbrowser.h b/src/debugger/localbrowser.h new file mode 100644 index 0000000..dc732fd --- /dev/null +++ b/src/debugger/localbrowser.h @@ -0,0 +1,59 @@ +// +// localbrowser.h: All Watch +// +// by Jean-Paul Mari +// + +#ifndef __LOCALBROWSER_H__ +#define __LOCALBROWSER_H__ + +#include +#include + +class LocalBrowserWindow: public QWidget +{ + Q_OBJECT + + // + struct WatchInfo + { + //size_t TypeEncoding; + //size_t TypeByteSize; + size_t Op; + size_t Adr; + int Offset; + size_t TypeTag; + size_t TypeEncoding; + size_t TypeByteSize; + char *PtrVariableName; + char *PtrVariableBaseTypeName; + }S_WatchInfo; + + public: + LocalBrowserWindow(QWidget *parent = 0); + ~LocalBrowserWindow(void); + + public slots: +// void DefineAllKeys(void); + void RefreshContents(void); + bool UpdateInfos(void); +// void GoToAddress(void); + + protected: +// void keyPressEvent(QKeyEvent *); + + private: + QVBoxLayout *layout; +// QTextBrowser * text; +// QLabel *text; + QTextBrowser *text; +// QPushButton *refresh; +// QLineEdit *address; +// QPushButton *go; + WatchInfo *LocalInfo; +// int32_t memBase; + size_t NbLocal; + char *FuncName; +}; + +#endif // __LOCALBROWSER_H__ diff --git a/src/debugger/m68kDasmWin.cpp b/src/debugger/m68kDasmWin.cpp index de50c5f..4aef951 100644 --- a/src/debugger/m68kDasmWin.cpp +++ b/src/debugger/m68kDasmWin.cpp @@ -172,7 +172,7 @@ void m68KDasmWindow::RefreshContents(void) else { // Display symbol, or line source, based on the program address - if (!CurrentLineSrc && !Symbol && (Symbol = DBGManager_GetSymbolnameFromAdr(oldpc))) + if (!CurrentLineSrc && !Symbol && (Symbol = DBGManager_GetSymbolNameFromAdr(oldpc))) { sprintf(string, "%s:
", Symbol); s += QString(string); @@ -235,7 +235,7 @@ void m68KDasmWindow::RefreshContents(void) } while ((string[(j + 1)] >= '0') && (string[(j + 1)] <= '9') || (string[(j + 1)] >= 'A') && (string[(j + 1)] <= 'F')); adresse[l] = 0; - if (Symbol = DBGManager_GetSymbolnameFromAdr(strtoul(adresse, &p, 16))) + if (Symbol = DBGManager_GetSymbolNameFromAdr(strtoul(adresse, &p, 16))) { strcat(buffer, Symbol); } diff --git a/src/gui/keybindingstab.cpp b/src/gui/keybindingstab.cpp index 12b7e54..59c9cf6 100644 --- a/src/gui/keybindingstab.cpp +++ b/src/gui/keybindingstab.cpp @@ -1,60 +1,60 @@ -// -// keybindingstab.cpp: Key Bindings tab on the settings dialog -// -// Part of the Virtual Jaguar Project -// -// JPM = Jean-Paul Mari -// -// WHO WHEN WHAT -// --- ---------- ------------------------------------------------------------ -// JPM 09/10/2017 Created this file - -#include "keybindingstab.h" -#include "settings.h" - - -// -KeyBindings KeyBindingsTable[KB_END] = { - { KB_TYPEGENERAL, "KB_Quit", "Quit", "Quit keybinding", "Ctrl+Q", NULL, NULL }, - { KB_TYPEGENERAL, "KB_PickFile", "Pick file", "Pick file keybinding", "Ctrl+I", NULL, NULL }, - { KB_TYPEGENERAL, "KB_Configure", "Configure", "Configure keybinding", "Ctrl+C", NULL, NULL }, - { KB_TYPEGENERAL, "KB_EmuStatus", "Emulator Status", "Emulator status keybinding", "Ctrl+S", NULL, NULL }, - { KB_TYPEGENERAL, "KB_Pause", "Pause", "Pause keybinding", "Esc", NULL, NULL }, - { KB_TYPEGENERAL, "KB_FrameAdvance", "Frame Advance", "Frame advance keybinding", "F7", NULL, NULL }, - { KB_TYPEDEBUGGER, "KB_Restart", "Restart", "Restart keybinding", "Ctrl+Shift+F5", NULL, NULL }, - { KB_TYPEDEBUGGER, "KB_StepInto", "Step Into", "Step into keybinding", "F11", NULL, NULL }, - { KB_TYPEDEBUGGER, "KB_StepOver", "Step Over", "Step over kebinding", "F10", NULL, NULL }, - { KB_TYPEGENERAL, "KB_FullScreen", "Full Screen", "Full screen kebinding", "F9", NULL, NULL } - }; - - -// -#define NBKEYBINDINGS sizeof(KeyBindingsTable)/sizeof(KeyBindings) - - -// -KeyBindingsTab::KeyBindingsTab(QWidget * parent/*= 0*/): QWidget(parent) -{ - size_t i; - - QVBoxLayout *layout1 = new QVBoxLayout; - QVBoxLayout *layout2 = new QVBoxLayout; - - // Initialisation for each layout line - for (i = 0; i < NBKEYBINDINGS; i++) - { - // Prepare the keybinding line - layout1->addWidget(KeyBindingsTable[i].KBLabel = new QLabel(KeyBindingsTable[i].KBNameLabel)); - layout2->addWidget(KeyBindingsTable[i].KBLineEdit = new QLineEdit("")); - KeyBindingsTable[i].KBLineEdit->setMaxLength(30); - KeyBindingsTable[i].KBLineEdit->setPlaceholderText(KeyBindingsTable[i].KBPlaceholderText); - - // Check if keybinding can be editable - if (KeyBindingsTable[i].KBType != KB_TYPEGENERAL) - { - if (vjs.hardwareTypeAlpine && (KeyBindingsTable[i].KBType & KB_TYPEALPINE)) - { - } +// +// keybindingstab.cpp: Key Bindings tab on the settings dialog +// +// Part of the Virtual Jaguar Project +// +// JPM = Jean-Paul Mari +// +// WHO WHEN WHAT +// --- ---------- ------------------------------------------------------------ +// JPM 09/10/2017 Created this file + +#include "keybindingstab.h" +#include "settings.h" + + +// +KeyBindings KeyBindingsTable[KB_END] = { + { KB_TYPEGENERAL, "KB_Quit", "Quit", "Quit keybinding", "Ctrl+Q", NULL, NULL }, + { KB_TYPEGENERAL, "KB_PickFile", "Pick file", "Pick file keybinding", "Ctrl+I", NULL, NULL }, + { KB_TYPEGENERAL, "KB_Configure", "Configure", "Configure keybinding", "Ctrl+C", NULL, NULL }, + { KB_TYPEGENERAL, "KB_EmuStatus", "Emulator Status", "Emulator status keybinding", "Ctrl+S", NULL, NULL }, + { KB_TYPEGENERAL, "KB_Pause", "Pause", "Pause keybinding", "Esc", NULL, NULL }, + { KB_TYPEGENERAL, "KB_FrameAdvance", "Frame Advance", "Frame advance keybinding", "F7", NULL, NULL }, + { KB_TYPEDEBUGGER, "KB_Restart", "Restart", "Restart keybinding", "Ctrl+Shift+F5", NULL, NULL }, + { KB_TYPEDEBUGGER, "KB_StepInto", "Step Into", "Step into keybinding", "F11", NULL, NULL }, + { KB_TYPEDEBUGGER, "KB_StepOver", "Step Over", "Step over kebinding", "F10", NULL, NULL }, + { KB_TYPEGENERAL, "KB_FullScreen", "Full Screen", "Full screen kebinding", "F9", NULL, NULL } + }; + + +// +#define NBKEYBINDINGS sizeof(KeyBindingsTable)/sizeof(KeyBindings) + + +// +KeyBindingsTab::KeyBindingsTab(QWidget * parent/*= 0*/): QWidget(parent) +{ + size_t i; + + QVBoxLayout *layout1 = new QVBoxLayout; + QVBoxLayout *layout2 = new QVBoxLayout; + + // Initialisation for each layout line + for (i = 0; i < NBKEYBINDINGS; i++) + { + // Prepare the keybinding line + layout1->addWidget(KeyBindingsTable[i].KBLabel = new QLabel(KeyBindingsTable[i].KBNameLabel)); + layout2->addWidget(KeyBindingsTable[i].KBLineEdit = new QLineEdit("")); + KeyBindingsTable[i].KBLineEdit->setMaxLength(30); + KeyBindingsTable[i].KBLineEdit->setPlaceholderText(KeyBindingsTable[i].KBPlaceholderText); + + // Check if keybinding can be editable + if (KeyBindingsTable[i].KBType != KB_TYPEGENERAL) + { + if (vjs.hardwareTypeAlpine && (KeyBindingsTable[i].KBType & KB_TYPEALPINE)) + { + } else { if (vjs.softTypeDebugger && (KeyBindingsTable[i].KBType & KB_TYPEDEBUGGER)) @@ -62,49 +62,49 @@ KeyBindingsTab::KeyBindingsTab(QWidget * parent/*= 0*/): QWidget(parent) } else { - KeyBindingsTable[i].KBLabel->hide(); + KeyBindingsTable[i].KBLabel->hide(); KeyBindingsTable[i].KBLineEdit->hide(); } - } - } - } - - // Layouts setup - QHBoxLayout *layout3 = new QHBoxLayout; - layout3->addLayout(layout1); - layout3->addLayout(layout2); - QVBoxLayout *layout4 = new QVBoxLayout; - layout4->addLayout(layout3); - setLayout(layout4); -} - - -KeyBindingsTab::~KeyBindingsTab() -{ -} - - -// Load / Update the tabs dialog from the settings -void KeyBindingsTab::GetSettings(void) -{ - size_t i; - - for (i = 0; i < NBKEYBINDINGS; i++) - { - KeyBindingsTable[i].KBLineEdit->setText(vjs.KBContent[i].KBSettingValue); - } -} - - -// Save / Update the settings from the tabs dialog -void KeyBindingsTab::SetSettings(void) -{ - size_t i; - - for (i = 0; i < NBKEYBINDINGS; i++) - { - //strcpy(vjs.KBContent[i].KBSettingName, KeyBindingsTable[i].KBNameSetting); - strcpy(vjs.KBContent[i].KBSettingValue, KeyBindingsTable[i].KBLineEdit->text().toUtf8().data()); - } -} - + } + } + } + + // Layouts setup + QHBoxLayout *layout3 = new QHBoxLayout; + layout3->addLayout(layout1); + layout3->addLayout(layout2); + QVBoxLayout *layout4 = new QVBoxLayout; + layout4->addLayout(layout3); + setLayout(layout4); +} + + +KeyBindingsTab::~KeyBindingsTab() +{ +} + + +// Load / Update the tabs dialog from the settings +void KeyBindingsTab::GetSettings(void) +{ + size_t i; + + for (i = 0; i < NBKEYBINDINGS; i++) + { + KeyBindingsTable[i].KBLineEdit->setText(vjs.KBContent[i].KBSettingValue); + } +} + + +// Save / Update the settings from the tabs dialog +void KeyBindingsTab::SetSettings(void) +{ + size_t i; + + for (i = 0; i < NBKEYBINDINGS; i++) + { + //strcpy(vjs.KBContent[i].KBSettingName, KeyBindingsTable[i].KBNameSetting); + strcpy(vjs.KBContent[i].KBSettingValue, KeyBindingsTable[i].KBLineEdit->text().toUtf8().data()); + } +} + diff --git a/src/gui/mainwin.cpp b/src/gui/mainwin.cpp index 5d228db..1af385a 100644 --- a/src/gui/mainwin.cpp +++ b/src/gui/mainwin.cpp @@ -26,6 +26,7 @@ // JPM 09/05/2017 Added Exception Vector Table window // JPM 09/06/2017 Added the 'Rx' word to the emulator window name // JPM 09/12/2017 Added the keybindings in the settings +// JPM 11/04/2017 Added the local browser window // // FIXED: @@ -75,6 +76,7 @@ #include "debug/riscdasmbrowser.h" #include "debugger/allwatchbrowser.h" +#include "debugger/localbrowser.h" #include "debugger/heapallocatorbrowser.h" #include "dac.h" @@ -187,6 +189,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), //DasmWin = new DasmWindow(); DasmWin = new DasmWindow(this); allWatchBrowseWin = new AllWatchBrowserWindow(this); + LocalBrowseWin = new LocalBrowserWindow(this); heapallocatorBrowseWin = new HeapAllocatorBrowserWindow(this); brkWin = new BrkWindow(this); exceptionvectortableBrowseWin = new ExceptionVectorTableBrowserWindow(this); @@ -395,6 +398,10 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), allWatchBrowseAct->setStatusTip(tr("Shows all Watch browser window")); connect(allWatchBrowseAct, SIGNAL(triggered()), this, SLOT(ShowAllWatchBrowserWin())); + LocalBrowseAct = new QAction(QIcon(":/res/Local.png"), tr("Local"), this); + LocalBrowseAct->setStatusTip(tr("Shows Local browser window")); + connect(LocalBrowseAct, SIGNAL(triggered()), this, SLOT(ShowLocalBrowserWin())); + heapallocatorBrowseAct = new QAction(QIcon(""), tr("Heap allocator"), this); heapallocatorBrowseAct->setStatusTip(tr("Shows the heap allocator browser window")); connect(heapallocatorBrowseAct, SIGNAL(triggered()), this, SLOT(ShowHeapAllocatorBrowserWin())); @@ -498,6 +505,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), #endif debugWindowsWatchMenu = debugWindowsMenu->addMenu(tr("&Watch")); debugWindowsWatchMenu->addAction(allWatchBrowseAct); + debugWindowsMenu->addAction(LocalBrowseAct); debugWindowsMenu->addSeparator(); debugWindowsMemoryMenu = debugWindowsMenu->addMenu(tr("&Memory")); debugWindowsMemoryMenu->addAction(heapallocatorBrowseAct); @@ -1016,8 +1024,7 @@ static uint32_t ntscTickCount; { for (uint32_t y = 0; y < videoWidget->rasterHeight; y++) { - videoWidget->buffer[(y * videoWidget->textureWidth) + x] - = (rand() & 0xFF) << 8 | (rand() & 0xFF) << 16 | (rand() & 0xFF) << 24; + videoWidget->buffer[(y * videoWidget->textureWidth) + x] = (rand() & 0xFF) << 8 | (rand() & 0xFF) << 16 | (rand() & 0xFF) << 24; } } } @@ -1515,6 +1522,13 @@ void MainWin::ShowExceptionVectorTableBrowserWin(void) } +void MainWin::ShowLocalBrowserWin(void) +{ + LocalBrowseWin->show(); + LocalBrowseWin->RefreshContents(); +} + + void MainWin::ShowAllWatchBrowserWin(void) { allWatchBrowseWin->show(); @@ -1839,6 +1853,13 @@ void MainWin::ReadUISettings(void) size = settings.value("allWatchBrowseWinSize", QSize(400, 400)).toSize(); allWatchBrowseWin->resize(size); + // Local browser UI information + pos = settings.value("LocalBrowseWinPos", QPoint(200, 200)).toPoint(); + LocalBrowseWin->move(pos); + settings.value("LocalBrowseWinIsVisible", false).toBool() ? ShowLocalBrowserWin() : void(); + size = settings.value("LocalBrowseWinSize", QSize(400, 400)).toSize(); + LocalBrowseWin->resize(size); + // Heap memory allocation browser UI information pos = settings.value("heapallocatorBrowseWinPos", QPoint(200, 200)).toPoint(); heapallocatorBrowseWin->move(pos); @@ -2031,6 +2052,9 @@ void MainWin::WriteUISettings(void) settings.setValue("allWatchBrowseWinPos", allWatchBrowseWin->pos()); settings.setValue("allWatchBrowseWinIsVisible", allWatchBrowseWin->isVisible()); settings.setValue("allWatchBrowseWinSize", allWatchBrowseWin->size()); + settings.setValue("LocalBrowseWinPos", LocalBrowseWin->pos()); + settings.setValue("LocalBrowseWinIsVisible", LocalBrowseWin->isVisible()); + settings.setValue("LocalBrowseWinSize", LocalBrowseWin->size()); settings.setValue("heapallocatorBrowseWinPos", heapallocatorBrowseWin->pos()); settings.setValue("heapallocatorBrowseWinIsVisible", heapallocatorBrowseWin->isVisible()); settings.setValue("heapallocatorBrowseWinSize", heapallocatorBrowseWin->size()); @@ -2076,6 +2100,7 @@ void MainWin::RefreshDebuggerWindows(void) GPUDasmWin->RefreshContents(); DSPDasmWin->RefreshContents(); allWatchBrowseWin->RefreshContents(); + LocalBrowseWin->RefreshContents(); heapallocatorBrowseWin->RefreshContents(); for (i = 0; i < vjs.nbrmemory1browserwindow; i++) { diff --git a/src/gui/mainwin.h b/src/gui/mainwin.h index 1c5118e..fec3179 100644 --- a/src/gui/mainwin.h +++ b/src/gui/mainwin.h @@ -1,210 +1,214 @@ -// -// mainwin.h: Header file -// -// by James Hammons -// (C) 2010 Underground Software -// - -#ifndef __MAINWIN_H__ -#define __MAINWIN_H__ - -//Hrm. uh??? I thought this wasn't the way to do this stuff...??? -#include -#include "tom.h" - -#define RING_BUFFER_SIZE 32 - -// Forward declarations -class GLWidget; -class VideoWindow; -class AboutWindow; -class HelpWindow; -class FilePickerWindow; -class MemoryBrowserWindow; -class StackBrowserWindow; -class CPUBrowserWindow; -class OPBrowserWindow; -class M68KDasmBrowserWindow; -class RISCDasmBrowserWindow; -class VideoOutputWindow; -class DasmWindow; -class m68KDasmWindow; -class GPUDasmWindow; -class DSPDasmWindow; -class EmuStatusWindow; -class AllWatchBrowserWindow; -class HeapAllocatorBrowserWindow; -class Memory1BrowserWindow; -class BrkWindow; -class ExceptionVectorTableBrowserWindow; - -class MainWin: public QMainWindow -{ - // All Qt apps require this macro for signal/slot functionality to work - Q_OBJECT - - public: -// MainWin(QString); - MainWin(bool); - void LoadFile(QString); - void SyncUI(void); - void RefreshDebuggerWindows(void); - void RefreshAlpineWindows(void); - - protected: - void closeEvent(QCloseEvent *); - void keyPressEvent(QKeyEvent *); - void keyReleaseEvent(QKeyEvent *); - - private slots: - void Open(void); - void Configure(void); - void Timer(void); - void TogglePowerState(void); - void ToggleRunState(void); - void SetZoom100(void); - void SetZoom200(void); - void SetZoom300(void); - void SetNTSC(void); - void SetPAL(void); - void ToggleBlur(void); - void ShowAboutWin(void); - void ShowHelpWin(void); - void InsertCart(void); - void Unpause(void); - void LoadSoftware(QString); - void ToggleCDUsage(void); - void FrameAdvance(void); - void TraceStepOver(void); - void TraceStepInto(void); - void ToggleFullScreen(void); - void Restart(void); - void NewBreakpointFunction(void); - void ShowMemoryBrowserWin(void); - void ShowStackBrowserWin(void); - void ShowCPUBrowserWin(void); - void ShowOPBrowserWin(void); - void ShowM68KDasmBrowserWin(void); - void ShowRISCDasmBrowserWin(void); - void ShowVideoOutputWin(void); - void ShowDasmWin(void); - void ShowEmuStatusWin(void); - void ShowAllWatchBrowserWin(void); - void ShowHeapAllocatorBrowserWin(void); - void ShowMemory1BrowserWin(int NumWin); - void ShowExceptionVectorTableBrowserWin(void); - - private: - void HandleKeys(QKeyEvent *, bool); - void HandleGamepads(void); - void SetFullScreen(bool state = true); - void ResizeMainWindow(void); - void ReadUISettings(void); - void ReadSettings(void); - void WriteSettings(void); - void WriteUISettings(void); - -// public: - GLWidget * videoWidget; - QMdiArea *mainWindowCentrale; - QMdiSubWindow *VideoOutputWindowCentrale; - AboutWindow * aboutWin; - HelpWindow * helpWin; - FilePickerWindow * filePickWin; - EmuStatusWindow * emuStatusWin; - MemoryBrowserWindow * memBrowseWin; - StackBrowserWindow * stackBrowseWin; - CPUBrowserWindow * cpuBrowseWin; - OPBrowserWindow * opBrowseWin; - M68KDasmBrowserWindow * m68kDasmBrowseWin; - RISCDasmBrowserWindow * riscDasmBrowseWin; - VideoOutputWindow * VideoOutputWin; - AllWatchBrowserWindow * allWatchBrowseWin; - ExceptionVectorTableBrowserWindow *exceptionvectortableBrowseWin; - HeapAllocatorBrowserWindow *heapallocatorBrowseWin; - Memory1BrowserWindow ** mem1BrowseWin; - DasmWindow * DasmWin; - QTabWidget *dasmtabWidget; - //QDockWidget *dasmtabWidget; - m68KDasmWindow *m68kDasmWin; - GPUDasmWindow *GPUDasmWin; - DSPDasmWindow *DSPDasmWin; - BrkWindow *brkWin; - QTimer * timer; - bool running; - int zoomLevel; - bool powerButtonOn; - bool showUntunedTankCircuit; - public: - bool cartridgeLoaded; - private: - bool allowUnknownSoftware; - bool CDActive; -// bool alpineLoadSuccessful; - bool pauseForFileSelector; - bool loadAndGo; - bool keyHeld[8]; - bool fullScreen; - bool scannedSoftwareFolder; - public: - bool plzDontKillMyComputer; - uint32_t oldTimestamp; - uint32_t ringBufferPointer; - uint32_t ringBuffer[RING_BUFFER_SIZE]; - private: - QPoint mainWinPosition; -// QSize mainWinSize; - int lastEditedProfile; - QMenu * fileMenu; - QMenu * helpMenu; - QMenu * debugMenu, * debugWindowsMenu, *debugWindowsBrowsesMenu, *debugWindowsWatchMenu, *debugWindowOutputMenu, *debugWindowExceptionMenu, *debugWindowsMemoryMenu, *debugNewBreakpointMenu; - QToolBar * toolbar; - QToolBar * debugbar; - QToolBar * debuggerbar; - - QActionGroup * zoomActs; - QActionGroup * tvTypeActs; - - QAction * quitAppAct; - QAction * powerAct; - QAction * pauseAct; - QAction * x1Act; - QAction * x2Act; - QAction * x3Act; - QAction * ntscAct; - QAction * palAct; - QAction * blurAct; - QAction * aboutAct; - QAction * helpAct; - QAction * filePickAct; - QAction * configAct; - QAction * emustatusAct; - QAction * useCDAct; - QAction * frameAdvanceAct; - QAction *traceStepOverAct; - QAction *traceStepIntoAct; - QAction *restartAct; - QAction * fullScreenAct; - - QAction *memBrowseAct; - QAction *stackBrowseAct; - QAction *cpuBrowseAct; - QAction *opBrowseAct; - QAction *m68kDasmBrowseAct; - QAction *riscDasmBrowseAct; - QAction *VideoOutputAct; - QAction *DasmAct; - QAction *heapallocatorBrowseAct; - QAction *allWatchBrowseAct; - QAction **mem1BrowseAct; - QAction *newBreakpointFunctionAct; - QAction *exceptionVectorTableBrowseAct; - - QIcon powerGreen; - QIcon powerRed; - QIcon blur; - uint32_t testPattern[VIRTUAL_SCREEN_WIDTH * VIRTUAL_SCREEN_HEIGHT_PAL]; - uint32_t testPattern2[VIRTUAL_SCREEN_WIDTH * VIRTUAL_SCREEN_HEIGHT_PAL]; -}; - -#endif // __MAINWIN_H__ +// +// mainwin.h: Header file +// +// by James Hammons +// (C) 2010 Underground Software +// + +#ifndef __MAINWIN_H__ +#define __MAINWIN_H__ + +//Hrm. uh??? I thought this wasn't the way to do this stuff...??? +#include +#include "tom.h" + +#define RING_BUFFER_SIZE 32 + +// Forward declarations +class GLWidget; +class VideoWindow; +class AboutWindow; +class HelpWindow; +class FilePickerWindow; +class MemoryBrowserWindow; +class StackBrowserWindow; +class CPUBrowserWindow; +class OPBrowserWindow; +class M68KDasmBrowserWindow; +class RISCDasmBrowserWindow; +class VideoOutputWindow; +class DasmWindow; +class m68KDasmWindow; +class GPUDasmWindow; +class DSPDasmWindow; +class EmuStatusWindow; +class AllWatchBrowserWindow; +class LocalBrowserWindow; +class HeapAllocatorBrowserWindow; +class Memory1BrowserWindow; +class BrkWindow; +class ExceptionVectorTableBrowserWindow; + +class MainWin: public QMainWindow +{ + // All Qt apps require this macro for signal/slot functionality to work + Q_OBJECT + + public: +// MainWin(QString); + MainWin(bool); + void LoadFile(QString); + void SyncUI(void); + void RefreshDebuggerWindows(void); + void RefreshAlpineWindows(void); + + protected: + void closeEvent(QCloseEvent *); + void keyPressEvent(QKeyEvent *); + void keyReleaseEvent(QKeyEvent *); + + private slots: + void Open(void); + void Configure(void); + void Timer(void); + void TogglePowerState(void); + void ToggleRunState(void); + void SetZoom100(void); + void SetZoom200(void); + void SetZoom300(void); + void SetNTSC(void); + void SetPAL(void); + void ToggleBlur(void); + void ShowAboutWin(void); + void ShowHelpWin(void); + void InsertCart(void); + void Unpause(void); + void LoadSoftware(QString); + void ToggleCDUsage(void); + void FrameAdvance(void); + void TraceStepOver(void); + void TraceStepInto(void); + void ToggleFullScreen(void); + void Restart(void); + void NewBreakpointFunction(void); + void ShowMemoryBrowserWin(void); + void ShowStackBrowserWin(void); + void ShowCPUBrowserWin(void); + void ShowOPBrowserWin(void); + void ShowM68KDasmBrowserWin(void); + void ShowRISCDasmBrowserWin(void); + void ShowVideoOutputWin(void); + void ShowDasmWin(void); + void ShowEmuStatusWin(void); + void ShowAllWatchBrowserWin(void); + void ShowLocalBrowserWin(void); + void ShowHeapAllocatorBrowserWin(void); + void ShowMemory1BrowserWin(int NumWin); + void ShowExceptionVectorTableBrowserWin(void); + + private: + void HandleKeys(QKeyEvent *, bool); + void HandleGamepads(void); + void SetFullScreen(bool state = true); + void ResizeMainWindow(void); + void ReadUISettings(void); + void ReadSettings(void); + void WriteSettings(void); + void WriteUISettings(void); + +// public: + GLWidget * videoWidget; + QMdiArea *mainWindowCentrale; + QMdiSubWindow *VideoOutputWindowCentrale; + AboutWindow * aboutWin; + HelpWindow * helpWin; + FilePickerWindow * filePickWin; + EmuStatusWindow * emuStatusWin; + MemoryBrowserWindow * memBrowseWin; + StackBrowserWindow * stackBrowseWin; + CPUBrowserWindow * cpuBrowseWin; + OPBrowserWindow * opBrowseWin; + M68KDasmBrowserWindow * m68kDasmBrowseWin; + RISCDasmBrowserWindow * riscDasmBrowseWin; + VideoOutputWindow * VideoOutputWin; + AllWatchBrowserWindow * allWatchBrowseWin; + LocalBrowserWindow * LocalBrowseWin; + ExceptionVectorTableBrowserWindow *exceptionvectortableBrowseWin; + HeapAllocatorBrowserWindow *heapallocatorBrowseWin; + Memory1BrowserWindow ** mem1BrowseWin; + DasmWindow * DasmWin; + QTabWidget *dasmtabWidget; + //QDockWidget *dasmtabWidget; + m68KDasmWindow *m68kDasmWin; + GPUDasmWindow *GPUDasmWin; + DSPDasmWindow *DSPDasmWin; + BrkWindow *brkWin; + QTimer * timer; + bool running; + int zoomLevel; + bool powerButtonOn; + bool showUntunedTankCircuit; + public: + bool cartridgeLoaded; + private: + bool allowUnknownSoftware; + bool CDActive; +// bool alpineLoadSuccessful; + bool pauseForFileSelector; + bool loadAndGo; + bool keyHeld[8]; + bool fullScreen; + bool scannedSoftwareFolder; + public: + bool plzDontKillMyComputer; + uint32_t oldTimestamp; + uint32_t ringBufferPointer; + uint32_t ringBuffer[RING_BUFFER_SIZE]; + private: + QPoint mainWinPosition; +// QSize mainWinSize; + int lastEditedProfile; + QMenu * fileMenu; + QMenu * helpMenu; + QMenu * debugMenu, * debugWindowsMenu, *debugWindowsBrowsesMenu, *debugWindowsWatchMenu, *debugWindowOutputMenu, *debugWindowExceptionMenu, *debugWindowsMemoryMenu, *debugNewBreakpointMenu; + QToolBar * toolbar; + QToolBar * debugbar; + QToolBar * debuggerbar; + + QActionGroup * zoomActs; + QActionGroup * tvTypeActs; + + QAction * quitAppAct; + QAction * powerAct; + QAction * pauseAct; + QAction * x1Act; + QAction * x2Act; + QAction * x3Act; + QAction * ntscAct; + QAction * palAct; + QAction * blurAct; + QAction * aboutAct; + QAction * helpAct; + QAction * filePickAct; + QAction * configAct; + QAction * emustatusAct; + QAction * useCDAct; + QAction * frameAdvanceAct; + QAction *traceStepOverAct; + QAction *traceStepIntoAct; + QAction *restartAct; + QAction * fullScreenAct; + + QAction *memBrowseAct; + QAction *stackBrowseAct; + QAction *cpuBrowseAct; + QAction *opBrowseAct; + QAction *m68kDasmBrowseAct; + QAction *riscDasmBrowseAct; + QAction *VideoOutputAct; + QAction *DasmAct; + QAction *heapallocatorBrowseAct; + QAction *allWatchBrowseAct; + QAction *LocalBrowseAct; + QAction **mem1BrowseAct; + QAction *newBreakpointFunctionAct; + QAction *exceptionVectorTableBrowseAct; + + QIcon powerGreen; + QIcon powerRed; + QIcon blur; + uint32_t testPattern[VIRTUAL_SCREEN_WIDTH * VIRTUAL_SCREEN_HEIGHT_PAL]; + uint32_t testPattern2[VIRTUAL_SCREEN_WIDTH * VIRTUAL_SCREEN_HEIGHT_PAL]; +}; + +#endif // __MAINWIN_H__ diff --git a/src/gui/virtualjaguar.qrc b/src/gui/virtualjaguar.qrc index b11ec3f..98f2ce5 100644 --- a/src/gui/virtualjaguar.qrc +++ b/src/gui/virtualjaguar.qrc @@ -1,48 +1,49 @@ - - - ../../res/vj-icon.png - ../../res/power-off.png - ../../res/power-on-red.png - ../../res/power-on-green.png - ../../res/pause-off.png - ../../res/pause-on.png - ../../res/frame-advance.png - ../../res/StepOver.png - ../../res/StepInto.png - ../../res/Restart.png - ../../res/zoom100.png - ../../res/zoom200.png - ../../res/zoom300.png - ../../res/blur-off.png - ../../res/blur-on.png - ../../res/fullscreen.png - ../../res/Watch.png - ../../res/tool-memory.png - ../../res/tool-stack.png - ../../res/tool-cpu.png - ../../res/tool-op.png - ../../res/tool-68k-dis.png - ../../res/tool-risc-dis.png - ../../res/generic.png - ../../res/cart-blank.png - ../../res/label-blank.png - ../../res/vj_title_small.png - ../../res/controller.png - ../../res/insert.png - ../../res/software.png - ../../res/ntsc.png - ../../res/pal.png - ../../res/compact-disc.png - ../../res/wrench.png - ../../res/upper-left.png - ../../res/upper-right.png - ../../res/alpine-file.png - ../../res/skunkboard-file.png - ../../res/homebrew-file.png - ../../res/unknown-file.png - ../../res/ELF-file.png - ../../res/test-pattern.jpg - ../../res/test-pattern-pal.jpg - ../../res/help.html - - + + + ../../res/vj-icon.png + ../../res/power-off.png + ../../res/power-on-red.png + ../../res/power-on-green.png + ../../res/pause-off.png + ../../res/pause-on.png + ../../res/frame-advance.png + ../../res/StepOver.png + ../../res/StepInto.png + ../../res/Restart.png + ../../res/zoom100.png + ../../res/zoom200.png + ../../res/zoom300.png + ../../res/blur-off.png + ../../res/blur-on.png + ../../res/fullscreen.png + ../../res/Watch.png + ../../res/Local.png + ../../res/tool-memory.png + ../../res/tool-stack.png + ../../res/tool-cpu.png + ../../res/tool-op.png + ../../res/tool-68k-dis.png + ../../res/tool-risc-dis.png + ../../res/generic.png + ../../res/cart-blank.png + ../../res/label-blank.png + ../../res/vj_title_small.png + ../../res/controller.png + ../../res/insert.png + ../../res/software.png + ../../res/ntsc.png + ../../res/pal.png + ../../res/compact-disc.png + ../../res/wrench.png + ../../res/upper-left.png + ../../res/upper-right.png + ../../res/alpine-file.png + ../../res/skunkboard-file.png + ../../res/homebrew-file.png + ../../res/unknown-file.png + ../../res/ELF-file.png + ../../res/test-pattern.jpg + ../../res/test-pattern-pal.jpg + ../../res/help.html + + diff --git a/virtualjaguar.pro b/virtualjaguar.pro index 613bfdf..d209466 100644 --- a/virtualjaguar.pro +++ b/virtualjaguar.pro @@ -114,6 +114,7 @@ HEADERS = \ src/debugger/VideoWin.h \ src/debugger/ELFManager.h \ src/debugger/allwatchbrowser.h \ + src/debugger/localbrowser.h \ src/debugger/DWARFManager.h \ src/debugger/memory1browser.h \ src/debugger/heapallocatorbrowser.h \ @@ -161,6 +162,7 @@ SOURCES = \ src/debugger/VideoWin.cpp \ src/debugger/ELFManager.cpp \ src/debugger/allwatchbrowser.cpp \ + src/debugger/localbrowser.cpp \ src/debugger/DWARFManager.cpp \ src/debugger/memory1browser.cpp \ src/debugger/heapallocatorbrowser.cpp \