head     56.3;
access   paws bayes jws quist brad dew jwh;
symbols  ;
locks    ; strict;
comment  @# @;


56.3
date     93.01.27.13.22.34;  author jwh;  state Exp;
branches ;
next     56.2;

56.2
date     93.01.27.12.02.40;  author jwh;  state Exp;
branches ;
next     56.1;

56.1
date     91.11.05.09.58.09;  author jwh;  state Exp;
branches ;
next     55.1;

55.1
date     91.08.25.10.33.21;  author jwh;  state Exp;
branches ;
next     54.3;

54.3
date     91.08.21.12.40.02;  author jwh;  state Exp;
branches ;
next     54.2;

54.2
date     91.08.21.09.52.13;  author jwh;  state Exp;
branches ;
next     54.1;

54.1
date     91.03.18.15.33.58;  author jwh;  state Exp;
branches ;
next     53.1;

53.1
date     91.03.11.19.33.49;  author jwh;  state Exp;
branches ;
next     52.1;

52.1
date     91.02.19.09.19.57;  author jwh;  state Exp;
branches ;
next     51.1;

51.1
date     91.01.30.16.18.23;  author jwh;  state Exp;
branches ;
next     50.1;

50.1
date     90.10.29.16.32.20;  author jwh;  state Exp;
branches ;
next     49.1;

49.1
date     90.08.14.14.16.06;  author jwh;  state Exp;
branches ;
next     48.1;

48.1
date     90.07.26.11.22.37;  author jwh;  state Exp;
branches ;
next     47.1;

47.1
date     90.05.14.11.08.22;  author dew;  state Exp;
branches ;
next     46.1;

46.1
date     90.05.07.08.55.10;  author jwh;  state Exp;
branches ;
next     45.1;

45.1
date     90.04.19.16.03.23;  author jwh;  state Exp;
branches ;
next     44.1;

44.1
date     90.04.01.22.20.27;  author jwh;  state Exp;
branches ;
next     43.1;

43.1
date     90.03.20.14.13.18;  author jwh;  state Exp;
branches ;
next     42.1;

42.1
date     90.01.23.17.57.18;  author jwh;  state Exp;
branches ;
next     41.1;

41.1
date     89.12.22.11.39.20;  author jwh;  state Exp;
branches ;
next     40.1;

40.1
date     89.09.29.12.00.23;  author jwh;  state Exp;
branches ;
next     39.1;

39.1
date     89.09.26.16.45.16;  author dew;  state Exp;
branches ;
next     38.1;

38.1
date     89.08.29.11.37.34;  author jwh;  state Exp;
branches ;
next     37.1;

37.1
date     89.05.12.11.51.10;  author dew;  state Exp;
branches ;
next     36.1;

36.1
date     89.02.06.10.28.33;  author dew;  state Exp;
branches ;
next     35.1;

35.1
date     89.02.02.13.45.28;  author dew;  state Exp;
branches ;
next     34.1;

34.1
date     89.01.23.16.19.49;  author jwh;  state Exp;
branches ;
next     33.1;

33.1
date     89.01.16.11.50.49;  author dew;  state Exp;
branches ;
next     32.1;

32.1
date     89.01.10.12.00.47;  author bayes;  state Exp;
branches ;
next     31.1;

31.1
date     88.12.14.18.21.39;  author bayes;  state Exp;
branches ;
next     30.1;

30.1
date     88.12.09.13.58.21;  author dew;  state Exp;
branches ;
next     29.1;

29.1
date     88.10.31.15.43.03;  author bayes;  state Exp;
branches ;
next     28.1;

28.1
date     88.10.06.11.08.50;  author dew;  state Exp;
branches ;
next     27.1;

27.1
date     88.09.29.11.52.19;  author bayes;  state Exp;
branches ;
next     26.1;

26.1
date     88.09.28.14.03.25;  author bayes;  state Exp;
branches ;
next     25.1;

25.1
date     88.03.02.09.47.46;  author bayes;  state Exp;
branches ;
next     24.1;

24.1
date     87.08.31.10.20.54;  author jws;  state Exp;
branches ;
next     23.1;

23.1
date     87.08.26.11.07.39;  author bayes;  state Exp;
branches ;
next     22.1;

22.1
date     87.08.17.11.46.56;  author bayes;  state Exp;
branches ;
next     21.1;

21.1
date     87.08.12.14.31.53;  author bayes;  state Exp;
branches ;
next     20.1;

20.1
date     87.07.30.11.42.58;  author bayes;  state Exp;
branches ;
next     19.1;

19.1
date     87.06.01.08.57.18;  author jws;  state Exp;
branches ;
next     18.1;

18.1
date     87.05.20.16.01.36;  author bayes;  state Exp;
branches ;
next     17.1;

17.1
date     87.04.30.11.05.13;  author jws;  state Exp;
branches ;
next     16.1;

16.1
date     87.04.26.16.15.16;  author jws;  state Exp;
branches ;
next     15.1;

15.1
date     87.04.13.09.57.15;  author jws;  state Exp;
branches ;
next     14.1;

14.1
date     87.04.01.16.08.23;  author jws;  state Exp;
branches ;
next     13.1;

13.1
date     87.02.28.18.58.01;  author jws;  state Exp;
branches ;
next     12.1;

12.1
date     87.02.02.13.52.11;  author jws;  state Exp;
branches ;
next     11.1;

11.1
date     87.01.19.10.18.41;  author jws;  state Exp;
branches ;
next     10.1;

10.1
date     86.12.24.11.34.07;  author jws;  state Exp;
branches ;
next     9.1;

9.1
date     86.12.12.15.18.56;  author bayes;  state Exp;
branches ;
next     8.1;

8.1
date     86.11.27.12.27.04;  author jws;  state Exp;
branches ;
next     7.1;

7.1
date     86.11.20.14.42.49;  author hal;  state Exp;
branches ;
next     6.1;

6.1
date     86.11.04.18.32.31;  author paws;  state Exp;
branches ;
next     5.1;

5.1
date     86.10.28.17.22.17;  author hal;  state Exp;
branches ;
next     4.1;

4.1
date     86.09.30.20.16.16;  author hal;  state Exp;
branches ;
next     3.1;

3.1
date     86.09.01.12.38.31;  author hal;  state Exp;
branches ;
next     2.1;

2.1
date     86.07.30.15.16.27;  author hal;  state Exp;
branches ;
next     1.1;

1.1
date     86.06.30.17.07.09;  author danm;  state tmp;
branches ;
next     ;


desc
@Base file for PWS 3.2 release.

@


56.3
log
@
pws2rcs automatic delta on Wed Jan 27 13:14:25 MST 1993
@
text
@*
************************************************
*
* FORMAT Routine for Initialize
*
* Greg Herman
*
* Last Updated August 19, 1983 by J Schmidt - timing fixes
*
************************************************
*
	  RORG     0
	  NOSYMS

	  DEF      ASMR_FORMAT
	  REFA     SYSGLOBALS
	  REFA     XMINIT
	  REFA     CHECK_TIMER,DELAY_TIMER                  JS 8/19/83
	  LMODE    CHECK_TIMER,DELAY_TIMER                  JS 8/19/83

TIMER_PRESENT EQU 1                                         JS 8/19/83
SYSFLAG2      EQU $FFFFFEDA                                 JS 8/19/83


PHI       EQU      $10
CARD      EQU      $1
DMAC      EQU      $500000  LOCATION OF BUILT IN DMA CARD
*
INITISRIB EQU      XMINIT-20    INIT'S ISRIB
*
* PHI REGISTER ADDRESSES, IN ASCENDING ORDER
*
INTR      EQU      PHI+1
IMSK      EQU      PHI+3
FIFOFFSET EQU      PHI+5
STATPOFFS EQU      PHI+7
CTRL      EQU      PHI+9
HPIBADR   EQU      PHI+$B
PPMSK     EQU      PHI+$D
PPSNS     EQU      PHI+$F
*
* PHI CARD REGISTERS
*
CRDCTRL   EQU      CARD+2
*CRDSTAT  EQU      CARD+2
ID        EQU      CARD
*
* DMA REGISTERS
*
DMADR0    EQU      DMAC
DMWCT0    EQU      DMAC+4
DMCTRL0   EQU      DMAC+6
DMSTAT    EQU      DMAC
DMADR1    EQU      DMAC+8
DMWCT1    EQU      DMAC+$C
DMCTRL1   EQU      DMAC+$E
*
* AMIGO RELATED CONSTANTS
*
PTA       EQU      $5E        PHI TALK ADDRESS
PLA       EQU      $3E        PHI LISTEN ADDRESS
DTAC      EQU      $40        DISK PRIMARY TALK BASE
DLAC      EQU      $20        DISK PRIMARY LISTEN BASE
DSJ       EQU      $70        DSJ SECONDARY
DSAD      EQU      $68        DISK STANDARD SECONDARY
ICMND     EQU      $40        INTERFACE COMMAND SETUP
EOI       EQU      $80        EOI SETUP
UNT       EQU      $5F        UNTALK COMMAND
UNL       EQU      $3F        UNLISTEN COMMAND
*
*
SECTOR    EQU      0
*
*
* REGISTER SETUP
*
DTEMP   EQU     D0
MTEMP   EQU     D1
BCOUNT  EQU     D2
TCOUNT  EQU     D3
DZERO   EQU     D4
FREE3   EQU     D5              (AVAILABLE FOR USE)
FREE2   EQU     D6              (AVAILABLE FOR USE)
FREE1   EQU     D7              (AVAILABLE FOR USE)

BYTEPTR EQU     A0
FIFO    EQU     A1
PORT    EQU     A2
ATEMP   EQU     A3
STATP   EQU     A4
GLOBAL  EQU     A5
BASE    EQU     A6
*SP     EQU     A7


*
*  PARAMETERS PASSED FROM PASCAL
*

PARAMS   EQU    40-8               NUMBER OF BYTES FOR PASSED PARAMETERS
BUSADDR  EQU    38
UNIT     EQU    36
HEAD     EQU    34
PHIPORT  EQU    30
TRACKB   EQU    26
SECTORS  EQU    22
SPD      EQU    20
MADR     EQU    16
TRACKA   EQU    12                 ADDRESS OF TRACK A
ERRTYPE  EQU     8
*RETADDR EQU     4                 RETURN ADDRESS
*STATLNK EQU     0                 STATIC LINK
*
*  LOCAL PARAMETERS
*
DLA      EQU    -1     DISC LISTEN ADDRESS
DTA      EQU    -2     DISC TALK ADDRESS
DSJBYTE  EQU    -3     DSJ BYTE
STAT3    EQU    -4     STORAGE FOR STATUS BYTES
STAT2    EQU    -5
STAT1    EQU    -6
STAT0    EQU    -7
ADDR3    EQU    -8     STORAGE FOR DISC ADDRESS
ADDR2    EQU    -9
ADDR1    EQU    -10
ADDR0    EQU    -11
PMASK    EQU    -12    PPOLL MASK
IFLAG    EQU    -13    INTERRUPT FLAG
SPDTEMP  EQU    -14    UPPER 3 BITS=S,P,D
CYLINDR1 EQU    -16    CYL ADDR FOR SEEK
CYLINDR2 EQU    -18    CYL ADDR FOR ADDR REC
ADDRSTOR EQU    -22    STORAGE FOR SYSTEM INTERRUPT VECTOR
STATSTOR EQU    -26    STORAGE FOR SYSTEM STATIC LINK
LOCALS   EQU    -26    TOTAL AMOUNT OF LOCAL STOREAGE
*
*
ASMR_FORMAT  LINK    BASE,#LOCALS
	MOVEA.L PHIPORT(BASE),PORT      ADDRESS OF PHI CARD INTERFACE
	LEA     FIFOFFSET(PORT),FIFO
	LEA     STATPOFFS(PORT),STATP
	CLR.L   DZERO

	LEA     ISV,ATEMP               SET UP INTERRUPT VECTOR
	MOVE.L  ATEMP,INITISRIB+8(GLOBAL)  ADDRESS OF ISR
	MOVE.L  BASE,INITISRIB+12(GLOBAL)  STATIC LINK

	MOVE.B  BUSADDR+1(BASE),MTEMP   CALCULATE PPOLL MASK
	MOVE.B  #$80,DTEMP
	LSR.B   MTEMP,DTEMP
	MOVE.B  DTEMP,PMASK(BASE)

	MOVE.B #DTAC,DTEMP              CALCULATE DISC TALK ADDRESS
	ADD.B  BUSADDR+1(BASE),DTEMP
	MOVE.B DTEMP,DTA(BASE)

	MOVE.B #DLAC,DTEMP              CALCULATE DISC LISTEN ADDRESS
	ADD.B  BUSADDR+1(BASE),DTEMP
	MOVE.B DTEMP,DLA(BASE)

	MOVEA.L ERRTYPE(BASE),ATEMP     LOAD ERRTYPE ADDRESS
	MOVE.L  DZERO,(ATEMP)           CLEAR ERRTYPE

	BSR  SFM     SET FILE MASK

	MOVEA.L TRACKA(BASE),ATEMP      COMPARE TRACK A & B
	MOVE.L (ATEMP),DTEMP
	CMP.L  TRACKB(BASE),DTEMP
	BNE    SPARE
*    IF EQUAL THEN FORMAT TRACK A
	BSR    DMSETUP
	MOVEA.L TRACKA(BASE),ATEMP
	MOVE.W 2(ATEMP),CYLINDR1(BASE)
	MOVE.W SPD(BASE),DTEMP         SHIFT S,P,D TO UPPER 3 BITS
	MULS   #32,DTEMP
	MOVE.B DTEMP,SPDTEMP(BASE)

	BSR    SEEK
	BSR    INITZE
	BSR    ERCHK
	BRA    END_IO

* NOW SPARE TRACK A WITH TRACK B

SPARE   MOVEA.L TRACKA(BASE),ATEMP
	MOVE.W 2(ATEMP),CYLINDR1(BASE)
	MOVE.W TRACKB+2(BASE),CYLINDR2(BASE)
	MOVE.B  #32,SPDTEMP(BASE)   SET D-BIT
	BSR    SEEK
	BSR    ADDREC
	BSR    DMSETUP
	BSR    INITZE
	BSR    ERCHK
	MOVE.B DSJBYTE(BASE),DTEMP
	BNE    END_IO
	MOVE.B STAT0(BASE),DTEMP
	ANDI.B #$1F,DTEMP   CLEAR SPD
	BNE    END_IO

	MOVE.W TRACKB+2(BASE),CYLINDR1(BASE)
	MOVEA.L TRACKA(BASE),ATEMP
	MOVE.W 2(ATEMP),CYLINDR2(BASE)
	MOVE.B  #128,SPDTEMP(BASE)  SET S-BIT
	BSR    SEEK
	BSR    ADDREC
	BSR    DMSETUP
	BSR    INITZE
	BSR    ERCHK

END_IO  UNLK    BASE
	MOVEA.L (SP)+,ATEMP
	ADDA.W  #PARAMS,SP
	JMP     (ATEMP)
*
*
* DMA SETUP ROUTINE
* - AT THE END OF THIS ROUTINE THE DMA CARD WILL BE
*   SET UP FOR A DISK TRANSFER
*
DMSETUP   MOVE.L   MADR(BASE),DMADR0
	  MOVE.L   SECTORS(BASE),DTEMP
	  MULS     #$100,DTEMP    CONVERT TO BYTE COUNT
	  SUBQ     #1,DTEMP
	  MOVE.W   DTEMP,DMWCT0  LOWER 2 BYTES ONLY
	  RTS
*
*
* Error Check Routine
*
ERCHK     BSR      DSJR
	  BSR      DSTAT
	  MOVE.B   DSJBYTE(BASE),DTEMP
	  BNE      ERROR    CHECK DSJ BYTE
	  MOVE.B   STAT0(BASE),DTEMP
	  ANDI.B   #$1F,DTEMP   CLEAR SPD BITS
	  BEQ      FINISH   CHECK STATUS 1
ERROR     BSR      RADDREC
	  MOVEA.L  ERRTYPE(BASE),ATEMP
	  MOVE.B   STAT0(BASE),(ATEMP)+
	  MOVE.B   STAT1(BASE),(ATEMP)+
	  MOVE.B   STAT2(BASE),(ATEMP)+
	  MOVE.B   STAT3(BASE),(ATEMP)
	  MOVEA.L  TRACKA(BASE),ATEMP
	  MOVE.W   DZERO,(ATEMP)+
	  MOVE.B   ADDR0(BASE),(ATEMP)+
	  MOVE.B   ADDR1(BASE),(ATEMP)
FINISH    RTS
*
*
*  DSJ ROUTINE
*
DSJR    MOVE.B  DZERO,(STATP)    DISABLE INTERRUPTS
	MOVE.B  DZERO,IMSK(PORT)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #PLA,(FIFO)
	MOVE.B  DTA(BASE),(FIFO)
	MOVE.B  #DSJ,(FIFO)
	MOVE.B  #$01,BCOUNT             LOAD INPUT COUNT
	MOVE.B  DZERO,(STATP)           INTERRUPT ENABLE
	MOVE.B  #$04,IMSK(PORT)         ENABLE "FIFO BYTE"
	LEA     DSJBYTE(BASE),BYTEPTR     STORE ADDR. FOR DSJ
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$01,(FIFO)             ENABLE TRANSFER
	JSR     IWAIT                   WAIT FOR INTERRUPT
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNT,(FIFO)
	MOVE.B  #UNL,(FIFO)
ENDSJR  BRA     IDLE
*
*
*  REQUEST AND READ DISK STATUS
*
DSTAT   MOVE.B  DZERO,IMSK(PORT)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	BSR     PNWAIT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$03,(FIFO)     OP CODE
	MOVE.B  #EOI,(STATP)
	MOVE.B  UNIT+1(BASE),(FIFO)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BSR     IDLE
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #PLA,(FIFO)
	MOVE.B  DTA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	MOVE.B  #$04,BCOUNT                LOAD INPUT COUNT
	LEA     STAT0(BASE),BYTEPTR    STORE ADDR. FOR STAT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$04,IMSK(PORT)    ENABLE "FIFO BYTE"
	MOVE.B  #$80,(STATP)   LF INHIBIT
	MOVE.B  #$04,(FIFO)    COUNTED XFER ENABLE
	JSR     IWAIT
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNT,(FIFO)
	MOVE.B  #UNL,(FIFO)
	BRA     IDLE
*
*
*  REQUEST AND READ ADDRESS RECORD
*
RADDREC MOVE.B  DZERO,IMSK(PORT)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	BSR     PNWAIT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$14,(FIFO)     OP CODE
	MOVE.B  #EOI,(STATP)
	MOVE.B  UNIT+1(BASE),(FIFO)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BSR     IDLE
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #PLA,(FIFO)
	MOVE.B  DTA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	MOVE.B  #$04,BCOUNT                LOAD INPUT COUNT
	LEA     ADDR0(BASE),BYTEPTR    STORE ADDR. FOR ADDRESS REC
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$04,IMSK(PORT)    ENABLE "FIFO BYTE"
	MOVE.B  #$80,(STATP)   LF INHIBIT
	MOVE.B  #$04,(FIFO)    COUNTED XFER ENABLE
	JSR     IWAIT
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNT,(FIFO)
	MOVE.B  #UNL,(FIFO)
	BRA     IDLE
*
*
* PPOLL HOLDOFF
*
PWAIT   MOVE.B  DZERO,PPSNS(PORT)             POSITIVE SENSE
	MOVE.B  PMASK(BASE),PPMSK(PORT) SET PPMSK
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$20,IMSK(PORT)         PPOLL RESPONSE
	BRA     IWAIT
*
*
*  PPOLL NEGATION HOLDOFF
*
PNWAIT  MOVE.B  PMASK(BASE),PPSNS(PORT) SET PPSNS
	MOVE.B  PMASK(BASE),PPMSK(PORT) SET PPMSK
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$20,IMSK(PORT)
	BRA     IWAIT
*
*
*  FIFO IDLE HOLDOFF
*
IDLE    MOVE.B  DZERO,IMSK(PORT)
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$02,IMSK(PORT)    ENABLE "FIFO IDLE"
	BRA     IWAIT
*
*
*  SEEK ROUTINE
*
SEEK    MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)    SEEK SECONDARY
	BSR     PNWAIT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$02,(FIFO)     OP CODE
	MOVE.B  UNIT+1(BASE),(FIFO)
	MOVE.B  CYLINDR1(BASE),(FIFO)   CYLAD HIGH BYTE
	MOVE.B  CYLINDR1+1(BASE),(FIFO)   CYLAD LOW BYTE
	MOVE.B  HEAD+1(BASE),(FIFO)
	BSR     IDLE          EMPTY FIFO
	MOVE.B  #EOI,(STATP)
	MOVE.B  #SECTOR,(FIFO)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BSR     IDLE
	BRA     PWAIT     WAIT FOR SEEK COMPLETION
*
*
*  INITIALIZE
*
INITZE  MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	BSR     PNWAIT
	MOVE.B  SPDTEMP(BASE),DTEMP
	ADDI.B  #$B,DTEMP       ADD SPD TO OP CODE
	MOVE.B  DTEMP,(FIFO)
	MOVE.B  #EOI,(STATP)
	MOVE.B  UNIT+1(BASE),(FIFO)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BSR     IDLE

	MOVE.B  #ICMND,(STATP)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #$60,(FIFO)    SEC. WDAT

	MOVE.B  DZERO,(STATP)
	MOVE.B  DZERO,IFLAG(BASE)
	MOVE.W  #$0C,DMCTRL0   (PRIORITY,OUTPUT, BYTE)
	MOVE.B  #$89,CRDCTRL(PORT) (INTERRUPT,OUTPUT,CHAN. 0)
	MOVE.B  #$02,CTRL(PORT)   ENABLE DMARQ, 10 BIT PROC.?
* NOW DATA IS BEING TRANSFERRED
*       MOVE.L  #363636,TCOUNT    2 SEC. TIMEOUT
	MOVE.L  #727,TCOUNT      1 MS AT 16 MHZ       JS 8/19/83
LOOPW   TST.B   IFLAG(BASE)
	BNE.S   WDONE
	SUBQ.L  #1,TCOUNT
	BGE     LOOPW
	BTST    #TIMER_PRESENT,SYSFLAG2     CHECK FOR TIMER  JS 8/19/83
	BEQ.S   LOOPT                      USE IF PRESENT    JS 8/19/83
	MOVE.L  #363636,TCOUNT        ELSE DO 2 SEC LOOP     JS 8/19/83
LOOPW2  TST.B   IFLAG(BASE)           SAME AS BEFORE         JS 8/19/83
	BNE.S   WDONE                                        JS 8/19/83
	SUBQ.L  #1,TCOUNT                                    JS 8/19/83
	BGE     LOOPW2                                       JS 8/19/83
* FAILED TO DO IT IN 2 SECONDS
	BRA     TESCAPE
WDONE   MOVE.B  #$80,CTRL(PORT)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	MOVE.B  #UNT,(FIFO)
	BRA     IDLE
LOOPT   MOVE.B  #1,-(SP)       SETUP TIMER ROUTINE RECORD    JS 8/19/83
	MOVE.L  #2000,-(SP)    FOR 2 SEC TIMEOUT             JS 8/19/83
LOOPT2  TST.B   IFLAG(BASE)    SEE IF DONE                   JS 8/19/83
	BNE.S   LOOPT3         EXIT LOOP IF SO               JS 8/19/83
	PEA     (SP)           PUSH PTR TO RECORD            JS 8/19/83
	JSR     CHECK_TIMER    AND CHECK THE TIMER           JS 8/19/83
	BPL     LOOPT2         LOOP IF NOT TIMED OUT         JS 8/19/83
	ADDQ    #6,SP          TIMEOUT, BUT GET A TRY        JS 5/2/84
	MOVEQ   #10,TCOUNT     ENTER NORMAL TIMEOUT LOOP     JS 5/2/84
	BRA     LOOPW2         WITH A SHORT COUNT            JS 5/2/84
LOOPT3  ADDQ    #6,SP          DONE, CLEANUP STACK           JS 8/19/83
	BRA     WDONE                                        JS 8/19/83
*
*
*  ADDRESS RECORD ROUTINE
*
ADDREC  MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)    ADDRESS RECORD SECONDARY
	BSR     PNWAIT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$0C,(FIFO)     OP CODE
	MOVE.B  UNIT+1(BASE),(FIFO)
	MOVE.B  CYLINDR2(BASE),(FIFO)   CYLAD HIGH BYTE
	MOVE.B  CYLINDR2+1(BASE),(FIFO)   CYLAD LOW BYTE
	MOVE.B  HEAD+1(BASE),(FIFO)
	BSR     IDLE          EMPTY FIFO
	MOVE.B  #EOI,(STATP)
	MOVE.B  #SECTOR,(FIFO)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BRA     PWAIT     WAIT FOR COMPLETION
*
*
*  EMPTY INBOUND FIFO
*
INEMP   MOVE.B  DZERO,(STATP)
	MOVE.B  #$04,IMSK(PORT)
EMPTY   TST.B   INTR(PORT)              CHECK FOR BYTE AVAILABLE
	BEQ     EMPTY1                 IF SO, READ, IF NOT RETURN.
	TST.B   (FIFO)                 (DUMMY READ OF FIFO TO EMPTY IT)
	BRA     EMPTY
EMPTY1  RTS
*
*
*  SET FILE MASK ROUTINE
*     OUTPUT BYTE =XXXXDSCA
*     D=DECREMENTAL SEEK (1) OR INCREMENTAL SEEK(0)
*     S=1 ALLOWS AUTOMATIC SEEK TO SPARE TRACK
*     C=1 ENABLES CYLINDER MODE, C=0 SURFACE MODE
*     A=1 ENABLES AUTOMATIC SEEK AND END OF CYLINDER (SEE D)
*
*
SFM     MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	BSR     PNWAIT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$0F,(FIFO)
	MOVE.B  #EOI,(STATP)
	MOVE.B  #1,(FIFO)
*   DISABLE AUTO SEEK TO SPARE,EN SURFACE, AUTO
*     SEEK TO NEXT CYLINDER
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BSR IDLE
	BRA PWAIT
*
*
*  INTERRUPT SERVICE ROUTINE
*
*
*  SERVICE EOP INTERRUPT
*
ISV     MOVEA.L (SP)+,ATEMP             RETURN ADDRESS
	MOVEA.L (SP)+,BASE              STATIC LINK
	MOVE.L  ATEMP,(SP)              (POP PARAMETER & PUSH) RETURN ADDRESS
	MOVEA.L PHIPORT(BASE),PORT
	LEA     FIFOFFSET(PORT),FIFO
	LEA     STATPOFFS(PORT),STATP
	CLR.L   DZERO

	MOVE.B  DZERO,CRDCTRL(PORT)     DISABLE INTERRUPTS,DMA
	TST.B   CTRL(PORT)              DUMMY READ TO CLEAR INTERRUPT
	BSR     PWAIT
	MOVE.B  #$01,IFLAG(BASE)
	RTS

*
*
*  IWAIT ROUTINE
*
IWAIT   MOVE.W   #600,TCOUNT       DO 1 MS AT 16 MHZ FAST LOOP    JS 8/19/83
IIWAIT  MOVE.B  INTR(PORT),DTEMP
	DBNE    TCOUNT,IIWAIT           TRY AGAIN
	BNE.S   IWDONE            IF DONE THEN GET OUT OF HERE    JS 8/19/83
	BTST    #TIMER_PRESENT,SYSFLAG2   SEE IF WE HAVE TIMER    JS 8/19/83
	BEQ.S   IWTIMER            USE IT IF WE DO                JS 8/19/83
	MOVE.L  #36000,TCOUNT      ELSE USE 200 MS LOOP           JS 8/19/83
IIWAIT2 MOVE.B  INTR(PORT),DTEMP   CHECK FOR DONE                 JS 8/19/83
	BNE.S   IWDONE                                            JS 8/19/83
	SUBQ.L  #1,TCOUNT          THIS IS FIX FOR PREV BUG       JS 8/19/83
	BGT     IIWAIT2            CAN'T USE DBcc -- >32K COUNT   JS 8/19/83
	BRA.S   TESCAPE            TIMED OUT                      JS 8/19/83

IWDONE  CMP.B   #04,DTEMP
	BEQ     BYTE                    CHECK INTERRUPT TYPE
	CMP.B   #$20,DTEMP
	BEQ     PPW
	BRA     OUT
*
IWTIMER MOVE.B  #1,-(SP)          SETUP TIMER RECORD             JS 8/19/83
	MOVE.L  #200,-(SP)        FOR 200 MS TIMEOUT             JS 8/19/83
IWTLOOP MOVE.B  INTR(PORT),DTEMP  CHECK FOR DONE                 JS 8/19/83
	BNE.S   IWTEXIT           IF SO THEN GET OUT OF LOOP     JS 8/19/83
	PEA     (SP)              ELSE PUSH PTR TO TIME REC      JS 8/19/83
	JSR     CHECK_TIMER       AND CHECK THE TIMER            JS 8/19/83
	BPL     IWTLOOP           LOOP IF NOT TIMED OUT          JS 8/19/83
	ADDQ    #6,SP             TIMED OUT, TAKE ANOTHER TRY    JS 5/2/84
	MOVEQ   #10,TCOUNT        USE A SHORT COUNTER            JS 5/2/84
	BRA     IIWAIT2           AND ENTER OTHER LOOP           JS 5/2/84
IWTEXIT ADDQ    #6,SP             CLEANUP STACK WHEN DONE        JS 8/19/83
	BRA     IWDONE            AND DO FINISH PROCESSING       JS 8/19/83


*  SERVICE FIFO BYTE AVAILABLE INTERRUPT
*
BYTE    MOVE.B  (FIFO),(BYTEPTR)+       STORE INPUT DATA
	SUBQ.B  #1,BCOUNT                   DECREMENT INPUT COUNT
	BEQ     OUT
TEST    CMPI.B  #4,INTR(PORT)           ANOTHER BYTE?
	BNE     TEST
	BRA     BYTE
OUT     MOVE.B  DZERO,(STATP)           DISABLE INTERRUPTS
	MOVE.B  DZERO,IMSK(PORT)
*
*
*  SERVICE PPOLL INTERRUPT
*
PPW     RTS

TESCAPE BSR     HDWRCLEAR         INVOKE IFC, CLEAR DMA, ETC.
	MOVE.W  #-10,SYSGLOBALS-2(GLOBAL)         ESCAPE(-10)
	MOVEA.L SYSGLOBALS-10(GLOBAL),SP
	RTS
*
*
* HARDWARE CLEAR
*
HDWRCLEAR EQU *
	TST.W   DMSTAT                  READ DMA CARD CONTROL REG TO DISARM IT
	MOVE.B  DZERO,ID(PORT)             SOFTWARE RESET
	MOVE.B  #$80,HPIBADR(PORT)      ON-LINE
	BSR     IFCLEAR                 ASSERT IFC
* DISK CLEAR FOR HANGUPS
	MOVE.B  #ICMND,STATPOFFS(PORT)
	MOVE.B  #$14,FIFOFFSET(PORT)    DEVICE CLEAR
	RTS
*
*
* INTERFACE CLEAR
*
IFCLEAR MOVE.B  #$11,CTRL(PORT)         IFC, INIT OUTBOUND FIFO
DEL100  MOVE.L  #100,-(SP)             100 MICROSECOND DELAY JS 8/19/83
	JSR     DELAY_TIMER                                  JS 8/19/83
	MOVE.B  #$80,CTRL(PORT)         8-BIT PROCESSOR
	RTS
*
*
*
	  END


@


56.2
log
@
pws2rcs automatic delta on Wed Jan 27 11:57:27 MST 1993
@
text
@d1 602
@


56.1
log
@Automatic bump of revision number for PWS version 3.25
@
text
@a0 602
*
************************************************
*
* FORMAT Routine for Initialize
*
* Greg Herman
*
* Last Updated August 19, 1983 by J Schmidt - timing fixes
*
************************************************
*
	  RORG     0
	  NOSYMS

	  DEF      ASMR_FORMAT
	  REFA     SYSGLOBALS
	  REFA     XMINIT
	  REFA     CHECK_TIMER,DELAY_TIMER                  JS 8/19/83
	  LMODE    CHECK_TIMER,DELAY_TIMER                  JS 8/19/83

TIMER_PRESENT EQU 1                                         JS 8/19/83
SYSFLAG2      EQU $FFFFFEDA                                 JS 8/19/83


PHI       EQU      $10
CARD      EQU      $1
DMAC      EQU      $500000  LOCATION OF BUILT IN DMA CARD
*
INITISRIB EQU      XMINIT-20    INIT'S ISRIB
*
* PHI REGISTER ADDRESSES, IN ASCENDING ORDER
*
INTR      EQU      PHI+1
IMSK      EQU      PHI+3
FIFOFFSET EQU      PHI+5
STATPOFFS EQU      PHI+7
CTRL      EQU      PHI+9
HPIBADR   EQU      PHI+$B
PPMSK     EQU      PHI+$D
PPSNS     EQU      PHI+$F
*
* PHI CARD REGISTERS
*
CRDCTRL   EQU      CARD+2
*CRDSTAT  EQU      CARD+2
ID        EQU      CARD
*
* DMA REGISTERS
*
DMADR0    EQU      DMAC
DMWCT0    EQU      DMAC+4
DMCTRL0   EQU      DMAC+6
DMSTAT    EQU      DMAC
DMADR1    EQU      DMAC+8
DMWCT1    EQU      DMAC+$C
DMCTRL1   EQU      DMAC+$E
*
* AMIGO RELATED CONSTANTS
*
PTA       EQU      $5E        PHI TALK ADDRESS
PLA       EQU      $3E        PHI LISTEN ADDRESS
DTAC      EQU      $40        DISK PRIMARY TALK BASE
DLAC      EQU      $20        DISK PRIMARY LISTEN BASE
DSJ       EQU      $70        DSJ SECONDARY
DSAD      EQU      $68        DISK STANDARD SECONDARY
ICMND     EQU      $40        INTERFACE COMMAND SETUP
EOI       EQU      $80        EOI SETUP
UNT       EQU      $5F        UNTALK COMMAND
UNL       EQU      $3F        UNLISTEN COMMAND
*
*
SECTOR    EQU      0
*
*
* REGISTER SETUP
*
DTEMP   EQU     D0
MTEMP   EQU     D1
BCOUNT  EQU     D2
TCOUNT  EQU     D3
DZERO   EQU     D4
FREE3   EQU     D5              (AVAILABLE FOR USE)
FREE2   EQU     D6              (AVAILABLE FOR USE)
FREE1   EQU     D7              (AVAILABLE FOR USE)

BYTEPTR EQU     A0
FIFO    EQU     A1
PORT    EQU     A2
ATEMP   EQU     A3
STATP   EQU     A4
GLOBAL  EQU     A5
BASE    EQU     A6
*SP     EQU     A7


*
*  PARAMETERS PASSED FROM PASCAL
*

PARAMS   EQU    40-8               NUMBER OF BYTES FOR PASSED PARAMETERS
BUSADDR  EQU    38
UNIT     EQU    36
HEAD     EQU    34
PHIPORT  EQU    30
TRACKB   EQU    26
SECTORS  EQU    22
SPD      EQU    20
MADR     EQU    16
TRACKA   EQU    12                 ADDRESS OF TRACK A
ERRTYPE  EQU     8
*RETADDR EQU     4                 RETURN ADDRESS
*STATLNK EQU     0                 STATIC LINK
*
*  LOCAL PARAMETERS
*
DLA      EQU    -1     DISC LISTEN ADDRESS
DTA      EQU    -2     DISC TALK ADDRESS
DSJBYTE  EQU    -3     DSJ BYTE
STAT3    EQU    -4     STORAGE FOR STATUS BYTES
STAT2    EQU    -5
STAT1    EQU    -6
STAT0    EQU    -7
ADDR3    EQU    -8     STORAGE FOR DISC ADDRESS
ADDR2    EQU    -9
ADDR1    EQU    -10
ADDR0    EQU    -11
PMASK    EQU    -12    PPOLL MASK
IFLAG    EQU    -13    INTERRUPT FLAG
SPDTEMP  EQU    -14    UPPER 3 BITS=S,P,D
CYLINDR1 EQU    -16    CYL ADDR FOR SEEK
CYLINDR2 EQU    -18    CYL ADDR FOR ADDR REC
ADDRSTOR EQU    -22    STORAGE FOR SYSTEM INTERRUPT VECTOR
STATSTOR EQU    -26    STORAGE FOR SYSTEM STATIC LINK
LOCALS   EQU    -26    TOTAL AMOUNT OF LOCAL STOREAGE
*
*
ASMR_FORMAT  LINK    BASE,#LOCALS
	MOVEA.L PHIPORT(BASE),PORT      ADDRESS OF PHI CARD INTERFACE
	LEA     FIFOFFSET(PORT),FIFO
	LEA     STATPOFFS(PORT),STATP
	CLR.L   DZERO

	LEA     ISV,ATEMP               SET UP INTERRUPT VECTOR
	MOVE.L  ATEMP,INITISRIB+8(GLOBAL)  ADDRESS OF ISR
	MOVE.L  BASE,INITISRIB+12(GLOBAL)  STATIC LINK

	MOVE.B  BUSADDR+1(BASE),MTEMP   CALCULATE PPOLL MASK
	MOVE.B  #$80,DTEMP
	LSR.B   MTEMP,DTEMP
	MOVE.B  DTEMP,PMASK(BASE)

	MOVE.B #DTAC,DTEMP              CALCULATE DISC TALK ADDRESS
	ADD.B  BUSADDR+1(BASE),DTEMP
	MOVE.B DTEMP,DTA(BASE)

	MOVE.B #DLAC,DTEMP              CALCULATE DISC LISTEN ADDRESS
	ADD.B  BUSADDR+1(BASE),DTEMP
	MOVE.B DTEMP,DLA(BASE)

	MOVEA.L ERRTYPE(BASE),ATEMP     LOAD ERRTYPE ADDRESS
	MOVE.L  DZERO,(ATEMP)           CLEAR ERRTYPE

	BSR  SFM     SET FILE MASK

	MOVEA.L TRACKA(BASE),ATEMP      COMPARE TRACK A & B
	MOVE.L (ATEMP),DTEMP
	CMP.L  TRACKB(BASE),DTEMP
	BNE    SPARE
*    IF EQUAL THEN FORMAT TRACK A
	BSR    DMSETUP
	MOVEA.L TRACKA(BASE),ATEMP
	MOVE.W 2(ATEMP),CYLINDR1(BASE)
	MOVE.W SPD(BASE),DTEMP         SHIFT S,P,D TO UPPER 3 BITS
	MULS   #32,DTEMP
	MOVE.B DTEMP,SPDTEMP(BASE)

	BSR    SEEK
	BSR    INITZE
	BSR    ERCHK
	BRA    END_IO

* NOW SPARE TRACK A WITH TRACK B

SPARE   MOVEA.L TRACKA(BASE),ATEMP
	MOVE.W 2(ATEMP),CYLINDR1(BASE)
	MOVE.W TRACKB+2(BASE),CYLINDR2(BASE)
	MOVE.B  #32,SPDTEMP(BASE)   SET D-BIT
	BSR    SEEK
	BSR    ADDREC
	BSR    DMSETUP
	BSR    INITZE
	BSR    ERCHK
	MOVE.B DSJBYTE(BASE),DTEMP
	BNE    END_IO
	MOVE.B STAT0(BASE),DTEMP
	ANDI.B #$1F,DTEMP   CLEAR SPD
	BNE    END_IO

	MOVE.W TRACKB+2(BASE),CYLINDR1(BASE)
	MOVEA.L TRACKA(BASE),ATEMP
	MOVE.W 2(ATEMP),CYLINDR2(BASE)
	MOVE.B  #128,SPDTEMP(BASE)  SET S-BIT
	BSR    SEEK
	BSR    ADDREC
	BSR    DMSETUP
	BSR    INITZE
	BSR    ERCHK

END_IO  UNLK    BASE
	MOVEA.L (SP)+,ATEMP
	ADDA.W  #PARAMS,SP
	JMP     (ATEMP)
*
*
* DMA SETUP ROUTINE
* - AT THE END OF THIS ROUTINE THE DMA CARD WILL BE
*   SET UP FOR A DISK TRANSFER
*
DMSETUP   MOVE.L   MADR(BASE),DMADR0
	  MOVE.L   SECTORS(BASE),DTEMP
	  MULS     #$100,DTEMP    CONVERT TO BYTE COUNT
	  SUBQ     #1,DTEMP
	  MOVE.W   DTEMP,DMWCT0  LOWER 2 BYTES ONLY
	  RTS
*
*
* Error Check Routine
*
ERCHK     BSR      DSJR
	  BSR      DSTAT
	  MOVE.B   DSJBYTE(BASE),DTEMP
	  BNE      ERROR    CHECK DSJ BYTE
	  MOVE.B   STAT0(BASE),DTEMP
	  ANDI.B   #$1F,DTEMP   CLEAR SPD BITS
	  BEQ      FINISH   CHECK STATUS 1
ERROR     BSR      RADDREC
	  MOVEA.L  ERRTYPE(BASE),ATEMP
	  MOVE.B   STAT0(BASE),(ATEMP)+
	  MOVE.B   STAT1(BASE),(ATEMP)+
	  MOVE.B   STAT2(BASE),(ATEMP)+
	  MOVE.B   STAT3(BASE),(ATEMP)
	  MOVEA.L  TRACKA(BASE),ATEMP
	  MOVE.W   DZERO,(ATEMP)+
	  MOVE.B   ADDR0(BASE),(ATEMP)+
	  MOVE.B   ADDR1(BASE),(ATEMP)
FINISH    RTS
*
*
*  DSJ ROUTINE
*
DSJR    MOVE.B  DZERO,(STATP)    DISABLE INTERRUPTS
	MOVE.B  DZERO,IMSK(PORT)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #PLA,(FIFO)
	MOVE.B  DTA(BASE),(FIFO)
	MOVE.B  #DSJ,(FIFO)
	MOVE.B  #$01,BCOUNT             LOAD INPUT COUNT
	MOVE.B  DZERO,(STATP)           INTERRUPT ENABLE
	MOVE.B  #$04,IMSK(PORT)         ENABLE "FIFO BYTE"
	LEA     DSJBYTE(BASE),BYTEPTR     STORE ADDR. FOR DSJ
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$01,(FIFO)             ENABLE TRANSFER
	JSR     IWAIT                   WAIT FOR INTERRUPT
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNT,(FIFO)
	MOVE.B  #UNL,(FIFO)
ENDSJR  BRA     IDLE
*
*
*  REQUEST AND READ DISK STATUS
*
DSTAT   MOVE.B  DZERO,IMSK(PORT)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	BSR     PNWAIT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$03,(FIFO)     OP CODE
	MOVE.B  #EOI,(STATP)
	MOVE.B  UNIT+1(BASE),(FIFO)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BSR     IDLE
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #PLA,(FIFO)
	MOVE.B  DTA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	MOVE.B  #$04,BCOUNT                LOAD INPUT COUNT
	LEA     STAT0(BASE),BYTEPTR    STORE ADDR. FOR STAT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$04,IMSK(PORT)    ENABLE "FIFO BYTE"
	MOVE.B  #$80,(STATP)   LF INHIBIT
	MOVE.B  #$04,(FIFO)    COUNTED XFER ENABLE
	JSR     IWAIT
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNT,(FIFO)
	MOVE.B  #UNL,(FIFO)
	BRA     IDLE
*
*
*  REQUEST AND READ ADDRESS RECORD
*
RADDREC MOVE.B  DZERO,IMSK(PORT)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	BSR     PNWAIT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$14,(FIFO)     OP CODE
	MOVE.B  #EOI,(STATP)
	MOVE.B  UNIT+1(BASE),(FIFO)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BSR     IDLE
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #PLA,(FIFO)
	MOVE.B  DTA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	MOVE.B  #$04,BCOUNT                LOAD INPUT COUNT
	LEA     ADDR0(BASE),BYTEPTR    STORE ADDR. FOR ADDRESS REC
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$04,IMSK(PORT)    ENABLE "FIFO BYTE"
	MOVE.B  #$80,(STATP)   LF INHIBIT
	MOVE.B  #$04,(FIFO)    COUNTED XFER ENABLE
	JSR     IWAIT
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNT,(FIFO)
	MOVE.B  #UNL,(FIFO)
	BRA     IDLE
*
*
* PPOLL HOLDOFF
*
PWAIT   MOVE.B  DZERO,PPSNS(PORT)             POSITIVE SENSE
	MOVE.B  PMASK(BASE),PPMSK(PORT) SET PPMSK
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$20,IMSK(PORT)         PPOLL RESPONSE
	BRA     IWAIT
*
*
*  PPOLL NEGATION HOLDOFF
*
PNWAIT  MOVE.B  PMASK(BASE),PPSNS(PORT) SET PPSNS
	MOVE.B  PMASK(BASE),PPMSK(PORT) SET PPMSK
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$20,IMSK(PORT)
	BRA     IWAIT
*
*
*  FIFO IDLE HOLDOFF
*
IDLE    MOVE.B  DZERO,IMSK(PORT)
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$02,IMSK(PORT)    ENABLE "FIFO IDLE"
	BRA     IWAIT
*
*
*  SEEK ROUTINE
*
SEEK    MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)    SEEK SECONDARY
	BSR     PNWAIT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$02,(FIFO)     OP CODE
	MOVE.B  UNIT+1(BASE),(FIFO)
	MOVE.B  CYLINDR1(BASE),(FIFO)   CYLAD HIGH BYTE
	MOVE.B  CYLINDR1+1(BASE),(FIFO)   CYLAD LOW BYTE
	MOVE.B  HEAD+1(BASE),(FIFO)
	BSR     IDLE          EMPTY FIFO
	MOVE.B  #EOI,(STATP)
	MOVE.B  #SECTOR,(FIFO)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BSR     IDLE
	BRA     PWAIT     WAIT FOR SEEK COMPLETION
*
*
*  INITIALIZE
*
INITZE  MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	BSR     PNWAIT
	MOVE.B  SPDTEMP(BASE),DTEMP
	ADDI.B  #$B,DTEMP       ADD SPD TO OP CODE
	MOVE.B  DTEMP,(FIFO)
	MOVE.B  #EOI,(STATP)
	MOVE.B  UNIT+1(BASE),(FIFO)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BSR     IDLE

	MOVE.B  #ICMND,(STATP)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #$60,(FIFO)    SEC. WDAT

	MOVE.B  DZERO,(STATP)
	MOVE.B  DZERO,IFLAG(BASE)
	MOVE.W  #$0C,DMCTRL0   (PRIORITY,OUTPUT, BYTE)
	MOVE.B  #$89,CRDCTRL(PORT) (INTERRUPT,OUTPUT,CHAN. 0)
	MOVE.B  #$02,CTRL(PORT)   ENABLE DMARQ, 10 BIT PROC.?
* NOW DATA IS BEING TRANSFERRED
*       MOVE.L  #363636,TCOUNT    2 SEC. TIMEOUT
	MOVE.L  #727,TCOUNT      1 MS AT 16 MHZ       JS 8/19/83
LOOPW   TST.B   IFLAG(BASE)
	BNE.S   WDONE
	SUBQ.L  #1,TCOUNT
	BGE     LOOPW
	BTST    #TIMER_PRESENT,SYSFLAG2     CHECK FOR TIMER  JS 8/19/83
	BEQ.S   LOOPT                      USE IF PRESENT    JS 8/19/83
	MOVE.L  #363636,TCOUNT        ELSE DO 2 SEC LOOP     JS 8/19/83
LOOPW2  TST.B   IFLAG(BASE)           SAME AS BEFORE         JS 8/19/83
	BNE.S   WDONE                                        JS 8/19/83
	SUBQ.L  #1,TCOUNT                                    JS 8/19/83
	BGE     LOOPW2                                       JS 8/19/83
* FAILED TO DO IT IN 2 SECONDS
	BRA     TESCAPE
WDONE   MOVE.B  #$80,CTRL(PORT)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	MOVE.B  #UNT,(FIFO)
	BRA     IDLE
LOOPT   MOVE.B  #1,-(SP)       SETUP TIMER ROUTINE RECORD    JS 8/19/83
	MOVE.L  #2000,-(SP)    FOR 2 SEC TIMEOUT             JS 8/19/83
LOOPT2  TST.B   IFLAG(BASE)    SEE IF DONE                   JS 8/19/83
	BNE.S   LOOPT3         EXIT LOOP IF SO               JS 8/19/83
	PEA     (SP)           PUSH PTR TO RECORD            JS 8/19/83
	JSR     CHECK_TIMER    AND CHECK THE TIMER           JS 8/19/83
	BPL     LOOPT2         LOOP IF NOT TIMED OUT         JS 8/19/83
	ADDQ    #6,SP          TIMEOUT, BUT GET A TRY        JS 5/2/84
	MOVEQ   #10,TCOUNT     ENTER NORMAL TIMEOUT LOOP     JS 5/2/84
	BRA     LOOPW2         WITH A SHORT COUNT            JS 5/2/84
LOOPT3  ADDQ    #6,SP          DONE, CLEANUP STACK           JS 8/19/83
	BRA     WDONE                                        JS 8/19/83
*
*
*  ADDRESS RECORD ROUTINE
*
ADDREC  MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)    ADDRESS RECORD SECONDARY
	BSR     PNWAIT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$0C,(FIFO)     OP CODE
	MOVE.B  UNIT+1(BASE),(FIFO)
	MOVE.B  CYLINDR2(BASE),(FIFO)   CYLAD HIGH BYTE
	MOVE.B  CYLINDR2+1(BASE),(FIFO)   CYLAD LOW BYTE
	MOVE.B  HEAD+1(BASE),(FIFO)
	BSR     IDLE          EMPTY FIFO
	MOVE.B  #EOI,(STATP)
	MOVE.B  #SECTOR,(FIFO)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BRA     PWAIT     WAIT FOR COMPLETION
*
*
*  EMPTY INBOUND FIFO
*
INEMP   MOVE.B  DZERO,(STATP)
	MOVE.B  #$04,IMSK(PORT)
EMPTY   TST.B   INTR(PORT)              CHECK FOR BYTE AVAILABLE
	BEQ     EMPTY1                 IF SO, READ, IF NOT RETURN.
	TST.B   (FIFO)                 (DUMMY READ OF FIFO TO EMPTY IT)
	BRA     EMPTY
EMPTY1  RTS
*
*
*  SET FILE MASK ROUTINE
*     OUTPUT BYTE =XXXXDSCA
*     D=DECREMENTAL SEEK (1) OR INCREMENTAL SEEK(0)
*     S=1 ALLOWS AUTOMATIC SEEK TO SPARE TRACK
*     C=1 ENABLES CYLINDER MODE, C=0 SURFACE MODE
*     A=1 ENABLES AUTOMATIC SEEK AND END OF CYLINDER (SEE D)
*
*
SFM     MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	BSR     PNWAIT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$0F,(FIFO)
	MOVE.B  #EOI,(STATP)
	MOVE.B  #1,(FIFO)
*   DISABLE AUTO SEEK TO SPARE,EN SURFACE, AUTO
*     SEEK TO NEXT CYLINDER
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BSR IDLE
	BRA PWAIT
*
*
*  INTERRUPT SERVICE ROUTINE
*
*
*  SERVICE EOP INTERRUPT
*
ISV     MOVEA.L (SP)+,ATEMP             RETURN ADDRESS
	MOVEA.L (SP)+,BASE              STATIC LINK
	MOVE.L  ATEMP,(SP)              (POP PARAMETER & PUSH) RETURN ADDRESS
	MOVEA.L PHIPORT(BASE),PORT
	LEA     FIFOFFSET(PORT),FIFO
	LEA     STATPOFFS(PORT),STATP
	CLR.L   DZERO

	MOVE.B  DZERO,CRDCTRL(PORT)     DISABLE INTERRUPTS,DMA
	TST.B   CTRL(PORT)              DUMMY READ TO CLEAR INTERRUPT
	BSR     PWAIT
	MOVE.B  #$01,IFLAG(BASE)
	RTS

*
*
*  IWAIT ROUTINE
*
IWAIT   MOVE.W   #600,TCOUNT       DO 1 MS AT 16 MHZ FAST LOOP    JS 8/19/83
IIWAIT  MOVE.B  INTR(PORT),DTEMP
	DBNE    TCOUNT,IIWAIT           TRY AGAIN
	BNE.S   IWDONE            IF DONE THEN GET OUT OF HERE    JS 8/19/83
	BTST    #TIMER_PRESENT,SYSFLAG2   SEE IF WE HAVE TIMER    JS 8/19/83
	BEQ.S   IWTIMER            USE IT IF WE DO                JS 8/19/83
	MOVE.L  #36000,TCOUNT      ELSE USE 200 MS LOOP           JS 8/19/83
IIWAIT2 MOVE.B  INTR(PORT),DTEMP   CHECK FOR DONE                 JS 8/19/83
	BNE.S   IWDONE                                            JS 8/19/83
	SUBQ.L  #1,TCOUNT          THIS IS FIX FOR PREV BUG       JS 8/19/83
	BGT     IIWAIT2            CAN'T USE DBcc -- >32K COUNT   JS 8/19/83
	BRA.S   TESCAPE            TIMED OUT                      JS 8/19/83

IWDONE  CMP.B   #04,DTEMP
	BEQ     BYTE                    CHECK INTERRUPT TYPE
	CMP.B   #$20,DTEMP
	BEQ     PPW
	BRA     OUT
*
IWTIMER MOVE.B  #1,-(SP)          SETUP TIMER RECORD             JS 8/19/83
	MOVE.L  #200,-(SP)        FOR 200 MS TIMEOUT             JS 8/19/83
IWTLOOP MOVE.B  INTR(PORT),DTEMP  CHECK FOR DONE                 JS 8/19/83
	BNE.S   IWTEXIT           IF SO THEN GET OUT OF LOOP     JS 8/19/83
	PEA     (SP)              ELSE PUSH PTR TO TIME REC      JS 8/19/83
	JSR     CHECK_TIMER       AND CHECK THE TIMER            JS 8/19/83
	BPL     IWTLOOP           LOOP IF NOT TIMED OUT          JS 8/19/83
	ADDQ    #6,SP             TIMED OUT, TAKE ANOTHER TRY    JS 5/2/84
	MOVEQ   #10,TCOUNT        USE A SHORT COUNTER            JS 5/2/84
	BRA     IIWAIT2           AND ENTER OTHER LOOP           JS 5/2/84
IWTEXIT ADDQ    #6,SP             CLEANUP STACK WHEN DONE        JS 8/19/83
	BRA     IWDONE            AND DO FINISH PROCESSING       JS 8/19/83


*  SERVICE FIFO BYTE AVAILABLE INTERRUPT
*
BYTE    MOVE.B  (FIFO),(BYTEPTR)+       STORE INPUT DATA
	SUBQ.B  #1,BCOUNT                   DECREMENT INPUT COUNT
	BEQ     OUT
TEST    CMPI.B  #4,INTR(PORT)           ANOTHER BYTE?
	BNE     TEST
	BRA     BYTE
OUT     MOVE.B  DZERO,(STATP)           DISABLE INTERRUPTS
	MOVE.B  DZERO,IMSK(PORT)
*
*
*  SERVICE PPOLL INTERRUPT
*
PPW     RTS

TESCAPE BSR     HDWRCLEAR         INVOKE IFC, CLEAR DMA, ETC.
	MOVE.W  #-10,SYSGLOBALS-2(GLOBAL)         ESCAPE(-10)
	MOVEA.L SYSGLOBALS-10(GLOBAL),SP
	RTS
*
*
* HARDWARE CLEAR
*
HDWRCLEAR EQU *
	TST.W   DMSTAT                  READ DMA CARD CONTROL REG TO DISARM IT
	MOVE.B  DZERO,ID(PORT)             SOFTWARE RESET
	MOVE.B  #$80,HPIBADR(PORT)      ON-LINE
	BSR     IFCLEAR                 ASSERT IFC
* DISK CLEAR FOR HANGUPS
	MOVE.B  #ICMND,STATPOFFS(PORT)
	MOVE.B  #$14,FIFOFFSET(PORT)    DEVICE CLEAR
	RTS
*
*
* INTERFACE CLEAR
*
IFCLEAR MOVE.B  #$11,CTRL(PORT)         IFC, INIT OUTBOUND FIFO
DEL100  MOVE.L  #100,-(SP)             100 MICROSECOND DELAY JS 8/19/83
	JSR     DELAY_TIMER                                  JS 8/19/83
	MOVE.B  #$80,CTRL(PORT)         8-BIT PROCESSOR
	RTS
*
*
*
	  END


@


55.1
log
@Automatic bump of revision number for PWS version 3.25A
@
text
@@


54.3
log
@
pws2rcs automatic delta on Wed Aug 21 12:27:56 MDT 1991
@
text
@@


54.2
log
@
pws2rcs automatic delta on Wed Aug 21 09:35:48 MDT 1991
@
text
@d1 602
@


54.1
log
@Automatic bump of revision number for PWS version 3.24
@
text
@a0 602
*
************************************************
*
* FORMAT Routine for Initialize
*
* Greg Herman
*
* Last Updated August 19, 1983 by J Schmidt - timing fixes
*
************************************************
*
	  RORG     0
	  NOSYMS

	  DEF      ASMR_FORMAT
	  REFA     SYSGLOBALS
	  REFA     XMINIT
	  REFA     CHECK_TIMER,DELAY_TIMER                  JS 8/19/83
	  LMODE    CHECK_TIMER,DELAY_TIMER                  JS 8/19/83

TIMER_PRESENT EQU 1                                         JS 8/19/83
SYSFLAG2      EQU $FFFFFEDA                                 JS 8/19/83


PHI       EQU      $10
CARD      EQU      $1
DMAC      EQU      $500000  LOCATION OF BUILT IN DMA CARD
*
INITISRIB EQU      XMINIT-20    INIT'S ISRIB
*
* PHI REGISTER ADDRESSES, IN ASCENDING ORDER
*
INTR      EQU      PHI+1
IMSK      EQU      PHI+3
FIFOFFSET EQU      PHI+5
STATPOFFS EQU      PHI+7
CTRL      EQU      PHI+9
HPIBADR   EQU      PHI+$B
PPMSK     EQU      PHI+$D
PPSNS     EQU      PHI+$F
*
* PHI CARD REGISTERS
*
CRDCTRL   EQU      CARD+2
*CRDSTAT  EQU      CARD+2
ID        EQU      CARD
*
* DMA REGISTERS
*
DMADR0    EQU      DMAC
DMWCT0    EQU      DMAC+4
DMCTRL0   EQU      DMAC+6
DMSTAT    EQU      DMAC
DMADR1    EQU      DMAC+8
DMWCT1    EQU      DMAC+$C
DMCTRL1   EQU      DMAC+$E
*
* AMIGO RELATED CONSTANTS
*
PTA       EQU      $5E        PHI TALK ADDRESS
PLA       EQU      $3E        PHI LISTEN ADDRESS
DTAC      EQU      $40        DISK PRIMARY TALK BASE
DLAC      EQU      $20        DISK PRIMARY LISTEN BASE
DSJ       EQU      $70        DSJ SECONDARY
DSAD      EQU      $68        DISK STANDARD SECONDARY
ICMND     EQU      $40        INTERFACE COMMAND SETUP
EOI       EQU      $80        EOI SETUP
UNT       EQU      $5F        UNTALK COMMAND
UNL       EQU      $3F        UNLISTEN COMMAND
*
*
SECTOR    EQU      0
*
*
* REGISTER SETUP
*
DTEMP   EQU     D0
MTEMP   EQU     D1
BCOUNT  EQU     D2
TCOUNT  EQU     D3
DZERO   EQU     D4
FREE3   EQU     D5              (AVAILABLE FOR USE)
FREE2   EQU     D6              (AVAILABLE FOR USE)
FREE1   EQU     D7              (AVAILABLE FOR USE)

BYTEPTR EQU     A0
FIFO    EQU     A1
PORT    EQU     A2
ATEMP   EQU     A3
STATP   EQU     A4
GLOBAL  EQU     A5
BASE    EQU     A6
*SP     EQU     A7


*
*  PARAMETERS PASSED FROM PASCAL
*

PARAMS   EQU    40-8               NUMBER OF BYTES FOR PASSED PARAMETERS
BUSADDR  EQU    38
UNIT     EQU    36
HEAD     EQU    34
PHIPORT  EQU    30
TRACKB   EQU    26
SECTORS  EQU    22
SPD      EQU    20
MADR     EQU    16
TRACKA   EQU    12                 ADDRESS OF TRACK A
ERRTYPE  EQU     8
*RETADDR EQU     4                 RETURN ADDRESS
*STATLNK EQU     0                 STATIC LINK
*
*  LOCAL PARAMETERS
*
DLA      EQU    -1     DISC LISTEN ADDRESS
DTA      EQU    -2     DISC TALK ADDRESS
DSJBYTE  EQU    -3     DSJ BYTE
STAT3    EQU    -4     STORAGE FOR STATUS BYTES
STAT2    EQU    -5
STAT1    EQU    -6
STAT0    EQU    -7
ADDR3    EQU    -8     STORAGE FOR DISC ADDRESS
ADDR2    EQU    -9
ADDR1    EQU    -10
ADDR0    EQU    -11
PMASK    EQU    -12    PPOLL MASK
IFLAG    EQU    -13    INTERRUPT FLAG
SPDTEMP  EQU    -14    UPPER 3 BITS=S,P,D
CYLINDR1 EQU    -16    CYL ADDR FOR SEEK
CYLINDR2 EQU    -18    CYL ADDR FOR ADDR REC
ADDRSTOR EQU    -22    STORAGE FOR SYSTEM INTERRUPT VECTOR
STATSTOR EQU    -26    STORAGE FOR SYSTEM STATIC LINK
LOCALS   EQU    -26    TOTAL AMOUNT OF LOCAL STOREAGE
*
*
ASMR_FORMAT  LINK    BASE,#LOCALS
	MOVEA.L PHIPORT(BASE),PORT      ADDRESS OF PHI CARD INTERFACE
	LEA     FIFOFFSET(PORT),FIFO
	LEA     STATPOFFS(PORT),STATP
	CLR.L   DZERO

	LEA     ISV,ATEMP               SET UP INTERRUPT VECTOR
	MOVE.L  ATEMP,INITISRIB+8(GLOBAL)  ADDRESS OF ISR
	MOVE.L  BASE,INITISRIB+12(GLOBAL)  STATIC LINK

	MOVE.B  BUSADDR+1(BASE),MTEMP   CALCULATE PPOLL MASK
	MOVE.B  #$80,DTEMP
	LSR.B   MTEMP,DTEMP
	MOVE.B  DTEMP,PMASK(BASE)

	MOVE.B #DTAC,DTEMP              CALCULATE DISC TALK ADDRESS
	ADD.B  BUSADDR+1(BASE),DTEMP
	MOVE.B DTEMP,DTA(BASE)

	MOVE.B #DLAC,DTEMP              CALCULATE DISC LISTEN ADDRESS
	ADD.B  BUSADDR+1(BASE),DTEMP
	MOVE.B DTEMP,DLA(BASE)

	MOVEA.L ERRTYPE(BASE),ATEMP     LOAD ERRTYPE ADDRESS
	MOVE.L  DZERO,(ATEMP)           CLEAR ERRTYPE

	BSR  SFM     SET FILE MASK

	MOVEA.L TRACKA(BASE),ATEMP      COMPARE TRACK A & B
	MOVE.L (ATEMP),DTEMP
	CMP.L  TRACKB(BASE),DTEMP
	BNE    SPARE
*    IF EQUAL THEN FORMAT TRACK A
	BSR    DMSETUP
	MOVEA.L TRACKA(BASE),ATEMP
	MOVE.W 2(ATEMP),CYLINDR1(BASE)
	MOVE.W SPD(BASE),DTEMP         SHIFT S,P,D TO UPPER 3 BITS
	MULS   #32,DTEMP
	MOVE.B DTEMP,SPDTEMP(BASE)

	BSR    SEEK
	BSR    INITZE
	BSR    ERCHK
	BRA    END_IO

* NOW SPARE TRACK A WITH TRACK B

SPARE   MOVEA.L TRACKA(BASE),ATEMP
	MOVE.W 2(ATEMP),CYLINDR1(BASE)
	MOVE.W TRACKB+2(BASE),CYLINDR2(BASE)
	MOVE.B  #32,SPDTEMP(BASE)   SET D-BIT
	BSR    SEEK
	BSR    ADDREC
	BSR    DMSETUP
	BSR    INITZE
	BSR    ERCHK
	MOVE.B DSJBYTE(BASE),DTEMP
	BNE    END_IO
	MOVE.B STAT0(BASE),DTEMP
	ANDI.B #$1F,DTEMP   CLEAR SPD
	BNE    END_IO

	MOVE.W TRACKB+2(BASE),CYLINDR1(BASE)
	MOVEA.L TRACKA(BASE),ATEMP
	MOVE.W 2(ATEMP),CYLINDR2(BASE)
	MOVE.B  #128,SPDTEMP(BASE)  SET S-BIT
	BSR    SEEK
	BSR    ADDREC
	BSR    DMSETUP
	BSR    INITZE
	BSR    ERCHK

END_IO  UNLK    BASE
	MOVEA.L (SP)+,ATEMP
	ADDA.W  #PARAMS,SP
	JMP     (ATEMP)
*
*
* DMA SETUP ROUTINE
* - AT THE END OF THIS ROUTINE THE DMA CARD WILL BE
*   SET UP FOR A DISK TRANSFER
*
DMSETUP   MOVE.L   MADR(BASE),DMADR0
	  MOVE.L   SECTORS(BASE),DTEMP
	  MULS     #$100,DTEMP    CONVERT TO BYTE COUNT
	  SUBQ     #1,DTEMP
	  MOVE.W   DTEMP,DMWCT0  LOWER 2 BYTES ONLY
	  RTS
*
*
* Error Check Routine
*
ERCHK     BSR      DSJR
	  BSR      DSTAT
	  MOVE.B   DSJBYTE(BASE),DTEMP
	  BNE      ERROR    CHECK DSJ BYTE
	  MOVE.B   STAT0(BASE),DTEMP
	  ANDI.B   #$1F,DTEMP   CLEAR SPD BITS
	  BEQ      FINISH   CHECK STATUS 1
ERROR     BSR      RADDREC
	  MOVEA.L  ERRTYPE(BASE),ATEMP
	  MOVE.B   STAT0(BASE),(ATEMP)+
	  MOVE.B   STAT1(BASE),(ATEMP)+
	  MOVE.B   STAT2(BASE),(ATEMP)+
	  MOVE.B   STAT3(BASE),(ATEMP)
	  MOVEA.L  TRACKA(BASE),ATEMP
	  MOVE.W   DZERO,(ATEMP)+
	  MOVE.B   ADDR0(BASE),(ATEMP)+
	  MOVE.B   ADDR1(BASE),(ATEMP)
FINISH    RTS
*
*
*  DSJ ROUTINE
*
DSJR    MOVE.B  DZERO,(STATP)    DISABLE INTERRUPTS
	MOVE.B  DZERO,IMSK(PORT)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #PLA,(FIFO)
	MOVE.B  DTA(BASE),(FIFO)
	MOVE.B  #DSJ,(FIFO)
	MOVE.B  #$01,BCOUNT             LOAD INPUT COUNT
	MOVE.B  DZERO,(STATP)           INTERRUPT ENABLE
	MOVE.B  #$04,IMSK(PORT)         ENABLE "FIFO BYTE"
	LEA     DSJBYTE(BASE),BYTEPTR     STORE ADDR. FOR DSJ
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$01,(FIFO)             ENABLE TRANSFER
	JSR     IWAIT                   WAIT FOR INTERRUPT
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNT,(FIFO)
	MOVE.B  #UNL,(FIFO)
ENDSJR  BRA     IDLE
*
*
*  REQUEST AND READ DISK STATUS
*
DSTAT   MOVE.B  DZERO,IMSK(PORT)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	BSR     PNWAIT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$03,(FIFO)     OP CODE
	MOVE.B  #EOI,(STATP)
	MOVE.B  UNIT+1(BASE),(FIFO)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BSR     IDLE
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #PLA,(FIFO)
	MOVE.B  DTA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	MOVE.B  #$04,BCOUNT                LOAD INPUT COUNT
	LEA     STAT0(BASE),BYTEPTR    STORE ADDR. FOR STAT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$04,IMSK(PORT)    ENABLE "FIFO BYTE"
	MOVE.B  #$80,(STATP)   LF INHIBIT
	MOVE.B  #$04,(FIFO)    COUNTED XFER ENABLE
	JSR     IWAIT
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNT,(FIFO)
	MOVE.B  #UNL,(FIFO)
	BRA     IDLE
*
*
*  REQUEST AND READ ADDRESS RECORD
*
RADDREC MOVE.B  DZERO,IMSK(PORT)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	BSR     PNWAIT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$14,(FIFO)     OP CODE
	MOVE.B  #EOI,(STATP)
	MOVE.B  UNIT+1(BASE),(FIFO)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BSR     IDLE
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #PLA,(FIFO)
	MOVE.B  DTA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	MOVE.B  #$04,BCOUNT                LOAD INPUT COUNT
	LEA     ADDR0(BASE),BYTEPTR    STORE ADDR. FOR ADDRESS REC
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$04,IMSK(PORT)    ENABLE "FIFO BYTE"
	MOVE.B  #$80,(STATP)   LF INHIBIT
	MOVE.B  #$04,(FIFO)    COUNTED XFER ENABLE
	JSR     IWAIT
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNT,(FIFO)
	MOVE.B  #UNL,(FIFO)
	BRA     IDLE
*
*
* PPOLL HOLDOFF
*
PWAIT   MOVE.B  DZERO,PPSNS(PORT)             POSITIVE SENSE
	MOVE.B  PMASK(BASE),PPMSK(PORT) SET PPMSK
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$20,IMSK(PORT)         PPOLL RESPONSE
	BRA     IWAIT
*
*
*  PPOLL NEGATION HOLDOFF
*
PNWAIT  MOVE.B  PMASK(BASE),PPSNS(PORT) SET PPSNS
	MOVE.B  PMASK(BASE),PPMSK(PORT) SET PPMSK
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$20,IMSK(PORT)
	BRA     IWAIT
*
*
*  FIFO IDLE HOLDOFF
*
IDLE    MOVE.B  DZERO,IMSK(PORT)
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$02,IMSK(PORT)    ENABLE "FIFO IDLE"
	BRA     IWAIT
*
*
*  SEEK ROUTINE
*
SEEK    MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)    SEEK SECONDARY
	BSR     PNWAIT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$02,(FIFO)     OP CODE
	MOVE.B  UNIT+1(BASE),(FIFO)
	MOVE.B  CYLINDR1(BASE),(FIFO)   CYLAD HIGH BYTE
	MOVE.B  CYLINDR1+1(BASE),(FIFO)   CYLAD LOW BYTE
	MOVE.B  HEAD+1(BASE),(FIFO)
	BSR     IDLE          EMPTY FIFO
	MOVE.B  #EOI,(STATP)
	MOVE.B  #SECTOR,(FIFO)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BSR     IDLE
	BRA     PWAIT     WAIT FOR SEEK COMPLETION
*
*
*  INITIALIZE
*
INITZE  MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	BSR     PNWAIT
	MOVE.B  SPDTEMP(BASE),DTEMP
	ADDI.B  #$B,DTEMP       ADD SPD TO OP CODE
	MOVE.B  DTEMP,(FIFO)
	MOVE.B  #EOI,(STATP)
	MOVE.B  UNIT+1(BASE),(FIFO)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BSR     IDLE

	MOVE.B  #ICMND,(STATP)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #$60,(FIFO)    SEC. WDAT

	MOVE.B  DZERO,(STATP)
	MOVE.B  DZERO,IFLAG(BASE)
	MOVE.W  #$0C,DMCTRL0   (PRIORITY,OUTPUT, BYTE)
	MOVE.B  #$89,CRDCTRL(PORT) (INTERRUPT,OUTPUT,CHAN. 0)
	MOVE.B  #$02,CTRL(PORT)   ENABLE DMARQ, 10 BIT PROC.?
* NOW DATA IS BEING TRANSFERRED
*       MOVE.L  #363636,TCOUNT    2 SEC. TIMEOUT
	MOVE.L  #727,TCOUNT      1 MS AT 16 MHZ       JS 8/19/83
LOOPW   TST.B   IFLAG(BASE)
	BNE.S   WDONE
	SUBQ.L  #1,TCOUNT
	BGE     LOOPW
	BTST    #TIMER_PRESENT,SYSFLAG2     CHECK FOR TIMER  JS 8/19/83
	BEQ.S   LOOPT                      USE IF PRESENT    JS 8/19/83
	MOVE.L  #363636,TCOUNT        ELSE DO 2 SEC LOOP     JS 8/19/83
LOOPW2  TST.B   IFLAG(BASE)           SAME AS BEFORE         JS 8/19/83
	BNE.S   WDONE                                        JS 8/19/83
	SUBQ.L  #1,TCOUNT                                    JS 8/19/83
	BGE     LOOPW2                                       JS 8/19/83
* FAILED TO DO IT IN 2 SECONDS
	BRA     TESCAPE
WDONE   MOVE.B  #$80,CTRL(PORT)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	MOVE.B  #UNT,(FIFO)
	BRA     IDLE
LOOPT   MOVE.B  #1,-(SP)       SETUP TIMER ROUTINE RECORD    JS 8/19/83
	MOVE.L  #2000,-(SP)    FOR 2 SEC TIMEOUT             JS 8/19/83
LOOPT2  TST.B   IFLAG(BASE)    SEE IF DONE                   JS 8/19/83
	BNE.S   LOOPT3         EXIT LOOP IF SO               JS 8/19/83
	PEA     (SP)           PUSH PTR TO RECORD            JS 8/19/83
	JSR     CHECK_TIMER    AND CHECK THE TIMER           JS 8/19/83
	BPL     LOOPT2         LOOP IF NOT TIMED OUT         JS 8/19/83
	ADDQ    #6,SP          TIMEOUT, BUT GET A TRY        JS 5/2/84
	MOVEQ   #10,TCOUNT     ENTER NORMAL TIMEOUT LOOP     JS 5/2/84
	BRA     LOOPW2         WITH A SHORT COUNT            JS 5/2/84
LOOPT3  ADDQ    #6,SP          DONE, CLEANUP STACK           JS 8/19/83
	BRA     WDONE                                        JS 8/19/83
*
*
*  ADDRESS RECORD ROUTINE
*
ADDREC  MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)    ADDRESS RECORD SECONDARY
	BSR     PNWAIT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$0C,(FIFO)     OP CODE
	MOVE.B  UNIT+1(BASE),(FIFO)
	MOVE.B  CYLINDR2(BASE),(FIFO)   CYLAD HIGH BYTE
	MOVE.B  CYLINDR2+1(BASE),(FIFO)   CYLAD LOW BYTE
	MOVE.B  HEAD+1(BASE),(FIFO)
	BSR     IDLE          EMPTY FIFO
	MOVE.B  #EOI,(STATP)
	MOVE.B  #SECTOR,(FIFO)
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BRA     PWAIT     WAIT FOR COMPLETION
*
*
*  EMPTY INBOUND FIFO
*
INEMP   MOVE.B  DZERO,(STATP)
	MOVE.B  #$04,IMSK(PORT)
EMPTY   TST.B   INTR(PORT)              CHECK FOR BYTE AVAILABLE
	BEQ     EMPTY1                 IF SO, READ, IF NOT RETURN.
	TST.B   (FIFO)                 (DUMMY READ OF FIFO TO EMPTY IT)
	BRA     EMPTY
EMPTY1  RTS
*
*
*  SET FILE MASK ROUTINE
*     OUTPUT BYTE =XXXXDSCA
*     D=DECREMENTAL SEEK (1) OR INCREMENTAL SEEK(0)
*     S=1 ALLOWS AUTOMATIC SEEK TO SPARE TRACK
*     C=1 ENABLES CYLINDER MODE, C=0 SURFACE MODE
*     A=1 ENABLES AUTOMATIC SEEK AND END OF CYLINDER (SEE D)
*
*
SFM     MOVE.B  #ICMND,(STATP)
	MOVE.B  #PTA,(FIFO)
	MOVE.B  DLA(BASE),(FIFO)
	MOVE.B  #DSAD,(FIFO)
	BSR     PNWAIT
	MOVE.B  DZERO,(STATP)
	MOVE.B  #$0F,(FIFO)
	MOVE.B  #EOI,(STATP)
	MOVE.B  #1,(FIFO)
*   DISABLE AUTO SEEK TO SPARE,EN SURFACE, AUTO
*     SEEK TO NEXT CYLINDER
	MOVE.B  #ICMND,(STATP)
	MOVE.B  #UNL,(FIFO)
	BSR IDLE
	BRA PWAIT
*
*
*  INTERRUPT SERVICE ROUTINE
*
*
*  SERVICE EOP INTERRUPT
*
ISV     MOVEA.L (SP)+,ATEMP             RETURN ADDRESS
	MOVEA.L (SP)+,BASE              STATIC LINK
	MOVE.L  ATEMP,(SP)              (POP PARAMETER & PUSH) RETURN ADDRESS
	MOVEA.L PHIPORT(BASE),PORT
	LEA     FIFOFFSET(PORT),FIFO
	LEA     STATPOFFS(PORT),STATP
	CLR.L   DZERO

	MOVE.B  DZERO,CRDCTRL(PORT)     DISABLE INTERRUPTS,DMA
	TST.B   CTRL(PORT)              DUMMY READ TO CLEAR INTERRUPT
	BSR     PWAIT
	MOVE.B  #$01,IFLAG(BASE)
	RTS

*
*
*  IWAIT ROUTINE
*
IWAIT   MOVE.W   #600,TCOUNT       DO 1 MS AT 16 MHZ FAST LOOP    JS 8/19/83
IIWAIT  MOVE.B  INTR(PORT),DTEMP
	DBNE    TCOUNT,IIWAIT           TRY AGAIN
	BNE.S   IWDONE            IF DONE THEN GET OUT OF HERE    JS 8/19/83
	BTST    #TIMER_PRESENT,SYSFLAG2   SEE IF WE HAVE TIMER    JS 8/19/83
	BEQ.S   IWTIMER            USE IT IF WE DO                JS 8/19/83
	MOVE.L  #36000,TCOUNT      ELSE USE 200 MS LOOP           JS 8/19/83
IIWAIT2 MOVE.B  INTR(PORT),DTEMP   CHECK FOR DONE                 JS 8/19/83
	BNE.S   IWDONE                                            JS 8/19/83
	SUBQ.L  #1,TCOUNT          THIS IS FIX FOR PREV BUG       JS 8/19/83
	BGT     IIWAIT2            CAN'T USE DBcc -- >32K COUNT   JS 8/19/83
	BRA.S   TESCAPE            TIMED OUT                      JS 8/19/83

IWDONE  CMP.B   #04,DTEMP
	BEQ     BYTE                    CHECK INTERRUPT TYPE
	CMP.B   #$20,DTEMP
	BEQ     PPW
	BRA     OUT
*
IWTIMER MOVE.B  #1,-(SP)          SETUP TIMER RECORD             JS 8/19/83
	MOVE.L  #200,-(SP)        FOR 200 MS TIMEOUT             JS 8/19/83
IWTLOOP MOVE.B  INTR(PORT),DTEMP  CHECK FOR DONE                 JS 8/19/83
	BNE.S   IWTEXIT           IF SO THEN GET OUT OF LOOP     JS 8/19/83
	PEA     (SP)              ELSE PUSH PTR TO TIME REC      JS 8/19/83
	JSR     CHECK_TIMER       AND CHECK THE TIMER            JS 8/19/83
	BPL     IWTLOOP           LOOP IF NOT TIMED OUT          JS 8/19/83
	ADDQ    #6,SP             TIMED OUT, TAKE ANOTHER TRY    JS 5/2/84
	MOVEQ   #10,TCOUNT        USE A SHORT COUNTER            JS 5/2/84
	BRA     IIWAIT2           AND ENTER OTHER LOOP           JS 5/2/84
IWTEXIT ADDQ    #6,SP             CLEANUP STACK WHEN DONE        JS 8/19/83
	BRA     IWDONE            AND DO FINISH PROCESSING       JS 8/19/83


*  SERVICE FIFO BYTE AVAILABLE INTERRUPT
*
BYTE    MOVE.B  (FIFO),(BYTEPTR)+       STORE INPUT DATA
	SUBQ.B  #1,BCOUNT                   DECREMENT INPUT COUNT
	BEQ     OUT
TEST    CMPI.B  #4,INTR(PORT)           ANOTHER BYTE?
	BNE     TEST
	BRA     BYTE
OUT     MOVE.B  DZERO,(STATP)           DISABLE INTERRUPTS
	MOVE.B  DZERO,IMSK(PORT)
*
*
*  SERVICE PPOLL INTERRUPT
*
PPW     RTS

TESCAPE BSR     HDWRCLEAR         INVOKE IFC, CLEAR DMA, ETC.
	MOVE.W  #-10,SYSGLOBALS-2(GLOBAL)         ESCAPE(-10)
	MOVEA.L SYSGLOBALS-10(GLOBAL),SP
	RTS
*
*
* HARDWARE CLEAR
*
HDWRCLEAR EQU *
	TST.W   DMSTAT                  READ DMA CARD CONTROL REG TO DISARM IT
	MOVE.B  DZERO,ID(PORT)             SOFTWARE RESET
	MOVE.B  #$80,HPIBADR(PORT)      ON-LINE
	BSR     IFCLEAR                 ASSERT IFC
* DISK CLEAR FOR HANGUPS
	MOVE.B  #ICMND,STATPOFFS(PORT)
	MOVE.B  #$14,FIFOFFSET(PORT)    DEVICE CLEAR
	RTS
*
*
* INTERFACE CLEAR
*
IFCLEAR MOVE.B  #$11,CTRL(PORT)         IFC, INIT OUTBOUND FIFO
DEL100  MOVE.L  #100,-(SP)             100 MICROSECOND DELAY JS 8/19/83
	JSR     DELAY_TIMER                                  JS 8/19/83
	MOVE.B  #$80,CTRL(PORT)         8-BIT PROCESSOR
	RTS
*
*
*
	  END


@


53.1
log
@Automatic bump of revision number for PWS version 3.24B
@
text
@@


52.1
log
@Automatic bump of revision number for PWS version 3.24A
@
text
@@


51.1
log
@Automatic bump of revision number for PWS version 3.24d
@
text
@@


50.1
log
@Automatic bump of revision number for PWS version 3.23c
@
text
@@


49.1
log
@Automatic bump of revision number for PWS version 3.24b
@
text
@@


48.1
log
@Automatic bump of revision number for PWS version 3.24a
@
text
@@


47.1
log
@Automatic bump of revision number for PWS version 3.23
@
text
@@


46.1
log
@Automatic bump of revision number for PWS version 3.23
@
text
@@


45.1
log
@Automatic bump of revision number for PWS version 3.23C
@
text
@@


44.1
log
@Automatic bump of revision number for PWS version 3.23B
@
text
@@


43.1
log
@Automatic bump of revision number for PWS version 3.23aA
@
text
@@


42.1
log
@Automatic bump of revision number for PWS version 3.23e
@
text
@@


41.1
log
@Automatic bump of revision number for PWS version 3.23d
@
text
@@


40.1
log
@Automatic bump of revision number for PWS version 3.23c
@
text
@@


39.1
log
@Automatic bump of revision number for PWS version 3.23b
@
text
@@


38.1
log
@Automatic bump of revision number for PWS version 3.23a
@
text
@@


37.1
log
@Automatic bump of revision number for PWS version 3.3a
@
text
@@


36.1
log
@Automatic bump of revision number for PWS version 3.22
@
text
@@


35.1
log
@Automatic bump of revision number for PWS version 3.22
@
text
@@


34.1
log
@Automatic bump of revision number for PWS version 3.22
@
text
@@


33.1
log
@Automatic bump of revision number for PWS version 3.22D
@
text
@@


32.1
log
@Automatic bump of revision number for PWS version 3.22C
@
text
@@


31.1
log
@Automatic bump of revision number for PWS version 3.22B
@
text
@@


30.1
log
@Automatic bump of revision number for PWS version 3.22A
@
text
@@


29.1
log
@Automatic bump of revision number for PWS version 3.22b
@
text
@@


28.1
log
@Automatic bump of revision number for PWS version 3.3b
@
text
@@


27.1
log
@Automatic bump of revision number for PWS version 3.3a
@
text
@@


26.1
log
@Automatic bump of revision number for PWS version 3.3 Synch
@
text
@@


25.1
log
@Automatic bump of revision number for PWS version 3.2Y
@
text
@@


24.1
log
@Automatic bump of revision number for PWS version 3.2
@
text
@@


23.1
log
@Automatic bump of revision number for PWS version 3.2P
@
text
@@


22.1
log
@Automatic bump of revision number for PWS version 3.2N
@
text
@@


21.1
log
@Automatic bump of revision number for PWS version 3.2M
@
text
@@


20.1
log
@Automatic bump of revision number for PWS version 3.2L
@
text
@@


19.1
log
@Automatic bump of revision number for PWS version 3.2K
@
text
@@


18.1
log
@Automatic bump of revision number for PWS version 3.2J
@
text
@@


17.1
log
@Automatic bump of revision number for PWS version 3.2I+
@
text
@@


16.1
log
@Automatic bump of revision number for PWS version 3.2I
@
text
@@


15.1
log
@Automatic bump of revision number for PWS version 3.2H
@
text
@@


14.1
log
@Automatic bump of revision number for PWS version 3.2G
@
text
@@


13.1
log
@Automatic bump of revision number for PWS version 3.2F
@
text
@@


12.1
log
@Automatic bump of revision number for PWS version 3.2E
@
text
@@


11.1
log
@Automatic bump of revision number for PWS version 3.2D
@
text
@@


10.1
log
@Automatic bump of revision number for PWS version 3.2C
@
text
@@


9.1
log
@Automatic bump of revision number for PWS version 3.2B
@
text
@@


8.1
log
@Automatic bump of revision number for PWS version 3.2A
@
text
@@


7.1
log
@Automatic bump of revision number for PWS version 3.2l
@
text
@@


6.1
log
@Automatic bump of revision number for PWS version 3.2k
@
text
@@


5.1
log
@Automatic bump of revision number for PWS version 3.2j
@
text
@@


4.1
log
@Automatic bump of revision number for PWS version 3.2i
@
text
@@


3.1
log
@Auto bump revision for PAWS 3.2h
@
text
@@


2.1
log
@Auto bump rev number to 2.1 for sys 3.2e.
@
text
@@


1.1
log
@Initial revision
@
text
@@
