Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
mem.c
00001 /* 00002 # This file is Copyright 2002 Dean Hall. 00003 # This file is part of the PyMite VM. 00004 # This file is licensed under the MIT License. 00005 # See the LICENSE file for details. 00006 */ 00007 00008 00009 #undef __FILE_ID__ 00010 #define __FILE_ID__ 0x0D 00011 00012 00013 /** 00014 * \file 00015 * \brief VM Memory 00016 * 00017 * VM memory operations. 00018 * Implementations and stubs for getByte and memCopy functions. 00019 * Functions to load object images from static memory. 00020 */ 00021 00022 00023 #include "pm.h" 00024 00025 00026 uint16_t 00027 mem_getWord(PmMemSpace_t memspace, uint8_t const **paddr) 00028 { 00029 /* PyMite is little endian; get low byte first */ 00030 uint8_t blo = mem_getByte(memspace, paddr); 00031 uint8_t bhi = mem_getByte(memspace, paddr); 00032 00033 return (uint16_t)(blo | (bhi << (int8_t)8)); 00034 } 00035 00036 00037 uint32_t 00038 mem_getInt(PmMemSpace_t memspace, uint8_t const **paddr) 00039 { 00040 /* PyMite is little endian; get low word first */ 00041 uint16_t wlo = mem_getWord(memspace, paddr); 00042 uint32_t whi = mem_getWord(memspace, paddr); 00043 00044 return (uint32_t)(wlo | (whi << (int8_t)16)); 00045 } 00046 00047 00048 #ifdef HAVE_FLOAT 00049 float 00050 mem_getFloat(PmMemSpace_t memspace, uint8_t const **paddr) 00051 { 00052 union 00053 { 00054 char c[4]; 00055 float f; 00056 } 00057 v; 00058 00059 #ifdef PM_FLOAT_BIG_ENDIAN 00060 /* If the architecture is Big Endian, reverse the bytes of the float */ 00061 v.c[3] = mem_getByte(memspace, paddr); 00062 v.c[2] = mem_getByte(memspace, paddr); 00063 v.c[1] = mem_getByte(memspace, paddr); 00064 v.c[0] = mem_getByte(memspace, paddr); 00065 00066 #else 00067 v.c[0] = mem_getByte(memspace, paddr); 00068 v.c[1] = mem_getByte(memspace, paddr); 00069 v.c[2] = mem_getByte(memspace, paddr); 00070 v.c[3] = mem_getByte(memspace, paddr); 00071 00072 #ifndef PM_FLOAT_LITTLE_ENDIAN 00073 #warning Neither PM_FLOAT_LITTLE_ENDIAN nor PM_FLOAT_BIG_ENDIAN is defined \ 00074 for this platform; defaulting to little endian. 00075 #endif 00076 #endif 00077 00078 return v.f; 00079 } 00080 #endif /* HAVE_FLOAT */ 00081 00082 00083 void 00084 mem_copy(PmMemSpace_t memspace, 00085 uint8_t **pdest, uint8_t const **psrc, uint16_t count) 00086 { 00087 /* Copy memory from RAM */ 00088 if (memspace == MEMSPACE_RAM) 00089 { 00090 sli_memcpy(*pdest, *psrc, count); 00091 *psrc += count; 00092 *pdest += count; 00093 return; 00094 } 00095 00096 /* Copy memory from non-RAM to RAM */ 00097 else 00098 { 00099 uint8_t b; 00100 00101 for (; count > 0; count--) 00102 { 00103 b = mem_getByte(memspace, psrc); 00104 **pdest = b; 00105 (*pdest)++; 00106 } 00107 return; 00108 } 00109 } 00110 00111 00112 uint16_t 00113 mem_getStringLength(PmMemSpace_t memspace, uint8_t const *const pstr) 00114 { 00115 uint8_t const *psrc; 00116 00117 /* If source is in RAM, use a possibly optimized strlen */ 00118 if (memspace == MEMSPACE_RAM) 00119 { 00120 return sli_strlen((char const *)pstr); 00121 } 00122 00123 /* Otherwise calculate string length */ 00124 psrc = pstr; 00125 while (mem_getByte(memspace, &psrc) != (uint8_t)0); 00126 return psrc - pstr - 1; 00127 } 00128 00129 00130 PmReturn_t 00131 mem_cmpn(uint8_t *cname, uint16_t cnamelen, PmMemSpace_t memspace, 00132 uint8_t const **paddr) 00133 { 00134 uint16_t i; 00135 uint8_t b; 00136 00137 /* Iterate over all characters */ 00138 for (i = 0; i < cnamelen; i++) 00139 { 00140 b = mem_getByte(memspace, paddr); 00141 if (cname[i] != b) 00142 { 00143 return PM_RET_NO; 00144 } 00145 } 00146 return PM_RET_OK; 00147 }
Generated on Tue Jul 12 2022 23:13:47 by
1.7.2