;CheckVirus
;von Matthias Kühn
;erweitert durch Andreas Krämer
;(c) KICKSTART '88

;Definitionen

_LVOOpenLibrary   EQU -$0228
_LVOCloseLibrary  EQU -$019e
_LVOOutput        EQU -$003c
_LVOWrite         EQU -$0030
ExecBase          EQU      4

;MACROS

CallSys           MACRO     $\Offset,$\Base
       MOVE.L     \Base,A6
       JSR        _LVO\Offset(A6)
       ENDM

;Programm

Start:
       MOVE.L  SP,Inital_SP ;Stackpointer retten
       BSR     DosOpen_
       BSR     Output_
       BSR     CheckCaptures_
       BSR     WriteCaptures_
       BSR     WriteComment_
Error: BSR     DosClose_
       MOVE.L  Inital_SP,SP ;zurückschreiben des
       RTS                  ;Stackpointer

DosOpen_:                   ;öffnen der DosLibrary
       LEA     DosName,A1
       CLR.L   D0
       CallSys OpenLibrary,ExecBase
       MOVE.L  D0,DosBase
       BEQ     Error
       RTS
DosClose_:
       MOVE.L  DosBase,A1 ;DosBasisAdresse übergeben
       BEQ     \NoDos
       CallSys CloseLibrary,ExecBase
\NoDos:RTS
OutPut_:
       CallSys Output,DosBase ;OutputFile finden
       MOVE.L  D0,Output      ;und retten
       BEQ     Error
       RTS
CheckCaptures_:
       MOVE.L  ExecBase,A6
       CLR.L   D0
       OR.L    $2a(A6),D0  ;ColdCapture
       OR.L    $2e(A6),D0  ;CoolCapture
       OR.L    $32(A6),D0  ;WarmCapture
       OR.L    $222(A6),D0 ;KickMemPtr
       OR.L    $226(A6),D0 ;KickTagPtr
       MOVE.L  D0,Check    ;gleich 0 alle
       RTS                 ;Vektoren = 0
WriteCaptures_:
       MOVE.L  $2a(A6),D0     ;ColdCapture
       LEA     ColdCapture,A0 ;Adresse für ASCII
       JSR     HexASCII_      ;DO in ASCII wandeln
       MOVE.L  $2e(A6),D0     ;CoolCapture

       LEA     CoolCapture,A0
       JSR     HexASCII_
       MOVE.L  $32(A6),D0     ;WarmCapture
       LEA     WarmCapture,A0
       JSR     HexASCII_
       
       MOVE.L  $222(A6),D0    ;KckMemPtr
       LEA     KickMemPtr,A0
       JSR     HexASCII_
       MOVE.L  $226(A6),D0    ;KickTagPtr
       LEA     KickTagPtr,A0
       JSR     HexASCII_
       MOVE.L  OutPut,D1      ;OutputFile in D1
       MOVE.L  #CapText,D2    ;TextAdresse in D2
       MOVE.L  #(CapEnde-CapText),D3 ;länge in D3
       CallSys Write,DosBase  ;Text ausgeben
       RTS
HexASCII_:
       ADD.L   #8,A0      ;ASCII ab A0, 8 Zeichen
\Start:MOVE.L  D0,D1      ;Zeiger auf Bufferende
       AND.B   #$0f,D1    ;ASCII Konvertierung in
       ADD.B   #'0',D1    ;Hex
       CMP.B   #'9',D1
       BLE     \ASCII
       ADD.B   #7,D1
\ASCII:MOVE.B  D1,-(A0)
       LSR.L   #4,D0
       BNE     \Start
       RTS
WriteComment_:
       MOVE.L  OutPut,D1       ;OutputFile in D1
       MOVE.L  #NoVirusText,D2 ;Text in D2
       MOVE.L  #(NoVirusEnde-NoVirusText),D3
       TST.L   Check           ;Vektoren = 0
       BEQ     \NoVir          ;0 = kein Virus
       MOVE.L  #VirusText,D2   ;Text in D2
       MOVE.L  #(VirusEnde-VirusText),D3
       MOVE.L  ExecBase,A6     ;Basisadrese in A6
       CLR.L   $2a(A6)         ;Vektoren löschen
       CLR.L   $2e(A6)
       CLR.L   $32(A6)
       CLR.L   $222(A6)
       CLR.L   $226(A6)
\NoVir:CallSys Write,DosBase   ;Text ausgeben
       RTS
       DATA
DosName:       DC.B    'dos.library',0
       ALIGN
CapText:       DC.B    'Die Vektoren sind:'
               DC.B    $a,$d,'ColdCapture = $'
ColdCapture:   DS.B    8,'0'
               DC.B    $a,$d,'CoolCapture = $'
CoolCapture:   DS.B    8,'0'
               DC.B    $a,$d,'WarmCapture = $'
WarmCapture:   DS.B    8,'0'
               DC.B    $a,$d,'KickMemPtr  = $'
KickMemPtr:    DS.B    $8,'0'
               DC.B    $a,$d,'KickTagPtr  = $'
KickTagPtr:    DS.B    $8,'0'
CapEnde:
       ALIGN
NoVirusText:   DC.B    $a,$d,'Es ist kein resetfester Virus im RAM !'
               DC.B    $a,$d
NoVirusEnde:
       ALIGN
VirusText:     DC.B    $a,$d,'Es ist ein resetfester Virus im RAM !'
               DC.B    $a,$d
               DC.B    $a,$d,'Sind KickMemPtr oder KickTagPtr ungleich'
               DC.B    $a,$d,'Null, druecken Sie jetzt CTRL+Amiga+Amiga.'
               DC.B    $a,$d
               DC.B    $a,$d,'Ansonsten ist er jetzt unschaedlich !'
               DC.B    $a,$d
VirusEnde:
       BSS
DosBase:       DC.L    0
Check:         DC.L    0
Inital_SP:     DC.L    0
Output:        DC.L    0
       END
;Listing Ende
