21,458
社区成员
发帖
与我相关
我的任务
分享
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 ; 设置新行为反相显示
JMP C20
C90: POPA ; 恢复寄存器
RET
C10INPUT ENDP
; 设置菜单行为高差度(如被选)
; 或正常差度(如为被选)
; --------------------------------------------------------------
D10DISPLY PROC NEAR
PUSHA ; 保存通用寄存器
MOV AL, ROW ; Row通知哪行要设置
MOV AH, 0
SUB AX, TOPROW
IMUL AX, 19 ; 乘以行的长度
LEA SI, MENU+1 ; 选择的菜单行
ADD SI, AX
MOV AX, 1300H ; 请求显示
MOV BL, ATTRIB ; 页和属性
MOV BH, 0
MOV BP, SI ; 字符串
MOV CX, 17 ; 串长度
MOV DH, ROW ; 行
MOV DL, LEFCOL+1 ; 列
INT 10H
POPA
RET
D10DISPLY ENDP
; 清屏
; --------------------------------------------------------------
Q10CLEAR PROC NEAR
PUSHA
MOV AX, 0600H
MOV BH, 61H ; 棕底蓝字
MOV CX, 0000H ; 全屏
MOV DX, 184FH ;
INT 10H
POPA
RET
Q10CLEAR ENDP
END A10MAIN
TITLE A10SEL (EXE)
.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.'
; ---------------------------------------------------------
.386
.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 ; 设置新行为反相显示
JMP C20
C90: POPA ; 恢复寄存器
RET
C10INPUT ENDP
; 设置菜单行为高差度(如被选)
; 或正常差度(如为被选)
; --------------------------------------------------------------
D10DISPLY PROC NEAR
PUSHA ; 保存通用寄存器
MOV AL, ROW ; Row通知哪行要设置
MOV AH, 0
SUB AX, TOPROW
IMUL AX, 19 ; 乘以行的长度
LEA SI, MENU+1 ; 选择的菜单行
ADD SI, AX
MOV AX, 1300H ; 请求显示
MOV BL, ATTRIB ; 页和属性
MOV BH, 0
MOV BP, SI ; 字符串
MOV CX, 17 ; 串长度
MOV DH, ROW ; 行
MOV DL, LEFCOL+1 ; 列
INT 10H
POPA
RET
D10DISPLY ENDP
; 清屏
; --------------------------------------------------------------
Q10CLEAR PROC NEAR
PUSHA
MOV AX, 0600H
MOV BH, 61H ; 棕底蓝字
MOV CX, 0000H ; 全屏
MOV DX, 184FH ;
INT 10H
POPA
RET
Q10CLEAR ENDP
END A10MAIN
TITLE A10SELMU (EXE) .386 .MODEL SMALL .STACK 128; ------------------------------------------ .DATATOPROW 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), 0BCHPROMPT DB 'To select an item, use <Up/Down Arrow>' DB ' and press <Enter>.' DB 13, 10, 'Press <Esc> to exit.'; --------------------------------------------------------- .CODEA10MAIN 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 RETB10MENU ENDP; 接受键盘请求,箭头和回车用来选择菜单行; ---------------------------------------------------------C10INPUT PROC NEAR PUSHAC20: 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 C50C40: MOV ATTRIB, 71H ; 白底蓝字 CALL D10DISPLY ; 设置原来的行为正常显示 DEC ROW CMP ROW, TOPROW+1 ; 在上边行下面? JAE C50 ; 否,继续 MOV ROW, BOTROW-1 ; 是,重新设置 C50: MOV ATTRIB, 17H ; 蓝底白字 CALL D10DISPLY ; 设置新行为反相显示 JMP C20C90: POPA ; 恢复寄存器 RETC10INPUT ENDP; 设置菜单行为高差度(如被选); 或正常差度(如为被选); --------------------------------------------------------------D10DISPLY PROC NEAR PUSHA ; 保存通用寄存器 MOV AL, ROW ; Row通知哪行要设置 MOV AH, 0 SUB AX, TOPROW IMUL AX, 19 ; 乘以行的长度 LEA SI, MENU+1 ; 选择的菜单行 ADD SI, AX MOV AX, 1300H ; 请求显示 MOV BL, ATTRIB ; 页和属性 MOV BH, 0 MOV BP, SI ; 字符串 MOV CX, 17 ; 串长度 MOV DH, ROW ; 行 MOV DL, LEFCOL+1 ; 列 INT 10H POPA RETD10DISPLY ENDP; 清屏; --------------------------------------------------------------Q10CLEAR PROC NEAR PUSHA MOV AX, 0600H MOV BH, 61H ; 棕底蓝字 MOV CX, 0000H ; 全屏 MOV DX, 184FH ; INT 10H POPA RETQ10CLEAR ENDP END A10MAIN