code][ > GS/OS Pascal > Toolkit Initialization
Installation

Complete code listing:

PROGRAM HelloWorldGS;

USES
  Globals,
  Dialog,
  Font,
  Paint,
  Window,
  Print,
  Menu,
  Event;

FUNCTION StartUpTools : boolean;
  const
    DPForQuickDraw = $000;
    DPForEventMgr  = $300;
    DPForCtlMgr    = $400;
    DPForLineEdit  = $500;
    DPForMenuMgr   = $600;
    DPForStdFile   = $700;
    DPForFontMgr   = $800;
    DPForPrintMgr  = $900;
    TotalDP        = $B00;

  var
    toolRec    : ToolTable;
    paramBlock : FileRec;
    baseDP     : integer;

  begin {StartUpTools}
    StartUpTools := true;

    TLStartUp;
    CheckToolError($1);

    MyMemoryID := MMStartUp;

    MTStartUp;
    CheckToolError($2);

    {Allocate zero page memory for tools}
    ToolsZeroPage := NewHandle(TotalDP, MyMemoryID, attrBank + attrFixed + attrLocked + attrPage, Ptr(0));
    CheckToolError($3);

    baseDP := LoWord(ToolsZeroPage^);

    QDStartUp(baseDP + DPForQuickDraw, ScreenMode, MaxScan, MyMemoryID);
    CheckToolError($4);

    EMStartUp(baseDP + DPForEventMgr, 20, 0, MaxX, 0, 200, MyMemoryID);
    CheckToolError($5);

    MoveTo(20,20);
    SetBackColor(0);
    SetForeColor(15);
    DrawString('One Moment Please...');
    ShowCursor;

    toolRec.NumTools             := 14;
    toolRec.Tools[1].TSNum       := 4;
    toolRec.Tools[1].MinVersion  := 0;
    toolRec.Tools[2].TSNum       := 5;
    toolRec.Tools[2].MinVersion  := 0;
    toolRec.Tools[3].TSNum       := 6;
    toolRec.Tools[3].MinVersion  := 0;
    toolRec.Tools[4].TSNum       := 14;
    toolRec.Tools[4].MinVersion  := 0;
    toolRec.Tools[5].TSNum       := 15;
    toolRec.Tools[5].MinVersion  := 0;
    toolRec.Tools[6].TSNum       := 16;
    toolRec.Tools[6].MinVersion  := 0;
    toolRec.Tools[7].TSNum       := 18;
    toolRec.Tools[7].MinVersion  := 0;
    toolRec.Tools[8].TSNum       := 19;
    toolRec.Tools[8].MinVersion  := 0;
    toolRec.Tools[9].TSNum       := 20;
    toolRec.Tools[9].MinVersion  := 0;
    toolRec.Tools[10].TSNum      := 21;
    toolRec.Tools[10].MinVersion := 0;
    toolRec.Tools[11].TSNum      := 22;
    toolRec.Tools[11].MinVersion := 0;
    toolRec.Tools[12].TSNum      := 23;
    toolRec.Tools[12].MinVersion := 0;
    toolRec.Tools[13].TSNum      := 27;
    toolRec.Tools[13].MinVersion := 0;
    toolRec.Tools[14].TSNum      := 28;
    toolRec.Tools[14].MinVersion := 0;

    REPEAT
      paramBlock.pathname := @'*/SYSTEM/TOOLS';
      GET_FILE_INFO(paramBlock);
      if toolErr <> 0 AND MountBootDisk = 1 then begin
        StartUpTools := false;
        Exit;
      end;
    UNTIL toolErr = 0;

    LoadTools(toolRec);
    CheckToolError($6);

    WindStartUp(MyMemoryID);
    CheckToolError($7);

    RefreshDesktop(nil);

    CtlStartUp(MyMemoryID, baseDP + DPForCtlMgr);
    CheckToolError($8);

    LEStartUp(baseDP + DPForLineEdit, MyMemoryID);
    CheckToolError($9);

    DialogStartUp(MyMemoryID);
    CheckToolError($A);

    MenuStartUp(MyMemoryID, baseDP + DPForMenuMgr);
    CheckToolError($B)

    DeskStartUp;
    CheckToolError($C);

    ShowPleaseWait;

    SFStartUp(MyMemoryID, baseDP + DPForStdFile);
    CheckToolError($D);
    SFAllCaps(true);

    QDAuxStartUp;
    CheckToolError($E);

    ListStartUp;
    CheckToolError($10);

    ScrapStartUp;
    CheckToolError($11);

    PMStartUp(MyMemoryID, baseDP + DPForPrintMgr);
    CheckToolError($12);

    HidePleaseWait;
    InitCursor;
  end; {StartUpTools}

PROCEDURE ShutDownTools;
  begin
    DeskShutDown;
    if WindStatus <> 0 then
      HideAllWindows;
    ListShutDown;
    FMShutDown;
    ScrapShutDown;
    PMShutDown;
    QDAuxShutDown;
    SFShutDown;
    MenuShutDown;
    DialogShutDown;
    LEShutDown;
    CtlShutDown;
    WindShutDown;
    EMShutDown;
    QDShutDown;
    MTShutDown;
    if MMStatus <> 0 then begin
      DisposeHandle(ToolsZeroPage);
      MMShutDown(MyMemoryID);
    end;
    TLShutDown;
  end;

PROCEDURE SetUpMenus;
  var height : integer; {TODO: is this needed?}
  begin
    SetMTitleStart(10);
    InsertMenu(NewMenu(@FontMenuStr[1]), 0);
    InsertMenu(NewMenu(@WindowMenuStr[1]), 0);
    InsertMenu(NewMenu(@EditMenuStr[1]), 0);
    InsertMenu(NewMenu(@FileMenuStr[1]), 0);
    InsertMenu(NewMenu(@AppleMenuStr[1]), 0);
    FixAppleMenu(AppleMenuID);
    height := FixMenuBar;
    DrawMenuBar;
  end;

BEGIN
    InitGlobals;
    if StartUpTools then begin
      SetUpDefault;
      SetUpMenus;
      SetUpWindows;
      MainEvent;
    end;

    ShutDownTools;
END.
    
Select Compile -> To Memory to run your program. You could also choose Compile -> To Disk to create a application file that can be run on any IIgs. The program should ask you to type your name, then repeat it back to you after you press enter. Pressing enter again will return you to Complete Pascal.

This program takes advantage of a Complete Pascal feature called 'textbook' programs. When you call the procedure Graphics(640) it automatically sets up a screen environment that you can print to and get input from like a standard console. This allows you to run examples from most Pascal textbooks. We won't be using the textbook environment much, but it's great for testing out small algorithms or prototyping ideas.

If you made it this far, you're ready to get started on programming for GS/OS. The rest of the tutorials in this series assume that you are already somewhat familiar with Pascal. If you're not, there are lots of great tutorials available online. A good place to start is Tao Yue's Pascal tutorials. Complete Pascal supports most common Pascal standards. I'll explicitly point out any code segments that are non-standard.