home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / TURBODSG / DSKRAM.AQ / DSKRAM.A
Text File  |  2000-06-30  |  4KB  |  182 lines

  1. ; DSKRAM - A RAMDISK IMPLEMENTATION FOR TURBODOS
  2. ; 16 BIT SLAVES WITH SUFFICIENT MEMORY
  3. ;
  4. ; NOTE: THE logic WAS BORROWED FROM NORMAN KOHN'S DISK DRIVER FOR
  5. ; 8 BIT BANKED SLAVES.  THE code IS ORIGINAL.
  6. ;
  7. ; DSKRAM.O IS COPYLEFT ESKAY SOFTWARE.  ALL LEFTS REVERSED.
  8. ;
  9.     MODULE    "DSKRAM"
  10. ;
  11.     LOC    Data#
  12. ;
  13. ; THE FOLLOWING DEFINES A 256K RAMDISK IN A 512K SLAVE
  14. ; BE SURE TO SET MEMTBL+3 = {SEGDSK}-0X50 IN THE PAR FILE!
  15. ; ALSO READ DSKRAM.DOC!
  16. ;
  17. SEGDSK::WORD    0X4000            ; STARTING SEGMENT
  18. NUMSGS::BYTE    4            ; NUMBER OF SEGMENTS
  19. ;
  20. DMXSPH:    WORD    1            ; MUTUAL EXCLUSION
  21.     WORD    .            ;   SEMAPHORE
  22.     WORD    .-2
  23. ;
  24. ; DISK SPECIFICATION TABLE
  25. ;
  26. DST:
  27. BLKSIZ:    BYTE    0XC4            ; 2K, FIXED, 16K EXTENTS
  28. NMBLK:    WORD    0            ; CALCULATED BY INIT
  29.     BYTE    4            ; 128 DIR ENTRIES
  30. SECSIZ:    BYTE    1            ; 256 BYTE SECTORS
  31. SPT:    WORD    4            ; 4 SECTORS PER TRACK
  32. NMTRK:    WORD    0            ; CALCULATED BY INIT
  33.     WORD    0            ; ONE RESERVED TRACK
  34. ;
  35.     LOC    Code#
  36. ;
  37. ; INITIALIZE WHATEVER THERE HAS TO BE INITED
  38. ;
  39. DSKIN_::
  40.     PUSH    DS        ; SAVE DATA SEGMENT
  41.     MOV    CL,NUMSGS    ; GET NUMBER OF SEGMENTS TO CHECK
  42.     MOV    AX,SEGDSK    ; GET POINTER TO DISK START SEG
  43.     MOV    DS,AX        ; MAKE THIS OUR DATA SEG FOR NOW
  44. ;
  45. ; FIRST SEE IF THIS WAS A COLD BOOT
  46. ; (CHECK DIRECTORY LABEL)
  47. ;
  48.     XOR    BX,BX        ; POINT TO FIRST BYTE
  49.     CMP    [BX],=BYTE 0XE5
  50.     JNZ    __IL        ; MUST FORMAT
  51.     CMP    12[BX],=BYTE 0X80    ; DIR MUST BE HASHED
  52.     JNZ    __IL
  53.     CMP    15[BX],=BYTE 0XFF
  54.     JZ    __CALC
  55. __IL:    XOR    BX,BX        ; GET READY TO WIPE THIS SEGMENT
  56. __E5:    MOV    [BX],=WORD 0XE5E5
  57.     INC    BX
  58.     INC    BX
  59.     JNZ    __E5        ; UNTIL SEGMENT DONE
  60.     DEC    CL        ; DECREMENT SEGMENT COUNTER
  61.     JZ    __CALC        ; DONE, CALCULATE BLIND SPOTS IN DST
  62.     MOV    BX,DS        ; GET DATA SEGMENT
  63.     ADD    BX,=0X1000    ; MAKE NEXT SEG ADDR
  64.     MOV    DS,BX
  65.     JMPS    __IL        ; DO AGAIN
  66. ;
  67. ; CALCULATE NMBLK AND NMTRK
  68. ;
  69. __CALC:    POP    DS        ; GET OUR DS BACK
  70.     MOV    AL,=64        ; 64K PER SEGMENT
  71.     MUL    NUMSGS        ;   TIMES THE # OF SEGS
  72.     MOV    NMTRK,AX    ; STORE AS NUMBER OF TRACKS (AT 1K EACH)
  73.     SHR    AX,=1        ; DIVIDE BY 2
  74.     MOV    NMBLK,AX    ; STORE AS NUMBER OF BLOCKS
  75.     RET            ; AND QUIT
  76. ;
  77. ; THIS IS THE ACTUAL RAM DISK DRIVER
  78. ;
  79. DSKDR_::
  80.     MOV    BX,&DMXSPH    ; MAKE SURE WE'RE ALONE OUT THERE
  81.     CALL    WAIT#
  82.     CALL    __DD
  83.     LAHF
  84.     PUSH    AX
  85.     MOV    BX,&DMXSPH    ; LET THE OTHER GUY BACK IN
  86.     CALL    SIGNAL#
  87.     POP    AX
  88.     SAHF
  89.     RET
  90. ;
  91. __DD:    MOV    AL,0[SI]    ; GET FUNCTION NUMBER
  92.     OR    AL,AL
  93.     JZ    RDDSK        ; FCN 0 = READ DISK
  94.     DEC    AL
  95.     JZ    WRDSK        ; FCN 1 = WRITE DISK
  96.     DEC    AL
  97.     JZ    RETDST        ; FCN 2 = RETURN DST
  98. RETFF:    MOV    AL,=0XFF    ; ELSE RETURN FAILURE
  99.     RET
  100. ;
  101. ; RETURN DST
  102. ;
  103. RETDST:    MOV    14[SI],=WORD DST
  104.     JMPS    RETFF
  105. ;
  106. ; READ DISK
  107. ;
  108. RDDSK:    PUSH    ES
  109.     PUSH    DS
  110.     PUSH    SI
  111.     PUSH    DI
  112.     CLI            ; LET'S NOT GET DISTURBED...
  113.     CALL    GETADR        ; GET ADDRESS IN ES:BX
  114.     MOV    AX,10[SI]    ; GET DMA OFFSET
  115.     MOV    DX,12[SI]    ; GET DMA SEGMENT
  116.     MOV    CX,8[SI]    ; GET BYTE COUNT
  117.     PUSH    ES        ; GET DISK ADDRESS SEGMENT...
  118.     POP    DS        ;   ... INTO DS
  119.     MOV    ES,DX        ; DESTINATION SEG INTO ES
  120.     MOV    DI,AX        ; DESTINATION OFFSET INTO DI
  121.     MOV    SI,BX        ; SOURCE ADDRESS INTO SI
  122.     CLD            ; SET AUTO-INCREMENT
  123.     REP
  124.     MOVS    BYTE        ; MOVE THE STUFF
  125.     POP    DI
  126.     POP    SI
  127.     POP    DS
  128.     POP    ES        ; (WISH THIS WAS A '186... PUSHA/POPA!)
  129.     STI            ; MAY INTERRUPT AGAIN
  130.     JMPS    RETZZ        ; RETURN OK
  131. ;
  132. ; WRITE DISK
  133. ;
  134. WRDSK:    PUSH    ES
  135.     PUSH    DS
  136.     PUSH    SI
  137.     PUSH    DI
  138.     CLI            ; LET'S NOT GET DISTURBED...
  139.     CALL    GETADR        ; GET ADDRESS IN ES:BX
  140.     MOV    AX,10[SI]    ; GET DMA OFFSET
  141.     MOV    DX,12[SI]    ; GET DMA SEGMENT
  142.     MOV    CX,8[SI]    ; GET BYTE COUNT
  143.     MOV    DI,BX        ; DESTINATION OFFSET INTO DI
  144.     MOV    SI,AX        ; SOURCE ADDRESS INTO SI
  145.     MOV    DS,DX        ; SOURCE SEGMENT INTO DS
  146.     CLD            ; SET AUTO-INCREMENT
  147.     REP
  148.     MOVS    BYTE        ; MOVE THE STUFF
  149.     POP    DI
  150.     POP    SI
  151.     POP    DS
  152.     POP    ES        ; (WISH THIS WAS A '186... PUSHA/POPA!)
  153.     STI            ; MAY INTERRUPT AGAIN
  154. RETZZ:    XOR    AL,AL        ; RETURN OK
  155.     RET
  156. ;
  157. ; GET "DISK" ADDRESS IN ES:BX
  158. ;
  159. GETADR:    MOV    AX,2[SI]    ; GET TRACK NUMBER
  160.     MOV    CL,=64        ; 64K PER SEGMENT
  161.     DIV    CL        ; FIGURE WHICH SEGMENT
  162.     MOV    CL,AL        ; PUT SEGMENT NUMBER INTO CH
  163.     PUSH    CX        ; SAVE SEGMENT NUMBER
  164.     MOV    AL,AH        ; GET REMAINDER
  165.     MOV    AH,=0
  166.     MOV    CX,=1024    ; 1024 BYTES PER TRACK
  167.     MUL    CX        ; AX IS NOW TRACK ADDRESS IN SEG CL
  168.     MOV    BX,AX        ; TRACK ADDR TO BX
  169.     MOV    AX,4[SI]    ; GET SECTOR
  170.     MOV    CX,=256        ; BYTES PER SECTOR
  171.     MUL    CX
  172.     ADD    BX,AX        ; BX NOW HAS FULL OFFSET
  173.     MOV    AX,=0X1000
  174.     POP    CX
  175.     MOV    CH,=0
  176.     MUL    CX
  177.     MOV    DX,SEGDSK
  178.     ADD    DX,AX
  179.     MOV    ES,DX
  180.     RET
  181.     END
  182.