þa‹RþwQþ mU9þhý oPþ nSystem-wide$NOLIST $COMPACT (-CONST IN CODE-) MODULE Main; $INCLUDE (``incs`Common.Inc~Text~) $INCLUDE (``Incs`Keys.Inc~Text~) $INCLUDE (``Incs`ConPas.Inc~Text~) $INCLUDE (``Incs`MessageTypes.Inc~Text~) $INCLUDE (``Incs`MenuFormTypes.Inc~Text~) $INCLUDE (``Incs`TableEditTypes.Inc~Text~) $INCLUDE (``Incs`OsPasTypes.Inc~Text~) $INCLUDE (``Incs`OsPasProcs.Inc~Text~) $INCLUDE (``Incs`FieldTypes.Inc~Text~) $INCLUDE (``Incs`FieldProcs.Inc~Text~) $INCLUDE (``Incs`ByteProcs.Inc~Text~) $INCLUDE (``Incs`StringTypes.Inc~Text~) $INCLUDE (``Incs`StringProcs.Inc~Text~) $INCLUDE (``Incs`WindowTypes.Inc~Text~) $INCLUDE (``Incs`WindowProcs.Inc~Text~) $INCLUDE (``Incs`VolumeName.Inc~Text~) $INCLUDE (Interface.Inc~Text~) PUBLIC Elsewhere; CONST compassScreenLoc = 400000h; TYPE ScreenInfoType = RECORD xPixels: WORD; yPixels: WORD; pScreen: LONGINT; bitsPerPel: BYTE; yAspect: WORD; END; PROCEDURE OsUpdateDeviceList; PROCEDURE CpScreenInfo (VAR screenInfo: ScreenInfoType); PROGRAM Main; $EJ VAR formatDone: BOOLEAN; ch: Char; done: BOOLEAN; finalTrack: Word; finalPage: Word; menuChoice: MenuChoiceType; numReprogrammable: Word; status: Word; FUNCTION IsEsc (ch: Char): Boolean; BEGIN IsEsc := (ORD (ch) IN [helpKey, quitKey, cancelKey, escapeKey]); END; FUNCTION DetermineSystemType: SystemType; TYPE PartType = ARRAY [1..1] OF WORD; VAR partPtr: RECORD CASE BOOLEAN OF TRUE: (ptr: ^PartType); FALSE: (offset: WORD; segment: WORD); END; screenInfo: ScreenInfoType; BEGIN CpScreenInfo (screenInfo); IF (screenInfo.pScreen = compassScreenLoc) THEN DetermineSystemType := Compass ELSE BEGIN partPtr.offset := 0; partPtr.segment := 0FDFDh; IF partPtr.ptr^[7] = 2d2dh THEN DetermineSystemType := Hornet ELSE DetermineSystemType := IBMPc; END; END; $EJ PROCEDURE AddToDeviceList (VAR media: MediaPtr; name: ShortStringPtr; SDT: SDTPtr; drive: BYTE; offset: LongInt; numPages: WORD; repgmAble:BOOLEAN; removable:BOOLEAN); VAR element: MediaPtr; cur: MediaPtr; strName: StringPtr; romName: StringPtr; BEGIN strName := NewString (name^.length); MoveBytes (name^, strName^.dummy, name^.length + 1); strName^.len := strName^.dummy; romName := NewStringLit ('Read Only Memory'); IF NOT EqualStrings (romName, strName) THEN BEGIN New (element); element^.next := NIL; IF media = NIL THEN media := element ELSE BEGIN cur := media; WHILE cur^.next <> NIL DO cur := cur^.next; cur^.next := element; END; element^.drive := drive; element^.repgmAble := repgmAble; element^.removable := removable; WITH element^ DO BEGIN volOffset := offset; volLength := numPages; entryPoint := SDT^.entrypoint; intAddr := SDT^.intAddr; devName := strName; END; numMedia := numMedia + 1; END; FreeString (romName); END; $EJ PROCEDURE SetMedia (VAR media: MediaPtr; VAR defaultMedium: WORD; VAR status: WORD); VAR done: BOOLEAN; testMedium: WORD; curMedia: MediaPtr; BEGIN numMedia := 0; media := GetLocalMedia (status); defaultMedium := 1; { the first medium, probably reprogrammable } testMedium := 1; curMedia := media; done := FALSE; WHILE NOT done DO BEGIN IF testMedium >= numMedia THEN done := TRUE; IF curMedia^.repgmAble THEN BEGIN defaultMedium := testMedium; done := TRUE; END; IF NOT done THEN BEGIN testMedium := testMedium + 1; curMedia := curMedia^.next; END; END; END; PROCEDURE MessageIfNoMedia; BEGIN IF numMedia = 0 THEN BEGIN Message (mCopyright); Message (mVersion); Message (mNoMedia); Message (mConfirmExit); ch := ConCharIn; OSExit (0); END; END; $EJ FUNCTION HardFormatted : BOOLEAN; VAR error: WORD; BEGIN error := 0; IF pMediaToFormat^.volOffset = 0 THEN BEGIN RemoveMessages; Message (mHard); HardFormatDrive (error); END; RemoveMessages; IF ErrorDisplayed (error) THEN BEGIN Message (mIncomplete); ch := ConCharIn; { Either error or completion message } IF (ch <> CHR(quitKey)) AND (ch <> CHR(cancelKey)) THEN ch := CHR(0); RemoveMessages; WinEraseWindow; HardFormatted := FALSE; END ELSE HardFormatted := TRUE; END; $EJ PROCEDURE SoftFormat (VAR ch: CHAR); VAR createDate: TimeType; hasName: BOOLEAN; error: WORD; ignore: WORD; BEGIN RemoveMessages; Message (mSoft); SoftFormatDrive (ch, error); IF error = okCode THEN BEGIN RemoveMessages; Message (mUpdateDevs); { Do this for devices which may not have been known to the system before they were formatted, such as new partitions. } IF NOT removableMedia THEN OsUpdateDeviceList; PutNewVolumeNameInList; { Setting zero length names doesn't fill in the generic name until we call UpdateDeviceList. SetVolumeName should do this } IF NOT removableMedia THEN OsUpdateDeviceList; { Should dispose old Media } SetMedia (media, mediumToFormat, ignore); END; RemoveMessages; IF ErrorDisplayed (error) THEN Message (mIncomplete) ELSE Message (mComplete); ch := ConCharIn; { Either error or completion message } IF (ch <> CHR(quitKey)) AND (ch <> CHR(cancelKey)) THEN ch := CHR(0); RemoveMessages; WinEraseWindow; END; { Attaching the generic device name puts the volume name in that device list } PROCEDURE PutNewVolumeNameInList; VAR name: StringPtr; conn, password, error, ignore: WORD; BEGIN name := ConcatStrings (CopyOfString (deviceName), NewStringLit ('|GRiDiRG')); name^.dummy := name^.len; password := 0; conn := OSAttach (name^.dummy, newFileMode, password, updateAccess, error); FreeString (name); OSDetach (conn, ignore); END; $EJ PROCEDURE SetMediaToFormat; VAR curChoice: INTEGER; BEGIN curChoice := 1; pMediaToFormat := media; WHILE curChoice < mediumToFormat DO BEGIN curChoice := curChoice + 1; pMediaToFormat := pMediaToFormat^.next; END; removableMedia := ThisDeviceIsRemovable (pMediaToFormat^.devName); END; FUNCTION MediumInited : BOOLEAN; VAR deviceStr: StringPtr; oldName: StringPtr; error: WORD; created: TimeType; hasName: BOOLEAN; BEGIN Message (mInit); IF removableMedia THEN BEGIN { Remove old volume name from the list } oldName := GetVolumeName (deviceName, created, hasName, error); IF error = okCode THEN BEGIN oldName^.dummy := oldName^.len; OSRemoveDevice (oldName^.dummy, error); END; END; InitDrive (error, finalTrack); MediumInited := NOT ErrorDisplayed (error); END; PROCEDURE FormatQueries; BEGIN IF DeviceSelected (ch) THEN BEGIN SetMediaToFormat; IF VolumeNameFilledIn (ch) THEN IF EraseBigDevice (ch) THEN IF EraseAllFiles (ch) THEN IF MediumInited THEN IF HardFormatted THEN SoftFormat (ch); END; END; $EJ BEGIN OsHandleCancel (FALSE); ConDefCsr (FALSE); formatDone := FALSE; WinInitDefaultWindow; InitMessageModule; bootSystem := DetermineSystemType; Message (mDevices); needCopyrightMsg := TRUE; SetMedia (media, mediumToFormat, status); IF ErrorDisplayed (status) THEN numMedia := 0; ch := CHR (helpKey); FldStartKeys (cursor); REPEAT MessageIfNoMedia; done := (numMedia = 0); IF NOT done THEN BEGIN IF ch = CHR(quitKey) THEN BEGIN RemoveMessages; Message (mQuit); ch := ConCharIn; done := ch = CHR(confirmKey); END ELSE IF ch = CHR(cancelKey) THEN BEGIN RemoveMessages; Message (mCancel); ch := ConCharIn; done := ch = CHR(confirmKey); END ELSE IF MenuChoiceConfirmed (menuChoice, ch) THEN IF menuChoice = doFormat THEN FormatQueries; END; UNTIL done; END.