Function HardwareComparisonPage !define CPU_SPEED_DETECTED_FIELD "Field 8" !define VID_MEM_DETECTED_FIELD "Field 9" ; Display's a small dialog to let the user know we are doing something. ; "Banner" is an NSIS plugin, check out the Contrib folder of the SDK for ; the fine details. Banner::show /NOUNLOAD /set 76 "$(HARDWARE_CHECK_PROGRESS_TEXT)" " " ; $0 is used to return values from calls to 3dnahwinfo DLL Push $0 3dnahwinfo::GetSystemMemory !insertmacro MUI_INSTALLOPTIONS_WRITE "HardwareComparisonDialog.ini" "Field 7" State "$0 MB" ; GetCPUSpeed actually retrieves the cpu speed as one large number or separated ; into Ghz and megahertz. See the source for 3dnahwinfo.dll for details. 3dnahwinfo::GetCPUSpeed ; Check if the CPU speed is 1 Ghz or more IntOp $R0 $0 / 1000 IntCmp $R0 1 0 +3 0 ; If a CPU is in the GHz range we can skip over !insertmacro MUI_INSTALLOPTIONS_WRITE "HardwareComparisonDialog.ini" "${CPU_SPEED_DETECTED_FIELD}" State "$1.$2 Ghz" Goto +2 !insertmacro MUI_INSTALLOPTIONS_WRITE "HardwareComparisonDialog.ini" "${CPU_SPEED_DETECTED_FIELD}" State "$0 MHz" HwInfo::GetVideoCardMemory !insertmacro MUI_INSTALLOPTIONS_WRITE "HardwareComparisonDialog.ini" "${VID_MEM_DETECTED_FIELD}" State "$0 MB" ; Get rid of the banner but only after checking all the system specs which is ; why it is destroyed here. Banner::destroy Pop $0 Push $R0 Push $R1 Push $R2 Push $R3 Push $R4 Push $R5 Push $R6 Push $R7 !define CPU_STATUS $R4 !define RAM_STATUS $R5 !define VRAM_STATUS $R6 !define SYSCHECK_RESULT $R7 ; Minimum and recommended RAM, CPU, VRAM values !define DEFUNCT_RAM 128 !define DEFUNCT_CPU 300 !define DEFUNCT_VRAM 16 !define MIN_RAM 256 !define MIN_CPU 500 !define MIN_VRAM 32 !define REC_RAM 384 !define REC_CPU 1000 !define REC_VRAM 64 !define GRAPHICS_SETTINGS_REG_VALUE "GraphicsSettings" HwInfo::GetCPUSpeed StrCpy $R0 $0 HwInfo::GetVideoCardMemory StrCpy $R1 $0 HwInfo::GetSystemMemory StrCpy $R2 $0 ; The status of each system item is given a score based on whether it meets the ; recommended, minimum, is under the minimum or is less than the real extremely ; poor system specs. ; ; Scores are assigned as follows: ; ; Recommended -> 3 ; ; Minimum -> 2 ; ; Undermin but ; more than extremely ; poor system -> 1 ; ; Extremely poor ; system -> 0 ; ; Extremely poor is as follows for system items ; ; RAM < 128 MB ; CPU < 300 Mhz ; GPU VRAM < 16 IntCmpU $R2 ${REC_RAM} 0 MinimumRAMCheck_label 0 StrCpy ${RAM_STATUS} "3" Goto DoneRAMCheck_label MinimumRAMCheck_label: IntCmpU $R2 ${MIN_RAM} 0 UnderminRAMCheck_label 0 StrCpy ${RAM_STATUS} "2" Goto DoneRAMCheck_label ; If we get to this label we're under the minimum. Probably to slow ; to run anything. First we need to check if the system is defunct. ; In the case of RAM this means less than 128 MB. UnderminRAMCheck_label: IntCmpU $R2 ${DEFUNCT_RAM} 0 0 +3 StrCpy ${RAM_STATUS} "0" Goto DoneRAMCheck_label IntCmpU $R2 ${MIN_RAM} 0 +2 0 StrCpy ${RAM_STATUS} "1" DoneRAMCheck_label: ; Check the status of the CPU here. IntCmpU $R0 ${REC_CPU} 0 MinimumCPUCheck_label 0 StrCpy ${CPU_STATUS} "3" Goto DoneCPUCheck_label MinimumCPUCheck_label: IntCmpU $R0 ${MIN_CPU} 0 UnderminCPUCheck_label 0 StrCpy ${CPU_STATUS} "2" Goto DoneCPUCheck_label UnderminCPUCheck_label: ; If CPU < 300 Mhz IntCmpU $R0 ${DEFUNCT_CPU} 0 0 +3 StrCpy ${CPU_STATUS} "0" Goto DoneCPUCheck_label IntCmpU $R0 ${MIN_CPU} 0 +2 0 StrCpy ${CPU_STATUS} "1" DoneCPUCheck_label: ; If VRAM is at or better than recommended IntCmpU $R1 ${REC_VRAM} 0 MinimumVRAMCheck_label 0 StrCpy ${VRAM_STATUS} "3" Goto DoneVRAMCheck_label MinimumVRAMCheck_label: IntCmpU $R1 ${MIN_VRAM} 0 UnderminVRAMCheck_label 0 StrCpy ${VRAM_STATUS} "2" Goto DoneVRAMCheck_label UnderminVRAMCheck_label: IntCmpU $R1 ${DEFUNCT_VRAM} 0 0 +3 StrCpy ${VRAM_STATUS} "1" Goto DoneVRAMCheck_label IntCmpU $R1 ${MIN_VRAM} 0 +2 0 StrCpy ${VRAM_STATUS} "0" DoneVRAMCheck_label: ; Push the status we've found for each of the system items onto the stack ; Then loop through all of them to find the lowest numbered item. The worst ; item of the three determines the grahpics settings used to run 3DNA. Push ${CPU_STATUS} Push ${RAM_STATUS} Push ${VRAM_STATUS} StrCpy ${SYSCHECK_RESULT} "4" ; $R1 is used as a counter. It's set to 3 because we only to be popping 3 ; items off the stack and NSIS has no looping mechanism other than labels ; and goto's. StrCpy $R1 "3" ; Loop start CheckSystemStatus_label: Pop $R0 ; Check if the value of the current item popped off of the stack is less than ; the currently held value. IntCmpU $R0 ${SYSCHECK_RESULT} +2 0 +2 StrCpy ${SYSCHECK_RESULT} $R0 ; Decrement the loop counter and check if we're at 0. IntOp $R1 $R1 - 1 IntCmp $R1 0 +2 +2 0 Goto CheckSystemStatus_label ; Loop end IntCmp ${SYSCHECK_RESULT} 3 0 MinSysCheck_label 0 WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\${THREEDNA_REG_KEY}" ${GRAPHICS_SETTINGS_REG_VALUE} "0x00000002" StrCpy $R3 "$(HARDWARE_CHECK_MSG_A)" StrCpy $PARAMS_FILE_TO_USE "3dnaparamsA.txt" StrCpy $RECOMMENDED_SYSTEM_FLAG ${TRUE} Goto DoneSysCheck_label MinSysCheck_label: IntCmp ${SYSCHECK_RESULT} 2 0 UnderminSysCheck_label 0 StrCpy $R3 "$(HARDWARE_CHECK_MSG_B)" WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\${THREEDNA_REG_KEY}" ${GRAPHICS_SETTINGS_REG_VALUE} "0x00000001" StrCpy $PARAMS_FILE_TO_USE "3dnaparamsB.txt" Goto DoneSysCheck_label UnderminSysCheck_label: IntCmp ${SYSCHECK_RESULT} 1 0 DefunctSysCheck_label 0 StrCpy $R3 "$(HARDWARE_CHECK_MSG_C)" WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\${THREEDNA_REG_KEY}" ${GRAPHICS_SETTINGS_REG_VALUE} "0x00000000" StrCpy $PARAMS_FILE_TO_USE "3dnaparamsC.txt" Goto DoneSysCheck_label DefunctSysCheck_label: IntCmp ${SYSCHECK_RESULT} 0 0 0 0 StrCpy $R3 "$(HARDWARE_CHECK_MSG_D)" WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\${THREEDNA_REG_KEY}" ${GRAPHICS_SETTINGS_REG_VALUE} "0x00000000" StrCpy $PARAMS_FILE_TO_USE "3dnaparamsD.txt" Goto DoneSysCheck_label DoneSysCheck_label: ; If O/S is not Win98, WinME, Win2000 or WinXP then the installation is ; not likely to work. Call GetWindowsVersion Pop $R0 StrCmp $R0 ${GET_WINDOWS_VERSION_WINXP} 0 +2 Goto OSCheckDone_label StrCmp $R0 ${GET_WINDOWS_VERSION_WIN2000} 0 +2 Goto OSCheckDone_label StrCmp $R0 ${GET_WINDOWS_VERSION_WIN98} 0 +2 Goto OSCheckDone_label StrCmp $R0 ${GET_WINDOWS_VERSION_WINME} 0 +2 Goto OSCheckDone_label StrCpy $PARAMS_FILE_TO_USE "3DNAparamsE.txt" StrCpy $R3 "$(HARDWARE_CHECK_MSG_E)" WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\${THREEDNA_REG_KEY}" ${GRAPHICS_SETTINGS_REG_VALUE} "0x00000000" OSCheckDone_label: ; Text for column headers !insertmacro MUI_INSTALLOPTIONS_WRITE "HardwareComparisonDialog.ini" "Field 4" Text "$(HARDWARE_PAGE_DETECTED_TEXT)" !insertmacro MUI_INSTALLOPTIONS_WRITE "HardwareComparisonDialog.ini" "Field 5" Text "$(HARDWARE_PAGE_MINIMUM_TEXT)" !insertmacro MUI_INSTALLOPTIONS_WRITE "HardwareComparisonDialog.ini" "Field 6" Text "$(HARDWARE_PAGE_RECOMMENDED_TEXT)" ; Hardware query info message. The message that tells you whether you're running a crap computer ; or something good. !insertmacro MUI_INSTALLOPTIONS_WRITE "HardwareComparisonDialog.ini" "Field 16" Text "$R3" ; Text for legend !insertmacro MUI_INSTALLOPTIONS_WRITE "HardwareComparisonDialog.ini" "Field 20" Text "$(HARDWARE_PAGE_MEET_OR_EXCEED_REC_TEXT)" !insertmacro MUI_INSTALLOPTIONS_WRITE "HardwareComparisonDialog.ini" "Field 21" Text "$(HARDWARE_PAGE_MEET_MIN_TEXT)" !insertmacro MUI_INSTALLOPTIONS_WRITE "HardwareComparisonDialog.ini" "Field 22" Text "$(HARDWARE_PAGE_DOESNT_MEET_MIN_TEXT)" !insertmacro MUI_HEADER_TEXT "$(HARDWARE_PAGE_HEADER_TEXT)" "$(HARDWARE_PAGE_SUB_HEADER_TEXT)" Push $R0 Push $R1 ; Initialize the dialog !insertmacro MUI_INSTALLOPTIONS_INITDIALOG "HardwareComparisonDialog.ini" Pop $R0 ; "Legend" dialog items, lets the user know what each of the colors they ; might recieve in the hardware check means. GetDlgItem $R1 $R0 1216 SetCtlColors $R1 ${BLACK} ${GREEN} GetDlgItem $R1 $R0 1217 SetCtlColors $R1 ${BLACK} ${YELLOW} GetDlgItem $R1 $R0 1218 SetCtlColors $R1 ${BLACK} ${RED} ; This section below sets color coding for system specs detected on the installing system IntCmpU ${RAM_STATUS} 3 0 +3 +3 GetDlgItem $R1 $R0 1206 SetCtlColors $R1 ${BLACK} ${GREEN} IntCmpU ${RAM_STATUS} 2 0 +3 +3 GetDlgItem $R1 $R0 1206 SetCtlColors $R1 ${BLACK} ${YELLOW} IntCmpU ${RAM_STATUS} 1 0 0 +3 GetDlgItem $R1 $R0 1206 SetCtlColors $R1 ${BLACK} ${RED} IntCmpU ${CPU_STATUS} 3 0 +3 +3 GetDlgItem $R1 $R0 1207 SetCtlColors $R1 ${BLACK} ${GREEN} IntCmpU ${CPU_STATUS} 2 0 +3 +3 GetDlgItem $R1 $R0 1207 SetCtlColors $R1 ${BLACK} ${YELLOW} IntCmpU ${CPU_STATUS} 1 0 0 +3 GetDlgItem $R1 $R0 1207 SetCtlColors $R1 ${BLACK} ${RED} IntCmpU ${VRAM_STATUS} 3 0 +3 +3 GetDlgItem $R1 $R0 1208 SetCtlColors $R1 ${BLACK} ${GREEN} IntCmpU ${VRAM_STATUS} 2 0 +3 +3 GetDlgItem $R1 $R0 1208 SetCtlColors $R1 ${BLACK} ${YELLOW} IntCmpU ${VRAM_STATUS} 1 0 0 +3 GetDlgItem $R1 $R0 1208 SetCtlColors $R1 ${BLACK} ${RED} ; End of color coding !insertmacro MUI_INSTALLOPTIONS_SHOW Pop $R1 Pop $R0 Pop $R7 Pop $R6 Pop $R5 Pop $R4 Pop $R3 Pop $R2 Pop $R1 Pop $R0 FunctionEnd