home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / asm_kit / ram.asm < prev    next >
Assembly Source File  |  1984-03-01  |  6KB  |  297 lines

  1. ;    RAM.ASM    MS-DOS V2.0 RAM DISK PROGRAM
  2. ;    Mark DeSmet, 1984
  3.  
  4.  
  5. CODE    SEGMENT PARA PUBLIC 'CODE'
  6. OPEN        EQU    3DH
  7. CLOSE        EQU    3EH
  8. READ        EQU    3FH
  9. MSDOS        EQU    21H
  10.  
  11.  
  12. FATSEC        EQU    4        ;SECTORS PER FAT
  13.  
  14. IBM        EQU    21H        ;INTERRUPT TO CALL IBM
  15. COCODE        EQU    2        ;CODE FOR CONSOLE OUTPUT
  16. VIDEO        EQU    10H        ;VIDEO INTERRUPT
  17. TTY        EQU    14
  18.  
  19. SHR        EQU    0        ;STATIC REQUEST START
  20. SRH_LEN        EQU    13        ;LENGTH
  21. SRH_LEN_FLD    EQU    0        ;LENGTH FIELD
  22. SRH_UCB_FLD    EQU    1        ;UNIT CODE FIELD
  23. SRH_CCD_FLD    EQU    2        ;COMMAND CODE FIELD
  24. SRH_STA_FLD    EQU    3        ;STATUS FIELD
  25. SRH_RES_FLD    EQU    5        ;RESERVED AREA FIELD
  26.  
  27. MD        EQU    SRH_LEN        ;MEDIA BYTE
  28. DTA        EQU    SRH_LEN+1    ;DATA TRANSFER ADDRESS
  29. COUNT        EQU    DTA+4
  30. SSN        EQU    COUNT+2        ;START SECTOR NUMBER
  31.  
  32. RET_BYTE    EQU    DTA        ;RETURN BYTE
  33.  
  34. BPBA_PTR    EQU    COUNT        ;POINTER TO BPB
  35. ;    INITIALIZE
  36. UNITS        EQU    SRH_LEN
  37. BR_ADDR_0    EQU    SRH_LEN+1
  38. BR_ADDR_1    EQU    BR_ADDR_0+2
  39. BPB_PTR_OFF    EQU    BR_ADDR_0+4
  40. BPB_PTR_SEG    EQU    BPB_PTR_OFF+2
  41.  
  42.     ASSUME    CS:CODE
  43. BEGIN:
  44. ;    DEVICE HEADER
  45. NEXT_DEV    DD    -1
  46. ATTRIBUTE    DW    2000H
  47. STRATEGY    DW    DEV_STRATEGY
  48. INTERRUPT    DW    DEV_INT
  49. DEV_NAME    DB    1        ;NUMBER OF DEVICES
  50.         DB    7 DUP (?)
  51.  
  52. RH_OFF        DW    0        ;REQUEST HEADER OFFSET
  53. RH_SEG        DW    0        ;SEGMENT
  54.  
  55.  
  56. ;    CURRENT INFORMATION
  57.  
  58. TOTAL        DW    0        ;NUMBER OF SECTORS TO TRANSFER
  59. START_SEC    DW    0        ;FIRST SECTOR
  60. VDISK_PTR    DW    0
  61. USER_DTA    DD    0        ;USERS DATA TRANSFER ADDRESS
  62. BOOT_REC    DB    0,0,0        ;JUMP
  63.         DB    'DeSmet  '
  64. BPB        DW    512        ;PER SECTOR
  65.         DB    1        ;ALLOCATION UNIT
  66.         DW    1        ;1 RESERVED
  67.         DB    2        ;2 FATS
  68.         DW    64        ;DIRECTORY ENTRIES
  69. SECTORS        DW    650        ;SECTORS TOTAL
  70.         DB    0FCH        ;MEDIA BYTE
  71.         DW    FATSEC        ;SECTORS IN FATS
  72. BPB_PTR        DW    BPB
  73.  
  74.  
  75. FUNTAB    LABEL    BYTE
  76.     DW    INIT
  77.     DW    MEDIA_CHECK
  78.     DW    BUILD_BPB
  79.     DW    EXIT
  80.     DW    INPUT
  81.     DW    EXIT
  82.     DW    EXIT
  83.     DW    EXIT
  84.     DW    OUTPUT
  85.     DW    OUTPUT            ;DONT BOTHER VERIFYING
  86.     DW    EXIT
  87.     DW    EXIT
  88.     DW    EXIT
  89.  
  90.  
  91. IN_SAVE:MOV    AX,ES:WORD PTR DTA[BX]    ;SAVE CALLERS DTA
  92.     MOV    CS:WORD PTR USER_DTA,AX
  93.     MOV    AX,ES:WORD PTR DTA+2[BX]
  94.     MOV    CS:WORD PTR USER_DTA+2,AX
  95.     MOV    AX,ES:WORD PTR SSN[BX]    ;START SECTOR
  96.     MOV    CS:START_SEC,AX
  97.     MOV    AX,ES:WORD PTR COUNT[BX];COUNT OF SECTORS
  98.     MOV    AH,0
  99.     MOV    CS:TOTAL,AX
  100.     RET
  101.  
  102. CALC_ADDR:
  103.     MOV    AX,CS:START_SEC
  104.     MOV    CL,5            ;TURN SECTORS INTO PARAGRAPHS
  105.     SHL    AX,CL
  106.     ADD    AX,CS:VDISK_PTR
  107.     MOV    DS,AX            ;MOVE ADDRESS TO DS:SI
  108.     XOR    SI,SI
  109.     MOV    AX,CS:TOTAL        ;CALC CX=LENGTH IN WORDS
  110.     MOV    CL,8            ;256 WORDS PER SECTOR
  111.     SHL    AX,CL
  112.     MOV    CX,AX            ;WORD COUNT
  113.     RET
  114.  
  115. ;    STRATEGY ENTRY
  116.  
  117. DEV_STRATEGY    PROC    FAR
  118.     MOV    CS:RH_SEG,ES        ;SAVE ES:BX
  119.     MOV    CS:RH_OFF,BX
  120.     RET
  121. DEV_STRATEGY    ENDP
  122.  
  123. ;    DEVICE INTERRUPT HANDLER
  124.  
  125. DEV_INT    PROC    FAR
  126.     PUSH    DS            ;SAVE STATE
  127.     PUSH    ES
  128.     PUSH    AX
  129.     PUSH    BX
  130.     PUSH    CX
  131.     PUSH    DX
  132.     PUSH    SI
  133.     PUSH    DI
  134. ;        SET STATUS TO ALL OK AS NO ERRORS POSSABLE
  135.     MOV    ES:WORD PTR SRH_STA_FLD[BX],100H
  136.     MOV    AL,ES:[BX+2]        ;GET FUNCTION BYTE
  137.     SHL    AL,1            ;TIMES 2
  138.     MOV    AH,0
  139.     MOV    DI,AX            ;FUNCTION OFFSET
  140.     JMP    WORD PTR CS:FUNTAB[DI]
  141.  
  142.  
  143. ;    INTILLIZATION
  144.  
  145. INIT:    MOV    AX,CS            ;TINY CASE
  146.     MOV    DS,AX
  147.     PUSH    ES
  148.     PUSH    BX
  149.  
  150.  
  151. ;  GET THE SPECIFIED SIZE. THE BPB POINTER FIELS HAS POINTER TO FIRST
  152. ;    BYTE AFTER = IN DEVICE=XXX
  153.  
  154.     LES    BX,ES:DWORD PTR BPB_PTR_OFF[BX]
  155. NCH:    MOV    AL,ES:[BX]        ;LOOK FOR A DIGIT BEFORE A LF
  156.     CMP    AL,'0'
  157.     JB    NOTDIG
  158.     CMP    AL,'9'
  159.     JBE    GETNUM
  160. NOTDIG:    INC    BX            ;NEED TO LOOK FOR MORE
  161.     CMP    AL,10            ;LF IF NONT
  162.     JNZ    NCH
  163.     MOV    CX,128            ;128 k DEFAULT
  164.     JMP    GOTSIZE
  165.  
  166. GETNUM:    MOV    CX,0            ;TOTAL
  167. NNUM:    MOV    DL,ES:[BX]        ;NEXT DIGIT
  168.     INC    BX
  169.     SUB    DL,'0'
  170.     CMP    DL,9
  171.     JA    ENDNUM
  172.     MOV    DH,0
  173.     PUSH    DX
  174.     MOV    AX,10
  175.     MUL    CX
  176.     POP    DX
  177.     ADD    AX,DX
  178.     MOV    CX,AX
  179.     JMP    NNUM
  180. ENDNUM:    CMP    CX,32            ;32 K MINIMUM
  181.     JAE    TEST650
  182.     MOV    CX,32
  183. TEST650:CMP    CX,650
  184.     JB    GOTSIZE
  185.     MOV    CX,650
  186. GOTSIZE:SHL    CX,1            ;2 SECTORS PER K
  187.     MOV    SECTORS,CX
  188.     POP    BX            ;RETRIEVE BLOCK ADDRESS
  189.     POP    ES
  190.     
  191.     PUSH    CS            ;CALC START ADDRESS OF RAMDISK
  192.     POP    DX
  193.     MOV    AX,OFFSET VDISK        ;RAM IS AT END OF THIS CODE
  194.     MOV    CL,4            ;MAKE PARAS
  195.     SHR    AX,CL
  196.     INC    AX            ;1 FOR ROUND UP
  197.     ADD    AX,DX            ;BASE PARAGRAPH
  198.     MOV    CS:VDISK_PTR,AX        ;REMEMBER BASE
  199.     MOV    DX,SECTORS        ;CALC END ADDRESS
  200.     MOV    CL,5            ;GET SECTORS OF RAM DISK
  201.     SHL    DX,CL
  202.     ADD    AX,DX            ;NEXT FREE BYTE
  203.     MOV    ES:WORD PTR BR_ADDR_0[BX],0 ;SET FREE ADDRESS
  204.     MOV    ES:WORD PTR BR_ADDR_1[BX],AX
  205.     MOV    ES:BYTE PTR UNITS[BX],1    ;ONE UNIT
  206.     MOV    ES:WORD PTR BPB_PTR_OFF[BX],OFFSET BPB_PTR
  207.     MOV    ES:BPB_PTR_SEG[BX],CS
  208.  
  209.     MOV    ES,CS:VDISK_PTR        ;SET BOOT RECORD
  210.     XOR    DI,DI
  211.     PUSH    CS            ;SET DS:SI TO BOOT IMAGE
  212.     POP    DS
  213.     MOV    SI,OFFSET BOOT_REC
  214.     CLD
  215.     MOV    CX,24            ;LENGTH OF BOOT
  216. REP    MOVSB
  217.     MOV    DI,512            ;ZERO OUT FAT
  218.     MOV    AL,0FCH            ;SET FIRST 3 BYTES OF FAT
  219.     STOSB
  220.     MOV    AX,0FFFFH
  221.     STOSW
  222.     MOV    CX,FATSEC*512-3        ;SIZE OF REST OF FAT
  223.     XOR    AL,AL
  224. REP    STOSB                ;FAT IS ZERO
  225.     PUSH    ES
  226.     POP    DS
  227.     MOV    SI,DI            ;MAKE SECOND COPY OF FAT
  228.     SUB    SI,FATSEC*512
  229.     MOV    CX,FATSEC*256
  230. REP    MOVSW
  231.     XOR    AX,AX            ;ZERO DIRECTORY
  232.     MOV    CX,256*6
  233. REP    STOSW
  234.  
  235.     JMP    EXIT
  236.  
  237.  
  238. ;    MEDIA CHECK
  239.  
  240.     DB    'MEDIA CHECK'
  241. MEDIA_CHECK:
  242.     MOV    ES:BYTE PTR RET_BYTE[BX],1
  243.     JMP    EXIT
  244.  
  245.  
  246. ;    BUILD BIOS PARAMETER BLOCK
  247.  
  248.     DB    'BUILD BPB'
  249. BUILD_BPB:
  250.     MOV    ES:WORD PTR BPBA_PTR[BX],OFFSET BPB
  251.     MOV    ES:WORD PTR BPBA_PTR+2[BX],CS
  252.     JMP    EXIT
  253.  
  254.  
  255.  
  256. ;    READ A SECTOR
  257.  
  258.     DB    'INPUT'
  259. INPUT:
  260.     CALL    IN_SAVE
  261.     CALL    CALC_ADDR        ;GET SECTOR ADDRESS
  262.     LES    DI,CS:USER_DTA        ;LOAD DESTINATION ADDRESS
  263.     CLD
  264. REP    MOVSW                ;MOVE READ DATA
  265.     JMP    EXIT
  266.  
  267. ;    WRITE A SECTOR
  268.  
  269.     DB    'OUTPUT'
  270. OUTPUT:
  271.     CALL    IN_SAVE
  272.     CALL    CALC_ADDR        ;GET DESTINATION ADDRESS
  273.     PUSH    DS
  274.     POP    ES            ;PUT DESTINATION INTO ES:DI
  275.     MOV    DI,SI
  276.     LDS    SI,CS:USER_DTA        ;LOAD SOURCE ADDRESS
  277.     CLD
  278. REP    MOVSW
  279.     JMP    EXIT
  280.  
  281.  
  282. ;    COMMON EXIT
  283.  
  284. EXIT:    POP    DI
  285.     POP    SI
  286.     POP    DX
  287.     POP    CX
  288.     POP    BX
  289.     POP    AX
  290.     POP    ES
  291.     POP    DS
  292.     RET
  293. DEV_INT    ENDP
  294. VDISK    EQU    $
  295. CODE    ENDS
  296.     END    BEGIN
  297.