From e99cb9b06817a135d8eb51adda56739b0197ac3d Mon Sep 17 00:00:00 2001 From: "Satoshi N. M" Date: Mon, 15 Jan 2018 11:21:42 -0800 Subject: [PATCH 1/9] Step 6502 CPU while polling for USB between each instruction --- src/main.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main.c b/src/main.c index 1c17f4f..3b8367b 100644 --- a/src/main.c +++ b/src/main.c @@ -86,9 +86,7 @@ static const char *usb_strings[] = { static bool paused = true; void sys_tick_handler(void) { - if (paused) return; - step6502(); - gpio_toggle(GPIOC, GPIO13); + // TODO: measure frequency } @@ -202,7 +200,13 @@ int main(void) reset6502(); - while (1) + while (1) { usbd_poll(usbd_dev); + + if (!paused) { + step6502(); + gpio_toggle(GPIOC, GPIO13); + } + } } From af6043e02876f3897e001f704221f08542ca60d3 Mon Sep 17 00:00:00 2001 From: "Satoshi N. M" Date: Mon, 15 Jan 2018 12:56:56 -0800 Subject: [PATCH 2/9] Build without optimizations to make debugging easier --- src/Makefile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Makefile b/src/Makefile index 8a62758..0b6759e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -3,7 +3,7 @@ MAKEFLAGS += --no-print-dir Q := @ endif -OPT_FLAGS ?= -O2 +OPT_FLAGS = -O0 -g CFLAGS += -Wall -Wextra -Werror -Wno-char-subscripts\ $(OPT_FLAGS) -std=gnu99 -g3 -MD \ @@ -22,7 +22,6 @@ CROSS_COMPILE ?= arm-none-eabi- CC = $(CROSS_COMPILE)gcc OBJCOPY = $(CROSS_COMPILE)objcopy -OPT_FLAGS = -Os CFLAGS += -mcpu=cortex-m3 -mthumb \ -DSTM32F1 -DDISCOVERY_STLINK -I../libopencm3/include \ -I . From 09add1f057a392913c1c9c55ce1bc5457aa021bd Mon Sep 17 00:00:00 2001 From: "Satoshi N. M" Date: Mon, 15 Jan 2018 13:23:06 -0800 Subject: [PATCH 3/9] Change to use USB interrupts --- src/main.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index 3b8367b..cb38a58 100644 --- a/src/main.c +++ b/src/main.c @@ -187,6 +187,10 @@ void write6502(uint16_t address, uint8_t value) { } +void usb_lp_can_rx0_isr(void) { + usbd_poll(usbd_dev); +} + int main(void) { setup_clock(); @@ -198,11 +202,12 @@ int main(void) usbd_register_set_config_callback(usbd_dev, usb_set_config); usbd_register_reset_callback(usbd_dev, usb_reset); + nvic_set_priority(NVIC_USB_LP_CAN_RX0_IRQ, 2 << 4); + nvic_enable_irq(NVIC_USB_LP_CAN_RX0_IRQ); + reset6502(); while (1) { - usbd_poll(usbd_dev); - if (!paused) { step6502(); gpio_toggle(GPIOC, GPIO13); From 6ab397e7afe8be261198444afd3f073e1f468146 Mon Sep 17 00:00:00 2001 From: "Satoshi N. M" Date: Mon, 15 Jan 2018 13:23:16 -0800 Subject: [PATCH 4/9] Count milliseconds --- src/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index cb38a58..2f2b619 100644 --- a/src/main.c +++ b/src/main.c @@ -84,12 +84,14 @@ static const char *usb_strings[] = { }; static bool paused = true; + +volatile uint32_t millis = 0; void sys_tick_handler(void) { + ++millis; // TODO: measure frequency } - static void usb_set_config(usbd_device *dev, uint16_t wValue) { cdcacm_set_config(dev, wValue); From 554bdf33ce671e60d12cdfd8052c82aeaf1cfda6 Mon Sep 17 00:00:00 2001 From: "Satoshi N. M" Date: Mon, 15 Jan 2018 13:58:32 -0800 Subject: [PATCH 5/9] Revert "Count milliseconds" This reverts commit 6ab397e7afe8be261198444afd3f073e1f468146. --- src/main.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main.c b/src/main.c index 2f2b619..cb38a58 100644 --- a/src/main.c +++ b/src/main.c @@ -84,14 +84,12 @@ static const char *usb_strings[] = { }; static bool paused = true; - -volatile uint32_t millis = 0; void sys_tick_handler(void) { - ++millis; // TODO: measure frequency } + static void usb_set_config(usbd_device *dev, uint16_t wValue) { cdcacm_set_config(dev, wValue); From e82d86aa25cdfa05499af18b725859b7c2ef77bb Mon Sep 17 00:00:00 2001 From: "Satoshi N. M" Date: Mon, 15 Jan 2018 13:58:35 -0800 Subject: [PATCH 6/9] Revert "Change to use USB interrupts" This reverts commit 09add1f057a392913c1c9c55ce1bc5457aa021bd. --- src/main.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main.c b/src/main.c index cb38a58..3b8367b 100644 --- a/src/main.c +++ b/src/main.c @@ -187,10 +187,6 @@ void write6502(uint16_t address, uint8_t value) { } -void usb_lp_can_rx0_isr(void) { - usbd_poll(usbd_dev); -} - int main(void) { setup_clock(); @@ -202,12 +198,11 @@ int main(void) usbd_register_set_config_callback(usbd_dev, usb_set_config); usbd_register_reset_callback(usbd_dev, usb_reset); - nvic_set_priority(NVIC_USB_LP_CAN_RX0_IRQ, 2 << 4); - nvic_enable_irq(NVIC_USB_LP_CAN_RX0_IRQ); - reset6502(); while (1) { + usbd_poll(usbd_dev); + if (!paused) { step6502(); gpio_toggle(GPIOC, GPIO13); From 7612198f415ec25e7914ff153492057f8748da86 Mon Sep 17 00:00:00 2001 From: "Satoshi N. M" Date: Mon, 15 Jan 2018 13:58:38 -0800 Subject: [PATCH 7/9] Revert "Step 6502 CPU while polling for USB between each instruction" This reverts commit e99cb9b06817a135d8eb51adda56739b0197ac3d. --- src/main.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main.c b/src/main.c index 3b8367b..1c17f4f 100644 --- a/src/main.c +++ b/src/main.c @@ -86,7 +86,9 @@ static const char *usb_strings[] = { static bool paused = true; void sys_tick_handler(void) { - // TODO: measure frequency + if (paused) return; + step6502(); + gpio_toggle(GPIOC, GPIO13); } @@ -200,13 +202,7 @@ int main(void) reset6502(); - while (1) { + while (1) usbd_poll(usbd_dev); - - if (!paused) { - step6502(); - gpio_toggle(GPIOC, GPIO13); - } - } } From 01a0f0f63c46233965998c4f071baab6efd46b7b Mon Sep 17 00:00:00 2001 From: "Satoshi N. M" Date: Mon, 15 Jan 2018 14:17:51 -0800 Subject: [PATCH 8/9] Add ^F command to measure and show frequency in hertz --- README.md | 1 + src/main.c | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 67b0067..ca41343 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ Special commands built-in, not passed to the ACIA and 6502: | --------- | ------ | | ^V | Show `pill_6502` version | | ^P | Pause/resume 6502 processor execution | +| ^F | Show frequency | | ^R | Reset the 6502 processor (also reset on USB reset) | | ^E | Local echo toggle, off by default | | ^T | Show clock ticks and instruction count | diff --git a/src/main.c b/src/main.c index 1c17f4f..5928418 100644 --- a/src/main.c +++ b/src/main.c @@ -84,9 +84,11 @@ static const char *usb_strings[] = { }; static bool paused = true; +uint32_t millis = 0; void sys_tick_handler(void) { if (paused) return; + ++millis; step6502(); gpio_toggle(GPIOC, GPIO13); } @@ -110,6 +112,25 @@ char *process_serial_command(char b) { } else if (b == '\x10') { // ^P paused = !paused; return paused ? "paused" : "resumed"; + } else if (b == '\x06') { // ^F + static uint32_t last_ticks = 0; + static uint32_t last_millis = 0; + if (last_ticks == 0) { + last_ticks = clockticks6502; + last_millis = millis; + + return "press ^F again to measure frequency"; + } + + uint32_t hz = (clockticks6502 - last_ticks) * 1000 / (millis - last_millis); + + static char buf[64]; + snprintf(buf, sizeof(buf), "%ld Hz", hz); + + last_ticks = clockticks6502; + last_millis = millis; + + return buf; } else if (b == '\x12') { // ^R reset6502(); paused = false; @@ -122,7 +143,7 @@ char *process_serial_command(char b) { snprintf(buf, sizeof(buf), "%ld ticks\r\n%ld instructions", clockticks6502, instructions); return buf; } else if (b == '\x07') { // ^G - return "^V=version ^R=reset ^E=echo ^P=pause ^T=ticks ^G=help"; + return "^V=version ^R=reset ^E=echo ^P=pause ^F=freq ^T=ticks ^G=help"; } return NULL; From b79a6744a0798ea7277b55164813be9c8747a4a3 Mon Sep 17 00:00:00 2001 From: "Satoshi N. M" Date: Mon, 15 Jan 2018 14:23:12 -0800 Subject: [PATCH 9/9] Merge emulated frequency measurement into ^T command --- README.md | 3 +-- src/main.c | 35 +++++++++++++++-------------------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index ca41343..68c151a 100644 --- a/README.md +++ b/README.md @@ -22,10 +22,9 @@ Special commands built-in, not passed to the ACIA and 6502: | --------- | ------ | | ^V | Show `pill_6502` version | | ^P | Pause/resume 6502 processor execution | -| ^F | Show frequency | | ^R | Reset the 6502 processor (also reset on USB reset) | | ^E | Local echo toggle, off by default | -| ^T | Show clock ticks and instruction count | +| ^T | Show clock ticks, instruction count, and frequency since last ^T | | ^G | Show help | Intended to be somewhat compatible with [Grant Searle's Simple6502](http://searle.hostei.com/grant/6502/Simple6502.html), diff --git a/src/main.c b/src/main.c index 5928418..7916d19 100644 --- a/src/main.c +++ b/src/main.c @@ -113,24 +113,6 @@ char *process_serial_command(char b) { paused = !paused; return paused ? "paused" : "resumed"; } else if (b == '\x06') { // ^F - static uint32_t last_ticks = 0; - static uint32_t last_millis = 0; - if (last_ticks == 0) { - last_ticks = clockticks6502; - last_millis = millis; - - return "press ^F again to measure frequency"; - } - - uint32_t hz = (clockticks6502 - last_ticks) * 1000 / (millis - last_millis); - - static char buf[64]; - snprintf(buf, sizeof(buf), "%ld Hz", hz); - - last_ticks = clockticks6502; - last_millis = millis; - - return buf; } else if (b == '\x12') { // ^R reset6502(); paused = false; @@ -139,11 +121,24 @@ char *process_serial_command(char b) { local_echo = !local_echo; return local_echo ? "local echo enabled" : "local echo disabled"; } else if (b == '\x14') { // ^T + static uint32_t last_ticks = 0; + static uint32_t last_millis = 0; + uint32_t hz = 0; + if (last_ticks != 0) { + uint32_t elapsed_ticks = clockticks6502 - last_ticks; + uint32_t elapsed_millis = millis - last_millis; + + if (elapsed_millis != 0) hz = elapsed_ticks * 1000 / elapsed_millis; + } + + last_ticks = clockticks6502; + last_millis = millis; + static char buf[64]; - snprintf(buf, sizeof(buf), "%ld ticks\r\n%ld instructions", clockticks6502, instructions); + snprintf(buf, sizeof(buf), "%ld ticks\r\n%ld instructions\r\n%ld Hz", clockticks6502, instructions, hz); return buf; } else if (b == '\x07') { // ^G - return "^V=version ^R=reset ^E=echo ^P=pause ^F=freq ^T=ticks ^G=help"; + return "^V=version ^R=reset ^E=echo ^P=pause ^T=timing ^G=help"; } return NULL;