📄 _menusel.asm
字号:
;--------------------------------------------------
;
; THIS FILE IS INCLUDED IN FILE "_INT_0.ASM"
;
;原则:每个函数调用都假设A被修改了
;只在最高层函数体里面保护A
;
;--------------------------------------
;------------------------------------
;
; THIS FUNCTION ARE USE TO INCREASE DPTR
;
;INPUT PARAMETERS: DPTR
;OUTPUT PARAMETERS: DPTR=DPTR+1, C FLAG CHANGED
;
;------------------------------------
;
; DPTR IS INCREASED
;
PROC INC_DPTR4
INC_DPTR4:
INC DPTR
INC DPTR
INC DPTR
INC DPTR
RET
END
PROC INC_DPTR6
INC_DPTR6:
ACALL INC_DPTR4
INC DPTR
INC DPTR
RET
END
PROC INC_DPTR8
INC_DPTR8:
ACALL INC_DPTR4
ACALL INC_DPTR4
RET
END
;---------------------------------------------------------------------------------------
;
; GET POINTER CURRENTLY DPTR POINTS TO
;
;INPUT PARAMETERS: DPTR
;OUTPUT PARAMETERS: DPTR=(WORD)*DPTR
;
PROC GET_POINTER
GET_POINTER:
PUSH A
MOV A,#00H
MOVC A,@A+DPTR
PUSH A
MOV A,#01H
MOVC A,@A+DPTR
POP DPH
MOV DPL,A
POP A
RET
END
;---------------------------------------------------------------------------------------
; MAKE DPTR POINTS TO THE END OF STRING
;INPUT PAR:
; DPTR POINTS TO THE STRING HEAD
;OUTPUT PAR:
; DPTR POINTS NEXT TO THE '\0',CHANGE NONE OF REGISTERS EXECPT MAKE C FLAG 0
;
PROC TO_STR_END
TO_STR_END:
PUSH A
NO_STR_END:
MOV A,#00H
MOVC A,@A+DPTR
INC DPTR
JNZ NO_STR_END
POP A
RET
END
;---------------------------------------------------------------------------------------
;
;INPUT PAR: DPTR POINTS TO THE CURRENT SELECTED MENU ITEM
;OUTPUT PAR: DPTR POINTS TO THE LAST MENU ITEM IN THE SAME LAYER
; IF LAST NOT EXIST ,RETURN VALUE IS 0 AND VALUE OF DPTR IS NULL,ELSE
; IF LAST DO EXIST ,RETURN VALUE IS 1,AND DPTR POINTS TO THE LAST ITEM
;
PROC GET_LAST
GET_LAST:
ACALL TO_STR_END ;NO CHANGE ANY THING ELSE EXCEPT MAKING C FLAG 0
INC DPTR
INC DPTR
ACALL GET_POINTER ;NO CHANGE ANY THING ELSE
MOV A,DPH
ORL A,DPL
JNZ UP_I_EXIST
MOV A,#00H
RET
UP_I_EXIST:
MOV A,#01H
RET
END
;---------------------------------------------------------------------------------------
;
;IN PAR: DPTR POINTS TO THE CURRENT SELECTED MENU ITEM
;OUT PAR: DPTR POINTS TO THE NEXT MENU ITEM IN THE SAME LAYER
; IF NEXT NOT EXIST ,RETURN VALUE IS 0 AND VALUE OF DPTR IS NULL,ELSE
; IF NEXT DO EXIST ,RETURN VALUE IS 1,AND VALUE OF DPTR IS ADDRSS OF NEXT ITEM
;
PROC GET_NEXT
GET_NEXT:
LCALL TO_STR_END
ACALL GET_POINTER
MOV A,DPH
ORL A,DPL
JNZ DN_I_EXIST
MOV A,#00H
RET
DN_I_EXIST:
MOV A,#01H
RET
END
;-------------------------------------------------------------------------
;
; GET THE IDENTIFIER OF CURRENTLY SELECTED MENU ITEM
;
;INPUT PAR: NONE
;
;OUTPUT PAR: ID OF CURRENTLY SELECTED MENU ITEM IS IN REGISTER A
;
PROC GET_ID
GET_ID: MOV DPH,ITEM_SEL_H
MOV DPL,ITEM_SEL_L
LCALL TO_STR_END
LCALL INC_DPTR8
MOV A,#00H
MOVC A,@A+DPTR
RET
END
;-------------------------------------------------------------------------
PROC GET_PARENT,GET_SON
GET_PARENT:
LCALL FN_ITEM_DN
MOV A,DPH
JNZ GET_PARENT
MOV A,DPL
JNZ GET_PARENT
;NOW DPTR IS SURE BE NULL,SO GIVE IT THE ADDRESS OF
;THE CURRENT SELECTED MENU ITEM
GET_SON:MOV DPH,ITEM_SEL_H
MOV DPL,ITEM_SEL_L
LCALL TO_STR_END
LCALL INC_DPTR4
LCALL GET_POINTER
MOV ITEM_SEL_H,DPH
MOV ITEM_SEL_L,DPL
RET
END
;---------------------------------------------------------------------------------------
; IF LAST ITEM EXIST ,ITEM_SEL_H(L) POINTS TO IT,
; IF IT NOT EXIST,ITEM_SEL_H(L) NOT CHANGED
PROC FN_ITEM_UP
FN_ITEM_UP:
MOV DPH,ITEM_SEL_H
MOV DPL,ITEM_SEL_L
ACALL GET_LAST
JZ FN_I_UP_RET ;NOT EXIST
MOV ITEM_SEL_H,DPH
MOV ITEM_SEL_L,DPL
FN_I_UP_RET:
RET
END
;---------------------------------------------------------------------------------------
; IF NEXT ITEM EXIST ,ITEM_SEL_H(L) POINTS TO IT,
; IF IT NOT EXIST,ITEM_SEL_H(L) NOT CHANGED,AND
; DPTR IS NULL
PROC FN_ITEM_DN
FN_ITEM_DN:
MOV DPH,ITEM_SEL_H
MOV DPL,ITEM_SEL_L
ACALL GET_NEXT
JZ FN_I_DN_RET
MOV ITEM_SEL_H,DPH
MOV ITEM_SEL_L,DPL
FN_I_DN_RET:
RET
END
;-------------------------------------------------------------------------------------------
PROC FN_PG_UP
FN_PG_UP:
ACALL FN_ITEM_UP
ACALL FN_ITEM_UP
ACALL FN_ITEM_UP
RET
END
;-------------------------------------------------------------------------------------------
PROC FN_PG_DN
FN_PG_DN:
ACALL FN_ITEM_DN
ACALL FN_ITEM_DN
ACALL FN_ITEM_DN
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -