[hatari-devel] Native feature proposal

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


Hi,

here's a proposal for two very handy NF calls I've patched into my Hatari branch for a while now:

NF_STDERR_NUM: output a number without the need to convert it to a string on the ST. I often output internal state variables of a running programm using NF_STDERR (e.g. taken frames per render, clock-cycles of specific parts, control variables etc.). This way printing these taking almost no cpu time and the developed programs run-time behaviour isn't changed too much.

NF_FRAMEPOSITION: copies frame info (nVBLs, nHBL, nScanlinesPerFrame, nCyclesPerLine and CyclesPerVBL) into a memory area given by the guest program. This makes it very easy to time code parts cycle-exact at runtime and do a quick check on optimizations as well as the average time a code part takes between frames. Also it's easier to check where exactly a code runs (relative to the frame start).

Any objections?
>From d541bb8fe9fae20c6ce3e25a5cca4b3c1ed0eb70 Mon Sep 17 00:00:00 2001
From: tin <tin>
Date: Mon, 30 Apr 2018 18:37:01 +0200
Subject: [PATCH] -added new natfeats: NF_FRAMEPOSITION (guest can check
 current video position values), NF_STDERR_NUM (guest can output a numerical
 value directly instead of having to convert to a string)

---
 src/debug/natfeats.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 62 insertions(+), 3 deletions(-)

diff --git a/src/debug/natfeats.c b/src/debug/natfeats.c
index c130f1a..e891a27 100644
--- a/src/debug/natfeats.c
+++ b/src/debug/natfeats.c
@@ -23,8 +23,14 @@ const char Natfeats_fileid[] = "Hatari natfeats.c : " __DATE__ " " __TIME__;
 #include "debugui.h"
 #include "nf_scsidrv.h"
 #include "log.h"
-
-
+#include "cycles.h"
+
+extern int nVBLs;                      					/* VBL Counter */ 
+extern int nHBL;                                       	/* HBL line */
+extern int nScanlinesPerFrame;                   		/* Number of scan lines per frame */
+extern int nCyclesPerLine;                       		/* Cycles per horizontal line scan */
+static int CyclesPerVBL;							/* Number of cycles per VBL */
+  
 /* whether to allow XBIOS(255) style
  * Hatari command line parsing with "command" NF
  */
@@ -163,6 +169,57 @@ static bool nf_fastforward(Uint32 stack, Uint32 subid, Uint32 *retval)
 	return true;
 }
 
+/**
+ * NF_FRAMEPOSITION - allow emulated programm to query exact beam position (scanline+position in scanline) and frame no. since emulation start
+ * Stack arguments are:
+ * - pointer to buffer for 
+ * 		framenumber.l, 
+ * 		scanline.l, 
+ * 		current cycle in frame.l 
+ * 		cycles per frame.l, 
+ * 		cycles per line.l, 
+ * 		scanlines per frame.l 
+ */
+static bool nf_frameinfo(Uint32 stack, Uint32 subid, Uint32 *retval)
+{
+	Uint32 ptr;
+
+	ptr = STMemory_ReadLong(stack);
+
+	if ( !STMemory_CheckAreaType ( ptr, 6*4, ABFLAG_RAM | ABFLAG_ROM ) ) {
+		M68000_BusError(ptr, BUS_ERROR_READ, BUS_ERROR_SIZE_BYTE, BUS_ERROR_ACCESS_DATA);
+		return false;
+	}
+	LOG_TRACE(TRACE_NATFEATS, "NF_FRAMEPOSITION(0x%x)\n", ptr);
+
+	int FrameCycles = Cycles_GetCounter(CYCLES_COUNTER_VIDEO);
+    STMemory_WriteLong(ptr+SIZE_LONG*0, nVBLs); 
+    STMemory_WriteLong(ptr+SIZE_LONG*1, nHBL); 
+    STMemory_WriteLong(ptr+SIZE_LONG*2, FrameCycles); 
+    STMemory_WriteLong(ptr+SIZE_LONG*3, CyclesPerVBL); 
+    STMemory_WriteLong(ptr+SIZE_LONG*4, nCyclesPerLine); 
+    STMemory_WriteLong(ptr+SIZE_LONG*5, nScanlinesPerFrame); 
+    		
+	return true;
+}
+
+/**
+ * NF_STDERR_NUM - print numeric value to stderr
+ * Stack arguments are:
+ * - pointer to buffer containing the value (long)
+ */
+static bool nf_stderr_num(Uint32 stack, Uint32 subid, Uint32 *retval)
+{
+	Uint32 value;
+
+	value = STMemory_ReadLong(stack);
+	LOG_TRACE(TRACE_NATFEATS, "NF_STDERR_NUM(0x%x)\n", value);
+
+	*retval = fprintf(stderr, "%d ", value);
+	fflush(stderr);
+	return true;
+}
+
 #if NF_COMMAND
 /**
  * NF_COMMAND - execute Hatari (cli / debugger) command
@@ -206,7 +263,9 @@ static const struct {
 	{ "NF_SHUTDOWN", true,  nf_shutdown },
 	{ "NF_EXIT",     false, nf_exit },
 	{ "NF_DEBUGGER", false, nf_debugger },
-	{ "NF_FASTFORWARD", false,  nf_fastforward }
+	{ "NF_FASTFORWARD", false,  nf_fastforward },
+	{ "NF_FRAMEINFO", false,  nf_frameinfo },
+	{ "NF_STDERR_NUM", false, nf_stderr_num },
 #if defined(__linux__)        
         ,{ "NF_SCSIDRV",  true, nf_scsidrv }
 #endif
-- 
2.10.1



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