⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 moddtp.bas

📁 这个代码是基于软盘修复
💻 BAS
📖 第 1 页 / 共 3 页
字号:
    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 + -