Home » Archimedes archive » Zipped Apps » Speech » !Dup/Dup

!Dup/Dup

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » Archimedes archive » Zipped Apps » Speech
Filename: !Dup/Dup
Read OK:
File size: E7C1 bytes
Load address: 0000
Exec address: 0000
File contents
   10REM >Dup
   20
   30*|*********************************************
   40*|*                                          **
   50*|*  DUP, the disc duplicator  (c) Softcorn  **
   60*|*                 -                        **
   70*|*  Public Domain software, but not for use **
   80*|*   or sale related to profit.             **
   90*|*                 -                        **
  100*|*  Copies double or single density discs   **
  110*|*  of 'any' format (eg ADFS L/D/E, DFS,    **
  120*|*  MSDOS, ATARI ST, AMIGA etc, and a wide  **
  130*|*  variety of protected discs)             **
  180*|*                 -                        **
  190*|*  BASIC + machine code + data file        **
  200*|*       (Edit at your peril)               **
  210*|*                                          **
  220*|*********************************************
  230
  240vers$="1.01"
  250
  251ON ERROR IF ERR=17 THEN PRINT:END ELSE REPORT:PRINT" at Line ";ERL:END
  260PROClogo
  270PROCinit
  280
  290debug=FALSE
  300
  310REM set,to check all tracks have a fixed number of good contiguous sects
  320checkFormat=FALSE
  330chkDensity%=DDensity%
  340chkSectsPerTrk=9
  350IF checkFormat THEN
  360  PRINT"**** Checking Sectors per Track =";chkSectsPerTrk;" ****"
  370ENDIF
  380
  390REPEAT
  400  PROCmenu(copydisc,source,dest,srttrack,endtrack,firstHead,numbHeads)
  410  analyse=debug OR NOT copydisc
  420  PROCaction(source,dest,srttrack,endtrack,firstHead,numbHeads)
  430  PRINT'"     Completed:-   Press SPACE to Continue (or escape to exit)";
  440  PROCpressspace
  450UNTIL FALSE
  460END
  470
  480
  490DEFPROCaction(source,dest,srttrack,endtrack,firstHead,numbHeads)
  500blank%=FALSE
  510srtDensity%=DDensity%
  520MaxDiscTrks% =INT(MaxTrks%/numbHeads)
  530firstTrk%=srttrack
  540TrksLeft%=1+endtrack-srttrack
  550WHILE TrksLeft% > 0
  560  IF TrksLeft% > MaxDiscTrks% THEN
  570    numbTrks%=MaxDiscTrks%
  580  ELSE
  590    numbTrks%=TrksLeft%
  600  ENDIF
  610  PROCcopyMultiTrks(source,dest,firstTrk%,numbTrks%,firstHead,numbHeads,srtDensity%)
  620  firstTrk% +=numbTrks%
  630  TrksLeft% -=numbTrks%
  640ENDWHILE
  650ENDPROC
  660
  670DEFPROCcopyMultiTrks(source,dest,firstTrk%,numbTrks%,firstHead,numbHeads, RETURN srtDensity%)
  680LOCAL T%
  690PROCcheckDiscIn("SOURCE")
  700IF (firstTrk% = srttrack) OR ((source=dest) AND copydisc) THEN
  710  PROCengageDisc(source)
  720ENDIF
  730PROCdoMultiTrks(Read%, source, firstTrk%, numbTrks%, firstHead, numbHeads, srtDensity%)
  740IF copydisc THEN
  750  PROCcheckDiscIn("DESTINATION")
  760  IF (firstTrk% = srttrack) OR (source=dest) THEN
  770    PROCengageDisc(dest)
  780  ENDIF
  790  PROCdoMultiTrks(Write%, dest, firstTrk%, numbTrks%, firstHead,numbHeads, srtDensity%)
  800ENDIF
  810ENDPROC
  820
  830DEFPROCdoMultiTrks(cmd%, drv, firstTrk%, numbTrks%, firstHead, numbHeads, RETURN srtDensity%)
  840LOCAL TrkDesc%, trk, head
  850TrkDesc%=MainBuffer%
  860FOR trk=firstTrk% TO (firstTrk% + numbTrks% -1)
  870  FOR head=firstHead TO (firstHead + numbHeads -1)
  880    PRINTTAB(0,VPOS);
  890    IF cmd%=Read% THEN PRINT "Read "; ELSE PRINT "Write";
  900    PRINT;": Drv=";drv;" Trk=";trk;"   ";TAB(21,VPOS);"Hd=";head;"   ";
  910    IF debug THEN PRINT
  920    IF cmd%=Read% THEN
  930      PROCreadSingleTrk(drv, trk, head, TrkDesc%, srtDensity%)
  940    ELSE
  950      PROCwriteSingleTrk(drv, trk, head, TrkDesc%)
  960    ENDIF
  970    TrkDesc% += TrkDescSize% + TrkDataSize%
  980  NEXT
  990NEXT
 1000ENDPROC
 1010
 1020DEFPROCwriteSingleTrk(drv%, trk%, head%, TrkDesc%)
 1030LOCAL count%, density%, DataBuf%, multiSectFlg%, sectInfo%
 1040LOCAL lowSect%, sectSize%, sect%, sectFound%, add%, ID%, mustWrSect%
 1050count% = TrkDesc%?bufNumbSect%
 1060density%= TrkDesc%?bufTrkDensity%
 1070DataBuf% = TrkDesc% + TrkDescSize%
 1080IF count%=0 THEN
 1090  REM blank track so just copy back ReadTrack data
 1100  PROCwritetrackChk(drv%, trk%, head%, density%, DataBuf%)
 1110ELSE
 1120  PROCmakeWriteTrk(TrkDesc%, count%, density%, DataBuf%, WriteTrkBuf%,mustWrsect%)
 1130  PROCwritetrackChk(drv%, trk%, head%, density%, WriteTrkBuf%)
 1140  multiSectFlg%= TrkDesc%?bufMultiSectFlg%
 1150  IF multiSectFlg% AND mustWrsect% THEN
 1160    REM write track in one go by using memory DMA list
 1170    REM but only if a sector could not be written during Format
 1180    lowSect%=TrkDesc%?bufLowSect%
 1190    sectSize%=TrkDesc%?bufSectSize%
 1200    PROCcopyMemAddList(TrkDesc%, count%)
 1210    PROCopsectors(Write% OR (1<<5),drv%,trk%,head%,lowSect%,count%,sectSize%,density%,memAddList%)
 1220    IF result% <> 0 THEN
 1230      multiSectFlg%=FALSE :REM Disc error
 1240      PRINT"  writing:- track was non-standard  after all"
 1250    ENDIF
 1260  ENDIF
 1270  IF (multiSectFlg%=0) AND mustWrsect%  THEN
 1280    REM catch all non-standard track formats, but only if a good
 1290    REM  sector could not be written during Format
 1300    IF (multiSectFlg%=0) AND analyse THEN
 1310      PRINT"  writing:- non-standard track layout"
 1320    ENDIF
 1330    FOR sectFound%= 0 TO count%-1
 1340      sectInfo%=FNgetSectInfo(TrkDesc%, sectFound%)
 1350      IF (sectInfo% AND (NOT overIndex%))=0 THEN
 1360        REM if data area was read OK (& don't have any illegal IDs)
 1370        REM and it was not deleted data, then provided data area
 1380        REM  has not already been correctly written with writetrack,
 1390        REM write the sector individually
 1400        add%=FNgetDataPtr(TrkDesc%, sectFound%)
 1410        ID%=FNgetSectID(TrkDesc%, sectFound%)
 1420        sect%=&FF AND (ID% >> 16)
 1430        sectSize%=3 AND (ID% >> 24)
 1440        PROCwritesectors(drv%,trk%,head%,sect%,1,sectSize%,density%,add%)
 1450      ENDIF
 1460    NEXT
 1470  ENDIF
 1480ENDIF
 1490ENDPROC
 1500
 1510  REM make Write Track data using Track descriptor and Read Track (the
 1520  REM  latter having been overlaid with correct read sector data.
 1530  REM But ensure no illegal chrs appear in gaps or data area
 1540  REM Output message if data area can't be recreated
 1550DEFPROCmakeWriteTrk(TrkDesc%, count%, density%, ReadBuf%, WriteTrkBuf%, RETURN mustWrSect%)
 1560LOCAL sectFound%, sectSize%, SrcAdd%, SrcLowAdd%, DestAdd%, DestLowAdd%
 1570LOCAL convert%, info%
 1580mustWrSect%=FALSE
 1590DestLowAdd%=WriteTrkBuf%
 1600SrcLowAdd%=ReadBuf%
 1610FOR sectFound%=0 TO count%-1
 1620  SrcAdd%=FNgetIDPtr(TrkDesc%, sectFound%)
 1630  DestAdd%=DestLowAdd%+SrcAdd%-SrcLowAdd%
 1640  info%=FNgetSectInfo(TrkDesc%,sectFound%)
 1650  REM ID's AM & prior gap
 1660  PROCmakeAMandgap( SrcLowAdd%, SrcAdd%, DestLowAdd%, DestAdd%, density%)
 1670  DestAdd%!0  = FNgetSectID(TrkDesc%,sectFound%)    :REM copy ID
 1680  IF (info% AND errNotFound%) =0 THEN
 1690    DestAdd%?4  = &F7            :REM to generate CRC
 1700    DestLowAdd%= DestAdd%+5      :REM byte after CRC
 1710  ELSE
 1720    REM but if sector not found then copy readtrack CRC instead
 1730    DestAdd%?4 = SrcAdd%?4
 1740    DestAdd%?5 = SrcAdd%?5
 1750    DestLowAdd%= DestAdd%+6      :REM byte after CRC
 1760  ENDIF
 1770  SrcLowAdd% = SrcAdd%+6       :REM point first byte after CRC
 1780  SrcAdd%=FNgetDataPtr(TrkDesc%, sectFound%)
 1790  IF SrcAdd%<>0 THEN
 1800    REM if data area
 1810    DestAdd%=DestLowAdd%+SrcAdd%-SrcLowAdd%
 1820    REM data area AM & prior gap
 1830    PROCmakeAMandgap(SrcLowAdd%, SrcAdd%, DestLowAdd%, DestAdd%, density%)
 1840    SrcLowAdd% = SrcAdd%
 1850    DestLowAdd%= DestAdd%
 1860    SrcAdd% += FNgetDataLength(TrkDesc%, sectFound%)-1
 1870    REM copy up to end of data area transfer, convert any &F5-F7 chrs
 1880    PROCselcopyfwd (SrcLowAdd%, SrcAdd%, DestLowAdd%, density%, convert%)
 1890    DestLowAdd% +=SrcAdd%-SrcLowAdd%+1 :REM first byte after data...
 1900    SrcLowAdd% = SrcAdd%+1             :REM ..transfer areas
 1910    IF (info% AND (errCRC% OR errNotFound% OR noRoomCRC%))=0 THEN
 1920      REM room for CRC AND read CRC was ok AND sector was found
 1930      IF (convert%=0) AND ((info% AND overIndex%)=0) THEN
 1940        REM AND writetrack can correctly write data area
 1950        DestLowAdd%?0 = &F7   :REM so force CRC
 1960        SrcLowAdd%  +=2       :REM and adjust source &
 1970        DestLowAdd% +=1       :REM dest addresses accordingly
 1980        REM & set sector info
 1990        PROCaddSectInfo(TrkDesc%, sectFound%, dataDuringFormat%)
 2000        info%=info% OR dataDuringFormat% :REM for use below
 2010      ELSE
 2020        IF info%AND(delData% OR longData% OR illegalTrk% OR illegalIDbyt%) THEN
 2030          REM if can't write sector, but otherwise OK, and can't write
 2040          REM it during format, then print error
 2050          PROCprintID(TrkDesc%, sectFound%)
 2060          PRINT "CAN'T make an exact copy! Sorry"
 2070          DestLowAdd%?0 = &F7  :REM but set CRC anyway
 2080          SrcLowAdd%  +=2      :REM and adjust pointers
 2090          DestLowAdd% +=1
 2100        ENDIF
 2110      ENDIF
 2120    ENDIF
 2130    IF (info% AND (NOT overIndex%))=0 THEN
 2140      REM must write the sector
 2150      mustWrSect%=TRUE
 2160    ENDIF
 2170  ENDIF
 2180NEXT
 2190SrcAdd%=TrkDesc%!bufEndValidData%
 2200REM copy to end of valid read track data
 2210PROCselcopyfwd (SrcLowAdd%, SrcAdd%, DestLowAdd%, density%, convert%)
 2220PROCfillEndOfTrk( SrcAdd%+1-ReadBuf% + WriteTrkBuf% , density%)
 2230ENDPROC
 2240
 2250  REM fills to end of write buffer with relevant filler byte
 2260DEFPROCfillEndOfTrk( add% , density%)
 2270LOCAL value%
 2280IF density%=DDensity% THEN
 2290  value%=&4E
 2300ELSE
 2310  value%=&FF
 2320ENDIF
 2330PROCfill(value%, add%, WriteTrkBuf% + TrkDataSize% - add%)
 2340ENDPROC
 2350
 2360   REM copies area of store but converts any illegal chrs(for writeTrack)
 2370   REM Sets convert%=TRUE if it has to convert any char
 2380DEFPROCselcopyfwd(SrcLowAdd%,SrcAdd%,DestLowAdd%,density%,RETURN convert%)
 2390LOCAL low%, hi%
 2400PROCgetIllegal(density%, low%, hi%)
 2410CALL selcopyfwd, SrcLowAdd%, SrcAdd%, DestLowAdd%, low%, hi%, convert%
 2420ENDPROC
 2430
 2440   REM setup illegal chr range for writetrack
 2450DEFPROCgetIllegal(density%, RETURN low%, RETURN hi%)
 2460IF density% = DDensity% THEN
 2470  low%=&F5:hi%=&F7
 2480ELSE
 2490  low%=&F5:hi%=&FE
 2500ENDIF
 2510ENDPROC
 2520
 2530DEFPROCmakeAMandgap(SrcLowAdd%, SrcAdd%, DestLowAdd%, DestAdd%, density%)
 2540IF density%=DDensity% THEN
 2550  PROCDDmakeAMandgap(SrcLowAdd%, SrcAdd%, DestLowAdd%, DestAdd%)
 2560ELSE
 2570  PROCSDmakeAMandgap(SrcLowAdd%, SrcAdd%, DestLowAdd%, DestAdd%)
 2580ENDIF
 2590ENDPROC
 2600
 2610   REM DD only
 2620DEFPROCDDmakeAMandgap(SrcLowAdd%, SrcAdd%, DestLowAdd%, DestAdd%)
 2630LOCAL V%, I%, J%, convert%
 2640DestAdd%?-1 = SrcAdd%?-1   :REM copy Mark
 2650DestAdd%?-2 = &F5          :REM set AM
 2660DestAdd%?-3 = &F5
 2670DestAdd%?-4 = &F5
 2680J%=DestAdd% - DestLowAdd%
 2690I%=5
 2700IF I%<=J% THEN DestAdd%?-I% =0:I% +=1 :REM and set preceeding 2 bytes to 0
 2710IF I%<=J% THEN DestAdd%?-I% =0:I% +=1 :REM (DestLowAdd permitting)
 2720V%=SrcAdd%?-I%
 2730WHILE (V%=(SrcAdd%?-I%)) AND (I% <= J%)
 2740  DestAdd%?-I% = 0    :REM and all preceeding bytes to 0 while
 2750  I% +=1              :REM source bytes don't change value
 2760ENDWHILE              :REM (DestLowAdd permitting)
 2770IF I%<=J% THEN
 2780  REM then copy preceding gap back to SrcLowadd%
 2790  PROCselcopyfwd (SrcLowAdd%, SrcAdd%-I%, DestLowAdd%, DDensity%,convert%)
 2800ENDIF
 2810ENDPROC
 2820
 2830   REM SD only
 2840DEFPROCSDmakeAMandgap(SrcLowAdd%, SrcAdd%, DestLowAdd%, DestAdd%)
 2850LOCAL I%, J%, convert%
 2860DestAdd%?-1 = &F0 OR (SrcAdd%?-1)   :REM copy Mark
 2870I%=2
 2880J%=DestAdd% - DestLowAdd%
 2890WHILE (I% <= J%) AND (I% <= 7)
 2900  DestAdd%?-I% = 0      :REM and preceeding by 6 bytes of 0
 2910  I% +=1                :REM (DestLowAdd permitting)
 2920ENDWHILE
 2930IF I%<=J% THEN
 2940  REM then copy preceding gap back to SrcLowadd%
 2950  PROCselcopyfwd (SrcLowAdd%, SrcAdd%-I%, DestLowAdd%, SDensity%,convert%)
 2960ENDIF
 2970ENDPROC
 2980
 2990   REM tries both DD & SD before giving up, & returns density found
 3000DEFPROCreadSingleTrk(drv, trk, head, TrkDesc%, RETURN srtDensity%)
 3010LOCAL endadd%, DataBuf%, density%, count%
 3020TrkDesc%?bufTrk%  = trk
 3030TrkDesc%?bufHead% = head
 3040density%=srtDensity%
 3050REPEAT
 3060  TrkDesc%?bufTrkDensity%  = density%
 3070  DataBuf% = TrkDesc% + TrkDescSize%
 3080  endadd% = DataBuf% + MaxSect% -1 + (MaxTrkUnformat% >> (2-density%))
 3090  REPEAT
 3100    REM to test ReadTrack overrun, only repeat if ReadTrack overflow
 3110    PROCfill(&55, DataBuf%, endadd%-DataBuf%)
 3120    PROCreadtrack(drv, trk, head, density%, DataBuf%)
 3130    endValidData%=endadd%-1
 3140    CALL findchangeback, endValidData%
 3150  UNTIL (endadd% - endValidData%) > 500
 3160  TrkDesc%!bufEndValidData% = endValidData%
 3170  PROCanalyseTrk(TrkDesc%, DataBuf%, density%)
 3180  PROCreadTrksSects (drv, TrkDesc%, density%)
 3190  count%=TrkDesc%?bufNumbSect%
 3200  IF count%=0 THEN
 3210    density%= density% EOR 3   :REM if no sectors toggle SD/DD
 3220  ELSE
 3230    IF srtDensity%<>density% THEN
 3240      PRINT" Continues as ";
 3250      IF density%=2 THEN PRINT"Double"; ELSE PRINT"Single";
 3260      PRINT" Density"
 3270      blank%=FALSE
 3280      srtDensity%=density%       :REM if sectors, update srtDensity
 3290    ENDIF
 3300  ENDIF
 3310UNTIL density%=srtDensity%
 3320IF blank% THEN
 3330  IF count%<>0 THEN
 3340    blank%=FALSE
 3350    PRINT" No longer Blank"
 3360  ENDIF
 3370ELSE
 3380  IF count%=0 THEN
 3390    blank%=TRUE
 3400    PRINT" Continues as Blank"
 3410  ENDIF
 3420ENDIF
 3430PROCprintUnusual(TrkDesc%, count%)
 3440IF checkFormat THEN
 3450  IF ((TrkDesc%?bufNumbSect%) <> chkSectsPerTrk) OR ((TrkDesc%?bufMultiSectFlg%)= FALSE) OR (density% <> chkDensity%) THEN
 3460    PROCprintLine(" ******* Track format failed check *******")
 3470  ENDIF
 3480ENDIF
 3490ENDPROC
 3500
 3510   REM Analyses Read Track data and sets up Track descriptor accordingly
 3520   REM Ignore any 'apparent' sectors without associated data areas (or
 3530   REM  it appear as 'Sector not found' in any case)
 3540   REM if anything unusual unset multiSectFlg%
 3550DEFPROCanalyseTrk(TrkDesc%, DataBuf%, density%)
 3560LOCAL count%, add%, IDadd%, dataadd%, mark%, IDcorrupt, multiSectFlg%
 3570LOCAL ID%, bytes%, firstIDsyncAdd%, endLastData%, remadeOK%
 3580multiSectFlg%=TRUE  :REM ie default
 3590count%=0
 3600add%=DataBuf% + 2   :REM first ID AM must be at least 2 bytes into buffer
 3610endadd%=TrkDesc%!bufEndValidData%
 3620REPEAT
 3630  PROCfindID(add%, endadd%, density%)
 3640  IF add%<>0 THEN
 3650    IF count%=maxSectsAllowed% THEN PRINT'"Failed:- too many sectors":STOP
 3660    IDadd%=add%
 3670    IF count%=0 THEN firstIDsyncAdd%=IDadd%-4
 3680    PROCsetIDPtr(TrkDesc%, count%, IDadd%)
 3690    PROCsetSectInfo(TrkDesc%, count%, 0)  :REM 0=default value
 3700    PROCsetSectID(TrkDesc%, count%, IDadd%!0) :REM save ID
 3710    add% +=6
 3720    IF (endadd%-add%) < 128 THEN
 3730      REM if there is a data area it overflows index, so
 3740      REM wrap around data from start of track (before first ID)
 3750      REM to ensure I see the data mark
 3760      CALL copyfwd, DataBuf%, firstIDsyncAdd%, endadd%
 3770      endadd% += firstIDsyncAdd%-DataBuf%
 3780    ENDIF
 3790    PROCfindAM (add%,endadd%,density%) :REM aim to find Data Area
 3800    dataadd%=0                         :REM default if no DataArea
 3810    IF add% <>0 THEN
 3820      mark%=(add%?-1)           :REM must be between &F8-&FF
 3830      IF mark% >= &FC THEN
 3840        add% -= 10              :REM if not Data Area, turn back add%
 3850      ELSE
 3860        dataadd%=add%
 3870        IF mark%= &F8 THEN
 3880          REM its deleted data
 3890          multiSectFlg% = FALSE
 3900          PROCaddSectInfo(TrkDesc%, count%, delData%)
 3910        ENDIF
 3920      ENDIF
 3930    ENDIF
 3940    PROCsetDataPtr(TrkDesc%, count%, dataadd%)
 3950    IF dataadd%=0 THEN
 3960      REM no data (so the ID will be ignored), so for TRACE sake only
 3970      multiSectFlg% = FALSE
 3980      PROCaddSectInfo(TrkDesc%, count%, noData%)
 3990    ELSE
 4000      REM There is a data area, so only then keep a record of sector
 4010      REM and only then test for corrupt ID's or illegal ID's
 4020      IF (IDadd%?3 > 3) THEN
 4030        REM probably corrupt ID (or maybe not ID just data)
 4040        IF density%=DDensity% THEN
 4050          REM remake ID & set =ID% then overwrite saved state
 4060          CALL remakeID, mapID%, IDadd%, ID%, remadeOK%
 4070          IF remadeOK%<>0 THEN
 4080            REM save remaded ID only if remadeOK%
 4090            PROCsetSectID(TrkDesc%, count%, ID%)
 4100          ENDIF
 4110        ELSE
 4120          REM leave it as it is, if its Single Density
 4130        ENDIF
 4140      ENDIF
 4150      PROCtestIllegalId(TrkDesc%, count%, density%, multiSectFlg%)
 4160      count%=count%+1
 4170    ENDIF
 4180  ENDIF
 4190UNTIL add%=0
 4200IF count%<>0 THEN
 4210  ID%=FNgetSectID(TrkDesc%, count%-1)
 4220  bytes%=1 << (7+ (3 AND (ID% >>24)))
 4230  endLastData%= bytes%+5+4 + FNgetDataPtr(TrkDesc%, count%-1)
 4240  IF endLastData% > TrkDesc%!bufEndValidData% THEN
 4250    REM last sector's data area overflows Index, so mark the fact
 4260    PROCaddSectInfo(TrkDesc%, count%-1, overIndex%)
 4270    REM & change end of valid data
 4280    endadd% = firstIDsyncAdd%-DataBuf% + TrkDesc%!bufEndValidData%
 4290    IF endadd% < endLastData% THEN
 4300      endLastData%=endadd%
 4310    ENDIF
 4320    REM set end of valid data to shorter of -
 4330    REM 9 bytes after data area CRC (allows for min_gap=5 + ID_AM=4),
 4340    REM or start of first sector wrapped around
 4350    REM (ensures first ID will not be overwritten)
 4360    TrkDesc%!bufEndValidData% = endLastData%
 4370  ENDIF
 4380ENDIF
 4390TrkDesc%?bufMultiSectFlg%= multiSectFlg%
 4400TrkDesc%?bufNumbSect% = count%
 4410ENDPROC
 4420
 4430 REM on exit add% = address of ID (found) or 0 (NOT found)
 4440DEFPROCfindID (RETURN add%, endadd%, density%)
 4450IF density%=DDensity% THEN
 4460  CALL DDfindID, add%, endadd%
 4470ELSE
 4480  REPEAT
 4490    CALL SDfindID, add%, endadd%
 4500  UNTIL (add%=0) OR ((add%?3)<= 3):REM extra test for valid Size for SD
 4510ENDIF
 4520ENDPROC
 4530
 4540 REM on exit add% = address of address mark (found) or 0 (NOT found)
 4550DEFPROCfindAM (RETURN add%, endadd%, density%)
 4560IF density%=DDensity% THEN
 4570  CALL DDfindAM, add%, endadd%
 4580ELSE
 4590  CALL SDfindAM, add%, endadd%
 4600ENDIF
 4610ENDPROC
 4620
 4630  REM IF Multi sector, setup memory pointer list & do one read
 4640  REM ELSE (or if above read fails) read each sector individually
 4650  REM if multi-sector read fails unset its flag
 4660DEFPROCreadTrksSects (drv%, TrkDesc%, density%)
 4670LOCAL sectFound%,trk%,head%,lowSect%,sectSize%,add%,IDadd%,sect%
 4680LOCAL multiSectFlg%, count%, bytes%, info%, notRealSect%
 4690REPEAT
 4700  notRealSect%=FALSE :REM break out for 'Sector not found' & re-try
 4710  count% = TrkDesc%?bufNumbSect%
 4720  IF count%<>0 THEN
 4730    trk% =TrkDesc%?bufTrk%
 4740    head%=TrkDesc%?bufHead%
 4750    multiSectFlg%= TrkDesc%?bufMultiSectFlg%
 4760    REM -- many of below can set multiSectFlg% = FALSE
 4770    PROCsetLengths(TrkDesc%, count%, multiSectFlg%)
 4780    IF multiSectFlg% THEN
 4790      PROCsetMultiSect (TrkDesc%, count%, multiSectFlg%)
 4800    ENDIF
 4810    IF multiSectFlg% THEN
 4820      REM read track in one go but using memory DMA list
 4830      lowSect%=TrkDesc%?bufLowSect%
 4840      sectSize%=TrkDesc%?bufSectSize%
 4850      PROCcopyMemAddList(TrkDesc%, count%)
 4860      PROCopsectors(Read% OR (1<<5),drv%,trk%,head%,lowSect%,count%,sectSize%,density%,memAddList%)
 4870      IF result% <> 0 THEN multiSectFlg%=FALSE :REM Disc error
 4880    ENDIF
 4890    IF multiSectFlg%=0 THEN
 4900      IF analyse THEN
 4910        PRINT"  reading:- non-standard track layout?"
 4920      ENDIF
 4930      REM catch all,deleted data,non-consecutive IDs, ID & DataArea error
 4940      REM illegal IDs Trk, and data areas that overlay next ID
 4950      FOR sectFound%= 0 TO count%-1
 4960        IF notRealSect%=FALSE THEN
 4970          info%=FNgetSectInfo(TrkDesc%,sectFound%)
 4980          IF (info% AND (illegalTrk% OR noData%)) = 0 THEN
 4990            REM legal ID trk (on Arc)& data area(incl deldata) then read
 5000            add%=FNgetDataPtr(TrkDesc%, sectFound%)
 5010            ID%=FNgetSectID(TrkDesc%, sectFound%)
 5020            sect%=&FF AND (ID% >> 16)
 5030            bytes%=FNgetDataLength(TrkDesc%, sectFound%)
 5040            PROCopbytes(Read%,drv%,trk%,head%,sect%,bytes%,density%,add%)
 5050            IF result%<>0 THEN
 5060              PROCreadSectErr(TrkDesc%, sectorFound%,result%,notRealSect%)
 5070            ENDIF
 5080          ELSE
 5090            REM maybe this is not a sector atall but ID pattern is
 5100            REM part of a data area. Assume it is not a sector if a
 5110            REM previous sector has longData or noRoomCRC set.
 5120            REM NOT a FOOL PROOF test but probably good enough
 5130            IF sectFound%<>0 THEN
 5140              IF ((longData% OR noRoomCRC%) AND FNgetSectInfo(TrkDesc%, sectFound%-1)) THEN
 5150                notRealSect%=TRUE
 5160                PROCdeleteSect(TrkDesc%, sectorFound%)
 5170              ENDIF
 5180            ENDIF
 5190          ENDIF
 5200        ENDIF
 5210      NEXT
 5220    ENDIF
 5230    TrkDesc%?bufMultiSectFlg%= multiSectFlg% :REM in case its reset
 5240  ENDIF
 5250UNTIL notRealSect%=FALSE
 5260ENDPROC
 5270
 5280DEFPROCreadSectErr(TrkDesc%, sectorFound%, result%, RETURN notRealSect%)
 5290REM Special actions on read sector error (eg Sector Not Found)
 5300LOCAL ID%, count%, sectSize%
 5310IF (result% AND errNotFound%) <>0 THEN
 5320  REM If Sector Not Found
 5330  ID%=FNgetSectID(TrkDesc%, sectFound%)
 5340  IF ID% <> !FNgetIDPtr(TrkDesc%, sectFound%) THEN
 5350    REM If corrupt ID & Not Found, check for alternative for corrupt ID
 5360    CASE ID% OF
 5370      WHEN &014B011C: ID%=&014F011C :notRealSect%=TRUE
 5380      WHEN &02B70029: ID%=&02D50029 :notRealSect%=TRUE
 5390      WHEN &02B40029: ID%=&03FC0029 :notRealSect%=TRUE
 5400      WHEN &00550129: ID%=&00770129 :notRealSect%=TRUE
 5410      WHEN &00640129: ID%=&00A40129 :notRealSect%=TRUE
 5420      WHEN &01770129: ID%=&01B70129 :notRealSect%=TRUE
 5430      WHEN &026A0129: ID%=&02D60129 :notRealSect%=TRUE
 5440      WHEN &02FA0129: ID%=&03560129 :notRealSect%=TRUE
 5450      WHEN &03660129: ID%=&03A60129 :notRealSect%=TRUE
 5460      WHEN &02B50129: ID%=&03FD0129 :notRealSect%=TRUE
 5470      WHEN &02750129: ID%=&02B50129 :notRealSect%=TRUE
 5480      REM nb last one must be after penultimate one (as both are
 5490      REM alternative patterns for the same corrupt ID)
 5500    ENDCASE
 5510  ENDIF
 5520  IF notRealSect%=TRUE THEN
 5530    REM Sector Not Found AND corrupt ID has an alternative
 5540    REM so set stored value of ID% to alternative
 5550    PROCsetSectID(TrkDesc%, sectFound%, ID%)
 5560  ELSE
 5570    REM Sector Not Found AND not an alternative for corrupt ID
 5580    REM so remove sector from track descriptor, as it is NOT a ID
 5590    notRealSect%=TRUE
 5600    PROCdeleteSect(TrkDesc%, sectorFound%)
 5610  ENDIF
 5620ELSE
 5630  REM flag disc error on sector, in sect info, if sector was found
 5640  PROCaddSectInfo(TrkDesc%, sectFound%, result% AND &FF)
 5650ENDIF
 5660ENDPROC
 5670
 5680DEFPROCdeleteSect(TrkDesc%, sectorFound%)
 5690REM this was not a sector but part of a data area (or gap)
 5700REM so remove sector from track descriptor and reset
 5710REM any longData or noRoomCRC in the previous sector info.
 5720LOCAL I%, J%, infoSize%, count%
 5730count% = TrkDesc%?bufNumbSect%
 5740infoSize%= 1 << Log2SectInfoSize%
 5750J%=TrkDesc% + bufSectDesc% + sectFound%*infoSize%
 5760FOR I%=0 TO (count%-1-sectFound%)*infoSize%-1 STEP 4
 5770  J%!I%=J%!(I%+infoSize%)
 5780NEXT
 5790IF sectFound%<>0 THEN
 5800  PROCsetSectInfo(TrkDesc%, sectFound%-1,FNgetSectInfo(TrkDesc%, sectFound%-1) AND (NOT(longData% OR noRoomCRC%)))
 5810ENDIF
 5820TrkDesc%?bufNumbSect% -= 1  :REM decrement stored count
 5830ENDPROC
 5840
 5850  REM if track is incorrect OR head, sector, or sectSize are =&F5-&F7
 5860  REM then unset multiSectFlg%, set sector info and print message
 5870  REM assumes ID has been saved (after any remaking of corrupt ID)
 5880DEFPROCtestIllegalId(TrkDesc%, count%, density%, RETURN multiSectFlg%)
 5890LOCAL ID%, I%, T%, low%, hi%
 5900ID%=FNgetSectID(TrkDesc%, count%)
 5910IF (ID% AND &FF) <> TrkDesc%?bufTrk% THEN
 5920  REM ID's Trk is not real track (illegal on Arc)
 5930  multiSectFlg%=FALSE
 5940  PROCaddSectInfo(TrkDesc%, count%, illegalTrk%)
 5950ENDIF
 5960IF ((ID% >> 8) AND &FF) <> TrkDesc%?bufHead% THEN
 5970  multiSectFlg%=FALSE: REM being over safe?
 5980  IF debug THEN
 5990    REM **** can this be done elsewhere ****???
 6000    PROCprintID(TrkDesc%, count%)
 6010    PRINT"Head incorrect, but acceptable"
 6020  ENDIF
 6030ENDIF
 6040PROCgetIllegal(density%, low%, hi%)
 6050FOR I%=1 TO 3
 6060  T%=(ID% AND &FF)
 6070  IF (T% >= low%) AND (T% <= hi%) THEN
 6080    REM I can't write ID as it has illegal writeTrack bytes
 6090    multiSectFlg%=FALSE
 6100    PROCaddSectInfo(TrkDesc%, count%, illegalIDbyt%)
 6110  ENDIF
 6120  ID%=(ID% >> 8)
 6130NEXT
 6140ENDPROC
 6150
 6160   REM For each sector set Length of max read data transfer.
 6170   REM In case of protected disc, ensure it cannot overwrite next ID
 6180   REM around track (actually 'next ID - 4').
 6190   REM The set Length will also be used during any data area write, BUT
 6200   REM If any sector write data might overwrite 'next ID - 4' (ie gap
 6210   REM from end of data to 'next ID - 4' is less than 5 bytes), then
 6220   REM set Long data flag and unset multisector flag. Furthermore if
 6230   REM there is not even room for a 'format generated CRC', also
 6240   REM set no-Room-CRC flag.
 6250DEFPROCsetLengths(TrkDesc%, count%, RETURN multiSectFlg%)
 6260LOCAL followingIDadd%, sectFound%, bytes%, add%, IDadd%, gap%, ID%
 6270LOCAL density%
 6280density%= TrkDesc%?bufTrkDensity%
 6290followingIDadd%=TrkDesc%!bufEndValidData%
 6300FOR sectFound%= count%-1 TO 0 STEP -1
 6310  IDadd%=FNgetIDPtr(TrkDesc%, sectFound%)
 6320  add%=FNgetDataPtr(TrkDesc%, sectFound%)
 6330  ID%=FNgetSectID(TrkDesc%, sectFound%)
 6340  bytes%=1 << (7+ ((ID% >> 24) AND 3))
 6350  gap% = (followingIDadd%-4) - (add%+bytes%)
 6360  IF gap% < 5 THEN
 6370    PROCaddSectInfo(TrkDesc%, sectFound%, longData%)
 6380    multiSectFlg%=FALSE
 6390    IF gap% < 2 THEN
 6400      PROCaddSectInfo(TrkDesc%, sectFound%, noRoomCRC%)
 6410      IF gap% < 0 THEN
 6420        bytes% += gap%   :REM reduce transfer size if it extends to ID-4
 6430      ENDIF
 6440    ENDIF
 6450  ENDIF
 6460  PROCsetDataLength(TrkDesc%, sectFound%, bytes%)
 6470  followingIDadd%=IDadd%
 6480NEXT
 6490ENDPROC
 6500
 6510   REM find if sector numbers are consecutive, and all have the same size
 6520   REM if not set Multi sector False
 6530   REM if Multi sector still set, setup Multi-sector descriptor and
 6540   REM  memory pointer list
 6550DEFPROCsetMultiSect(TrkDesc%, count%, RETURN multiSectFlg%)
 6560LOCAL max%,min%,sector%,IDadd%,dataadd%,sectNumb%, restOfID%, sectSize%
 6570LOCAL ID%
 6580max%=-1 :min%=256
 6590FOR sector%=0 TO count%-1
 6600  ID%=FNgetSectID(TrkDesc%, sector%)
 6610  IF sector%=0 THEN
 6620    restOfID%=&FF00FFFF AND ID%
 6630    sectSize%=(ID% >> 24) AND 3
 6640  ELSE
 6650    IF restOfID% <> (&FF00FFFF AND ID%) THEN
 6660      multiSectFlg%=FALSE
 6670    ENDIF
 6680  ENDIF
 6690  sectNumb%=&FF AND (ID% >> 16)
 6700  IF sectNumb% > max% THEN max%=sectNumb%
 6710  IF sectNumb% < min% THEN min%=sectNumb%
 6720NEXT
 6730IF ((max%-min%) <> (count%-1)) THEN multiSectFlg%=FALSE
 6740IF multiSectFlg% THEN
 6750  TrkDesc%?bufLowSect% = min%
 6760  TrkDesc%?bufSectSize% =sectSize%
 6770  FOR sector%=0 TO count%-1
 6780    dataadd%=FNgetDataPtr(TrkDesc%, sector%)
 6790    ID%=FNgetSectID(TrkDesc%, sector%)
 6800    sectNumb%=(&FF AND (ID% >> 16)) - min%
 6810    TrkDesc%!(bufMemAddList% + (sectNumb%<<3))= dataadd% :REM memory add
 6820    TrkDesc%!(bufMemAddList%+4+(sectNumb%<<3))=1 << (7+sectSize%):REM size
 6830  NEXT
 6840ENDIF
 6850ENDPROC
 6860
 6870  REM copy MultiSector Memory Address List into Buffer for use
 6880DEFPROCcopyMemAddList(TrkDesc%, count%)
 6890LOCAL I%,J%
 6900J%=((count%-1)<<3)+4
 6910FOR I%=0 TO J% STEP 4
 6920  memAddList%!I%=TrkDesc%!(bufMemAddList%+I%)
 6930NEXT
 6940ENDPROC
 6950
 6960  REM Print any unusual sector followed by reason why
 6970  REM IF debug print all sectors
 6980DEFPROCprintUnusual(TrkDesc%, count%)
 6990LOCAL sectFound%, info%, discerr%
 7000IF count%<>0 THEN
 7010  FOR sectFound%=0 TO count%-1
 7020    info%=&FFFFFF AND FNgetSectInfo(TrkDesc%, sectFound%)
 7030    IF debug OR (info%<>0) THEN
 7040      PROCprintID(TrkDesc%, sectFound%)
 7050      IF debug THEN PRINT
 7060    ENDIF
 7070    IF info% <> 0 THEN
 7080      IF (info% AND illegalTrk%) <> 0 THEN
 7090        PROCsectText("Illegal ID Trk (on Arc)")
 7100      ENDIF
 7110      IF (info% AND illegalIDbyt%) <> 0 THEN
 7120        PROCsectText("Illegal ID byte")
 7130      ENDIF
 7140      IF (info% AND noData%) <> 0 THEN
 7150        PROCsectText("Has NO data area")
 7160      ENDIF
 7170      IF (info% AND delData%) <> 0 THEN
 7180        PROCsectText("Deleted data area")
 7190      ENDIF
 7200      IF (info% AND longData%) <> 0 THEN
 7210        PROCsectText("Data TOO long:- Overlaps next ID")
 7220      ELSE
 7230        IF (info% AND noRoomCRC%) <> 0 THEN
 7240          PROCsectText("Data long:- gap too short, write")
 7250        ENDIF
 7260      ENDIF
 7270      IF (info% AND overIndex%) <> 0 THEN
 7280        PROCsectText("Data overflows index")
 7290      ENDIF
 7300      discerr% = (info% AND &FF)
 7310      IF discerr% <> 0 THEN
 7320        CASE (discerr% AND (errNotFound% OR errCRC%)) OF
 7330          WHEN (errNotFound% OR errCRC%):PROCsectText("ID CRC error")
 7340          WHEN errCRC%:      PROCsectText("Data area CRC error")
 7350          WHEN errNotFound%: PROCsectText("Sector not Found")
 7360        ENDCASE
 7370        IF discerr% AND NOT(errCRC% OR errNotFound%) THEN
 7380          PROCsectText("Unknown disc err &"+STR$~(discerr%))
 7390        ENDIF
 7400      ENDIF
 7410    ENDIF
 7420  NEXT
 7430ENDIF
 7440ENDPROC
 7450
 7460
 7470REM ** all following assume count% starts from 0 as first sector **
 7480
 7490DEFPROCsetIDPtr(TrkDesc%, count%, add%)
 7500!FNsectDesc(TrkDesc%, count%, bufIDptr%) = add%
 7510ENDPROC
 7520
 7530DEFFNgetIDPtr(TrkDesc%, count%)
 7540=!FNsectDesc(TrkDesc%, count%, bufIDptr%)
 7550
 7560DEFPROCsetDataPtr(TrkDesc%, count%, add%)
 7570!FNsectDesc(TrkDesc%, count%, bufDataptr%) = add%
 7580ENDPROC
 7590
 7600DEFFNgetDataPtr(TrkDesc%, count%)
 7610=!FNsectDesc(TrkDesc%, count%, bufDataptr%)
 7620
 7630DEFPROCsetDataLength(TrkDesc%, count%, bytes%)
 7640!FNsectDesc(TrkDesc%, count%, bufTransLength%) = bytes%
 7650ENDPROC
 7660
 7670DEFFNgetDataLength(TrkDesc%, count%)
 7680=!FNsectDesc(TrkDesc%, count%, bufTransLength%)
 7690
 7700DEFPROCsetSectID(TrkDesc%, count%, ID%)
 7710!FNsectDesc(TrkDesc%, count%, bufSectID%) = ID%
 7720ENDPROC
 7730
 7740DEFFNgetSectID(TrkDesc%, count%)
 7750=!FNsectDesc(TrkDesc%, count%, bufSectID%)
 7760
 7770DEFPROCsetSectInfo(TrkDesc%, count%, value%)
 7780!FNsectDesc(TrkDesc%, count%, bufSectInfo%) = value%
 7790ENDPROC
 7800
 7810DEFPROCaddSectInfo(TrkDesc%, count%, value%)
 7820PROCsetSectInfo(TrkDesc%,count%, value% OR FNgetSectInfo(TrkDesc%,count%))
 7830ENDPROC
 7840
 7850DEFFNgetSectInfo(TrkDesc%, count%)
 7860=!FNsectDesc(TrkDesc%, count%, bufSectInfo%)
 7870
 7880DEFFNsectDesc(TrkDesc%, count%, offset%)
 7890=TrkDesc%+bufSectDesc% + offset% + (count% << Log2SectInfoSize%)
 7900
 7910
 7920DEFPROCfill(value%, start%, bytelen%)
 7930B%=value%: C%=start%: D%=bytelen%
 7940CALL fill
 7950ENDPROC
 7960
 7970DEFPROCsetDefaultDiscRec(drv, density)
 7980CASE density OF
 7990  WHEN SDensity%: PROCsetDiscRec(drv, 10, 1, SDensity%)
 8000  WHEN DDensity%: PROCsetDiscRec(drv,  5, 3, DDensity%)
 8010ENDCASE
 8020ENDPROC
 8030
 8040DEFPROCsetDiscRec(drv, sectPerTrk, sectSize, density)
 8050sectSize=sectSize AND &3 :REM only bits used
 8060discRec%?0 = 7+sectSize
 8070discRec%?1 = sectPerTrk
 8080discRec%?2 = 2 :REM heads
 8090discRec%?3 = density
 8100discRec%!16 = 160*(discRec%?1)*(1 << (discRec%?0)): REM disc size in bytes
 8110discRec%?34 = drv
 8120discRec%!64 = &20000000
 8130ENDPROC
 8140
 8150REM assumes that discRec% is already setup
 8160DEFFNdiscAdd(trk, head, sect)
 8170=(sect + (head + trk*(discRec%?2))*(discRec%?1) ) << (discRec%?0)
 8180
 8190DEF PROCengageDisc(drv)
 8200REM ensure that disc is properly engaged & rotating
 8210LOCAL T%
 8220PROCrtz(drv) :REM rotate disc via rtz
 8230T%=TIME
 8240REPEAT UNTIL TIME >(T%+400) :REM and wait for disc to stop - Engaged
 8250PROCrtz(drv) :REM then rotate it again
 8260ENDPROC
 8270
 8280DEFPROCrtz(drv)
 8290PROCoptrack(Restore%, drv, 0, 0, DDensity%, 0)
 8300ENDPROC
 8310
 8320DEFPROCseek(drv, trk)
 8330PROCoptrack(Seek%, drv, trk, 0, DDensity%, 0)
 8340ENDPROC
 8350
 8360DEFPROCreadtrack(drv, trk, head, density, dmaAdd%)
 8370PROCoptrack(ReadTrack%, drv, trk, head, density, dmaAdd%)
 8380ENDPROC
 8390
 8400DEFPROCwritetrack(drv, trk, head, density, dmaAdd%)
 8410PROCoptrack(WriteTrack%, drv, trk, head, density, dmaAdd%)
 8420ENDPROC
 8430
 8440DEFPROCwritetrackChk(drv%, trk%, head%, density%, dmaAdd%)
 8450REM do write track, if error(write protected) print message & repeat
 8460REPEAT
 8470  PROCwritetrack(drv%, trk%, head%, density%, dmaAdd%)
 8480  IF result%<>0 THEN
 8490    PROCprintSrt("****  Come on, remove the disc's write protect, then press space  ****")
 8500    PROCpressspace
 8510    PRINT
 8520  ENDIF
 8530UNTIL result%=0
 8540ENDPROC
 8550
 8560DEFPROCoptrack(cmd%, drv, trk, head, density, dmaAdd%)
 8570REM uses default dummy discRec%, so ADFS doesn't try to read disc format
 8580PROCsetDefaultDiscRec(drv, density)
 8590PROCdiscop(cmd%, drv, FNdiscAdd(trk, head, 0), dmaAdd%, 0)
 8600ENDPROC
 8610
 8620DEFPROCreadsectors(drv,trk,head,sect,numbSect,sectSize,density,dmaAdd%)
 8630PROCopsectors(Read%,drv,trk,head,sect,numbSect,sectSize,density,dmaAdd%)
 8640ENDPROC
 8650
 8660DEFPROCwritesectors(drv,trk,head,sect,numbSect,sectSize,density,dmaAdd%)
 8670PROCopsectors(Write%,drv,trk,head,sect,numbSect,sectSize,density,dmaAdd%)
 8680ENDPROC
 8690
 8700REM -- Read bytes, starting from begining of a sector
 8710REM -- Bytes need not be whole sectors, but must not overflow track
 8720DEFPROCopbytes(cmd%, drv, trk, head, sect, bytes%, density, dmaAdd%)
 8730LOCAL sectPerTrk, discAdd%, sectSize, numbSect
 8740sectSize=-1
 8750REM repeat, ends up fooling ADFS so it always works
 8760REPEAT
 8770  sectSize +=1
 8780  numbSect=1+((bytes%-1) >>(7+sectSize))
 8790UNTIL numbSect <&100 :REM must be single byte
 8800sectPerTrk = sect + numbSect :REM fool ADFS, so it always works
 8810PROCsetDiscRec(drv, sectPerTrk, sectSize, density)
 8820discAdd% = FNdiscAdd(trk, head, sect)
 8830PROCdiscop(cmd%, drv, discAdd%, dmaAdd%, bytes%)
 8840ENDPROC
 8850
 8860DEFPROCopsectors(cmd%,drv,trk,head,sect,numbSect,sectSize,density,dmaAdd%)
 8870LOCAL sectPerTrk, discAdd%
 8880sectPerTrk = sect + numbSect :REM fool ADFS, so it always works
 8890PROCsetDiscRec(drv, sectPerTrk, sectSize, density)
 8900discAdd% = FNdiscAdd(trk, head, sect)
 8910PROCdiscop(cmd%, drv, discAdd%, dmaAdd%, numbSect << (discRec%?0) )
 8920ENDPROC
 8930
 8940  REM on exit result%=0 or disc error number
 8950DEFPROCdiscop(cmd%, drv, discAdd%, dmaAdd%, bytes%)
 8960R1%= cmd% OR (discRec% << 6)
 8970R2%= (drv << 29) + (discAdd% AND &1FFFFFFF)
 8980SYS XAdfsSwi% , 0, R1%, R2%, dmaAdd%, bytes% TO result%,,nextDiscByte%, nextMemByte%, BytesLeft%
 8990IF result% THEN PROCdiscerr(cmd%, result%)
 9000ENDPROC
 9010
 9020DEFPROCdiscerr(cmd%, RETURN result%)
 9030IF (result% AND (1 << 31)) THEN
 9040  PRINT'"Error &";~result% AND &3FFFFFFF:END
 9050ELSE
 9060  IF ((!result%) AND &FFFFFF)=AdfsDiscErr% THEN
 9070    IF analyse AND NOT ((cmd%=ReadTrack%)AND((result%?3)=4)) THEN
 9080      PROCprint_err(cmd%, result%)
 9090    ENDIF
 9100    result%=result%?3
 9110  ELSE
 9120    IF ((!result%) AND &FFFFFF) <> AdfsWriteProtect% THEN
 9130      PROCprint_err(cmd%, result%): END
 9140    ENDIF
 9150  ENDIF
 9160ENDIF
 9170ENDPROC
 9180
 9190REM 1770/1772 or ADFS restrictions/characteristics
 9200REM ADFS - will not allow you to write deleted data other than via
 9210REM        the format(write track) command, nor will it signal any error
 9220REM        on reading deleted data (including multi-sector deleted data).
 9230REM      - The only disc errors signalled are (plus combination)-
 9240REM        &10 - Sector not found (incl. ID CRC error or data mark> &FB)
 9250REM        &08 - CRC error (incl. ID & data CRC or data mark< &F8)
 9260REM        n.b. write protect is signalled but not as a disc error.
 9270REM 1770 - For disc errors see above
 9280REM      - DD ID mark can have any value between &FC-&FF (not just &FE)
 9290REM      - DD Data area mark can be any of &F8-&FB (not just &FB or &F8)
 9300REM        Note ADFS masks any differnce in deleted and normal data.
 9310REM      - ID head number is ignored, so need not be correct.
 9320REM      - Only the bottom 2 bits of SectSize are used, rest are ignored
 9330REM      - Missing clocks in either ID or data are not detected,
 9340REM        providing the CRC is set as if the values were &A1 for
 9350REM        '&F5' missing clocks (ie you can't use &F7 to set CRC).
 9360REM      - Write Track cannot use in data or ID area, byte values of
 9370REM         &F5-&F7  for     Single or Double Density
 9380REM         &F8-&FB, &FE for Single Density, unless CRC is S/W generated
 9390REM        The former results in wrong data written, while the latter
 9400REM        results in an incorrect CRC (using '&F7').
 9410REM        However, there is one way of writing the actual values of
 9420REM        &F5,&F6,&F7, during write track, if the byte immeadiately
 9430REM        follows a &F7. So it will be very difficult to generate.
 9440REM      - For double density, none of the 12 sync bytes(ie 0 preceding
 9450REM        AM) need be there, thus previous data area can go right up
 9460REM        to the AM of the next ID
 9470
 9480REM ******* Various standard disc formats *********
 9490REM            sect_per_trk   first_sect   sect_size    density
 9500
 9510REM ADFS(800K)       5            0          3 (1024)      2
 9520REM ADFS(640K)      16            0          1  (256)      2
 9530REM BBC DFS         10            0          1  (256)      1
 9540REM MS-DOS 3         9            1          2  (512)      2
 9550
 9560
 9570DEFPROCpressspace
 9580OSCLI("fx 15,1")
 9590REPEAT UNTIL INKEY(0)=32
 9600ENDPROC
 9610
 9620DEFPROCprintbits(byte%)
 9630LOCAL I%
 9640FOR I%=7 TO 0 STEP -1
 9650  IF ((byte% >> I%) AND 1) THEN VDU ASC"1" ELSE VDU ASC"0"
 9660NEXT
 9670ENDPROC
 9680
 9690DEFPROCcheckDiscIn(text$)
 9700IF copydisc THEN
 9710  IF source=dest THEN
 9720    PRINTTAB(0,VPOS)"  Insert "+text$+" disc, then press space";
 9730    PROCpressspace
 9740    PRINTTAB(0,VPOS)STRING$(50," ");TAB(0,VPOS);
 9750  ENDIF
 9760ENDIF
 9770ENDPROC
 9780
 9790DEFPROCprintLine(T$)
 9800REM at start of next free line, print text followed by newline
 9810REM print at start of next free line followed by  newline
 9820PROCprintSrt(T$)
 9830PRINT
 9840ENDPROC
 9850
 9860DEFPROCprintSrt(T$)
 9870REM at start of next free line, print text without newline
 9880IF POS<>0 THEN PRINT
 9890PRINT;T$;
 9900ENDPROC
 9910
 9920DEFPROCprintID(TrkDesc%, count%)
 9930REM At start of next free line, print real trk/head/density,
 9940REM  then ID bytes. All without newline at end
 9950LOCAL ID%, trk%, head%, sect%, sectSize%
 9960ID%=FNgetSectID(TrkDesc%, count%)
 9970trk%=  &FF AND ID%
 9980head%= &FF AND (ID% >> 8)
 9990sect%= &FF AND (ID% >> 16)
10000sectSize%=&FF AND (ID% >> 24)
10010PROCprintSrt("")
10020IF (TrkDesc%?bufTrkDensity%)=2 THEN
10030  PRINT;"DDensity";
10040ELSE
10050  PRINT;"SDensity";
10060ENDIF
10070PRINT TAB(8);" ID: ";
10080PRINT TAB(13);"Trk=";trk%;
10090PRINT TAB(21);"Hd=";head%;
10100PRINT TAB(28);"Sect=";sect%;
10110PRINT TAB(37);"Size=";sectSize%;
10120PRINT;":-";
10130ENDPROC
10140
10150DEFPROCsectText(T$)
10160PRINT;TAB(47,VPOS);T$
10170ENDPROC
10180
10190DEFPROCprint_err(cmd%, add%)
10200LOCAL I%
10210VDU7
10220PROCprintSrt("Disc ")
10230IF cmd%=Verify% THEN PRINT"verify sector(s)";
10240IF cmd%=Read% THEN PRINT"read sector(s)";
10250IF cmd%=Write% THEN PRINT"write sector(s)";
10260IF cmd%=ReadTrack% THEN PRINT"read track";
10270IF cmd%=WriteTrack% THEN PRINT"write track";
10280IF cmd%=Seek% THEN PRINT"seek";
10290IF cmd%=Restore% THEN PRINT"rtz";
10300PRINT" error:- ";
10310I%=4
10320WHILE add%?I%
10330  VDU add%?I%
10340  I%=I%+1
10350ENDWHILE
10360PRINT
10370ENDPROC
10380
10390DEFPROCmenu(RETURN copydisc, RETURN source, RETURN dest, RETURN srttrack, RETURN endtrack, RETURN firstHead, RETURN numbHeads)
10400MODE 0
10410VDU19,0,4,0,0,0
10420PRINTTAB(28);"W A R N I N G"
10430PRINT"  This program may only be used to make a backup copy of your own software."
10440PRINT"  It is your (the User's) responsiblity to ensure that any software copied,"
10450PRINT"  using this program, is done so legally."
10460
10470PRINTTAB(20,6);"DUP:- THE DISC DUPLICATOR"
10480PRINTTAB(20,7);"--------------------------"
10490PRINTTAB(18,8);"(c) Softcorn    Version ";vers$
10500
10510copysel=1
10520copyVpos=10
10530PRINTTAB(0,copyVpos);
10540PRINTTAB(10);" 1. Copy full double-sided 80 track disc"
10550PRINTTAB(10);" 2. Copy full single-sided 80 track disc"
10560PRINTTAB(10);" 3. Copy selected portions only"
10570
10580analVpos=14
10590PRINTTAB(0,analVpos);
10600PRINTTAB(10);" 4. Analyse full double-sided 80 track disc"
10610PRINTTAB(10);" 5. Analyse full single-sided 80 track disc"
10620PRINTTAB(10);" 6. Analyse selected portions only"
10630
10640drvsel=7
10650drvVpos=18
10660PRINTTAB(0,drvVpos);
10670PRINTTAB(10);" 7. Using just drive 0"
10680PRINTTAB(10);" 8. Using just drive 1"
10690PRINTTAB(10);" 9. From drive 0 To drive 1"
10700PRINTTAB(10);"10. From drive 1 To drive 0"
10710
10720goVpos=23
10730PRINTTAB(0,goVpos);
10740PRINTTAB(10);"11. DO :-"
10750
10760selVpos=26
10770exitMenu%=FALSE
10780select=0
10790REPEAT
10800IF select=11 THEN exitMenu%=TRUE
10810copydisc=(copysel <=3)
10820IF copysel<>3 AND copysel<>6 THEN
10830  srttrack=0
10840  endtrack=79
10850  firstHead=0
10860  IF copysel=1 OR copysel=4 THEN
10870    numbHeads=2
10880  ELSE
10890    numbHeads=1
10900  ENDIF
10910ENDIF
10920IF drvsel=7 OR drvsel=9 THEN
10930  source=0
10940ELSE
10950  source=1
10960ENDIF
10970IF drvsel=7 OR drvsel=10 THEN
10980  dest=0
10990ELSE
11000  dest=1
11010ENDIF
11020  FOR I%=copyVpos TO goVpos
11030    PRINTTAB(8,I%);" "
11040  NEXT
11050  IF copysel <=3 THEN
11060    PRINTTAB(8,copyVpos+copysel-1);"*"
11070    PRINTTAB(8,drvVpos+drvsel-7);"*"
11080    PRINTTAB(20,goVpos);"** Copy from ";source;" to ";dest;
11090  ELSE
11100    PRINTTAB(8,analVpos+copysel-4);"*"
11110    PRINTTAB(8,drvVpos+(1 AND (drvsel-7)));"*"
11120    PRINTTAB(20,goVpos);"** Analyse ";source;
11130  ENDIF
11140  PRINT;", Tracks ";srttrack;"-";endtrack;
11150  IF numbHeads=2 THEN
11160    PRINT;", both sides **";
11170  ELSE
11180    PRINT;", side ";firstHead;" only **";
11190  ENDIF
11200  PRINT;STRING$((78-POS)," ")
11210  PRINTTAB(0,selVpos);STRING$(78," ");
11220  IF NOT exitMenu% THEN
11230    PRINTTAB(20,selVpos);"SELECT ";
11240    INPUT select
11250    IF select=999 THEN PROCdispProcs
11260    IF (select>=1) AND (select <=6) THEN copysel=select
11270    IF (select>=7) AND (select <=10) THEN drvsel=select
11280    IF (select=3) OR (select = 6) THEN
11290      PROCgetSelective("First Track", selVpos, srttrack, 0, 79)
11300      IF srttrack<>79 THEN
11310       PROCgetSelective("Last Track",selVpos, endtrack, srttrack, 79)
11320      ENDIF
11330      PROCgetSelective("Number of sides", selVpos, numbHeads, 1, 2)
11340      IF numbHeads=1 THEN
11350       PROCgetSelective("Side", selVpos, firstHead, 0, 1)
11360      ENDIF
11370    ENDIF
11380  ENDIF
11390UNTIL exitMenu%
11400PRINTTAB(0,goVpos+2);
11410ENDPROC
11420
11430DEFPROCgetSelective(T$, vpos, RETURN value%, min%, max%)
11440REPEAT
11450  PRINTTAB(0,vpos);STRING$(78," ");
11460  PRINTTAB(18,vpos);T$;" (";min%;"-";max%;") ";
11470  INPUT value%
11480  IF (value%<min%) OR (value%>max%) THEN VDU 7
11490UNTIL (value% >= min%) AND (value% <= max%)
11500ENDPROC
11510
11520DEFPROCdispProcs
11530PRINT
11540PRINT" On a single drive, a disc change is needed every"
11550PRINT"   ";INT(MaxTrks%/2);" tracks (double sided), ";
11560PRINT ;MaxTrks%;" tracks (single sided)"
11570PRINT
11580PRINT" Try (& f1 to view result)"
11590PRINT"PROCreadsectors(drive, track, head, sector, numbSect, sectSize,density, ";MainBuffer%")"
11600PRINT"PROCreadtrack (drive, track, head, density, ";MainBuffer%" )"
11610PRINT"PROCreadSingleTrk(drive, track, head, ";MainBuffer%", srtDensity% )"
11620analyse=debug :REM only for use of typed PROCs after exit
11630END
11640ENDPROC
11650
11660DEF PROClogo
11670MODE 7
11680PRINT'
11690PRINT"��                           p          ";
11700PRINT"��                        p|���|p       ";
11710PRINT"��                       z?��o����t     ";
11720PRINT"��                      _��&`""o����}0   ";
11730PRINT"��                      h6?    o�����4  ";
11740PRINT"��x||0_||0||||||_||0  _p2%app  �|||0|0 |";
11750PRINT"���1+%�'+��```�`�'+� 5�������55 �`k5�}��";
11760PRINT"��+�}0�  ���� � �   ,5�������5=$�|~%�ou�";
11770PRINT"��p k��0_��   � �0_| 5�������55 �+} �""��";
11780PRINT"��o��%+��'�   � +��'  ""`c,lt`   � ku� *�";
11790PRINT"��                      ""o5�u   8|||||| ";
11800PRINT"��                        j�?yp~������� ";
11810PRINT"��                         o����������� ";
11820PRINT"��                          `/�������?! ";
11830PRINT" DUP the Disc Duplicator"
11840PRINT'''''"(public domain s/w, no profit based use)";
11850T%=INKEY(500)
11860ENDPROC
11870
11880DEFPROCinit
11890MaxTrkUnformat% = 4*INT((6250*1.03)/4)  :REM Exact number of Words
11900MaxSect%=1024
11910TrkDataSize%=MaxTrkUnformat%+MaxSect%+64
11920TrkDescSize%=FNinitBufoffsets         :REM exact number of Words
11930
11940DIM discRec% 100
11950DIM memAddList% maxSectsAllowed%*8
11960
11970REM mapID% holds ID map descriptors (see end of prog for format)
11980DIM mapID% &12000
11990OSCLI("*Load DupIDmap "+STR$~mapID%) :REM generated by DupIDtest
12000
12010REM put all other DIMs before here except code%
12020leaveSpare=10000
12030DIM dummy% 1
12040buffersize=4*INT((HIMEM-dummy%-leaveSpare)/4) :REM Exact number of Words
12050DIM MainBuffer% buffersize +16
12060MainBuffer%=16*INT((MainBuffer% +15)/16):REM on 16 byte boundary for debug
12070
12080MaxTrks%= INT(buffersize/(TrkDataSize% + TrkDescSize%))
12090MaxTrks% -= 3 :REM for safety cos ReadTrk sometimes runs for too long
12100
12110WriteTrkBuf%=MainBuffer%+buffersize-TrkDataSize% :REM use overflow area
12120
12130codelength=1000
12140DIM code% codelength  :REM must be last DIM to ensures code%> &FFFF
12150                      :REM cos of BBC BASIC (6502) emulation
12160Verify%=0
12170Read%=1
12180Write%=2
12190ReadTrack%=3
12200WriteTrack%=4
12210Seek%=5
12220Restore%=6
12230SDensity%=1
12240DDensity%=2
12250AdfsSwi%=&40240
12260XAdfsSwi%=AdfsSwi% OR (1<<17)
12270AdfsDiscErr%=&108C7
12280AdfsWriteProtect%=&108C9
12290AltDefectBit%=&10
12300PROCcode
12310 REM clears buffers
12320PROCfill(0,discRec%,70)
12330PROCfill(0,MainBuffer%,buffersize) :REM is this needed ???
12340OSCLI("key1 *MEDIT "+STR$~(MainBuffer%)+"|M")
12350OSCLI("key2 *MEDIT "+STR$~(WriteTrkBuf%)+"|M")
12360ENDPROC
12370
12380DEFFNinitBufoffsets
12390REM initialises all variables that are offsets pointers into track buffer
12400REM and returns offset for start of track data (ie for Read Track)
12410 REM note each track in buffer will be made up of
12420 REM - A Track descriptor, including
12430 REM     - general track info
12440 REM     - followed by a list of pointers for each sector (both ID & Data)
12450 REM     - followed by a multi-sector descriptor
12460 REM - Followed by the tracks 'ReadTrack data, supperimposed with
12470 REM    readSector data.
12480
12490 maxSectsAllowed%=32  :REM determines reserved space for track info
12500
12510REM GENERAL TRACK INFO
12520bufTrk%=0            :REM real track number (byte)
12530bufHead%=1           :REM real head number  (byte)
12540bufNumbSect%=2       :REM number of sectors on track (byte)
12550bufMultiSectFlg%=3   :REM TRUE = track can use multi-sector read/write
12560 REM (ie no read errors and sectors are all consecutive; skew is allowed)
12570bufTrkDensity%=4     :REM density (byte)
12580bufEndValidData%=8   :REM end of valid data in Trk buffer(word)
12590 base%=16            :REM bytes 5-7 & 12-15 free
12600
12610REM SECTOR INFORMATION LIST
12620REM entries are in the order that sectors are around track
12630REM each entry - pointer to start of ID (absolute word add)
12640REM            - pointer to start of Data Area (absolute word add)
12650REM              (if = 0 then no data area for ID found)
12660REM            - byte length of sector read/write data op. It will be less
12670REM              than sector size if next sect ID would be corrupted
12680REM            - Save version of ID, use this version instead of what
12690REM              is in track buffer in case of possible corrupt ID.
12700REM            - sector information, if <>0 THEN don't write sector
12710REM                catches ID CRC err, Deleted data, DataCRC err,
12720REM                illegal Arc ID, Data Area too long, No Data Area,
12730REM                and Data Area could and was written during format.
12740 Log2SectInfoSize%=5  :REM Log 2 of size of Sector Info (= 32 (8 words))
12750bufSectDesc%=base%
12760bufIDptr%   =0       :REM bytes  0-3
12770bufDataptr% =4       :REM bytes  4-7
12780bufTransLength%=8    :REM bytes  8-11
12790bufSectID%=12        :REM bytes 12-15
12800bufSectInfo%=16      :REM bytes 16-19
12810                     :REM byte 16 = disc err result%
12820errCRC%=      1<< 3   :REM CRC error bit in disc error
12830errNotFound%= 1<< 4   :REM sector not found bit in disc error
12840                     :REM byte 17
12850delData%=   1<< 8     :REM bit 1= deleted Data Area
12860noData%=    1<< 9     :REM bit 2= No Data Area
12870illegalTrk%= 1<< 10   :REM bit 3= Illegal ID Trk (ie on Arc)
12880illegalIDbyt%=1<<11   :REM bit 4= Illegal ID byte (ie &F5-&F7)
12890longData%=  1<< 12    :REM bit 5= Data too close to next ID to write
12900noRoomCRC%= 1<< 13    :REM bit 6= So long no space for even CRC
12910overIndex%= 1<< 14    :REM bit 7= Data area goes over Index(must write)
12920dataDuringFormat%= 1 << 16 :REM Data could and was written during format.
12930 base% += maxSectsAllowed% << Log2SectInfoSize% :REM 7 words free
12940
12950REM MULTI-SECTOR DATA AREA READ/WRITE INFO
12960REM  This info is only valid if Multi-Sector flag above is true
12970bufLowSect%=base%       :REM byte 0 lowest sector around track
12980bufSectSize%=base%+1    :REM byte 1 Sector Size
12990 base% += 4             :REM bytes 2 - 3 free
13000REM memory pointer list for discOp one entry for each sector
13010REM  entries must be in consectutive sector number order not in the order
13020REM  they appear around the track.
13030REM Each entry consists of two words
13040REM  first  = absolute address of Sector's data in memory
13050REM  second = sector size in bytes (nb they must all be the same)
13060REM note list must be word aligned, so assuming track descriptor
13070REM  starts at word aligned
13080 base%= 4*INT((base%+3)/4)  :REM ensure word aligned
13090bufMemAddList%= base%
13100 base% += 8*maxSectsAllowed%
13110
13120REM start of where read track data is stored,
13130REM  nb data areas will be overwritten by actual read sector data
13140REM     but Address Marks and gaps will be still in Read Track form
13150REM     Write track must use a copy of this (but corrected)
13160= base%
13170
13180
13190DEFPROCcode
13200FOR pass= 0 TO 2 STEP 2
13210P%=code%
13220[     OPT pass
13230
13240; get BASIC's CALL parameters
13250; NOTE they must all be word aligned integer variables, NOT even
13260;      !param% is allowed, only param% or param%(x)
13270; R1= Reserved, usually used by caller for BASIC's link address
13280; R9= Pointer to list of L-value parameters
13290; R10=number of parameters (max=6)
13300; For format of CALL parameter block see standard User guide
13310; especially for R9
13320; on exit R0 is corrupt
13330;         R1 is unaltered
13340;         R2=first parameter  (if there is one) else unchanged
13350;         R3=second parameter (if there is one) else unchanged
13360;         .. .....   ......    .. ..... .. ...  ...   .....
13370;         R7=sixth parameter  (if there is one) else unchanged
13380;
13390; call this routine after the BASIC CALL by -
13400;         MOV   R1, R14     ;saves BASIC's link address
13410;         BL   paramvalues  ;load all BASIC's parameters into registers
13420;         MOV   R14, R1     ;restores BASIC's link address
13430;
13440; to update a BASIC variable (last parameter) at end -
13450;         LDR   R0, [R9]    ;get last BASIC parameter add
13460;         STR   Rx, [R0]    ;& update it with value in Rx
13470;         MOV   pc, R14              ;return
13480
13490.paramvalues
13500ADD   R0, R9, R10, LSL #3
13510CMP   R10, #1
13520LDRGE R2, [R0, #-8]!
13530LDRGE R2, [R2]       ;R2=1st param
13540CMP   R10, #2
13550LDRGE R3, [R0, #-8]!
13560LDRGE R3, [R3]       ;R3=2nd param
13570CMP   R10, #3
13580LDRGE R4, [R0, #-8]!
13590LDRGE R4, [R4]       ;R4=3rd param
13600CMP   R10, #4
13610LDRGE R5, [R0, #-8]!
13620LDRGE R5, [R5]
13630CMP   R10, #5
13640LDRGE R6, [R0, #-8]!
13650LDRGE R6, [R6]
13660CMP   R10, #6
13670LDRGE R7, [R0, #-8]!
13680LDRGE R7, [R7]      ;R7=6th param
13690MOV   pc,  R14      ;return
13700
13710
13720;fill byte area, R1=byte value, R2=startadd, R3=length
13730.fill
13740AND   R1, R1, #&FF          ;use LS byte ony
13750ORR   R1, R1, R1, LSL #8
13760ORR   R1, R1, R1, LSL #16   ;byte repeated in all bytes in R1
13770ADD   R0, R2, R3
13780.fillbytstart
13790TST   R0, #3       \word boundary?
13800BEQ   fillwords
13810CMP   R0, R2
13820BEQ   fillend
13830STRB  R1, [R0,#-1]!
13840B     fillbytstart
13850.fillwords
13860SUB   R3, R0, R2
13870CMP   R3, #4
13880STRGE R1, [R0,#-4]!
13890BGT   fillwords
13900.fillbytend
13910CMP   R0, R2
13920STRNEB R1, [R0,#-1]!
13930BNE   fillbytend
13940.fillend
13950MOV   pc, R14   \return
13960
13970;find, backwards, were data byte changes & return the address
13980; CALL findchangeback startadd%
13990;on entry 1st BASIC parameter = start address
14000;on exit  1st BASIC parameter = address where change occurs
14010;           R0, R1, R2 corrupt
14020.findchangeback
14030MOV   R1, R14
14040BL   paramvalues      ;R2 set = start add (1st parameter)
14050MOV   R14, R1
14060LDRB  R0, [R2]
14070.findchangeloop
14080LDRB  R1, [R2, #-1]!
14090CMP   R1, R0
14100BEQ  findchangeloop
14110LDR   R0, [R9]   ;get last BASIC parameter add
14120STR   R2, [R0]   ;& update it with remade ID in R1
14130MOV   pc, R14              ;return
14140
14150;copy bytes forward
14160;  'CALL copyfwd, startadd, endadd, destadd'
14170;on entry 1st BASIC parameter = source startadd
14180;         2nd BASIC parameter = source end address
14190;         3rd BASIC parameter = destination start add
14200;         R0,R1,R2,R3,R4 corrupted
14210.copyfwd
14220MOV   R1, R14         ;R2 set = source start add (1st parameter)
14230BL   paramvalues      ;R3 set = source end add (2nd parameter)
14240MOV   R14, R1         ;R4 set = dest start add (3rd parameter)
14250.copyfwdloop
14260LDRB  R0, [R2], #1
14270STRB  R0, [R4], #1
14280CMP   R2, R3
14290BLE  copyfwdloop
14300MOV   pc, R14         ;return
14310
14320;copy bytes forward but convert any illegal bytes to &FF
14330;on entry 1st BASIC parameter = source startadd
14340;         2nd BASIC parameter = source end address
14350;         3rd BASIC parameter = destination start add
14360;         4th BASIC parameter = low of illegal byte range
14370;         5th BASIC parameter = high of illegal byte range
14380;         6th BASIC parameter = exit parameter only
14390;on exit  6th BASIC parameter = TRUE if any bytes needed converting
14400;         R0,R1,R2,R3,R4,R5,R6,R7 corrupted
14410.selcopyfwd
14420MOV   R1, R14         ;R2 set = source start add (1st parameter)
14430BL   paramvalues      ;R3 set = source end add (2nd parameter)
14440MOV   R14, R1         ;R4 set = dest start add (3rd parameter)
14450                      ;R5 to R6 = illegal chr range
14460MOV   R7, #0          ;R7 = 0 default
14470.selcopyfwd1
14480LDRB  R0, [R2], #1
14490CMP   R0, R5
14500BLT   selcopyfwd2
14510CMP   R0, R6          ;if illegal chr
14520MOVLE R0, #&FF        ;set to &FF
14530MVNLE R7, #(1-1)      ;& set R7 to -1 if any byte had to be converted
14540.selcopyfwd2
14550STRB  R0, [R4], #1
14560CMP   R2, R3
14570BLE  selcopyfwd1
14580LDR   R0, [R9]   ;get last BASIC parameter
14590STR   R7, [R0]   ;& set it to R5
14600MOV   pc, R14        ;return
14610
14620;fill backwards(destination) while source(backwards) continues to remain
14630; the same, or until end(source) is reached.
14640;on entry ALL following must be integer BASIC variables
14650;         1st BASIC parameter = source start add
14660;         2nd BASIC parameter = source end add (must be < 1st parameter)
14670;         3rd BASIC parameter = destination start add
14680;         4th BASIC parameter = value to fill with
14690;         5th BASIC parameter = exit value only (see below)
14700;on exit 5th BASIC variable is set = address where source byte changed
14710;                                  or (endadd-1) if no change occurs
14720.limitfillback
14730MOV   R1, R14         ;R2 set = source start add
14740BL   paramvalues      ;R3 set = source end add
14750MOV   R14, R1         ;R4 set = dest start add
14760                      ;R5 set = fill value
14770LDRB  R1, [R2]        ;get first source value
14780ADD   R4, R4, #1      ; increment R3 (as initial value)
14790.limitfillback1
14800CMP   R2, R3          ; stop filling when past end
14810BLT   limitfillbackend
14820STRB  R5, [R4, #-1]!
14830LDRB  R0, [R2, #-1]!
14840CMP   R0, R1          ;or when source value changes
14850BEQ   limitfillback1
14860.limitfillbackend
14870LDR   R0, [R9]   ;get last BASIC parameter add
14880STR   R2, [R0]   ;& update it with R2
14890MOV   pc, R14              ;return
14900
14910
14920;Find Double Density ID address mark pattern
14930; as for findAM below but only ID address marks are looked for
14940; except R5 is also corrupted (used to save link)
14950.DDfindID
14960MOV   R5, R14        ;save link
14970BL   DDfindAM
14980MOV   R14, R5        ;restore link
14990CMP   R2, #0         ;add=0?    then exit
15000BEQ   DDfindIDend
15010LDRB  R0, [R2,#-1]
15020CMP   R0, #&FC       ;mark=&FC,&FD,&FE, or &FF then exit
15030BLT  DDfindID
15040.DDfindIDend
15050MOV   R15, R14       ;return
15060
15070
15080;Find Double Density address mark pattern from 'Read Track' data
15090; including extra tests for ID
15100;on entry 1st BASIC parameter = startadd
15110;         2nd BASIC parameter = end address
15120;on exit  1st BASIC parameter is updated
15130;                  = 0 if not found
15140;                  <> 0, = address of start of Address Mark
15150;         R2= same as BASIC 1st parameter
15160;         R3= BASIC 2nd parameter (unaltered)
15170;         R0, R1, R4 corrupted
15180.DDfindAM
15190MOV   R1, R14
15200BL   paramvalues      ;R2 set = 1st parameter add(start address)
15210MOV   R14, R1         ;R3 set = 2nd parameter add(end address)
15220SUB   R2, R2, #1
15230.DDfindAMloop
15240CMP   R2, R3
15250BEQ  DDAMnotfound
15260LDRB  R0, [R2, #1]!  ;R2 ends up = add of current byte comparison
15270CMP   R0, #&A1       ;first &A1 at add
15280BNE  DDfindAMloop
15290LDRB  R0, [R2, #1]
15300CMP   R0, #&A1       ;second &A1 at add+1
15310BNE  DDfindAMloop
15320LDRB  R0, [R2, #2]   ;found &A1,&A1 pattern
15330CMP   R0, #&F8
15340BLT  DDfindAMloop
15350.DDfoundAM           ;FOUND  &A1,&A1,&Fx pattern, where &Fx >&F7
15360ADD   R2, R2, #3     ; point to first byte of ID or Data Area
15370B   DDfindAMend
15380.DDAMnotfound
15390MOV  R2, #0
15400.DDfindAMend
15410LDR   R0, [R9, #8]   ;get 1st parameter add(start address)
15420STR   R2, [R0]       ;& update it with R2
15430MOV   pc, R14
15440
15450
15460;Find Single Density ID address mark pattern
15470; as for findAM below but only ID address marks are looked for
15480; except R7 is also corrupted (used to save link)
15490.SDfindID
15500MOV   R7, R14        ;save link
15510BL   SDfindAM
15520MOV   R14, R7        ;restore link
15530CMP   R2, #0         ;add=0?    then exit
15540LDRNEB R0, [R2,#-1]
15550CMPNE R0, #&FE       ;mark=&FE? then exit
15560BNE  SDfindID
15570MOV   pc, R14       ;return
15580
15590;find Single Density address mark pattern from 'Read Track' data
15600; & set corrupted Mark byte correctly
15610;NOTE this is NOT a fool-proof test, (but has not failed yet)
15620;on entry 1st BASIC parameter = startadd
15630;         2nd BASIC parameter = end address
15640;on exit  1st BASIC parameter is updated
15650;                  =  0 if not found
15660;                  <> 0, = address of start of Address Mark
15670;         R2= same as BASIC 1st parameter
15680;         R3= BASIC 2nd parameter (unaltered)
15690;         R0, R1, R4, R5 corrupted
15700.SDfindAM
15710MOV   R1, R14
15720BL   paramvalues      ;R2 set = 1st parameter add(start address)
15730MOV   R14, R1         ;R3 set = 2nd parameter add(end address)
15740SUB   R2, R2, #1
15750.SDfindAMloop
15760CMP   R2, R3
15770BEQ  SDAMnotfound
15780LDRB  R0, [R2, #1]!   ;R2 ends up = add of current byte comparison
15790LDRB  R4, [R2, #-2]
15800AND   R1, R4, #&30
15810EOR   R1, R1, R0      ;R1= possible reconstructed Mark
15820CMP   R1, #&FE        ;ID mark?
15830CMPNE R1, #&FB        ;data Area mark?
15840CMPNE R1, #&F8        ;del data mark?
15850BNE SDfindAMloop
15860CMP   R4, #0
15870CMPNE R4, #&FF        ;test add-2 to add-5 = &00 or &FF
15880BNE  SDfindAMloop
15890MVN   R5, #(2-1)      ;(set R5=-2)
15900.SDfindAMsyncloop
15910CMN   R5, #5          ;(=-5?)
15920BEQ  SDmaybeAM
15930SUB   R5, R5, #1
15940LDRB  R0, [R2, R5]
15950CMP   R0, R4
15960BEQ  SDfindAMsyncloop
15970BNE  SDfindAMloop
15980.SDmaybeAM
15990LDRB  R0, [R2, #-1]
16000EOR   R0, R0, R4
16010AND   R0, R0, #&F0
16020BNE  SDfindAMloop     ;also test that add%-2 & add%-3 have same top 4 bits
16030MOV   R4, #&FF
16040MVN   R5, #(8-1)      ;(set R5=-8)
16050.SDffAMloop
16060CMN   R5, #14          ;(=-14?)
16070BEQ  SDfoundAM
16080SUB   R5, R5, #1
16090LDRB  R0, [R2, R5]
16100CMP   R0, R4          ;& test add%-9 to add%-14 are all &FF
16110BEQ  SDffAMloop
16120BNE  SDfindAMloop
16130.SDfoundAM
16140STRB  R1, [R2]        ;if AM found then reconstruct Mark
16150ADD   R2, R2, #1      ; point to first byte of ID or data area if found
16160B   SDfindAMend
16170.SDAMnotfound
16180MOV   R2, #0
16190.SDfindAMend
16200LDR   R0, [R9, #8]   ;get 1st parameter add(start address)
16210STR   R2, [R0]       ;& update it with R2
16220MOV   pc, R14
16230
16240
16250;reassemble ID corrupted by 'Read Track'
16260;   'CALL remakeID, mapID%, add%, remadeID%, remadeOK%'
16270; should only be called if sectSize is corrupt (ie >3)
16280;   & for double density IDs.
16290; on entry BASIC parameter 1 = start of mapID% descriptors
16300;                parameter 2 = address of start or ID read
16310;                parameter 3 = RETURN remade ID (as 4 byte word)
16320;                parameter 4 = RETURN FALSE if cant remake ID
16330; on exit  parameter 3 = reassembled ID (4 bytes only)
16340;          parameter 4 = 0 if no match is found
16350;          R0,R1,R2,R3,R4,R5,R6 corrupt
16360;
16370;Format of IDmap can be found at end of Program
16380
16390.remakeID
16400MOV   R1, R14
16410BL   paramvalues         ;R2 = mapID% (BASIC's 1st parameter)
16420MOV   R14, R1            ;R3 = add% (BASIC's 2nd parameter)
16430MOV   R4, #0             ;R4 = descriptor number
16440MVN   R5, #(1-1)         ;R5 = byte offset in ID read (-1)
16450.nxtIDbyte
16460ADD   R5, R5, #1
16470LDRB  R1, [R3, R5]       ;R1 = byte value looking for
16480.nxtdesc
16490ADD   R6, R2, R4, LSL #3 ;R6= pointer to current descriptor
16500LDR   R0, [R6]           ;R0= current descriptor
16510CMP   R1, R0, LSR #24
16520BEQ   valuefound         ;if value does not match
16530LDR   R4, [R6, #4]       ;get second word of descriptor
16540CMP   R4, #0
16550BNE nxtdesc              ;if <>0 it is a descriptor number
16560.failedremake            ;if =0 then can't remake ID so exit with R4=0
16570B   remakeend
16580.valuefound
16590BIC   R0, R0, #(&FF <<24) ;mask out value in descriptor (top 8 bits)
16600TSTS  R0, #(1 << 23)      ;if bit 23 of descriptor is clear
16610MOVEQ R4, R0              ;  descriptor = descriptor number for next byte
16620BEQ   nxtIDbyte           ;  so go get next byte & descriptor
16630.foundenddesc             ;else we've found the ID (in R0) so
16640AND   R1, R0, #&7F        ; load track (byte)
16650AND   R5, R0, #(1 << 7)
16660ORR   R1, R1, R5, LSL#1   ; OR in head (byte)
16670AND   R5, R0, #(&FF << 8)
16680ORR   R1, R1, R5, LSL #8  ; OR in sector
16690AND   R5, R0, #(3 << 16)
16700ORR   R1, R1, R5, LSL #8  ; OR in sector size
16710MVN   R4, #(1-1)          ; found so set R4=-1
16720.remakeend
16730LDR   R5, [R9]      ;get last BASIC parameter add
16740STR   R4, [R5]      ;& set =-1 if found ELSE = 0
16750LDR   R5, [R9, #8]  ;get last-1 BASIC parameter add
16760STR   R1, [R5]      ;& update it with remade ID in R1
16770MOV   pc, R14              ;return
16780
16790.endcode
16800]
16810IF (P%-code%) > codelength THEN
16820 PRINT"assembler code too long":VDU7:END
16830ENDIF
16840NEXT
16850ENDPROC
16860
16870REM  ******  ID map format  *********
16880REM mapID is made up of a list of descriptors numbered 0 to n
16890REM each descriptor is 2 words
16900REM word0 -
16910REM ms byte   = byte value read
16920REM ls 3 bytes= If bit 23=0, descriptor number of next byte in pattern
16930REM              else holds unique ID, ie end of unique byte pattern
16940REM              format is Bits  0-6 track
16950REM                                7 head
16960REM                             8-15 sector
16970REM                            16-17 sector Size
16980REM word1 -
16990REM if <>0, descriptor number of alternative value at this byte position
17000REM   else, no more alternative values


� >Dup

3*|*********************************************
(3*|*                                          **
23*|*  DUP, the disc duplicator  (c) Softcorn  **
<3*|*                 -                        **
F3*|*  Public Domain software, but not for use **
P3*|*   or sale related to profit.             **
Z3*|*                 -                        **
d3*|*  Copies double or single density discs   **
n3*|*  of 'any' format (eg ADFS L/D/E, DFS,    **
x3*|*  MSDOS, ATARI ST, AMIGA etc, and a wide  **
�3*|*  variety of protected discs)             **
�3*|*                 -                        **
�3*|*  BASIC + machine code + data file        **
�3*|*       (Edit at your peril)               **
�3*|*                                          **
�3*|*********************************************
�
�vers$="1.01"
�
�)� � � �=17 � �:� � �:�" at Line ";�:�
	�logo
	�init

"debug=�
,
6J� set,to check all tracks have a fixed number of good contiguous sects
@checkFormat=�
JchkDensity%=DDensity%
TchkSectsPerTrk=9
^� checkFormat �
hA  �"**** Checking Sectors per Track =";chkSectsPerTrk;" ****"
r�
|
��
�G  �menu(copydisc,source,dest,srttrack,endtrack,firstHead,numbHeads)
�   analyse=debug � � copydisc
�@  �action(source,dest,srttrack,endtrack,firstHead,numbHeads)
�I  �'"     Completed:-   Press SPACE to Continue (or escape to exit)";
�  �pressspace
�� �
��
�
�
�?��action(source,dest,srttrack,endtrack,firstHead,numbHeads)
�blank%=�
�srtDensity%=DDensity%
'MaxDiscTrks% =�(MaxTrks%/numbHeads)
firstTrk%=srttrack
!TrksLeft%=1+endtrack-srttrack
&ȕ TrksLeft% > 0
0"  � TrksLeft% > MaxDiscTrks% �
:    numbTrks%=MaxDiscTrks%
D  �
N    numbTrks%=TrksLeft%
X  �
bU  �copyMultiTrks(source,dest,firstTrk%,numbTrks%,firstHead,numbHeads,srtDensity%)
l  firstTrk% +=numbTrks%
v  TrksLeft% -=numbTrks%
��
��
�
�W��copyMultiTrks(source,dest,firstTrk%,numbTrks%,firstHead,numbHeads, � srtDensity%)
�� T%
��checkDiscIn("SOURCE")
�;� (firstTrk% = srttrack) � ((source=dest) � copydisc) �
�  �engageDisc(source)
��
�X�doMultiTrks(Read%, source, firstTrk%, numbTrks%, firstHead, numbHeads, srtDensity%)
�� copydisc �
�!  �checkDiscIn("DESTINATION")
�0  � (firstTrk% = srttrack) � (source=dest) �
    �engageDisc(dest)
  �
X  �doMultiTrks(Write%, dest, firstTrk%, numbTrks%, firstHead,numbHeads, srtDensity%)
 �
*�
4
>W��doMultiTrks(cmd%, drv, firstTrk%, numbTrks%, firstHead, numbHeads, � srtDensity%)
H� TrkDesc%, trk, head
RTrkDesc%=MainBuffer%
\0� trk=firstTrk% � (firstTrk% + numbTrks% -1)
f3  � head=firstHead � (firstHead + numbHeads -1)
p    �0,�);
z.    � cmd%=Read% � � "Read "; � � "Write";
�A    �;": Drv=";drv;" Trk=";trk;"   ";�21,�);"Hd=";head;"   ";
�    � debug � �
�    � cmd%=Read% �
�?      �readSingleTrk(drv, trk, head, TrkDesc%, srtDensity%)
�	    �
�3      �writeSingleTrk(drv, trk, head, TrkDesc%)
�	    �
�/    TrkDesc% += TrkDescSize% + TrkDataSize%
�  �
��
��
�
�1��writeSingleTrk(drv%, trk%, head%, TrkDesc%)
:� count%, density%, DataBuf%, multiSectFlg%, sectInfo%
D� lowSect%, sectSize%, sect%, sectFound%, add%, ID%, mustWrSect%
"count% = TrkDesc%?bufNumbSect%
$%density%= TrkDesc%?bufTrkDensity%
.&DataBuf% = TrkDesc% + TrkDescSize%
8� count%=0 �
B4  � blank track so just copy back ReadTrack data
L;  �writetrackChk(drv%, trk%, head%, density%, DataBuf%)
V�
`S  �makeWriteTrk(TrkDesc%, count%, density%, DataBuf%, WriteTrkBuf%,mustWrsect%)
j?  �writetrackChk(drv%, trk%, head%, density%, WriteTrkBuf%)
t.  multiSectFlg%= TrkDesc%?bufMultiSectFlg%
~%  � multiSectFlg% � mustWrsect% �
�8    � write track in one go by using memory DMA list
�A    � but only if a sector could not be written during Format
�%    lowSect%=TrkDesc%?bufLowSect%
�'    sectSize%=TrkDesc%?bufSectSize%
�)    �copyMemAddList(TrkDesc%, count%)
�b    �opsectors(Write% � (1<<5),drv%,trk%,head%,lowSect%,count%,sectSize%,density%,memAddList%)
�    � result% <> 0 �
�'      multiSectFlg%=� :� Disc error
�:      �"  writing:- track was non-standard  after all"
�	    �
�  �
�*  � (multiSectFlg%=0) � mustWrsect%  �
B    � catch all non-standard track formats, but only if a good

4    �  sector could not be written during Format
'    � (multiSectFlg%=0) � analyse �
2      �"  writing:- non-standard track layout"
(	    �
2"    � sectFound%= 0 � count%-1
<6      sectInfo%=�getSectInfo(TrkDesc%, sectFound%)
F,      � (sectInfo% � (� overIndex%))=0 �
PE        � if data area was read OK (& don't have any illegal IDs)
ZB        � and it was not deleted data, then provided data area
dF        �  has not already been correctly written with writetrack,
n+        � write the sector individually
x2        add%=�getDataPtr(TrkDesc%, sectFound%)
�0        ID%=�getSectID(TrkDesc%, sectFound%)
�#        sect%=&FF � (ID% >> 16)
�%        sectSize%=3 � (ID% >> 24)
�J        �writesectors(drv%,trk%,head%,sect%,1,sectSize%,density%,add%)
�      �
�	    �
�  �
��
��
�
�H  � make Write Track data using Track descriptor and Read Track (the
�C  �  latter having been overlaid with correct read sector data.
�>  � But ensure no illegal chrs appear in gaps or data area
6  � Output message if data area can't be recreated
U��makeWriteTrk(TrkDesc%, count%, density%, ReadBuf%, WriteTrkBuf%, � mustWrSect%)
G� sectFound%, sectSize%, SrcAdd%, SrcLowAdd%, DestAdd%, DestLowAdd%
"� convert%, info%
,mustWrSect%=�
6DestLowAdd%=WriteTrkBuf%
@SrcLowAdd%=ReadBuf%
J� sectFound%=0 � count%-1
T-  SrcAdd%=�getIDPtr(TrkDesc%, sectFound%)
^-  DestAdd%=DestLowAdd%+SrcAdd%-SrcLowAdd%
h-  info%=�getSectInfo(TrkDesc%,sectFound%)
r  � ID's AM & prior gap
|J  �makeAMandgap( SrcLowAdd%, SrcAdd%, DestLowAdd%, DestAdd%, density%)
�A  DestAdd%!0  = �getSectID(TrkDesc%,sectFound%)    :� copy ID
�#  � (info% � errNotFound%) =0 �
�7    DestAdd%?4  = &F7            :� to generate CRC
�6    DestLowAdd%= DestAdd%+5      :� byte after CRC
�  �
�A    � but if sector not found then copy readtrack CRC instead
�    DestAdd%?4 = SrcAdd%?4
�    DestAdd%?5 = SrcAdd%?5
�6    DestLowAdd%= DestAdd%+6      :� byte after CRC
�  �
�@  SrcLowAdd% = SrcAdd%+6       :� point first byte after CRC
�/  SrcAdd%=�getDataPtr(TrkDesc%, sectFound%)
�  � SrcAdd%<>0 �
    � if data area
/    DestAdd%=DestLowAdd%+SrcAdd%-SrcLowAdd%
"    � data area AM & prior gap
&K    �makeAMandgap(SrcLowAdd%, SrcAdd%, DestLowAdd%, DestAdd%, density%)
0    SrcLowAdd% = SrcAdd%
:    DestLowAdd%= DestAdd%
D9    SrcAdd% += �getDataLength(TrkDesc%, sectFound%)-1
NG    � copy up to end of data area transfer, convert any &F5-F7 chrs
XJ    �selcopyfwd (SrcLowAdd%, SrcAdd%, DestLowAdd%, density%, convert%)
bF    DestLowAdd% +=SrcAdd%-SrcLowAdd%+1 :� first byte after data...
l>    SrcLowAdd% = SrcAdd%+1             :� ..transfer areas
v=    � (info% � (errCRC% � errNotFound% � noRoomCRC%))=0 �
�A      � room for CRC AND read CRC was ok AND sector was found
�5      � (convert%=0) � ((info% � overIndex%)=0) �
�:        � AND writetrack can correctly write data area
�1        DestLowAdd%?0 = &F7   :� so force CRC
�8        SrcLowAdd%  +=2       :� and adjust source &
�?        DestLowAdd% +=1       :� dest addresses accordingly
�        � & set sector info
�A        �addSectInfo(TrkDesc%, sectFound%, dataDuringFormat%)
�<        info%=info% � dataDuringFormat% :� for use below
�      �
�J        � info%�(delData% � longData% � illegalTrk% � illegalIDbyt%) �
�H          � if can't write sector, but otherwise OK, and can't write
�2          � it during format, then print error
,          �printID(TrkDesc%, sectFound%)
1          � "CAN'T make an exact copy! Sorry"
8          DestLowAdd%?0 = &F7  :� but set CRC anyway
 9          SrcLowAdd%  +=2      :� and adjust pointers
*          DestLowAdd% +=1
4
        �
>      �
H	    �
R&    � (info% � (� overIndex%))=0 �
\!      � must write the sector
f      mustWrSect%=�
p	    �
z  �
��
�%SrcAdd%=TrkDesc%!bufEndValidData%
�*� copy to end of valid read track data
�F�selcopyfwd (SrcLowAdd%, SrcAdd%, DestLowAdd%, density%, convert%)
�@�fillEndOfTrk( SrcAdd%+1-ReadBuf% + WriteTrkBuf% , density%)
��
�
�>  � fills to end of write buffer with relevant filler byte
�$��fillEndOfTrk( add% , density%)
�� value%
�� density%=DDensity% �
�  value%=&4E
��
	  value%=&FF
	�
	;�fill(value%, add%, WriteTrkBuf% + TrkDataSize% - add%)
	$�
	.
	8K   � copies area of store but converts any illegal chrs(for writeTrack)
	B9   � Sets convert%=TRUE if it has to convert any char
	LD��selcopyfwd(SrcLowAdd%,SrcAdd%,DestLowAdd%,density%,� convert%)
	V� low%, hi%
	`$�getIllegal(density%, low%, hi%)
	jG� selcopyfwd, SrcLowAdd%, SrcAdd%, DestLowAdd%, low%, hi%, convert%
	t�
	~
	�/   � setup illegal chr range for writetrack
	�)��getIllegal(density%, � low%, � hi%)
	�� density% = DDensity% �
	�  low%=&F5:hi%=&F7
	��
	�  low%=&F5:hi%=&FE
	��
	��
	�
	�H��makeAMandgap(SrcLowAdd%, SrcAdd%, DestLowAdd%, DestAdd%, density%)
	�� density%=DDensity% �
	�A  �DDmakeAMandgap(SrcLowAdd%, SrcAdd%, DestLowAdd%, DestAdd%)
�

A  �SDmakeAMandgap(SrcLowAdd%, SrcAdd%, DestLowAdd%, DestAdd%)
�
�
(
2   � DD only
<@��DDmakeAMandgap(SrcLowAdd%, SrcAdd%, DestLowAdd%, DestAdd%)
F� V%, I%, J%, convert%
P+DestAdd%?-1 = SrcAdd%?-1   :� copy Mark
Z(DestAdd%?-2 = &F5          :� set AM
dDestAdd%?-3 = &F5
nDestAdd%?-4 = &F5
xJ%=DestAdd% - DestLowAdd%
�I%=5
�H� I%<=J% � DestAdd%?-I% =0:I% +=1 :� and set preceeding 2 bytes to 0
�@� I%<=J% � DestAdd%?-I% =0:I% +=1 :� (DestLowAdd permitting)
�V%=SrcAdd%?-I%
�&ȕ (V%=(SrcAdd%?-I%)) � (I% <= J%)
�@  DestAdd%?-I% = 0    :� and all preceeding bytes to 0 while
�<  I% +=1              :� source bytes don't change value
�-�              :� (DestLowAdd permitting)
�� I%<=J% �
�2  � then copy preceding gap back to SrcLowadd%
�K  �selcopyfwd (SrcLowAdd%, SrcAdd%-I%, DestLowAdd%, DDensity%,convert%)
��
��

   � SD only
@��SDmakeAMandgap(SrcLowAdd%, SrcAdd%, DestLowAdd%, DestAdd%)
"� I%, J%, convert%
,3DestAdd%?-1 = &F0 � (SrcAdd%?-1)   :� copy Mark
6I%=2
@J%=DestAdd% - DestLowAdd%
Jȕ (I% <= J%) � (I% <= 7)
T=  DestAdd%?-I% = 0      :� and preceeding by 6 bytes of 0
^6  I% +=1                :� (DestLowAdd permitting)
h�
r� I%<=J% �
|2  � then copy preceding gap back to SrcLowadd%
�K  �selcopyfwd (SrcLowAdd%, SrcAdd%-I%, DestLowAdd%, SDensity%,convert%)
��
��
�
�E   � tries both DD & SD before giving up, & returns density found
�<��readSingleTrk(drv, trk, head, TrkDesc%, � srtDensity%)
�)� endadd%, DataBuf%, density%, count%
�TrkDesc%?bufTrk%  = trk
�TrkDesc%?bufHead% = head
�density%=srtDensity%
��
�)  TrkDesc%?bufTrkDensity%  = density%
�(  DataBuf% = TrkDesc% + TrkDescSize%
J  endadd% = DataBuf% + MaxSect% -1 + (MaxTrkUnformat% >> (2-density%))
  �
F    � to test ReadTrack overrun, only repeat if ReadTrack overflow
&.    �fill(&55, DataBuf%, endadd%-DataBuf%)
06    �readtrack(drv, trk, head, density%, DataBuf%)
:    endValidData%=endadd%-1
D'    � findchangeback, endValidData%
N'  � (endadd% - endValidData%) > 500
X/  TrkDesc%!bufEndValidData% = endValidData%
b/  �analyseTrk(TrkDesc%, DataBuf%, density%)
l.  �readTrksSects (drv, TrkDesc%, density%)
v"  count%=TrkDesc%?bufNumbSect%
�  � count%=0 �
�>    density%= density% � 3   :� if no sectors toggle SD/DD
�  �
�!    � srtDensity%<>density% �
�      �" Continues as ";
�0      � density%=2 � �"Double"; � �"Single";
�      �" Density"
�      blank%=�
�E      srtDensity%=density%       :� if sectors, update srtDensity
�	    �
�  �
�� density%=srtDensity%
�� blank% �

  � count%<>0 �

    blank%=�

    �" No longer Blank"

   �

*�

4  � count%=0 �

>    blank%=�

H    �" Continues as Blank"

R  �

\�

f#�printUnusual(TrkDesc%, count%)

p� checkFormat �

zt  � ((TrkDesc%?bufNumbSect%) <> chkSectsPerTrk) � ((TrkDesc%?bufMultiSectFlg%)= �) � (density% <> chkDensity%) �

�@    �printLine(" ******* Track format failed check *******")

�  �

��

��

�

�J   � Analyses Read Track data and sets up Track descriptor accordingly

�H   � Ignore any 'apparent' sectors without associated data areas (or

�6   �  it appear as 'Sector not found' in any case)

�0   � if anything unusual unset multiSectFlg%

�.��analyseTrk(TrkDesc%, DataBuf%, density%)

�E� count%, add%, IDadd%, dataadd%, mark%, IDcorrupt, multiSectFlg%

�;� ID%, bytes%, firstIDsyncAdd%, endLastData%, remadeOK%

�"multiSectFlg%=�  :� ie default
count%=0
Kadd%=DataBuf% + 2   :� first ID AM must be at least 2 bytes into buffer
%endadd%=TrkDesc%!bufEndValidData%
$�
.&  �findID(add%, endadd%, density%)
8  � add%<>0 �
BC    � count%=maxSectsAllowed% � �'"Failed:- too many sectors":�
L    IDadd%=add%
V-    � count%=0 � firstIDsyncAdd%=IDadd%-4
`+    �setIDPtr(TrkDesc%, count%, IDadd%)
j=    �setSectInfo(TrkDesc%, count%, 0)  :� 0=default value
t9    �setSectID(TrkDesc%, count%, IDadd%!0) :� save ID
~    add% +=6
�     � (endadd%-add%) < 128 �
�:      � if there is a data area it overflows index, so
�B      � wrap around data from start of track (before first ID)
�)      � to ensure I see the data mark
�7      � copyfwd, DataBuf%, firstIDsyncAdd%, endadd%
�-      endadd% += firstIDsyncAdd%-DataBuf%
�	    �
�@    �findAM (add%,endadd%,density%) :� aim to find Data Area
�D    dataadd%=0                         :� default if no DataArea
�    � add% <>0 �
�>      mark%=(add%?-1)           :� must be between &F8-&FF
�      � mark% >= &FC �
G        add% -= 10              :� if not Data Area, turn back add%

      �
        dataadd%=add%
        � mark%= &F8 �
(           � its deleted data
2          multiSectFlg% = �
<6          �addSectInfo(TrkDesc%, count%, delData%)
F
        �
P      �
Z	    �
d/    �setDataPtr(TrkDesc%, count%, dataadd%)
n    � dataadd%=0 �
xG      � no data (so the ID will be ignored), so for TRACE sake only
�      multiSectFlg% = �
�1      �addSectInfo(TrkDesc%, count%, noData%)
�	    �
�F      � There is a data area, so only then keep a record of sector
�?      � and only then test for corrupt ID's or illegal ID's
�      � (IDadd%?3 > 3) �
�=        � probably corrupt ID (or maybe not ID just data)
�"        � density%=DDensity% �
�?          � remake ID & set =ID% then overwrite saved state
�8          � remakeID, mapID%, IDadd%, ID%, remadeOK%
�          � remadeOK%<>0 �
�3            � save remaded ID only if remadeOK%
�1            �setSectID(TrkDesc%, count%, ID%)
          �

        �
8          � leave it as it is, if its Single Density
"
        �
,      �
6C      �testIllegalId(TrkDesc%, count%, density%, multiSectFlg%)
@      count%=count%+1
J	    �
T  �
^� add%=0
h� count%<>0 �
r(  ID%=�getSectID(TrkDesc%, count%-1)
|'  bytes%=1 << (7+ (3 � (ID% >>24)))
�@  endLastData%= bytes%+5+4 + �getDataPtr(TrkDesc%, count%-1)
�2  � endLastData% > TrkDesc%!bufEndValidData% �
�C    � last sector's data area overflows Index, so mark the fact
�4    �addSectInfo(TrkDesc%, count%-1, overIndex%)
�$    � & change end of valid data
�F    endadd% = firstIDsyncAdd%-DataBuf% + TrkDesc%!bufEndValidData%
�"    � endadd% < endLastData% �
�      endLastData%=endadd%
�	    �
�/    � set end of valid data to shorter of -
�G    � 9 bytes after data area CRC (allows for min_gap=5 + ID_AM=4),
�1    � or start of first sector wrapped around
�4    � (ensures first ID will not be overwritten)
0    TrkDesc%!bufEndValidData% = endLastData%
  �
�
&,TrkDesc%?bufMultiSectFlg%= multiSectFlg%
0"TrkDesc%?bufNumbSect% = count%
:�
D
N< � on exit add% = address of ID (found) or 0 (NOT found)
X(��findID (� add%, endadd%, density%)
b� density%=DDensity% �
l  � DDfindID, add%, endadd%
v�
�  �
�!    � SDfindID, add%, endadd%
�D  � (add%=0) � ((add%?3)<= 3):� extra test for valid Size for SD
��
��
�
�F � on exit add% = address of address mark (found) or 0 (NOT found)
�(��findAM (� add%, endadd%, density%)
�� density%=DDensity% �
�  � DDfindAM, add%, endadd%
��
�  � SDfindAM, add%, endadd%
��
�

@  � IF Multi sector, setup memory pointer list & do one read
 C  � ELSE (or if above read fails) read each sector individually
*1  � if multi-sector read fails unset its flag
4.��readTrksSects (drv%, TrkDesc%, density%)
>@� sectFound%,trk%,head%,lowSect%,sectSize%,add%,IDadd%,sect%
H8� multiSectFlg%, count%, bytes%, info%, notRealSect%
R�
\A  notRealSect%=� :� break out for 'Sector not found' & re-try
f$  count% = TrkDesc%?bufNumbSect%
p  � count%<>0 �
z    trk% =TrkDesc%?bufTrk%
�    head%=TrkDesc%?bufHead%
�0    multiSectFlg%= TrkDesc%?bufMultiSectFlg%
�8    � -- many of below can set multiSectFlg% = FALSE
�4    �setLengths(TrkDesc%, count%, multiSectFlg%)
�    � multiSectFlg% �
�9      �setMultiSect (TrkDesc%, count%, multiSectFlg%)
�	    �
�    � multiSectFlg% �
�:      � read track in one go but using memory DMA list
�'      lowSect%=TrkDesc%?bufLowSect%
�)      sectSize%=TrkDesc%?bufSectSize%
�+      �copyMemAddList(TrkDesc%, count%)
�c      �opsectors(Read% � (1<<5),drv%,trk%,head%,lowSect%,count%,sectSize%,density%,memAddList%)
8      � result% <> 0 � multiSectFlg%=� :� Disc error
	    �
    � multiSectFlg%=0 �
$      � analyse �
.5        �"  reading:- non-standard track layout?"
8      �
BK      � catch all,deleted data,non-consecutive IDs, ID & DataArea error
L@      � illegal IDs Trk, and data areas that overlay next ID
V$      � sectFound%= 0 � count%-1
`        � notRealSect%=� �
j5          info%=�getSectInfo(TrkDesc%,sectFound%)
t7          � (info% � (illegalTrk% � noData%)) = 0 �
~J            � legal ID trk (on Arc)& data area(incl deldata) then read
�6            add%=�getDataPtr(TrkDesc%, sectFound%)
�4            ID%=�getSectID(TrkDesc%, sectFound%)
�'            sect%=&FF � (ID% >> 16)
�;            bytes%=�getDataLength(TrkDesc%, sectFound%)
�J            �opbytes(Read%,drv%,trk%,head%,sect%,bytes%,density%,add%)
�            � result%<>0 �
�K              �readSectErr(TrkDesc%, sectorFound%,result%,notRealSect%)
�            �
�          �
�D            � maybe this is not a sector atall but ID pattern is
�E            � part of a data area. Assume it is not a sector if a
�@            � previous sector has longData or noRoomCRC set.
@            � NOT a FOOL PROOF test but probably good enough

!            � sectFound%<>0 �
W              � ((longData% � noRoomCRC%) � �getSectInfo(TrkDesc%, sectFound%-1)) �
"                notRealSect%=�
(7                �deleteSect(TrkDesc%, sectorFound%)
2              �
<            �
F          �
P
        �
Z      �
d	    �
nE    TrkDesc%?bufMultiSectFlg%= multiSectFlg% :� in case its reset
x  �
�� notRealSect%=�
��
�
�B��readSectErr(TrkDesc%, sectorFound%, result%, � notRealSect%)
�@� Special actions on read sector error (eg Sector Not Found)
�� ID%, count%, sectSize%
�$� (result% � errNotFound%) <>0 �
�  � If Sector Not Found
�*  ID%=�getSectID(TrkDesc%, sectFound%)
�1  � ID% <> !�getIDPtr(TrkDesc%, sectFound%) �
�I    � If corrupt ID & Not Found, check for alternative for corrupt ID
�    Ȏ ID% �
�4      � &014B011C: ID%=&014F011C :notRealSect%=�
4      � &02B70029: ID%=&02D50029 :notRealSect%=�
4      � &02B40029: ID%=&03FC0029 :notRealSect%=�
4      � &00550129: ID%=&00770129 :notRealSect%=�
"4      � &00640129: ID%=&00A40129 :notRealSect%=�
,4      � &01770129: ID%=&01B70129 :notRealSect%=�
64      � &026A0129: ID%=&02D60129 :notRealSect%=�
@4      � &02FA0129: ID%=&03560129 :notRealSect%=�
J4      � &03660129: ID%=&03A60129 :notRealSect%=�
T4      � &02B50129: ID%=&03FD0129 :notRealSect%=�
^4      � &02750129: ID%=&02B50129 :notRealSect%=�
hB      � nb last one must be after penultimate one (as both are
r9      � alternative patterns for the same corrupt ID)
|	    �
�  �
�  � notRealSect%=� �
�<    � Sector Not Found AND corrupt ID has an alternative
�3    � so set stored value of ID% to alternative
�-    �setSectID(TrkDesc%, sectFound%, ID%)
�  �
�@    � Sector Not Found AND not an alternative for corrupt ID
�C    � so remove sector from track descriptor, as it is NOT a ID
�    notRealSect%=�
�+    �deleteSect(TrkDesc%, sectorFound%)
�  �
��
�D  � flag disc error on sector, in sect info, if sector was found
7  �addSectInfo(TrkDesc%, sectFound%, result% � &FF)
�
�
&
0(��deleteSect(TrkDesc%, sectorFound%)
:<� this was not a sector but part of a data area (or gap)
D6� so remove sector from track descriptor and reset
N<� any longData or noRoomCRC in the previous sector info.
X� I%, J%, infoSize%, count%
b"count% = TrkDesc%?bufNumbSect%
l%infoSize%= 1 << Log2SectInfoSize%
v5J%=TrkDesc% + bufSectDesc% + sectFound%*infoSize%
�2� I%=0 � (count%-1-sectFound%)*infoSize%-1 � 4
�  J%!I%=J%!(I%+infoSize%)
��
�� sectFound%<>0 �
�m  �setSectInfo(TrkDesc%, sectFound%-1,�getSectInfo(TrkDesc%, sectFound%-1) � (�(longData% � noRoomCRC%)))
��
�9TrkDesc%?bufNumbSect% -= 1  :� decrement stored count
��
�
�G  � if track is incorrect OR head, sector, or sectSize are =&F5-&F7
�C  � then unset multiSectFlg%, set sector info and print message
�D  � assumes ID has been saved (after any remaking of corrupt ID)
�@��testIllegalId(TrkDesc%, count%, density%, � multiSectFlg%)
� ID%, I%, T%, low%, hi%
$ID%=�getSectID(TrkDesc%, count%)
'� (ID% � &FF) <> TrkDesc%?bufTrk% �
 3  � ID's Trk is not real track (illegal on Arc)
*  multiSectFlg%=�
41  �addSectInfo(TrkDesc%, count%, illegalTrk%)
>�
H/� ((ID% >> 8) � &FF) <> TrkDesc%?bufHead% �
R)  multiSectFlg%=�: � being over safe?
\  � debug �
f1    � **** can this be done elsewhere ****???
p"    �printID(TrkDesc%, count%)
z)    �"Head incorrect, but acceptable"
�  �
��
�$�getIllegal(density%, low%, hi%)
�� I%=1 � 3
�  T%=(ID% � &FF)
�$  � (T% >= low%) � (T% <= hi%) �
�=    � I can't write ID as it has illegal writeTrack bytes
�    multiSectFlg%=�
�5    �addSectInfo(TrkDesc%, count%, illegalIDbyt%)
�  �
�  ID%=(ID% >> 8)
��
��

>   � For each sector set Length of max read data transfer.
F   � In case of protected disc, ensure it cannot overwrite next ID
$/   � around track (actually 'next ID - 4').
.I   � The set Length will also be used during any data area write, BUT
8G   � If any sector write data might overwrite 'next ID - 4' (ie gap
BF   � from end of data to 'next ID - 4' is less than 5 bytes), then
LF   � set Long data flag and unset multisector flag. Furthermore if
VB   � there is not even room for a 'format generated CRC', also
`   � set no-Room-CRC flag.
j3��setLengths(TrkDesc%, count%, � multiSectFlg%)
tB� followingIDadd%, sectFound%, bytes%, add%, IDadd%, gap%, ID%
~� density%
�%density%= TrkDesc%?bufTrkDensity%
�-followingIDadd%=TrkDesc%!bufEndValidData%
�#� sectFound%= count%-1 � 0 � -1
�,  IDadd%=�getIDPtr(TrkDesc%, sectFound%)
�,  add%=�getDataPtr(TrkDesc%, sectFound%)
�*  ID%=�getSectID(TrkDesc%, sectFound%)
�(  bytes%=1 << (7+ ((ID% >> 24) � 3))
�0  gap% = (followingIDadd%-4) - (add%+bytes%)
�  � gap% < 5 �
�5    �addSectInfo(TrkDesc%, sectFound%, longData%)
�    multiSectFlg%=�
�    � gap% < 2 �
8      �addSectInfo(TrkDesc%, sectFound%, noRoomCRC%)

      � gap% < 0 �
J        bytes% += gap%   :� reduce transfer size if it extends to ID-4
      �
(	    �
2  �
<2  �setDataLength(TrkDesc%, sectFound%, bytes%)
F  followingIDadd%=IDadd%
P�
Z�
d
nK   � find if sector numbers are consecutive, and all have the same size
x&   � if not set Multi sector False
�E   � if Multi sector still set, setup Multi-sector descriptor and
�   �  memory pointer list
�5��setMultiSect(TrkDesc%, count%, � multiSectFlg%)
�G� max%,min%,sector%,IDadd%,dataadd%,sectNumb%, restOfID%, sectSize%
�	� ID%
�max%=-1 :min%=256
�� sector%=0 � count%-1
�'  ID%=�getSectID(TrkDesc%, sector%)
�  � sector%=0 �
�!    restOfID%=&FF00FFFF � ID%
�!    sectSize%=(ID% >> 24) � 3
�  �
�*    � restOfID% <> (&FF00FFFF � ID%) �
      multiSectFlg%=�
	    �
  �
"!  sectNumb%=&FF � (ID% >> 16)
,)  � sectNumb% > max% � max%=sectNumb%
6)  � sectNumb% < min% � min%=sectNumb%
@�
J3� ((max%-min%) <> (count%-1)) � multiSectFlg%=�
T� multiSectFlg% �
^!  TrkDesc%?bufLowSect% = min%
h&  TrkDesc%?bufSectSize% =sectSize%
r  � sector%=0 � count%-1
|/    dataadd%=�getDataPtr(TrkDesc%, sector%)
�)    ID%=�getSectID(TrkDesc%, sector%)
�,    sectNumb%=(&FF � (ID% >> 16)) - min%
�J    TrkDesc%!(bufMemAddList% + (sectNumb%<<3))= dataadd% :� memory add
�L    TrkDesc%!(bufMemAddList%+4+(sectNumb%<<3))=1 << (7+sectSize%):� size
�  �
��
��
�
�@  � copy MultiSector Memory Address List into Buffer for use
�&��copyMemAddList(TrkDesc%, count%)
�� I%,J%
�J%=((count%-1)<<3)+4
�� I%=0 � J% � 4
1  memAddList%!I%=TrkDesc%!(bufMemAddList%+I%)
�
�
&
07  � Print any unusual sector followed by reason why
:"  � IF debug print all sectors
D$��printUnusual(TrkDesc%, count%)
N!� sectFound%, info%, discerr%
X� count%<>0 �
b  � sectFound%=0 � count%-1
l:    info%=&FFFFFF � �getSectInfo(TrkDesc%, sectFound%)
v    � debug � (info%<>0) �
�(      �printID(TrkDesc%, sectFound%)
�      � debug � �
�	    �
�    � info% <> 0 �
�(      � (info% � illegalTrk%) <> 0 �
�0        �sectText("Illegal ID Trk (on Arc)")
�      �
�*      � (info% � illegalIDbyt%) <> 0 �
�(        �sectText("Illegal ID byte")
�      �
�$      � (info% � noData%) <> 0 �
�)        �sectText("Has NO data area")
�      �
%      � (info% � delData%) <> 0 �
*        �sectText("Deleted data area")
      �
 &      � (info% � longData%) <> 0 �
*9        �sectText("Data TOO long:- Overlaps next ID")
4      �
>)        � (info% � noRoomCRC%) <> 0 �
H;          �sectText("Data long:- gap too short, write")
R
        �
\      �
f'      � (info% � overIndex%) <> 0 �
p-        �sectText("Data overflows index")
z      �
�"      discerr% = (info% � &FF)
�      � discerr% <> 0 �
�6        Ȏ (discerr% � (errNotFound% � errCRC%)) �
�B          � (errNotFound% � errCRC%):�sectText("ID CRC error")
�>          � errCRC%:      �sectText("Data area CRC error")
�;          � errNotFound%: �sectText("Sector not Found")
�
        �
�4        � discerr% � �(errCRC% � errNotFound%) �
�:          �sectText("Unknown disc err &"+�~(discerr%))
�
        �
�      �
�	    �
�  �
�
�

$
.E� ** all following assume count% starts from 0 as first sector **
8
B&��setIDPtr(TrkDesc%, count%, add%)
L2!�sectDesc(TrkDesc%, count%, bufIDptr%) = add%
V�
`
j ݤgetIDPtr(TrkDesc%, count%)
t,=!�sectDesc(TrkDesc%, count%, bufIDptr%)
~
�(��setDataPtr(TrkDesc%, count%, add%)
�4!�sectDesc(TrkDesc%, count%, bufDataptr%) = add%
��
�
�"ݤgetDataPtr(TrkDesc%, count%)
�.=!�sectDesc(TrkDesc%, count%, bufDataptr%)
�
�-��setDataLength(TrkDesc%, count%, bytes%)
�:!�sectDesc(TrkDesc%, count%, bufTransLength%) = bytes%
��
�
�%ݤgetDataLength(TrkDesc%, count%)
2=!�sectDesc(TrkDesc%, count%, bufTransLength%)


&��setSectID(TrkDesc%, count%, ID%)
2!�sectDesc(TrkDesc%, count%, bufSectID%) = ID%
(�
2
<!ݤgetSectID(TrkDesc%, count%)
F-=!�sectDesc(TrkDesc%, count%, bufSectID%)
P
Z+��setSectInfo(TrkDesc%, count%, value%)
d7!�sectDesc(TrkDesc%, count%, bufSectInfo%) = value%
n�
x
�+��addSectInfo(TrkDesc%, count%, value%)
�I�setSectInfo(TrkDesc%,count%, value% � �getSectInfo(TrkDesc%,count%))
��
�
�#ݤgetSectInfo(TrkDesc%, count%)
�/=!�sectDesc(TrkDesc%, count%, bufSectInfo%)
�
�)ݤsectDesc(TrkDesc%, count%, offset%)
�D=TrkDesc%+bufSectDesc% + offset% + (count% << Log2SectInfoSize%)
�
�
�$��fill(value%, start%, bytelen%)
�%B%=value%: C%=start%: D%=bytelen%

� fill
�

"%��setDefaultDiscRec(drv, density)
,Ȏ density �
65  � SDensity%: �setDiscRec(drv, 10, 1, SDensity%)
@5  � DDensity%: �setDiscRec(drv,  5, 3, DDensity%)
J�
T�
^
h4��setDiscRec(drv, sectPerTrk, sectSize, density)
r,sectSize=sectSize � &3 :� only bits used
|discRec%?0 = 7+sectSize
�discRec%?1 = sectPerTrk
�discRec%?2 = 2 :� heads
�discRec%?3 = density
�LdiscRec%!16 = 160*(discRec%?1)*(1 << (discRec%?0)): � disc size in bytes
�discRec%?34 = drv
�discRec%!64 = &20000000
��
�
�,� assumes that discRec% is already setup
�ݤdiscAdd(trk, head, sect)
�E=(sect + (head + trk*(discRec%?2))*(discRec%?1) ) << (discRec%?0)
�
�� �engageDisc(drv)
 5� ensure that disc is properly engaged & rotating
 � T%
 $�rtz(drv) :� rotate disc via rtz
 &T%=�
 0:� � � >(T%+400) :� and wait for disc to stop - Engaged
 :%�rtz(drv) :� then rotate it again
 D�
 N
 X��rtz(drv)
 b/�optrack(Restore%, drv, 0, 0, DDensity%, 0)
 l�
 v
 ���seek(drv, trk)
 �.�optrack(Seek%, drv, trk, 0, DDensity%, 0)
 ��
 �
 �1��readtrack(drv, trk, head, density, dmaAdd%)
 �:�optrack(ReadTrack%, drv, trk, head, density, dmaAdd%)
 ��
 �
 �2��writetrack(drv, trk, head, density, dmaAdd%)
 �;�optrack(WriteTrack%, drv, trk, head, density, dmaAdd%)
 ��
 �
 �9��writetrackChk(drv%, trk%, head%, density%, dmaAdd%)
!F� do write track, if error(write protected) print message & repeat
!�
!7  �writetrack(drv%, trk%, head%, density%, dmaAdd%)
!   � result%<>0 �
!*[    �printSrt("****  Come on, remove the disc's write protect, then press space  ****")
!4    �pressspace
!>	    �
!H  �
!R� result%=0
!\�
!f
!p5��optrack(cmd%, drv, trk, head, density, dmaAdd%)
!zJ� uses default dummy discRec%, so ADFS doesn't try to read disc format
!�$�setDefaultDiscRec(drv, density)
!�:�discop(cmd%, drv, �discAdd(trk, head, 0), dmaAdd%, 0)
!��
!�
!�F��readsectors(drv,trk,head,sect,numbSect,sectSize,density,dmaAdd%)
!�I�opsectors(Read%,drv,trk,head,sect,numbSect,sectSize,density,dmaAdd%)
!��
!�
!�G��writesectors(drv,trk,head,sect,numbSect,sectSize,density,dmaAdd%)
!�J�opsectors(Write%,drv,trk,head,sect,numbSect,sectSize,density,dmaAdd%)
!��
!�
!�7� -- Read bytes, starting from begining of a sector
"E� -- Bytes need not be whole sectors, but must not overflow track
"C��opbytes(cmd%, drv, trk, head, sect, bytes%, density, dmaAdd%)
".� sectPerTrk, discAdd%, sectSize, numbSect
"$sectSize=-1
".5� repeat, ends up fooling ADFS so it always works
"8�
"B  sectSize +=1
"L,  numbSect=1+((bytes%-1) >>(7+sectSize))
"V+� numbSect <&100 :� must be single byte
"`AsectPerTrk = sect + numbSect :� fool ADFS, so it always works
"j3�setDiscRec(drv, sectPerTrk, sectSize, density)
"t(discAdd% = �discAdd(trk, head, sect)
"~1�discop(cmd%, drv, discAdd%, dmaAdd%, bytes%)
"��
"�
"�I��opsectors(cmd%,drv,trk,head,sect,numbSect,sectSize,density,dmaAdd%)
"�� sectPerTrk, discAdd%
"�AsectPerTrk = sect + numbSect :� fool ADFS, so it always works
"�3�setDiscRec(drv, sectPerTrk, sectSize, density)
"�(discAdd% = �discAdd(trk, head, sect)
"�D�discop(cmd%, drv, discAdd%, dmaAdd%, numbSect << (discRec%?0) )
"��
"�
"�.  � on exit result%=0 or disc error number
"�2��discop(cmd%, drv, discAdd%, dmaAdd%, bytes%)
#R1%= cmd% � (discRec% << 6)
#
-R2%= (drv << 29) + (discAdd% � &1FFFFFFF)
#bș XAdfsSwi% , 0, R1%, R2%, dmaAdd%, bytes% � result%,,nextDiscByte%, nextMemByte%, BytesLeft%
#'� result% � �discerr(cmd%, result%)
#(�
#2
#<��discerr(cmd%, � result%)
#F� (result% � (1 << 31)) �
#P(  �'"Error &";~result% � &3FFFFFFF:�
#Z�
#d-  � ((!result%) � &FFFFFF)=AdfsDiscErr% �
#n;    � analyse � � ((cmd%=ReadTrack%)�((result%?3)=4)) �
#x#      �print_err(cmd%, result%)
#�	    �
#�    result%=result%?3
#�  �
#�7    � ((!result%) � &FFFFFF) <> AdfsWriteProtect% �
#�&      �print_err(cmd%, result%): �
#�	    �
#�  �
#��
#��
#�
#�4� 1770/1772 or ADFS restrictions/characteristics
#�D� ADFS - will not allow you to write deleted data other than via
#�J�        the format(write track) command, nor will it signal any error
$K�        on reading deleted data (including multi-sector deleted data).
$C�      - The only disc errors signalled are (plus combination)-
$J�        &10 - Sector not found (incl. ID CRC error or data mark> &FB)
$"D�        &08 - CRC error (incl. ID & data CRC or data mark< &F8)
$,E�        n.b. write protect is signalled but not as a disc error.
$6&� 1770 - For disc errors see above
$@I�      - DD ID mark can have any value between &FC-&FF (not just &FE)
$JJ�      - DD Data area mark can be any of &F8-&FB (not just &FB or &F8)
$TF�        Note ADFS masks any differnce in deleted and normal data.
$^?�      - ID head number is ignored, so need not be correct.
$hJ�      - Only the bottom 2 bits of SectSize are used, rest are ignored
$rB�      - Missing clocks in either ID or data are not detected,
$|C�        providing the CRC is set as if the values were &A1 for
$�D�        '&F5' missing clocks (ie you can't use &F7 to set CRC).
$�F�      - Write Track cannot use in data or ID area, byte values of
$�7�         &F5-&F7  for     Single or Double Density
$�J�         &F8-&FB, &FE for Single Density, unless CRC is S/W generated
$�G�        The former results in wrong data written, while the latter
$�7�        results in an incorrect CRC (using '&F7').
$�F�        However, there is one way of writing the actual values of
$�F�        &F5,&F6,&F7, during write track, if the byte immeadiately
$�E�        follows a &F7. So it will be very difficult to generate.
$�I�      - For double density, none of the 12 sync bytes(ie 0 preceding
$�G�        AM) need be there, thus previous data area can go right up
$�%�        to the AM of the next ID
$�
%5� ******* Various standard disc formats *********
%A�            sect_per_trk   first_sect   sect_size    density
%
%&>� ADFS(800K)       5            0          3 (1024)      2
%0>� ADFS(640K)      16            0          1  (256)      2
%:>� BBC DFS         10            0          1  (256)      1
%D>� MS-DOS 3         9            1          2  (512)      2
%N
%X
%b��pressspace
%l�("fx 15,1")
%v� � �(0)=32
%��
%�
%���printbits(byte%)
%�� I%
%�� I%=7 � 0 � -1
%�-  � ((byte% >> I%) � 1) � � �"1" � � �"0"
%��
%��
%�
%���checkDiscIn(text$)
%�� copydisc �
%�  � source=dest �
%�:    �0,�)"  Insert "+text$+" disc, then press space";
&    �pressspace
&    �0,�)�50," ");�0,�);
&  �
& �
&*�
&4
&>��printLine(T$)
&H@� at start of next free line, print text followed by newline
&R;� print at start of next free line followed by  newline
&\�printSrt(T$)
&f�
&p�
&z
&���printSrt(T$)
&�<� at start of next free line, print text without newline
&�� �<>0 � �
&�	�;T$;
&��
&�
&���printID(TrkDesc%, count%)
&�>� At start of next free line, print real trk/head/density,
&�0�  then ID bytes. All without newline at end
&�(� ID%, trk%, head%, sect%, sectSize%
&�$ID%=�getSectID(TrkDesc%, count%)
&�trk%=  &FF � ID%
&�head%= &FF � (ID% >> 8)
'sect%= &FF � (ID% >> 16)
'sectSize%=&FF � (ID% >> 24)
'�printSrt("")
'$#� (TrkDesc%?bufTrkDensity%)=2 �
'.  �;"DDensity";
'8�
'B  �;"SDensity";
'L�
'V� �8);" ID: ";
'`� �13);"Trk=";trk%;
'j� �21);"Hd=";head%;
't� �28);"Sect=";sect%;
'~� �37);"Size=";sectSize%;
'��;":-";
'��
'�
'���sectText(T$)
'��;�47,�);T$
'��
'�
'���print_err(cmd%, add%)
'�� I%
'��7
'��printSrt("Disc ")
'�)� cmd%=Verify% � �"verify sector(s)";
(%� cmd%=Read% � �"read sector(s)";
(
'� cmd%=Write% � �"write sector(s)";
(&� cmd%=ReadTrack% � �"read track";
((� cmd%=WriteTrack% � �"write track";
((� cmd%=Seek% � �"seek";
(2� cmd%=Restore% � �"rtz";
(<�" error:- ";
(FI%=4
(Pȕ add%?I%
(Z  � add%?I%
(d
  I%=I%+1
(n�
(x�
(��
(�
(�Z��menu(� copydisc, � source, � dest, � srttrack, � endtrack, � firstHead, � numbHeads)
(�� 0
(��19,0,4,0,0,0
(��28);"W A R N I N G"
(�R�"  This program may only be used to make a backup copy of your own software."
(�R�"  It is your (the User's) responsiblity to ensure that any software copied,"
(�0�"  using this program, is done so legally."
(�
(�'�20,6);"DUP:- THE DISC DUPLICATOR"
(�(�20,7);"--------------------------"
(�,�18,8);"(c) Softcorn    Version ";vers$
)
)
copysel=1
)copyVpos=10
)"�0,copyVpos);
),4�10);" 1. Copy full double-sided 80 track disc"
)64�10);" 2. Copy full single-sided 80 track disc"
)@+�10);" 3. Copy selected portions only"
)J
)TanalVpos=14
)^�0,analVpos);
)h7�10);" 4. Analyse full double-sided 80 track disc"
)r7�10);" 5. Analyse full single-sided 80 track disc"
)|.�10);" 6. Analyse selected portions only"
)�
)�drvsel=7
)�drvVpos=18
)��0,drvVpos);
)�"�10);" 7. Using just drive 0"
)�"�10);" 8. Using just drive 1"
)�'�10);" 9. From drive 0 To drive 1"
)�'�10);"10. From drive 1 To drive 0"
)�
)�
goVpos=23
)��0,goVpos);
)��10);"11. DO :-"
)�
*selVpos=26
*exitMenu%=�
*select=0
*&�
*0� select=11 � exitMenu%=�
*:copydisc=(copysel <=3)
*D� copysel<>3 � copysel<>6 �
*N  srttrack=0
*X  endtrack=79
*b  firstHead=0
*l  � copysel=1 � copysel=4 �
*v    numbHeads=2
*�  �
*�    numbHeads=1
*�  �
*��
*�� drvsel=7 � drvsel=9 �
*�  source=0
*��
*�  source=1
*��
*�� drvsel=7 � drvsel=10 �
*�  dest=0
*��
*�  dest=1
+�
+  � I%=copyVpos � goVpos
+    �8,I%);" "
+   �
+*  � copysel <=3 �
+4#    �8,copyVpos+copysel-1);"*"
+>!    �8,drvVpos+drvsel-7);"*"
+H8    �20,goVpos);"** Copy from ";source;" to ";dest;
+R  �
+\#    �8,analVpos+copysel-4);"*"
+f)    �8,drvVpos+(1 � (drvsel-7)));"*"
+p*    �20,goVpos);"** Analyse ";source;
+z  �
+�*  �;", Tracks ";srttrack;"-";endtrack;
+�  � numbHeads=2 �
+�    �;", both sides **";
+�  �
+�)    �;", side ";firstHead;" only **";
+�  �
+�  �;�(78-�)," ")
+�  �0,selVpos);�78," ");
+�  � � exitMenu% �
+�     �20,selVpos);"SELECT ";
+�    � select
+�!    � select=999 � �dispProcs
+�5    � (select>=1) � (select <=6) � copysel=select
,5    � (select>=7) � (select <=10) � drvsel=select
,%    � (select=3) � (select = 6) �
,@      �getSelective("First Track", selVpos, srttrack, 0, 79)
,$      � srttrack<>79 �
,.F       �getSelective("Last Track",selVpos, endtrack, srttrack, 79)
,8      �
,BD      �getSelective("Number of sides", selVpos, numbHeads, 1, 2)
,L      � numbHeads=1 �
,V:       �getSelective("Side", selVpos, firstHead, 0, 1)
,`      �
,j	    �
,t  �
,~� exitMenu%
,��0,goVpos+2);
,��
,�
,�2��getSelective(T$, vpos, � value%, min%, max%)
,��
,�  �0,vpos);�78," ");
,�,  �18,vpos);T$;" (";min%;"-";max%;") ";
,�  � value%
,�+  � (value%<min%) � (value%>max%) � � 7
,�)� (value% >= min%) � (value% <= max%)
,��
,�
-��dispProcs
-
�
-8�" On a single drive, a disc change is needed every"
-4�"   ";�(MaxTrks%/2);" tracks (double sided), ";
-((� ;MaxTrks%;" tracks (single sided)"
-2�
-<!�" Try (& f1 to view result)"
-F^�"PROCreadsectors(drive, track, head, sector, numbSect, sectSize,density, ";MainBuffer%")"
-PC�"PROCreadtrack (drive, track, head, density, ";MainBuffer%" )"
-ZJ�"PROCreadSingleTrk(drive, track, head, ";MainBuffer%", srtDensity% )"
-d;analyse=debug :� only for use of typed PROCs after exit
-n�
-x�
-�
-�� �logo
-�� 7
-��'
-�0�"��                           p          ";
-�0�"��                        p|���|p       ";
-�0�"��                       z?��o����t     ";
-�1�"��                      _��&`""o����}0   ";
-�0�"��                      h6?    o�����4  ";
-�0�"��x||0_||0||||||_||0  _p2%app  �|||0|0 |";
-�0�"���1+%�'+��```�`�'+� 5�������55 �`k5�}��";
-�0�"��+�}0�  ���� � �   ,5�������5=$�|~%�ou�";
-�1�"��p k��0_��   � �0_| 5�������55 �+} �""��";
.1�"��o��%+��'�   � +��'  ""`c,lt`   � ku� *�";
.1�"��                      ""o5�u   8|||||| ";
.0�"��                        j�?yp~������� ";
."0�"��                         o����������� ";
.,0�"��                          `/�������?! ";
.6�" DUP the Disc Duplicator"
.@5�'''''"(public domain s/w, no profit based use)";
.J
T%=�(500)
.T�
.^
.h
��init
.rBMaxTrkUnformat% = 4*�((6250*1.03)/4)  :� Exact number of Words
.|MaxSect%=1024
.�,TrkDataSize%=MaxTrkUnformat%+MaxSect%+64
.�ATrkDescSize%=�initBufoffsets         :� exact number of Words
.�
.�� discRec% 100
.�$� memAddList% maxSectsAllowed%*8
.�
.�B� mapID% holds ID map descriptors (see end of prog for format)
.�� mapID% &12000
.�;�("*Load DupIDmap "+�~mapID%) :� generated by DupIDtest
.�
.�1� put all other DIMs before here except code%
.�leaveSpare=10000
.�� dummy% 1
/Dbuffersize=4*�((�-dummy%-leaveSpare)/4) :� Exact number of Words
/ � MainBuffer% buffersize +16
/JMainBuffer%=16*�((MainBuffer% +15)/16):� on 16 byte boundary for debug
/&
/09MaxTrks%= �(buffersize/(TrkDataSize% + TrkDescSize%))
/:GMaxTrks% -= 3 :� for safety cos ReadTrk sometimes runs for too long
/D
/NIWriteTrkBuf%=MainBuffer%+buffersize-TrkDataSize% :� use overflow area
/X
/bcodelength=1000
/lC� code% codelength  :� must be last DIM to ensures code%> &FFFF
/v>                      :� cos of BBC BASIC (6502) emulation
/�
Verify%=0
/�Read%=1
/�Write%=2
/�ReadTrack%=3
/�WriteTrack%=4
/�Seek%=5
/�Restore%=6
/�SDensity%=1
/�DDensity%=2
/�AdfsSwi%=&40240
/� XAdfsSwi%=AdfsSwi% � (1<<17)
/�AdfsDiscErr%=&108C7
/�AdfsWriteProtect%=&108C9
0AltDefectBit%=&10
0	�code
0 � clears buffers
0 �fill(0,discRec%,70)
0*9�fill(0,MainBuffer%,buffersize) :� is this needed ???
04*�("key1 *MEDIT "+�~(MainBuffer%)+"|M")
0>+�("key2 *MEDIT "+�~(WriteTrkBuf%)+"|M")
0H�
0R
0\ݤinitBufoffsets
0fK� initialises all variables that are offsets pointers into track buffer
0pD� and returns offset for start of track data (ie for Read Track)
0z3 � note each track in buffer will be made up of
0�& � - A Track descriptor, including
0� �     - general track info
0�L �     - followed by a list of pointers for each sector (both ID & Data)
0�2 �     - followed by a multi-sector descriptor
0�C � - Followed by the tracks 'ReadTrack data, supperimposed with
0� �    readSector data.
0�
0�E maxSectsAllowed%=32  :� determines reserved space for track info
0�
0�� GENERAL TRACK INFO
0�4bufTrk%=0            :� real track number (byte)
0�4bufHead%=1           :� real head number  (byte)
0�=bufNumbSect%=2       :� number of sectors on track (byte)
1HbufMultiSectFlg%=3   :� TRUE = track can use multi-sector read/write
1K � (ie no read errors and sectors are all consecutive; skew is allowed)
1*bufTrkDensity%=4     :� density (byte)
1$AbufEndValidData%=8   :� end of valid data in Trk buffer(word)
1.2 base%=16            :� bytes 5-7 & 12-15 free
18
1B� SECTOR INFORMATION LIST
1L<� entries are in the order that sectors are around track
1V=� each entry - pointer to start of ID (absolute word add)
1`D�            - pointer to start of Data Area (absolute word add)
1j:�              (if = 0 then no data area for ID found)
1tL�            - byte length of sector read/write data op. It will be less
1~F�              than sector size if next sect ID would be corrupted
1�G�            - Save version of ID, use this version instead of what
1�E�              is in track buffer in case of possible corrupt ID.
1�E�            - sector information, if <>0 THEN don't write sector
1�C�                catches ID CRC err, Deleted data, DataCRC err,
1�F�                illegal Arc ID, Data Area too long, No Data Area,
1�G�                and Data Area could and was written during format.
1�J Log2SectInfoSize%=5  :� Log 2 of size of Sector Info (= 32 (8 words))
1�bufSectDesc%=base%
1�&bufIDptr%   =0       :� bytes  0-3
1�&bufDataptr% =4       :� bytes  4-7
1�'bufTransLength%=8    :� bytes  8-11
1�'bufSectID%=12        :� bytes 12-15
2'bufSectInfo%=16      :� bytes 16-19
2
6                     :� byte 16 = disc err result%
28errCRC%=      1<< 3   :� CRC error bit in disc error
2?errNotFound%= 1<< 4   :� sector not found bit in disc error
2(#                     :� byte 17
225delData%=   1<< 8     :� bit 1= deleted Data Area
2<0noData%=    1<< 9     :� bit 2= No Data Area
2F>illegalTrk%= 1<< 10   :� bit 3= Illegal ID Trk (ie on Arc)
2P@illegalIDbyt%=1<<11   :� bit 4= Illegal ID byte (ie &F5-&F7)
2ZFlongData%=  1<< 12    :� bit 5= Data too close to next ID to write
2dAnoRoomCRC%= 1<< 13    :� bit 6= So long no space for even CRC
2nIoverIndex%= 1<< 14    :� bit 7= Data area goes over Index(must write)
2xKdataDuringFormat%= 1 << 16 :� Data could and was written during format.
2�C base% += maxSectsAllowed% << Log2SectInfoSize% :� 7 words free
2�
2�,� MULTI-SECTOR DATA AREA READ/WRITE INFO
2�A�  This info is only valid if Multi-Sector flag above is true
2�@bufLowSect%=base%       :� byte 0 lowest sector around track
2�1bufSectSize%=base%+1    :� byte 1 Sector Size
2�/ base% += 4             :� bytes 2 - 3 free
2�>� memory pointer list for discOp one entry for each sector
2�K�  entries must be in consectutive sector number order not in the order
2�$�  they appear around the track.
2�&� Each entry consists of two words
2�;�  first  = absolute address of Sector's data in memory
2�C�  second = sector size in bytes (nb they must all be the same)
3B� note list must be word aligned, so assuming track descriptor
3�  starts at word aligned
34 base%= 4*�((base%+3)/4)  :� ensure word aligned
3"bufMemAddList%= base%
3,  base% += 8*maxSectsAllowed%
36
3@/� start of where read track data is stored,
3JC�  nb data areas will be overwritten by actual read sector data
3TE�     but Address Marks and gaps will be still in Read Track form
3^=�     Write track must use a copy of this (but corrected)
3h= base%
3r
3|
3�
��code
3�� pass= 0 � 2 � 2
3�P%=code%
3�[     OPT pass
3�
3�; get BASIC's � parameters
3�@; �E they must all be word aligned integer variables, � even
3�7;      !param% is allowed, only param% or param%(x)
3�C; R1= Reserved, usually used by caller for BASIC's link address
3�/; R9= Pointer to list of L-value parameters
3�&; R10=number of parameters (max=6)
3�=; For format of � parameter block see standard User guide
3�; especially for R9
4; on exit R0 is corrupt
4;         R1 is unaltered
4B;         R2=first parameter  (if there is one) else unchanged
4&B;         R3=second parameter (if there is one) else unchanged
40?;         .. .....   ......    .. ..... .. ...  ...   .....
4:B;         R7=sixth parameter  (if there is one) else unchanged
4D;
4N.; call this routine after the BASIC � by -
4X;;         MOV   R1, R14     ;saves BASIC's link address
4bK;         BL   paramvalues  ;load all BASIC's parameters into registers
4l>;         MOV   R14, R1     ;restores BASIC's link address
4v;
4�:; to update a BASIC variable (last parameter) at end -
4�=;         LDR   R0, [R9]    ;get last BASIC parameter add
4�=;         STR   Rx, [R0]    ;& update it with value in Rx
4�0;         MOV   pc, R14              ;return
4�
4�.paramvalues
4�ADD   R0, R9, R10, LSL #3
4�CMP   R10, #1
4�LDRGE R2, [R0, #-8]!
4�&LDRGE R2, [R2]       ;R2=1st param
4�CMP   R10, #2
4�LDRGE R3, [R0, #-8]!
4�&LDRGE R3, [R3]       ;R3=2nd param
5CMP   R10, #3
5LDRGE R4, [R0, #-8]!
5&LDRGE R4, [R4]       ;R4=3rd param
5 CMP   R10, #4
5*LDRGE R5, [R0, #-8]!
54LDRGE R5, [R5]
5>CMP   R10, #5
5HLDRGE R6, [R0, #-8]!
5RLDRGE R6, [R6]
5\CMP   R10, #6
5fLDRGE R7, [R0, #-8]!
5p%LDRGE R7, [R7]      ;R7=6th param
5zMOV   pc,  R14      ;return
5�
5�
5�:;fill byte area, R1=byte value, R2=startadd, R3=length
5�	.fill
5�.�   R1, R1, #&FF          ;use LS byte ony
5��R   R1, R1, R1, LSL #8
5�@�R   R1, R1, R1, LSL #16   ;byte repeated in all bytes in R1
5�ADD   R0, R2, R3
5�.fillbytstart
5�&TST   R0, #3       \word boundary?
5�BEQ   fillwords
5�CMP   R0, R2
5�BEQ   fillend
6STRB  R1, [R0,#-1]!
6B     fillbytstart
6.fillwords
6$SUB   R3, R0, R2
6.CMP   R3, #4
68STRGE R1, [R0,#-4]!
6BBGT   fillwords
6L.fillbytend
6VCMP   R0, R2
6`STRNEB R1, [R0,#-1]!
6jBNE   fillbytend
6t.fillend
6~MOV   pc, R14   \return
6�
6�A;find, backwards, were data byte changes & return the address
6� ; � findchangeback startadd%
6�1;on entry 1st BASIC parameter = start address
6�?;on exit  1st BASIC parameter = address where change occurs
6�";           R0, R1, R2 corrupt
6�.findchangeback
6�MOV   R1, R14
6�=BL   paramvalues      ;R2 set = start add (1st parameter)
6�MOV   R14, R1
6�LDRB  R0, [R2]
6�.findchangeloop
7LDRB  R1, [R2, #-1]!
7
CMP   R1, R0
7BEQ  findchangeloop
72LDR   R0, [R9]   ;get last BASIC parameter add
7(6STR   R2, [R0]   ;& update it with remade ID in R1
72&MOV   pc, R14              ;return
7<
7F;copy bytes forward
7P-;  '� copyfwd, startadd, endadd, destadd'
7Z3;on entry 1st BASIC parameter = source startadd
7d6;         2nd BASIC parameter = source end address
7n9;         3rd BASIC parameter = destination start add
7x&;         R0,R1,R2,R3,R4 corrupted
7�.copyfwd
7�DMOV   R1, R14         ;R2 set = source start add (1st parameter)
7�BBL   paramvalues      ;R3 set = source end add (2nd parameter)
7�BMOV   R14, R1         ;R4 set = dest start add (3rd parameter)
7�.copyfwdloop
7�LDRB  R0, [R2], #1
7�STRB  R0, [R4], #1
7�CMP   R2, R3
7�BLE  copyfwdloop
7�!MOV   pc, R14         ;return
7�
7�<;copy bytes forward but convert any illegal bytes to &FF
7�3;on entry 1st BASIC parameter = source startadd
86;         2nd BASIC parameter = source end address
89;         3rd BASIC parameter = destination start add
8=;         4th BASIC parameter = low of illegal byte range
8">;         5th BASIC parameter = high of illegal byte range
8,7;         6th BASIC parameter = exit parameter only
86D;on exit  6th BASIC parameter = � if any bytes needed converting
8@/;         R0,R1,R2,R3,R4,R5,R6,R7 corrupted
8J.selcopyfwd
8TDMOV   R1, R14         ;R2 set = source start add (1st parameter)
8^BBL   paramvalues      ;R3 set = source end add (2nd parameter)
8hBMOV   R14, R1         ;R4 set = dest start add (3rd parameter)
8r7                      ;R5 to R6 = illegal chr range
8|)MOV   R7, #0          ;R7 = 0 default
8�.selcopyfwd1
8�LDRB  R0, [R2], #1
8�CMP   R0, R5
8�BLT   selcopyfwd2
8�)CMP   R0, R6          ;if illegal chr
8�%MOVLE R0, #&FF        ;set to &FF
8�IMVNLE R7, #(1-1)      ;& set R7 to -1 if any byte had to be converted
8�.selcopyfwd2
8�STRB  R0, [R4], #1
8�CMP   R2, R3
8�BLE  selcopyfwd1
8�.LDR   R0, [R9]   ;get last BASIC parameter
8�$STR   R7, [R0]   ;& set it to R5
9 MOV   pc, R14        ;return
9
9L;fill backwards(destination) while source(backwards) continues to remain
9&0; the same, or until end(source) is reached.
90;;on entry ALL following must be integer BASIC variables
9:4;         1st BASIC parameter = source start add
9DL;         2nd BASIC parameter = source end add (must be < 1st parameter)
9N9;         3rd BASIC parameter = destination start add
9X6;         4th BASIC parameter = value to fill with
9b?;         5th BASIC parameter = exit value only (see below)
9lJ;on exit 5th BASIC variable is set = address where source byte changed
9vH;                                  or (endadd-1) if no change occurs
9�.limitfillback
9�4MOV   R1, R14         ;R2 set = source start add
9�2BL   paramvalues      ;R3 set = source end add
9�2MOV   R14, R1         ;R4 set = dest start add
9�.                      ;R5 set = fill value
9�1LDRB  R1, [R2]        ;get first source value
9�;ADD   R4, R4, #1      ; increment R3 (as initial value)
9�.limitfillback1
9�6CMP   R2, R3          ; stop filling when past end
9�BLT   limitfillbackend
9�STRB  R5, [R4, #-1]!
9�LDRB  R0, [R2, #-1]!
9�7CMP   R0, R1          ;or when source value changes
:BEQ   limitfillback1
:.limitfillbackend
:2LDR   R0, [R9]   ;get last BASIC parameter add
: )STR   R2, [R0]   ;& update it with R2
:*&MOV   pc, R14              ;return
:4
:>
:H0;Find Double Density ID address mark pattern
:RB; as for findAM below but only ID address marks are looked for
:\5; except R5 is also corrupted (used to save link)
:f
.DDfindID
:p#MOV   R5, R14        ;save link
:zBL   DDfindAM
:�&MOV   R14, R5        ;restore link
:�-CMP   R2, #0         ;add=0?    then exit
:�BEQ   DDfindIDend
:�LDRB  R0, [R2,#-1]
:�<CMP   R0, #&FC       ;mark=&FC,&FD,&FE, or &FF then exit
:�BLT  DDfindID
:�.DDfindIDend
:� MOV   R15, R14       ;return
:�
:�
:�D;Find Double Density address mark pattern from 'Read Track' data
:�"; including extra tests for ID
:�,;on entry 1st BASIC parameter = startadd
;/;         2nd BASIC parameter = end address
;,;on exit  1st BASIC parameter is updated
;';                  = 0 if not found
;$?;                  <> 0, = address of start of Address Mark
;.-;         R2= same as BASIC 1st parameter
;81;         R3= BASIC 2nd parameter (unaltered)
;B";         R0, R1, R4 corrupted
;L
.DDfindAM
;VMOV   R1, R14
;`DBL   paramvalues      ;R2 set = 1st parameter add(start address)
;jBMOV   R14, R1         ;R3 set = 2nd parameter add(end address)
;tSUB   R2, R2, #1
;~.DDfindAMloop
;�CMP   R2, R3
;�BEQ  DDAMnotfound
;�ELDRB  R0, [R2, #1]!  ;R2 ends up = add of current byte comparison
;�*CMP   R0, #&A1       ;first &A1 at add
;�BNE  DDfindAMloop
;�LDRB  R0, [R2, #1]
;�-CMP   R0, #&A1       ;second &A1 at add+1
;�BNE  DDfindAMloop
;�/LDRB  R0, [R2, #2]   ;found &A1,&A1 pattern
;�CMP   R0, #&F8
;�BLT  DDfindAMloop
;�D.DDfoundAM           ;FOUND  &A1,&A1,&Fx pattern, where &Fx >&F7
<AADD   R2, R2, #3     ; point to first byte of ID or Data Area
<
B   DDfindAMend
<.DDAMnotfound
<MOV  R2, #0
<(.DDfindAMend
<2>LDR   R0, [R9, #8]   ;get 1st parameter add(start address)
<<-STR   R2, [R0]       ;& update it with R2
<FMOV   pc, R14
<P
<Z
<d0;Find Single Density ID address mark pattern
<nB; as for findAM below but only ID address marks are looked for
<x5; except R7 is also corrupted (used to save link)
<�
.SDfindID
<�#MOV   R7, R14        ;save link
<�BL   SDfindAM
<�&MOV   R14, R7        ;restore link
<�-CMP   R2, #0         ;add=0?    then exit
<�LDRNEB R0, [R2,#-1]
<�-CMPNE R0, #&FE       ;mark=&FE? then exit
<�BNE  SDfindID
<�MOV   pc, R14       ;return
<�
<�D;find Single Density address mark pattern from 'Read Track' data
<�); & set corrupted Mark byte correctly
<�=;�E this is � a fool-proof test, (but has not failed yet)
=,;on entry 1st BASIC parameter = startadd
=/;         2nd BASIC parameter = end address
=,;on exit  1st BASIC parameter is updated
="(;                  =  0 if not found
=,?;                  <> 0, = address of start of Address Mark
=6-;         R2= same as BASIC 1st parameter
=@1;         R3= BASIC 2nd parameter (unaltered)
=J&;         R0, R1, R4, R5 corrupted
=T
.SDfindAM
=^MOV   R1, R14
=hDBL   paramvalues      ;R2 set = 1st parameter add(start address)
=rBMOV   R14, R1         ;R3 set = 2nd parameter add(end address)
=|SUB   R2, R2, #1
=�.SDfindAMloop
=�CMP   R2, R3
=�BEQ  SDAMnotfound
=�FLDRB  R0, [R2, #1]!   ;R2 ends up = add of current byte comparison
=�LDRB  R4, [R2, #-2]
=��   R1, R4, #&30
=�8�   R1, R1, R0      ;R1= possible reconstructed Mark
=�#CMP   R1, #&FE        ;ID mark?
=�*CMPNE R1, #&FB        ;data Area mark?
=�)CMPNE R1, #&F8        ;del data mark?
=�BNE SDfindAMloop
=�CMP   R4, #0
=�;CMPNE R4, #&FF        ;test add-2 to add-5 = &00 or &FF
>BNE  SDfindAMloop
>&MVN   R5, #(2-1)      ;(set R5=-2)
>.SDfindAMsyncloop
>&!CMN   R5, #5          ;(=-5?)
>0BEQ  SDmaybeAM
>:SUB   R5, R5, #1
>DLDRB  R0, [R2, R5]
>NCMP   R0, R4
>XBEQ  SDfindAMsyncloop
>bBNE  SDfindAMloop
>l.SDmaybeAM
>vLDRB  R0, [R2, #-1]
>��   R0, R0, R4
>��   R0, R0, #&F0
>�NBNE  SDfindAMloop     ;also test that add%-2 & add%-3 have same top 4 bits
>�MOV   R4, #&FF
>�&MVN   R5, #(8-1)      ;(set R5=-8)
>�.SDffAMloop
>�#CMN   R5, #14          ;(=-14?)
>�BEQ  SDfoundAM
>�SUB   R5, R5, #1
>�LDRB  R0, [R2, R5]
>�?CMP   R0, R4          ;& test add%-9 to add%-14 are all &FF
>�BEQ  SDffAMloop
>�BNE  SDfindAMloop
?.SDfoundAM
?<STRB  R1, [R2]        ;if AM found then reconstruct Mark
?KADD   R2, R2, #1      ; point to first byte of ID or data area if found
? B   SDfindAMend
?*.SDAMnotfound
?4MOV   R2, #0
?>.SDfindAMend
?H>LDR   R0, [R9, #8]   ;get 1st parameter add(start address)
?R-STR   R2, [R0]       ;& update it with R2
?\MOV   pc, R14
?f
?p
?z,;reassemble ID corrupted by 'Read Track'
?�8;   '� remakeID, mapID%, add%, remadeID%, remadeOK%'
?�:; should only be called if sectSize is corrupt (ie >3)
?�!;   & for double density IDs.
?�>; on entry BASIC parameter 1 = start of mapID% descriptors
?�>;                parameter 2 = address of start or ID read
?�?;                parameter 3 = � remade ID (as 4 byte word)
?�8;                parameter 4 = � � if cant remake ID
?�:; on exit  parameter 3 = reassembled ID (4 bytes only)
?�3;          parameter 4 = 0 if no match is found
?�+;          R0,R1,R2,R3,R4,R5,R6 corrupt
?�;
?�3;Format of IDmap can be found at end of Program
?�
@
.remakeID
@MOV   R1, R14
@ABL   paramvalues         ;R2 = mapID% (BASIC's 1st parameter)
@$?MOV   R14, R1            ;R3 = add% (BASIC's 2nd parameter)
@.4MOV   R4, #0             ;R4 = descriptor number
@8>MVN   R5, #(1-1)         ;R5 = byte offset in ID read (-1)
@B.nxtIDbyte
@LADD   R5, R5, #1
@V9LDRB  R1, [R3, R5]       ;R1 = byte value looking for
@`.nxtdesc
@j?ADD   R6, R2, R4, LSL #3 ;R6= pointer to current descriptor
@t4LDR   R0, [R6]           ;R0= current descriptor
@~CMP   R1, R0, LSR #24
@�5BEQ   valuefound         ;if value does not match
@�;LDR   R4, [R6, #4]       ;get second word of descriptor
@�CMP   R4, #0
@�>BNE nxtdesc              ;if <>0 it is a descriptor number
@�J.failedremake            ;if =0 then can't remake ID so exit with R4=0
@�B   remakeend
@�.valuefound
@�HBIC   R0, R0, #(&FF <<24) ;mask out value in descriptor (top 8 bits)
@�?TSTS  R0, #(1 << 23)      ;if bit 23 of descriptor is clear
@�J�Q R4, R0              ;  descriptor = descriptor number for next byte
@�ABEQ   nxtIDbyte           ;  so go get next byte & descriptor
@�A.foundenddesc             ;else we've found the ID (in R0) so
A/�   R1, R0, #&7F        ; load track (byte)
A
�   R5, R0, #(1 << 7)
A/�R   R1, R1, R5, LSL#1   ; � in head (byte)
A�   R5, R0, #(&FF << 8)
A(*�R   R1, R1, R5, LSL #8  ; � in sector
A2�   R5, R0, #(3 << 16)
A</�R   R1, R1, R5, LSL #8  ; � in sector size
AF2MVN   R4, #(1-1)          ; found so set R4=-1
AP.remakeend
AZ5LDR   R5, [R9]      ;get last BASIC parameter add
Ad1STR   R4, [R5]      ;& set =-1 if found � = 0
An7LDR   R5, [R9, #8]  ;get last-1 BASIC parameter add
Ax9STR   R1, [R5]      ;& update it with remade ID in R1
A�&MOV   pc, R14              ;return
A�
A�.endcode
A�]
A�� (P%-code%) > codelength �
A�$ �"assembler code too long":�7:�
A��
A��
A��
A�
A�'�  ******  ID map format  *********
A�?� mapID is made up of a list of descriptors numbered 0 to n
A� � each descriptor is 2 words
B
� word0 -
B!� ms byte   = byte value read
BH� ls 3 bytes= If bit 23=0, descriptor number of next byte in pattern
B"F�              else holds unique ID, ie end of unique byte pattern
B,,�              format is Bits  0-6 track
B6+�                                7 head
B@-�                             8-15 sector
BJ2�                            16-17 sector Size
BT
� word1 -
B^J� if <>0, descriptor number of alternative value at this byte position
Bh(�   else, no more alternative values
�
00000000  0d 00 0a 0a f4 20 3e 44  75 70 0d 00 14 04 0d 00  |..... >Dup......|
00000010  1e 33 2a 7c 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |.3*|************|
00000020  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00000040  2a 0d 00 28 33 2a 7c 2a  20 20 20 20 20 20 20 20  |*..(3*|*        |
00000050  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
*
00000070  20 20 2a 2a 0d 00 32 33  2a 7c 2a 20 20 44 55 50  |  **..23*|*  DUP|
00000080  2c 20 74 68 65 20 64 69  73 63 20 64 75 70 6c 69  |, the disc dupli|
00000090  63 61 74 6f 72 20 20 28  63 29 20 53 6f 66 74 63  |cator  (c) Softc|
000000a0  6f 72 6e 20 20 2a 2a 0d  00 3c 33 2a 7c 2a 20 20  |orn  **..<3*|*  |
000000b0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 2d  |               -|
000000c0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000000d0  20 20 20 20 20 20 20 20  2a 2a 0d 00 46 33 2a 7c  |        **..F3*||
000000e0  2a 20 20 50 75 62 6c 69  63 20 44 6f 6d 61 69 6e  |*  Public Domain|
000000f0  20 73 6f 66 74 77 61 72  65 2c 20 62 75 74 20 6e  | software, but n|
00000100  6f 74 20 66 6f 72 20 75  73 65 20 2a 2a 0d 00 50  |ot for use **..P|
00000110  33 2a 7c 2a 20 20 20 6f  72 20 73 61 6c 65 20 72  |3*|*   or sale r|
00000120  65 6c 61 74 65 64 20 74  6f 20 70 72 6f 66 69 74  |elated to profit|
00000130  2e 20 20 20 20 20 20 20  20 20 20 20 20 20 2a 2a  |.             **|
00000140  0d 00 5a 33 2a 7c 2a 20  20 20 20 20 20 20 20 20  |..Z3*|*         |
00000150  20 20 20 20 20 20 20 20  2d 20 20 20 20 20 20 20  |        -       |
00000160  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000170  20 2a 2a 0d 00 64 33 2a  7c 2a 20 20 43 6f 70 69  | **..d3*|*  Copi|
00000180  65 73 20 64 6f 75 62 6c  65 20 6f 72 20 73 69 6e  |es double or sin|
00000190  67 6c 65 20 64 65 6e 73  69 74 79 20 64 69 73 63  |gle density disc|
000001a0  73 20 20 20 2a 2a 0d 00  6e 33 2a 7c 2a 20 20 6f  |s   **..n3*|*  o|
000001b0  66 20 27 61 6e 79 27 20  66 6f 72 6d 61 74 20 28  |f 'any' format (|
000001c0  65 67 20 41 44 46 53 20  4c 2f 44 2f 45 2c 20 44  |eg ADFS L/D/E, D|
000001d0  46 53 2c 20 20 20 20 2a  2a 0d 00 78 33 2a 7c 2a  |FS,    **..x3*|*|
000001e0  20 20 4d 53 44 4f 53 2c  20 41 54 41 52 49 20 53  |  MSDOS, ATARI S|
000001f0  54 2c 20 41 4d 49 47 41  20 65 74 63 2c 20 61 6e  |T, AMIGA etc, an|
00000200  64 20 61 20 77 69 64 65  20 20 2a 2a 0d 00 82 33  |d a wide  **...3|
00000210  2a 7c 2a 20 20 76 61 72  69 65 74 79 20 6f 66 20  |*|*  variety of |
00000220  70 72 6f 74 65 63 74 65  64 20 64 69 73 63 73 29  |protected discs)|
00000230  20 20 20 20 20 20 20 20  20 20 20 20 20 2a 2a 0d  |             **.|
00000240  00 b4 33 2a 7c 2a 20 20  20 20 20 20 20 20 20 20  |..3*|*          |
00000250  20 20 20 20 20 20 20 2d  20 20 20 20 20 20 20 20  |       -        |
00000260  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000270  2a 2a 0d 00 be 33 2a 7c  2a 20 20 42 41 53 49 43  |**...3*|*  BASIC|
00000280  20 2b 20 6d 61 63 68 69  6e 65 20 63 6f 64 65 20  | + machine code |
00000290  2b 20 64 61 74 61 20 66  69 6c 65 20 20 20 20 20  |+ data file     |
000002a0  20 20 20 2a 2a 0d 00 c8  33 2a 7c 2a 20 20 20 20  |   **...3*|*    |
000002b0  20 20 20 28 45 64 69 74  20 61 74 20 79 6f 75 72  |   (Edit at your|
000002c0  20 70 65 72 69 6c 29 20  20 20 20 20 20 20 20 20  | peril)         |
000002d0  20 20 20 20 20 20 2a 2a  0d 00 d2 33 2a 7c 2a 20  |      **...3*|* |
000002e0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
*
00000300  20 20 20 20 20 20 20 20  20 2a 2a 0d 00 dc 33 2a  |         **...3*|
00000310  7c 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  ||***************|
00000320  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
00000330  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 0d 00  |**************..|
00000340  e6 04 0d 00 f0 10 76 65  72 73 24 3d 22 31 2e 30  |......vers$="1.0|
00000350  31 22 0d 00 fa 04 0d 00  fb 29 ee 20 85 20 e7 20  |1".......). . . |
00000360  9f 3d 31 37 20 8c 20 f1  3a e0 20 8b 20 f6 3a f1  |.=17 . .:. . .:.|
00000370  22 20 61 74 20 4c 69 6e  65 20 22 3b 9e 3a e0 0d  |" at Line ";.:..|
00000380  01 04 09 f2 6c 6f 67 6f  0d 01 0e 09 f2 69 6e 69  |....logo.....ini|
00000390  74 0d 01 18 04 0d 01 22  0b 64 65 62 75 67 3d a3  |t......".debug=.|
000003a0  0d 01 2c 04 0d 01 36 4a  f4 20 73 65 74 2c 74 6f  |..,...6J. set,to|
000003b0  20 63 68 65 63 6b 20 61  6c 6c 20 74 72 61 63 6b  | check all track|
000003c0  73 20 68 61 76 65 20 61  20 66 69 78 65 64 20 6e  |s have a fixed n|
000003d0  75 6d 62 65 72 20 6f 66  20 67 6f 6f 64 20 63 6f  |umber of good co|
000003e0  6e 74 69 67 75 6f 75 73  20 73 65 63 74 73 0d 01  |ntiguous sects..|
000003f0  40 11 63 68 65 63 6b 46  6f 72 6d 61 74 3d a3 0d  |@.checkFormat=..|
00000400  01 4a 19 63 68 6b 44 65  6e 73 69 74 79 25 3d 44  |.J.chkDensity%=D|
00000410  44 65 6e 73 69 74 79 25  0d 01 54 14 63 68 6b 53  |Density%..T.chkS|
00000420  65 63 74 73 50 65 72 54  72 6b 3d 39 0d 01 5e 13  |ectsPerTrk=9..^.|
00000430  e7 20 63 68 65 63 6b 46  6f 72 6d 61 74 20 8c 0d  |. checkFormat ..|
00000440  01 68 41 20 20 f1 22 2a  2a 2a 2a 20 43 68 65 63  |.hA  ."**** Chec|
00000450  6b 69 6e 67 20 53 65 63  74 6f 72 73 20 70 65 72  |king Sectors per|
00000460  20 54 72 61 63 6b 20 3d  22 3b 63 68 6b 53 65 63  | Track =";chkSec|
00000470  74 73 50 65 72 54 72 6b  3b 22 20 2a 2a 2a 2a 22  |tsPerTrk;" ****"|
00000480  0d 01 72 05 cd 0d 01 7c  04 0d 01 86 05 f5 0d 01  |..r....|........|
00000490  90 47 20 20 f2 6d 65 6e  75 28 63 6f 70 79 64 69  |.G  .menu(copydi|
000004a0  73 63 2c 73 6f 75 72 63  65 2c 64 65 73 74 2c 73  |sc,source,dest,s|
000004b0  72 74 74 72 61 63 6b 2c  65 6e 64 74 72 61 63 6b  |rttrack,endtrack|
000004c0  2c 66 69 72 73 74 48 65  61 64 2c 6e 75 6d 62 48  |,firstHead,numbH|
000004d0  65 61 64 73 29 0d 01 9a  20 20 20 61 6e 61 6c 79  |eads)...   analy|
000004e0  73 65 3d 64 65 62 75 67  20 84 20 ac 20 63 6f 70  |se=debug . . cop|
000004f0  79 64 69 73 63 0d 01 a4  40 20 20 f2 61 63 74 69  |ydisc...@  .acti|
00000500  6f 6e 28 73 6f 75 72 63  65 2c 64 65 73 74 2c 73  |on(source,dest,s|
00000510  72 74 74 72 61 63 6b 2c  65 6e 64 74 72 61 63 6b  |rttrack,endtrack|
00000520  2c 66 69 72 73 74 48 65  61 64 2c 6e 75 6d 62 48  |,firstHead,numbH|
00000530  65 61 64 73 29 0d 01 ae  49 20 20 f1 27 22 20 20  |eads)...I  .'"  |
00000540  20 20 20 43 6f 6d 70 6c  65 74 65 64 3a 2d 20 20  |   Completed:-  |
00000550  20 50 72 65 73 73 20 53  50 41 43 45 20 74 6f 20  | Press SPACE to |
00000560  43 6f 6e 74 69 6e 75 65  20 28 6f 72 20 65 73 63  |Continue (or esc|
00000570  61 70 65 20 74 6f 20 65  78 69 74 29 22 3b 0d 01  |ape to exit)";..|
00000580  b8 11 20 20 f2 70 72 65  73 73 73 70 61 63 65 0d  |..  .pressspace.|
00000590  01 c2 07 fd 20 a3 0d 01  cc 05 e0 0d 01 d6 04 0d  |.... ...........|
000005a0  01 e0 04 0d 01 ea 3f dd  f2 61 63 74 69 6f 6e 28  |......?..action(|
000005b0  73 6f 75 72 63 65 2c 64  65 73 74 2c 73 72 74 74  |source,dest,srtt|
000005c0  72 61 63 6b 2c 65 6e 64  74 72 61 63 6b 2c 66 69  |rack,endtrack,fi|
000005d0  72 73 74 48 65 61 64 2c  6e 75 6d 62 48 65 61 64  |rstHead,numbHead|
000005e0  73 29 0d 01 f4 0c 62 6c  61 6e 6b 25 3d a3 0d 01  |s)....blank%=...|
000005f0  fe 19 73 72 74 44 65 6e  73 69 74 79 25 3d 44 44  |..srtDensity%=DD|
00000600  65 6e 73 69 74 79 25 0d  02 08 27 4d 61 78 44 69  |ensity%...'MaxDi|
00000610  73 63 54 72 6b 73 25 20  3d a8 28 4d 61 78 54 72  |scTrks% =.(MaxTr|
00000620  6b 73 25 2f 6e 75 6d 62  48 65 61 64 73 29 0d 02  |ks%/numbHeads)..|
00000630  12 16 66 69 72 73 74 54  72 6b 25 3d 73 72 74 74  |..firstTrk%=srtt|
00000640  72 61 63 6b 0d 02 1c 21  54 72 6b 73 4c 65 66 74  |rack...!TrksLeft|
00000650  25 3d 31 2b 65 6e 64 74  72 61 63 6b 2d 73 72 74  |%=1+endtrack-srt|
00000660  74 72 61 63 6b 0d 02 26  14 c8 95 20 54 72 6b 73  |track..&... Trks|
00000670  4c 65 66 74 25 20 3e 20  30 0d 02 30 22 20 20 e7  |Left% > 0..0"  .|
00000680  20 54 72 6b 73 4c 65 66  74 25 20 3e 20 4d 61 78  | TrksLeft% > Max|
00000690  44 69 73 63 54 72 6b 73  25 20 8c 0d 02 3a 1e 20  |DiscTrks% ...:. |
000006a0  20 20 20 6e 75 6d 62 54  72 6b 73 25 3d 4d 61 78  |   numbTrks%=Max|
000006b0  44 69 73 63 54 72 6b 73  25 0d 02 44 07 20 20 cc  |DiscTrks%..D.  .|
000006c0  0d 02 4e 1b 20 20 20 20  6e 75 6d 62 54 72 6b 73  |..N.    numbTrks|
000006d0  25 3d 54 72 6b 73 4c 65  66 74 25 0d 02 58 07 20  |%=TrksLeft%..X. |
000006e0  20 cd 0d 02 62 55 20 20  f2 63 6f 70 79 4d 75 6c  | ...bU  .copyMul|
000006f0  74 69 54 72 6b 73 28 73  6f 75 72 63 65 2c 64 65  |tiTrks(source,de|
00000700  73 74 2c 66 69 72 73 74  54 72 6b 25 2c 6e 75 6d  |st,firstTrk%,num|
00000710  62 54 72 6b 73 25 2c 66  69 72 73 74 48 65 61 64  |bTrks%,firstHead|
00000720  2c 6e 75 6d 62 48 65 61  64 73 2c 73 72 74 44 65  |,numbHeads,srtDe|
00000730  6e 73 69 74 79 25 29 0d  02 6c 1b 20 20 66 69 72  |nsity%)..l.  fir|
00000740  73 74 54 72 6b 25 20 2b  3d 6e 75 6d 62 54 72 6b  |stTrk% +=numbTrk|
00000750  73 25 0d 02 76 1b 20 20  54 72 6b 73 4c 65 66 74  |s%..v.  TrksLeft|
00000760  25 20 2d 3d 6e 75 6d 62  54 72 6b 73 25 0d 02 80  |% -=numbTrks%...|
00000770  05 ce 0d 02 8a 05 e1 0d  02 94 04 0d 02 9e 57 dd  |..............W.|
00000780  f2 63 6f 70 79 4d 75 6c  74 69 54 72 6b 73 28 73  |.copyMultiTrks(s|
00000790  6f 75 72 63 65 2c 64 65  73 74 2c 66 69 72 73 74  |ource,dest,first|
000007a0  54 72 6b 25 2c 6e 75 6d  62 54 72 6b 73 25 2c 66  |Trk%,numbTrks%,f|
000007b0  69 72 73 74 48 65 61 64  2c 6e 75 6d 62 48 65 61  |irstHead,numbHea|
000007c0  64 73 2c 20 f8 20 73 72  74 44 65 6e 73 69 74 79  |ds, . srtDensity|
000007d0  25 29 0d 02 a8 08 ea 20  54 25 0d 02 b2 1a f2 63  |%)..... T%.....c|
000007e0  68 65 63 6b 44 69 73 63  49 6e 28 22 53 4f 55 52  |heckDiscIn("SOUR|
000007f0  43 45 22 29 0d 02 bc 3b  e7 20 28 66 69 72 73 74  |CE")...;. (first|
00000800  54 72 6b 25 20 3d 20 73  72 74 74 72 61 63 6b 29  |Trk% = srttrack)|
00000810  20 84 20 28 28 73 6f 75  72 63 65 3d 64 65 73 74  | . ((source=dest|
00000820  29 20 80 20 63 6f 70 79  64 69 73 63 29 20 8c 0d  |) . copydisc) ..|
00000830  02 c6 19 20 20 f2 65 6e  67 61 67 65 44 69 73 63  |...  .engageDisc|
00000840  28 73 6f 75 72 63 65 29  0d 02 d0 05 cd 0d 02 da  |(source)........|
00000850  58 f2 64 6f 4d 75 6c 74  69 54 72 6b 73 28 52 65  |X.doMultiTrks(Re|
00000860  61 64 25 2c 20 73 6f 75  72 63 65 2c 20 66 69 72  |ad%, source, fir|
00000870  73 74 54 72 6b 25 2c 20  6e 75 6d 62 54 72 6b 73  |stTrk%, numbTrks|
00000880  25 2c 20 66 69 72 73 74  48 65 61 64 2c 20 6e 75  |%, firstHead, nu|
00000890  6d 62 48 65 61 64 73 2c  20 73 72 74 44 65 6e 73  |mbHeads, srtDens|
000008a0  69 74 79 25 29 0d 02 e4  10 e7 20 63 6f 70 79 64  |ity%)..... copyd|
000008b0  69 73 63 20 8c 0d 02 ee  21 20 20 f2 63 68 65 63  |isc ....!  .chec|
000008c0  6b 44 69 73 63 49 6e 28  22 44 45 53 54 49 4e 41  |kDiscIn("DESTINA|
000008d0  54 49 4f 4e 22 29 0d 02  f8 30 20 20 e7 20 28 66  |TION")...0  . (f|
000008e0  69 72 73 74 54 72 6b 25  20 3d 20 73 72 74 74 72  |irstTrk% = srttr|
000008f0  61 63 6b 29 20 84 20 28  73 6f 75 72 63 65 3d 64  |ack) . (source=d|
00000900  65 73 74 29 20 8c 0d 03  02 19 20 20 20 20 f2 65  |est) .....    .e|
00000910  6e 67 61 67 65 44 69 73  63 28 64 65 73 74 29 0d  |ngageDisc(dest).|
00000920  03 0c 07 20 20 cd 0d 03  16 58 20 20 f2 64 6f 4d  |...  ....X  .doM|
00000930  75 6c 74 69 54 72 6b 73  28 57 72 69 74 65 25 2c  |ultiTrks(Write%,|
00000940  20 64 65 73 74 2c 20 66  69 72 73 74 54 72 6b 25  | dest, firstTrk%|
00000950  2c 20 6e 75 6d 62 54 72  6b 73 25 2c 20 66 69 72  |, numbTrks%, fir|
00000960  73 74 48 65 61 64 2c 6e  75 6d 62 48 65 61 64 73  |stHead,numbHeads|
00000970  2c 20 73 72 74 44 65 6e  73 69 74 79 25 29 0d 03  |, srtDensity%)..|
00000980  20 05 cd 0d 03 2a 05 e1  0d 03 34 04 0d 03 3e 57  | ....*....4...>W|
00000990  dd f2 64 6f 4d 75 6c 74  69 54 72 6b 73 28 63 6d  |..doMultiTrks(cm|
000009a0  64 25 2c 20 64 72 76 2c  20 66 69 72 73 74 54 72  |d%, drv, firstTr|
000009b0  6b 25 2c 20 6e 75 6d 62  54 72 6b 73 25 2c 20 66  |k%, numbTrks%, f|
000009c0  69 72 73 74 48 65 61 64  2c 20 6e 75 6d 62 48 65  |irstHead, numbHe|
000009d0  61 64 73 2c 20 f8 20 73  72 74 44 65 6e 73 69 74  |ads, . srtDensit|
000009e0  79 25 29 0d 03 48 19 ea  20 54 72 6b 44 65 73 63  |y%)..H.. TrkDesc|
000009f0  25 2c 20 74 72 6b 2c 20  68 65 61 64 0d 03 52 18  |%, trk, head..R.|
00000a00  54 72 6b 44 65 73 63 25  3d 4d 61 69 6e 42 75 66  |TrkDesc%=MainBuf|
00000a10  66 65 72 25 0d 03 5c 30  e3 20 74 72 6b 3d 66 69  |fer%..\0. trk=fi|
00000a20  72 73 74 54 72 6b 25 20  b8 20 28 66 69 72 73 74  |rstTrk% . (first|
00000a30  54 72 6b 25 20 2b 20 6e  75 6d 62 54 72 6b 73 25  |Trk% + numbTrks%|
00000a40  20 2d 31 29 0d 03 66 33  20 20 e3 20 68 65 61 64  | -1)..f3  . head|
00000a50  3d 66 69 72 73 74 48 65  61 64 20 b8 20 28 66 69  |=firstHead . (fi|
00000a60  72 73 74 48 65 61 64 20  2b 20 6e 75 6d 62 48 65  |rstHead + numbHe|
00000a70  61 64 73 20 2d 31 29 0d  03 70 0f 20 20 20 20 f1  |ads -1)..p.    .|
00000a80  8a 30 2c bc 29 3b 0d 03  7a 2e 20 20 20 20 e7 20  |.0,.);..z.    . |
00000a90  63 6d 64 25 3d 52 65 61  64 25 20 8c 20 f1 20 22  |cmd%=Read% . . "|
00000aa0  52 65 61 64 20 22 3b 20  8b 20 f1 20 22 57 72 69  |Read "; . . "Wri|
00000ab0  74 65 22 3b 0d 03 84 41  20 20 20 20 f1 3b 22 3a  |te";...A    .;":|
00000ac0  20 44 72 76 3d 22 3b 64  72 76 3b 22 20 54 72 6b  | Drv=";drv;" Trk|
00000ad0  3d 22 3b 74 72 6b 3b 22  20 20 20 22 3b 8a 32 31  |=";trk;"   ";.21|
00000ae0  2c bc 29 3b 22 48 64 3d  22 3b 68 65 61 64 3b 22  |,.);"Hd=";head;"|
00000af0  20 20 20 22 3b 0d 03 8e  13 20 20 20 20 e7 20 64  |   ";....    . d|
00000b00  65 62 75 67 20 8c 20 f1  0d 03 98 16 20 20 20 20  |ebug . .....    |
00000b10  e7 20 63 6d 64 25 3d 52  65 61 64 25 20 8c 0d 03  |. cmd%=Read% ...|
00000b20  a2 3f 20 20 20 20 20 20  f2 72 65 61 64 53 69 6e  |.?      .readSin|
00000b30  67 6c 65 54 72 6b 28 64  72 76 2c 20 74 72 6b 2c  |gleTrk(drv, trk,|
00000b40  20 68 65 61 64 2c 20 54  72 6b 44 65 73 63 25 2c  | head, TrkDesc%,|
00000b50  20 73 72 74 44 65 6e 73  69 74 79 25 29 0d 03 ac  | srtDensity%)...|
00000b60  09 20 20 20 20 cc 0d 03  b6 33 20 20 20 20 20 20  |.    ....3      |
00000b70  f2 77 72 69 74 65 53 69  6e 67 6c 65 54 72 6b 28  |.writeSingleTrk(|
00000b80  64 72 76 2c 20 74 72 6b  2c 20 68 65 61 64 2c 20  |drv, trk, head, |
00000b90  54 72 6b 44 65 73 63 25  29 0d 03 c0 09 20 20 20  |TrkDesc%)....   |
00000ba0  20 cd 0d 03 ca 2f 20 20  20 20 54 72 6b 44 65 73  | ..../    TrkDes|
00000bb0  63 25 20 2b 3d 20 54 72  6b 44 65 73 63 53 69 7a  |c% += TrkDescSiz|
00000bc0  65 25 20 2b 20 54 72 6b  44 61 74 61 53 69 7a 65  |e% + TrkDataSize|
00000bd0  25 0d 03 d4 07 20 20 ed  0d 03 de 05 ed 0d 03 e8  |%....  .........|
00000be0  05 e1 0d 03 f2 04 0d 03  fc 31 dd f2 77 72 69 74  |.........1..writ|
00000bf0  65 53 69 6e 67 6c 65 54  72 6b 28 64 72 76 25 2c  |eSingleTrk(drv%,|
00000c00  20 74 72 6b 25 2c 20 68  65 61 64 25 2c 20 54 72  | trk%, head%, Tr|
00000c10  6b 44 65 73 63 25 29 0d  04 06 3a ea 20 63 6f 75  |kDesc%)...:. cou|
00000c20  6e 74 25 2c 20 64 65 6e  73 69 74 79 25 2c 20 44  |nt%, density%, D|
00000c30  61 74 61 42 75 66 25 2c  20 6d 75 6c 74 69 53 65  |ataBuf%, multiSe|
00000c40  63 74 46 6c 67 25 2c 20  73 65 63 74 49 6e 66 6f  |ctFlg%, sectInfo|
00000c50  25 0d 04 10 44 ea 20 6c  6f 77 53 65 63 74 25 2c  |%...D. lowSect%,|
00000c60  20 73 65 63 74 53 69 7a  65 25 2c 20 73 65 63 74  | sectSize%, sect|
00000c70  25 2c 20 73 65 63 74 46  6f 75 6e 64 25 2c 20 61  |%, sectFound%, a|
00000c80  64 64 25 2c 20 49 44 25  2c 20 6d 75 73 74 57 72  |dd%, ID%, mustWr|
00000c90  53 65 63 74 25 0d 04 1a  22 63 6f 75 6e 74 25 20  |Sect%..."count% |
00000ca0  3d 20 54 72 6b 44 65 73  63 25 3f 62 75 66 4e 75  |= TrkDesc%?bufNu|
00000cb0  6d 62 53 65 63 74 25 0d  04 24 25 64 65 6e 73 69  |mbSect%..$%densi|
00000cc0  74 79 25 3d 20 54 72 6b  44 65 73 63 25 3f 62 75  |ty%= TrkDesc%?bu|
00000cd0  66 54 72 6b 44 65 6e 73  69 74 79 25 0d 04 2e 26  |fTrkDensity%...&|
00000ce0  44 61 74 61 42 75 66 25  20 3d 20 54 72 6b 44 65  |DataBuf% = TrkDe|
00000cf0  73 63 25 20 2b 20 54 72  6b 44 65 73 63 53 69 7a  |sc% + TrkDescSiz|
00000d00  65 25 0d 04 38 10 e7 20  63 6f 75 6e 74 25 3d 30  |e%..8.. count%=0|
00000d10  20 8c 0d 04 42 34 20 20  f4 20 62 6c 61 6e 6b 20  | ...B4  . blank |
00000d20  74 72 61 63 6b 20 73 6f  20 6a 75 73 74 20 63 6f  |track so just co|
00000d30  70 79 20 62 61 63 6b 20  52 65 61 64 54 72 61 63  |py back ReadTrac|
00000d40  6b 20 64 61 74 61 0d 04  4c 3b 20 20 f2 77 72 69  |k data..L;  .wri|
00000d50  74 65 74 72 61 63 6b 43  68 6b 28 64 72 76 25 2c  |tetrackChk(drv%,|
00000d60  20 74 72 6b 25 2c 20 68  65 61 64 25 2c 20 64 65  | trk%, head%, de|
00000d70  6e 73 69 74 79 25 2c 20  44 61 74 61 42 75 66 25  |nsity%, DataBuf%|
00000d80  29 0d 04 56 05 cc 0d 04  60 53 20 20 f2 6d 61 6b  |)..V....`S  .mak|
00000d90  65 57 72 69 74 65 54 72  6b 28 54 72 6b 44 65 73  |eWriteTrk(TrkDes|
00000da0  63 25 2c 20 63 6f 75 6e  74 25 2c 20 64 65 6e 73  |c%, count%, dens|
00000db0  69 74 79 25 2c 20 44 61  74 61 42 75 66 25 2c 20  |ity%, DataBuf%, |
00000dc0  57 72 69 74 65 54 72 6b  42 75 66 25 2c 6d 75 73  |WriteTrkBuf%,mus|
00000dd0  74 57 72 73 65 63 74 25  29 0d 04 6a 3f 20 20 f2  |tWrsect%)..j?  .|
00000de0  77 72 69 74 65 74 72 61  63 6b 43 68 6b 28 64 72  |writetrackChk(dr|
00000df0  76 25 2c 20 74 72 6b 25  2c 20 68 65 61 64 25 2c  |v%, trk%, head%,|
00000e00  20 64 65 6e 73 69 74 79  25 2c 20 57 72 69 74 65  | density%, Write|
00000e10  54 72 6b 42 75 66 25 29  0d 04 74 2e 20 20 6d 75  |TrkBuf%)..t.  mu|
00000e20  6c 74 69 53 65 63 74 46  6c 67 25 3d 20 54 72 6b  |ltiSectFlg%= Trk|
00000e30  44 65 73 63 25 3f 62 75  66 4d 75 6c 74 69 53 65  |Desc%?bufMultiSe|
00000e40  63 74 46 6c 67 25 0d 04  7e 25 20 20 e7 20 6d 75  |ctFlg%..~%  . mu|
00000e50  6c 74 69 53 65 63 74 46  6c 67 25 20 80 20 6d 75  |ltiSectFlg% . mu|
00000e60  73 74 57 72 73 65 63 74  25 20 8c 0d 04 88 38 20  |stWrsect% ....8 |
00000e70  20 20 20 f4 20 77 72 69  74 65 20 74 72 61 63 6b  |   . write track|
00000e80  20 69 6e 20 6f 6e 65 20  67 6f 20 62 79 20 75 73  | in one go by us|
00000e90  69 6e 67 20 6d 65 6d 6f  72 79 20 44 4d 41 20 6c  |ing memory DMA l|
00000ea0  69 73 74 0d 04 92 41 20  20 20 20 f4 20 62 75 74  |ist...A    . but|
00000eb0  20 6f 6e 6c 79 20 69 66  20 61 20 73 65 63 74 6f  | only if a secto|
00000ec0  72 20 63 6f 75 6c 64 20  6e 6f 74 20 62 65 20 77  |r could not be w|
00000ed0  72 69 74 74 65 6e 20 64  75 72 69 6e 67 20 46 6f  |ritten during Fo|
00000ee0  72 6d 61 74 0d 04 9c 25  20 20 20 20 6c 6f 77 53  |rmat...%    lowS|
00000ef0  65 63 74 25 3d 54 72 6b  44 65 73 63 25 3f 62 75  |ect%=TrkDesc%?bu|
00000f00  66 4c 6f 77 53 65 63 74  25 0d 04 a6 27 20 20 20  |fLowSect%...'   |
00000f10  20 73 65 63 74 53 69 7a  65 25 3d 54 72 6b 44 65  | sectSize%=TrkDe|
00000f20  73 63 25 3f 62 75 66 53  65 63 74 53 69 7a 65 25  |sc%?bufSectSize%|
00000f30  0d 04 b0 29 20 20 20 20  f2 63 6f 70 79 4d 65 6d  |...)    .copyMem|
00000f40  41 64 64 4c 69 73 74 28  54 72 6b 44 65 73 63 25  |AddList(TrkDesc%|
00000f50  2c 20 63 6f 75 6e 74 25  29 0d 04 ba 62 20 20 20  |, count%)...b   |
00000f60  20 f2 6f 70 73 65 63 74  6f 72 73 28 57 72 69 74  | .opsectors(Writ|
00000f70  65 25 20 84 20 28 31 3c  3c 35 29 2c 64 72 76 25  |e% . (1<<5),drv%|
00000f80  2c 74 72 6b 25 2c 68 65  61 64 25 2c 6c 6f 77 53  |,trk%,head%,lowS|
00000f90  65 63 74 25 2c 63 6f 75  6e 74 25 2c 73 65 63 74  |ect%,count%,sect|
00000fa0  53 69 7a 65 25 2c 64 65  6e 73 69 74 79 25 2c 6d  |Size%,density%,m|
00000fb0  65 6d 41 64 64 4c 69 73  74 25 29 0d 04 c4 18 20  |emAddList%).... |
00000fc0  20 20 20 e7 20 72 65 73  75 6c 74 25 20 3c 3e 20  |   . result% <> |
00000fd0  30 20 8c 0d 04 ce 27 20  20 20 20 20 20 6d 75 6c  |0 ....'      mul|
00000fe0  74 69 53 65 63 74 46 6c  67 25 3d a3 20 3a f4 20  |tiSectFlg%=. :. |
00000ff0  44 69 73 63 20 65 72 72  6f 72 0d 04 d8 3a 20 20  |Disc error...:  |
00001000  20 20 20 20 f1 22 20 20  77 72 69 74 69 6e 67 3a  |    ."  writing:|
00001010  2d 20 74 72 61 63 6b 20  77 61 73 20 6e 6f 6e 2d  |- track was non-|
00001020  73 74 61 6e 64 61 72 64  20 20 61 66 74 65 72 20  |standard  after |
00001030  61 6c 6c 22 0d 04 e2 09  20 20 20 20 cd 0d 04 ec  |all"....    ....|
00001040  07 20 20 cd 0d 04 f6 2a  20 20 e7 20 28 6d 75 6c  |.  ....*  . (mul|
00001050  74 69 53 65 63 74 46 6c  67 25 3d 30 29 20 80 20  |tiSectFlg%=0) . |
00001060  6d 75 73 74 57 72 73 65  63 74 25 20 20 8c 0d 05  |mustWrsect%  ...|
00001070  00 42 20 20 20 20 f4 20  63 61 74 63 68 20 61 6c  |.B    . catch al|
00001080  6c 20 6e 6f 6e 2d 73 74  61 6e 64 61 72 64 20 74  |l non-standard t|
00001090  72 61 63 6b 20 66 6f 72  6d 61 74 73 2c 20 62 75  |rack formats, bu|
000010a0  74 20 6f 6e 6c 79 20 69  66 20 61 20 67 6f 6f 64  |t only if a good|
000010b0  0d 05 0a 34 20 20 20 20  f4 20 20 73 65 63 74 6f  |...4    .  secto|
000010c0  72 20 63 6f 75 6c 64 20  6e 6f 74 20 62 65 20 77  |r could not be w|
000010d0  72 69 74 74 65 6e 20 64  75 72 69 6e 67 20 46 6f  |ritten during Fo|
000010e0  72 6d 61 74 0d 05 14 27  20 20 20 20 e7 20 28 6d  |rmat...'    . (m|
000010f0  75 6c 74 69 53 65 63 74  46 6c 67 25 3d 30 29 20  |ultiSectFlg%=0) |
00001100  80 20 61 6e 61 6c 79 73  65 20 8c 0d 05 1e 32 20  |. analyse ....2 |
00001110  20 20 20 20 20 f1 22 20  20 77 72 69 74 69 6e 67  |     ."  writing|
00001120  3a 2d 20 6e 6f 6e 2d 73  74 61 6e 64 61 72 64 20  |:- non-standard |
00001130  74 72 61 63 6b 20 6c 61  79 6f 75 74 22 0d 05 28  |track layout"..(|
00001140  09 20 20 20 20 cd 0d 05  32 22 20 20 20 20 e3 20  |.    ...2"    . |
00001150  73 65 63 74 46 6f 75 6e  64 25 3d 20 30 20 b8 20  |sectFound%= 0 . |
00001160  63 6f 75 6e 74 25 2d 31  0d 05 3c 36 20 20 20 20  |count%-1..<6    |
00001170  20 20 73 65 63 74 49 6e  66 6f 25 3d a4 67 65 74  |  sectInfo%=.get|
00001180  53 65 63 74 49 6e 66 6f  28 54 72 6b 44 65 73 63  |SectInfo(TrkDesc|
00001190  25 2c 20 73 65 63 74 46  6f 75 6e 64 25 29 0d 05  |%, sectFound%)..|
000011a0  46 2c 20 20 20 20 20 20  e7 20 28 73 65 63 74 49  |F,      . (sectI|
000011b0  6e 66 6f 25 20 80 20 28  ac 20 6f 76 65 72 49 6e  |nfo% . (. overIn|
000011c0  64 65 78 25 29 29 3d 30  20 8c 0d 05 50 45 20 20  |dex%))=0 ...PE  |
000011d0  20 20 20 20 20 20 f4 20  69 66 20 64 61 74 61 20  |      . if data |
000011e0  61 72 65 61 20 77 61 73  20 72 65 61 64 20 4f 4b  |area was read OK|
000011f0  20 28 26 20 64 6f 6e 27  74 20 68 61 76 65 20 61  | (& don't have a|
00001200  6e 79 20 69 6c 6c 65 67  61 6c 20 49 44 73 29 0d  |ny illegal IDs).|
00001210  05 5a 42 20 20 20 20 20  20 20 20 f4 20 61 6e 64  |.ZB        . and|
00001220  20 69 74 20 77 61 73 20  6e 6f 74 20 64 65 6c 65  | it was not dele|
00001230  74 65 64 20 64 61 74 61  2c 20 74 68 65 6e 20 70  |ted data, then p|
00001240  72 6f 76 69 64 65 64 20  64 61 74 61 20 61 72 65  |rovided data are|
00001250  61 0d 05 64 46 20 20 20  20 20 20 20 20 f4 20 20  |a..dF        .  |
00001260  68 61 73 20 6e 6f 74 20  61 6c 72 65 61 64 79 20  |has not already |
00001270  62 65 65 6e 20 63 6f 72  72 65 63 74 6c 79 20 77  |been correctly w|
00001280  72 69 74 74 65 6e 20 77  69 74 68 20 77 72 69 74  |ritten with writ|
00001290  65 74 72 61 63 6b 2c 0d  05 6e 2b 20 20 20 20 20  |etrack,..n+     |
000012a0  20 20 20 f4 20 77 72 69  74 65 20 74 68 65 20 73  |   . write the s|
000012b0  65 63 74 6f 72 20 69 6e  64 69 76 69 64 75 61 6c  |ector individual|
000012c0  6c 79 0d 05 78 32 20 20  20 20 20 20 20 20 61 64  |ly..x2        ad|
000012d0  64 25 3d a4 67 65 74 44  61 74 61 50 74 72 28 54  |d%=.getDataPtr(T|
000012e0  72 6b 44 65 73 63 25 2c  20 73 65 63 74 46 6f 75  |rkDesc%, sectFou|
000012f0  6e 64 25 29 0d 05 82 30  20 20 20 20 20 20 20 20  |nd%)...0        |
00001300  49 44 25 3d a4 67 65 74  53 65 63 74 49 44 28 54  |ID%=.getSectID(T|
00001310  72 6b 44 65 73 63 25 2c  20 73 65 63 74 46 6f 75  |rkDesc%, sectFou|
00001320  6e 64 25 29 0d 05 8c 23  20 20 20 20 20 20 20 20  |nd%)...#        |
00001330  73 65 63 74 25 3d 26 46  46 20 80 20 28 49 44 25  |sect%=&FF . (ID%|
00001340  20 3e 3e 20 31 36 29 0d  05 96 25 20 20 20 20 20  | >> 16)...%     |
00001350  20 20 20 73 65 63 74 53  69 7a 65 25 3d 33 20 80  |   sectSize%=3 .|
00001360  20 28 49 44 25 20 3e 3e  20 32 34 29 0d 05 a0 4a  | (ID% >> 24)...J|
00001370  20 20 20 20 20 20 20 20  f2 77 72 69 74 65 73 65  |        .writese|
00001380  63 74 6f 72 73 28 64 72  76 25 2c 74 72 6b 25 2c  |ctors(drv%,trk%,|
00001390  68 65 61 64 25 2c 73 65  63 74 25 2c 31 2c 73 65  |head%,sect%,1,se|
000013a0  63 74 53 69 7a 65 25 2c  64 65 6e 73 69 74 79 25  |ctSize%,density%|
000013b0  2c 61 64 64 25 29 0d 05  aa 0b 20 20 20 20 20 20  |,add%)....      |
000013c0  cd 0d 05 b4 09 20 20 20  20 ed 0d 05 be 07 20 20  |.....    .....  |
000013d0  cd 0d 05 c8 05 cd 0d 05  d2 05 e1 0d 05 dc 04 0d  |................|
000013e0  05 e6 48 20 20 f4 20 6d  61 6b 65 20 57 72 69 74  |..H  . make Writ|
000013f0  65 20 54 72 61 63 6b 20  64 61 74 61 20 75 73 69  |e Track data usi|
00001400  6e 67 20 54 72 61 63 6b  20 64 65 73 63 72 69 70  |ng Track descrip|
00001410  74 6f 72 20 61 6e 64 20  52 65 61 64 20 54 72 61  |tor and Read Tra|
00001420  63 6b 20 28 74 68 65 0d  05 f0 43 20 20 f4 20 20  |ck (the...C  .  |
00001430  6c 61 74 74 65 72 20 68  61 76 69 6e 67 20 62 65  |latter having be|
00001440  65 6e 20 6f 76 65 72 6c  61 69 64 20 77 69 74 68  |en overlaid with|
00001450  20 63 6f 72 72 65 63 74  20 72 65 61 64 20 73 65  | correct read se|
00001460  63 74 6f 72 20 64 61 74  61 2e 0d 05 fa 3e 20 20  |ctor data....>  |
00001470  f4 20 42 75 74 20 65 6e  73 75 72 65 20 6e 6f 20  |. But ensure no |
00001480  69 6c 6c 65 67 61 6c 20  63 68 72 73 20 61 70 70  |illegal chrs app|
00001490  65 61 72 20 69 6e 20 67  61 70 73 20 6f 72 20 64  |ear in gaps or d|
000014a0  61 74 61 20 61 72 65 61  0d 06 04 36 20 20 f4 20  |ata area...6  . |
000014b0  4f 75 74 70 75 74 20 6d  65 73 73 61 67 65 20 69  |Output message i|
000014c0  66 20 64 61 74 61 20 61  72 65 61 20 63 61 6e 27  |f data area can'|
000014d0  74 20 62 65 20 72 65 63  72 65 61 74 65 64 0d 06  |t be recreated..|
000014e0  0e 55 dd f2 6d 61 6b 65  57 72 69 74 65 54 72 6b  |.U..makeWriteTrk|
000014f0  28 54 72 6b 44 65 73 63  25 2c 20 63 6f 75 6e 74  |(TrkDesc%, count|
00001500  25 2c 20 64 65 6e 73 69  74 79 25 2c 20 52 65 61  |%, density%, Rea|
00001510  64 42 75 66 25 2c 20 57  72 69 74 65 54 72 6b 42  |dBuf%, WriteTrkB|
00001520  75 66 25 2c 20 f8 20 6d  75 73 74 57 72 53 65 63  |uf%, . mustWrSec|
00001530  74 25 29 0d 06 18 47 ea  20 73 65 63 74 46 6f 75  |t%)...G. sectFou|
00001540  6e 64 25 2c 20 73 65 63  74 53 69 7a 65 25 2c 20  |nd%, sectSize%, |
00001550  53 72 63 41 64 64 25 2c  20 53 72 63 4c 6f 77 41  |SrcAdd%, SrcLowA|
00001560  64 64 25 2c 20 44 65 73  74 41 64 64 25 2c 20 44  |dd%, DestAdd%, D|
00001570  65 73 74 4c 6f 77 41 64  64 25 0d 06 22 15 ea 20  |estLowAdd%..".. |
00001580  63 6f 6e 76 65 72 74 25  2c 20 69 6e 66 6f 25 0d  |convert%, info%.|
00001590  06 2c 11 6d 75 73 74 57  72 53 65 63 74 25 3d a3  |.,.mustWrSect%=.|
000015a0  0d 06 36 1c 44 65 73 74  4c 6f 77 41 64 64 25 3d  |..6.DestLowAdd%=|
000015b0  57 72 69 74 65 54 72 6b  42 75 66 25 0d 06 40 17  |WriteTrkBuf%..@.|
000015c0  53 72 63 4c 6f 77 41 64  64 25 3d 52 65 61 64 42  |SrcLowAdd%=ReadB|
000015d0  75 66 25 0d 06 4a 1d e3  20 73 65 63 74 46 6f 75  |uf%..J.. sectFou|
000015e0  6e 64 25 3d 30 20 b8 20  63 6f 75 6e 74 25 2d 31  |nd%=0 . count%-1|
000015f0  0d 06 54 2d 20 20 53 72  63 41 64 64 25 3d a4 67  |..T-  SrcAdd%=.g|
00001600  65 74 49 44 50 74 72 28  54 72 6b 44 65 73 63 25  |etIDPtr(TrkDesc%|
00001610  2c 20 73 65 63 74 46 6f  75 6e 64 25 29 0d 06 5e  |, sectFound%)..^|
00001620  2d 20 20 44 65 73 74 41  64 64 25 3d 44 65 73 74  |-  DestAdd%=Dest|
00001630  4c 6f 77 41 64 64 25 2b  53 72 63 41 64 64 25 2d  |LowAdd%+SrcAdd%-|
00001640  53 72 63 4c 6f 77 41 64  64 25 0d 06 68 2d 20 20  |SrcLowAdd%..h-  |
00001650  69 6e 66 6f 25 3d a4 67  65 74 53 65 63 74 49 6e  |info%=.getSectIn|
00001660  66 6f 28 54 72 6b 44 65  73 63 25 2c 73 65 63 74  |fo(TrkDesc%,sect|
00001670  46 6f 75 6e 64 25 29 0d  06 72 1b 20 20 f4 20 49  |Found%)..r.  . I|
00001680  44 27 73 20 41 4d 20 26  20 70 72 69 6f 72 20 67  |D's AM & prior g|
00001690  61 70 0d 06 7c 4a 20 20  f2 6d 61 6b 65 41 4d 61  |ap..|J  .makeAMa|
000016a0  6e 64 67 61 70 28 20 53  72 63 4c 6f 77 41 64 64  |ndgap( SrcLowAdd|
000016b0  25 2c 20 53 72 63 41 64  64 25 2c 20 44 65 73 74  |%, SrcAdd%, Dest|
000016c0  4c 6f 77 41 64 64 25 2c  20 44 65 73 74 41 64 64  |LowAdd%, DestAdd|
000016d0  25 2c 20 64 65 6e 73 69  74 79 25 29 0d 06 86 41  |%, density%)...A|
000016e0  20 20 44 65 73 74 41 64  64 25 21 30 20 20 3d 20  |  DestAdd%!0  = |
000016f0  a4 67 65 74 53 65 63 74  49 44 28 54 72 6b 44 65  |.getSectID(TrkDe|
00001700  73 63 25 2c 73 65 63 74  46 6f 75 6e 64 25 29 20  |sc%,sectFound%) |
00001710  20 20 20 3a f4 20 63 6f  70 79 20 49 44 0d 06 90  |   :. copy ID...|
00001720  23 20 20 e7 20 28 69 6e  66 6f 25 20 80 20 65 72  |#  . (info% . er|
00001730  72 4e 6f 74 46 6f 75 6e  64 25 29 20 3d 30 20 8c  |rNotFound%) =0 .|
00001740  0d 06 9a 37 20 20 20 20  44 65 73 74 41 64 64 25  |...7    DestAdd%|
00001750  3f 34 20 20 3d 20 26 46  37 20 20 20 20 20 20 20  |?4  = &F7       |
00001760  20 20 20 20 20 3a f4 20  74 6f 20 67 65 6e 65 72  |     :. to gener|
00001770  61 74 65 20 43 52 43 0d  06 a4 36 20 20 20 20 44  |ate CRC...6    D|
00001780  65 73 74 4c 6f 77 41 64  64 25 3d 20 44 65 73 74  |estLowAdd%= Dest|
00001790  41 64 64 25 2b 35 20 20  20 20 20 20 3a f4 20 62  |Add%+5      :. b|
000017a0  79 74 65 20 61 66 74 65  72 20 43 52 43 0d 06 ae  |yte after CRC...|
000017b0  07 20 20 cc 0d 06 b8 41  20 20 20 20 f4 20 62 75  |.  ....A    . bu|
000017c0  74 20 69 66 20 73 65 63  74 6f 72 20 6e 6f 74 20  |t if sector not |
000017d0  66 6f 75 6e 64 20 74 68  65 6e 20 63 6f 70 79 20  |found then copy |
000017e0  72 65 61 64 74 72 61 63  6b 20 43 52 43 20 69 6e  |readtrack CRC in|
000017f0  73 74 65 61 64 0d 06 c2  1e 20 20 20 20 44 65 73  |stead....    Des|
00001800  74 41 64 64 25 3f 34 20  3d 20 53 72 63 41 64 64  |tAdd%?4 = SrcAdd|
00001810  25 3f 34 0d 06 cc 1e 20  20 20 20 44 65 73 74 41  |%?4....    DestA|
00001820  64 64 25 3f 35 20 3d 20  53 72 63 41 64 64 25 3f  |dd%?5 = SrcAdd%?|
00001830  35 0d 06 d6 36 20 20 20  20 44 65 73 74 4c 6f 77  |5...6    DestLow|
00001840  41 64 64 25 3d 20 44 65  73 74 41 64 64 25 2b 36  |Add%= DestAdd%+6|
00001850  20 20 20 20 20 20 3a f4  20 62 79 74 65 20 61 66  |      :. byte af|
00001860  74 65 72 20 43 52 43 0d  06 e0 07 20 20 cd 0d 06  |ter CRC....  ...|
00001870  ea 40 20 20 53 72 63 4c  6f 77 41 64 64 25 20 3d  |.@  SrcLowAdd% =|
00001880  20 53 72 63 41 64 64 25  2b 36 20 20 20 20 20 20  | SrcAdd%+6      |
00001890  20 3a f4 20 70 6f 69 6e  74 20 66 69 72 73 74 20  | :. point first |
000018a0  62 79 74 65 20 61 66 74  65 72 20 43 52 43 0d 06  |byte after CRC..|
000018b0  f4 2f 20 20 53 72 63 41  64 64 25 3d a4 67 65 74  |./  SrcAdd%=.get|
000018c0  44 61 74 61 50 74 72 28  54 72 6b 44 65 73 63 25  |DataPtr(TrkDesc%|
000018d0  2c 20 73 65 63 74 46 6f  75 6e 64 25 29 0d 06 fe  |, sectFound%)...|
000018e0  14 20 20 e7 20 53 72 63  41 64 64 25 3c 3e 30 20  |.  . SrcAdd%<>0 |
000018f0  8c 0d 07 08 16 20 20 20  20 f4 20 69 66 20 64 61  |.....    . if da|
00001900  74 61 20 61 72 65 61 0d  07 12 2f 20 20 20 20 44  |ta area.../    D|
00001910  65 73 74 41 64 64 25 3d  44 65 73 74 4c 6f 77 41  |estAdd%=DestLowA|
00001920  64 64 25 2b 53 72 63 41  64 64 25 2d 53 72 63 4c  |dd%+SrcAdd%-SrcL|
00001930  6f 77 41 64 64 25 0d 07  1c 22 20 20 20 20 f4 20  |owAdd%..."    . |
00001940  64 61 74 61 20 61 72 65  61 20 41 4d 20 26 20 70  |data area AM & p|
00001950  72 69 6f 72 20 67 61 70  0d 07 26 4b 20 20 20 20  |rior gap..&K    |
00001960  f2 6d 61 6b 65 41 4d 61  6e 64 67 61 70 28 53 72  |.makeAMandgap(Sr|
00001970  63 4c 6f 77 41 64 64 25  2c 20 53 72 63 41 64 64  |cLowAdd%, SrcAdd|
00001980  25 2c 20 44 65 73 74 4c  6f 77 41 64 64 25 2c 20  |%, DestLowAdd%, |
00001990  44 65 73 74 41 64 64 25  2c 20 64 65 6e 73 69 74  |DestAdd%, densit|
000019a0  79 25 29 0d 07 30 1c 20  20 20 20 53 72 63 4c 6f  |y%)..0.    SrcLo|
000019b0  77 41 64 64 25 20 3d 20  53 72 63 41 64 64 25 0d  |wAdd% = SrcAdd%.|
000019c0  07 3a 1d 20 20 20 20 44  65 73 74 4c 6f 77 41 64  |.:.    DestLowAd|
000019d0  64 25 3d 20 44 65 73 74  41 64 64 25 0d 07 44 39  |d%= DestAdd%..D9|
000019e0  20 20 20 20 53 72 63 41  64 64 25 20 2b 3d 20 a4  |    SrcAdd% += .|
000019f0  67 65 74 44 61 74 61 4c  65 6e 67 74 68 28 54 72  |getDataLength(Tr|
00001a00  6b 44 65 73 63 25 2c 20  73 65 63 74 46 6f 75 6e  |kDesc%, sectFoun|
00001a10  64 25 29 2d 31 0d 07 4e  47 20 20 20 20 f4 20 63  |d%)-1..NG    . c|
00001a20  6f 70 79 20 75 70 20 74  6f 20 65 6e 64 20 6f 66  |opy up to end of|
00001a30  20 64 61 74 61 20 61 72  65 61 20 74 72 61 6e 73  | data area trans|
00001a40  66 65 72 2c 20 63 6f 6e  76 65 72 74 20 61 6e 79  |fer, convert any|
00001a50  20 26 46 35 2d 46 37 20  63 68 72 73 0d 07 58 4a  | &F5-F7 chrs..XJ|
00001a60  20 20 20 20 f2 73 65 6c  63 6f 70 79 66 77 64 20  |    .selcopyfwd |
00001a70  28 53 72 63 4c 6f 77 41  64 64 25 2c 20 53 72 63  |(SrcLowAdd%, Src|
00001a80  41 64 64 25 2c 20 44 65  73 74 4c 6f 77 41 64 64  |Add%, DestLowAdd|
00001a90  25 2c 20 64 65 6e 73 69  74 79 25 2c 20 63 6f 6e  |%, density%, con|
00001aa0  76 65 72 74 25 29 0d 07  62 46 20 20 20 20 44 65  |vert%)..bF    De|
00001ab0  73 74 4c 6f 77 41 64 64  25 20 2b 3d 53 72 63 41  |stLowAdd% +=SrcA|
00001ac0  64 64 25 2d 53 72 63 4c  6f 77 41 64 64 25 2b 31  |dd%-SrcLowAdd%+1|
00001ad0  20 3a f4 20 66 69 72 73  74 20 62 79 74 65 20 61  | :. first byte a|
00001ae0  66 74 65 72 20 64 61 74  61 2e 2e 2e 0d 07 6c 3e  |fter data.....l>|
00001af0  20 20 20 20 53 72 63 4c  6f 77 41 64 64 25 20 3d  |    SrcLowAdd% =|
00001b00  20 53 72 63 41 64 64 25  2b 31 20 20 20 20 20 20  | SrcAdd%+1      |
00001b10  20 20 20 20 20 20 20 3a  f4 20 2e 2e 74 72 61 6e  |       :. ..tran|
00001b20  73 66 65 72 20 61 72 65  61 73 0d 07 76 3d 20 20  |sfer areas..v=  |
00001b30  20 20 e7 20 28 69 6e 66  6f 25 20 80 20 28 65 72  |  . (info% . (er|
00001b40  72 43 52 43 25 20 84 20  65 72 72 4e 6f 74 46 6f  |rCRC% . errNotFo|
00001b50  75 6e 64 25 20 84 20 6e  6f 52 6f 6f 6d 43 52 43  |und% . noRoomCRC|
00001b60  25 29 29 3d 30 20 8c 0d  07 80 41 20 20 20 20 20  |%))=0 ....A     |
00001b70  20 f4 20 72 6f 6f 6d 20  66 6f 72 20 43 52 43 20  | . room for CRC |
00001b80  41 4e 44 20 72 65 61 64  20 43 52 43 20 77 61 73  |AND read CRC was|
00001b90  20 6f 6b 20 41 4e 44 20  73 65 63 74 6f 72 20 77  | ok AND sector w|
00001ba0  61 73 20 66 6f 75 6e 64  0d 07 8a 35 20 20 20 20  |as found...5    |
00001bb0  20 20 e7 20 28 63 6f 6e  76 65 72 74 25 3d 30 29  |  . (convert%=0)|
00001bc0  20 80 20 28 28 69 6e 66  6f 25 20 80 20 6f 76 65  | . ((info% . ove|
00001bd0  72 49 6e 64 65 78 25 29  3d 30 29 20 8c 0d 07 94  |rIndex%)=0) ....|
00001be0  3a 20 20 20 20 20 20 20  20 f4 20 41 4e 44 20 77  |:        . AND w|
00001bf0  72 69 74 65 74 72 61 63  6b 20 63 61 6e 20 63 6f  |ritetrack can co|
00001c00  72 72 65 63 74 6c 79 20  77 72 69 74 65 20 64 61  |rrectly write da|
00001c10  74 61 20 61 72 65 61 0d  07 9e 31 20 20 20 20 20  |ta area...1     |
00001c20  20 20 20 44 65 73 74 4c  6f 77 41 64 64 25 3f 30  |   DestLowAdd%?0|
00001c30  20 3d 20 26 46 37 20 20  20 3a f4 20 73 6f 20 66  | = &F7   :. so f|
00001c40  6f 72 63 65 20 43 52 43  0d 07 a8 38 20 20 20 20  |orce CRC...8    |
00001c50  20 20 20 20 53 72 63 4c  6f 77 41 64 64 25 20 20  |    SrcLowAdd%  |
00001c60  2b 3d 32 20 20 20 20 20  20 20 3a f4 20 61 6e 64  |+=2       :. and|
00001c70  20 61 64 6a 75 73 74 20  73 6f 75 72 63 65 20 26  | adjust source &|
00001c80  0d 07 b2 3f 20 20 20 20  20 20 20 20 44 65 73 74  |...?        Dest|
00001c90  4c 6f 77 41 64 64 25 20  2b 3d 31 20 20 20 20 20  |LowAdd% +=1     |
00001ca0  20 20 3a f4 20 64 65 73  74 20 61 64 64 72 65 73  |  :. dest addres|
00001cb0  73 65 73 20 61 63 63 6f  72 64 69 6e 67 6c 79 0d  |ses accordingly.|
00001cc0  07 bc 1f 20 20 20 20 20  20 20 20 f4 20 26 20 73  |...        . & s|
00001cd0  65 74 20 73 65 63 74 6f  72 20 69 6e 66 6f 0d 07  |et sector info..|
00001ce0  c6 41 20 20 20 20 20 20  20 20 f2 61 64 64 53 65  |.A        .addSe|
00001cf0  63 74 49 6e 66 6f 28 54  72 6b 44 65 73 63 25 2c  |ctInfo(TrkDesc%,|
00001d00  20 73 65 63 74 46 6f 75  6e 64 25 2c 20 64 61 74  | sectFound%, dat|
00001d10  61 44 75 72 69 6e 67 46  6f 72 6d 61 74 25 29 0d  |aDuringFormat%).|
00001d20  07 d0 3c 20 20 20 20 20  20 20 20 69 6e 66 6f 25  |..<        info%|
00001d30  3d 69 6e 66 6f 25 20 84  20 64 61 74 61 44 75 72  |=info% . dataDur|
00001d40  69 6e 67 46 6f 72 6d 61  74 25 20 3a f4 20 66 6f  |ingFormat% :. fo|
00001d50  72 20 75 73 65 20 62 65  6c 6f 77 0d 07 da 0b 20  |r use below.... |
00001d60  20 20 20 20 20 cc 0d 07  e4 4a 20 20 20 20 20 20  |     ....J      |
00001d70  20 20 e7 20 69 6e 66 6f  25 80 28 64 65 6c 44 61  |  . info%.(delDa|
00001d80  74 61 25 20 84 20 6c 6f  6e 67 44 61 74 61 25 20  |ta% . longData% |
00001d90  84 20 69 6c 6c 65 67 61  6c 54 72 6b 25 20 84 20  |. illegalTrk% . |
00001da0  69 6c 6c 65 67 61 6c 49  44 62 79 74 25 29 20 8c  |illegalIDbyt%) .|
00001db0  0d 07 ee 48 20 20 20 20  20 20 20 20 20 20 f4 20  |...H          . |
00001dc0  69 66 20 63 61 6e 27 74  20 77 72 69 74 65 20 73  |if can't write s|
00001dd0  65 63 74 6f 72 2c 20 62  75 74 20 6f 74 68 65 72  |ector, but other|
00001de0  77 69 73 65 20 4f 4b 2c  20 61 6e 64 20 63 61 6e  |wise OK, and can|
00001df0  27 74 20 77 72 69 74 65  0d 07 f8 32 20 20 20 20  |'t write...2    |
00001e00  20 20 20 20 20 20 f4 20  69 74 20 64 75 72 69 6e  |      . it durin|
00001e10  67 20 66 6f 72 6d 61 74  2c 20 74 68 65 6e 20 70  |g format, then p|
00001e20  72 69 6e 74 20 65 72 72  6f 72 0d 08 02 2c 20 20  |rint error...,  |
00001e30  20 20 20 20 20 20 20 20  f2 70 72 69 6e 74 49 44  |        .printID|
00001e40  28 54 72 6b 44 65 73 63  25 2c 20 73 65 63 74 46  |(TrkDesc%, sectF|
00001e50  6f 75 6e 64 25 29 0d 08  0c 31 20 20 20 20 20 20  |ound%)...1      |
00001e60  20 20 20 20 f1 20 22 43  41 4e 27 54 20 6d 61 6b  |    . "CAN'T mak|
00001e70  65 20 61 6e 20 65 78 61  63 74 20 63 6f 70 79 21  |e an exact copy!|
00001e80  20 53 6f 72 72 79 22 0d  08 16 38 20 20 20 20 20  | Sorry"...8     |
00001e90  20 20 20 20 20 44 65 73  74 4c 6f 77 41 64 64 25  |     DestLowAdd%|
00001ea0  3f 30 20 3d 20 26 46 37  20 20 3a f4 20 62 75 74  |?0 = &F7  :. but|
00001eb0  20 73 65 74 20 43 52 43  20 61 6e 79 77 61 79 0d  | set CRC anyway.|
00001ec0  08 20 39 20 20 20 20 20  20 20 20 20 20 53 72 63  |. 9          Src|
00001ed0  4c 6f 77 41 64 64 25 20  20 2b 3d 32 20 20 20 20  |LowAdd%  +=2    |
00001ee0  20 20 3a f4 20 61 6e 64  20 61 64 6a 75 73 74 20  |  :. and adjust |
00001ef0  70 6f 69 6e 74 65 72 73  0d 08 2a 1d 20 20 20 20  |pointers..*.    |
00001f00  20 20 20 20 20 20 44 65  73 74 4c 6f 77 41 64 64  |      DestLowAdd|
00001f10  25 20 2b 3d 31 0d 08 34  0d 20 20 20 20 20 20 20  |% +=1..4.       |
00001f20  20 cd 0d 08 3e 0b 20 20  20 20 20 20 cd 0d 08 48  | ...>.      ...H|
00001f30  09 20 20 20 20 cd 0d 08  52 26 20 20 20 20 e7 20  |.    ...R&    . |
00001f40  28 69 6e 66 6f 25 20 80  20 28 ac 20 6f 76 65 72  |(info% . (. over|
00001f50  49 6e 64 65 78 25 29 29  3d 30 20 8c 0d 08 5c 21  |Index%))=0 ...\!|
00001f60  20 20 20 20 20 20 f4 20  6d 75 73 74 20 77 72 69  |      . must wri|
00001f70  74 65 20 74 68 65 20 73  65 63 74 6f 72 0d 08 66  |te the sector..f|
00001f80  17 20 20 20 20 20 20 6d  75 73 74 57 72 53 65 63  |.      mustWrSec|
00001f90  74 25 3d b9 0d 08 70 09  20 20 20 20 cd 0d 08 7a  |t%=...p.    ...z|
00001fa0  07 20 20 cd 0d 08 84 05  ed 0d 08 8e 25 53 72 63  |.  .........%Src|
00001fb0  41 64 64 25 3d 54 72 6b  44 65 73 63 25 21 62 75  |Add%=TrkDesc%!bu|
00001fc0  66 45 6e 64 56 61 6c 69  64 44 61 74 61 25 0d 08  |fEndValidData%..|
00001fd0  98 2a f4 20 63 6f 70 79  20 74 6f 20 65 6e 64 20  |.*. copy to end |
00001fe0  6f 66 20 76 61 6c 69 64  20 72 65 61 64 20 74 72  |of valid read tr|
00001ff0  61 63 6b 20 64 61 74 61  0d 08 a2 46 f2 73 65 6c  |ack data...F.sel|
00002000  63 6f 70 79 66 77 64 20  28 53 72 63 4c 6f 77 41  |copyfwd (SrcLowA|
00002010  64 64 25 2c 20 53 72 63  41 64 64 25 2c 20 44 65  |dd%, SrcAdd%, De|
00002020  73 74 4c 6f 77 41 64 64  25 2c 20 64 65 6e 73 69  |stLowAdd%, densi|
00002030  74 79 25 2c 20 63 6f 6e  76 65 72 74 25 29 0d 08  |ty%, convert%)..|
00002040  ac 40 f2 66 69 6c 6c 45  6e 64 4f 66 54 72 6b 28  |.@.fillEndOfTrk(|
00002050  20 53 72 63 41 64 64 25  2b 31 2d 52 65 61 64 42  | SrcAdd%+1-ReadB|
00002060  75 66 25 20 2b 20 57 72  69 74 65 54 72 6b 42 75  |uf% + WriteTrkBu|
00002070  66 25 20 2c 20 64 65 6e  73 69 74 79 25 29 0d 08  |f% , density%)..|
00002080  b6 05 e1 0d 08 c0 04 0d  08 ca 3e 20 20 f4 20 66  |..........>  . f|
00002090  69 6c 6c 73 20 74 6f 20  65 6e 64 20 6f 66 20 77  |ills to end of w|
000020a0  72 69 74 65 20 62 75 66  66 65 72 20 77 69 74 68  |rite buffer with|
000020b0  20 72 65 6c 65 76 61 6e  74 20 66 69 6c 6c 65 72  | relevant filler|
000020c0  20 62 79 74 65 0d 08 d4  24 dd f2 66 69 6c 6c 45  | byte...$..fillE|
000020d0  6e 64 4f 66 54 72 6b 28  20 61 64 64 25 20 2c 20  |ndOfTrk( add% , |
000020e0  64 65 6e 73 69 74 79 25  29 0d 08 de 0c ea 20 76  |density%)..... v|
000020f0  61 6c 75 65 25 0d 08 e8  1a e7 20 64 65 6e 73 69  |alue%..... densi|
00002100  74 79 25 3d 44 44 65 6e  73 69 74 79 25 20 8c 0d  |ty%=DDensity% ..|
00002110  08 f2 10 20 20 76 61 6c  75 65 25 3d 26 34 45 0d  |...  value%=&4E.|
00002120  08 fc 05 cc 0d 09 06 10  20 20 76 61 6c 75 65 25  |........  value%|
00002130  3d 26 46 46 0d 09 10 05  cd 0d 09 1a 3b f2 66 69  |=&FF........;.fi|
00002140  6c 6c 28 76 61 6c 75 65  25 2c 20 61 64 64 25 2c  |ll(value%, add%,|
00002150  20 57 72 69 74 65 54 72  6b 42 75 66 25 20 2b 20  | WriteTrkBuf% + |
00002160  54 72 6b 44 61 74 61 53  69 7a 65 25 20 2d 20 61  |TrkDataSize% - a|
00002170  64 64 25 29 0d 09 24 05  e1 0d 09 2e 04 0d 09 38  |dd%)..$........8|
00002180  4b 20 20 20 f4 20 63 6f  70 69 65 73 20 61 72 65  |K   . copies are|
00002190  61 20 6f 66 20 73 74 6f  72 65 20 62 75 74 20 63  |a of store but c|
000021a0  6f 6e 76 65 72 74 73 20  61 6e 79 20 69 6c 6c 65  |onverts any ille|
000021b0  67 61 6c 20 63 68 72 73  28 66 6f 72 20 77 72 69  |gal chrs(for wri|
000021c0  74 65 54 72 61 63 6b 29  0d 09 42 39 20 20 20 f4  |teTrack)..B9   .|
000021d0  20 53 65 74 73 20 63 6f  6e 76 65 72 74 25 3d 54  | Sets convert%=T|
000021e0  52 55 45 20 69 66 20 69  74 20 68 61 73 20 74 6f  |RUE if it has to|
000021f0  20 63 6f 6e 76 65 72 74  20 61 6e 79 20 63 68 61  | convert any cha|
00002200  72 0d 09 4c 44 dd f2 73  65 6c 63 6f 70 79 66 77  |r..LD..selcopyfw|
00002210  64 28 53 72 63 4c 6f 77  41 64 64 25 2c 53 72 63  |d(SrcLowAdd%,Src|
00002220  41 64 64 25 2c 44 65 73  74 4c 6f 77 41 64 64 25  |Add%,DestLowAdd%|
00002230  2c 64 65 6e 73 69 74 79  25 2c f8 20 63 6f 6e 76  |,density%,. conv|
00002240  65 72 74 25 29 0d 09 56  0f ea 20 6c 6f 77 25 2c  |ert%)..V.. low%,|
00002250  20 68 69 25 0d 09 60 24  f2 67 65 74 49 6c 6c 65  | hi%..`$.getIlle|
00002260  67 61 6c 28 64 65 6e 73  69 74 79 25 2c 20 6c 6f  |gal(density%, lo|
00002270  77 25 2c 20 68 69 25 29  0d 09 6a 47 d6 20 73 65  |w%, hi%)..jG. se|
00002280  6c 63 6f 70 79 66 77 64  2c 20 53 72 63 4c 6f 77  |lcopyfwd, SrcLow|
00002290  41 64 64 25 2c 20 53 72  63 41 64 64 25 2c 20 44  |Add%, SrcAdd%, D|
000022a0  65 73 74 4c 6f 77 41 64  64 25 2c 20 6c 6f 77 25  |estLowAdd%, low%|
000022b0  2c 20 68 69 25 2c 20 63  6f 6e 76 65 72 74 25 0d  |, hi%, convert%.|
000022c0  09 74 05 e1 0d 09 7e 04  0d 09 88 2f 20 20 20 f4  |.t....~..../   .|
000022d0  20 73 65 74 75 70 20 69  6c 6c 65 67 61 6c 20 63  | setup illegal c|
000022e0  68 72 20 72 61 6e 67 65  20 66 6f 72 20 77 72 69  |hr range for wri|
000022f0  74 65 74 72 61 63 6b 0d  09 92 29 dd f2 67 65 74  |tetrack...)..get|
00002300  49 6c 6c 65 67 61 6c 28  64 65 6e 73 69 74 79 25  |Illegal(density%|
00002310  2c 20 f8 20 6c 6f 77 25  2c 20 f8 20 68 69 25 29  |, . low%, . hi%)|
00002320  0d 09 9c 1c e7 20 64 65  6e 73 69 74 79 25 20 3d  |..... density% =|
00002330  20 44 44 65 6e 73 69 74  79 25 20 8c 0d 09 a6 16  | DDensity% .....|
00002340  20 20 6c 6f 77 25 3d 26  46 35 3a 68 69 25 3d 26  |  low%=&F5:hi%=&|
00002350  46 37 0d 09 b0 05 cc 0d  09 ba 16 20 20 6c 6f 77  |F7.........  low|
00002360  25 3d 26 46 35 3a 68 69  25 3d 26 46 45 0d 09 c4  |%=&F5:hi%=&FE...|
00002370  05 cd 0d 09 ce 05 e1 0d  09 d8 04 0d 09 e2 48 dd  |..............H.|
00002380  f2 6d 61 6b 65 41 4d 61  6e 64 67 61 70 28 53 72  |.makeAMandgap(Sr|
00002390  63 4c 6f 77 41 64 64 25  2c 20 53 72 63 41 64 64  |cLowAdd%, SrcAdd|
000023a0  25 2c 20 44 65 73 74 4c  6f 77 41 64 64 25 2c 20  |%, DestLowAdd%, |
000023b0  44 65 73 74 41 64 64 25  2c 20 64 65 6e 73 69 74  |DestAdd%, densit|
000023c0  79 25 29 0d 09 ec 1a e7  20 64 65 6e 73 69 74 79  |y%)..... density|
000023d0  25 3d 44 44 65 6e 73 69  74 79 25 20 8c 0d 09 f6  |%=DDensity% ....|
000023e0  41 20 20 f2 44 44 6d 61  6b 65 41 4d 61 6e 64 67  |A  .DDmakeAMandg|
000023f0  61 70 28 53 72 63 4c 6f  77 41 64 64 25 2c 20 53  |ap(SrcLowAdd%, S|
00002400  72 63 41 64 64 25 2c 20  44 65 73 74 4c 6f 77 41  |rcAdd%, DestLowA|
00002410  64 64 25 2c 20 44 65 73  74 41 64 64 25 29 0d 0a  |dd%, DestAdd%)..|
00002420  00 05 cc 0d 0a 0a 41 20  20 f2 53 44 6d 61 6b 65  |......A  .SDmake|
00002430  41 4d 61 6e 64 67 61 70  28 53 72 63 4c 6f 77 41  |AMandgap(SrcLowA|
00002440  64 64 25 2c 20 53 72 63  41 64 64 25 2c 20 44 65  |dd%, SrcAdd%, De|
00002450  73 74 4c 6f 77 41 64 64  25 2c 20 44 65 73 74 41  |stLowAdd%, DestA|
00002460  64 64 25 29 0d 0a 14 05  cd 0d 0a 1e 05 e1 0d 0a  |dd%)............|
00002470  28 04 0d 0a 32 10 20 20  20 f4 20 44 44 20 6f 6e  |(...2.   . DD on|
00002480  6c 79 0d 0a 3c 40 dd f2  44 44 6d 61 6b 65 41 4d  |ly..<@..DDmakeAM|
00002490  61 6e 64 67 61 70 28 53  72 63 4c 6f 77 41 64 64  |andgap(SrcLowAdd|
000024a0  25 2c 20 53 72 63 41 64  64 25 2c 20 44 65 73 74  |%, SrcAdd%, Dest|
000024b0  4c 6f 77 41 64 64 25 2c  20 44 65 73 74 41 64 64  |LowAdd%, DestAdd|
000024c0  25 29 0d 0a 46 1a ea 20  56 25 2c 20 49 25 2c 20  |%)..F.. V%, I%, |
000024d0  4a 25 2c 20 63 6f 6e 76  65 72 74 25 0d 0a 50 2b  |J%, convert%..P+|
000024e0  44 65 73 74 41 64 64 25  3f 2d 31 20 3d 20 53 72  |DestAdd%?-1 = Sr|
000024f0  63 41 64 64 25 3f 2d 31  20 20 20 3a f4 20 63 6f  |cAdd%?-1   :. co|
00002500  70 79 20 4d 61 72 6b 0d  0a 5a 28 44 65 73 74 41  |py Mark..Z(DestA|
00002510  64 64 25 3f 2d 32 20 3d  20 26 46 35 20 20 20 20  |dd%?-2 = &F5    |
00002520  20 20 20 20 20 20 3a f4  20 73 65 74 20 41 4d 0d  |      :. set AM.|
00002530  0a 64 15 44 65 73 74 41  64 64 25 3f 2d 33 20 3d  |.d.DestAdd%?-3 =|
00002540  20 26 46 35 0d 0a 6e 15  44 65 73 74 41 64 64 25  | &F5..n.DestAdd%|
00002550  3f 2d 34 20 3d 20 26 46  35 0d 0a 78 1d 4a 25 3d  |?-4 = &F5..x.J%=|
00002560  44 65 73 74 41 64 64 25  20 2d 20 44 65 73 74 4c  |DestAdd% - DestL|
00002570  6f 77 41 64 64 25 0d 0a  82 08 49 25 3d 35 0d 0a  |owAdd%....I%=5..|
00002580  8c 48 e7 20 49 25 3c 3d  4a 25 20 8c 20 44 65 73  |.H. I%<=J% . Des|
00002590  74 41 64 64 25 3f 2d 49  25 20 3d 30 3a 49 25 20  |tAdd%?-I% =0:I% |
000025a0  2b 3d 31 20 3a f4 20 61  6e 64 20 73 65 74 20 70  |+=1 :. and set p|
000025b0  72 65 63 65 65 64 69 6e  67 20 32 20 62 79 74 65  |receeding 2 byte|
000025c0  73 20 74 6f 20 30 0d 0a  96 40 e7 20 49 25 3c 3d  |s to 0...@. I%<=|
000025d0  4a 25 20 8c 20 44 65 73  74 41 64 64 25 3f 2d 49  |J% . DestAdd%?-I|
000025e0  25 20 3d 30 3a 49 25 20  2b 3d 31 20 3a f4 20 28  |% =0:I% +=1 :. (|
000025f0  44 65 73 74 4c 6f 77 41  64 64 20 70 65 72 6d 69  |DestLowAdd permi|
00002600  74 74 69 6e 67 29 0d 0a  a0 12 56 25 3d 53 72 63  |tting)....V%=Src|
00002610  41 64 64 25 3f 2d 49 25  0d 0a aa 26 c8 95 20 28  |Add%?-I%...&.. (|
00002620  56 25 3d 28 53 72 63 41  64 64 25 3f 2d 49 25 29  |V%=(SrcAdd%?-I%)|
00002630  29 20 80 20 28 49 25 20  3c 3d 20 4a 25 29 0d 0a  |) . (I% <= J%)..|
00002640  b4 40 20 20 44 65 73 74  41 64 64 25 3f 2d 49 25  |.@  DestAdd%?-I%|
00002650  20 3d 20 30 20 20 20 20  3a f4 20 61 6e 64 20 61  | = 0    :. and a|
00002660  6c 6c 20 70 72 65 63 65  65 64 69 6e 67 20 62 79  |ll preceeding by|
00002670  74 65 73 20 74 6f 20 30  20 77 68 69 6c 65 0d 0a  |tes to 0 while..|
00002680  be 3c 20 20 49 25 20 2b  3d 31 20 20 20 20 20 20  |.<  I% +=1      |
00002690  20 20 20 20 20 20 20 20  3a f4 20 73 6f 75 72 63  |        :. sourc|
000026a0  65 20 62 79 74 65 73 20  64 6f 6e 27 74 20 63 68  |e bytes don't ch|
000026b0  61 6e 67 65 20 76 61 6c  75 65 0d 0a c8 2d ce 20  |ange value...-. |
000026c0  20 20 20 20 20 20 20 20  20 20 20 20 20 3a f4 20  |             :. |
000026d0  28 44 65 73 74 4c 6f 77  41 64 64 20 70 65 72 6d  |(DestLowAdd perm|
000026e0  69 74 74 69 6e 67 29 0d  0a d2 0e e7 20 49 25 3c  |itting)..... I%<|
000026f0  3d 4a 25 20 8c 0d 0a dc  32 20 20 f4 20 74 68 65  |=J% ....2  . the|
00002700  6e 20 63 6f 70 79 20 70  72 65 63 65 64 69 6e 67  |n copy preceding|
00002710  20 67 61 70 20 62 61 63  6b 20 74 6f 20 53 72 63  | gap back to Src|
00002720  4c 6f 77 61 64 64 25 0d  0a e6 4b 20 20 f2 73 65  |Lowadd%...K  .se|
00002730  6c 63 6f 70 79 66 77 64  20 28 53 72 63 4c 6f 77  |lcopyfwd (SrcLow|
00002740  41 64 64 25 2c 20 53 72  63 41 64 64 25 2d 49 25  |Add%, SrcAdd%-I%|
00002750  2c 20 44 65 73 74 4c 6f  77 41 64 64 25 2c 20 44  |, DestLowAdd%, D|
00002760  44 65 6e 73 69 74 79 25  2c 63 6f 6e 76 65 72 74  |Density%,convert|
00002770  25 29 0d 0a f0 05 cd 0d  0a fa 05 e1 0d 0b 04 04  |%)..............|
00002780  0d 0b 0e 10 20 20 20 f4  20 53 44 20 6f 6e 6c 79  |....   . SD only|
00002790  0d 0b 18 40 dd f2 53 44  6d 61 6b 65 41 4d 61 6e  |...@..SDmakeAMan|
000027a0  64 67 61 70 28 53 72 63  4c 6f 77 41 64 64 25 2c  |dgap(SrcLowAdd%,|
000027b0  20 53 72 63 41 64 64 25  2c 20 44 65 73 74 4c 6f  | SrcAdd%, DestLo|
000027c0  77 41 64 64 25 2c 20 44  65 73 74 41 64 64 25 29  |wAdd%, DestAdd%)|
000027d0  0d 0b 22 16 ea 20 49 25  2c 20 4a 25 2c 20 63 6f  |..".. I%, J%, co|
000027e0  6e 76 65 72 74 25 0d 0b  2c 33 44 65 73 74 41 64  |nvert%..,3DestAd|
000027f0  64 25 3f 2d 31 20 3d 20  26 46 30 20 84 20 28 53  |d%?-1 = &F0 . (S|
00002800  72 63 41 64 64 25 3f 2d  31 29 20 20 20 3a f4 20  |rcAdd%?-1)   :. |
00002810  63 6f 70 79 20 4d 61 72  6b 0d 0b 36 08 49 25 3d  |copy Mark..6.I%=|
00002820  32 0d 0b 40 1d 4a 25 3d  44 65 73 74 41 64 64 25  |2..@.J%=DestAdd%|
00002830  20 2d 20 44 65 73 74 4c  6f 77 41 64 64 25 0d 0b  | - DestLowAdd%..|
00002840  4a 1d c8 95 20 28 49 25  20 3c 3d 20 4a 25 29 20  |J... (I% <= J%) |
00002850  80 20 28 49 25 20 3c 3d  20 37 29 0d 0b 54 3d 20  |. (I% <= 7)..T= |
00002860  20 44 65 73 74 41 64 64  25 3f 2d 49 25 20 3d 20  | DestAdd%?-I% = |
00002870  30 20 20 20 20 20 20 3a  f4 20 61 6e 64 20 70 72  |0      :. and pr|
00002880  65 63 65 65 64 69 6e 67  20 62 79 20 36 20 62 79  |eceeding by 6 by|
00002890  74 65 73 20 6f 66 20 30  0d 0b 5e 36 20 20 49 25  |tes of 0..^6  I%|
000028a0  20 2b 3d 31 20 20 20 20  20 20 20 20 20 20 20 20  | +=1            |
000028b0  20 20 20 20 3a f4 20 28  44 65 73 74 4c 6f 77 41  |    :. (DestLowA|
000028c0  64 64 20 70 65 72 6d 69  74 74 69 6e 67 29 0d 0b  |dd permitting)..|
000028d0  68 05 ce 0d 0b 72 0e e7  20 49 25 3c 3d 4a 25 20  |h....r.. I%<=J% |
000028e0  8c 0d 0b 7c 32 20 20 f4  20 74 68 65 6e 20 63 6f  |...|2  . then co|
000028f0  70 79 20 70 72 65 63 65  64 69 6e 67 20 67 61 70  |py preceding gap|
00002900  20 62 61 63 6b 20 74 6f  20 53 72 63 4c 6f 77 61  | back to SrcLowa|
00002910  64 64 25 0d 0b 86 4b 20  20 f2 73 65 6c 63 6f 70  |dd%...K  .selcop|
00002920  79 66 77 64 20 28 53 72  63 4c 6f 77 41 64 64 25  |yfwd (SrcLowAdd%|
00002930  2c 20 53 72 63 41 64 64  25 2d 49 25 2c 20 44 65  |, SrcAdd%-I%, De|
00002940  73 74 4c 6f 77 41 64 64  25 2c 20 53 44 65 6e 73  |stLowAdd%, SDens|
00002950  69 74 79 25 2c 63 6f 6e  76 65 72 74 25 29 0d 0b  |ity%,convert%)..|
00002960  90 05 cd 0d 0b 9a 05 e1  0d 0b a4 04 0d 0b ae 45  |...............E|
00002970  20 20 20 f4 20 74 72 69  65 73 20 62 6f 74 68 20  |   . tries both |
00002980  44 44 20 26 20 53 44 20  62 65 66 6f 72 65 20 67  |DD & SD before g|
00002990  69 76 69 6e 67 20 75 70  2c 20 26 20 72 65 74 75  |iving up, & retu|
000029a0  72 6e 73 20 64 65 6e 73  69 74 79 20 66 6f 75 6e  |rns density foun|
000029b0  64 0d 0b b8 3c dd f2 72  65 61 64 53 69 6e 67 6c  |d...<..readSingl|
000029c0  65 54 72 6b 28 64 72 76  2c 20 74 72 6b 2c 20 68  |eTrk(drv, trk, h|
000029d0  65 61 64 2c 20 54 72 6b  44 65 73 63 25 2c 20 f8  |ead, TrkDesc%, .|
000029e0  20 73 72 74 44 65 6e 73  69 74 79 25 29 0d 0b c2  | srtDensity%)...|
000029f0  29 ea 20 65 6e 64 61 64  64 25 2c 20 44 61 74 61  |). endadd%, Data|
00002a00  42 75 66 25 2c 20 64 65  6e 73 69 74 79 25 2c 20  |Buf%, density%, |
00002a10  63 6f 75 6e 74 25 0d 0b  cc 1b 54 72 6b 44 65 73  |count%....TrkDes|
00002a20  63 25 3f 62 75 66 54 72  6b 25 20 20 3d 20 74 72  |c%?bufTrk%  = tr|
00002a30  6b 0d 0b d6 1c 54 72 6b  44 65 73 63 25 3f 62 75  |k....TrkDesc%?bu|
00002a40  66 48 65 61 64 25 20 3d  20 68 65 61 64 0d 0b e0  |fHead% = head...|
00002a50  18 64 65 6e 73 69 74 79  25 3d 73 72 74 44 65 6e  |.density%=srtDen|
00002a60  73 69 74 79 25 0d 0b ea  05 f5 0d 0b f4 29 20 20  |sity%........)  |
00002a70  54 72 6b 44 65 73 63 25  3f 62 75 66 54 72 6b 44  |TrkDesc%?bufTrkD|
00002a80  65 6e 73 69 74 79 25 20  20 3d 20 64 65 6e 73 69  |ensity%  = densi|
00002a90  74 79 25 0d 0b fe 28 20  20 44 61 74 61 42 75 66  |ty%...(  DataBuf|
00002aa0  25 20 3d 20 54 72 6b 44  65 73 63 25 20 2b 20 54  |% = TrkDesc% + T|
00002ab0  72 6b 44 65 73 63 53 69  7a 65 25 0d 0c 08 4a 20  |rkDescSize%...J |
00002ac0  20 65 6e 64 61 64 64 25  20 3d 20 44 61 74 61 42  | endadd% = DataB|
00002ad0  75 66 25 20 2b 20 4d 61  78 53 65 63 74 25 20 2d  |uf% + MaxSect% -|
00002ae0  31 20 2b 20 28 4d 61 78  54 72 6b 55 6e 66 6f 72  |1 + (MaxTrkUnfor|
00002af0  6d 61 74 25 20 3e 3e 20  28 32 2d 64 65 6e 73 69  |mat% >> (2-densi|
00002b00  74 79 25 29 29 0d 0c 12  07 20 20 f5 0d 0c 1c 46  |ty%))....  ....F|
00002b10  20 20 20 20 f4 20 74 6f  20 74 65 73 74 20 52 65  |    . to test Re|
00002b20  61 64 54 72 61 63 6b 20  6f 76 65 72 72 75 6e 2c  |adTrack overrun,|
00002b30  20 6f 6e 6c 79 20 72 65  70 65 61 74 20 69 66 20  | only repeat if |
00002b40  52 65 61 64 54 72 61 63  6b 20 6f 76 65 72 66 6c  |ReadTrack overfl|
00002b50  6f 77 0d 0c 26 2e 20 20  20 20 f2 66 69 6c 6c 28  |ow..&.    .fill(|
00002b60  26 35 35 2c 20 44 61 74  61 42 75 66 25 2c 20 65  |&55, DataBuf%, e|
00002b70  6e 64 61 64 64 25 2d 44  61 74 61 42 75 66 25 29  |ndadd%-DataBuf%)|
00002b80  0d 0c 30 36 20 20 20 20  f2 72 65 61 64 74 72 61  |..06    .readtra|
00002b90  63 6b 28 64 72 76 2c 20  74 72 6b 2c 20 68 65 61  |ck(drv, trk, hea|
00002ba0  64 2c 20 64 65 6e 73 69  74 79 25 2c 20 44 61 74  |d, density%, Dat|
00002bb0  61 42 75 66 25 29 0d 0c  3a 1f 20 20 20 20 65 6e  |aBuf%)..:.    en|
00002bc0  64 56 61 6c 69 64 44 61  74 61 25 3d 65 6e 64 61  |dValidData%=enda|
00002bd0  64 64 25 2d 31 0d 0c 44  27 20 20 20 20 d6 20 66  |dd%-1..D'    . f|
00002be0  69 6e 64 63 68 61 6e 67  65 62 61 63 6b 2c 20 65  |indchangeback, e|
00002bf0  6e 64 56 61 6c 69 64 44  61 74 61 25 0d 0c 4e 27  |ndValidData%..N'|
00002c00  20 20 fd 20 28 65 6e 64  61 64 64 25 20 2d 20 65  |  . (endadd% - e|
00002c10  6e 64 56 61 6c 69 64 44  61 74 61 25 29 20 3e 20  |ndValidData%) > |
00002c20  35 30 30 0d 0c 58 2f 20  20 54 72 6b 44 65 73 63  |500..X/  TrkDesc|
00002c30  25 21 62 75 66 45 6e 64  56 61 6c 69 64 44 61 74  |%!bufEndValidDat|
00002c40  61 25 20 3d 20 65 6e 64  56 61 6c 69 64 44 61 74  |a% = endValidDat|
00002c50  61 25 0d 0c 62 2f 20 20  f2 61 6e 61 6c 79 73 65  |a%..b/  .analyse|
00002c60  54 72 6b 28 54 72 6b 44  65 73 63 25 2c 20 44 61  |Trk(TrkDesc%, Da|
00002c70  74 61 42 75 66 25 2c 20  64 65 6e 73 69 74 79 25  |taBuf%, density%|
00002c80  29 0d 0c 6c 2e 20 20 f2  72 65 61 64 54 72 6b 73  |)..l.  .readTrks|
00002c90  53 65 63 74 73 20 28 64  72 76 2c 20 54 72 6b 44  |Sects (drv, TrkD|
00002ca0  65 73 63 25 2c 20 64 65  6e 73 69 74 79 25 29 0d  |esc%, density%).|
00002cb0  0c 76 22 20 20 63 6f 75  6e 74 25 3d 54 72 6b 44  |.v"  count%=TrkD|
00002cc0  65 73 63 25 3f 62 75 66  4e 75 6d 62 53 65 63 74  |esc%?bufNumbSect|
00002cd0  25 0d 0c 80 12 20 20 e7  20 63 6f 75 6e 74 25 3d  |%....  . count%=|
00002ce0  30 20 8c 0d 0c 8a 3e 20  20 20 20 64 65 6e 73 69  |0 ....>    densi|
00002cf0  74 79 25 3d 20 64 65 6e  73 69 74 79 25 20 82 20  |ty%= density% . |
00002d00  33 20 20 20 3a f4 20 69  66 20 6e 6f 20 73 65 63  |3   :. if no sec|
00002d10  74 6f 72 73 20 74 6f 67  67 6c 65 20 53 44 2f 44  |tors toggle SD/D|
00002d20  44 0d 0c 94 07 20 20 cc  0d 0c 9e 21 20 20 20 20  |D....  ....!    |
00002d30  e7 20 73 72 74 44 65 6e  73 69 74 79 25 3c 3e 64  |. srtDensity%<>d|
00002d40  65 6e 73 69 74 79 25 20  8c 0d 0c a8 1c 20 20 20  |ensity% .....   |
00002d50  20 20 20 f1 22 20 43 6f  6e 74 69 6e 75 65 73 20  |   ." Continues |
00002d60  61 73 20 22 3b 0d 0c b2  30 20 20 20 20 20 20 e7  |as ";...0      .|
00002d70  20 64 65 6e 73 69 74 79  25 3d 32 20 8c 20 f1 22  | density%=2 . ."|
00002d80  44 6f 75 62 6c 65 22 3b  20 8b 20 f1 22 53 69 6e  |Double"; . ."Sin|
00002d90  67 6c 65 22 3b 0d 0c bc  15 20 20 20 20 20 20 f1  |gle";....      .|
00002da0  22 20 44 65 6e 73 69 74  79 22 0d 0c c6 12 20 20  |" Density"....  |
00002db0  20 20 20 20 62 6c 61 6e  6b 25 3d a3 0d 0c d0 45  |    blank%=....E|
00002dc0  20 20 20 20 20 20 73 72  74 44 65 6e 73 69 74 79  |      srtDensity|
00002dd0  25 3d 64 65 6e 73 69 74  79 25 20 20 20 20 20 20  |%=density%      |
00002de0  20 3a f4 20 69 66 20 73  65 63 74 6f 72 73 2c 20  | :. if sectors, |
00002df0  75 70 64 61 74 65 20 73  72 74 44 65 6e 73 69 74  |update srtDensit|
00002e00  79 0d 0c da 09 20 20 20  20 cd 0d 0c e4 07 20 20  |y....    .....  |
00002e10  cd 0d 0c ee 1a fd 20 64  65 6e 73 69 74 79 25 3d  |...... density%=|
00002e20  73 72 74 44 65 6e 73 69  74 79 25 0d 0c f8 0e e7  |srtDensity%.....|
00002e30  20 62 6c 61 6e 6b 25 20  8c 0d 0d 02 13 20 20 e7  | blank% .....  .|
00002e40  20 63 6f 75 6e 74 25 3c  3e 30 20 8c 0d 0d 0c 10  | count%<>0 .....|
00002e50  20 20 20 20 62 6c 61 6e  6b 25 3d a3 0d 0d 16 1b  |    blank%=.....|
00002e60  20 20 20 20 f1 22 20 4e  6f 20 6c 6f 6e 67 65 72  |    ." No longer|
00002e70  20 42 6c 61 6e 6b 22 0d  0d 20 07 20 20 cd 0d 0d  | Blank".. .  ...|
00002e80  2a 05 cc 0d 0d 34 12 20  20 e7 20 63 6f 75 6e 74  |*....4.  . count|
00002e90  25 3d 30 20 8c 0d 0d 3e  10 20 20 20 20 62 6c 61  |%=0 ...>.    bla|
00002ea0  6e 6b 25 3d b9 0d 0d 48  1e 20 20 20 20 f1 22 20  |nk%=...H.    ." |
00002eb0  43 6f 6e 74 69 6e 75 65  73 20 61 73 20 42 6c 61  |Continues as Bla|
00002ec0  6e 6b 22 0d 0d 52 07 20  20 cd 0d 0d 5c 05 cd 0d  |nk"..R.  ...\...|
00002ed0  0d 66 23 f2 70 72 69 6e  74 55 6e 75 73 75 61 6c  |.f#.printUnusual|
00002ee0  28 54 72 6b 44 65 73 63  25 2c 20 63 6f 75 6e 74  |(TrkDesc%, count|
00002ef0  25 29 0d 0d 70 13 e7 20  63 68 65 63 6b 46 6f 72  |%)..p.. checkFor|
00002f00  6d 61 74 20 8c 0d 0d 7a  74 20 20 e7 20 28 28 54  |mat ...zt  . ((T|
00002f10  72 6b 44 65 73 63 25 3f  62 75 66 4e 75 6d 62 53  |rkDesc%?bufNumbS|
00002f20  65 63 74 25 29 20 3c 3e  20 63 68 6b 53 65 63 74  |ect%) <> chkSect|
00002f30  73 50 65 72 54 72 6b 29  20 84 20 28 28 54 72 6b  |sPerTrk) . ((Trk|
00002f40  44 65 73 63 25 3f 62 75  66 4d 75 6c 74 69 53 65  |Desc%?bufMultiSe|
00002f50  63 74 46 6c 67 25 29 3d  20 a3 29 20 84 20 28 64  |ctFlg%)= .) . (d|
00002f60  65 6e 73 69 74 79 25 20  3c 3e 20 63 68 6b 44 65  |ensity% <> chkDe|
00002f70  6e 73 69 74 79 25 29 20  8c 0d 0d 84 40 20 20 20  |nsity%) ....@   |
00002f80  20 f2 70 72 69 6e 74 4c  69 6e 65 28 22 20 2a 2a  | .printLine(" **|
00002f90  2a 2a 2a 2a 2a 20 54 72  61 63 6b 20 66 6f 72 6d  |***** Track form|
00002fa0  61 74 20 66 61 69 6c 65  64 20 63 68 65 63 6b 20  |at failed check |
00002fb0  2a 2a 2a 2a 2a 2a 2a 22  29 0d 0d 8e 07 20 20 cd  |*******")....  .|
00002fc0  0d 0d 98 05 cd 0d 0d a2  05 e1 0d 0d ac 04 0d 0d  |................|
00002fd0  b6 4a 20 20 20 f4 20 41  6e 61 6c 79 73 65 73 20  |.J   . Analyses |
00002fe0  52 65 61 64 20 54 72 61  63 6b 20 64 61 74 61 20  |Read Track data |
00002ff0  61 6e 64 20 73 65 74 73  20 75 70 20 54 72 61 63  |and sets up Trac|
00003000  6b 20 64 65 73 63 72 69  70 74 6f 72 20 61 63 63  |k descriptor acc|
00003010  6f 72 64 69 6e 67 6c 79  0d 0d c0 48 20 20 20 f4  |ordingly...H   .|
00003020  20 49 67 6e 6f 72 65 20  61 6e 79 20 27 61 70 70  | Ignore any 'app|
00003030  61 72 65 6e 74 27 20 73  65 63 74 6f 72 73 20 77  |arent' sectors w|
00003040  69 74 68 6f 75 74 20 61  73 73 6f 63 69 61 74 65  |ithout associate|
00003050  64 20 64 61 74 61 20 61  72 65 61 73 20 28 6f 72  |d data areas (or|
00003060  0d 0d ca 36 20 20 20 f4  20 20 69 74 20 61 70 70  |...6   .  it app|
00003070  65 61 72 20 61 73 20 27  53 65 63 74 6f 72 20 6e  |ear as 'Sector n|
00003080  6f 74 20 66 6f 75 6e 64  27 20 69 6e 20 61 6e 79  |ot found' in any|
00003090  20 63 61 73 65 29 0d 0d  d4 30 20 20 20 f4 20 69  | case)...0   . i|
000030a0  66 20 61 6e 79 74 68 69  6e 67 20 75 6e 75 73 75  |f anything unusu|
000030b0  61 6c 20 75 6e 73 65 74  20 6d 75 6c 74 69 53 65  |al unset multiSe|
000030c0  63 74 46 6c 67 25 0d 0d  de 2e dd f2 61 6e 61 6c  |ctFlg%......anal|
000030d0  79 73 65 54 72 6b 28 54  72 6b 44 65 73 63 25 2c  |yseTrk(TrkDesc%,|
000030e0  20 44 61 74 61 42 75 66  25 2c 20 64 65 6e 73 69  | DataBuf%, densi|
000030f0  74 79 25 29 0d 0d e8 45  ea 20 63 6f 75 6e 74 25  |ty%)...E. count%|
00003100  2c 20 61 64 64 25 2c 20  49 44 61 64 64 25 2c 20  |, add%, IDadd%, |
00003110  64 61 74 61 61 64 64 25  2c 20 6d 61 72 6b 25 2c  |dataadd%, mark%,|
00003120  20 49 44 63 6f 72 72 75  70 74 2c 20 6d 75 6c 74  | IDcorrupt, mult|
00003130  69 53 65 63 74 46 6c 67  25 0d 0d f2 3b ea 20 49  |iSectFlg%...;. I|
00003140  44 25 2c 20 62 79 74 65  73 25 2c 20 66 69 72 73  |D%, bytes%, firs|
00003150  74 49 44 73 79 6e 63 41  64 64 25 2c 20 65 6e 64  |tIDsyncAdd%, end|
00003160  4c 61 73 74 44 61 74 61  25 2c 20 72 65 6d 61 64  |LastData%, remad|
00003170  65 4f 4b 25 0d 0d fc 22  6d 75 6c 74 69 53 65 63  |eOK%..."multiSec|
00003180  74 46 6c 67 25 3d b9 20  20 3a f4 20 69 65 20 64  |tFlg%=.  :. ie d|
00003190  65 66 61 75 6c 74 0d 0e  06 0c 63 6f 75 6e 74 25  |efault....count%|
000031a0  3d 30 0d 0e 10 4b 61 64  64 25 3d 44 61 74 61 42  |=0...Kadd%=DataB|
000031b0  75 66 25 20 2b 20 32 20  20 20 3a f4 20 66 69 72  |uf% + 2   :. fir|
000031c0  73 74 20 49 44 20 41 4d  20 6d 75 73 74 20 62 65  |st ID AM must be|
000031d0  20 61 74 20 6c 65 61 73  74 20 32 20 62 79 74 65  | at least 2 byte|
000031e0  73 20 69 6e 74 6f 20 62  75 66 66 65 72 0d 0e 1a  |s into buffer...|
000031f0  25 65 6e 64 61 64 64 25  3d 54 72 6b 44 65 73 63  |%endadd%=TrkDesc|
00003200  25 21 62 75 66 45 6e 64  56 61 6c 69 64 44 61 74  |%!bufEndValidDat|
00003210  61 25 0d 0e 24 05 f5 0d  0e 2e 26 20 20 f2 66 69  |a%..$.....&  .fi|
00003220  6e 64 49 44 28 61 64 64  25 2c 20 65 6e 64 61 64  |ndID(add%, endad|
00003230  64 25 2c 20 64 65 6e 73  69 74 79 25 29 0d 0e 38  |d%, density%)..8|
00003240  11 20 20 e7 20 61 64 64  25 3c 3e 30 20 8c 0d 0e  |.  . add%<>0 ...|
00003250  42 43 20 20 20 20 e7 20  63 6f 75 6e 74 25 3d 6d  |BC    . count%=m|
00003260  61 78 53 65 63 74 73 41  6c 6c 6f 77 65 64 25 20  |axSectsAllowed% |
00003270  8c 20 f1 27 22 46 61 69  6c 65 64 3a 2d 20 74 6f  |. .'"Failed:- to|
00003280  6f 20 6d 61 6e 79 20 73  65 63 74 6f 72 73 22 3a  |o many sectors":|
00003290  fa 0d 0e 4c 13 20 20 20  20 49 44 61 64 64 25 3d  |...L.    IDadd%=|
000032a0  61 64 64 25 0d 0e 56 2d  20 20 20 20 e7 20 63 6f  |add%..V-    . co|
000032b0  75 6e 74 25 3d 30 20 8c  20 66 69 72 73 74 49 44  |unt%=0 . firstID|
000032c0  73 79 6e 63 41 64 64 25  3d 49 44 61 64 64 25 2d  |syncAdd%=IDadd%-|
000032d0  34 0d 0e 60 2b 20 20 20  20 f2 73 65 74 49 44 50  |4..`+    .setIDP|
000032e0  74 72 28 54 72 6b 44 65  73 63 25 2c 20 63 6f 75  |tr(TrkDesc%, cou|
000032f0  6e 74 25 2c 20 49 44 61  64 64 25 29 0d 0e 6a 3d  |nt%, IDadd%)..j=|
00003300  20 20 20 20 f2 73 65 74  53 65 63 74 49 6e 66 6f  |    .setSectInfo|
00003310  28 54 72 6b 44 65 73 63  25 2c 20 63 6f 75 6e 74  |(TrkDesc%, count|
00003320  25 2c 20 30 29 20 20 3a  f4 20 30 3d 64 65 66 61  |%, 0)  :. 0=defa|
00003330  75 6c 74 20 76 61 6c 75  65 0d 0e 74 39 20 20 20  |ult value..t9   |
00003340  20 f2 73 65 74 53 65 63  74 49 44 28 54 72 6b 44  | .setSectID(TrkD|
00003350  65 73 63 25 2c 20 63 6f  75 6e 74 25 2c 20 49 44  |esc%, count%, ID|
00003360  61 64 64 25 21 30 29 20  3a f4 20 73 61 76 65 20  |add%!0) :. save |
00003370  49 44 0d 0e 7e 10 20 20  20 20 61 64 64 25 20 2b  |ID..~.    add% +|
00003380  3d 36 0d 0e 88 20 20 20  20 20 e7 20 28 65 6e 64  |=6...     . (end|
00003390  61 64 64 25 2d 61 64 64  25 29 20 3c 20 31 32 38  |add%-add%) < 128|
000033a0  20 8c 0d 0e 92 3a 20 20  20 20 20 20 f4 20 69 66  | ....:      . if|
000033b0  20 74 68 65 72 65 20 69  73 20 61 20 64 61 74 61  | there is a data|
000033c0  20 61 72 65 61 20 69 74  20 6f 76 65 72 66 6c 6f  | area it overflo|
000033d0  77 73 20 69 6e 64 65 78  2c 20 73 6f 0d 0e 9c 42  |ws index, so...B|
000033e0  20 20 20 20 20 20 f4 20  77 72 61 70 20 61 72 6f  |      . wrap aro|
000033f0  75 6e 64 20 64 61 74 61  20 66 72 6f 6d 20 73 74  |und data from st|
00003400  61 72 74 20 6f 66 20 74  72 61 63 6b 20 28 62 65  |art of track (be|
00003410  66 6f 72 65 20 66 69 72  73 74 20 49 44 29 0d 0e  |fore first ID)..|
00003420  a6 29 20 20 20 20 20 20  f4 20 74 6f 20 65 6e 73  |.)      . to ens|
00003430  75 72 65 20 49 20 73 65  65 20 74 68 65 20 64 61  |ure I see the da|
00003440  74 61 20 6d 61 72 6b 0d  0e b0 37 20 20 20 20 20  |ta mark...7     |
00003450  20 d6 20 63 6f 70 79 66  77 64 2c 20 44 61 74 61  | . copyfwd, Data|
00003460  42 75 66 25 2c 20 66 69  72 73 74 49 44 73 79 6e  |Buf%, firstIDsyn|
00003470  63 41 64 64 25 2c 20 65  6e 64 61 64 64 25 0d 0e  |cAdd%, endadd%..|
00003480  ba 2d 20 20 20 20 20 20  65 6e 64 61 64 64 25 20  |.-      endadd% |
00003490  2b 3d 20 66 69 72 73 74  49 44 73 79 6e 63 41 64  |+= firstIDsyncAd|
000034a0  64 25 2d 44 61 74 61 42  75 66 25 0d 0e c4 09 20  |d%-DataBuf%.... |
000034b0  20 20 20 cd 0d 0e ce 40  20 20 20 20 f2 66 69 6e  |   ....@    .fin|
000034c0  64 41 4d 20 28 61 64 64  25 2c 65 6e 64 61 64 64  |dAM (add%,endadd|
000034d0  25 2c 64 65 6e 73 69 74  79 25 29 20 3a f4 20 61  |%,density%) :. a|
000034e0  69 6d 20 74 6f 20 66 69  6e 64 20 44 61 74 61 20  |im to find Data |
000034f0  41 72 65 61 0d 0e d8 44  20 20 20 20 64 61 74 61  |Area...D    data|
00003500  61 64 64 25 3d 30 20 20  20 20 20 20 20 20 20 20  |add%=0          |
00003510  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3a  |               :|
00003520  f4 20 64 65 66 61 75 6c  74 20 69 66 20 6e 6f 20  |. default if no |
00003530  44 61 74 61 41 72 65 61  0d 0e e2 14 20 20 20 20  |DataArea....    |
00003540  e7 20 61 64 64 25 20 3c  3e 30 20 8c 0d 0e ec 3e  |. add% <>0 ....>|
00003550  20 20 20 20 20 20 6d 61  72 6b 25 3d 28 61 64 64  |      mark%=(add|
00003560  25 3f 2d 31 29 20 20 20  20 20 20 20 20 20 20 20  |%?-1)           |
00003570  3a f4 20 6d 75 73 74 20  62 65 20 62 65 74 77 65  |:. must be betwe|
00003580  65 6e 20 26 46 38 2d 26  46 46 0d 0e f6 1a 20 20  |en &F8-&FF....  |
00003590  20 20 20 20 e7 20 6d 61  72 6b 25 20 3e 3d 20 26  |    . mark% >= &|
000035a0  46 43 20 8c 0d 0f 00 47  20 20 20 20 20 20 20 20  |FC ....G        |
000035b0  61 64 64 25 20 2d 3d 20  31 30 20 20 20 20 20 20  |add% -= 10      |
000035c0  20 20 20 20 20 20 20 20  3a f4 20 69 66 20 6e 6f  |        :. if no|
000035d0  74 20 44 61 74 61 20 41  72 65 61 2c 20 74 75 72  |t Data Area, tur|
000035e0  6e 20 62 61 63 6b 20 61  64 64 25 0d 0f 0a 0b 20  |n back add%.... |
000035f0  20 20 20 20 20 cc 0d 0f  14 19 20 20 20 20 20 20  |     .....      |
00003600  20 20 64 61 74 61 61 64  64 25 3d 61 64 64 25 0d  |  dataadd%=add%.|
00003610  0f 1e 1a 20 20 20 20 20  20 20 20 e7 20 6d 61 72  |...        . mar|
00003620  6b 25 3d 20 26 46 38 20  8c 0d 0f 28 20 20 20 20  |k%= &F8 ...(    |
00003630  20 20 20 20 20 20 20 f4  20 69 74 73 20 64 65 6c  |       . its del|
00003640  65 74 65 64 20 64 61 74  61 0d 0f 32 1f 20 20 20  |eted data..2.   |
00003650  20 20 20 20 20 20 20 6d  75 6c 74 69 53 65 63 74  |       multiSect|
00003660  46 6c 67 25 20 3d 20 a3  0d 0f 3c 36 20 20 20 20  |Flg% = ...<6    |
00003670  20 20 20 20 20 20 f2 61  64 64 53 65 63 74 49 6e  |      .addSectIn|
00003680  66 6f 28 54 72 6b 44 65  73 63 25 2c 20 63 6f 75  |fo(TrkDesc%, cou|
00003690  6e 74 25 2c 20 64 65 6c  44 61 74 61 25 29 0d 0f  |nt%, delData%)..|
000036a0  46 0d 20 20 20 20 20 20  20 20 cd 0d 0f 50 0b 20  |F.        ...P. |
000036b0  20 20 20 20 20 cd 0d 0f  5a 09 20 20 20 20 cd 0d  |     ...Z.    ..|
000036c0  0f 64 2f 20 20 20 20 f2  73 65 74 44 61 74 61 50  |.d/    .setDataP|
000036d0  74 72 28 54 72 6b 44 65  73 63 25 2c 20 63 6f 75  |tr(TrkDesc%, cou|
000036e0  6e 74 25 2c 20 64 61 74  61 61 64 64 25 29 0d 0f  |nt%, dataadd%)..|
000036f0  6e 16 20 20 20 20 e7 20  64 61 74 61 61 64 64 25  |n.    . dataadd%|
00003700  3d 30 20 8c 0d 0f 78 47  20 20 20 20 20 20 f4 20  |=0 ...xG      . |
00003710  6e 6f 20 64 61 74 61 20  28 73 6f 20 74 68 65 20  |no data (so the |
00003720  49 44 20 77 69 6c 6c 20  62 65 20 69 67 6e 6f 72  |ID will be ignor|
00003730  65 64 29 2c 20 73 6f 20  66 6f 72 20 54 52 41 43  |ed), so for TRAC|
00003740  45 20 73 61 6b 65 20 6f  6e 6c 79 0d 0f 82 1b 20  |E sake only.... |
00003750  20 20 20 20 20 6d 75 6c  74 69 53 65 63 74 46 6c  |     multiSectFl|
00003760  67 25 20 3d 20 a3 0d 0f  8c 31 20 20 20 20 20 20  |g% = ....1      |
00003770  f2 61 64 64 53 65 63 74  49 6e 66 6f 28 54 72 6b  |.addSectInfo(Trk|
00003780  44 65 73 63 25 2c 20 63  6f 75 6e 74 25 2c 20 6e  |Desc%, count%, n|
00003790  6f 44 61 74 61 25 29 0d  0f 96 09 20 20 20 20 cc  |oData%)....    .|
000037a0  0d 0f a0 46 20 20 20 20  20 20 f4 20 54 68 65 72  |...F      . Ther|
000037b0  65 20 69 73 20 61 20 64  61 74 61 20 61 72 65 61  |e is a data area|
000037c0  2c 20 73 6f 20 6f 6e 6c  79 20 74 68 65 6e 20 6b  |, so only then k|
000037d0  65 65 70 20 61 20 72 65  63 6f 72 64 20 6f 66 20  |eep a record of |
000037e0  73 65 63 74 6f 72 0d 0f  aa 3f 20 20 20 20 20 20  |sector...?      |
000037f0  f4 20 61 6e 64 20 6f 6e  6c 79 20 74 68 65 6e 20  |. and only then |
00003800  74 65 73 74 20 66 6f 72  20 63 6f 72 72 75 70 74  |test for corrupt|
00003810  20 49 44 27 73 20 6f 72  20 69 6c 6c 65 67 61 6c  | ID's or illegal|
00003820  20 49 44 27 73 0d 0f b4  1c 20 20 20 20 20 20 e7  | ID's....      .|
00003830  20 28 49 44 61 64 64 25  3f 33 20 3e 20 33 29 20  | (IDadd%?3 > 3) |
00003840  8c 0d 0f be 3d 20 20 20  20 20 20 20 20 f4 20 70  |....=        . p|
00003850  72 6f 62 61 62 6c 79 20  63 6f 72 72 75 70 74 20  |robably corrupt |
00003860  49 44 20 28 6f 72 20 6d  61 79 62 65 20 6e 6f 74  |ID (or maybe not|
00003870  20 49 44 20 6a 75 73 74  20 64 61 74 61 29 0d 0f  | ID just data)..|
00003880  c8 22 20 20 20 20 20 20  20 20 e7 20 64 65 6e 73  |."        . dens|
00003890  69 74 79 25 3d 44 44 65  6e 73 69 74 79 25 20 8c  |ity%=DDensity% .|
000038a0  0d 0f d2 3f 20 20 20 20  20 20 20 20 20 20 f4 20  |...?          . |
000038b0  72 65 6d 61 6b 65 20 49  44 20 26 20 73 65 74 20  |remake ID & set |
000038c0  3d 49 44 25 20 74 68 65  6e 20 6f 76 65 72 77 72  |=ID% then overwr|
000038d0  69 74 65 20 73 61 76 65  64 20 73 74 61 74 65 0d  |ite saved state.|
000038e0  0f dc 38 20 20 20 20 20  20 20 20 20 20 d6 20 72  |..8          . r|
000038f0  65 6d 61 6b 65 49 44 2c  20 6d 61 70 49 44 25 2c  |emakeID, mapID%,|
00003900  20 49 44 61 64 64 25 2c  20 49 44 25 2c 20 72 65  | IDadd%, ID%, re|
00003910  6d 61 64 65 4f 4b 25 0d  0f e6 1e 20 20 20 20 20  |madeOK%....     |
00003920  20 20 20 20 20 e7 20 72  65 6d 61 64 65 4f 4b 25  |     . remadeOK%|
00003930  3c 3e 30 20 8c 0d 0f f0  33 20 20 20 20 20 20 20  |<>0 ....3       |
00003940  20 20 20 20 20 f4 20 73  61 76 65 20 72 65 6d 61  |     . save rema|
00003950  64 65 64 20 49 44 20 6f  6e 6c 79 20 69 66 20 72  |ded ID only if r|
00003960  65 6d 61 64 65 4f 4b 25  0d 0f fa 31 20 20 20 20  |emadeOK%...1    |
00003970  20 20 20 20 20 20 20 20  f2 73 65 74 53 65 63 74  |        .setSect|
00003980  49 44 28 54 72 6b 44 65  73 63 25 2c 20 63 6f 75  |ID(TrkDesc%, cou|
00003990  6e 74 25 2c 20 49 44 25  29 0d 10 04 0f 20 20 20  |nt%, ID%)....   |
000039a0  20 20 20 20 20 20 20 cd  0d 10 0e 0d 20 20 20 20  |       .....    |
000039b0  20 20 20 20 cc 0d 10 18  38 20 20 20 20 20 20 20  |    ....8       |
000039c0  20 20 20 f4 20 6c 65 61  76 65 20 69 74 20 61 73  |   . leave it as|
000039d0  20 69 74 20 69 73 2c 20  69 66 20 69 74 73 20 53  | it is, if its S|
000039e0  69 6e 67 6c 65 20 44 65  6e 73 69 74 79 0d 10 22  |ingle Density.."|
000039f0  0d 20 20 20 20 20 20 20  20 cd 0d 10 2c 0b 20 20  |.        ...,.  |
00003a00  20 20 20 20 cd 0d 10 36  43 20 20 20 20 20 20 f2  |    ...6C      .|
00003a10  74 65 73 74 49 6c 6c 65  67 61 6c 49 64 28 54 72  |testIllegalId(Tr|
00003a20  6b 44 65 73 63 25 2c 20  63 6f 75 6e 74 25 2c 20  |kDesc%, count%, |
00003a30  64 65 6e 73 69 74 79 25  2c 20 6d 75 6c 74 69 53  |density%, multiS|
00003a40  65 63 74 46 6c 67 25 29  0d 10 40 19 20 20 20 20  |ectFlg%)..@.    |
00003a50  20 20 63 6f 75 6e 74 25  3d 63 6f 75 6e 74 25 2b  |  count%=count%+|
00003a60  31 0d 10 4a 09 20 20 20  20 cd 0d 10 54 07 20 20  |1..J.    ...T.  |
00003a70  cd 0d 10 5e 0c fd 20 61  64 64 25 3d 30 0d 10 68  |...^.. add%=0..h|
00003a80  11 e7 20 63 6f 75 6e 74  25 3c 3e 30 20 8c 0d 10  |.. count%<>0 ...|
00003a90  72 28 20 20 49 44 25 3d  a4 67 65 74 53 65 63 74  |r(  ID%=.getSect|
00003aa0  49 44 28 54 72 6b 44 65  73 63 25 2c 20 63 6f 75  |ID(TrkDesc%, cou|
00003ab0  6e 74 25 2d 31 29 0d 10  7c 27 20 20 62 79 74 65  |nt%-1)..|'  byte|
00003ac0  73 25 3d 31 20 3c 3c 20  28 37 2b 20 28 33 20 80  |s%=1 << (7+ (3 .|
00003ad0  20 28 49 44 25 20 3e 3e  32 34 29 29 29 0d 10 86  | (ID% >>24)))...|
00003ae0  40 20 20 65 6e 64 4c 61  73 74 44 61 74 61 25 3d  |@  endLastData%=|
00003af0  20 62 79 74 65 73 25 2b  35 2b 34 20 2b 20 a4 67  | bytes%+5+4 + .g|
00003b00  65 74 44 61 74 61 50 74  72 28 54 72 6b 44 65 73  |etDataPtr(TrkDes|
00003b10  63 25 2c 20 63 6f 75 6e  74 25 2d 31 29 0d 10 90  |c%, count%-1)...|
00003b20  32 20 20 e7 20 65 6e 64  4c 61 73 74 44 61 74 61  |2  . endLastData|
00003b30  25 20 3e 20 54 72 6b 44  65 73 63 25 21 62 75 66  |% > TrkDesc%!buf|
00003b40  45 6e 64 56 61 6c 69 64  44 61 74 61 25 20 8c 0d  |EndValidData% ..|
00003b50  10 9a 43 20 20 20 20 f4  20 6c 61 73 74 20 73 65  |..C    . last se|
00003b60  63 74 6f 72 27 73 20 64  61 74 61 20 61 72 65 61  |ctor's data area|
00003b70  20 6f 76 65 72 66 6c 6f  77 73 20 49 6e 64 65 78  | overflows Index|
00003b80  2c 20 73 6f 20 6d 61 72  6b 20 74 68 65 20 66 61  |, so mark the fa|
00003b90  63 74 0d 10 a4 34 20 20  20 20 f2 61 64 64 53 65  |ct...4    .addSe|
00003ba0  63 74 49 6e 66 6f 28 54  72 6b 44 65 73 63 25 2c  |ctInfo(TrkDesc%,|
00003bb0  20 63 6f 75 6e 74 25 2d  31 2c 20 6f 76 65 72 49  | count%-1, overI|
00003bc0  6e 64 65 78 25 29 0d 10  ae 24 20 20 20 20 f4 20  |ndex%)...$    . |
00003bd0  26 20 63 68 61 6e 67 65  20 65 6e 64 20 6f 66 20  |& change end of |
00003be0  76 61 6c 69 64 20 64 61  74 61 0d 10 b8 46 20 20  |valid data...F  |
00003bf0  20 20 65 6e 64 61 64 64  25 20 3d 20 66 69 72 73  |  endadd% = firs|
00003c00  74 49 44 73 79 6e 63 41  64 64 25 2d 44 61 74 61  |tIDsyncAdd%-Data|
00003c10  42 75 66 25 20 2b 20 54  72 6b 44 65 73 63 25 21  |Buf% + TrkDesc%!|
00003c20  62 75 66 45 6e 64 56 61  6c 69 64 44 61 74 61 25  |bufEndValidData%|
00003c30  0d 10 c2 22 20 20 20 20  e7 20 65 6e 64 61 64 64  |..."    . endadd|
00003c40  25 20 3c 20 65 6e 64 4c  61 73 74 44 61 74 61 25  |% < endLastData%|
00003c50  20 8c 0d 10 cc 1e 20 20  20 20 20 20 65 6e 64 4c  | .....      endL|
00003c60  61 73 74 44 61 74 61 25  3d 65 6e 64 61 64 64 25  |astData%=endadd%|
00003c70  0d 10 d6 09 20 20 20 20  cd 0d 10 e0 2f 20 20 20  |....    ..../   |
00003c80  20 f4 20 73 65 74 20 65  6e 64 20 6f 66 20 76 61  | . set end of va|
00003c90  6c 69 64 20 64 61 74 61  20 74 6f 20 73 68 6f 72  |lid data to shor|
00003ca0  74 65 72 20 6f 66 20 2d  0d 10 ea 47 20 20 20 20  |ter of -...G    |
00003cb0  f4 20 39 20 62 79 74 65  73 20 61 66 74 65 72 20  |. 9 bytes after |
00003cc0  64 61 74 61 20 61 72 65  61 20 43 52 43 20 28 61  |data area CRC (a|
00003cd0  6c 6c 6f 77 73 20 66 6f  72 20 6d 69 6e 5f 67 61  |llows for min_ga|
00003ce0  70 3d 35 20 2b 20 49 44  5f 41 4d 3d 34 29 2c 0d  |p=5 + ID_AM=4),.|
00003cf0  10 f4 31 20 20 20 20 f4  20 6f 72 20 73 74 61 72  |..1    . or star|
00003d00  74 20 6f 66 20 66 69 72  73 74 20 73 65 63 74 6f  |t of first secto|
00003d10  72 20 77 72 61 70 70 65  64 20 61 72 6f 75 6e 64  |r wrapped around|
00003d20  0d 10 fe 34 20 20 20 20  f4 20 28 65 6e 73 75 72  |...4    . (ensur|
00003d30  65 73 20 66 69 72 73 74  20 49 44 20 77 69 6c 6c  |es first ID will|
00003d40  20 6e 6f 74 20 62 65 20  6f 76 65 72 77 72 69 74  | not be overwrit|
00003d50  74 65 6e 29 0d 11 08 30  20 20 20 20 54 72 6b 44  |ten)...0    TrkD|
00003d60  65 73 63 25 21 62 75 66  45 6e 64 56 61 6c 69 64  |esc%!bufEndValid|
00003d70  44 61 74 61 25 20 3d 20  65 6e 64 4c 61 73 74 44  |Data% = endLastD|
00003d80  61 74 61 25 0d 11 12 07  20 20 cd 0d 11 1c 05 cd  |ata%....  ......|
00003d90  0d 11 26 2c 54 72 6b 44  65 73 63 25 3f 62 75 66  |..&,TrkDesc%?buf|
00003da0  4d 75 6c 74 69 53 65 63  74 46 6c 67 25 3d 20 6d  |MultiSectFlg%= m|
00003db0  75 6c 74 69 53 65 63 74  46 6c 67 25 0d 11 30 22  |ultiSectFlg%..0"|
00003dc0  54 72 6b 44 65 73 63 25  3f 62 75 66 4e 75 6d 62  |TrkDesc%?bufNumb|
00003dd0  53 65 63 74 25 20 3d 20  63 6f 75 6e 74 25 0d 11  |Sect% = count%..|
00003de0  3a 05 e1 0d 11 44 04 0d  11 4e 3c 20 f4 20 6f 6e  |:....D...N< . on|
00003df0  20 65 78 69 74 20 61 64  64 25 20 3d 20 61 64 64  | exit add% = add|
00003e00  72 65 73 73 20 6f 66 20  49 44 20 28 66 6f 75 6e  |ress of ID (foun|
00003e10  64 29 20 6f 72 20 30 20  28 4e 4f 54 20 66 6f 75  |d) or 0 (NOT fou|
00003e20  6e 64 29 0d 11 58 28 dd  f2 66 69 6e 64 49 44 20  |nd)..X(..findID |
00003e30  28 f8 20 61 64 64 25 2c  20 65 6e 64 61 64 64 25  |(. add%, endadd%|
00003e40  2c 20 64 65 6e 73 69 74  79 25 29 0d 11 62 1a e7  |, density%)..b..|
00003e50  20 64 65 6e 73 69 74 79  25 3d 44 44 65 6e 73 69  | density%=DDensi|
00003e60  74 79 25 20 8c 0d 11 6c  1f 20 20 d6 20 44 44 66  |ty% ...l.  . DDf|
00003e70  69 6e 64 49 44 2c 20 61  64 64 25 2c 20 65 6e 64  |indID, add%, end|
00003e80  61 64 64 25 0d 11 76 05  cc 0d 11 80 07 20 20 f5  |add%..v......  .|
00003e90  0d 11 8a 21 20 20 20 20  d6 20 53 44 66 69 6e 64  |...!    . SDfind|
00003ea0  49 44 2c 20 61 64 64 25  2c 20 65 6e 64 61 64 64  |ID, add%, endadd|
00003eb0  25 0d 11 94 44 20 20 fd  20 28 61 64 64 25 3d 30  |%...D  . (add%=0|
00003ec0  29 20 84 20 28 28 61 64  64 25 3f 33 29 3c 3d 20  |) . ((add%?3)<= |
00003ed0  33 29 3a f4 20 65 78 74  72 61 20 74 65 73 74 20  |3):. extra test |
00003ee0  66 6f 72 20 76 61 6c 69  64 20 53 69 7a 65 20 66  |for valid Size f|
00003ef0  6f 72 20 53 44 0d 11 9e  05 cd 0d 11 a8 05 e1 0d  |or SD...........|
00003f00  11 b2 04 0d 11 bc 46 20  f4 20 6f 6e 20 65 78 69  |......F . on exi|
00003f10  74 20 61 64 64 25 20 3d  20 61 64 64 72 65 73 73  |t add% = address|
00003f20  20 6f 66 20 61 64 64 72  65 73 73 20 6d 61 72 6b  | of address mark|
00003f30  20 28 66 6f 75 6e 64 29  20 6f 72 20 30 20 28 4e  | (found) or 0 (N|
00003f40  4f 54 20 66 6f 75 6e 64  29 0d 11 c6 28 dd f2 66  |OT found)...(..f|
00003f50  69 6e 64 41 4d 20 28 f8  20 61 64 64 25 2c 20 65  |indAM (. add%, e|
00003f60  6e 64 61 64 64 25 2c 20  64 65 6e 73 69 74 79 25  |ndadd%, density%|
00003f70  29 0d 11 d0 1a e7 20 64  65 6e 73 69 74 79 25 3d  |)..... density%=|
00003f80  44 44 65 6e 73 69 74 79  25 20 8c 0d 11 da 1f 20  |DDensity% ..... |
00003f90  20 d6 20 44 44 66 69 6e  64 41 4d 2c 20 61 64 64  | . DDfindAM, add|
00003fa0  25 2c 20 65 6e 64 61 64  64 25 0d 11 e4 05 cc 0d  |%, endadd%......|
00003fb0  11 ee 1f 20 20 d6 20 53  44 66 69 6e 64 41 4d 2c  |...  . SDfindAM,|
00003fc0  20 61 64 64 25 2c 20 65  6e 64 61 64 64 25 0d 11  | add%, endadd%..|
00003fd0  f8 05 cd 0d 12 02 05 e1  0d 12 0c 04 0d 12 16 40  |...............@|
00003fe0  20 20 f4 20 49 46 20 4d  75 6c 74 69 20 73 65 63  |  . IF Multi sec|
00003ff0  74 6f 72 2c 20 73 65 74  75 70 20 6d 65 6d 6f 72  |tor, setup memor|
00004000  79 20 70 6f 69 6e 74 65  72 20 6c 69 73 74 20 26  |y pointer list &|
00004010  20 64 6f 20 6f 6e 65 20  72 65 61 64 0d 12 20 43  | do one read.. C|
00004020  20 20 f4 20 45 4c 53 45  20 28 6f 72 20 69 66 20  |  . ELSE (or if |
00004030  61 62 6f 76 65 20 72 65  61 64 20 66 61 69 6c 73  |above read fails|
00004040  29 20 72 65 61 64 20 65  61 63 68 20 73 65 63 74  |) read each sect|
00004050  6f 72 20 69 6e 64 69 76  69 64 75 61 6c 6c 79 0d  |or individually.|
00004060  12 2a 31 20 20 f4 20 69  66 20 6d 75 6c 74 69 2d  |.*1  . if multi-|
00004070  73 65 63 74 6f 72 20 72  65 61 64 20 66 61 69 6c  |sector read fail|
00004080  73 20 75 6e 73 65 74 20  69 74 73 20 66 6c 61 67  |s unset its flag|
00004090  0d 12 34 2e dd f2 72 65  61 64 54 72 6b 73 53 65  |..4...readTrksSe|
000040a0  63 74 73 20 28 64 72 76  25 2c 20 54 72 6b 44 65  |cts (drv%, TrkDe|
000040b0  73 63 25 2c 20 64 65 6e  73 69 74 79 25 29 0d 12  |sc%, density%)..|
000040c0  3e 40 ea 20 73 65 63 74  46 6f 75 6e 64 25 2c 74  |>@. sectFound%,t|
000040d0  72 6b 25 2c 68 65 61 64  25 2c 6c 6f 77 53 65 63  |rk%,head%,lowSec|
000040e0  74 25 2c 73 65 63 74 53  69 7a 65 25 2c 61 64 64  |t%,sectSize%,add|
000040f0  25 2c 49 44 61 64 64 25  2c 73 65 63 74 25 0d 12  |%,IDadd%,sect%..|
00004100  48 38 ea 20 6d 75 6c 74  69 53 65 63 74 46 6c 67  |H8. multiSectFlg|
00004110  25 2c 20 63 6f 75 6e 74  25 2c 20 62 79 74 65 73  |%, count%, bytes|
00004120  25 2c 20 69 6e 66 6f 25  2c 20 6e 6f 74 52 65 61  |%, info%, notRea|
00004130  6c 53 65 63 74 25 0d 12  52 05 f5 0d 12 5c 41 20  |lSect%..R....\A |
00004140  20 6e 6f 74 52 65 61 6c  53 65 63 74 25 3d a3 20  | notRealSect%=. |
00004150  3a f4 20 62 72 65 61 6b  20 6f 75 74 20 66 6f 72  |:. break out for|
00004160  20 27 53 65 63 74 6f 72  20 6e 6f 74 20 66 6f 75  | 'Sector not fou|
00004170  6e 64 27 20 26 20 72 65  2d 74 72 79 0d 12 66 24  |nd' & re-try..f$|
00004180  20 20 63 6f 75 6e 74 25  20 3d 20 54 72 6b 44 65  |  count% = TrkDe|
00004190  73 63 25 3f 62 75 66 4e  75 6d 62 53 65 63 74 25  |sc%?bufNumbSect%|
000041a0  0d 12 70 13 20 20 e7 20  63 6f 75 6e 74 25 3c 3e  |..p.  . count%<>|
000041b0  30 20 8c 0d 12 7a 1e 20  20 20 20 74 72 6b 25 20  |0 ...z.    trk% |
000041c0  3d 54 72 6b 44 65 73 63  25 3f 62 75 66 54 72 6b  |=TrkDesc%?bufTrk|
000041d0  25 0d 12 84 1f 20 20 20  20 68 65 61 64 25 3d 54  |%....    head%=T|
000041e0  72 6b 44 65 73 63 25 3f  62 75 66 48 65 61 64 25  |rkDesc%?bufHead%|
000041f0  0d 12 8e 30 20 20 20 20  6d 75 6c 74 69 53 65 63  |...0    multiSec|
00004200  74 46 6c 67 25 3d 20 54  72 6b 44 65 73 63 25 3f  |tFlg%= TrkDesc%?|
00004210  62 75 66 4d 75 6c 74 69  53 65 63 74 46 6c 67 25  |bufMultiSectFlg%|
00004220  0d 12 98 38 20 20 20 20  f4 20 2d 2d 20 6d 61 6e  |...8    . -- man|
00004230  79 20 6f 66 20 62 65 6c  6f 77 20 63 61 6e 20 73  |y of below can s|
00004240  65 74 20 6d 75 6c 74 69  53 65 63 74 46 6c 67 25  |et multiSectFlg%|
00004250  20 3d 20 46 41 4c 53 45  0d 12 a2 34 20 20 20 20  | = FALSE...4    |
00004260  f2 73 65 74 4c 65 6e 67  74 68 73 28 54 72 6b 44  |.setLengths(TrkD|
00004270  65 73 63 25 2c 20 63 6f  75 6e 74 25 2c 20 6d 75  |esc%, count%, mu|
00004280  6c 74 69 53 65 63 74 46  6c 67 25 29 0d 12 ac 19  |ltiSectFlg%)....|
00004290  20 20 20 20 e7 20 6d 75  6c 74 69 53 65 63 74 46  |    . multiSectF|
000042a0  6c 67 25 20 8c 0d 12 b6  39 20 20 20 20 20 20 f2  |lg% ....9      .|
000042b0  73 65 74 4d 75 6c 74 69  53 65 63 74 20 28 54 72  |setMultiSect (Tr|
000042c0  6b 44 65 73 63 25 2c 20  63 6f 75 6e 74 25 2c 20  |kDesc%, count%, |
000042d0  6d 75 6c 74 69 53 65 63  74 46 6c 67 25 29 0d 12  |multiSectFlg%)..|
000042e0  c0 09 20 20 20 20 cd 0d  12 ca 19 20 20 20 20 e7  |..    .....    .|
000042f0  20 6d 75 6c 74 69 53 65  63 74 46 6c 67 25 20 8c  | multiSectFlg% .|
00004300  0d 12 d4 3a 20 20 20 20  20 20 f4 20 72 65 61 64  |...:      . read|
00004310  20 74 72 61 63 6b 20 69  6e 20 6f 6e 65 20 67 6f  | track in one go|
00004320  20 62 75 74 20 75 73 69  6e 67 20 6d 65 6d 6f 72  | but using memor|
00004330  79 20 44 4d 41 20 6c 69  73 74 0d 12 de 27 20 20  |y DMA list...'  |
00004340  20 20 20 20 6c 6f 77 53  65 63 74 25 3d 54 72 6b  |    lowSect%=Trk|
00004350  44 65 73 63 25 3f 62 75  66 4c 6f 77 53 65 63 74  |Desc%?bufLowSect|
00004360  25 0d 12 e8 29 20 20 20  20 20 20 73 65 63 74 53  |%...)      sectS|
00004370  69 7a 65 25 3d 54 72 6b  44 65 73 63 25 3f 62 75  |ize%=TrkDesc%?bu|
00004380  66 53 65 63 74 53 69 7a  65 25 0d 12 f2 2b 20 20  |fSectSize%...+  |
00004390  20 20 20 20 f2 63 6f 70  79 4d 65 6d 41 64 64 4c  |    .copyMemAddL|
000043a0  69 73 74 28 54 72 6b 44  65 73 63 25 2c 20 63 6f  |ist(TrkDesc%, co|
000043b0  75 6e 74 25 29 0d 12 fc  63 20 20 20 20 20 20 f2  |unt%)...c      .|
000043c0  6f 70 73 65 63 74 6f 72  73 28 52 65 61 64 25 20  |opsectors(Read% |
000043d0  84 20 28 31 3c 3c 35 29  2c 64 72 76 25 2c 74 72  |. (1<<5),drv%,tr|
000043e0  6b 25 2c 68 65 61 64 25  2c 6c 6f 77 53 65 63 74  |k%,head%,lowSect|
000043f0  25 2c 63 6f 75 6e 74 25  2c 73 65 63 74 53 69 7a  |%,count%,sectSiz|
00004400  65 25 2c 64 65 6e 73 69  74 79 25 2c 6d 65 6d 41  |e%,density%,memA|
00004410  64 64 4c 69 73 74 25 29  0d 13 06 38 20 20 20 20  |ddList%)...8    |
00004420  20 20 e7 20 72 65 73 75  6c 74 25 20 3c 3e 20 30  |  . result% <> 0|
00004430  20 8c 20 6d 75 6c 74 69  53 65 63 74 46 6c 67 25  | . multiSectFlg%|
00004440  3d a3 20 3a f4 20 44 69  73 63 20 65 72 72 6f 72  |=. :. Disc error|
00004450  0d 13 10 09 20 20 20 20  cd 0d 13 1a 1b 20 20 20  |....    .....   |
00004460  20 e7 20 6d 75 6c 74 69  53 65 63 74 46 6c 67 25  | . multiSectFlg%|
00004470  3d 30 20 8c 0d 13 24 15  20 20 20 20 20 20 e7 20  |=0 ...$.      . |
00004480  61 6e 61 6c 79 73 65 20  8c 0d 13 2e 35 20 20 20  |analyse ....5   |
00004490  20 20 20 20 20 f1 22 20  20 72 65 61 64 69 6e 67  |     ."  reading|
000044a0  3a 2d 20 6e 6f 6e 2d 73  74 61 6e 64 61 72 64 20  |:- non-standard |
000044b0  74 72 61 63 6b 20 6c 61  79 6f 75 74 3f 22 0d 13  |track layout?"..|
000044c0  38 0b 20 20 20 20 20 20  cd 0d 13 42 4b 20 20 20  |8.      ...BK   |
000044d0  20 20 20 f4 20 63 61 74  63 68 20 61 6c 6c 2c 64  |   . catch all,d|
000044e0  65 6c 65 74 65 64 20 64  61 74 61 2c 6e 6f 6e 2d  |eleted data,non-|
000044f0  63 6f 6e 73 65 63 75 74  69 76 65 20 49 44 73 2c  |consecutive IDs,|
00004500  20 49 44 20 26 20 44 61  74 61 41 72 65 61 20 65  | ID & DataArea e|
00004510  72 72 6f 72 0d 13 4c 40  20 20 20 20 20 20 f4 20  |rror..L@      . |
00004520  69 6c 6c 65 67 61 6c 20  49 44 73 20 54 72 6b 2c  |illegal IDs Trk,|
00004530  20 61 6e 64 20 64 61 74  61 20 61 72 65 61 73 20  | and data areas |
00004540  74 68 61 74 20 6f 76 65  72 6c 61 79 20 6e 65 78  |that overlay nex|
00004550  74 20 49 44 0d 13 56 24  20 20 20 20 20 20 e3 20  |t ID..V$      . |
00004560  73 65 63 74 46 6f 75 6e  64 25 3d 20 30 20 b8 20  |sectFound%= 0 . |
00004570  63 6f 75 6e 74 25 2d 31  0d 13 60 1e 20 20 20 20  |count%-1..`.    |
00004580  20 20 20 20 e7 20 6e 6f  74 52 65 61 6c 53 65 63  |    . notRealSec|
00004590  74 25 3d a3 20 8c 0d 13  6a 35 20 20 20 20 20 20  |t%=. ...j5      |
000045a0  20 20 20 20 69 6e 66 6f  25 3d a4 67 65 74 53 65  |    info%=.getSe|
000045b0  63 74 49 6e 66 6f 28 54  72 6b 44 65 73 63 25 2c  |ctInfo(TrkDesc%,|
000045c0  73 65 63 74 46 6f 75 6e  64 25 29 0d 13 74 37 20  |sectFound%)..t7 |
000045d0  20 20 20 20 20 20 20 20  20 e7 20 28 69 6e 66 6f  |         . (info|
000045e0  25 20 80 20 28 69 6c 6c  65 67 61 6c 54 72 6b 25  |% . (illegalTrk%|
000045f0  20 84 20 6e 6f 44 61 74  61 25 29 29 20 3d 20 30  | . noData%)) = 0|
00004600  20 8c 0d 13 7e 4a 20 20  20 20 20 20 20 20 20 20  | ...~J          |
00004610  20 20 f4 20 6c 65 67 61  6c 20 49 44 20 74 72 6b  |  . legal ID trk|
00004620  20 28 6f 6e 20 41 72 63  29 26 20 64 61 74 61 20  | (on Arc)& data |
00004630  61 72 65 61 28 69 6e 63  6c 20 64 65 6c 64 61 74  |area(incl deldat|
00004640  61 29 20 74 68 65 6e 20  72 65 61 64 0d 13 88 36  |a) then read...6|
00004650  20 20 20 20 20 20 20 20  20 20 20 20 61 64 64 25  |            add%|
00004660  3d a4 67 65 74 44 61 74  61 50 74 72 28 54 72 6b  |=.getDataPtr(Trk|
00004670  44 65 73 63 25 2c 20 73  65 63 74 46 6f 75 6e 64  |Desc%, sectFound|
00004680  25 29 0d 13 92 34 20 20  20 20 20 20 20 20 20 20  |%)...4          |
00004690  20 20 49 44 25 3d a4 67  65 74 53 65 63 74 49 44  |  ID%=.getSectID|
000046a0  28 54 72 6b 44 65 73 63  25 2c 20 73 65 63 74 46  |(TrkDesc%, sectF|
000046b0  6f 75 6e 64 25 29 0d 13  9c 27 20 20 20 20 20 20  |ound%)...'      |
000046c0  20 20 20 20 20 20 73 65  63 74 25 3d 26 46 46 20  |      sect%=&FF |
000046d0  80 20 28 49 44 25 20 3e  3e 20 31 36 29 0d 13 a6  |. (ID% >> 16)...|
000046e0  3b 20 20 20 20 20 20 20  20 20 20 20 20 62 79 74  |;            byt|
000046f0  65 73 25 3d a4 67 65 74  44 61 74 61 4c 65 6e 67  |es%=.getDataLeng|
00004700  74 68 28 54 72 6b 44 65  73 63 25 2c 20 73 65 63  |th(TrkDesc%, sec|
00004710  74 46 6f 75 6e 64 25 29  0d 13 b0 4a 20 20 20 20  |tFound%)...J    |
00004720  20 20 20 20 20 20 20 20  f2 6f 70 62 79 74 65 73  |        .opbytes|
00004730  28 52 65 61 64 25 2c 64  72 76 25 2c 74 72 6b 25  |(Read%,drv%,trk%|
00004740  2c 68 65 61 64 25 2c 73  65 63 74 25 2c 62 79 74  |,head%,sect%,byt|
00004750  65 73 25 2c 64 65 6e 73  69 74 79 25 2c 61 64 64  |es%,density%,add|
00004760  25 29 0d 13 ba 1e 20 20  20 20 20 20 20 20 20 20  |%)....          |
00004770  20 20 e7 20 72 65 73 75  6c 74 25 3c 3e 30 20 8c  |  . result%<>0 .|
00004780  0d 13 c4 4b 20 20 20 20  20 20 20 20 20 20 20 20  |...K            |
00004790  20 20 f2 72 65 61 64 53  65 63 74 45 72 72 28 54  |  .readSectErr(T|
000047a0  72 6b 44 65 73 63 25 2c  20 73 65 63 74 6f 72 46  |rkDesc%, sectorF|
000047b0  6f 75 6e 64 25 2c 72 65  73 75 6c 74 25 2c 6e 6f  |ound%,result%,no|
000047c0  74 52 65 61 6c 53 65 63  74 25 29 0d 13 ce 11 20  |tRealSect%).... |
000047d0  20 20 20 20 20 20 20 20  20 20 20 cd 0d 13 d8 0f  |           .....|
000047e0  20 20 20 20 20 20 20 20  20 20 cc 0d 13 e2 44 20  |          ....D |
000047f0  20 20 20 20 20 20 20 20  20 20 20 f4 20 6d 61 79  |           . may|
00004800  62 65 20 74 68 69 73 20  69 73 20 6e 6f 74 20 61  |be this is not a|
00004810  20 73 65 63 74 6f 72 20  61 74 61 6c 6c 20 62 75  | sector atall bu|
00004820  74 20 49 44 20 70 61 74  74 65 72 6e 20 69 73 0d  |t ID pattern is.|
00004830  13 ec 45 20 20 20 20 20  20 20 20 20 20 20 20 f4  |..E            .|
00004840  20 70 61 72 74 20 6f 66  20 61 20 64 61 74 61 20  | part of a data |
00004850  61 72 65 61 2e 20 41 73  73 75 6d 65 20 69 74 20  |area. Assume it |
00004860  69 73 20 6e 6f 74 20 61  20 73 65 63 74 6f 72 20  |is not a sector |
00004870  69 66 20 61 0d 13 f6 40  20 20 20 20 20 20 20 20  |if a...@        |
00004880  20 20 20 20 f4 20 70 72  65 76 69 6f 75 73 20 73  |    . previous s|
00004890  65 63 74 6f 72 20 68 61  73 20 6c 6f 6e 67 44 61  |ector has longDa|
000048a0  74 61 20 6f 72 20 6e 6f  52 6f 6f 6d 43 52 43 20  |ta or noRoomCRC |
000048b0  73 65 74 2e 0d 14 00 40  20 20 20 20 20 20 20 20  |set....@        |
000048c0  20 20 20 20 f4 20 4e 4f  54 20 61 20 46 4f 4f 4c  |    . NOT a FOOL|
000048d0  20 50 52 4f 4f 46 20 74  65 73 74 20 62 75 74 20  | PROOF test but |
000048e0  70 72 6f 62 61 62 6c 79  20 67 6f 6f 64 20 65 6e  |probably good en|
000048f0  6f 75 67 68 0d 14 0a 21  20 20 20 20 20 20 20 20  |ough...!        |
00004900  20 20 20 20 e7 20 73 65  63 74 46 6f 75 6e 64 25  |    . sectFound%|
00004910  3c 3e 30 20 8c 0d 14 14  57 20 20 20 20 20 20 20  |<>0 ....W       |
00004920  20 20 20 20 20 20 20 e7  20 28 28 6c 6f 6e 67 44  |       . ((longD|
00004930  61 74 61 25 20 84 20 6e  6f 52 6f 6f 6d 43 52 43  |ata% . noRoomCRC|
00004940  25 29 20 80 20 a4 67 65  74 53 65 63 74 49 6e 66  |%) . .getSectInf|
00004950  6f 28 54 72 6b 44 65 73  63 25 2c 20 73 65 63 74  |o(TrkDesc%, sect|
00004960  46 6f 75 6e 64 25 2d 31  29 29 20 8c 0d 14 1e 22  |Found%-1)) ...."|
00004970  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00004980  6e 6f 74 52 65 61 6c 53  65 63 74 25 3d b9 0d 14  |notRealSect%=...|
00004990  28 37 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |(7              |
000049a0  20 20 f2 64 65 6c 65 74  65 53 65 63 74 28 54 72  |  .deleteSect(Tr|
000049b0  6b 44 65 73 63 25 2c 20  73 65 63 74 6f 72 46 6f  |kDesc%, sectorFo|
000049c0  75 6e 64 25 29 0d 14 32  13 20 20 20 20 20 20 20  |und%)..2.       |
000049d0  20 20 20 20 20 20 20 cd  0d 14 3c 11 20 20 20 20  |       ...<.    |
000049e0  20 20 20 20 20 20 20 20  cd 0d 14 46 0f 20 20 20  |        ...F.   |
000049f0  20 20 20 20 20 20 20 cd  0d 14 50 0d 20 20 20 20  |       ...P.    |
00004a00  20 20 20 20 cd 0d 14 5a  0b 20 20 20 20 20 20 ed  |    ...Z.      .|
00004a10  0d 14 64 09 20 20 20 20  cd 0d 14 6e 45 20 20 20  |..d.    ...nE   |
00004a20  20 54 72 6b 44 65 73 63  25 3f 62 75 66 4d 75 6c  | TrkDesc%?bufMul|
00004a30  74 69 53 65 63 74 46 6c  67 25 3d 20 6d 75 6c 74  |tiSectFlg%= mult|
00004a40  69 53 65 63 74 46 6c 67  25 20 3a f4 20 69 6e 20  |iSectFlg% :. in |
00004a50  63 61 73 65 20 69 74 73  20 72 65 73 65 74 0d 14  |case its reset..|
00004a60  78 07 20 20 cd 0d 14 82  14 fd 20 6e 6f 74 52 65  |x.  ...... notRe|
00004a70  61 6c 53 65 63 74 25 3d  a3 0d 14 8c 05 e1 0d 14  |alSect%=........|
00004a80  96 04 0d 14 a0 42 dd f2  72 65 61 64 53 65 63 74  |.....B..readSect|
00004a90  45 72 72 28 54 72 6b 44  65 73 63 25 2c 20 73 65  |Err(TrkDesc%, se|
00004aa0  63 74 6f 72 46 6f 75 6e  64 25 2c 20 72 65 73 75  |ctorFound%, resu|
00004ab0  6c 74 25 2c 20 f8 20 6e  6f 74 52 65 61 6c 53 65  |lt%, . notRealSe|
00004ac0  63 74 25 29 0d 14 aa 40  f4 20 53 70 65 63 69 61  |ct%)...@. Specia|
00004ad0  6c 20 61 63 74 69 6f 6e  73 20 6f 6e 20 72 65 61  |l actions on rea|
00004ae0  64 20 73 65 63 74 6f 72  20 65 72 72 6f 72 20 28  |d sector error (|
00004af0  65 67 20 53 65 63 74 6f  72 20 4e 6f 74 20 46 6f  |eg Sector Not Fo|
00004b00  75 6e 64 29 0d 14 b4 1c  ea 20 49 44 25 2c 20 63  |und)..... ID%, c|
00004b10  6f 75 6e 74 25 2c 20 73  65 63 74 53 69 7a 65 25  |ount%, sectSize%|
00004b20  0d 14 be 24 e7 20 28 72  65 73 75 6c 74 25 20 80  |...$. (result% .|
00004b30  20 65 72 72 4e 6f 74 46  6f 75 6e 64 25 29 20 3c  | errNotFound%) <|
00004b40  3e 30 20 8c 0d 14 c8 1b  20 20 f4 20 49 66 20 53  |>0 .....  . If S|
00004b50  65 63 74 6f 72 20 4e 6f  74 20 46 6f 75 6e 64 0d  |ector Not Found.|
00004b60  14 d2 2a 20 20 49 44 25  3d a4 67 65 74 53 65 63  |..*  ID%=.getSec|
00004b70  74 49 44 28 54 72 6b 44  65 73 63 25 2c 20 73 65  |tID(TrkDesc%, se|
00004b80  63 74 46 6f 75 6e 64 25  29 0d 14 dc 31 20 20 e7  |ctFound%)...1  .|
00004b90  20 49 44 25 20 3c 3e 20  21 a4 67 65 74 49 44 50  | ID% <> !.getIDP|
00004ba0  74 72 28 54 72 6b 44 65  73 63 25 2c 20 73 65 63  |tr(TrkDesc%, sec|
00004bb0  74 46 6f 75 6e 64 25 29  20 8c 0d 14 e6 49 20 20  |tFound%) ....I  |
00004bc0  20 20 f4 20 49 66 20 63  6f 72 72 75 70 74 20 49  |  . If corrupt I|
00004bd0  44 20 26 20 4e 6f 74 20  46 6f 75 6e 64 2c 20 63  |D & Not Found, c|
00004be0  68 65 63 6b 20 66 6f 72  20 61 6c 74 65 72 6e 61  |heck for alterna|
00004bf0  74 69 76 65 20 66 6f 72  20 63 6f 72 72 75 70 74  |tive for corrupt|
00004c00  20 49 44 0d 14 f0 10 20  20 20 20 c8 8e 20 49 44  | ID....    .. ID|
00004c10  25 20 ca 0d 14 fa 34 20  20 20 20 20 20 c9 20 26  |% ....4      . &|
00004c20  30 31 34 42 30 31 31 43  3a 20 49 44 25 3d 26 30  |014B011C: ID%=&0|
00004c30  31 34 46 30 31 31 43 20  3a 6e 6f 74 52 65 61 6c  |14F011C :notReal|
00004c40  53 65 63 74 25 3d b9 0d  15 04 34 20 20 20 20 20  |Sect%=....4     |
00004c50  20 c9 20 26 30 32 42 37  30 30 32 39 3a 20 49 44  | . &02B70029: ID|
00004c60  25 3d 26 30 32 44 35 30  30 32 39 20 3a 6e 6f 74  |%=&02D50029 :not|
00004c70  52 65 61 6c 53 65 63 74  25 3d b9 0d 15 0e 34 20  |RealSect%=....4 |
00004c80  20 20 20 20 20 c9 20 26  30 32 42 34 30 30 32 39  |     . &02B40029|
00004c90  3a 20 49 44 25 3d 26 30  33 46 43 30 30 32 39 20  |: ID%=&03FC0029 |
00004ca0  3a 6e 6f 74 52 65 61 6c  53 65 63 74 25 3d b9 0d  |:notRealSect%=..|
00004cb0  15 18 34 20 20 20 20 20  20 c9 20 26 30 30 35 35  |..4      . &0055|
00004cc0  30 31 32 39 3a 20 49 44  25 3d 26 30 30 37 37 30  |0129: ID%=&00770|
00004cd0  31 32 39 20 3a 6e 6f 74  52 65 61 6c 53 65 63 74  |129 :notRealSect|
00004ce0  25 3d b9 0d 15 22 34 20  20 20 20 20 20 c9 20 26  |%=..."4      . &|
00004cf0  30 30 36 34 30 31 32 39  3a 20 49 44 25 3d 26 30  |00640129: ID%=&0|
00004d00  30 41 34 30 31 32 39 20  3a 6e 6f 74 52 65 61 6c  |0A40129 :notReal|
00004d10  53 65 63 74 25 3d b9 0d  15 2c 34 20 20 20 20 20  |Sect%=...,4     |
00004d20  20 c9 20 26 30 31 37 37  30 31 32 39 3a 20 49 44  | . &01770129: ID|
00004d30  25 3d 26 30 31 42 37 30  31 32 39 20 3a 6e 6f 74  |%=&01B70129 :not|
00004d40  52 65 61 6c 53 65 63 74  25 3d b9 0d 15 36 34 20  |RealSect%=...64 |
00004d50  20 20 20 20 20 c9 20 26  30 32 36 41 30 31 32 39  |     . &026A0129|
00004d60  3a 20 49 44 25 3d 26 30  32 44 36 30 31 32 39 20  |: ID%=&02D60129 |
00004d70  3a 6e 6f 74 52 65 61 6c  53 65 63 74 25 3d b9 0d  |:notRealSect%=..|
00004d80  15 40 34 20 20 20 20 20  20 c9 20 26 30 32 46 41  |.@4      . &02FA|
00004d90  30 31 32 39 3a 20 49 44  25 3d 26 30 33 35 36 30  |0129: ID%=&03560|
00004da0  31 32 39 20 3a 6e 6f 74  52 65 61 6c 53 65 63 74  |129 :notRealSect|
00004db0  25 3d b9 0d 15 4a 34 20  20 20 20 20 20 c9 20 26  |%=...J4      . &|
00004dc0  30 33 36 36 30 31 32 39  3a 20 49 44 25 3d 26 30  |03660129: ID%=&0|
00004dd0  33 41 36 30 31 32 39 20  3a 6e 6f 74 52 65 61 6c  |3A60129 :notReal|
00004de0  53 65 63 74 25 3d b9 0d  15 54 34 20 20 20 20 20  |Sect%=...T4     |
00004df0  20 c9 20 26 30 32 42 35  30 31 32 39 3a 20 49 44  | . &02B50129: ID|
00004e00  25 3d 26 30 33 46 44 30  31 32 39 20 3a 6e 6f 74  |%=&03FD0129 :not|
00004e10  52 65 61 6c 53 65 63 74  25 3d b9 0d 15 5e 34 20  |RealSect%=...^4 |
00004e20  20 20 20 20 20 c9 20 26  30 32 37 35 30 31 32 39  |     . &02750129|
00004e30  3a 20 49 44 25 3d 26 30  32 42 35 30 31 32 39 20  |: ID%=&02B50129 |
00004e40  3a 6e 6f 74 52 65 61 6c  53 65 63 74 25 3d b9 0d  |:notRealSect%=..|
00004e50  15 68 42 20 20 20 20 20  20 f4 20 6e 62 20 6c 61  |.hB      . nb la|
00004e60  73 74 20 6f 6e 65 20 6d  75 73 74 20 62 65 20 61  |st one must be a|
00004e70  66 74 65 72 20 70 65 6e  75 6c 74 69 6d 61 74 65  |fter penultimate|
00004e80  20 6f 6e 65 20 28 61 73  20 62 6f 74 68 20 61 72  | one (as both ar|
00004e90  65 0d 15 72 39 20 20 20  20 20 20 f4 20 61 6c 74  |e..r9      . alt|
00004ea0  65 72 6e 61 74 69 76 65  20 70 61 74 74 65 72 6e  |ernative pattern|
00004eb0  73 20 66 6f 72 20 74 68  65 20 73 61 6d 65 20 63  |s for the same c|
00004ec0  6f 72 72 75 70 74 20 49  44 29 0d 15 7c 09 20 20  |orrupt ID)..|.  |
00004ed0  20 20 cb 0d 15 86 07 20  20 cd 0d 15 90 18 20 20  |  .....  .....  |
00004ee0  e7 20 6e 6f 74 52 65 61  6c 53 65 63 74 25 3d b9  |. notRealSect%=.|
00004ef0  20 8c 0d 15 9a 3c 20 20  20 20 f4 20 53 65 63 74  | ....<    . Sect|
00004f00  6f 72 20 4e 6f 74 20 46  6f 75 6e 64 20 41 4e 44  |or Not Found AND|
00004f10  20 63 6f 72 72 75 70 74  20 49 44 20 68 61 73 20  | corrupt ID has |
00004f20  61 6e 20 61 6c 74 65 72  6e 61 74 69 76 65 0d 15  |an alternative..|
00004f30  a4 33 20 20 20 20 f4 20  73 6f 20 73 65 74 20 73  |.3    . so set s|
00004f40  74 6f 72 65 64 20 76 61  6c 75 65 20 6f 66 20 49  |tored value of I|
00004f50  44 25 20 74 6f 20 61 6c  74 65 72 6e 61 74 69 76  |D% to alternativ|
00004f60  65 0d 15 ae 2d 20 20 20  20 f2 73 65 74 53 65 63  |e...-    .setSec|
00004f70  74 49 44 28 54 72 6b 44  65 73 63 25 2c 20 73 65  |tID(TrkDesc%, se|
00004f80  63 74 46 6f 75 6e 64 25  2c 20 49 44 25 29 0d 15  |ctFound%, ID%)..|
00004f90  b8 07 20 20 cc 0d 15 c2  40 20 20 20 20 f4 20 53  |..  ....@    . S|
00004fa0  65 63 74 6f 72 20 4e 6f  74 20 46 6f 75 6e 64 20  |ector Not Found |
00004fb0  41 4e 44 20 6e 6f 74 20  61 6e 20 61 6c 74 65 72  |AND not an alter|
00004fc0  6e 61 74 69 76 65 20 66  6f 72 20 63 6f 72 72 75  |native for corru|
00004fd0  70 74 20 49 44 0d 15 cc  43 20 20 20 20 f4 20 73  |pt ID...C    . s|
00004fe0  6f 20 72 65 6d 6f 76 65  20 73 65 63 74 6f 72 20  |o remove sector |
00004ff0  66 72 6f 6d 20 74 72 61  63 6b 20 64 65 73 63 72  |from track descr|
00005000  69 70 74 6f 72 2c 20 61  73 20 69 74 20 69 73 20  |iptor, as it is |
00005010  4e 4f 54 20 61 20 49 44  0d 15 d6 16 20 20 20 20  |NOT a ID....    |
00005020  6e 6f 74 52 65 61 6c 53  65 63 74 25 3d b9 0d 15  |notRealSect%=...|
00005030  e0 2b 20 20 20 20 f2 64  65 6c 65 74 65 53 65 63  |.+    .deleteSec|
00005040  74 28 54 72 6b 44 65 73  63 25 2c 20 73 65 63 74  |t(TrkDesc%, sect|
00005050  6f 72 46 6f 75 6e 64 25  29 0d 15 ea 07 20 20 cd  |orFound%)....  .|
00005060  0d 15 f4 05 cc 0d 15 fe  44 20 20 f4 20 66 6c 61  |........D  . fla|
00005070  67 20 64 69 73 63 20 65  72 72 6f 72 20 6f 6e 20  |g disc error on |
00005080  73 65 63 74 6f 72 2c 20  69 6e 20 73 65 63 74 20  |sector, in sect |
00005090  69 6e 66 6f 2c 20 69 66  20 73 65 63 74 6f 72 20  |info, if sector |
000050a0  77 61 73 20 66 6f 75 6e  64 0d 16 08 37 20 20 f2  |was found...7  .|
000050b0  61 64 64 53 65 63 74 49  6e 66 6f 28 54 72 6b 44  |addSectInfo(TrkD|
000050c0  65 73 63 25 2c 20 73 65  63 74 46 6f 75 6e 64 25  |esc%, sectFound%|
000050d0  2c 20 72 65 73 75 6c 74  25 20 80 20 26 46 46 29  |, result% . &FF)|
000050e0  0d 16 12 05 cd 0d 16 1c  05 e1 0d 16 26 04 0d 16  |............&...|
000050f0  30 28 dd f2 64 65 6c 65  74 65 53 65 63 74 28 54  |0(..deleteSect(T|
00005100  72 6b 44 65 73 63 25 2c  20 73 65 63 74 6f 72 46  |rkDesc%, sectorF|
00005110  6f 75 6e 64 25 29 0d 16  3a 3c f4 20 74 68 69 73  |ound%)..:<. this|
00005120  20 77 61 73 20 6e 6f 74  20 61 20 73 65 63 74 6f  | was not a secto|
00005130  72 20 62 75 74 20 70 61  72 74 20 6f 66 20 61 20  |r but part of a |
00005140  64 61 74 61 20 61 72 65  61 20 28 6f 72 20 67 61  |data area (or ga|
00005150  70 29 0d 16 44 36 f4 20  73 6f 20 72 65 6d 6f 76  |p)..D6. so remov|
00005160  65 20 73 65 63 74 6f 72  20 66 72 6f 6d 20 74 72  |e sector from tr|
00005170  61 63 6b 20 64 65 73 63  72 69 70 74 6f 72 20 61  |ack descriptor a|
00005180  6e 64 20 72 65 73 65 74  0d 16 4e 3c f4 20 61 6e  |nd reset..N<. an|
00005190  79 20 6c 6f 6e 67 44 61  74 61 20 6f 72 20 6e 6f  |y longData or no|
000051a0  52 6f 6f 6d 43 52 43 20  69 6e 20 74 68 65 20 70  |RoomCRC in the p|
000051b0  72 65 76 69 6f 75 73 20  73 65 63 74 6f 72 20 69  |revious sector i|
000051c0  6e 66 6f 2e 0d 16 58 1f  ea 20 49 25 2c 20 4a 25  |nfo...X.. I%, J%|
000051d0  2c 20 69 6e 66 6f 53 69  7a 65 25 2c 20 63 6f 75  |, infoSize%, cou|
000051e0  6e 74 25 0d 16 62 22 63  6f 75 6e 74 25 20 3d 20  |nt%..b"count% = |
000051f0  54 72 6b 44 65 73 63 25  3f 62 75 66 4e 75 6d 62  |TrkDesc%?bufNumb|
00005200  53 65 63 74 25 0d 16 6c  25 69 6e 66 6f 53 69 7a  |Sect%..l%infoSiz|
00005210  65 25 3d 20 31 20 3c 3c  20 4c 6f 67 32 53 65 63  |e%= 1 << Log2Sec|
00005220  74 49 6e 66 6f 53 69 7a  65 25 0d 16 76 35 4a 25  |tInfoSize%..v5J%|
00005230  3d 54 72 6b 44 65 73 63  25 20 2b 20 62 75 66 53  |=TrkDesc% + bufS|
00005240  65 63 74 44 65 73 63 25  20 2b 20 73 65 63 74 46  |ectDesc% + sectF|
00005250  6f 75 6e 64 25 2a 69 6e  66 6f 53 69 7a 65 25 0d  |ound%*infoSize%.|
00005260  16 80 32 e3 20 49 25 3d  30 20 b8 20 28 63 6f 75  |..2. I%=0 . (cou|
00005270  6e 74 25 2d 31 2d 73 65  63 74 46 6f 75 6e 64 25  |nt%-1-sectFound%|
00005280  29 2a 69 6e 66 6f 53 69  7a 65 25 2d 31 20 88 20  |)*infoSize%-1 . |
00005290  34 0d 16 8a 1d 20 20 4a  25 21 49 25 3d 4a 25 21  |4....  J%!I%=J%!|
000052a0  28 49 25 2b 69 6e 66 6f  53 69 7a 65 25 29 0d 16  |(I%+infoSize%)..|
000052b0  94 05 ed 0d 16 9e 15 e7  20 73 65 63 74 46 6f 75  |........ sectFou|
000052c0  6e 64 25 3c 3e 30 20 8c  0d 16 a8 6d 20 20 f2 73  |nd%<>0 ....m  .s|
000052d0  65 74 53 65 63 74 49 6e  66 6f 28 54 72 6b 44 65  |etSectInfo(TrkDe|
000052e0  73 63 25 2c 20 73 65 63  74 46 6f 75 6e 64 25 2d  |sc%, sectFound%-|
000052f0  31 2c a4 67 65 74 53 65  63 74 49 6e 66 6f 28 54  |1,.getSectInfo(T|
00005300  72 6b 44 65 73 63 25 2c  20 73 65 63 74 46 6f 75  |rkDesc%, sectFou|
00005310  6e 64 25 2d 31 29 20 80  20 28 ac 28 6c 6f 6e 67  |nd%-1) . (.(long|
00005320  44 61 74 61 25 20 84 20  6e 6f 52 6f 6f 6d 43 52  |Data% . noRoomCR|
00005330  43 25 29 29 29 0d 16 b2  05 cd 0d 16 bc 39 54 72  |C%)))........9Tr|
00005340  6b 44 65 73 63 25 3f 62  75 66 4e 75 6d 62 53 65  |kDesc%?bufNumbSe|
00005350  63 74 25 20 2d 3d 20 31  20 20 3a f4 20 64 65 63  |ct% -= 1  :. dec|
00005360  72 65 6d 65 6e 74 20 73  74 6f 72 65 64 20 63 6f  |rement stored co|
00005370  75 6e 74 0d 16 c6 05 e1  0d 16 d0 04 0d 16 da 47  |unt............G|
00005380  20 20 f4 20 69 66 20 74  72 61 63 6b 20 69 73 20  |  . if track is |
00005390  69 6e 63 6f 72 72 65 63  74 20 4f 52 20 68 65 61  |incorrect OR hea|
000053a0  64 2c 20 73 65 63 74 6f  72 2c 20 6f 72 20 73 65  |d, sector, or se|
000053b0  63 74 53 69 7a 65 20 61  72 65 20 3d 26 46 35 2d  |ctSize are =&F5-|
000053c0  26 46 37 0d 16 e4 43 20  20 f4 20 74 68 65 6e 20  |&F7...C  . then |
000053d0  75 6e 73 65 74 20 6d 75  6c 74 69 53 65 63 74 46  |unset multiSectF|
000053e0  6c 67 25 2c 20 73 65 74  20 73 65 63 74 6f 72 20  |lg%, set sector |
000053f0  69 6e 66 6f 20 61 6e 64  20 70 72 69 6e 74 20 6d  |info and print m|
00005400  65 73 73 61 67 65 0d 16  ee 44 20 20 f4 20 61 73  |essage...D  . as|
00005410  73 75 6d 65 73 20 49 44  20 68 61 73 20 62 65 65  |sumes ID has bee|
00005420  6e 20 73 61 76 65 64 20  28 61 66 74 65 72 20 61  |n saved (after a|
00005430  6e 79 20 72 65 6d 61 6b  69 6e 67 20 6f 66 20 63  |ny remaking of c|
00005440  6f 72 72 75 70 74 20 49  44 29 0d 16 f8 40 dd f2  |orrupt ID)...@..|
00005450  74 65 73 74 49 6c 6c 65  67 61 6c 49 64 28 54 72  |testIllegalId(Tr|
00005460  6b 44 65 73 63 25 2c 20  63 6f 75 6e 74 25 2c 20  |kDesc%, count%, |
00005470  64 65 6e 73 69 74 79 25  2c 20 f8 20 6d 75 6c 74  |density%, . mult|
00005480  69 53 65 63 74 46 6c 67  25 29 0d 17 02 1c ea 20  |iSectFlg%)..... |
00005490  49 44 25 2c 20 49 25 2c  20 54 25 2c 20 6c 6f 77  |ID%, I%, T%, low|
000054a0  25 2c 20 68 69 25 0d 17  0c 24 49 44 25 3d a4 67  |%, hi%...$ID%=.g|
000054b0  65 74 53 65 63 74 49 44  28 54 72 6b 44 65 73 63  |etSectID(TrkDesc|
000054c0  25 2c 20 63 6f 75 6e 74  25 29 0d 17 16 27 e7 20  |%, count%)...'. |
000054d0  28 49 44 25 20 80 20 26  46 46 29 20 3c 3e 20 54  |(ID% . &FF) <> T|
000054e0  72 6b 44 65 73 63 25 3f  62 75 66 54 72 6b 25 20  |rkDesc%?bufTrk% |
000054f0  8c 0d 17 20 33 20 20 f4  20 49 44 27 73 20 54 72  |... 3  . ID's Tr|
00005500  6b 20 69 73 20 6e 6f 74  20 72 65 61 6c 20 74 72  |k is not real tr|
00005510  61 63 6b 20 28 69 6c 6c  65 67 61 6c 20 6f 6e 20  |ack (illegal on |
00005520  41 72 63 29 0d 17 2a 15  20 20 6d 75 6c 74 69 53  |Arc)..*.  multiS|
00005530  65 63 74 46 6c 67 25 3d  a3 0d 17 34 31 20 20 f2  |ectFlg%=...41  .|
00005540  61 64 64 53 65 63 74 49  6e 66 6f 28 54 72 6b 44  |addSectInfo(TrkD|
00005550  65 73 63 25 2c 20 63 6f  75 6e 74 25 2c 20 69 6c  |esc%, count%, il|
00005560  6c 65 67 61 6c 54 72 6b  25 29 0d 17 3e 05 cd 0d  |legalTrk%)..>...|
00005570  17 48 2f e7 20 28 28 49  44 25 20 3e 3e 20 38 29  |.H/. ((ID% >> 8)|
00005580  20 80 20 26 46 46 29 20  3c 3e 20 54 72 6b 44 65  | . &FF) <> TrkDe|
00005590  73 63 25 3f 62 75 66 48  65 61 64 25 20 8c 0d 17  |sc%?bufHead% ...|
000055a0  52 29 20 20 6d 75 6c 74  69 53 65 63 74 46 6c 67  |R)  multiSectFlg|
000055b0  25 3d a3 3a 20 f4 20 62  65 69 6e 67 20 6f 76 65  |%=.: . being ove|
000055c0  72 20 73 61 66 65 3f 0d  17 5c 0f 20 20 e7 20 64  |r safe?..\.  . d|
000055d0  65 62 75 67 20 8c 0d 17  66 31 20 20 20 20 f4 20  |ebug ...f1    . |
000055e0  2a 2a 2a 2a 20 63 61 6e  20 74 68 69 73 20 62 65  |**** can this be|
000055f0  20 64 6f 6e 65 20 65 6c  73 65 77 68 65 72 65 20  | done elsewhere |
00005600  2a 2a 2a 2a 3f 3f 3f 0d  17 70 22 20 20 20 20 f2  |****???..p"    .|
00005610  70 72 69 6e 74 49 44 28  54 72 6b 44 65 73 63 25  |printID(TrkDesc%|
00005620  2c 20 63 6f 75 6e 74 25  29 0d 17 7a 29 20 20 20  |, count%)..z)   |
00005630  20 f1 22 48 65 61 64 20  69 6e 63 6f 72 72 65 63  | ."Head incorrec|
00005640  74 2c 20 62 75 74 20 61  63 63 65 70 74 61 62 6c  |t, but acceptabl|
00005650  65 22 0d 17 84 07 20 20  cd 0d 17 8e 05 cd 0d 17  |e"....  ........|
00005660  98 24 f2 67 65 74 49 6c  6c 65 67 61 6c 28 64 65  |.$.getIllegal(de|
00005670  6e 73 69 74 79 25 2c 20  6c 6f 77 25 2c 20 68 69  |nsity%, low%, hi|
00005680  25 29 0d 17 a2 0e e3 20  49 25 3d 31 20 b8 20 33  |%)..... I%=1 . 3|
00005690  0d 17 ac 14 20 20 54 25  3d 28 49 44 25 20 80 20  |....  T%=(ID% . |
000056a0  26 46 46 29 0d 17 b6 24  20 20 e7 20 28 54 25 20  |&FF)...$  . (T% |
000056b0  3e 3d 20 6c 6f 77 25 29  20 80 20 28 54 25 20 3c  |>= low%) . (T% <|
000056c0  3d 20 68 69 25 29 20 8c  0d 17 c0 3d 20 20 20 20  |= hi%) ....=    |
000056d0  f4 20 49 20 63 61 6e 27  74 20 77 72 69 74 65 20  |. I can't write |
000056e0  49 44 20 61 73 20 69 74  20 68 61 73 20 69 6c 6c  |ID as it has ill|
000056f0  65 67 61 6c 20 77 72 69  74 65 54 72 61 63 6b 20  |egal writeTrack |
00005700  62 79 74 65 73 0d 17 ca  17 20 20 20 20 6d 75 6c  |bytes....    mul|
00005710  74 69 53 65 63 74 46 6c  67 25 3d a3 0d 17 d4 35  |tiSectFlg%=....5|
00005720  20 20 20 20 f2 61 64 64  53 65 63 74 49 6e 66 6f  |    .addSectInfo|
00005730  28 54 72 6b 44 65 73 63  25 2c 20 63 6f 75 6e 74  |(TrkDesc%, count|
00005740  25 2c 20 69 6c 6c 65 67  61 6c 49 44 62 79 74 25  |%, illegalIDbyt%|
00005750  29 0d 17 de 07 20 20 cd  0d 17 e8 14 20 20 49 44  |)....  .....  ID|
00005760  25 3d 28 49 44 25 20 3e  3e 20 38 29 0d 17 f2 05  |%=(ID% >> 8)....|
00005770  ed 0d 17 fc 05 e1 0d 18  06 04 0d 18 10 3e 20 20  |.............>  |
00005780  20 f4 20 46 6f 72 20 65  61 63 68 20 73 65 63 74  | . For each sect|
00005790  6f 72 20 73 65 74 20 4c  65 6e 67 74 68 20 6f 66  |or set Length of|
000057a0  20 6d 61 78 20 72 65 61  64 20 64 61 74 61 20 74  | max read data t|
000057b0  72 61 6e 73 66 65 72 2e  0d 18 1a 46 20 20 20 f4  |ransfer....F   .|
000057c0  20 49 6e 20 63 61 73 65  20 6f 66 20 70 72 6f 74  | In case of prot|
000057d0  65 63 74 65 64 20 64 69  73 63 2c 20 65 6e 73 75  |ected disc, ensu|
000057e0  72 65 20 69 74 20 63 61  6e 6e 6f 74 20 6f 76 65  |re it cannot ove|
000057f0  72 77 72 69 74 65 20 6e  65 78 74 20 49 44 0d 18  |rwrite next ID..|
00005800  24 2f 20 20 20 f4 20 61  72 6f 75 6e 64 20 74 72  |$/   . around tr|
00005810  61 63 6b 20 28 61 63 74  75 61 6c 6c 79 20 27 6e  |ack (actually 'n|
00005820  65 78 74 20 49 44 20 2d  20 34 27 29 2e 0d 18 2e  |ext ID - 4')....|
00005830  49 20 20 20 f4 20 54 68  65 20 73 65 74 20 4c 65  |I   . The set Le|
00005840  6e 67 74 68 20 77 69 6c  6c 20 61 6c 73 6f 20 62  |ngth will also b|
00005850  65 20 75 73 65 64 20 64  75 72 69 6e 67 20 61 6e  |e used during an|
00005860  79 20 64 61 74 61 20 61  72 65 61 20 77 72 69 74  |y data area writ|
00005870  65 2c 20 42 55 54 0d 18  38 47 20 20 20 f4 20 49  |e, BUT..8G   . I|
00005880  66 20 61 6e 79 20 73 65  63 74 6f 72 20 77 72 69  |f any sector wri|
00005890  74 65 20 64 61 74 61 20  6d 69 67 68 74 20 6f 76  |te data might ov|
000058a0  65 72 77 72 69 74 65 20  27 6e 65 78 74 20 49 44  |erwrite 'next ID|
000058b0  20 2d 20 34 27 20 28 69  65 20 67 61 70 0d 18 42  | - 4' (ie gap..B|
000058c0  46 20 20 20 f4 20 66 72  6f 6d 20 65 6e 64 20 6f  |F   . from end o|
000058d0  66 20 64 61 74 61 20 74  6f 20 27 6e 65 78 74 20  |f data to 'next |
000058e0  49 44 20 2d 20 34 27 20  69 73 20 6c 65 73 73 20  |ID - 4' is less |
000058f0  74 68 61 6e 20 35 20 62  79 74 65 73 29 2c 20 74  |than 5 bytes), t|
00005900  68 65 6e 0d 18 4c 46 20  20 20 f4 20 73 65 74 20  |hen..LF   . set |
00005910  4c 6f 6e 67 20 64 61 74  61 20 66 6c 61 67 20 61  |Long data flag a|
00005920  6e 64 20 75 6e 73 65 74  20 6d 75 6c 74 69 73 65  |nd unset multise|
00005930  63 74 6f 72 20 66 6c 61  67 2e 20 46 75 72 74 68  |ctor flag. Furth|
00005940  65 72 6d 6f 72 65 20 69  66 0d 18 56 42 20 20 20  |ermore if..VB   |
00005950  f4 20 74 68 65 72 65 20  69 73 20 6e 6f 74 20 65  |. there is not e|
00005960  76 65 6e 20 72 6f 6f 6d  20 66 6f 72 20 61 20 27  |ven room for a '|
00005970  66 6f 72 6d 61 74 20 67  65 6e 65 72 61 74 65 64  |format generated|
00005980  20 43 52 43 27 2c 20 61  6c 73 6f 0d 18 60 1e 20  | CRC', also..`. |
00005990  20 20 f4 20 73 65 74 20  6e 6f 2d 52 6f 6f 6d 2d  |  . set no-Room-|
000059a0  43 52 43 20 66 6c 61 67  2e 0d 18 6a 33 dd f2 73  |CRC flag...j3..s|
000059b0  65 74 4c 65 6e 67 74 68  73 28 54 72 6b 44 65 73  |etLengths(TrkDes|
000059c0  63 25 2c 20 63 6f 75 6e  74 25 2c 20 f8 20 6d 75  |c%, count%, . mu|
000059d0  6c 74 69 53 65 63 74 46  6c 67 25 29 0d 18 74 42  |ltiSectFlg%)..tB|
000059e0  ea 20 66 6f 6c 6c 6f 77  69 6e 67 49 44 61 64 64  |. followingIDadd|
000059f0  25 2c 20 73 65 63 74 46  6f 75 6e 64 25 2c 20 62  |%, sectFound%, b|
00005a00  79 74 65 73 25 2c 20 61  64 64 25 2c 20 49 44 61  |ytes%, add%, IDa|
00005a10  64 64 25 2c 20 67 61 70  25 2c 20 49 44 25 0d 18  |dd%, gap%, ID%..|
00005a20  7e 0e ea 20 64 65 6e 73  69 74 79 25 0d 18 88 25  |~.. density%...%|
00005a30  64 65 6e 73 69 74 79 25  3d 20 54 72 6b 44 65 73  |density%= TrkDes|
00005a40  63 25 3f 62 75 66 54 72  6b 44 65 6e 73 69 74 79  |c%?bufTrkDensity|
00005a50  25 0d 18 92 2d 66 6f 6c  6c 6f 77 69 6e 67 49 44  |%...-followingID|
00005a60  61 64 64 25 3d 54 72 6b  44 65 73 63 25 21 62 75  |add%=TrkDesc%!bu|
00005a70  66 45 6e 64 56 61 6c 69  64 44 61 74 61 25 0d 18  |fEndValidData%..|
00005a80  9c 23 e3 20 73 65 63 74  46 6f 75 6e 64 25 3d 20  |.#. sectFound%= |
00005a90  63 6f 75 6e 74 25 2d 31  20 b8 20 30 20 88 20 2d  |count%-1 . 0 . -|
00005aa0  31 0d 18 a6 2c 20 20 49  44 61 64 64 25 3d a4 67  |1...,  IDadd%=.g|
00005ab0  65 74 49 44 50 74 72 28  54 72 6b 44 65 73 63 25  |etIDPtr(TrkDesc%|
00005ac0  2c 20 73 65 63 74 46 6f  75 6e 64 25 29 0d 18 b0  |, sectFound%)...|
00005ad0  2c 20 20 61 64 64 25 3d  a4 67 65 74 44 61 74 61  |,  add%=.getData|
00005ae0  50 74 72 28 54 72 6b 44  65 73 63 25 2c 20 73 65  |Ptr(TrkDesc%, se|
00005af0  63 74 46 6f 75 6e 64 25  29 0d 18 ba 2a 20 20 49  |ctFound%)...*  I|
00005b00  44 25 3d a4 67 65 74 53  65 63 74 49 44 28 54 72  |D%=.getSectID(Tr|
00005b10  6b 44 65 73 63 25 2c 20  73 65 63 74 46 6f 75 6e  |kDesc%, sectFoun|
00005b20  64 25 29 0d 18 c4 28 20  20 62 79 74 65 73 25 3d  |d%)...(  bytes%=|
00005b30  31 20 3c 3c 20 28 37 2b  20 28 28 49 44 25 20 3e  |1 << (7+ ((ID% >|
00005b40  3e 20 32 34 29 20 80 20  33 29 29 0d 18 ce 30 20  |> 24) . 3))...0 |
00005b50  20 67 61 70 25 20 3d 20  28 66 6f 6c 6c 6f 77 69  | gap% = (followi|
00005b60  6e 67 49 44 61 64 64 25  2d 34 29 20 2d 20 28 61  |ngIDadd%-4) - (a|
00005b70  64 64 25 2b 62 79 74 65  73 25 29 0d 18 d8 12 20  |dd%+bytes%).... |
00005b80  20 e7 20 67 61 70 25 20  3c 20 35 20 8c 0d 18 e2  | . gap% < 5 ....|
00005b90  35 20 20 20 20 f2 61 64  64 53 65 63 74 49 6e 66  |5    .addSectInf|
00005ba0  6f 28 54 72 6b 44 65 73  63 25 2c 20 73 65 63 74  |o(TrkDesc%, sect|
00005bb0  46 6f 75 6e 64 25 2c 20  6c 6f 6e 67 44 61 74 61  |Found%, longData|
00005bc0  25 29 0d 18 ec 17 20 20  20 20 6d 75 6c 74 69 53  |%)....    multiS|
00005bd0  65 63 74 46 6c 67 25 3d  a3 0d 18 f6 14 20 20 20  |ectFlg%=.....   |
00005be0  20 e7 20 67 61 70 25 20  3c 20 32 20 8c 0d 19 00  | . gap% < 2 ....|
00005bf0  38 20 20 20 20 20 20 f2  61 64 64 53 65 63 74 49  |8      .addSectI|
00005c00  6e 66 6f 28 54 72 6b 44  65 73 63 25 2c 20 73 65  |nfo(TrkDesc%, se|
00005c10  63 74 46 6f 75 6e 64 25  2c 20 6e 6f 52 6f 6f 6d  |ctFound%, noRoom|
00005c20  43 52 43 25 29 0d 19 0a  16 20 20 20 20 20 20 e7  |CRC%)....      .|
00005c30  20 67 61 70 25 20 3c 20  30 20 8c 0d 19 14 4a 20  | gap% < 0 ....J |
00005c40  20 20 20 20 20 20 20 62  79 74 65 73 25 20 2b 3d  |       bytes% +=|
00005c50  20 67 61 70 25 20 20 20  3a f4 20 72 65 64 75 63  | gap%   :. reduc|
00005c60  65 20 74 72 61 6e 73 66  65 72 20 73 69 7a 65 20  |e transfer size |
00005c70  69 66 20 69 74 20 65 78  74 65 6e 64 73 20 74 6f  |if it extends to|
00005c80  20 49 44 2d 34 0d 19 1e  0b 20 20 20 20 20 20 cd  | ID-4....      .|
00005c90  0d 19 28 09 20 20 20 20  cd 0d 19 32 07 20 20 cd  |..(.    ...2.  .|
00005ca0  0d 19 3c 32 20 20 f2 73  65 74 44 61 74 61 4c 65  |..<2  .setDataLe|
00005cb0  6e 67 74 68 28 54 72 6b  44 65 73 63 25 2c 20 73  |ngth(TrkDesc%, s|
00005cc0  65 63 74 46 6f 75 6e 64  25 2c 20 62 79 74 65 73  |ectFound%, bytes|
00005cd0  25 29 0d 19 46 1c 20 20  66 6f 6c 6c 6f 77 69 6e  |%)..F.  followin|
00005ce0  67 49 44 61 64 64 25 3d  49 44 61 64 64 25 0d 19  |gIDadd%=IDadd%..|
00005cf0  50 05 ed 0d 19 5a 05 e1  0d 19 64 04 0d 19 6e 4b  |P....Z....d...nK|
00005d00  20 20 20 f4 20 66 69 6e  64 20 69 66 20 73 65 63  |   . find if sec|
00005d10  74 6f 72 20 6e 75 6d 62  65 72 73 20 61 72 65 20  |tor numbers are |
00005d20  63 6f 6e 73 65 63 75 74  69 76 65 2c 20 61 6e 64  |consecutive, and|
00005d30  20 61 6c 6c 20 68 61 76  65 20 74 68 65 20 73 61  | all have the sa|
00005d40  6d 65 20 73 69 7a 65 0d  19 78 26 20 20 20 f4 20  |me size..x&   . |
00005d50  69 66 20 6e 6f 74 20 73  65 74 20 4d 75 6c 74 69  |if not set Multi|
00005d60  20 73 65 63 74 6f 72 20  46 61 6c 73 65 0d 19 82  | sector False...|
00005d70  45 20 20 20 f4 20 69 66  20 4d 75 6c 74 69 20 73  |E   . if Multi s|
00005d80  65 63 74 6f 72 20 73 74  69 6c 6c 20 73 65 74 2c  |ector still set,|
00005d90  20 73 65 74 75 70 20 4d  75 6c 74 69 2d 73 65 63  | setup Multi-sec|
00005da0  74 6f 72 20 64 65 73 63  72 69 70 74 6f 72 20 61  |tor descriptor a|
00005db0  6e 64 0d 19 8c 1d 20 20  20 f4 20 20 6d 65 6d 6f  |nd....   .  memo|
00005dc0  72 79 20 70 6f 69 6e 74  65 72 20 6c 69 73 74 0d  |ry pointer list.|
00005dd0  19 96 35 dd f2 73 65 74  4d 75 6c 74 69 53 65 63  |..5..setMultiSec|
00005de0  74 28 54 72 6b 44 65 73  63 25 2c 20 63 6f 75 6e  |t(TrkDesc%, coun|
00005df0  74 25 2c 20 f8 20 6d 75  6c 74 69 53 65 63 74 46  |t%, . multiSectF|
00005e00  6c 67 25 29 0d 19 a0 47  ea 20 6d 61 78 25 2c 6d  |lg%)...G. max%,m|
00005e10  69 6e 25 2c 73 65 63 74  6f 72 25 2c 49 44 61 64  |in%,sector%,IDad|
00005e20  64 25 2c 64 61 74 61 61  64 64 25 2c 73 65 63 74  |d%,dataadd%,sect|
00005e30  4e 75 6d 62 25 2c 20 72  65 73 74 4f 66 49 44 25  |Numb%, restOfID%|
00005e40  2c 20 73 65 63 74 53 69  7a 65 25 0d 19 aa 09 ea  |, sectSize%.....|
00005e50  20 49 44 25 0d 19 b4 15  6d 61 78 25 3d 2d 31 20  | ID%....max%=-1 |
00005e60  3a 6d 69 6e 25 3d 32 35  36 0d 19 be 1a e3 20 73  |:min%=256..... s|
00005e70  65 63 74 6f 72 25 3d 30  20 b8 20 63 6f 75 6e 74  |ector%=0 . count|
00005e80  25 2d 31 0d 19 c8 27 20  20 49 44 25 3d a4 67 65  |%-1...'  ID%=.ge|
00005e90  74 53 65 63 74 49 44 28  54 72 6b 44 65 73 63 25  |tSectID(TrkDesc%|
00005ea0  2c 20 73 65 63 74 6f 72  25 29 0d 19 d2 13 20 20  |, sector%)....  |
00005eb0  e7 20 73 65 63 74 6f 72  25 3d 30 20 8c 0d 19 dc  |. sector%=0 ....|
00005ec0  21 20 20 20 20 72 65 73  74 4f 66 49 44 25 3d 26  |!    restOfID%=&|
00005ed0  46 46 30 30 46 46 46 46  20 80 20 49 44 25 0d 19  |FF00FFFF . ID%..|
00005ee0  e6 21 20 20 20 20 73 65  63 74 53 69 7a 65 25 3d  |.!    sectSize%=|
00005ef0  28 49 44 25 20 3e 3e 20  32 34 29 20 80 20 33 0d  |(ID% >> 24) . 3.|
00005f00  19 f0 07 20 20 cc 0d 19  fa 2a 20 20 20 20 e7 20  |...  ....*    . |
00005f10  72 65 73 74 4f 66 49 44  25 20 3c 3e 20 28 26 46  |restOfID% <> (&F|
00005f20  46 30 30 46 46 46 46 20  80 20 49 44 25 29 20 8c  |F00FFFF . ID%) .|
00005f30  0d 1a 04 19 20 20 20 20  20 20 6d 75 6c 74 69 53  |....      multiS|
00005f40  65 63 74 46 6c 67 25 3d  a3 0d 1a 0e 09 20 20 20  |ectFlg%=.....   |
00005f50  20 cd 0d 1a 18 07 20 20  cd 0d 1a 22 21 20 20 73  | .....  ..."!  s|
00005f60  65 63 74 4e 75 6d 62 25  3d 26 46 46 20 80 20 28  |ectNumb%=&FF . (|
00005f70  49 44 25 20 3e 3e 20 31  36 29 0d 1a 2c 29 20 20  |ID% >> 16)..,)  |
00005f80  e7 20 73 65 63 74 4e 75  6d 62 25 20 3e 20 6d 61  |. sectNumb% > ma|
00005f90  78 25 20 8c 20 6d 61 78  25 3d 73 65 63 74 4e 75  |x% . max%=sectNu|
00005fa0  6d 62 25 0d 1a 36 29 20  20 e7 20 73 65 63 74 4e  |mb%..6)  . sectN|
00005fb0  75 6d 62 25 20 3c 20 6d  69 6e 25 20 8c 20 6d 69  |umb% < min% . mi|
00005fc0  6e 25 3d 73 65 63 74 4e  75 6d 62 25 0d 1a 40 05  |n%=sectNumb%..@.|
00005fd0  ed 0d 1a 4a 33 e7 20 28  28 6d 61 78 25 2d 6d 69  |...J3. ((max%-mi|
00005fe0  6e 25 29 20 3c 3e 20 28  63 6f 75 6e 74 25 2d 31  |n%) <> (count%-1|
00005ff0  29 29 20 8c 20 6d 75 6c  74 69 53 65 63 74 46 6c  |)) . multiSectFl|
00006000  67 25 3d a3 0d 1a 54 15  e7 20 6d 75 6c 74 69 53  |g%=...T.. multiS|
00006010  65 63 74 46 6c 67 25 20  8c 0d 1a 5e 21 20 20 54  |ectFlg% ...^!  T|
00006020  72 6b 44 65 73 63 25 3f  62 75 66 4c 6f 77 53 65  |rkDesc%?bufLowSe|
00006030  63 74 25 20 3d 20 6d 69  6e 25 0d 1a 68 26 20 20  |ct% = min%..h&  |
00006040  54 72 6b 44 65 73 63 25  3f 62 75 66 53 65 63 74  |TrkDesc%?bufSect|
00006050  53 69 7a 65 25 20 3d 73  65 63 74 53 69 7a 65 25  |Size% =sectSize%|
00006060  0d 1a 72 1c 20 20 e3 20  73 65 63 74 6f 72 25 3d  |..r.  . sector%=|
00006070  30 20 b8 20 63 6f 75 6e  74 25 2d 31 0d 1a 7c 2f  |0 . count%-1..|/|
00006080  20 20 20 20 64 61 74 61  61 64 64 25 3d a4 67 65  |    dataadd%=.ge|
00006090  74 44 61 74 61 50 74 72  28 54 72 6b 44 65 73 63  |tDataPtr(TrkDesc|
000060a0  25 2c 20 73 65 63 74 6f  72 25 29 0d 1a 86 29 20  |%, sector%)...) |
000060b0  20 20 20 49 44 25 3d a4  67 65 74 53 65 63 74 49  |   ID%=.getSectI|
000060c0  44 28 54 72 6b 44 65 73  63 25 2c 20 73 65 63 74  |D(TrkDesc%, sect|
000060d0  6f 72 25 29 0d 1a 90 2c  20 20 20 20 73 65 63 74  |or%)...,    sect|
000060e0  4e 75 6d 62 25 3d 28 26  46 46 20 80 20 28 49 44  |Numb%=(&FF . (ID|
000060f0  25 20 3e 3e 20 31 36 29  29 20 2d 20 6d 69 6e 25  |% >> 16)) - min%|
00006100  0d 1a 9a 4a 20 20 20 20  54 72 6b 44 65 73 63 25  |...J    TrkDesc%|
00006110  21 28 62 75 66 4d 65 6d  41 64 64 4c 69 73 74 25  |!(bufMemAddList%|
00006120  20 2b 20 28 73 65 63 74  4e 75 6d 62 25 3c 3c 33  | + (sectNumb%<<3|
00006130  29 29 3d 20 64 61 74 61  61 64 64 25 20 3a f4 20  |))= dataadd% :. |
00006140  6d 65 6d 6f 72 79 20 61  64 64 0d 1a a4 4c 20 20  |memory add...L  |
00006150  20 20 54 72 6b 44 65 73  63 25 21 28 62 75 66 4d  |  TrkDesc%!(bufM|
00006160  65 6d 41 64 64 4c 69 73  74 25 2b 34 2b 28 73 65  |emAddList%+4+(se|
00006170  63 74 4e 75 6d 62 25 3c  3c 33 29 29 3d 31 20 3c  |ctNumb%<<3))=1 <|
00006180  3c 20 28 37 2b 73 65 63  74 53 69 7a 65 25 29 3a  |< (7+sectSize%):|
00006190  f4 20 73 69 7a 65 0d 1a  ae 07 20 20 ed 0d 1a b8  |. size....  ....|
000061a0  05 cd 0d 1a c2 05 e1 0d  1a cc 04 0d 1a d6 40 20  |..............@ |
000061b0  20 f4 20 63 6f 70 79 20  4d 75 6c 74 69 53 65 63  | . copy MultiSec|
000061c0  74 6f 72 20 4d 65 6d 6f  72 79 20 41 64 64 72 65  |tor Memory Addre|
000061d0  73 73 20 4c 69 73 74 20  69 6e 74 6f 20 42 75 66  |ss List into Buf|
000061e0  66 65 72 20 66 6f 72 20  75 73 65 0d 1a e0 26 dd  |fer for use...&.|
000061f0  f2 63 6f 70 79 4d 65 6d  41 64 64 4c 69 73 74 28  |.copyMemAddList(|
00006200  54 72 6b 44 65 73 63 25  2c 20 63 6f 75 6e 74 25  |TrkDesc%, count%|
00006210  29 0d 1a ea 0b ea 20 49  25 2c 4a 25 0d 1a f4 18  |)..... I%,J%....|
00006220  4a 25 3d 28 28 63 6f 75  6e 74 25 2d 31 29 3c 3c  |J%=((count%-1)<<|
00006230  33 29 2b 34 0d 1a fe 13  e3 20 49 25 3d 30 20 b8  |3)+4..... I%=0 .|
00006240  20 4a 25 20 88 20 34 0d  1b 08 31 20 20 6d 65 6d  | J% . 4...1  mem|
00006250  41 64 64 4c 69 73 74 25  21 49 25 3d 54 72 6b 44  |AddList%!I%=TrkD|
00006260  65 73 63 25 21 28 62 75  66 4d 65 6d 41 64 64 4c  |esc%!(bufMemAddL|
00006270  69 73 74 25 2b 49 25 29  0d 1b 12 05 ed 0d 1b 1c  |ist%+I%)........|
00006280  05 e1 0d 1b 26 04 0d 1b  30 37 20 20 f4 20 50 72  |....&...07  . Pr|
00006290  69 6e 74 20 61 6e 79 20  75 6e 75 73 75 61 6c 20  |int any unusual |
000062a0  73 65 63 74 6f 72 20 66  6f 6c 6c 6f 77 65 64 20  |sector followed |
000062b0  62 79 20 72 65 61 73 6f  6e 20 77 68 79 0d 1b 3a  |by reason why..:|
000062c0  22 20 20 f4 20 49 46 20  64 65 62 75 67 20 70 72  |"  . IF debug pr|
000062d0  69 6e 74 20 61 6c 6c 20  73 65 63 74 6f 72 73 0d  |int all sectors.|
000062e0  1b 44 24 dd f2 70 72 69  6e 74 55 6e 75 73 75 61  |.D$..printUnusua|
000062f0  6c 28 54 72 6b 44 65 73  63 25 2c 20 63 6f 75 6e  |l(TrkDesc%, coun|
00006300  74 25 29 0d 1b 4e 21 ea  20 73 65 63 74 46 6f 75  |t%)..N!. sectFou|
00006310  6e 64 25 2c 20 69 6e 66  6f 25 2c 20 64 69 73 63  |nd%, info%, disc|
00006320  65 72 72 25 0d 1b 58 11  e7 20 63 6f 75 6e 74 25  |err%..X.. count%|
00006330  3c 3e 30 20 8c 0d 1b 62  1f 20 20 e3 20 73 65 63  |<>0 ...b.  . sec|
00006340  74 46 6f 75 6e 64 25 3d  30 20 b8 20 63 6f 75 6e  |tFound%=0 . coun|
00006350  74 25 2d 31 0d 1b 6c 3a  20 20 20 20 69 6e 66 6f  |t%-1..l:    info|
00006360  25 3d 26 46 46 46 46 46  46 20 80 20 a4 67 65 74  |%=&FFFFFF . .get|
00006370  53 65 63 74 49 6e 66 6f  28 54 72 6b 44 65 73 63  |SectInfo(TrkDesc|
00006380  25 2c 20 73 65 63 74 46  6f 75 6e 64 25 29 0d 1b  |%, sectFound%)..|
00006390  76 1e 20 20 20 20 e7 20  64 65 62 75 67 20 84 20  |v.    . debug . |
000063a0  28 69 6e 66 6f 25 3c 3e  30 29 20 8c 0d 1b 80 28  |(info%<>0) ....(|
000063b0  20 20 20 20 20 20 f2 70  72 69 6e 74 49 44 28 54  |      .printID(T|
000063c0  72 6b 44 65 73 63 25 2c  20 73 65 63 74 46 6f 75  |rkDesc%, sectFou|
000063d0  6e 64 25 29 0d 1b 8a 15  20 20 20 20 20 20 e7 20  |nd%)....      . |
000063e0  64 65 62 75 67 20 8c 20  f1 0d 1b 94 09 20 20 20  |debug . .....   |
000063f0  20 cd 0d 1b 9e 16 20 20  20 20 e7 20 69 6e 66 6f  | .....    . info|
00006400  25 20 3c 3e 20 30 20 8c  0d 1b a8 28 20 20 20 20  |% <> 0 ....(    |
00006410  20 20 e7 20 28 69 6e 66  6f 25 20 80 20 69 6c 6c  |  . (info% . ill|
00006420  65 67 61 6c 54 72 6b 25  29 20 3c 3e 20 30 20 8c  |egalTrk%) <> 0 .|
00006430  0d 1b b2 30 20 20 20 20  20 20 20 20 f2 73 65 63  |...0        .sec|
00006440  74 54 65 78 74 28 22 49  6c 6c 65 67 61 6c 20 49  |tText("Illegal I|
00006450  44 20 54 72 6b 20 28 6f  6e 20 41 72 63 29 22 29  |D Trk (on Arc)")|
00006460  0d 1b bc 0b 20 20 20 20  20 20 cd 0d 1b c6 2a 20  |....      ....* |
00006470  20 20 20 20 20 e7 20 28  69 6e 66 6f 25 20 80 20  |     . (info% . |
00006480  69 6c 6c 65 67 61 6c 49  44 62 79 74 25 29 20 3c  |illegalIDbyt%) <|
00006490  3e 20 30 20 8c 0d 1b d0  28 20 20 20 20 20 20 20  |> 0 ....(       |
000064a0  20 f2 73 65 63 74 54 65  78 74 28 22 49 6c 6c 65  | .sectText("Ille|
000064b0  67 61 6c 20 49 44 20 62  79 74 65 22 29 0d 1b da  |gal ID byte")...|
000064c0  0b 20 20 20 20 20 20 cd  0d 1b e4 24 20 20 20 20  |.      ....$    |
000064d0  20 20 e7 20 28 69 6e 66  6f 25 20 80 20 6e 6f 44  |  . (info% . noD|
000064e0  61 74 61 25 29 20 3c 3e  20 30 20 8c 0d 1b ee 29  |ata%) <> 0 ....)|
000064f0  20 20 20 20 20 20 20 20  f2 73 65 63 74 54 65 78  |        .sectTex|
00006500  74 28 22 48 61 73 20 4e  4f 20 64 61 74 61 20 61  |t("Has NO data a|
00006510  72 65 61 22 29 0d 1b f8  0b 20 20 20 20 20 20 cd  |rea")....      .|
00006520  0d 1c 02 25 20 20 20 20  20 20 e7 20 28 69 6e 66  |...%      . (inf|
00006530  6f 25 20 80 20 64 65 6c  44 61 74 61 25 29 20 3c  |o% . delData%) <|
00006540  3e 20 30 20 8c 0d 1c 0c  2a 20 20 20 20 20 20 20  |> 0 ....*       |
00006550  20 f2 73 65 63 74 54 65  78 74 28 22 44 65 6c 65  | .sectText("Dele|
00006560  74 65 64 20 64 61 74 61  20 61 72 65 61 22 29 0d  |ted data area").|
00006570  1c 16 0b 20 20 20 20 20  20 cd 0d 1c 20 26 20 20  |...      ... &  |
00006580  20 20 20 20 e7 20 28 69  6e 66 6f 25 20 80 20 6c  |    . (info% . l|
00006590  6f 6e 67 44 61 74 61 25  29 20 3c 3e 20 30 20 8c  |ongData%) <> 0 .|
000065a0  0d 1c 2a 39 20 20 20 20  20 20 20 20 f2 73 65 63  |..*9        .sec|
000065b0  74 54 65 78 74 28 22 44  61 74 61 20 54 4f 4f 20  |tText("Data TOO |
000065c0  6c 6f 6e 67 3a 2d 20 4f  76 65 72 6c 61 70 73 20  |long:- Overlaps |
000065d0  6e 65 78 74 20 49 44 22  29 0d 1c 34 0b 20 20 20  |next ID")..4.   |
000065e0  20 20 20 cc 0d 1c 3e 29  20 20 20 20 20 20 20 20  |   ...>)        |
000065f0  e7 20 28 69 6e 66 6f 25  20 80 20 6e 6f 52 6f 6f  |. (info% . noRoo|
00006600  6d 43 52 43 25 29 20 3c  3e 20 30 20 8c 0d 1c 48  |mCRC%) <> 0 ...H|
00006610  3b 20 20 20 20 20 20 20  20 20 20 f2 73 65 63 74  |;          .sect|
00006620  54 65 78 74 28 22 44 61  74 61 20 6c 6f 6e 67 3a  |Text("Data long:|
00006630  2d 20 67 61 70 20 74 6f  6f 20 73 68 6f 72 74 2c  |- gap too short,|
00006640  20 77 72 69 74 65 22 29  0d 1c 52 0d 20 20 20 20  | write")..R.    |
00006650  20 20 20 20 cd 0d 1c 5c  0b 20 20 20 20 20 20 cd  |    ...\.      .|
00006660  0d 1c 66 27 20 20 20 20  20 20 e7 20 28 69 6e 66  |..f'      . (inf|
00006670  6f 25 20 80 20 6f 76 65  72 49 6e 64 65 78 25 29  |o% . overIndex%)|
00006680  20 3c 3e 20 30 20 8c 0d  1c 70 2d 20 20 20 20 20  | <> 0 ...p-     |
00006690  20 20 20 f2 73 65 63 74  54 65 78 74 28 22 44 61  |   .sectText("Da|
000066a0  74 61 20 6f 76 65 72 66  6c 6f 77 73 20 69 6e 64  |ta overflows ind|
000066b0  65 78 22 29 0d 1c 7a 0b  20 20 20 20 20 20 cd 0d  |ex")..z.      ..|
000066c0  1c 84 22 20 20 20 20 20  20 64 69 73 63 65 72 72  |.."      discerr|
000066d0  25 20 3d 20 28 69 6e 66  6f 25 20 80 20 26 46 46  |% = (info% . &FF|
000066e0  29 0d 1c 8e 1b 20 20 20  20 20 20 e7 20 64 69 73  |)....      . dis|
000066f0  63 65 72 72 25 20 3c 3e  20 30 20 8c 0d 1c 98 36  |cerr% <> 0 ....6|
00006700  20 20 20 20 20 20 20 20  c8 8e 20 28 64 69 73 63  |        .. (disc|
00006710  65 72 72 25 20 80 20 28  65 72 72 4e 6f 74 46 6f  |err% . (errNotFo|
00006720  75 6e 64 25 20 84 20 65  72 72 43 52 43 25 29 29  |und% . errCRC%))|
00006730  20 ca 0d 1c a2 42 20 20  20 20 20 20 20 20 20 20  | ....B          |
00006740  c9 20 28 65 72 72 4e 6f  74 46 6f 75 6e 64 25 20  |. (errNotFound% |
00006750  84 20 65 72 72 43 52 43  25 29 3a f2 73 65 63 74  |. errCRC%):.sect|
00006760  54 65 78 74 28 22 49 44  20 43 52 43 20 65 72 72  |Text("ID CRC err|
00006770  6f 72 22 29 0d 1c ac 3e  20 20 20 20 20 20 20 20  |or")...>        |
00006780  20 20 c9 20 65 72 72 43  52 43 25 3a 20 20 20 20  |  . errCRC%:    |
00006790  20 20 f2 73 65 63 74 54  65 78 74 28 22 44 61 74  |  .sectText("Dat|
000067a0  61 20 61 72 65 61 20 43  52 43 20 65 72 72 6f 72  |a area CRC error|
000067b0  22 29 0d 1c b6 3b 20 20  20 20 20 20 20 20 20 20  |")...;          |
000067c0  c9 20 65 72 72 4e 6f 74  46 6f 75 6e 64 25 3a 20  |. errNotFound%: |
000067d0  f2 73 65 63 74 54 65 78  74 28 22 53 65 63 74 6f  |.sectText("Secto|
000067e0  72 20 6e 6f 74 20 46 6f  75 6e 64 22 29 0d 1c c0  |r not Found")...|
000067f0  0d 20 20 20 20 20 20 20  20 cb 0d 1c ca 34 20 20  |.        ....4  |
00006800  20 20 20 20 20 20 e7 20  64 69 73 63 65 72 72 25  |      . discerr%|
00006810  20 80 20 ac 28 65 72 72  43 52 43 25 20 84 20 65  | . .(errCRC% . e|
00006820  72 72 4e 6f 74 46 6f 75  6e 64 25 29 20 8c 0d 1c  |rrNotFound%) ...|
00006830  d4 3a 20 20 20 20 20 20  20 20 20 20 f2 73 65 63  |.:          .sec|
00006840  74 54 65 78 74 28 22 55  6e 6b 6e 6f 77 6e 20 64  |tText("Unknown d|
00006850  69 73 63 20 65 72 72 20  26 22 2b c3 7e 28 64 69  |isc err &"+.~(di|
00006860  73 63 65 72 72 25 29 29  0d 1c de 0d 20 20 20 20  |scerr%))....    |
00006870  20 20 20 20 cd 0d 1c e8  0b 20 20 20 20 20 20 cd  |    .....      .|
00006880  0d 1c f2 09 20 20 20 20  cd 0d 1c fc 07 20 20 ed  |....    .....  .|
00006890  0d 1d 06 05 cd 0d 1d 10  05 e1 0d 1d 1a 04 0d 1d  |................|
000068a0  24 04 0d 1d 2e 45 f4 20  2a 2a 20 61 6c 6c 20 66  |$....E. ** all f|
000068b0  6f 6c 6c 6f 77 69 6e 67  20 61 73 73 75 6d 65 20  |ollowing assume |
000068c0  63 6f 75 6e 74 25 20 73  74 61 72 74 73 20 66 72  |count% starts fr|
000068d0  6f 6d 20 30 20 61 73 20  66 69 72 73 74 20 73 65  |om 0 as first se|
000068e0  63 74 6f 72 20 2a 2a 0d  1d 38 04 0d 1d 42 26 dd  |ctor **..8...B&.|
000068f0  f2 73 65 74 49 44 50 74  72 28 54 72 6b 44 65 73  |.setIDPtr(TrkDes|
00006900  63 25 2c 20 63 6f 75 6e  74 25 2c 20 61 64 64 25  |c%, count%, add%|
00006910  29 0d 1d 4c 32 21 a4 73  65 63 74 44 65 73 63 28  |)..L2!.sectDesc(|
00006920  54 72 6b 44 65 73 63 25  2c 20 63 6f 75 6e 74 25  |TrkDesc%, count%|
00006930  2c 20 62 75 66 49 44 70  74 72 25 29 20 3d 20 61  |, bufIDptr%) = a|
00006940  64 64 25 0d 1d 56 05 e1  0d 1d 60 04 0d 1d 6a 20  |dd%..V....`...j |
00006950  dd a4 67 65 74 49 44 50  74 72 28 54 72 6b 44 65  |..getIDPtr(TrkDe|
00006960  73 63 25 2c 20 63 6f 75  6e 74 25 29 0d 1d 74 2c  |sc%, count%)..t,|
00006970  3d 21 a4 73 65 63 74 44  65 73 63 28 54 72 6b 44  |=!.sectDesc(TrkD|
00006980  65 73 63 25 2c 20 63 6f  75 6e 74 25 2c 20 62 75  |esc%, count%, bu|
00006990  66 49 44 70 74 72 25 29  0d 1d 7e 04 0d 1d 88 28  |fIDptr%)..~....(|
000069a0  dd f2 73 65 74 44 61 74  61 50 74 72 28 54 72 6b  |..setDataPtr(Trk|
000069b0  44 65 73 63 25 2c 20 63  6f 75 6e 74 25 2c 20 61  |Desc%, count%, a|
000069c0  64 64 25 29 0d 1d 92 34  21 a4 73 65 63 74 44 65  |dd%)...4!.sectDe|
000069d0  73 63 28 54 72 6b 44 65  73 63 25 2c 20 63 6f 75  |sc(TrkDesc%, cou|
000069e0  6e 74 25 2c 20 62 75 66  44 61 74 61 70 74 72 25  |nt%, bufDataptr%|
000069f0  29 20 3d 20 61 64 64 25  0d 1d 9c 05 e1 0d 1d a6  |) = add%........|
00006a00  04 0d 1d b0 22 dd a4 67  65 74 44 61 74 61 50 74  |...."..getDataPt|
00006a10  72 28 54 72 6b 44 65 73  63 25 2c 20 63 6f 75 6e  |r(TrkDesc%, coun|
00006a20  74 25 29 0d 1d ba 2e 3d  21 a4 73 65 63 74 44 65  |t%)....=!.sectDe|
00006a30  73 63 28 54 72 6b 44 65  73 63 25 2c 20 63 6f 75  |sc(TrkDesc%, cou|
00006a40  6e 74 25 2c 20 62 75 66  44 61 74 61 70 74 72 25  |nt%, bufDataptr%|
00006a50  29 0d 1d c4 04 0d 1d ce  2d dd f2 73 65 74 44 61  |).......-..setDa|
00006a60  74 61 4c 65 6e 67 74 68  28 54 72 6b 44 65 73 63  |taLength(TrkDesc|
00006a70  25 2c 20 63 6f 75 6e 74  25 2c 20 62 79 74 65 73  |%, count%, bytes|
00006a80  25 29 0d 1d d8 3a 21 a4  73 65 63 74 44 65 73 63  |%)...:!.sectDesc|
00006a90  28 54 72 6b 44 65 73 63  25 2c 20 63 6f 75 6e 74  |(TrkDesc%, count|
00006aa0  25 2c 20 62 75 66 54 72  61 6e 73 4c 65 6e 67 74  |%, bufTransLengt|
00006ab0  68 25 29 20 3d 20 62 79  74 65 73 25 0d 1d e2 05  |h%) = bytes%....|
00006ac0  e1 0d 1d ec 04 0d 1d f6  25 dd a4 67 65 74 44 61  |........%..getDa|
00006ad0  74 61 4c 65 6e 67 74 68  28 54 72 6b 44 65 73 63  |taLength(TrkDesc|
00006ae0  25 2c 20 63 6f 75 6e 74  25 29 0d 1e 00 32 3d 21  |%, count%)...2=!|
00006af0  a4 73 65 63 74 44 65 73  63 28 54 72 6b 44 65 73  |.sectDesc(TrkDes|
00006b00  63 25 2c 20 63 6f 75 6e  74 25 2c 20 62 75 66 54  |c%, count%, bufT|
00006b10  72 61 6e 73 4c 65 6e 67  74 68 25 29 0d 1e 0a 04  |ransLength%)....|
00006b20  0d 1e 14 26 dd f2 73 65  74 53 65 63 74 49 44 28  |...&..setSectID(|
00006b30  54 72 6b 44 65 73 63 25  2c 20 63 6f 75 6e 74 25  |TrkDesc%, count%|
00006b40  2c 20 49 44 25 29 0d 1e  1e 32 21 a4 73 65 63 74  |, ID%)...2!.sect|
00006b50  44 65 73 63 28 54 72 6b  44 65 73 63 25 2c 20 63  |Desc(TrkDesc%, c|
00006b60  6f 75 6e 74 25 2c 20 62  75 66 53 65 63 74 49 44  |ount%, bufSectID|
00006b70  25 29 20 3d 20 49 44 25  0d 1e 28 05 e1 0d 1e 32  |%) = ID%..(....2|
00006b80  04 0d 1e 3c 21 dd a4 67  65 74 53 65 63 74 49 44  |...<!..getSectID|
00006b90  28 54 72 6b 44 65 73 63  25 2c 20 63 6f 75 6e 74  |(TrkDesc%, count|
00006ba0  25 29 0d 1e 46 2d 3d 21  a4 73 65 63 74 44 65 73  |%)..F-=!.sectDes|
00006bb0  63 28 54 72 6b 44 65 73  63 25 2c 20 63 6f 75 6e  |c(TrkDesc%, coun|
00006bc0  74 25 2c 20 62 75 66 53  65 63 74 49 44 25 29 0d  |t%, bufSectID%).|
00006bd0  1e 50 04 0d 1e 5a 2b dd  f2 73 65 74 53 65 63 74  |.P...Z+..setSect|
00006be0  49 6e 66 6f 28 54 72 6b  44 65 73 63 25 2c 20 63  |Info(TrkDesc%, c|
00006bf0  6f 75 6e 74 25 2c 20 76  61 6c 75 65 25 29 0d 1e  |ount%, value%)..|
00006c00  64 37 21 a4 73 65 63 74  44 65 73 63 28 54 72 6b  |d7!.sectDesc(Trk|
00006c10  44 65 73 63 25 2c 20 63  6f 75 6e 74 25 2c 20 62  |Desc%, count%, b|
00006c20  75 66 53 65 63 74 49 6e  66 6f 25 29 20 3d 20 76  |ufSectInfo%) = v|
00006c30  61 6c 75 65 25 0d 1e 6e  05 e1 0d 1e 78 04 0d 1e  |alue%..n....x...|
00006c40  82 2b dd f2 61 64 64 53  65 63 74 49 6e 66 6f 28  |.+..addSectInfo(|
00006c50  54 72 6b 44 65 73 63 25  2c 20 63 6f 75 6e 74 25  |TrkDesc%, count%|
00006c60  2c 20 76 61 6c 75 65 25  29 0d 1e 8c 49 f2 73 65  |, value%)...I.se|
00006c70  74 53 65 63 74 49 6e 66  6f 28 54 72 6b 44 65 73  |tSectInfo(TrkDes|
00006c80  63 25 2c 63 6f 75 6e 74  25 2c 20 76 61 6c 75 65  |c%,count%, value|
00006c90  25 20 84 20 a4 67 65 74  53 65 63 74 49 6e 66 6f  |% . .getSectInfo|
00006ca0  28 54 72 6b 44 65 73 63  25 2c 63 6f 75 6e 74 25  |(TrkDesc%,count%|
00006cb0  29 29 0d 1e 96 05 e1 0d  1e a0 04 0d 1e aa 23 dd  |))............#.|
00006cc0  a4 67 65 74 53 65 63 74  49 6e 66 6f 28 54 72 6b  |.getSectInfo(Trk|
00006cd0  44 65 73 63 25 2c 20 63  6f 75 6e 74 25 29 0d 1e  |Desc%, count%)..|
00006ce0  b4 2f 3d 21 a4 73 65 63  74 44 65 73 63 28 54 72  |./=!.sectDesc(Tr|
00006cf0  6b 44 65 73 63 25 2c 20  63 6f 75 6e 74 25 2c 20  |kDesc%, count%, |
00006d00  62 75 66 53 65 63 74 49  6e 66 6f 25 29 0d 1e be  |bufSectInfo%)...|
00006d10  04 0d 1e c8 29 dd a4 73  65 63 74 44 65 73 63 28  |....)..sectDesc(|
00006d20  54 72 6b 44 65 73 63 25  2c 20 63 6f 75 6e 74 25  |TrkDesc%, count%|
00006d30  2c 20 6f 66 66 73 65 74  25 29 0d 1e d2 44 3d 54  |, offset%)...D=T|
00006d40  72 6b 44 65 73 63 25 2b  62 75 66 53 65 63 74 44  |rkDesc%+bufSectD|
00006d50  65 73 63 25 20 2b 20 6f  66 66 73 65 74 25 20 2b  |esc% + offset% +|
00006d60  20 28 63 6f 75 6e 74 25  20 3c 3c 20 4c 6f 67 32  | (count% << Log2|
00006d70  53 65 63 74 49 6e 66 6f  53 69 7a 65 25 29 0d 1e  |SectInfoSize%)..|
00006d80  dc 04 0d 1e e6 04 0d 1e  f0 24 dd f2 66 69 6c 6c  |.........$..fill|
00006d90  28 76 61 6c 75 65 25 2c  20 73 74 61 72 74 25 2c  |(value%, start%,|
00006da0  20 62 79 74 65 6c 65 6e  25 29 0d 1e fa 25 42 25  | bytelen%)...%B%|
00006db0  3d 76 61 6c 75 65 25 3a  20 43 25 3d 73 74 61 72  |=value%: C%=star|
00006dc0  74 25 3a 20 44 25 3d 62  79 74 65 6c 65 6e 25 0d  |t%: D%=bytelen%.|
00006dd0  1f 04 0a d6 20 66 69 6c  6c 0d 1f 0e 05 e1 0d 1f  |.... fill.......|
00006de0  18 04 0d 1f 22 25 dd f2  73 65 74 44 65 66 61 75  |...."%..setDefau|
00006df0  6c 74 44 69 73 63 52 65  63 28 64 72 76 2c 20 64  |ltDiscRec(drv, d|
00006e00  65 6e 73 69 74 79 29 0d  1f 2c 10 c8 8e 20 64 65  |ensity)..,... de|
00006e10  6e 73 69 74 79 20 ca 0d  1f 36 35 20 20 c9 20 53  |nsity ...65  . S|
00006e20  44 65 6e 73 69 74 79 25  3a 20 f2 73 65 74 44 69  |Density%: .setDi|
00006e30  73 63 52 65 63 28 64 72  76 2c 20 31 30 2c 20 31  |scRec(drv, 10, 1|
00006e40  2c 20 53 44 65 6e 73 69  74 79 25 29 0d 1f 40 35  |, SDensity%)..@5|
00006e50  20 20 c9 20 44 44 65 6e  73 69 74 79 25 3a 20 f2  |  . DDensity%: .|
00006e60  73 65 74 44 69 73 63 52  65 63 28 64 72 76 2c 20  |setDiscRec(drv, |
00006e70  20 35 2c 20 33 2c 20 44  44 65 6e 73 69 74 79 25  | 5, 3, DDensity%|
00006e80  29 0d 1f 4a 05 cb 0d 1f  54 05 e1 0d 1f 5e 04 0d  |)..J....T....^..|
00006e90  1f 68 34 dd f2 73 65 74  44 69 73 63 52 65 63 28  |.h4..setDiscRec(|
00006ea0  64 72 76 2c 20 73 65 63  74 50 65 72 54 72 6b 2c  |drv, sectPerTrk,|
00006eb0  20 73 65 63 74 53 69 7a  65 2c 20 64 65 6e 73 69  | sectSize, densi|
00006ec0  74 79 29 0d 1f 72 2c 73  65 63 74 53 69 7a 65 3d  |ty)..r,sectSize=|
00006ed0  73 65 63 74 53 69 7a 65  20 80 20 26 33 20 3a f4  |sectSize . &3 :.|
00006ee0  20 6f 6e 6c 79 20 62 69  74 73 20 75 73 65 64 0d  | only bits used.|
00006ef0  1f 7c 1b 64 69 73 63 52  65 63 25 3f 30 20 3d 20  |.|.discRec%?0 = |
00006f00  37 2b 73 65 63 74 53 69  7a 65 0d 1f 86 1b 64 69  |7+sectSize....di|
00006f10  73 63 52 65 63 25 3f 31  20 3d 20 73 65 63 74 50  |scRec%?1 = sectP|
00006f20  65 72 54 72 6b 0d 1f 90  1b 64 69 73 63 52 65 63  |erTrk....discRec|
00006f30  25 3f 32 20 3d 20 32 20  3a f4 20 68 65 61 64 73  |%?2 = 2 :. heads|
00006f40  0d 1f 9a 18 64 69 73 63  52 65 63 25 3f 33 20 3d  |....discRec%?3 =|
00006f50  20 64 65 6e 73 69 74 79  0d 1f a4 4c 64 69 73 63  | density...Ldisc|
00006f60  52 65 63 25 21 31 36 20  3d 20 31 36 30 2a 28 64  |Rec%!16 = 160*(d|
00006f70  69 73 63 52 65 63 25 3f  31 29 2a 28 31 20 3c 3c  |iscRec%?1)*(1 <<|
00006f80  20 28 64 69 73 63 52 65  63 25 3f 30 29 29 3a 20  | (discRec%?0)): |
00006f90  f4 20 64 69 73 63 20 73  69 7a 65 20 69 6e 20 62  |. disc size in b|
00006fa0  79 74 65 73 0d 1f ae 15  64 69 73 63 52 65 63 25  |ytes....discRec%|
00006fb0  3f 33 34 20 3d 20 64 72  76 0d 1f b8 1b 64 69 73  |?34 = drv....dis|
00006fc0  63 52 65 63 25 21 36 34  20 3d 20 26 32 30 30 30  |cRec%!64 = &2000|
00006fd0  30 30 30 30 0d 1f c2 05  e1 0d 1f cc 04 0d 1f d6  |0000............|
00006fe0  2c f4 20 61 73 73 75 6d  65 73 20 74 68 61 74 20  |,. assumes that |
00006ff0  64 69 73 63 52 65 63 25  20 69 73 20 61 6c 72 65  |discRec% is alre|
00007000  61 64 79 20 73 65 74 75  70 0d 1f e0 1e dd a4 64  |ady setup......d|
00007010  69 73 63 41 64 64 28 74  72 6b 2c 20 68 65 61 64  |iscAdd(trk, head|
00007020  2c 20 73 65 63 74 29 0d  1f ea 45 3d 28 73 65 63  |, sect)...E=(sec|
00007030  74 20 2b 20 28 68 65 61  64 20 2b 20 74 72 6b 2a  |t + (head + trk*|
00007040  28 64 69 73 63 52 65 63  25 3f 32 29 29 2a 28 64  |(discRec%?2))*(d|
00007050  69 73 63 52 65 63 25 3f  31 29 20 29 20 3c 3c 20  |iscRec%?1) ) << |
00007060  28 64 69 73 63 52 65 63  25 3f 30 29 0d 1f f4 04  |(discRec%?0)....|
00007070  0d 1f fe 16 dd 20 f2 65  6e 67 61 67 65 44 69 73  |..... .engageDis|
00007080  63 28 64 72 76 29 0d 20  08 35 f4 20 65 6e 73 75  |c(drv). .5. ensu|
00007090  72 65 20 74 68 61 74 20  64 69 73 63 20 69 73 20  |re that disc is |
000070a0  70 72 6f 70 65 72 6c 79  20 65 6e 67 61 67 65 64  |properly engaged|
000070b0  20 26 20 72 6f 74 61 74  69 6e 67 0d 20 12 08 ea  | & rotating. ...|
000070c0  20 54 25 0d 20 1c 24 f2  72 74 7a 28 64 72 76 29  | T%. .$.rtz(drv)|
000070d0  20 3a f4 20 72 6f 74 61  74 65 20 64 69 73 63 20  | :. rotate disc |
000070e0  76 69 61 20 72 74 7a 0d  20 26 08 54 25 3d 91 0d  |via rtz. &.T%=..|
000070f0  20 30 3a f5 20 fd 20 91  20 3e 28 54 25 2b 34 30  | 0:. . . >(T%+40|
00007100  30 29 20 3a f4 20 61 6e  64 20 77 61 69 74 20 66  |0) :. and wait f|
00007110  6f 72 20 64 69 73 63 20  74 6f 20 73 74 6f 70 20  |or disc to stop |
00007120  2d 20 45 6e 67 61 67 65  64 0d 20 3a 25 f2 72 74  |- Engaged. :%.rt|
00007130  7a 28 64 72 76 29 20 3a  f4 20 74 68 65 6e 20 72  |z(drv) :. then r|
00007140  6f 74 61 74 65 20 69 74  20 61 67 61 69 6e 0d 20  |otate it again. |
00007150  44 05 e1 0d 20 4e 04 0d  20 58 0e dd f2 72 74 7a  |D... N.. X...rtz|
00007160  28 64 72 76 29 0d 20 62  2f f2 6f 70 74 72 61 63  |(drv). b/.optrac|
00007170  6b 28 52 65 73 74 6f 72  65 25 2c 20 64 72 76 2c  |k(Restore%, drv,|
00007180  20 30 2c 20 30 2c 20 44  44 65 6e 73 69 74 79 25  | 0, 0, DDensity%|
00007190  2c 20 30 29 0d 20 6c 05  e1 0d 20 76 04 0d 20 80  |, 0). l... v.. .|
000071a0  14 dd f2 73 65 65 6b 28  64 72 76 2c 20 74 72 6b  |...seek(drv, trk|
000071b0  29 0d 20 8a 2e f2 6f 70  74 72 61 63 6b 28 53 65  |). ...optrack(Se|
000071c0  65 6b 25 2c 20 64 72 76  2c 20 74 72 6b 2c 20 30  |ek%, drv, trk, 0|
000071d0  2c 20 44 44 65 6e 73 69  74 79 25 2c 20 30 29 0d  |, DDensity%, 0).|
000071e0  20 94 05 e1 0d 20 9e 04  0d 20 a8 31 dd f2 72 65  | .... ... .1..re|
000071f0  61 64 74 72 61 63 6b 28  64 72 76 2c 20 74 72 6b  |adtrack(drv, trk|
00007200  2c 20 68 65 61 64 2c 20  64 65 6e 73 69 74 79 2c  |, head, density,|
00007210  20 64 6d 61 41 64 64 25  29 0d 20 b2 3a f2 6f 70  | dmaAdd%). .:.op|
00007220  74 72 61 63 6b 28 52 65  61 64 54 72 61 63 6b 25  |track(ReadTrack%|
00007230  2c 20 64 72 76 2c 20 74  72 6b 2c 20 68 65 61 64  |, drv, trk, head|
00007240  2c 20 64 65 6e 73 69 74  79 2c 20 64 6d 61 41 64  |, density, dmaAd|
00007250  64 25 29 0d 20 bc 05 e1  0d 20 c6 04 0d 20 d0 32  |d%). .... ... .2|
00007260  dd f2 77 72 69 74 65 74  72 61 63 6b 28 64 72 76  |..writetrack(drv|
00007270  2c 20 74 72 6b 2c 20 68  65 61 64 2c 20 64 65 6e  |, trk, head, den|
00007280  73 69 74 79 2c 20 64 6d  61 41 64 64 25 29 0d 20  |sity, dmaAdd%). |
00007290  da 3b f2 6f 70 74 72 61  63 6b 28 57 72 69 74 65  |.;.optrack(Write|
000072a0  54 72 61 63 6b 25 2c 20  64 72 76 2c 20 74 72 6b  |Track%, drv, trk|
000072b0  2c 20 68 65 61 64 2c 20  64 65 6e 73 69 74 79 2c  |, head, density,|
000072c0  20 64 6d 61 41 64 64 25  29 0d 20 e4 05 e1 0d 20  | dmaAdd%). .... |
000072d0  ee 04 0d 20 f8 39 dd f2  77 72 69 74 65 74 72 61  |... .9..writetra|
000072e0  63 6b 43 68 6b 28 64 72  76 25 2c 20 74 72 6b 25  |ckChk(drv%, trk%|
000072f0  2c 20 68 65 61 64 25 2c  20 64 65 6e 73 69 74 79  |, head%, density|
00007300  25 2c 20 64 6d 61 41 64  64 25 29 0d 21 02 46 f4  |%, dmaAdd%).!.F.|
00007310  20 64 6f 20 77 72 69 74  65 20 74 72 61 63 6b 2c  | do write track,|
00007320  20 69 66 20 65 72 72 6f  72 28 77 72 69 74 65 20  | if error(write |
00007330  70 72 6f 74 65 63 74 65  64 29 20 70 72 69 6e 74  |protected) print|
00007340  20 6d 65 73 73 61 67 65  20 26 20 72 65 70 65 61  | message & repea|
00007350  74 0d 21 0c 05 f5 0d 21  16 37 20 20 f2 77 72 69  |t.!....!.7  .wri|
00007360  74 65 74 72 61 63 6b 28  64 72 76 25 2c 20 74 72  |tetrack(drv%, tr|
00007370  6b 25 2c 20 68 65 61 64  25 2c 20 64 65 6e 73 69  |k%, head%, densi|
00007380  74 79 25 2c 20 64 6d 61  41 64 64 25 29 0d 21 20  |ty%, dmaAdd%).! |
00007390  14 20 20 e7 20 72 65 73  75 6c 74 25 3c 3e 30 20  |.  . result%<>0 |
000073a0  8c 0d 21 2a 5b 20 20 20  20 f2 70 72 69 6e 74 53  |..!*[    .printS|
000073b0  72 74 28 22 2a 2a 2a 2a  20 20 43 6f 6d 65 20 6f  |rt("****  Come o|
000073c0  6e 2c 20 72 65 6d 6f 76  65 20 74 68 65 20 64 69  |n, remove the di|
000073d0  73 63 27 73 20 77 72 69  74 65 20 70 72 6f 74 65  |sc's write prote|
000073e0  63 74 2c 20 74 68 65 6e  20 70 72 65 73 73 20 73  |ct, then press s|
000073f0  70 61 63 65 20 20 2a 2a  2a 2a 22 29 0d 21 34 13  |pace  ****").!4.|
00007400  20 20 20 20 f2 70 72 65  73 73 73 70 61 63 65 0d  |    .pressspace.|
00007410  21 3e 09 20 20 20 20 f1  0d 21 48 07 20 20 cd 0d  |!>.    ..!H.  ..|
00007420  21 52 0f fd 20 72 65 73  75 6c 74 25 3d 30 0d 21  |!R.. result%=0.!|
00007430  5c 05 e1 0d 21 66 04 0d  21 70 35 dd f2 6f 70 74  |\...!f..!p5..opt|
00007440  72 61 63 6b 28 63 6d 64  25 2c 20 64 72 76 2c 20  |rack(cmd%, drv, |
00007450  74 72 6b 2c 20 68 65 61  64 2c 20 64 65 6e 73 69  |trk, head, densi|
00007460  74 79 2c 20 64 6d 61 41  64 64 25 29 0d 21 7a 4a  |ty, dmaAdd%).!zJ|
00007470  f4 20 75 73 65 73 20 64  65 66 61 75 6c 74 20 64  |. uses default d|
00007480  75 6d 6d 79 20 64 69 73  63 52 65 63 25 2c 20 73  |ummy discRec%, s|
00007490  6f 20 41 44 46 53 20 64  6f 65 73 6e 27 74 20 74  |o ADFS doesn't t|
000074a0  72 79 20 74 6f 20 72 65  61 64 20 64 69 73 63 20  |ry to read disc |
000074b0  66 6f 72 6d 61 74 0d 21  84 24 f2 73 65 74 44 65  |format.!.$.setDe|
000074c0  66 61 75 6c 74 44 69 73  63 52 65 63 28 64 72 76  |faultDiscRec(drv|
000074d0  2c 20 64 65 6e 73 69 74  79 29 0d 21 8e 3a f2 64  |, density).!.:.d|
000074e0  69 73 63 6f 70 28 63 6d  64 25 2c 20 64 72 76 2c  |iscop(cmd%, drv,|
000074f0  20 a4 64 69 73 63 41 64  64 28 74 72 6b 2c 20 68  | .discAdd(trk, h|
00007500  65 61 64 2c 20 30 29 2c  20 64 6d 61 41 64 64 25  |ead, 0), dmaAdd%|
00007510  2c 20 30 29 0d 21 98 05  e1 0d 21 a2 04 0d 21 ac  |, 0).!....!...!.|
00007520  46 dd f2 72 65 61 64 73  65 63 74 6f 72 73 28 64  |F..readsectors(d|
00007530  72 76 2c 74 72 6b 2c 68  65 61 64 2c 73 65 63 74  |rv,trk,head,sect|
00007540  2c 6e 75 6d 62 53 65 63  74 2c 73 65 63 74 53 69  |,numbSect,sectSi|
00007550  7a 65 2c 64 65 6e 73 69  74 79 2c 64 6d 61 41 64  |ze,density,dmaAd|
00007560  64 25 29 0d 21 b6 49 f2  6f 70 73 65 63 74 6f 72  |d%).!.I.opsector|
00007570  73 28 52 65 61 64 25 2c  64 72 76 2c 74 72 6b 2c  |s(Read%,drv,trk,|
00007580  68 65 61 64 2c 73 65 63  74 2c 6e 75 6d 62 53 65  |head,sect,numbSe|
00007590  63 74 2c 73 65 63 74 53  69 7a 65 2c 64 65 6e 73  |ct,sectSize,dens|
000075a0  69 74 79 2c 64 6d 61 41  64 64 25 29 0d 21 c0 05  |ity,dmaAdd%).!..|
000075b0  e1 0d 21 ca 04 0d 21 d4  47 dd f2 77 72 69 74 65  |..!...!.G..write|
000075c0  73 65 63 74 6f 72 73 28  64 72 76 2c 74 72 6b 2c  |sectors(drv,trk,|
000075d0  68 65 61 64 2c 73 65 63  74 2c 6e 75 6d 62 53 65  |head,sect,numbSe|
000075e0  63 74 2c 73 65 63 74 53  69 7a 65 2c 64 65 6e 73  |ct,sectSize,dens|
000075f0  69 74 79 2c 64 6d 61 41  64 64 25 29 0d 21 de 4a  |ity,dmaAdd%).!.J|
00007600  f2 6f 70 73 65 63 74 6f  72 73 28 57 72 69 74 65  |.opsectors(Write|
00007610  25 2c 64 72 76 2c 74 72  6b 2c 68 65 61 64 2c 73  |%,drv,trk,head,s|
00007620  65 63 74 2c 6e 75 6d 62  53 65 63 74 2c 73 65 63  |ect,numbSect,sec|
00007630  74 53 69 7a 65 2c 64 65  6e 73 69 74 79 2c 64 6d  |tSize,density,dm|
00007640  61 41 64 64 25 29 0d 21  e8 05 e1 0d 21 f2 04 0d  |aAdd%).!....!...|
00007650  21 fc 37 f4 20 2d 2d 20  52 65 61 64 20 62 79 74  |!.7. -- Read byt|
00007660  65 73 2c 20 73 74 61 72  74 69 6e 67 20 66 72 6f  |es, starting fro|
00007670  6d 20 62 65 67 69 6e 69  6e 67 20 6f 66 20 61 20  |m begining of a |
00007680  73 65 63 74 6f 72 0d 22  06 45 f4 20 2d 2d 20 42  |sector.".E. -- B|
00007690  79 74 65 73 20 6e 65 65  64 20 6e 6f 74 20 62 65  |ytes need not be|
000076a0  20 77 68 6f 6c 65 20 73  65 63 74 6f 72 73 2c 20  | whole sectors, |
000076b0  62 75 74 20 6d 75 73 74  20 6e 6f 74 20 6f 76 65  |but must not ove|
000076c0  72 66 6c 6f 77 20 74 72  61 63 6b 0d 22 10 43 dd  |rflow track.".C.|
000076d0  f2 6f 70 62 79 74 65 73  28 63 6d 64 25 2c 20 64  |.opbytes(cmd%, d|
000076e0  72 76 2c 20 74 72 6b 2c  20 68 65 61 64 2c 20 73  |rv, trk, head, s|
000076f0  65 63 74 2c 20 62 79 74  65 73 25 2c 20 64 65 6e  |ect, bytes%, den|
00007700  73 69 74 79 2c 20 64 6d  61 41 64 64 25 29 0d 22  |sity, dmaAdd%)."|
00007710  1a 2e ea 20 73 65 63 74  50 65 72 54 72 6b 2c 20  |... sectPerTrk, |
00007720  64 69 73 63 41 64 64 25  2c 20 73 65 63 74 53 69  |discAdd%, sectSi|
00007730  7a 65 2c 20 6e 75 6d 62  53 65 63 74 0d 22 24 0f  |ze, numbSect."$.|
00007740  73 65 63 74 53 69 7a 65  3d 2d 31 0d 22 2e 35 f4  |sectSize=-1.".5.|
00007750  20 72 65 70 65 61 74 2c  20 65 6e 64 73 20 75 70  | repeat, ends up|
00007760  20 66 6f 6f 6c 69 6e 67  20 41 44 46 53 20 73 6f  | fooling ADFS so|
00007770  20 69 74 20 61 6c 77 61  79 73 20 77 6f 72 6b 73  | it always works|
00007780  0d 22 38 05 f5 0d 22 42  12 20 20 73 65 63 74 53  |."8..."B.  sectS|
00007790  69 7a 65 20 2b 3d 31 0d  22 4c 2c 20 20 6e 75 6d  |ize +=1."L,  num|
000077a0  62 53 65 63 74 3d 31 2b  28 28 62 79 74 65 73 25  |bSect=1+((bytes%|
000077b0  2d 31 29 20 3e 3e 28 37  2b 73 65 63 74 53 69 7a  |-1) >>(7+sectSiz|
000077c0  65 29 29 0d 22 56 2b fd  20 6e 75 6d 62 53 65 63  |e))."V+. numbSec|
000077d0  74 20 3c 26 31 30 30 20  3a f4 20 6d 75 73 74 20  |t <&100 :. must |
000077e0  62 65 20 73 69 6e 67 6c  65 20 62 79 74 65 0d 22  |be single byte."|
000077f0  60 41 73 65 63 74 50 65  72 54 72 6b 20 3d 20 73  |`AsectPerTrk = s|
00007800  65 63 74 20 2b 20 6e 75  6d 62 53 65 63 74 20 3a  |ect + numbSect :|
00007810  f4 20 66 6f 6f 6c 20 41  44 46 53 2c 20 73 6f 20  |. fool ADFS, so |
00007820  69 74 20 61 6c 77 61 79  73 20 77 6f 72 6b 73 0d  |it always works.|
00007830  22 6a 33 f2 73 65 74 44  69 73 63 52 65 63 28 64  |"j3.setDiscRec(d|
00007840  72 76 2c 20 73 65 63 74  50 65 72 54 72 6b 2c 20  |rv, sectPerTrk, |
00007850  73 65 63 74 53 69 7a 65  2c 20 64 65 6e 73 69 74  |sectSize, densit|
00007860  79 29 0d 22 74 28 64 69  73 63 41 64 64 25 20 3d  |y)."t(discAdd% =|
00007870  20 a4 64 69 73 63 41 64  64 28 74 72 6b 2c 20 68  | .discAdd(trk, h|
00007880  65 61 64 2c 20 73 65 63  74 29 0d 22 7e 31 f2 64  |ead, sect)."~1.d|
00007890  69 73 63 6f 70 28 63 6d  64 25 2c 20 64 72 76 2c  |iscop(cmd%, drv,|
000078a0  20 64 69 73 63 41 64 64  25 2c 20 64 6d 61 41 64  | discAdd%, dmaAd|
000078b0  64 25 2c 20 62 79 74 65  73 25 29 0d 22 88 05 e1  |d%, bytes%)."...|
000078c0  0d 22 92 04 0d 22 9c 49  dd f2 6f 70 73 65 63 74  |."...".I..opsect|
000078d0  6f 72 73 28 63 6d 64 25  2c 64 72 76 2c 74 72 6b  |ors(cmd%,drv,trk|
000078e0  2c 68 65 61 64 2c 73 65  63 74 2c 6e 75 6d 62 53  |,head,sect,numbS|
000078f0  65 63 74 2c 73 65 63 74  53 69 7a 65 2c 64 65 6e  |ect,sectSize,den|
00007900  73 69 74 79 2c 64 6d 61  41 64 64 25 29 0d 22 a6  |sity,dmaAdd%).".|
00007910  1a ea 20 73 65 63 74 50  65 72 54 72 6b 2c 20 64  |.. sectPerTrk, d|
00007920  69 73 63 41 64 64 25 0d  22 b0 41 73 65 63 74 50  |iscAdd%.".AsectP|
00007930  65 72 54 72 6b 20 3d 20  73 65 63 74 20 2b 20 6e  |erTrk = sect + n|
00007940  75 6d 62 53 65 63 74 20  3a f4 20 66 6f 6f 6c 20  |umbSect :. fool |
00007950  41 44 46 53 2c 20 73 6f  20 69 74 20 61 6c 77 61  |ADFS, so it alwa|
00007960  79 73 20 77 6f 72 6b 73  0d 22 ba 33 f2 73 65 74  |ys works.".3.set|
00007970  44 69 73 63 52 65 63 28  64 72 76 2c 20 73 65 63  |DiscRec(drv, sec|
00007980  74 50 65 72 54 72 6b 2c  20 73 65 63 74 53 69 7a  |tPerTrk, sectSiz|
00007990  65 2c 20 64 65 6e 73 69  74 79 29 0d 22 c4 28 64  |e, density).".(d|
000079a0  69 73 63 41 64 64 25 20  3d 20 a4 64 69 73 63 41  |iscAdd% = .discA|
000079b0  64 64 28 74 72 6b 2c 20  68 65 61 64 2c 20 73 65  |dd(trk, head, se|
000079c0  63 74 29 0d 22 ce 44 f2  64 69 73 63 6f 70 28 63  |ct).".D.discop(c|
000079d0  6d 64 25 2c 20 64 72 76  2c 20 64 69 73 63 41 64  |md%, drv, discAd|
000079e0  64 25 2c 20 64 6d 61 41  64 64 25 2c 20 6e 75 6d  |d%, dmaAdd%, num|
000079f0  62 53 65 63 74 20 3c 3c  20 28 64 69 73 63 52 65  |bSect << (discRe|
00007a00  63 25 3f 30 29 20 29 0d  22 d8 05 e1 0d 22 e2 04  |c%?0) )."...."..|
00007a10  0d 22 ec 2e 20 20 f4 20  6f 6e 20 65 78 69 74 20  |."..  . on exit |
00007a20  72 65 73 75 6c 74 25 3d  30 20 6f 72 20 64 69 73  |result%=0 or dis|
00007a30  63 20 65 72 72 6f 72 20  6e 75 6d 62 65 72 0d 22  |c error number."|
00007a40  f6 32 dd f2 64 69 73 63  6f 70 28 63 6d 64 25 2c  |.2..discop(cmd%,|
00007a50  20 64 72 76 2c 20 64 69  73 63 41 64 64 25 2c 20  | drv, discAdd%, |
00007a60  64 6d 61 41 64 64 25 2c  20 62 79 74 65 73 25 29  |dmaAdd%, bytes%)|
00007a70  0d 23 00 1f 52 31 25 3d  20 63 6d 64 25 20 84 20  |.#..R1%= cmd% . |
00007a80  28 64 69 73 63 52 65 63  25 20 3c 3c 20 36 29 0d  |(discRec% << 6).|
00007a90  23 0a 2d 52 32 25 3d 20  28 64 72 76 20 3c 3c 20  |#.-R2%= (drv << |
00007aa0  32 39 29 20 2b 20 28 64  69 73 63 41 64 64 25 20  |29) + (discAdd% |
00007ab0  80 20 26 31 46 46 46 46  46 46 46 29 0d 23 14 62  |. &1FFFFFFF).#.b|
00007ac0  c8 99 20 58 41 64 66 73  53 77 69 25 20 2c 20 30  |.. XAdfsSwi% , 0|
00007ad0  2c 20 52 31 25 2c 20 52  32 25 2c 20 64 6d 61 41  |, R1%, R2%, dmaA|
00007ae0  64 64 25 2c 20 62 79 74  65 73 25 20 b8 20 72 65  |dd%, bytes% . re|
00007af0  73 75 6c 74 25 2c 2c 6e  65 78 74 44 69 73 63 42  |sult%,,nextDiscB|
00007b00  79 74 65 25 2c 20 6e 65  78 74 4d 65 6d 42 79 74  |yte%, nextMemByt|
00007b10  65 25 2c 20 42 79 74 65  73 4c 65 66 74 25 0d 23  |e%, BytesLeft%.#|
00007b20  1e 27 e7 20 72 65 73 75  6c 74 25 20 8c 20 f2 64  |.'. result% . .d|
00007b30  69 73 63 65 72 72 28 63  6d 64 25 2c 20 72 65 73  |iscerr(cmd%, res|
00007b40  75 6c 74 25 29 0d 23 28  05 e1 0d 23 32 04 0d 23  |ult%).#(...#2..#|
00007b50  3c 1e dd f2 64 69 73 63  65 72 72 28 63 6d 64 25  |<...discerr(cmd%|
00007b60  2c 20 f8 20 72 65 73 75  6c 74 25 29 0d 23 46 1d  |, . result%).#F.|
00007b70  e7 20 28 72 65 73 75 6c  74 25 20 80 20 28 31 20  |. (result% . (1 |
00007b80  3c 3c 20 33 31 29 29 20  8c 0d 23 50 28 20 20 f1  |<< 31)) ..#P(  .|
00007b90  27 22 45 72 72 6f 72 20  26 22 3b 7e 72 65 73 75  |'"Error &";~resu|
00007ba0  6c 74 25 20 80 20 26 33  46 46 46 46 46 46 46 3a  |lt% . &3FFFFFFF:|
00007bb0  e0 0d 23 5a 05 cc 0d 23  64 2d 20 20 e7 20 28 28  |..#Z...#d-  . ((|
00007bc0  21 72 65 73 75 6c 74 25  29 20 80 20 26 46 46 46  |!result%) . &FFF|
00007bd0  46 46 46 29 3d 41 64 66  73 44 69 73 63 45 72 72  |FFF)=AdfsDiscErr|
00007be0  25 20 8c 0d 23 6e 3b 20  20 20 20 e7 20 61 6e 61  |% ..#n;    . ana|
00007bf0  6c 79 73 65 20 80 20 ac  20 28 28 63 6d 64 25 3d  |lyse . . ((cmd%=|
00007c00  52 65 61 64 54 72 61 63  6b 25 29 80 28 28 72 65  |ReadTrack%).((re|
00007c10  73 75 6c 74 25 3f 33 29  3d 34 29 29 20 8c 0d 23  |sult%?3)=4)) ..#|
00007c20  78 23 20 20 20 20 20 20  f2 70 72 69 6e 74 5f 65  |x#      .print_e|
00007c30  72 72 28 63 6d 64 25 2c  20 72 65 73 75 6c 74 25  |rr(cmd%, result%|
00007c40  29 0d 23 82 09 20 20 20  20 cd 0d 23 8c 19 20 20  |).#..    ..#..  |
00007c50  20 20 72 65 73 75 6c 74  25 3d 72 65 73 75 6c 74  |  result%=result|
00007c60  25 3f 33 0d 23 96 07 20  20 cc 0d 23 a0 37 20 20  |%?3.#..  ..#.7  |
00007c70  20 20 e7 20 28 28 21 72  65 73 75 6c 74 25 29 20  |  . ((!result%) |
00007c80  80 20 26 46 46 46 46 46  46 29 20 3c 3e 20 41 64  |. &FFFFFF) <> Ad|
00007c90  66 73 57 72 69 74 65 50  72 6f 74 65 63 74 25 20  |fsWriteProtect% |
00007ca0  8c 0d 23 aa 26 20 20 20  20 20 20 f2 70 72 69 6e  |..#.&      .prin|
00007cb0  74 5f 65 72 72 28 63 6d  64 25 2c 20 72 65 73 75  |t_err(cmd%, resu|
00007cc0  6c 74 25 29 3a 20 e0 0d  23 b4 09 20 20 20 20 cd  |lt%): ..#..    .|
00007cd0  0d 23 be 07 20 20 cd 0d  23 c8 05 cd 0d 23 d2 05  |.#..  ..#....#..|
00007ce0  e1 0d 23 dc 04 0d 23 e6  34 f4 20 31 37 37 30 2f  |..#...#.4. 1770/|
00007cf0  31 37 37 32 20 6f 72 20  41 44 46 53 20 72 65 73  |1772 or ADFS res|
00007d00  74 72 69 63 74 69 6f 6e  73 2f 63 68 61 72 61 63  |trictions/charac|
00007d10  74 65 72 69 73 74 69 63  73 0d 23 f0 44 f4 20 41  |teristics.#.D. A|
00007d20  44 46 53 20 2d 20 77 69  6c 6c 20 6e 6f 74 20 61  |DFS - will not a|
00007d30  6c 6c 6f 77 20 79 6f 75  20 74 6f 20 77 72 69 74  |llow you to writ|
00007d40  65 20 64 65 6c 65 74 65  64 20 64 61 74 61 20 6f  |e deleted data o|
00007d50  74 68 65 72 20 74 68 61  6e 20 76 69 61 0d 23 fa  |ther than via.#.|
00007d60  4a f4 20 20 20 20 20 20  20 20 74 68 65 20 66 6f  |J.        the fo|
00007d70  72 6d 61 74 28 77 72 69  74 65 20 74 72 61 63 6b  |rmat(write track|
00007d80  29 20 63 6f 6d 6d 61 6e  64 2c 20 6e 6f 72 20 77  |) command, nor w|
00007d90  69 6c 6c 20 69 74 20 73  69 67 6e 61 6c 20 61 6e  |ill it signal an|
00007da0  79 20 65 72 72 6f 72 0d  24 04 4b f4 20 20 20 20  |y error.$.K.    |
00007db0  20 20 20 20 6f 6e 20 72  65 61 64 69 6e 67 20 64  |    on reading d|
00007dc0  65 6c 65 74 65 64 20 64  61 74 61 20 28 69 6e 63  |eleted data (inc|
00007dd0  6c 75 64 69 6e 67 20 6d  75 6c 74 69 2d 73 65 63  |luding multi-sec|
00007de0  74 6f 72 20 64 65 6c 65  74 65 64 20 64 61 74 61  |tor deleted data|
00007df0  29 2e 0d 24 0e 43 f4 20  20 20 20 20 20 2d 20 54  |)..$.C.      - T|
00007e00  68 65 20 6f 6e 6c 79 20  64 69 73 63 20 65 72 72  |he only disc err|
00007e10  6f 72 73 20 73 69 67 6e  61 6c 6c 65 64 20 61 72  |ors signalled ar|
00007e20  65 20 28 70 6c 75 73 20  63 6f 6d 62 69 6e 61 74  |e (plus combinat|
00007e30  69 6f 6e 29 2d 0d 24 18  4a f4 20 20 20 20 20 20  |ion)-.$.J.      |
00007e40  20 20 26 31 30 20 2d 20  53 65 63 74 6f 72 20 6e  |  &10 - Sector n|
00007e50  6f 74 20 66 6f 75 6e 64  20 28 69 6e 63 6c 2e 20  |ot found (incl. |
00007e60  49 44 20 43 52 43 20 65  72 72 6f 72 20 6f 72 20  |ID CRC error or |
00007e70  64 61 74 61 20 6d 61 72  6b 3e 20 26 46 42 29 0d  |data mark> &FB).|
00007e80  24 22 44 f4 20 20 20 20  20 20 20 20 26 30 38 20  |$"D.        &08 |
00007e90  2d 20 43 52 43 20 65 72  72 6f 72 20 28 69 6e 63  |- CRC error (inc|
00007ea0  6c 2e 20 49 44 20 26 20  64 61 74 61 20 43 52 43  |l. ID & data CRC|
00007eb0  20 6f 72 20 64 61 74 61  20 6d 61 72 6b 3c 20 26  | or data mark< &|
00007ec0  46 38 29 0d 24 2c 45 f4  20 20 20 20 20 20 20 20  |F8).$,E.        |
00007ed0  6e 2e 62 2e 20 77 72 69  74 65 20 70 72 6f 74 65  |n.b. write prote|
00007ee0  63 74 20 69 73 20 73 69  67 6e 61 6c 6c 65 64 20  |ct is signalled |
00007ef0  62 75 74 20 6e 6f 74 20  61 73 20 61 20 64 69 73  |but not as a dis|
00007f00  63 20 65 72 72 6f 72 2e  0d 24 36 26 f4 20 31 37  |c error..$6&. 17|
00007f10  37 30 20 2d 20 46 6f 72  20 64 69 73 63 20 65 72  |70 - For disc er|
00007f20  72 6f 72 73 20 73 65 65  20 61 62 6f 76 65 0d 24  |rors see above.$|
00007f30  40 49 f4 20 20 20 20 20  20 2d 20 44 44 20 49 44  |@I.      - DD ID|
00007f40  20 6d 61 72 6b 20 63 61  6e 20 68 61 76 65 20 61  | mark can have a|
00007f50  6e 79 20 76 61 6c 75 65  20 62 65 74 77 65 65 6e  |ny value between|
00007f60  20 26 46 43 2d 26 46 46  20 28 6e 6f 74 20 6a 75  | &FC-&FF (not ju|
00007f70  73 74 20 26 46 45 29 0d  24 4a 4a f4 20 20 20 20  |st &FE).$JJ.    |
00007f80  20 20 2d 20 44 44 20 44  61 74 61 20 61 72 65 61  |  - DD Data area|
00007f90  20 6d 61 72 6b 20 63 61  6e 20 62 65 20 61 6e 79  | mark can be any|
00007fa0  20 6f 66 20 26 46 38 2d  26 46 42 20 28 6e 6f 74  | of &F8-&FB (not|
00007fb0  20 6a 75 73 74 20 26 46  42 20 6f 72 20 26 46 38  | just &FB or &F8|
00007fc0  29 0d 24 54 46 f4 20 20  20 20 20 20 20 20 4e 6f  |).$TF.        No|
00007fd0  74 65 20 41 44 46 53 20  6d 61 73 6b 73 20 61 6e  |te ADFS masks an|
00007fe0  79 20 64 69 66 66 65 72  6e 63 65 20 69 6e 20 64  |y differnce in d|
00007ff0  65 6c 65 74 65 64 20 61  6e 64 20 6e 6f 72 6d 61  |eleted and norma|
00008000  6c 20 64 61 74 61 2e 0d  24 5e 3f f4 20 20 20 20  |l data..$^?.    |
00008010  20 20 2d 20 49 44 20 68  65 61 64 20 6e 75 6d 62  |  - ID head numb|
00008020  65 72 20 69 73 20 69 67  6e 6f 72 65 64 2c 20 73  |er is ignored, s|
00008030  6f 20 6e 65 65 64 20 6e  6f 74 20 62 65 20 63 6f  |o need not be co|
00008040  72 72 65 63 74 2e 0d 24  68 4a f4 20 20 20 20 20  |rrect..$hJ.     |
00008050  20 2d 20 4f 6e 6c 79 20  74 68 65 20 62 6f 74 74  | - Only the bott|
00008060  6f 6d 20 32 20 62 69 74  73 20 6f 66 20 53 65 63  |om 2 bits of Sec|
00008070  74 53 69 7a 65 20 61 72  65 20 75 73 65 64 2c 20  |tSize are used, |
00008080  72 65 73 74 20 61 72 65  20 69 67 6e 6f 72 65 64  |rest are ignored|
00008090  0d 24 72 42 f4 20 20 20  20 20 20 2d 20 4d 69 73  |.$rB.      - Mis|
000080a0  73 69 6e 67 20 63 6c 6f  63 6b 73 20 69 6e 20 65  |sing clocks in e|
000080b0  69 74 68 65 72 20 49 44  20 6f 72 20 64 61 74 61  |ither ID or data|
000080c0  20 61 72 65 20 6e 6f 74  20 64 65 74 65 63 74 65  | are not detecte|
000080d0  64 2c 0d 24 7c 43 f4 20  20 20 20 20 20 20 20 70  |d,.$|C.        p|
000080e0  72 6f 76 69 64 69 6e 67  20 74 68 65 20 43 52 43  |roviding the CRC|
000080f0  20 69 73 20 73 65 74 20  61 73 20 69 66 20 74 68  | is set as if th|
00008100  65 20 76 61 6c 75 65 73  20 77 65 72 65 20 26 41  |e values were &A|
00008110  31 20 66 6f 72 0d 24 86  44 f4 20 20 20 20 20 20  |1 for.$.D.      |
00008120  20 20 27 26 46 35 27 20  6d 69 73 73 69 6e 67 20  |  '&F5' missing |
00008130  63 6c 6f 63 6b 73 20 28  69 65 20 79 6f 75 20 63  |clocks (ie you c|
00008140  61 6e 27 74 20 75 73 65  20 26 46 37 20 74 6f 20  |an't use &F7 to |
00008150  73 65 74 20 43 52 43 29  2e 0d 24 90 46 f4 20 20  |set CRC)..$.F.  |
00008160  20 20 20 20 2d 20 57 72  69 74 65 20 54 72 61 63  |    - Write Trac|
00008170  6b 20 63 61 6e 6e 6f 74  20 75 73 65 20 69 6e 20  |k cannot use in |
00008180  64 61 74 61 20 6f 72 20  49 44 20 61 72 65 61 2c  |data or ID area,|
00008190  20 62 79 74 65 20 76 61  6c 75 65 73 20 6f 66 0d  | byte values of.|
000081a0  24 9a 37 f4 20 20 20 20  20 20 20 20 20 26 46 35  |$.7.         &F5|
000081b0  2d 26 46 37 20 20 66 6f  72 20 20 20 20 20 53 69  |-&F7  for     Si|
000081c0  6e 67 6c 65 20 6f 72 20  44 6f 75 62 6c 65 20 44  |ngle or Double D|
000081d0  65 6e 73 69 74 79 0d 24  a4 4a f4 20 20 20 20 20  |ensity.$.J.     |
000081e0  20 20 20 20 26 46 38 2d  26 46 42 2c 20 26 46 45  |    &F8-&FB, &FE|
000081f0  20 66 6f 72 20 53 69 6e  67 6c 65 20 44 65 6e 73  | for Single Dens|
00008200  69 74 79 2c 20 75 6e 6c  65 73 73 20 43 52 43 20  |ity, unless CRC |
00008210  69 73 20 53 2f 57 20 67  65 6e 65 72 61 74 65 64  |is S/W generated|
00008220  0d 24 ae 47 f4 20 20 20  20 20 20 20 20 54 68 65  |.$.G.        The|
00008230  20 66 6f 72 6d 65 72 20  72 65 73 75 6c 74 73 20  | former results |
00008240  69 6e 20 77 72 6f 6e 67  20 64 61 74 61 20 77 72  |in wrong data wr|
00008250  69 74 74 65 6e 2c 20 77  68 69 6c 65 20 74 68 65  |itten, while the|
00008260  20 6c 61 74 74 65 72 0d  24 b8 37 f4 20 20 20 20  | latter.$.7.    |
00008270  20 20 20 20 72 65 73 75  6c 74 73 20 69 6e 20 61  |    results in a|
00008280  6e 20 69 6e 63 6f 72 72  65 63 74 20 43 52 43 20  |n incorrect CRC |
00008290  28 75 73 69 6e 67 20 27  26 46 37 27 29 2e 0d 24  |(using '&F7')..$|
000082a0  c2 46 f4 20 20 20 20 20  20 20 20 48 6f 77 65 76  |.F.        Howev|
000082b0  65 72 2c 20 74 68 65 72  65 20 69 73 20 6f 6e 65  |er, there is one|
000082c0  20 77 61 79 20 6f 66 20  77 72 69 74 69 6e 67 20  | way of writing |
000082d0  74 68 65 20 61 63 74 75  61 6c 20 76 61 6c 75 65  |the actual value|
000082e0  73 20 6f 66 0d 24 cc 46  f4 20 20 20 20 20 20 20  |s of.$.F.       |
000082f0  20 26 46 35 2c 26 46 36  2c 26 46 37 2c 20 64 75  | &F5,&F6,&F7, du|
00008300  72 69 6e 67 20 77 72 69  74 65 20 74 72 61 63 6b  |ring write track|
00008310  2c 20 69 66 20 74 68 65  20 62 79 74 65 20 69 6d  |, if the byte im|
00008320  6d 65 61 64 69 61 74 65  6c 79 0d 24 d6 45 f4 20  |meadiately.$.E. |
00008330  20 20 20 20 20 20 20 66  6f 6c 6c 6f 77 73 20 61  |       follows a|
00008340  20 26 46 37 2e 20 53 6f  20 69 74 20 77 69 6c 6c  | &F7. So it will|
00008350  20 62 65 20 76 65 72 79  20 64 69 66 66 69 63 75  | be very difficu|
00008360  6c 74 20 74 6f 20 67 65  6e 65 72 61 74 65 2e 0d  |lt to generate..|
00008370  24 e0 49 f4 20 20 20 20  20 20 2d 20 46 6f 72 20  |$.I.      - For |
00008380  64 6f 75 62 6c 65 20 64  65 6e 73 69 74 79 2c 20  |double density, |
00008390  6e 6f 6e 65 20 6f 66 20  74 68 65 20 31 32 20 73  |none of the 12 s|
000083a0  79 6e 63 20 62 79 74 65  73 28 69 65 20 30 20 70  |ync bytes(ie 0 p|
000083b0  72 65 63 65 64 69 6e 67  0d 24 ea 47 f4 20 20 20  |receding.$.G.   |
000083c0  20 20 20 20 20 41 4d 29  20 6e 65 65 64 20 62 65  |     AM) need be|
000083d0  20 74 68 65 72 65 2c 20  74 68 75 73 20 70 72 65  | there, thus pre|
000083e0  76 69 6f 75 73 20 64 61  74 61 20 61 72 65 61 20  |vious data area |
000083f0  63 61 6e 20 67 6f 20 72  69 67 68 74 20 75 70 0d  |can go right up.|
00008400  24 f4 25 f4 20 20 20 20  20 20 20 20 74 6f 20 74  |$.%.        to t|
00008410  68 65 20 41 4d 20 6f 66  20 74 68 65 20 6e 65 78  |he AM of the nex|
00008420  74 20 49 44 0d 24 fe 04  0d 25 08 35 f4 20 2a 2a  |t ID.$...%.5. **|
00008430  2a 2a 2a 2a 2a 20 56 61  72 69 6f 75 73 20 73 74  |***** Various st|
00008440  61 6e 64 61 72 64 20 64  69 73 63 20 66 6f 72 6d  |andard disc form|
00008450  61 74 73 20 2a 2a 2a 2a  2a 2a 2a 2a 2a 0d 25 12  |ats *********.%.|
00008460  41 f4 20 20 20 20 20 20  20 20 20 20 20 20 73 65  |A.            se|
00008470  63 74 5f 70 65 72 5f 74  72 6b 20 20 20 66 69 72  |ct_per_trk   fir|
00008480  73 74 5f 73 65 63 74 20  20 20 73 65 63 74 5f 73  |st_sect   sect_s|
00008490  69 7a 65 20 20 20 20 64  65 6e 73 69 74 79 0d 25  |ize    density.%|
000084a0  1c 04 0d 25 26 3e f4 20  41 44 46 53 28 38 30 30  |...%&>. ADFS(800|
000084b0  4b 29 20 20 20 20 20 20  20 35 20 20 20 20 20 20  |K)       5      |
000084c0  20 20 20 20 20 20 30 20  20 20 20 20 20 20 20 20  |      0         |
000084d0  20 33 20 28 31 30 32 34  29 20 20 20 20 20 20 32  | 3 (1024)      2|
000084e0  0d 25 30 3e f4 20 41 44  46 53 28 36 34 30 4b 29  |.%0>. ADFS(640K)|
000084f0  20 20 20 20 20 20 31 36  20 20 20 20 20 20 20 20  |      16        |
00008500  20 20 20 20 30 20 20 20  20 20 20 20 20 20 20 31  |    0          1|
00008510  20 20 28 32 35 36 29 20  20 20 20 20 20 32 0d 25  |  (256)      2.%|
00008520  3a 3e f4 20 42 42 43 20  44 46 53 20 20 20 20 20  |:>. BBC DFS     |
00008530  20 20 20 20 31 30 20 20  20 20 20 20 20 20 20 20  |    10          |
00008540  20 20 30 20 20 20 20 20  20 20 20 20 20 31 20 20  |  0          1  |
00008550  28 32 35 36 29 20 20 20  20 20 20 31 0d 25 44 3e  |(256)      1.%D>|
00008560  f4 20 4d 53 2d 44 4f 53  20 33 20 20 20 20 20 20  |. MS-DOS 3      |
00008570  20 20 20 39 20 20 20 20  20 20 20 20 20 20 20 20  |   9            |
00008580  31 20 20 20 20 20 20 20  20 20 20 32 20 20 28 35  |1          2  (5|
00008590  31 32 29 20 20 20 20 20  20 32 0d 25 4e 04 0d 25  |12)      2.%N..%|
000085a0  58 04 0d 25 62 10 dd f2  70 72 65 73 73 73 70 61  |X..%b...pressspa|
000085b0  63 65 0d 25 6c 10 ff 28  22 66 78 20 31 35 2c 31  |ce.%l..("fx 15,1|
000085c0  22 29 0d 25 76 0f f5 20  fd 20 a6 28 30 29 3d 33  |").%v.. . .(0)=3|
000085d0  32 0d 25 80 05 e1 0d 25  8a 04 0d 25 94 16 dd f2  |2.%....%...%....|
000085e0  70 72 69 6e 74 62 69 74  73 28 62 79 74 65 25 29  |printbits(byte%)|
000085f0  0d 25 9e 08 ea 20 49 25  0d 25 a8 13 e3 20 49 25  |.%... I%.%... I%|
00008600  3d 37 20 b8 20 30 20 88  20 2d 31 0d 25 b2 2d 20  |=7 . 0 . -1.%.- |
00008610  20 e7 20 28 28 62 79 74  65 25 20 3e 3e 20 49 25  | . ((byte% >> I%|
00008620  29 20 80 20 31 29 20 8c  20 ef 20 97 22 31 22 20  |) . 1) . . ."1" |
00008630  8b 20 ef 20 97 22 30 22  0d 25 bc 05 ed 0d 25 c6  |. . ."0".%....%.|
00008640  05 e1 0d 25 d0 04 0d 25  da 18 dd f2 63 68 65 63  |...%...%....chec|
00008650  6b 44 69 73 63 49 6e 28  74 65 78 74 24 29 0d 25  |kDiscIn(text$).%|
00008660  e4 10 e7 20 63 6f 70 79  64 69 73 63 20 8c 0d 25  |... copydisc ..%|
00008670  ee 15 20 20 e7 20 73 6f  75 72 63 65 3d 64 65 73  |..  . source=des|
00008680  74 20 8c 0d 25 f8 3a 20  20 20 20 f1 8a 30 2c bc  |t ..%.:    ..0,.|
00008690  29 22 20 20 49 6e 73 65  72 74 20 22 2b 74 65 78  |)"  Insert "+tex|
000086a0  74 24 2b 22 20 64 69 73  63 2c 20 74 68 65 6e 20  |t$+" disc, then |
000086b0  70 72 65 73 73 20 73 70  61 63 65 22 3b 0d 26 02  |press space";.&.|
000086c0  13 20 20 20 20 f2 70 72  65 73 73 73 70 61 63 65  |.    .pressspace|
000086d0  0d 26 0c 1d 20 20 20 20  f1 8a 30 2c bc 29 c4 35  |.&..    ..0,.).5|
000086e0  30 2c 22 20 22 29 3b 8a  30 2c bc 29 3b 0d 26 16  |0," ");.0,.);.&.|
000086f0  07 20 20 cd 0d 26 20 05  cd 0d 26 2a 05 e1 0d 26  |.  ..& ...&*...&|
00008700  34 04 0d 26 3e 13 dd f2  70 72 69 6e 74 4c 69 6e  |4..&>...printLin|
00008710  65 28 54 24 29 0d 26 48  40 f4 20 61 74 20 73 74  |e(T$).&H@. at st|
00008720  61 72 74 20 6f 66 20 6e  65 78 74 20 66 72 65 65  |art of next free|
00008730  20 6c 69 6e 65 2c 20 70  72 69 6e 74 20 74 65 78  | line, print tex|
00008740  74 20 66 6f 6c 6c 6f 77  65 64 20 62 79 20 6e 65  |t followed by ne|
00008750  77 6c 69 6e 65 0d 26 52  3b f4 20 70 72 69 6e 74  |wline.&R;. print|
00008760  20 61 74 20 73 74 61 72  74 20 6f 66 20 6e 65 78  | at start of nex|
00008770  74 20 66 72 65 65 20 6c  69 6e 65 20 66 6f 6c 6c  |t free line foll|
00008780  6f 77 65 64 20 62 79 20  20 6e 65 77 6c 69 6e 65  |owed by  newline|
00008790  0d 26 5c 11 f2 70 72 69  6e 74 53 72 74 28 54 24  |.&\..printSrt(T$|
000087a0  29 0d 26 66 05 f1 0d 26  70 05 e1 0d 26 7a 04 0d  |).&f...&p...&z..|
000087b0  26 84 12 dd f2 70 72 69  6e 74 53 72 74 28 54 24  |&....printSrt(T$|
000087c0  29 0d 26 8e 3c f4 20 61  74 20 73 74 61 72 74 20  |).&.<. at start |
000087d0  6f 66 20 6e 65 78 74 20  66 72 65 65 20 6c 69 6e  |of next free lin|
000087e0  65 2c 20 70 72 69 6e 74  20 74 65 78 74 20 77 69  |e, print text wi|
000087f0  74 68 6f 75 74 20 6e 65  77 6c 69 6e 65 0d 26 98  |thout newline.&.|
00008800  0e e7 20 b1 3c 3e 30 20  8c 20 f1 0d 26 a2 09 f1  |.. .<>0 . ..&...|
00008810  3b 54 24 3b 0d 26 ac 05  e1 0d 26 b6 04 0d 26 c0  |;T$;.&....&...&.|
00008820  1f dd f2 70 72 69 6e 74  49 44 28 54 72 6b 44 65  |...printID(TrkDe|
00008830  73 63 25 2c 20 63 6f 75  6e 74 25 29 0d 26 ca 3e  |sc%, count%).&.>|
00008840  f4 20 41 74 20 73 74 61  72 74 20 6f 66 20 6e 65  |. At start of ne|
00008850  78 74 20 66 72 65 65 20  6c 69 6e 65 2c 20 70 72  |xt free line, pr|
00008860  69 6e 74 20 72 65 61 6c  20 74 72 6b 2f 68 65 61  |int real trk/hea|
00008870  64 2f 64 65 6e 73 69 74  79 2c 0d 26 d4 30 f4 20  |d/density,.&.0. |
00008880  20 74 68 65 6e 20 49 44  20 62 79 74 65 73 2e 20  | then ID bytes. |
00008890  41 6c 6c 20 77 69 74 68  6f 75 74 20 6e 65 77 6c  |All without newl|
000088a0  69 6e 65 20 61 74 20 65  6e 64 0d 26 de 28 ea 20  |ine at end.&.(. |
000088b0  49 44 25 2c 20 74 72 6b  25 2c 20 68 65 61 64 25  |ID%, trk%, head%|
000088c0  2c 20 73 65 63 74 25 2c  20 73 65 63 74 53 69 7a  |, sect%, sectSiz|
000088d0  65 25 0d 26 e8 24 49 44  25 3d a4 67 65 74 53 65  |e%.&.$ID%=.getSe|
000088e0  63 74 49 44 28 54 72 6b  44 65 73 63 25 2c 20 63  |ctID(TrkDesc%, c|
000088f0  6f 75 6e 74 25 29 0d 26  f2 14 74 72 6b 25 3d 20  |ount%).&..trk%= |
00008900  20 26 46 46 20 80 20 49  44 25 0d 26 fc 1b 68 65  | &FF . ID%.&..he|
00008910  61 64 25 3d 20 26 46 46  20 80 20 28 49 44 25 20  |ad%= &FF . (ID% |
00008920  3e 3e 20 38 29 0d 27 06  1c 73 65 63 74 25 3d 20  |>> 8).'..sect%= |
00008930  26 46 46 20 80 20 28 49  44 25 20 3e 3e 20 31 36  |&FF . (ID% >> 16|
00008940  29 0d 27 10 1f 73 65 63  74 53 69 7a 65 25 3d 26  |).'..sectSize%=&|
00008950  46 46 20 80 20 28 49 44  25 20 3e 3e 20 32 34 29  |FF . (ID% >> 24)|
00008960  0d 27 1a 11 f2 70 72 69  6e 74 53 72 74 28 22 22  |.'...printSrt(""|
00008970  29 0d 27 24 23 e7 20 28  54 72 6b 44 65 73 63 25  |).'$#. (TrkDesc%|
00008980  3f 62 75 66 54 72 6b 44  65 6e 73 69 74 79 25 29  |?bufTrkDensity%)|
00008990  3d 32 20 8c 0d 27 2e 13  20 20 f1 3b 22 44 44 65  |=2 ..'..  .;"DDe|
000089a0  6e 73 69 74 79 22 3b 0d  27 38 05 cc 0d 27 42 13  |nsity";.'8...'B.|
000089b0  20 20 f1 3b 22 53 44 65  6e 73 69 74 79 22 3b 0d  |  .;"SDensity";.|
000089c0  27 4c 05 cd 0d 27 56 12  f1 20 8a 38 29 3b 22 20  |'L...'V.. .8);" |
000089d0  49 44 3a 20 22 3b 0d 27  60 17 f1 20 8a 31 33 29  |ID: ";.'`.. .13)|
000089e0  3b 22 54 72 6b 3d 22 3b  74 72 6b 25 3b 0d 27 6a  |;"Trk=";trk%;.'j|
000089f0  17 f1 20 8a 32 31 29 3b  22 48 64 3d 22 3b 68 65  |.. .21);"Hd=";he|
00008a00  61 64 25 3b 0d 27 74 19  f1 20 8a 32 38 29 3b 22  |ad%;.'t.. .28);"|
00008a10  53 65 63 74 3d 22 3b 73  65 63 74 25 3b 0d 27 7e  |Sect=";sect%;.'~|
00008a20  1d f1 20 8a 33 37 29 3b  22 53 69 7a 65 3d 22 3b  |.. .37);"Size=";|
00008a30  73 65 63 74 53 69 7a 65  25 3b 0d 27 88 0b f1 3b  |sectSize%;.'...;|
00008a40  22 3a 2d 22 3b 0d 27 92  05 e1 0d 27 9c 04 0d 27  |":-";.'....'...'|
00008a50  a6 12 dd f2 73 65 63 74  54 65 78 74 28 54 24 29  |....sectText(T$)|
00008a60  0d 27 b0 0f f1 3b 8a 34  37 2c bc 29 3b 54 24 0d  |.'...;.47,.);T$.|
00008a70  27 ba 05 e1 0d 27 c4 04  0d 27 ce 1b dd f2 70 72  |'....'...'....pr|
00008a80  69 6e 74 5f 65 72 72 28  63 6d 64 25 2c 20 61 64  |int_err(cmd%, ad|
00008a90  64 25 29 0d 27 d8 08 ea  20 49 25 0d 27 e2 06 ef  |d%).'... I%.'...|
00008aa0  37 0d 27 ec 16 f2 70 72  69 6e 74 53 72 74 28 22  |7.'...printSrt("|
00008ab0  44 69 73 63 20 22 29 0d  27 f6 29 e7 20 63 6d 64  |Disc ").'.). cmd|
00008ac0  25 3d 56 65 72 69 66 79  25 20 8c 20 f1 22 76 65  |%=Verify% . ."ve|
00008ad0  72 69 66 79 20 73 65 63  74 6f 72 28 73 29 22 3b  |rify sector(s)";|
00008ae0  0d 28 00 25 e7 20 63 6d  64 25 3d 52 65 61 64 25  |.(.%. cmd%=Read%|
00008af0  20 8c 20 f1 22 72 65 61  64 20 73 65 63 74 6f 72  | . ."read sector|
00008b00  28 73 29 22 3b 0d 28 0a  27 e7 20 63 6d 64 25 3d  |(s)";.(.'. cmd%=|
00008b10  57 72 69 74 65 25 20 8c  20 f1 22 77 72 69 74 65  |Write% . ."write|
00008b20  20 73 65 63 74 6f 72 28  73 29 22 3b 0d 28 14 26  | sector(s)";.(.&|
00008b30  e7 20 63 6d 64 25 3d 52  65 61 64 54 72 61 63 6b  |. cmd%=ReadTrack|
00008b40  25 20 8c 20 f1 22 72 65  61 64 20 74 72 61 63 6b  |% . ."read track|
00008b50  22 3b 0d 28 1e 28 e7 20  63 6d 64 25 3d 57 72 69  |";.(.(. cmd%=Wri|
00008b60  74 65 54 72 61 63 6b 25  20 8c 20 f1 22 77 72 69  |teTrack% . ."wri|
00008b70  74 65 20 74 72 61 63 6b  22 3b 0d 28 28 1b e7 20  |te track";.((.. |
00008b80  63 6d 64 25 3d 53 65 65  6b 25 20 8c 20 f1 22 73  |cmd%=Seek% . ."s|
00008b90  65 65 6b 22 3b 0d 28 32  1d e7 20 63 6d 64 25 3d  |eek";.(2.. cmd%=|
00008ba0  52 65 73 74 6f 72 65 25  20 8c 20 f1 22 72 74 7a  |Restore% . ."rtz|
00008bb0  22 3b 0d 28 3c 11 f1 22  20 65 72 72 6f 72 3a 2d  |";.(<.." error:-|
00008bc0  20 22 3b 0d 28 46 08 49  25 3d 34 0d 28 50 0e c8  | ";.(F.I%=4.(P..|
00008bd0  95 20 61 64 64 25 3f 49  25 0d 28 5a 0f 20 20 ef  |. add%?I%.(Z.  .|
00008be0  20 61 64 64 25 3f 49 25  0d 28 64 0d 20 20 49 25  | add%?I%.(d.  I%|
00008bf0  3d 49 25 2b 31 0d 28 6e  05 ce 0d 28 78 05 f1 0d  |=I%+1.(n...(x...|
00008c00  28 82 05 e1 0d 28 8c 04  0d 28 96 5a dd f2 6d 65  |(....(...(.Z..me|
00008c10  6e 75 28 f8 20 63 6f 70  79 64 69 73 63 2c 20 f8  |nu(. copydisc, .|
00008c20  20 73 6f 75 72 63 65 2c  20 f8 20 64 65 73 74 2c  | source, . dest,|
00008c30  20 f8 20 73 72 74 74 72  61 63 6b 2c 20 f8 20 65  | . srttrack, . e|
00008c40  6e 64 74 72 61 63 6b 2c  20 f8 20 66 69 72 73 74  |ndtrack, . first|
00008c50  48 65 61 64 2c 20 f8 20  6e 75 6d 62 48 65 61 64  |Head, . numbHead|
00008c60  73 29 0d 28 a0 07 eb 20  30 0d 28 aa 11 ef 31 39  |s).(... 0.(...19|
00008c70  2c 30 2c 34 2c 30 2c 30  2c 30 0d 28 b4 19 f1 8a  |,0,4,0,0,0.(....|
00008c80  32 38 29 3b 22 57 20 41  20 52 20 4e 20 49 20 4e  |28);"W A R N I N|
00008c90  20 47 22 0d 28 be 52 f1  22 20 20 54 68 69 73 20  | G".(.R."  This |
00008ca0  70 72 6f 67 72 61 6d 20  6d 61 79 20 6f 6e 6c 79  |program may only|
00008cb0  20 62 65 20 75 73 65 64  20 74 6f 20 6d 61 6b 65  | be used to make|
00008cc0  20 61 20 62 61 63 6b 75  70 20 63 6f 70 79 20 6f  | a backup copy o|
00008cd0  66 20 79 6f 75 72 20 6f  77 6e 20 73 6f 66 74 77  |f your own softw|
00008ce0  61 72 65 2e 22 0d 28 c8  52 f1 22 20 20 49 74 20  |are.".(.R."  It |
00008cf0  69 73 20 79 6f 75 72 20  28 74 68 65 20 55 73 65  |is your (the Use|
00008d00  72 27 73 29 20 72 65 73  70 6f 6e 73 69 62 6c 69  |r's) responsibli|
00008d10  74 79 20 74 6f 20 65 6e  73 75 72 65 20 74 68 61  |ty to ensure tha|
00008d20  74 20 61 6e 79 20 73 6f  66 74 77 61 72 65 20 63  |t any software c|
00008d30  6f 70 69 65 64 2c 22 0d  28 d2 30 f1 22 20 20 75  |opied,".(.0."  u|
00008d40  73 69 6e 67 20 74 68 69  73 20 70 72 6f 67 72 61  |sing this progra|
00008d50  6d 2c 20 69 73 20 64 6f  6e 65 20 73 6f 20 6c 65  |m, is done so le|
00008d60  67 61 6c 6c 79 2e 22 0d  28 dc 04 0d 28 e6 27 f1  |gally.".(...(.'.|
00008d70  8a 32 30 2c 36 29 3b 22  44 55 50 3a 2d 20 54 48  |.20,6);"DUP:- TH|
00008d80  45 20 44 49 53 43 20 44  55 50 4c 49 43 41 54 4f  |E DISC DUPLICATO|
00008d90  52 22 0d 28 f0 28 f1 8a  32 30 2c 37 29 3b 22 2d  |R".(.(..20,7);"-|
00008da0  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |----------------|
00008db0  2d 2d 2d 2d 2d 2d 2d 2d  2d 22 0d 28 fa 2c f1 8a  |---------".(.,..|
00008dc0  31 38 2c 38 29 3b 22 28  63 29 20 53 6f 66 74 63  |18,8);"(c) Softc|
00008dd0  6f 72 6e 20 20 20 20 56  65 72 73 69 6f 6e 20 22  |orn    Version "|
00008de0  3b 76 65 72 73 24 0d 29  04 04 0d 29 0e 0d 63 6f  |;vers$.)...)..co|
00008df0  70 79 73 65 6c 3d 31 0d  29 18 0f 63 6f 70 79 56  |pysel=1.)..copyV|
00008e00  70 6f 73 3d 31 30 0d 29  22 12 f1 8a 30 2c 63 6f  |pos=10.)"...0,co|
00008e10  70 79 56 70 6f 73 29 3b  0d 29 2c 34 f1 8a 31 30  |pyVpos);.),4..10|
00008e20  29 3b 22 20 31 2e 20 43  6f 70 79 20 66 75 6c 6c  |);" 1. Copy full|
00008e30  20 64 6f 75 62 6c 65 2d  73 69 64 65 64 20 38 30  | double-sided 80|
00008e40  20 74 72 61 63 6b 20 64  69 73 63 22 0d 29 36 34  | track disc".)64|
00008e50  f1 8a 31 30 29 3b 22 20  32 2e 20 43 6f 70 79 20  |..10);" 2. Copy |
00008e60  66 75 6c 6c 20 73 69 6e  67 6c 65 2d 73 69 64 65  |full single-side|
00008e70  64 20 38 30 20 74 72 61  63 6b 20 64 69 73 63 22  |d 80 track disc"|
00008e80  0d 29 40 2b f1 8a 31 30  29 3b 22 20 33 2e 20 43  |.)@+..10);" 3. C|
00008e90  6f 70 79 20 73 65 6c 65  63 74 65 64 20 70 6f 72  |opy selected por|
00008ea0  74 69 6f 6e 73 20 6f 6e  6c 79 22 0d 29 4a 04 0d  |tions only".)J..|
00008eb0  29 54 0f 61 6e 61 6c 56  70 6f 73 3d 31 34 0d 29  |)T.analVpos=14.)|
00008ec0  5e 12 f1 8a 30 2c 61 6e  61 6c 56 70 6f 73 29 3b  |^...0,analVpos);|
00008ed0  0d 29 68 37 f1 8a 31 30  29 3b 22 20 34 2e 20 41  |.)h7..10);" 4. A|
00008ee0  6e 61 6c 79 73 65 20 66  75 6c 6c 20 64 6f 75 62  |nalyse full doub|
00008ef0  6c 65 2d 73 69 64 65 64  20 38 30 20 74 72 61 63  |le-sided 80 trac|
00008f00  6b 20 64 69 73 63 22 0d  29 72 37 f1 8a 31 30 29  |k disc".)r7..10)|
00008f10  3b 22 20 35 2e 20 41 6e  61 6c 79 73 65 20 66 75  |;" 5. Analyse fu|
00008f20  6c 6c 20 73 69 6e 67 6c  65 2d 73 69 64 65 64 20  |ll single-sided |
00008f30  38 30 20 74 72 61 63 6b  20 64 69 73 63 22 0d 29  |80 track disc".)|
00008f40  7c 2e f1 8a 31 30 29 3b  22 20 36 2e 20 41 6e 61  ||...10);" 6. Ana|
00008f50  6c 79 73 65 20 73 65 6c  65 63 74 65 64 20 70 6f  |lyse selected po|
00008f60  72 74 69 6f 6e 73 20 6f  6e 6c 79 22 0d 29 86 04  |rtions only".)..|
00008f70  0d 29 90 0c 64 72 76 73  65 6c 3d 37 0d 29 9a 0e  |.)..drvsel=7.)..|
00008f80  64 72 76 56 70 6f 73 3d  31 38 0d 29 a4 11 f1 8a  |drvVpos=18.)....|
00008f90  30 2c 64 72 76 56 70 6f  73 29 3b 0d 29 ae 22 f1  |0,drvVpos);.).".|
00008fa0  8a 31 30 29 3b 22 20 37  2e 20 55 73 69 6e 67 20  |.10);" 7. Using |
00008fb0  6a 75 73 74 20 64 72 69  76 65 20 30 22 0d 29 b8  |just drive 0".).|
00008fc0  22 f1 8a 31 30 29 3b 22  20 38 2e 20 55 73 69 6e  |"..10);" 8. Usin|
00008fd0  67 20 6a 75 73 74 20 64  72 69 76 65 20 31 22 0d  |g just drive 1".|
00008fe0  29 c2 27 f1 8a 31 30 29  3b 22 20 39 2e 20 46 72  |).'..10);" 9. Fr|
00008ff0  6f 6d 20 64 72 69 76 65  20 30 20 54 6f 20 64 72  |om drive 0 To dr|
00009000  69 76 65 20 31 22 0d 29  cc 27 f1 8a 31 30 29 3b  |ive 1".).'..10);|
00009010  22 31 30 2e 20 46 72 6f  6d 20 64 72 69 76 65 20  |"10. From drive |
00009020  31 20 54 6f 20 64 72 69  76 65 20 30 22 0d 29 d6  |1 To drive 0".).|
00009030  04 0d 29 e0 0d 67 6f 56  70 6f 73 3d 32 33 0d 29  |..)..goVpos=23.)|
00009040  ea 10 f1 8a 30 2c 67 6f  56 70 6f 73 29 3b 0d 29  |....0,goVpos);.)|
00009050  f4 15 f1 8a 31 30 29 3b  22 31 31 2e 20 44 4f 20  |....10);"11. DO |
00009060  3a 2d 22 0d 29 fe 04 0d  2a 08 0e 73 65 6c 56 70  |:-".)...*..selVp|
00009070  6f 73 3d 32 36 0d 2a 12  0f 65 78 69 74 4d 65 6e  |os=26.*..exitMen|
00009080  75 25 3d a3 0d 2a 1c 0c  73 65 6c 65 63 74 3d 30  |u%=..*..select=0|
00009090  0d 2a 26 05 f5 0d 2a 30  1d e7 20 73 65 6c 65 63  |.*&...*0.. selec|
000090a0  74 3d 31 31 20 8c 20 65  78 69 74 4d 65 6e 75 25  |t=11 . exitMenu%|
000090b0  3d b9 0d 2a 3a 1a 63 6f  70 79 64 69 73 63 3d 28  |=..*:.copydisc=(|
000090c0  63 6f 70 79 73 65 6c 20  3c 3d 33 29 0d 2a 44 1f  |copysel <=3).*D.|
000090d0  e7 20 63 6f 70 79 73 65  6c 3c 3e 33 20 80 20 63  |. copysel<>3 . c|
000090e0  6f 70 79 73 65 6c 3c 3e  36 20 8c 0d 2a 4e 10 20  |opysel<>6 ..*N. |
000090f0  20 73 72 74 74 72 61 63  6b 3d 30 0d 2a 58 11 20  | srttrack=0.*X. |
00009100  20 65 6e 64 74 72 61 63  6b 3d 37 39 0d 2a 62 11  | endtrack=79.*b.|
00009110  20 20 66 69 72 73 74 48  65 61 64 3d 30 0d 2a 6c  |  firstHead=0.*l|
00009120  1f 20 20 e7 20 63 6f 70  79 73 65 6c 3d 31 20 84  |.  . copysel=1 .|
00009130  20 63 6f 70 79 73 65 6c  3d 34 20 8c 0d 2a 76 13  | copysel=4 ..*v.|
00009140  20 20 20 20 6e 75 6d 62  48 65 61 64 73 3d 32 0d  |    numbHeads=2.|
00009150  2a 80 07 20 20 cc 0d 2a  8a 13 20 20 20 20 6e 75  |*..  ..*..    nu|
00009160  6d 62 48 65 61 64 73 3d  31 0d 2a 94 07 20 20 cd  |mbHeads=1.*..  .|
00009170  0d 2a 9e 05 cd 0d 2a a8  1b e7 20 64 72 76 73 65  |.*....*... drvse|
00009180  6c 3d 37 20 84 20 64 72  76 73 65 6c 3d 39 20 8c  |l=7 . drvsel=9 .|
00009190  0d 2a b2 0e 20 20 73 6f  75 72 63 65 3d 30 0d 2a  |.*..  source=0.*|
000091a0  bc 05 cc 0d 2a c6 0e 20  20 73 6f 75 72 63 65 3d  |....*..  source=|
000091b0  31 0d 2a d0 05 cd 0d 2a  da 1c e7 20 64 72 76 73  |1.*....*... drvs|
000091c0  65 6c 3d 37 20 84 20 64  72 76 73 65 6c 3d 31 30  |el=7 . drvsel=10|
000091d0  20 8c 0d 2a e4 0c 20 20  64 65 73 74 3d 30 0d 2a  | ..*..  dest=0.*|
000091e0  ee 05 cc 0d 2a f8 0c 20  20 64 65 73 74 3d 31 0d  |....*..  dest=1.|
000091f0  2b 02 05 cd 0d 2b 0c 1c  20 20 e3 20 49 25 3d 63  |+....+..  . I%=c|
00009200  6f 70 79 56 70 6f 73 20  b8 20 67 6f 56 70 6f 73  |opyVpos . goVpos|
00009210  0d 2b 16 13 20 20 20 20  f1 8a 38 2c 49 25 29 3b  |.+..    ..8,I%);|
00009220  22 20 22 0d 2b 20 07 20  20 ed 0d 2b 2a 15 20 20  |" ".+ .  ..+*.  |
00009230  e7 20 63 6f 70 79 73 65  6c 20 3c 3d 33 20 8c 0d  |. copysel <=3 ..|
00009240  2b 34 23 20 20 20 20 f1  8a 38 2c 63 6f 70 79 56  |+4#    ..8,copyV|
00009250  70 6f 73 2b 63 6f 70 79  73 65 6c 2d 31 29 3b 22  |pos+copysel-1);"|
00009260  2a 22 0d 2b 3e 21 20 20  20 20 f1 8a 38 2c 64 72  |*".+>!    ..8,dr|
00009270  76 56 70 6f 73 2b 64 72  76 73 65 6c 2d 37 29 3b  |vVpos+drvsel-7);|
00009280  22 2a 22 0d 2b 48 38 20  20 20 20 f1 8a 32 30 2c  |"*".+H8    ..20,|
00009290  67 6f 56 70 6f 73 29 3b  22 2a 2a 20 43 6f 70 79  |goVpos);"** Copy|
000092a0  20 66 72 6f 6d 20 22 3b  73 6f 75 72 63 65 3b 22  | from ";source;"|
000092b0  20 74 6f 20 22 3b 64 65  73 74 3b 0d 2b 52 07 20  | to ";dest;.+R. |
000092c0  20 cc 0d 2b 5c 23 20 20  20 20 f1 8a 38 2c 61 6e  | ..+\#    ..8,an|
000092d0  61 6c 56 70 6f 73 2b 63  6f 70 79 73 65 6c 2d 34  |alVpos+copysel-4|
000092e0  29 3b 22 2a 22 0d 2b 66  29 20 20 20 20 f1 8a 38  |);"*".+f)    ..8|
000092f0  2c 64 72 76 56 70 6f 73  2b 28 31 20 80 20 28 64  |,drvVpos+(1 . (d|
00009300  72 76 73 65 6c 2d 37 29  29 29 3b 22 2a 22 0d 2b  |rvsel-7)));"*".+|
00009310  70 2a 20 20 20 20 f1 8a  32 30 2c 67 6f 56 70 6f  |p*    ..20,goVpo|
00009320  73 29 3b 22 2a 2a 20 41  6e 61 6c 79 73 65 20 22  |s);"** Analyse "|
00009330  3b 73 6f 75 72 63 65 3b  0d 2b 7a 07 20 20 cd 0d  |;source;.+z.  ..|
00009340  2b 84 2a 20 20 f1 3b 22  2c 20 54 72 61 63 6b 73  |+.*  .;", Tracks|
00009350  20 22 3b 73 72 74 74 72  61 63 6b 3b 22 2d 22 3b  | ";srttrack;"-";|
00009360  65 6e 64 74 72 61 63 6b  3b 0d 2b 8e 15 20 20 e7  |endtrack;.+..  .|
00009370  20 6e 75 6d 62 48 65 61  64 73 3d 32 20 8c 0d 2b  | numbHeads=2 ..+|
00009380  98 1c 20 20 20 20 f1 3b  22 2c 20 62 6f 74 68 20  |..    .;", both |
00009390  73 69 64 65 73 20 2a 2a  22 3b 0d 2b a2 07 20 20  |sides **";.+..  |
000093a0  cc 0d 2b ac 29 20 20 20  20 f1 3b 22 2c 20 73 69  |..+.)    .;", si|
000093b0  64 65 20 22 3b 66 69 72  73 74 48 65 61 64 3b 22  |de ";firstHead;"|
000093c0  20 6f 6e 6c 79 20 2a 2a  22 3b 0d 2b b6 07 20 20  | only **";.+..  |
000093d0  cd 0d 2b c0 14 20 20 f1  3b c4 28 37 38 2d b1 29  |..+..  .;.(78-.)|
000093e0  2c 22 20 22 29 0d 2b ca  1c 20 20 f1 8a 30 2c 73  |," ").+..  ..0,s|
000093f0  65 6c 56 70 6f 73 29 3b  c4 37 38 2c 22 20 22 29  |elVpos);.78," ")|
00009400  3b 0d 2b d4 15 20 20 e7  20 ac 20 65 78 69 74 4d  |;.+..  . . exitM|
00009410  65 6e 75 25 20 8c 0d 2b  de 20 20 20 20 20 f1 8a  |enu% ..+.     ..|
00009420  32 30 2c 73 65 6c 56 70  6f 73 29 3b 22 53 45 4c  |20,selVpos);"SEL|
00009430  45 43 54 20 22 3b 0d 2b  e8 10 20 20 20 20 e8 20  |ECT ";.+..    . |
00009440  73 65 6c 65 63 74 0d 2b  f2 21 20 20 20 20 e7 20  |select.+.!    . |
00009450  73 65 6c 65 63 74 3d 39  39 39 20 8c 20 f2 64 69  |select=999 . .di|
00009460  73 70 50 72 6f 63 73 0d  2b fc 35 20 20 20 20 e7  |spProcs.+.5    .|
00009470  20 28 73 65 6c 65 63 74  3e 3d 31 29 20 80 20 28  | (select>=1) . (|
00009480  73 65 6c 65 63 74 20 3c  3d 36 29 20 8c 20 63 6f  |select <=6) . co|
00009490  70 79 73 65 6c 3d 73 65  6c 65 63 74 0d 2c 06 35  |pysel=select.,.5|
000094a0  20 20 20 20 e7 20 28 73  65 6c 65 63 74 3e 3d 37  |    . (select>=7|
000094b0  29 20 80 20 28 73 65 6c  65 63 74 20 3c 3d 31 30  |) . (select <=10|
000094c0  29 20 8c 20 64 72 76 73  65 6c 3d 73 65 6c 65 63  |) . drvsel=selec|
000094d0  74 0d 2c 10 25 20 20 20  20 e7 20 28 73 65 6c 65  |t.,.%    . (sele|
000094e0  63 74 3d 33 29 20 84 20  28 73 65 6c 65 63 74 20  |ct=3) . (select |
000094f0  3d 20 36 29 20 8c 0d 2c  1a 40 20 20 20 20 20 20  |= 6) ..,.@      |
00009500  f2 67 65 74 53 65 6c 65  63 74 69 76 65 28 22 46  |.getSelective("F|
00009510  69 72 73 74 20 54 72 61  63 6b 22 2c 20 73 65 6c  |irst Track", sel|
00009520  56 70 6f 73 2c 20 73 72  74 74 72 61 63 6b 2c 20  |Vpos, srttrack, |
00009530  30 2c 20 37 39 29 0d 2c  24 1a 20 20 20 20 20 20  |0, 79).,$.      |
00009540  e7 20 73 72 74 74 72 61  63 6b 3c 3e 37 39 20 8c  |. srttrack<>79 .|
00009550  0d 2c 2e 46 20 20 20 20  20 20 20 f2 67 65 74 53  |.,.F       .getS|
00009560  65 6c 65 63 74 69 76 65  28 22 4c 61 73 74 20 54  |elective("Last T|
00009570  72 61 63 6b 22 2c 73 65  6c 56 70 6f 73 2c 20 65  |rack",selVpos, e|
00009580  6e 64 74 72 61 63 6b 2c  20 73 72 74 74 72 61 63  |ndtrack, srttrac|
00009590  6b 2c 20 37 39 29 0d 2c  38 0b 20 20 20 20 20 20  |k, 79).,8.      |
000095a0  cd 0d 2c 42 44 20 20 20  20 20 20 f2 67 65 74 53  |..,BD      .getS|
000095b0  65 6c 65 63 74 69 76 65  28 22 4e 75 6d 62 65 72  |elective("Number|
000095c0  20 6f 66 20 73 69 64 65  73 22 2c 20 73 65 6c 56  | of sides", selV|
000095d0  70 6f 73 2c 20 6e 75 6d  62 48 65 61 64 73 2c 20  |pos, numbHeads, |
000095e0  31 2c 20 32 29 0d 2c 4c  19 20 20 20 20 20 20 e7  |1, 2).,L.      .|
000095f0  20 6e 75 6d 62 48 65 61  64 73 3d 31 20 8c 0d 2c  | numbHeads=1 ..,|
00009600  56 3a 20 20 20 20 20 20  20 f2 67 65 74 53 65 6c  |V:       .getSel|
00009610  65 63 74 69 76 65 28 22  53 69 64 65 22 2c 20 73  |ective("Side", s|
00009620  65 6c 56 70 6f 73 2c 20  66 69 72 73 74 48 65 61  |elVpos, firstHea|
00009630  64 2c 20 30 2c 20 31 29  0d 2c 60 0b 20 20 20 20  |d, 0, 1).,`.    |
00009640  20 20 cd 0d 2c 6a 09 20  20 20 20 cd 0d 2c 74 07  |  ..,j.    ..,t.|
00009650  20 20 cd 0d 2c 7e 0f fd  20 65 78 69 74 4d 65 6e  |  ..,~.. exitMen|
00009660  75 25 0d 2c 88 12 f1 8a  30 2c 67 6f 56 70 6f 73  |u%.,....0,goVpos|
00009670  2b 32 29 3b 0d 2c 92 05  e1 0d 2c 9c 04 0d 2c a6  |+2);.,....,...,.|
00009680  32 dd f2 67 65 74 53 65  6c 65 63 74 69 76 65 28  |2..getSelective(|
00009690  54 24 2c 20 76 70 6f 73  2c 20 f8 20 76 61 6c 75  |T$, vpos, . valu|
000096a0  65 25 2c 20 6d 69 6e 25  2c 20 6d 61 78 25 29 0d  |e%, min%, max%).|
000096b0  2c b0 05 f5 0d 2c ba 19  20 20 f1 8a 30 2c 76 70  |,....,..  ..0,vp|
000096c0  6f 73 29 3b c4 37 38 2c  22 20 22 29 3b 0d 2c c4  |os);.78," ");.,.|
000096d0  2c 20 20 f1 8a 31 38 2c  76 70 6f 73 29 3b 54 24  |,  ..18,vpos);T$|
000096e0  3b 22 20 28 22 3b 6d 69  6e 25 3b 22 2d 22 3b 6d  |;" (";min%;"-";m|
000096f0  61 78 25 3b 22 29 20 22  3b 0d 2c ce 0e 20 20 e8  |ax%;") ";.,..  .|
00009700  20 76 61 6c 75 65 25 0d  2c d8 2b 20 20 e7 20 28  | value%.,.+  . (|
00009710  76 61 6c 75 65 25 3c 6d  69 6e 25 29 20 84 20 28  |value%<min%) . (|
00009720  76 61 6c 75 65 25 3e 6d  61 78 25 29 20 8c 20 ef  |value%>max%) . .|
00009730  20 37 0d 2c e2 29 fd 20  28 76 61 6c 75 65 25 20  | 7.,.). (value% |
00009740  3e 3d 20 6d 69 6e 25 29  20 80 20 28 76 61 6c 75  |>= min%) . (valu|
00009750  65 25 20 3c 3d 20 6d 61  78 25 29 0d 2c ec 05 e1  |e% <= max%).,...|
00009760  0d 2c f6 04 0d 2d 00 0f  dd f2 64 69 73 70 50 72  |.,...-....dispPr|
00009770  6f 63 73 0d 2d 0a 05 f1  0d 2d 14 38 f1 22 20 4f  |ocs.-....-.8." O|
00009780  6e 20 61 20 73 69 6e 67  6c 65 20 64 72 69 76 65  |n a single drive|
00009790  2c 20 61 20 64 69 73 63  20 63 68 61 6e 67 65 20  |, a disc change |
000097a0  69 73 20 6e 65 65 64 65  64 20 65 76 65 72 79 22  |is needed every"|
000097b0  0d 2d 1e 34 f1 22 20 20  20 22 3b a8 28 4d 61 78  |.-.4."   ";.(Max|
000097c0  54 72 6b 73 25 2f 32 29  3b 22 20 74 72 61 63 6b  |Trks%/2);" track|
000097d0  73 20 28 64 6f 75 62 6c  65 20 73 69 64 65 64 29  |s (double sided)|
000097e0  2c 20 22 3b 0d 2d 28 28  f1 20 3b 4d 61 78 54 72  |, ";.-((. ;MaxTr|
000097f0  6b 73 25 3b 22 20 74 72  61 63 6b 73 20 28 73 69  |ks%;" tracks (si|
00009800  6e 67 6c 65 20 73 69 64  65 64 29 22 0d 2d 32 05  |ngle sided)".-2.|
00009810  f1 0d 2d 3c 21 f1 22 20  54 72 79 20 28 26 20 66  |..-<!." Try (& f|
00009820  31 20 74 6f 20 76 69 65  77 20 72 65 73 75 6c 74  |1 to view result|
00009830  29 22 0d 2d 46 5e f1 22  50 52 4f 43 72 65 61 64  |)".-F^."PROCread|
00009840  73 65 63 74 6f 72 73 28  64 72 69 76 65 2c 20 74  |sectors(drive, t|
00009850  72 61 63 6b 2c 20 68 65  61 64 2c 20 73 65 63 74  |rack, head, sect|
00009860  6f 72 2c 20 6e 75 6d 62  53 65 63 74 2c 20 73 65  |or, numbSect, se|
00009870  63 74 53 69 7a 65 2c 64  65 6e 73 69 74 79 2c 20  |ctSize,density, |
00009880  22 3b 4d 61 69 6e 42 75  66 66 65 72 25 22 29 22  |";MainBuffer%")"|
00009890  0d 2d 50 43 f1 22 50 52  4f 43 72 65 61 64 74 72  |.-PC."PROCreadtr|
000098a0  61 63 6b 20 28 64 72 69  76 65 2c 20 74 72 61 63  |ack (drive, trac|
000098b0  6b 2c 20 68 65 61 64 2c  20 64 65 6e 73 69 74 79  |k, head, density|
000098c0  2c 20 22 3b 4d 61 69 6e  42 75 66 66 65 72 25 22  |, ";MainBuffer%"|
000098d0  20 29 22 0d 2d 5a 4a f1  22 50 52 4f 43 72 65 61  | )".-ZJ."PROCrea|
000098e0  64 53 69 6e 67 6c 65 54  72 6b 28 64 72 69 76 65  |dSingleTrk(drive|
000098f0  2c 20 74 72 61 63 6b 2c  20 68 65 61 64 2c 20 22  |, track, head, "|
00009900  3b 4d 61 69 6e 42 75 66  66 65 72 25 22 2c 20 73  |;MainBuffer%", s|
00009910  72 74 44 65 6e 73 69 74  79 25 20 29 22 0d 2d 64  |rtDensity% )".-d|
00009920  3b 61 6e 61 6c 79 73 65  3d 64 65 62 75 67 20 3a  |;analyse=debug :|
00009930  f4 20 6f 6e 6c 79 20 66  6f 72 20 75 73 65 20 6f  |. only for use o|
00009940  66 20 74 79 70 65 64 20  50 52 4f 43 73 20 61 66  |f typed PROCs af|
00009950  74 65 72 20 65 78 69 74  0d 2d 6e 05 e0 0d 2d 78  |ter exit.-n...-x|
00009960  05 e1 0d 2d 82 04 0d 2d  8c 0b dd 20 f2 6c 6f 67  |...-...-... .log|
00009970  6f 0d 2d 96 07 eb 20 37  0d 2d a0 06 f1 27 0d 2d  |o.-... 7.-...'.-|
00009980  aa 30 f1 22 93 9a 20 20  20 20 20 20 20 20 20 20  |.0."..          |
00009990  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000099a0  20 70 20 20 20 20 20 20  20 20 20 20 22 3b 0d 2d  | p          ";.-|
000099b0  b4 30 f1 22 93 9a 20 20  20 20 20 20 20 20 20 20  |.0."..          |
000099c0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 70 7c  |              p||
000099d0  ff ff ff 7c 70 20 20 20  20 20 20 20 22 3b 0d 2d  |...|p       ";.-|
000099e0  be 30 f1 22 93 9a 20 20  20 20 20 20 20 20 20 20  |.0."..          |
000099f0  20 20 20 20 20 20 20 20  20 20 20 20 20 7a 3f ff  |             z?.|
00009a00  ff 6f ff ff ff ff 74 20  20 20 20 20 22 3b 0d 2d  |.o....t     ";.-|
00009a10  c8 31 f1 22 93 9a 20 20  20 20 20 20 20 20 20 20  |.1."..          |
00009a20  20 20 20 20 20 20 20 20  20 20 20 20 5f ff ff 26  |            _..&|
00009a30  60 22 22 6f ff ff ff ff  7d 30 20 20 20 22 3b 0d  |`""o....}0   ";.|
00009a40  2d d2 30 f1 22 93 9a 20  20 20 20 20 20 20 20 20  |-.0."..         |
00009a50  20 20 20 20 20 20 20 20  20 20 20 20 20 68 36 3f  |             h6?|
00009a60  20 20 20 20 6f ff ff ff  ff ff 34 20 20 22 3b 0d  |    o.....4  ";.|
00009a70  2d dc 30 f1 22 93 9a 78  7c 7c 30 5f 7c 7c 30 7c  |-.0."..x||0_||0||
00009a80  7c 7c 7c 7c 7c 5f 7c 7c  30 20 20 5f 70 32 25 61  ||||||_||0  _p2%a|
00009a90  70 70 20 20 80 7c 7c 7c  30 7c 30 20 7c 22 3b 0d  |pp  .|||0|0 |";.|
00009aa0  2d e6 30 f1 22 93 9a ff  31 2b 25 ff 27 2b ff ff  |-.0."...1+%.'+..|
00009ab0  60 60 60 ff 60 ff 27 2b  ff 20 35 ff ff ff ff ff  |```.`.'+. 5.....|
00009ac0  ff ff 35 35 20 ff 60 6b  35 ff 7d 9a ff 22 3b 0d  |..55 .`k5.}..";.|
00009ad0  2d f0 30 f1 22 93 9a 2b  ff 7d 30 ff 20 20 ff ff  |-.0."..+.}0.  ..|
00009ae0  ff ff 20 ff 20 ff 20 20  20 2c 35 ff ff ff ff ff  |.. . .   ,5.....|
00009af0  ff ff 35 3d 24 ff 7c 7e  25 ff 6f 75 ff 22 3b 0d  |..5=$.|~%.ou.";.|
00009b00  2d fa 31 f1 22 93 9a 70  20 6b ff ff 30 5f ff ff  |-.1."..p k..0_..|
00009b10  20 20 20 ff 20 ff 30 5f  7c 20 35 ff ff ff ff ff  |   . .0_| 5.....|
00009b20  ff ff 35 35 20 ff 2b 7d  20 ff 22 22 ff ff 22 3b  |..55 .+} .""..";|
00009b30  0d 2e 04 31 f1 22 93 9a  6f ff ff 25 2b ff ff 27  |...1."..o..%+..'|
00009b40  ff 20 20 20 ff 20 2b ff  ff 27 20 20 22 22 60 63  |.   . +..'  ""`c|
00009b50  2c 6c 74 60 20 20 20 ff  20 6b 75 ff 20 2a ff 22  |,lt`   . ku. *."|
00009b60  3b 0d 2e 0e 31 f1 22 93  9a 20 20 20 20 20 20 20  |;...1."..       |
00009b70  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 22  |               "|
00009b80  22 6f 35 ff 75 20 20 20  38 7c 7c 7c 7c 7c 7c 20  |"o5.u   8|||||| |
00009b90  22 3b 0d 2e 18 30 f1 22  93 9a 20 20 20 20 20 20  |";...0."..      |
00009ba0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00009bb0  20 20 6a ff 3f 79 70 7e  ff ff ff ff ff ff ff 20  |  j.?yp~....... |
00009bc0  22 3b 0d 2e 22 30 f1 22  93 9a 20 20 20 20 20 20  |";.."0."..      |
00009bd0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00009be0  20 20 20 6f ff ff ff ff  ff ff ff ff ff ff ff 20  |   o........... |
00009bf0  22 3b 0d 2e 2c 30 f1 22  93 9a 20 20 20 20 20 20  |";..,0."..      |
00009c00  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00009c10  20 20 20 20 60 2f ff ff  ff ff ff ff ff 3f 21 20  |    `/.......?! |
00009c20  22 3b 0d 2e 36 1f f1 22  20 44 55 50 20 74 68 65  |";..6.." DUP the|
00009c30  20 44 69 73 63 20 44 75  70 6c 69 63 61 74 6f 72  | Disc Duplicator|
00009c40  22 0d 2e 40 35 f1 27 27  27 27 27 22 28 70 75 62  |"..@5.'''''"(pub|
00009c50  6c 69 63 20 64 6f 6d 61  69 6e 20 73 2f 77 2c 20  |lic domain s/w, |
00009c60  6e 6f 20 70 72 6f 66 69  74 20 62 61 73 65 64 20  |no profit based |
00009c70  75 73 65 29 22 3b 0d 2e  4a 0d 54 25 3d a6 28 35  |use)";..J.T%=.(5|
00009c80  30 30 29 0d 2e 54 05 e1  0d 2e 5e 04 0d 2e 68 0a  |00)..T....^...h.|
00009c90  dd f2 69 6e 69 74 0d 2e  72 42 4d 61 78 54 72 6b  |..init..rBMaxTrk|
00009ca0  55 6e 66 6f 72 6d 61 74  25 20 3d 20 34 2a a8 28  |Unformat% = 4*.(|
00009cb0  28 36 32 35 30 2a 31 2e  30 33 29 2f 34 29 20 20  |(6250*1.03)/4)  |
00009cc0  3a f4 20 45 78 61 63 74  20 6e 75 6d 62 65 72 20  |:. Exact number |
00009cd0  6f 66 20 57 6f 72 64 73  0d 2e 7c 11 4d 61 78 53  |of Words..|.MaxS|
00009ce0  65 63 74 25 3d 31 30 32  34 0d 2e 86 2c 54 72 6b  |ect%=1024...,Trk|
00009cf0  44 61 74 61 53 69 7a 65  25 3d 4d 61 78 54 72 6b  |DataSize%=MaxTrk|
00009d00  55 6e 66 6f 72 6d 61 74  25 2b 4d 61 78 53 65 63  |Unformat%+MaxSec|
00009d10  74 25 2b 36 34 0d 2e 90  41 54 72 6b 44 65 73 63  |t%+64...ATrkDesc|
00009d20  53 69 7a 65 25 3d a4 69  6e 69 74 42 75 66 6f 66  |Size%=.initBufof|
00009d30  66 73 65 74 73 20 20 20  20 20 20 20 20 20 3a f4  |fsets         :.|
00009d40  20 65 78 61 63 74 20 6e  75 6d 62 65 72 20 6f 66  | exact number of|
00009d50  20 57 6f 72 64 73 0d 2e  9a 04 0d 2e a4 12 de 20  | Words......... |
00009d60  64 69 73 63 52 65 63 25  20 31 30 30 0d 2e ae 24  |discRec% 100...$|
00009d70  de 20 6d 65 6d 41 64 64  4c 69 73 74 25 20 6d 61  |. memAddList% ma|
00009d80  78 53 65 63 74 73 41 6c  6c 6f 77 65 64 25 2a 38  |xSectsAllowed%*8|
00009d90  0d 2e b8 04 0d 2e c2 42  f4 20 6d 61 70 49 44 25  |.......B. mapID%|
00009da0  20 68 6f 6c 64 73 20 49  44 20 6d 61 70 20 64 65  | holds ID map de|
00009db0  73 63 72 69 70 74 6f 72  73 20 28 73 65 65 20 65  |scriptors (see e|
00009dc0  6e 64 20 6f 66 20 70 72  6f 67 20 66 6f 72 20 66  |nd of prog for f|
00009dd0  6f 72 6d 61 74 29 0d 2e  cc 13 de 20 6d 61 70 49  |ormat)..... mapI|
00009de0  44 25 20 26 31 32 30 30  30 0d 2e d6 3b ff 28 22  |D% &12000...;.("|
00009df0  2a 4c 6f 61 64 20 44 75  70 49 44 6d 61 70 20 22  |*Load DupIDmap "|
00009e00  2b c3 7e 6d 61 70 49 44  25 29 20 3a f4 20 67 65  |+.~mapID%) :. ge|
00009e10  6e 65 72 61 74 65 64 20  62 79 20 44 75 70 49 44  |nerated by DupID|
00009e20  74 65 73 74 0d 2e e0 04  0d 2e ea 31 f4 20 70 75  |test.......1. pu|
00009e30  74 20 61 6c 6c 20 6f 74  68 65 72 20 44 49 4d 73  |t all other DIMs|
00009e40  20 62 65 66 6f 72 65 20  68 65 72 65 20 65 78 63  | before here exc|
00009e50  65 70 74 20 63 6f 64 65  25 0d 2e f4 14 6c 65 61  |ept code%....lea|
00009e60  76 65 53 70 61 72 65 3d  31 30 30 30 30 0d 2e fe  |veSpare=10000...|
00009e70  0e de 20 64 75 6d 6d 79  25 20 31 0d 2f 08 44 62  |.. dummy% 1./.Db|
00009e80  75 66 66 65 72 73 69 7a  65 3d 34 2a a8 28 28 93  |uffersize=4*.((.|
00009e90  2d 64 75 6d 6d 79 25 2d  6c 65 61 76 65 53 70 61  |-dummy%-leaveSpa|
00009ea0  72 65 29 2f 34 29 20 3a  f4 20 45 78 61 63 74 20  |re)/4) :. Exact |
00009eb0  6e 75 6d 62 65 72 20 6f  66 20 57 6f 72 64 73 0d  |number of Words.|
00009ec0  2f 12 20 de 20 4d 61 69  6e 42 75 66 66 65 72 25  |/. . MainBuffer%|
00009ed0  20 62 75 66 66 65 72 73  69 7a 65 20 2b 31 36 0d  | buffersize +16.|
00009ee0  2f 1c 4a 4d 61 69 6e 42  75 66 66 65 72 25 3d 31  |/.JMainBuffer%=1|
00009ef0  36 2a a8 28 28 4d 61 69  6e 42 75 66 66 65 72 25  |6*.((MainBuffer%|
00009f00  20 2b 31 35 29 2f 31 36  29 3a f4 20 6f 6e 20 31  | +15)/16):. on 1|
00009f10  36 20 62 79 74 65 20 62  6f 75 6e 64 61 72 79 20  |6 byte boundary |
00009f20  66 6f 72 20 64 65 62 75  67 0d 2f 26 04 0d 2f 30  |for debug./&../0|
00009f30  39 4d 61 78 54 72 6b 73  25 3d 20 a8 28 62 75 66  |9MaxTrks%= .(buf|
00009f40  66 65 72 73 69 7a 65 2f  28 54 72 6b 44 61 74 61  |fersize/(TrkData|
00009f50  53 69 7a 65 25 20 2b 20  54 72 6b 44 65 73 63 53  |Size% + TrkDescS|
00009f60  69 7a 65 25 29 29 0d 2f  3a 47 4d 61 78 54 72 6b  |ize%))./:GMaxTrk|
00009f70  73 25 20 2d 3d 20 33 20  3a f4 20 66 6f 72 20 73  |s% -= 3 :. for s|
00009f80  61 66 65 74 79 20 63 6f  73 20 52 65 61 64 54 72  |afety cos ReadTr|
00009f90  6b 20 73 6f 6d 65 74 69  6d 65 73 20 72 75 6e 73  |k sometimes runs|
00009fa0  20 66 6f 72 20 74 6f 6f  20 6c 6f 6e 67 0d 2f 44  | for too long./D|
00009fb0  04 0d 2f 4e 49 57 72 69  74 65 54 72 6b 42 75 66  |../NIWriteTrkBuf|
00009fc0  25 3d 4d 61 69 6e 42 75  66 66 65 72 25 2b 62 75  |%=MainBuffer%+bu|
00009fd0  66 66 65 72 73 69 7a 65  2d 54 72 6b 44 61 74 61  |ffersize-TrkData|
00009fe0  53 69 7a 65 25 20 3a f4  20 75 73 65 20 6f 76 65  |Size% :. use ove|
00009ff0  72 66 6c 6f 77 20 61 72  65 61 0d 2f 58 04 0d 2f  |rflow area./X../|
0000a000  62 13 63 6f 64 65 6c 65  6e 67 74 68 3d 31 30 30  |b.codelength=100|
0000a010  30 0d 2f 6c 43 de 20 63  6f 64 65 25 20 63 6f 64  |0./lC. code% cod|
0000a020  65 6c 65 6e 67 74 68 20  20 3a f4 20 6d 75 73 74  |elength  :. must|
0000a030  20 62 65 20 6c 61 73 74  20 44 49 4d 20 74 6f 20  | be last DIM to |
0000a040  65 6e 73 75 72 65 73 20  63 6f 64 65 25 3e 20 26  |ensures code%> &|
0000a050  46 46 46 46 0d 2f 76 3e  20 20 20 20 20 20 20 20  |FFFF./v>        |
0000a060  20 20 20 20 20 20 20 20  20 20 20 20 20 20 3a f4  |              :.|
0000a070  20 63 6f 73 20 6f 66 20  42 42 43 20 42 41 53 49  | cos of BBC BASI|
0000a080  43 20 28 36 35 30 32 29  20 65 6d 75 6c 61 74 69  |C (6502) emulati|
0000a090  6f 6e 0d 2f 80 0d 56 65  72 69 66 79 25 3d 30 0d  |on./..Verify%=0.|
0000a0a0  2f 8a 0b 52 65 61 64 25  3d 31 0d 2f 94 0c 57 72  |/..Read%=1./..Wr|
0000a0b0  69 74 65 25 3d 32 0d 2f  9e 10 52 65 61 64 54 72  |ite%=2./..ReadTr|
0000a0c0  61 63 6b 25 3d 33 0d 2f  a8 11 57 72 69 74 65 54  |ack%=3./..WriteT|
0000a0d0  72 61 63 6b 25 3d 34 0d  2f b2 0b 53 65 65 6b 25  |rack%=4./..Seek%|
0000a0e0  3d 35 0d 2f bc 0e 52 65  73 74 6f 72 65 25 3d 36  |=5./..Restore%=6|
0000a0f0  0d 2f c6 0f 53 44 65 6e  73 69 74 79 25 3d 31 0d  |./..SDensity%=1.|
0000a100  2f d0 0f 44 44 65 6e 73  69 74 79 25 3d 32 0d 2f  |/..DDensity%=2./|
0000a110  da 13 41 64 66 73 53 77  69 25 3d 26 34 30 32 34  |..AdfsSwi%=&4024|
0000a120  30 0d 2f e4 20 58 41 64  66 73 53 77 69 25 3d 41  |0./. XAdfsSwi%=A|
0000a130  64 66 73 53 77 69 25 20  84 20 28 31 3c 3c 31 37  |dfsSwi% . (1<<17|
0000a140  29 0d 2f ee 17 41 64 66  73 44 69 73 63 45 72 72  |)./..AdfsDiscErr|
0000a150  25 3d 26 31 30 38 43 37  0d 2f f8 1c 41 64 66 73  |%=&108C7./..Adfs|
0000a160  57 72 69 74 65 50 72 6f  74 65 63 74 25 3d 26 31  |WriteProtect%=&1|
0000a170  30 38 43 39 0d 30 02 15  41 6c 74 44 65 66 65 63  |08C9.0..AltDefec|
0000a180  74 42 69 74 25 3d 26 31  30 0d 30 0c 09 f2 63 6f  |tBit%=&10.0...co|
0000a190  64 65 0d 30 16 15 20 f4  20 63 6c 65 61 72 73 20  |de.0.. . clears |
0000a1a0  62 75 66 66 65 72 73 0d  30 20 18 f2 66 69 6c 6c  |buffers.0 ..fill|
0000a1b0  28 30 2c 64 69 73 63 52  65 63 25 2c 37 30 29 0d  |(0,discRec%,70).|
0000a1c0  30 2a 39 f2 66 69 6c 6c  28 30 2c 4d 61 69 6e 42  |0*9.fill(0,MainB|
0000a1d0  75 66 66 65 72 25 2c 62  75 66 66 65 72 73 69 7a  |uffer%,buffersiz|
0000a1e0  65 29 20 3a f4 20 69 73  20 74 68 69 73 20 6e 65  |e) :. is this ne|
0000a1f0  65 64 65 64 20 3f 3f 3f  0d 30 34 2a ff 28 22 6b  |eded ???.04*.("k|
0000a200  65 79 31 20 2a 4d 45 44  49 54 20 22 2b c3 7e 28  |ey1 *MEDIT "+.~(|
0000a210  4d 61 69 6e 42 75 66 66  65 72 25 29 2b 22 7c 4d  |MainBuffer%)+"|M|
0000a220  22 29 0d 30 3e 2b ff 28  22 6b 65 79 32 20 2a 4d  |").0>+.("key2 *M|
0000a230  45 44 49 54 20 22 2b c3  7e 28 57 72 69 74 65 54  |EDIT "+.~(WriteT|
0000a240  72 6b 42 75 66 25 29 2b  22 7c 4d 22 29 0d 30 48  |rkBuf%)+"|M").0H|
0000a250  05 e1 0d 30 52 04 0d 30  5c 14 dd a4 69 6e 69 74  |...0R..0\...init|
0000a260  42 75 66 6f 66 66 73 65  74 73 0d 30 66 4b f4 20  |Bufoffsets.0fK. |
0000a270  69 6e 69 74 69 61 6c 69  73 65 73 20 61 6c 6c 20  |initialises all |
0000a280  76 61 72 69 61 62 6c 65  73 20 74 68 61 74 20 61  |variables that a|
0000a290  72 65 20 6f 66 66 73 65  74 73 20 70 6f 69 6e 74  |re offsets point|
0000a2a0  65 72 73 20 69 6e 74 6f  20 74 72 61 63 6b 20 62  |ers into track b|
0000a2b0  75 66 66 65 72 0d 30 70  44 f4 20 61 6e 64 20 72  |uffer.0pD. and r|
0000a2c0  65 74 75 72 6e 73 20 6f  66 66 73 65 74 20 66 6f  |eturns offset fo|
0000a2d0  72 20 73 74 61 72 74 20  6f 66 20 74 72 61 63 6b  |r start of track|
0000a2e0  20 64 61 74 61 20 28 69  65 20 66 6f 72 20 52 65  | data (ie for Re|
0000a2f0  61 64 20 54 72 61 63 6b  29 0d 30 7a 33 20 f4 20  |ad Track).0z3 . |
0000a300  6e 6f 74 65 20 65 61 63  68 20 74 72 61 63 6b 20  |note each track |
0000a310  69 6e 20 62 75 66 66 65  72 20 77 69 6c 6c 20 62  |in buffer will b|
0000a320  65 20 6d 61 64 65 20 75  70 20 6f 66 0d 30 84 26  |e made up of.0.&|
0000a330  20 f4 20 2d 20 41 20 54  72 61 63 6b 20 64 65 73  | . - A Track des|
0000a340  63 72 69 70 74 6f 72 2c  20 69 6e 63 6c 75 64 69  |criptor, includi|
0000a350  6e 67 0d 30 8e 1f 20 f4  20 20 20 20 20 2d 20 67  |ng.0.. .     - g|
0000a360  65 6e 65 72 61 6c 20 74  72 61 63 6b 20 69 6e 66  |eneral track inf|
0000a370  6f 0d 30 98 4c 20 f4 20  20 20 20 20 2d 20 66 6f  |o.0.L .     - fo|
0000a380  6c 6c 6f 77 65 64 20 62  79 20 61 20 6c 69 73 74  |llowed by a list|
0000a390  20 6f 66 20 70 6f 69 6e  74 65 72 73 20 66 6f 72  | of pointers for|
0000a3a0  20 65 61 63 68 20 73 65  63 74 6f 72 20 28 62 6f  | each sector (bo|
0000a3b0  74 68 20 49 44 20 26 20  44 61 74 61 29 0d 30 a2  |th ID & Data).0.|
0000a3c0  32 20 f4 20 20 20 20 20  2d 20 66 6f 6c 6c 6f 77  |2 .     - follow|
0000a3d0  65 64 20 62 79 20 61 20  6d 75 6c 74 69 2d 73 65  |ed by a multi-se|
0000a3e0  63 74 6f 72 20 64 65 73  63 72 69 70 74 6f 72 0d  |ctor descriptor.|
0000a3f0  30 ac 43 20 f4 20 2d 20  46 6f 6c 6c 6f 77 65 64  |0.C . - Followed|
0000a400  20 62 79 20 74 68 65 20  74 72 61 63 6b 73 20 27  | by the tracks '|
0000a410  52 65 61 64 54 72 61 63  6b 20 64 61 74 61 2c 20  |ReadTrack data, |
0000a420  73 75 70 70 65 72 69 6d  70 6f 73 65 64 20 77 69  |supperimposed wi|
0000a430  74 68 0d 30 b6 1a 20 f4  20 20 20 20 72 65 61 64  |th.0.. .    read|
0000a440  53 65 63 74 6f 72 20 64  61 74 61 2e 0d 30 c0 04  |Sector data..0..|
0000a450  0d 30 ca 45 20 6d 61 78  53 65 63 74 73 41 6c 6c  |.0.E maxSectsAll|
0000a460  6f 77 65 64 25 3d 33 32  20 20 3a f4 20 64 65 74  |owed%=32  :. det|
0000a470  65 72 6d 69 6e 65 73 20  72 65 73 65 72 76 65 64  |ermines reserved|
0000a480  20 73 70 61 63 65 20 66  6f 72 20 74 72 61 63 6b  | space for track|
0000a490  20 69 6e 66 6f 0d 30 d4  04 0d 30 de 18 f4 20 47  | info.0...0... G|
0000a4a0  45 4e 45 52 41 4c 20 54  52 41 43 4b 20 49 4e 46  |ENERAL TRACK INF|
0000a4b0  4f 0d 30 e8 34 62 75 66  54 72 6b 25 3d 30 20 20  |O.0.4bufTrk%=0  |
0000a4c0  20 20 20 20 20 20 20 20  20 20 3a f4 20 72 65 61  |          :. rea|
0000a4d0  6c 20 74 72 61 63 6b 20  6e 75 6d 62 65 72 20 28  |l track number (|
0000a4e0  62 79 74 65 29 0d 30 f2  34 62 75 66 48 65 61 64  |byte).0.4bufHead|
0000a4f0  25 3d 31 20 20 20 20 20  20 20 20 20 20 20 3a f4  |%=1           :.|
0000a500  20 72 65 61 6c 20 68 65  61 64 20 6e 75 6d 62 65  | real head numbe|
0000a510  72 20 20 28 62 79 74 65  29 0d 30 fc 3d 62 75 66  |r  (byte).0.=buf|
0000a520  4e 75 6d 62 53 65 63 74  25 3d 32 20 20 20 20 20  |NumbSect%=2     |
0000a530  20 20 3a f4 20 6e 75 6d  62 65 72 20 6f 66 20 73  |  :. number of s|
0000a540  65 63 74 6f 72 73 20 6f  6e 20 74 72 61 63 6b 20  |ectors on track |
0000a550  28 62 79 74 65 29 0d 31  06 48 62 75 66 4d 75 6c  |(byte).1.HbufMul|
0000a560  74 69 53 65 63 74 46 6c  67 25 3d 33 20 20 20 3a  |tiSectFlg%=3   :|
0000a570  f4 20 54 52 55 45 20 3d  20 74 72 61 63 6b 20 63  |. TRUE = track c|
0000a580  61 6e 20 75 73 65 20 6d  75 6c 74 69 2d 73 65 63  |an use multi-sec|
0000a590  74 6f 72 20 72 65 61 64  2f 77 72 69 74 65 0d 31  |tor read/write.1|
0000a5a0  10 4b 20 f4 20 28 69 65  20 6e 6f 20 72 65 61 64  |.K . (ie no read|
0000a5b0  20 65 72 72 6f 72 73 20  61 6e 64 20 73 65 63 74  | errors and sect|
0000a5c0  6f 72 73 20 61 72 65 20  61 6c 6c 20 63 6f 6e 73  |ors are all cons|
0000a5d0  65 63 75 74 69 76 65 3b  20 73 6b 65 77 20 69 73  |ecutive; skew is|
0000a5e0  20 61 6c 6c 6f 77 65 64  29 0d 31 1a 2a 62 75 66  | allowed).1.*buf|
0000a5f0  54 72 6b 44 65 6e 73 69  74 79 25 3d 34 20 20 20  |TrkDensity%=4   |
0000a600  20 20 3a f4 20 64 65 6e  73 69 74 79 20 28 62 79  |  :. density (by|
0000a610  74 65 29 0d 31 24 41 62  75 66 45 6e 64 56 61 6c  |te).1$AbufEndVal|
0000a620  69 64 44 61 74 61 25 3d  38 20 20 20 3a f4 20 65  |idData%=8   :. e|
0000a630  6e 64 20 6f 66 20 76 61  6c 69 64 20 64 61 74 61  |nd of valid data|
0000a640  20 69 6e 20 54 72 6b 20  62 75 66 66 65 72 28 77  | in Trk buffer(w|
0000a650  6f 72 64 29 0d 31 2e 32  20 62 61 73 65 25 3d 31  |ord).1.2 base%=1|
0000a660  36 20 20 20 20 20 20 20  20 20 20 20 20 3a f4 20  |6            :. |
0000a670  62 79 74 65 73 20 35 2d  37 20 26 20 31 32 2d 31  |bytes 5-7 & 12-1|
0000a680  35 20 66 72 65 65 0d 31  38 04 0d 31 42 1d f4 20  |5 free.18..1B.. |
0000a690  53 45 43 54 4f 52 20 49  4e 46 4f 52 4d 41 54 49  |SECTOR INFORMATI|
0000a6a0  4f 4e 20 4c 49 53 54 0d  31 4c 3c f4 20 65 6e 74  |ON LIST.1L<. ent|
0000a6b0  72 69 65 73 20 61 72 65  20 69 6e 20 74 68 65 20  |ries are in the |
0000a6c0  6f 72 64 65 72 20 74 68  61 74 20 73 65 63 74 6f  |order that secto|
0000a6d0  72 73 20 61 72 65 20 61  72 6f 75 6e 64 20 74 72  |rs are around tr|
0000a6e0  61 63 6b 0d 31 56 3d f4  20 65 61 63 68 20 65 6e  |ack.1V=. each en|
0000a6f0  74 72 79 20 2d 20 70 6f  69 6e 74 65 72 20 74 6f  |try - pointer to|
0000a700  20 73 74 61 72 74 20 6f  66 20 49 44 20 28 61 62  | start of ID (ab|
0000a710  73 6f 6c 75 74 65 20 77  6f 72 64 20 61 64 64 29  |solute word add)|
0000a720  0d 31 60 44 f4 20 20 20  20 20 20 20 20 20 20 20  |.1`D.           |
0000a730  20 2d 20 70 6f 69 6e 74  65 72 20 74 6f 20 73 74  | - pointer to st|
0000a740  61 72 74 20 6f 66 20 44  61 74 61 20 41 72 65 61  |art of Data Area|
0000a750  20 28 61 62 73 6f 6c 75  74 65 20 77 6f 72 64 20  | (absolute word |
0000a760  61 64 64 29 0d 31 6a 3a  f4 20 20 20 20 20 20 20  |add).1j:.       |
0000a770  20 20 20 20 20 20 20 28  69 66 20 3d 20 30 20 74  |       (if = 0 t|
0000a780  68 65 6e 20 6e 6f 20 64  61 74 61 20 61 72 65 61  |hen no data area|
0000a790  20 66 6f 72 20 49 44 20  66 6f 75 6e 64 29 0d 31  | for ID found).1|
0000a7a0  74 4c f4 20 20 20 20 20  20 20 20 20 20 20 20 2d  |tL.            -|
0000a7b0  20 62 79 74 65 20 6c 65  6e 67 74 68 20 6f 66 20  | byte length of |
0000a7c0  73 65 63 74 6f 72 20 72  65 61 64 2f 77 72 69 74  |sector read/writ|
0000a7d0  65 20 64 61 74 61 20 6f  70 2e 20 49 74 20 77 69  |e data op. It wi|
0000a7e0  6c 6c 20 62 65 20 6c 65  73 73 0d 31 7e 46 f4 20  |ll be less.1~F. |
0000a7f0  20 20 20 20 20 20 20 20  20 20 20 20 20 74 68 61  |             tha|
0000a800  6e 20 73 65 63 74 6f 72  20 73 69 7a 65 20 69 66  |n sector size if|
0000a810  20 6e 65 78 74 20 73 65  63 74 20 49 44 20 77 6f  | next sect ID wo|
0000a820  75 6c 64 20 62 65 20 63  6f 72 72 75 70 74 65 64  |uld be corrupted|
0000a830  0d 31 88 47 f4 20 20 20  20 20 20 20 20 20 20 20  |.1.G.           |
0000a840  20 2d 20 53 61 76 65 20  76 65 72 73 69 6f 6e 20  | - Save version |
0000a850  6f 66 20 49 44 2c 20 75  73 65 20 74 68 69 73 20  |of ID, use this |
0000a860  76 65 72 73 69 6f 6e 20  69 6e 73 74 65 61 64 20  |version instead |
0000a870  6f 66 20 77 68 61 74 0d  31 92 45 f4 20 20 20 20  |of what.1.E.    |
0000a880  20 20 20 20 20 20 20 20  20 20 69 73 20 69 6e 20  |          is in |
0000a890  74 72 61 63 6b 20 62 75  66 66 65 72 20 69 6e 20  |track buffer in |
0000a8a0  63 61 73 65 20 6f 66 20  70 6f 73 73 69 62 6c 65  |case of possible|
0000a8b0  20 63 6f 72 72 75 70 74  20 49 44 2e 0d 31 9c 45  | corrupt ID..1.E|
0000a8c0  f4 20 20 20 20 20 20 20  20 20 20 20 20 2d 20 73  |.            - s|
0000a8d0  65 63 74 6f 72 20 69 6e  66 6f 72 6d 61 74 69 6f  |ector informatio|
0000a8e0  6e 2c 20 69 66 20 3c 3e  30 20 54 48 45 4e 20 64  |n, if <>0 THEN d|
0000a8f0  6f 6e 27 74 20 77 72 69  74 65 20 73 65 63 74 6f  |on't write secto|
0000a900  72 0d 31 a6 43 f4 20 20  20 20 20 20 20 20 20 20  |r.1.C.          |
0000a910  20 20 20 20 20 20 63 61  74 63 68 65 73 20 49 44  |      catches ID|
0000a920  20 43 52 43 20 65 72 72  2c 20 44 65 6c 65 74 65  | CRC err, Delete|
0000a930  64 20 64 61 74 61 2c 20  44 61 74 61 43 52 43 20  |d data, DataCRC |
0000a940  65 72 72 2c 0d 31 b0 46  f4 20 20 20 20 20 20 20  |err,.1.F.       |
0000a950  20 20 20 20 20 20 20 20  20 69 6c 6c 65 67 61 6c  |         illegal|
0000a960  20 41 72 63 20 49 44 2c  20 44 61 74 61 20 41 72  | Arc ID, Data Ar|
0000a970  65 61 20 74 6f 6f 20 6c  6f 6e 67 2c 20 4e 6f 20  |ea too long, No |
0000a980  44 61 74 61 20 41 72 65  61 2c 0d 31 ba 47 f4 20  |Data Area,.1.G. |
0000a990  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 61  |               a|
0000a9a0  6e 64 20 44 61 74 61 20  41 72 65 61 20 63 6f 75  |nd Data Area cou|
0000a9b0  6c 64 20 61 6e 64 20 77  61 73 20 77 72 69 74 74  |ld and was writt|
0000a9c0  65 6e 20 64 75 72 69 6e  67 20 66 6f 72 6d 61 74  |en during format|
0000a9d0  2e 0d 31 c4 4a 20 4c 6f  67 32 53 65 63 74 49 6e  |..1.J Log2SectIn|
0000a9e0  66 6f 53 69 7a 65 25 3d  35 20 20 3a f4 20 4c 6f  |foSize%=5  :. Lo|
0000a9f0  67 20 32 20 6f 66 20 73  69 7a 65 20 6f 66 20 53  |g 2 of size of S|
0000aa00  65 63 74 6f 72 20 49 6e  66 6f 20 28 3d 20 33 32  |ector Info (= 32|
0000aa10  20 28 38 20 77 6f 72 64  73 29 29 0d 31 ce 16 62  | (8 words)).1..b|
0000aa20  75 66 53 65 63 74 44 65  73 63 25 3d 62 61 73 65  |ufSectDesc%=base|
0000aa30  25 0d 31 d8 26 62 75 66  49 44 70 74 72 25 20 20  |%.1.&bufIDptr%  |
0000aa40  20 3d 30 20 20 20 20 20  20 20 3a f4 20 62 79 74  | =0       :. byt|
0000aa50  65 73 20 20 30 2d 33 0d  31 e2 26 62 75 66 44 61  |es  0-3.1.&bufDa|
0000aa60  74 61 70 74 72 25 20 3d  34 20 20 20 20 20 20 20  |taptr% =4       |
0000aa70  3a f4 20 62 79 74 65 73  20 20 34 2d 37 0d 31 ec  |:. bytes  4-7.1.|
0000aa80  27 62 75 66 54 72 61 6e  73 4c 65 6e 67 74 68 25  |'bufTransLength%|
0000aa90  3d 38 20 20 20 20 3a f4  20 62 79 74 65 73 20 20  |=8    :. bytes  |
0000aaa0  38 2d 31 31 0d 31 f6 27  62 75 66 53 65 63 74 49  |8-11.1.'bufSectI|
0000aab0  44 25 3d 31 32 20 20 20  20 20 20 20 20 3a f4 20  |D%=12        :. |
0000aac0  62 79 74 65 73 20 31 32  2d 31 35 0d 32 00 27 62  |bytes 12-15.2.'b|
0000aad0  75 66 53 65 63 74 49 6e  66 6f 25 3d 31 36 20 20  |ufSectInfo%=16  |
0000aae0  20 20 20 20 3a f4 20 62  79 74 65 73 20 31 36 2d  |    :. bytes 16-|
0000aaf0  31 39 0d 32 0a 36 20 20  20 20 20 20 20 20 20 20  |19.2.6          |
0000ab00  20 20 20 20 20 20 20 20  20 20 20 3a f4 20 62 79  |           :. by|
0000ab10  74 65 20 31 36 20 3d 20  64 69 73 63 20 65 72 72  |te 16 = disc err|
0000ab20  20 72 65 73 75 6c 74 25  0d 32 14 38 65 72 72 43  | result%.2.8errC|
0000ab30  52 43 25 3d 20 20 20 20  20 20 31 3c 3c 20 33 20  |RC%=      1<< 3 |
0000ab40  20 20 3a f4 20 43 52 43  20 65 72 72 6f 72 20 62  |  :. CRC error b|
0000ab50  69 74 20 69 6e 20 64 69  73 63 20 65 72 72 6f 72  |it in disc error|
0000ab60  0d 32 1e 3f 65 72 72 4e  6f 74 46 6f 75 6e 64 25  |.2.?errNotFound%|
0000ab70  3d 20 31 3c 3c 20 34 20  20 20 3a f4 20 73 65 63  |= 1<< 4   :. sec|
0000ab80  74 6f 72 20 6e 6f 74 20  66 6f 75 6e 64 20 62 69  |tor not found bi|
0000ab90  74 20 69 6e 20 64 69 73  63 20 65 72 72 6f 72 0d  |t in disc error.|
0000aba0  32 28 23 20 20 20 20 20  20 20 20 20 20 20 20 20  |2(#             |
0000abb0  20 20 20 20 20 20 20 20  3a f4 20 62 79 74 65 20  |        :. byte |
0000abc0  31 37 0d 32 32 35 64 65  6c 44 61 74 61 25 3d 20  |17.225delData%= |
0000abd0  20 20 31 3c 3c 20 38 20  20 20 20 20 3a f4 20 62  |  1<< 8     :. b|
0000abe0  69 74 20 31 3d 20 64 65  6c 65 74 65 64 20 44 61  |it 1= deleted Da|
0000abf0  74 61 20 41 72 65 61 0d  32 3c 30 6e 6f 44 61 74  |ta Area.2<0noDat|
0000ac00  61 25 3d 20 20 20 20 31  3c 3c 20 39 20 20 20 20  |a%=    1<< 9    |
0000ac10  20 3a f4 20 62 69 74 20  32 3d 20 4e 6f 20 44 61  | :. bit 2= No Da|
0000ac20  74 61 20 41 72 65 61 0d  32 46 3e 69 6c 6c 65 67  |ta Area.2F>illeg|
0000ac30  61 6c 54 72 6b 25 3d 20  31 3c 3c 20 31 30 20 20  |alTrk%= 1<< 10  |
0000ac40  20 3a f4 20 62 69 74 20  33 3d 20 49 6c 6c 65 67  | :. bit 3= Illeg|
0000ac50  61 6c 20 49 44 20 54 72  6b 20 28 69 65 20 6f 6e  |al ID Trk (ie on|
0000ac60  20 41 72 63 29 0d 32 50  40 69 6c 6c 65 67 61 6c  | Arc).2P@illegal|
0000ac70  49 44 62 79 74 25 3d 31  3c 3c 31 31 20 20 20 3a  |IDbyt%=1<<11   :|
0000ac80  f4 20 62 69 74 20 34 3d  20 49 6c 6c 65 67 61 6c  |. bit 4= Illegal|
0000ac90  20 49 44 20 62 79 74 65  20 28 69 65 20 26 46 35  | ID byte (ie &F5|
0000aca0  2d 26 46 37 29 0d 32 5a  46 6c 6f 6e 67 44 61 74  |-&F7).2ZFlongDat|
0000acb0  61 25 3d 20 20 31 3c 3c  20 31 32 20 20 20 20 3a  |a%=  1<< 12    :|
0000acc0  f4 20 62 69 74 20 35 3d  20 44 61 74 61 20 74 6f  |. bit 5= Data to|
0000acd0  6f 20 63 6c 6f 73 65 20  74 6f 20 6e 65 78 74 20  |o close to next |
0000ace0  49 44 20 74 6f 20 77 72  69 74 65 0d 32 64 41 6e  |ID to write.2dAn|
0000acf0  6f 52 6f 6f 6d 43 52 43  25 3d 20 31 3c 3c 20 31  |oRoomCRC%= 1<< 1|
0000ad00  33 20 20 20 20 3a f4 20  62 69 74 20 36 3d 20 53  |3    :. bit 6= S|
0000ad10  6f 20 6c 6f 6e 67 20 6e  6f 20 73 70 61 63 65 20  |o long no space |
0000ad20  66 6f 72 20 65 76 65 6e  20 43 52 43 0d 32 6e 49  |for even CRC.2nI|
0000ad30  6f 76 65 72 49 6e 64 65  78 25 3d 20 31 3c 3c 20  |overIndex%= 1<< |
0000ad40  31 34 20 20 20 20 3a f4  20 62 69 74 20 37 3d 20  |14    :. bit 7= |
0000ad50  44 61 74 61 20 61 72 65  61 20 67 6f 65 73 20 6f  |Data area goes o|
0000ad60  76 65 72 20 49 6e 64 65  78 28 6d 75 73 74 20 77  |ver Index(must w|
0000ad70  72 69 74 65 29 0d 32 78  4b 64 61 74 61 44 75 72  |rite).2xKdataDur|
0000ad80  69 6e 67 46 6f 72 6d 61  74 25 3d 20 31 20 3c 3c  |ingFormat%= 1 <<|
0000ad90  20 31 36 20 3a f4 20 44  61 74 61 20 63 6f 75 6c  | 16 :. Data coul|
0000ada0  64 20 61 6e 64 20 77 61  73 20 77 72 69 74 74 65  |d and was writte|
0000adb0  6e 20 64 75 72 69 6e 67  20 66 6f 72 6d 61 74 2e  |n during format.|
0000adc0  0d 32 82 43 20 62 61 73  65 25 20 2b 3d 20 6d 61  |.2.C base% += ma|
0000add0  78 53 65 63 74 73 41 6c  6c 6f 77 65 64 25 20 3c  |xSectsAllowed% <|
0000ade0  3c 20 4c 6f 67 32 53 65  63 74 49 6e 66 6f 53 69  |< Log2SectInfoSi|
0000adf0  7a 65 25 20 3a f4 20 37  20 77 6f 72 64 73 20 66  |ze% :. 7 words f|
0000ae00  72 65 65 0d 32 8c 04 0d  32 96 2c f4 20 4d 55 4c  |ree.2...2.,. MUL|
0000ae10  54 49 2d 53 45 43 54 4f  52 20 44 41 54 41 20 41  |TI-SECTOR DATA A|
0000ae20  52 45 41 20 52 45 41 44  2f 57 52 49 54 45 20 49  |REA READ/WRITE I|
0000ae30  4e 46 4f 0d 32 a0 41 f4  20 20 54 68 69 73 20 69  |NFO.2.A.  This i|
0000ae40  6e 66 6f 20 69 73 20 6f  6e 6c 79 20 76 61 6c 69  |nfo is only vali|
0000ae50  64 20 69 66 20 4d 75 6c  74 69 2d 53 65 63 74 6f  |d if Multi-Secto|
0000ae60  72 20 66 6c 61 67 20 61  62 6f 76 65 20 69 73 20  |r flag above is |
0000ae70  74 72 75 65 0d 32 aa 40  62 75 66 4c 6f 77 53 65  |true.2.@bufLowSe|
0000ae80  63 74 25 3d 62 61 73 65  25 20 20 20 20 20 20 20  |ct%=base%       |
0000ae90  3a f4 20 62 79 74 65 20  30 20 6c 6f 77 65 73 74  |:. byte 0 lowest|
0000aea0  20 73 65 63 74 6f 72 20  61 72 6f 75 6e 64 20 74  | sector around t|
0000aeb0  72 61 63 6b 0d 32 b4 31  62 75 66 53 65 63 74 53  |rack.2.1bufSectS|
0000aec0  69 7a 65 25 3d 62 61 73  65 25 2b 31 20 20 20 20  |ize%=base%+1    |
0000aed0  3a f4 20 62 79 74 65 20  31 20 53 65 63 74 6f 72  |:. byte 1 Sector|
0000aee0  20 53 69 7a 65 0d 32 be  2f 20 62 61 73 65 25 20  | Size.2./ base% |
0000aef0  2b 3d 20 34 20 20 20 20  20 20 20 20 20 20 20 20  |+= 4            |
0000af00  20 3a f4 20 62 79 74 65  73 20 32 20 2d 20 33 20  | :. bytes 2 - 3 |
0000af10  66 72 65 65 0d 32 c8 3e  f4 20 6d 65 6d 6f 72 79  |free.2.>. memory|
0000af20  20 70 6f 69 6e 74 65 72  20 6c 69 73 74 20 66 6f  | pointer list fo|
0000af30  72 20 64 69 73 63 4f 70  20 6f 6e 65 20 65 6e 74  |r discOp one ent|
0000af40  72 79 20 66 6f 72 20 65  61 63 68 20 73 65 63 74  |ry for each sect|
0000af50  6f 72 0d 32 d2 4b f4 20  20 65 6e 74 72 69 65 73  |or.2.K.  entries|
0000af60  20 6d 75 73 74 20 62 65  20 69 6e 20 63 6f 6e 73  | must be in cons|
0000af70  65 63 74 75 74 69 76 65  20 73 65 63 74 6f 72 20  |ectutive sector |
0000af80  6e 75 6d 62 65 72 20 6f  72 64 65 72 20 6e 6f 74  |number order not|
0000af90  20 69 6e 20 74 68 65 20  6f 72 64 65 72 0d 32 dc  | in the order.2.|
0000afa0  24 f4 20 20 74 68 65 79  20 61 70 70 65 61 72 20  |$.  they appear |
0000afb0  61 72 6f 75 6e 64 20 74  68 65 20 74 72 61 63 6b  |around the track|
0000afc0  2e 0d 32 e6 26 f4 20 45  61 63 68 20 65 6e 74 72  |..2.&. Each entr|
0000afd0  79 20 63 6f 6e 73 69 73  74 73 20 6f 66 20 74 77  |y consists of tw|
0000afe0  6f 20 77 6f 72 64 73 0d  32 f0 3b f4 20 20 66 69  |o words.2.;.  fi|
0000aff0  72 73 74 20 20 3d 20 61  62 73 6f 6c 75 74 65 20  |rst  = absolute |
0000b000  61 64 64 72 65 73 73 20  6f 66 20 53 65 63 74 6f  |address of Secto|
0000b010  72 27 73 20 64 61 74 61  20 69 6e 20 6d 65 6d 6f  |r's data in memo|
0000b020  72 79 0d 32 fa 43 f4 20  20 73 65 63 6f 6e 64 20  |ry.2.C.  second |
0000b030  3d 20 73 65 63 74 6f 72  20 73 69 7a 65 20 69 6e  |= sector size in|
0000b040  20 62 79 74 65 73 20 28  6e 62 20 74 68 65 79 20  | bytes (nb they |
0000b050  6d 75 73 74 20 61 6c 6c  20 62 65 20 74 68 65 20  |must all be the |
0000b060  73 61 6d 65 29 0d 33 04  42 f4 20 6e 6f 74 65 20  |same).3.B. note |
0000b070  6c 69 73 74 20 6d 75 73  74 20 62 65 20 77 6f 72  |list must be wor|
0000b080  64 20 61 6c 69 67 6e 65  64 2c 20 73 6f 20 61 73  |d aligned, so as|
0000b090  73 75 6d 69 6e 67 20 74  72 61 63 6b 20 64 65 73  |suming track des|
0000b0a0  63 72 69 70 74 6f 72 0d  33 0e 1d f4 20 20 73 74  |criptor.3...  st|
0000b0b0  61 72 74 73 20 61 74 20  77 6f 72 64 20 61 6c 69  |arts at word ali|
0000b0c0  67 6e 65 64 0d 33 18 34  20 62 61 73 65 25 3d 20  |gned.3.4 base%= |
0000b0d0  34 2a a8 28 28 62 61 73  65 25 2b 33 29 2f 34 29  |4*.((base%+3)/4)|
0000b0e0  20 20 3a f4 20 65 6e 73  75 72 65 20 77 6f 72 64  |  :. ensure word|
0000b0f0  20 61 6c 69 67 6e 65 64  0d 33 22 19 62 75 66 4d  | aligned.3".bufM|
0000b100  65 6d 41 64 64 4c 69 73  74 25 3d 20 62 61 73 65  |emAddList%= base|
0000b110  25 0d 33 2c 20 20 62 61  73 65 25 20 2b 3d 20 38  |%.3,  base% += 8|
0000b120  2a 6d 61 78 53 65 63 74  73 41 6c 6c 6f 77 65 64  |*maxSectsAllowed|
0000b130  25 0d 33 36 04 0d 33 40  2f f4 20 73 74 61 72 74  |%.36..3@/. start|
0000b140  20 6f 66 20 77 68 65 72  65 20 72 65 61 64 20 74  | of where read t|
0000b150  72 61 63 6b 20 64 61 74  61 20 69 73 20 73 74 6f  |rack data is sto|
0000b160  72 65 64 2c 0d 33 4a 43  f4 20 20 6e 62 20 64 61  |red,.3JC.  nb da|
0000b170  74 61 20 61 72 65 61 73  20 77 69 6c 6c 20 62 65  |ta areas will be|
0000b180  20 6f 76 65 72 77 72 69  74 74 65 6e 20 62 79 20  | overwritten by |
0000b190  61 63 74 75 61 6c 20 72  65 61 64 20 73 65 63 74  |actual read sect|
0000b1a0  6f 72 20 64 61 74 61 0d  33 54 45 f4 20 20 20 20  |or data.3TE.    |
0000b1b0  20 62 75 74 20 41 64 64  72 65 73 73 20 4d 61 72  | but Address Mar|
0000b1c0  6b 73 20 61 6e 64 20 67  61 70 73 20 77 69 6c 6c  |ks and gaps will|
0000b1d0  20 62 65 20 73 74 69 6c  6c 20 69 6e 20 52 65 61  | be still in Rea|
0000b1e0  64 20 54 72 61 63 6b 20  66 6f 72 6d 0d 33 5e 3d  |d Track form.3^=|
0000b1f0  f4 20 20 20 20 20 57 72  69 74 65 20 74 72 61 63  |.     Write trac|
0000b200  6b 20 6d 75 73 74 20 75  73 65 20 61 20 63 6f 70  |k must use a cop|
0000b210  79 20 6f 66 20 74 68 69  73 20 28 62 75 74 20 63  |y of this (but c|
0000b220  6f 72 72 65 63 74 65 64  29 0d 33 68 0b 3d 20 62  |orrected).3h.= b|
0000b230  61 73 65 25 0d 33 72 04  0d 33 7c 04 0d 33 86 0a  |ase%.3r..3|..3..|
0000b240  dd f2 63 6f 64 65 0d 33  90 15 e3 20 70 61 73 73  |..code.3... pass|
0000b250  3d 20 30 20 b8 20 32 20  88 20 32 0d 33 9a 0c 50  |= 0 . 2 . 2.3..P|
0000b260  25 3d 63 6f 64 65 25 0d  33 a4 12 5b 20 20 20 20  |%=code%.3..[    |
0000b270  20 4f 50 54 20 70 61 73  73 0d 33 ae 04 0d 33 b8  | OPT pass.3...3.|
0000b280  1e 3b 20 67 65 74 20 42  41 53 49 43 27 73 20 d6  |.; get BASIC's .|
0000b290  20 70 61 72 61 6d 65 74  65 72 73 0d 33 c2 40 3b  | parameters.3.@;|
0000b2a0  20 ac 45 20 74 68 65 79  20 6d 75 73 74 20 61 6c  | .E they must al|
0000b2b0  6c 20 62 65 20 77 6f 72  64 20 61 6c 69 67 6e 65  |l be word aligne|
0000b2c0  64 20 69 6e 74 65 67 65  72 20 76 61 72 69 61 62  |d integer variab|
0000b2d0  6c 65 73 2c 20 ac 20 65  76 65 6e 0d 33 cc 37 3b  |les, . even.3.7;|
0000b2e0  20 20 20 20 20 20 21 70  61 72 61 6d 25 20 69 73  |      !param% is|
0000b2f0  20 61 6c 6c 6f 77 65 64  2c 20 6f 6e 6c 79 20 70  | allowed, only p|
0000b300  61 72 61 6d 25 20 6f 72  20 70 61 72 61 6d 25 28  |aram% or param%(|
0000b310  78 29 0d 33 d6 43 3b 20  52 31 3d 20 52 65 73 65  |x).3.C; R1= Rese|
0000b320  72 76 65 64 2c 20 75 73  75 61 6c 6c 79 20 75 73  |rved, usually us|
0000b330  65 64 20 62 79 20 63 61  6c 6c 65 72 20 66 6f 72  |ed by caller for|
0000b340  20 42 41 53 49 43 27 73  20 6c 69 6e 6b 20 61 64  | BASIC's link ad|
0000b350  64 72 65 73 73 0d 33 e0  2f 3b 20 52 39 3d 20 50  |dress.3./; R9= P|
0000b360  6f 69 6e 74 65 72 20 74  6f 20 6c 69 73 74 20 6f  |ointer to list o|
0000b370  66 20 4c 2d 76 61 6c 75  65 20 70 61 72 61 6d 65  |f L-value parame|
0000b380  74 65 72 73 0d 33 ea 26  3b 20 52 31 30 3d 6e 75  |ters.3.&; R10=nu|
0000b390  6d 62 65 72 20 6f 66 20  70 61 72 61 6d 65 74 65  |mber of paramete|
0000b3a0  72 73 20 28 6d 61 78 3d  36 29 0d 33 f4 3d 3b 20  |rs (max=6).3.=; |
0000b3b0  46 6f 72 20 66 6f 72 6d  61 74 20 6f 66 20 d6 20  |For format of . |
0000b3c0  70 61 72 61 6d 65 74 65  72 20 62 6c 6f 63 6b 20  |parameter block |
0000b3d0  73 65 65 20 73 74 61 6e  64 61 72 64 20 55 73 65  |see standard Use|
0000b3e0  72 20 67 75 69 64 65 0d  33 fe 17 3b 20 65 73 70  |r guide.3..; esp|
0000b3f0  65 63 69 61 6c 6c 79 20  66 6f 72 20 52 39 0d 34  |ecially for R9.4|
0000b400  08 1b 3b 20 6f 6e 20 65  78 69 74 20 52 30 20 69  |..; on exit R0 i|
0000b410  73 20 63 6f 72 72 75 70  74 0d 34 12 1d 3b 20 20  |s corrupt.4..;  |
0000b420  20 20 20 20 20 20 20 52  31 20 69 73 20 75 6e 61  |       R1 is una|
0000b430  6c 74 65 72 65 64 0d 34  1c 42 3b 20 20 20 20 20  |ltered.4.B;     |
0000b440  20 20 20 20 52 32 3d 66  69 72 73 74 20 70 61 72  |    R2=first par|
0000b450  61 6d 65 74 65 72 20 20  28 69 66 20 74 68 65 72  |ameter  (if ther|
0000b460  65 20 69 73 20 6f 6e 65  29 20 65 6c 73 65 20 75  |e is one) else u|
0000b470  6e 63 68 61 6e 67 65 64  0d 34 26 42 3b 20 20 20  |nchanged.4&B;   |
0000b480  20 20 20 20 20 20 52 33  3d 73 65 63 6f 6e 64 20  |      R3=second |
0000b490  70 61 72 61 6d 65 74 65  72 20 28 69 66 20 74 68  |parameter (if th|
0000b4a0  65 72 65 20 69 73 20 6f  6e 65 29 20 65 6c 73 65  |ere is one) else|
0000b4b0  20 75 6e 63 68 61 6e 67  65 64 0d 34 30 3f 3b 20  | unchanged.40?; |
0000b4c0  20 20 20 20 20 20 20 20  2e 2e 20 2e 2e 2e 2e 2e  |        .. .....|
0000b4d0  20 20 20 2e 2e 2e 2e 2e  2e 20 20 20 20 2e 2e 20  |   ......    .. |
0000b4e0  2e 2e 2e 2e 2e 20 2e 2e  20 2e 2e 2e 20 20 2e 2e  |..... .. ...  ..|
0000b4f0  2e 20 20 20 2e 2e 2e 2e  2e 0d 34 3a 42 3b 20 20  |.   ......4:B;  |
0000b500  20 20 20 20 20 20 20 52  37 3d 73 69 78 74 68 20  |       R7=sixth |
0000b510  70 61 72 61 6d 65 74 65  72 20 20 28 69 66 20 74  |parameter  (if t|
0000b520  68 65 72 65 20 69 73 20  6f 6e 65 29 20 65 6c 73  |here is one) els|
0000b530  65 20 75 6e 63 68 61 6e  67 65 64 0d 34 44 05 3b  |e unchanged.4D.;|
0000b540  0d 34 4e 2e 3b 20 63 61  6c 6c 20 74 68 69 73 20  |.4N.; call this |
0000b550  72 6f 75 74 69 6e 65 20  61 66 74 65 72 20 74 68  |routine after th|
0000b560  65 20 42 41 53 49 43 20  d6 20 62 79 20 2d 0d 34  |e BASIC . by -.4|
0000b570  58 3b 3b 20 20 20 20 20  20 20 20 20 4d 4f 56 20  |X;;         MOV |
0000b580  20 20 52 31 2c 20 52 31  34 20 20 20 20 20 3b 73  |  R1, R14     ;s|
0000b590  61 76 65 73 20 42 41 53  49 43 27 73 20 6c 69 6e  |aves BASIC's lin|
0000b5a0  6b 20 61 64 64 72 65 73  73 0d 34 62 4b 3b 20 20  |k address.4bK;  |
0000b5b0  20 20 20 20 20 20 20 42  4c 20 20 20 70 61 72 61  |       BL   para|
0000b5c0  6d 76 61 6c 75 65 73 20  20 3b 6c 6f 61 64 20 61  |mvalues  ;load a|
0000b5d0  6c 6c 20 42 41 53 49 43  27 73 20 70 61 72 61 6d  |ll BASIC's param|
0000b5e0  65 74 65 72 73 20 69 6e  74 6f 20 72 65 67 69 73  |eters into regis|
0000b5f0  74 65 72 73 0d 34 6c 3e  3b 20 20 20 20 20 20 20  |ters.4l>;       |
0000b600  20 20 4d 4f 56 20 20 20  52 31 34 2c 20 52 31 20  |  MOV   R14, R1 |
0000b610  20 20 20 20 3b 72 65 73  74 6f 72 65 73 20 42 41  |    ;restores BA|
0000b620  53 49 43 27 73 20 6c 69  6e 6b 20 61 64 64 72 65  |SIC's link addre|
0000b630  73 73 0d 34 76 05 3b 0d  34 80 3a 3b 20 74 6f 20  |ss.4v.;.4.:; to |
0000b640  75 70 64 61 74 65 20 61  20 42 41 53 49 43 20 76  |update a BASIC v|
0000b650  61 72 69 61 62 6c 65 20  28 6c 61 73 74 20 70 61  |ariable (last pa|
0000b660  72 61 6d 65 74 65 72 29  20 61 74 20 65 6e 64 20  |rameter) at end |
0000b670  2d 0d 34 8a 3d 3b 20 20  20 20 20 20 20 20 20 4c  |-.4.=;         L|
0000b680  44 52 20 20 20 52 30 2c  20 5b 52 39 5d 20 20 20  |DR   R0, [R9]   |
0000b690  20 3b 67 65 74 20 6c 61  73 74 20 42 41 53 49 43  | ;get last BASIC|
0000b6a0  20 70 61 72 61 6d 65 74  65 72 20 61 64 64 0d 34  | parameter add.4|
0000b6b0  94 3d 3b 20 20 20 20 20  20 20 20 20 53 54 52 20  |.=;         STR |
0000b6c0  20 20 52 78 2c 20 5b 52  30 5d 20 20 20 20 3b 26  |  Rx, [R0]    ;&|
0000b6d0  20 75 70 64 61 74 65 20  69 74 20 77 69 74 68 20  | update it with |
0000b6e0  76 61 6c 75 65 20 69 6e  20 52 78 0d 34 9e 30 3b  |value in Rx.4.0;|
0000b6f0  20 20 20 20 20 20 20 20  20 4d 4f 56 20 20 20 70  |         MOV   p|
0000b700  63 2c 20 52 31 34 20 20  20 20 20 20 20 20 20 20  |c, R14          |
0000b710  20 20 20 20 3b 72 65 74  75 72 6e 0d 34 a8 04 0d  |    ;return.4...|
0000b720  34 b2 10 2e 70 61 72 61  6d 76 61 6c 75 65 73 0d  |4...paramvalues.|
0000b730  34 bc 1d 41 44 44 20 20  20 52 30 2c 20 52 39 2c  |4..ADD   R0, R9,|
0000b740  20 52 31 30 2c 20 4c 53  4c 20 23 33 0d 34 c6 11  | R10, LSL #3.4..|
0000b750  43 4d 50 20 20 20 52 31  30 2c 20 23 31 0d 34 d0  |CMP   R10, #1.4.|
0000b760  18 4c 44 52 47 45 20 52  32 2c 20 5b 52 30 2c 20  |.LDRGE R2, [R0, |
0000b770  23 2d 38 5d 21 0d 34 da  26 4c 44 52 47 45 20 52  |#-8]!.4.&LDRGE R|
0000b780  32 2c 20 5b 52 32 5d 20  20 20 20 20 20 20 3b 52  |2, [R2]       ;R|
0000b790  32 3d 31 73 74 20 70 61  72 61 6d 0d 34 e4 11 43  |2=1st param.4..C|
0000b7a0  4d 50 20 20 20 52 31 30  2c 20 23 32 0d 34 ee 18  |MP   R10, #2.4..|
0000b7b0  4c 44 52 47 45 20 52 33  2c 20 5b 52 30 2c 20 23  |LDRGE R3, [R0, #|
0000b7c0  2d 38 5d 21 0d 34 f8 26  4c 44 52 47 45 20 52 33  |-8]!.4.&LDRGE R3|
0000b7d0  2c 20 5b 52 33 5d 20 20  20 20 20 20 20 3b 52 33  |, [R3]       ;R3|
0000b7e0  3d 32 6e 64 20 70 61 72  61 6d 0d 35 02 11 43 4d  |=2nd param.5..CM|
0000b7f0  50 20 20 20 52 31 30 2c  20 23 33 0d 35 0c 18 4c  |P   R10, #3.5..L|
0000b800  44 52 47 45 20 52 34 2c  20 5b 52 30 2c 20 23 2d  |DRGE R4, [R0, #-|
0000b810  38 5d 21 0d 35 16 26 4c  44 52 47 45 20 52 34 2c  |8]!.5.&LDRGE R4,|
0000b820  20 5b 52 34 5d 20 20 20  20 20 20 20 3b 52 34 3d  | [R4]       ;R4=|
0000b830  33 72 64 20 70 61 72 61  6d 0d 35 20 11 43 4d 50  |3rd param.5 .CMP|
0000b840  20 20 20 52 31 30 2c 20  23 34 0d 35 2a 18 4c 44  |   R10, #4.5*.LD|
0000b850  52 47 45 20 52 35 2c 20  5b 52 30 2c 20 23 2d 38  |RGE R5, [R0, #-8|
0000b860  5d 21 0d 35 34 12 4c 44  52 47 45 20 52 35 2c 20  |]!.54.LDRGE R5, |
0000b870  5b 52 35 5d 0d 35 3e 11  43 4d 50 20 20 20 52 31  |[R5].5>.CMP   R1|
0000b880  30 2c 20 23 35 0d 35 48  18 4c 44 52 47 45 20 52  |0, #5.5H.LDRGE R|
0000b890  36 2c 20 5b 52 30 2c 20  23 2d 38 5d 21 0d 35 52  |6, [R0, #-8]!.5R|
0000b8a0  12 4c 44 52 47 45 20 52  36 2c 20 5b 52 36 5d 0d  |.LDRGE R6, [R6].|
0000b8b0  35 5c 11 43 4d 50 20 20  20 52 31 30 2c 20 23 36  |5\.CMP   R10, #6|
0000b8c0  0d 35 66 18 4c 44 52 47  45 20 52 37 2c 20 5b 52  |.5f.LDRGE R7, [R|
0000b8d0  30 2c 20 23 2d 38 5d 21  0d 35 70 25 4c 44 52 47  |0, #-8]!.5p%LDRG|
0000b8e0  45 20 52 37 2c 20 5b 52  37 5d 20 20 20 20 20 20  |E R7, [R7]      |
0000b8f0  3b 52 37 3d 36 74 68 20  70 61 72 61 6d 0d 35 7a  |;R7=6th param.5z|
0000b900  1f 4d 4f 56 20 20 20 70  63 2c 20 20 52 31 34 20  |.MOV   pc,  R14 |
0000b910  20 20 20 20 20 3b 72 65  74 75 72 6e 0d 35 84 04  |     ;return.5..|
0000b920  0d 35 8e 04 0d 35 98 3a  3b 66 69 6c 6c 20 62 79  |.5...5.:;fill by|
0000b930  74 65 20 61 72 65 61 2c  20 52 31 3d 62 79 74 65  |te area, R1=byte|
0000b940  20 76 61 6c 75 65 2c 20  52 32 3d 73 74 61 72 74  | value, R2=start|
0000b950  61 64 64 2c 20 52 33 3d  6c 65 6e 67 74 68 0d 35  |add, R3=length.5|
0000b960  a2 09 2e 66 69 6c 6c 0d  35 ac 2e 80 20 20 20 52  |...fill.5...   R|
0000b970  31 2c 20 52 31 2c 20 23  26 46 46 20 20 20 20 20  |1, R1, #&FF     |
0000b980  20 20 20 20 20 3b 75 73  65 20 4c 53 20 62 79 74  |     ;use LS byt|
0000b990  65 20 6f 6e 79 0d 35 b6  1b 84 52 20 20 20 52 31  |e ony.5...R   R1|
0000b9a0  2c 20 52 31 2c 20 52 31  2c 20 4c 53 4c 20 23 38  |, R1, R1, LSL #8|
0000b9b0  0d 35 c0 40 84 52 20 20  20 52 31 2c 20 52 31 2c  |.5.@.R   R1, R1,|
0000b9c0  20 52 31 2c 20 4c 53 4c  20 23 31 36 20 20 20 3b  | R1, LSL #16   ;|
0000b9d0  62 79 74 65 20 72 65 70  65 61 74 65 64 20 69 6e  |byte repeated in|
0000b9e0  20 61 6c 6c 20 62 79 74  65 73 20 69 6e 20 52 31  | all bytes in R1|
0000b9f0  0d 35 ca 14 41 44 44 20  20 20 52 30 2c 20 52 32  |.5..ADD   R0, R2|
0000ba00  2c 20 52 33 0d 35 d4 11  2e 66 69 6c 6c 62 79 74  |, R3.5...fillbyt|
0000ba10  73 74 61 72 74 0d 35 de  26 54 53 54 20 20 20 52  |start.5.&TST   R|
0000ba20  30 2c 20 23 33 20 20 20  20 20 20 20 5c 77 6f 72  |0, #3       \wor|
0000ba30  64 20 62 6f 75 6e 64 61  72 79 3f 0d 35 e8 13 42  |d boundary?.5..B|
0000ba40  45 51 20 20 20 66 69 6c  6c 77 6f 72 64 73 0d 35  |EQ   fillwords.5|
0000ba50  f2 10 43 4d 50 20 20 20  52 30 2c 20 52 32 0d 35  |..CMP   R0, R2.5|
0000ba60  fc 11 42 45 51 20 20 20  66 69 6c 6c 65 6e 64 0d  |..BEQ   fillend.|
0000ba70  36 06 17 53 54 52 42 20  20 52 31 2c 20 5b 52 30  |6..STRB  R1, [R0|
0000ba80  2c 23 2d 31 5d 21 0d 36  10 16 42 20 20 20 20 20  |,#-1]!.6..B     |
0000ba90  66 69 6c 6c 62 79 74 73  74 61 72 74 0d 36 1a 0e  |fillbytstart.6..|
0000baa0  2e 66 69 6c 6c 77 6f 72  64 73 0d 36 24 14 53 55  |.fillwords.6$.SU|
0000bab0  42 20 20 20 52 33 2c 20  52 30 2c 20 52 32 0d 36  |B   R3, R0, R2.6|
0000bac0  2e 10 43 4d 50 20 20 20  52 33 2c 20 23 34 0d 36  |..CMP   R3, #4.6|
0000bad0  38 17 53 54 52 47 45 20  52 31 2c 20 5b 52 30 2c  |8.STRGE R1, [R0,|
0000bae0  23 2d 34 5d 21 0d 36 42  13 42 47 54 20 20 20 66  |#-4]!.6B.BGT   f|
0000baf0  69 6c 6c 77 6f 72 64 73  0d 36 4c 0f 2e 66 69 6c  |illwords.6L..fil|
0000bb00  6c 62 79 74 65 6e 64 0d  36 56 10 43 4d 50 20 20  |lbytend.6V.CMP  |
0000bb10  20 52 30 2c 20 52 32 0d  36 60 18 53 54 52 4e 45  | R0, R2.6`.STRNE|
0000bb20  42 20 52 31 2c 20 5b 52  30 2c 23 2d 31 5d 21 0d  |B R1, [R0,#-1]!.|
0000bb30  36 6a 14 42 4e 45 20 20  20 66 69 6c 6c 62 79 74  |6j.BNE   fillbyt|
0000bb40  65 6e 64 0d 36 74 0c 2e  66 69 6c 6c 65 6e 64 0d  |end.6t..fillend.|
0000bb50  36 7e 1b 4d 4f 56 20 20  20 70 63 2c 20 52 31 34  |6~.MOV   pc, R14|
0000bb60  20 20 20 5c 72 65 74 75  72 6e 0d 36 88 04 0d 36  |   \return.6...6|
0000bb70  92 41 3b 66 69 6e 64 2c  20 62 61 63 6b 77 61 72  |.A;find, backwar|
0000bb80  64 73 2c 20 77 65 72 65  20 64 61 74 61 20 62 79  |ds, were data by|
0000bb90  74 65 20 63 68 61 6e 67  65 73 20 26 20 72 65 74  |te changes & ret|
0000bba0  75 72 6e 20 74 68 65 20  61 64 64 72 65 73 73 0d  |urn the address.|
0000bbb0  36 9c 20 3b 20 d6 20 66  69 6e 64 63 68 61 6e 67  |6. ; . findchang|
0000bbc0  65 62 61 63 6b 20 73 74  61 72 74 61 64 64 25 0d  |eback startadd%.|
0000bbd0  36 a6 31 3b 6f 6e 20 65  6e 74 72 79 20 31 73 74  |6.1;on entry 1st|
0000bbe0  20 42 41 53 49 43 20 70  61 72 61 6d 65 74 65 72  | BASIC parameter|
0000bbf0  20 3d 20 73 74 61 72 74  20 61 64 64 72 65 73 73  | = start address|
0000bc00  0d 36 b0 3f 3b 6f 6e 20  65 78 69 74 20 20 31 73  |.6.?;on exit  1s|
0000bc10  74 20 42 41 53 49 43 20  70 61 72 61 6d 65 74 65  |t BASIC paramete|
0000bc20  72 20 3d 20 61 64 64 72  65 73 73 20 77 68 65 72  |r = address wher|
0000bc30  65 20 63 68 61 6e 67 65  20 6f 63 63 75 72 73 0d  |e change occurs.|
0000bc40  36 ba 22 3b 20 20 20 20  20 20 20 20 20 20 20 52  |6.";           R|
0000bc50  30 2c 20 52 31 2c 20 52  32 20 63 6f 72 72 75 70  |0, R1, R2 corrup|
0000bc60  74 0d 36 c4 13 2e 66 69  6e 64 63 68 61 6e 67 65  |t.6...findchange|
0000bc70  62 61 63 6b 0d 36 ce 11  4d 4f 56 20 20 20 52 31  |back.6..MOV   R1|
0000bc80  2c 20 52 31 34 0d 36 d8  3d 42 4c 20 20 20 70 61  |, R14.6.=BL   pa|
0000bc90  72 61 6d 76 61 6c 75 65  73 20 20 20 20 20 20 3b  |ramvalues      ;|
0000bca0  52 32 20 73 65 74 20 3d  20 73 74 61 72 74 20 61  |R2 set = start a|
0000bcb0  64 64 20 28 31 73 74 20  70 61 72 61 6d 65 74 65  |dd (1st paramete|
0000bcc0  72 29 0d 36 e2 11 4d 4f  56 20 20 20 52 31 34 2c  |r).6..MOV   R14,|
0000bcd0  20 52 31 0d 36 ec 12 4c  44 52 42 20 20 52 30 2c  | R1.6..LDRB  R0,|
0000bce0  20 5b 52 32 5d 0d 36 f6  13 2e 66 69 6e 64 63 68  | [R2].6...findch|
0000bcf0  61 6e 67 65 6c 6f 6f 70  0d 37 00 18 4c 44 52 42  |angeloop.7..LDRB|
0000bd00  20 20 52 31 2c 20 5b 52  32 2c 20 23 2d 31 5d 21  |  R1, [R2, #-1]!|
0000bd10  0d 37 0a 10 43 4d 50 20  20 20 52 31 2c 20 52 30  |.7..CMP   R1, R0|
0000bd20  0d 37 14 17 42 45 51 20  20 66 69 6e 64 63 68 61  |.7..BEQ  findcha|
0000bd30  6e 67 65 6c 6f 6f 70 0d  37 1e 32 4c 44 52 20 20  |ngeloop.7.2LDR  |
0000bd40  20 52 30 2c 20 5b 52 39  5d 20 20 20 3b 67 65 74  | R0, [R9]   ;get|
0000bd50  20 6c 61 73 74 20 42 41  53 49 43 20 70 61 72 61  | last BASIC para|
0000bd60  6d 65 74 65 72 20 61 64  64 0d 37 28 36 53 54 52  |meter add.7(6STR|
0000bd70  20 20 20 52 32 2c 20 5b  52 30 5d 20 20 20 3b 26  |   R2, [R0]   ;&|
0000bd80  20 75 70 64 61 74 65 20  69 74 20 77 69 74 68 20  | update it with |
0000bd90  72 65 6d 61 64 65 20 49  44 20 69 6e 20 52 31 0d  |remade ID in R1.|
0000bda0  37 32 26 4d 4f 56 20 20  20 70 63 2c 20 52 31 34  |72&MOV   pc, R14|
0000bdb0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 3b 72  |              ;r|
0000bdc0  65 74 75 72 6e 0d 37 3c  04 0d 37 46 17 3b 63 6f  |eturn.7<..7F.;co|
0000bdd0  70 79 20 62 79 74 65 73  20 66 6f 72 77 61 72 64  |py bytes forward|
0000bde0  0d 37 50 2d 3b 20 20 27  d6 20 63 6f 70 79 66 77  |.7P-;  '. copyfw|
0000bdf0  64 2c 20 73 74 61 72 74  61 64 64 2c 20 65 6e 64  |d, startadd, end|
0000be00  61 64 64 2c 20 64 65 73  74 61 64 64 27 0d 37 5a  |add, destadd'.7Z|
0000be10  33 3b 6f 6e 20 65 6e 74  72 79 20 31 73 74 20 42  |3;on entry 1st B|
0000be20  41 53 49 43 20 70 61 72  61 6d 65 74 65 72 20 3d  |ASIC parameter =|
0000be30  20 73 6f 75 72 63 65 20  73 74 61 72 74 61 64 64  | source startadd|
0000be40  0d 37 64 36 3b 20 20 20  20 20 20 20 20 20 32 6e  |.7d6;         2n|
0000be50  64 20 42 41 53 49 43 20  70 61 72 61 6d 65 74 65  |d BASIC paramete|
0000be60  72 20 3d 20 73 6f 75 72  63 65 20 65 6e 64 20 61  |r = source end a|
0000be70  64 64 72 65 73 73 0d 37  6e 39 3b 20 20 20 20 20  |ddress.7n9;     |
0000be80  20 20 20 20 33 72 64 20  42 41 53 49 43 20 70 61  |    3rd BASIC pa|
0000be90  72 61 6d 65 74 65 72 20  3d 20 64 65 73 74 69 6e  |rameter = destin|
0000bea0  61 74 69 6f 6e 20 73 74  61 72 74 20 61 64 64 0d  |ation start add.|
0000beb0  37 78 26 3b 20 20 20 20  20 20 20 20 20 52 30 2c  |7x&;         R0,|
0000bec0  52 31 2c 52 32 2c 52 33  2c 52 34 20 63 6f 72 72  |R1,R2,R3,R4 corr|
0000bed0  75 70 74 65 64 0d 37 82  0c 2e 63 6f 70 79 66 77  |upted.7...copyfw|
0000bee0  64 0d 37 8c 44 4d 4f 56  20 20 20 52 31 2c 20 52  |d.7.DMOV   R1, R|
0000bef0  31 34 20 20 20 20 20 20  20 20 20 3b 52 32 20 73  |14         ;R2 s|
0000bf00  65 74 20 3d 20 73 6f 75  72 63 65 20 73 74 61 72  |et = source star|
0000bf10  74 20 61 64 64 20 28 31  73 74 20 70 61 72 61 6d  |t add (1st param|
0000bf20  65 74 65 72 29 0d 37 96  42 42 4c 20 20 20 70 61  |eter).7.BBL   pa|
0000bf30  72 61 6d 76 61 6c 75 65  73 20 20 20 20 20 20 3b  |ramvalues      ;|
0000bf40  52 33 20 73 65 74 20 3d  20 73 6f 75 72 63 65 20  |R3 set = source |
0000bf50  65 6e 64 20 61 64 64 20  28 32 6e 64 20 70 61 72  |end add (2nd par|
0000bf60  61 6d 65 74 65 72 29 0d  37 a0 42 4d 4f 56 20 20  |ameter).7.BMOV  |
0000bf70  20 52 31 34 2c 20 52 31  20 20 20 20 20 20 20 20  | R14, R1        |
0000bf80  20 3b 52 34 20 73 65 74  20 3d 20 64 65 73 74 20  | ;R4 set = dest |
0000bf90  73 74 61 72 74 20 61 64  64 20 28 33 72 64 20 70  |start add (3rd p|
0000bfa0  61 72 61 6d 65 74 65 72  29 0d 37 aa 10 2e 63 6f  |arameter).7...co|
0000bfb0  70 79 66 77 64 6c 6f 6f  70 0d 37 b4 16 4c 44 52  |pyfwdloop.7..LDR|
0000bfc0  42 20 20 52 30 2c 20 5b  52 32 5d 2c 20 23 31 0d  |B  R0, [R2], #1.|
0000bfd0  37 be 16 53 54 52 42 20  20 52 30 2c 20 5b 52 34  |7..STRB  R0, [R4|
0000bfe0  5d 2c 20 23 31 0d 37 c8  10 43 4d 50 20 20 20 52  |], #1.7..CMP   R|
0000bff0  32 2c 20 52 33 0d 37 d2  14 42 4c 45 20 20 63 6f  |2, R3.7..BLE  co|
0000c000  70 79 66 77 64 6c 6f 6f  70 0d 37 dc 21 4d 4f 56  |pyfwdloop.7.!MOV|
0000c010  20 20 20 70 63 2c 20 52  31 34 20 20 20 20 20 20  |   pc, R14      |
0000c020  20 20 20 3b 72 65 74 75  72 6e 0d 37 e6 04 0d 37  |   ;return.7...7|
0000c030  f0 3c 3b 63 6f 70 79 20  62 79 74 65 73 20 66 6f  |.<;copy bytes fo|
0000c040  72 77 61 72 64 20 62 75  74 20 63 6f 6e 76 65 72  |rward but conver|
0000c050  74 20 61 6e 79 20 69 6c  6c 65 67 61 6c 20 62 79  |t any illegal by|
0000c060  74 65 73 20 74 6f 20 26  46 46 0d 37 fa 33 3b 6f  |tes to &FF.7.3;o|
0000c070  6e 20 65 6e 74 72 79 20  31 73 74 20 42 41 53 49  |n entry 1st BASI|
0000c080  43 20 70 61 72 61 6d 65  74 65 72 20 3d 20 73 6f  |C parameter = so|
0000c090  75 72 63 65 20 73 74 61  72 74 61 64 64 0d 38 04  |urce startadd.8.|
0000c0a0  36 3b 20 20 20 20 20 20  20 20 20 32 6e 64 20 42  |6;         2nd B|
0000c0b0  41 53 49 43 20 70 61 72  61 6d 65 74 65 72 20 3d  |ASIC parameter =|
0000c0c0  20 73 6f 75 72 63 65 20  65 6e 64 20 61 64 64 72  | source end addr|
0000c0d0  65 73 73 0d 38 0e 39 3b  20 20 20 20 20 20 20 20  |ess.8.9;        |
0000c0e0  20 33 72 64 20 42 41 53  49 43 20 70 61 72 61 6d  | 3rd BASIC param|
0000c0f0  65 74 65 72 20 3d 20 64  65 73 74 69 6e 61 74 69  |eter = destinati|
0000c100  6f 6e 20 73 74 61 72 74  20 61 64 64 0d 38 18 3d  |on start add.8.=|
0000c110  3b 20 20 20 20 20 20 20  20 20 34 74 68 20 42 41  |;         4th BA|
0000c120  53 49 43 20 70 61 72 61  6d 65 74 65 72 20 3d 20  |SIC parameter = |
0000c130  6c 6f 77 20 6f 66 20 69  6c 6c 65 67 61 6c 20 62  |low of illegal b|
0000c140  79 74 65 20 72 61 6e 67  65 0d 38 22 3e 3b 20 20  |yte range.8">;  |
0000c150  20 20 20 20 20 20 20 35  74 68 20 42 41 53 49 43  |       5th BASIC|
0000c160  20 70 61 72 61 6d 65 74  65 72 20 3d 20 68 69 67  | parameter = hig|
0000c170  68 20 6f 66 20 69 6c 6c  65 67 61 6c 20 62 79 74  |h of illegal byt|
0000c180  65 20 72 61 6e 67 65 0d  38 2c 37 3b 20 20 20 20  |e range.8,7;    |
0000c190  20 20 20 20 20 36 74 68  20 42 41 53 49 43 20 70  |     6th BASIC p|
0000c1a0  61 72 61 6d 65 74 65 72  20 3d 20 65 78 69 74 20  |arameter = exit |
0000c1b0  70 61 72 61 6d 65 74 65  72 20 6f 6e 6c 79 0d 38  |parameter only.8|
0000c1c0  36 44 3b 6f 6e 20 65 78  69 74 20 20 36 74 68 20  |6D;on exit  6th |
0000c1d0  42 41 53 49 43 20 70 61  72 61 6d 65 74 65 72 20  |BASIC parameter |
0000c1e0  3d 20 b9 20 69 66 20 61  6e 79 20 62 79 74 65 73  |= . if any bytes|
0000c1f0  20 6e 65 65 64 65 64 20  63 6f 6e 76 65 72 74 69  | needed converti|
0000c200  6e 67 0d 38 40 2f 3b 20  20 20 20 20 20 20 20 20  |ng.8@/;         |
0000c210  52 30 2c 52 31 2c 52 32  2c 52 33 2c 52 34 2c 52  |R0,R1,R2,R3,R4,R|
0000c220  35 2c 52 36 2c 52 37 20  63 6f 72 72 75 70 74 65  |5,R6,R7 corrupte|
0000c230  64 0d 38 4a 0f 2e 73 65  6c 63 6f 70 79 66 77 64  |d.8J..selcopyfwd|
0000c240  0d 38 54 44 4d 4f 56 20  20 20 52 31 2c 20 52 31  |.8TDMOV   R1, R1|
0000c250  34 20 20 20 20 20 20 20  20 20 3b 52 32 20 73 65  |4         ;R2 se|
0000c260  74 20 3d 20 73 6f 75 72  63 65 20 73 74 61 72 74  |t = source start|
0000c270  20 61 64 64 20 28 31 73  74 20 70 61 72 61 6d 65  | add (1st parame|
0000c280  74 65 72 29 0d 38 5e 42  42 4c 20 20 20 70 61 72  |ter).8^BBL   par|
0000c290  61 6d 76 61 6c 75 65 73  20 20 20 20 20 20 3b 52  |amvalues      ;R|
0000c2a0  33 20 73 65 74 20 3d 20  73 6f 75 72 63 65 20 65  |3 set = source e|
0000c2b0  6e 64 20 61 64 64 20 28  32 6e 64 20 70 61 72 61  |nd add (2nd para|
0000c2c0  6d 65 74 65 72 29 0d 38  68 42 4d 4f 56 20 20 20  |meter).8hBMOV   |
0000c2d0  52 31 34 2c 20 52 31 20  20 20 20 20 20 20 20 20  |R14, R1         |
0000c2e0  3b 52 34 20 73 65 74 20  3d 20 64 65 73 74 20 73  |;R4 set = dest s|
0000c2f0  74 61 72 74 20 61 64 64  20 28 33 72 64 20 70 61  |tart add (3rd pa|
0000c300  72 61 6d 65 74 65 72 29  0d 38 72 37 20 20 20 20  |rameter).8r7    |
0000c310  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
0000c320  20 20 3b 52 35 20 74 6f  20 52 36 20 3d 20 69 6c  |  ;R5 to R6 = il|
0000c330  6c 65 67 61 6c 20 63 68  72 20 72 61 6e 67 65 0d  |legal chr range.|
0000c340  38 7c 29 4d 4f 56 20 20  20 52 37 2c 20 23 30 20  |8|)MOV   R7, #0 |
0000c350  20 20 20 20 20 20 20 20  20 3b 52 37 20 3d 20 30  |         ;R7 = 0|
0000c360  20 64 65 66 61 75 6c 74  0d 38 86 10 2e 73 65 6c  | default.8...sel|
0000c370  63 6f 70 79 66 77 64 31  0d 38 90 16 4c 44 52 42  |copyfwd1.8..LDRB|
0000c380  20 20 52 30 2c 20 5b 52  32 5d 2c 20 23 31 0d 38  |  R0, [R2], #1.8|
0000c390  9a 10 43 4d 50 20 20 20  52 30 2c 20 52 35 0d 38  |..CMP   R0, R5.8|
0000c3a0  a4 15 42 4c 54 20 20 20  73 65 6c 63 6f 70 79 66  |..BLT   selcopyf|
0000c3b0  77 64 32 0d 38 ae 29 43  4d 50 20 20 20 52 30 2c  |wd2.8.)CMP   R0,|
0000c3c0  20 52 36 20 20 20 20 20  20 20 20 20 20 3b 69 66  | R6          ;if|
0000c3d0  20 69 6c 6c 65 67 61 6c  20 63 68 72 0d 38 b8 25  | illegal chr.8.%|
0000c3e0  4d 4f 56 4c 45 20 52 30  2c 20 23 26 46 46 20 20  |MOVLE R0, #&FF  |
0000c3f0  20 20 20 20 20 20 3b 73  65 74 20 74 6f 20 26 46  |      ;set to &F|
0000c400  46 0d 38 c2 49 4d 56 4e  4c 45 20 52 37 2c 20 23  |F.8.IMVNLE R7, #|
0000c410  28 31 2d 31 29 20 20 20  20 20 20 3b 26 20 73 65  |(1-1)      ;& se|
0000c420  74 20 52 37 20 74 6f 20  2d 31 20 69 66 20 61 6e  |t R7 to -1 if an|
0000c430  79 20 62 79 74 65 20 68  61 64 20 74 6f 20 62 65  |y byte had to be|
0000c440  20 63 6f 6e 76 65 72 74  65 64 0d 38 cc 10 2e 73  | converted.8...s|
0000c450  65 6c 63 6f 70 79 66 77  64 32 0d 38 d6 16 53 54  |elcopyfwd2.8..ST|
0000c460  52 42 20 20 52 30 2c 20  5b 52 34 5d 2c 20 23 31  |RB  R0, [R4], #1|
0000c470  0d 38 e0 10 43 4d 50 20  20 20 52 32 2c 20 52 33  |.8..CMP   R2, R3|
0000c480  0d 38 ea 14 42 4c 45 20  20 73 65 6c 63 6f 70 79  |.8..BLE  selcopy|
0000c490  66 77 64 31 0d 38 f4 2e  4c 44 52 20 20 20 52 30  |fwd1.8..LDR   R0|
0000c4a0  2c 20 5b 52 39 5d 20 20  20 3b 67 65 74 20 6c 61  |, [R9]   ;get la|
0000c4b0  73 74 20 42 41 53 49 43  20 70 61 72 61 6d 65 74  |st BASIC paramet|
0000c4c0  65 72 0d 38 fe 24 53 54  52 20 20 20 52 37 2c 20  |er.8.$STR   R7, |
0000c4d0  5b 52 30 5d 20 20 20 3b  26 20 73 65 74 20 69 74  |[R0]   ;& set it|
0000c4e0  20 74 6f 20 52 35 0d 39  08 20 4d 4f 56 20 20 20  | to R5.9. MOV   |
0000c4f0  70 63 2c 20 52 31 34 20  20 20 20 20 20 20 20 3b  |pc, R14        ;|
0000c500  72 65 74 75 72 6e 0d 39  12 04 0d 39 1c 4c 3b 66  |return.9...9.L;f|
0000c510  69 6c 6c 20 62 61 63 6b  77 61 72 64 73 28 64 65  |ill backwards(de|
0000c520  73 74 69 6e 61 74 69 6f  6e 29 20 77 68 69 6c 65  |stination) while|
0000c530  20 73 6f 75 72 63 65 28  62 61 63 6b 77 61 72 64  | source(backward|
0000c540  73 29 20 63 6f 6e 74 69  6e 75 65 73 20 74 6f 20  |s) continues to |
0000c550  72 65 6d 61 69 6e 0d 39  26 30 3b 20 74 68 65 20  |remain.9&0; the |
0000c560  73 61 6d 65 2c 20 6f 72  20 75 6e 74 69 6c 20 65  |same, or until e|
0000c570  6e 64 28 73 6f 75 72 63  65 29 20 69 73 20 72 65  |nd(source) is re|
0000c580  61 63 68 65 64 2e 0d 39  30 3b 3b 6f 6e 20 65 6e  |ached..90;;on en|
0000c590  74 72 79 20 41 4c 4c 20  66 6f 6c 6c 6f 77 69 6e  |try ALL followin|
0000c5a0  67 20 6d 75 73 74 20 62  65 20 69 6e 74 65 67 65  |g must be intege|
0000c5b0  72 20 42 41 53 49 43 20  76 61 72 69 61 62 6c 65  |r BASIC variable|
0000c5c0  73 0d 39 3a 34 3b 20 20  20 20 20 20 20 20 20 31  |s.9:4;         1|
0000c5d0  73 74 20 42 41 53 49 43  20 70 61 72 61 6d 65 74  |st BASIC paramet|
0000c5e0  65 72 20 3d 20 73 6f 75  72 63 65 20 73 74 61 72  |er = source star|
0000c5f0  74 20 61 64 64 0d 39 44  4c 3b 20 20 20 20 20 20  |t add.9DL;      |
0000c600  20 20 20 32 6e 64 20 42  41 53 49 43 20 70 61 72  |   2nd BASIC par|
0000c610  61 6d 65 74 65 72 20 3d  20 73 6f 75 72 63 65 20  |ameter = source |
0000c620  65 6e 64 20 61 64 64 20  28 6d 75 73 74 20 62 65  |end add (must be|
0000c630  20 3c 20 31 73 74 20 70  61 72 61 6d 65 74 65 72  | < 1st parameter|
0000c640  29 0d 39 4e 39 3b 20 20  20 20 20 20 20 20 20 33  |).9N9;         3|
0000c650  72 64 20 42 41 53 49 43  20 70 61 72 61 6d 65 74  |rd BASIC paramet|
0000c660  65 72 20 3d 20 64 65 73  74 69 6e 61 74 69 6f 6e  |er = destination|
0000c670  20 73 74 61 72 74 20 61  64 64 0d 39 58 36 3b 20  | start add.9X6; |
0000c680  20 20 20 20 20 20 20 20  34 74 68 20 42 41 53 49  |        4th BASI|
0000c690  43 20 70 61 72 61 6d 65  74 65 72 20 3d 20 76 61  |C parameter = va|
0000c6a0  6c 75 65 20 74 6f 20 66  69 6c 6c 20 77 69 74 68  |lue to fill with|
0000c6b0  0d 39 62 3f 3b 20 20 20  20 20 20 20 20 20 35 74  |.9b?;         5t|
0000c6c0  68 20 42 41 53 49 43 20  70 61 72 61 6d 65 74 65  |h BASIC paramete|
0000c6d0  72 20 3d 20 65 78 69 74  20 76 61 6c 75 65 20 6f  |r = exit value o|
0000c6e0  6e 6c 79 20 28 73 65 65  20 62 65 6c 6f 77 29 0d  |nly (see below).|
0000c6f0  39 6c 4a 3b 6f 6e 20 65  78 69 74 20 35 74 68 20  |9lJ;on exit 5th |
0000c700  42 41 53 49 43 20 76 61  72 69 61 62 6c 65 20 69  |BASIC variable i|
0000c710  73 20 73 65 74 20 3d 20  61 64 64 72 65 73 73 20  |s set = address |
0000c720  77 68 65 72 65 20 73 6f  75 72 63 65 20 62 79 74  |where source byt|
0000c730  65 20 63 68 61 6e 67 65  64 0d 39 76 48 3b 20 20  |e changed.9vH;  |
0000c740  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
*
0000c760  6f 72 20 28 65 6e 64 61  64 64 2d 31 29 20 69 66  |or (endadd-1) if|
0000c770  20 6e 6f 20 63 68 61 6e  67 65 20 6f 63 63 75 72  | no change occur|
0000c780  73 0d 39 80 12 2e 6c 69  6d 69 74 66 69 6c 6c 62  |s.9...limitfillb|
0000c790  61 63 6b 0d 39 8a 34 4d  4f 56 20 20 20 52 31 2c  |ack.9.4MOV   R1,|
0000c7a0  20 52 31 34 20 20 20 20  20 20 20 20 20 3b 52 32  | R14         ;R2|
0000c7b0  20 73 65 74 20 3d 20 73  6f 75 72 63 65 20 73 74  | set = source st|
0000c7c0  61 72 74 20 61 64 64 0d  39 94 32 42 4c 20 20 20  |art add.9.2BL   |
0000c7d0  70 61 72 61 6d 76 61 6c  75 65 73 20 20 20 20 20  |paramvalues     |
0000c7e0  20 3b 52 33 20 73 65 74  20 3d 20 73 6f 75 72 63  | ;R3 set = sourc|
0000c7f0  65 20 65 6e 64 20 61 64  64 0d 39 9e 32 4d 4f 56  |e end add.9.2MOV|
0000c800  20 20 20 52 31 34 2c 20  52 31 20 20 20 20 20 20  |   R14, R1      |
0000c810  20 20 20 3b 52 34 20 73  65 74 20 3d 20 64 65 73  |   ;R4 set = des|
0000c820  74 20 73 74 61 72 74 20  61 64 64 0d 39 a8 2e 20  |t start add.9.. |
0000c830  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
0000c840  20 20 20 20 20 3b 52 35  20 73 65 74 20 3d 20 66  |     ;R5 set = f|
0000c850  69 6c 6c 20 76 61 6c 75  65 0d 39 b2 31 4c 44 52  |ill value.9.1LDR|
0000c860  42 20 20 52 31 2c 20 5b  52 32 5d 20 20 20 20 20  |B  R1, [R2]     |
0000c870  20 20 20 3b 67 65 74 20  66 69 72 73 74 20 73 6f  |   ;get first so|
0000c880  75 72 63 65 20 76 61 6c  75 65 0d 39 bc 3b 41 44  |urce value.9.;AD|
0000c890  44 20 20 20 52 34 2c 20  52 34 2c 20 23 31 20 20  |D   R4, R4, #1  |
0000c8a0  20 20 20 20 3b 20 69 6e  63 72 65 6d 65 6e 74 20  |    ; increment |
0000c8b0  52 33 20 28 61 73 20 69  6e 69 74 69 61 6c 20 76  |R3 (as initial v|
0000c8c0  61 6c 75 65 29 0d 39 c6  13 2e 6c 69 6d 69 74 66  |alue).9...limitf|
0000c8d0  69 6c 6c 62 61 63 6b 31  0d 39 d0 36 43 4d 50 20  |illback1.9.6CMP |
0000c8e0  20 20 52 32 2c 20 52 33  20 20 20 20 20 20 20 20  |  R2, R3        |
0000c8f0  20 20 3b 20 73 74 6f 70  20 66 69 6c 6c 69 6e 67  |  ; stop filling|
0000c900  20 77 68 65 6e 20 70 61  73 74 20 65 6e 64 0d 39  | when past end.9|
0000c910  da 1a 42 4c 54 20 20 20  6c 69 6d 69 74 66 69 6c  |..BLT   limitfil|
0000c920  6c 62 61 63 6b 65 6e 64  0d 39 e4 18 53 54 52 42  |lbackend.9..STRB|
0000c930  20 20 52 35 2c 20 5b 52  34 2c 20 23 2d 31 5d 21  |  R5, [R4, #-1]!|
0000c940  0d 39 ee 18 4c 44 52 42  20 20 52 30 2c 20 5b 52  |.9..LDRB  R0, [R|
0000c950  32 2c 20 23 2d 31 5d 21  0d 39 f8 37 43 4d 50 20  |2, #-1]!.9.7CMP |
0000c960  20 20 52 30 2c 20 52 31  20 20 20 20 20 20 20 20  |  R0, R1        |
0000c970  20 20 3b 6f 72 20 77 68  65 6e 20 73 6f 75 72 63  |  ;or when sourc|
0000c980  65 20 76 61 6c 75 65 20  63 68 61 6e 67 65 73 0d  |e value changes.|
0000c990  3a 02 18 42 45 51 20 20  20 6c 69 6d 69 74 66 69  |:..BEQ   limitfi|
0000c9a0  6c 6c 62 61 63 6b 31 0d  3a 0c 15 2e 6c 69 6d 69  |llback1.:...limi|
0000c9b0  74 66 69 6c 6c 62 61 63  6b 65 6e 64 0d 3a 16 32  |tfillbackend.:.2|
0000c9c0  4c 44 52 20 20 20 52 30  2c 20 5b 52 39 5d 20 20  |LDR   R0, [R9]  |
0000c9d0  20 3b 67 65 74 20 6c 61  73 74 20 42 41 53 49 43  | ;get last BASIC|
0000c9e0  20 70 61 72 61 6d 65 74  65 72 20 61 64 64 0d 3a  | parameter add.:|
0000c9f0  20 29 53 54 52 20 20 20  52 32 2c 20 5b 52 30 5d  | )STR   R2, [R0]|
0000ca00  20 20 20 3b 26 20 75 70  64 61 74 65 20 69 74 20  |   ;& update it |
0000ca10  77 69 74 68 20 52 32 0d  3a 2a 26 4d 4f 56 20 20  |with R2.:*&MOV  |
0000ca20  20 70 63 2c 20 52 31 34  20 20 20 20 20 20 20 20  | pc, R14        |
0000ca30  20 20 20 20 20 20 3b 72  65 74 75 72 6e 0d 3a 34  |      ;return.:4|
0000ca40  04 0d 3a 3e 04 0d 3a 48  30 3b 46 69 6e 64 20 44  |..:>..:H0;Find D|
0000ca50  6f 75 62 6c 65 20 44 65  6e 73 69 74 79 20 49 44  |ouble Density ID|
0000ca60  20 61 64 64 72 65 73 73  20 6d 61 72 6b 20 70 61  | address mark pa|
0000ca70  74 74 65 72 6e 0d 3a 52  42 3b 20 61 73 20 66 6f  |ttern.:RB; as fo|
0000ca80  72 20 66 69 6e 64 41 4d  20 62 65 6c 6f 77 20 62  |r findAM below b|
0000ca90  75 74 20 6f 6e 6c 79 20  49 44 20 61 64 64 72 65  |ut only ID addre|
0000caa0  73 73 20 6d 61 72 6b 73  20 61 72 65 20 6c 6f 6f  |ss marks are loo|
0000cab0  6b 65 64 20 66 6f 72 0d  3a 5c 35 3b 20 65 78 63  |ked for.:\5; exc|
0000cac0  65 70 74 20 52 35 20 69  73 20 61 6c 73 6f 20 63  |ept R5 is also c|
0000cad0  6f 72 72 75 70 74 65 64  20 28 75 73 65 64 20 74  |orrupted (used t|
0000cae0  6f 20 73 61 76 65 20 6c  69 6e 6b 29 0d 3a 66 0d  |o save link).:f.|
0000caf0  2e 44 44 66 69 6e 64 49  44 0d 3a 70 23 4d 4f 56  |.DDfindID.:p#MOV|
0000cb00  20 20 20 52 35 2c 20 52  31 34 20 20 20 20 20 20  |   R5, R14      |
0000cb10  20 20 3b 73 61 76 65 20  6c 69 6e 6b 0d 3a 7a 11  |  ;save link.:z.|
0000cb20  42 4c 20 20 20 44 44 66  69 6e 64 41 4d 0d 3a 84  |BL   DDfindAM.:.|
0000cb30  26 4d 4f 56 20 20 20 52  31 34 2c 20 52 35 20 20  |&MOV   R14, R5  |
0000cb40  20 20 20 20 20 20 3b 72  65 73 74 6f 72 65 20 6c  |      ;restore l|
0000cb50  69 6e 6b 0d 3a 8e 2d 43  4d 50 20 20 20 52 32 2c  |ink.:.-CMP   R2,|
0000cb60  20 23 30 20 20 20 20 20  20 20 20 20 3b 61 64 64  | #0         ;add|
0000cb70  3d 30 3f 20 20 20 20 74  68 65 6e 20 65 78 69 74  |=0?    then exit|
0000cb80  0d 3a 98 15 42 45 51 20  20 20 44 44 66 69 6e 64  |.:..BEQ   DDfind|
0000cb90  49 44 65 6e 64 0d 3a a2  16 4c 44 52 42 20 20 52  |IDend.:..LDRB  R|
0000cba0  30 2c 20 5b 52 32 2c 23  2d 31 5d 0d 3a ac 3c 43  |0, [R2,#-1].:.<C|
0000cbb0  4d 50 20 20 20 52 30 2c  20 23 26 46 43 20 20 20  |MP   R0, #&FC   |
0000cbc0  20 20 20 20 3b 6d 61 72  6b 3d 26 46 43 2c 26 46  |    ;mark=&FC,&F|
0000cbd0  44 2c 26 46 45 2c 20 6f  72 20 26 46 46 20 74 68  |D,&FE, or &FF th|
0000cbe0  65 6e 20 65 78 69 74 0d  3a b6 11 42 4c 54 20 20  |en exit.:..BLT  |
0000cbf0  44 44 66 69 6e 64 49 44  0d 3a c0 10 2e 44 44 66  |DDfindID.:...DDf|
0000cc00  69 6e 64 49 44 65 6e 64  0d 3a ca 20 4d 4f 56 20  |indIDend.:. MOV |
0000cc10  20 20 52 31 35 2c 20 52  31 34 20 20 20 20 20 20  |  R15, R14      |
0000cc20  20 3b 72 65 74 75 72 6e  0d 3a d4 04 0d 3a de 04  | ;return.:...:..|
0000cc30  0d 3a e8 44 3b 46 69 6e  64 20 44 6f 75 62 6c 65  |.:.D;Find Double|
0000cc40  20 44 65 6e 73 69 74 79  20 61 64 64 72 65 73 73  | Density address|
0000cc50  20 6d 61 72 6b 20 70 61  74 74 65 72 6e 20 66 72  | mark pattern fr|
0000cc60  6f 6d 20 27 52 65 61 64  20 54 72 61 63 6b 27 20  |om 'Read Track' |
0000cc70  64 61 74 61 0d 3a f2 22  3b 20 69 6e 63 6c 75 64  |data.:."; includ|
0000cc80  69 6e 67 20 65 78 74 72  61 20 74 65 73 74 73 20  |ing extra tests |
0000cc90  66 6f 72 20 49 44 0d 3a  fc 2c 3b 6f 6e 20 65 6e  |for ID.:.,;on en|
0000cca0  74 72 79 20 31 73 74 20  42 41 53 49 43 20 70 61  |try 1st BASIC pa|
0000ccb0  72 61 6d 65 74 65 72 20  3d 20 73 74 61 72 74 61  |rameter = starta|
0000ccc0  64 64 0d 3b 06 2f 3b 20  20 20 20 20 20 20 20 20  |dd.;./;         |
0000ccd0  32 6e 64 20 42 41 53 49  43 20 70 61 72 61 6d 65  |2nd BASIC parame|
0000cce0  74 65 72 20 3d 20 65 6e  64 20 61 64 64 72 65 73  |ter = end addres|
0000ccf0  73 0d 3b 10 2c 3b 6f 6e  20 65 78 69 74 20 20 31  |s.;.,;on exit  1|
0000cd00  73 74 20 42 41 53 49 43  20 70 61 72 61 6d 65 74  |st BASIC paramet|
0000cd10  65 72 20 69 73 20 75 70  64 61 74 65 64 0d 3b 1a  |er is updated.;.|
0000cd20  27 3b 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |';              |
0000cd30  20 20 20 20 3d 20 30 20  69 66 20 6e 6f 74 20 66  |    = 0 if not f|
0000cd40  6f 75 6e 64 0d 3b 24 3f  3b 20 20 20 20 20 20 20  |ound.;$?;       |
0000cd50  20 20 20 20 20 20 20 20  20 20 20 3c 3e 20 30 2c  |           <> 0,|
0000cd60  20 3d 20 61 64 64 72 65  73 73 20 6f 66 20 73 74  | = address of st|
0000cd70  61 72 74 20 6f 66 20 41  64 64 72 65 73 73 20 4d  |art of Address M|
0000cd80  61 72 6b 0d 3b 2e 2d 3b  20 20 20 20 20 20 20 20  |ark.;.-;        |
0000cd90  20 52 32 3d 20 73 61 6d  65 20 61 73 20 42 41 53  | R2= same as BAS|
0000cda0  49 43 20 31 73 74 20 70  61 72 61 6d 65 74 65 72  |IC 1st parameter|
0000cdb0  0d 3b 38 31 3b 20 20 20  20 20 20 20 20 20 52 33  |.;81;         R3|
0000cdc0  3d 20 42 41 53 49 43 20  32 6e 64 20 70 61 72 61  |= BASIC 2nd para|
0000cdd0  6d 65 74 65 72 20 28 75  6e 61 6c 74 65 72 65 64  |meter (unaltered|
0000cde0  29 0d 3b 42 22 3b 20 20  20 20 20 20 20 20 20 52  |).;B";         R|
0000cdf0  30 2c 20 52 31 2c 20 52  34 20 63 6f 72 72 75 70  |0, R1, R4 corrup|
0000ce00  74 65 64 0d 3b 4c 0d 2e  44 44 66 69 6e 64 41 4d  |ted.;L..DDfindAM|
0000ce10  0d 3b 56 11 4d 4f 56 20  20 20 52 31 2c 20 52 31  |.;V.MOV   R1, R1|
0000ce20  34 0d 3b 60 44 42 4c 20  20 20 70 61 72 61 6d 76  |4.;`DBL   paramv|
0000ce30  61 6c 75 65 73 20 20 20  20 20 20 3b 52 32 20 73  |alues      ;R2 s|
0000ce40  65 74 20 3d 20 31 73 74  20 70 61 72 61 6d 65 74  |et = 1st paramet|
0000ce50  65 72 20 61 64 64 28 73  74 61 72 74 20 61 64 64  |er add(start add|
0000ce60  72 65 73 73 29 0d 3b 6a  42 4d 4f 56 20 20 20 52  |ress).;jBMOV   R|
0000ce70  31 34 2c 20 52 31 20 20  20 20 20 20 20 20 20 3b  |14, R1         ;|
0000ce80  52 33 20 73 65 74 20 3d  20 32 6e 64 20 70 61 72  |R3 set = 2nd par|
0000ce90  61 6d 65 74 65 72 20 61  64 64 28 65 6e 64 20 61  |ameter add(end a|
0000cea0  64 64 72 65 73 73 29 0d  3b 74 14 53 55 42 20 20  |ddress).;t.SUB  |
0000ceb0  20 52 32 2c 20 52 32 2c  20 23 31 0d 3b 7e 11 2e  | R2, R2, #1.;~..|
0000cec0  44 44 66 69 6e 64 41 4d  6c 6f 6f 70 0d 3b 88 10  |DDfindAMloop.;..|
0000ced0  43 4d 50 20 20 20 52 32  2c 20 52 33 0d 3b 92 15  |CMP   R2, R3.;..|
0000cee0  42 45 51 20 20 44 44 41  4d 6e 6f 74 66 6f 75 6e  |BEQ  DDAMnotfoun|
0000cef0  64 0d 3b 9c 45 4c 44 52  42 20 20 52 30 2c 20 5b  |d.;.ELDRB  R0, [|
0000cf00  52 32 2c 20 23 31 5d 21  20 20 3b 52 32 20 65 6e  |R2, #1]!  ;R2 en|
0000cf10  64 73 20 75 70 20 3d 20  61 64 64 20 6f 66 20 63  |ds up = add of c|
0000cf20  75 72 72 65 6e 74 20 62  79 74 65 20 63 6f 6d 70  |urrent byte comp|
0000cf30  61 72 69 73 6f 6e 0d 3b  a6 2a 43 4d 50 20 20 20  |arison.;.*CMP   |
0000cf40  52 30 2c 20 23 26 41 31  20 20 20 20 20 20 20 3b  |R0, #&A1       ;|
0000cf50  66 69 72 73 74 20 26 41  31 20 61 74 20 61 64 64  |first &A1 at add|
0000cf60  0d 3b b0 15 42 4e 45 20  20 44 44 66 69 6e 64 41  |.;..BNE  DDfindA|
0000cf70  4d 6c 6f 6f 70 0d 3b ba  16 4c 44 52 42 20 20 52  |Mloop.;..LDRB  R|
0000cf80  30 2c 20 5b 52 32 2c 20  23 31 5d 0d 3b c4 2d 43  |0, [R2, #1].;.-C|
0000cf90  4d 50 20 20 20 52 30 2c  20 23 26 41 31 20 20 20  |MP   R0, #&A1   |
0000cfa0  20 20 20 20 3b 73 65 63  6f 6e 64 20 26 41 31 20  |    ;second &A1 |
0000cfb0  61 74 20 61 64 64 2b 31  0d 3b ce 15 42 4e 45 20  |at add+1.;..BNE |
0000cfc0  20 44 44 66 69 6e 64 41  4d 6c 6f 6f 70 0d 3b d8  | DDfindAMloop.;.|
0000cfd0  2f 4c 44 52 42 20 20 52  30 2c 20 5b 52 32 2c 20  |/LDRB  R0, [R2, |
0000cfe0  23 32 5d 20 20 20 3b 66  6f 75 6e 64 20 26 41 31  |#2]   ;found &A1|
0000cff0  2c 26 41 31 20 70 61 74  74 65 72 6e 0d 3b e2 12  |,&A1 pattern.;..|
0000d000  43 4d 50 20 20 20 52 30  2c 20 23 26 46 38 0d 3b  |CMP   R0, #&F8.;|
0000d010  ec 15 42 4c 54 20 20 44  44 66 69 6e 64 41 4d 6c  |..BLT  DDfindAMl|
0000d020  6f 6f 70 0d 3b f6 44 2e  44 44 66 6f 75 6e 64 41  |oop.;.D.DDfoundA|
0000d030  4d 20 20 20 20 20 20 20  20 20 20 20 3b 46 4f 55  |M           ;FOU|
0000d040  4e 44 20 20 26 41 31 2c  26 41 31 2c 26 46 78 20  |ND  &A1,&A1,&Fx |
0000d050  70 61 74 74 65 72 6e 2c  20 77 68 65 72 65 20 26  |pattern, where &|
0000d060  46 78 20 3e 26 46 37 0d  3c 00 41 41 44 44 20 20  |Fx >&F7.<.AADD  |
0000d070  20 52 32 2c 20 52 32 2c  20 23 33 20 20 20 20 20  | R2, R2, #3     |
0000d080  3b 20 70 6f 69 6e 74 20  74 6f 20 66 69 72 73 74  |; point to first|
0000d090  20 62 79 74 65 20 6f 66  20 49 44 20 6f 72 20 44  | byte of ID or D|
0000d0a0  61 74 61 20 41 72 65 61  0d 3c 0a 13 42 20 20 20  |ata Area.<..B   |
0000d0b0  44 44 66 69 6e 64 41 4d  65 6e 64 0d 3c 14 11 2e  |DDfindAMend.<...|
0000d0c0  44 44 41 4d 6e 6f 74 66  6f 75 6e 64 0d 3c 1e 0f  |DDAMnotfound.<..|
0000d0d0  4d 4f 56 20 20 52 32 2c  20 23 30 0d 3c 28 10 2e  |MOV  R2, #0.<(..|
0000d0e0  44 44 66 69 6e 64 41 4d  65 6e 64 0d 3c 32 3e 4c  |DDfindAMend.<2>L|
0000d0f0  44 52 20 20 20 52 30 2c  20 5b 52 39 2c 20 23 38  |DR   R0, [R9, #8|
0000d100  5d 20 20 20 3b 67 65 74  20 31 73 74 20 70 61 72  |]   ;get 1st par|
0000d110  61 6d 65 74 65 72 20 61  64 64 28 73 74 61 72 74  |ameter add(start|
0000d120  20 61 64 64 72 65 73 73  29 0d 3c 3c 2d 53 54 52  | address).<<-STR|
0000d130  20 20 20 52 32 2c 20 5b  52 30 5d 20 20 20 20 20  |   R2, [R0]     |
0000d140  20 20 3b 26 20 75 70 64  61 74 65 20 69 74 20 77  |  ;& update it w|
0000d150  69 74 68 20 52 32 0d 3c  46 11 4d 4f 56 20 20 20  |ith R2.<F.MOV   |
0000d160  70 63 2c 20 52 31 34 0d  3c 50 04 0d 3c 5a 04 0d  |pc, R14.<P..<Z..|
0000d170  3c 64 30 3b 46 69 6e 64  20 53 69 6e 67 6c 65 20  |<d0;Find Single |
0000d180  44 65 6e 73 69 74 79 20  49 44 20 61 64 64 72 65  |Density ID addre|
0000d190  73 73 20 6d 61 72 6b 20  70 61 74 74 65 72 6e 0d  |ss mark pattern.|
0000d1a0  3c 6e 42 3b 20 61 73 20  66 6f 72 20 66 69 6e 64  |<nB; as for find|
0000d1b0  41 4d 20 62 65 6c 6f 77  20 62 75 74 20 6f 6e 6c  |AM below but onl|
0000d1c0  79 20 49 44 20 61 64 64  72 65 73 73 20 6d 61 72  |y ID address mar|
0000d1d0  6b 73 20 61 72 65 20 6c  6f 6f 6b 65 64 20 66 6f  |ks are looked fo|
0000d1e0  72 0d 3c 78 35 3b 20 65  78 63 65 70 74 20 52 37  |r.<x5; except R7|
0000d1f0  20 69 73 20 61 6c 73 6f  20 63 6f 72 72 75 70 74  | is also corrupt|
0000d200  65 64 20 28 75 73 65 64  20 74 6f 20 73 61 76 65  |ed (used to save|
0000d210  20 6c 69 6e 6b 29 0d 3c  82 0d 2e 53 44 66 69 6e  | link).<...SDfin|
0000d220  64 49 44 0d 3c 8c 23 4d  4f 56 20 20 20 52 37 2c  |dID.<.#MOV   R7,|
0000d230  20 52 31 34 20 20 20 20  20 20 20 20 3b 73 61 76  | R14        ;sav|
0000d240  65 20 6c 69 6e 6b 0d 3c  96 11 42 4c 20 20 20 53  |e link.<..BL   S|
0000d250  44 66 69 6e 64 41 4d 0d  3c a0 26 4d 4f 56 20 20  |DfindAM.<.&MOV  |
0000d260  20 52 31 34 2c 20 52 37  20 20 20 20 20 20 20 20  | R14, R7        |
0000d270  3b 72 65 73 74 6f 72 65  20 6c 69 6e 6b 0d 3c aa  |;restore link.<.|
0000d280  2d 43 4d 50 20 20 20 52  32 2c 20 23 30 20 20 20  |-CMP   R2, #0   |
0000d290  20 20 20 20 20 20 3b 61  64 64 3d 30 3f 20 20 20  |      ;add=0?   |
0000d2a0  20 74 68 65 6e 20 65 78  69 74 0d 3c b4 17 4c 44  | then exit.<..LD|
0000d2b0  52 4e 45 42 20 52 30 2c  20 5b 52 32 2c 23 2d 31  |RNEB R0, [R2,#-1|
0000d2c0  5d 0d 3c be 2d 43 4d 50  4e 45 20 52 30 2c 20 23  |].<.-CMPNE R0, #|
0000d2d0  26 46 45 20 20 20 20 20  20 20 3b 6d 61 72 6b 3d  |&FE       ;mark=|
0000d2e0  26 46 45 3f 20 74 68 65  6e 20 65 78 69 74 0d 3c  |&FE? then exit.<|
0000d2f0  c8 11 42 4e 45 20 20 53  44 66 69 6e 64 49 44 0d  |..BNE  SDfindID.|
0000d300  3c d2 1f 4d 4f 56 20 20  20 70 63 2c 20 52 31 34  |<..MOV   pc, R14|
0000d310  20 20 20 20 20 20 20 3b  72 65 74 75 72 6e 0d 3c  |       ;return.<|
0000d320  dc 04 0d 3c e6 44 3b 66  69 6e 64 20 53 69 6e 67  |...<.D;find Sing|
0000d330  6c 65 20 44 65 6e 73 69  74 79 20 61 64 64 72 65  |le Density addre|
0000d340  73 73 20 6d 61 72 6b 20  70 61 74 74 65 72 6e 20  |ss mark pattern |
0000d350  66 72 6f 6d 20 27 52 65  61 64 20 54 72 61 63 6b  |from 'Read Track|
0000d360  27 20 64 61 74 61 0d 3c  f0 29 3b 20 26 20 73 65  |' data.<.); & se|
0000d370  74 20 63 6f 72 72 75 70  74 65 64 20 4d 61 72 6b  |t corrupted Mark|
0000d380  20 62 79 74 65 20 63 6f  72 72 65 63 74 6c 79 0d  | byte correctly.|
0000d390  3c fa 3d 3b ac 45 20 74  68 69 73 20 69 73 20 ac  |<.=;.E this is .|
0000d3a0  20 61 20 66 6f 6f 6c 2d  70 72 6f 6f 66 20 74 65  | a fool-proof te|
0000d3b0  73 74 2c 20 28 62 75 74  20 68 61 73 20 6e 6f 74  |st, (but has not|
0000d3c0  20 66 61 69 6c 65 64 20  79 65 74 29 0d 3d 04 2c  | failed yet).=.,|
0000d3d0  3b 6f 6e 20 65 6e 74 72  79 20 31 73 74 20 42 41  |;on entry 1st BA|
0000d3e0  53 49 43 20 70 61 72 61  6d 65 74 65 72 20 3d 20  |SIC parameter = |
0000d3f0  73 74 61 72 74 61 64 64  0d 3d 0e 2f 3b 20 20 20  |startadd.=./;   |
0000d400  20 20 20 20 20 20 32 6e  64 20 42 41 53 49 43 20  |      2nd BASIC |
0000d410  70 61 72 61 6d 65 74 65  72 20 3d 20 65 6e 64 20  |parameter = end |
0000d420  61 64 64 72 65 73 73 0d  3d 18 2c 3b 6f 6e 20 65  |address.=.,;on e|
0000d430  78 69 74 20 20 31 73 74  20 42 41 53 49 43 20 70  |xit  1st BASIC p|
0000d440  61 72 61 6d 65 74 65 72  20 69 73 20 75 70 64 61  |arameter is upda|
0000d450  74 65 64 0d 3d 22 28 3b  20 20 20 20 20 20 20 20  |ted.="(;        |
0000d460  20 20 20 20 20 20 20 20  20 20 3d 20 20 30 20 69  |          =  0 i|
0000d470  66 20 6e 6f 74 20 66 6f  75 6e 64 0d 3d 2c 3f 3b  |f not found.=,?;|
0000d480  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
0000d490  20 20 3c 3e 20 30 2c 20  3d 20 61 64 64 72 65 73  |  <> 0, = addres|
0000d4a0  73 20 6f 66 20 73 74 61  72 74 20 6f 66 20 41 64  |s of start of Ad|
0000d4b0  64 72 65 73 73 20 4d 61  72 6b 0d 3d 36 2d 3b 20  |dress Mark.=6-; |
0000d4c0  20 20 20 20 20 20 20 20  52 32 3d 20 73 61 6d 65  |        R2= same|
0000d4d0  20 61 73 20 42 41 53 49  43 20 31 73 74 20 70 61  | as BASIC 1st pa|
0000d4e0  72 61 6d 65 74 65 72 0d  3d 40 31 3b 20 20 20 20  |rameter.=@1;    |
0000d4f0  20 20 20 20 20 52 33 3d  20 42 41 53 49 43 20 32  |     R3= BASIC 2|
0000d500  6e 64 20 70 61 72 61 6d  65 74 65 72 20 28 75 6e  |nd parameter (un|
0000d510  61 6c 74 65 72 65 64 29  0d 3d 4a 26 3b 20 20 20  |altered).=J&;   |
0000d520  20 20 20 20 20 20 52 30  2c 20 52 31 2c 20 52 34  |      R0, R1, R4|
0000d530  2c 20 52 35 20 63 6f 72  72 75 70 74 65 64 0d 3d  |, R5 corrupted.=|
0000d540  54 0d 2e 53 44 66 69 6e  64 41 4d 0d 3d 5e 11 4d  |T..SDfindAM.=^.M|
0000d550  4f 56 20 20 20 52 31 2c  20 52 31 34 0d 3d 68 44  |OV   R1, R14.=hD|
0000d560  42 4c 20 20 20 70 61 72  61 6d 76 61 6c 75 65 73  |BL   paramvalues|
0000d570  20 20 20 20 20 20 3b 52  32 20 73 65 74 20 3d 20  |      ;R2 set = |
0000d580  31 73 74 20 70 61 72 61  6d 65 74 65 72 20 61 64  |1st parameter ad|
0000d590  64 28 73 74 61 72 74 20  61 64 64 72 65 73 73 29  |d(start address)|
0000d5a0  0d 3d 72 42 4d 4f 56 20  20 20 52 31 34 2c 20 52  |.=rBMOV   R14, R|
0000d5b0  31 20 20 20 20 20 20 20  20 20 3b 52 33 20 73 65  |1         ;R3 se|
0000d5c0  74 20 3d 20 32 6e 64 20  70 61 72 61 6d 65 74 65  |t = 2nd paramete|
0000d5d0  72 20 61 64 64 28 65 6e  64 20 61 64 64 72 65 73  |r add(end addres|
0000d5e0  73 29 0d 3d 7c 14 53 55  42 20 20 20 52 32 2c 20  |s).=|.SUB   R2, |
0000d5f0  52 32 2c 20 23 31 0d 3d  86 11 2e 53 44 66 69 6e  |R2, #1.=...SDfin|
0000d600  64 41 4d 6c 6f 6f 70 0d  3d 90 10 43 4d 50 20 20  |dAMloop.=..CMP  |
0000d610  20 52 32 2c 20 52 33 0d  3d 9a 15 42 45 51 20 20  | R2, R3.=..BEQ  |
0000d620  53 44 41 4d 6e 6f 74 66  6f 75 6e 64 0d 3d a4 46  |SDAMnotfound.=.F|
0000d630  4c 44 52 42 20 20 52 30  2c 20 5b 52 32 2c 20 23  |LDRB  R0, [R2, #|
0000d640  31 5d 21 20 20 20 3b 52  32 20 65 6e 64 73 20 75  |1]!   ;R2 ends u|
0000d650  70 20 3d 20 61 64 64 20  6f 66 20 63 75 72 72 65  |p = add of curre|
0000d660  6e 74 20 62 79 74 65 20  63 6f 6d 70 61 72 69 73  |nt byte comparis|
0000d670  6f 6e 0d 3d ae 17 4c 44  52 42 20 20 52 34 2c 20  |on.=..LDRB  R4, |
0000d680  5b 52 32 2c 20 23 2d 32  5d 0d 3d b8 14 80 20 20  |[R2, #-2].=...  |
0000d690  20 52 31 2c 20 52 34 2c  20 23 26 33 30 0d 3d c2  | R1, R4, #&30.=.|
0000d6a0  38 82 20 20 20 52 31 2c  20 52 31 2c 20 52 30 20  |8.   R1, R1, R0 |
0000d6b0  20 20 20 20 20 3b 52 31  3d 20 70 6f 73 73 69 62  |     ;R1= possib|
0000d6c0  6c 65 20 72 65 63 6f 6e  73 74 72 75 63 74 65 64  |le reconstructed|
0000d6d0  20 4d 61 72 6b 0d 3d cc  23 43 4d 50 20 20 20 52  | Mark.=.#CMP   R|
0000d6e0  31 2c 20 23 26 46 45 20  20 20 20 20 20 20 20 3b  |1, #&FE        ;|
0000d6f0  49 44 20 6d 61 72 6b 3f  0d 3d d6 2a 43 4d 50 4e  |ID mark?.=.*CMPN|
0000d700  45 20 52 31 2c 20 23 26  46 42 20 20 20 20 20 20  |E R1, #&FB      |
0000d710  20 20 3b 64 61 74 61 20  41 72 65 61 20 6d 61 72  |  ;data Area mar|
0000d720  6b 3f 0d 3d e0 29 43 4d  50 4e 45 20 52 31 2c 20  |k?.=.)CMPNE R1, |
0000d730  23 26 46 38 20 20 20 20  20 20 20 20 3b 64 65 6c  |#&F8        ;del|
0000d740  20 64 61 74 61 20 6d 61  72 6b 3f 0d 3d ea 14 42  | data mark?.=..B|
0000d750  4e 45 20 53 44 66 69 6e  64 41 4d 6c 6f 6f 70 0d  |NE SDfindAMloop.|
0000d760  3d f4 10 43 4d 50 20 20  20 52 34 2c 20 23 30 0d  |=..CMP   R4, #0.|
0000d770  3d fe 3b 43 4d 50 4e 45  20 52 34 2c 20 23 26 46  |=.;CMPNE R4, #&F|
0000d780  46 20 20 20 20 20 20 20  20 3b 74 65 73 74 20 61  |F        ;test a|
0000d790  64 64 2d 32 20 74 6f 20  61 64 64 2d 35 20 3d 20  |dd-2 to add-5 = |
0000d7a0  26 30 30 20 6f 72 20 26  46 46 0d 3e 08 15 42 4e  |&00 or &FF.>..BN|
0000d7b0  45 20 20 53 44 66 69 6e  64 41 4d 6c 6f 6f 70 0d  |E  SDfindAMloop.|
0000d7c0  3e 12 26 4d 56 4e 20 20  20 52 35 2c 20 23 28 32  |>.&MVN   R5, #(2|
0000d7d0  2d 31 29 20 20 20 20 20  20 3b 28 73 65 74 20 52  |-1)      ;(set R|
0000d7e0  35 3d 2d 32 29 0d 3e 1c  15 2e 53 44 66 69 6e 64  |5=-2).>...SDfind|
0000d7f0  41 4d 73 79 6e 63 6c 6f  6f 70 0d 3e 26 21 43 4d  |AMsyncloop.>&!CM|
0000d800  4e 20 20 20 52 35 2c 20  23 35 20 20 20 20 20 20  |N   R5, #5      |
0000d810  20 20 20 20 3b 28 3d 2d  35 3f 29 0d 3e 30 12 42  |    ;(=-5?).>0.B|
0000d820  45 51 20 20 53 44 6d 61  79 62 65 41 4d 0d 3e 3a  |EQ  SDmaybeAM.>:|
0000d830  14 53 55 42 20 20 20 52  35 2c 20 52 35 2c 20 23  |.SUB   R5, R5, #|
0000d840  31 0d 3e 44 16 4c 44 52  42 20 20 52 30 2c 20 5b  |1.>D.LDRB  R0, [|
0000d850  52 32 2c 20 52 35 5d 0d  3e 4e 10 43 4d 50 20 20  |R2, R5].>N.CMP  |
0000d860  20 52 30 2c 20 52 34 0d  3e 58 19 42 45 51 20 20  | R0, R4.>X.BEQ  |
0000d870  53 44 66 69 6e 64 41 4d  73 79 6e 63 6c 6f 6f 70  |SDfindAMsyncloop|
0000d880  0d 3e 62 15 42 4e 45 20  20 53 44 66 69 6e 64 41  |.>b.BNE  SDfindA|
0000d890  4d 6c 6f 6f 70 0d 3e 6c  0e 2e 53 44 6d 61 79 62  |Mloop.>l..SDmayb|
0000d8a0  65 41 4d 0d 3e 76 17 4c  44 52 42 20 20 52 30 2c  |eAM.>v.LDRB  R0,|
0000d8b0  20 5b 52 32 2c 20 23 2d  31 5d 0d 3e 80 12 82 20  | [R2, #-1].>... |
0000d8c0  20 20 52 30 2c 20 52 30  2c 20 52 34 0d 3e 8a 14  |  R0, R0, R4.>..|
0000d8d0  80 20 20 20 52 30 2c 20  52 30 2c 20 23 26 46 30  |.   R0, R0, #&F0|
0000d8e0  0d 3e 94 4e 42 4e 45 20  20 53 44 66 69 6e 64 41  |.>.NBNE  SDfindA|
0000d8f0  4d 6c 6f 6f 70 20 20 20  20 20 3b 61 6c 73 6f 20  |Mloop     ;also |
0000d900  74 65 73 74 20 74 68 61  74 20 61 64 64 25 2d 32  |test that add%-2|
0000d910  20 26 20 61 64 64 25 2d  33 20 68 61 76 65 20 73  | & add%-3 have s|
0000d920  61 6d 65 20 74 6f 70 20  34 20 62 69 74 73 0d 3e  |ame top 4 bits.>|
0000d930  9e 12 4d 4f 56 20 20 20  52 34 2c 20 23 26 46 46  |..MOV   R4, #&FF|
0000d940  0d 3e a8 26 4d 56 4e 20  20 20 52 35 2c 20 23 28  |.>.&MVN   R5, #(|
0000d950  38 2d 31 29 20 20 20 20  20 20 3b 28 73 65 74 20  |8-1)      ;(set |
0000d960  52 35 3d 2d 38 29 0d 3e  b2 0f 2e 53 44 66 66 41  |R5=-8).>...SDffA|
0000d970  4d 6c 6f 6f 70 0d 3e bc  23 43 4d 4e 20 20 20 52  |Mloop.>.#CMN   R|
0000d980  35 2c 20 23 31 34 20 20  20 20 20 20 20 20 20 20  |5, #14          |
0000d990  3b 28 3d 2d 31 34 3f 29  0d 3e c6 12 42 45 51 20  |;(=-14?).>..BEQ |
0000d9a0  20 53 44 66 6f 75 6e 64  41 4d 0d 3e d0 14 53 55  | SDfoundAM.>..SU|
0000d9b0  42 20 20 20 52 35 2c 20  52 35 2c 20 23 31 0d 3e  |B   R5, R5, #1.>|
0000d9c0  da 16 4c 44 52 42 20 20  52 30 2c 20 5b 52 32 2c  |..LDRB  R0, [R2,|
0000d9d0  20 52 35 5d 0d 3e e4 3f  43 4d 50 20 20 20 52 30  | R5].>.?CMP   R0|
0000d9e0  2c 20 52 34 20 20 20 20  20 20 20 20 20 20 3b 26  |, R4          ;&|
0000d9f0  20 74 65 73 74 20 61 64  64 25 2d 39 20 74 6f 20  | test add%-9 to |
0000da00  61 64 64 25 2d 31 34 20  61 72 65 20 61 6c 6c 20  |add%-14 are all |
0000da10  26 46 46 0d 3e ee 13 42  45 51 20 20 53 44 66 66  |&FF.>..BEQ  SDff|
0000da20  41 4d 6c 6f 6f 70 0d 3e  f8 15 42 4e 45 20 20 53  |AMloop.>..BNE  S|
0000da30  44 66 69 6e 64 41 4d 6c  6f 6f 70 0d 3f 02 0e 2e  |DfindAMloop.?...|
0000da40  53 44 66 6f 75 6e 64 41  4d 0d 3f 0c 3c 53 54 52  |SDfoundAM.?.<STR|
0000da50  42 20 20 52 31 2c 20 5b  52 32 5d 20 20 20 20 20  |B  R1, [R2]     |
0000da60  20 20 20 3b 69 66 20 41  4d 20 66 6f 75 6e 64 20  |   ;if AM found |
0000da70  74 68 65 6e 20 72 65 63  6f 6e 73 74 72 75 63 74  |then reconstruct|
0000da80  20 4d 61 72 6b 0d 3f 16  4b 41 44 44 20 20 20 52  | Mark.?.KADD   R|
0000da90  32 2c 20 52 32 2c 20 23  31 20 20 20 20 20 20 3b  |2, R2, #1      ;|
0000daa0  20 70 6f 69 6e 74 20 74  6f 20 66 69 72 73 74 20  | point to first |
0000dab0  62 79 74 65 20 6f 66 20  49 44 20 6f 72 20 64 61  |byte of ID or da|
0000dac0  74 61 20 61 72 65 61 20  69 66 20 66 6f 75 6e 64  |ta area if found|
0000dad0  0d 3f 20 13 42 20 20 20  53 44 66 69 6e 64 41 4d  |.? .B   SDfindAM|
0000dae0  65 6e 64 0d 3f 2a 11 2e  53 44 41 4d 6e 6f 74 66  |end.?*..SDAMnotf|
0000daf0  6f 75 6e 64 0d 3f 34 10  4d 4f 56 20 20 20 52 32  |ound.?4.MOV   R2|
0000db00  2c 20 23 30 0d 3f 3e 10  2e 53 44 66 69 6e 64 41  |, #0.?>..SDfindA|
0000db10  4d 65 6e 64 0d 3f 48 3e  4c 44 52 20 20 20 52 30  |Mend.?H>LDR   R0|
0000db20  2c 20 5b 52 39 2c 20 23  38 5d 20 20 20 3b 67 65  |, [R9, #8]   ;ge|
0000db30  74 20 31 73 74 20 70 61  72 61 6d 65 74 65 72 20  |t 1st parameter |
0000db40  61 64 64 28 73 74 61 72  74 20 61 64 64 72 65 73  |add(start addres|
0000db50  73 29 0d 3f 52 2d 53 54  52 20 20 20 52 32 2c 20  |s).?R-STR   R2, |
0000db60  5b 52 30 5d 20 20 20 20  20 20 20 3b 26 20 75 70  |[R0]       ;& up|
0000db70  64 61 74 65 20 69 74 20  77 69 74 68 20 52 32 0d  |date it with R2.|
0000db80  3f 5c 11 4d 4f 56 20 20  20 70 63 2c 20 52 31 34  |?\.MOV   pc, R14|
0000db90  0d 3f 66 04 0d 3f 70 04  0d 3f 7a 2c 3b 72 65 61  |.?f..?p..?z,;rea|
0000dba0  73 73 65 6d 62 6c 65 20  49 44 20 63 6f 72 72 75  |ssemble ID corru|
0000dbb0  70 74 65 64 20 62 79 20  27 52 65 61 64 20 54 72  |pted by 'Read Tr|
0000dbc0  61 63 6b 27 0d 3f 84 38  3b 20 20 20 27 d6 20 72  |ack'.?.8;   '. r|
0000dbd0  65 6d 61 6b 65 49 44 2c  20 6d 61 70 49 44 25 2c  |emakeID, mapID%,|
0000dbe0  20 61 64 64 25 2c 20 72  65 6d 61 64 65 49 44 25  | add%, remadeID%|
0000dbf0  2c 20 72 65 6d 61 64 65  4f 4b 25 27 0d 3f 8e 3a  |, remadeOK%'.?.:|
0000dc00  3b 20 73 68 6f 75 6c 64  20 6f 6e 6c 79 20 62 65  |; should only be|
0000dc10  20 63 61 6c 6c 65 64 20  69 66 20 73 65 63 74 53  | called if sectS|
0000dc20  69 7a 65 20 69 73 20 63  6f 72 72 75 70 74 20 28  |ize is corrupt (|
0000dc30  69 65 20 3e 33 29 0d 3f  98 21 3b 20 20 20 26 20  |ie >3).?.!;   & |
0000dc40  66 6f 72 20 64 6f 75 62  6c 65 20 64 65 6e 73 69  |for double densi|
0000dc50  74 79 20 49 44 73 2e 0d  3f a2 3e 3b 20 6f 6e 20  |ty IDs..?.>; on |
0000dc60  65 6e 74 72 79 20 42 41  53 49 43 20 70 61 72 61  |entry BASIC para|
0000dc70  6d 65 74 65 72 20 31 20  3d 20 73 74 61 72 74 20  |meter 1 = start |
0000dc80  6f 66 20 6d 61 70 49 44  25 20 64 65 73 63 72 69  |of mapID% descri|
0000dc90  70 74 6f 72 73 0d 3f ac  3e 3b 20 20 20 20 20 20  |ptors.?.>;      |
0000dca0  20 20 20 20 20 20 20 20  20 20 70 61 72 61 6d 65  |          parame|
0000dcb0  74 65 72 20 32 20 3d 20  61 64 64 72 65 73 73 20  |ter 2 = address |
0000dcc0  6f 66 20 73 74 61 72 74  20 6f 72 20 49 44 20 72  |of start or ID r|
0000dcd0  65 61 64 0d 3f b6 3f 3b  20 20 20 20 20 20 20 20  |ead.?.?;        |
0000dce0  20 20 20 20 20 20 20 20  70 61 72 61 6d 65 74 65  |        paramete|
0000dcf0  72 20 33 20 3d 20 f8 20  72 65 6d 61 64 65 20 49  |r 3 = . remade I|
0000dd00  44 20 28 61 73 20 34 20  62 79 74 65 20 77 6f 72  |D (as 4 byte wor|
0000dd10  64 29 0d 3f c0 38 3b 20  20 20 20 20 20 20 20 20  |d).?.8;         |
0000dd20  20 20 20 20 20 20 20 70  61 72 61 6d 65 74 65 72  |       parameter|
0000dd30  20 34 20 3d 20 f8 20 a3  20 69 66 20 63 61 6e 74  | 4 = . . if cant|
0000dd40  20 72 65 6d 61 6b 65 20  49 44 0d 3f ca 3a 3b 20  | remake ID.?.:; |
0000dd50  6f 6e 20 65 78 69 74 20  20 70 61 72 61 6d 65 74  |on exit  paramet|
0000dd60  65 72 20 33 20 3d 20 72  65 61 73 73 65 6d 62 6c  |er 3 = reassembl|
0000dd70  65 64 20 49 44 20 28 34  20 62 79 74 65 73 20 6f  |ed ID (4 bytes o|
0000dd80  6e 6c 79 29 0d 3f d4 33  3b 20 20 20 20 20 20 20  |nly).?.3;       |
0000dd90  20 20 20 70 61 72 61 6d  65 74 65 72 20 34 20 3d  |   parameter 4 =|
0000dda0  20 30 20 69 66 20 6e 6f  20 6d 61 74 63 68 20 69  | 0 if no match i|
0000ddb0  73 20 66 6f 75 6e 64 0d  3f de 2b 3b 20 20 20 20  |s found.?.+;    |
0000ddc0  20 20 20 20 20 20 52 30  2c 52 31 2c 52 32 2c 52  |      R0,R1,R2,R|
0000ddd0  33 2c 52 34 2c 52 35 2c  52 36 20 63 6f 72 72 75  |3,R4,R5,R6 corru|
0000dde0  70 74 0d 3f e8 05 3b 0d  3f f2 33 3b 46 6f 72 6d  |pt.?..;.?.3;Form|
0000ddf0  61 74 20 6f 66 20 49 44  6d 61 70 20 63 61 6e 20  |at of IDmap can |
0000de00  62 65 20 66 6f 75 6e 64  20 61 74 20 65 6e 64 20  |be found at end |
0000de10  6f 66 20 50 72 6f 67 72  61 6d 0d 3f fc 04 0d 40  |of Program.?...@|
0000de20  06 0d 2e 72 65 6d 61 6b  65 49 44 0d 40 10 11 4d  |...remakeID.@..M|
0000de30  4f 56 20 20 20 52 31 2c  20 52 31 34 0d 40 1a 41  |OV   R1, R14.@.A|
0000de40  42 4c 20 20 20 70 61 72  61 6d 76 61 6c 75 65 73  |BL   paramvalues|
0000de50  20 20 20 20 20 20 20 20  20 3b 52 32 20 3d 20 6d  |         ;R2 = m|
0000de60  61 70 49 44 25 20 28 42  41 53 49 43 27 73 20 31  |apID% (BASIC's 1|
0000de70  73 74 20 70 61 72 61 6d  65 74 65 72 29 0d 40 24  |st parameter).@$|
0000de80  3f 4d 4f 56 20 20 20 52  31 34 2c 20 52 31 20 20  |?MOV   R14, R1  |
0000de90  20 20 20 20 20 20 20 20  20 20 3b 52 33 20 3d 20  |          ;R3 = |
0000dea0  61 64 64 25 20 28 42 41  53 49 43 27 73 20 32 6e  |add% (BASIC's 2n|
0000deb0  64 20 70 61 72 61 6d 65  74 65 72 29 0d 40 2e 34  |d parameter).@.4|
0000dec0  4d 4f 56 20 20 20 52 34  2c 20 23 30 20 20 20 20  |MOV   R4, #0    |
0000ded0  20 20 20 20 20 20 20 20  20 3b 52 34 20 3d 20 64  |         ;R4 = d|
0000dee0  65 73 63 72 69 70 74 6f  72 20 6e 75 6d 62 65 72  |escriptor number|
0000def0  0d 40 38 3e 4d 56 4e 20  20 20 52 35 2c 20 23 28  |.@8>MVN   R5, #(|
0000df00  31 2d 31 29 20 20 20 20  20 20 20 20 20 3b 52 35  |1-1)         ;R5|
0000df10  20 3d 20 62 79 74 65 20  6f 66 66 73 65 74 20 69  | = byte offset i|
0000df20  6e 20 49 44 20 72 65 61  64 20 28 2d 31 29 0d 40  |n ID read (-1).@|
0000df30  42 0e 2e 6e 78 74 49 44  62 79 74 65 0d 40 4c 14  |B..nxtIDbyte.@L.|
0000df40  41 44 44 20 20 20 52 35  2c 20 52 35 2c 20 23 31  |ADD   R5, R5, #1|
0000df50  0d 40 56 39 4c 44 52 42  20 20 52 31 2c 20 5b 52  |.@V9LDRB  R1, [R|
0000df60  33 2c 20 52 35 5d 20 20  20 20 20 20 20 3b 52 31  |3, R5]       ;R1|
0000df70  20 3d 20 62 79 74 65 20  76 61 6c 75 65 20 6c 6f  | = byte value lo|
0000df80  6f 6b 69 6e 67 20 66 6f  72 0d 40 60 0c 2e 6e 78  |oking for.@`..nx|
0000df90  74 64 65 73 63 0d 40 6a  3f 41 44 44 20 20 20 52  |tdesc.@j?ADD   R|
0000dfa0  36 2c 20 52 32 2c 20 52  34 2c 20 4c 53 4c 20 23  |6, R2, R4, LSL #|
0000dfb0  33 20 3b 52 36 3d 20 70  6f 69 6e 74 65 72 20 74  |3 ;R6= pointer t|
0000dfc0  6f 20 63 75 72 72 65 6e  74 20 64 65 73 63 72 69  |o current descri|
0000dfd0  70 74 6f 72 0d 40 74 34  4c 44 52 20 20 20 52 30  |ptor.@t4LDR   R0|
0000dfe0  2c 20 5b 52 36 5d 20 20  20 20 20 20 20 20 20 20  |, [R6]          |
0000dff0  20 3b 52 30 3d 20 63 75  72 72 65 6e 74 20 64 65  | ;R0= current de|
0000e000  73 63 72 69 70 74 6f 72  0d 40 7e 19 43 4d 50 20  |scriptor.@~.CMP |
0000e010  20 20 52 31 2c 20 52 30  2c 20 4c 53 52 20 23 32  |  R1, R0, LSR #2|
0000e020  34 0d 40 88 35 42 45 51  20 20 20 76 61 6c 75 65  |4.@.5BEQ   value|
0000e030  66 6f 75 6e 64 20 20 20  20 20 20 20 20 20 3b 69  |found         ;i|
0000e040  66 20 76 61 6c 75 65 20  64 6f 65 73 20 6e 6f 74  |f value does not|
0000e050  20 6d 61 74 63 68 0d 40  92 3b 4c 44 52 20 20 20  | match.@.;LDR   |
0000e060  52 34 2c 20 5b 52 36 2c  20 23 34 5d 20 20 20 20  |R4, [R6, #4]    |
0000e070  20 20 20 3b 67 65 74 20  73 65 63 6f 6e 64 20 77  |   ;get second w|
0000e080  6f 72 64 20 6f 66 20 64  65 73 63 72 69 70 74 6f  |ord of descripto|
0000e090  72 0d 40 9c 10 43 4d 50  20 20 20 52 34 2c 20 23  |r.@..CMP   R4, #|
0000e0a0  30 0d 40 a6 3e 42 4e 45  20 6e 78 74 64 65 73 63  |0.@.>BNE nxtdesc|
0000e0b0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 3b 69  |              ;i|
0000e0c0  66 20 3c 3e 30 20 69 74  20 69 73 20 61 20 64 65  |f <>0 it is a de|
0000e0d0  73 63 72 69 70 74 6f 72  20 6e 75 6d 62 65 72 0d  |scriptor number.|
0000e0e0  40 b0 4a 2e 66 61 69 6c  65 64 72 65 6d 61 6b 65  |@.J.failedremake|
0000e0f0  20 20 20 20 20 20 20 20  20 20 20 20 3b 69 66 20  |            ;if |
0000e100  3d 30 20 74 68 65 6e 20  63 61 6e 27 74 20 72 65  |=0 then can't re|
0000e110  6d 61 6b 65 20 49 44 20  73 6f 20 65 78 69 74 20  |make ID so exit |
0000e120  77 69 74 68 20 52 34 3d  30 0d 40 ba 11 42 20 20  |with R4=0.@..B  |
0000e130  20 72 65 6d 61 6b 65 65  6e 64 0d 40 c4 0f 2e 76  | remakeend.@...v|
0000e140  61 6c 75 65 66 6f 75 6e  64 0d 40 ce 48 42 49 43  |aluefound.@.HBIC|
0000e150  20 20 20 52 30 2c 20 52  30 2c 20 23 28 26 46 46  |   R0, R0, #(&FF|
0000e160  20 3c 3c 32 34 29 20 3b  6d 61 73 6b 20 6f 75 74  | <<24) ;mask out|
0000e170  20 76 61 6c 75 65 20 69  6e 20 64 65 73 63 72 69  | value in descri|
0000e180  70 74 6f 72 20 28 74 6f  70 20 38 20 62 69 74 73  |ptor (top 8 bits|
0000e190  29 0d 40 d8 3f 54 53 54  53 20 20 52 30 2c 20 23  |).@.?TSTS  R0, #|
0000e1a0  28 31 20 3c 3c 20 32 33  29 20 20 20 20 20 20 3b  |(1 << 23)      ;|
0000e1b0  69 66 20 62 69 74 20 32  33 20 6f 66 20 64 65 73  |if bit 23 of des|
0000e1c0  63 72 69 70 74 6f 72 20  69 73 20 63 6c 65 61 72  |criptor is clear|
0000e1d0  0d 40 e2 4a ec 51 20 52  34 2c 20 52 30 20 20 20  |.@.J.Q R4, R0   |
0000e1e0  20 20 20 20 20 20 20 20  20 20 20 3b 20 20 64 65  |           ;  de|
0000e1f0  73 63 72 69 70 74 6f 72  20 3d 20 64 65 73 63 72  |scriptor = descr|
0000e200  69 70 74 6f 72 20 6e 75  6d 62 65 72 20 66 6f 72  |iptor number for|
0000e210  20 6e 65 78 74 20 62 79  74 65 0d 40 ec 41 42 45  | next byte.@.ABE|
0000e220  51 20 20 20 6e 78 74 49  44 62 79 74 65 20 20 20  |Q   nxtIDbyte   |
0000e230  20 20 20 20 20 20 20 20  3b 20 20 73 6f 20 67 6f  |        ;  so go|
0000e240  20 67 65 74 20 6e 65 78  74 20 62 79 74 65 20 26  | get next byte &|
0000e250  20 64 65 73 63 72 69 70  74 6f 72 0d 40 f6 41 2e  | descriptor.@.A.|
0000e260  66 6f 75 6e 64 65 6e 64  64 65 73 63 20 20 20 20  |foundenddesc    |
0000e270  20 20 20 20 20 20 20 20  20 3b 65 6c 73 65 20 77  |         ;else w|
0000e280  65 27 76 65 20 66 6f 75  6e 64 20 74 68 65 20 49  |e've found the I|
0000e290  44 20 28 69 6e 20 52 30  29 20 73 6f 0d 41 00 2f  |D (in R0) so.A./|
0000e2a0  80 20 20 20 52 31 2c 20  52 30 2c 20 23 26 37 46  |.   R1, R0, #&7F|
0000e2b0  20 20 20 20 20 20 20 20  3b 20 6c 6f 61 64 20 74  |        ; load t|
0000e2c0  72 61 63 6b 20 28 62 79  74 65 29 0d 41 0a 19 80  |rack (byte).A...|
0000e2d0  20 20 20 52 35 2c 20 52  30 2c 20 23 28 31 20 3c  |   R5, R0, #(1 <|
0000e2e0  3c 20 37 29 0d 41 14 2f  84 52 20 20 20 52 31 2c  |< 7).A./.R   R1,|
0000e2f0  20 52 31 2c 20 52 35 2c  20 4c 53 4c 23 31 20 20  | R1, R5, LSL#1  |
0000e300  20 3b 20 84 20 69 6e 20  68 65 61 64 20 28 62 79  | ; . in head (by|
0000e310  74 65 29 0d 41 1e 1b 80  20 20 20 52 35 2c 20 52  |te).A...   R5, R|
0000e320  30 2c 20 23 28 26 46 46  20 3c 3c 20 38 29 0d 41  |0, #(&FF << 8).A|
0000e330  28 2a 84 52 20 20 20 52  31 2c 20 52 31 2c 20 52  |(*.R   R1, R1, R|
0000e340  35 2c 20 4c 53 4c 20 23  38 20 20 3b 20 84 20 69  |5, LSL #8  ; . i|
0000e350  6e 20 73 65 63 74 6f 72  0d 41 32 1a 80 20 20 20  |n sector.A2..   |
0000e360  52 35 2c 20 52 30 2c 20  23 28 33 20 3c 3c 20 31  |R5, R0, #(3 << 1|
0000e370  36 29 0d 41 3c 2f 84 52  20 20 20 52 31 2c 20 52  |6).A</.R   R1, R|
0000e380  31 2c 20 52 35 2c 20 4c  53 4c 20 23 38 20 20 3b  |1, R5, LSL #8  ;|
0000e390  20 84 20 69 6e 20 73 65  63 74 6f 72 20 73 69 7a  | . in sector siz|
0000e3a0  65 0d 41 46 32 4d 56 4e  20 20 20 52 34 2c 20 23  |e.AF2MVN   R4, #|
0000e3b0  28 31 2d 31 29 20 20 20  20 20 20 20 20 20 20 3b  |(1-1)          ;|
0000e3c0  20 66 6f 75 6e 64 20 73  6f 20 73 65 74 20 52 34  | found so set R4|
0000e3d0  3d 2d 31 0d 41 50 0e 2e  72 65 6d 61 6b 65 65 6e  |=-1.AP..remakeen|
0000e3e0  64 0d 41 5a 35 4c 44 52  20 20 20 52 35 2c 20 5b  |d.AZ5LDR   R5, [|
0000e3f0  52 39 5d 20 20 20 20 20  20 3b 67 65 74 20 6c 61  |R9]      ;get la|
0000e400  73 74 20 42 41 53 49 43  20 70 61 72 61 6d 65 74  |st BASIC paramet|
0000e410  65 72 20 61 64 64 0d 41  64 31 53 54 52 20 20 20  |er add.Ad1STR   |
0000e420  52 34 2c 20 5b 52 35 5d  20 20 20 20 20 20 3b 26  |R4, [R5]      ;&|
0000e430  20 73 65 74 20 3d 2d 31  20 69 66 20 66 6f 75 6e  | set =-1 if foun|
0000e440  64 20 8b 20 3d 20 30 0d  41 6e 37 4c 44 52 20 20  |d . = 0.An7LDR  |
0000e450  20 52 35 2c 20 5b 52 39  2c 20 23 38 5d 20 20 3b  | R5, [R9, #8]  ;|
0000e460  67 65 74 20 6c 61 73 74  2d 31 20 42 41 53 49 43  |get last-1 BASIC|
0000e470  20 70 61 72 61 6d 65 74  65 72 20 61 64 64 0d 41  | parameter add.A|
0000e480  78 39 53 54 52 20 20 20  52 31 2c 20 5b 52 35 5d  |x9STR   R1, [R5]|
0000e490  20 20 20 20 20 20 3b 26  20 75 70 64 61 74 65 20  |      ;& update |
0000e4a0  69 74 20 77 69 74 68 20  72 65 6d 61 64 65 20 49  |it with remade I|
0000e4b0  44 20 69 6e 20 52 31 0d  41 82 26 4d 4f 56 20 20  |D in R1.A.&MOV  |
0000e4c0  20 70 63 2c 20 52 31 34  20 20 20 20 20 20 20 20  | pc, R14        |
0000e4d0  20 20 20 20 20 20 3b 72  65 74 75 72 6e 0d 41 8c  |      ;return.A.|
0000e4e0  04 0d 41 96 0c 2e 65 6e  64 63 6f 64 65 0d 41 a0  |..A...endcode.A.|
0000e4f0  05 5d 0d 41 aa 1f e7 20  28 50 25 2d 63 6f 64 65  |.].A... (P%-code|
0000e500  25 29 20 3e 20 63 6f 64  65 6c 65 6e 67 74 68 20  |%) > codelength |
0000e510  8c 0d 41 b4 24 20 f1 22  61 73 73 65 6d 62 6c 65  |..A.$ ."assemble|
0000e520  72 20 63 6f 64 65 20 74  6f 6f 20 6c 6f 6e 67 22  |r code too long"|
0000e530  3a ef 37 3a e0 0d 41 be  05 cd 0d 41 c8 05 ed 0d  |:.7:..A....A....|
0000e540  41 d2 05 e1 0d 41 dc 04  0d 41 e6 27 f4 20 20 2a  |A....A...A.'.  *|
0000e550  2a 2a 2a 2a 2a 20 20 49  44 20 6d 61 70 20 66 6f  |*****  ID map fo|
0000e560  72 6d 61 74 20 20 2a 2a  2a 2a 2a 2a 2a 2a 2a 0d  |rmat  *********.|
0000e570  41 f0 3f f4 20 6d 61 70  49 44 20 69 73 20 6d 61  |A.?. mapID is ma|
0000e580  64 65 20 75 70 20 6f 66  20 61 20 6c 69 73 74 20  |de up of a list |
0000e590  6f 66 20 64 65 73 63 72  69 70 74 6f 72 73 20 6e  |of descriptors n|
0000e5a0  75 6d 62 65 72 65 64 20  30 20 74 6f 20 6e 0d 41  |umbered 0 to n.A|
0000e5b0  fa 20 f4 20 65 61 63 68  20 64 65 73 63 72 69 70  |. . each descrip|
0000e5c0  74 6f 72 20 69 73 20 32  20 77 6f 72 64 73 0d 42  |tor is 2 words.B|
0000e5d0  04 0d f4 20 77 6f 72 64  30 20 2d 0d 42 0e 21 f4  |... word0 -.B.!.|
0000e5e0  20 6d 73 20 62 79 74 65  20 20 20 3d 20 62 79 74  | ms byte   = byt|
0000e5f0  65 20 76 61 6c 75 65 20  72 65 61 64 0d 42 18 48  |e value read.B.H|
0000e600  f4 20 6c 73 20 33 20 62  79 74 65 73 3d 20 49 66  |. ls 3 bytes= If|
0000e610  20 62 69 74 20 32 33 3d  30 2c 20 64 65 73 63 72  | bit 23=0, descr|
0000e620  69 70 74 6f 72 20 6e 75  6d 62 65 72 20 6f 66 20  |iptor number of |
0000e630  6e 65 78 74 20 62 79 74  65 20 69 6e 20 70 61 74  |next byte in pat|
0000e640  74 65 72 6e 0d 42 22 46  f4 20 20 20 20 20 20 20  |tern.B"F.       |
0000e650  20 20 20 20 20 20 20 65  6c 73 65 20 68 6f 6c 64  |       else hold|
0000e660  73 20 75 6e 69 71 75 65  20 49 44 2c 20 69 65 20  |s unique ID, ie |
0000e670  65 6e 64 20 6f 66 20 75  6e 69 71 75 65 20 62 79  |end of unique by|
0000e680  74 65 20 70 61 74 74 65  72 6e 0d 42 2c 2c f4 20  |te pattern.B,,. |
0000e690  20 20 20 20 20 20 20 20  20 20 20 20 20 66 6f 72  |             for|
0000e6a0  6d 61 74 20 69 73 20 42  69 74 73 20 20 30 2d 36  |mat is Bits  0-6|
0000e6b0  20 74 72 61 63 6b 0d 42  36 2b f4 20 20 20 20 20  | track.B6+.     |
0000e6c0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
0000e6d0  20 20 20 20 20 20 20 20  20 20 20 37 20 68 65 61  |           7 hea|
0000e6e0  64 0d 42 40 2d f4 20 20  20 20 20 20 20 20 20 20  |d.B@-.          |
0000e6f0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
0000e700  20 20 20 38 2d 31 35 20  73 65 63 74 6f 72 0d 42  |   8-15 sector.B|
0000e710  4a 32 f4 20 20 20 20 20  20 20 20 20 20 20 20 20  |J2.             |
0000e720  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 31  |               1|
0000e730  36 2d 31 37 20 73 65 63  74 6f 72 20 53 69 7a 65  |6-17 sector Size|
0000e740  0d 42 54 0d f4 20 77 6f  72 64 31 20 2d 0d 42 5e  |.BT.. word1 -.B^|
0000e750  4a f4 20 69 66 20 3c 3e  30 2c 20 64 65 73 63 72  |J. if <>0, descr|
0000e760  69 70 74 6f 72 20 6e 75  6d 62 65 72 20 6f 66 20  |iptor number of |
0000e770  61 6c 74 65 72 6e 61 74  69 76 65 20 76 61 6c 75  |alternative valu|
0000e780  65 20 61 74 20 74 68 69  73 20 62 79 74 65 20 70  |e at this byte p|
0000e790  6f 73 69 74 69 6f 6e 0d  42 68 28 f4 20 20 20 65  |osition.Bh(.   e|
0000e7a0  6c 73 65 2c 20 6e 6f 20  6d 6f 72 65 20 61 6c 74  |lse, no more alt|
0000e7b0  65 72 6e 61 74 69 76 65  20 76 61 6c 75 65 73 0d  |ernative values.|
0000e7c0  ff                                                |.|
0000e7c1