Re: [hatari-devel] [PATCH] Add some NVDI function names

[ Thread Index | Date Index | More lists.tuxfamily.org/hatari-devel Archives ]


On Donnerstag, 1. Oktober 2020 01:34:12 CEST Eero Tamminen wrote:

 

Hi,

 

attached is the revised patch. I've moved already the special-cased opcode5_98 to the larger table, because all those calls are also GDOS related.

 

Things not handled yet:

 

- there are some calls which can only be distinguised by looking at contents of the intin[] array (v_bez_qual for example)

- v_bez_on is not yet distinguished from v_bez_off, because it uses an unusal calling convention (just the number of ptsin parameters differs, but contents of ptsin are irrelevant)

- "vdi info 1" to print the opcodes list is not updated yet. To get that right would need lots of more work, which i don't think is worth it (eg. already in the current implementation it does not print the function names for v_bar etc.). It's also a bit confusing because the numbers there are printed in hex, while later in the trace they are printed in decimal. Maybe that info should just be dropped, and a link to https://freemint.github.io/tos.hyp/en/vdi_functions.html printed instead ;)

 

> If it's a noticeable performance problem for you,

> make sure you've built Hatari with optimizations

> and aren't saving the log to a floppy. :-)

 

I would still prefer to not generate that info. For example i would also find it useful to not only print the names, but also the contents of the intin[] and ptsin[] arrays. But those should go to a separate line, and then you cannot filter them out using grep.

 

> THAT would make such a generic tracing feature

> very annoying & invasive to implement.

 

Ok, but thats beyond the scope of this patch ;)

 

 

 

diff --git a/src/vdi.c b/src/vdi.c
index 216a62d0..0ae1b1d0 100644
--- a/src/vdi.c
+++ b/src/vdi.c
@@ -434,8 +434,10 @@ void AES_Info(FILE *fp, Uint32 bShowOpcodes)
 /**
  * Map VDI call opcode/sub-opcode to a VDI function name
  */
-static const char* VDI_Opcode2Name(Uint16 opcode, Uint16 subcode)
+static const char* VDI_Opcode2Name(Uint16 opcode, Uint16 subcode, Uint16 nintin, const char **extra_info)
 {
+	unsigned int i;
+
 	static const char* names_0[] = {
 		"???",
 		"v_opnwk",
@@ -511,8 +513,8 @@ static const char* VDI_Opcode2Name(Uint16 opcode, Uint16 subcode)
 		"vs_clip",
 		"vqt_name",
 		"vqt_fontinfo"
-		/* 131-233: no known opcodes
-		 * 234-255: (Speedo) GDOS opcodes
+		/* 139-169: no known opcodes
+		 * 170-255: NVDI/Speedo GDOS opcodes
 		 */
 	};
 	static const char* names_opcode5[] = {
@@ -543,13 +545,6 @@ static const char* VDI_Opcode2Name(Uint16 opcode, Uint16 subcode)
 		"vq_scan",
 		"v_alpha_text"
 	};
-	static const char* names_opcode5_98[] = {
-		"v_meta_extents",
-		"v_write_meta",
-		"vm_filename",
-		"???",
-		"v_fontinit"
-	};
 	static const char* names_opcode11[] = {
 		"<no subcode>",
 		"v_bar",
@@ -561,20 +556,145 @@ static const char* VDI_Opcode2Name(Uint16 opcode, Uint16 subcode)
 		"v_ellpie",
 		"v_rbox",
 		"v_rfbox",
-		"v_justified"
+		"v_justified",
+		"???",
+		"v_bez_on/off",
+	};
+	static struct {
+		unsigned short opcode;
+		unsigned short subcode;
+		unsigned short nintin;
+		const char *name;
+		const char *extra_info;
+	} const names_other[] = {
+		{ 5, 98, 0xffff, "v_meta_extents", "GDOS" },
+		{ 5, 99, 0xffff, "v_write_meta", "GDOS" },
+		{ 5, 100, 0xffff, "vm_filename", "GDOS" },
+		{ 5, 101, 0xffff, "v_offset", "GDOS" },
+		{ 5, 102, 0xffff, "v_fontinit", "GDOS" },
+		{ 100, 1, 13, "v_opnbm", "EdDI" },
+		{ 100, 2, 6, "v_resize_bm", "EdDI" },
+		{ 100, 3, 4, "v_open_bm", "EdDI" },
+		{ 100, 0xffff, 0xffff, "v_opnvwk", NULL },
+		{ 132, 0xffff, 0xffff, "vqt_justified", "PC/GEM" },
+		{ 133, 0xffff, 0xffff, "vs_grayoverride", "GEM/3" },
+		{ 134, 0xffff, 1, "v_pat_rotate", "GEM/3" },
+		{ 134, 0xffff, 0xffff, "vex_wheelv", "Milan" },
+		{ 138, 0xffff, 0xffff, "v_setrgb", "NVDI" },
+		{ 170, 0, 0xffff, "vr_transfer_bits" },
+		{ 171, 0, 0xffff, "vr_clip_rects_by_dst", "NVDI" }, /* NVDI 5.02 */
+		{ 171, 1, 0xffff, "vr_clip_rects_by_src", "NVDI" }, /* NVDI 5.02 */
+		{ 171, 2, 0xffff, "vr_clip_rects32_by_dst", "NVDI" }, /* NVDI 5.02 */
+		{ 171, 3, 0xffff, "vr_clip_rects32_by_src", "NVDI" }, /* NVDI 5.02 */
+		{ 180, 0, 0xffff, "v_create_driver_info", "NVDI" }, /* NVDI 5.00 */
+		{ 181, 0, 0xffff, "v_delete_driver_info", "NVDI" }, /* NVDI 5.00 */
+		{ 182, 0, 0xffff, "v_read_default_settings", "NVDI" }, /* NVDI 5.00 */
+		{ 182, 1, 0xffff, "v_write_default_settings", "NVDI" }, /* NVDI 5.00 */
+		{ 190, 0, 0xffff, "vqt_char_index", "GDOS" }, /* NVDI 4.00 */
+		{ 200, 0, 0xffff, "vst_fg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 200, 1, 0xffff, "vsf_fg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 200, 2, 0xffff, "vsl_fg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 200, 3, 0xffff, "vsm_fg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 200, 4, 0xffff, "vsr_fg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 201, 0, 0xffff, "vst_bg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 201, 1, 0xffff, "vsf_bg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 201, 2, 0xffff, "vsl_bg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 201, 3, 0xffff, "vsm_bg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 201, 4, 0xffff, "vsr_bg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 202, 0, 0xffff, "vqt_fg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 202, 1, 0xffff, "vqf_fg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 202, 2, 0xffff, "vql_fg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 202, 3, 0xffff, "vqm_fg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 202, 4, 0xffff, "vqr_fg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 203, 0, 0xffff, "vqt_bg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 203, 1, 0xffff, "vqf_bg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 203, 2, 0xffff, "vql_bg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 203, 3, 0xffff, "vqm_bg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 203, 4, 0xffff, "vqr_bg_color", "GDOS" }, /* NVDI 5.00 */
+		{ 204, 0, 0xffff, "v_color2value", "NVDI" }, /* NVDI 5.00 */
+		{ 204, 1, 0xffff, "v_value2color", "NVDI" }, /* NVDI 5.00 */
+		{ 204, 2, 0xffff, "v_color2nearest", "NVDI" }, /* NVDI 5.00 */
+		{ 204, 3, 0xffff, "vq_px_format", "NVDI" }, /* NVDI 5.00 */
+		{ 205, 0, 0xffff, "vs_ctab", "NVDI" }, /* NVDI 5.00 */
+		{ 205, 1, 0xffff, "vs_ctab_entry", "NVDI" }, /* NVDI 5.00 */
+		{ 205, 2, 0xffff, "vs_dflt_ctab", "NVDI" }, /* NVDI 5.00 */
+		{ 206, 0, 0xffff, "vq_ctab", "NVDI" }, /* NVDI 5.00 */
+		{ 206, 1, 0xffff, "vq_ctab_entry", "NVDI" }, /* NVDI 5.00 */
+		{ 206, 2, 0xffff, "vq_ctab_id", "NVDI" }, /* NVDI 5.00 */
+		{ 206, 3, 0xffff, "v_ctab_idx2vdi", "NVDI" }, /* NVDI 5.00 */
+		{ 206, 4, 0xffff, "v_ctab_vdi2idx", "NVDI" }, /* NVDI 5.00 */
+		{ 206, 5, 0xffff, "v_ctab_idx2value", "NVDI" }, /* NVDI 5.00 */
+		{ 206, 6, 0xffff, "v_get_ctab_id", "NVDI" }, /* NVDI 5.00 */
+		{ 206, 7, 0xffff, "vq_dflt_ctab", "NVDI" }, /* NVDI 5.00 */
+		{ 206, 8, 0xffff, "v_create_ctab", "NVDI" }, /* NVDI 5.00 */
+		{ 206, 9, 0xffff, "v_delete_ctab", "NVDI" }, /* NVDI 5.00 */
+		{ 207, 0, 0xffff, "vs_hilite_color", "NVDI" }, /* NVDI 5.00 */
+		{ 207, 1, 0xffff, "vs_min_color", "NVDI" }, /* NVDI 5.00 */
+		{ 207, 2, 0xffff, "vs_max_color", "NVDI" }, /* NVDI 5.00 */
+		{ 207, 3, 0xffff, "vs_weight_color", "NVDI" }, /* NVDI 5.00 */
+		{ 208, 0, 0xffff, "v_create_itab", "NVDI" }, /* NVDI 5.00 */
+		{ 208, 1, 0xffff, "v_delete_itab", "NVDI" }, /* NVDI 5.00 */
+		{ 209, 0, 0xffff, "vq_hilite_color", "NVDI" }, /* NVDI 5.00 */
+		{ 209, 1, 0xffff, "vq_min_color", "NVDI" }, /* NVDI 5.00 */
+		{ 209, 2, 0xffff, "vq_max_color", "NVDI" }, /* NVDI 5.00 */
+		{ 209, 3, 0xffff, "vq_weight_color", "NVDI" }, /* NVDI 5.00 */
+		{ 224, 100, 0xffff, "vs_backmap", "Speedo" }, /* SpeedoGDOS 5.1 */
+		{ 224, 101, 0xffff, "vs_outmode", "Speedo" }, /* SpeedoGDOS 5.1 */
+		{ 224, 105, 0xffff, "vs_use_fonts", "Speedo" }, /* SpeedoGDOS 5.1 */
+		{ 225, 0, 0xffff, "vqt_drv_avail", "Speedo" }, /* SpeedoGDOS 5.1 */
+		{ 226, 1, 0xffff, "v_set_cachedir", "Speedo" }, /* SpeedoGDOS 5.1 */
+		{ 226, 2, 0xffff, "v_get_cachedir", "Speedo" }, /* SpeedoGDOS 5.1 */
+		{ 226, 3, 0xffff, "v_def_cachedir", "Speedo" }, /* SpeedoGDOS 5.1 */
+		{ 226, 4, 0xffff, "v_clr_cachedir", "Speedo" }, /* SpeedoGDOS 5.1 */
+		{ 226, 5, 0xffff, "v_delete_cache", "Speedo" }, /* SpeedoGDOS 5.1 */
+		{ 226, 6, 0xffff, "v_save_cache", "Speedo" }, /* SpeedoGDOS 5.1 */
+		{ 229, 0, 0xffff, "vqt_xfntinfo", "GDOS" }, /* NVDI 3.02 */
+		{ 230, 0, 0xffff, "vst_name", "GDOS" }, /* NVDI 3.02 */
+		{ 230, 100, 0xffff, "vqt_name_and_id", "GDOS" }, /* NVDI 3.02 */
+		{ 231, 0, 0xffff, "vst_width", "GDOS" }, /* NVDI 3.00 */
+		{ 232, 0, 0xffff, "vqt_fontheader", "GDOS" }, /* NVDI 3.00 */
+		{ 233, 0, 0xffff, "v_mono_ftext", "Speedo" }, /* SpeedoGDOS 5.1 */
+		{ 234, 0, 0xffff, "vqt_trackkern", "GDOS" }, /* NVDI 3.00 */
+		{ 235, 0, 0xffff, "vqt_pairkern", "GDOS" }, /* NVDI 3.00 */
+		{ 236, 0, 0xffff, "vst_charmap", "GDOS" }, /* NVDI 3.00 */
+		{ 236, 0, 0xffff, "vst_map_mode", "GDOS" }, /* NVDI 4.00 */
+		{ 237, 0, 0xffff, "vst_kern", "GDOS" }, /* NVDI 3.00 */
+		{ 237, 0, 0xffff, "vst_track_offset", "GDOS" }, /* NVDI 3.00 */
+		{ 238, 0, 0xffff, "vq_ptsinsz", "GDOS" },
+		{ 239, 0, 0xffff, "v_getbitmap_info", "GDOS" }, /* NVDI 3.00 */
+		{ 240, 0, 0xffff, "vqt_f_extent", "GDOS" }, /* NVDI 3.00 */
+		{ 240, 4200, 0xffff, "vqt_real_extent", "GDOS" }, /* NVDI 3.00 */
+		{ 241, 0, 0xffff, "v_ftext", "GDOS" }, /* NVDI 3.00 */
+		{ 242, 0, 0xffff, "v_killoutline", "GDOS" }, /* FSM */
+		{ 243, 0, 0xffff, "v_getoutline", "GDOS" }, /* NVDI 3.00 */
+		{ 243, 1, 0xffff, "v_get_outline", "GDOS" }, /* NVDI 5.00 */
+		{ 243, 31, 0xffff, "v_fgetoutline", "Speedo" }, /* SpeedoGDOS 5.0d */
+		{ 244, 0, 0xffff, "vst_scratch", "Speedo" },
+		{ 245, 0, 0xffff, "vst_error", "Speedo" }, /* SpeedoGDOS 4.00 */
+		{ 246, 0, 0xffff, "vst_arbpt", "GDOS" }, /* SpeedoGDOS 4.00 */
+		{ 246, 0, 0xffff, "vst_arbpt32", "GDOS" }, /* NVDI 3.00 */
+		{ 247, 0, 0xffff, "vqt_advance", "GDOS" }, /* SpeedoGDOS 4.00 */
+		{ 247, 0, 0xffff, "vqt_advance32", "GDOS" }, /* NVDI 3.00 */
+		{ 248, 0, 0xffff, "vq_devinfo", "GDOS" }, /* NVDI 3.00 */
+		{ 248, 0, 0xffff, "vqt_devinfo", "GDOS" }, /* SpeedoGDOS 4.00 */
+		{ 248, 4242, 0xffff, "vq_ext_devinfo", "GDOS" }, /* NVDI 3.00 */
+		{ 249, 0, 0xffff, "v_savecache", "Speedo" },
+		{ 250, 0, 0xffff, "v_loadcache", "Speedo" },
+		{ 251, 0, 0xffff, "v_flushcache", "GDOS" }, /* NVDI */
+		{ 252, 0, 0xffff, "vst_setsize32", "GDOS" }, /* NVDI 3.00 */
+		{ 252, 0, 0xffff, "vst_setsize", "GDOS" }, /* SpeedoGDOS 4.00 */
+		{ 253, 0, 0xffff, "vst_skew", "GDOS" }, /* NVDI 3.00 */
+		{ 254, 0, 0xffff, "vqt_get_table", "GDOS" }, /* SpeedoGDOS 4.00 */
+		{ 255, 0, 0xffff, "vqt_cachesize", "Speedo" }, /* SpeedoGDOS 4.00 */
+		{ 255, 100, 0xffff, "vqt_cacheinfo", "Speedo" }, /* SpeedoGDOS 4.00 */
 	};
 
+	*extra_info = NULL;
 	if (opcode == 5)
 	{
 		if (subcode < ARRAY_SIZE(names_opcode5)) {
 			return names_opcode5[subcode];
 		}
-		if (subcode >= 98) {
-			subcode -= 98;
-			if (subcode < ARRAY_SIZE(names_opcode5_98)) {
-				return names_opcode5_98[subcode];
-			}
-		}
 	}
 	else if (opcode == 11)
 	{
@@ -584,17 +704,33 @@ static const char* VDI_Opcode2Name(Uint16 opcode, Uint16 subcode)
 	}
 	else if (opcode < ARRAY_SIZE(names_0))
 	{
+		if (opcode == 1 && nintin >= 16)
+			return "v_opnprn";
+		if (opcode == 6 && subcode == 13)
+			return "v_bez";
+		if (opcode == 9 && subcode == 13)
+			return "v_bez_fill";
 		return names_0[opcode];
 	}
-	else if (opcode >= 100)
+	else if (opcode > 100)
 	{
-		opcode -= 100;
-		if (opcode < ARRAY_SIZE(names_100))
+		Uint16 idx = opcode - 100;
+		if (idx < ARRAY_SIZE(names_100))
 		{
-			return names_100[opcode];
+			return names_100[idx];
 		}
 	}
-	return "GDOS?";
+	for (i = 0; i < ARRAY_SIZE(names_other); i++)
+		if (names_other[i].opcode == opcode)
+		{
+			if ((names_other[i].subcode == subcode || names_other[i].subcode == 0xffff) &&
+				(nintin >= names_other[i].nintin || names_other[i].nintin == 0xffff))
+			{
+				*extra_info = names_other[i].extra_info;
+				return names_other[i].name;
+			}
+		}
+	return "???";
 }
 
 /**
@@ -603,12 +739,14 @@ static const char* VDI_Opcode2Name(Uint16 opcode, Uint16 subcode)
  */
 void VDI_Info(FILE *fp, Uint32 bShowOpcodes)
 {
-	Uint16 opcode, subcode;
+	Uint16 opcode, subcode, nintin;
+	const char *extra_info;
+	const char *name;
 
 	if (bShowOpcodes)
 	{
 		Uint16 opcode;
-		for (opcode = 0; opcode < 0x84; )
+		for (opcode = 0; opcode <= 0x84; )
 		{
 			if (opcode == 0x28)
 			{
@@ -616,7 +754,7 @@ void VDI_Info(FILE *fp, Uint32 bShowOpcodes)
 				opcode = 0x64;
 			}
 			fprintf(fp, "%02x %-16s",
-				opcode, VDI_Opcode2Name(opcode, 0));
+				opcode, VDI_Opcode2Name(opcode, 0, 0, &extra_info));
 			if (++opcode % 4 == 0) fputs("\n", fp);
 		}
 		return;
@@ -640,8 +778,10 @@ void VDI_Info(FILE *fp, Uint32 bShowOpcodes)
 
 	fputs("Latest VDI Parameter block:\n", fp);
 	subcode = STMemory_ReadWord(VDIControl+2*5);
-	fprintf(fp, "- Opcode/Subcode: %hd/%hd (%s)\n",
-		opcode, subcode, VDI_Opcode2Name(opcode, subcode));
+	nintin = STMemory_ReadWord(VDIControl+2*3);
+	name = VDI_Opcode2Name(opcode, subcode, nintin, &extra_info);
+	fprintf(fp, "- Opcode/Subcode: %hd/%hd (%s%s%s)\n",
+		opcode, subcode, name, extra_info ? ", " : "", extra_info ? extra_info : "");
 	fprintf(fp, "- Device handle: %d\n",
 		STMemory_ReadWord(VDIControl+2*6));
 	fprintf(fp, "- Control: %#8x\n", VDIControl);
@@ -741,9 +881,11 @@ bool VDI_AES_Entry(void)
 #if ENABLE_TRACING
 		{
 		Uint16 subcode = STMemory_ReadWord(VDIControl+2*5);
-		LOG_TRACE(TRACE_OS_VDI, "VDI call %3hd/%3hd (%s)\n",
-			  VDIOpCode, subcode,
-			  VDI_Opcode2Name(VDIOpCode, subcode));
+		Uint16 nintin = STMemory_ReadWord(VDIControl+2*3);
+		const char *extra_info;
+		const char *name = VDI_Opcode2Name(VDIOpCode, subcode, nintin, &extra_info);
+		LOG_TRACE(TRACE_OS_VDI, "VDI call %3hd/%3hd (%s%s%s)\n",
+			  VDIOpCode, subcode, name, extra_info ? ", " : "", extra_info ? extra_info : "");
 		}
 #endif
 		/* Only workstation open needs to be handled at trap return */


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/