📄 pagsub.asm
字号:
;#############################################################
; FILE NAME PAGSUB.ASM
; SUBROUTE: GET_RECORD - GET ONE DISPLAY RECORD DATA
; USING PARMENTERS: DPTR - THE POINT TO THE PAGE BUFFER
; B - THE NUMBER OF OFFSET BYTES
;
; COMMON DATA USED:
; CHANGE REGISTER: C, A, R4, R5
; RETURN: NONE
;------------------------------------------------------------
PROC GET_RECORD, GETRCDPNT
GET_RECORD:CLR B_TMPUSE
GetNtRcd: MOV A, B
MOVC A, @A+DPTR
MOV dFLD_R7, A ; ||---- THE COMMAMD BUTTON FLAG
JNZ ForNtByte ; FOR NO TABLE END PAGE
CLR B_TMPUSE
ForNtByte: INC B ; INC THE BYTE POINTER
MOV A, B ; GET ONE BYTE
Byte1Nt: MOVC A, @A+DPTR
MOV dFLD_R6, A ; FIELD BYTE
INC B ; INC THE BYTE POINTER
MOV A, B
;%% JNZ Byte2Nt
;%% INC DPH
Byte2Nt: INC B ; NO USE BYTE
MOV A, B ; GET ONE BYTE
Byte3Nt: MOVC A, @A+DPTR
MOV dFLD_R5, A
INC B ; INC THE BYTE POINTER
MOV A, B ; GET ONE BYTE
;%% JNZ Byte4Nt
;%% INC DPH
Byte4Nt: MOVC A, @A+DPTR
MOV dFLD_R4, A
INC B ; INC THE BYTE POINTER
MOV A, B ; GET ONE BYTE
Byte5Nt: MOVC A, @A+DPTR
MOV dFLD_R3, A
INC B ; INC THE BYTE POINTER
MOV A, B ; GET ONE BYTE
;%% JNZ Byte6Nt
;%% INC DPH
Byte6Nt: MOVC A, @A+DPTR
MOV dFLD_R2, A
INC B ; INC THE BYTE POINTER
MOV A, B ; GET ONE BYTE
Byte7Nt: MOVC A, @A+DPTR
MOV dFLD_R1, A
INC B
MOV A, B ; GET ONE BYTE
JNZ NextRcd
INC DPH
NextRcd: INC dPAG_RCD_PNT ; INC THE FIELD POINTER
MOV A, dFLD_R7
XRL A, #040H ; CHECK TABLE END FLAG
JZ TABEndFlg
JB B_TMPUSE, GetNtRcd ; NEED GET TABLE END
XRL A, #0C0H ; CHECK TABLE START FLAG
JZ TabFlgChk
RET
TabEndFlg: MOV dTAB_RCD_BYTES, A ; FOR TABLE END
CLR B_TMPUSE
JMP GetNtRcd ; FOR NEXT OUT OF TABLE RECORD
TabFlgChk: MOV A, dFLD_R6
MOV dTAB_RCD_BYTES, A ; FOR TABLE RECORD
ForTabSet: MOV A, dFLD_R4
;-- MOV dTAB_MAXH_RCD, A ; (R4) SAVE HIGH BYTE OF THE MAX RECORD NUMBERS
MOV A, dFLD_R3
MOV dTAB_MAXL_RCD, A ; (R3) SAVE LOW BYTE OF THE MAX RECORD NUMBERS
MOV A, dFLD_R5
CJNE A, #80H, ChkTabEnd
MOV A, dFLD_R2 ; SAVE THE OFFSET OF 'O' POINT IN Y-DIS
MOV dGRA_YOH_OFF, A ; ......
MOV A, dFLD_R1 ; ......
MOV dGRA_YOL_OFF, A ; ......
JMP GetNtRcd
ForInRAM: MOV A, @R1 ; FOR INNER RAM TABLE DATA
JMP IsIncIdx
ChkTabEnd: JNB ACC.7, S_OffSet
ADD A, dTAB_MAXL_RCD ; 递减 pointer reduce,
S_OffSet:ADD A, dTAB_RCD_START
CJNE A, dTAB_MAXL_RCD, IsGreat
IsGreat: JC GoOnData
SUBB A, dTAB_MAXL_RCD
GoOnData:MOV dTAB_RCD_INDEX, A
MOV R4, B ; RESTORE THE FIELD POINTER
MOV B, dTAB_RCD_BYTES
MUL AB
ADD A, dFLD_R1
MOV R1, A
MOV A, dFLD_R2
INC A
JZ ForInRAM
DEC A
ADDC A, B
MOV dEXTPART, A
MOV pPORT2, A ; SET THE EXT RAM SEGMENT
MOVX A, @R1
MOV dEXTPART, #0
MOV pPORT2, dEXTPART ; RESTORE THE EXT RAM SEGMENT TO '0'
IsIncIdx: JNZ ForNtGet
MOV dTAB_RCD_INDEX, A
SETB B_TMPUSE ; FOR GOTO TABLE END
ForNtGet: MOV B, R4 ; RESTORE THE FIELD RECORD POINTER
JMP GetNtRcd
;#############################################################
; FILE NAME PAGSUB.ASM
; SUBROUTE: GETRCDP - GET THE RECORD @DATA POINT BY dPAG_RCD_PNT
; FUNCTION:
; PARMENTERS: dPAG_RCD_PNT - INDEX OF CURRENT RECORD
; USEING REGISTER: A, B
; RETURN: DPTR, A, B - THE OFFSET TO START POINTER
;------------------------------------------------------------
GETRCDPNT: MOV DPH, dPAG_DPH
MOV DPL, dPAG_DPL
MOV A, dPAG_RCD_PNT
MOV B, #8
MUL AB
XCH A, B
ADD A, DPH
MOV DPH, A
MOV A, B
RET
END
;#######################################################################
; FILE NAME PAGSUB.ASM
; SUBROUTE: DISP_PAGE - DISPLAY ONE PAGE DATA ON LCD
; CALL FUNCTION: DELAY
; USING PARMENTERS: dSYSPAGE - THE NUMBER OF DISPLAY PAGE POINTER
; COMMON DATA USED:
; CHANGE REGISTER: ALL REGISTER C AND TMPEBUF
; RETURN: NONE
;------------------------------------------------------------
PROC DISP_PAGE
DISP_PAGE: MOV A, dSYSPAGE ; GET THE PAGE DPTR
RL A
MOV DPTR, #uPAGETAB
MOV B, A
;-- JB bSIMULATE, SIMGetP ;@@@@@@@@@@@@
MOVC A, @A+DPTR
XCH A, B
INC A
MOVC A, @A+DPTR
MOV dPAG_DPL, A ; SAVE THE PAGE START POINT ADDRESS
MOV dPAG_DPH, B
MOV dPAG_RCD_PNT, #0 ; RESET PNT
MOV dTAB_RCD_BYTES, #0 ; RESET TO NO TABLE ON
ORL A, B
JNZ DispNextF
SETB C ; POINT TO '00H' (PAGE TABLE END), NO PAGE IS!
RET
SIMGetP: ;@@@@@@@@@@@@@@@@@@@@
DispNextF: CALL GETRCDPNT ; GET THE RCECORD POINT
MOV sWATCHDOG, #cWATCHDOGs ; %%RESERT THE WATCH DOG CALL
CLR B_TMPUSE ; STRING END ENABLE
;-- JB bSIMULATE, SIMGetD1 ;@@@@@@@@@@@@@
MOVC A, @A+DPTR
JNZ DispFld
DEC dPAG_RCD_PNT ; BACK TO LAST FIELD RECORD
CLR C
RET
SIMGetD1: ;@@@@@@@@@@@
JNZ SIMDpFld
CLR C
RET
SIMDpFld: CALL DIS_FIELD
JMP DispNextF
DispFld: CALL GET_RECORD ; B - THE OFFSET BYTE
CALL DIS_FIELD
JMP DispNextF
END
;#############################################################
; FILE NAME PAGSUB.ASM
; SUBROUTE: FORARRYADJ - ADJUST DATA POINTER IF THE RECORD IS IN TABLE
; FUNCTION:
; PARMENTERS: dTAB_RCD_BYTES - THE BYTES IN ONE RECORD FOR THE TABLE
; dTAB_RCD_INDEX - THE INDEX FOR THE CURRENT RECORD
; USEING REGISTER: B
; RETURN: R1, R2 - THE POINTER TO THE DATA
;------------------------------------------------------------
FORARRYADJ:PUSH ACC
MOV A, dTAB_RCD_BYTES
JZ EndAdjust
MOV B, dTAB_RCD_INDEX
MUL AB
ADD A, dFLD_R1
MOV dFLD_R1, A
MOV A, B
ADDC A, dFLD_R2
MOV dFLD_R2, A
EndAdjust: POP ACC
RET
;#############################################################
; FILE NAME PAGSUB.ASM
; SUBROUTE: DIS_FIELD - DISPLAY ONE FIELD DATA ON LCD
; CALL FUNCTION: DELAY
; USING PARMENTERS: dPAG_DPTR - THE POINT TO THE PAGE BUFFER
; dFLD_R1 - R7 - THE FIELD DEFINE RECORD
; COMMON DATA USED:
; CHANGE REGISTER: C, A, B, R1, R2, R3, R4, R5, R6, R7
; RETURN: NONE
;------------------------------------------------------------
PROC DIS_FIELD
DIS_FIELD: MOV A, dFLD_R6 ; FOR DATA TYPE?
RLC A
ORL C, bFLD_ACTIVE ; FIELD DISPLAY ACTIVE
JC ChkFldTyp
RET
IsFloatT: JMP IsFloat
IsIntT: JMP IsInteger
ChkFldTyp: RLC A
JC IsIntT
RLC A
JC IsFloatT
RLC A
JC ForRAMOut
RLC A
JC ForROMOut
; FOR SWITCH FIELD PROCESS
CALL FORARRYADJ ; ADJUST THE POINTER TO DATA
MOV A, dFLD_R6
ANL A, #07H
MOV R6, A
MOV A, dFLD_R2
INC A
JNZ ExtRAMBit
MOV R1, dFLD_R1
MOV A, @R1
JMP GetBit
ExtRAMBit: DEC A
MOV dEXTPART, A
MOV pPORT2, A ; INITIALIZE EXTERN SEGMENT ADDRESS
MOV R1, dFLD_R1
MOVX A, @R1 ;PARMETER R1 - THE INTEGER WILL BE CONVERTED
GetBit: LCALL TOC_R6BIT
MOV A, dFLD_R7
ANL A, #3FH
SWAP A
JNC ForPoint ; GET [A]
CLR C
SUBB A, #8 ; GET [B]-NEXT 8 BYTE
ForPoint: MOV DPL, A
MOV A, dPAG_DPL
SUBB A, DPL
MOV DPL, A ; MOVE THE POINTER TO SWITCH DISPLAY CODE
CLR A
MOV DPH, A
MOV A, dPAG_DPH
SUBB A, DPH
MOV DPH, A
MOV A, #8 ; THE MAX NUMBER WILL BE DISPLAY
JMP DoROMOut ; TO DISPLAY
ForROMOut: MOV DPL, dFLD_R1 ; GET THE POINTER TO STRING
MOV DPH, dFLD_R2 ; ....
MOV A, dFLD_R7
JB ACC.7, ForDisF
ANL A, #03FH
ForDisF: ANL A, #07FH
DoROMOut: MOV R7, A ; SAVE THIS NUMBER FOR DISPLAY
MOV R1, #xDISPBUF
MOV dEXTPART, #cSCDRAM ; FOR RESTORE AFTER PORT2 CHANGED
MOV pPORT2, #cSCDRAM ; INIT. EXT. RAM SEGMENT FOR DISPBUF
;@@@@@@@@@@@@@@@@@@@
LCALL MOV_ROMTORAM
JMP DoRAMOut
ForRAMOut: RLC A
MOV bUSE2, C ; IS POINTER TO STRING?
CALL FORARRYADJ ; AJDUST THE DATA POINTER(R2,R1), IF THE RECORD IN TABLE
MOV A, dFLD_R2
INC A
JZ ForInRAM
DEC A
MOV dEXTPART, A ; FOR RESTORE AFTER PORT2 CHANGED
MOV pPORT2, A ; INIT. EXT. RAM SEGMENT FOR DISPLAY STRING
MOV R1, dFLD_R1
MOVX A, @R1
JB bUSE2, ForStrPnt
MOV A, dFLD_R7 ; R7 - THE NUMBER OF CHARACTER IN STRING
ANL A, #3FH
MOV R7, A
JMP DoRAMOut
ForInRAM: MOV R1, dFLD_R1
MOV A, @R1
JB bUSE2, ForStrPnt
JMP EndDisFld
ForStrPnt: PUSH ACC ; GET STRING POINTER IN ROM
JNZ ForOutP
MOV A, #0DH
ANL A, dFLD_R5 ; CLEAR REVERSE & LINES
MOV dFLD_R5, A
ForOutP: MOV A, dFLD_R6
ANL A, #7 ; GET THE TABLE NUMBER
MOV DPTR, #uFIRSTTAB
ADD A, DPH ; ADJUST THE POINTER TO USE TABLE
MOV DPH, A
POP ACC
RLC A ; NUM * 2
JNC GetStrPnt
INC DPH
GetStrPnt: PUSH ACC
MOVC A, @A+DPTR
MOV dFLD_R2, A
POP ACC
INC A
MOVC A, @A+DPTR
MOV dFLD_R1, A
JMP ForROMOut
IsInteger: CALL FORARRYADJ ; ADJUST THE POINTER TO DATA
RLC A
MOV bUSE3, C ; IS HEX NEED?
RLC A
MOV bUSE2, C ; IS BCD CODE?
RLC A
MOV bUSE1, C ; IS DOUBLE BYTES INTEGER?
MOV A, dFLD_R2
INC A
JNZ ForExtRAM
MOV R1, dFLD_R1
MOV A, @R1
MOV B, A
INC R1
MOV A, @R1
JMP ForIntOut
ForExtRAM: DEC A
MOV dEXTPART, A
MOV pPORT2, A ; INITIALIZE EXTERN SEGMENT ADDRESS
MOV R1, dFLD_R1
MOVX A, @R1 ;PARMETER R1 - THE INTEGER WILL BE CONVERTED
MOV B, A
INC R1
MOVX A, @R1
ForIntOut: MOV R2, A
MOV dEXTPART, #cSCDRAM ; FOR RESTORE AFTER PORT2 CHANGED
MOV pPORT2, #cSCDRAM ; INIT. EXT. RAM SEGMENT ADDR FOR DISPBUF
MOV R1, #xDISPBUF ; R1 - THE POINTER TO THE BUFFER FOR STRING
MOV A, dFLD_R7
ANL A, #3FH
PUSH ACC
XCH A, R2 ; A, B - THE INTEGER, R2 - THE LENGTH
JB bUSE3, HexInt
JB bUSE2, BcdInt
JB bUSE1, TwoInt
MOV A, B
LCALL INT_TOSTR ; A - THE NUMBER OF CHARACTER IN STRING
JMP DoDataOut
BcdInt: MOV A, B
CALL BCD_TOSTR
CLR bUSE2 ; RESET THE BCD CODE CONVERT
JMP DoDataOut
HexInt: MOV A, B
CALL HEX_TOSTR
CLR bUSE3 ; RESET THE INTEGER CONVERT
JMP DoDataOut
TwoInt: CALL INT2_TOSTR
CLR bUSE1 ; RESET THE TWO BYTES INTEGER CONVERT
JMP DoDataOut
;---------------------------------- float data process
ForDotOut: MOV R0, dFLD_R1 ; GET THE DATA POINTER
MOV R1, #xGRA_DIS_RATE ; GET THE DISPLAY RATE
CALL LCD_DOTOUT ; OUTPUT ONE DOT
MOV A, dFLD_R1
ADD A, dTAB_RCD_BYTES
JNC NextPoint
INC dFLD_R2
MOV R2, dFLD_R2
MOV dEXTPART, R2
MOV pPORT2, R2
NextPoint: MOV dFLD_R1, A ;
MOV R1, A
MOVX A, @R1
CJNE A, #cTAB_RCD_END, Continue1
JMP EndDisFld
Continue1: MOV A, dFLD_R3 ; FOR NEXT POSITION
INC A
ANL A, #7
JNZ AfterAdj
INC dFLD_R4
AfterAdj: MOV dFLD_R3, A
MOV A, dFLD_R4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -