diff rf5c164.c @ 2243:0d1d5dccdd28

Initial implementation of oscilloscope debug view
author Michael Pavone <pavone@retrodev.com>
date Tue, 22 Nov 2022 17:57:02 -0800
parents 4fbe1e7c4a73
children 709036ee222a
line wrap: on
line diff
--- a/rf5c164.c	Wed Sep 21 23:16:39 2022 -0700
+++ b/rf5c164.c	Tue Nov 22 17:57:02 2022 -0800
@@ -92,10 +92,15 @@
 				pcm->channels[pcm->cur_channel].cur_ptr = pcm->channels[pcm->cur_channel].regs[ST] << 19;
 				//printf("chan %d START %X (%X raw)\n", pcm->cur_channel, pcm->channels[pcm->cur_channel].cur_ptr >> 11, pcm->channels[pcm->cur_channel].cur_ptr);
 				pcm->channels[pcm->cur_channel].state = NORMAL;
+				pcm->channels[pcm->cur_channel].trigger = 1;
 			} else if (pcm->channels[pcm->cur_channel].state == LOOP) {
+				uint32_t old_ptr = pcm->channels[pcm->cur_channel].cur_ptr;
 				pcm->channels[pcm->cur_channel].cur_ptr = (pcm->channels[pcm->cur_channel].regs[LSH] << 19) | (pcm->channels[pcm->cur_channel].regs[LSL] << 11);
 				//printf("chan %d LOOP %X (%X raw)\n", pcm->cur_channel, pcm->channels[pcm->cur_channel].cur_ptr >> 11, pcm->channels[pcm->cur_channel].cur_ptr);
 				pcm->channels[pcm->cur_channel].state = NORMAL;
+				pcm->channels[pcm->cur_channel].trigger = old_ptr != pcm->channels[pcm->cur_channel].cur_ptr;
+			} else {
+				pcm->channels[pcm->cur_channel].trigger = 0;
 			}
 		}
 		write_if_not_sounding(pcm);
@@ -144,8 +149,13 @@
 			int16_t left = (sample * (pcm->channels[pcm->cur_channel].regs[PAN] >> 4)) >> 5;
 			int16_t right = (sample * (pcm->channels[pcm->cur_channel].regs[PAN] & 0xF)) >> 5;
 			//printf("chan %d, raw %X, sample %d, left %d, right %d, ptr %X (raw %X)\n", pcm->cur_channel, pcm->channels[pcm->cur_channel].sample, sample, left, right, pcm->channels[pcm->cur_channel].cur_ptr >> 11, pcm->channels[pcm->cur_channel].cur_ptr);
+			if (pcm->scope) {
+				scope_add_sample(pcm->scope, pcm->channels[pcm->cur_channel].scope_channel, sample, pcm->channels[pcm->cur_channel].trigger);
+			}
 			pcm->left += left;
 			pcm->right += right;
+		} else if (pcm->scope) {
+			scope_add_sample(pcm->scope, pcm->channels[pcm->cur_channel].scope_channel, 0, 0);
 		}
 		write_if_not_sounding(pcm);
 		CHECK;
@@ -228,3 +238,22 @@
 		return 0xFF;
 	}
 }
+
+void rf5c164_enable_scope(rf5c164* pcm, oscilloscope *scope)
+{
+	static const char *names[] = {
+		"Richo #1",
+		"Richo #2",
+		"Richo #3",
+		"Richo #4",
+		"Richo #5",
+		"Richo #6",
+		"Richo #7",
+		"Richo #8",
+	};
+	pcm->scope = scope;
+	for (int i = 0; i < 8; i ++)
+	{
+		pcm->channels[i].scope_channel = scope_add_channel(scope, names[i], 50000000 / (pcm->clock_step * 96));
+	}
+}