static void write_cmos(unsigned char address, unsigned char buf) { if(address >= EEPROMSIZE_BANK0) // 0~199 return ; #if (defined(DMP_DOS_BC) || defined(DMP_DOS_DJGPP) || defined(DMP_DOS_WATCOM)) io_DisableINT(); #elif defined (DMP_LINUX) lockCMOS(); #endif void *pciDev = NULL; pciDev = pci_Alloc(0x00, 0x07, 0x00); if(pciDev == NULL) { #if (defined(DMP_DOS_BC) || defined(DMP_DOS_DJGPP) || defined(DMP_DOS_WATCOM)) Serial.print("CMOS device doesn't exist\n"); #elif (defined(DMP_LINUX)) printf("CMOS device doesn't exist\n"); #endif return; } unsigned long int reg; reg = pci_In32(pciDev, 0xc0); if(address == 20 || address == 22) //special case { //Set bit 3 to access high 128 bytes RTC SRAM pci_Out32(pciDev, 0xc0, reg | 0x00000008); address = (address == 20)? 26:27; io_outpb(0x70, address); } else if(address < 100) // 0~99 low page { //clear bit 3 to access low 128 bytes RTC SRAM pci_Out32(pciDev, 0xc0, reg & 0xfffffff7); io_outpb(0x70, address + 28); } else// 100~199 high page { //Set bit 3 to access high 128 bytes RTC SRAM pci_Out32(pciDev, 0xc0, reg | 0x00000008); address -= 100; io_outpb(0x70, address + 28); } io_outpb(0x71, buf); // Restore old register value pci_Out32(pciDev, 0xc0, reg); pci_Free(pciDev); #if (defined(DMP_DOS_BC) || defined(DMP_DOS_DJGPP) || defined(DMP_DOS_WATCOM)) io_RestoreINT(); #elif defined (DMP_LINUX) unLockCMOS(); #endif }
DMPAPI(void) vx86_NBSB_Write(int fun, unsigned char offset, unsigned long val) { if (VX86_pciDev[VX86_NB + fun] == NULL) return; pci_Out32(VX86_pciDev[VX86_NB + fun], offset, val); }