-- DiskDebugImpl.mesa -- Jim Gasbarro 9-Apr-84 10:25:48 DIRECTORY ColorVersatecDriver, ColorVersatecUtils, DicentraDiskDriver, OthelloDefs, Watchdog USING [Deactivate]; DiskDebugImpl: PROGRAM IMPORTS ColorVersatecDriver, ColorVersatecUtils, DicentraDiskDriver, OthelloDefs, Watchdog = BEGIN OPEN ColorVersatecDriver, ColorVersatecUtils, DicentraDiskDriver, OthelloDefs; GoToDebugger: SIGNAL = CODE; StripeBand: PROC [stripeOffset: CARDINAL, hyperOffset: LONG CARDINAL] = BEGIN buffer: ARRAY [0..wordsPerScan) OF CARDINAL; p: POINTER ← @buffer; FOR i: CARDINAL IN [0..wordsPerScan) DO IF i MOD 4 = stripeOffset THEN buffer[i] ← 0F0FFH ELSE buffer[i] ← 0; ENDLOOP; FOR i: LONG CARDINAL IN [0..scansPerBand) DO HyperStore[sourcePtr: p, destOffset: hyperOffset + (i * LENGTH[buffer]), wordCount: LENGTH[buffer]]; ENDLOOP; END; SetupBand: PROC [value: CARDINAL, hyperOffset: LONG CARDINAL] = BEGIN buffer: ARRAY [0..wordsPerScan) OF CARDINAL; p: POINTER ← @buffer; FOR i: CARDINAL IN [0..wordsPerScan) DO buffer[i] ← value; ENDLOOP; FOR i: LONG CARDINAL IN [0..scansPerBand) DO HyperStore[sourcePtr: p, destOffset: hyperOffset + (i * LENGTH[buffer]), wordCount: LENGTH[buffer]]; ENDLOOP; END; CheckBand: PROC [stripeOffset: CARDINAL, hyperOffset: LONG CARDINAL] = BEGIN buffer: ARRAY [0..wordsPerScan) OF CARDINAL; p: POINTER ← @buffer; FOR i: LONG CARDINAL IN [0..scansPerBand) DO HyperRead[destPtr: p, sourceOffset: hyperOffset + (i * LENGTH[buffer]), wordCount: LENGTH[buffer]]; FOR j: CARDINAL IN [0..wordsPerScan) DO IF j MOD 4 = stripeOffset THEN BEGIN IF buffer[j] # 0F0FFH THEN BEGIN OthelloDefs.WriteString["scan: "]; OthelloDefs.WriteLongNumber[i]; OthelloDefs.WriteString[" word: "]; OthelloDefs.WriteLongNumber[j]; OthelloDefs.WriteString[" expected: 170377 got: "]; OthelloDefs.WriteOctal[buffer[j]]; OthelloDefs.NewLine[]; END END ELSE IF buffer[j] # 0 THEN BEGIN OthelloDefs.WriteString["scan: "]; OthelloDefs.WriteLongNumber[i]; OthelloDefs.WriteString[" word: "]; OthelloDefs.WriteLongNumber[j]; OthelloDefs.WriteString[" expected: 0 got: "]; OthelloDefs.WriteOctal[buffer[j]]; OthelloDefs.NewLine[]; END ENDLOOP; ENDLOOP; END; ReadBand: PROC [cylinder: Cylinder] = BEGIN FOR i: LONG CARDINAL IN [0..sectorsPerBand) DO [] ← Read[head: CARDINAL[i / sectorsPerTrack], sector: CARDINAL[i MOD sectorsPerTrack], cylinder: cylinder, sectorCount: 1, cmdOffset: 32, dataOffset: 64 + (i * wordsPerSector)]; ENDLOOP; END; WriteBand: PROC [cylinder: Cylinder] = BEGIN FOR i: LONG CARDINAL IN [0..sectorsPerBand) DO [] ← Write[head: CARDINAL[i / sectorsPerTrack], sector: CARDINAL[i MOD sectorsPerTrack], cylinder: cylinder, sectorCount: 1, cmdOffset: 32, dataOffset: 64 + (i * wordsPerSector)]; ENDLOOP; END; BandTest: PROC [] = BEGIN DiskInitialCheckout[]; ShowMP[1000]; StripeBand[stripeOffset: 0, hyperOffset: 64]; ShowMP[2000]; OthelloDefs.WriteLine["Checking band before disk write..."]; CheckBand[stripeOffset: 0, hyperOffset: 64]; [] ← Write[head: 0, sector: 0, cylinder: 0, sectorCount: sectorsPerBand, cmdOffset: 32, dataOffset: 64]; ShowMP[3000]; SetupBand[value: 52525B, hyperOffset: 64]; [] ← Read[head: 0, sector: 0, cylinder: 0, sectorCount: sectorsPerBand, cmdOffset: 32, dataOffset: 64]; ShowMP[4000]; OthelloDefs.WriteLine["Checking band after disk read..."]; CheckBand[stripeOffset: 0, hyperOffset: 64]; OthelloDefs.WriteLine["Done."]; END; DiskToPlotterTest: PROC [] = BEGIN VersatecInitialCheckout[]; DiskInitialCheckout[]; ShowMP[1000]; StripeBand[stripeOffset: 0, hyperOffset: 64]; [] ← Write[head: 0, sector: 0, cylinder: 0, sectorCount: sectorsPerBand, cmdOffset: 32, dataOffset: 64]; StripeBand[stripeOffset: 1, hyperOffset: 64]; [] ← Write[head: 0, sector: 0, cylinder: 200, sectorCount: sectorsPerBand, cmdOffset: 32, dataOffset: 64]; StripeBand[stripeOffset: 2, hyperOffset: 64]; [] ← Write[head: 0, sector: 0, cylinder: 400, sectorCount: sectorsPerBand, cmdOffset: 32, dataOffset: 64]; StripeBand[stripeOffset: 3, hyperOffset: 64]; [] ← Write[head: 0, sector: 0, cylinder: 600, sectorCount: sectorsPerBand, cmdOffset: 32, dataOffset: 64]; ShowMP[2000]; [] ← Read[head: 0, sector: 0, cylinder: 0, sectorCount: sectorsPerBand, cmdOffset: 32, dataOffset: 64]; ShowMP[2001]; SetColorMode[inches: 10, mode: FirstPassOfColor, color: Black, cmdOffset: 0]; ShowMP[2002]; PlotBuffer[wordCount: wordsPerBand, hyperOffset: 64]; ShowMP[2003]; Rewind[cmdOffset: 0]; ShowMP[3000]; [] ← Read[head: 0, sector: 0, cylinder: 200, sectorCount: sectorsPerBand, cmdOffset: 32, dataOffset: 64]; ShowMP[3001]; SetColorMode[inches: 10, mode: IntermediatePassOfColor, color: Cyan, cmdOffset: 0]; ShowMP[3002]; PlotBuffer[wordCount: wordsPerBand, hyperOffset: 64]; ShowMP[3003]; Rewind[cmdOffset: 0]; ShowMP[4000]; [] ← Read[head: 0, sector: 0, cylinder: 400, sectorCount: sectorsPerBand, cmdOffset: 32, dataOffset: 64]; ShowMP[4001]; SetColorMode[inches: 10, mode: IntermediatePassOfColor, color: Magenta, cmdOffset: 0]; ShowMP[4002]; PlotBuffer[wordCount: wordsPerBand, hyperOffset: 64]; ShowMP[4003]; Rewind[cmdOffset: 0]; ShowMP[5000]; [] ← Read[head: 0, sector: 0, cylinder: 600, sectorCount: sectorsPerBand, cmdOffset: 32, dataOffset: 64]; ShowMP[5001]; SetColorMode[inches: 10, mode: IntermediatePassOfColor, color: Yellow, cmdOffset: 0]; ShowMP[5002]; PlotBuffer[wordCount: wordsPerBand, hyperOffset: 64]; ShowMP[5003]; SendEOT[]; END; FormatDisk: PROC [] = BEGIN c: CHAR; OthelloDefs.WriteString["Are you sure [Y/N]? "]; c ← OthelloDefs.ReadChar[]; OthelloDefs.WriteChar[c]; OthelloDefs.NewLine[]; IF c # 'y AND c # 'Y THEN RETURN[]; [] ← RawFormat[cmdOffset: 32]; END; OthelloDefs.WriteLine["What's up doc?"]; Watchdog.Deactivate[]; DO c: CHAR; OthelloDefs.WriteString["BandTest, RWTest, Seek, Plot, Format, Debugger> "]; c ← OthelloDefs.ReadChar[]; OthelloDefs.WriteChar[c]; OthelloDefs.NewLine[]; SELECT c FROM 'B, 'b => BandTest[]; 'R, 'r => ReadWriteTest[]; 'S, 's => SeekTest[]; 'P, 'p => DiskToPlotterTest[]; 'F, 'f => FormatDisk[]; 'D, 'd => SIGNAL GoToDebugger[]; ENDCASE => OthelloDefs.WriteLine["Learn to type you moron."]; ENDLOOP; END.