.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