home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / modula2 / compiler / fst_mod / source / dosdisk.mod < prev    next >
Text File  |  1992-06-21  |  5KB  |  253 lines

  1. IMPLEMENTATION MODULE DOSdisk;
  2.  
  3. FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, ADR, SEG, OFS;
  4.  
  5. VAR dta:ARRAY[0..42] OF CHAR;
  6.     sg,of:CARDINAL;
  7.  
  8. PROCEDURE SetDrive(drive:CHAR);
  9.     VAR number:CARDINAL;
  10.     BEGIN
  11.         CASE drive OF
  12.             'A','a':number := 0|
  13.             'B','b':number := 1|
  14.             'C','c':number := 2|
  15.             'D','d':number := 3;
  16.         END; (* case *)
  17.         ASM
  18.             MOV AH,14
  19.             MOV DL,number
  20.             INT 21H
  21.         END;
  22.     END SetDrive;
  23.  
  24. PROCEDURE GetDrive(VAR drive:CHAR);
  25.     VAR number:CARDINAL;
  26.     BEGIN
  27.         ASM
  28.             MOV AH,25
  29.             INT 21H
  30.             MOV number,AL
  31.         END;
  32.         CASE number OF
  33.             0:drive := 'A'|
  34.             1:drive := 'B'|
  35.             2:drive := 'C'|
  36.             3:drive := 'D';
  37.         END; (* case *)
  38.     END GetDrive;
  39.  
  40. PROCEDURE Mkdir(directory:ARRAY OF CHAR; VAR error:CARDINAL);
  41.     BEGIN
  42.         error := 0;
  43.         ASM
  44.             LDS DX,directory
  45.             MOV AH,57
  46.             INT 21H
  47.             JNC DONE
  48.             LES DI,error
  49.             MOV ES:[DI],AX
  50.     DONE:   NOP
  51.         END;
  52.     END Mkdir;
  53.  
  54. PROCEDURE Chdir(directory:ARRAY OF CHAR; VAR error:CARDINAL);
  55.     BEGIN
  56.         error := 0;
  57.         ASM
  58.             LDS DX,directory
  59.             MOV AH,59
  60.             INT 21H
  61.             JNC DONE
  62.             LES DI,error
  63.             MOV ES:[DI],AX
  64.     DONE:   NOP
  65.         END;
  66.     END Chdir;
  67.  
  68. PROCEDURE Rmdir(directory:ARRAY OF CHAR; VAR error:CARDINAL);
  69.     BEGIN
  70.         error := 0;
  71.         ASM
  72.             LDS DX,directory
  73.             MOV AH,58
  74.             INT 21H
  75.             JNC DONE
  76.             LES DI,error
  77.             MOV ES:[DI],AX
  78.     DONE:   NOP
  79.         END;
  80.     END Rmdir;
  81.  
  82. PROCEDURE GetDir(VAR directory:ARRAY OF CHAR);
  83.     BEGIN
  84.         ASM
  85.             LDS SI,directory
  86.             XOR DL,DL
  87.             MOV AH,71
  88.             INT 21H
  89.         END;
  90.     END GetDir;
  91.  
  92. PROCEDURE Delete(file:ARRAY OF CHAR; VAR error:CARDINAL);
  93.     BEGIN
  94.         ASM
  95.             LDS DX,file
  96.             MOV AH,65
  97.             INT 21H
  98.             LES DI,error
  99.             MOV ES:[DI],AX
  100.         END;
  101.     END Delete;
  102.  
  103. PROCEDURE FindFirst(name:ARRAY OF CHAR; attr:CARDINAL; VAR error:CARDINAL);
  104.     BEGIN
  105.         ASM
  106.             PUSH DS
  107.             MOV AH,47
  108.             INT 21H
  109.             MOV DI,ES
  110.             MOV SI,BX
  111.  
  112.             PUSH DS
  113.             MOV DS,sg
  114.             MOV DX,of
  115.             MOV AH,26
  116.             INT 21H
  117.             POP DS
  118.  
  119.             LDS DX,name
  120.             MOV AH,78
  121.             MOV CX,attr
  122.             INT 21H
  123.             LES BX,error
  124.             MOV ES:[BX],AX
  125.  
  126.             MOV DS,DI
  127.             MOV DX,SI
  128.             MOV AH,26
  129.             INT 21H
  130.             POP DS
  131.         END;
  132.     END FindFirst;
  133.  
  134. PROCEDURE FindNext(VAR error:CARDINAL);
  135.     BEGIN
  136.         ASM
  137.             PUSH DS
  138.             MOV AH,47
  139.             INT 21H
  140.             MOV DI,ES
  141.             MOV SI,BX
  142.  
  143.             PUSH DS
  144.             MOV DS,sg
  145.             MOV DX,of
  146.             MOV AH,26
  147.             INT 21H
  148.             POP DS
  149.  
  150.             MOV AH,79
  151.             INT 21H
  152.             LES BX,error
  153.             MOV ES:[BX],AX
  154.  
  155.             MOV DS,DI
  156.             MOV DX,SI
  157.             MOV AH,26
  158.             INT 21H
  159.             POP DS
  160.         END;
  161.     END FindNext;
  162.  
  163. PROCEDURE FindAttr(VAR attr:CARDINAL);
  164.     BEGIN
  165.         attr := ORD(dta[21]);
  166.     END FindAttr;
  167.  
  168. PROCEDURE FindTime(VAR hour,min,sec:CARDINAL);
  169.     BEGIN
  170.         ASM
  171.             PUSH ES
  172.             MOV ES,sg
  173.             MOV BX,of
  174.             MOV AX,ES:[BX+22]
  175.             POP ES
  176.             XOR DX,DX
  177.             MOV DL,AH
  178.             MOV CL,3
  179.             SHR DL,CL
  180.             LES DI,hour
  181.             MOV ES:[DI],DX
  182.             MOV DL,AL
  183.             AND DL,31
  184.             SHL DL,1
  185.             LES DI,min
  186.             MOV ES:[DI],DX
  187.             MOV CL,5
  188.             SHR AX,CL
  189.             AND AX,63
  190.             LES DI,sec
  191.             MOV ES:[DI],AX
  192.         END;
  193.     END FindTime;
  194.  
  195. PROCEDURE FindDate(VAR month,day,year:CARDINAL);
  196.     BEGIN
  197.         ASM
  198.             PUSH ES
  199.             MOV ES,sg
  200.             MOV BX,of
  201.             MOV DX,ES:[BX+24]
  202.             POP ES
  203.             XOR CX,CX
  204.             MOV CL,DL
  205.             AND CL,31
  206.             LES DI,day
  207.             MOV ES:[DI],CX
  208.             MOV CL,DH
  209.             SHR CL,1
  210.             ADD CX,1980
  211.             LES DI,year
  212.             MOV ES:[DI],CX
  213.             MOV CL,5
  214.             SHR DX,CL
  215.             AND DX,15
  216.             LES DI,month
  217.             MOV ES:[DI],DX
  218.         END;
  219.     END FindDate;
  220.  
  221. PROCEDURE FindLength(VAR len:LONGCARD);
  222.     VAR h,l:CARDINAL;
  223.  
  224.     BEGIN
  225.         ASM
  226.             PUSH ES
  227.             MOV ES,sg
  228.             MOV BX,of
  229.             MOV AX,ES:[BX+26]
  230.             MOV CX,ES:[BX+28]
  231.             MOV l,AX
  232.             MOV h,CX
  233.             POP ES
  234.         END;
  235.         len := LONG(h) * 65536L + LONG(l);
  236.     END FindLength;
  237.  
  238. PROCEDURE FindName(VAR name:ARRAY OF CHAR);
  239.     VAR i:CARDINAL;
  240.  
  241.     BEGIN
  242.         FOR i := 30 TO 42 DO
  243.             name[i-30] := dta[i];
  244.         END; (* for *)
  245.     END FindName;
  246.  
  247. VAR vp:ADDRESS;
  248.  
  249. BEGIN
  250.     vp := ADR(dta);
  251.     sg := vp.SEG;
  252.     of := vp.OFS;
  253. END DOSdisk.