mac-tip/x86-asm-source/tip-asm.sav
2021-11-19 21:28:52 -07:00

3062 lines
110 KiB
Plaintext

;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ TIP.ASM TROUBLE IN PARADISE 05/22/98 ³
;ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ TO DO ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; o verify that disk status is being read correctly with External Zip drives
;
; o spell-check all rtf files and tip.txt
;
; o dynamically adapt to maximum adpater transfer length
;
; o handle completion debriefing
;
;-//////////////////////////////////////////////////////////////////////////-
;
; o determine TRUE maximum number of available JAZ relocations
; This still needs to be done, but for now I've clipped the test so if
; we are told there are more than the maximum we'll be okay.
;
; o lock drives for use under Win95/98 and NT ??????
; o perhaps LOCKING the drive for exclusive use?
; Can't Lock drive for exclusive use, since the locking semantics are for
; LOGICAL (drive letter) devices, and there's no clear and simple API for
; determining the LOGICAL drive letter from the PHYSICAL SCSI device.
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
include standard.inc
include aspi.inc
include richedit.inc
include commctrl.inc
include macros.inc
DEVELOPMENT = 1
INITIAL_PAGE = PERFORM_TEST_PAGE
FORCE_TROUBLE = 0
MINIMUM_VERSION = 0 ; set it to zero for NO minimum version checking
EXTERNDEF FontBitmapImage :DWORD ; our floating "?" bitmap image
EXTERNDEF RTF_Data :DWORD
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ F U N C T I O N P R O T O T Y P E S ³
;ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;
WndProc PROTO :HWND, :UINT, :WPARAM, :LPARAM
CenterWindow PROTO :HWND
DecompressBinary PROTO :LPVOID
AllocateSixteenColorDib PROTO Hwidth:DWORD, Vheight:DWORD
SplashTheBitmap PROTO hDC:HDC
PrepForFastBlitting PROTO :HGLOBAL
ApplicationTimerProc PROTO :HWND, :UINT, :UINT, :DWORD
EjectIomegaCartridge PROTO Adapter:DWORD, Device:DWORD
SpinUpIomegaCartridge PROTO Adapter:DWORD, Device:DWORD
SetRichEditText PROTO phRichEditControl:LPHWND, pText:LPSTR
PostToScreen PROTO PostVal:DWORD
PasswordWndProc PROTO :HWND, :UINT, :WPARAM, :LPARAM
SetTabErrorMode PROTO DisplayMode:BOOL
EjectAllMedia PROTO ; unlock and eject all drives
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ E Q U A T E S ³
;ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;
WIZARD_WINDOW_HEIGHT equ 337 ; 358 - 19
WIZARD_WINDOW_WIDTH equ 467 ; 480
NUMBER_OF_FLOATERS equ 6
VELOCITY_MULTIPLIER equ 1000
SMALLER_FONT_SIZE equ 8
LARGER_FONT_SIZE equ 10
HEADLINE_FONT_SIZE equ 21
SPLASH_WIDTH equ 120
SPLASH_HEIGHT equ 258
FONT_WIDTH equ 151
FONT_HEIGHT equ 251
LOGO_1_LEFT equ 157
LOGO_1_TOP equ 57
LOGO_2_LEFT equ 400
LOGO_2_TOP equ 17
HYPERLINK_HEIGHT equ 248
FILE_TIME_TICKS_PER_SECOND equ 10000000
SOURCE_BITMAP_BYTE_WIDTH equ ((FONT_WIDTH+31)/32)*4
DEST_BITMAP_BYTE_WIDTH equ (SPLASH_WIDTH / 2)
FONT_TOP_OFFSET equ SIZEOF BITMAPFILEHEADER + SIZEOF BITMAPINFOHEADER + 2*4 + ((FONT_HEIGHT-1) * SOURCE_BITMAP_BYTE_WIDTH)
RANDOMULT equ 0B6CAEB15h
PALETTE_SIZE equ 16 ; Splash is a 16-color bitmap
IDB_LINEUP equ WM_APP
IDB_LINEDN equ WM_APP+1
IDB_PAGEUP equ WM_APP+2
IDB_PAGEDN equ WM_APP+3
IDB_END equ WM_APP+4
IDB_HOME equ WM_APP+5
FLASH_COUNT equ 16
RANDOMULT equ 0B6CAEB15h
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Password Dialog Defines ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
IDC_PASSWORD equ 3
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Drive Array Status Flags ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; +---- Device
; | +--- Adapter
; v v
JAZ_DRIVE equ 00010000h
MEDIA_CHANGED equ 00020000h
DISK_EJECTING equ 00040000h ; we've asked for eject and waiting ...
MAX_DRIVE_COUNT equ 16 ; we can handle up to 16 Zip/Jaz drives
FORMAT_STATUS_PAGE equ 1
DISK_STATUS_PAGE equ 2
NEW_DISK_STATUS_OFFSET equ 3 ; newer offset of the Disk Status Byte
OLD_DISK_STATUS_OFFSET equ 1 ; older " " " "
JAZ_SPARES_COUNT_OFFSET equ 68 ; offsets into DiskStat tbl
NEW_ZIP_SIDE_0_SPARES_COUNT_OFFSET equ 13
NEW_ZIP_SIDE_1_SPARES_COUNT_OFFSET equ 17
OLD_ZIP_SIDE_0_SPARES_COUNT_OFFSET equ 11
OLD_ZIP_SIDE_1_SPARES_COUNT_OFFSET equ 15
JAZ_PROTECT_MODE_OFFSET equ 21
NEW_ZIP_PROTECT_MODE_OFFSET equ 21
OLD_ZIP_PROTECT_MODE_OFFSET equ 19
JAZ_LAST_LBA_OFFSET equ 5
NEW_ZIP_LAST_LBA_OFFSET equ 5
OLD_ZIP_LAST_LBA_OFFSET equ 3
MINIMUM_JAZ_SPARES equ 500
MAXIMUM_JAZ_SPARES equ 2557
MINIMUM_ZIP_SPARES equ 50
MAXIMUM_ZIP_SPARES equ 126
BYTES_PER_SECTOR equ 512
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Cartridge Status ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
DISK_STATUS_UNKNOWN equ 1
DISK_AT_SPEED equ 2
DISK_SPINNING_UP equ 3
DISK_NOT_PRESENT equ 4
DISK_SPUN_DOWN equ 5
DISK_STALLED equ 6
DISK_Z_TRACK_FAILURE equ 7
DISK_PROTECTED equ 8
DISK_LOW_SPARES equ 9
DISK_TEST_UNDERWAY equ 10
DISK_TEST_FAILURE equ 11
;--------------------------------------------------------------------------
LAST_CART_STATUS equ 11
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Testing Phase Status ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
UNTESTED equ 0
READY_TO_TEST equ 1
TESTING_STARTUP equ 2
READING_DATA equ 3
WRITING_PATT equ 4
READING_PATT equ 5
WRITING_DATA equ 6
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ NON-COMPRESSED GLOBAL DATA ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.data
ALIGN 4
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ANIMATION MOTION CONSTANTS ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
xleft DWORD NUMBER_OF_FLOATERS dup (0)
ytop DWORD NUMBER_OF_FLOATERS dup (FONT_TOP_OFFSET)
xwidth DWORD NUMBER_OF_FLOATERS dup (FONT_WIDTH)
yheight DWORD NUMBER_OF_FLOATERS dup (FONT_HEIGHT)
transform DWORD NUMBER_OF_FLOATERS dup (Xform1)
Xform1 DWORD 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15, 15, 15
ObjectTypes DWORD 0,1*4,2*4,3*4,4*4,5*4
; this gives same-width objects different velocities, otherwise they
; would all be running at exactly the same speed with boring overlaps
velocities DWORD FONT_WIDTH, FONT_WIDTH+20, FONT_WIDTH+40
DWORD FONT_WIDTH+60, FONT_WIDTH+80, FONT_WIDTH+100
LogoPalette WORD 0300h ; LOGPALETTE HEADER WORDS
WORD PALETTE_SIZE
SplashPalette DWORD 00A10303h, 00AD1F20h, 00B32E30h, 00B93E40h
DWORD 00BC4649h, 00C35559h, 00C65E62h, 00CB6A6Eh
DWORD 00D27A80h, 00DA8D93h, 00DF99A0h, 00E09DA4h
DWORD 00E6ABB3h, 00EDBCC5h, 00FCE1EAh, 00FEEAF1h
FourBitMasks DWORD 0000000Fh, 000000F0h, 00000F00h, 0000F000h
DWORD 000F0000h, 00F00000h, 0F000000h, 0F0000000h
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
CommandDetailsTable LABEL BYTE ; Command
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
db SCSI_Cmd_RequestSense , SRB_DIR_IN ; 03 IN == get from drive
db SCSI_Cmd_FormatUnit , 0 ; 04 OUT == send to drive
db SCSI_Cmd_NonSenseData , SRB_DIR_IN ; 06
db SCSI_Cmd_Read , SRB_DIR_IN ; 08
db SCSI_Cmd_Write , SRB_DIR_OUT ; 0A
db SCSI_Cmd_CartProtect , SRB_DIR_OUT ; 0C
db SCSI_Cmd_Inquiry , SRB_DIR_IN ; 12
db SCSI_Cmd_ModeSelect , SRB_DIR_OUT ; 15
db SCSI_Cmd_ModeSense , SRB_DIR_IN ; 1A
db SCSI_Cmd_StartStopUnit , 0 ; 1B
db SCSI_Cmd_SendDiagnostic , 0 ; 1D
db SCSI_Cmd_PreventAllow , 0 ; 1E
db SCSI_Cmd_TranslateLBA , SRB_DIR_IN ; 22
db SCSI_Cmd_FormatTest , 0 ; 24
db SCSI_Cmd_ReadMany , SRB_DIR_IN ; 28
db SCSI_Cmd_WriteMany , SRB_DIR_OUT ; 2A
db SCSI_Cmd_Verify , 0 ; 2F
db SCSI_Cmd_ReadDefectData , SRB_DIR_IN ; 37
;--------------------------------------------------------------------------
LENGTH_OF_DETAILS_TABLE = $ - CommandDetailsTable
RichEditStreamIn EDITSTREAM <NULL,NULL,OFFSET StreamSource>
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Test Monitor Panel Definitions ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
CS_Stat RECT <114, 8, 242, 28>
TP_Perc RECT < 12, 56, 409, 72>
SS_Jaz RECT < 12, 94, 409,126>
SS_Sid0 RECT < 12, 94, 409,110>
TL_Sect RECT < 65,154, 193,170>
ES_Read RECT <346,154, 409,170>
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ COMPRESSED GLOBAL DATA ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
ALIGN 4
StartEncryption CHAR "SOE!"
;--------------------------------------------------------------------------
include tip.dat
include tip.txt
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
szAppName CHAR "TIP"
szNullString CHAR 0
szWindowTitle CHAR " TIP -- Zip & Jaz Drive Tester",0
szRedBitmap CHAR "REDBITMAP",0
szGreenBitmap CHAR "GRNBITMAP",0
szOffBitmap CHAR "OFFBITMAP",0
ChildRegionRect RECT <0,0, 460,285>
TabWindowRegionRect RECT <20,45, 440,270>
SplashRect RECT <14,16,138,278>
WebButton RECT <12,295,140,330>
szCopyright_1 CHAR "Copyright (c) 1998 by",0
szCopyright_2 CHAR "Gibson Research Corp.",0
szCrLf CHAR CR,LF
szASPI32DLLName CHAR "wnaspi32.dll",0
szASPI32SupportInfo CHAR "GetASPI32SupportInfo",0
szASPI32Command CHAR "SendASPI32Command",0
szCloseCmd CHAR "Close",0
szRichEditLibrary CHAR "RichEd32.Dll",0
szIomega CHAR "Iomega",0
szZip CHAR "Zip",0
szJaz CHAR "Jaz",0
; szInstructionText CHAR "instructions",0
; szZtrackFailure CHAR "ztrackfailure",0
; szVeryFewSpares CHAR "veryfewspares",0
; szNoSpares CHAR "nospares",0
; szOutOfSpares CHAR "outofspares",0
; szLockedRtf
szShellOpenOp CHAR "open",0
szShellOpenFile CHAR "http://grc.com",0
szWebFailedTitle CHAR "Unable to Launch a Web Browser",0
szWebFailedText CHAR "TIP was unable to successfully launch",CR,LF
CHAR "this system's Internet web Browser.",CR,LF
CHAR CR,LF
CHAR "Please check out the http://grc.com website",CR,LF
CHAR "to find out what's new !",0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
IF MINIMUM_VERSION
szVersionErrorTitle CHAR "Windows Version Trouble",0
szVersionErrorText CHAR "This 32-bit Windows client program requires",CR,LF
CHAR "Windows 95/98 or later, or Windows NT 4.0 or",CR,LF
CHAR "later, These operating environments natively ",CR,LF
CHAR "support the ",34,"ASPI for Win32",34," subsystem which",CR,LF
CHAR "this program requires for operation.",0
ENDIF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
szArialFontName CHAR "Arial",0
szCourierNew CHAR "Courier New",0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
TypeTable CHAR " Disk:"," Tape:","Printer:"," CPU:"," WORM:"
CHAR " CD-ROM:","Scanner:","Optical:","JukeBox:","unknown!"
DividingLine CHAR "--------------------------------------------------",CR,LF
Removable CHAR "Remov"
Fixed CHAR "Fixed"
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ FONT CREATION CONSTANTS ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
CurrentPage DWORD INITIAL_PAGE ; 0 -to- MAX ... the page we're seeing
PreviousPage DWORD -1 ; forces a first draw of every control
ActionsSubPage DWORD FIRST_ACTION_PAGE
;--------------------------------------------------------------------------
OurTypeFaceSpec DWORD -9, 0, 0, 0 ; both fonts are 9 pixels high
OurFontWeight DWORD FW_NORMAL ; either bold or normal weight
BYTE 0
OurUnderline BYTE 0, 0
OurCharSet BYTE DEFAULT_CHARSET
OurFontPrecise BYTE OUT_RASTER_PRECIS, 0, PROOF_QUALITY
PitchAndFamily BYTE 0
OurFontName CHAR "MS Sans Serif", 0
szSide0 CHAR "Side 0",0
szSide1 CHAR "Side 1",0
szSpaceDashSpace CHAR " - ",0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ALIGN 4
EndEncryption CHAR "EOE!"
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
RandomSeed DWORD 100
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Development Only Data ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
IF DEVELOPMENT
POSTING_SPACE equ 5
szLongHexFormat CHAR " %08lX ",0 ; a wsprintf format spec.
szBarChartPercent CHAR " %ld%% ",0
szCenteredDecimal CHAR "%ld",0
szHoursMinsSecs CHAR "%ld:%02ld:%02ld",0
LastPostedValue DWORD -1 ; posting to the screen
LastPostedTop DWORD 0 ; the height of the posting
LastPostedLeft DWORD 0
ENDIF
;--------------------------------------------------------------------------
.data?
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Uninitialized Static Global Data ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
hMainWnd HWND ? ;
MainWndMsg MSG <>
hInst HINSTANCE ? ; and handle to our main instance
hRichEditLibrary HANDLE ?
hAccel HACCEL ?
hCompletionEvent HANDLE ?
hApplicationTimer DWORD ?
hSplashPalette HPALETTE ?
CPUis386 BOOL ?
WinNT BOOL ?
HyperlinkRect RECT <?>
HyperlinkPoint POINT <?>
hHyperlinkCursor HCURSOR ?
hStandardCursor HCURSOR ?
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Pointers to all of the richtext blocks ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
pFontBitmap LPVOID ?
pSplashDIB LPVOID ?
pRTF_Data LPVOID ?, ? ; pointer followed by stream length
StreamPointer LPBYTE ? ; pointer to richedit stream
StreamEnd LPBYTE ? ; pointer to past the end of stream
hASPIDLL HANDLE ?
lpGetASPI32SupportInfo LPVOID ?
lpSendASPI32Command LPVOID ?
ASPI_CmdBlock ScsiRequestBlock <>
ErrorMode BOOL ?
hErrorMessage HWND ?
hRichEdit HWND ?, ? ; handle and pTextLastSet
hTabText HWND ?, ? ; text appearing on the perform test
hActionTabs HWND ?
hTestMonitor HWND ?
hTestButton HWND ?
hExitButton HWND ?
hNullPen HPEN ?
hWhitePen HPEN ?
hGrayPen HPEN ?
hDkGrayPen HPEN ?
hBlackPen HPEN ?
hNullBrush HBRUSH ?
hWhiteBrush HBRUSH ?
hGrayBrush HBRUSH ?
hDkGrayBrush HBRUSH ?
hBlackBrush HBRUSH ?
hNormalFont HFONT ? ; 00 - small / normal
hBoldFont HFONT ? ; 01 - small / bold
hDialogTextFont HFONT ? ; 10 - large / normal
hTitleFont HFONT ? ; 11 - large / bold
hHeadlineFont HFONT ? ; way big font
hFixedWidthFont HFONT ?
hDialogTextUnderlined HFONT ?
hRedBitmap HBITMAP ?
hGreenBitmap HBITMAP ?
hOffBitmap HBITMAP ?
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ FastTransparentBlt Parameters ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PixelsPerLine DWORD ?
PixelsToBlt DWORD ? ; copied from PixelsPerLine per line
LineCount DWORD ?
SourceLineStart DWORD ?
SourceBitStart DWORD ?
DestLineStart DWORD ?
DestBitStart DWORD ?
xform DWORD 16 dup(?)
HorzVelocity DWORD NUMBER_OF_FLOATERS dup (?) ; 16ù16 format
VertVelocity DWORD NUMBER_OF_FLOATERS dup (?) ; " "
HorzPosition DWORD NUMBER_OF_FLOATERS dup (?) ; " "
VertPosition DWORD NUMBER_OF_FLOATERS dup (?) ; " "
ActionButtonFlasher DWORD ?
pUserDataBuffer LPVOID ? ; pointer to user's data
pPatternBuffer LPVOID ? ; pointer to test pattern
DriveCount DWORD ?
DriveArray DWORD MAX_DRIVE_COUNT dup (?)
CurrentAdapter DWORD ? ; the adapter that's been recognized
CurrentDevice DWORD ? ; the device that's been recognized
JazDrive DWORD BOOL ; true if the current drive is JAZ
LastLBAOnCartridge DWORD ?
StartingInstant FILETIME <?>
NumberOfLBAs DWORD ?
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Run Time Variables ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
CartridgeStatus DWORD DISK_NOT_PRESENT
Side_0_SparesCount DWORD ? ; JAZ has only one count
Side_1_SparesCount DWORD ? ; ZIP has counts for both sides
CartridgePassword CHAR 32+1 dup(?)
TransferLength DWORD ?
SectorsPerTest DWORD ?
FirstTestingVariable LABEL DWORD
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
TestingPhase DWORD ? ; 0 = not testing, no data ...
PercentComplete DWORD ?
FirstLBASector DWORD ?
LastLBASector DWORD ?
SecondsElapsed DWORD ?
ReadDataRecovery DWORD ?
WriteDataRecovery DWORD ?
UnrecoverableData DWORD ?
SectorsNotFound DWORD ?
TracksNotFound DWORD ?
ElapsedTimeOfLastEstimate DWORD ?
CurrentTotalTimeEstimate DWORD ?
UserInterrupt DWORD ?
LastError DWORD ?
SingleTransferLBA DWORD ?
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
TESTING_VARIABLE_COUNT equ ($ - FirstTestingVariable)/SIZEOF DWORD
.code
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ WinMain ³
;³ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄij
;³ ³
;³ Startup the Windows program. If no previous instances are running then ³
;³ define and register a new window class, perform various initialization ³
;³ chores, then setup the main message loop. ³
;³ ³
;ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;
Start: call DecryptOurselves
call Detect386Processor
invoke GetVersion ; find out what platform we're running ...
IF MINIMUM_VERSION
.IF (al < MINIMUM_VERSION)
invoke MessageBox, NULL, ADDR szVersionErrorText, ADDR szVersionErrorTitle, MB_OK
invoke ExitProcess, 1
.ENDIF
ENDIF
.IF !(eax & 80000000h)
set WinNT
.ENDIF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke GetModuleHandle, NULL ; get our module's handle
mov hInst, eax
call CheckPriorInstances
jc Close
call RegisterWindowClasses
jc Close
call CreateStaticResources
jc Close
call CreateAppWindows
jc Close
;--------------------------------------------------------------------------
; so far so good. now see if we have aspi services ...
call CheckForASPI ; returns the adapter count
.IF (eax)
; aspi is available, so count the Iomega devices
call EnumerateIomegaDevices
.IF (eax == 1)
; we have only one, so select it for the user
movmov byte ptr CurrentAdapter, al, byte ptr DriveArray[0]
movmov byte ptr CurrentDevice, al, byte ptr DriveArray[1]
.ELSEIF (eax > 1)
; we have more than one, so eject'em all ...
call EjectAllMedia
.ENDIF
.ENDIF
call InitializeWizardControls
call InitializeTheFloaterSystem
; now startup the timer for real-time features
invoke SetTimer, NULL, NULL, 50, ADDR ApplicationTimerProc
mov hApplicationTimer, eax
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Our application's message loop ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke ShowWindow, hMainWnd, SW_NORMAL
invoke UpdateWindow, hMainWnd
.WHILE TRUE
invoke GetMessage, ADDR MainWndMsg, NULL, 0, 0
.BREAK .IF (!eax)
invoke TranslateAccelerator, hMainWnd, hAccel, ADDR MainWndMsg
.CONTINUE .IF (eax) ; skip if we handled
invoke TranslateMessage, ADDR MainWndMsg
invoke DispatchMessage, ADDR MainWndMsg
.ENDW
call UnlockAllMedia
Close: call DeleteStaticResources
invoke ExitProcess, MainWndMsg.wParam
;-//////////////////////////////////////////////////////////////////////////-
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ DECRYPT OURSELVES ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
DecryptOurselves PROC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov esi, OFFSET StartEncryption
.IF (dword ptr [esi] != "!EOS")
mov ecx, OFFSET EndEncryption
sub ecx, esi
shr ecx, 2
mov edi, esi
.REPEAT
lodsd
xor eax, 0AAAAAAAAh
stosd
.UNTILCXZ
.ENDIF
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
DecryptOurselves ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ DETECT 386 PROCESSOR ³
;³ Returns NON-ZERO if we have a 386 processor! ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Detect386Processor PROC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov ebx, esp ; save current stack pointer to align it
and esp, not 3 ; align stack to avoid AC fault
pushfd ; push original EFLAGS
pop eax ; get original EFLAGS into EAX
mov ecx, eax ; also hold them in ECX
xor eax, 40000h ; invert the AC bit in EFLAGS
push eax ; save for movement into EFLAGS
popfd ; copy into EFLAGS
pushfd ; push EFLAGS
pop eax ; get new EFLAGS value
xor eax, ecx ; see if it was settable
.IF !(eax & 40000h) ; if the bit could not be set ... CPU == 386
set CPUis386
.ENDIF
mov esp, ebx
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Detect386Processor ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ CHECK PRIOR INSTANCES ³
;³ Check to see if we're already running and if so, un-minimize it ³
;³ and bring it back to the top of the screen ... and terminate us ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
CheckPriorInstances PROC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke FindWindow, NULL, ADDR szWindowTitle
check eax ; clears CY
.IF (!zero?)
push eax ; save the window's hWnd
invoke ShowWindow, eax, SW_SHOWNORMAL
pop eax ; recover the window's hWnd
invoke SetWindowPos, eax, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE OR SWP_NOSIZE
stc ; return carry to abort OUR instance
.ENDIF
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
CheckPriorInstances ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ REGISTER WINDOW CLASSES ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
RegisterWindowClasses PROC
LOCAL wndclass:WNDCLASS
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
varzero wndclass
movmov wndclass.hInstance, eax, hInst
mov wndclass.hbrBackground, COLOR_BTNFACE + 1
mov wndclass.lpszClassName, OFFSET szAppName
invoke LoadIcon, hInst, OFFSET szAppName
mov wndclass.hIcon, eax
mov wndclass.lpfnWndProc, OFFSET WndProc
invoke RegisterClass, ADDR wndclass
sub eax, 1
jc Exit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Register the TestMonitor Window Style ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
zero eax
mov wndclass.hbrBackground, eax
mov wndclass.lpszClassName, OFFSET szTestMonitor
mov wndclass.lpfnWndProc, OFFSET TestMonitorWndProc
invoke RegisterClass, ADDR wndclass
sub eax, 1
jc Exit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Register the 3D Sink Window Style ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov wndclass.lpszClassName, OFFSET sz3DSink
mov wndclass.lpfnWndProc, OFFSET SinkWndProc
invoke RegisterClass, ADDR wndclass
sub eax, 1
jc Exit
Exit: ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
RegisterWindowClasses ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ CREATE DIB PALETTE ³
;³ Create a 16-color palette. This is used only when the target ³
;³ system is running in 256-color mode. It contains the image's ³
;³ custom color set and is realized whenever our window is painted. ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
CreateDIBPalette PROC USES esi edi
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov esi, OFFSET SplashPalette ; get the palette data
mov edi, esi
mov ecx, PALETTE_SIZE ; the palette entry count
.REPEAT
lodsd ; .RGB
swap ah, al ; .RBG
ror eax, 8 ; G.RB
swap ah, al ; G.BR
rol eax, 8 ; .BRG
swap ah, al ; .BGR
stosd
.UNTILCXZ
invoke CreatePalette, ADDR LogoPalette
mov hSplashPalette, eax
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
CreateDIBPalette ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ CONVERT BRACKETS TO NULLS ³
;³ This scans the block of text converting all closing brackets ']' into ³
;³ NULLs so that a string compare can be used to find section blocks. ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
ConvertBracketsToNulls PROC USES edi, pBuffer:DWORD, nLength:DWORD
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov al, ']' ; we'll be scanning for a closing ']'
mov ecx, nLength ; for this many characters
mov edi, pBuffer ; and at this point in the buffer
.WHILE (ecx)
repne scasb ; scan to a ']'
.BREAK .IF (!zero?) ; if we didn't find one, quit
mov byte ptr [edi-1], 0 ; found one!, so nuke it
.ENDW ; and look for another
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ConvertBracketsToNulls ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ CREATE STATIC RESOURCES ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
CreateStaticResources PROC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke DecompressBinary, ADDR FontBitmapImage
mov pFontBitmap, eax
invoke PrepForFastBlitting, eax
invoke DecompressBinary, ADDR RTF_Data
mov pRTF_Data, eax
mov pRTF_Data[4], ebx
invoke ConvertBracketsToNulls, eax, ebx
invoke GetStockObject, NULL_PEN
mov hNullPen, eax
invoke GetStockObject, BLACK_PEN
mov hBlackPen, eax
invoke GetStockObject, WHITE_PEN
mov hWhitePen, eax
invoke CreatePen, PS_SOLID, 1, LTGRAY_COLOR
mov hGrayPen, eax
invoke CreatePen, PS_SOLID, 1, GRAY_COLOR
mov hDkGrayPen, eax
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Create System Brushes ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke GetStockObject, NULL_BRUSH
mov hNullBrush, eax
invoke GetStockObject, WHITE_BRUSH
mov hWhiteBrush, eax
invoke GetStockObject, LTGRAY_BRUSH
mov hGrayBrush, eax
invoke GetStockObject, DKGRAY_BRUSH
mov hDkGrayBrush, eax
invoke GetStockObject, BLACK_BRUSH
mov hBlackBrush, eax
call CreateAppFonts
invoke LoadLibrary, ADDR szRichEditLibrary
mov hRichEditLibrary, eax
sub eax, 1 ; make sure the library loaded
jc Exit
invoke LoadAccelerators, hInst, ADDR szAppName
mov hAccel, eax
invoke LoadCursor, NULL, IDC_ARROW
mov hStandardCursor, eax
invoke LoadCursor, hInst, ADDR szAppName
mov hHyperlinkCursor, eax
invoke CreateEvent, NULL, FALSE, FALSE, NULL
mov hCompletionEvent, eax
invoke LoadBitmap, hInst, ADDR szRedBitmap
mov hRedBitmap, eax
invoke LoadBitmap, hInst, ADDR szGreenBitmap
mov hGreenBitmap, eax
invoke LoadBitmap, hInst, ADDR szOffBitmap
mov hOffBitmap, eax
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Allocate the Splash Animation DIB ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke AllocateSixteenColorDib, SPLASH_WIDTH, SPLASH_HEIGHT
mov pSplashDIB, eax
add eax, SIZEOF BITMAPINFOHEADER ; point to the palette
invoke MoveMemory, eax, ADDR SplashPalette, 16*4
; now invert the SplashPalette and Create a GDI palette in case
; we're running on a 256-color system ...
invoke CreateDIBPalette
clc
Exit: ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
CreateStaticResources ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ SET FONT POINT SIZE ³
;³ nHeight = -MulDiv (PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72) ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SetPointSize PROC USES edi, PointSize:DWORD
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; invoke GetDC, 0 ; get a display DC
; mov edi, eax
; invoke GetDeviceCaps, eax, LOGPIXELSY ; 96 or 120
; invoke MulDiv, PointSize, eax, 72
; neg eax
; mov OurTypeFaceSpec, eax
; invoke ReleaseDC, 0, edi
invoke MulDiv, PointSize, 96, 72
neg eax
mov OurTypeFaceSpec, eax
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
SetPointSize ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ CREATE APP FONTS ³
;³ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄij
;³ This creates the four fonts we use throughout ChromaZone ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
CreateAppFonts PROC USES edi
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; if we're NOT running with standard "small fonts" then switch
; us over to ARIAL for our main font displays for pixel sizing
invoke GetDC, 0
mov edi, eax
invoke GetDeviceCaps, eax, LOGPIXELSY ; 96 or 120
.IF (eax != 96)
invoke lstrcpy, ADDR OurFontName, ADDR szArialFontName
.ENDIF
invoke ReleaseDC, 0, edi
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov OurFontWeight, FW_NORMAL
invoke SetPointSize, SMALLER_FONT_SIZE
invoke CreateFontIndirect, ADDR OurTypeFaceSpec
mov hNormalFont, eax
invoke SetPointSize, LARGER_FONT_SIZE
invoke CreateFontIndirect, ADDR OurTypeFaceSpec
mov hDialogTextFont, eax
set OurUnderline
invoke CreateFontIndirect, ADDR OurTypeFaceSpec
mov hDialogTextUnderlined, eax
reset OurUnderline
mov OurFontWeight, FW_BOLD
invoke SetPointSize, SMALLER_FONT_SIZE
invoke CreateFontIndirect, ADDR OurTypeFaceSpec
mov hBoldFont, eax
invoke SetPointSize, LARGER_FONT_SIZE
invoke CreateFontIndirect, ADDR OurTypeFaceSpec
mov hTitleFont, eax
; make the larger Headline font
invoke SetPointSize, HEADLINE_FONT_SIZE
invoke lstrcpy, ADDR OurFontName, ADDR szArialFontName
invoke CreateFontIndirect, ADDR OurTypeFaceSpec
mov hHeadlineFont, eax
; now we work to create a fixed-width font ...
invoke SetPointSize, LARGER_FONT_SIZE
mov OurFontWeight, FW_NORMAL
mov PitchAndFamily, FIXED_PITCH
invoke lstrcpy, ADDR OurFontName, ADDR szCourierNew
invoke CreateFontIndirect, ADDR OurTypeFaceSpec
mov hFixedWidthFont, eax
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
CreateAppFonts ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ CREATE APP WINDOWS ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
CreateAppWindows PROC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke GetSystemMetrics, SM_CYCAPTION ; includes Y border
add eax, WIZARD_WINDOW_HEIGHT
invoke CreateWindowEx, WS_EX_APPWINDOW or WS_EX_DLGMODALFRAME,
ADDR szAppName, ADDR szWindowTitle, DS_NOIDLEMSG or WS_POPUP or WS_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX,
0,0, WIZARD_WINDOW_WIDTH, eax, NULL, NULL, hInst, NULL
mov hMainWnd, eax
check eax
jz Exit
;--------------------------------------------------------------------------
call CreateChildControls
jz Exit
;--------------------------------------------------------------------------
call SetCurrentWindow
mov eax, 1
;--------------------------------------------------------------------------
Exit: sub eax, 1 ; set carry if we're returning a zero
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
CreateAppWindows ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ DELETE STATIC RESOURCES ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
DeleteStaticResources PROC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke KillTimer, NULL, hApplicationTimer
invoke DeleteObject, hGrayPen
invoke DeleteObject, hDkGrayPen
invoke DeleteObject, hNormalFont
invoke DeleteObject, hDialogTextFont
invoke DeleteObject, hBoldFont
invoke DeleteObject, hTitleFont
invoke DeleteObject, hFixedWidthFont
invoke DeleteObject, hHeadlineFont
invoke DeleteObject, hDialogTextUnderlined
invoke DeleteObject, hSplashPalette
invoke DeleteObject, hRedBitmap
invoke DeleteObject, hGreenBitmap
invoke DeleteObject, hOffBitmap
invoke GlobalFree, pFontBitmap
invoke GlobalFree, pSplashDIB
invoke GlobalFree, pRTF_Data
invoke CloseHandle, hCompletionEvent ; ASPI completion notification
invoke FreeLibrary, hRichEditLibrary
mov eax, hASPIDLL
.IF (esi)
invoke FreeLibrary, eax
.ENDIF
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
DeleteStaticResources ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ BINARY TO DECIMAL ³
;³ Convert a 32-bit doubleword into its decimal equivalent ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
BinaryToDecimal PROC dest:PTR, val:DWORD, digits:DWORD, reorder:BOOL
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov ebx, dest ; determine where to store
mov ecx, digits ; and how many digits to blank
.REPEAT
mov byte ptr [ebx], SPACE
inc ebx
.UNTILCXZ
mov eax, val ; pick up the conversion value
.IF (reorder) ; abcd
ror eax, 8 ; dabc
swap ah, al ; dacb
ror eax, 16 ; cbda
swap ah, al ; cbad
ror eax, 8 ; dcba
.ENDIF
mov ecx, 10 ; convert to base 10
.REPEAT
dec ebx ; move back to next digit
zero edx ; clear the high end for division
div ecx
add dl, '0'
mov [ebx], dl ; store the character
.UNTIL (!eax)
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
BinaryToDecimal ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ ASCII IZE ³
;³ Converts non-printing characters into SPACES, stops at the first CR. ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
AsciiIze PROC dest:LPSTR
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov ebx, dest
.WHILE (byte ptr [ebx] != CR)
.IF (byte ptr [ebx] < SPACE) || (byte ptr [ebx] > '~')
mov byte ptr [ebx], SPACE
.ENDIF
inc ebx
.ENDW
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
AsciiIze ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ PAINT BITMAP ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PaintBitmap PROC hDC:HDC, xpos:DWORD, ypos:DWORD, image:PTR
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov eax, image ; point to the top of the file
mov ebx, eax ; point ebx to the bits
add ebx, [eax + BITMAPFILEHEADER.bfOffBits]
add eax, SIZEOF BITMAPFILEHEADER
zero ecx
invoke SetDIBitsToDevice, hDC, xpos, ypos, [eax + BITMAPINFOHEADER.biWidth], [eax + BITMAPINFOHEADER.biHeight],
0, 0, 0, [eax + BITMAPINFOHEADER.biHeight], ebx, eax, DIB_RGB_COLORS
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PaintBitmap ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ SET CONTROL TEXT ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SetControlText PROC hDC:WPARAM, hWnd:LPARAM
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke GetWindowLong, hWnd, GWL_ID
shr eax, TREATMENT_STYLE_SHIFT
.IF (eax == SMALL_NORMAL_TEXT)
mov eax, hNormalFont ; 00 - small / normal
.ELSEIF (eax == SMALL_BOLD_TEXT)
mov eax, hBoldFont ; 01 - small / bold
.ELSEIF (eax == LARGE_NORMAL_TEXT)
mov eax, hDialogTextFont ; 10 - large / normal
.ELSEIF (eax == LARGE_BOLD_TEXT)
mov eax, hTitleFont ; 11 - large / bold
.ELSEIF (eax == HEADLINE_TEXT)
mov eax, hHeadlineFont
.ELSEIF (eax == TERMINAL_TEXT)
mov eax, hFixedWidthFont
.ENDIF
invoke SelectObject, hDC, eax
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
SetControlText ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ DRAW HYPERLINK ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
DrawHyperlink PROC color:DWORD
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke GetDC, hMainWnd
mov edi, eax
invoke SetBkMode, edi, TRANSPARENT
invoke SelectObject, edi, hDialogTextUnderlined
invoke SetTextColor, edi, color
invoke TextOut, edi, HyperlinkPoint.x, HyperlinkPoint.y, ADDR szCheck_2, (szCheck_3 - szCheck_2)
invoke ReleaseDC, hMainWnd, edi
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
DrawHyperlink ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ LAUNCH GRC WEBSITE ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
LaunchGRCWebsite:
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke ShellExecute, NULL, ADDR szShellOpenOp,
ADDR szShellOpenFile, NULL, NULL, SW_NORMAL
.IF (eax <= 32)
call SetToStandardCursor
invoke MessageBox, hMainWnd, ADDR szWebFailedText, ADDR szWebFailedTitle, MB_OK
.ENDIF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ret
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ SET TO STANDARD CURSOR ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SetToStandardCursor PROC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke SetCursor, hStandardCursor
.IF (eax == hHyperlinkCursor)
invoke DrawHyperlink, BLUE_COLOR
.ENDIF
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
SetToStandardCursor ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ WndProc ³
;³ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄij
;³ This is the system's main window procedure ³
;ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;
WndProc PROC USES esi edi, hWnd:HWND, iMessage:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL ps:PAINTSTRUCT, Rect:RECT, MousePos:POINT
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov eax, iMessage
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ WM_CREATE : center the windoow ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.IF (eax == WM_CREATE)
invoke CenterWindow, hWnd ; ... then return(0)
invoke GetSystemMenu, hWnd, FALSE ; get sysmenu handle
invoke DeleteMenu, eax, SC_MAXIMIZE, 0 ; remove CLOSE
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ WM_PAINT ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.ELSEIF (eax == WM_PAINT)
invoke BeginPaint, hWnd, ADDR ps ; setup our paintstruct
mov edi, eax ; save our painting handle
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Draw the Lower Horz Button Divider ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke SelectObject, edi, hDkGrayPen
invoke MoveToEx, edi, 15, 289, NULL
invoke LineTo, edi, 446, 289
invoke SelectObject, edi, hWhitePen
invoke LineTo, edi, 446, 290
invoke LineTo, edi, 14, 290
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Draw the Gibson 'G' Logo ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
.IF (CurrentPage == INTRO_PAGE)
invoke SelectObject, edi, hDkGrayPen
invoke MoveToEx, edi, LOGO_1_LEFT+1, LOGO_1_TOP+29, NULL
invoke LineTo, edi, LOGO_1_LEFT+14, LOGO_1_TOP+29
invoke LineTo, edi, LOGO_1_LEFT+14, LOGO_1_TOP+0
invoke SelectObject, edi, hWhitePen
invoke LineTo, edi, LOGO_1_LEFT+12, LOGO_1_TOP+0
invoke LineTo, edi, LOGO_1_LEFT+0, LOGO_1_TOP+12
invoke LineTo, edi, LOGO_1_LEFT+0, LOGO_1_TOP+30
invoke SelectObject, edi, hDkGrayPen
invoke MoveToEx, edi, LOGO_1_LEFT+18, LOGO_1_TOP+14, NULL
invoke LineTo, edi, LOGO_1_LEFT+46, LOGO_1_TOP+14
invoke LineTo, edi, LOGO_1_LEFT+46, LOGO_1_TOP+12
invoke LineTo, edi, LOGO_1_LEFT+34, LOGO_1_TOP+0
invoke SelectObject, edi, hWhitePen
invoke LineTo, edi, LOGO_1_LEFT+17, LOGO_1_TOP+0
invoke LineTo, edi, LOGO_1_LEFT+17, LOGO_1_TOP+15
invoke SelectObject, edi, hDkGrayPen
invoke MoveToEx, edi, LOGO_1_LEFT+33, LOGO_1_TOP+46, NULL
invoke LineTo, edi, LOGO_1_LEFT+46, LOGO_1_TOP+46
invoke LineTo, edi, LOGO_1_LEFT+46, LOGO_1_TOP+29
invoke LineTo, edi, LOGO_1_LEFT+34, LOGO_1_TOP+17
invoke SelectObject, edi, hWhitePen
invoke LineTo, edi, LOGO_1_LEFT+32, LOGO_1_TOP+17
invoke LineTo, edi, LOGO_1_LEFT+32, LOGO_1_TOP+47
invoke SelectObject, edi, hDkGrayPen
invoke MoveToEx, edi, LOGO_1_LEFT+1, LOGO_1_TOP+35, NULL
invoke LineTo, edi, LOGO_1_LEFT+12, LOGO_1_TOP+46
invoke LineTo, edi, LOGO_1_LEFT+29, LOGO_1_TOP+46
invoke LineTo, edi, LOGO_1_LEFT+29, LOGO_1_TOP+32
invoke SelectObject, edi, hWhitePen
invoke LineTo, edi, LOGO_1_LEFT+0, LOGO_1_TOP+32
invoke LineTo, edi, LOGO_1_LEFT+0, LOGO_1_TOP+35
;ÄÄÄÄÄÄÄÄÄÄÄ Paint the Splash Image Bitmap and the Web Hyperlink ÄÄÄÄÄÄÄÄÄÄÄÄ
; show the current logo bitmap
invoke SplashTheBitmap, edi
invoke SetBkMode, edi, TRANSPARENT
invoke SelectObject, edi, hDialogTextFont
invoke lstrlen, ADDR szCheck_1
invoke TextOut, edi, BODY_LEFT, HYPERLINK_HEIGHT, ADDR szCheck_1, eax
invoke GetTextExtentPoint, edi, ADDR szCheck_1, (szCheck_2 - szCheck_1), ADDR Rect
add Rect.top, HYPERLINK_HEIGHT
invoke lstrlen, ADDR szCheck_4
invoke TextOut, edi, BODY_LEFT, Rect.top, ADDR szCheck_4, eax
invoke SelectObject, edi, hDialogTextUnderlined
add Rect.left, BODY_LEFT
movmov HyperlinkRect.left, eax, Rect.left
mov HyperlinkRect.top, HYPERLINK_HEIGHT
; draw the hyperlink text over the existing text
invoke SetTextColor, edi, BLUE_COLOR
invoke TextOut, edi, Rect.left, HYPERLINK_HEIGHT, ADDR szCheck_2, (szCheck_3 - szCheck_2)
; save the location for dynamic recoloring
movmov HyperlinkPoint.x, eax, Rect.left
mov HyperlinkPoint.y, HYPERLINK_HEIGHT
; save the enclosing rectangle for hot-spot sensing
invoke GetTextExtentPoint, edi, ADDR szCheck_2, (szCheck_3 - szCheck_2), ADDR HyperlinkRect.right
mov eax, HyperlinkRect.left
add HyperlinkRect.right, eax
mov eax, HyperlinkRect.top
add HyperlinkRect.bottom, eax
.ENDIF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Paint the Copyright Notice ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
.IF (CurrentPage < CREDITS_PAGE)
invoke SetTextColor, edi, GRAY_COLOR
invoke SetBkMode, edi, TRANSPARENT
invoke SelectObject, edi, hNormalFont
invoke lstrlen, ADDR szCopyright_1
invoke TextOut, edi, 15, 298, ADDR szCopyright_1, eax
invoke lstrlen, ADDR szCopyright_2
invoke TextOut, edi, 15, 311, ADDR szCopyright_2, eax
.ENDIF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Draw the Gibson 'G' Logo ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
.IF (CurrentPage == CREDITS_PAGE)
invoke SelectObject, edi, hDkGrayPen
invoke MoveToEx, edi, LOGO_2_LEFT+1, LOGO_2_TOP+29, NULL
invoke LineTo, edi, LOGO_2_LEFT+14, LOGO_2_TOP+29
invoke LineTo, edi, LOGO_2_LEFT+14, LOGO_2_TOP+0
invoke SelectObject, edi, hWhitePen
invoke LineTo, edi, LOGO_2_LEFT+12, LOGO_2_TOP+0
invoke LineTo, edi, LOGO_2_LEFT+0, LOGO_2_TOP+12
invoke LineTo, edi, LOGO_2_LEFT+0, LOGO_2_TOP+30
invoke SelectObject, edi, hDkGrayPen
invoke MoveToEx, edi, LOGO_2_LEFT+18, LOGO_2_TOP+14, NULL
invoke LineTo, edi, LOGO_2_LEFT+46, LOGO_2_TOP+14
invoke LineTo, edi, LOGO_2_LEFT+46, LOGO_2_TOP+12
invoke LineTo, edi, LOGO_2_LEFT+34, LOGO_2_TOP+0
invoke SelectObject, edi, hWhitePen
invoke LineTo, edi, LOGO_2_LEFT+17, LOGO_2_TOP+0
invoke LineTo, edi, LOGO_2_LEFT+17, LOGO_2_TOP+15
invoke SelectObject, edi, hDkGrayPen
invoke MoveToEx, edi, LOGO_2_LEFT+33, LOGO_2_TOP+46, NULL
invoke LineTo, edi, LOGO_2_LEFT+46, LOGO_2_TOP+46
invoke LineTo, edi, LOGO_2_LEFT+46, LOGO_2_TOP+29
invoke LineTo, edi, LOGO_2_LEFT+34, LOGO_2_TOP+17
invoke SelectObject, edi, hWhitePen
invoke LineTo, edi, LOGO_2_LEFT+32, LOGO_2_TOP+17
invoke LineTo, edi, LOGO_2_LEFT+32, LOGO_2_TOP+47
invoke SelectObject, edi, hDkGrayPen
invoke MoveToEx, edi, LOGO_2_LEFT+1, LOGO_2_TOP+35, NULL
invoke LineTo, edi, LOGO_2_LEFT+12, LOGO_2_TOP+46
invoke LineTo, edi, LOGO_2_LEFT+29, LOGO_2_TOP+46
invoke LineTo, edi, LOGO_2_LEFT+29, LOGO_2_TOP+32
invoke SelectObject, edi, hWhitePen
invoke LineTo, edi, LOGO_2_LEFT+0, LOGO_2_TOP+32
invoke LineTo, edi, LOGO_2_LEFT+0, LOGO_2_TOP+35
.ENDIF
;--------------------------------------------------------------------------
invoke EndPaint, hWnd, ADDR ps ; returns zero if we process
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ WM_MOUSEMOVE : change the mouse cursor when we're over the hyperlink ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.ELSEIF (eax == WM_MOUSEMOVE) && (CurrentPage == INTRO_PAGE)
movsx eax, word ptr lParam
mov MousePos.x, eax
movsx eax, word ptr lParam[2]
mov MousePos.y, eax
invoke PtInRect, ADDR HyperlinkRect, MousePos
.IF (eax)
invoke SetCursor, hHyperlinkCursor
.IF (eax != hHyperlinkCursor)
invoke DrawHyperlink, RED_COLOR
.ENDIF
.ELSE
call SetToStandardCursor
.ENDIF
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ WM_LBUTTONDOWN : Launch the web browser ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.ELSEIF (eax == WM_LBUTTONDOWN) || (eax == WM_LBUTTONDBLCLK)
invoke GetCursor
.IF (eax == hHyperlinkCursor)
call LaunchGRCWebsite
.ENDIF
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ WM_CTLCOLORBTN ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.ELSEIF (eax == WM_CTLCOLORBTN)
invoke SetControlText, wParam, lParam
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ WM_CTLCOLOREDIT ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.ELSEIF (eax == WM_CTLCOLOREDIT)
invoke SetControlText, wParam, lParam
invoke GetWindowLong, lParam, GWL_ID
.IF (ax == IDE_INSTR) || (ax == TAB_TEXT)
invoke SetBkMode, wParam, TRANSPARENT
mov eax, hNullBrush
jmp Return
.ENDIF
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ WM_CTLCOLORSTATIC : Static text ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.ELSEIF (eax == WM_CTLCOLORSTATIC)
invoke SetControlText, wParam, lParam
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ WM_DESTROY : we've been asked to leave, so drop out of the message loop ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.ELSEIF (eax == WM_DESTROY)
invoke PostQuitMessage, 0 ; ... then return(0)
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ WM_NOTIFY : the current tab has changed ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.ELSEIF (eax == WM_NOTIFY)
ASSUME ebx:PTR NMHDR
mov ebx, lParam ; get the pointer to the NMHDR structure
.IF ([ebx].code == TCN_SELCHANGE)
; save our PreviousPage since we're about to change it
movmov PreviousPage, eax, CurrentPage
; it's a selection change event, so get the NEW tab
invoke SendMessage, [ebx].hwndFrom, TCM_GETCURSEL, 0, 0
add eax, FIRST_ACTION_PAGE
mov CurrentPage, eax
mov ActionsSubPage, eax
call SetCurrentWindow
.ENDIF
ASSUME ebx:NOTHING
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ WM_COMMAND : a button was pressed ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.ELSEIF (eax == WM_COMMAND)
movmov PreviousPage, eax, CurrentPage
movzx eax, word ptr wParam ; get the button control ID
.IF (eax == IDB_BACK) && (CurrentPage > 0)
dec CurrentPage
; handle dropping into the proper of the ACTION pages
.IF (CurrentPage == LAST_ACTION_PAGE)
movmov CurrentPage, eax, ActionsSubPage
.ELSEIF (CurrentPage < LAST_ACTION_PAGE) && (CurrentPage >= FIRST_ACTION_PAGE)
mov CurrentPage, FIRST_ACTION_PAGE-1
.ENDIF
; handle skipping over the trouble page if everything is fine
.IF ((!ErrorMode) && (CurrentPage == TROUBLE_PAGE))
dec CurrentPage
.ENDIF
call SetCurrentWindow
.ELSEIF (eax == IDB_NEXT) && (CurrentPage < LAST_PAGE)
inc CurrentPage
; handle skipping over the trouble page if everything is fine
.IF ((!ErrorMode) && (CurrentPage == TROUBLE_PAGE))
inc CurrentPage
.ENDIF
; handle dropping into the proper of the ACTION pages
.IF (CurrentPage == FIRST_ACTION_PAGE)
movmov CurrentPage, eax, ActionsSubPage
.ELSEIF (CurrentPage > FIRST_ACTION_PAGE) && (CurrentPage <= LAST_ACTION_PAGE)
mov CurrentPage, LAST_ACTION_PAGE+1
.ENDIF
call SetCurrentWindow
.ELSEIF (eax == IDB_WEB)
call LaunchGRCWebsite
.ELSEIF (eax == IDB_QUIT) && (TestingPhase < TESTING_STARTUP)
invoke PostQuitMessage, 0 ; ... then return(0)
.ELSEIF (eax == IDB_TEST)
.IF (CartridgeStatus == DISK_SPUN_DOWN)
invoke SpinUpIomegaCartridge, CurrentAdapter, CurrentDevice
.ELSEIF (CartridgeStatus == DISK_AT_SPEED)
.IF (TestingPhase != READY_TO_TEST)
call PrepareToBeginTesting
.ENDIF
call TestTheDisk
.ELSEIF (CartridgeStatus == DISK_TEST_UNDERWAY)
set UserInterrupt
.ELSEIF (CartridgeStatus == DISK_Z_TRACK_FAILURE) \
|| (CartridgeStatus == DISK_TEST_FAILURE) \
|| (CartridgeStatus == DISK_PROTECTED)
invoke EjectIomegaCartridge, CurrentAdapter, CurrentDevice
.ELSEIF (CartridgeStatus == DISK_LOW_SPARES)
mov CartridgeStatus, DISK_AT_SPEED
invoke SetRichEditText, ADDR hTabText, ADDR szNullString
invoke SetTabErrorMode, NULL
invoke SetWindowText, hTestButton, ADDR szPressToStart
.ENDIF
.ELSEIF (CurrentPage == INSTRUCTION_PAGE)
mov ebx, hRichEdit
call ScrollRichEdit
.ELSEIF (CurrentPage == PERFORM_TEST_PAGE) || (CurrentPage == EXPLAIN_RESULTS)
mov ebx, hTabText
call ScrollRichEdit
.ELSE
jmp DefaultProc
.ENDIF
jmp ReturnZero
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ WM_SYSCOMMAND : a system command was received ... ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.ELSEIF (eax == WM_SYSCOMMAND)
mov eax, wParam ; get the specific command
; abort any close attempt while we're running ...
.IF ((eax == SC_CLOSE) || (eax == SC_DEFAULT)) && (TestingPhase >= TESTING_STARTUP)
jmp ReturnZero
.ENDIF
jmp DefaultProc
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
.ELSE
DefaultProc: invoke DefWindowProc, hWnd, iMessage, wParam, lParam
jmp Return ; and return the DefWindowProc's return status ...
.ENDIF
ReturnZero: zero eax ; return that we haven't handled.
jmp Return
ReturnTrue: zero eax ; show that WE'VE handled this message
not eax
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Return: ret
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Local Subroutines ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
ScrollRichEdit: .IF (eax == IDB_LINEUP)
invoke SendMessage, ebx, EM_SCROLL, SB_LINEUP, 0
.ELSEIF (eax == IDB_LINEDN)
invoke SendMessage, ebx, EM_SCROLL, SB_LINEDOWN, 0
.ELSEIF (eax == IDB_PAGEUP)
invoke SendMessage, ebx, EM_SCROLL, SB_PAGEUP, 0
.ELSEIF (eax == IDB_PAGEDN)
invoke SendMessage, ebx, EM_SCROLL, SB_PAGEDOWN, 0
.ELSEIF (eax == IDB_END)
invoke SendMessage, ebx, WM_VSCROLL, SB_BOTTOM, NULL
.ELSEIF (eax == IDB_HOME)
invoke SendMessage, ebx, WM_VSCROLL, SB_TOP, NULL
.ENDIF
LocalReturn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
WndProc ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ PASSWORD WND PROC ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PasswordWndProc PROC USES esi, hWnd:HWND, iMessage:UINT, wParam:WPARAM, lParam:LPARAM
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov eax, iMessage
;----------------------------------------------------------------------------
; WM_INITDIALOG : set the focus to the edit field
;----------------------------------------------------------------------------
.IF (eax == WM_INITDIALOG)
invoke GetDlgItem, hWnd, IDC_PASSWORD
invoke SetFocus, eax
jmp ReturnZero
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ WM_COMMAND : a button was pressed ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.ELSEIF (eax == WM_COMMAND)
movzx eax, word ptr wParam ; get the button control ID
.IF (eax == IDOK)
mov esi, 1
jmp CloseDlg
.ELSEIF (eax == IDCANCEL)
zero esi
CloseDlg: invoke GetDlgItemText, hWnd, IDC_PASSWORD, ADDR CartridgePassword, 32
invoke EndDialog, hWnd, esi
.ENDIF
.ELSE
ReturnZero: zero eax ; return that we haven't handled.
jmp Return
.ENDIF
ReturnNonZero: zero eax
dec eax
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Return: ret
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PasswordWndProc ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ CenterWindow ³
;³ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄij
;³ This centers the HWND window on the screen ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
CenterWindow PROC USES ebx, hWnd:HWND ; handle of the window to center
LOCAL WndPos:RECT ; local temp structure defining wnd
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke GetWindowRect, hWnd, ADDR WndPos ; get window dimens
invoke GetSystemMetrics, SM_CXSCREEN ; return screen width
sub eax, WndPos.right ; now compute the
add eax, WndPos.left ; horizontal margin
halve eax ; cut it in half
push eax ; save new left
invoke GetSystemMetrics, SM_CYSCREEN ; return screen height
pop edx ; recover the new left
sub eax, WndPos.bottom ; now compute the
add eax, WndPos.top ; vertical margin
halve eax ; cut it in half
mov ecx, eax ; save new right
mov ebx, WndPos.right ; since we're FORCED to provide
sub ebx, WndPos.left ; a new width, let's recompute
inc ebx ; it from the existing width
mov eax, WndPos.bottom ; and we'll do the same for
sub eax, WndPos.top ; the old and new heights
inc eax
invoke MoveWindow, hWnd, edx, ecx, ebx, eax, TRUE ; and move it!
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
CenterWindow ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ CREATE CHILD CONTROLS ³
;³ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄij
;³ This creates all static windows for our program ³
;³ Now create the block of standard windows from our array ... ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
CreateChildControls PROC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov esi, OFFSET WindowCreationTable
mov edi, WINDOW_CREATION_ENTRIES
.REPEAT
push dword ptr NULL ; no window creation data
push hInst ; our local hInstance
push dword ptr [esi+32] ; Ctrl ID
mov ebx, [esi+28] ; get the parent's offset
.IF (ebx) ; if parent's offset non-null
mov ebx, [ebx] ; then load its value
.ENDIF
push ebx ; hWndParent
push dword ptr [esi+24] ; nHeight
push dword ptr [esi+20] ; nWidth
push dword ptr [esi+16] ; y
push dword ptr [esi+12] ; x
push dword ptr [esi+ 8] ; the Style
push dword ptr [esi+ 4] ; stack the window's name
push dword ptr [esi ] ; stack the ClassName
push dword ptr 0 ; NULL extended style
call CreateWindowEx
check eax ; if create failed
jz AbortedCreation ; then take us out!
;------------------------------------------------------------
mov ebx, [esi+36] ; get the destination offset
.IF (ebx) ; if we have a place to store
mov [ebx], eax ; the resulting hWnd, do so
.ENDIF
add esi, SIZE_OF_CREATE_ENTRY ; bump up to the next entry
dec edi
.UNTIL (zero?)
dec edi ; dec DI again to clear the ZERO flag ...
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
AbortedCreation: ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
CreateChildControls ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ SET CHILD VISIBILITY ³
;³ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄij
;³ Sets the CurrentPage based window visibility state for the window whose ³
;³ handle we're being handed. This is an enumeration of all hMainWnd. ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SetChildVisibility PROC hWnd:HWND, lParam:LPARAM
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke GetWindowLong, hWnd, GWL_ID ; pickup the child's ID
and eax, PAGE_MASK
shr eax, PAGE_SHIFT ; convert ID to control's page number
.IF (eax == ACTION_PAGES) ; if it's on all three pages
.IF (CurrentPage >= FIRST_ACTION_PAGE) && (CurrentPage <= LAST_ACTION_PAGE)
jmp ShowTheControl
.ENDIF
jmp HideTheControl
.ELSEIF (eax != EVERY_PAGE); munge only if it's NOT on every page
.IF (eax == CurrentPage)
ShowTheControl: invoke GetWindowLong, hWnd, GWL_STYLE
or eax, WS_VISIBLE
.ELSE
HideTheControl: invoke GetWindowLong, hWnd, GWL_STYLE
and eax, NOT WS_VISIBLE
.ENDIF
invoke SetWindowLong, hWnd, GWL_STYLE, eax
.ENDIF
mov eax, TRUE ; return non-zero to continue enumerating ...
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
SetChildVisibility ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ SET NAV BUTTON ENABLE ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SetNavButtonEnable PROC USES edi, id:DWORD, enabled:DWORD
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke GetDlgItem, hMainWnd, id ; get the handle
mov edi, eax ; save hWnd in EDI
mov ebx, enabled ; get the presence bitarray
mov cl, byte ptr PreviousPage ; get the PREVIOUS Page
shr ebx, cl ; "1" bit has PREVIOUS status
mov eax, enabled ; get the presence bitarray
mov cl, byte ptr CurrentPage ; get the CURRENT Page
shr eax, cl ; "1" bit has CURRNET status
xor ebx, eax ; one bit has "delta"
.IF (ebx & 1)
shr eax, 1 ; place new status into CARRY
.IF (carry?)
invoke GetWindowLong, edi, GWL_STYLE
and eax, NOT WS_DISABLED
.ELSE
invoke GetWindowLong, edi, GWL_STYLE
or eax, WS_DISABLED
.ENDIF
invoke SetWindowLong, edi, GWL_STYLE, eax
invoke InvalidateRect, edi, NULL, TRUE
.ENDIF
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
SetNavButtonEnable ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ This sets the visibility of windows for a given page ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SetCurrentWindow PROC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke ValidateRect, hMainWnd, NULL
invoke LockWindowUpdate, hMainWnd
invoke EnumChildWindows, hMainWnd, ADDR SetChildVisibility, NULL
invoke LockWindowUpdate, NULL
.IF (PreviousPage >= FIRST_ACTION_PAGE) && (PreviousPage <= LAST_ACTION_PAGE)\
&& (CurrentPage >= FIRST_ACTION_PAGE) && (CurrentPage <= LAST_ACTION_PAGE)
invoke InvalidateRect, hMainWnd, ADDR TabWindowRegionRect, TRUE
.ELSE
invoke InvalidateRect, hMainWnd, ADDR ChildRegionRect, TRUE
.ENDIF
.IF (PreviousPage >= FIRST_ACTION_PAGE) || (CurrentPage >= FIRST_ACTION_PAGE)
invoke InvalidateRect, hMainWnd, ADDR WebButton, TRUE
.ENDIF
invoke SetNavButtonEnable, IDB_BACK, BackButtonEnabled
invoke SetNavButtonEnable, IDB_NEXT, NextButtonEnabled
invoke UpdateWindow, hMainWnd
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
SetCurrentWindow ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ 3D SINK WndProc ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SinkWndProc PROC USES esi edi, hWnd:HWND, msg:DWORD, wParam:WPARAM, lParam:LPARAM
LOCAL ps:PAINTSTRUCT, Rect:RECT
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov eax, msg
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ WM_PAINT : Simply pass this onto the Dialog's Frame painter ... ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.IF (eax == WM_PAINT)
invoke BeginPaint, hWnd, ADDR ps ; setup our paintstruct
mov edi, eax
invoke GetClientRect, hWnd, ADDR Rect
invoke GetWindowLong, hWnd, GWL_ID
shr eax, TREATMENT_STYLE_SHIFT
.IF (ax == THREE_DEE_BOX)
invoke DrawEdge, edi, ADDR Rect, EDGE_SUNKEN, BF_RECT
.ELSEIF (ax != NO_SINK_OUTLINE)
dec Rect.right
dec Rect.bottom
invoke MoveToEx, edi, 0, Rect.bottom, NULL
invoke SelectObject, edi, hDkGrayPen
invoke LineTo, edi, 0, 0
invoke LineTo, edi, Rect.right, 0
invoke SelectObject, edi, hWhitePen
invoke LineTo, edi, Rect.right, Rect.bottom
invoke LineTo, edi, -1, Rect.bottom
.ENDIF
invoke EndPaint, hWnd, ADDR ps ; returns zero if we process
.ELSE
invoke DefWindowProc, hWnd, msg, wParam,lParam
.ENDIF
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
SinkWndProc ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ SUNKEN FIELDS ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SunkenFields PROC USES esi edi, hDC:HDC, pFirstRect:LPRECT, count:DWORD, yspacing:DWORD
LOCAL DrawRect:RECT
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke CopyRect, ADDR DrawRect, pFirstRect ; make a local copy
mov edi, hDC
mov esi, count
.REPEAT
invoke DrawEdge, edi, ADDR DrawRect, BDR_SUNKENOUTER, BF_RECT
mov eax, yspacing
add DrawRect.top, eax
add DrawRect.bottom, eax
dec esi
.UNTIL (zero?)
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
SunkenFields ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ PAINT TEXT ARRAY ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PaintTextArray PROC USES esi edi, hdc:HDC, pArray:LPVOID, color:DWORD
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov edi, hdc
invoke SetTextColor, edi, color
mov esi, pArray
.REPEAT
add esi, SIZEOF DWORD ; skip past the coords
invoke lstrlen, esi
movzx ebx, word ptr [esi-4]
movzx ecx, word ptr [esi-2]
invoke TextOut, edi, ebx, ecx, esi, eax
invoke lstrlen, esi
inc eax ; account for the last zero
add esi, eax ; point to the next set of coords
.UNTIL !(word ptr [esi])
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PaintTextArray ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ PAINT TEST PHASE ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PaintTestPhase PROC USES esi edi, hdc:HDC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov edi, hdc
invoke CreateCompatibleDC, NULL ; and a DC for our bitmap source
mov esi, eax
invoke SelectObject, esi, hOffBitmap
push eax
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
.IF (TestingPhase == READING_DATA)
invoke SelectObject, esi, hGreenBitmap
push eax
.ENDIF
invoke BitBlt, edi, 252, 5, 11, 11, esi, 0, 0, SRCCOPY
.IF (TestingPhase == READING_DATA)
pop eax
invoke SelectObject, esi, eax
.ENDIF
;--------------------------------------------------------------------------
.IF (TestingPhase == WRITING_PATT)
invoke SelectObject, esi, hRedBitmap
push eax
.ENDIF
invoke BitBlt, edi, 337, 5, 11, 11, esi, 0, 0, SRCCOPY
.IF (TestingPhase == WRITING_PATT)
pop eax
invoke SelectObject, esi, eax
.ENDIF
;--------------------------------------------------------------------------
.IF (TestingPhase == READING_PATT)
invoke SelectObject, esi, hGreenBitmap
push eax
.ENDIF
invoke BitBlt, edi, 337,21, 11, 11, esi, 0, 0, SRCCOPY
.IF (TestingPhase == READING_PATT)
pop eax
invoke SelectObject, esi, eax
.ENDIF
;--------------------------------------------------------------------------
.IF (TestingPhase == WRITING_DATA)
invoke SelectObject, esi, hRedBitmap
push eax
.ENDIF
invoke BitBlt, edi, 252,21, 11, 11, esi, 0, 0, SRCCOPY
.IF (TestingPhase == WRITING_DATA)
pop eax
invoke SelectObject, esi, eax
.ENDIF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
pop eax
invoke SelectObject, esi, eax
invoke DeleteDC, esi
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PaintTestPhase ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ PAINT CART STATUS ³
;³ Paints the textual cartridge status window ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PaintCartStatus PROC USES esi edi, hDC:HDC
LOCAL TextSize:_SIZE
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov edi, hDC
; set DC's default text modes
invoke SetTextColor, edi, BLACK_COLOR
invoke SelectObject, edi, hDialogTextFont
invoke SetBkMode, edi, TRANSPARENT
; blank out any previous status display
invoke SelectObject, edi, hNullPen
invoke SelectObject, edi, hGrayBrush
invoke Rectangle, edi, 115, 9, 241, 27
; display the new cartridge status
mov eax, CartridgeStatus
dec eax
.IF (sign?) || (eax > (LAST_CART_STATUS-1))
zero eax
.ENDIF
; pickup the pointer to the string
mov esi, CartStatStrings[eax*4]
invoke lstrlen, esi
lea ebx, TextSize
invoke GetTextExtentPoint32, edi, esi, eax, ebx
mov ebx, (241+115)/2 ; get the center X
halve TextSize._cx
sub ebx, TextSize._cx
invoke lstrlen, esi
invoke TextOut, edi, ebx, 9, esi, eax
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PaintCartStatus ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ PAINT BAR GRAPH ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PaintBarGraph PROC USES esi edi, hDC:HDC, Xleft:DWORD, Ytop:DWORD, Xwidth:DWORD, Yheight:DWORD, BarColor:DWORD, BarValue:DWORD, pRightText:DWORD, Active:BOOL
LOCAL AbsoluteBarWidth:DWORD, Extent:_SIZE, PercentString[8]:CHAR
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; create a temporary drawing bitmap for double-buffererd rendering
invoke GetDC, hTestMonitor
mov esi, eax ; hold the creation DC in esi
invoke CreateCompatibleBitmap, esi, Xwidth, Yheight
swap esi, eax ; eax gets DC, esi gets bitmap
invoke ReleaseDC, hTestMonitor, eax
; create a context for drawing onto the double buffer bitmap
invoke CreateCompatibleDC, NULL
swap esi, eax ; eax gets bitmap, esi gets new DC
invoke SelectObject, esi, eax
push eax ; save the old bitmap to remove bitmap
invoke SetBkMode, esi, TRANSPARENT
; fill the entire rectangle with background gray
invoke SelectObject, esi, hNullPen
invoke SelectObject, esi, hGrayBrush
mov eax, Xwidth
inc eax
mov ebx, Yheight
inc ebx
invoke Rectangle, esi, 0, 0, eax, ebx
.IF (Active) ; now fleshout the bitmap ONLY IF we're active
; if RightText string is non-null, paint it in darker gray
mov edi, pRightText
.IF (edi)
invoke SelectObject, esi, hDialogTextFont
invoke SetTextColor, esi, GRAY_COLOR
invoke lstrlen, edi
lea ebx, Extent
invoke GetTextExtentPoint32, esi, edi, eax, ebx
invoke lstrlen, edi
mov ebx, Xwidth ; get the total width
sub ebx, Extent._cx
halve ebx
mov ecx, Yheight
sub ecx, Extent._cy
halve ecx
invoke TextOut, esi, ebx, ecx, edi, eax
.ENDIF
; now paint the active portion
invoke CreateSolidBrush, BarColor
invoke SelectObject, esi, eax
push eax ; save prior brush
mov eax, Xwidth
inc eax
mul BarValue ; edx will have the new width
add eax, 80000000h ; now round it up!
adc edx, 0
mov AbsoluteBarWidth, edx
mov eax, Yheight
inc eax
invoke Rectangle, esi, 0, 0, edx, eax
pop eax ; recover prior brush
invoke SelectObject, esi, eax ; recover newly created brush
invoke DeleteObject, eax ; delete the brush
; now place the floating percentage into the middle (if it fits there)
invoke SelectObject, esi, hTitleFont
invoke SetTextColor, esi, WHITE_COLOR
mov eax, 100 ; calculate the percentage
mul BarValue ; edx will have the new width
add eax, 80000000h ; now round it up!
adc edx, 0
invoke wsprintf, ADDR PercentString, ADDR szBarChartPercent, edx
mov edi, eax
lea ebx, Extent
invoke GetTextExtentPoint32, esi, ADDR PercentString, eax, ebx
mov ebx, AbsoluteBarWidth ; get the active bar's width
sub ebx, Extent._cx
sar ebx, 1 ; scale back but keep sign
.IF (sign?)
invoke SelectObject, esi, hDialogTextFont
mov ebx, AbsoluteBarWidth
.ENDIF
mov ecx, Yheight
sub ecx, Extent._cy
halve ecx
invoke TextOut, esi, ebx, ecx, ADDR PercentString, edi
.ENDIF
; now blit the final result out to the screen
invoke BitBlt, hDC, Xleft, Ytop, Xwidth, Yheight, esi, 0, 0, SRCCOPY
; and clean up after all the work
pop eax ; recover prior bitmap
invoke SelectObject, esi, eax ; recover newly created bitmap
invoke DeleteObject, eax ; delete the bitmap
invoke DeleteDC, esi ; delete created container DC
Exit: ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PaintBarGraph ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ PAINT THE BAR GRAPHS ³
;³ This paints the two or three bar graphs on the test monitor window. ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PaintTheBarGraphs PROC hDC:HDC, Active:BOOL
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke PaintBarGraph, hDC, 13, 57, 395, 14, BLUE_COLOR, PercentComplete, NULL, Active
.IF (JazDrive)
mov ebx, Side_0_SparesCount
mov ecx, MAXIMUM_JAZ_SPARES
.IF (ebx > ecx) ; if Spares > MAXIMUM
mov ebx, ecx ; clip Spares down to MAX
.ENDIF
call CvrtIntoPrcnt
mov ebx, eax
invoke PaintBarGraph, hDC, 13, 95, 395, 30, RED_COLOR, ebx, NULL, Active
.ELSE
mov ebx, Side_0_SparesCount
mov ecx, MAXIMUM_ZIP_SPARES
call CvrtIntoPrcnt
invoke PaintBarGraph, hDC, 13, 95, 395, 14, RED_COLOR, eax, ADDR szSide0, Active
mov ebx, Side_1_SparesCount
mov ecx, MAXIMUM_ZIP_SPARES
call CvrtIntoPrcnt
invoke PaintBarGraph, hDC, 13, 111, 395, 14, RED_COLOR, eax, ADDR szSide1, Active
.ENDIF
;--------------------------------------------------------------------------
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
CvrtIntoPrcnt: zero edx
zero eax
dec eax ; set edx:eax to [0:FFFFFFFF]
div ecx ; divide by the maximum possible
neg ebx
add ebx, ecx
mul ebx
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
LocalReturn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PaintTheBarGraphs ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ PAINT CENTERED STRING ³
;³ Paints a Double-Buffered string into a rectangular region ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PaintCenteredString PROC USES esi edi, hDC:HDC, Xleft:DWORD, Ytop:DWORD, Xwidth:DWORD, Yheight:DWORD, pText:DWORD, Active:BOOL
LOCAL Extent:_SIZE
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; create a temporary drawing bitmap for double-buffererd rendering
invoke GetDC, hTestMonitor
mov esi, eax ; hold the creation DC in esi
invoke CreateCompatibleBitmap, esi, Xwidth, Yheight
swap esi, eax ; eax gets DC, esi gets bitmap
invoke ReleaseDC, hTestMonitor, eax
; create a context for drawing onto the double buffer bitmap
invoke CreateCompatibleDC, NULL
swap esi, eax ; eax gets bitmap, esi gets new DC
invoke SelectObject, esi, eax
push eax ; save the old bitmap to remove bitmap
invoke SetBkMode, esi, TRANSPARENT
; fill the entire rectangle with background gray
invoke SelectObject, esi, hNullPen
invoke SelectObject, esi, hGrayBrush
mov eax, Xwidth
inc eax
mov ebx, Yheight
inc ebx
invoke Rectangle, esi, 0, 0, eax, ebx
.IF (Active) ; now fleshout the bitmap ONLY IF we're active
; now place the floating string into the middle
invoke SelectObject, esi, hDialogTextFont
invoke lstrlen, pText
mov edi, eax
lea ebx, Extent
invoke GetTextExtentPoint32, esi, pText, eax, ebx
mov ebx, Xwidth ; get the region's width
sub ebx, Extent._cx
halve ebx
mov ecx, Yheight
sub ecx, Extent._cy
halve ecx
invoke TextOut, esi, ebx, ecx, pText, edi
.ENDIF
; now blit the final result out to the screen
invoke BitBlt, hDC, Xleft, Ytop, Xwidth, Yheight, esi, 0, 0, SRCCOPY
; and clean up after all the work
pop eax ; recover prior bitmap
invoke SelectObject, esi, eax ; recover newly created bitmap
invoke DeleteObject, eax ; delete the bitmap
invoke DeleteDC, esi ; delete created container DC
Exit: ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PaintCenteredString ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ PAINT CENTERED VALUE ³
;³ Paints a Double-Buffered decimal value into a rectangular region ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PaintCenteredValue PROC USES esi edi, hDC:HDC, Xleft:DWORD, Ytop:DWORD, Xwidth:DWORD, Yheight:DWORD, value:DWORD, Active:BOOL
LOCAL szString[40]:CHAR
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; convert our value into a string
invoke wsprintf, ADDR szString, ADDR szCenteredDecimal, value
; and paint it's value
invoke PaintCenteredString, hDC, Xleft, Ytop, Xwidth, Yheight, ADDR szString, Active
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PaintCenteredValue ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ PAINT TEST STATISTICS ³
;³ This paints the two columns of testing statistics ³
;³ on the test monitor window. ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PaintTestStatistics PROC USES esi edi, hDC:HDC, Active:BOOL
LOCAL szString[40]:CHAR
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov edi, hDC
; assemble and paint the sector testing range
mov eax, SingleTransferLBA ; are we testing a single sector?
.IF (eax)
invoke wsprintf, ADDR szString, ADDR szCenteredDecimal, eax
.ELSE
invoke wsprintf, ADDR szString, ADDR szCenteredDecimal, FirstLBASector
invoke lstrcat, ADDR szString, ADDR szSpaceDashSpace
invoke lstrlen, ADDR szString
lea esi, szString
add esi, eax
invoke wsprintf, esi, ADDR szCenteredDecimal, LastLBASector
.ENDIF
invoke PaintCenteredString, edi, 66, 155, 126, 14, ADDR szString, Active
; show the LastError
push edi ; save our display context
mov edi, OFFSET ErrorTypeTest ; point to the top of the list
TryIt: mov eax, [edi] ; get a candidate error #
add edi, 4
.IF (eax) ; if we haven't hit the end
cmp eax, LastError
je ShowIt
mov al, 0
repne scasb
jmp TryIt
.ELSE
.IF (LastError)
invoke PostToScreen, LastError
mov edi, OFFSET szUnknownError
.ENDIF
.ENDIF
ShowIt: mov eax, edi
pop edi
invoke PaintCenteredString, edi, 66, 172, 126, 14, eax, Active
; show the elapsed time
mov eax, SecondsElapsed
call CvrtSecondsToHMSstring
invoke PaintCenteredString, edi, 66, 189, 126, 14, ADDR szString, Active
; see if it's time for us to estimate ...
mov edx, SecondsElapsed
mov eax, edx
sub eax, ElapsedTimeOfLastEstimate
.IF (eax > 15)
; assemble the remaining time
mov ElapsedTimeOfLastEstimate, edx ; note this estimate time
zero eax
mov ebx, PercentComplete
.IF (ebx > edx) ; if it's safe to divide, show remaining time
roundiv ebx ; eax will have estimated completion
.ENDIF
mov CurrentTotalTimeEstimate, eax
.ELSE
mov eax, CurrentTotalTimeEstimate
.ENDIF
; given the current estimate time, show the remaining time!
.IF (eax)
sub eax, SecondsElapsed
.IF (carry?) ; if it went negative
zero eax ; clamp it to zero
.ENDIF
call CvrtSecondsToHMSstring
.ELSE
invoke lstrcpy, ADDR szString, ADDR szEstimating
.ENDIF
.IF (TestingPhase <= READY_TO_TEST)
invoke lstrcpy, ADDR szString, ADDR szOneMoment
.ENDIF
invoke PaintCenteredString, edi, 66, 206, 126, 14, ADDR szString, Active
; now show the error accumulations ...
mov esi, ReadDataRecovery
invoke PaintCenteredValue, edi, 347, 155, 61, 14, esi, Active
mov eax, WriteDataRecovery
add esi, eax
invoke PaintCenteredValue, edi, 347, 172, 61, 14, eax, Active
mov eax, UnrecoverableData
add esi, eax
invoke PaintCenteredValue, edi, 347, 189, 61, 14, eax, Active
invoke PaintCenteredValue, edi, 347, 206, 61, 14, esi, Active
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ret
CvrtSecondsToHMSstring:
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov ebx, 60
zero edx
div ebx ; edx = seconds / eax = minutes
mov ecx, edx ; ecx = seconds
zero edx
div ebx ; edx = minutes / eax = hours
invoke wsprintf, ADDR szString, ADDR szHoursMinsSecs, eax, edx, ecx
;--------------------------------------------------------------------------
LocalReturn
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PaintTestStatistics ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ TEST MONITOR WND PROC ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
TestMonitorWndProc PROC USES esi edi, hWnd:HWND, msg:DWORD, wParam:WPARAM, lParam:LPARAM
LOCAL ps:PAINTSTRUCT, Rect:RECT
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov eax, msg
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ WM_PAINT : Paint our entire test monitor window ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.IF (eax == WM_PAINT)
invoke BeginPaint, hWnd, ADDR ps ; setup our paintstruct
mov edi, eax
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke SelectObject, edi, hDialogTextFont
invoke SetBkMode, edi, TRANSPARENT
invoke lstrlen, ADDR szCartStatus
invoke TextOut, edi, 12, 9, ADDR szCartStatus, eax
invoke DrawEdge, edi, ADDR CS_Stat, BDR_SUNKENOUTER, BF_RECT
invoke PaintCartStatus, edi
; draw the sunken rectangles
invoke DrawEdge, edi, ADDR TP_Perc, BDR_SUNKENOUTER, BF_RECT
invoke SunkenFields, edi, ADDR TL_Sect, 4, 17
invoke SunkenFields, edi, ADDR ES_Read, 4, 17
.IF (JazDrive) ; draw a single LARGE rectangle
invoke DrawEdge, edi, ADDR SS_Jaz, BDR_SUNKENOUTER, BF_RECT
.ELSE ; draw a pair of smaller rectangles
invoke SunkenFields, edi, ADDR SS_Sid0, 2, 16
.ENDIF
.IF (CartridgeStatus == DISK_AT_SPEED) || (CartridgeStatus >= DISK_LOW_SPARES)
invoke PaintTheBarGraphs, edi, TRUE
invoke PaintTestStatistics, edi, TRUE
mov eax, BLACK_COLOR
.ELSE
invoke PaintTheBarGraphs, edi, FALSE
invoke PaintTestStatistics, edi, FALSE
mov eax, GRAY_COLOR
.ENDIF
invoke PaintTextArray, edi, ADDR TestBlackText, eax
invoke PaintTextArray, edi, ADDR TestGrayText, GRAY_COLOR
invoke PaintTestPhase, edi
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke EndPaint, hWnd, ADDR ps ; returns zero if we process
.ELSE
invoke DefWindowProc, hWnd, msg, wParam,lParam
.ENDIF
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
TestMonitorWndProc ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ DATA SOURCE ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
DataSource PROC USES ebx ecx edx, pDest:PTR SBYTE, pCount:PTR DWORD, pCompData:PTR COMP_DATA
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ASSUME ebx:PTR COMP_DATA
;--------------------------------------------------------------------------
mov ebx, pCompData
mov eax, [ebx].EndOfBuffer ; get the end of the buffer
mov edx, [ebx].SourcePointer ; get the current start
sub eax, edx ; calc the remaining amount
mov ecx, pCount ; get the pointer to the count
mov ecx, [ecx] ; and get the actual count
.IF (eax > ecx) ; if it's more than we can take
mov eax, ecx ; diminish it to the limit
.ENDIF
add [ebx].SourcePointer, eax ; bump the offset forward for next
push eax ; save the amount transferred
invoke MoveMemory, pDest, edx, eax ; move the data
pop eax ; recover the amount we moved
ret ; and return the Count that we placed into the buffer
;--------------------------------------------------------------------------
ASSUME ebx:NOTHING
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
DataSource ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ DATA SINK ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
DataSink PROC USES ebx ecx edx, pSource:PTR SBYTE, pCount:PTR DWORD, pCompData:PTR COMP_DATA
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ASSUME ebx:PTR COMP_DATA
;--------------------------------------------------------------------------
mov ebx, pCompData
mov eax, pCount ; get the pointer to the count
mov eax, [eax] ; and the count itself
mov edx, [ebx].SinkPointer
add [ebx].SinkPointer, eax
push eax
invoke MoveMemory, edx, pSource, eax
pop eax
ret
;--------------------------------------------------------------------------
ASSUME ebx:NOTHING
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
DataSink ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ DECOMPRESS BINARY ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
DecompressBinary PROC USES esi, pBitmapImage:LPVOID
LOCAL pWorkingBuffer:LPSTR, CompData:COMP_DATA
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke GlobalAlloc, GPTR, EXP_BUFFER_SIZE
mov pWorkingBuffer, eax
mov esi, pBitmapImage ; get the original size
mov eax, [esi] ; eax has uncompressed size
push eax ; save for function return
invoke GlobalAlloc, GPTR, eax
push eax ; save pointer to return
mov CompData.SinkPointer, eax
add esi, 8 ; point to the data's start
mov CompData.SourcePointer, esi ; set the starting point
add esi, [esi-4]
mov CompData.EndOfBuffer, esi
invoke explode, ADDR DataSource, ADDR DataSink, pWorkingBuffer, ADDR CompData
invoke GlobalFree, pWorkingBuffer
pop eax ; return the saved decompressed pointer
pop ebx ; return the original file size
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
DecompressBinary ENDP
GetRandomNumber:
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ Simply returns a 32-bit random number ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
mov eax, RandomSeed
imul eax, RANDOMULT
inc eax
mov RandomSeed, eax
swap ah, al
ror eax, 8
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ret
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ APPLICATION TIMER PROC ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
ApplicationTimerProc PROC hWnd:HWND, Msg:UINT, id:UINT, time:DWORD
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
pushad ; save ALL the regs so we return things as we found them!
; see whether we need to animate the titlepage
.IF (CurrentPage == INTRO_PAGE)
call FloatTheFloaters
.ENDIF
call HandleDriveChanging
; to flash the ring around the "Start Testing" button
.IF (ActionButtonFlasher) && (CurrentPage >= FIRST_ACTION_PAGE) && (CurrentPage <= LAST_ACTION_PAGE)
invoke GetDC, hMainWnd
mov edi, eax
mov eax, hBlackPen
.IF (ActionButtonFlasher & 1)
mov eax, hGrayPen
.ENDIF
invoke SelectObject, edi, eax
invoke SelectObject, edi, hNullBrush
invoke Rectangle, edi, TEST_BUTTON_LEFT-1, TEST_BUTTON_TOP-1, TEST_BUTTON_LEFT+TEST_BUTTON_WIDTH+1, TEST_BUTTON_TOP+TEST_BUTTON_HEIGHT+1
invoke Rectangle, edi, TEST_BUTTON_LEFT-2, TEST_BUTTON_TOP-2, TEST_BUTTON_LEFT+TEST_BUTTON_WIDTH+2, TEST_BUTTON_TOP+TEST_BUTTON_HEIGHT+2
invoke ReleaseDC, hMainWnd, edi
dec ActionButtonFlasher
.ENDIF
popad
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ApplicationTimerProc ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ INITIALIZE THE FLOATER SYSTEM ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
InitializeTheFloaterSystem PROC USES esi edi
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
test CPUis386, TRUE
iftrue Exit
;--------------------------------------------------------------------------
zero esi ; ESI will be the OBJECT INSTANCE index
.REPEAT ; EDI will be the OBJECT CLASS index
mov edi, ObjectTypes[esi]
Call InitPositionAndVelocity
call GetValidObjectHorzPos
mov HorzPosition[esi], eax
call GetValidObjectVertPos
mov VertPosition[esi], eax
add esi, SIZEOF DWORD
.UNTIL (esi >= NUMBER_OF_FLOATERS * SIZEOF DWORD)
; place the objects into their initial positions
call BlitTheObjects
;--------------------------------------------------------------------------
Exit: ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
InitializeTheFloaterSystem ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ GET VALID OBJECT HORZ POS ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
GetValidObjectHorzPos PROC USES ebx edx
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
call GetRandomNumber ; returns EAX
mov ebx, SPLASH_WIDTH
mov ecx, xwidth[edi]
dec ecx
add ebx, ecx
mul ebx
sub edx, ecx
shl edx, 16 ; convert into 16ù16
mov eax, edx
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
GetValidObjectHorzPos ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ GET VALID OBJECT VERT POS ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
GetValidObjectVertPos PROC USES ebx edx
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
call GetRandomNumber ; returns EAX
mov ebx, SPLASH_HEIGHT
mov ecx, yheight[edi]
dec ecx
add ebx, ecx
mul ebx
sub edx, ecx
shl edx, 16 ; convert into 16ù16
mov eax, edx
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
GetValidObjectVertPos ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ MIX EDX BY THREE ³
;³ With 1/3rd probability, this negates EDX, leaves it alone, of zeroes it. ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
MixEDXbyThree PROC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
push edx
call GetRandomNumber ; eax
mov edx, 3
mul edx
mov eax, edx
pop edx
.IF (!eax)
zero edx
.ELSEIF (eax == 1)
neg edx
.ENDIF
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MixEDXbyThree ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ PREP FOR FAST BLITTING ³
;³ This BSWAPS every DWORD of the bitmap's data placing the first bitmap ³
;³ bits up at the high end of the DWORD and linearizing them all along. ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PrepForFastBlitting PROC USES esi edi, pBitmapFile:HGLOBAL
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
test CPUis386, TRUE
iftrue Exit
;--------------------------------------------------------------------------
mov eax, pBitmapFile ; get the data block
mov ecx, [eax].BITMAPFILEHEADER.bfSize ; pickup the file's size
mov esi, [eax].BITMAPFILEHEADER.bfOffBits
sub ecx, esi ; calc the total size to bswap
shr ecx, 2 ; divide by 4 for dwords
add esi, eax ; cvrt offset into actual pointer
mov edi, esi ; setup our source and destination
.REPEAT
lodsd
bswap eax
stosd
.UNTILCXZ
Exit: ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PrepForFastBlitting ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ ALLOCATE SIXTEEN COLOR DIB ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
AllocateSixteenColorDib PROC Hwidth:DWORD, Vheight:DWORD
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov eax, Hwidth ; get the width
add eax, 7 ; round up to dword boundary
and eax, 0FFFFFFF8h ; (8 pixels per dword)
mul Vheight ; multiply by the number of lines
add eax, 16*4 + SIZEOF BITMAPINFOHEADER
invoke GlobalAlloc, GPTR, eax
ASSUME EAX:PTR BITMAPINFOHEADER
mov [eax].biSize, SIZEOF BITMAPINFOHEADER
movmov [eax].biWidth, ebx, Hwidth
movmov [eax].biHeight, ebx, Vheight
mov [eax].biPlanes, 1
mov [eax].biBitCount, 4
ASSUME EAX:NOTHING
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
AllocateSixteenColorDib ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ SPLASH THE BITMAP ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SplashTheBitmap PROC USES esi edi, hDC:HDC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov edi, hDC
invoke SelectPalette, edi, hSplashPalette, FALSE
invoke RealizePalette, edi
mov eax, pSplashDIB
mov ebx, eax ; point ebx to the bits
add ebx, 16*4 + SIZEOF BITMAPINFOHEADER
zero ecx
zero edx
zero esi
invoke SetDIBitsToDevice, edi, 16, 18, [eax + BITMAPINFOHEADER.biWidth], [eax + BITMAPINFOHEADER.biHeight],0, 0, 0, [eax + BITMAPINFOHEADER.biHeight], ebx, eax, DIB_RGB_COLORS
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
SplashTheBitmap ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ FLOAT THE FLOATERS ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
FloatTheFloaters PROC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
zero esi ; ESI is the OBJECT INSTANCE index
.REPEAT ; EDI is the OBJECT CLASS index
mov edi, ObjectTypes[esi]
;--------------------------------------------------------------------------
DoHorz: mov eax, HorzPosition[esi] ; get the 16ù16 format
add eax, HorzVelocity[esi] ; compute new location
mov HorzPosition[esi], eax ; and save it, presuming okay
shr eax, 16 ; discard the fractional part
movsx eax, ax
cmp eax, SPLASH_WIDTH
jge ReFloat
check eax
jns DoVert
neg eax ; make the offset positive
cmp eax, xwidth[edi] ; see if we're too negative
jge ReFloat
DoVert: mov eax, VertPosition[esi] ; get the 16ù16 format
add eax, VertVelocity[esi] ; compute new location
mov VertPosition[esi], eax ; and save it, presuming okay
shr eax, 16
movsx eax, ax
cmp eax, SPLASH_HEIGHT
jge ReFloat
check eax
jns NextObject
neg eax ; make the offset positive
cmp eax, yheight[edi] ; see if we're too negative
jl NextObject
ReFloat: Call InitPositionAndVelocity
;--------------------------------------------------------------------------
NextObject: add esi, SIZEOF DWORD
.UNTIL (esi >= NUMBER_OF_FLOATERS * SIZEOF DWORD)
; place the objects into their initial positions
call BlitTheObjects
; and update the image in the window
mov esi, hMainWnd
.IF (esi) ; make sure the window exists!
invoke GetDC, esi
mov edi, eax
invoke SplashTheBitmap, eax
invoke ReleaseDC, esi, edi
.ENDIF
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
FloatTheFloaters ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ INIT POSITION AND VELOCITY ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
InitPositionAndVelocity PROC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; get a size-based vbelocity
mov eax, VELOCITY_MULTIPLIER
mul velocities[edi]
; mul xwidth[edi] ; EDX has the size-based velocity
mov edx, eax
; choose a border from which to emerge
call GetRandomNumber ; returns EAX
mov ebx, eax
.IF (ebx & 1)
call GetValidObjectHorzPos
mov HorzPosition[esi], eax
.IF (ebx & 2) ; TOP EDGE
mov eax, yheight[edi]
dec eax
shl eax, 16
neg eax
.ELSE ; BOTTOM EDGE
mov eax, (SPLASH_HEIGHT-1) SHL 16
neg edx
.ENDIF
mov VertPosition[esi], eax
mov VertVelocity[esi], edx
Call MixEDXbyThree
mov HorzVelocity[esi], edx
.ELSE
call GetValidObjectVertPos
mov VertPosition[esi], eax
.IF (ebx & 2) ; LEFT EDGE
mov eax, xwidth[edi]
dec eax
shl eax, 16
neg eax
.ELSE ; RIGHT EDGE
mov eax, (SPLASH_WIDTH-1) SHL 16
neg edx
.ENDIF
mov HorzPosition[esi], eax
mov HorzVelocity[esi], edx
Call MixEDXbyThree
mov VertVelocity[esi], edx
.ENDIF
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
InitPositionAndVelocity ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ BLIT THE OBJECTS ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
BlitTheObjects PROC USES esi edi
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; Zero the entire destination bitmap before summing into it ...
mov eax, pSplashDIB
add eax, SIZEOF BITMAPINFOHEADER + 16*4
invoke ZeroMemory, eax, (SPLASH_HEIGHT * DEST_BITMAP_BYTE_WIDTH)
; Now BLIT the entire set of Objects into the bitmap
zero esi
.REPEAT ; ESI will be the OBJECT INSTANCE index
; EDI will be the OBJECT CLASS index
mov edi, ObjectTypes[esi] ; EDI is the pointer to the OBJECT CLASS
; establish the object's translucency transformation table
invoke MoveMemory, ADDR xform, transform[edi], 16*4
; let's figure out the horizontal
mov eax, HorzPosition[esi] ; get the current Horz
shr eax, 16 ; discard the fractional
movsx eax, ax ; and sign-extend it
.IF (sdword ptr eax >= 0)
; our X coord is positive, so no left clipping
mov ebx, SPLASH_WIDTH
sub ebx, eax
mov edx, xwidth[edi]
.IF (ebx > edx)
mov ebx, edx
.ENDIF
mov edx, eax
zero eax
.ELSE
; we have a negative X, so some of our left is clipped
mov ebx, xwidth[edi]
add ebx, eax ; EBX has the pixel count
neg eax ; EAX has the left SRC pixel
zero edx ; EDX has the left DEST pixel
.ENDIF
.IF (ebx > SPLASH_WIDTH) ; trim our blit to window width
mov ebx, SPLASH_WIDTH
.ENDIF
mov PixelsPerLine, ebx
; EAX has the starting pixel in the SOURCE bitmap
add eax, xleft[edi] ; add-in the source offset
mov ecx, eax ; first setup the bit mask
and cl, 1Fh ; get the lower FIVE bits
mov ebx, 80000000h ; setup the source mask
shr ebx, cl
mov SourceBitStart, ebx
and eax, 0FFFFFFE0h ; mask off the lower five bits
shr eax, 3 ; now the byte offset
add eax, pFontBitmap
add eax, ytop[edi] ; !!! This is pre-computed !!!
mov SourceLineStart, eax
; EDX has the starting pixel in the DEST bitmap
mov ecx, edx
and ecx, 00000007h ; get 0-7
shl ecx, 2 ; * 4 == 0-28
neg ecx
add ecx, 28 ; 28 .... 0
mov DestBitStart, ecx ; (28 for the 0th bit!)
mov eax, pSplashDIB
add eax, SIZEOF BITMAPINFOHEADER + 16*4 + ((SPLASH_HEIGHT-1) * DEST_BITMAP_BYTE_WIDTH)
and edx, 0FFFFFFF8h
shr edx, 1 ; get the byte offset
add eax, edx
mov DestLineStart, eax
; let's figure out the vertical
mov eax, VertPosition[esi] ; get the current Horz
shr eax, 16 ; discard the fractional
movsx eax, ax ; and sign-extend it
.IF (sdword ptr eax >= 0)
; our X coord is positive, so no top clipping
mov ebx, eax
imul ebx, DEST_BITMAP_BYTE_WIDTH
sub DestLineStart, ebx
mov ebx, SPLASH_HEIGHT
sub ebx, eax
mov edx, yheight[edi]
.IF (ebx > edx)
mov ebx, edx
.ENDIF
.ELSE
; we have a negative Y, so some of our top is clipped
mov ebx, yheight[edi]
add ebx, eax ; EBX has the new line count
imul eax, SOURCE_BITMAP_BYTE_WIDTH
add SourceLineStart, eax
.ENDIF
mov LineCount, ebx
call FastTransparentBlt
add esi, SIZEOF DWORD
.UNTIL (esi >= NUMBER_OF_FLOATERS * SIZEOF DWORD)
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
BlitTheObjects ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ FAST TRANSPARENT BLT ³
;³ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄij
;³ This performs an ULTRA FAST transparent BitBlt of one DIB into another. ³
;³ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄij
;³ EAX is the working scratch register ³
;³ EBX contains the destination bitmap data for 8 pixels ³
;³ ECX has the shift over count ³
;³ EDX has the 4-bit pixel mask ³
;³ EBP has the 1-bit pixel mask ³
;³ ESI has the source bitmap dword pointer ³
;³ EDI has the dest bitmap dword pointer ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
FastTransparentBlt PROC USES esi edi ebp
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
LinePrep:movmov PixelsToBlt, eax, PixelsPerLine
mov esi, SourceLineStart
mov edi, DestLineStart
mov ebp, SourceBitStart
mov ecx, DestBitStart
mov edx, FourBitMasks[ecx]
mov ebx, [edi] ; get a dword set of bitmaps from the dest
bswap ebx ; de-scramble the nibbles!
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
TstPixel:.IF ([esi] & ebp) ; see if this source-bit is set
mov eax, ebx ; get the destination bitmap dword
and eax, edx ; mask out the 4-bit pixel we want
not edx ; invert the mask to zero the dest pixel
and ebx, edx ; zero the dest for eventual or-ing
not edx ; return the mask to it's positive state
shr eax, cl ; bring the pixel down to bit 0
mov eax, xform[eax*4] ; perform the transparent transformation
shl eax, cl ; move the new pixel back up where it goes
or ebx, eax ; and OR it back into the DIB
.ENDIF
rcr ebp, 1 ; setup for the next source pixel
.IF (carry?) ; if we're done, get the next word
rcr ebp, 1 ; set the low-order bit
add esi, 4 ; bump to the next source dword
.ENDIF
ror edx, 4 ; move the mask around four bits
sub ecx, 4 ; decrease the shift-over amount by 4
.IF (carry?) ; if we're done with this pixel
bswap ebx ; re-scramble the nibbles
mov [edi], ebx ; replace the modified dest bitmap dword
add edi, 4 ; bump up to the next dest dword
mov ebx, [edi] ; get the next dest bitmap dword
bswap ebx ; de-scramble the nibbles
mov ecx, 28 ; and reset the shift-over amount
.ENDIF
dec PixelsToBlt
jnz TstPixel
;--------------------------------------------------------------------------
bswap ebx ; re-scramble the nibbles
mov [edi], ebx ; replace the modified dest bitmap dword
;--------------------------------------------------------------------------
sub SourceLineStart, SOURCE_BITMAP_BYTE_WIDTH
sub DestLineStart, DEST_BITMAP_BYTE_WIDTH
dec LineCount ; see if we're all done or not
jnz LinePrep
;--------------------------------------------------------------------------
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
FastTransparentBlt ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ SET RICH EDIT TEXT ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SetRichEditText PROC USES esi edi, phRichEditControl:LPHWND, pszSection:LPSTR
LOCAL HeaderLength:DWORD, BodyStart:DWORD, BodyLength:DWORD
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; see whether we've already set THIS text into THIS control ...
mov eax, pszSection ; get the section we're setting
mov ebx, phRichEditControl ; and address of the control's handle
cmp eax, [ebx+4] ; see if we've already set it
je Exit ; YEP! so we're all done!
;--------------------------------------------------------------------------
mov [ebx+4], eax ; nope, so show it set now!
; now check to see if we're pointing to a NULL string ??
.IF (!byte ptr [eax])
mov esi, eax ; setup the stream to NULL
mov edi, 1 ; set the length to 1
jmp SetIt
.ENDIF
; now search to the first '[' to size the first (header) section
mov al, '[' ; search for the first '[' bracket
mov edi, pRTF_Data
mov ecx, pRTF_Data+4
repne scasb ; and scan past the rtf header
mov eax, edi
sub eax, pRTF_Data
dec eax
mov HeaderLength, eax ; establish the header's length
; now scan down to the opening of the proper section
mov edi, pRTF_Data ; restart at the top of the file
mov ecx, pRTF_Data+4
NextOne:.REPEAT
mov al, '[' ; we're looking for a new section
repne scasb ; look for the next '['
jne Exit ; if we didn't find one ... abort
mov esi, ecx ; save our counter around the call
invoke lstrcmp, edi, pszSection
mov ecx, esi ; restore our counter after the call
.UNTIL (!eax) ; keep looking 'till we find it
; now find the start of the NEXT line after the section header
mov al, LF ; look for line feeds
repne scasb ; scan for next line start
jne Exit ; abort if we didn't have one!
mov BodyStart, edi ; mark the start of the body text
; now find the start of the NEXT section (and the end of this one)
mov al, '[' ; we're looking for a new section
repne scasb ; look for the next '['
jne Exit ; if we didn't find one ... abort
; now scan BACK to the end of the PRIOR line
mov al, LF ; scan backward past line start
mov ecx, -1 ; set the scan lenght to infinity
std ; set direction to backwards
repne scasb ; and land on the CR above
cld ; restore standard forward direction
sub edi, BodyStart ; compute the Body's length
mov BodyLength, edi
add edi, HeaderLength ; get the total allocation needed
inc edi ; and add ONE more byte for '}'
; allocate a block of mem for stream assembly
invoke GlobalAlloc, GPTR, edi
mov esi, eax ; esi will be our stream pointer
; fill the allocation with the header and the section's body
invoke MoveMemory, esi, pRTF_Data, HeaderLength
mov eax, esi
add eax, HeaderLength
invoke MoveMemory, eax, BodyStart, BodyLength
mov eax, esi
add eax, HeaderLength
add eax, BodyLength
invoke MoveMemory, eax, ADDR CloseCurly, 1
; setup the stream parameters and initiate the stream
SetIt: mov StreamPointer, esi ; setup the start of the stream
add edi, esi ; add the length to the start
mov StreamEnd, edi ; and set the stream's end point
mov eax, phRichEditControl
invoke SendMessage, dword ptr [eax], EM_STREAMIN, SF_RTF or SFF_PLAINRTF, ADDR RichEditStreamIn
; release the temporary stream assembly allocation
.IF (byte ptr [esi]) ; if we were not pointing to a NULL
invoke GlobalFree, esi
.ENDIF
Exit: ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
SetRichEditText ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ INITIALIZE WIZARD CONTROLS ³
;³ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄij
;³ This presets and preloads the Wizard's Child Controls ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
InitializeWizardControls PROC
LOCAL TabItem:TC_ITEM
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; prep the RichEdit controls background colors ...
invoke SendMessage, hRichEdit, EM_SETBKGNDCOLOR, FALSE, LTGRAY_COLOR
invoke SendMessage, hTabText, EM_SETBKGNDCOLOR, FALSE, LTGRAY_COLOR
; set the static text for the main RichEdit control
invoke SetRichEditText, ADDR hRichEdit, ADDR szInstructions
; setup the tabs for the ACTION page
invoke InitCommonControls ; initialize the common controls
; loadup the tab text
varzero TabItem
mov TabItem._mask, TCIF_TEXT
mov TabItem.iImage, -1
mov TabItem.pszText, OFFSET szActionTabOne
invoke SendMessage, hActionTabs, TCM_INSERTITEM, 0, ADDR TabItem
mov TabItem.pszText, OFFSET szActionTabTwo
invoke SendMessage, hActionTabs, TCM_INSERTITEM, 1, ADDR TabItem
; set the tab width
invoke SendMessage, hActionTabs, TCM_SETITEMSIZE, 0, 143
; set the tab font
invoke SendMessage, hActionTabs, WM_SETFONT, hDialogTextFont, NULL
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
InitializeWizardControls ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ STREAM SOURCE ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
StreamSource PROC dwCookie:DWORD, pBuff:LPBYTE, cb:DWORD, pcb:LPDWORD
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov eax, StreamEnd ; get the end of the buffer
mov edx, StreamPointer ; get the current start
sub eax, edx ; calc the remaining amount
mov ecx, cb ; get the count to read
.IF (eax > ecx) ; if it's more than we have left
mov eax, ecx ; diminish it to the limit
.ENDIF
add StreamPointer, eax ; bump the offset forward for next
push eax ; save the amount transferred
invoke MoveMemory, pBuff, edx, eax ; move the data
mov eax, pcb
pop dword ptr [eax]
zero eax ; return zero to continue streaming
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
StreamSource ENDP
IF DEVELOPMENT
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ POST TO SCREEN ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PostToScreen PROC USES eax esi edi, PostVal:DWORD
LOCAL PostString[20]:CHAR, Extent:_SIZE
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
mov eax, PostVal
.IF (eax != LastPostedValue)
mov LastPostedValue, eax
invoke GetDC, HWND_DESKTOP
mov edi, eax
invoke SelectObject, edi, hHeadlineFont
invoke SelectObject, edi, hBlackPen
invoke SelectObject, edi, hBlackBrush
invoke wsprintf, ADDR PostString, ADDR szLongHexFormat, LastPostedValue
mov esi, eax
invoke TextOut, edi, 0, LastPostedTop, ADDR PostString, eax
invoke GetTextExtentPoint32, edi, ADDR PostString, esi, ADDR Extent
mov esi, Extent._cy
add esi, POSTING_SPACE
add LastPostedTop, esi
mov eax, Extent._cx
mov ebx, Extent._cy
add ebx, LastPostedTop
invoke Rectangle, edi, 0, LastPostedTop, eax, ebx
invoke ReleaseDC, HWND_DESKTOP, edi
.ENDIF
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PostToScreen ENDP
ENDIF
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ PROCESS PENDING MESSAGES ³
;³ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄij
;³ This allows all windows to receive and process any and all pending ³
;³ messages ... such as old WM_PAINT's that they may be holding ... ³
;³ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄij
;³ Note also that this loop DELIBERATELY AVOIDS the removal of WM_QUIT ³
;³ messages, since they should only be removed by the GetMessage call ³
;³ which returns FALSE when it encounters the WM_QUIT ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
ProcessPendingMessages PROC USES esi
LOCAL msg:MSG
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
push esi
.REPEAT
invoke PeekMessage, ADDR msg, NULL, 0, 0, PM_REMOVE
.IF (eax)
mov esi, eax
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
mov eax, esi
.ENDIF
.UNTIL (!eax)
pop esi
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ProcessPendingMessages ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ UPDATE RUN TIME DISPLAY ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
UpdateRunTimeDisplay PROC USES edi
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke GetDC, hTestMonitor
mov edi, eax
invoke PaintTestPhase, edi
invoke PaintTheBarGraphs, edi, TRUE
invoke PaintTestStatistics, edi, TRUE
invoke ReleaseDC, hTestMonitor, edi
call ProcessPendingMessages ; paint all current status
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
UpdateRunTimeDisplay ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ UPDATE RUN TIME DISPLAY ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
UpdateRunPhaseDisplay PROC USES edi
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke GetDC, hTestMonitor
mov edi, eax
invoke PaintTestPhase, edi
invoke ReleaseDC, hTestMonitor, edi
call ProcessPendingMessages ; paint all current status
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
UpdateRunPhaseDisplay ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ PREVENT PROGRAM EXIT ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PreventProgramExit PROC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke GetSystemMenu, hMainWnd, FALSE ; get sysmenu handle
invoke DeleteMenu, eax, SC_CLOSE, MF_BYCOMMAND
invoke SendMessage, hMainWnd, WM_NCPAINT, NULL, NULL
invoke SetWindowPos, hMainWnd, 0, 0,0,0,0,
SWP_DRAWFRAME or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER
invoke EnableWindow, hExitButton, FALSE
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PreventProgramExit ENDP
;ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
;³ ALLOW PROGRAM EXIT ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
AllowProgramExit PROC
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
invoke GetSystemMenu, hMainWnd, FALSE ; get sysmenu handle
invoke AppendMenu, eax, MF_STRING, SC_CLOSE, ADDR szCloseCmd
invoke SendMessage, hMainWnd, WM_NCPAINT, NULL, NULL
invoke SetWindowPos, hMainWnd, 0, 0,0,0,0,
SWP_DRAWFRAME or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER
invoke EnableWindow, hExitButton, TRUE
ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
AllowProgramExit ENDP
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
include aspi.asm
;-//////////////////////////////////////////////////////////////////////////-
END Start
;-//////////////////////////////////////////////////////////////////////////-