view 3rdparty/drivers/emudsk/emudsk.asm @ 2406:54182c17afa1

Added BBS and subfolders
author boisy
date Sun, 24 Jan 2010 18:44:57 +0000
parents 28ca7d4dd2c8
children 4c3c19ec3257
line wrap: on
line source

********************************************************************
* Emudsk - Virtual disk driver for CoCo emulators
*
* $Id$
*
* Ed.    Comments                                       Who YY/MM/DD
* ------------------------------------------------------------------
*  01    Modified to compile under OS9Source            tjl 02/08/28

* EmuDisk floppy disk controller driver
* Edition #1
* 04/18/96 : Written from scratch by Alan DeKok
*                                 aland@sandelman.ocunix.on.ca
*
*  This program is Copyright (C) 1996 by Alan DeKok,
*                  All Rights Reserved.
*  License is given to individuals for personal use only.
*
*
*  Comments: Ensure that device descriptors mark it as a hard drive
*
*
*   $FF80-$FF82: logical record number
LSN      equ  $FF80           where to put the logical sector number

*
*   $FF83: command/status register.
*          Output: 0=read, 1=write, 2=close.  
*          Input: 0=no error, non-zero=error codes (see below).
command  equ  $FF83           where to put the commands

*
*   $FF84-$FF85: 6809's 16-bit buffer address (cannot cross an 8K boundary due
*          to interference from the MMU emulation).
buffer   equ  $FF84           pointer to the buffer

*
* Returns:
*
* 0=successful
* 2=not enabled
* 4=too many MS-DOS files open,
* 5=access denied (virtual HD file locked by another program
*      or MS-DOS read-only status)
* 6/12=internal error
* 254=invalid command byte
* 255=power-on state or closed.
*
*  The "close" command just flushes all the read/write buffers and
* restores the metacontroller to its power-up state.  The hard drive must be
* enabled by the user using the MS-DOS command "ECHO >COCO3.VHD" (another
* crash safeguard), so error code 2 indicates this has not been done.
  

         nam   EmuDsk
         ttl   os9 device driver    

         ifp1
         use   os9defs
         use   rbfdefs
         endc

tylg     set   Drivr+Objct   
atrv     set   ReEnt+rev
rev      set   $01

         mod   eom,name,tylg,atrv,start,size
         fcb   $ff

         org   0
u0000    rmb   $FF            Normal RBF device mem for 4 drives
size     equ   .

         fcb   $FF            This byte is the driver permissions
name     fcs   /EmuDsk/
         fcb   1              edition #1


* Entry: Y=Ptr to device descriptor
*        U=Ptr to device mem
*
* Default to only one drive supported, there's really no need for more.
INIT     lda   #$FF          'Invalid' value & # of drives
         leax  DRVBEG,u       Point to start of drive tables
         sta   ,x             DD.TOT MSB to bogus value
         sta   <V.TRAK,x      Init current track # to bogus value

* for now, TERM routine goes here.  Perhaps it should be pointing to the
* park routine? ... probably not.
TERM
GETSTA   clrb                 no GetStt calls - return, no error, ignore
L0086    rts   

start    lbra   INIT           3 bytes per entry to keep RBF happy
         lbra   READ
         lbra   WRITE
         lbra   GETSTA
         lbra   SETSTA
         lbra   TERM

* Entry: B:X = LSN
*        Y   = path dsc. ptr
*        U   = Device mem ptr
READ     clra                 READ the sector
         bsr   GetSect        Go read the sector, exiting if there's an error
         tstb
         bne   GETSTA         if not sector 0, return
         leax  ,x             sets CC.Z bit
         bne   GETSTA         if not sector zero, return

* LSN0, standard OS-9 format
* Actually, this isn't really necessary for a HD, as the information in
* LSN0 never changes after it's read in once.  But we'll do it anyhow
         ldx   PD.BUF,y       Get ptr to sector buffer
         leau  DRVBEG,u       point to the beginning of the drive tables
         ldb   #DD.SIZ        copy bytes over
copy.0   lda   ,x+            grab from LSN0
         sta   ,u+            save into device static storage 
         decb
         bne   copy.0
         clrb
         rts   

WRITE    lda   #$01           WRITE to emulator disk, and fall thru to GetSect

* Get Sector comes here with:
* Entry: A = read/write command code (0/1)
*        B,X = LSN to read/write
*        Y   = path dsc. ptr
*        U   = Device static storage ptr
* Exit:  A   = error status from command register
GetSect  tst   <PD.DRV,y      get drive number requested
         bne   DrivErr        only one drive allowed, return error

         pshs  x,b            save LSN for later
         stb   >LSN
         stx   >LSN+1

         ldx   PD.BUF,y       where the 256-byte LSN should go
* Note: OS-9 allocates buffers from system memory on page boundaries, so
* the low byte of X should now be $00, ensuring that the sector is not
* falling over an 8K MMU block boundary.

         stx   >buffer        set up the buffer address
         sta   >command       get the emulator to blast over the sector
         lda   >command       restore the error status
         bne   FixErr         if non-zero, go fix the error and exit
         puls  b,x,pc         restore LSN and exit

DrivErr  leas  2,s            kill address of calling routine (Read/Write)
         comb
* FIND ERROR CODE TO USE
*        ldb   #E$            find appropriate error code...
         ldb   #E$NotRdy      not ready
         rts

* Emulator error codes translated to OS-9 error codes.
*
* 2=not enabled
*      E$NotRDy - drive is not ready
*
* 4=too many MS-DOS files open,
*      E$
*
* 5=access denied (virtual HD file locked by another program
*      or MS-DOS read-only status)
*      E$WP  - write protect
*
* 6/12=internal error
*      E$CRC - CRC error
*
* 254=invalid command byte
*      E$
*
* 255=power-on state or closed.
*      E$NotRdy - drive is not ready
*
FixErr   leas  5,s         kill B,X,PC from GetSect routine
         cmpa  #02
         beq   NotRdy
         cmpa  #255
         beq   NotRdy
         cmpa  #5
         beq   WP
         cmpa  #6
         beq   CRC
         cmpa  #12
         beq   CRC

* if it's something we don't recognize, it's a seek error
         comb
         ldb   #E$Seek        seek error
         rts   

NotRdy   comb  
         ldb   #E$NotRdy      not ready
         rts   

WP       comb  
         ldb   #E$WP          write protect
         rts   

CRC      comb  
         ldb   #E$CRC         CRC error
         rts   

L03D4    comb  
         ldb   #E$Write       write error
         rts   


L03E0    comb  
         ldb   #E$Read        Read error
         rts   

SETSTA   ldx   PD.RGS,y       Get caller's register stack ptr
         ldb   R$B,x          Get function code
         cmpb  #SS.WTrk       Write track?
         beq   format         Yes, ignore it
         cmpb  #SS.Reset      Restore head to track 0?
         beq   format         Yes, ignore it
         cmpb  #SS.SQD        sequence down the drive (i.e. park it)?
         beq   park
         comb                 set carry for error
         ldb   #E$UnkSvc      return illegal service request error
         rts   

park     ldb   #$02           close the drive
         stb   >command       save in command register

format   clrb                 ignore physical formats.  They're not
         rts                  necessary

         emod

eom      equ   *