📄 moddtp.bas
字号:
Call WriteIOData(nSect)
'next sector
If AdvanceSector(Track, Side, Sector) = False Then EOFdisk = True
'Depth Scan (OUT)
If DepthScan = False Then oldNsec = mLightRead
Call DepthScanOut(IOResult, Sector)
'Check time
CurrentSec = SectorNumber(Track, Side, Sector)
Call DisplayTiming
ContinueRecover:
Loop
'Save FAT if marked bad
If MarkBad = True Then
Call WriteDiskDATA
MarkBad = False
End If
Call CloseIdFile
Call CloseDiskIO
If (mModWin = 0) Or (mModWin = 3) Then
Call DigitalINT(Central, 135, 41 + Central.PicCentral.Top - 21, CountSecCopy(), 2, 4)
End If
End Sub
'--------------------------------------------RecoverLoadDisk
Public Sub RecoverLoadDisk()
Dim CopyVal() As Long
Dim i As Long
Dim Track As Byte
Dim Side As Byte
Dim Sector As Byte
Dim IOResult As Long
Dim nSect As Long
Dim toCopy As Boolean
'Ensure no Data on destination
For i = 34 To 2880
If SectorInfo(i) = IOdata Then
i = MsgBox("Loading image with data on floppy disk." & Chr(13) & Chr(10) & "OK to continue?", vbExclamation Or vbOKCancel, "Error")
If i = vbCancel Then Exit Sub Else Exit For
End If
Next i
'Ensure valid file
i = OpenIdFile(mSaveName, "DTPRO-Saved Disk Image", 30)
If i = -2 Then
MsgBox "The file provided was not saved with DiskTest PRO.", vbExclamation Or vbOKOnly, "Error"
Call CloseIdFile
Exit Sub
End If
If i = -1 Then
MsgBox "Can't read the file provided.", vbExclamation Or vbOKOnly, "Error"
Call CloseIdFile
Exit Sub
End If
'Ensure compatibility - filesize
If isExpectedSize(31, 512, 0) = False Then
MsgBox "The disk image size is not compatible with a floppy disk sector.", vbExclamation Or vbOKOnly, "Error"
Call CloseIdFile
Exit Sub
End If
'Ensure compatibility - end position
If isExpectedSize(0, 0, 31 + 512 * 36 * Central.StartEnd.EndPosition) = False Then
MsgBox "The disk image size is not compatible" & Chr(13) & Chr(10) & "with the END cursor position.", vbExclamation Or vbOKOnly, "Error"
Call CloseIdFile
Exit Sub
End If
'Ensure compatibility - Bad sectors
CopyVal() = GetImageFAT()
For i = 34 To 2880
'Dest:Bad; Src:not Bad; "Only data" is off -> error
'Dest:Bad; Src:data -> error
If (SectorInfo(i) = IObad) And ((CopyVal(i) < &HFF0) Or (CopyVal(i) > &HFF7)) Then
If (mLightRecover(4) = False) Or (CopyVal(i) > 0) Then
MsgBox "The floppy disk has bad sectors where data should be. (Sector " & i & ")", vbExclamation Or vbOKOnly, "Error"
Call CloseIdFile
Exit Sub
End If
End If
Next i
'prepare
Track = Central.StartEnd.StartPosition - 1
Side = 0
Sector = 1
Call InitScan
mLightRead = 1
Call DisplayReadSlider
'Load
Do While (EOFdisk = False) And (mWork = 3)
Call DisplayPosition(Track, Side, Sector)
IOResult = 0
toCopy = True
'only data ON - empty or bad - jump
If mLightRecover(4) = True Then
For i = 1 To 18
nSect = SectorNumber(Track, Side, Sector + i - 1)
If (CopyVal(nSect) = 0) Or ((CopyVal(nSect) >= &HFF0) And (CopyVal(nSect) <= &HFF7)) Then
If Track > 1 Then toCopy = False
End If
Next i
End If
'read from image, write to floppy
If toCopy = True Then
Call ReadIOData(18)
Call DisplaySectors(Track, Side, Sector, statWrite)
DoEvents
IOResult = DiskIO(IOWriteDisk, IOFloppyA, 18, Track, Side, Sector)
'check/alter FAT
For i = 1 To 18
nSect = SectorNumber(Track, Side, Sector + i - 1)
If (mLightRecover(3) = False) And (SectorInfo(nSect) = IOempty) And (CopyVal(nSect) >= &HFF0) And (CopyVal(nSect) <= &HFF7) Then
'do nothing = do not mark bad
Else
SectorVal(nSect) = CopyVal(nSect)
Call DisplaySectorInside(GetSecType(Track, Side, i), Track, Side, i)
End If
Next i
End If
'set sector status
Call SetSectorStatus(Track, Side, Sector, 18, IOResult)
DoEvents
'next sector
If AdvanceSector(Track, Side, Sector) = False Then EOFdisk = True
'Check time
CurrentSec = SectorNumber(Track, Side, Sector)
Call DisplayTiming
ContinueRecover:
Loop
Call WriteDiskDATA
Call CloseIdFile
Call CloseDiskIO
End Sub
'---------------------------------------------FormatFullDisk
Public Sub FormatFullDisk()
Dim i As Long
Dim Track As Byte
Dim Side As Byte
Dim IOResult As Long
Dim Bad As Long, Good As Long, Avail As Long, Percent As Long
Dim Y As Long
If (TestDiskChange = True) Then Call ClearDiskData
If TestDiskReady = False Then
mWork = 0
Exit Sub
End If
'prepare
Track = Central.StartEnd.StartPosition - 1
Side = 0
Call InitScan
mLightRead = 1
Call DisplayReadSlider
'Format Full
Do While (EOFdisk = False) And (mWork = 2)
Call DisplayPosition(Track, Side, 1)
If JumpBad(Track, Side, 1, mLightFormat(4)) = False Then
IOResult = 0
Call DisplaySectors(Track, Side, 1, statWrite)
DoEvents
'format
IOResult = FormatTrack(IOFloppyA, Track, Side, mLightFormat(3))
'set sector status
Call SetSectorStatus(Track, Side, 1, 18, IOResult)
'Mark Bad reservation
If (IOResult <> 0) And (mLightFormat(3) = True) Then Call MarkBadReservation(Track, Side, 1, 18)
End If
If (mModWin = 0) Or (mModWin = 3) Then
Y = Central.PicCentral.Top - 21
Call CountSectors(Bad, Good, Avail, Percent)
Call DigitalINT(Central, 135, 42 + Y, Bad, 2, 4)
Call DigitalINT(Central, 135, 57 + Y, Good, 2, 4)
Call DigitalINT(Central, 169, 79 + Y, Avail, 2, 7)
Call DigitalText(127, 79 + Y, Str03(Percent), 3)
End If
DoEvents
'next sector
If AdvanceSector(Track, Side, 1) = False Then EOFdisk = True
'Check time
CurrentSec = SectorNumber(Track, Side, 1)
Call DisplayTiming
ContinueScan:
Loop
'Save FAT
Call WriteDiskDATA
MarkBad = False
Call CloseDiskIO
Call DiskSystemReset
End Sub
'--------------------------------------------FormatQuickDisk
Public Sub FormatQuickDisk()
Dim i As Long, j As Long
Dim IOResult As Long
Dim Bad As Long, Good As Long, Avail As Long, Percent As Long
Dim Y As Long
Call InitScan
Call WriteBootSector
For i = 0 To 4607: IOdados(i) = 0: Next i
For i = 34 To 2880
If SectorInfo(i) <> IObad Then
SectorInfo(i) = IOempty
SectorVal(i) = 0
End If
If (SectorInfo(i) = IObad) And (mLightFormat(3) = False) Then
SectorInfo(i) = IOempty
SectorVal(i) = 0
End If
Next i
Call WriteDiskDATA
For i = 0 To 3583: IOdados(i) = 0: Next i
Call DiskIO(IOWriteDisk, IOFloppyA, 7, 0, 1, 2)
Call DiskIO(IOWriteDisk, IOFloppyA, 7, 0, 1, 9)
Call CloseDiskIO
If (mModWin = 1) Or (mModWin = 2) Then Exit Sub
Y = Central.PicCentral.Top - 21
Call CountSectors(Bad, Good, Avail, Percent)
Call DigitalINT(Central, 135, 42 + Y, Bad, 2, 4)
Call DigitalINT(Central, 135, 57 + Y, Good, 2, 4)
Call DigitalINT(Central, 169, 79 + Y, Avail, 2, 7)
Call DigitalText(127, 79 + Y, Str03(Percent), 3)
End Sub
'---------------------------------------------------EditDisk
Public Sub EditDisk(ByVal Operation As EditOperation)
Dim i As Long
Dim IOResult As Long
Dim oldRead As Byte
If Editting = True Then Exit Sub
Editting = True
Select Case Operation
Case eoInit:
For i = 1 To 2880: SectorStat(i) = statNormal: Next i
Call DisplaySurface
Central.TimedWave1.Clear
Call InitializeDiskIO
EditTrack = Central.StartEnd.StartPosition - 1
EditSide = 0
EditSector = 1
Call DisplaySectors(EditTrack, EditSide, EditSector, statEdit)
DoEvents
Central.EditTimer.Enabled = True
Case eoFormat:
mLightEdit(6) = True
Call DisplayEditOpLight
oldRead = mLightRead
mLightRead = 1
Call DisplaySectors(EditTrack, EditSide, 1, statWrite)
DoEvents
IOResult = FormatTrack(IOFloppyA, EditTrack, EditSide, mLightEdit(1))
Call SetSectorStatus(EditTrack, EditSide, 1, 18, IOResult)
If (IOResult <> 0) And (mLightEdit(1) = True) Then Call MarkBadReservation(EditTrack, EditSide, 1, 18)
Call DisplayEditValues
mLightRead = oldRead
mLightEdit(6) = False
Call DisplayEditOpLight
Call DisplaySectors(EditTrack, EditSide, EditSector, statEdit)
Case eoOverwrite:
mLightEdit(7) = True
Call DisplayEditOpLight
Call DisplaySectors(EditTrack, EditSide, EditSector, statWrite)
DoEvents
Call SetDiskSystemSectorData(EditTrack, EditSide, EditSector, NumSectors(), mLightEdit(1))
i = SectorNumber(EditTrack, EditSide, EditSector)
If i = 1 Then IOResult = DiskIO(IOWriteDisk, IOFloppyA, 1, EditTrack, EditSide, EditSector)
If i > 18 Then IOResult = DiskIO(IOWriteDisk, IOFloppyA, NumSectors(), EditTrack, EditSide, EditSector)
Call SetSectorStatus(EditTrack, EditSide, EditSector, NumSectors(), IOResult)
If (IOResult <> 0) And (mLightEdit(1) = True) Then Call MarkBadReservation(EditTrack, EditSide, EditSector, NumSectors())
Call DisplayEditValues
mLightEdit(7) = False
Call DisplayEditOpLight
Call DisplaySectors(EditTrack, EditSide, EditSector, statEdit)
Case eoMarkBad:
mLightEdit(8) = True
Call DisplayEditOpLight
DoEvents
Call MarkBadReservation(EditTrack, EditSide, EditSector, NumSectors())
Call DisplayEditValues
mLightEdit(8) = False
Call DisplayEditOpLight
Call DisplaySectors(EditTrack, EditSide, EditSector, statEdit)
Case eoUnmark:
mLightEdit(9) = True
Call DisplayEditOpLight
DoEvents
Call UnMarkBadReservation(EditTrack, EditSide, EditSector, NumSectors())
Call DisplayEditValues
mLightEdit(9) = False
Call DisplayEditOpLight
Call DisplaySectors(EditTrack, EditSide, EditSector, statEdit)
Case eoReading:
IOResult = 0
For i = 1 To 9216: IOdados(i) = &HF6: Next i
If mLightEdit(3) = True Then
Call DisplaySectors(EditTrack, EditSide, EditSector, statRead)
DoEvents
IOResult = DiskIO(IOReadDisk, IOFloppyA, NumSectors(), EditTrack, EditSide, EditSector)
If (IOResult = 0) And (mLightEdit(2) = True) Then Call AutoCopy(EditTrack, EditSide, EditSector, NumSectors())
End If
If mLightEdit(4) = True Then
If ((IOResult = 0) And (mLightEdit(3) = True)) Or _
(GetSideTrackInside(EditTrack, EditSide, EditSector) = IOempty) Or _
(GetSideTrackInside(EditTrack, EditSide, EditSector) = IObad) Then
Call DisplaySectors(EditTrack, EditSide, EditSector, statWrite)
DoEvents
IOResult = DiskIO(IOWriteDisk, IOFloppyA, NumSectors(), EditTrack, EditSide, EditSector)
End If
End If
If (IOResult = 0) And (mLightEdit(5) = True) Then
Call DisplaySectors(EditTrack, EditSide, EditSector, statVerify)
DoEvents
IOResult = DiskIO(IOVerifyDisk, IOFloppyA, NumSectors(), EditTrack, EditSide, EditSector)
End If
If (IOResult <> 0) And (mLightEdit(1) = True) Then Call MarkBadReservation(EditTrack, EditSide, EditSector, NumSectors())
If (mLightEdit(3) = True) Or (mLightEdit(4) = True) Or (mLightEdit(5) = True) Then
Call SetSectorStatus(EditTrack, EditSide, EditSector, NumSectors(), IOResult)
Call DisplaySectors(EditTrack, EditSide, EditSector, statEdit)
Call DisplayEditValues
End If
Case eoMove:
Call DisplayPosition(EditTrack, EditSide, EditSector)
Call DisplaySectors(EditTrack, EditSide, EditSector, statEdit)
DoEvents
Case eoResetPos:
i = NumSectors()
Select Case i
Case 18: EditSector = 1
Case 9: If EditSector + 4 >= 10 Then EditSector = 10 Else EditSector = 1
Case 3: EditSector = 1 + ((EditSector - 1) \ 3) * 3
End Select
Call DisplayPosition(EditTrack, EditSide, EditSector)
Case eoEndEdit:
Central.EditTimer.Enabled = False
If MarkBad = True Then
Call WriteDiskDATA
MarkBad = False
End If
Call CloseDiskIO
Call ReloadDisk
End Select
Editting = False
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -