assume cs:code,ss:stack
stack segment
db 128 dup (0)
stack ends
code segment
start: mov ax,cs
mov ds,ax
mov si,offset int7c
mov ax,0
mov es,ax
mov di,200h
cld
mov cx,offset int7c_end - offset int7c
rep movsb
cli
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
sti
mov ax,4c00h
int 21h
int7c: push bx
push si
jmp short int7c_s
int7cd: dw offset sub1 - offset int7c + 200h
dw offset sub2 - offset int7c + 200h
dw offset sub3 - offset int7c + 200h
dw offset sub4 - offset int7c + 200h
int7c_s:mov bl,ah
mov bh,0
add bx,bx
mov si,offset int7cd - offset int7c + 200h
call word ptr cs:[bx+si]
int7c_ok:
pop si
pop bx
iret
sub1: push bx
push es
push di
push cx
mov bx,0b800h
mov es,bx
mov di,0
mov cx,2000
sub1_s: mov byte ptr es:[di],’ ’
add di,2
loop sub1_s
sub1_ok:pop cx
pop di
pop es
pop bx
ret
sub2: push bx
push es
push di
mov bx,0b800h
mov es,bx
mov di,1
mov cx,2000
sub2_s: and byte ptr es:[di],11111000b
or es:[di],al
add di,2
loop sub2_s
sub2_ok:pop di
pop es
pop bx
ret
sub3: push bx
push es
push di
push cx
mov bx,0b800h
mov es,bx
mov di,1
mov cx,2000
sub3_s: and byte ptr es:[di],10001111b
or es:[di],al
add di,2
loop sub3_s
sub3_ok:pop cx
pop di
pop es
pop bx
ret
sub4: push bx
push ds
push si
push es
push di
mov bx,0b800h
mov ds,bx
mov si,160
mov bx,0b800h
mov es,bx
mov di,0
cld
mov cx,24
sub4_s: push cx
mov cx,160
rep movsb
pop cx
loop sub4_s
mov cx,80
sub4_s1:mov byte ptr es:[di],’ ’
add di,2
loop sub4_s1
sub4_ok:pop di
pop es
pop si
pop ds
pop bx
ret
int7c_end: nop
code ends
end start