********************************************************************** ** program : ProRunCrack ** ** version : 1.0 ** ** author : Gunther Nikl ** ** language : Devpac 2.14 (assembler) ** ** bugs : none known ** ********************************************************************** ** ** ** History ** ** ------- ** ** v1.0 05-Mar-93 first version ** ** ** ********************************************************************** opt o+,w- _LVOForbid equ -132 _LVOAllocMem equ -198 _LVOFreeMem equ -210 _LVOGetMsg equ -372 _LVOReplyMsg equ -378 _LVOWaitPort equ -384 _LVOCloseLibrary equ -414 _LVORawDoFmt equ -522 _LVOOpenLibrary equ -552 _LVOOpen equ -30 _LVOClose equ -36 _LVORead equ -42 _LVOWrite equ -48 _LVOOutput equ -60 _LVOSeek equ -66 _LVODeleteFile equ -72 _LVOCurrentDir equ -126 _LVOFileRequest equ -84 _LVOPurgeFiles equ -114 ADDSTR macro dc.w \1.str-StringTab \1 equ StrCount StrCount set \1+1 endm bp equr a5 gb_SysBase equ -0 ; L ; destroys original A5 !!!! gb_DosBase equ -4 ; L gb_ReqBase equ -8 ; L gb_WbMsg equ -12 ; L gb_StdOut equ -16 ; L gb_PattCount equ -17 ; B gb_FlagLF equ -18 ; B gb_FlagReq equ -19 ; B gb_ArgC equ -20 ; B gb_ArgV equ -28 ; L*2 gb_FileSize equ -32 ; L gb_FileBuf equ -36 ; L gb_ModSize equ -40 ; L gb_ModPtr equ -44 ; L gb_PtHeadSize equ -48 ; L gb_PtHeadBuf equ -52 ; L gb_FileReq equ -408 ; B*356 gb_DirName equ -540 ; B*132 gb_FileName equ -572 ; B*32 gb_PrintBuf equ -736 ; B*164 gb_SIZEOF equ -736 start link bp,#gb_SIZEOF ; Platz fuer Vars schaffen move.l d0,d2 ; Argumentlaenge sichern move.l a0,a2 ; Argumentzeile sichern move.l #(~gb_SIZEOF>>2),d1 move.l bp,a1 .clear clr.l -(a1) ; Variablenbereich loeschen dbra d1,.clear move.l 4.w,a6 move.l a6,gb_SysBase(bp) ; ExecBase sichern move.l 276(a6),a4 ; SysBase->ThisTask move.l 184(a4),d4 ; pr_WindowPtr moveq #-1,d0 move.l d0,184(a4) ; keine DOS-Requester tst.l 172(a4) bne.s fromCLI ; CLI-Start fromWB lea 92(a4),a0 jsr _LVOWaitPort(a6) lea 92(a4),a0 jsr _LVOGetMsg(a6) move.l d0,gb_WbMsg(bp) ; WB-Message bsr OpenDOS beq.s exit2 ; kein DOS move.l gb_WbMsg(bp),a1 move.l 36(a1),a1 move.l (a1),d1 move.l gb_DosBase(bp),a6 jsr _LVOCurrentDir(a6) ; aktuelles Directory setzen lea ConName.str(pc),a1 move.l a1,d1 move.l #1005,d2 ; MODE_OLDFILE jsr _LVOOpen(a6) move.l d0,160(a4) ; pr_COS -> Window Handle beq.s exit2 ; Fehler bsr.s main moveq #Return,d0 ; "Press RETURN !" bsr PrintStr move.l 160(a4),d1 ; pr_COS lea gb_PrintBuf(bp),a0 move.l a0,d2 moveq #1,d3 move.l gb_DosBase(bp),a6 jsr _LVORead(a6) ; ein Zeichen lesen move.l 160(a4),d1 jsr _LVOClose(a6) ; Fenster schliessen move.l gb_SysBase(bp),a6 exit2 jsr _LVOForbid(a6) move.l gb_WbMsg(bp),a1 jsr _LVOReplyMsg(a6) ; WB-Message beantworten bra.s exit ; zum Hauptprogramm fromCLI clr.b -1(a2,d2.w) ; Zeile terminieren bsr.s OpenDOS beq.s exit ; kein DOS move.l a2,a1 lea gb_ArgV(bp),a2 moveq #0,d2 bsr BuildArgV ; Argument-Vektor aufbauen move.b d2,gb_ArgC(bp) ; Argumentzahl sichern bsr.s main ; Hauptprogramm exit bsr.s CloseDOS move.l d4,184(a4) ; alten WindowPtr setzen moveq #0,d0 ; ReturnCode = Alles Ok unlk bp ; Stack aufraeumen rts OpenDOS lea DosName(pc),a1 ; dos.library moveq #33,d0 jsr _LVOOpenLibrary(a6) ; DOS oeffen move.l d0,gb_DosBase(bp) ; sichern -> Flags stellen rts CloseDOS move.l gb_DosBase(bp),d0 ; DOS geoeffnet ? beq.s .quit ; nein move.l d0,a1 jsr _LVOCloseLibrary(a6) ; DOS schliessen .quit rts ***************************************************************************** main move.l a6,-(sp) ; Reg sichern moveq #PrgName,d0 bsr PrintStr ; Copyright ausgeben move.l gb_ArgV(bp),a0 ; 1. Argument move.b gb_ArgC(bp),d0 ; Parameter ? beq.s m_request2 ; FileRequester bringen subq.b #2,d0 beq.s m_request ; In && Out || DirName sowie cmp.b #'?',(a0) bne.s m_request ; kein Hilfeersuchen m_use moveq #Usage,d0 bsr PrintStr ; Usage ausgeben bra.s m_quit m_request move.b (a0)+,d0 ; erstes Zeichen rol.w #8,d0 move.b (a0)+,d0 ; zweites Zeichen bset #5,d0 cmp.w #'-d',d0 bne.s m_loop ; kein Directory tst.b (a0) bne.s .onlyone ; Name direkt angeschlossen move.l gb_ArgV+4(bp),d0 beq.s m_use ; Fehler -d ohne Argument ! move.l d0,a0 .onlyone lea gb_DirName(bp),a1 moveq #127,d0 .copy move.b (a0)+,(a1)+ ; DirName kopieren dbeq d0,.copy m_request2 lea ReqLoad.str(pc),a0 bsr.s ReqFile ; File waehlen bne.s m_quit ; Abbruch oder Fehler st gb_FlagReq(bp) m_loop bsr LoadFile ; File laden bne.s m_cont2 ; Fehler ! bsr DoMake ; PT-Module aufbauen bne.s m_cont ; Fehler ! tst.b gb_FlagReq(bp) beq.s m_save lea ReqSave.str(pc),a0 bsr.s ReqFile ; File waehlen bne.s m_cont ; Abbruch oder Fehler m_save bsr SaveFile ; File speichern m_cont move.l gb_SysBase(bp),a6 move.l gb_PtHeadBuf(bp),d0 beq.s m_cont ; kein Puffer da move.l d0,a1 move.l gb_PtHeadSize(bp),d0 ; Puffergroesse jsr _LVOFreeMem(a6) m_cont2 move.l gb_FileBuf(bp),d0 beq.s m_quit ; kein Puffer da move.l d0,a1 move.l gb_FileSize(bp),d0 ; Puffergroesse jsr _LVOFreeMem(a6) ; Puffer freigeben m_quit move.l (sp)+,a6 ; Reg zurueck rts ; Auf Wiedersehen ! ***************************************************************************** ReqFile movem.l d2/a2/a6,-(sp) ; Regs sichern lea gb_FileReq(bp),a2 ; File Requester move.l a0,2(a2) ; Requester Titel eintragen move.l gb_ReqBase(bp),d0 bne.s .is_open ; Lib schon geöffnet ! moveq #ReqNeed,d2 ; REQ-Fehler lea ReqName(pc),a1 moveq #0,d0 ; Lib Version move.l gb_SysBase(bp),a6 jsr _LVOOpenLibrary(a6) ; Lib oeffen move.l d0,gb_ReqBase(bp) beq.s .quit ; kein REQ lea gb_DirName(bp),a0 move.l a0,6(a2) ; DirName lea gb_FileName(bp),a0 move.l a0,10(a2) ; FileName lea gb_PrintBuf(bp),a0 move.l a0,14(a2) ; Path & File Name move.w #10,22(a2) ; MaxExtSelect move.l #4116,30(a2) ; Cache,IBut & Load moveq #2,d2 move.w d2,34(a2) ; DirNameColour move.w d2,38(a2) ; DevNameColour .is_open moveq #SelectErr,d2 ; REQ-Abbruch move.l a2,a0 move.l d0,a6 ; d0 -> ReqBase !!! jsr _LVOFileRequest(a6) ; Fragen wat nu ... tst.l d0 beq.s .purge ; nichts ausgewaehlt ; move.b #1,gb_ArgC(bp) ; ein Argument move.l 14(a2),gb_ArgV(bp) ; load name move.l 14(a2),gb_ArgV+4(bp) ; save name moveq #0,d2 ; alles ok .purge move.l d2,d0 bne.s .purge_ok ; Fehler aufgetreten tst.b gb_FlagReq(bp) beq.s .quit ; Req noch nicht schliessen .purge_ok move.l a2,a0 ; dem Request assoziierte jsr _LVOPurgeFiles(a6) ; Speicherbereiche freigeben move.l a6,a1 move.l gb_SysBase(bp),a6 jsr _LVOCloseLibrary(a6) ; REQ schliessen .quit move.l d2,d0 ; Fehler aufgetreten beq.s .quit2 lea ReqName(pc),a1 bsr PrintStr ; Meldung ausgeben move.l d2,d0 ; Flags wieder stellen .quit2 movem.l (sp)+,d2/a2/a6 ; Regs zurueck rts ***************************************************************************** LoadFile movem.l d2-7/a2/a6,-(sp) ; Regs sichern move.l gb_ArgV(bp),a0 bsr ExtractRealName ; Pfad und/oder Dir entfernen lea gb_PrintBuf(bp),a2 ; hier jetzt voller DateiName move.l gb_DosBase(bp),a6 moveq #FileErr,d7 ; File-Fehler move.l a2,d1 move.l #1005,d2 jsr _LVOOpen(a6) ; Datei öffnen move.l d0,d4 beq .quit2 ; File nicht gefunden moveq #ReadErr,d7 ; Lesefehler move.l d4,d1 move.l a2,d2 moveq #8,d3 jsr _LVORead(a6) ; erste 8 Bytes lesen cmp.l d0,d3 bne .closef ; Lesefehler move.l (a2),d6 ; erste 4 Bytes der Datei move.l d4,d1 moveq #-4,d2 moveq #1,d3 ; OFFSET_END jsr _LVOSeek(a6) ; zum Dateiende-4 tst.l d0 bmi.s .closef ; Seekfehler move.l d4,d1 move.l a2,d2 moveq #4,d3 jsr _LVORead(a6) ; 4 Bytes lesen cmp.l d0,d3 bne.s .closef ; Lesefehler move.l d4,d1 moveq #0,d2 moveq #-1,d3 ; OFFSET_BEGINNING jsr _LVOSeek(a6) ; zum Dateianfang move.l d0,d3 ; Wert sichern bmi.s .closef ; Seekfehler move.l d3,gb_ModSize(bp) exg.l d2,d6 ; Null nach D6 cmp.l #'PP20',d2 ; PowerPacked ? bne.s .notpp move.l (a2),d6 ; richtige Laenge lsr.l #8,d6 ; extrahieren move.l d6,gb_ModSize(bp) moveq #16,d0 ; 16 Bytes als add.l d0,d6 ; Sicherheit dazu .notpp exg.l d3,d6 tst.l d3 bne.s .ok ; D6 <> 0 -> gepacket ! exg.l d3,d6 ; Abstand zurueck nach d0 bsr.s ModCheck ; Modul prüfen bne.s .closef ; nein .ok move.l d3,gb_FileSize(bp) ; Puffergroesse moveq #MemErr,d7 ; Speicher-Fehler move.l d3,d0 ; Speichergroesse moveq #1,d1 move.l gb_SysBase(bp),a6 jsr _LVOAllocMem(a6) ; Puffer allokieren move.l gb_DosBase(bp),a6 move.l d0,gb_FileBuf(bp) beq.s .closef ; kein Speicher move.l d0,gb_ModPtr(bp) ; if PP -> FileBuf != ModPtr ! moveq #ReadErr,d7 ; Lese-Fehler move.l d4,d1 move.l gb_FileBuf(bp),d2 tst.l d6 ; gepackte Laenge != 0 ? beq.s .read move.l d6,d3 ; powerpacked .read jsr _LVORead(a6) ; Header & Pattern einlesen cmp.l d0,d3 bne.s .closef ; Lesefehler moveq #0,d7 ; kein Fehler .closef move.l d4,d1 jsr _LVOClose(a6) ; File schliessen .quitt tst.l d6 ; gepackt ? beq.s .quit2 move.l gb_FileBuf(bp),a1 ; DeCrunch Puffer lea 0(a1,d6.l),a0 ; EndCrunch lea 16(a1),a1 move.l a1,gb_ModPtr(bp) ; richtiger Module-Ptr addq.l #4,a2 ; DeCrunch-Bits bsr PPDeCrunch ; auspacken move.l (a1),d2 bsr.s ModCheck ; prüfen .quit2 move.l d7,d0 ; alles ok ? beq.s .quit3 ; ja lea gb_FileName(bp),a1 ; FileName bsr PrintStr ; Fehler-Meldung ausgeben move.l d7,d0 ; Fehler-Nr zurueckgeben .quit3 movem.l (sp)+,d2-7/a2/a6 ; Regs zurueck rts ModCheck moveq #0,d7 cmp.l #'SNT!',d2 ; Kennung beq.s .quit moveq #ModErr,d7 .quit rts ***************************************************************************** ExtractRealName lea gb_PrintBuf(bp),a1 ; open buffer move.w #163,d0 .copy1 move.b (a0)+,(a1)+ ; copy argument dbeq d0,.copy1 lea gb_PrintBuf(bp),a0 ; string to parse move.l a0,a1 moveq #-1,d1 .strlen tst.b (a1)+ ; look for string end dbeq d1,.strlen not.l d1 ; string len of filename .search1 move.b (a0,d1.w),d0 ; search for "/" && ":" to cmp.b #'/',d0 beq.s .next1 ; eliminate path and/or cmp.b #':',d0 .next1 dbeq d1,.search1 ; dir from file name lea 1(a0,d1.w),a0 ; start of real name lea gb_FileName(bp),a1 ; real name buffer moveq #29,d0 .copy2 move.b (a0)+,(a1)+ ; copy name dbeq d0,.copy2 lea gb_FileName(bp),a1 ; check the filename .search2 move.b (a1)+,d1 beq.s .ok ; for '.pp' extension cmp.b #'.',d1 bne.s .search2 move.b (a1),d1 ; if this extension is rol.w #8,d1 move.b 1(a1),d1 or.w #$2020,d1 ; found then remove cmp.w #'pp',d1 bne.s .search2 tst.b 2(a1) ; string end ? bne.s .search2 clr.b -1(a1) ; it ! .ok rts ***************************************************************************** SaveFile movem.l d2-5/a6,-(sp) ; save regs move.l gb_ArgV+4(bp),d0 ; second argument ? bne.s .is_name move.l gb_ArgV(bp),d0 ; use first argument .is_name move.l d0,a0 bsr.s ExtractRealName ; remove path and/or dir move.l gb_DosBase(bp),a6 moveq #FileErr,d5 lea gb_PrintBuf(bp),a1 ; here is the full filename move.l a1,d1 move.l #1006,d2 ; MODE_NEWFILE jsr _LVOOpen(a6) move.l d0,d4 beq.s .quit ; open error moveq #WriteErr,d5 move.l d4,d1 move.l gb_PtHeadBuf(bp),d2 ; pt header move.l gb_PtHeadSize(bp),d3 ; header size jsr _LVOWrite(a6) cmp.l d3,d0 bne.s .closef ; write error move.l d4,d1 move.l gb_ModPtr(bp),a0 move.l a0,d2 add.l 4(a0),d2 ; sample start move.l a0,d3 add.l gb_ModSize(bp),d3 sub.l d2,d3 ; sample length jsr _LVOWrite(a6) cmp.l d3,d0 bne.s .closef ; write error moveq #0,d5 ; all ok .closef move.l d4,d1 jsr _LVOClose(a6) ; close file move.l d5,d0 beq.s .quit .delfile lea gb_PrintBuf(bp),a1 move.l a1,d1 jsr _LVODeleteFile(a6) ; remove faulty file .quit move.l d5,d0 ; error ? bne.s .msg moveq #Success,d0 ; end message .msg lea gb_FileName(bp),a1 bsr PrintStr ; print err message move.l d5,d0 .quit2 movem.l (sp)+,d2-5/a6 ; restore regs rts ***************************************************************************** DoMake movem.l d2/a6,-(sp) ; save regs moveq #0,d0 moveq #0,d1 move.l gb_ModPtr(bp),a1 lea $102(a1),a1 ; start of pattern list moveq #127,d2 ; 128 entrys .look move.b (a1)+,d1 cmp.b d0,d1 bcs.s .next move.b d1,d0 .next dbra d2,.look move.b d0,gb_PattCount(bp) ; highest pattern in file addq.w #1,d0 lsl.l #8,d0 lsl.l #2,d0 ; pattcount*1024 add.l #$43c,d0 ; add header size move.l d0,gb_PtHeadSize(bp) moveq #1,d1 swap d1 move.l gb_SysBase(bp),a6 jsr _LVOAllocMem(a6) moveq #MemErr,d2 move.l d0,gb_PtHeadBuf(bp) beq.s .quit ; no buffer moveq #InfoPR,d0 ; ProRunner Info lea gb_FileName(bp),a1 bsr.s PrintStr ; Name moveq #InfoFS,d0 move.l gb_ModSize(bp),a1 bsr.s PrintStr ; Size bsr BuildHeader ; build pt header bsr MakePattern ; construct pattern moveq #InfoPT,d0 ; ProTracker Info lea gb_FileName(bp),a1 bsr.s PrintStr ; Name moveq #InfoFS,d0 move.l gb_ModPtr(bp),a0 ; calculate sample length move.l gb_ModSize(bp),a1 sub.l 4(a0),a1 add.l gb_PtHeadSize(bp),a1 bsr.s PrintStr ; Size st gb_FlagLF(bp) ; naechstes PrintStr, erst LF moveq #0,d2 ; all ok .quit move.l d2,d0 beq.s .quit2 bsr.s PrintStr ; error message move.l d2,d0 .quit2 movem.l (sp)+,d2/a6 ; restore regs rts ***************************************************************************** PrintStr movem.l d2-3/a1-3/a6,-(sp) ; save regs move.l d0,d2 tst.b gb_FlagLF(bp) beq.s .nolf clr.b gb_FlagLF(bp) moveq #LineFeed,d0 bsr.s PrintStr .nolf lea StringTab(pc),a0 ; start of string table add.w d2,d2 add.w 0(a0,d2.w),a0 ; add offset move.l a1,-(sp) move.l sp,a1 ; pointer to argument lea sc_put(pc),a2 ; buffer function lea gb_PrintBuf(bp),a3 ; output buffer move.l gb_SysBase(bp),a6 jsr _LVORawDoFmt(a6) ; do the format addq.l #4,sp ; adjust stack move.l gb_DosBase(bp),a6 jsr _LVOOutput(a6) lea gb_PrintBuf(bp),a0 move.l a0,d2 ; output buffer moveq #-1,d3 .size tst.b (a0)+ dbeq d3,.size not.l d3 ; output lenght jsr _LVOWrite(a6) movem.l (sp)+,d2-3/a1-3/a6 ; restore regs rts sc_put move.b d0,(a3)+ ; store char in buffer rts ***************************************************************************** BuildHeader lea gb_FileName(bp),a0 ; name without path && dir move.l gb_PtHeadBuf(bp),a1 moveq #19,d0 .copy1 move.b (a0)+,(a1)+ ; copy name to pt mod dbeq d0,.copy1 move.l gb_ModPtr(bp),a0 ; ProRun Mod addq.l #8,a0 move.l gb_PtHeadBuf(bp),a1 ; ProTr Mod lea 20(a1),a1 moveq #30,d0 ; copy 31 sample infos .copy2 lea 22(a1),a1 move.l (a0)+,(a1)+ ; lenght, fintune & volume move.l (a0)+,(a1)+ ; repstart, replength dbra d0,.copy2 moveq #31,d0 .copy3 move.l (a0)+,(a1)+ ; copy pattern list dbra d0,.copy3 move.w (a0)+,(a1)+ move.l #'M.K.',(a1) ; store pt sign rts MakePattern movem.l d2-6/a2-3,-(sp) ; save regs moveq #12,d3 move.l gb_ModPtr(bp),a0 lea $302(a0),a0 ; pattern start prorun move.l gb_PtHeadBuf(bp),a1 lea $43c(a1),a1 ; pattern start protr lea pt_periods(pc),a2 lea gb_PrintBuf(bp),a3 ; temp note buffer moveq #0,d6 move.b gb_PattCount(bp),d6 nextpatt move.w #255,d5 ; 256 notes nextnote moveq #0,d0 move.b (a0)+,d0 ; pos+0 .fall3 move.l 0(a3,d3.w),d1 cmp.b #$c0,d0 ; previous channel note ? beq.s savenote .fall2 moveq #0,d1 cmp.b #$80,d0 ; blank note ? beq.s savenote .fall1 move.b (a0)+,d1 ; pos+1 moveq #$0f,d2 and.b d1,d2 ; extract effect number lsr.b #4,d1 ; sample nr lower nibble add.b d1,d1 ; sample nr * 2 moveq #1,d4 ; adjust value and.b d0,d4 ; check bit zero add.b d4,d1 ; adjust sample nr sub.b d4,d0 ; adjust note offset beq.s .no_per ; period == 0 move.w -2(a2,d0.w),d0 ; get period .no_per swap d1 lsr.l #4,d1 ; divide sample nr lsl.w #8,d2 ; enable effect parameter move.b (a0)+,d2 ; pos+2 or.w d2,d1 ; make lower part swap d1 ror.w #4,d1 ; move upper sample nr bits or.w d0,d1 ; make upper part swap d1 savenote move.l d1,(a1)+ ; store full note beq.s .no_note move.l d1,0(a3,d3.w) ; save new channel note .no_note subq.w #4,d3 bcc.s .next moveq #12,d3 .next dbra d5,nextnote ; next note dbra d6,nextpatt ; next pattern movem.l (sp)+,d2-6/a2-3 ; restore regs rts ***************************************************************************** ; a1 - pointer into command line ; d2 - argc ; a2 - argv BuildArgV bsr.s GetNext ; search argument bmi.s doquote ; quotation sign beq.s dosemi ; commentary stops all bcs.s BuildArgV ; separation sign lea -1(a1),a0 ; argument start bsr.s BumpArgV ; argc+1 & ptr to argv build_2 bsr.s GetNext ; search separation sign beq.s dosemi ; commentary stops all bcc.s build_2 ; no separation sign clr.b -1(a1) ; mark end bra.s BuildArgV ; continue search doquote move.l a1,a0 ; argument start bsr.s BumpArgV ; argc+1 & ptr to argv quote_2 bsr.s GetNext ; search quotation sign bpl.s quote_2 ; no quotation sign clr.b -1(a1) ; mark end quote_3 bsr.s GetNext ; search sepaartion sign beq.s dosemi ; commentary stops all bcc.s quote_3 ; no separation sign bra.s BuildArgV ; continue search dosemi clr.b -(a1) ; delete semicolon bra.s BuildArgV ; go on BumpArgV cmp.w #2,d2 ; max argc reached ? bcc.s .full move.l a0,(a2)+ ; store argptr addq.w #1,d2 ; increment argc .full rts GetNext move.b (a1)+,d0 ; test character beq.s BuildRdy moveq #-3,d1 ; N=1,Z=0,C=0 -> quotation cmp.b #'"',d0 beq.s .quit moveq #-2,d1 ; N=0,Z=1,C=1 -> semicolon cmp.b #';',d0 beq.s .quit moveq #-1,d1 ; N=0,Z=0,C=1 -> separation cmp.b #'=',d0 beq.s .quit cmp.b #' ',d0 beq.s .quit cmp.b #9,d0 beq.s .quit moveq #0,d1 ; N=0,Z=0,C=0 -> others .quit addq.l #2,d1 ; set flags ( see above ) rts BuildRdy addq.l #4,sp ; set right return address rts ***************************************************************************** ; PowerPacker assembler decrunch-subroutine ; ; PPDecrunch (endcrun, buffer, efficiency); ; a0 a1 a2 PPDeCrunch movem.l d0-7/a0-5,-(sp) moveq #0,d4 moveq #1,d5 moveq #24,d6 move.w #255,d7 movea.l a1,a3 lea myDecrTab(pc),a4 lea $dff1a2,a5 ; DeCrunch Effect move.l -(a0),d1 tst.b d1 beq.s ppdecr_02 lsr.l #1,d5 beq.s ppdecr_10 ppdecr_01 subq.b #1,d1 lsr.l d1,d5 ppdecr_02 lsr.l #8,d1 adda.l d1,a1 ppdecr_03 lsr.l #1,d5 beq.s ppdecr_11 ppdecr_04 bcs ppdecr_21 moveq #0,d2 ppdecr_05 moveq #0,d1 lsr.l #1,d5 beq.s ppdecr_12 ppdecr_06 roxl.w #1,d1 lsr.l #1,d5 beq.s ppdecr_13 ppdecr_07 roxl.w #1,d1 add.w d1,d2 subq.w #3,d1 beq.s ppdecr_05 moveq #0,d0 ppdecr_08 move.b d5,d4 lsr.l #8,d5 beq.s ppdecr_16 ppdecr_09 move.b -128(a4,d4.w),d0 move.b d0,-(a1) dbra d2,ppdecr_08 move.w a1,(a5) cmpa.l a1,a3 bcs.s ppdecr_21 bra ppdecr_52 ppdecr_10 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_01 ppdecr_11 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_04 ppdecr_12 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_06 ppdecr_13 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_07 ppdecr_14 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_22 ppdecr_15 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_23 ppdecr_16 move.b 127(a4,d4.w),d0 move.l -(a0),d5 move.w d5,d3 lsl.w d0,d3 bchg d0,d3 eor.w d3,d4 and.w d7,d4 moveq #8,d1 sub.w d0,d1 lsr.l d1,d5 add.w d6,d0 bset d0,d5 bra.s ppdecr_09 ppdecr_17 move.b 127(a4,d4.w),d0 move.l -(a0),d5 move.w d5,d3 lsl.w d0,d3 bchg d0,d3 eor.w d3,d4 and.w d7,d4 moveq #8,d1 sub.w d0,d1 lsr.l d1,d5 add.w d6,d0 bset d0,d5 bra.s ppdecr_24 ppdecr_18 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_30 ppdecr_19 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_31 ppdecr_20 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_32 ppdecr_21 moveq #0,d2 lsr.l #1,d5 beq.s ppdecr_14 ppdecr_22 roxl.w #1,d2 lsr.l #1,d5 beq.s ppdecr_15 ppdecr_23 roxl.w #1,d2 move.b d5,d4 lsr.l #8,d5 beq.s ppdecr_17 ppdecr_24 moveq #0,d3 move.b -128(a4,d4.w),d3 cmp.w #3,d2 bne.s ppdecr_43 bclr #7,d3 beq.s ppdecr_36 moveq #13,d0 sub.b 0(a2,d2.w),d0 move.w d0,d1 add.w d0,d0 add.w d1,d0 add.w d0,d0 jmp ppdecr_28(pc,d0.w) ppdecr_25 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_33 ppdecr_26 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_34 ppdecr_27 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_35 ppdecr_28 lsr.l #1,d5 beq.s ppdecr_18 ppdecr_30 roxl.w #1,d3 lsr.l #1,d5 beq.s ppdecr_19 ppdecr_31 roxl.w #1,d3 lsr.l #1,d5 beq.s ppdecr_20 ppdecr_32 roxl.w #1,d3 lsr.l #1,d5 beq.s ppdecr_25 ppdecr_33 roxl.w #1,d3 lsr.l #1,d5 beq.s ppdecr_26 ppdecr_34 roxl.w #1,d3 lsr.l #1,d5 beq.s ppdecr_27 ppdecr_35 roxl.w #1,d3 ppdecr_36 moveq #0,d1 lsr.l #1,d5 beq.s ppdecr_40 ppdecr_37 roxl.w #1,d1 lsr.l #1,d5 beq.s ppdecr_41 ppdecr_38 roxl.w #1,d1 lsr.l #1,d5 beq.s ppdecr_42 ppdecr_39 roxl.w #1,d1 add.w d1,d2 subq.w #7,d1 beq.s ppdecr_36 bra.s ppdecr_50 ppdecr_40 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_37 ppdecr_41 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_38 ppdecr_42 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_39 ppdecr_43 moveq #13,d0 sub.b 0(a2,d2.w),d0 move.w d0,d1 add.w d0,d0 add.w d1,d0 add.w d0,d0 jmp ppdecr_44(pc,d0.w) ppdecr_44 lsr.l #1,d5 beq.s ppdecr_53 ppdecr_45 roxl.w #1,d3 lsr.l #1,d5 beq.s ppdecr_54 ppdecr_46 roxl.w #1,d3 lsr.l #1,d5 beq.s ppdecr_55 ppdecr_47 roxl.w #1,d3 lsr.l #1,d5 beq.s ppdecr_56 ppdecr_48 roxl.w #1,d3 lsr.l #1,d5 beq.s ppdecr_57 ppdecr_49 roxl.w #1,d3 ppdecr_50 move.b 0(a1,d3.w),-(a1) ppdecr_51 move.b 0(a1,d3.w),-(a1) dbra d2,ppdecr_51 move.w a1,(a5) cmpa.l a1,a3 bcs ppdecr_03 ppdecr_52 movem.l (sp)+,d0-7/a0-5 rts ppdecr_53 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_45 ppdecr_54 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_46 ppdecr_55 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_47 ppdecr_56 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_48 ppdecr_57 move.l -(a0),d5 roxr.l #1,d5 bra.s ppdecr_49 dc.b $00,$80,$40,$C0,$20,$A0,$60,$E0 dc.b $10,$90,$50,$D0,$30,$B0,$70,$F0 dc.b $08,$88,$48,$C8,$28,$A8,$68,$E8 dc.b $18,$98,$58,$D8,$38,$B8,$78,$F8 dc.b $04,$84,$44,$C4,$24,$A4,$64,$E4 dc.b $14,$94,$54,$D4,$34,$B4,$74,$F4 dc.b $0C,$8C,$4C,$CC,$2C,$AC,$6C,$EC dc.b $1C,$9C,$5C,$DC,$3C,$BC,$7C,$FC dc.b $02,$82,$42,$C2,$22,$A2,$62,$E2 dc.b $12,$92,$52,$D2,$32,$B2,$72,$F2 dc.b $0A,$8A,$4A,$CA,$2A,$AA,$6A,$EA dc.b $1A,$9A,$5A,$DA,$3A,$BA,$7A,$FA dc.b $06,$86,$46,$C6,$26,$A6,$66,$E6 dc.b $16,$96,$56,$D6,$36,$B6,$76,$F6 dc.b $0E,$8E,$4E,$CE,$2E,$AE,$6E,$EE dc.b $1E,$9E,$5E,$DE,$3E,$BE,$7E,$FE myDecrTab dc.b $01,$81,$41,$C1,$21,$A1,$61,$E1 dc.b $11,$91,$51,$D1,$31,$B1,$71,$F1 dc.b $09,$89,$49,$C9,$29,$A9,$69,$E9 dc.b $19,$99,$59,$D9,$39,$B9,$79,$F9 dc.b $05,$85,$45,$C5,$25,$A5,$65,$E5 dc.b $15,$95,$55,$D5,$35,$B5,$75,$F5 dc.b $0D,$8D,$4D,$CD,$2D,$AD,$6D,$ED dc.b $1D,$9D,$5D,$DD,$3D,$BD,$7D,$FD dc.b $03,$83,$43,$C3,$23,$A3,$63,$E3 dc.b $13,$93,$53,$D3,$33,$B3,$73,$F3 dc.b $0B,$8B,$4B,$CB,$2B,$AB,$6B,$EB dc.b $1B,$9B,$5B,$DB,$3B,$BB,$7B,$FB dc.b $07,$87,$47,$C7,$27,$A7,$67,$E7 dc.b $17,$97,$57,$D7,$37,$B7,$77,$F7 dc.b $0F,$8F,$4F,$CF,$2F,$AF,$6F,$EF dc.b $1F,$9F,$5F,$DF,$3F,$BF,$7F,$FF dc.b $00,$01,$01,$02,$02,$02,$02,$03 dc.b $03,$03,$03,$03,$03,$03,$03,$04 dc.b $04,$04,$04,$04,$04,$04,$04,$04 dc.b $04,$04,$04,$04,$04,$04,$04,$05 dc.b $05,$05,$05,$05,$05,$05,$05,$05 dc.b $05,$05,$05,$05,$05,$05,$05,$05 dc.b $05,$05,$05,$05,$05,$05,$05,$05 dc.b $05,$05,$05,$05,$05,$05,$05,$06 dc.b $06,$06,$06,$06,$06,$06,$06,$06 dc.b $06,$06,$06,$06,$06,$06,$06,$06 dc.b $06,$06,$06,$06,$06,$06,$06,$06 dc.b $06,$06,$06,$06,$06,$06,$06,$06 dc.b $06,$06,$06,$06,$06,$06,$06,$06 dc.b $06,$06,$06,$06,$06,$06,$06,$06 dc.b $06,$06,$06,$06,$06,$06,$06,$06 dc.b $06,$06,$06,$06,$06,$06,$06,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$07 dc.b $07,$07,$07,$07,$07,$07,$07,$00 ***************************************************************************** pt_periods dc.w 856,808,762,720,678,640,604,570,538 dc.w 508,480,453,428,404,381,360,339,320 dc.w 302,285,269,254,240,226,214,202,190 dc.w 180,170,160,151,143,135,127,120,113 StrCount set 0 StringTab ADDSTR PrgName ADDSTR Usage ADDSTR FileErr ADDSTR ReadErr ADDSTR WriteErr ADDSTR ModErr ADDSTR MemErr ADDSTR ReqNeed ADDSTR SelectErr ADDSTR InfoPR ADDSTR InfoPT ADDSTR InfoFS ADDSTR LineFeed ADDSTR Success ADDSTR Return PrgName.str dc.b $9B,'3;33mProRunCrack 1.0',$9b,'0m © 1993' dc.b ' by Gunther Nikl',10,10,0 even Usage.str dc.b $9B,'1;31mUsage:',$9b,'0m ProRunCrack ' dc.b '[ InFile ] [ OutFile ]',10 dc.b ' or',10,' ProRunCrack ' dc.b '[ -d DirectoryName ]',10,0 even FileErr.str dc.b '%s - open error !',10,0 even ReadErr.str dc.b '%s - read error !',10,0 even WriteErr.str dc.b '%s - write error !',10,0 even ModErr.str dc.b '%s - not a prorunner 2.0 module !',10,0 even MemErr.str dc.b 'not enough memory !',10,0 even ReqNeed.str dc.b 'no %s for filerequest !',10,0 even SelectErr.str dc.b 'requester canceled !',10,0 even InfoPR.str dc.b 'ProRunner : %s',0 even InfoPT.str dc.b 'ProTracker : %s',0 even InfoFS.str dc.b ' -> %6ld Bytes' LineFeed.str dc.b 10,0 even Success.str dc.b 'done.',10,0 even Return.str dc.b 10,$9B,'0 p',$9B,'3;31mANY KEY TO QUIT !',$9b,'0m',0 even ReqLoad.str dc.b 'Load ProRunner File ...',0 even ReqSave.str dc.b 'Save ProTracker File to ...',0 even ConName.str dc.b 'RAW:0/20/640/100/ProRunCrack 1.0',0 even DosName dc.b 'dos.library',0 even ReqName dc.b 'req.library',0 even