Interface
.Page
;++
; Interface Routines
;--
SelSide .Equ *
Ldx #0
Lda #20
Bit IIob+Side
Beq SetSel
Inx
SetSel .Equ *
Lda Ca0+High
Lda Ca1+High
Lda Side0Sel,x
Txa
Rts
SetLow .Equ *
Ldx #Low ; set Side Select line low
Beq SetSel
SetHigh .Equ *
Ldx #High ; Set line high
Bne SetSel
ReadWp .Equ *
Jsr SetHigh
RdS2 Lda Ca1+Low
RdS1 Lda Ca2+Low
ReadIt .Equ * ; Read sense bit & rotate into ccC
Lda Q6H ; Ensure state machine in proper state
Lda Q7L ; Read sense daata into bit 7
Asl A ; Move bit 7 into carry
Rts
ReadIndx .Equ *
Clc
Rid .Equ *
Jsr SetHigh
Lda Ca0+Low
Bcc RdS1 ; set Ca2 = 0
Bcs RdS2 ; set Ca1 & Ca2 = 0
ReadDip .Equ *
Sec
Bcs Rid
DoStrb .Equ *
Sta LStrb+High
Nop
Nop
Sta LStrb+Low
Rts
TrMtOff .Equ * ; Will turn motors off
Sta Ca2+High
Lda #00
Beq TurnMtr
TrMtrOn .Equ * ; Will turn the Sony motor on
Sta Ca2+Low
Lda #0FF
TurnMtr .Equ *
Sta MtrOn ; Set state register in Ram
Jsr SetLow ; Set side select line low
Sta Ca0+Low
Jmp DoStrb
TMOn .Equ * ; Turn on motor & setup for tach reading
Jsr TrnMtrOn ; will leave Ca0 = 0
Lda #80. ; 400(5*80) msec constant
Jsr Wait
SetTach .Equ *
Jsr SetHigh ; set Side Select = 1 for Tach input
Lda Ca2+Low ; '10011' for tach mode
Rts
SetDrexX .Equ * ; use value in Xreg for direction
Stx Direct
SetDrct .Equ *
Jsr SetLow ; set Side Select line low
Sta Ca0+Low
Sta Ca1+Low
Ldx Direct ; 0 or 1 for offset of direction
Sta Ca2,x
Jmp DoStrb
DoStep .Equ *
Lda #1
Sta Temp1 ; Try twice
Jsr SetLow ; Set Side Select line low
Sta Ca1+Low
Sta Ca2+Low
Jsr DoStrb
$10 Jsr WaitAlt ; Wait 12 ms for /Step to go high
Jsr ReadIt ; ccC = /Step -- 0 = low & 1 = high
Bcs DoStDone ; /Step is high so all is cool
Lda #StepErr
Sta Iob+SeekErr ; For external debugging aid ( FCC01B )
Dec Temp1
Bpl $10 ; wait another 12 ms
DoStDone .Equ * ; fall through and exit w no error
Rts
DoSeek .Equ *
Jsr SetDrct ; Set the direction
$23 Jsr DoStep
Dec StpAmt ; Count down the number of steps to take
Bne $23 ; Exit upon reaching zero
Rts
SetSpeed .Equ *
Jsr TrkClss ; Return w/ "Y" = class of IIob+Track
SetSpdy .Equ * ; already has "y" = track class
Sty CurClass
Lda MSpdTbl,y
Sta PwmReg
Rts
SetRMode .Equ *
Jsr SelSide ; use value in IIob+Side to set proper side
Sta Ca0+Low
Sta Ca1+Low
Sta Ca2+High ; 'x100' is input to MCI PAL on Sony
Rts
UnClamp .Equ *
Jsr SetLow
Sta Ca2+High ; '0111'
Lda LStrb+High
Lda #150. ; 3/4 sec (200*5 usec ) delay for ejection
Jsr Wait ; Will wait & return w/ carry cleared
Lda LStrb+Low
Lda #0
Sta Clamped ; Tell me disk is no longer clamped
Clc
Rts
HardInit .Equ * ; Initialize hardware -- PWM & Iwm
Ldx #0e
$7 Sta IOSpace,x ; Reset all IWM internal latches to zero state
Dex
Dex
Bpl $7 ; Loop 8 times
Lda #202.
Jsr Wait ; wait for 1.01 sec for timer to expire
Ldx #0 ; $10000 times before timeout
Stx Temp1
$15 Dex
Bne $30
Dec Temp1
Beq HardAbort ; If timeout then IWM is out to lunch
$30 Lda Q6H ; Put IWM state machine into SENSE mode
Lda Q7L ; Read status data
Tay ; Save IWM's status information
And #20 ; Test bit #5
Bne $15 ; Wait for bit #5 to be clear ( 0 )
Tya ; Restore status info
And #IWMMode ; Mask off unneeded bits
Cmp #IWMMode ; look for proper bits to be set
Beq $45 ; if same then all is OK
Lda #IWMMode ; Asynch, 8 MHz, latch, 2 usec calls, no timer
Sta Q7H ; Setup to proper Sony mode
Lda Q7L ; back to SENSE mode
Jmp $15 ; Walk through & make sure it works
$45 Sta DrEna+High ; Select drive 1
Sta MtEna+On ; Now enable that drive for ever and ever
Ldx MSpdTbl ; Default speed code for track 0
Stx CntEna+Low ; Enable counter/comparator
Stx PWMReg
Stx PwmEna+High ; Enable output of Pwm pulse
Rts
HardAbort .Equ *
Lda #IWMError ; Fatal error w/ IWM -- does not respond
Sta Iob+ErrStat
Jmp FatalErr ; Abort and never return
ChkDrv .Equ * ; Check for drive connected and number of sides
Lda #1
Sta Iob+NoSides ; Assume single sided drive
Jsr SetLow
Sta Ca2+High ; '0111'
Sec ; Assume no drive exists
Lda Q7L ; High bit = status
Bmi $30 ; If bit7 = 1 then no drive is connected
Dec DrvConn ; Set drive connected flag
Clc
Sta Ca0+Low ; Assume only single sided
Ldx Q7L
Bpl $23
Inc Iob+NoSides ; 2 = double sided drive
Ora #20 ; Set double sided flag for format field
$23 Sta FmtType ; For use in formatting
$30 Rts ; ccC = 0 ==> drive connected