diff options
-rw-r--r-- | ape/main.c | 13 | ||||
-rw-r--r-- | include/types.h | 6 | ||||
-rw-r--r-- | libs/Network/include/Network.h | 6 | ||||
-rw-r--r-- | libs/printf/ape_console.h | 52 | ||||
-rw-r--r-- | libs/printf/ape_putchar.c | 48 |
5 files changed, 102 insertions, 23 deletions
@@ -61,6 +61,7 @@ #include <types.h> #ifndef CXX_SIMULATOR +#include <ape_console.h> #include <printf.h> #endif @@ -335,16 +336,8 @@ bool handle_reset(void) void __attribute__((noreturn)) __start() { - bool full_init = false; - if (handle_reset() || SHM.RcpuWritePointer.r32 > sizeof(SHM.RcpuPrintfBuffer) || SHM.RcpuReadPointer.r32 > sizeof(SHM.RcpuPrintfBuffer) || - SHM.RcpuHostReadPointer.r32 > sizeof(SHM.RcpuPrintfBuffer)) - { - full_init = true; - - SHM.RcpuWritePointer.r32 = 0; - SHM.RcpuReadPointer.r32 = 0; - SHM.RcpuHostReadPointer.r32 = 0; - } + bool full_init = handle_reset(); + full_init = full_init || reset_ape_console(); printf("APE v" STRINGIFY(VERSION_MAJOR) "." STRINGIFY(VERSION_MINOR) "." STRINGIFY(VERSION_PATCH) " NCSI Port " STRINGIFY(NETWORK_PORT) "\n"); gPort = Network_getPort(NETWORK_PORT); diff --git a/include/types.h b/include/types.h index 8f17085..5f0fce0 100644 --- a/include/types.h +++ b/include/types.h @@ -100,4 +100,10 @@ typedef union { #define _STRINGIFY(__STR__) #__STR__ #define STRINGIFY(__STR__) _STRINGIFY(__STR__) +#ifdef CXX_SIMULATOR +#define VOLATILE +#else +#define VOLATILE volatile +#endif + #endif /* !TYPES_H */ diff --git a/libs/Network/include/Network.h b/libs/Network/include/Network.h index c6aa260..ab621d6 100644 --- a/libs/Network/include/Network.h +++ b/libs/Network/include/Network.h @@ -54,12 +54,6 @@ #include <APE_SHM_CHANNEL0.h> #include <types.h> -#ifdef CXX_SIMULATOR -#define VOLATILE -#else -#define VOLATILE volatile -#endif - typedef struct { /* Port Registers */ diff --git a/libs/printf/ape_console.h b/libs/printf/ape_console.h new file mode 100644 index 0000000..d2d80fd --- /dev/null +++ b/libs/printf/ape_console.h @@ -0,0 +1,52 @@ +//////////////////////////////////////////////////////////////////////////////// +/// +/// @file ape_console.h +/// +/// @project +/// +/// @brief APE printf support Routines +/// +//////////////////////////////////////////////////////////////////////////////// +/// +//////////////////////////////////////////////////////////////////////////////// +/// +/// @copyright Copyright (c) 2020, Evan Lojewski +/// @cond +/// +/// All rights reserved. +/// +/// Redistribution and use in source and binary forms, with or without +/// modification, are permitted provided that the following conditions are met: +/// 1. Redistributions of source code must retain the above copyright notice, +/// this list of conditions and the following disclaimer. +/// 2. Redistributions in binary form must reproduce the above copyright notice, +/// this list of conditions and the following disclaimer in the documentation +/// and/or other materials provided with the distribution. +/// 3. Neither the name of the copyright holder nor the +/// names of its contributors may be used to endorse or promote products +/// derived from this software without specific prior written permission. +/// +//////////////////////////////////////////////////////////////////////////////// +/// +/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +/// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +/// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +/// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +/// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +/// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +/// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +/// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +/// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +/// POSSIBILITY OF SUCH DAMAGE. +/// @endcond +//////////////////////////////////////////////////////////////////////////////// + +#ifndef APE_CONSOLE_H +#define APE_CONSOLE_H + +#include <types.h> + +bool reset_ape_console(void); + +#endif /* APE_CONSOLE_H */ diff --git a/libs/printf/ape_putchar.c b/libs/printf/ape_putchar.c index ea96a89..50fd5df 100644 --- a/libs/printf/ape_putchar.c +++ b/libs/printf/ape_putchar.c @@ -43,25 +43,59 @@ //////////////////////////////////////////////////////////////////////////////// #include <printf.h> -#include <em100_putchar.h> +#include <ape_console.h> #include <APE_SHM.h> +#include <APE_SHM1.h> -void _putchar(char character) +static bool reset_ape_console_internal(VOLATILE SHM_t *port) +{ + if (port->RcpuWritePointer.r32 > sizeof(port->RcpuPrintfBuffer) || + port->RcpuReadPointer.r32 > sizeof(port->RcpuPrintfBuffer) || + port->RcpuHostReadPointer.r32 > sizeof(port->RcpuPrintfBuffer)) + { + port->RcpuWritePointer.r32 = 0; + port->RcpuReadPointer.r32 = 0; + port->RcpuHostReadPointer.r32 = 0; + + return true; + } + + return false; +} + +bool reset_ape_console(void) +{ + bool was_reset = false; + was_reset = was_reset || reset_ape_console_internal(&SHM); + was_reset = was_reset || reset_ape_console_internal(&SHM1); + + return was_reset; +} + + +static void ape_putchar(char character, VOLATILE SHM_t *port) { - uint32_t write_pointer = SHM.RcpuWritePointer.r32; + uint32_t write_pointer = port->RcpuWritePointer.r32; uint32_t word_pointer = write_pointer / 4; uint32_t byte_index = write_pointer % 4; uint32_t byte_mask = 0xFF << (byte_index * 8); - uint32_t new_word = SHM.RcpuPrintfBuffer[word_pointer].r32 & ~byte_mask; + uint32_t new_word = port->RcpuPrintfBuffer[word_pointer].r32 & ~byte_mask; new_word |= character << (byte_index * 8); - SHM.RcpuPrintfBuffer[word_pointer].r32 = new_word; + port->RcpuPrintfBuffer[word_pointer].r32 = new_word; write_pointer++; - if(write_pointer >= sizeof(SHM.RcpuPrintfBuffer)) + if(write_pointer >= sizeof(port->RcpuPrintfBuffer)) { write_pointer = 0; } - SHM.RcpuWritePointer.r32 = write_pointer; + port->RcpuWritePointer.r32 = write_pointer; +} + + +void _putchar(char character) +{ + ape_putchar(character, &SHM); + ape_putchar(character, &SHM1); } |