disk.mod 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. MODULE disk;
  2. IMPORT Str,Window,biosfio,Lib,IO,FIO,Lib;
  3. TYPE chaine_octet = ARRAY[0..1] OF CHAR;
  4. t_disquette = RECORD
  5. unite : SHORTCARD;
  6. nbre_secteurs : SHORTCARD;
  7. nbre_pistes : SHORTCARD;
  8. END;
  9. t_domaine = (haut,bas);
  10. CONST fenetre1 = Window.WinDef(1,4,80,21,Window.White,Window.Black,FALSE,FALSE,
  11. FALSE,TRUE,Window.DoubleFrame,Window.White,
  12. Window.Black);
  13. fenetre2 = Window.WinDef(1,1,80,3,Window.White,Window.Black,FALSE,FALSE,
  14. FALSE,TRUE,Window.DoubleFrame,Window.White,
  15. Window.Black);
  16. fenetre3 = Window.WinDef(1,22,80,25,Window.White,Window.Black,TRUE,TRUE,
  17. FALSE,FALSE," ",Window.Black,
  18. Window.Black);
  19. un = " nombre-pistes : ";
  20. deux =" | nombre-secteurs : ";
  21. trois = " | unit‚ : ";
  22. VAR tampon : ARRAY[0..511] OF BYTE;
  23. i,x : SHORTCARD;
  24. piste,secteur,tete,
  25. drive : SHORTCARD;
  26. fen1,fen2,fen3 : Window.WinType;
  27. ascii : ARRAY[0..255] OF CHAR;
  28. j : CARDINAL;
  29. nom_de_fichier1,
  30. nom_de_fichier2,
  31. nom_de_fichier3 : ARRAY[0..20] OF CHAR;
  32. fichier1,
  33. fichier2,
  34. fichier3 : FIO.File;
  35. f1,f2,f3 : BOOLEAN;
  36. ma_disquette : t_disquette;
  37. titre : ARRAY[0..79] OF CHAR;
  38. car : CHAR;
  39. c1,c2,c3 : ARRAY[0..4] OF CHAR;
  40. ok : BOOLEAN;
  41. z : SHORTCARD;
  42. mon_domaine : t_domaine;
  43. ecran : Window.WinType;
  44. PROCEDURE octet_hexa(x : BYTE):chaine_octet;
  45. TYPE t_hexa = ARRAY[0..15] OF CHAR;
  46. CONST c_hexa = t_hexa('0123456789ABCDEF');
  47. VAR c : chaine_octet;
  48. y : CARDINAL;
  49. BEGIN
  50. c:= "";
  51. y := VAL(CARDINAL,x);
  52. Str.Concat(c,c_hexa[y DIV 16],c_hexa[y MOD 16]);
  53. RETURN c;
  54. END octet_hexa;
  55. PROCEDURE affiche_secteur(domaine : t_domaine);
  56. (* domaine indique quelle partie des 512 octets … afficher *)
  57. (* octets 0 … 255 ou octets 256 … 512 *)
  58. VAR a,b : CARDINAL;
  59. aa,bb: CARDINAL;
  60. BEGIN
  61. Window.Use(fen1);
  62. Window.Clear;
  63. IF domaine = haut THEN
  64. aa := 0;
  65. bb := 15;
  66. ELSE
  67. aa := 16;
  68. bb := 31;
  69. END;
  70. FOR a :=aa TO bb DO
  71. IO.WrChar(" ");
  72. IO.WrHex(a*16,4);
  73. IO.WrStr(" "+CHR(0B3H));
  74. FOR b := 0 TO 7 DO
  75. IO.WrStrAdj(octet_hexa(tampon[b+a*16]),3);
  76. END;
  77. IO.WrStr(" ");
  78. FOR b := 8 TO 15 DO
  79. IO.WrStrAdj(octet_hexa(tampon[b+a*16]),3);
  80. END;
  81. IO.WrStr(" "+CHR(0B3H)+" ");
  82. FOR b := 0 TO 15 DO
  83. IO.WrChar(ascii[ORD(tampon[b+a*16])]);
  84. END;
  85. IF a < bb THEN IO.WrLn END;
  86. END;
  87. END affiche_secteur;
  88. PROCEDURE message( d : ARRAY OF CHAR);
  89. BEGIN
  90. Window.Use(fen2);
  91. Window.Clear;
  92. IO.WrStr(d);
  93. END message;
  94. PROCEDURE teste_disquette( VAR d : t_disquette);
  95. VAR s,p,h : SHORTCARD;
  96. nbre_essai : CARDINAL;
  97. oui : BOOLEAN;
  98. BEGIN
  99. message("************************* test de la disquette ******************************");
  100. WITH d DO
  101. unite := 0; (* … modifier si lecteur <> A *)
  102. (* d‚termination du nombre de secteurs >= 1 *)
  103. s := 7;
  104. WHILE biosfio.lit_secteur (3,0,s,1,drive,tampon) = 0 DO
  105. INC(s)
  106. END;
  107. nbre_secteurs := s-1;
  108. h :=biosfio.reset();
  109. (* d‚termination du nombre de pistes >= 0 *)
  110. p := 35;
  111. WHILE biosfio.lit_secteur(p,0,1,1,drive,tampon) = 0 DO
  112. INC(p);
  113. END;
  114. nbre_pistes := p-1;
  115. END;
  116. h :=biosfio.reset();
  117. END teste_disquette;
  118. PROCEDURE bip();
  119. BEGIN
  120. Lib.Sound(440);
  121. Lib.Delay(100);
  122. Lib.NoSound;
  123. END bip;
  124. PROCEDURE init;
  125. BEGIN
  126. bip();
  127. Window.CursorOff;
  128. mon_domaine := haut;
  129. Lib.Fill(ADR(ascii),256,46);
  130. Lib.Fill(ADR(tampon),512,67);
  131. FOR j := 20H TO 255 DO
  132. ascii[j] := CHR(j)
  133. END;
  134. f1 := FALSE;
  135. f2 := FALSE;
  136. f3 := FALSE;
  137. piste := 0;
  138. secteur := 1;
  139. tete := 0;
  140. END init;
  141. PROCEDURE affichage;
  142. BEGIN
  143. fen1 := Window.Open(fenetre1);
  144. Window.CursorOff;
  145. fen2 := Window.Open(fenetre2);
  146. Window.CursorOff;
  147. Window.Use(fen2);
  148. Window.SetTitle(fen2," Eric Streit D‚cembre 91",Window.CenterUpperTitle);
  149. fen3 := Window.Open(fenetre3);
  150. Window.Use(fen3);
  151. Window.CursorOff;
  152. Window.GotoXY(1,22);
  153. IO.WrStr(" F1 : F2 : F3 : ");
  154. IO.WrLn;
  155. IO.WrStr(" [ : piste-1] [ : piste+1] [ : secteur-1] ["+CHR(26)+" : secteur+1] [ESC : Quitter]");
  156. IO.WrLn;
  157. IO.WrStr(" [Home : d‚but] [END : Fin ] [Tab : commute partie haute/basse] ");
  158. END affichage;
  159. PROCEDURE affiche_caracteristiques;
  160. BEGIN
  161. WITH ma_disquette DO
  162. Str.CardToStr(VAL(LONGCARD,nbre_pistes+1),c1,10,ok);
  163. Str.CardToStr(VAL(LONGCARD,nbre_secteurs),c2,10,ok);
  164. Str.Concat(titre,un,c1);
  165. Str.Concat(titre,titre,deux);
  166. Str.Concat(titre,titre,c2);
  167. Str.Concat(titre,titre,trois);
  168. Str.Concat(titre,titre,CHR(VAL(CARDINAL,drive)+ 65));
  169. END;
  170. Window.SetTitle(fen1,titre,Window.CenterUpperTitle);
  171. END affiche_caracteristiques;
  172. PROCEDURE fichiers;
  173. BEGIN
  174. message(" ******************** Entrez un nom de fichier *******************************");
  175. Window.Use(fen3);
  176. Window.CursorOn;
  177. Window.GotoXY(8,1);
  178. IO.RdStr(nom_de_fichier1);
  179. Window.GotoXY(33,1);
  180. IO.RdStr(nom_de_fichier2);
  181. Window.GotoXY(59,1);
  182. IO.RdStr(nom_de_fichier3);
  183. IF Str.Length(nom_de_fichier1) > 0 THEN
  184. fichier1 := FIO.Create(nom_de_fichier1);
  185. f1 := TRUE;
  186. END;
  187. IF Str.Length(nom_de_fichier2) > 0 THEN
  188. fichier2 := FIO.Create(nom_de_fichier2);
  189. f2 := TRUE;
  190. END;
  191. IF Str.Length(nom_de_fichier3) > 0 THEN
  192. fichier3 := FIO.Create(nom_de_fichier3);
  193. f3 := TRUE;
  194. END;
  195. Window.CursorOff;
  196. END fichiers;
  197. PROCEDURE affiche;
  198. BEGIN
  199. message(" Piste : Tˆte : Secteur : ");
  200. Window.GotoXY(10,1);
  201. IO.WrShtCard(piste,3);
  202. Window.GotoXY(24,1);
  203. IO.WrShtCard(tete,3);
  204. Window.GotoXY(40,1);
  205. IO.WrShtCard(secteur,3);
  206. affiche_secteur(mon_domaine);
  207. END affiche;
  208. PROCEDURE mon_lecteur_est_il_pret;
  209. CONST fenetre4 = Window.WinDef(10,10,70,15,Window.White,Window.Black,FALSE,FALSE,
  210. FALSE,TRUE,Window.DoubleFrame,Window.White,
  211. Window.Black);
  212. VAR fen4 :Window.WinType;
  213. BEGIN
  214. fen4 := Window.Open(fenetre4);
  215. IO.WrStr(" ASSUREZ-VOUS D'AVOIR BIEN LE LECTEUR A ANALYSER PRET !!! ");
  216. IO.WrLn;
  217. IO.WrLn;
  218. IO.WrStr(" Entrz le nom du lecteur ( une seule lettre ) : ");
  219. drive := VAL(SHORTCARD,ORD(CAP(IO.RdChar()))-65);
  220. Window.Close(fen4);
  221. END mon_lecteur_est_il_pret;
  222. BEGIN
  223. ecran := Window.Open(Window.FullScreenDef);
  224. Window.CursorOff;
  225. mon_lecteur_est_il_pret;
  226. affichage;
  227. init;
  228. teste_disquette(ma_disquette);
  229. affiche_caracteristiques;
  230. fichiers;
  231. Window.CursorOff;
  232. z := biosfio.lit_secteur(piste,tete,secteur,1,0,tampon);
  233. LOOP
  234. affiche;
  235. car := IO.RdKey();
  236. CASE car OF
  237. | CHR(27) : EXIT;
  238. | CHR(9) : IF mon_domaine = haut THEN
  239. mon_domaine := bas
  240. ELSE mon_domaine := haut;
  241. END;
  242. | CHR(0): car := IO.RdKey();
  243. CASE car OF
  244. | CHR(79) : tete := 1;
  245. piste := ma_disquette.nbre_pistes;
  246. secteur := ma_disquette.nbre_secteurs;
  247. z := biosfio.lit_secteur(piste,tete,secteur,1,0,tampon);
  248. | CHR(71) : tete := 0;
  249. piste :=0;
  250. secteur := 1;
  251. z := biosfio.lit_secteur(piste,tete,secteur,1,0,tampon);
  252. | CHR(72) : IF piste > 0 THEN DEC(piste);
  253. z := biosfio.lit_secteur(piste,tete,secteur,1,0,tampon);
  254. ELSE bip();
  255. END;
  256. | CHR(80) : IF piste < ma_disquette.nbre_pistes THEN
  257. INC(piste);
  258. z := biosfio.lit_secteur(piste,tete,secteur,1,0,tampon);
  259. ELSE bip();
  260. END;
  261. | CHR(59) : IF f1 THEN FIO.WrBin(fichier1,tampon,512) END;
  262. | CHR(60) : IF f2 THEN FIO.WrBin(fichier2,tampon,512) END;
  263. | CHR(61) : IF f3 THEN FIO.WrBin(fichier3,tampon,512) END;
  264. | CHR(75) : IF secteur > 1 THEN DEC(secteur)
  265. ELSIF tete = 1 THEN
  266. tete := 0;
  267. secteur := ma_disquette.nbre_secteurs;
  268. ELSIF piste > 0 THEN
  269. DEC(piste);
  270. tete := 1;
  271. secteur := ma_disquette.nbre_secteurs;
  272. ELSE bip();
  273. END;
  274. z := biosfio.lit_secteur(piste,tete,secteur,1,0,tampon);
  275. mon_domaine := haut;
  276. | CHR(77) : IF secteur < ma_disquette.nbre_secteurs THEN
  277. INC(secteur)
  278. ELSIF tete = 0 THEN
  279. tete := 1;
  280. secteur := 1;
  281. ELSIF piste < ma_disquette.nbre_pistes THEN
  282. INC(piste);
  283. tete := 0;
  284. secteur := 1;
  285. ELSE bip();
  286. END;
  287. z := biosfio.lit_secteur(piste,tete,secteur,1,0,tampon);
  288. mon_domaine := haut;
  289. END;
  290. END;
  291. END; (* LOOP *)
  292. IF f1 THEN FIO.Close(fichier1) END;
  293. IF f2 THEN FIO.Close(fichier2) END;
  294. IF f3 THEN FIO.Close(fichier3) END;
  295. Window.Close(ecran);
  296. END disk.