changeset 928:82f525c3a789

Disassembly by David Breeding
author boisy
date Mon, 20 Jan 2003 04:02:57 +0000
parents 207aaa792076
children c04528763543
files 3rdparty/drivers/disto/cc3disk_disto.asm
diffstat 1 files changed, 692 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/3rdparty/drivers/disto/cc3disk_disto.asm	Mon Jan 20 04:02:57 2003 +0000
@@ -0,0 +1,692 @@
+* Disassembly by Dynamite+ of cc3disk
+*
+
+* ======================================================
+*                  Layout of SC-II registers:
+*
+* $FF74   RW.Dat  --- R/W Buffer data #1
+* $FF75       mirror of $FF74
+* $FF76   RW.Ctrl --- Write  D0 = 0  FDC Write Op #2
+*                               = 1  FDC Read Op  #2
+*                            D1 = 0  Normal Mode
+*                               = 1  Buffered I/O Mode
+*                            D2 = 0  Normal NMI
+*                               = 1  Masked NMI
+*                            D3 = 0  No FIRQ (Masked)
+*                               = 1  Enabled FIRQ
+*                     Read   D7 = FDC INT Status (Inverted)
+* $FF77       mirror of $FF76
+*        #1: any write to $FF76-$FF77 clears Buffer counter
+*        #2: in buffered mode only
+* =========================================================
+
+         nam   CC3Disk.irq
+         ttl   Disto version: patched to remove F$IRQ on TERM
+
+Level    equ   2         
+
+         ifp1            
+         use   defsfile  
+         use   rbfdefs   
+         endc            
+
+TyLan    equ   Drivr+Objct
+AttRev   equ   ReEnt+3   
+Edition  set   163       
+ForcInt  equ   $d0       
+WrtSct   equ   $a0       
+
+         mod   dlen,dnam,TyLan,AttRev,dexec,datsiz
+
+RG.Ctrl  equ   $ff40     
+RG.Stat  equ   $ff48     
+RG.Trk   equ   $ff49     
+RG.Sect  equ   $ff4a     
+RG.Data  equ   $ff4b     
+*   I *THINK* Disto manual was backwards
+*      This looks better in code
+RW.Dat   equ   $ff74     
+RW.Ctrl  equ   $ff76     
+MPICtrl  equ   $ff7f     
+*IRQENR equ $ff92
+
+* OS-9 data area definitions
+
+         org   DRVBEG+4*DRVMEM
+tl       equ   .         
+LstDrv   rmb   1         
+DrivMsk  rmb   1         
+ChgFlg   rmb   1         
+d00aa    rmb   1         
+d00ab    rmb   1         
+DskOfst  rmb   3         
+DisCode  rmb   2         
+VIRQPak  rmb   5         
+         rmb   1         
+Lsn      rmb   3         
+WtrkBuf  rmb   2         
+MPISlot  rmb   1         
+MPISav   rmb   1         
+datsiz   equ   .         
+
+         fcb   $ff       
+dnam     fcs   "CC3Disk" 
+         fcb   Edition   
+
+dexec    lbra  INIT      
+         lbra  READ      
+         lbra  WRITE     
+         lbra  GETSTA    
+         lbra  PUTSTA    
+
+TERM     ldx   #0        
+         leau  LstDrv,u  
+         leay  VIRQPak-tl,u
+         os9   F$VIRQ    
+         leay  IRQSvc,pcr
+         os9   F$IRQ     
+         leay  SC2vec,pcr
+         os9   F$IRQ     
+         clrb            
+         stb   RG.Ctrl   
+         stb   D.MotOn   
+         rts             
+
+* F$IRQ arrays: Flip byte, Mask byte, priority
+videfs   fcb   0,Vi.IFlag,9
+SC2stts  fcb   $80,$80,16
+
+********************
+* INIT:  entry:  U= Static Mem,  Y= Device Descr
+
+INIT     clr   RW.Ctrl   
+         clr   D.MotOn   
+         ldx   #RG.Stat  
+         lda   #ForcInt  
+         sta   ,x         Send cmd to FDC
+         lbsr  tdelay     Wait
+         lda   ,x         Clear FDC register
+         lda   #$ff       Init "last drive accessed"
+         sta   LstDrv,u   to impossible #
+         ldb   #4        
+         leax  DRVBEG,u  
+l0067    sta   ,x        
+         sta   DD.BT,x   
+         leax  DRVMEM,x  
+         decb            
+         bne   l0067     
+         leax  NMIvec,pcr
+         stx   D.NMI     
+         pshs  u         
+         leau  LstDrv,u  
+         leay  VIRQPak+VI.Stat-tl,u
+         tfr   y,d       
+         leay  IRQSvc,pcr
+         leax  >videfs,pcr
+         os9   F$IRQ     
+         puls  u         
+         bcs   ret010    
+         lda   MPICtrl   
+         sta   MPISlot,u 
+         ldd   #RW.Ctrl  
+         leay  SC2vec,pcr
+         leax  >SC2stts,pcr
+         os9   F$IRQ     
+         bcs   ret010    
+         pshs  cc        
+         orcc  #IntMasks 
+         lda   $FF23     
+* disable FIRQ from cart. set flag on falling edge of CART
+         anda  #$fc      
+         sta   $FF23     
+         lda   $FF22     
+         lda   D.IRQER   
+         ora   #1         Enable CART IRQ
+         sta   D.IRQER    ..save in IRQENR shadow
+         sta   IRQENR     .. and actual register
+         puls  cc        
+
+***************
+* GetSta : no op
+
+GETSTA   clrb            
+ret010   rts             
+
+*******************
+* READ   entry:  U= device Mem  Y= Path Descr
+*                B,X= LSN
+
+READ     lbsr  trkcmput  
+         clr   d00aa-tl,u
+         ldd   Lsn-tl,u  
+         bne   l0118     
+         bsr   l0118     
+         bcs   ret010    
+         lda   PD.TYP,y  
+         bita  #$40      
+         lbne  t0set     
+         ldx   PD.BUF,y  
+         pshs  x,y       
+         ldy   PD.DTB,y  
+         ldb   #$14      
+l00e5    lda   b,x       
+         sta   b,y       
+         decb            
+         bpl   l00e5     
+         lda   DD.FMT,y  
+         ldy   2,s       
+         ldb   PD.DNS,y  
+         bita  #2        
+         beq   l00fd     
+         bitb  #1        
+         beq   badtyp    
+l00fd    bita  #4        
+         beq   l0105     
+         bitb  #2        
+         beq   badtyp    
+l0105    bita  #1        
+         beq   ret025    
+         lda   PD.SID,y  
+         suba  #2        
+         bcs   badtyp    
+ret025   clrb            
+         puls  x,y,pc    
+badtyp   comb            
+         ldb   #E$BTyp   
+         puls  x,y,pc    
+l0118    lbsr  l02d6     
+         bcs   ret010    
+         ldb   #$80      
+         lda   #7        
+         bsr   l019c     
+         lbcs  E.Read    
+         ldx   PD.BUF,y  
+         ldb   #$80      
+         tst   d00aa-tl,u
+         bne   l013c     
+         pshs  b         
+*         Move data from SC2 buffer to RBF buffer
+getdat   ldd   RW.Dat    
+         std   ,x++      
+         dec   ,s        
+         bne   getdat    
+         puls  b         
+l013c    andcc  #^Carry   
+         rts             
+
+* ******************
+* WRITE    entry: U= Device static Mem   Y= Path Descr
+*                 B,X= LSN
+
+WRITE    lbsr  trkcmput  
+l0142    bsr   l0151     
+         bcs   ret040    
+         tst   PD.VFY,y  
+         bne   ret030    
+         bsr   verify    
+         bcs   l0142     
+ret030   clrb            
+ret040   rts             
+l0151    lbsr  l02d6     
+         bcs   ret040    
+         ldx   PD.BUF,y  
+         lda   #4        
+         sta   RW.Ctrl   
+         ldb   #$80      
+         pshs  b         
+putdat   ldd   ,x++      
+         std   RW.Dat    
+         dec   ,s        
+         bne   putdat    
+         puls  b         
+         ldb   #WrtSct   
+         lda   #6        
+         bsr   l019c     
+         lbra  l0243     
+
+verify   lda   d00ab-tl,u
+         pshs  a         
+         clr   d00ab-tl,u
+         lda   #$ff      
+         sta   d00aa-tl,u
+         bsr   l0118     
+         bcs   l0197     
+         pshs  b         
+l0185    ldd   RW.Dat    
+         cmpd  ,x++      
+         bne   l0193     
+         dec   ,s        
+         bne   l0185     
+         bra   l0195     
+l0193    orcc  #Carry    
+l0195    puls  b         
+l0197    puls  a         
+         sta   d00ab-tl,u
+         rts             
+l019c    std   DisCode-tl,u Save both ctrlr cmds
+l019e    ldd   DisCode-tl,u Load both ctrlr cmds
+         bsr   sendcmd   
+         lbsr  l0243     
+         bcc   ret01ba   
+         lda   RG.Stat   
+         bita  #$40      
+         bne   err01b9   
+         lsr   d00ab-tl,u
+         beq   err01b9   
+         bcc   l019e     
+         lbsr  ssrset    
+         bra   l019e     
+err01b9  coma            
+ret01ba  rts             
+
+* sendcmd:  entry: A=No-halt buffer cmd mask
+*                  B=WD ctrlr cmd code
+
+sendcmd  pshs  a         
+         lda   D.Proc    
+         sta   V.WAKE-tl,u
+         puls  a         
+         stb   RG.Stat   
+         ora   #8        
+         sta   RW.Ctrl   
+         ldb   #$28      
+         orb   DrivMsk-tl,u
+         stb   RG.Ctrl   
+         pshs  x         
+         bra   l01e8     
+l01d8    ldx   D.Proc    
+         lda   P$State,x 
+         ora   #Suspend  
+         sta   P$State,x 
+         andcc  #^IntMasks
+         ldx   #1        
+         lbsr  l0424     
+l01e8    orcc  #IntMasks 
+         lda   V.WAKE-tl,u
+         bne   l01d8     
+         clrb            
+         ldb   #4        
+         stb   RW.Ctrl   
+         andcc  #^IntMasks
+         puls  x,pc      
+SC2vec   lda   V.WAKE,u  
+         beq   err0236   
+         ldb   MPICtrl   
+         stb   MPISav,u  
+         ldb   MPISlot,u 
+         stb   MPICtrl   
+         ldb   #ForcInt  
+         stb   RG.Stat   
+         ldb   #4        
+         stb   RW.Ctrl   
+*       The Bruce Isted patch.  Not needed???
+         ldb   D.IRQS    
+         andb  #$fe      
+         stb   D.IRQS    
+         ldb   D.IRQER   
+         andb  #$fe      
+         stb   IRQENR    
+         orb   #1        
+         stb   IRQENR    
+*        End of Bruce Isted patch *
+         clrb            
+         stb   V.WAKE,u  
+         tfr   d,x        A=V.WAKE??? B=0
+         lda   P$State,x 
+         anda  #^Suspend 
+         sta   P$State,x 
+         clrb            
+         bra   ret0237   
+err0236  comb            
+ret0237  lda   MPISav,u  
+         sta   MPICtrl   
+         rts             
+
+NMIvec   leas  R$Size,s   Pull RTI stack
+         puls  cc,y      
+l0243    ldb   RG.Stat    Get error status
+         clr   RW.Ctrl   
+         andb  #$f8       mask off non-error bits
+         beq   done      
+         pshs  x         
+         leax  <errtbl-1,pcr
+l0252    leax  1,x       
+         rolb            
+         bcc   l0252     
+         ldb   ,x        
+         puls  x,pc      
+done     clrb            
+         rts             
+
+errtbl   fcb   E$NotRdy,E$WP,E$Write,E$Seek
+         fcb   E$CRC     
+E.Read   comb            
+         ldb   #E$Read   
+         rts             
+
+trkcmput leau  LstDrv,u  
+         clr   DskOfst+2-tl,u
+         lda   #$91      
+         sta   d00ab-tl,u
+         tstb             MMsb of sector
+         bne   E.Sect     always 0 for CoCo floppies
+         tfr   x,d       
+         std   Lsn-tl,u   Save lsn
+         beq   l02a4     
+         ldx   PD.DTB,y  
+         cmpd  DD.TOT+1,x Req'd lsn > max?
+         bcs   l0288      no, continue
+E.Sect   comb            
+         ldb   #E$Sect   
+         leas  2,s       
+         rts             
+
+l0288    clr   ,-s       
+         bra   l028e     
+l028c    inc   ,s        
+l028e    subd  DD.SPT,x  
+         bcc   l028c     
+         addd  DD.SPT,x  
+         lda   DD.FMT,x  
+         lsra            
+         bcc   l02a2     
+         lsr   ,s        
+         bcc   l02a2     
+         inc   DskOfst+2-tl,u
+l02a2    puls  a         
+l02a4    std   DskOfst-tl,u
+         clrb            
+         rts             
+setdrv   clr   ChgFlg-tl,u
+         lda   PD.DRV,y  
+         cmpa  #4        
+         bcs   l02b5     
+         comb            
+         ldb   #E$Unit   
+         rts             
+l02b5    pshs  a,b,x     
+         cmpa  LstDrv-tl,u
+         beq   l02bd     
+         com   ChgFlg-tl,u
+l02bd    sta   LstDrv-tl,u
+         leax  <drvmsks,pcr
+         ldb   a,x       
+         stb   DrivMsk-tl,u
+         lbsr  mtron     
+         puls  a,b,x,pc  
+
+drvmsks  fcb   $01,$02,$04,$40
+
+l02cf    pshs  a         
+         ldb   DD.BT,x   
+         bra   l030c     
+l02d6    bsr   setdrv    
+         bcs   l032f     
+         ldd   DskOfst-tl,u
+         pshs  a         
+         lda   DskOfst+2-tl,u
+         beq   l02e8     
+         lda   DrivMsk-tl,u
+         ora   #$40      
+         sta   DrivMsk-tl,u
+l02e8    lda   PD.TYP,y  
+         bita  #2        
+         bne   l02f0     
+         incb            
+l02f0    stb   RG.Sect   
+         ldx   PD.DTB,y  
+         ldb   DD.BT,x   
+         lda   DD.FMT,x  
+         lsra            
+         eora  PD.DNS,y  
+         anda  #2        
+         pshs  a         
+         lda   1,s       
+         tst   ,s+       
+         beq   l030c     
+         asla            
+         aslb            
+l030c    stb   RG.Trk    
+         tst   ChgFlg-tl,u
+         bne   seek      
+         ldb   ,s        
+         cmpb  DD.BT,x   
+         beq   l0326     
+seek     sta   RG.Data   
+         ldb   PD.STP,y  
+         andb  #3        
+         eorb  #$1b      
+         bsr   l0330     
+l0326    puls  a         
+         sta   DD.BT,x   
+         sta   RG.Trk    
+         clrb            
+l032f    rts             
+
+l0330    lda   #4        
+         lbsr  sendcmd   
+         lda   RG.Stat   
+         clr   RW.Ctrl   
+         rts             
+
+tdelay   clr   18,u      
+         inc   18,u      
+l0342    rol   18,u      
+         bpl   l0342     
+         rts             
+
+* Restore to LSN0
+ssrset   pshs  b,x       
+         lbsr  setdrv    
+         bcs   l0370     
+         ldx   PD.DTB,y  
+         clr   DD.BT,x   
+         lda   #4        
+stepIN   ldb   PD.STP,y  
+         andb  #3        
+         eorb  #$4b       Step In
+         pshs  a         
+         bsr   l0330     
+         puls  a         
+         deca            
+         bne   stepIN    
+         ldb   PD.STP,y  
+         andb  #3        
+         eorb  #$0b       Restore
+         bsr   l0330     
+l0370    puls  b,x,pc    
+
+*********************
+* PUTSTA   U= Device Static Mem  Y= Path Descr
+*          A= Status Call
+
+PUTSTA   leau  LstDrv,u  
+         ldx   PD.RGS,y  
+         ldb   R$B,x      SS.xx call
+         cmpb  #SS.WTrk  
+         beq   wtrak     
+         cmpb  #SS.Reset 
+         beq   ssrset    
+         comb            
+         ldb   #E$UnkSvc 
+         rts             
+
+* SS.WTRK call
+wtrak    pshs  y,u       
+* request buffer memory
+         ldd   #$1a00    
+         os9   F$SRqMem  
+         bcs   ret080    
+         ldx   2,s       
+         stu   WtrkBuf-tl,x
+         ldx   D.Proc    
+         lda   P$Task,x  
+         ldb   D.SysTsk  
+         ldy   ,s        
+         ldx   PD.RGS,y  
+         ldx   R$X,x     
+         ldy   #$1a00    
+         os9   F$Move    
+         bcs   l03d3     
+         puls  y,u       
+         pshs  y,u       
+         lbsr  setdrv    
+         bcs   l03d3     
+         ldx   PD.RGS,y  
+         ldb   R$Y+1,x   
+         bitb  #1        
+         beq   l03c4     
+         lda   DrivMsk-tl,u
+         ora   #$40      
+         sta   DrivMsk-tl,u
+         sta   DskOfst+2-tl,u
+l03c4    lda   R$U+1,x   
+         ldx   PD.DTB,y  
+         lbsr  l02cf     
+         bcs   l03d3     
+         ldx   WtrkBuf-tl,u
+         bsr   l03e4     
+l03d3    ldu   2,s        Original U (Static storage)
+         pshs  cc,b      
+         ldu   WtrkBuf-tl,u Return WTrk buffer
+         ldd   #$1a00     ... to sys
+         os9   F$SRtMem  
+         puls  cc,b      
+ret080   puls  y,u,pc    
+
+l03e4    pshs  cc,y      
+         orcc  #IntMasks 
+         ldb   #$f0      
+         stb   RG.Stat   
+         ldy   #$ffff    
+         ldb   #$28      
+         orb   DrivMsk-tl,u
+         stb   RG.Ctrl   
+         orb   #$a8      
+         lda   #2        
+         lbsr  tdelay    
+l03ff    bita  RG.Stat   
+         bne   sctwrt    
+         leay  -1,y      
+         bne   l03ff     
+         lda   DrivMsk-tl,u
+         ora   #8        
+         sta   RG.Ctrl   
+         lda   #ForcInt  
+         sta   RG.Stat   
+         puls  cc,y      
+         comb            
+         ldb   #E$Write  
+         rts             
+* NMI-type Block mode write
+sctwrt   lda   ,x+       
+         sta   RG.Data   
+         stb   RG.Ctrl   
+         bra   sctwrt     Loop till sector written
+
+* Pause and timeout routines
+l0424    pshs  a,b       
+         ldd   D.Proc    
+         cmpd  D.SysPrc  
+         puls  a,b       
+         beq   wait      
+         os9   F$Sleep   
+         rts             
+wait     ldx   #$a000    
+wait1    nop             
+         nop             
+         nop             
+         leax  -1,x      
+         bne   wait1     
+         rts             
+
+mtron    pshs  a,b,x,y   
+         ldd   #$00f0     Reset Drive timeout
+         std   VIRQPak-tl,u
+         lda   DrivMsk-tl,u
+         ora   #8         Motor-on
+         sta   RG.Ctrl   
+         ldx   #$0028    
+         lda   D.MotOn    Result of last motoron attempt
+         bmi   svirq      If error previously
+         beq   l0469     
+         tst   ChgFlg-tl,u Different drive from last?
+         beq   ret090     No, no need to wait
+         lda   PD.TYP,y  
+         bita  #$10       All motors not turned on?
+         beq   ret090     Yes, skip
+         bsr   l0424     
+         ldd   #$00f0    
+         std   VIRQPak-tl,u
+         bra   ret090    
+
+l0469    bsr   l0424     
+svirq    bsr   setVIRQ   
+ret090   clrb            
+         puls  a,b,x,y,pc
+setVIRQ  lda   #1        
+         sta   D.MotOn   
+         ldx   #1        
+         leay  VIRQPak-tl,u
+         clr   Vi.Stat,y 
+         ldd   #$00f0    
+         os9   F$VIRQ    
+         bcc   ret100    
+         lda   #$80      
+         sta   D.MotOn   
+ret100   clra            
+         rts             
+
+*      IRQ service routine.  CC3Disk comes here on NMI
+IRQSvc   pshs  a         
+         lda   V.WAKE-tl,u
+         beq   l049f     
+         ldb   #$0c      
+         stb   RW.Ctrl   
+         lda   #$d8      
+         sta   RG.Stat   
+         clr   d00ab-tl,u
+         bra   l04a3     
+
+l049f    lda   D.DMAReq  
+         beq   l04a7     
+l04a3    bsr   setVIRQ   
+         bra   ret110    
+
+l04a7    sta   RG.Ctrl   
+         clr   VIRQPak+Vi.Stat-tl,u
+         clr   D.MotOn   
+ret110   puls  a,pc      
+
+t0set    ldx   PD.DTB,y  
+         ldb   #$14      
+t0set1   clr   b,x       
+         decb            
+         bpl   t0set1    
+         ldb   PD.CYL+1,y
+         lda   PD.SID,y  
+         mul             
+         subd  #1        
+         lda   PD.SCT+1,y
+         sta   DD.TKS,x  
+         sta   DD.SPT+1,x
+         mul             
+         addd  PD.T0S,y  
+         std   DD.TOT+1,x
+         lda   #7        
+         sta   DD.ATT,x  
+         lda   PD.DNS,y  
+         asla            
+         pshs  a         
+         lda   PD.SID,y  
+         deca            
+         ora   ,s+       
+         sta   DD.FMT,x  
+         clrb            
+         rts             
+
+         emod            
+
+dlen     equ   *         
+
+         end