📄 _disp.asm
字号:
;------------------------------------------------------------------------------------------------
;WHEN MENU IS ROLLED ONE PAGE, THIS FUNCTION IS NEEDED
;IN PARAMETER:
; DPTR: CURRENT SELECTED MENU ITEM POINTER
;OUT PARAMETER:
;------------------------------------------------------------------------------------------------
PROC DRAWMENU
DRAWMENU:
LCALL DRAW_UD_ARROW
MOV DPH,ITEM_SEL_H
MOV DPL,ITEM_SEL_L
MOV R5,#00H ;COUN THE LINE NUMBER ALREADY OUTED
DR_NXT_ITEM:
MOV A,R5 ;R6=2*R5 BECAUSE 16*8 NEEDS 2 LINE TO SHOW ONE CHAR
MOV R6,A
MOV R7,#00H
CLR F0
CJNE R6,#00H,DR_NM_CHAR
SETB F0
DR_NM_CHAR:
LCALL DRAW_MENU_ITEM
;------------------------------------------------------------
PUSH DPH
PUSH DPL
LCALL INC_DPTR6
LCALL GET_POINTER ;GET HELP INFO STRING ADDR
CJNE R5,#00H,NOT_HLP ; IS THE FIRST LINE?
LCALL NULL_DPTR
JC DR_HLP
SJMP NOT_HLP ;NO HELP INFORMATION
DR_HLP: MOV R6,#00H
MOV R7,#12D
LCALL DRAW_MI_HELP
NOT_HLP:POP DPL
POP DPH
;-----------------------------------------------------------
LCALL GET_POINTER ;NOW DPTR POINTS TO NEXT MENU ITEM STRING
INC R5
LCALL NULL_DPTR
JC DR_NXT
RET
DR_NXT: CJNE R5,#08H,DR_NXT_ITEM
RET
END
;------------------------------------------------------------------------------------------------
; DRAW_UD_ARROW
PROC DRAW_UD_ARROW
DRAW_UD_ARROW:
MOV DPH,ITEM_SEL_H
MOV DPL,ITEM_SEL_L
LCALL TO_STR_END
INC DPTR
INC DPTR
LCALL GET_POINTER
LCALL NULL_DPTR
JNC NO_UP_ARROW
DIS_UP_ARROW:
MOV DPTR,#U_ARROW_SML
MOV R6,#00H
MOV R7,#54D
LCALL DIS_8_6
NO_UP_ARROW:
MOV DPH,ITEM_SEL_H
MOV DPL,ITEM_SEL_L
MOV R5,#00H
NEXT: LCALL GET_NEXT
INC R5
CJNE R5,#08H,NOT_PG_END
LCALL NULL_DPTR
JNC NO_NEXT
MOV DPTR,#D_ARROW_SML
MOV R6,#07H
MOV R7,#54D
LCALL DIS_8_6
RET
NOT_PG_END:
LCALL NULL_DPTR
JC NEXT
NO_NEXT:RET
END
;------------------------------------------------------------------------------------------------
;DRAW_MENU_ITEM
;
;给定DPTR,R6,R7
;然后调用本程序,就会在R6,R7所指向的坐标处显示一个字符串,它以\0结束
;
;IN PARAMETERS:
; DPTR: ADDRESS OF DATATO BE DISPLAYED
; THIS DATA IS A STRING ,WITH \0 TERMINATE
; F0: THIS BIT INDICATE WHETHER THE CURRENT
; SELECTED MENU ITEM IS SELECTED OR NOT
; R6 X---PAGE
; R7: Y---COLUME
;OUT PARAMETERS:
; DPTR: ADDRESS OF NEXT STRING WITH THE SAME
; LAYER WITH LAST DISPLAYED STRING
; F0: NOT CHANGED
; R6: NOT CHANGED
; R7: Y---COLUME,BUT CHANGED,NOW IT KEEPS TO BE
; THE LAST DISPLAYED CHAR'S START COLUME
;------------------------------------------------------------------------------------------------
PROC DRAW_MENU_ITEM
DRAW_MENU_ITEM:
PUSH DPH
PUSH DPL
GETCHAR:POP DPL
POP DPH
MOV A,#00H
MOVC A,@A+DPTR ;A KEEP THE ASCII CODE
INC DPTR
PUSH DPH
PUSH DPL
JZ DRAW_MI_RET
CLR C
SUBB A,#20H
MOV DPTR,#NM_CHAR_SML
JNB F0,TO_DRAW
MOV DPTR,#IT_CHAR_SML
TO_DRAW:MOV B,#06D ;RELATIVE ADDRESS IS ASCII*6
MUL AB
CLR C ;DPTR ADD RELATIVE
ADD A,DPL
MOV DPL,A
MOV A,DPH
ADDC A,B
MOV DPH,A
;NOW DPTR KEEP THE CORECT ADDRESS OF POINT MATRICS FOR DISPLAY
LCALL DIS_8_6 ; DPTR CHANGED,BUT NO PROBLEM
MOV A,R7
ADD A,#06H
MOV R7,A
SJMP GETCHAR
DRAW_MI_RET:
LCALL INC_DPTR4
LCALL GET_POINTER
LCALL NULL_DPTR
JNC NO_SON
MOV DPTR,#R_ARROW_SML
LCALL DIS_8_6
NO_SON: POP DPL
POP DPH
RET
END
;----------------------------------------------
PROC NULL_DPTR
NULL_DPTR:
PUSH A
MOV A,DPH
ORL A,DPL
JNZ UN_NULL
CLR C
POP A
RET
UN_NULL:SETB C
POP A
RET
END
;----------------------------------------------
;DRAW_MI_HELP
;------------------------------------------------------------------------------------------------
;给定DPTR,R6,R7,然后调用本程序,就会在右半屏幕R6,R7所指向的坐标处开始显示一个字符串,它以\0结束
;IN PARAMETERS:
; DPTR: ADDRESS OF DATATO BE DISPLAYED THIS DATA IS A STRING ,WITH \0 TERMINATE
; R6 X---PAGE
; R7: Y---COLUME
;OUT PARAMETERS:
; DPTR: ADDRESS OF NEXT STRING WITH THE SAME LAYER WITH LAST DISPLAYED STRING
; R6: PAGE,BUT CHANGED,NOW IT KEEPS TO BE THE LAST DISPLAYED CHAR'S START LINE
; R7: Y---COLUME,BUT CHANGED,NOW IT KEEPS TO BE THE LAST DISPLAYED CHAR'S START COLUME
;------------------------------------------------------------------------------------------------
PROC DRAW_MI_HELP
DRAW_MI_HELP:
PUSH DPH
PUSH DPL
MI_HLP_GETCH:
POP DPL
POP DPH
MOV A,#00H
MOVC A,@A+DPTR ;A KEEP THE ASCII CODE
INC DPTR
PUSH DPH
PUSH DPL
JZ MI_HLP_RET ;IS ASCII =\0?
CLR C
SUBB A,#20H
MOV DPTR,#NM_CHAR_SML
JNB HLP_FONT,NM_FONT
MOV DPTR,#IT_CHAR_SML
NM_FONT:MOV B,#06D ;RELATIVE ADDRESS IS ASCII*6
MUL AB
CLR C ;DPTR ADD RELATIVE
ADD A,DPL
MOV DPL,A
MOV A,DPH
ADDC A,B
MOV DPH,A ;NOW DPTR KEEP THE CORECT ADDRESS OF POINT MATRICS FOR DISPLAY
LCALL DIS_8_6R ; DPTR CHANGED,BUT NO PROBLEM
CJNE R7,#54D,INC_COL
MOV R7,#00H
INC R6
SJMP MI_HLP_GETCH
INC_COL:MOV A,R7
ADD A,#06H
MOV R7,A
SJMP MI_HLP_GETCH
MI_HLP_RET:
POP DPL
POP DPH
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -