From 2d25a5705fb2f326a04c7f2ea012f2c74d578959 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia <wavexx@thregr.org> Date: Sat, 22 May 2021 15:04:27 +0200 Subject: [PATCH] Fix D2 to read the entire SRAM content Allow to read up to 0x21ff, which is the last byte of SRAM. Set default starting address to 0x200, which is the first true byte. 0x0-200 is mapped to register/io space and could cause issues when read from bi-directional registers. --- Firmware/Dcodes.cpp | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/Firmware/Dcodes.cpp b/Firmware/Dcodes.cpp index 9a353be8..5af12e2e 100644 --- a/Firmware/Dcodes.cpp +++ b/Firmware/Dcodes.cpp @@ -246,32 +246,31 @@ void dcode_1() ### D2 - Read/Write RAM <a href="https://reprap.org/wiki/G-code#D2:_Read.2FWrite_RAM">D3: Read/Write RAM</a> This command can be used without any additional parameters. It will read the entire RAM. #### Usage - + D2 [ A | C | X ] - + #### Parameters - - `A` - Address (x0000-x1fff) - - `C` - Count (1-8192) + - `A` - Address (x0000-x21ff) + - `C` - Count (1-8704) - `X` - Data #### Notes - The hex address needs to be lowercase without the 0 before the x - - Count is decimal + - Count is decimal - The hex data needs to be lowercase - + */ void dcode_2() { - LOG("D2 - Read/Write RAM\n"); - uint16_t address = 0x0000; //default 0x0000 - uint16_t count = 0x2000; //default 0x2000 (entire ram) - if (code_seen('A')) // Address (0x0000-0x1fff) + DBG(_N("D2 - Read/Write RAM\n")); + uint16_t address = 0x200; // default to start of sram + uint16_t count = 0x2200; // entire addressable space + if (code_seen('A')) // Address (0x0000-0x21ff) address = (strchr_pointer[1] == 'x')?strtol(strchr_pointer + 2, 0, 16):(int)code_value(); - if (code_seen('C')) // Count (0x0001-0x2000) + if (code_seen('C')) // Count (0x0000-0x2200) count = (int)code_value(); - address &= 0x1fff; - if (count > 0x2000) count = 0x2000; - if ((address + count) > 0x2000) count = 0x2000 - address; + if (address > 0x2200) address = 0x2200; + if ((address + count) > 0x2200) count = 0x2200 - address; if (code_seen('X')) // Data { uint8_t data[16]; @@ -280,7 +279,7 @@ void dcode_2() { for (uint16_t i = 0; i < count; i++) *((uint8_t*)(address + i)) = data[i]; - LOG("%d bytes written to RAM at address %04x", count, address); + DBG(_N("%d bytes written to RAM at address 0x%04x\n"), count, address); } else count = 0;