home *** CD-ROM | disk | FTP | other *** search
/ Boston 2 / boston-2.iso / DOS / HILFEN / SYSTEM / RAMDISK1 / RAM.A < prev    next >
Text File  |  1993-12-01  |  4KB  |  230 lines

  1. ;    RAM.A    MS-DOS V2.0 RAM DISK PROGRAM
  2. ;    assemble with the DeSmet assembler
  3. ;    Like the IBM ramdisk but with a setram feature. - John N. White
  4.  
  5. SRH_LEN        EQU    13        ;LENGTH
  6. SRH_STA_FLD    EQU    3        ;STATUS FIELD
  7.  
  8. DTA        EQU    SRH_LEN+1    ;DATA TRANSFER ADDRESS
  9. COUNT        EQU    DTA+4
  10. SSN        EQU    COUNT+2        ;START SECTOR NUMBER
  11.  
  12. RET_BYTE    EQU    DTA        ;RETURN BYTE
  13.  
  14. BPBA_PTR    EQU    COUNT        ;POINTER TO BPB
  15. ;    INITIALIZE
  16. UNITS        EQU    SRH_LEN
  17. BR_ADDR_0    EQU    SRH_LEN+1
  18. BR_ADDR_1    EQU    BR_ADDR_0+2
  19. BPB_PTR_OFF    EQU    BR_ADDR_0+4
  20. BPB_PTR_SEG    EQU    BPB_PTR_OFF+2
  21.  
  22.     CSEG
  23. ;    DEVICE HEADER
  24. NEXT_DEV    DW    -1,-1
  25. ATTRIBUTE    DW    6000H        ;IOCTL supported
  26. STRATEGY    DW    DEV_STRATEGY
  27. INTERRUPT    DW    DEV_INT
  28. DEV_NAME    DB    1        ;NUMBER OF DEVICES
  29.         DB    0,0,0,0,0,0,0
  30.  
  31. RH_OFF        DW    0        ;REQUEST HEADER OFFSET
  32. RH_SEG        DW    0        ;SEGMENT
  33.  
  34. ;    CURRENT INFORMATION
  35. TOTAL        DW    0        ;NUMBER OF SECTORS TO TRANSFER
  36. START_SEC    DW    0        ;FIRST SECTOR
  37. VDISK_PTR    DW    0
  38. USER_DTA    DW    0,0        ;USERS DATA TRANSFER ADDRESS
  39. BPB        DW    512        ;PER SECTOR
  40.         DB    1        ;ALLOCATION UNIT
  41.         DW    0        ;0 RESERVED
  42.         DB    1        ;1 FAT
  43.         DW    32        ;DIRECTORY ENTRIES
  44. SECTORS        DW    10H        ;SECTORS TOTAL
  45. MEDIA_TYPE    DB    0FCH        ;MEDIA BYTE
  46. FAT_SIZE    DW    3        ;SECTORS IN FATS
  47. BPB_PTR        DW    BPB
  48. MEDIA_IN    DB    -1        ;MEDIA IN DRIVE IF 1
  49.  
  50. FUNTAB:
  51.     DW    INIT
  52.     DW    MEDIA_CHECK
  53.     DW    BUILD_BPB
  54.     DW    IOCTLI
  55.     DW    INPUT
  56.     DW    EXIT
  57.     DW    EXIT
  58.     DW    EXIT
  59.     DW    OUTPUT
  60.     DW    OUTPUT            ;DONT BOTHER VERIFYING
  61.     DW    EXIT
  62.     DW    EXIT
  63.     DW    IOCTLO
  64.  
  65. IN_SAVE:MOV    AX,ES:WORD [BX+DTA]    ;SAVE CALLERS DTA
  66.     MOV    DS:WORD USER_DTA,AX
  67.     MOV    AX,ES:WORD [BX+DTA+2]
  68.     MOV    DS:WORD USER_DTA+2,AX
  69.     MOV    AX,ES:WORD [BX+SSN]    ;START SECTOR
  70.     MOV    DS:START_SEC,AX
  71.     MOV    AX,ES:WORD [BX+COUNT]    ;COUNT OF SECTORS
  72.     MOV    AH,0
  73.     MOV    DS:WORD TOTAL,AX
  74.     RET
  75.  
  76. CALC_ADDR:
  77.     MOV    AX,DS:START_SEC
  78.     MOV    CL,5            ;TURN SECTORS INTO PARAGRAPHS
  79.     SHL    AX,CL
  80.     ADD    AX,DS:VDISK_PTR
  81.     MOV    CH,DS:BYTE TOTAL    ;CX=LENGTH IN WORDS
  82.     MOV    CL,0
  83.     MOV    DS,AX            ;MOVE ADDRESS TO DS:SI
  84.     XOR    SI,SI
  85.     RET
  86.  
  87. ;    STRATEGY ENTRY
  88. DEV_STRATEGY:
  89.     MOV    CS:RH_SEG,ES        ;SAVE ES:BX
  90.     MOV    CS:RH_OFF,BX
  91.     LRET
  92.  
  93. ;    DEVICE INTERRUPT HANDLER
  94. DEV_INT:
  95.     PUSH    DS            ;SAVE STATE
  96.     PUSH    ES
  97.     PUSH    AX
  98.     PUSH    BX
  99.     PUSH    CX
  100.     PUSH    DX
  101.     PUSH    SI
  102.     PUSH    DI
  103. ;        SET STATUS TO ALL OK
  104.     MOV    ES:WORD [BX+SRH_STA_FLD],100H
  105.     MOV    AL,ES:[BX+2]        ;GET FUNCTION BYTE
  106.     SHL    AL,1            ;TIMES 2
  107.     MOV    AH,0
  108.     MOV    DI,AX            ;FUNCTION OFFSET
  109.     PUSH    CS
  110.     POP    DS
  111.     JMP    WORD FUNTAB[DI]
  112.  
  113. ;    MEDIA CHECK
  114. ;media status is -1 after release of memory
  115. MEDIA_CHECK:
  116.     MOV    AL,DS:MEDIA_IN
  117.     MOV    ES:BYTE [BX+RET_BYTE],AL
  118.     JMP    EXIT
  119.  
  120. ;    BUILD BIOS PARAMETER BLOCK
  121. BUILD_BPB:
  122.     MOV    ES:WORD [BX+BPBA_PTR],OFFSET BPB
  123.     MOV    ES:WORD [BX+BPBA_PTR+2],CS
  124.     CMP    DS:MEDIA_IN,1
  125.     JE    EXIT
  126.     CMP    DS:VDISK_PTR,0
  127.     JZ    EXIT
  128.     MOV    DS:MEDIA_IN,1
  129.     CLD
  130.     MOV    ES,DS:VDISK_PTR
  131.     MOV    DI,0            ;ZERO OUT FAT
  132.     MOV    AL,DS:MEDIA_TYPE
  133.     XOR    AL,1            ;FORCE MS-DOS TO LOOK AT SECTOR COUNT
  134.     MOV    DS:MEDIA_TYPE,AL
  135.     STOSB                ;SET FIRST 3 BYTES OF FAT
  136.     MOV    AX,0FFFFH
  137.     STOSW
  138.     MOV    CX,16*512-3        ;SIZE OF REST OF FAT + DIRECTORY
  139.     XOR    AL,AL
  140. REP    STOSB                ;FAT IS ZERO
  141.     JMP    EXIT
  142.  
  143. ;    READ A SECTOR
  144. INPUT:
  145.     CMP    DS:MEDIA_IN,1        ;MAKE SURE MEDIA IN DRIVE
  146.     JNE    BAD_EXIT
  147.     CALL    IN_SAVE
  148.     CALL    CALC_ADDR        ;GET SECTOR ADDRESS
  149.     LES    DI,CS:USER_DTA        ;LOAD DESTINATION ADDRESS
  150.     CLD
  151. REP    MOVSW                ;MOVE READ DATA
  152.     JMP    EXIT
  153.  
  154. ;    WRITE A SECTOR
  155. OUTPUT:
  156.     CMP    DS:MEDIA_IN,1        ;MAKE SURE MEDIA IN DRIVE
  157.     JNE    BAD_EXIT
  158.     CALL    IN_SAVE
  159.     CALL    CALC_ADDR        ;GET DESTINATION ADDRESS
  160.     PUSH    DS
  161.     POP    ES            ;PUT DESTINATION INTO ES:DI
  162.     MOV    DI,SI
  163.     LDS    SI,CS:USER_DTA        ;LOAD SOURCE ADDRESS
  164.     CLD
  165. REP    MOVSW
  166.     JMP    EXIT
  167.  
  168. BAD_EXIT:
  169.     MOV    ES:WORD [BX+SRH_STA_FLD],8002H
  170.     JMP    EXIT
  171.  
  172. ;    IOCTLI
  173. IOCTLI:
  174.     CALL    IN_SAVE
  175.     MOV    AX,DS:VDISK_PTR
  176.     LDS    DI,DS:USER_DTA
  177.     MOV    DS:[DI],AX
  178.     JMP    EXIT
  179.  
  180. ;    IOCTLO
  181. IOCTLO:
  182.     CALL    IN_SAVE
  183.     PUSH    DS
  184.     LDS    DI,CS:USER_DTA
  185.     MOV    AX,DS:[DI]
  186.     MOV    CX,DS:[DI+2]
  187.     POP    DS
  188.     MOV    DS:VDISK_PTR,AX
  189.     MOV    AX,CX
  190.     MOV    DS:SECTORS,AX
  191.     SHR    AX,1            ;FIND FAT SIZE
  192.     ADD    AX,CX
  193.     MOV    CL,9
  194.     SHR    AX,CL
  195.     INC    AX
  196.     MOV    DS:WORD FAT_SIZE,AX
  197.     MOV    DS:BYTE MEDIA_IN,-1
  198.  
  199.  
  200. ;    COMMON EXIT
  201. EXIT:    POP    DI
  202.     POP    SI
  203.     POP    DX
  204.     POP    CX
  205.     POP    BX
  206.     POP    AX
  207.     POP    ES
  208.     POP    DS
  209.     LRET
  210.  
  211. ;    INTILLIZATION
  212. INIT:
  213.     MOV    AX,OFFSET INIT        ;RAM IS AT END OF THIS CODE
  214.     MOV    CL,4            ;MAKE PARAS
  215.     SHR    AX,CL
  216.     INC    AX            ;1 FOR ROUND UP
  217.     PUSH    CS
  218.     POP    DI
  219.     ADD    AX,DI            ;ADD CURRENT CS
  220.     PUSH    ES
  221.     POP    DS
  222.     MOV    DS:WORD [BX+BR_ADDR_0],0 ;SET FREE ADDRESS
  223.     MOV    DS:WORD [BX+BR_ADDR_1],AX
  224.     MOV    DS:BYTE [BX+UNITS],1    ;ONE UNIT
  225.     MOV    DS:WORD [BX+BPB_PTR_OFF],OFFSET BPB_PTR
  226.     MOV    DS:WORD [BX+BPB_PTR_SEG],CS
  227.     JMP    EXIT
  228.  
  229.     END
  230.