DOSBOX中的阴影菜单(TASM)

时间:2015-04-03 00:36:51

标签: assembly x86 tasm

.MODEL      SMALL
.STACK      64

.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 RECORD      ',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          10,13,  '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
            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
            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
            MOVZX   BX,         ATTRIB
            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
            MOVZX   BX,         ATTRIB
            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
            JE      C90
            JMP     C20
C30:        MOV     ATTRIB,     71H
            CALL    D10DISPLY
            INC     ROW
            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
            MOVZX   AX,         ROW
            SUB     AX,         TOPROW
            IMUL    AX,         19
            LEA     SI,         MENU+1
            ADD     SI,         AX

            MOV     AX,         1300H
            MOVZX   BX,         ATTRIB
            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,         0000
            MOV     DX,         184FH
            INT     10H
            POPA
            RET

Q10CLEAR    ENDP
            END A10MAIN

我目前必须在dosbox(TASM)中创建一个带阴影的菜单作为项目,这是我们教授给出的实际代码。尝试调整不同的行值但仍然收到失真的菜单。有几行似乎包含错误的值:

dosbox screenshot

0 个答案:

没有答案