                .DO     External
                .LSTON
                .Page
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>
;>      Module: ReadHeader Routines
;>
;>      This module contains all but the very most primitive of
;>      of procedures ( the routines that are resident are listed
;>      in the external spec's ) that concern themselves with performing
;>      a read operation.
;>
;>      FUNCTION ReadHdr( Parent : BYTE { !r8 } ) :
;>                      BOOLEAN
;>                      Status : BYTE { !r0 }
;>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .LSTOFF
                .FIN
                .DO     External
                .LSTON
                .Page
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>
;>      Function: ReadHdr
;>
;>      This function assumes that the heads are positioned over the
;>      correct track and reads the block of data following the
;>      next sector mark. This routine is used for two reasons: 1) to
;>      verify the header that is laid out on a block and 2) to try
;>      to recover the data within a block if the header is munched.
;>
;>      Inputs:
;>              Parent : BYTE { !r8 }
;>
;>      Outputs:
;>              ReadHdr : BOOLEAN { Zero flag, true if error in ReadBlock }
;>              Status    : BYTE { !r0 }
;>
;>      Global Variables Used:
;>              Cylinder, Head, Sector
;>
;>      Local Variables Used:
;>              RdHError    : BOOLEAN { !r9/bit 7 }
;>              RdExcept   : BOOLEAN { !r9/bit 6 }
;>
;>      Algorithm:
;>
;>      BEGIN
;>       SetDeadManTimer( ReadBlock, Parent )
;>       RdHError := False
;>       RdHExcept := False
;>       RHSctrGap := 0
;>       RHHdrGap := 0
;>       _
;>      /
;>   R  |  Set-up external ram address counter for READHEADER
;>   E  |  Msel0:1 := Disk <--> Mem
;>   S  |  WHILE SectorMark DO BEGIN END
;>   I  |  StartL := True
;>   D  |  WHILE NOT( SectorDnL ) DO BEGIN END
;>   E  |  Status := Status_Port
;>   N  |  StartL := False
;>   T  |  Msel0:1 := Z8 <--> Mem
;>      \_
;>
;>         IF ( Status.State <> NormalEndState ) 
;>          THEN 
;>              Reset_StateMachine
;>              Abort
;>
;>         IF Status.ServoErr OR NOT( Status.ServoRdy )
;>          THEN
;>               RdHError := True
;>               RdHExcept := True
;>
;>         IF Status.CrcErrL THEN RdHError := True
;>
;>       ClearDeadManTimer
;>       Status/bit 7 := RdHError
;>       Status/bit 6 := RdHExcept
;>      END
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .LSTOFF
                .FIN
                .DO     Internal
                .LSTON
                .Page
                .FIN
                
ReadHdr:
                And     DiskStat,#$FF-Wr_Op
                
                Clr     !r9     ;clear booleans
                
RdHBlk_Rpt:     Call    RdHdr_Resident     ;go internal to the Z8

                Ld      !r1,!r0         ;CASE Status.State
                And     !r1,#$0F
                Cp      !r1,#Norm_State
                Jr      Z,RdHdr_Norm
                
                 Call   Reset_StMach
                 And    DiskStat,#$FF-RdHdrRecal
                 Ld     !rB,!rA
                 Ld     !rA,!r0
                Call    Abort
                
RdHdr_Norm:     Ld      !r1,!r0         ;IF ServorErr OR NOT( ServoRdy )
                Tm      !r1,#ServoErr
                Jr      Nz,RdH_ServoErr
                Tm      !r1,#ServoRdy
                Jr      Nz,RdH_SrvoOk
                
RdH_ServoErr:   Or      !r9,#RdHError + RdHSrvoErr ; THEN RdHError AND RdHServoErrEnd
                Jr      RdH_End
                
RdH_SrvoOk:     Tm      !r0,#CrcErrL    ;IF Status.CrcErr
                Jr      Z,RdH_CrcErr
RdH_ChkEcc:     Tm      !r0,#WrtNvldL   ;OR Status.EccErr
                Jr      Nz,RdH_End
                Or      !r9,#RdHError+RdCrcErr
                Or      RdErrCnt,#EccStat
                Jr      RdH_End
                
RdH_CrcErr:     Or      !r9,#RdHError+RdCrcErr    ; ELSE
                Ld      RdErrCnt,#CrcStat
                Jr      RdH_ChkEcc
                
RdH_End:        Ld      !r0,!r9 ;send status back to caller
                Ld      RdStat,!r9
                
                Tcm     !r0,#RdHError ;set zero flag if error
                Jp      Bank_Ret
                
                .LSTOFF
                
