' ************************************************************
' * THE PATRIOTE V3.0                                        *
' * Anti-Saddam hussein virus                                *
' *                                                          *
' * Copyright © 1993 by ArtioDactyl                          *
' *----------------------------------------------------------*
' * Note de Pierre Philippe Launay:                          *
' * Ce code Amos est issu d'un programme du domaine public.  *
' * Il a fallu beaucoup de temps et de compétences pour le   *
' * réaliser. Ce codage vaut son pesant d'or, alors merci    *
' * d'envoyez un soutien financier à ses premiers auteurs    *
' * avec la référence A.B.E. DP 93.                          *
' *                                                          *
' *   Hervé BOCCIA                    Thierry IMBERT         *
' *   Bâtiment F16 les Sauges         12 les Blondines       *
' *   Les Cadeneaux                   F-13170 LA GAVOTTE     *
' *   F-13170 LES PENNES MIRABEAUX                           *
' ************************************************************
'
'
'-------------------------------------------------------------
'                                                            -
'         Ce Programme détecte et détruit le                 -
'               Saddam Hussein Virus                         -
'            c'est aussi une illustration de                 -
'         l' utilisation de routines internes                -
'         pour lire et écrire des secteurs de la             -
'           disquette ...  et sous AMOS !!!                  -
'-------------------------------------------------------------
'
'
Hide On 
Request Off 
Screen Open 0,320,256,32,0
Curs Off : Flash Off : Cls 0
'
' Ici on a charge les banques residentes une bonne fois pour toutes
'
'Screen Display 0,,100,, 
'Erase 12
'Reserve As Data 12,2000 
'Bload "df0:l/disk-validator",Start(12)
'Load "df1:packedp30",16 
'
'
Get Fonts 
I=1
'Do  
'A$=Upper$(Mid$(Font$(I),1,9)) 
'If A$=Upper$("P3.0_font") Then Set Font I : Exit
'Inc I 
'Loop  
Fade 1
Wait 15
Unpack 16
Fade 3,0,$ECA,$E00,$A00,$D80,$FE0,$8F0,$80,$B6,$DD,$AF,$7C,$F,$70F,$C0E,$C08,$700,$5,$500,$25,$36,$147,$158,$258,$369,$57A,$68B,$7AC,$9BC,$BCD,$DDE,$FFF
Dim HASH(4)
Global HASH(),HRERR,HWERR,ERR
Def Fn TRANS$(A,B)=String$("0",B-Len(Mid$(Str$(A),2)))+Mid$(Str$(A),2)
'
' ***********************
' * Initialisation DF0: *
' ***********************
'
' Reservation pour io_request et disk_port
Erase 10
Erase 11
Reserve As Data 10,100
Reserve As Data 11,100
For I=0 To 99
   Poke Start(10)+I,0
   Poke Start(11)+I,0
Next 
DPBASE=Start(10)
IOBASE=Start(11)
'
' init diskport
'
Doke DPBASE+8,$400
Poke DPBASE+15,31
Loke DPBASE+20,DPBASE+24
Loke DPBASE+28,DPBASE+20
'
' init iorequest 
'
Poke IOBASE+8,5
Loke IOBASE+14,DPBASE
Doke IOBASE+18,48
'
' Reserve buffer 
'
Dreg(1)=$10002
Dreg(0)=512
BUFFER=Execall(-198)
'
' Findtask 
'
Areg(1)=0
TASK=Execall(-294)
'
' transfert dans diskport
'
Loke DPBASE+16,TASK
'
' ouverture du trackdisk.device pour DF0:
'
Dreg(0)=0
A$="trackdisk.device"+Chr$(0)
Dreg(1)=0
Areg(1)=IOBASE
Areg(0)=Varptr(A$)
OK=Execall(-444)
'
' ***********************
' * Programme principal *
' ***********************
'
'
INIT$= Fn TRANS$(0,5)
Ink 19,24
Text 131,80,INIT$
Text 131,93,INIT$
Text 131,106,INIT$
Text 278,80,INIT$
Text 278,93,INIT$
Text 278,106,INIT$
MEGA=(Fast Free)><0
_EXECBASE=Leek(4)
CAPTURE=$2A
RDISK
TESTEDDISK=0
INFECTEDDISK=0
'
Do 
   Ink 19,24
   Text 131,80,INIT$
   Text 131,93,INIT$
   Text 278,80,INIT$
   Text 278,93,INIT$
   Ink 19,24
   Text 131,106, Fn TRANS$(TESTEDDISK,5)
   Text 278,106, Fn TRANS$(INFECTEDDISK,5)
   HRERR=0
   HWERR=0
   AFF["Insert disk in DF0:"]
   Repeat 
   Until Exist("df0:")
   Inc TESTEDDISK
   AFF["Waiting for saddam attack ..."]
   If Leek(_EXECBASE+CAPTURE)=0
      Wait 400
   Else Wait 100
   End If 
   RSECTOR[IOBASE,880,BUFFER]
   MOTOROFF[IOBASE]
   VD=Leek(BUFFER+$13C)
   If MEGA
      CLTRK=Leek($C03A9A)
   Else 
      CLTRK=Leek($46FA)
   End If 
   If(CLTRK=$FE9C12) and VD
      AFF["Disk is ok ! Remove it please ..."]
      Repeat : Until Not Exist("df0:")
   Else 
      Inc INFECTEDDISK
      AFF["DANGER : This disk is infected !!! Press a key ."]
      Wait Key 
      SADDAMOUT[MEGA]
      CODED=0
      DISKPROT[IOBASE]
      While ERR
         AFF["disk write protected . Deprotect it ."]
         Repeat 
         Until Not Exist("df0:")
         AFF["Reinsert it please ..."]
         Repeat 
         Until Exist("df0:")
         DISKPROT[IOBASE]
      Wend 
      AFF["Repairation in process ..."]
      For I=0 To 159
         For J=0 To 10
            BL=I*11+J
            RSECTOR[IOBASE,BL,BUFFER]
            If ERR
               Inc HRERR
               Ink 19,24 : Text 278,80, Fn TRANS$(HRERR,5)
            End If 
            If Leek(BUFFER)=$4952414B
               Inc CODED
               O=BL*512
               Loke BUFFER,$8
               PTR=BUFFER+4
               For K=1 To 127
                  A=Leek(PTR)
                  A=A xor O
                  Loke PTR,A
                  Add PTR,4
               Next 
            End If 
            Ink 19,24
            Text 131,80, Fn TRANS$(BL,5)
            Text 131,93, Fn TRANS$(CODED,5)
            WSECTOR[IOBASE,BL,BUFFER]
            If ERR
               Inc HWERR
               Ink 19,24 : Text 278,93, Fn TRANS$(HWERR,5)
            End If 
         Next 
         UPDISK[IOBASE,BL,BUFFER]
         If ERR
            Add HWERR,11
            Ink 19,24 : Text 278,93, Fn TRANS$(HWERR,5)
         End If 
      Next 
      AFF["Validating disk ..."]
      RSECTOR[IOBASE,880,BUFFER]
      If ERR
         Inc HRERR
         Ink 19,24 : Text 278,80, Fn TRANS$(HRERR,5)
      End If 
      A=Leek(BUFFER+$140)
      Loke BUFFER+$13C,A
      Loke BUFFER+$140,0
      WSECTOR[IOBASE,880,BUFFER]
      If ERR
         Inc HWERR
         Ink 19,24 : Text 278,93, Fn TRANS$(HWERR,5)
      End If 
      UPDISK[IOBASE,880,BUFFER]
      If ERR
         Add HWERR,11
         Ink 19,24 : Text 278,93, Fn TRANS$(HWERR,5)
      End If 
      MOTOROFF[IOBASE]
      RIGHTDV[IOBASE,BUFFER]
      AFF["End of operation . Remove disk please ... "]
      Repeat : Until Not Exist("df0:")
   End If 
Loop 
'
' **********************
' *     Procedures     *
' **********************
'
Procedure RSECTOR[IOBASE,BLOCK,BUFFER]
   DEP=BLOCK*512
   '
   Doke IOBASE+28,2
   Loke IOBASE+36,512
   Loke IOBASE+40,BUFFER
   Loke IOBASE+44,DEP
   '
   Areg(1)=IOBASE
   ERR=Execall(-456)
   ERR=Peek(IOBASE+31)
   Poke IOBASE+31,0
End Proc
Procedure WSECTOR[IOBASE,BLOCK,BUFFER]
   DEP=BLOCK*512
   '
   Doke IOBASE+28,3
   Loke IOBASE+36,512
   Loke IOBASE+40,BUFFER
   Loke IOBASE+44,DEP
   '
   Areg(1)=IOBASE
   ERR=Execall(-456)
   ERR=Peek(IOBASE+31)
   Poke IOBASE+31,0
End Proc
Procedure UPDISK[IOBASE,BLOCK,BUFFER]
   DEP=BLOCK*512
   '
   Doke IOBASE+28,4
   Loke IOBASE+36,512
   Loke IOBASE+40,BUFFER
   Loke IOBASE+44,DEP
   '
   Areg(1)=IOBASE
   ERR=Execall(-456)
   ERR=Peek(IOBASE+31)
   Poke IOBASE+31,0
End Proc
Procedure MOTOROFF[IOBASE]
   Areg(1)=IOBASE
   Doke IOBASE+28,9
   Loke IOBASE+36,0
   ERR=Execall(-456)
End Proc
Procedure AFF[A$]
   Ink 24
   Bar 5,113 To 314,121
   Ink 31,24
   A=(320-Len(A$)*5)/2
   Text A,120,Upper$(A$)
End Proc
Procedure RDISK
   AFF["Remove all disks in all drives"]
   Repeat 
      TEST=0
      For I=0 To 3
         TEST=TEST+Exist("df"+Mid$(Str$(I),2)+":")
      Next 
   Until TEST=0
End Proc
Procedure SADDAMOUT[MEGA]
   If MEGA
      Loke $C03A9A,$FE9C12
   Else 
      Loke $46FA,$FE9C12
   End If 
   If MEGA
      BEGINIO=Leek($C03A88)
   Else 
      BEGINIO=Leek($46E8)
   End If 
   Doke BEGINIO,$4EF9
   Loke BEGINIO+2,$FE9C3E
End Proc
Procedure RIGHTDV[IOBASE,BUFFER]
   Def Fn TRANS$(A,B)=String$("0",B-Len(Mid$(Str$(A),2)))+Mid$(Str$(A),2)
   BLDV=0
   AFF["Scanning for disk-validator ..."]
   For I=0 To 779
      RSECTOR[IOBASE,880+I,BUFFER]
      If ERR
         Inc HRERR
         Ink 19,24 : Text 278,80, Fn TRANS$(HRERR,5)
      End If 
      If Leek(BUFFER+508)=$FFFFFFFD Then FINDDV[BUFFER]
      If Leek(BUFFER)=$12345678 Then BLDV=880+I : Exit 
   Next 
   If BLDV Then Goto SUIT
   For I=0 To 779
      RSECTOR[IOBASE,779-I,BUFFER]
      If ERR
         Inc HRERR
         Ink 19,24 : Text 278,80, Fn TRANS$(HRERR,5)
      End If 
      If Leek(BUFFER+508)=$FFFFFFFD Then FINDDV[BUFFER]
      If Leek(BUFFER)=$12345678 Then BLDV=779-I : Exit 
   Next 
   SUIT:
   MOTOROFF[IOBASE]
   For I=0 To 3
      HASH(I)=Leek(BUFFER+308-I*4)
   Next 
   For I=0 To 3
      RSECTOR[IOBASE,HASH(I),BUFFER]
      If ERR
         Inc HRERR
         Ink 19,24 : Text 278,80, Fn TRANS$(HRERR,5)
      End If 
      For J=488*I To 488+I+487
         Poke BUFFER+24+J-488*I,Peek(Start(12)+J)
      Next 
      Loke BUFFER+20,0
      SS=0
      For K=0 To $7F
         Add SS,-Leek(BUFFER+K*4)
      Next 
      Loke BUFFER+20,SS
      WSECTOR[IOBASE,HASH(I),BUFFER]
      If ERR
         Inc HWERR
         Ink 19,24 : Text 278,93, Fn TRANS$(HWERR,5)
      End If 
      UPDISK[IOBASE,HASH(I),BUFFER]
      If ERR
         Add HWERR,11
         Ink 19,24 : Text 278,93, Fn TRANS$(HWERR,5)
      End If 
   Next 
   MOTOROFF[IOBASE]
End Proc
Procedure FINDDV[BUFFER]
   A$="DISK-VALIDATOR"
   FLAG=1
   B$=""
   For I=1 To 14
      C$=Upper$(Chr$(Peek(BUFFER+432+I)))
      If C$<" " Then B$=B$+"." Else B$=B$+C$
   Next 
   If B$=A$ Then Loke BUFFER,$12345678
End Proc
Procedure DISKPROT[IOBASE]
   Doke IOBASE+28,15
   '
   Areg(1)=IOBASE
   ERR=Execall(-456)
   ERR=Leek(IOBASE+32)
   Loke IOBASE+32,0
End Proc
'
