diff cpu_dsl.py @ 2676:7e86ec94c899

Implement breakpoints in new 68K core
author Michael Pavone <pavone@retrodev.com>
date Sat, 15 Mar 2025 23:15:05 -0700
parents 6894a25ebfaa
children e3394457427e
line wrap: on
line diff
--- a/cpu_dsl.py	Fri Mar 14 01:18:11 2025 -0700
+++ b/cpu_dsl.py	Sat Mar 15 23:15:05 2025 -0700
@@ -2056,6 +2056,8 @@
 		self.interrupt = info.get('interrupt', [None])[0]
 		self.sync_cycle = info.get('sync_cycle', [None])[0]
 		self.includes = info.get('include', [])
+		self.pc_reg = info.get('pc_reg', [None])[0]
+		self.pc_offset = info.get('pc_offset', [0])[0]
 		self.flags = flags
 		self.lastDst = None
 		self.scopes = []
@@ -2088,6 +2090,8 @@
 		hFile.write('\n#define {0}_'.format(macro))
 		hFile.write('\n#include <stdio.h>')
 		hFile.write('\n#include "backend.h"')
+		if self.pc_reg:
+			hFile.write('\n#include "tern.h"')
 		hFile.write(f'\n\ntypedef struct {self.prefix}options {self.prefix}options;')
 		hFile.write(f'\n\ntypedef struct {self.prefix}context {self.prefix}context;')
 		for decl in self.declares:
@@ -2100,6 +2104,8 @@
 		hFile.write('\n};')
 		hFile.write(f'\n\nstruct {self.prefix}context {{')
 		hFile.write(f'\n\t{self.prefix}options *opts;')
+		if self.pc_reg:
+			hFile.write('\n\ttern_node *breakpoints;');
 		self.regs.writeHeader(otype, hFile)
 		hFile.write('\n};')
 		hFile.write('\n')
@@ -2201,6 +2207,36 @@
 				pieces.append('\nvoid {pre}execute({type} *context, uint32_t target_cycle)'.format(pre = self.prefix, type = self.context_type))
 				pieces.append('\n{')
 				pieces.append('\n\t{sync}(context, target_cycle);'.format(sync=self.sync_cycle))
+				if self.pc_reg:
+					pieces.append('\n\tif (context->breakpoints) {')
+					pieces.append('\n\t\twhile (context->cycles < target_cycle)')
+					pieces.append('\n\t\t{')
+					if self.interrupt in self.subroutines:
+						pieces.append('\n\t\t\tif (context->cycles >= context->sync_cycle) {')
+						pieces.append(f'\n\t\t\t\t{self.sync_cycle}(context, target_cycle);')
+						pieces.append('\n\t\t\t}')
+						self.meta = {}
+						self.temp = {}
+						intpieces = []
+						self.subroutines[self.interrupt].inline(self, [], intpieces, otype, None)
+						for size in self.temp:
+							pieces.append('\n\t\t\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size))
+						pieces += intpieces
+					if self.pc_offset:
+						pieces.append(f'\n\t\t\tuint32_t debug_pc = context->{self.pc_reg} - {self.pc_offset};')
+						pc_reg = 'debug_pc'
+					else:
+						pc_reg = 'context->' + self.pc_reg
+					pieces.append('\n\t\t\tchar key_buf[6];')
+					pieces.append(f'\n\t\t\tdebug_handler handler = tern_find_ptr(context->breakpoints, tern_int_key({pc_reg}, key_buf));')
+					pieces.append('\n\t\t\tif (handler) {')
+					pieces.append(f'\n\t\t\t\thandler(context, {pc_reg});')
+					pieces.append('\n\t\t\t}')
+					self.meta = {}
+					self.temp = {}
+					self.subroutines[self.body].inline(self, [], pieces, otype, None)
+					pieces.append('\n\t}')
+					pieces.append('\n\t} else {')
 				pieces.append('\n\twhile (context->cycles < target_cycle)')
 				pieces.append('\n\t{')
 				if self.interrupt in self.subroutines:
@@ -2218,6 +2254,8 @@
 				self.temp = {}
 				self.subroutines[self.body].inline(self, [], pieces, otype, None)
 				pieces.append('\n\t}')
+				if self.pc_reg:
+					pieces.append('\n\t}')
 				pieces.append('\n}')
 			body.append('\nstatic void unimplemented({pre}context *context, uint32_t target_cycle)'.format(pre = self.prefix))
 			body.append('\n{')