summaryrefslogtreecommitdiff
path: root/system/dos/1986/src/disk manager
blob: 5711ee7e95ca713b31d19def754873e16154c998 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
PACKET disk manager DEFINES                 (* Copyright (C) 1986 *)
                                            (* Frank Klapper      *)
  disk fetch,                               (* 07.05.86           *)
  disk check,
  disk save first phase,
  disk save second phase,
  disk clear,
  disk format,
  disk erase,
  disk exists,
  disk list,
  disk all,
  disk reserve,
  disk free:

LET ascii        = 1,
    ascii german = 2,
    transparent  = 3,
    ebcdic       = 4,
    row text     = 5,
    ds           = 6,
    atari st     = 10;

TEXT VAR file name;

INT VAR mode := 0;
TEXT VAR mode extension;

REAL VAR last access time := 0.0;

PROC disk fetch (TEXT CONST name, DATASPACE VAR file ds):
  enable stop;
  access disk;
  file name  := adapted name (name, TRUE);
  IF dir contains (file name)
    THEN do fetch
    ELSE errorstop ("die Datei """ + file name + """ gibt es nicht")
  FI;
  last access time := clock (1).

do fetch:
  SELECT mode OF 
    CASE ascii, ascii german, atari st, ebcdic, transparent: fetch filemode (file ds, filename, mode)
    CASE row text   : fetch row textmode (file ds, filename)
    CASE ds         : fetch dsmode       (file ds, filename)
    OTHERWISE error stop ("Unzulssige Betriebsart")
  END SELECT.

END PROC disk fetch;

PROC disk check (TEXT CONST name):
  enable stop;
  access disk;
  file name := adapted name (name, TRUE);
  IF dir contains (file name)
    THEN disable stop;
         check file (file name);
         IF is error
           THEN clear error;
                error stop ("Fehler beim Prflesen der Datei """ + file name + """")
         FI;
    ELSE error stop ("""" + file name + """ gibt es nicht")
  FI;
  last access time := clock (1).

END PROC disk check;

PROC disk save first phase (TEXT CONST name, BOOL VAR overwrite question):
  enable stop;
  overwrite question := FALSE;
  access disk;
  file name := adapted name (name, FALSE); 
  IF dir contains (file name)
     THEN overwrite question := TRUE
  FI;
  last access time := clock (1).

END PROC disk save first phase;

PROC disk save second phase (DATASPACE CONST file ds): 
  enable stop;
  access disk;
  erase file if necessary;
  do save;
  last access time := clock (1).

erase file if necessary:
  IF dir contains (file name)
    THEN erase table entrys (file name)
  FI.

do save:
  SELECT mode OF 
    CASE ascii, ascii german,atari st, ebcdic, transparent: save filemode (file ds, filename, mode)
    CASE row text   : save row textmode (file ds, filename)
    CASE ds         : save dsmode       (file ds, filename)
    OTHERWISE error stop ("Unzulssige Betriebsart")
  END SELECT.

END PROC disk save second phase;

(* DOS bekommt die Tabellenparameter von der Diskette
   CPM bekommt die Tabellenparameter ber 'reserve'   *)

PROC disk clear:
  enable stop;
(*COND DOS*)
  access disk;
(*ENDCOND*)
(*COND CPM
  open eu disk;
  open action;
ENDCOND*)
  format disk;
  last access time := clock (1).

END PROC disk clear;

PROC disk erase (TEXT CONST name):
  enable stop;
  access disk;
  file name := adapted name (name, TRUE); 
  IF NOT dir contains (file name)
    THEN errorstop ("die Datei """ + file name + """ gibt es nicht")
    ELSE erase table entrys (file name);
  FI;
  last access time := clock (1).

END PROC disk erase;
 
BOOL PROC disk exists (TEXT CONST name):
  enable stop;
  access disk;
  last access time := clock (1);
  dir contains (adapted name (name, TRUE)).

END PROC disk exists;

PROC disk list (DATASPACE VAR list ds):
  enable stop;
  access disk;
  dir list (list ds);
  last access time := clock (1).

END PROC disk list;

THESAURUS PROC disk all:
  enable stop;
  access disk;
  last access time := clock (1);
  dir all.

END PROC disk all;

PROC disk format:

(*COND DOS*)
  error stop ("nicht implementiert")
(*ENDCOND*)

(*COND CPM
  enable stop;
  open eu disk;
  open action;
  format archive (eu disk format no);
  format disk;
  last access time := clock (1).
ENDCOND*)

END PROC disk format;

PROC disk reserve (TEXT CONST reserve string):
  enable stop;
  close action;
  last access time := clock (1);
  get mode.
 
get mode:
  TEXT VAR mode text;
  IF pos (reserve string, ":") = 0
    THEN mode text := reserve string;
         mode extension := ""
    ELSE mode text := subtext (reserve string, 1, pos (reserve string, ":") - 1);
         mode extension := subtext (reserve string, pos (reserve string, ":") + 1)
  FI;
  prepare modetext;
  IF mode text = "FILEASCII"
    THEN mode := ascii
  ELIF mode text = "FILEASCIIGERMAN"
    THEN mode := asciigerman
  ELIF mode text = "FILEATARIST"
    THEN mode := atari st
  ELIF modetext = "FILEEBCDIC"
    THEN mode := ebcdic
  ELIF modetext = "FILETRANSPARENT"
    THEN mode := transparent
  ELIF mode text = "ROWTEXT"
    THEN mode := row text
  ELIF mode text = "DS"
    THEN mode := ds
   ELSE error stop ("Unzulssige Betriebsart")
  FI.

prepare modetext:
  change all (mode text, " ", "");
  INT VAR i;
  FOR i FROM 1 UPTO LENGTH mode text REP
    IF is lower case
      THEN replace (mode text, i, upper case char)
    FI
  PER.

is lower case:
  code (mode text SUB i) > 96 AND code (mode text SUB i) < 123.

upper case char:
  code (code (mode text SUB i) - 32).

END PROC disk reserve;

PROC disk free:
  disable stop;
  close action;
  close disk;
  reduce cluster buffer.

END PROC disk free;

PROC access disk:
  IF action closed COR (last access more than two seconds ago CAND disk changed)
    THEN open disk archive
  FI.

open disk archive:
  close action;
  open eu disk;
  open disk (mode extension);
  open action.

last access more than two seconds ago:
  abs (clock (1) - last access time) > 2.0.

END PROC access disk;

END PACKET disk manager;