void CMidiChCtrlDlg::OnSelendokComboBank() { // TODO: ここにコントロール通知ハンドラー コードを追加します。 theCh->BankSelMSB(cmbBank.GetCurSel()); SetBank(); SetProg(); }
void FlashFunctions::CalculateChecksums() { for (int k = 0; k < 2; k++) { SetBank(k); for (int i = 0; i < 16; i++) { u32 checksumValue = 0; u8* address = (u8*)(0x0E000000 + (0x1000 * i)); for (int j = 0; j < SaveBlockMaxLength >> 2; j++) { checksumValue += (address[j << 2] | (address[(j << 2) + 1] << 0x8) | (address[(j << 2) + 2] << 0x10) | (address[(j << 2) + 3] << 0x18)); } *(vu8*)0x0E005555 = 0xAA; *(vu8*)0x0E002AAA = 0x55; *(vu8*)0x0E005555 = 0xA0; address[0xFFC] = checksumValue; *(vu8*)0x0E005555 = 0xAA; *(vu8*)0x0E002AAA = 0x55; *(vu8*)0x0E005555 = 0xA0; address[0xFFD] = checksumValue >> 0x8; *(vu8*)0x0E005555 = 0xAA; *(vu8*)0x0E002AAA = 0x55; *(vu8*)0x0E005555 = 0xA0; address[0xFFE] = checksumValue >> 0x10; *(vu8*)0x0E005555 = 0xAA; *(vu8*)0x0E002AAA = 0x55; *(vu8*)0x0E005555 = 0xA0; address[0xFFF] = checksumValue >> 0x18; } } }
void CMidiChCtrlDlg::InitDevice() { TCHAR tmp[256]; wsprintf(tmp, _T("CH%i - %i:%s"), iCH, iIF, theFitom->GetMidiIn(iIF)->GetDescriptor()); edtMidiIfCh.SetWindowText(tmp); int devs = theFitom->GetInstDevs(); int curdev = theCh->GetDeviceID(); cmbDevice.ResetContent(); for (int i = 0; i < devs; i++) { TCHAR tmp[256]; CSoundDevice* pDev = theFitom->GetInstDeviceFromIndex(i); int devid = pDev->GetDevice(); wsprintf(tmp, _T("%02X:%s"), devid, theFitom->GetDeviceNameFromID(devid)); cmbDevice.AddString(tmp); cmbDevice.SetItemData(i, devid); if (devid == curdev) { cmbDevice.SetCurSel(i); } } { int n = cmbDevice.AddString(_T("FF:RHYTHM")); cmbDevice.SetItemData(n, 0xff); if (curdev == 0xff) { cmbDevice.SetCurSel(n); } } SetBank(); SetProg(); }
////////////////////////////////////////////////////////////////////////// // Mapper046 Rumble Station // ////////////////////////////////////////////////////////////////////////// void Mapper046::Reset() { reg[0] = 0; reg[1] = 0; reg[2] = 0; reg[3] = 0; SetBank(); SetVRAM_Mirror( VRAM_VMIRROR ); }
bool FlashFunctions::LoadThing(void *in_dst, const void *in_src, unsigned int length) { if ((u32)in_src >= 0x10000) { SetBank(1); } else { SetBank(0); } bytecpy(in_dst, (const void*)(MEM_SRAM + (u32)in_src), length, false); if(byteverify(in_dst, (const void*)(MEM_SRAM + (u32)in_src), length)) { return true; } return false; }
void Mapper251::Write( WORD addr, BYTE data ) { switch( addr & 0xE001 ) { case 0x8000: reg[8] = data; SetBank(); break; case 0x8001: reg[reg[8]&0x07] = data; SetBank(); break; case 0xA001: if( data & 0x80 ) { reg[ 9] = 1; reg[10] = 0; } else { reg[ 9] = 0; } break; } }
void Mapper251::WriteLow( WORD addr, BYTE data ) { if( (addr & 0xE001) == 0x6000 ) { if( reg[9] ) { breg[reg[10]++] = data; if( reg[10] == 4 ) { reg[10] = 0; SetBank(); } } } }
void fastputpixel(int x, int y, uchar c){ uchar *memPtr; uint bank; ulong adress; adress = ((ulong)BytesPerLine) * y + x; bank = (uint)(adress >> 16); if(bank != CurBank){ CurBank = bank; SetBank(bank); } memPtr = (uchar*)XVRMK_FP(0xA000, adress & 0xFFFFL); *memPtr = c; }
void CMidiChCtrlDlg::SetDevice() { int dev = theCh->GetDeviceID(); if (!cmbDevice.GetDroppedState()) { if (cmbDevice.GetItemData(cmbDevice.GetCurSel()) != dev) { for (int i = 0; i < cmbDevice.GetCount(); i++) { if (cmbDevice.GetItemData(i) == dev) { cmbDevice.SetCurSel(i); } } } } SetBank(); SetProg(); }
////////////////////////////////////////////////////////////////////////// // Mapper033 Taito TC0190 // ////////////////////////////////////////////////////////////////////////// void Mapper033::Reset() { patch = 0; irq_enable = 0; irq_counter = 0; irq_latch = 0; reg[0] = 0; reg[1] = 2; reg[2] = 4; reg[3] = 5; reg[4] = 6; reg[5] = 7; reg[6] = 1; SetPROM_32K_Bank( 0, 1, PROM_8K_SIZE-2, PROM_8K_SIZE-1 ); if( VROM_8K_SIZE ) { SetBank(); } DWORD crc = nes->rom->GetPROM_CRC(); // Check For Old #33 games.... (CRC code by NesToy) if( crc == 0x5e9bc161 // Akira(J) || crc == 0xecdbafa4 // Bakushou!! Jinsei Gekijou(J) || crc == 0x59cd0c31 // Don Doko Don(J) || crc == 0x837c1342 // Golf Ko Open(J) || crc == 0x42d893e4 // Operation Wolf(J) || crc == 0x1388aeb9 // Operation Wolf(U) || crc == 0x07ee6d8f // Power Blazer(J) || crc == 0x5193fb54 // Takeshi no Sengoku Fuuunji(J) || crc == 0xa71c3452 ) { // Insector X(J) patch = 1; } nes->SetRenderMethod( NES::PRE_RENDER ); if( crc == 0x202df297 ) { // Captain Saver(J) nes->SetRenderMethod( NES::TILE_RENDER ); } if( crc == 0x63bb86b5 ) { // The Jetsons(J) nes->SetRenderMethod( NES::TILE_RENDER ); } }
bool FlashFunctions::ValidateSave() { for (int k = 0; k < 2; k++) { SetBank(k); for (int i = 0; i < 16; i++) { u32 checksumValue = 0; u8* address = (u8*)(0x0E000000 + (0x1000 * i)); for (int j = 0; j < SaveBlockMaxLength >> 2; j++) { checksumValue += (address[j << 2] | (address[(j << 2) + 1] << 0x8) | (address[(j << 2) + 2] << 0x10) | (address[(j << 2) + 3] << 0x18)); } u32 checksum = (address[0xFFC] | (address[0xFFD] << 0x8) | (address[0xFFE] << 0x10) | (address[0xFFF] << 0x18)); if (checksum != checksumValue) { return false; } } } return true; }
void Mapper046::Write( WORD addr, BYTE data ) { reg[2] = data & 0x01; reg[3] = (data & 0x70)>>4; SetBank(); }
void Mapper046::WriteLow( WORD addr, BYTE data ) { reg[0] = data & 0x0F; reg[1] = (data & 0xF0)>>4; SetBank(); }
void Mapper033::Write( WORD addr, BYTE data ) { // LOG( "Mapper033 addr=%04X data=%02X", addr&0xFFFF, data&0xFF ); switch( addr ) { case 0x8000: if( patch ) { if( data & 0x40 ) SetVRAM_Mirror( VRAM_HMIRROR ); else SetVRAM_Mirror( VRAM_VMIRROR ); SetPROM_8K_Bank( 4, data & 0x1F ); } else { SetPROM_8K_Bank( 4, data ); } break; case 0x8001: if( patch ) { SetPROM_8K_Bank( 5, data & 0x1F ); } else { SetPROM_8K_Bank( 5, data ); } break; case 0x8002: reg[0] = data; SetBank(); break; case 0x8003: reg[1] = data; SetBank(); break; case 0xA000: reg[2] = data; SetBank(); break; case 0xA001: reg[3] = data; SetBank(); break; case 0xA002: reg[4] = data; SetBank(); break; case 0xA003: reg[5] = data; SetBank(); break; #if 0 case 0xC003: case 0xE003: reg[6] = data; SetBank(); break; case 0xC000: irq_counter = data; // nes->cpu->ClrIRQ( IRQ_MAPPER ); break; case 0xC001: case 0xC002: case 0xE001: case 0xE002: irq_enable = data; // nes->cpu->ClrIRQ( IRQ_MAPPER ); break; #else case 0xC000: irq_latch = data; irq_counter = irq_latch; break; case 0xC001: irq_counter = irq_latch; break; case 0xC002: irq_enable = 1; break; case 0xC003: irq_enable = 0; break; case 0xE001: case 0xE002: case 0xE003: break; #endif case 0xE000: if( data & 0x40 ) SetVRAM_Mirror( VRAM_HMIRROR ); else SetVRAM_Mirror( VRAM_VMIRROR ); break; } }
// preprocessor directives BOOL FASTCALL comProc_Preprocess(U16 flags, S16 *brackCnt) { BOOL PREP_OK=FALSE; int code; S32 index; char *label,*enumClass; if(*szTemp != '#') { if(!STRCMP(szTemp,"enum")) { if(IsStringLabel(GetNextWord())) { enumClass = strdup(szTemp); GetNextWord(); } else enumClass = NULL; if(szTemp[0]!='{') { ssFree(enumClass); error(ERR_ENUMBRACK); SkipLine(FALSE); return TRUE; } GetNextWord(); index = 0; while(szTemp[0]!='}') { label = strdup(szTemp); if(GetNextWord()[0]=='=') { if(!IsStrNum(GetNextWord())) { error(ERR_INTEXP); } else { index = ConfirmWord(StrToInt(szTemp)); } if(*szTemp!='}' && *szTemp!=',') GetNextWord(); } AddEnum(enumClass,label,index++); ssFree(label); if(szTemp[0]!=',') break; GetNextWord(); } if(szTemp[0]!='}') { error(ERR_ENUMBRACK); SkipLine(FALSE); return TRUE; } ssFree(enumClass); return TRUE; } return FALSE; } switch(code = StrInPrep(GetNextWord(),szPreprocess)) { /**********************************************************************/ case PREPROCESS_SETPAD: if(InFalseIfDef()) break; if(GetNextWord()[0]=='"') { if(!DoString()) { error(ERR_INTEXP); } else { strncpy(szPadding,szString,sizeof(szPadding)-1); szPadding[sizeof(szPadding)-1] = '\0'; } } else if(IsStrNum(szTemp)) { index = StrToInt(szTemp); szPadding[0] = ConfirmChar(index); szPadding[1] = '\0'; PREP_OK = TRUE; } else error(ERR_INTEXP); break; /*--------------------------------------------------------------------*/ case PREPROCESS_ALIGN: if(InFalseIfDef()) break; if(IsStrNum(GetNextWord())) { index = StrToInt(szTemp); AlignCode(ConfirmWord(index)); PREP_OK = TRUE; } else error(ERR_INTEXP); break; /**********************************************************************/ case PREPROCESS_INCLUDE: if(InFalseIfDef()) break; if(GetNextWord()[0]=='"' && DoStringDirect()) { if(CompileScript(szString,NULL,NULL)) PREP_OK = TRUE; break; } error(ERR_STRINGEXP); break; /*--------------------------------------------------------------------*/ case PREPROCESS_INCBIN: // "filename"[,maxsize] if(InFalseIfDef()) break; if(GetNextWord()[0]=='"' && DoStringDirect()) { index = -1; if(PeekNextWord()[0]==',') { GetNextWord(); if(IsStrNum(GetNextWord())) { index = ConfirmWord(StrToInt(szTemp)); } else { error(ERR_INTEXP); PREP_OK = FALSE; } } if(IncBin(szString,index)) PREP_OK = TRUE; break; } error(ERR_STRINGEXP); break; /*--------------------------------------------------------------------*/ case PREPROCESS_USEPATH: // "pathname" if(InFalseIfDef()) break; if(GetNextWord()[0]=='"' && DoStringDirect()) { if(PRECOMPILING && !AddDirList(&includeDirList, szString)) { error(ERR_ADDINGPATH,szString); } PREP_OK = TRUE; break; } error(ERR_STRINGEXP); break; /**********************************************************************/ case PREPROCESS_DEFINE: if(InFalseIfDef()) break; USE_DEFS = FALSE; AddDefine(GetNextWord(),NULL); USE_DEFS = TRUE; PREP_OK = TRUE; break; /*--------------------------------------------------------------------*/ case PREPROCESS_UNDEF: if(InFalseIfDef()) break; USE_DEFS = FALSE; if(!DelDefine(GetNextWord())) error(ERR_UNDEFINE,szTemp); USE_DEFS = TRUE; PREP_OK = TRUE; break; /*--------------------------------------------------------------------*/ case PREPROCESS_IFDEF: if(InFalseIfDef()) break; USE_DEFS = FALSE; EnterIfDef(FindDefine(defList,GetNextWord())!=NULL); USE_DEFS = TRUE; PREP_OK = TRUE; break; /*--------------------------------------------------------------------*/ case PREPROCESS_IFNDEF: if(InFalseIfDef()) break; USE_DEFS = FALSE; EnterIfDef(FindDefine(defList,GetNextWord())==NULL); USE_DEFS = TRUE; PREP_OK = TRUE; break; /*--------------------------------------------------------------------*/ case PREPROCESS_ELSE: if(!curScript->ifdefTrack || curScript->ifdefTrack->ELSE) { error(ERR_PREPELSEUNEXP); } else { curScript->ifdefTrack->RESULT = !curScript->ifdefTrack->RESULT; curScript->ifdefTrack->ELSE = TRUE; } PREP_OK = TRUE; break; /*--------------------------------------------------------------------*/ case PREPROCESS_ENDIF: //TODO fix this ReleaseIfDef(); PREP_OK = TRUE; break; /**********************************************************************/ case PREPROCESS_TODO: case PREPROCESS_WARNING: case PREPROCESS_ERROR: case PREPROCESS_FATAL: if(InFalseIfDef()) break; if(GetNextWord()[0]!='"' || !DoString()) strcpy(szString,"<user message>"); switch(code) { case PREPROCESS_TODO: todo(szString); break; case PREPROCESS_WARNING: warning(WRN_USERPREP,szString); break; case PREPROCESS_ERROR: error(ERR_USERPREP,szString); break; case PREPROCESS_FATAL: fatal(FTL_USERPREP,szString); break; } PREP_OK = TRUE; break; /**********************************************************************/ case PREPROCESS_TELL: if(InFalseIfDef()) break; PREP_OK = TRUE; switch(code=CheckSubList(code)) { case PREPROCESS_TELL_BANK: CheckCurBank(); notice(code,"Current Bank: %s (#%d)", curBank->label, curBank->bank); break; case PREPROCESS_TELL_BANKOFFSET: CheckCurBank(); notice(code,"Current Bank: %s (#%d); Offset: $%04X (%d)", curBank->label, curBank->bank, (BANK_OFFSET(curBank)+curBank->org), (BANK_OFFSET(curBank)+curBank->org)); break; case PREPROCESS_TELL_BANKSIZE: CheckCurBank(); notice(code,"Current Bank: %s (#%d); Current Size: $%04X (%d bytes)", curBank->label, curBank->bank, (BANK_OFFSET(curBank)), (BANK_OFFSET(curBank))); break; case PREPROCESS_TELL_BANKFREE: CheckCurBank(); notice(code,"Current Bank: %s (#%d); Current Bytes Free In Bank: $%04X (%d)", curBank->label, curBank->bank, (BANK_OFFSET(curBank)), (BANK_OFFSET(curBank))); break; case PREPROCESS_TELL_BANKTYPE: CheckCurBank(); notice(code,"Current Bank: %s (#%d); Type: %s", curBank->label, curBank->bank, szBankTypes[curBank->type]); break; default: error(ERR_PREPROCESSORID,szTemp); PREP_OK = FALSE; } break; /**********************************************************************/ case PREPROCESS_RAM: if(InFalseIfDef()) break; PREP_OK = TRUE; switch(code=CheckSubList(code)) { case PREPROCESS_RAM_ORG: // blockaddress[, maxsize] if(IsStrNum(GetNextWord())) { ramBank.org = 0; ramBank.ptr = ramBank.buffer+ConfirmWord(StrToInt(szTemp)); curBank = &ramBank; PREP_OK = TRUE; } else error(ERR_INTEXP); if(PeekNextWord()[0]==',') { GetNextWord(); if(IsStrNum(GetNextWord())) { ramBank.maxsize = BANK_OFFSET(curBank)+ConfirmWord(StrToInt(szTemp)); } else { error(ERR_INTEXP); PREP_OK = FALSE; } } curBank->end = curBank->buffer+ramBank.maxsize; break; case PREPROCESS_RAM_END: curBank = NULL; break; default: error(ERR_PREPROCESSORID,szTemp); PREP_OK = FALSE; } break; /**********************************************************************/ case PREPROCESS_ROM: if(InFalseIfDef()) break; PREP_OK = TRUE; switch(code=CheckSubList(code)) { case PREPROCESS_ROM_ORG: // blockaddress[, maxsize] CheckRomBank(); if(IsStrNum(GetNextWord())) { #if 0 curBank->org = ConfirmWord(StrToInt(szTemp)); #else curBank->org = ConfirmWord(StrToInt(szTemp))-BANK_OFFSET(curBank); #endif PREP_OK = TRUE; } else error(ERR_INTEXP); if(PeekNextWord()[0]==',') { GetNextWord(); if(IsStrNum(GetNextWord())) { curBank->maxsize = ConfirmWord(StrToInt(szTemp)); } else { error(ERR_INTEXP); PREP_OK = FALSE; } } break; case PREPROCESS_ROM_END: CheckRomBank(); curBank = NULL; break; case PREPROCESS_ROM_BANKSIZE: // size if(IsStrNum(GetNextWord())) { bankSizes[BANKTYPE_ROM] = StrToInt(szTemp); if(bankSizes[BANKTYPE_ROM] > MAX_BANKSIZE) { error(ERR_BANKSIZE,bankSizes[BANKTYPE_ROM],MAX_BANKSIZE); bankSizes[BANKTYPE_ROM] = MAX_BANKSIZE; } PREP_OK = TRUE; } else error(ERR_INTEXP); if(PeekNextWord()[0]==',') { GetNextWord(); CheckRomBank(); if(IsStrNum(GetNextWord())) { curBank->maxsize = (StrToInt(szTemp)); } else { error(ERR_INTEXP); PREP_OK = FALSE; } } break; case PREPROCESS_ROM_BANK: // label if(!IsStringLabel(GetNextWord())) { error(ERR_BADLABEL,szTemp); strcpy(szTemp,""); } SetBank(BANKTYPE_ROM, szTemp); break; default: error(ERR_PREPROCESSORID,szTemp); PREP_OK = FALSE; } break; /**********************************************************************/ case PREPROCESS_CHR: if(InFalseIfDef()) break; PREP_OK = TRUE; switch(code=CheckSubList(code)) { case PREPROCESS_CHR_BANKSIZE: // size if(IsStrNum(GetNextWord())) { bankSizes[BANKTYPE_CHR] = (StrToInt(szTemp)); if(bankSizes[BANKTYPE_CHR] > MAX_BANKSIZE) { error(ERR_BANKSIZE,bankSizes[BANKTYPE_CHR],MAX_BANKSIZE); bankSizes[BANKTYPE_CHR] = MAX_BANKSIZE; } PREP_OK = TRUE; } else error(ERR_INTEXP); if(PeekNextWord()[0]==',') { GetNextWord(); if(IsStrNum(GetNextWord())) { curBank->maxsize = (StrToInt(szTemp)); } else { error(ERR_INTEXP); PREP_OK = FALSE; } } break; case PREPROCESS_CHR_BANK: // label if(!IsStringLabel(GetNextWord())) { error(ERR_BADLABEL,szTemp); strcpy(szTemp,""); } SetBank(BANKTYPE_CHR, szTemp); break; case PREPROCESS_CHR_END: CheckChrBank(); curBank = NULL; break; default: error(ERR_PREPROCESSORID,szTemp); PREP_OK = FALSE; } break; /**********************************************************************/ case PREPROCESS_INES: if(InFalseIfDef()) break; PREP_OK = TRUE; switch(code=CheckSubList(code)) { case PREPROCESS_INES_MAPPER: // (number|"name") if(GetNextWord()[0]=='"') { if(DoString()) { if((index=StrInStrint(szString, siMappers))==-1) error(ERR_UNKMAPPER,szString); else { romHeader.mapper = siMappers[index].index; PREP_OK = TRUE; } } } else if(IsStrNum(szTemp)) { romHeader.mapper = ConfirmChar(StrToInt(szTemp)); PREP_OK = TRUE; } else error(ERR_INTEXP); break; case PREPROCESS_INES_MIRRORING: // (number|"name") if(GetNextWord()[0]=='"') { if(DoString()) { if((index=StrInStrint(szString, siMirroring))==-1) error(ERR_UNKMIRRORING,szString); else { romHeader.mirroring = siMirroring[index].index; PREP_OK = TRUE; } } } else if(IsStrNum(szTemp)) { romHeader.mirroring = ConfirmChar(StrToInt(szTemp)); PREP_OK = TRUE; } else error(ERR_INTEXP); break; case PREPROCESS_INES_BATTERY: romHeader.battery = PreprocessCheckYesNo(&PREP_OK); break; case PREPROCESS_INES_TRAINER: romHeader.trainer = PreprocessCheckYesNo(&PREP_OK); break; case PREPROCESS_INES_FOURSCREEN: romHeader.fourscreen = PreprocessCheckYesNo(&PREP_OK); break; case PREPROCESS_INES_PRGREPEAT: if(IsStrNum(GetNextWord())) { romHeader.prgrepeat = ConfirmChar(StrToInt(szTemp)); PREP_OK = TRUE; } else error(ERR_INTEXP); break; case PREPROCESS_INES_CHRREPEAT: if(IsStrNum(GetNextWord())) { romHeader.chrrepeat = ConfirmChar(StrToInt(szTemp)); PREP_OK = TRUE; } else error(ERR_INTEXP); break; case PREPROCESS_INES_OFF: cfg.output.enableHeader = FALSE; break; default: error(ERR_PREPROCESSORID,szTemp); PREP_OK = FALSE; } break; /**********************************************************************/ case PREPROCESS_INTERRUPT: if(InFalseIfDef()) break; PREP_OK = TRUE; if(!PRECOMPILING) switch(code=CheckSubList(code)) { case PREPROCESS_INTERRUPT_NMI: case PREPROCESS_INTERRUPT_START: case PREPROCESS_INTERRUPT_IRQ: PREP_OK = PreprocessInterrupt(code); break; default: error(ERR_PREPROCESSORID,szTemp); PREP_OK = FALSE; } break; /**********************************************************************/ default: error(ERR_PREPROCESSORID,szTemp); } if(!PREP_OK) SkipLine(TRUE); // if there was an error, skip to the next line return TRUE; }
void CMfxEvent::setToDefaults() { SetTime( 0 ); SetPort( 0 ); SetChannel( 0 ); switch (GetType()) { case Note: SetKey( 60 ); SetVel( 64 ); SetDur( 120 ); break; case KeyAft: SetKey( 60 ); SetPressure( 0 ); break; case Control: SetCtrlNum( CTL_MODULATION ); SetCtrlVal( 0 ); break; case Patch: SetBankSelectMethod( Normal ); SetBank( BANK_NONE ); SetPatch( 0 ); break; case ChanAft: SetPressure( 0 ); break; case Wheel: SetWheel( 0 ); break; case RPN: case NRPN: SetCtrlNum( 0 ); SetCtrlVal( 0 ); break; case Sysx: case Text: case Lyric: m_hBuffer = NULL; break; case MuteMask: m_mfxChannel = 0; m_maskSet = 0; m_maskClear = 0; break; case VelOfs: case KeyOfs: m_mfxChannel = 0; m_nOfs = 0; break; case VelTrim: case KeyTrim: m_mfxChannel = 0; m_nTrim = 0; break; case ShortMsg: m_dwShortMsg = 0; break; default: ASSERT(FALSE); break; } }
/* ======================================================================= */ ENC28J60Driver::ENC28J60Driver(uint8_t* macaddr, uint8_t csPin): EthernetDriver(macaddr){ this->sendBuffer = new ENC28J60Buffer(this,TXSTART_INIT+1, TXSTOP_INIT, MAX_FRAMELEN, 0,false); this->recvBuffer = new ENC28J60Buffer(this,RXSTART_INIT, RXSTOP_INIT, MAX_FRAMELEN, 0,true); this->stashBuffer = new ENC28J60Buffer(this,STASH_START_INIT, STASH_STOP_INIT, STASH_STOP_INIT - STASH_START_INIT +1, 0,false); if (bitRead(SPCR, SPE) == 0) initSPI(); selectPin = csPin; pinMode(selectPin, OUTPUT); disableChip(); writeOp(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET); delay(2); // errata B7/2 while (!readOp(ENC28J60_READ_CTRL_REG, ESTAT) & ESTAT_CLKRDY) ; gNextPacketPtr = RXSTART_INIT; writeReg(ERXST, RXSTART_INIT); writeReg(ERXRDPT, RXSTART_INIT); writeReg(ERXND, RXSTOP_INIT); writeReg(ETXST, TXSTART_INIT); writeReg(ETXND, TXSTOP_INIT); writeRegByte(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_PMEN|ERXFCON_BCEN); writeReg(EPMM0, 0x303f); writeReg(EPMCS, 0xf7f9); writeRegByte(MACON1, MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS); writeRegByte(MACON2, 0x00); writeOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN); writeReg(MAIPG, 0x0C12); writeRegByte(MABBIPG, 0x12); writeReg(MAMXFL, MAX_FRAMELEN); writeRegByte(MAADR5, macaddr[0]); writeRegByte(MAADR4, macaddr[1]); writeRegByte(MAADR3, macaddr[2]); writeRegByte(MAADR2, macaddr[3]); writeRegByte(MAADR1, macaddr[4]); writeRegByte(MAADR0, macaddr[5]); writePhy(PHCON2, PHCON2_HDLDIS); SetBank(ECON1); writeOp(ENC28J60_BIT_FIELD_SET, EIE, EIE_INTIE|EIE_PKTIE); writeOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN); this->revision = readRegByte(EREVID); // microchip forgot to step the number on the silcon when they // released the revision B7. 6 is now rev B7. We still have // to see what they do when they release B8. At the moment // there is no B8 out yet if (this->revision > 5) this->revision++; }