{$M 1024,0,0}
Uses Crt;
Const TextVidSeg : Word = $b800;
Var ScrBuf, Pdwns : Word;
Function AllocMemory(Paragraphs : Word) : Word; Assembler;
Asm
mov ax,4800h
mov bx,Paragraphs
int 21h
jnc @Done
mov ax,4c00h
int 21h
@Done:
End;
Procedure PullDown(x1, y1, x2, y2 : Word;
FrameType,
ColorAttr : Byte;
PDName : String); Assembler;
Var DeltaX, DeltaY, AddDI : Word;
Asm
jmp @CodeBegin
@Frame:
db 020h,020h,020h,020h,020h,020h
db 0dah,0c4h,0bfh,0b3h,0c0h,0d9h
db 0c9h,0cdh,0bbh,0bah,0c8h,0bch
db 0d6h,0c4h,0b7h,0bah,0d3h,0bdh
db 0d5h,0cdh,0b8h,0b3h,0d4h,0beh
@FrameOfs:
db 000h,006h,00ch,012h,018h
@CodeBegin:
cmp Pdwns,16
jz @Done
cld
mov di,y1
dec di
mov ax,di
mov cl,5
shl di,cl
mov cl,7
shl ax,cl
add di,ax
mov ax,x1
dec ax
add ax,ax
add di,ax
mov dx,di
add dx,4
mov ax,x2
sub ax,x1
dec ax
mov DeltaX,ax
add ax,2
mov bx,80
sub bx,ax
sub bx,2
add bx,bx
mov AddDI,bx
mov ax,y2
sub ax,y1
dec ax
mov DeltaY,ax
push ds
push di
mov si,di
mov di,Pdwns
mov cl,12
shl di,cl
mov es,ScrBuf
mov ds,TextVidSeg
mov es:[di],si
mov bx,DeltaX
add bx,4
mov es:[di+2],bx
mov cx,DeltaY
add cx,3
mov es:[di+4],cx
mov ax,AddDI
mov es:[di+6],ax
add di,8
@SaveScreen:
push cx
mov cx,bx
rep movsw
add si,ax
pop cx
dec cx
jnz @SaveScreen
pop di
pop ds
mov es,TextVidSeg
xor bh,bh
mov bl,FrameType
lea si,@FrameOfs
add si,bx
mov bl,cs:[si]
lea si,@Frame
add si,bx
mov ah,ColorAttr
mov al,cs:[si]
stosw
mov al,cs:[si+1]
mov cx,DeltaX
rep stosw
mov al,cs:[si+2]
stosw
add di,AddDI
add di,4
push ds
xchg dx,di
mov bx,si
lds si,PDName
mov cl,[si]
xor ch,ch
mov ah,ColorAttr
inc si
@PutName:
lodsb
stosw
dec cx
jnz @PutName
mov di,dx
mov si,bx
pop ds
mov cx,DeltaY
@PutWindow:
push cx
mov al,cs:[si+3]
stosw
mov al,20h
mov cx,DeltaX
rep stosw
mov al,cs:[si+3]
stosw
mov al,08h
inc di
stosb
inc di
stosb
add di,AddDI
pop cx
dec cx
jnz @PutWindow
mov al,cs:[si+4]
stosw
mov al,cs:[si+1]
mov cx,DeltaX
rep stosw
mov al,cs:[si+5]
stosw
mov al,08h
inc di
stosb
inc di
stosb
add di,AddDI
add di,5
mov cx,DeltaX
add cx,2
@PutLastShadowLine:
stosb
inc di
dec cx
jnz @PutLastShadowLine
inc Pdwns
@Done:
End;
Procedure RestoreScreen; Assembler;
Asm
cmp Pdwns,0
jz @Done
cld
dec Pdwns
mov si,Pdwns
mov es,TextVidSeg
push ds
mov ds,ScrBuf
mov cl,12
shl si,cl
mov di,[si]
mov bx,[si+2]
mov cx,[si+4]
mov dx,[si+6]
add si,8
@PutText:
push cx
mov cx,bx
rep movsw
add di,dx
pop cx
dec cx
jnz @PutText
pop ds
@Done:
End;
Begin
ScrBuf := AllocMemory(4096);
TextBackground(4);
ClrScr;
PullDown(10,5,70,20,1,$1f,' Window #1 ');
ReadKey;
PullDown(5,10,60,22,2,$4e,' Window #2 ');
ReadKey;
RestoreScreen;
ReadKey;
RestoreScreen;
End.