Platform library for RETRO
Diff: Utils.cpp
- 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