*******************************************************
* ANORDIC                                             *
* Détection et plantage de la carte Nordic Power ©®   *
*                                                     *
* CODE DEVPAC  Pierre Philippe Launay                 *
* RECHERCHE    Sébastien Rubens                       *
*              Pierre Philippe Launay                 *
*                                                     *
* COPYRIGHT © 09 avril 1993 ArtioDactyl               *
*-----------------------------------------------------*
* Gary Copper of Erotic NightMares                    *
* Sébastien Rubens                                    *
* 16, rue des Lauriers                                *
* 18220 LES AIX D'ANGILLON                            *
* 48.64.46.78                                         *
*-----------------------------------------------------*
*                                                     *
* Toutes les cartes électroniques sont victimes d'un  *
* gros problème. Pour pouvoir craquer un programme,   *
* il leurs faut s'insérer dans ce programme par un    *
* codage approprié. Ce codage approprié attend un     *
* évènement répétitif obligatoire, comme par exemple  *
* la position du faisceau électronique sur l'écran.   *
* Or l'écran du moniteur est renouvelé de nombreuses  *
* fois par seconde (c'est le même principe que celui  *
* de la technique du cinématographe).                 *
*                                                     *
* Quand l'évènement répétitif obligatoire arrive, la  *
* carte de craquage va insérer son propre code de     *
* craquage. Par exemple, quand le faisceau arrive sur *
* la ligne 16, la carte insère un code disant "O mon  *
* ami, va sur mon programme"... A la fin du craquage  *
* la carte revient à la ligne 16 et tout va pour le   *
* mieux dans le meilleurs des mondes.                 *
*                                                     *
* La ruse consiste à laisser écrire le code de        *
* détournement et à le remplacer au fur et à mesure   *
* par un morceau de rien... Tant que le récipiendaire *
* de la carte électronique utilise le programme à     *
* craquer sans rien faire, le code de détournement n' *
* agit pas. Dès qu'il veut l'utiliser, il n'active    *
* plus le code normal de détournement de la carte...  *
* mais notre propre code de remplacement. Outré, le   *
* récipiendaire voit alors survenir brutalement       *
* l'implosion de toutes ses certitudes.               *
*                                                     *
*                                                     *
*  AVANT      NORDIC          NOUS                    *
*  -------    -------         -------                 *
*  -------    -------  crac   -------  splof          *
*  -------    ---xxxxx/    \  ---yyyyy/               *
*  -------    ------- \____/  -------                 *
*  -------    -------         -------                 *
*  -------    -------         -------                 *
*  -------    -------         -------                 *
*                                                     *
* Il y a plus a plus amusant. Au lieu de provoquer le *
* plantage, je trouve plus judicieux d'écrire un code *
* personnel faisant croire au craqueur qu'il a réussi *
* son exploit. Il aura l'impression de décrypter le   *
* programme craqué mais en fait, il se laisse mener   *
* par le bout du nez et on ne lui laisse voir que ce  *
* qu'on a envie de lui laisser croire.                *
*                                                     *
* Amicalement,                                        *
*                                                     *
* Pierre Philippe                                     *
*                                                     *     
*******************************************************

   opt   d+,p+ Debug information, Position independent code 
   
****************************
*  CONSTANTES              *
****************************
rouge =  $F00
vert  =  $0F0
bleu  =  $00F
blanc =  $FFF
noir  =  $000

startlist   =  $026

*%%%%%%%%%%%%%%%%%%
*  EXEC           %
*%%%%%%%%%%%%%%%%%%
_SysBase =  4
IntBlit  =  $9c   Interruption fin de blitter(_GFXBase)
Forbid   =  -132
Permit   =  -138

*%%%%%%%%%%%%%%%%%%
*  DMA   %
*%%%%%%%%%%%%%%%%%%
_DMABase =  $DFF000
dmaconr  =  $002  Contrôle de lecture DMA (lecture)
vposr    =  $004   Position verticale, bits poids fort (lecture)
intenar  =  $01C  Autorisation des interruptions (lecture)
dskpth   =  $020  Adresse du DMA disque, bits 16-18 (écriture)
dsklen   =  $024  Longueur des données disques (écritures)
vhposw   =  $02C  Position verticale et horizontale
copcon   =  $02E  Contrôle du Copper (écriture)
bltcon0  =  $040  Contrôle du Blitter 0 (écriture)
bltcon1  =  $042  Contrôle du Blitter 1 (écriture)
bltapth  =  $050  Source A
bltdpth  =  $054  Destination D
bltsize  =  $058  Dimension lxh et démarrage du Blitter
bltdmod  =  $066  Modulo destination D
bltadat  =  $074  Données source A
cop1lc   =  $080  Adresse première liste copper
cop2lc   =  $084  Adresse deuxième liste copper
copjmp1  =  $088  Saut à la liste numéro 1
copjmp2  =  $08A  Saut à la liste numéro 2
dmacon   =  $096  Contrôle DMA (écriture)
intena   =  $09A  Autorisation des interuptions (écriture)
intreq   =  $09C  Demande d'interruption (écriture)
color00  =  $180  Couleur numéro 0 

****************************
*  MACRO                   *
****************************

WBLT: MACRO
blt\@:   btst  #14,2(a6)
   bne.s blt\@
   ENDM
   
CALLEXEC MACRO
   jsr   \1(a6)
   ENDM

****************************
*  CODAGE                  *
****************************
   SECTION  prg,code_c

   move.l   (_SysBase).w,a6
   CALLEXEC Forbid

   lea.l _GFXBase(pc),a0
   lea.l _DMABase,a5
   move.w   intenar(a5),(a0)
   move.w   dmaconr(a5),2(a0)
   
   or.l  #$c0008200,(a0)+
   move.l   IntBlit(a6),a1
   move.l   startlist(a1),(a0)
   move.w   #$7fff,dmacon(a5)
   move.w   #$7fff,intena(a5)

   lea.l $68000,a0
   move.w   #$2000,d7
blitter: move.l   #$ffffffff,(a0)+
   dbf   d7,blitter

;  move.w   #$8280,dmacon(a5)
   move.w   #$8290,dmacon(a5)
   move.w   #$c000,intena(a5)

   lea.l coper1(pc),a0
   move.l   a0,cop1lc(a5)
   move.w   #$ffff,copcon(a5)

clic: move.l   vposr(a5),d0
   and.l #$1ff00,d0
   cmp.l #$10100,d0
   bne.s clic

   move.w   #vert,color00(a5)
   lea.l coper2(pc),a0
   move.l   a0,cop2lc(a5)
   clr.w copjmp2(a5)

   moveq #40,d0
   dbf   d0,*

;  move.w   #$0000,dsklen(a5)
;  move.l   #$68000,dskpth(a5)
;  move.w   #$bfff,dsklen(a5)    ; 32 ko
;  move.w   #$bfff,dsklen(a5)    ; 32 ko

   move.w   #rouge,color00(a5)
   btst  #6,$bfe001
   bne.s clic

*%%%%%%%%%%%%%%%%%%
*  RESTAURE %
*%%%%%%%%%%%%%%%%%%

   move.w   #$7fff,dmacon(a5)
   move.w   #$7fff,intena(a5)
   lea.l _GFXBase(pc),a0
   move.w   (a0)+,intena(a5)
   move.w   (a0)+,dmacon(a5)
   move.l   (a0)+,cop1lc(a5)
   clr.w copjmp1(a5)

;  bset.b   #0,$bfe001
;  bclr.b   #0,$bfe001

   CALLEXEC Permit
   moveq #0,d0
   rts
****************************
*  VARIABLES               *
****************************
_GFXBase:   ds.l  3

coper1:  dc.w  $100f,$fffe ; attendre ligne 16
   dc.w  color00,bleu

; ici, on va déclencher l'interruption du copper
; et on va effacer la mémoire au blitter !!!!!
   dc.w  dmacon,$0040   ; blitter non prioritaire
   dc.w  bltcon0,$0100  ; dest = a
   dc.w  bltcon1,$0000
   dc.w  bltdmod,$ff80  ; modulo = -128 octets (1024 pts)
   dc.w  bltadat,$ffff  ; a = $ffff
   dc.w  bltapth,$0000
   dc.w  bltdpth,$0000
   dc.w  bltsize,$0000
   dc.w  $ffff,$fffe

coper2:  dc.w  color00,blanc
   dc.w  $ffff,$fffe
