diff --git a/mac-cpp-source/Iomega Tester.cpp b/mac-cpp-source/Iomega Tester.cpp index 7d96107..608196a 100644 --- a/mac-cpp-source/Iomega Tester.cpp +++ b/mac-cpp-source/Iomega Tester.cpp @@ -12,32 +12,13 @@ void main() { SIOUXSettings.leftpixel = 8; SIOUXSettings.toppixel = 44; - printf( - "\n\n" - "Trouble in Paradise\n" - "===================\n\n" - "A Macintosh port of \"Trouble in Paradise\" for Windows, made possible by a\n" - "generous code donation by Steve Gibson from Gibson Research Corporation.\n\n" - "This freeware utility determines whether an Iomega Zip or Jaz drive is prone\n" - "to developing the dreaded \"Click of Death\" (COD) syndrome. Steve Gibson's\n" - "research into the maintenance, repair and data recovery of Iomega's removable\n" - "media mass storage products led to this capability.\n\n" - ); - printf( "------------------------------------------------------------------------------\n" ); printf( "This Mac port (c) 2021 Marcio Teixeira http://github.com/marciot/mac-tip\n" ); printf( "Based on code (c) 2006 Gibson Research Corp http://grc.com/tip/clickdeath.htm\n" ); printf( "------------------------------------------------------------------------------\n" ); + printf("\nStarting tip ...\n"); SIOUXSetTitle("\pTrouble in Paradise for Macintosh (" __DATE__ ")"); - // Confirm that the user wants to run TIP - - char cmd[80]; - printf("\n\nThis program is in BETA TESTING and may cause data loss!\n\nProceed [Y/N]? "); - gets( cmd ); - if(tolower(cmd[0]) == 'y') { - run_tip(); - printf("\n\nYou may need to REBOOT your Mac before cartridges are recognized by Mac OS."); - } + run_tip(); } \ No newline at end of file diff --git a/mac-cpp-source/Iomega Tester.rsrc.bin b/mac-cpp-source/Iomega Tester.rsrc.bin index 609bbe1..b58c4c1 100644 Binary files a/mac-cpp-source/Iomega Tester.rsrc.bin and b/mac-cpp-source/Iomega Tester.rsrc.bin differ diff --git a/mac-cpp-source/tip/tip.cpp b/mac-cpp-source/tip/tip.cpp index f0dfea7..1e9d229 100644 --- a/mac-cpp-source/tip/tip.cpp +++ b/mac-cpp-source/tip/tip.cpp @@ -8,6 +8,18 @@ #include "tip.h" +#define TITLE_TOP 11 +#define BODY_TOP 54 +#define BODY_LEFT 156 +#define BODY_RIGHT 445 +#define BODY_BOTTOM 280 + +#define BODY_WIDTH (BODY_RIGHT - BODY_LEFT) +#define BODY_HEIGHT (BODY_BOTTOM - BODY_TOP) + +#define LOGO_1_LEFT 157 +#define LOGO_1_TOP 57 + /******************************************************************************* * WinMain * @@ -30,6 +42,22 @@ void WinMain(uint8_t *DrivesSkipped) { StartApplicationTimer(); } +/******************************************************************************* + * PAINT 3D HEADLINE + *******************************************************************************/ +void Paint3DHeadline(const char *pszText, int Xleft, int Ytop) { + TextSize(24); + TextFace(bold); + TextFont(helvetica); + SetColor(WHITE_COLOR); + TextOut(Xleft, Ytop, pszText); + SetColor(BLACK_COLOR); + TextOut(Xleft+1, Ytop+1, pszText); + TextFont(applFont); + TextFace(0); + TextSize(10); +} + /******************************************************************************* * WndProc * @@ -42,17 +70,80 @@ void WndProc(long iMessage, uint16_t wParam) { if (iMessage == WM_PAINT) { // Draw the Lower Horz Button Divider + GetDC(hMainWnd); SetColor(GRAY_COLOR); MoveTo(15, 289); LineTo(446, 289); SetColor(WHITE_COLOR); LineTo(446, 290); LineTo(14, 290); + ReleaseDC(hMainWnd); + + // Draw the Gibson 'G' Logo + if(CurrentPage == INTRO_PAGE) { + GetDC(hIntroWnd); + SetColor(GRAY_COLOR); + MoveTo(LOGO_1_LEFT+1, LOGO_1_TOP+29); + LineTo(LOGO_1_LEFT+14, LOGO_1_TOP+29); + LineTo(LOGO_1_LEFT+14, LOGO_1_TOP+0); + SetColor(WHITE_COLOR); + LineTo(LOGO_1_LEFT+12, LOGO_1_TOP+0); + LineTo(LOGO_1_LEFT+0, LOGO_1_TOP+12); + LineTo(LOGO_1_LEFT+0, LOGO_1_TOP+30); + + SetColor(GRAY_COLOR); + MoveTo(LOGO_1_LEFT+18, LOGO_1_TOP+14); + LineTo(LOGO_1_LEFT+46, LOGO_1_TOP+14); + LineTo(LOGO_1_LEFT+46, LOGO_1_TOP+12); + LineTo(LOGO_1_LEFT+34, LOGO_1_TOP+0); + SetColor(WHITE_COLOR); + LineTo(LOGO_1_LEFT+17, LOGO_1_TOP+0); + LineTo(LOGO_1_LEFT+17, LOGO_1_TOP+15); + + SetColor(GRAY_COLOR); + MoveTo(LOGO_1_LEFT+33, LOGO_1_TOP+46); + LineTo(LOGO_1_LEFT+46, LOGO_1_TOP+46); + LineTo(LOGO_1_LEFT+46, LOGO_1_TOP+29); + LineTo(LOGO_1_LEFT+34, LOGO_1_TOP+17); + SetColor(WHITE_COLOR); + LineTo(LOGO_1_LEFT+32, LOGO_1_TOP+17); + LineTo(LOGO_1_LEFT+32, LOGO_1_TOP+47); + + SetColor(GRAY_COLOR); + MoveTo(LOGO_1_LEFT+1, LOGO_1_TOP+35); + LineTo(LOGO_1_LEFT+12, LOGO_1_TOP+46); + LineTo(LOGO_1_LEFT+29, LOGO_1_TOP+46); + LineTo(LOGO_1_LEFT+29, LOGO_1_TOP+32); + SetColor(WHITE_COLOR); + LineTo(LOGO_1_LEFT+0, LOGO_1_TOP+32); + LineTo(LOGO_1_LEFT+0, LOGO_1_TOP+35); + + // show the current logo bitmap + SplashTheBitmap(); + + // paint the 3D program title + Paint3DHeadline(szIntroTitle, BODY_LEFT, TITLE_TOP); + + // now the rest of the stuff ... + SetColor(BLACK_COLOR); + #define WH_RECT(L,T,W,H) L, T, L + W, T + H + + Rect rect; + SetRect(&rect, WH_RECT(221, BODY_TOP, 230, 60)); + TETextBox(szIntroSubTitle, strlen(szIntroSubTitle), &rect, teFlushDefault); + + SetRect(&rect, WH_RECT(BODY_LEFT, BODY_TOP+64, BODY_WIDTH, 115)); + TETextBox(szIntroText, strlen(szIntroText), &rect, teFlushDefault); + + ReleaseDC(hIntroWnd); + } // Paint the Copyright Notice + GetDC(hMainWnd); SetColor(GRAY_COLOR); TextOut(15, 298, szCopyright_1); TextOut(15, 311, szCopyright_2); + ReleaseDC(hMainWnd); } // ------------------------------------------------------------------------- // WM_COMMAND : a button was pressed diff --git a/mac-cpp-source/tip/tip.h b/mac-cpp-source/tip/tip.h index c5ef944..95358f8 100644 --- a/mac-cpp-source/tip/tip.h +++ b/mac-cpp-source/tip/tip.h @@ -4,11 +4,18 @@ extern WindowPtr tipWindow; void run_tip(); +typedef enum TipPage { + INTRO_PAGE, + PERFORM_TEST_PAGE, + EXPLAIN_RESULTS, +} TipPage; + #define MINIMUM_JAZ_SPARES 500 #define MAXIMUM_JAZ_SPARES 2557 #define MINIMUM_ZIP_SPARES 50 #define MAXIMUM_ZIP_SPARES 126 +extern TipPage CurrentPage; extern long CurrentDevice; extern long DriveCount; extern long JazDrive; // true if the current drive @@ -16,6 +23,7 @@ extern long CartridgeStatus; extern long LastLBAOnCartridge; extern uint32_t StartingInstant; extern long NumberOfLBAs; +extern long AdapterMaxSectors; extern long Side_0_SparesCount; // JAZ has only one count extern long Side_1_SparesCount; // ZIP has counts for both sides extern long Initial_Side_0_Spares; @@ -102,6 +110,8 @@ void StopApplicationTimer(); void PostQuitMessage(); unsigned long GetSystemTime(); bool PrepareDC(int which); +void SplashTheBitmap(); +void Paint3DHeadline(); #define GetDC(h) {GrafPtr oldPort; \ GetPort(&oldPort); \ @@ -144,6 +154,9 @@ enum { /******************************************************************************* * STRINGS *******************************************************************************/ +extern const char *szIntroTitle; +extern const char *szIntroSubTitle; +extern const char *szIntroText; extern const char *szWindowTitle; extern const char *szCopyright_1; @@ -234,6 +247,7 @@ enum { hExitButton = IDB_QUIT, hSoundCheckbox, // Extras added by MLT + hIntroWnd = 5, hExplainWnd = IDB_EXPL }; @@ -275,6 +289,7 @@ void AllowProgramExit(); void ErrorSound(); void ProcessPendingMessages(); void WinMain(uint8_t *DrivesSkipped); +void Paint3DHeadline(const char *pszText, int Xleft, int Ytop); void WndProc(long iMessage, uint16_t wParam); void TestMonitorWndProc(); void ApplicationTimerProc(); diff --git a/mac-cpp-source/tip/tip_main.cpp b/mac-cpp-source/tip/tip_main.cpp index fd58e17..15dd312 100644 --- a/mac-cpp-source/tip/tip_main.cpp +++ b/mac-cpp-source/tip/tip_main.cpp @@ -17,17 +17,13 @@ #include "tip.h" #include "command_line.h" -enum TipPage { - kTestingPage, - kExplainPage, -} page; - static int gDone; static bool allowColor; static bool inited = false; static bool timerEnabled = false; static WindowPtr tipWindow; static MenuHandle tipMenu; +static PicHandle tipIntroPic; static TBHandle richText; static const char *textFileName; @@ -58,15 +54,13 @@ void run_tip() { NewTipWindow(); EnableWindow(hTestButton, false); - SetRichEditText(szInstructions); gDone = false; do { EventRecord event; if (WaitNextEvent(everyEvent, &event, GetCaretTime(), cursorRgn)) { DoEvent(event, &cursorRgn); - if(!inited && page == kTestingPage) { - printf("Starting tip\n"); + if(!inited && CurrentPage == PERFORM_TEST_PAGE) { // Start TIP as soon as the user dismisses the intro screen inited = true; uint8_t drivesSkipped; @@ -136,7 +130,7 @@ void NewTipWindow() { SetControlValue(FindCntlHandle(IDB_BEEP),1); // Check the sound control - page = kExplainPage; + CurrentPage = EXPLAIN_RESULTS; GetDC(hExplainWnd); // Create the text edit widget @@ -145,7 +139,10 @@ void NewTipWindow() { ReleaseDC(hExplainWnd); - SetPage(kTestingPage); + // Load the About box picture + tipIntroPic = GetPicture(128); + + SetPage(INTRO_PAGE); } void AddTipMenus() { @@ -189,11 +186,14 @@ ControlHandle FindCntlHandle(int id) { bool PrepareDC(int which) { SetPort(tipWindow); switch(which) { + case hIntroWnd: + if(CurrentPage != INTRO_PAGE) return false; + break; case hExplainWnd: - if(page != kExplainPage) return false; + if(CurrentPage != EXPLAIN_RESULTS) return false; break; case hTestMonitor: - if(page != kTestingPage) return false; + if(CurrentPage != PERFORM_TEST_PAGE) return false; SetOrigin(-20, -10); break; case hMainWnd: @@ -320,10 +320,13 @@ void DoMouseDown(EventRecord &event) { int id = GetControlReference(thisControl); switch(id) { case IDB_OKAY: - SetPage(kTestingPage); + SetPage(PERFORM_TEST_PAGE); break; case IDB_EXPL: - SetPage(kExplainPage); + SetPage(EXPLAIN_RESULTS); + break; + case IDB_NEXT: + SetRichEditText(szInstructions); break; case IDB_READ: OpenExplanationInSimpleText(); @@ -404,10 +407,21 @@ void StrToPascal(Str255 pStr, const char *str) { } void SetPage(TipPage newPage) { - if(page == newPage) return; - page = newPage; - switch(page) { - case kTestingPage: + if(CurrentPage == newPage) return; + CurrentPage = newPage; + switch(CurrentPage) { + case INTRO_PAGE: + ShowWindow(IDB_TEST, SW_HIDE); + ShowWindow(IDB_BACK, SW_HIDE); + ShowWindow(IDB_EXPL, SW_HIDE); + ShowWindow(IDB_BEEP, SW_HIDE); + ShowWindow(IDB_OKAY, SW_HIDE); + ShowWindow(IDB_READ, SW_HIDE); + ShowWindow((*richText)->scroll, SW_HIDE); + ShowWindow(IDB_QUIT, SW_SHOW); + ShowWindow(IDB_NEXT, SW_SHOW); + break; + case PERFORM_TEST_PAGE: ShowWindow((*richText)->scroll, SW_HIDE); ShowWindow(IDB_BACK, SW_HIDE); ShowWindow(IDB_NEXT, SW_HIDE); @@ -418,7 +432,7 @@ void SetPage(TipPage newPage) { ShowWindow(IDB_QUIT, SW_SHOW); ShowWindow(IDB_BEEP, SW_SHOW); break; - case kExplainPage: + case EXPLAIN_RESULTS: ShowWindow(IDB_TEST, SW_HIDE); ShowWindow(IDB_BACK, SW_HIDE); ShowWindow(IDB_NEXT, SW_HIDE); @@ -529,7 +543,7 @@ void SetRichEditText(const char *name) { TBReadSimpleText(richText, &docSpec); if (name != szRunning && name != szNotRunning) { - SetPage(kExplainPage); + SetPage(EXPLAIN_RESULTS); } else { InvalidateRect(hDefault); } @@ -805,3 +819,16 @@ void ProcessPendingMessages() { } SystemTask(); } + +/******************************************************************************* + * SPLASH THE BITMAP + *******************************************************************************/ +void SplashTheBitmap() { + GetDC(hIntroWnd); + if(tipIntroPic) { + Rect rect; + SetRect(&rect, 16, 18, 16+120, 18/*+258*/ +220); + DrawPicture(tipIntroPic, &rect); + } + ReleaseDC(hIntroWnd); +} \ No newline at end of file diff --git a/mac-cpp-source/tip/tip_text.cpp b/mac-cpp-source/tip/tip_text.cpp index ef6408b..4d8a4e5 100644 --- a/mac-cpp-source/tip/tip_text.cpp +++ b/mac-cpp-source/tip/tip_text.cpp @@ -128,6 +128,21 @@ ErrorTypeList errorTypeList[] = { 0, 0 }; +/********** Main Window Controls Text ************/ + +const char *szIntroTitle = "Trouble in Paradise"; +const char *szIntroSubTitle = "FREEWARE by Steve Gibson\r" \ + "Gibson Research Corporation\r" \ + "http://grc.com ( v 2.1b )\r" \ + "http://github.com/marciot/mac-tip"; +const char *szIntroText = + "A Macintosh port of \"TIP\" for Windows by Marcio Teixeira, made possible by a " + "generous code donation by Steve Gibson.\r\r" + "This freeware utility determines whether an Iomega Zip or Jaz drive is prone " + "to developing the dreaded \"Click of Death\" syndrome. Gibson's " + "research into the maintenance, repair and data recovery of Iomega's removable " + "media mass storage products led to this capability."; + /****************** Control Text *****************/ const char *szBack = "< Back";