TITLE A10SELMU (EXE)
.386
.MODEL SMALL
.STACK 128
; ------------------------------------------
.DATA
TOPROW EQU 08 ; 菜单上部的行
BOTROW EQU 15 ; 菜单下部的行
LEFCOL EQU 26 ; 菜单左边的列
ATTRIB DB ? ; 屏幕的属性
ROW DB 00 ; 屏幕的行
SHADOW DB 19 DUP(0DBH) ; 阴影符
MENU DB 0C9H, 17 DUP(0CDH), 0BBH
DB 0BAH, ' Add recors ', 0BAH
DB 0BAH, ' Delete records ', 0BAH
DB 0BAH, ' Enter orders ', 0BAH
DB 0BAH, ' Print report ', 0BAH
DB 0BAH, ' Update accounts ', 0BAH
DB 0BAH, ' View records ', 0BAH
DB 0C8H, 17 DUP(0CDH), 0BCH
PROMPT DB 'To select an item, use <Up/Down Arrow>'
DB ' and press <Enter>.'
DB 13, 10, 'Press <Esc> to exit.'
; ---------------------------------------------------------
.CODE
A10MAIN PROC FAR
MOV AX, @DATA ; 初始化段寄存器
MOV DS, AX
MOV ES, AX
CALL Q10CLEAR ; 清屏
MOV ROW, BOTROW+4 ; 设置行
A20:
CALL B10MENU ; 显示菜单
MOV ROW, TOPROW+1 ; 设置上部菜单项的行
MOV ATTRIB, 16H ; 设置反相显示
CALL D10DISPLY ; 当前菜单行高度
CALL C10INPUT ; 菜单选择
CMP AL, 1BH ; 按下Escape键
JNE A20 ; 否,继续
MOV AX, 0600H ; 是,结束
CALL Q10CLEAR ; 清屏
MOV AX, 4C00H
INT 21H ; 处理结束
A10MAIN ENDP
; 显示阴影框、菜单以及提示符
; ---------------------------------------------------------
B10MENU PROC NEAR
PUSHA ; 保存通用寄存器
MOV AX, 1301H ; 请求显示阴影框
MOV BX, 0060H ; 页和属性
LEA BP, SHADOW ; 阴影符
MOV CX, 19 ; 19个字符
MOV DH, TOPROW+1 ; 阴影上边的行
MOV DL, LEFCOL+1 ; 阴影左边的列
B20: INT 10H
INC DH ; 下一行
CMP DH, BOTROW+2 ; 显示完所有行?
JNE B20 ; 否,重复
MOV ATTRIB, 71H ; 白底蓝字
MOV AX, 1300H ; 请求显示菜单
MOV BL, ATTRIB ; 页和属性
MOV BH, 0
LEA BP, MENU ; 菜单行
MOV CX, 19 ; 行的长度
MOV DH, TOPROW ; 行
MOV DL, LEFCOL ; 列
B30:
INT 10H
ADD BP, 19 ; 菜单下一行
INC DH ; 下一行
CMP DH, BOTROW+1 ; 所有行显示完
JNE B30 ; 否,重复
MOV AX, 1301H ; 请求显示字符
MOV BL, ATTRIB ; 页和属性
MOV BH, 0
LEA BP, PROMPT ; 提字符的行
MOV CX, 79 ; 行的长度
MOV DH, BOTROW+4 ; 屏幕行
MOV DL, 00 ; 列
INT 10H
POPA
RET
B10MENU ENDP
; 接受键盘请求,箭头和回车用来选择菜单行
; ---------------------------------------------------------
C10INPUT PROC NEAR
PUSHA
C20: MOV AH, 10H ; 从键盘请求一个
INT 16H ; 字符
CMP AH, 50H ; 下箭头?
JE C30
CMP AH, 48H ; 上箭头?
JE C40
CMP AL, 0DH ; 回车键?
JE C90
CMP AL, 1BH ; Escape键?
JE C90
JMP C20 ; 都不是重新输入
C30: MOV ATTRIB, 71H ; 白底蓝字
CALL D10DISPLY ; 设置原来的行为正常显示
INC ROW ; 加1到下一行
CMP ROW, BOTROW-1 ; 超过了底边的一行?
JBE C50 ; 否,继续
MOV ROW, TOPROW+1 ; 是,重新设置
JMP C50
C40: MOV ATTRIB, 71H ; 白底蓝字
CALL D10DISPLY ; 设置原来的行为正常显示
DEC ROW
CMP ROW, TOPROW+1 ; 在上边行下面?
JAE C50 ; 否,继续
MOV ROW, BOTROW-1 ; 是,重新设置
C50: MOV ATTRIB, 17H ; 蓝底白字
CALL D10DISPLY ; 设置新行为反相显示
详细解决方案
这段代码哪里有有关问题,求指教
热度:347 发布时间:2013-02-26 00:00:00.0
相关解决方案