Platform library for RETRO

Dependents:   RETRO_RickGame

Revision:
0:6f26c31d8573
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Utils.cpp	Sun Mar 01 05:29:45 2015 +0000
@@ -0,0 +1,82 @@
+/*
+ * (C) Copyright 2015 Valentin Ivanov. All rights reserved.
+ *
+ * This file is part of the RetroPlatform Library
+ *
+ * The RetroPlatform Library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>
+ *
+ * This library is inspired by Gamebuino Library (http://gamebuino.com)
+ * from Aurélien Rodot. 
+ */
+#include "mbed.h"
+#include "Utils.h"
+
+uint8_t constrain(uint8_t val, uint8_t minimum, uint8_t maximum )
+{
+    if( val < minimum )
+        return minimum;
+    if( val > maximum )
+        return maximum;
+
+    return val;
+}
+
+uint8_t max(uint8_t val1, uint8_t val2 )
+{
+    if( val1 < val2 )
+        return val2;
+    
+    return val1;
+}
+
+uint8_t min(uint8_t val1, uint8_t val2 )
+{
+    if( val1 < val2 )
+        return val1;
+
+    return val2;
+}
+
+#define     IAP_LOCATION    0x1fff1ff1
+typedef     void (*IAP_call)(unsigned int [], unsigned int []);
+
+IAP_call        iap_entry = reinterpret_cast<IAP_call>(IAP_LOCATION);
+unsigned int    IAP_command[ 5 ];
+unsigned int    IAP_result[ 5 ];
+
+int write_eeprom( char *source_addr, char *target_addr, int size )
+{
+    IAP_command[ 0 ]    = 61;
+    IAP_command[ 1 ]    = (unsigned int)target_addr;    //  Destination EEPROM address where data bytes are to be written. This address should be a 256 byte boundary.
+    IAP_command[ 2 ]    = (unsigned int)source_addr;    //  Source RAM address from which data bytes are to be read. This address should be a word boundary.
+    IAP_command[ 3 ]    = size;                         //  Number of bytes to be written. Should be 256 | 512 | 1024 | 4096.
+    IAP_command[ 4 ]    = SystemCoreClock / 1000;                     //  CPU Clock Frequency (CCLK) in kHz.
+
+    iap_entry( IAP_command, IAP_result );
+
+    return ( (int)IAP_result[ 0 ] );
+}
+
+int read_eeprom( char *source_addr, char *target_addr, int size )
+{
+    IAP_command[ 0 ]    = 62;
+    IAP_command[ 1 ]    = (unsigned int)source_addr;    //  Source EEPROM address from which data bytes are to be read. This address should be a word boundary.
+    IAP_command[ 2 ]    = (unsigned int)target_addr;    //  Destination RAM address where data bytes are to be written. This address should be a 256 byte boundary.
+    IAP_command[ 3 ]    = size;                         //  Number of bytes to be written. Should be 256 | 512 | 1024 | 4096.
+    IAP_command[ 4 ]    = SystemCoreClock / 1000;                     //  CPU Clock Frequency (CCLK) in kHz.
+
+    iap_entry( IAP_command, IAP_result );
+
+    return ( (int)IAP_result[ 0 ] );
+}
\ No newline at end of file