home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / turbodos / mdrv-td.lbr / DSKMDRV.MZC / DSKMDRV.MAC
Text File  |  1987-11-08  |  4KB  |  159 lines

  1. Title    TurboDOS driver for CompuPro Mdrive/H - 2 Megabyte version.
  2. ;Assemble with M80 or compatible assembler.
  3.  
  4. .Z80                ;Use Zilog mnemonics.
  5.  
  6. ; 10/07/87  Rev 0  Bob Clyne    Changed disk parameters and streamlined the
  7. ;                code. This is a wierd disk configuration but
  8. ;                the code is lean. There is no error checking
  9. ;                in order to make the driver as fast as possible
  10. ;                it just trusts that the M-Drive/H is OK.
  11.  
  12.     NAME    ('DSKDRM')    ;Module ID.
  13.  
  14. ; Disk packet declaration.
  15.  
  16. OPCODE    EQU    0
  17. DRIVE    EQU    1
  18. TRACK    EQU    2
  19. SECTOR    EQU    4
  20. SECCNT    EQU    6
  21. BYTCNT    EQU    8
  22. DMADR    EQU    10
  23. DSTADR    EQU    12
  24. BLKSIZ    EQU    14
  25. NMBLKS    EQU    15
  26. NMBDIR    EQU    17
  27. SECSIZ    EQU    18
  28. SECTRK    EQU    19
  29. TRKDSK    EQU    21
  30. RESTRK    EQU    23
  31.  
  32. ; M-drive ports. Set for whatever ports you are using.
  33.  
  34. HBASE    EQU    040H        ;Base port as set on M-Drive/H DIP switches.
  35. HDATA    EQU    HBASE        ;M-drive data port.
  36. HADDR    EQU    HBASE+1        ;M-drive address port.
  37.  
  38.  
  39. ; Disk driver code starts here.
  40.  
  41.     CSEG
  42.  
  43. DSKDR@::
  44.     LD    HL,DMXSPH    ;Disk mutual exclusion semaphore.
  45.     CALL    WAIT##        ;Wait until driver code is idle.
  46.     LD    (RETSP),SP    ;Save the old stack pointer.
  47.     LD    SP,MYSTAK    ;Set up a new stack.
  48.     CALL    DRVR        ;Call the driver.
  49.     LD    SP,(RETSP)
  50.     PUSH    AF        ;Save the return code.
  51.     LD    HL,DMXSPH
  52.     CALL    SIGNAL##    ;Tell TurboDOS we are done.
  53.     POP    AF        ;Get return code back.
  54.     RET            ;To TurboDOS
  55.  
  56. ; The driver subroutine.
  57.  
  58. DRVR:
  59.     LD    A,(IX+OPCODE)    ;Get the operation code.
  60.     SUB    2        ;Subtract 2 - if carry must be 0 or 1.
  61.     JR    C,COMN        ;If so go to read/write common routine.
  62.     JP    Z,QPARMS    ;If it was 2 return disk parameters.
  63.     DEC    A        ;Let's see if it was 3.
  64.     JP    Z,STATUS    ;If so return status - always ready.
  65.     JP    FORMAT        ;Else format - not implemented here.
  66.  
  67.  
  68. ; Read/write code.
  69.  
  70. COMN:
  71.     LD    A,(IX+TRACK)    ;Get track number.
  72.     OUT    (HADDR),A    ;Send it as high address byte to addr port.
  73.     LD    A,(IX+SECTOR)    ;Get sector number.
  74.     ADD    A,A        ;Times 2.
  75.     ADD    A,A        ;Times 4.
  76.     OUT    (HADDR),A    ;Send it as middle address byte to addr port.
  77.     XOR    A        ;Zero the accumulator.
  78.     LD    (SECTCNT),A    ;Set 0 initial sector count for mult sect oper.
  79.     LD    B,A        ;Save 0 in B for 256 byte loop count.
  80.     OUT    (HADDR),A    ;Send 0 as low address byte to address port.
  81.     LD    L,(IX+DMADR)    ;Get low byte of DMA address.
  82.     LD    H,(IX+DMADR+1)    ;Get high byte of DMA address.
  83.     LD    C,HDATA        ;Load data port address in C.
  84. MSECLP:    LD    A,(IX+OPCODE)    ;Get operation code.
  85.     OR    A        ;Set flags.
  86.     JR    NZ,WRITE    ;0 = read, 1 = write.
  87.  
  88. READ:
  89.     INIR            ;Read 256 bytes
  90.     INIR            ;and another 256 makes 512
  91.     INIR            ;and another 256 makes 768
  92.     INIR            ;and another 256 bytes makes a 1K sector.
  93.     JR    GOOD        ;See if another sector wanted.
  94.  
  95. WRITE:
  96.     OTIR            ;Write 256 bytes
  97.     OTIR            ;and another 256 makes 512
  98.     OTIR            ;and another 256 makes 768
  99.     OTIR            ;and another 256 bytes makes a 1K sector.
  100.  
  101. GOOD:
  102.     LD    A,(SECTCNT)    ;Get our sector count.
  103.     INC    A        ;Increment for sector just done.
  104.     LD    (SECTCNT),A    ;Save it again.
  105.     CP    (IX+SECCNT)    ;Compare with TurboDOS's requested #.
  106.     JR    NZ,MSECLP    ;If not enough go do another sector.
  107.     XOR    A        ;Else 0 the accumulator.
  108.     RET            ;And return successful.
  109.  
  110.  
  111. ; Return disk parameters.
  112.  
  113. QPARMS:
  114.     LD    HL,DPB        ;Get address of our disk parameter block.
  115.     LD    (IX+DSTADR),L    ;Put low byte in TurboDOS disk packet.
  116.     LD    (IX+DSTADR+1),H    ;Put high byte in packet.
  117.     OR    0FFH
  118.     RET            ;Return successful.
  119.  
  120. ; Return drive status - always ready.
  121.  
  122. STATUS:    OR    0FFH
  123.     RET
  124.  
  125. ; Format a track - not implemented - always returns reporting success.
  126.  
  127. FORMAT:    XOR    A
  128.     RET
  129.  
  130.  
  131.     DSEG
  132.  
  133. ; This is a wierd disk format but it makes for fast compact code. Note: The
  134. ; last track only has 16 sectors.
  135.  
  136. DPB:    DB    0C4H        ;Block size = 2K, fixed disk, 16K extents.
  137.     DW    1000        ;Total blocks on disk, excluding reserved trks.
  138.     DB    8        ;Number of directory blocks -> 512 dir entries.
  139.     DB    3        ;Sector size -> 1024 byte sectors.
  140.     DW    64        ;Sectors per track.
  141.     DW    32        ;Number of tracks on disk.
  142.     DW    0        ;Number of reserved tracks.
  143.  
  144. ; Mutual exclusion semaphore.
  145.  
  146. DMXSPH:    DW    1
  147.     DW    DMXSPH+2
  148.     DW    DMXSPH+2
  149.  
  150. SECTCNT:DB    0        ;Sector count.
  151.  
  152. ; Space for stack.
  153.  
  154.     DS    8
  155. MYSTAK:
  156. RETSP:    DW    0        ;Return stack pointer stored here.
  157.  
  158.     END
  159.