📄 a2.asm
字号:
;*****************************************************************************
;A2:在屏幕上开出三个窗口:起止坐标为(5,10)和(15,30),
;(5,50)和(15,70),(18,15)和(22,65)。要求可用
;左右方向键选择左窗口或右窗口为当前活动窗口。当一行字符显示
;满后(左右窗口一行显示20个字符,下窗口显示50个字符),窗口
;自动向上卷动一行,输入的字符仍显示与最低一行,窗口最高一行
;向上卷动后消失。用上下方向键可使活动窗口及下窗口内容同时
;上卷或下卷。输入命令串‘END’后结束程序。(huangyujie)
;*****************************************************************************
draw_win macro win_ulr, win_ulc,win_lrr,win_lrc
mov ah,6
mov al,win_lrr
sub al,win_ulr
add al,1
mov ch,win_ulr
mov cl,win_ulc
mov dh,win_lrr
mov dl,win_lrc
mov bh,70h
int 10h
endm
;----------------------------------------------------------------------------------------
scroll_win macro win_ulr, win_ulc,win_lrr,win_lrc,downup
mov ah,downup
mov al,1
mov ch,win_ulr
mov cl,win_ulc
mov dh,win_lrr
mov dl,win_lrc
mov bh,70h
int 10h
endm
;---------------------------------------------------------------------------------------
pos_curse macro x,y
mov ah,2
mov dh,x
mov dl,y
mov bh,0
int 10h
endm
;---------------------------------------------------------------------------------------
get_char macro
mov ah,0h
int 16h
mov dx,ax
mov string,al
mov ah,9 ;display al
mov bh,0 ;page 0
mov bl,70h
mov cx,1 ;number of repeat char
int 10h
cmp al,1bh ;Esc_key
jz exit
cmp dh,4bh
je win1
cmp dh,4dh
je win2
cmp dh,48h
je rolup
cmp dh,50h
je roldw
endm
;---------------------------------------------------------------------------------------
display macro opr
pos_curse dwx,dwy
mov ah,9
mov al,opr
mov bh,0 ;page 0
mov bl,70h
mov cx,1 ;number of repeat char
in 10h
endm
;*****************************************************************************
datarea segment
lwx db ?
lwy db ?
rwx db ?
rwy db ?
dwx db ?
dwy db ?
flag db ?
string db ?
dwup db ?
messerror db 13,10,'Input Error!',13,10,'$'
datarea ends
;****************************************************************************
prognam segment
;----------------------------------------------------------------------------------------
main proc far
assume cs:prognam,ds:datarea
start:
push ds
sub ax,ax
push ax
mov ax,datarea
mov ds,ax
rolup: mov dwup,6
call clear_screen
mov flag,1
draw_win 5,10,15,30
draw_win 5,50,15,70
draw_win 18,15,22,65
mov lwx,15
mov lwy,10
mov rwx,15
mov rwy,50
mov dwx,22
mov dwy,15
jmp get1
roldw: mov dwup,7
call clear_screen
mov flag,1
draw_win 5,10,15,30
draw_win 5,50,15,70
draw_win 18,15,22,65
mov lwx,5
mov lwy,10
mov rwx,5
mov rwy,50
mov dwx,18
mov dwy,15
get1:
pos_curse lwx,lwy
get_char
display string
add dwy,1
add lwy,1
cmp lwy,30
jne get1
jmp win1
win1:
cmp lwy,30
jne get2
mov lwy,10
scroll_win 5,10,15,30,dwup
get2:
pos_curse lwx,lwy
get_char
add lwy,1
cmp dwy,65
jne dcon1
mov dwy,15
scroll_win 18,15,22,65,dwup
dcon1:
display string
add dwy,1
cmp lwy,30
jne get2
jmp win1
win2:
cmp rwy,70
jne get3
mov rwy,50
scroll_win 5,50,15,70,dwup
get3:
pos_curse rwx,rwy
get_char
add rwy,1
cmp dwy,65
jne dcon2
mov dwy,15
scroll_win 18,15,22,65,dwup
dcon2:
display string
add dwy,1
cmp rwy,70
jne get3
jmp win2
exit:
mov ax,3h
int 10h
ret
main endp
;---------------------------------------------------------------------------------------
clear_screen proc near
push ax
push bx
push cx
push dx
mov ah,6
mov al,0 ;blank screen
mov bh,7 ;blank line
mov ch,0
mov cl,0
mov dh,24
mov dl,79
int 10h
mov dx,0
mov ah,2
int 10h
pop dx
pop cx
pop bx
pop ax
ret
clear_screen endp
;**************************************************************************
prognam ends
;**************************************************************************
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -