home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / MM2SERIA.M < prev    next >
Encoding:
Text File  |  1994-04-05  |  10.1 KB  |  3 lines

  1. ⓪ MODULE MM2Serialize;
  2. ⓪ 
  3. ⓪ (*    =======================================
  4. ⓪'Vertraulich! Keinesfalls weitergeben!
  5. ⓪&=======================================
  6. ⓪ 
  7. ⓪&Seriennummern im Compiler eintragen
  8. ⓪(
  9. ⓪&17.11.87  jm   /0.0/  Suchen der Seriennummern
  10. ⓪&15.12.87  jm   /1.0/  lauffähige Version
  11. ⓪&29.02.88  jm   /1.1/  neues Schlüsselverfahren mit Offset
  12. ⓪&??.??.89  TT   /1.2/  wählt beliebig viele Dateien mit Selektor aus
  13. ⓪&08.03.90  TT   /1.3/  ForceMediaChange-Aufruf
  14. ⓪=>>> Bringt aber nichts bei Cache-Prg, weil
  15. ⓪Adas offenbar nichts davon mitbekommt
  16. ⓪ *)
  17. ⓪ 
  18. ⓪ IMPORT GEMDOSIO; (*$E MOS*)
  19. ⓪ 
  20. ⓪ FROM SYSTEM IMPORT ASSEMBLER;
  21. ⓪ 
  22. ⓪ FROM Files   IMPORT File, Open, Create, Close, Remove, State,
  23. ⓪4Access, ReplaceMode;
  24. ⓪ FROM MOSGlobals IMPORT Drive;
  25. ⓪ FROM FileNames IMPORT StrToDrive;
  26. ⓪ FROM Directory IMPORT ForceMediaChange;
  27. ⓪ FROM Binary  IMPORT SeekMode, Seek, ReadBytes, ReadWord, WriteWord, FileSize;
  28. ⓪ FROM PathCtrl IMPORT PathList;
  29. ⓪ FROM ShellMsg IMPORT StdPaths;
  30. ⓪ FROM Paths   IMPORT SearchFile, ListPos;
  31. ⓪ FROM InOut   IMPORT WriteString, WriteLn, Read, WriteCard, ReadCard, WriteHex,
  32. ⓪4WritePg;
  33. ⓪ FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  34. ⓪ FROM Strings IMPORT Concat;
  35. ⓪ FROM StrConv IMPORT CardToStr;
  36. ⓪ FROM SYSTEM  IMPORT ADDRESS;
  37. ⓪ FROM PrgCtrl IMPORT TermProcess;
  38. ⓪ 
  39. ⓪ FROM GEMEnv   IMPORT RC, DeviceHandle, InitGem;
  40. ⓪ FROM EasyGEM0 IMPORT HideMouse;
  41. ⓪ FROM EasyGEM1 IMPORT SelectMask, SelectFile;
  42. ⓪ 
  43. ⓪ 
  44. ⓪ 
  45. ⓪ CONST     NrKeys = 2;                 (* Anzahl verschiedener Schlüssel *)
  46. ⓪*NrMods = 2;                 (* Anzahl der Module mit Schlüsseln *)
  47. ⓪(maxCount = 10;                (* max. Anzahl Referenzen pro Nummer *)
  48. ⓪ 
  49. ⓪ TYPE     PosList = ARRAY [1..maxCount] OF LONGCARD;
  50. ⓪ 
  51. ⓪ VAR
  52. ⓪,value,                    (* Werte der Default-Seriennummern *)
  53. ⓪-lead,                    (* LeadIn-Worte   -"-              *)
  54. ⓪)expCount,                    (* erwartete Anzahl der Vorkommen  *)
  55. ⓪,patch: ARRAY [0..NrKeys] OF CARDINAL;
  56. ⓪*offsets: ARRAY [1..NrMods] OF ARRAY [0..NrKeys] OF PosList;
  57. ⓪ 
  58. ⓪-Offs,
  59. ⓪+RegLen,
  60. ⓪)FeedBack,
  61. ⓪*Iterate: ARRAY [1..NrKeys] OF CARDINAL;
  62. ⓪ 
  63. ⓪)compname: ARRAY [1..NrMods] OF ARRAY [0..141] OF CHAR;
  64. ⓪/ok: BOOLEAN;
  65. ⓪ 
  66. ⓪ 
  67. ⓪ PROCEDURE err (s: ARRAY OF CHAR; fatal: BOOLEAN);
  68. ⓪"VAR c: CHAR;
  69. ⓪"BEGIN
  70. ⓪$WriteLn; WriteString ('>> '); WriteString (s); WriteLn;
  71. ⓪$IF fatal THEN
  72. ⓪&Read (c); TermProcess (1);
  73. ⓪$END
  74. ⓪"END err;
  75. ⓪"
  76. ⓪ 
  77. ⓪ PROCEDURE ReadCompiler (VAR a: ADDRESS; VAR size: LONGCARD;
  78. ⓪9name: ARRAY OF CHAR): BOOLEAN;
  79. ⓪"
  80. ⓪"(* Sucht Datei <name> auf DefaultPath,
  81. ⓪%reserviert Speicher und liest Datei ein.
  82. ⓪%<a>    := Anfangsadresse der Datei im Speicher;
  83. ⓪%<size> := Länge  -"- .
  84. ⓪%Ergebnis := 'Datei gefunden, genug Platz zum Einlesen gehabt'
  85. ⓪"*)
  86. ⓪"
  87. ⓪"VAR         f: File;
  88. ⓪+read: LONGCARD;
  89. ⓪ 
  90. ⓪"BEGIN
  91. ⓪$Open (f, name, readOnly);
  92. ⓪$size := FileSize (f);
  93. ⓪$ALLOCATE (a, size);
  94. ⓪$IF a = NIL THEN RETURN FALSE END;
  95. ⓪$ReadBytes (f, a, size, read);
  96. ⓪$IF size # read THEN RETURN FALSE END;
  97. ⓪$Close (f);
  98. ⓪$RETURN TRUE
  99. ⓪"END ReadCompiler;
  100. ⓪ 
  101. ⓪ 
  102. ⓪ PROCEDURE Search (        a: ADDRESS; len: LONGCARD; targ1, targ2: CARDINAL;
  103. ⓪2VAR count: CARDINAL;
  104. ⓪4VAR pos: PosList);
  105. ⓪"BEGIN
  106. ⓪$ASSEMBLER
  107. ⓪&MOVE.L   pos(A6),A1
  108. ⓪&CLR.W    D3
  109. ⓪&MOVE.L   a(A6),A0
  110. ⓪&MOVE.L   len(A6),D1
  111. ⓪&MOVE.W   targ1(A6),D0
  112. ⓪&MOVE.W   targ2(A6),D4
  113. ⓪#
  114. ⓪#lp CMP.W    (A0)+,D0         ;Suchschleife
  115. ⓪&BNE      nix
  116. ⓪&CMP.W    (A0),D4
  117. ⓪&BNE      nix
  118. ⓪&MOVE.L   A0,D2
  119. ⓪&SUB.L    a(A6),D2
  120. ⓪&MOVE.L   D2,(A1)+
  121. ⓪&ADDQ.L   #1,D3
  122. ⓪"nix SUBQ.L   #2,D1
  123. ⓪&BHI      lp
  124. ⓪&
  125. ⓪&MOVE.L   count(A6),A0
  126. ⓪&MOVE.W   D3,(A0)          ;setze Count
  127. ⓪$END
  128. ⓪"END Search;
  129. ⓪ 
  130. ⓪ 
  131. ⓪ PROCEDURE FindOffsets;
  132. ⓪"
  133. ⓪"(*  Liest alle Dateien <compname>.
  134. ⓪&Durchsucht sie nach Auftreten von <lead>, <value> und prüft
  135. ⓪&jeweils, ob <expcount> Vorkommen gefunden. Wenn gefunden, wird
  136. ⓪&der jew. Offset im entspr. File in 'offsets' vermerkt.
  137. ⓪&Bricht im Fehlerfall mit Meldung ab.
  138. ⓪"*)
  139. ⓪&
  140. ⓪"VAR          a: ARRAY [1..NrMods] OF ADDRESS;
  141. ⓪/l: ARRAY [1..NrMods] OF LONGCARD;
  142. ⓪.wl: LONGCARD;
  143. ⓪-ofs: PosList;
  144. ⓪"count, n, i, k: CARDINAL;
  145. ⓪*errmsg: ARRAY [0..127] OF CHAR;
  146. ⓪+dummy: BOOLEAN;
  147. ⓪"
  148. ⓪"BEGIN
  149. ⓪$wl:= 0;
  150. ⓪$FOR n:= 1 TO NrMods DO
  151. ⓪&IF NOT ReadCompiler (a [n], l [n], compname [n]) THEN
  152. ⓪(err ('Compiler kann nicht gelesen werden!', TRUE)
  153. ⓪&END;
  154. ⓪&INC (wl, l [n]);
  155. ⓪&FOR k:= 0 TO NrKeys DO
  156. ⓪(FOR i:= 1 TO expCount [k] DO offsets [n, k, i]:= 0 END
  157. ⓪&END;
  158. ⓪$END;
  159. ⓪$FOR k:= 0 TO NrKeys DO
  160. ⓪&Search (a [1], wl, lead [k], value [k], count, ofs);
  161. ⓪&IF count # expCount [k] THEN
  162. ⓪(Concat ('Falsche Anzahl Schlüsseleinträge: ',
  163. ⓪1CardToStr (count, 0), errmsg, dummy);
  164. ⓪(err (errmsg, TRUE)
  165. ⓪&END;
  166. ⓪&FOR i:= 1 TO expCount [k] DO
  167. ⓪(FOR n:= 1 TO NrMods DO
  168. ⓪*IF (ofs[i] >= a[n] - a[1]) & (ofs[i] < a[n] - a[1] + l[n]) THEN
  169. ⓪,offsets [n, k, i]:= ofs[i] - (a[n] - a[1])
  170. ⓪*END
  171. ⓪(END
  172. ⓪&END
  173. ⓪$END;
  174. ⓪$count:= 0;
  175. ⓪$FOR n:= 1 TO NrMods DO
  176. ⓪&FOR k:= 0 TO NrKeys DO
  177. ⓪(FOR i:= 1 TO expCount [k] DO
  178. ⓪*IF offsets [n, k, i] = 0L THEN INC (count) END;
  179. ⓪(END
  180. ⓪&END;
  181. ⓪&DEALLOCATE (a [n], l [n]);
  182. ⓪$END;
  183. ⓪$n:= 0;
  184. ⓪$FOR k:= 0 TO NrKeys DO
  185. ⓪&INC (n, expCount [k])
  186. ⓪$END;
  187. ⓪$IF count # n THEN
  188. ⓪&err ('Interner Fehler: Schlüsselanzahl falsch.', TRUE)
  189. ⓪$END
  190. ⓪"END FindOffsets;
  191. ⓪"
  192. ⓪"
  193. ⓪ PROCEDURE encode (start, len, feedback, iter, off: CARDINAL): CARDINAL; (*$L-*)
  194. ⓪$
  195. ⓪"(* Schieberegister rechtsrum, Bits 0..<len>,
  196. ⓪%Rückkopplung aus Bit <feedback>, auf <start>-Wert loslassen.
  197. ⓪%<iter> Iterationen durchführen; <Off> addieren;
  198. ⓪%Ergebnis auf Cardinal kürzen
  199. ⓪"*)
  200. ⓪"
  201. ⓪"BEGIN
  202. ⓪$ASSEMBLER
  203. ⓪&MOVE.W  -(A3),D3        ;Offset
  204. ⓪&MOVE.W  -(A3),D2        ;Iterationen
  205. ⓪&MOVE.W  -(A3),D0        ;rückgeführtes Bit
  206. ⓪&MOVE.W  -(A3),D4        ;Registerlänge -1
  207. ⓪&CLR.L   D1
  208. ⓪&MOVE.W  -(A3),D1        ;Startwert
  209. ⓪&BRA     l1
  210. ⓪#l2 BTST    D0,D1           ;Bit0 := Bit0 EOR Bit(D0)
  211. ⓪&BEQ     nochg           ; "
  212. ⓪&BCHG    #0,D1           ; "
  213. ⓪ nochg LSR.L   #1,D1           ;einmal rechts schieben
  214. ⓪&BCC     l1              ;und Bit0 in Bit(D4) rotieren
  215. ⓪&BSET    D4,D1
  216. ⓪#l1 DBF     D2,l2
  217. ⓪&ADD.W   D3,D1           ;Offset dazu
  218. ⓪&MOVE.W  D1,(A3)+        ;Ergebnis zurück
  219. ⓪$END
  220. ⓪"END encode;         (*$L+*)
  221. ⓪"
  222. ⓪"
  223. ⓪ PROCEDURE CheckSer;
  224. ⓪!
  225. ⓪#(* prüft, ob die angegebenen Schlüsselverfahren konsistent
  226. ⓪&sind mit den angegebenen Default-Einträgen.
  227. ⓪&Im Fehlerfall Abbruch mit Meldung.
  228. ⓪#*)
  229. ⓪#
  230. ⓪#VAR  k: CARDINAL;
  231. ⓪#
  232. ⓪#BEGIN
  233. ⓪%FOR k := 1 TO NrKeys DO
  234. ⓪'IF encode (value[0], RegLen[k], FeedBack[k], Iterate[k], Offs[k])
  235. ⓪*# value [k]
  236. ⓪)THEN err ('Schlüsselverfahren paßt nicht zu Default-Einträgen', TRUE)
  237. ⓪'END
  238. ⓪%END
  239. ⓪#END CheckSer;
  240. ⓪#
  241. ⓪ 
  242. ⓪ PROCEDURE CalcSer (mySer: CARDINAL);
  243. ⓪"
  244. ⓪"(* Übergabe der Seriennummer in <mySer>.
  245. ⓪%Setzt ARRAY <patch> auf verschlüsselte Seriennummern.
  246. ⓪%Verwendet Beschreibung der Schlüsselverfahren in
  247. ⓪%<RegLen>, <FeedBack>, <Iterate>.           *)
  248. ⓪"
  249. ⓪"VAR  k: CARDINAL;
  250. ⓪"
  251. ⓪"BEGIN
  252. ⓪$patch [0] := mySer;
  253. ⓪$WriteString ('   Schlüssel'); WriteHex (patch [0], 7);
  254. ⓪$FOR k := 1 TO NrKeys DO
  255. ⓪&patch [k] :=
  256. ⓪-encode (mySer, RegLen[k], FeedBack[k], Iterate[k], Offs [k]);
  257. ⓪&WriteHex (patch[k], 7);
  258. ⓪$END;
  259. ⓪$WriteLn;
  260. ⓪"END CalcSer;
  261. ⓪"
  262. ⓪"
  263. ⓪ PROCEDURE OpenFile (VAR f: File; name: ARRAY OF CHAR): BOOLEAN;
  264. ⓪"
  265. ⓪"(* reserviert Speicher und liest Datei ein.
  266. ⓪%<a>    := Anfangsadresse der Datei im Speicher;
  267. ⓪%<size> := Länge  -"- .
  268. ⓪%Ergebnis := 'Datei gefunden, genug Platz zum Einlesen gehabt'
  269. ⓪"*)
  270. ⓪ 
  271. ⓪"BEGIN
  272. ⓪$Open (f, name, readWrite);
  273. ⓪$IF State (f) < 0 THEN
  274. ⓪&err ('Datei nicht gefunden', FALSE); RETURN FALSE
  275. ⓪$END;
  276. ⓪$RETURN TRUE
  277. ⓪"END OpenFile;
  278. ⓪ 
  279. ⓪ 
  280. ⓪ PROCEDURE PatchSerial (mySer: CARDINAL): BOOLEAN;
  281. ⓪"
  282. ⓪"VAR  j, k, n: CARDINAL;
  283. ⓪*f: File;
  284. ⓪*w: CARDINAL;
  285. ⓪*
  286. ⓪"BEGIN
  287. ⓪$CalcSer (mySer);
  288. ⓪$FOR n:= 1 TO NrMods DO
  289. ⓪&IF NOT OpenFile (f, compname [n]) THEN
  290. ⓪(RETURN FALSE
  291. ⓪&END;
  292. ⓪&FOR j:= 0 TO NrKeys DO
  293. ⓪(FOR k:= 1 TO expCount [j] DO
  294. ⓪*IF offsets [n, j, k] # 0L THEN
  295. ⓪,Seek (f, offsets [n, j, k], fromBegin);
  296. ⓪,ReadWord (f, w);
  297. ⓪,IF w # value [j] THEN
  298. ⓪.IF (j=0) & (k=1) THEN
  299. ⓪0err ('Falsche Seriennummern gefunden: Datei unverändert', FALSE);
  300. ⓪0Close (f);
  301. ⓪.ELSE
  302. ⓪0err ('Falsche Seriennummern gefunden: Datei gelöscht', FALSE);
  303. ⓪0Remove (f);
  304. ⓪.END;
  305. ⓪.RETURN FALSE
  306. ⓪,END;
  307. ⓪,Seek (f, -2L, fromPos);
  308. ⓪,WriteWord (f, patch [j])
  309. ⓪*END
  310. ⓪(END
  311. ⓪&END;
  312. ⓪&Close (f);
  313. ⓪$END;
  314. ⓪$RETURN TRUE
  315. ⓪"END PatchSerial;
  316. ⓪"
  317. ⓪"
  318. ⓪ VAR   n, mySer: CARDINAL;
  319. ⓪-c: CHAR;
  320. ⓪,dh: DeviceHandle;
  321. ⓪ 
  322. ⓪ BEGIN
  323. ⓪"
  324. ⓪"InitGem (RC, dh, ok);
  325. ⓪"
  326. ⓪"HideMouse;
  327. ⓪"WritePg;
  328. ⓪"
  329. ⓪"(* Konstanten für Schlüssel *)
  330. ⓪"
  331. ⓪"RegLen [1] := 17; FeedBack [1] := 7; Iterate [1] :=  39; Offs [1] := $2302;
  332. ⓪"RegLen [2] := 16; FeedBack [2] := 3; Iterate [2] := 367; Offs [2] := $3C78;
  333. ⓪#
  334. ⓪"(* Default-Seriennummern im Compiler *)
  335. ⓪"
  336. ⓪"value [0] := $4711;  expCount [0] := 3;  lead [0] := $0641;
  337. ⓪"value [1] := $1ADE;  expCount [1] := 1;  lead [1] := $343C;
  338. ⓪"value [2] := $312F;  expCount [2] := 1;  lead [2] := $0240;
  339. ⓪"
  340. ⓪"(* Seriennummern im Compiler suchen *)
  341. ⓪"
  342. ⓪"WriteString ('Serialize /1.3/:  Seriennummern in Compiler eintragen ');
  343. ⓪"WriteLn; WriteLn;
  344. ⓪"
  345. ⓪"(*
  346. ⓪"WriteString ('Achtung: Bei TOS 1.4ff kein Cache-Prg verwenden!');
  347. ⓪"WriteLn; WriteLn;
  348. ⓪"*)
  349. ⓪"
  350. ⓪"WriteString ('Konsistenzprüfung der angegebenen Schlüssel:'); WriteLn;
  351. ⓪"CheckSer;
  352. ⓪"WriteString ('   ok.'); WriteLn; WriteLn;
  353. ⓪"
  354. ⓪"FOR n:= 1 TO NrMods DO
  355. ⓪$SelectFile ('Wo isser?', compname [n], ok);
  356. ⓪$IF NOT ok THEN RETURN END;
  357. ⓪$WritePg;
  358. ⓪"END;
  359. ⓪"
  360. ⓪"WriteString ('Suchen der Seriennummern:'); WriteLn;
  361. ⓪"
  362. ⓪"FindOffsets;
  363. ⓪"WriteString ('   ok.'); WriteLn; WriteLn;
  364. ⓪"
  365. ⓪"(* neue Seriennummern eintragen *)
  366. ⓪"
  367. ⓪"LOOP
  368. ⓪$WriteString ('Neue Seriennummer eintragen:'); WriteLn;
  369. ⓪$WriteString ('   Nummer eingeben (0 stoppt): ');
  370. ⓪$ReadCard (mySer);
  371. ⓪$IF mySer = 0 THEN EXIT END;
  372. ⓪$
  373. ⓪$ForceMediaChange (StrToDrive (compname[1]));
  374. ⓪$IF PatchSerial (mySer) THEN
  375. ⓪&WriteString ('   ok.'); WriteLn;
  376. ⓪$END;
  377. ⓪$WriteLn;
  378. ⓪"END;
  379. ⓪"
  380. ⓪ END MM2Serialize.
  381. ⓪ ə
  382. (* $FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$000022E2$FFEDDD92$000025CB$FFEDDD92$00000C2C$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92ü$000022E2T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00000275$00000268$00000272$0000024F$0000023D$00002285$000022E2$00000396$FFD6B137$FFD6B137$000003AA$000003CF$000003B9$000003CB$000003E3$00000C2C£Çé*)
  383.