00001 *************************
00002 *
00003 * DISKOP.ASM
00004 * MDJ 09-27-90
00005 *
00006 * DISK OPERATIONS PACKAGE
00007 *
00008 *************************
00009 *
00010 * REQUIRES: OUTPUT
00011 *
00012 * REF. PAGES B-59 TO B-62
00013 * DISK BASIC UNRAVELLED
00014 *
00015 *************************
00016 *
00017 DNMIVC  EQU     $0983   NMI OUT VECTOR
00018 NMIVEC  EQU     $0109   NMI VECTOR
00019 IRQVEC  EQU     $010C   IRQ     VECTOR
00020 FRQVEC  EQU     $010F   FIRQ VECTOR
00021 DRGRAM  EQU     $0986   RAM IMAGE OF DSKREG ($FF40)
00022 DSKREG  EQU     $FF40   DISK CONTROL REGISTER (PIA2)
00023 NMIFLG  EQU     $0982   NMI FLAG (<>0 = VECTOR OUT)
00024 PIA0    EQU     $FF00   PERIPHERAL INTERFACE ADAPTER ZERO
00025 PLYTMR  EQU     $E3     BASIC "PLAY" COMMAND TIMER
00026 RDYTMR  EQU     $0985   MOTOR TURN-OFF TIMER
00027 TIMVAL  EQU     $0112   TIMER VALUE
00028 SNDDUR  EQU     $8D     DURATION VALUE, "SOUND" COMMAND
00029 VD5     EQU     $D5     SCRATCH PAD VARIABLE
00030 ZERO    EQU     $8A     THESE TWO BYTES ARE ALWAYS ZERO
00031 DCOPC   EQU     $EA     DISK OPERATION CODE
00032 DCSTA   EQU     $F0     DISK STATUS BYTE
00033 TYPER   EQU     $4639   MESSAGE OUTPUT ROUTINE
00034 ALLRAM  EQU     $FFDF   ALL RAM MODE
00035 RAMROM  EQU     $FFDE   RAM/ROM MODE
00036 XDSKON  EQU     $C004   ROM DSKCON JUMP ADDRESS
00037 CRLFS   EQU     $4694   CARRIAGE RETURN/LINE FEED/SCROLL
00038         ORG     $46A7
00039 *
00040 *************************
00041 *
00042 * DSKCON EXECUTES THE
00043 * COCO ROM DSKCON 
00044 * ROUTINE
00045 *
00046 *************************
00047 *
00048 DSKCON  PSHS    A,B,X,Y,U,DP,CC
00049         STA     RAMROM  SET RAM/ROM MODE
00050         JSR     [XDSKON] GO TO ROM DSKCON
00051         STA     ALLRAM  SET ALLRAM MODE
00052         PULS    A,B,X,Y,U,DP,CC
00053         RTS
00054 *
00055 *************************
00056 *
00057 * DNMISV IS THE NMI
00058 * INTERRUPT SERVICE
 
 
 
 
 
 
 
 
00059 * ROUTINE
00060 *
00061 *************************
00062 *
00063 DNMISV  LDA     NMIFLG  GET THE NMI FLAG
00064         BEQ     LD7BB   RETURN IF NOT ACTIVE
00065         LDX     DNMIVC  GET THE NEW RETURN VECTOR
00066         STX     10,S    STORE AT STACKED PC ON S-STACK
00067         CLR     NMIFLG  RESET NMI FLAG
00068 LD7BB   RTI             RETURN FROM INTERRUPT
00069 *
00070 *************************
00071 *
00072 * DIRQSV IS THE IRQ
00073 * INTERRUPT SERVICE
00074 * ROUTINE
00075 *
00076 *************************
00077 *
00078 DIRQSV  LDA     PIA0+3  63.5 MS OR 60 HZ INTERRUPT?
00079         BPL     LD7BB   RETURN IF 63.5 MS INTERRUPT
00080         LDA     PIA0+2  RESET 60 HZ PIA INTERRUPT FLAG
00081         LDA     RDYTMR  GET TIMER
00082         BEQ     LD7DA   BRANCH IF NOT ACTIVE
00083         DECA    DECREMENT THE TIMER
00084         STA     RDYTMR  SAVE IT
00085         BNE     LD7DA   BRANCH IF NOT TIME TO TURN OFF
00086 *                         DISK MOTORS
00087         LDA     DRGRAM  GET DSKREG IMAGE
00088         ANDA    #$B0    TURN MOTORS & DRIVE SELECTS OFF
00089         STA     DRGRAM  PUT IT BACK IN RAM IMAGE
00090         STA     DSKREG  SEND TO CONTROL REGISTERS
00091 LD7DA   LDX     TIMVAL  GET REAL TIME CLOCK
00092 *                         (CF. PAGE B22, ECB UNRAVELLED)
00093         LEAX    1,X     INCREMENT IT
00094         STX     TIMVAL  SAVE IT
00095         CLRA            (CF. PAGES B73 & B74, ECB UNRAV.)
00096         TFR     A,DP    SET THE DIRECT PAGE TO ZERO
00097         LDD     PLYTMR  GET THE "PLAY" TIMER
00098         BEQ     LA9BB   GO IF ZERO
00099         SUBD    VD5     SUBTRACT INTERVAL
00100         STD     PLYTMR  SAVE NEW TIMER VALUE
00101         BHI     L9C5A   GO IF NOT DONE
00102         CLR     PLYTMR  RESET MSB IF DONE
00103         CLR     PLYTMR+1 RESET LSB
00104         PULS    A       GET THE CONDITION CODE REGISTER
00105         LDS     7,S     LOAD S-STACK POINTER WITH THE 
00106 *                         CONTENTS OF THE U REGISTER
00107         ANDA    #$7F    CLEAR E FLAG
00108         PSHS    A       SAVE THE CONDITION CODE
00109 L9C5A   RTI             RETURN FROM INTERRUPT
00110 LA9BB   LDX     >SNDDUR (CF. PAGES A36 & A37, COLOR BASIC
00111 *                         UNRAVELLED
00112         BEQ     LA9C5   RETURN IF TIMER = 0
00113         LEAX    -1,X    DECREMENT TIMER
00114 LA9C2   STX     >SNDDUR SAVE NEW TIMER VALUE
00115 LA9C5   RTI     RETURN FROM INTERRUPT
00116 LZ7D1   LDX     ZERO    TIME DELAY ROUTINE
 
 
 
 
 
 
 
 
00117 LZ7D3   LEAX    -1,X
00118         BNE     LZ7D3
00119         RTS
00120 *
00121 *************************
00122 *
00123 * INTSET SETS-UP THE
00124 * SYSTEM INTERRUPT
00125 * SERVICE CALL ROUTINES
00126 *
00127 *************************
00128 *
00129 INTSET  PSHS    X
00130         ORCC    #$50    DISABLE INTERRUPTS
00131         LDX     #DNMISV SET NMI VECTOR
00132         STX     NMIVEC+1
00133         LDX     #DIRQSV SET IRQ VECTOR
00134         STX     IRQVEC+1
00135         LDX     #FIRQSV SET FIRQ VECTOR
00136         STX     FRQVEC+1
00137         ANDCC   #$AF    ENABLE INTERRUPTS
00138         PULS    X
00139         RTS
00140 FIRQSV  RTI             DUMMIED FIRQ SERVICE
00141 *
00142 *************************
00143 *
00144 * DSKSTP STOPS THE DISK
00145 * DRIVE MOTORS
00146 *
00147 *************************
00148 *
00149 DSKSTP  PSHS    A
00150         CLRA
00151         STA     DSKREG
00152         PULS    A
00153         RTS
00154 *
00155 *************************
00156 *
00157 * DSKOPN PERFORMS A DISK 
00158 * OPERATION (DKREAD
00159 * READS A SECTOR, DKWRIT
00160 * WRITES A SECTOR)
00161 *
00162 * REFER TO PAGE 126 OF
00163 * THE COCO DISK SYSTEM
00164 * MANUAL FOR ENTRY AND
00165 * EXIT CONDITIONS
00166 *
00167 *************************
00168 *
00169 DSKOPN  PSHS    A,B,X,Y
00170         LDB     #5      SET THE # OF RETRIES LIMIT
00171         PULU    A       GET THE OPERATION CODE
00172         STA     DCOPC   STORE IT
00173 DSKOP1  JSR     DSKCON  GO DO DISK OPERATION
00174         LDA     DCSTA   LOAD STATUS BYTE
 
 
 
 
 
 
 
 
00175         BEQ     DSKOP2  GO IF NO DISK ERROR
00176         DECB            DECREMENT RETRY COUNTER
00177         BNE     DSKOP1  GO RETRY UNTIL LIMIT
00178         LDX     EML     GET ERROR MESSAGE LENGTH
00179         LDY     #EM     GET ERROR MESSAGE START LOCATION
00180         JSR     TYPER   GO OUTPUT ERROR MESSAGE
00181         JSR     CRLFS
00182 DSKOP2  JSR     DSKSTP  GO STOP DISK MOTORS
00183         PULS    A,B,X,Y
00184         RTS
00185 EML     FCB     20
00186 EM      FCC     '** DISK I/O ERROR **'
00187 DKREAD  PSHS    A
00188         LDA     #2      "READ" OPERATION CODE
00189         PSHU    A       PUSH TO STACK
00190         JSR     DSKOPN  GO READ SECTOR
00191         PULS    A
00192         RTS
00193 DKWRIT  PSHS    A
00194         LDA     #3      "WRITE" OPERATION CODE
00195         PSHU    A       PUSH TO STACK
00196         JSR     DSKOPN  GO WRITE SECTOR
00197         PULS    A
00198 ZEND    RTS
00199         END
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
