home *** CD-ROM | disk | FTP | other *** search
- ⓪ MODULE MM2Serialize;
- ⓪
- ⓪ (* =======================================
- ⓪'Vertraulich! Keinesfalls weitergeben!
- ⓪&=======================================
- ⓪
- ⓪&Seriennummern im Compiler eintragen
- ⓪(
- ⓪&17.11.87 jm /0.0/ Suchen der Seriennummern
- ⓪&15.12.87 jm /1.0/ lauffähige Version
- ⓪&29.02.88 jm /1.1/ neues Schlüsselverfahren mit Offset
- ⓪&??.??.89 TT /1.2/ wählt beliebig viele Dateien mit Selektor aus
- ⓪&08.03.90 TT /1.3/ ForceMediaChange-Aufruf
- ⓪=>>> Bringt aber nichts bei Cache-Prg, weil
- ⓪Adas offenbar nichts davon mitbekommt
- ⓪ *)
- ⓪
- ⓪ IMPORT GEMDOSIO; (*$E MOS*)
- ⓪
- ⓪ FROM SYSTEM IMPORT ASSEMBLER;
- ⓪
- ⓪ FROM Files IMPORT File, Open, Create, Close, Remove, State,
- ⓪4Access, ReplaceMode;
- ⓪ FROM MOSGlobals IMPORT Drive;
- ⓪ FROM FileNames IMPORT StrToDrive;
- ⓪ FROM Directory IMPORT ForceMediaChange;
- ⓪ FROM Binary IMPORT SeekMode, Seek, ReadBytes, ReadWord, WriteWord, FileSize;
- ⓪ FROM PathCtrl IMPORT PathList;
- ⓪ FROM ShellMsg IMPORT StdPaths;
- ⓪ FROM Paths IMPORT SearchFile, ListPos;
- ⓪ FROM InOut IMPORT WriteString, WriteLn, Read, WriteCard, ReadCard, WriteHex,
- ⓪4WritePg;
- ⓪ FROM Storage IMPORT ALLOCATE, DEALLOCATE;
- ⓪ FROM Strings IMPORT Concat;
- ⓪ FROM StrConv IMPORT CardToStr;
- ⓪ FROM SYSTEM IMPORT ADDRESS;
- ⓪ FROM PrgCtrl IMPORT TermProcess;
- ⓪
- ⓪ FROM GEMEnv IMPORT RC, DeviceHandle, InitGem;
- ⓪ FROM EasyGEM0 IMPORT HideMouse;
- ⓪ FROM EasyGEM1 IMPORT SelectMask, SelectFile;
- ⓪
- ⓪
- ⓪
- ⓪ CONST NrKeys = 2; (* Anzahl verschiedener Schlüssel *)
- ⓪*NrMods = 2; (* Anzahl der Module mit Schlüsseln *)
- ⓪(maxCount = 10; (* max. Anzahl Referenzen pro Nummer *)
- ⓪
- ⓪ TYPE PosList = ARRAY [1..maxCount] OF LONGCARD;
- ⓪
- ⓪ VAR
- ⓪,value, (* Werte der Default-Seriennummern *)
- ⓪-lead, (* LeadIn-Worte -"- *)
- ⓪)expCount, (* erwartete Anzahl der Vorkommen *)
- ⓪,patch: ARRAY [0..NrKeys] OF CARDINAL;
- ⓪*offsets: ARRAY [1..NrMods] OF ARRAY [0..NrKeys] OF PosList;
- ⓪
- ⓪-Offs,
- ⓪+RegLen,
- ⓪)FeedBack,
- ⓪*Iterate: ARRAY [1..NrKeys] OF CARDINAL;
- ⓪
- ⓪)compname: ARRAY [1..NrMods] OF ARRAY [0..141] OF CHAR;
- ⓪/ok: BOOLEAN;
- ⓪
- ⓪
- ⓪ PROCEDURE err (s: ARRAY OF CHAR; fatal: BOOLEAN);
- ⓪"VAR c: CHAR;
- ⓪"BEGIN
- ⓪$WriteLn; WriteString ('>> '); WriteString (s); WriteLn;
- ⓪$IF fatal THEN
- ⓪&Read (c); TermProcess (1);
- ⓪$END
- ⓪"END err;
- ⓪"
- ⓪
- ⓪ PROCEDURE ReadCompiler (VAR a: ADDRESS; VAR size: LONGCARD;
- ⓪9name: ARRAY OF CHAR): BOOLEAN;
- ⓪"
- ⓪"(* Sucht Datei <name> auf DefaultPath,
- ⓪%reserviert Speicher und liest Datei ein.
- ⓪%<a> := Anfangsadresse der Datei im Speicher;
- ⓪%<size> := Länge -"- .
- ⓪%Ergebnis := 'Datei gefunden, genug Platz zum Einlesen gehabt'
- ⓪"*)
- ⓪"
- ⓪"VAR f: File;
- ⓪+read: LONGCARD;
- ⓪
- ⓪"BEGIN
- ⓪$Open (f, name, readOnly);
- ⓪$size := FileSize (f);
- ⓪$ALLOCATE (a, size);
- ⓪$IF a = NIL THEN RETURN FALSE END;
- ⓪$ReadBytes (f, a, size, read);
- ⓪$IF size # read THEN RETURN FALSE END;
- ⓪$Close (f);
- ⓪$RETURN TRUE
- ⓪"END ReadCompiler;
- ⓪
- ⓪
- ⓪ PROCEDURE Search ( a: ADDRESS; len: LONGCARD; targ1, targ2: CARDINAL;
- ⓪2VAR count: CARDINAL;
- ⓪4VAR pos: PosList);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪&MOVE.L pos(A6),A1
- ⓪&CLR.W D3
- ⓪&MOVE.L a(A6),A0
- ⓪&MOVE.L len(A6),D1
- ⓪&MOVE.W targ1(A6),D0
- ⓪&MOVE.W targ2(A6),D4
- ⓪#
- ⓪#lp CMP.W (A0)+,D0 ;Suchschleife
- ⓪&BNE nix
- ⓪&CMP.W (A0),D4
- ⓪&BNE nix
- ⓪&MOVE.L A0,D2
- ⓪&SUB.L a(A6),D2
- ⓪&MOVE.L D2,(A1)+
- ⓪&ADDQ.L #1,D3
- ⓪"nix SUBQ.L #2,D1
- ⓪&BHI lp
- ⓪&
- ⓪&MOVE.L count(A6),A0
- ⓪&MOVE.W D3,(A0) ;setze Count
- ⓪$END
- ⓪"END Search;
- ⓪
- ⓪
- ⓪ PROCEDURE FindOffsets;
- ⓪"
- ⓪"(* Liest alle Dateien <compname>.
- ⓪&Durchsucht sie nach Auftreten von <lead>, <value> und prüft
- ⓪&jeweils, ob <expcount> Vorkommen gefunden. Wenn gefunden, wird
- ⓪&der jew. Offset im entspr. File in 'offsets' vermerkt.
- ⓪&Bricht im Fehlerfall mit Meldung ab.
- ⓪"*)
- ⓪&
- ⓪"VAR a: ARRAY [1..NrMods] OF ADDRESS;
- ⓪/l: ARRAY [1..NrMods] OF LONGCARD;
- ⓪.wl: LONGCARD;
- ⓪-ofs: PosList;
- ⓪"count, n, i, k: CARDINAL;
- ⓪*errmsg: ARRAY [0..127] OF CHAR;
- ⓪+dummy: BOOLEAN;
- ⓪"
- ⓪"BEGIN
- ⓪$wl:= 0;
- ⓪$FOR n:= 1 TO NrMods DO
- ⓪&IF NOT ReadCompiler (a [n], l [n], compname [n]) THEN
- ⓪(err ('Compiler kann nicht gelesen werden!', TRUE)
- ⓪&END;
- ⓪&INC (wl, l [n]);
- ⓪&FOR k:= 0 TO NrKeys DO
- ⓪(FOR i:= 1 TO expCount [k] DO offsets [n, k, i]:= 0 END
- ⓪&END;
- ⓪$END;
- ⓪$FOR k:= 0 TO NrKeys DO
- ⓪&Search (a [1], wl, lead [k], value [k], count, ofs);
- ⓪&IF count # expCount [k] THEN
- ⓪(Concat ('Falsche Anzahl Schlüsseleinträge: ',
- ⓪1CardToStr (count, 0), errmsg, dummy);
- ⓪(err (errmsg, TRUE)
- ⓪&END;
- ⓪&FOR i:= 1 TO expCount [k] DO
- ⓪(FOR n:= 1 TO NrMods DO
- ⓪*IF (ofs[i] >= a[n] - a[1]) & (ofs[i] < a[n] - a[1] + l[n]) THEN
- ⓪,offsets [n, k, i]:= ofs[i] - (a[n] - a[1])
- ⓪*END
- ⓪(END
- ⓪&END
- ⓪$END;
- ⓪$count:= 0;
- ⓪$FOR n:= 1 TO NrMods DO
- ⓪&FOR k:= 0 TO NrKeys DO
- ⓪(FOR i:= 1 TO expCount [k] DO
- ⓪*IF offsets [n, k, i] = 0L THEN INC (count) END;
- ⓪(END
- ⓪&END;
- ⓪&DEALLOCATE (a [n], l [n]);
- ⓪$END;
- ⓪$n:= 0;
- ⓪$FOR k:= 0 TO NrKeys DO
- ⓪&INC (n, expCount [k])
- ⓪$END;
- ⓪$IF count # n THEN
- ⓪&err ('Interner Fehler: Schlüsselanzahl falsch.', TRUE)
- ⓪$END
- ⓪"END FindOffsets;
- ⓪"
- ⓪"
- ⓪ PROCEDURE encode (start, len, feedback, iter, off: CARDINAL): CARDINAL; (*$L-*)
- ⓪$
- ⓪"(* Schieberegister rechtsrum, Bits 0..<len>,
- ⓪%Rückkopplung aus Bit <feedback>, auf <start>-Wert loslassen.
- ⓪%<iter> Iterationen durchführen; <Off> addieren;
- ⓪%Ergebnis auf Cardinal kürzen
- ⓪"*)
- ⓪"
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪&MOVE.W -(A3),D3 ;Offset
- ⓪&MOVE.W -(A3),D2 ;Iterationen
- ⓪&MOVE.W -(A3),D0 ;rückgeführtes Bit
- ⓪&MOVE.W -(A3),D4 ;Registerlänge -1
- ⓪&CLR.L D1
- ⓪&MOVE.W -(A3),D1 ;Startwert
- ⓪&BRA l1
- ⓪#l2 BTST D0,D1 ;Bit0 := Bit0 EOR Bit(D0)
- ⓪&BEQ nochg ; "
- ⓪&BCHG #0,D1 ; "
- ⓪ nochg LSR.L #1,D1 ;einmal rechts schieben
- ⓪&BCC l1 ;und Bit0 in Bit(D4) rotieren
- ⓪&BSET D4,D1
- ⓪#l1 DBF D2,l2
- ⓪&ADD.W D3,D1 ;Offset dazu
- ⓪&MOVE.W D1,(A3)+ ;Ergebnis zurück
- ⓪$END
- ⓪"END encode; (*$L+*)
- ⓪"
- ⓪"
- ⓪ PROCEDURE CheckSer;
- ⓪!
- ⓪#(* prüft, ob die angegebenen Schlüsselverfahren konsistent
- ⓪&sind mit den angegebenen Default-Einträgen.
- ⓪&Im Fehlerfall Abbruch mit Meldung.
- ⓪#*)
- ⓪#
- ⓪#VAR k: CARDINAL;
- ⓪#
- ⓪#BEGIN
- ⓪%FOR k := 1 TO NrKeys DO
- ⓪'IF encode (value[0], RegLen[k], FeedBack[k], Iterate[k], Offs[k])
- ⓪*# value [k]
- ⓪)THEN err ('Schlüsselverfahren paßt nicht zu Default-Einträgen', TRUE)
- ⓪'END
- ⓪%END
- ⓪#END CheckSer;
- ⓪#
- ⓪
- ⓪ PROCEDURE CalcSer (mySer: CARDINAL);
- ⓪"
- ⓪"(* Übergabe der Seriennummer in <mySer>.
- ⓪%Setzt ARRAY <patch> auf verschlüsselte Seriennummern.
- ⓪%Verwendet Beschreibung der Schlüsselverfahren in
- ⓪%<RegLen>, <FeedBack>, <Iterate>. *)
- ⓪"
- ⓪"VAR k: CARDINAL;
- ⓪"
- ⓪"BEGIN
- ⓪$patch [0] := mySer;
- ⓪$WriteString (' Schlüssel'); WriteHex (patch [0], 7);
- ⓪$FOR k := 1 TO NrKeys DO
- ⓪&patch [k] :=
- ⓪-encode (mySer, RegLen[k], FeedBack[k], Iterate[k], Offs [k]);
- ⓪&WriteHex (patch[k], 7);
- ⓪$END;
- ⓪$WriteLn;
- ⓪"END CalcSer;
- ⓪"
- ⓪"
- ⓪ PROCEDURE OpenFile (VAR f: File; name: ARRAY OF CHAR): BOOLEAN;
- ⓪"
- ⓪"(* reserviert Speicher und liest Datei ein.
- ⓪%<a> := Anfangsadresse der Datei im Speicher;
- ⓪%<size> := Länge -"- .
- ⓪%Ergebnis := 'Datei gefunden, genug Platz zum Einlesen gehabt'
- ⓪"*)
- ⓪
- ⓪"BEGIN
- ⓪$Open (f, name, readWrite);
- ⓪$IF State (f) < 0 THEN
- ⓪&err ('Datei nicht gefunden', FALSE); RETURN FALSE
- ⓪$END;
- ⓪$RETURN TRUE
- ⓪"END OpenFile;
- ⓪
- ⓪
- ⓪ PROCEDURE PatchSerial (mySer: CARDINAL): BOOLEAN;
- ⓪"
- ⓪"VAR j, k, n: CARDINAL;
- ⓪*f: File;
- ⓪*w: CARDINAL;
- ⓪*
- ⓪"BEGIN
- ⓪$CalcSer (mySer);
- ⓪$FOR n:= 1 TO NrMods DO
- ⓪&IF NOT OpenFile (f, compname [n]) THEN
- ⓪(RETURN FALSE
- ⓪&END;
- ⓪&FOR j:= 0 TO NrKeys DO
- ⓪(FOR k:= 1 TO expCount [j] DO
- ⓪*IF offsets [n, j, k] # 0L THEN
- ⓪,Seek (f, offsets [n, j, k], fromBegin);
- ⓪,ReadWord (f, w);
- ⓪,IF w # value [j] THEN
- ⓪.IF (j=0) & (k=1) THEN
- ⓪0err ('Falsche Seriennummern gefunden: Datei unverändert', FALSE);
- ⓪0Close (f);
- ⓪.ELSE
- ⓪0err ('Falsche Seriennummern gefunden: Datei gelöscht', FALSE);
- ⓪0Remove (f);
- ⓪.END;
- ⓪.RETURN FALSE
- ⓪,END;
- ⓪,Seek (f, -2L, fromPos);
- ⓪,WriteWord (f, patch [j])
- ⓪*END
- ⓪(END
- ⓪&END;
- ⓪&Close (f);
- ⓪$END;
- ⓪$RETURN TRUE
- ⓪"END PatchSerial;
- ⓪"
- ⓪"
- ⓪ VAR n, mySer: CARDINAL;
- ⓪-c: CHAR;
- ⓪,dh: DeviceHandle;
- ⓪
- ⓪ BEGIN
- ⓪"
- ⓪"InitGem (RC, dh, ok);
- ⓪"
- ⓪"HideMouse;
- ⓪"WritePg;
- ⓪"
- ⓪"(* Konstanten für Schlüssel *)
- ⓪"
- ⓪"RegLen [1] := 17; FeedBack [1] := 7; Iterate [1] := 39; Offs [1] := $2302;
- ⓪"RegLen [2] := 16; FeedBack [2] := 3; Iterate [2] := 367; Offs [2] := $3C78;
- ⓪#
- ⓪"(* Default-Seriennummern im Compiler *)
- ⓪"
- ⓪"value [0] := $4711; expCount [0] := 3; lead [0] := $0641;
- ⓪"value [1] := $1ADE; expCount [1] := 1; lead [1] := $343C;
- ⓪"value [2] := $312F; expCount [2] := 1; lead [2] := $0240;
- ⓪"
- ⓪"(* Seriennummern im Compiler suchen *)
- ⓪"
- ⓪"WriteString ('Serialize /1.3/: Seriennummern in Compiler eintragen ');
- ⓪"WriteLn; WriteLn;
- ⓪"
- ⓪"(*
- ⓪"WriteString ('Achtung: Bei TOS 1.4ff kein Cache-Prg verwenden!');
- ⓪"WriteLn; WriteLn;
- ⓪"*)
- ⓪"
- ⓪"WriteString ('Konsistenzprüfung der angegebenen Schlüssel:'); WriteLn;
- ⓪"CheckSer;
- ⓪"WriteString (' ok.'); WriteLn; WriteLn;
- ⓪"
- ⓪"FOR n:= 1 TO NrMods DO
- ⓪$SelectFile ('Wo isser?', compname [n], ok);
- ⓪$IF NOT ok THEN RETURN END;
- ⓪$WritePg;
- ⓪"END;
- ⓪"
- ⓪"WriteString ('Suchen der Seriennummern:'); WriteLn;
- ⓪"
- ⓪"FindOffsets;
- ⓪"WriteString (' ok.'); WriteLn; WriteLn;
- ⓪"
- ⓪"(* neue Seriennummern eintragen *)
- ⓪"
- ⓪"LOOP
- ⓪$WriteString ('Neue Seriennummer eintragen:'); WriteLn;
- ⓪$WriteString (' Nummer eingeben (0 stoppt): ');
- ⓪$ReadCard (mySer);
- ⓪$IF mySer = 0 THEN EXIT END;
- ⓪$
- ⓪$ForceMediaChange (StrToDrive (compname[1]));
- ⓪$IF PatchSerial (mySer) THEN
- ⓪&WriteString (' ok.'); WriteLn;
- ⓪$END;
- ⓪$WriteLn;
- ⓪"END;
- ⓪"
- ⓪ END MM2Serialize.
- ⓪ ə
- (* $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£Çé*)
-