' THE TRACK 41 PROTECTOR ' (C) 1987 by Claus Brod ' Am Felsenkeller 2 ' D-8772 Marktheidenfeld ' Tel. (West Germany) 09391-3206 ' ' Last update 28.9.87 ' Installs a copy protection on a blank disk (track 41) ' Written exclusively for STNEWS ' ' ron$=CHR$(27)+"p" roff$=CHR$(27)+"q" @init @dispatch END ' ************ ' ****dispatch: shows menu and waits for choice ' ************ PROCEDURE dispatch REPEAT CLS PRINT AT(28,1);ron$;"THE TRACK 41 PROTECTOR";roff$ PRINT AT(28,2);"(C) 1987 by Claus Brod" PRINT AT(28,5);"(0) Exit" PRINT AT(28,6);"(1) Read Track 41 & Check" PRINT AT(28,7);"(2) Write Track 41" PRINT AT(28,8);"(3) Show Track Buffer" REPEAT a$=UPPER$(INPUT$(1)) UNTIL a$>="0" AND a$<"4" choice=VAL(a$) ON choice GOSUB read,write,showtrk UNTIL choice=0 RETURN ' ' *************** ' ****** read: inputs password, reads track 41 into buffer ' ****** and looks for password ' *************** PROCEDURE read PRINT PRINT ron$;"Read Track 41";roff$ LINE INPUT "Copyright string";copy$ buf$=STRING$(8000,CHR$(0)) @rdtrk(VARPTR(buf$)) a=INSTR(buf$,copy$) IF a=0 PRINT "Copyright message not found" ELSE PRINT "Copyright message found at offset ";a ENDIF VOID INP(2) RETURN ' ' ************** ' ***** rdtrk: Reads track 41 from disk into buffer ' ***** (pointed to by pointer%) ' ************** PROCEDURE rdtrk(pointer%) prg%=VARPTR(prg$) ! start of machine code LPOKE prg%+2,0 ! mode 0 (read track) LPOKE prg%+6,pointer% ! pointer to buffer (at least 7K please!) CALL prg% ! call mcode RETURN ' ' ************* ' ***** write: creates & writes track 41 from buffer including a password ' ************* PROCEDURE write PRINT PRINT ron$;"Write Track 41";roff$ LINE INPUT "Copyright string";copy$ @mktrk(copy$) @wrtrk(VARPTR(buf$)) RETURN ' ' ************** ' ****** wrtrk: writes track 41 from buffer pointed to by ' ****** pointer% ' ************** PROCEDURE wrtrk(pointer%) prg%=VARPTR(prg$) ! start of machine code LPOKE prg%+2,1 ! mode 1 (write track) LPOKE prg%+6,pointer% ! start of buffer containing track data CALL prg% ! call mcode RETURN ' ' *************** ' ****** mktrk: constructs 9-sector track 41 with password c$ ' *************** PROCEDURE mktrk(c$) sync$=CHR$(&HF5)+CHR$(&HF5)+CHR$(&HF5) ! sync bytes sec$=STRING$(512,CHR$(203)) ! sector data gap1$=STRING$(60,CHR$(&H4E)) ! gap1 gap2$=STRING$(12,CHR$(0)) ! gap2 gap31$=STRING$(22,CHR$(&H4E)) ! gap31 gap32$=gap2$ ! gap32 gap4$=STRING$(40,CHR$(&H4E)) ! gap4 gap5$=STRING$(1401,CHR$(&H4E)) ! gap5 MID$(gap1$,3)=CHR$(&H29)+CHR$(&HF5) ! syncs into gap1 PRINT "Password is ";c$ ! print password again MID$(gap1$,5)=c$ ! password to gap1 ' buf$=gap1$ ! start of buf$ FOR t=1 TO 9 buf$=buf$+gap2$+sync$+CHR$(&HFE)+CHR$(41)+CHR$(0)+CHR$(t)+CHR$(2) ' start of sector, address header buf$=buf$+CHR$(&HF7) ' checksum buf$=buf$+gap31$+gap32$+sync$+CHR$(&HFB) ' gap before data and data mark buf$=buf$+sec$+CHR$(&HF7)+gap4$ ' sector data and checksum and end gap NEXT t buf$=buf$+gap5$ ! gaps to track end RETURN ' ' ********************** ' ***** init: reads machine code into prg$ ' ********************** PROCEDURE init RESTORE protect DO READ a$ EXIT IF a$="*" prg$=prg$+CHR$(VAL("&h"+a$)) LOOP RETURN ' ' ********************** ' ****** showtrk: Shows buf$ in hex and ASCII ' ****** press any key to stop then 'X' to exit ' ****** any other key continues ' ********************** PROCEDURE showtrk PRINT PRINT ron$;"Show Track Buffer - press any key to stop, then X to exit";roff$ FOR t=1 TO LEN(buf$) STEP 16 z$="" a$=HEX$(t-1) WHILE LEN(a$)<4 a$="0"+a$ WEND PRINT "$";a$;" "; FOR i=0 TO 15 a$=HEX$(ASC(MID$(buf$,t+i,1))) IF LEN(a$)=1 a$="0"+a$ ENDIF PRINT a$' z=VAL("&h"+a$) IF z>31 AND z<128 z$=z$+CHR$(VAL("&h"+a$)) ELSE z$=z$+"." ENDIF NEXT i PRINT " ";z$ k$="" IF INKEY$>"" k$=INPUT$(1) ENDIF EXIT IF UPPER$(k$)="X" NEXT t RETURN ' ' ********************** ' * machine code data ' ********************** protect: DATA 60,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DATA 0,0,0,0,0,0,0,0,48,E7,FF,FE,42,80,61,0 DATA 0,AE,45,FA,FF,E6,24,80,45,FA,FF,E4,34,BC,0,0 DATA 2C,3A,FF,D0,50,F9,0,0,4,3E,BC,BC,0,0,0,0 DATA 67,0,0,A4,BC,BC,0,0,0,1,67,0,0,E0,51,F9 DATA 0,0,4,3E,45,FA,FF,B4,20,12,61,72,4C,DF,7F,FF DATA 4E,75,32,3C,0,1E,61,A,33,C7,0,FF,86,4,32,3C DATA 0,1E,51,C9,FF,FE,4E,75,32,3C,0,FA,51,C9,FF,FE DATA 22,3C,0,4,0,0,8,39,0,5,0,FF,FA,1,67,C DATA 53,81,66,F2,1E,3C,0,D0,61,40,4E,75,33,FC,1,80 DATA 0,FF,86,6,32,3C,0,1E,61,C8,30,39,0,FF,86,4 DATA 32,3C,0,1E,60,BC,13,C7,0,FF,86,D,E0,8F,13,C7 DATA 0,FF,86,B,E0,8F,13,C7,0,FF,86,9,4E,75,2F,0 DATA 3F,3C,0,20,4E,41,5C,8F,4E,75,1E,3C,0,D0,61,82 DATA 32,3C,0,FA,60,8C,38,3C,0,2,61,0,0,D6,38,3C DATA 0,29,61,0,0,92,61,C,38,3C,0,0,61,0,0,C4 DATA 60,0,FF,4C,2E,3A,FF,0,61,AC,61,0,0,9C,3E,3C DATA 0,E,61,0,FF,4E,33,FC,0,80,0,FF,86,6,3E,3C DATA 0,E0,61,0,FF,3E,61,0,FF,50,4E,75,38,3C,0,2 DATA 61,0,0,90,38,3C,0,29,61,4C,61,C,38,3C,0,0 DATA 61,0,0,80,60,0,FF,8,2E,3A,FE,BC,61,0,FF,68 DATA 33,FC,1,90,0,FF,86,6,33,FC,0,90,0,FF,86,6 DATA 33,FC,1,90,0,FF,86,6,3E,3C,0,1F,61,0,FE,F4 DATA 33,FC,1,80,0,FF,86,6,3E,3C,0,F0,61,0,FE,E4 DATA 61,0,FE,F6,4E,75,33,FC,0,86,0,FF,86,6,3E,4 DATA 61,0,FE,D0,33,FC,0,80,0,FF,86,6,3E,3C,0,11 DATA 61,0,FE,C0,60,0,FE,D2,33,FC,0,90,0,FF,86,6 DATA 33,FC,1,90,0,FF,86,6,33,FC,0,90,0,FF,86,6 DATA 4E,75,48,E7,FF,FE,3E,4,66,14,33,FC,0,80,0,FF DATA 86,6,32,39,0,FF,86,4,8,1,0,7,66,F4,A,7 DATA 0,7,CE,3C,0,7,40,E7,0,7C,7,0,13,FC,0,E DATA 0,FF,88,0,10,39,0,FF,88,0,C0,3C,0,F8,8E,0 DATA 13,C7,0,FF,88,2,46,DF,4C,DF,7F,FF,4E,75,0,0 DATA *