Dependents:   1W-EEPROM

Committer:
Wimpie
Date:
Sun Apr 17 17:26:52 2011 +0000
Revision:
1:7218c076189b
Parent:
0:0f7bbfde44b7
Child:
2:193926923cb0
improved 1W search function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wimpie 0:0f7bbfde44b7 1 /*
Wimpie 0:0f7bbfde44b7 2 * OneWireEEPROM. Library for Maxim One-Wire EEPROM.
Wimpie 0:0f7bbfde44b7 3 *
Wimpie 0:0f7bbfde44b7 4 * see http://www.maxim-ic.com
Wimpie 0:0f7bbfde44b7 5 *
Wimpie 0:0f7bbfde44b7 6 * DS2433
Wimpie 0:0f7bbfde44b7 7 * DS28EC20
Wimpie 0:0f7bbfde44b7 8 *
Wimpie 0:0f7bbfde44b7 9 * Copyright (C) <2011> Wim De Roeve <wim312@gmail.com>
Wimpie 0:0f7bbfde44b7 10 *
Wimpie 0:0f7bbfde44b7 11 * OneWireEEPROM is free software: you can redistribute it and/or modify
Wimpie 0:0f7bbfde44b7 12 * it under the terms of the GNU General Public License as published by
Wimpie 0:0f7bbfde44b7 13 * the Free Software Foundation, either version 3 of the License, or
Wimpie 0:0f7bbfde44b7 14 * (at your option) any later version.
Wimpie 0:0f7bbfde44b7 15 *
Wimpie 0:0f7bbfde44b7 16 * OneWireEEPROM is distributed in the hope that it will be useful,
Wimpie 0:0f7bbfde44b7 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Wimpie 0:0f7bbfde44b7 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Wimpie 0:0f7bbfde44b7 19 * GNU General Public License for more details.
Wimpie 0:0f7bbfde44b7 20 *
Wimpie 0:0f7bbfde44b7 21 * You should have received a copy of the GNU General Public License
Wimpie 0:0f7bbfde44b7 22 * If not, see <http://www.gnu.org/licenses/>.
Wimpie 0:0f7bbfde44b7 23 */
Wimpie 0:0f7bbfde44b7 24
Wimpie 0:0f7bbfde44b7 25 #include "mbed.h"
Wimpie 0:0f7bbfde44b7 26 #include "OneWireEEPROM.h"
Wimpie 0:0f7bbfde44b7 27
Wimpie 0:0f7bbfde44b7 28 Serial output(USBTX, USBRX);
Wimpie 0:0f7bbfde44b7 29
Wimpie 1:7218c076189b 30 OneWireEEPROM::OneWireEEPROM(PinName pin, bool crcOn, bool useAddr, bool parasitic, DSTYPE ds, unsigned char *ROMaddress)
Wimpie 0:0f7bbfde44b7 31 :oneWire(pin, STANDARD) {
Wimpie 0:0f7bbfde44b7 32 _useCRC=crcOn;
Wimpie 0:0f7bbfde44b7 33 _useAddress=useAddr;
Wimpie 0:0f7bbfde44b7 34 _useParasiticPower=parasitic;
Wimpie 0:0f7bbfde44b7 35 switch (ds) {
Wimpie 0:0f7bbfde44b7 36 case DS2433: {
Wimpie 0:0f7bbfde44b7 37 _pages = DS2433PAGES;
Wimpie 0:0f7bbfde44b7 38 _eeprom_id =DS2433EEPROM_ID;
Wimpie 0:0f7bbfde44b7 39 break;
Wimpie 0:0f7bbfde44b7 40 }
Wimpie 0:0f7bbfde44b7 41 case DS28EC20: {
Wimpie 0:0f7bbfde44b7 42 _pages =DS28EC20PAGES;
Wimpie 0:0f7bbfde44b7 43 _eeprom_id =DS28EC20EEPROM_ID;
Wimpie 0:0f7bbfde44b7 44 break;
Wimpie 0:0f7bbfde44b7 45 }
Wimpie 0:0f7bbfde44b7 46
Wimpie 0:0f7bbfde44b7 47 }
Wimpie 0:0f7bbfde44b7 48 _memsize = _pages * PAGESIZE;
Wimpie 1:7218c076189b 49
Wimpie 1:7218c076189b 50 if (_useAddress) {
Wimpie 1:7218c076189b 51 for (int i = 0; i < ADDRESS_SIZE; i++)
Wimpie 1:7218c076189b 52 _ROMCode[i]=ROMaddress[i];
Wimpie 1:7218c076189b 53 } else {
Wimpie 1:7218c076189b 54 for (int i = 0; i < ADDRESS_SIZE; i++)
Wimpie 1:7218c076189b 55 _ROMCode[i]=0;
Wimpie 1:7218c076189b 56 }
Wimpie 0:0f7bbfde44b7 57 }
Wimpie 0:0f7bbfde44b7 58
Wimpie 0:0f7bbfde44b7 59
Wimpie 1:7218c076189b 60 bool OneWireEEPROM::Initialize() {
Wimpie 1:7218c076189b 61
Wimpie 1:7218c076189b 62 int OneWireFound;
Wimpie 1:7218c076189b 63 int OneWireSameAddress;
Wimpie 1:7218c076189b 64 int i;
Wimpie 1:7218c076189b 65 BYTE _dummyaddress[8];
Wimpie 1:7218c076189b 66
Wimpie 0:0f7bbfde44b7 67
Wimpie 1:7218c076189b 68 if (_useAddress) {
Wimpie 1:7218c076189b 69 output.printf("\r\nScan for device with address ");
Wimpie 1:7218c076189b 70 for (i = 0; i < ADDRESS_SIZE; i++) {
Wimpie 1:7218c076189b 71 output.printf("%x ", (int)_ROMCode[i]);
Wimpie 1:7218c076189b 72 }
Wimpie 1:7218c076189b 73 output.printf("\r\n");
Wimpie 1:7218c076189b 74 }
Wimpie 0:0f7bbfde44b7 75
Wimpie 1:7218c076189b 76 OneWireSameAddress=0;
Wimpie 0:0f7bbfde44b7 77
Wimpie 0:0f7bbfde44b7 78 oneWire.resetSearch();
Wimpie 1:7218c076189b 79 do {
Wimpie 1:7218c076189b 80 OneWireFound=(oneWire.search(_dummyaddress));
Wimpie 1:7218c076189b 81 if (OneWireFound) {
Wimpie 1:7218c076189b 82
Wimpie 1:7218c076189b 83 if (!_useAddress) {
Wimpie 1:7218c076189b 84 output.printf("Device found with Address = ");
Wimpie 1:7218c076189b 85 for (i = 0; i < ADDRESS_SIZE; i++) {
Wimpie 1:7218c076189b 86 output.printf("%x ", (int)_dummyaddress[i]);
Wimpie 1:7218c076189b 87 }
Wimpie 1:7218c076189b 88 }
Wimpie 1:7218c076189b 89
Wimpie 1:7218c076189b 90 OneWireSameAddress=1;
Wimpie 1:7218c076189b 91
Wimpie 1:7218c076189b 92 if (_useAddress) {
Wimpie 1:7218c076189b 93 for (i = 0; i < ADDRESS_SIZE; i++) {
Wimpie 1:7218c076189b 94 if (!((OneWireSameAddress) && (_ROMCode[i] ==_dummyaddress[i])))
Wimpie 1:7218c076189b 95 OneWireSameAddress=0;
Wimpie 1:7218c076189b 96 }
Wimpie 1:7218c076189b 97 } else {
Wimpie 1:7218c076189b 98 for (i = 0; i < ADDRESS_SIZE; i++) {
Wimpie 1:7218c076189b 99 _ROMCode[i] =_dummyaddress[i];
Wimpie 1:7218c076189b 100 }
Wimpie 1:7218c076189b 101 }
Wimpie 1:7218c076189b 102
Wimpie 1:7218c076189b 103
Wimpie 1:7218c076189b 104 /*if (OneWireSameAddress) {
Wimpie 1:7218c076189b 105 output.printf("-> Address valid!\r\n");
Wimpie 1:7218c076189b 106
Wimpie 1:7218c076189b 107 } else {
Wimpie 1:7218c076189b 108
Wimpie 1:7218c076189b 109 }*/
Wimpie 1:7218c076189b 110
Wimpie 1:7218c076189b 111 } else {
Wimpie 1:7218c076189b 112
Wimpie 1:7218c076189b 113 output.printf("No more addresses.\r\n");
Wimpie 1:7218c076189b 114 oneWire.resetSearch();
Wimpie 1:7218c076189b 115 wait_ms(250); //500
Wimpie 1:7218c076189b 116 }
Wimpie 1:7218c076189b 117 } while (OneWireFound && !OneWireSameAddress);
Wimpie 1:7218c076189b 118
Wimpie 1:7218c076189b 119 if (!OneWireSameAddress) {
Wimpie 1:7218c076189b 120 output.printf("-> No Valid ROM Code found.\r\n");
Wimpie 0:0f7bbfde44b7 121 return false;
Wimpie 0:0f7bbfde44b7 122 }
Wimpie 1:7218c076189b 123 if (OneWireCRC::crc8(_ROMCode, ADDRESS_CRC_BYTE) != _ROMCode[ADDRESS_CRC_BYTE]) { // check address CRC is valid
Wimpie 0:0f7bbfde44b7 124 output.printf("CRC is not valid!\r\n");
Wimpie 0:0f7bbfde44b7 125 wait_ms(100);
Wimpie 0:0f7bbfde44b7 126
Wimpie 0:0f7bbfde44b7 127 return false;
Wimpie 0:0f7bbfde44b7 128 }
Wimpie 0:0f7bbfde44b7 129
Wimpie 1:7218c076189b 130 if (_ROMCode[0] != _eeprom_id) {
Wimpie 0:0f7bbfde44b7 131 output.printf("Device is not a OneWireEEPROM_ID device.\r\n");
Wimpie 0:0f7bbfde44b7 132 wait_ms(100);
Wimpie 0:0f7bbfde44b7 133 return false;
Wimpie 1:7218c076189b 134
Wimpie 1:7218c076189b 135 } else {
Wimpie 1:7218c076189b 136 output.printf("OneWireEEPROM present and correct.\r\n");
Wimpie 0:0f7bbfde44b7 137 }
Wimpie 0:0f7bbfde44b7 138
Wimpie 1:7218c076189b 139 return true;
Wimpie 0:0f7bbfde44b7 140 }
Wimpie 0:0f7bbfde44b7 141
Wimpie 0:0f7bbfde44b7 142 void OneWireEEPROM::ResetAndAddress() {
Wimpie 0:0f7bbfde44b7 143 oneWire.reset(); // reset device
Wimpie 0:0f7bbfde44b7 144 if (_useAddress) {
Wimpie 1:7218c076189b 145 oneWire.matchROM(_ROMCode); // select which device to talk to
Wimpie 0:0f7bbfde44b7 146 } else {
Wimpie 0:0f7bbfde44b7 147 oneWire.skipROM(); // broadcast
Wimpie 0:0f7bbfde44b7 148 }
Wimpie 0:0f7bbfde44b7 149 }
Wimpie 0:0f7bbfde44b7 150
Wimpie 0:0f7bbfde44b7 151 bool OneWireEEPROM::WriteMemory(uint8_t* Source, uint16_t Address, uint8_t Size) {
Wimpie 0:0f7bbfde44b7 152 uint8_t _ES; //store Endif Address , datastatus
Wimpie 0:0f7bbfde44b7 153 uint8_t B;
Wimpie 0:0f7bbfde44b7 154
Wimpie 0:0f7bbfde44b7 155 if (Address<_memsize) {
Wimpie 0:0f7bbfde44b7 156 uint8_t _TA1=(uint8_t)(Address & 0x00FF);
Wimpie 0:0f7bbfde44b7 157 uint8_t _TA2=(uint8_t)((Address & 0xFF00)>>8);
Wimpie 0:0f7bbfde44b7 158
Wimpie 0:0f7bbfde44b7 159 if ((Size<=PAGESIZE) and ((Size+Address)<=_memsize)) {
Wimpie 0:0f7bbfde44b7 160
Wimpie 1:7218c076189b 161 // output.printf ("\r\nWriting to OneWireEEPROM %i Bytes",Size);
Wimpie 0:0f7bbfde44b7 162
Wimpie 0:0f7bbfde44b7 163 ResetAndAddress();
Wimpie 0:0f7bbfde44b7 164 oneWire.writeByte(WRITESCRATCHPAD);
Wimpie 0:0f7bbfde44b7 165 oneWire.writeByte(_TA1); //begin address T7..T0
Wimpie 0:0f7bbfde44b7 166 oneWire.writeByte(_TA2); //begin address T15..T8
Wimpie 0:0f7bbfde44b7 167
Wimpie 0:0f7bbfde44b7 168 //write _memPage to scratchpad
Wimpie 0:0f7bbfde44b7 169
Wimpie 0:0f7bbfde44b7 170 for (int i = 0; i < Size; i++) {
Wimpie 0:0f7bbfde44b7 171 oneWire.writeByte(Source[i]);
Wimpie 1:7218c076189b 172 // output.printf ("%X ",Source[i]);
Wimpie 0:0f7bbfde44b7 173 }
Wimpie 1:7218c076189b 174 // output.printf ("\r\nTA1=%X",_TA1);
Wimpie 1:7218c076189b 175 // output.printf ("\r\nTA2=%X\r\n",_TA2);
Wimpie 0:0f7bbfde44b7 176
Wimpie 0:0f7bbfde44b7 177 //read and check data in scratchpad
Wimpie 0:0f7bbfde44b7 178 ResetAndAddress();
Wimpie 0:0f7bbfde44b7 179 oneWire.writeByte(READSCRATCHPAD);
Wimpie 0:0f7bbfde44b7 180 B=oneWire.readByte();
Wimpie 0:0f7bbfde44b7 181 if (B != _TA1) { //check TA1, return if bad
Wimpie 0:0f7bbfde44b7 182 output.printf("\r\nWrite error in TA1 %X - %X\r\n",B,_TA1);
Wimpie 0:0f7bbfde44b7 183 return false;
Wimpie 0:0f7bbfde44b7 184 }
Wimpie 0:0f7bbfde44b7 185 B=oneWire.readByte();
Wimpie 0:0f7bbfde44b7 186 if (B != _TA2) { //check TA2, return if bad
Wimpie 0:0f7bbfde44b7 187 output.printf("\r\nWrite error in TA2 %X - %X\r\n",B,_TA2);
Wimpie 0:0f7bbfde44b7 188 return false;
Wimpie 0:0f7bbfde44b7 189 }
Wimpie 0:0f7bbfde44b7 190 _ES = oneWire.readByte(); // ES Register
Wimpie 0:0f7bbfde44b7 191
Wimpie 0:0f7bbfde44b7 192 //check data written
Wimpie 0:0f7bbfde44b7 193 for (int i = 0; i < Size; i++) {
Wimpie 0:0f7bbfde44b7 194 B=oneWire.readByte();
Wimpie 0:0f7bbfde44b7 195 if (B != Source[i]) { //return if bad
Wimpie 0:0f7bbfde44b7 196 output.printf("\r\nWrite error in scratchpad on %i %X<->%X\r\n",i,B ,Source[i]);
Wimpie 0:0f7bbfde44b7 197 return false;
Wimpie 0:0f7bbfde44b7 198 }
Wimpie 0:0f7bbfde44b7 199 }
Wimpie 0:0f7bbfde44b7 200
Wimpie 1:7218c076189b 201 // output.printf("\r\nES=%X\r\n",_ES);
Wimpie 0:0f7bbfde44b7 202
Wimpie 0:0f7bbfde44b7 203 //issue copy with auth data
Wimpie 0:0f7bbfde44b7 204 wait_ms(10);
Wimpie 0:0f7bbfde44b7 205 ResetAndAddress();
Wimpie 0:0f7bbfde44b7 206 oneWire.writeByte(COPYSCRATCHPAD);
Wimpie 0:0f7bbfde44b7 207 oneWire.writeByte(_TA1);
Wimpie 0:0f7bbfde44b7 208 oneWire.writeByte(_TA2);
Wimpie 0:0f7bbfde44b7 209 oneWire.writeByte(_ES); //pull-up!
Wimpie 0:0f7bbfde44b7 210 wait_ms(10); //10ms min strong pullup delay -> time needed to copy from scratchpad to memory
Wimpie 0:0f7bbfde44b7 211
Wimpie 0:0f7bbfde44b7 212 oneWire.reset();
Wimpie 0:0f7bbfde44b7 213
Wimpie 1:7218c076189b 214 // output.printf ("\r\nData written\r\n");
Wimpie 0:0f7bbfde44b7 215 return true;
Wimpie 0:0f7bbfde44b7 216 } else {
Wimpie 0:0f7bbfde44b7 217 output.printf ("\r\nTrying to write more then %i bytes-> %i\r\n",PAGESIZE,Size);
Wimpie 0:0f7bbfde44b7 218 return false;
Wimpie 0:0f7bbfde44b7 219 }
Wimpie 0:0f7bbfde44b7 220 } else {
Wimpie 0:0f7bbfde44b7 221 output.printf ("\r\nAddress %X not available, EEPROM isn't that bigg..-> %i\r\n",Address);
Wimpie 0:0f7bbfde44b7 222 return false;
Wimpie 0:0f7bbfde44b7 223 }
Wimpie 0:0f7bbfde44b7 224 }
Wimpie 0:0f7bbfde44b7 225
Wimpie 0:0f7bbfde44b7 226
Wimpie 0:0f7bbfde44b7 227 int OneWireEEPROM::ReadMemory(uint8_t* Destination, uint16_t Address, uint16_t Size) {
Wimpie 0:0f7bbfde44b7 228 uint8_t tmpReader;
Wimpie 1:7218c076189b 229 // bool readFF = 0;
Wimpie 0:0f7bbfde44b7 230 int memPtr;
Wimpie 0:0f7bbfde44b7 231
Wimpie 0:0f7bbfde44b7 232 if (Address<_memsize) {
Wimpie 0:0f7bbfde44b7 233
Wimpie 0:0f7bbfde44b7 234 uint8_t _TA1=(uint8_t)(Address & 0x00FF);
Wimpie 0:0f7bbfde44b7 235 uint8_t _TA2=(uint8_t)((Address & 0xFF00)>>8);
Wimpie 0:0f7bbfde44b7 236
Wimpie 0:0f7bbfde44b7 237 if ((Size+Address)<=_memsize) {
Wimpie 0:0f7bbfde44b7 238
Wimpie 0:0f7bbfde44b7 239 ResetAndAddress();
Wimpie 0:0f7bbfde44b7 240 oneWire.writeByte(READMEMORY);
Wimpie 0:0f7bbfde44b7 241 oneWire.writeByte(_TA1);
Wimpie 0:0f7bbfde44b7 242 oneWire.writeByte(_TA2);
Wimpie 0:0f7bbfde44b7 243
Wimpie 0:0f7bbfde44b7 244 output.printf ("\r\nReading... TA1=%X TA2=%X",_TA1, _TA2);
Wimpie 0:0f7bbfde44b7 245
Wimpie 0:0f7bbfde44b7 246 for (memPtr = 0; memPtr < Size; memPtr++) {
Wimpie 0:0f7bbfde44b7 247 tmpReader = oneWire.readByte();
Wimpie 1:7218c076189b 248 // if (tmpReader == 0xff & !readFF)
Wimpie 1:7218c076189b 249 // readFF = 1;
Wimpie 1:7218c076189b 250 // else if (tmpReader == 0xff & readFF)
Wimpie 1:7218c076189b 251 // 0xff read twice, hopefully EoF as we break here :)
Wimpie 1:7218c076189b 252 // break;
Wimpie 0:0f7bbfde44b7 253
Wimpie 0:0f7bbfde44b7 254 Destination[memPtr] = tmpReader;
Wimpie 0:0f7bbfde44b7 255 }
Wimpie 0:0f7bbfde44b7 256 output.printf ("-> %i byte(s)\r\n",memPtr);
Wimpie 0:0f7bbfde44b7 257 return memPtr;
Wimpie 0:0f7bbfde44b7 258
Wimpie 0:0f7bbfde44b7 259 } else {
Wimpie 0:0f7bbfde44b7 260 output.printf ("\r\nTrying to read outside MEMORY -> %i\r\n",Address+Size);
Wimpie 0:0f7bbfde44b7 261 return 0;
Wimpie 0:0f7bbfde44b7 262 }
Wimpie 0:0f7bbfde44b7 263 } else {
Wimpie 0:0f7bbfde44b7 264 output.printf ("\r\nAddress %X not available, EEPROM isn't that bigg..-> %i\r\n",Address);
Wimpie 0:0f7bbfde44b7 265 return 0;
Wimpie 0:0f7bbfde44b7 266 }
Wimpie 0:0f7bbfde44b7 267 }
Wimpie 0:0f7bbfde44b7 268
Wimpie 0:0f7bbfde44b7 269 void OneWireEEPROM::ShowMemory(int PageFrom, int PageTo) {
Wimpie 0:0f7bbfde44b7 270 int Size;
Wimpie 1:7218c076189b 271 int MemSize;
Wimpie 1:7218c076189b 272
Wimpie 1:7218c076189b 273 if (PageFrom<0)
Wimpie 1:7218c076189b 274 PageFrom=0;
Wimpie 1:7218c076189b 275 if (PageTo>=_pages)
Wimpie 1:7218c076189b 276 PageTo=_pages-1;
Wimpie 1:7218c076189b 277
Wimpie 0:0f7bbfde44b7 278 if ((PageFrom>=0) and (PageFrom<_pages) and
Wimpie 0:0f7bbfde44b7 279 (PageTo>=0) and (PageTo<_pages)) {
Wimpie 0:0f7bbfde44b7 280
Wimpie 1:7218c076189b 281 MemSize=(PageTo-PageFrom+1)*PAGESIZE;
Wimpie 1:7218c076189b 282
Wimpie 1:7218c076189b 283 uint8_t *MemAll = (uint8_t*) malloc(MemSize);
Wimpie 0:0f7bbfde44b7 284
Wimpie 1:7218c076189b 285 if (MemAll!=NULL) {
Wimpie 1:7218c076189b 286 output.printf ("\r\nRead Page(s) from EEPROM %i to %i -> ", PageFrom,PageTo);
Wimpie 0:0f7bbfde44b7 287
Wimpie 1:7218c076189b 288 Size=ReadMemory(MemAll,PageFrom*PAGESIZE,MemSize);
Wimpie 1:7218c076189b 289
Wimpie 1:7218c076189b 290 output.printf("%i bytes\r\n ",Size);
Wimpie 0:0f7bbfde44b7 291
Wimpie 1:7218c076189b 292 for (int j=PageFrom;j<=PageTo;j++) {
Wimpie 1:7218c076189b 293 output.printf ("\r\nPage %2i ->",j);
Wimpie 1:7218c076189b 294 for (int i=0;i<PAGESIZE;i++) {
Wimpie 1:7218c076189b 295 if ((j*32+i)<= Size)
Wimpie 1:7218c076189b 296 output.printf("%2X ",MemAll[j*32+i]);
Wimpie 1:7218c076189b 297 }
Wimpie 1:7218c076189b 298 if ((j*32)>Size)
Wimpie 1:7218c076189b 299 break;
Wimpie 0:0f7bbfde44b7 300 }
Wimpie 1:7218c076189b 301 output.printf ("\r\n");
Wimpie 0:0f7bbfde44b7 302
Wimpie 1:7218c076189b 303 free(MemAll);
Wimpie 1:7218c076189b 304 } else
Wimpie 1:7218c076189b 305 output.printf ("\r\nNOT enough memory to display EEPROM content !!\r\n");
Wimpie 0:0f7bbfde44b7 306 }
Wimpie 0:0f7bbfde44b7 307 }
Wimpie 0:0f7bbfde44b7 308
Wimpie 1:7218c076189b 309 bool OneWireEEPROM::WriteWord(uint16_t v, uint16_t Address) {
Wimpie 1:7218c076189b 310 uint8_t Mem[2];
Wimpie 1:7218c076189b 311 Mem[0]=(uint8_t)(v & 0x00FF);
Wimpie 1:7218c076189b 312 Mem[1]=(uint8_t)((v & 0xFF00)>>8);
Wimpie 1:7218c076189b 313 return WriteMemory(Mem,Address,2);
Wimpie 1:7218c076189b 314 }
Wimpie 1:7218c076189b 315
Wimpie 1:7218c076189b 316 bool OneWireEEPROM::WriteByte(uint8_t b, uint16_t Address) {
Wimpie 1:7218c076189b 317 uint8_t Mem[1];
Wimpie 1:7218c076189b 318 Mem[0]=(uint8_t)(b & 0x00FF);
Wimpie 1:7218c076189b 319 return WriteMemory(Mem,Address,1);
Wimpie 1:7218c076189b 320 }