這是我早些年制作臺時通信設備是寫的代碼,其中包括許多外部元件如實時時鐘,IO口擴展,LCD顯示的應用,程序也包括對輸入字串解讀并執行相應程序的方法,作為自己不時參照之用,也和大家分享。
單片機源程序
;written by chua
;ASM source for communicator
;CPU 8052
;~01~ SPKONOFF
;~02~ ONSPK
;~03~ OFFSPK
;~04~ ONPHONE
;~05~ OFFPHONE
;~06~ DIALONE DIAL ONE TONE
;~07~ ONMIC
;~08~ NUM_REC RECEIVE DIALTONE
;~09~ LCDMSG LCD MESSAGE
;~0A~ LCDSTL LCD STROBE LONG
;~0B~ LCDST LCD STROBE
;~0C~ LONG_DL
;~0D~ SHORT_DL
;~0E~ OFFCID OFF CALLER ID (PWDN)
;~0F~ ONCID (ONLY ENABLE SIGNAL,NEED SET #20H TO CAUSE INTERRUPT)
;
;~10~ LCLEAR1
;~11~ LBEGIN1
;~12~ LCLEAR2
;~13~ LBEGIN2
;~14~ CURSOR0 OFF CURSOR
;~15~ CURSOR1 ON CURSOR
;~16~ CURSOR2 ON CURSOR WITH BLANKING
;~17~ ONLINE
;~18~ OFFLINE
;
;~20~ GETKEY
;~21~ RCLOCK READCLOCK
;~22~ WCLOCK WRITECLOCK
;~23~ WAITKEY WAIT UNTIL ESC OR TIMEOUT
;~24~ MOVEMEM MOVE RAM TO RAM
;~25~ MOVESTR MOVE A STRING END WITH CHR$(13) IN RAM TO RAM
;~26~ MOVEMSG MOVE A STRING END WITH CHR$(13) IN ROM TO RAM
;~27~ HEXSHOW
;~28~ SAID0
;~29~ CHECK_DIGIT
;----------------------------------------------------------
; MOVX A,@DPTR 將DPTR送來A
; MOVX @DPTR,A MOVE A TO DPTR
; SUBB A,#16 將A 減去 16
;LCLEAR: ALL FREE
;LCDWREG: ALL FREE
;LCDWRAM: ALL FREE
;LCDST: ALL FREE
;
;BIT0 0=SPK OFF
; 1=SPK ON
;BIT1 0=COUNECT PHONE
; 1=DISCONNECT PHONE
;BIT2 1=EXTERNAL POWER ON
; 0=EXTERNAL POWER OFF
;BIT3 0=OFF LINE
; 1=ON LINE
;BIT4 0=OFF CID AC LOOP,ALSO CID INTERRUPT
; 1=ON CID AC LOOP,ALSO CID INTERRUPT
;BIT5 1=INTERRUPT OTHER BOARD
;BIT6 1=BANK OF FLASH
;BIT7 1=BANK OF FLASH
;BANK0 OF Rx FOR PROGRAM
;BANK1 08H=CURRENT LINE#
; 09H=MAX LINE IN PAGE
; 0AH=NOT USE
; 0BH
; 0CH
; 0EH
; 0FH
; EDIT=0 ALL HIGH NO CHANGE
; TIM =7
;BANK2 ;10H FOR LCDMSG CONTROL ; ALSO CLEAR LINE
;11H PROMPT LEN; ALSO FOR MORE DELAY TIME IN EDIT_SUB
;12H FOR TIME DL 1-255 MS
;13H USE FOR RING TIME PICK
;14H FOR SCREEN SHIFT (R6) 14H VALUE START FROM #0-255, NOT ONLY 80
; ALSO FOR DISPLAY SHIFT IN SUB:SHOW_ANS
;15H FOR CAP
;16H FOR SHIFT
;17H FOR RING COUNT
;18H FOR RING TIMEOUT
;19H FOR ERROR COUNT OF COMMAND
;1AH FOR GETKEY SUB (R-FREE) ALSO USE AS SOURCE2
;1BH FOR GETKEY SUB (R-FREE) ALSO USE AS SOURCE2
;1CH=CURSOR VT POSITION (CURSOR VERTICAL LINE IN LCD 0,1)
; ALSO DATABANK LINE#(MOVE)
;1DH=CURSOR HZ POSITION
; ALSO DATABANK LINE#(FIX)
;1EH=DPH FOR SOURCE MESSAGE(ALSO COUNT CHR)
;1FH=DPL FOR SOURCE MESSAGE(ALSO COUNT CHR)
;20H TO 2FH BIT SET, DON'T USE
;2EH=RELAY CONTROL REG (SETB 70-77)
;30H=STORAGE INDEX, SAVE TO EACH GROUP AND LOAD BACK FROM LOADPOST
;31H=TIMER DELAY 10=0.5SEC (#MAXTIME)
;32H=TIME FOR CTRLDIAL MIN.#10 - MAX #40
;33H=TIME ABSENT
;34H=STORAGE AREA 0=EDIT,1=SHORT,3=EMAIL,4.....
;35H=RECEIVE BUFFER LENGHT @R0
;36H=MAXTEXT LEN IN KEYIN (CHARACTER LIMIT)
;37H=HZ FOR PAGEVIEW
;38H=VT FOR PAGEVIEW
;39H=CHECKSUM FOR COMIN,COMOUT,COMBIN
;40H=SAVE FOR 2FH (CAP,SHIFT,INS)
;41H=RINGSET VALUE
;42H=CID BYTE SAVER
;43H=FREE
;44H=T2 TIMER LOOP
;45H=T2 TH VALUE
;46H=ORIZINAL START POINT OF "EDIT","VIEW","EMAIL"
;47H=LEN OF DATA NEED MOVE FOR "MOVEMEM"
;48H=ROM BANK FOR xxxxbbbbB TOTAL 16 BANK 8*16=128K
;49H=ROM SECTOR EACH SECTOR 256BYTE
;4AH=ERROR PLACE WITHIN DPL
;4BH=ERROR PLACE WITHIN DPH
;4CH=LCD HZ POSITION COUNT
;4DH=ROM AREA DPH
;4EH=ROM AREA DPL
;4FH=FREE
;50F=DPH FOR GET_ANS
;51F=DPL FOR GET_ANS
;80H-CFH TOTAL 80 FOR KEYBUFFER
;D0H-DFH TOTAL 16 FOR CLOCK ;DE,DF FREE
;E0H-FFH TOTAL 32 FOR STACK
;SETBIT:
; 20H FOR INTERRUPT ENABLE (SETB 00-07)
; SETB 08H FOR MARK CMD STATUS, 1=OK, 0=BAD COMMAND MORE CMD
; SETB 09H FOR MARK ESC KEY BEEN PRESS
; SETB 0AH FOR RAMTEST ERROR
; SETB 0BH FOR SEARCHDATA ERROR(NOT SAME)
; SETB 0CH FOR LCD SCREEN NEED REWRITE
; SETB 0DH FOR READ ONLY ;RAM/ROM MARK
; SETB 0EH FOR KEYIN EXIT
; SETB 0FH FOR ENABLE ARROW SEARCH IN KEYIN FOR DATABANK
; SETB 10H FOR CONFIRM VALUE IS A DIGIT(0-9) OR HEX(ABCDEF)
; SETB 11H FOR ASC2TIM FLAG TO QUIT OFF HOOK
; SETB 12H FOR NO PARAMETER
; SETB 13H FOR BASEKEY "*"
; SETB 14H FOR BASEKEY "0"
; SETB 15H FOR BASEKEY "#"
; SETB 16H FOR "OVER" CONTROL TO OTHER PARTY
; SETB 17H FREE
; SETB 18H FREE
; SETB 19H FOR TIMEOUT FLAG
; SETB 1AH FOR "TWO WAY TALKING"MARK
; SETB 1BH FOR "PAGE REC MARK"
; SETB 1CH FOR "SENT PAGE(INCLUDE PAGER) MARK"
; SETB 1DH FOR RAM ERROR
; SETB 1EH FOR NOT CONVERT TO TIM
; SETB 1FH FOR PARAMETER OUT OF RANGE FLAG
; SETB 20H FOR DATABANK RIGHT HALF PART #128-#255
; SETB 21H FOR BASEKEY A ;ALSO GENERAL USE SETB
; SETB 22H FOR BASEKEY B
; SETB 23H FOR BASEKEY C
; SETB 24H FOR BASEKEY D
; SETB 25H CAUSE LIMIT DISPLAY WIDTH IN SHOWDATA
; SETB 26H CAUSE SEARCH DATA DISABLE
; SETB 27H FOR "MARK AS PAGING", ALSO USE ASC2API
; SETB 28H FOR "KEY HAD BEEN PRESS" FOR GETKEY
; SETB 29H FREE; FOR STORE INCOMING TEXT IN EMAIL AREA
; SETB 2AH FOR NEW EMAIL MARK
; SETB 2BH FOR NEW SHORT MESSAGE
; SETB 2CH FOR FORCE SHOW TITLE IN STANDBY
; SETB 2DH FORCE ECLOCK EXIT TO RUN PROGRAM
; SETB 2EH FOR CID HAD BEEN PROCESS
; SETB 2FH FOR T2
; SETB 30H FOR "FAIL TO GET SCANCODE" IN SCANCODE
; SETB 31H FOR KREPEAT "LONG PRESS OF KEY HAD BEEN OCCUR"
; SETB 32H FOR CHOP CHR$(13) AT TAIL IN MOVESTR
; SETB 33H FOR SHIFT KEY HAD BEEN PRESS
; SETB 34H FOR VIEW FLASH MEMORY
; SETB 35H FOR REMEMBER LAST BIT IN SOUND DECODE
; SETB 36H FOR SPELLOUT IN "REC_SHOW" SUB
; SETB 37H FOR RING ALERT
; SETB 38H CAUSE JUMP TO STANDBY AT SUB:STANDBY
; SETB 39H SELECT DATAROM, CLR SELECT SOUNDROM
; SETB 3AH FOR UPSEARCH
; SETB 3BH FOR DISABLE DISPLAY OF DATA IN SHOW_DATA
; (2EH)
; SETB 70H ON SPK
; SETB 71H PHONE DISCONNECT
; SETB 72H TO INTERNAL LINE (X)
; SETB 73H ON LINE
; SETB 74H CALLER ID AC LOOP CONNECT
; SETB 75H NO CONNECT ;MIC
; SETB 76H NO CONNECT
; SETB 77H PWDN FOR CALLER ID
; (2FH)
; SETB 78H (LCD RS)
; SETB 79H CAP
; SETB 7AH INS
; SETB 7BH 2ND
; SETB 7CH FLASH
; SETB 7DH RD
; SETB 7EH WR
; SETB 7FH HOLD
; RAM AREA 240-255 (0-239 IS DATA AREA)
; LINE 0 EDIT POSITION
; LINE 1 VIEW POSITION
; LINE 2 EMAIL POSITION
RELAY EQU 0FF30H ;OK
LCD EQU 0FF10H ;OK
LCD2 EQU 0FF40H ;OK
DAC EQU 0FF60H
DTMF EQU 0FF20H ;OK
KEYAREA EQU 80H
DREG EQU 0FF21H
PIOA EQU 0FF00H ;OK
PIOB EQU 0FF01H
PIOC EQU 0FF02H
PIOR EQU 0FF03H
PIO2A EQU 0FF50H ;OK
PIO2B EQU 0FF51H
PIO2C EQU 0FF52H
PIO2R EQU 0FF53H
FSTROBE EQU 0FF40H
XSTROBE EQU 0FF41H
PSTROBE EQU 0FF42H
KSTROBE EQU 0FF43H
CLOCK EQU 0B0H ;CLOCK DATA STORAGE PLACE
SOUNDROM EQU 0C000H ; A-B(Y5),C-D(Y6)
DATAROM EQU 0A000H ;(Y5) FOR STORE TELEPHONE NO, DATA BANK
;OTHER USE E-F(Y7)
RAM EQU 2000H ;8000-9FFF 8K ;2-3,4-5,6-7,8-9 TOTAL 32K
OLDCMD EQU 9F00H ;RAM LAST LINE FOR STORE OLD CMD
RECBF EQU 9E00H ;RAM 2ND LAST LINE FOR STORE RECEIVE DATA
FLASH_BF EQU 9D00H ;FOR STORE 256 BYTE OF FLASH
;9C00H RESERVE
;9B00H
;9A00H RESERVE
;9900H
;9800H
MAXLINE EQU 119 ;MAX LINE (MACHINE 0-119=120)
MAXWIDTH EQU 39 ;SCREEN WIDE (MACHINE 0-39=40))
MAXCOL EQU 79 ;PAGE WIDE (MACHINE 0-79=80))
MAXTIME EQU 255
MAXCMD EQU 69
MAXTEXT EQU 31 ;MAX TEXT LEN IN KEYIN COMMAND
MAXGAIN EQU 8
MAXVOC EQU 42
RINGOUT EQU 3 ;TIME OUT FOR RING
MAXBANK EQU 16 ;(0-15, TOTAL 16 FLASH BANK)
HALFBANK EQU 8 ;(0-7,TOTAL 8 BANK)
MAXSECTOR EQU 32;(0-31, TOTAL 32 SECTOR WITH 256 BYTE)
SECTORSIZE EQU 255
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP PINT0 ;INT0
ORG 000BH
LJMP PTF0 ;T0
ORG 0013H
CLR EX1
LJMP PINT1 ;INT1
ORG 001BH
LJMP PTF1 ;T1
ORG 0023H
LJMP SER ;SR
ORG 002BH
LJMP PTF2 ;T2
ORG 0050H
MAIN:
MOV SP,#0D0H ;STACK POINTER
INITSET: ;CLEAR FROM 08H-7FH
MOV A,#0
MOV R0,#08H
INITSET1:
MOV @R0,A
INC R0
CJNE R0,#80H,INITSET1
MOV 40H,#00000100B ;INIT INS MODE
MOV 41H,#3
MOV 20H,#00000000B
SETB EA ;開總中斷
SETB EX0 ;開INT0中斷
SETB PX0 ;令INT0為高優先級
SETB IT0 ;令INT1為延邊觸發
SETB EX1 ;開INT1中斷
CLR PX1 ;令INT1為低優先級
CLR IT1 ;令INT1為低電平觸發
CLR EX1 ;暫停中斷1
CLR EX0 ;暫停中斷0
;TMOD T1: GATE,C/T,M1,M0 T0: GATE C/T M1,M0
MOV TMOD,#01010001B ;設定計數器0為模式1(16位計數器)
;設定計數器1為模式1(16位計數器)
;由T1腳計算脈沖(C/T=1)
SETB TR1 ;起動計數器1
LCALL INITT0
SETB TR0 ;起動計數器0
LCALL INITT2
LCALL KEY_CLR
LCALL REC_CLR
ORL P1,#11110111B MAKE P1 AS INPUT
MOV 2EH,#0 ;RELAY REG
;
LCALL SETRELAY
LCALL SETPIO
LCALL SETDTMF
LCALL SETCTRL
LCALL SETLCD
LCALL SETRAM ;CLEAR ALL
;
MOV DPTR,#OLDCMD
MOV A,#13
MOVX @DPTR,A
START:
LCALL REC_CLR
MOV 12H,#200
LCALL DL_200M
LCALL TITLE
LCALL STANDBY
MORE_CMD:
LCALL GET_CMD
JB 08H,MORE_CMD
LJMP START
GET_CMD:
LCALL BEEP
JB 2DH,XGET_CMD
MOV DPTR,#MSG3_1
MOV 50H,DPH
MOV 51H,DPL
LCALL KEYPREFIX
MOV 11H,10H ;SAVE PROMPT LEN FOR FURTHER USE
LCALL KRELEASE
LCALL KEY_LOAD
SETB 79H ;SURE CAP
MOV 36H,#20 ;MAX 15
LCALL KEYIN
LCALL KEY_SAFE
XGET_CMD:
LCALL KRELEASE
CLR 79H
CLR 7AH
CLR 7BH
JB 09H,XGET_CMD1
JB 19H,XGET_CMD1
LCALL DO_CMD
XGET_CMD1:
RET
GET_ANS:
;CALL LCLEAR1
;CALL KEY_CLR
;LOAD HEAD_TEXT TO 1EH,1FH, INPUT CHARACTER LIMIT TO 36H AND CALL
;IF RETURN SETB 09H, THEN ESC OR TIMEOUT
;DATA BUFFER STORE AT KEYAREA(START WITH 80H, END WITH CHR$(13)
LCALL KEYPREFIX
MOV 11H,10H
LCALL KRELEASE
SETB 79H ;SURE CAP
LCALL KEYIN
CLR 79H
CLR 7AH
CLR 7BH
RET
KEYIN:
LCALL KEY_SHOW
CLR 0EH ;NEED EXIT
CLR 09H ;ESC PRESS
CLR 19H ;TIMEOUT
CLR 26H ;ENABLE DATASEARCH
MOV 31H,#MAXTIME
KEYIN1:
LCALL GETKEY
JB 28H,KEYIN2
JB 19H,XKEYIN
LJMP KEYIN1
KEYIN2:
LCALL DOWHAT0
JB 0EH,XKEYIN
;JB 0FH,KEYIN3 ;DATABANK SPECIAL
LCALL KREPEAT
KEYIN3:
MOV 12H,#10
LCALL DL_200M
AJMP KEYIN1
;
XKEYIN:
RET
DOWHAT0: ;ENTER A=13 NO DISPLAY
MOV B,A ;STORE A FOR FURTHER USE
XRL A,#13 ;XOR
JNZ DOWHAT00
SETB 0EH
RET
DOWHAT00: ;SHIFT DEL TO DELELTE NAME
MOV A,B
XRL A,#19
JNZ DOWHAT1
LCALL DELETEDATA ;THIS CAUSE PROGRAM LOOP BACK HERE
LCALL KEY_CLR ;SO SPECIAL CARE MUST TAKE
CLR 0EH ;
RET
DOWHAT1: ;BACKSPACE, ERASE LETTER
MOV A,B
XRL A,#8
JNZ DOWHAT2
MOV A,R0
XRL A,#KEYAREA
JZ XDOWHAT1
LCALL KEY_BFB
LCALL REV_CUR
XDOWHAT1:
CLR 26H ;CAUSE DATASEARCH RE-ENABLE
RET
DOWHAT2: ;#27 ESC
MOV A,B
XRL A,#27
JNZ DOWHAT3
SETB 09H
SETB 0EH
RET
DOWHAT3: ;DEL 06 ;DEL OLD CMD
MOV A,B
XRL A,#06
JNZ DOWHAT4
LCALL KEYPREFIX
LCALL KEY_CLR
CLR 26H
RET
DOWHAT4: ;01=DOWN
JNB 0FH,DOWHAT8 ;ARROW ENABLE ONLY IN DATABANK SUB
MOV A,B
XRL A,#01
JNZ DOWHAT5
CLR 3AH ;DN
CLR 26H
LCALL SEARCHALL
RET
DOWHAT5: ;02=UP
MOV A,B
XRL A,#02
JNZ DOWHAT6
SETB 3AH ;UP
CLR 26H
LCALL SEARCHALL
RET
DOWHAT6: ;03=RIGHT
MOV A,B
XRL A,#03
JNZ DOWHAT7
MOV A,1CH
XRL A,#4
JZ XDOWHAT6
INC 1CH
MOV A,1CH
MOV DPTR,#TAB00
MOVC A,@A+DPTR
MOV 14H,A
XDOWHAT6:
SETB 25H
LCALL SHOW_DATA
LCALL REV_CUR
CLR 25H
RET
DOWHAT7: ;04=LEFT
MOV A,B
XRL A,#04
JNZ DOWHAT8
MOV A,1CH
JZ XDOWHAT7
DEC 1CH
MOV A,1CH
MOV DPTR,#TAB00
MOVC A,@A+DPTR
MOV 14H,A
XDOWHAT7:
SETB 25H
LCALL SHOW_DATA
LCALL REV_CUR
CLR 25H
RET
DOWHAT8: ;ARROW 01-04,05=END,06-11
;8 AND 6 ARE PROCESS BEFORE THIS SO NO PROBLEM
MOV R7,#11
DWLOOP:
MOV A,B
XRL A,R7
JZ XDOWHAT4
DJNZ R7,DWLOOP
AJMP DOWHAT9
XDOWHAT4:
RET
DOWHAT9: ;LIMIT THE LEN OF CHARACTER
MOV A,R0
CLR C
SUBB A,#KEYAREA
XRL A,36H
JZ XDOWHAT9
MOV A,B ;RESTORE A FROM B
LCALL KEY_BFA
LCALL LCDST
JNB 0FH,XDOWHAT9
JB 26H,XDOWHAT9
MOV A,1DH
XRL A,#5 ;LINE#5 CONFIRM
JZ XDOWHAT9
CLR 3AH ;DN SEARCH
MOV 48H,#0
MOV 49H,#1
CLR 20H
;LCALL SEARCHALL ;NOT AUTO SEARCH
XDOWHAT9:
RET
KREPEAT: ;鍵盤重復
CLR 2FH
JNB 31H,KREL1
MOV 44H,#2
AJMP KREL2
KREL1:
MOV 44H,#30
KREL2:
MOV 45H,#0CCH
MOV TH2,45H
MOV TL2,#0B0H
PUSH ACC
PUSH DPH
PUSH DPL
MOV DPTR,#PIOA
MOV A, #00000000B ;SCAN
MOVX @DPTR,A
KREPEAT1:
LCALL READKEY
JB 2FH,XK_REL
CJNE A,#0,KREPEAT1
CLR 31H
POP DPL
POP DPH
POP ACC
RET
;
XK_REL:
SETB 31H
POP DPL
POP DPH
POP ACC
RET
KRELEASE: ;鍵盤松開
MOV DPTR,#PIOA
MOV A, #00000000B ;SCAN
MOVX @DPTR,A
RELEASE:
LCALL READKEY
CJNE A,#0,RELEASE
RET
KEYPRESS:
CLR 28H
MOV DPTR,#PIOA
MOV A, #00000000B ;SCAN
MOVX @DPTR,A
LCALL READKEY
JZ XKEYPRESS
MOV 12H,#5
LCALL DL_200M
LCALL READKEY
JZ XKEYPRESS
SETB 28H
XKEYPRESS:
RET
;-------KEYBOARD INPUT----------
DB "~~~20"
GETKEY:
; CALL THIS AND THE CHARACTER WILL BACK IN A, IF A=0 MEAN NO KEY PRESS
PUSH DPH
PUSH DPL
PUSH B
GETKEY1:
CLR 28H
JB 19H, XGETKEY
MOV DPTR,#PIOB
MOV A,2FH
MOVX @DPTR,A
MOV DPTR,#PIOA
MOV A, #00000000B ;SCAN
MOVX @DPTR,A
LCALL READKEY
CJNE A,#0,KEYP1
CLR 31H ;KRELEASE
LJMP XGETKEY
KEYP1: ; DELAY AND CHECK AGAIN TO CONFIRM
MOV 31H,#MAXTIME
MOV 12H,#5
LCALL DL_200M
LCALL READKEY
CJNE A,#0,KEYP2
LJMP GETKEY1
KEYP2:
LCALL SCANER
XGETKEY:
POP B
POP DPL
POP DPH
RET
;====================================================
SCANER:
CLR 30H ;NOT FAIL
MOV 1AH,#8
CLR C ;CLEAR CARRY FLAG
SCANER1:
RLC A
JC SCANER2 ;----1 SHIFT TO C, SO 1AH CONTAIN BIT# OF 1
DJNZ 1AH,SCANER1
SCANER2:
MOV A,1AH ; COLUME
JNZ SCANER3 ;IF 1AH=0 MEAN NO KEY PRESS
SETB 30H
RET
SCANER3:
MOV A, #01111111B
MOV 1BH,#8
;
CHECKROW:
MOV DPTR,#PIOA
MOVX @DPTR,A
MOV B,A ; SAVE A
;
LCALL READKEY
CJNE A,#0, SCANER4
MOV A,B ;GET A BACK
RR A ;ROW "0" TO RIGHT
DJNZ 1BH,CHECKROW; SHIFT 8 TIME
MOV A,1BH
JNZ SCANER4 ;IF 1BH=0 MAIN NO KEYPRESS, SETB 30H SO THAT GO BACK TO GET KEY
SETB 30H
RET
;
SCANER4: ;檢查"SHIFT" KEY
SETB 28H ;KEY HAD BEEN PRESS
ORL P1,#01000000B MAKE P1 AS INPUT
MOV A,P1
ANL A, #01000000B MASK EXCEPT BIT6 ;SHIFT
JZ SCANER41
CLR 33H
AJMP KEYVALUE
SCANER41:
SETB 33H
;
KEYVALUE: ;COUNT AND GET REAL $ FROM MAP AND STORE TO BUFFER
DEC 1BH
DEC 1AH
MOV A,1BH
MOV B,#8
MUL AB
ADD A,1AH
;
JB 33H,KEYV1 ;SHIFT
ADD A,#64
KEYV1:
JNB 79H,KEYV2 ;CAPLOCK
KEYV1_1:
ADD A,#128
KEYV2: ;TRANLATE TO TARGET ABC
MOV DPTR,#SEG1
MOVC A,@A+DPTR
RET
;================================
;========COMMAND INTERPRETER=====
DO_CMD: ;COMPARE WORD WITH DATA
;R0 CONTAIN LEN OF COMMAND+30H
;R4 FOR DPH ADD SINCE COMMAND WORD EXIT 255
CLR 08H ; NOT BAD COMMAND
MOV R4,#0
MOV A,R0
CLR C
SUBB A,#KEYAREA ;NOW LEN OF CMD
JZ X_CMD2 ;NO COMMAND
;
MOV 19H,#0
MOV R3,#0 ;COUNT CMD CHECKED
;
ST_CMD:
MOV A,#11 ;LEN OF CMD
MOV B,R3
MUL AB
MOV R2,A ;LO BYTE
MOV R4,B ;HI BYTE
MOV R1,#KEYAREA ;POINT TO ST
LCALL CP_CMD
;-----CHECK SPACE OF CMD
MOV A,@R1
XRL A,#32
JZ ST_CMD1
MOV A,@R1
XRL A,#13
JZ ST_CMD1
INC 19H ;MARK ERROR
;
ST_CMD1:
MOV A,19H
JZ OK_CMD
MOV 19H,#0
INC R3
MOV A,R3
CJNE R3,#MAXCMD,ST_CMD ;MAX COMMAND 14 WORD CHECK
;
BAD_CMD: ;SHOW BAD COMMAND
LCALL LCLEAR2
MOV DPTR,#MSG9
LCALL LCDMSG
AJMP X_CMD
;
OK_CMD:
LCALL LCLEAR2
MOV DPTR,#MSG10
LCALL LCDMSG
;
X_CMD:
;R1+1 CONTAIN PARAMETER START POINT
;R3 CONTAIN MATCH COMMAND#
MOV A,R3
XRL A,#MAXCMD
JNZ X_CMD1
SETB 08H; BAD COMMAND
X_CMD1:
MOV A,R3
LCALL PRG_LIST ;EXECUTE
X_CMD2: ;NO EXECUTE
RET
;--SUB-- TRY TO GET MORE DIGIT
GETMETER: ;GET AND TEST PARAMETER RANGE
CLR 12H ;FLAG OF NO-METER
CLR 1FH ;FLAG OF OUT OF RANGE
MOV B,#0
MOV A,@R1
XRL A,#13
JZ NO_METER
;
INC R1 ;NEXT PARAMETER
MOV A,@R1
XRL A,#13
JZ NO_METER
;
MOV B,#0
GMETER1:
MOV A,@R1 ;GET PARAMETER (0-9 ONLY)
;MAKE SURE A VALUE
LCALL CHECK_DIGIT ;(0-9)
JNB 10H, X_METER2 ;CONTAIN A-Z
ADD A,B
MOV B,A
INC R1
MOV A,@R1
XRL A,#13
JZ XMETER
MOV A,#10
MUL AB
MOV B,A
AJMP GMETER1
;
XMETER: ;CHECK VALUE LIMIT
MOV A,B
SUBB A,R6 ;OK START
JC X_METER2 ;TOO SMALL
MOV A,R7 ;OK END
CLR C
SUBB A,B
JC X_METER2 ;TOO BIG
RET
;
NO_METER: ;NO METER
SETB 12H
RET
;
X_METER2:
SETB 1FH
RET
REV_CUR: ;MOVE THE CURSOR ONE BACK
MOV A,R0
CLR C
SUBB A,#KEYAREA ;HOW MANY LETTER
MOV B,A
LCALL LCDWREG
MOV A,#10000000B ;SET DDRAM POSITION
ADD A,11H ;PROMPT LEN
ADD A,B
LCALL LCDSTL
LCALL LCDWRAM
MOV A,#32
LCALL LCDST
LCALL LCDWREG
MOV A,#10000000B ;SET DDRAM POSITION
ADD A,11H
ADD A,B
LCALL LCDSTL
LCALL LCDWRAM
RET
SETRELAY:
MOV DPTR, #RELAY
CLR 70H xSPK
SETB 71H xPHONE
SETB 73H ONHOOK
MOV A,2EH
MOVX @DPTR,A
MOV 12H,#200
LCALL DL_200M
CLR 71H ;PHONE
CLR 73H ;OFFHOOK
SETB 77H ;OFFCID
MOV A,2EH
MOVX @DPTR,A
RET
SETPIO:
LCALL PIO_110
LCALL PIO2_101
LCALL SETBANK
RET
PIO_110:
MOV DPTR,#PIOR ;CONTROL REG
MOV A,#10001001B ;PA=OUT PB=OUT PC=IN
MOVX @DPTR,A
RET
PIO_111:
MOV DPTR,#PIOR
MOV A,#10000000B ;SET ALL PORT OUT
MOVX @DPTR,A
RET
PIO_112:
MOV DPTR,#PIOR
MOV A,#10011001B ;PA=IN PB=OUT PC=IN FOR READCLOCK
MOVX @DPTR,A
RET
PIO2_101:
;SET PORT A=OUT FOR PRINTER DATA OUTPUT
;SET PORT B=IN FOR RECEIVED DATA FROM CHAIN
;SET PORT C/0123=OUT FOR CONTROL BANK OF EPROM
;SET PORT C/4567=IN 4,5=INPUT FROM PRINTER PORT, BUSY/ACK
; PORT C/6=FOR CHECKING "YOU CAN MAKE INTERRUPT NOW" SIGNAL
; PORT C/7=FOR SECURITY SENSOR
; PRINTER STROBE USE Y7
; CHAIN INTERRUPT USE D6 TO INTERRUPT OTHER BOARD'S INT0
; CHAIN USE PORT B AS I/O AND USE P1.3 AS HAND-SHAKING
; USE Y6 OF DAC AS READ FOR WATCH DOG RESET
MOV DPTR,#PIO2R
MOV A,#10001010B ;A=OUT B=IN C=OUT/IN
MOVX @DPTR,A
RET
SETBANK:
MOV DPTR,#PIO2C
MOV A,#0 ;BANK 0
MOVX @DPTR,A
MOV A,#10101010B
MOV DPTR,#PIO2A
MOVX @DPTR,A
RET
SETRAM:
CLR 1DH ;NO ERROR
MOV DPTR,#RAM
MOV R7,#80H ;80H=128*256=32768 TOTAL RAM SIDE
MOV R6,#0
SETRAM1:
MOV A,#32
MOVX @DPTR,A
NOP
MOVX @DPTR,A
NOP
MOVX A,@DPTR
XRL A,#32
JZ SETRAM2
SETB 1DH
SETRAM2:
INC DPTR
DJNZ R6,SETRAM1
DJNZ R7,SETRAM1
;
JNB 1DH,SETRAM3
LCALL LCLEAR2
MOV DPTR,#MSG12
LCALL LCDMSG
;LCALL WAITKEY
SETRAM3: ;PUT HEADER IN THE FIRST LINE OF RAM
MOV DPTR,#MSG30A ;SOURCE
MOV 1EH,DPH
MOV 1FH,DPL
MOV DPTR,#RAM ;TARGET
LCALL MOVEMSG
MOV DPTR,#MSG30B ;SOURCE
MOV 1EH,DPH
MOV 1FH,DPL
MOV DPTR,#RAM ;TARGET
MOV A,DPL
ADD A,#80
MOV DPL,A
LCALL MOVEMSG
MOV DPTR,#MSG30C ;SOURCE
MOV 1EH,DPH
MOV 1FH,DPL
MOV DPTR,#RAM ;TARGET
MOV A,DPL
ADD A,#160
MOV DPL,A
LCALL MOVEMSG
SETRAM4: ;CLEAR RAM AREA 240-255
MOV DPTR,#RAM
MOV R6,#MAXLINE+1
MOV A,#0
SETLOOP0:
MOV DPL,#240
MOV R7,#16
SETLOOP:
MOVX @DPTR,A ;SAVE EXIT POINT
INC DPL
DJNZ R7,SETLOOP
INC DPH
DJNZ R6,SETLOOP0
SETRAM5: ;SET INIT VALUE FOR "VIEW","EMAIL"
MOV DPTR,#RAM+243
INC DPH
MOV A,#80
MOVX @DPTR,A
INC DPH
MOV A,#160
MOVX @DPTR,A
RET
;=================================
DB "~~~21"
RCLOCK:
PUSH DPH
PUSH DPL
PUSH ACC
PUSH 07H ;R7
PUSH 02H ;R2
PUSH 01H ;R1
LCALL PIO_112 ;PA SET TO INPUT SO THAT NO ERROR READ OF CLOCK DATA
RCLOCK2:
MOV R7,#0CH
MOV R1,#CLOCK ;50H ;DATA STORE AREA
MOV R2,#0DH
MOV DPTR,#PIOB
MOV A,R7
SETB ACC.7 ;HOLD
MOVX @DPTR,A
MOV 12H,#1
LCALL DL_200M
SETB ACC.5 ;RD
MOVX @DPTR,A
NOP
NOP
NOP
NOP
;
RCLOOP:
MOV A,R7
SETB ACC.7 ;HOLD
SETB ACC.5 ;RD
MOVX @DPTR,A
NOP
NOP
NOP
NOP
MOV DPTR,#PIOC
MOVX A,@DPTR
ANL A,#0FH
;
ADJ1:
CJNE R7,#08H,ADJ2 ;DAY HIGH
ANL A,#00000011B
LJMP RCNEXT
;
ADJ2:
CJNE R7,#05H,ADJ3 ;HOUR HIGH
ANL A,#00000011B
LJMP RCNEXT
;
ADJ3:
CJNE R7,#06H,RCNEXT ;DAY
ANL A,#00000111B
;
RCNEXT:
ADD A,#30H
MOV @R1,A
DEC R7
INC R1
MOV DPTR,#PIOB
DJNZ R2,RCLOOP
;
MOV A,#00H ;RELEASE HOLD
MOVX @DPTR,A
LCALL PIO_110
MOV DPTR,#PIOA
MOV A,#0
MOVX @DPTR,A
POP 01H
POP 02H
POP 07H
POP ACC
POP DPL
POP DPH
RET
DB "~~~22"
WCLOCK: ;WRITE CLOCK
PUSH DPH
PUSH DPL
PUSH ACC
PUSH 07H ;R7
PUSH 02H ;R2
PUSH 01H ;R1
LCALL PIO_111
MOV R1,#CLOCK ;50H ;DATA STORE AREA
MOV R2,#0CH
MOV A,#0
SETB ACC.7 ;HOLD
MOV DPTR,#PIOB
MOVX @DPTR,A
MOV 12H,#4
LCALL DL_200M
;
WLOOP:
MOV A,@R1
MOV DPTR,#PIOC ;TIME SENT
MOVX @DPTR,A
MOV DPTR,#PIOB
MOV A,R2 ;CONTAIN ADDRESS
SETB ACC.7 ;SET HOLD
MOVX @DPTR,A
NOP
NOP
NOP
NOP
SETB ACC.6 ;SET WR
MOVX @DPTR,A
NOP
NOP
NOP
NOP
CLR ACC.6 ;CLR WR
MOVX @DPTR,A
NOP
NOP
NOP
NOP
INC R1
DJNZ R2,WLOOP
;
MOV A,#0
MOV DPTR,#PIOB
MOVX @DPTR,A ;CLEAR HOLD
LCALL PIO_110
POP 01H
POP 02H
POP 07H
POP ACC
POP DPL
POP DPH
RET
STANDBY: ;LOOPING PROGRAM
LCALL ONCID
CLR 09H ;ESC NOT BEEN PRESS
CLR 19H ;TIME NOT OUT
MOV TL1,#0
MOV TH1,#0
LCALL LCLEAR2
MOV 17H,#0
MOV 18H,#RINGOUT
CLR 2EH
CLR 2DH ; INTERRUPT NEED EXIT
CLR 38H ; REDO FROM START
;
STANDBY1:
LCALL RCLOCK ;RCLOCK
LCALL READKEY
CJNE A,#0,STEXIT
LCALL LCDWREG
MOV A,#11000000B ;SET DDRAM POSITION
LCALL LCDSTL
MOV A,#00001100B ;OFF CURSOR
LCALL LCDST
LCALL LCDWRAM
;
LCALL SCLOCK
;
JNB 2CH,STANDBY3
LCALL TITLE
CLR 2CH
;
STANDBY3:
;EDIT=0 FIND=1 ALERT=4 CID=5 VIEW=6
MOV 20H,#01010011B
;
SETB EX1 ;開INT1中斷
NOP
NOP
NOP
CLR EX1 ;關中斷
MOV 20H,#00000000B
JB 2DH,STEXIT ;INTERRUPT NEED EXIT , CAUSE EXIT
JB 38H,STANDBY
LJMP STANDBY1
STEXIT:
LCALL OFFCID
RET
;=INTERNAL SUB============
REC_BFA: ;接收緩沖進位
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#RECBF
MOV A,DPL
ADD A,35H
MOV DPL,A
POP ACC
MOVX @DPTR,A
INC 35H
INC DPTR
PUSH ACC
MOV A,#13
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
DB "~~~09"
LCDMSG:
;LOAD DPTR WITH #DATA AND CALL THIS
PUSH ACC
PUSH B
MOV 10H,#0
LCDMSG1:
MOV A,10H
MOVC A,@A+DPTR
MOV B,A
XRL A,#13
JZ ELCDMSG
MOV A,B
LCALL LCDST
INC 10H
LJMP LCDMSG1
ELCDMSG:
POP B
POP ACC
RET
DB "~~~0E"
OFFCID:
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#RELAY
SETB 77H
MOV A,2EH
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
DB "~~~0F"
ONCID:
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#RELAY
CLR 77H
MOV A,2EH
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
DB "~~~26"
MOVEMSG:
;MOVE A STRING END WITH CHR$(13) FROM TO RAM
;MOVE SOURCE WITH 1EH,1FH, THEN LOAD DPTR WITH TARGET AND CALL THIS
;DPTR WILL CHANGE AFTER CALL
PUSH ACC
PUSH B
MOV A,#0
MOVEMSG1:
PUSH DPH
PUSH DPL
MOV B,A
MOV DPH,1EH
MOV DPL,1FH
MOVC A,@A+DPTR
POP DPL
POP DPH
XRL A,#13
JZ XMOVEMSG
XRL A,#13 ;RESTORE BACK TO OLD VALUE
MOVX @DPTR,A
MOV A,B
INC A
INC DPTR
AJMP MOVEMSG1
XMOVEMSG:
POP B
POP ACC
RET
SETLCD:
MOV 12H,#140
LCALL DL_200M
LCALL LCDWREG
MOV A, #00110000B
LCALL LCDSTL
LCALL LCDSTL
MOV 12H,#20 ;#10
LCALL DL_200M
MOV A, #00110000B
LCALL LCDSTL
MOV 12H,#20 ;#10
LCALL DL_200M
MOV A,#00111000B ;SET 8 BIT,2 LINE, 5X7 DOT
LCALL LCDSTL
MOV A,#00001000B ;OFF DISPLAY
LCALL LCDSTL
MOV A,#00000001B ;CLEAR SCREEN
LCALL LCDSTL
MOV A,#00111000B ;FUNCTION SET 8 BITS
LCALL LCDSTL
MOV A,#00001110B ;ON DISPLAY
LCALL LCDSTL
MOV A,#10000000B ;SET DDRAM POSITION
LCALL LCDSTL
LCALL LCDWRAM
MOV DPTR,#MSG32
LCALL LCDMSG
LCALL LCDWREG
LCALL LCDSTL
MOV A,#11000000B ;SET DDRAM POSITION
LCALL LCDSTL
LCALL LCDWRAM
MOV DPTR,#MSG37
LCALL LCDMSG
MOV 12H,#250
LCALL DL_200M
LCALL DL_200M
LCALL DL_200M
LCALL DL_200M
LCALL DL_200M
XSETLCD:
RET
LCDWREG:
PUSH DPH
PUSH DPL
MOV DPTR,#PIOB ;WRITE TO PORT B
CLR 78H
MOV A,2FH ;SET RS=0 R/W=0 OF LCD
MOVX @DPTR,A
POP DPL
POP DPH
RET
LCDWRAM:
PUSH DPH
PUSH DPL
MOV DPTR,#PIOB ;WRITE TO PORT B
SETB 78H
MOV A,2FH ;SET RS=1 R/W=0 OF LCD
MOVX @DPTR,A
POP DPL
POP DPH
RET
SETDTMF:
MOV DPTR,#DREG
MOVX A,@DPTR ;CLEAR IRQ
MOV A,#0
MOVX @DPTR,A
MOV A,#8
MOVX @DPTR,A
MOV A,#0
MOVX @DPTR,A
MOV 12H,#200
LCALL DL_200M
RET
SETCTRL: ;DTMF,CTRL
MOV DPTR,#DREG
MOVX A,@DPTR ; CLEAR IRQ
MOV A,#00001100B
MOVX @DPTR,A
MOV A,#00000001B
MOVX @DPTR,A
MOV 12H,#40
LCALL DL_200M
RET
TITLE:
PUSH DPH
PUSH DPL
LCALL LCLEAR1
MOV A,13H
JNZ TITLE1
MOV DPTR,#MSG1
LCALL LCDMSG
MOV DPTR,#MSG2
LCALL LCDMSG
MOV DPTR,#MSG4
LCALL LCDMSG
LJMP XTITLE
;
TITLE1:
MOV DPTR,#MSG24
LCALL LCDMSG
MOV A,13H
ADD A,#30H
LCALL LCDST
JNB 7CH,XTITLE
JNB 2BH,TITLE2
MOV DPTR,#MSG44
LCALL LCDMSG
TITLE2:
JNB 2AH,XTITLE
MOV DPTR,#MSG43
LCALL LCDMSG
XTITLE:
POP DPL
POP DPH
RET
KEYPREFIX:
LCALL LCLEAR1
MOV DPH,50H
MOV DPL,51H
KEYPREFIX1:
LCALL LCDMSG
LCALL LCDWREG
MOV A,#00001111B ;ON DISPLAY & CURSOR+BLINK
LCALL LCDSTL
LCALL LCDWRAM
RET
READKEY:
;RETURN A VALUE IN A
PUSH DPH
PUSH DPL
MOV DPTR,#PIOC
MOVX A,@DPTR
CPL A
ANL A,#11111111B ;NOT MASK D6,D7
POP DPL
POP DPH
RET
DB "~~~0B"
LCDST:
; LOAD A WITH CHARACTER AND CALL THIS
PUSH DPH
PUSH DPL
MOV DPTR,#PIOA
MOVX @DPTR,A
MOV DPTR,#LCD ;STROBE
MOVX @DPTR,A ;FALSE
MOV 12H,#20
INC 4CH
LCDST1:
DJNZ 12H,LCDST1
POP DPL
POP DPH
RET
DB "~~~0A"
LCDSTL: ;LONG DELAY
; LOAD A WITH CHARACTER AND CALL THIS
PUSH DPH
PUSH DPL
MOV DPTR,#PIOA
MOVX @DPTR,A
MOV DPTR,#LCD ;STROBE
MOVX @DPTR,A ;FALSE
MOV 12H,#20
LCALL DL_200M
INC 4CH
POP DPL
POP DPH
RET
DL_200M: ;200MS 12H=200 THEN 200MS IN 12MHZ
PUSH 07H
PUSH 06H
PUSH 05H
MOV R7,#2
DL1:
MOV R6,#250
DL2:
MOV R5,12H
DL3:
DJNZ R5,DL3
DJNZ R6,DL2
DJNZ R7,DL1
POP 05H
POP 06H
POP 07H
RET
INITT0:
CLR 19H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB PT0 ;令計數器0中斷優先
SETB ET0 ;計數器0中斷智能
RET
INITT2:
MOV 45H,#3CH ;LOAD TO TH2 IN INT
MOV TH2,45H
MOV TL2,#0B0H
CLR EXEN2 ;外部T2EX不靈
SETB PT2 ;令計數器2中斷高位 ****
;CLR PT2 ;令計數器2中斷低位
SETB ET2 ;計數器2中斷智能
SETB TR2 ;起動計數器2
RET
CP_CMD: ;比較字符
MOV DPTR,#CMM0 ;START OF COMMAND WORD AREA
MOV A,DPH
ADD A,R4
MOV DPH,A
MOV B,@R1
MOV A,R2
MOVC A,@A+DPTR
MOV R7,A ;STORE TO R7
XRL A,#13
JZ XCP_CMD ;IF 13 JMP
MOV A,R7
XRL A,#32
JZ XCP_CMD ;IF 32 JMP
MOV A,R7
XRL A,B
JZ CP_CMD1
INC 19H ;字符不同則增加19H
CP_CMD1:
INC R1
INC R2
LJMP CP_CMD
;
XCP_CMD:
RET
KEY_CLR:
MOV R0,#KEYAREA
MOV @R0,#13
RET
KEY_SHOW: ;SHOW BUFFER
PUSH DPH
PUSH DPL
MOV R0,#KEYAREA
KEY_SHOW1:
MOV A,@R0
XRL A,#13
JZ XKEY_SHOW
MOV A,@R0
LCALL LCDST
INC R0
LJMP KEY_SHOW1
XKEY_SHOW:
POP DPL
POP DPH
RET
KEY_SAFE: ;SAVE BUFFER USE LAST 255 BYTE FOR BUFFER
PUSH ACC
MOV DPTR,#OLDCMD
MOV R0,#KEYAREA
KEY_SAFE1:
MOV A,@R0
XRL A,#13
JZ XKEY_SAFE
MOV A,@R0
MOVX @DPTR,A
INC DPL
INC R0
LJMP KEY_SAFE1
XKEY_SAFE:
MOV A,#13
MOVX @DPTR,A
POP ACC
RET
KEY_LOAD: ;LOAD BUFFER USE LAST 255 BYTE FOR BUFFER
PUSH ACC
MOV DPTR,#OLDCMD
MOV R0,#KEYAREA
KEY_LOAD1:
MOVX A,@DPTR
XRL A,#13
JZ XKEY_LOAD
MOVX A,@DPTR
MOV @R0,A
INC DPL
INC R0
LJMP KEY_LOAD1
XKEY_LOAD:
MOV @R0,#13
POP ACC
RET
REC_CLR:
PUSH 07H
PUSH DPH
PUSH DPL
PUSH ACC
MOV R7,#0 ;256BYTE
MOV DPTR,#RECBF
REC_CLR1:
MOV A,#32
MOVX @DPTR,A
INC DPL
DJNZ R7,REC_CLR1
MOV DPTR,#RECBF
MOV 35H,#0
MOV A,#13
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
POP 07H
RET
REC_TAB: ;CHOP #13 AT POINT
MOV R7,#5
REC_TAB1:
MOV A,R7
DEC A
MOV DPTR,#TAB00
MOVC A,@A+DPTR
MOV DPTR,#RECBF
ADD A,DPL
MOV DPL,A
MOV A,#13
MOVX @DPTR,A
DJNZ R7,REC_TAB1
RET
KEY_BFA: ;鍵盤緩沖進位
MOV @R0,A
INC R0
MOV @R0,#13
RET
KEY_BFB: ;鍵盤緩沖退位
DEC R0
MOV @R0,#13
RET
BEEP:
PUSH DPH
PUSH DPL
PUSH 06H
PUSH 07H
SETB 70H
MOV DPTR,#RELAY
MOV A,2EH
MOVX @DPTR,A
BEEP0:
MOV 12H,#50
LCALL DL_200M
MOV DPTR,#DAC
MOV R7,#0
MOV R6,#128
BEEP1:
MOV A,R7
MOVX @DPTR,A
INC R7
CJNE R7,#16,BEEP1
BEEP2:
MOV A,R7
MOVX @DPTR,A
DEC R7
CJNE R7,#0,BEEP2
DJNZ R6,BEEP1
CLR 70H
MOV DPTR,#RELAY
MOV A,2EH
MOVX @DPTR,A
POP 07H
POP 06H
POP DPL
POP DPH
RET
DB "~~~29"
CHECK_DIGIT: ; SETB 10H IF 0-9 AND CONVERT "0" TO VALUE 0
CLR 10H
PUSH B
MOV B,A
CLR C
SUBB A,#30H ;"0"
JC XCHECK_DIGIT ;<0
MOV A,#39H
CLR C
SUBB A,B
JC XCHECK_DIGIT
SETB 10H
MOV A,B
CLR C
SUBB A,#30H
XCHECK_DIGIT:
POP B
RET
DB "~~~10"
LCLEAR1: ;CLEAR LINE #1
PUSH ACC
LCALL LCDWREG
MOV A,#10000000B ;SET DDRAM POSITION
LCALL LCDSTL
LCALL LCDWRAM
MOV 10H,#MAXWIDTH
INC 10H
LCLOOP1:
MOV A,#32
LCALL LCDST
DJNZ 10H,LCLOOP1
LCALL LCDWREG
MOV A,#10000000B
LCALL LCDSTL
LCALL LCDWRAM
MOV 4CH,#0
POP ACC
RET
DB "~~~12"
LCLEAR2: ;CLEAR LINE #1
PUSH ACC
LCALL LCDWREG
MOV A,#11000000B ;SET DDRAM POSITION
LCALL LCDSTL
LCALL LCDWRAM
MOV 10H,#MAXWIDTH
INC 10H ;LOOP NEED
LCLOOP2:
MOV A,#32
LCALL LCDST
DJNZ 10H,LCLOOP2
LCALL LCDWREG
MOV A,#11000000B
LCALL LCDSTL
LCALL LCDWRAM
MOV 4CH,#0
POP ACC
RET
SIN_TB: DB 127,144,159,174,186,196,203,208,210,208
DB 203,196,186,174,160,144,127,110,092,075
DB 060,045,033,023,016,011,010,011,016,023
DB 033,045,059,075,092,109 ;36 GET 2203H
DB 127,143,159,173,185,195,203,208,210,209
DB 206,199,190,179,166,151,135,118,102,085
DB 069,054,041,030,021,014,011,010,012,017
DB 025,035,047,061,077,093,109 ;37 GET 1202H
;=========================
POINTSUB: ;SEARCHING FOR SUB ADDRESS
RET
ORG 1000H
MSG1: DB "Teletyper",13
MSG2: DB " Communicator ",13
MSG4: DB "Designed By CPK.",13
MSG3_1: DB "COMMAND:",13
MSG3_2: DB "ANSWER=",13
MSG5: DB "Date=",13
MSG6: DB "Time=",13
MSG6_1: DB "Caller:",13
MSG8: DB " Ring...",13
MSG9: DB "Unknown Command,Type HELP For Help",13
MSG10: DB " OK...",13
MSG11: DB "Press ESC To Exit, ENTER To Continue",13
MSG12: DB "CAUTION: RAM TEST ERROR ",13
MSG34: DB "CAUTION: EPROM TEST ERROR AT:",13
MSG13: DB "MEMORY TEST FINISH!",13
MSG14: DB "RAM CHECKING ",13
MSG15: DB "FLASH MEMORY CHECKING BANK=",13
MSG16: DB "Press ANY KEY",13
MSG17: DB "----End Of File----",13
MSG18: DB "VIEW 0-2 0=EDITOR 1=TEL_MESSAGE 2=EMAIL",13
MSG22: DB "CLEAR OLD FILE? Y=YES ",13
MSG23: DB "EMAIL: / FR:88389 TO:53540",13
MSG24: DB "Waiting For Caller For Ring=",13
MSG25: DB "OUT OF RANGE, ONLY 0-9 (0=NOT ANSWER)",13
MSG30A: DB "PAGE0 FOR EDITOR",13
MSG30B: DB "INCOMING SHORT MESSAGE",13
MSG30C: DB "INCOMING EMAIL",13
MSG31: DB "LINE TOO LONG, PRESS ENTER FOR NEXT LINE",13
MSG32: DB "Teletyper Operating System VER 1.0 4/97",13
MSG33: DB "Clock Not Set, Please Check!",13
MSG35: DB "PAGE COMMUNICATION...",13
MSG36: DB " SPEAKER ON",13
MSG37: DB "All Rights Reserved, MR. CHUA PUAY KIANG",13
MSG38: DB "TELETYPER COMMUNICATION..",13
MSG39: DB "WAIT FOR CALLER KEY...",13
MSG40: DB "ON LINE TALKING, Type Now & Press Enter",13
MSG41: DB "WAIT FOR ",34,"D",34," KEY FROM REMOTE...",13
MSG42: DB "WAIT FOR BEEP SOUND... AND PRESS ENTER",13
MSG43: DB " Email",13
MSG44: DB " NEW",13
MSG45: DB "TOTAL CHARACTERS TO SENT=",13
MSG46: DB "TEXT FILE COMMUNICATION ",13
MSG47: DB "Press Any Key To Abort",13
MSG48: DB "TRIANGLE WAVE GENERATE BY D/A CONVERTER",13
MSG49: DB "MARKING FLASH MEMORY..",13
MSG50: DB "INVALID RING SIGNAL...",13
MSG51: DB "R.",13
MSG52: DB "r.",13
MSG53: DB "BANK= Chua Puay Kiang Date:17-12-1997",13
MSG54: DB "FLASH MEMORY ERROR AT BANK=",13
MSG55: DB "WRITE CHARACTER TO SECTOR:",13
MSG56: DB "COMPARE DATA WITH SECTOR:",13
MSG57: DB " Byte=",13
MSG58: DB "Noise..",13
MSG59: DB "WAITING FOR D KEY FROM OTHER MACHINE",13
;----------FULL
ORG 1500H
TAB00: DB 0,32,48,64,96,0
TAB01: DB 32,16,16,32,32,40
MSG60: DB "CHECKSUM...",13
MSG61: DB "ERROR!",13
MSG62: DB "Waiting For Data...",13
MSG63: DB "DATA SENT OUT, PRESS ANY KEY",13
MSG64: DB "BINARY FILE COMMUNICATION",13
MSG65: DB "COMBIN 0 TO COMBIN 15, 0-15=BANK NO",13
MSG66: DB "DIAL NO=",13
MSG67: DB "NO TELEPHONE NUMBER GIVEN!",13
MSG68: DB "END=CHANGE BOUND, SHIFE+END=CHANGE BANK",13
MSG69: DB "Current ",13
MSG70: DB "NAME: ",13
MSG71: DB "TEL1: ",13
MSG72: DB "TEL2: ",13
MSG73: DB "ADD1: ",13
MSG74: DB "ADD2: ",13
MSG75: DB "DATA: ",13
MSG76: DB "SAVE DATA? Y=YES ",13
MSG77: DB "CLEAR ALL NAME IN DATABANK? Y=YES ",13
MSG78: DB "BANK=",13
MSG79: DB " SECTOR=",13
MSG80: DB "MEMORY FULL, DATA NOT SAVE!",13
MSG81: DB "DATA WRITE TO ",13
MSG82: DB "NOT FOUND! --TOP--",13
MSG83: DB "NOT FOUND! --BOTTOM--",13
MSG84: DB "DELETE ",13
MSG85: DB "? Y=YES ",13
MSG86: DB "----UNKNOWN!----",13
;MORE MSG HERE
ORG 1700H
MSG7: DB "Sunday ",13
DB "Monday ",13
DB "Tuesday ",13
DB "Wednesday ",13
DB "Thursday ",13
DB "Friday ",13
DB "Saturday ",13 ;TOTAL 77
DB "Godday ",13 ;UNKNOWN DAY
TIM*: DB "ADGJMPSVY"
TIM0: DB "BEHKNQTWZ"
TIM#: DB "CFILORUX " ;TOTAL 104
TIMTA: DB "*0#*0#*0#*0#*0#*0#*0#*0#*0#" ;27
TIMTB: DB "111222333444555666777888999" ;27
TONE: DB "D1234567890*#ABC" ;16
THEX: DB "0123456789ABCDEF" ;16 TOTAL 190
SYMA1: DB "ABCABCABCABCAB" ; !"#$%&'()*+-./
SYMA2: DB "11122233344455" ; 14
SYMB1: DB "ABCABCA" ; :;<=>?@
SYMB2: DB "5666777" ; 7
SYMC1: DB "ABCABC" ; [\]^_'
SYMC2: DB "888999" ; 6
SYMD1: DB "DDDDD" ; {|}~`
SYMD2: DB "12345" ; 5 SPARE=4
TIMA: DB "!$,*.;>[^"
TIMB: DB 34,"%(+/<?\_"
TIMC: DB "#&)-:=@]'"
TIMD: DB "{|}~` " ; TOTAL 36
API*: DB " ADGJMPTW"
API0: DB "QBEHKNRUX"
API#: DB "ZCFILOSVY"
APITA: DB "*0#*0#*0#*0#*0#*00#*0#*0#*#" ;27
APITB: DB "222333444555666717788899911" ;27
VOC0: DB 32,48,49,50,51,52,53,54,55,56,57,65,66,67,68
VOC1: DB 69,70,71,72,73,74,75,76,77,78,79,80,81,82,83
VOC2: DB 84,85,86,87,88,89,90,08,01,13,02,255
;#ERASE=08,#SPELL=01,#ENTER=13,#BASE=02,#MAGICAD=255 TOTAL 42 18A8H
ORG 1900H
;SEG8: right=03 SHIFT=16
; end=05 SHIFT=18
; esc=27
; left=04 SHIFT=17
; down=01 SHIFT=14
; up=02 SHIFT=15
; del=06 SHIFT=19
; cap=07
; ins=10
; 2nd=11
; TAB=09 SHIFT=20
; BACK=08 SHIFE=21
SEG1: DB "4",27," ",20,"7",07
DB 11,"<","1","~",";","Q"
DB "*","A","K","Z",17,"\"
DB "I","W","5","S",18,"X"
DB "2","-","?","E","8","D"
DB "L","C",14,"_","O","R"
DB "0","F",">","V",15,"="
DB "/","T","6","G",10,"B"
DB "3","+","P","Y","9","H"
DB 13,"N",16,":",21,"U"
DB "#","J",19,"M" ;SO THAT 64
DB "4",27," ",09,"7",07
DB 11,",","1","!","*","q"
DB "*","a","k","z",04,"@"
DB "i","w","5","s",05,"x"
DB "2","#","(","e","8","d"
DB "l","c",01,"$","o","r"
DB "0","f",".","v",02,"%"
DB ")","t","6","g",10,"b"
DB "3","^","p","y","9","h"
DB 13,"n",03,"&",08,"u"
DB "#","j",06,"m" ;so that 64
;-----------------------------------------CAPLOCK
DB "4",27," ",20,"7",07
DB 11,"<","1","~",";","q"
DB "*","a","k","z",17,"\"
DB "i","w","5","s",18,"x"
DB "2","-","?","e","8","d"
DB "l","c",14,"_","o","r"
DB "0","f",">","v",15,"="
DB "/","t","6","g",10,"b"
DB "3","+","p","y","9","h"
DB 13,"n",16,":",21,"u"
DB "#","j",19,"m" ;so that 64
DB "4",27," ",09,"7",07
DB 11,",","1","!","*","Q"
DB "*","A","K","Z",04,"@"
DB "I","W","5","S",05,"X"
DB "2","#","(","E","8","D"
DB "L","C",01,"$","O","R"
DB "0","F",".","V",02,"%"
DB ")","T","6","G",10,"B"
DB "3","^","P","Y","9","H"
DB 13,"N",03,"&",08,"U"
DB "#","J",06,"M" ;SO THAT 64
;------------------------------------------------2ND
SEG2: DB "4",27," ",09,"7",07
DB 11,"<","1","~",";","Q"
DB "*","A","K","Z",04,"\"
DB "I","W","5","S",05,"X"
DB "2","-","?","E","8","D"
DB "L","C",01,"_","O","R"
DB "0","F",">","V",02,"="
DB "/","T","6","G",10,"B"
DB "3","+","P","Y","9","H"
DB 13,"N",03,":",08,"U"
DB "#","J",06,"M" ;SO THAT 64
DB "4",27," ",09,"7",07
DB 11,",","1","!","*","q"
DB "*","a","k","z",04,"@"
DB "i","w","5","s",05,"x"
DB "2","#","(","e","8","d"
DB "l","c",01,"$","o","r"
DB "0","f",".","v",02,"%"
DB ")","t","6","g",10,"b"
DB "3","^","p","y","9","h"
DB 13,"n",03,"&",08,"u"
DB "#","j",06,"m" ;so that 64
;-----------------------------------------CAPLOCK
DB "4",27," ",09,"7",07
DB 11,"<","1","~",";","q"
DB "*","a","k","z",04,"\"
DB "i","w","5","s",05,"x"
DB "2","-","?","e","8","d"
DB "l","c",01,"_","o","r"
DB "0","f",">","v",02,"="
DB "/","t","6","g",10,"b"
DB "3","+","p","y","9","h"
DB 13,"n",03,":",08,"u"
DB "#","j",06,"m" ;so that 64
DB "4",27," ",09,"7",07
DB 11,",","1","!","*","Q"
DB "*","A","K","Z",04,"@"
DB "I","W","5","S",05,"X"
DB "2","#","(","E","8","D"
DB "L","C",01,"$","O","R"
DB "0","F",".","V",02,"%"
DB ")","T","6","G",10,"B"
DB "3","^","P","Y","9","H"
DB 13,"N",03,"&",08,"U"
DB "#","J",06,"M" ;SO THAT 64
ORG 1B00H
CMM0: DB "HELP ",13
CMM1: DB "DIAL ",13
CMM2: DB "TESTRAM ",13
CMM3: DB "VIEW ",13
CMM4: DB "FIND ",13
CMM5: DB "VERSION ",13
CMM6: DB "CLOCK ",13
CMM7: DB "EDIT ",13
CMM8: DB "ALERT ",13
CMM9: DB "SENT ",13 ;TOTAL 110
CM10: DB "MONITOR ",13
CM11: DB "PAGER ",13
CM12: DB "EMAIL ",13
CM13: DB "COMOUT ",13
CM14: DB "SINWAVE ",13 ;GENERATE SIN WAVE
CM15: DB "TIME ",13
CM16: DB "DATE ",13
CM17: DB "TESTDAC ",13
CM18: DB "TESTSQ ",13
CM19: DB "xxxxxxx ",13 ;TOTAL 220
CM20: DB "xxxxxxx ",13
CM21: DB "COMIN ",13
CM22: DB "VIEWFLASH ",13 ;TOTAL 253
CM23: DB "nnnnnnnnn ",13 ;EX BOUND 1C00
CM24: DB "COMBIN ",13 ;START AT 8
CM25: DB "SOUND ",13
CM26: DB "VOICE ",13
CM27: DB "MIC ",13
CM28: DB "DAY ",13
CM29: DB "SEARCHSUB ",13
CM30: DB "DATABANK ",13
CM31: DB "CLEANDATA ",13
CM32: DB "VIEWBANK ",13
CM33: DB " ",13
CM34: DB " ",13
CM35: DB " ",13
CM36: DB " ",13
CM37: DB " ",13
CM38: DB " ",13
CM39: DB " ",13
CM40: DB " ",13
CM41: DB " ",13
CM42: DB " ",13
CM43: DB " ",13
CM44: DB " ",13
CM45: DB "FISH1 ",13
CM46: DB "nnnnnnnnn ",13 ;EX BOUND 1D00
CM47: DB "sDAY ",13
CM48: DB " ",13
CM49: DB " ",13
CM50: DB " ",13
CM51: DB " ",13
CM52: DB " ",13
CM53: DB " ",13
CM54: DB " ",13
CM55: DB " ",13
CM56: DB " ",13
CM57: DB " ",13
CM58: DB " ",13
CM59: DB " ",13
CM60: DB " ",13
CM61: DB " ",13
CM62: DB " ",13
CM63: DB " ",13
CM64: DB " ",13
CM65: DB " ",13
CM66: DB " ",13
CM67: DB "HELLO ",13
CM68: DB "GOOD ",13
;===========================1D00
;TO ADD MORE CMD:
;FIND "MAXCMD"
;EDIT "PRG_LIST"
;ALSO "XPRGLIST"
;==================================
ORG 1E00H
;INTERRUPT ROUTINE
PINT0: ;FOR MULTI CPU COMMUNICATION
RETI
PINT1: ;中斷1, 被擴展為8個中斷口
ORL P1,#00000111B
MOV A,P1
ANL A, #00000111B
MOV B,#2
MUL AB
MOV DPTR, #1FEFH
JMP @A+DPTR
PTF0: ;計數器0 50MS中斷一次, 時間計數用
MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ 31H,XPTF0
SETB 19H
XPTF0:
RETI
PTF1: ;計數器T1, 通過T1腳計算脈沖
RETI
PTF2: ;計數器T2 用為KEY REPEAT 和 COUNT 鑒定訊號
CLR TF2 ;計數器溢位標志清除
MOV TH2,45H
MOV TL2,#0B0H
DJNZ 44H,XPTF2
SETB 2FH
XPTF2:
RETI
SER: ;串行口
RETI
ORG 1F00H
;--INTERRUPT LIST FOR INT1
;---MUST PUT TOGETHER WITH UNDER ROUTINE-------
IR0: ;EDIT
PUSH ACC
JNB 00H,XIR0
LCALL KEY_CLR
MOV A,#45H
LCALL KEY_BFA
MOV A,#44H
LCALL KEY_BFA
MOV A,#49H
LCALL KEY_BFA
MOV A,#54H
LCALL KEY_BFA
SETB 2DH
MOV 20H,#00000000B ;NO MORE INTER
XIR0:
POP ACC
RETI
IR1: ;FIND
PUSH ACC
JNB 01H,XIR1
LCALL KEY_CLR
MOV A,#46H
LCALL KEY_BFA
MOV A,#49H
LCALL KEY_BFA
MOV A,#4EH
LCALL KEY_BFA
MOV A,#44H
LCALL KEY_BFA
SETB 2DH
MOV 20H,#00000000B ;NO MORE INTER
XIR1:
POP ACC
RETI
IR2:
;02
RETI
IR3:
;03
RETI
IR4: ;ALERT ON/OFF
PUSH ACC
JNB 04H,XXIR4
MOV 12H,#40
LCALL DL_200M
SETB 2CH ;FORCE SHOW TITLE IN STANDBY
JNB 37H,IR41
CLR 37H
MOV 13H,#0
AJMP XIR4
IR41:
SETB 37H
MOV 13H,41H
XIR4:
ORL P1,#00000111B
MOV A,P1
ANL A, #00000111B
CJNE A,#4,XXIR4
AJMP XIR4
XXIR4:
LCALL DL_200M
POP ACC
RETI
IR5: ;CID
JNB 05H,XXXIR5
CLR EX1
MOV 20H,#00000000B
MOV A,42H
LCALL REC_BFA
;LCALL LCDST
IR5_1:
MOV 42H,#0
MOV 12H,#250
XIR5:
DJNZ 12H,XIR5
MOV 12H,#100
XXIR5:
DJNZ 12H,XXIR5
XXXIR5:
RETI
IR6: ;VIEW THE SHORT MESSAGE
PUSH ACC
JNB 06H,XIR6
LCALL KEY_CLR
MOV A,#56H
LCALL KEY_BFA
MOV A,#49H
LCALL KEY_BFA
MOV A,#45H
LCALL KEY_BFA
MOV A,#57H
LCALL KEY_BFA
SETB 2DH
MOV 20H,#00000000B ;NO MORE INTER
XIR6:
POP ACC
RETI
IR7:
;07
RETI
;--------------------------------------
ORG 1FEFH ;FOR INTERRUPT ROUTINE
AJMP IR0 ;2 BYTES
AJMP IR1
AJMP IR2
AJMP IR3
AJMP IR4
AJMP IR5
AJMP IR6
AJMP IR7 ;TOTAL 16 BYTE
NOP ;BUG OF MBUG
;============THIS POINT LAST ADDRESS OF 8052
ORG 2000H
; THIS SHOULD REMAIN HERE AFTER MASKING ROM MADE
FIXCLOCK:
LCALL SCLOCK
RET
;----PROGRAM LIST----
PRG_LIST:
PRG0: ;HELP
CJNE A,#0,PRG1
LCALL HELP
MOV A,#0FFH ;FALSE
PRG1: ;DIAL AND TALK
CJNE A,#1,PRG2
CLR 1CH
LCALL DIAL
MOV A,#0FFH ;FALSE
PRG2: ;TESTRAM
CJNE A,#2,PRG3
LCALL TESTRAM
MOV A,#0FFH ;FALSE
PRG3: ;VIEW
CJNE A,#3,PRG4
LCALL VIEW
MOV A,#0FFH ;FALSE
PRG4: ;FIND
CJNE A,#4,PRG5
; USE FOR FIND DATA, DEVELOPE LATER ON
MOV A,#0FFH ;FALSE
PRG5:
CJNE A,#5,PRG6
LCALL VERSION
MOV A,#0FFH ;FALSE
PRG6: ;SET CLOCK
CJNE A,#6,PRG7
LCALL WCLOCK
MOV A,#0FFH ;FALSE
PRG7: ;EDIT
CJNE A,#7,PRG8
LCALL EDIT
MOV A,#0FFH ;FALSE
PRG8: ;ALERT
CJNE A,#8,PRG9
LCALL ALERT
MOV A,#0FFH ;FALSE
PRG9: ;SENT
CJNE A,#9,PRG10
LCALL SENT
MOV A,#0FFH ;FALSE
PRG10: ;MONITOR SPK CONTROL
CJNE A,#10,PRG11
LCALL MONITOR
MOV A,#0FFH ;FALSE
PRG11: ;DIAL TO PAGER
CJNE A,#11,PRG12
SETB 27H
LCALL SENT
CLR 27H
MOV A,#0FFH ;FALSE
PRG12: ;EMAIL
CJNE A,#12,PRG13
LCALL EMAIL
MOV A,#0FFH ;FALSE
PRG13: ;COMM PORT
CJNE A,#13,PRG14
LCALL COMOUT
MOV A,#0FFH ;FALSE
PRG14: ;SINWAVE
CJNE A,#14,PRG15
LCALL SINWAVE
MOV A,#0FFH ;FALSE
PRG15: ;TIME
CJNE A,#15,PRG16
LCALL SETTIME
MOV A,#0FFH ;FALSE
PRG16: ;DATE
CJNE A,#16,PRG17
LCALL SETDATE
MOV A,#0FFH ;FALSE
PRG17: ;TESTDAC
CJNE A,#17,PRG18
LCALL TESTDAC
MOV A,#0FFH ;FALSE
PRG18: ;TESTSQ
CJNE A,#18,PRG19
LCALL TESTSQ
MOV A,#0FFH ;FALSE
PRG19:
CJNE A,#19,PRG20
MOV A,#0FFH ;FALSE
PRG20: ;MORE
CJNE A,#20,PRG21
MOV A,#0FFH ;FALSE
PRG21: ;COMIN
CJNE A,#21,PRG22
LCALL COMIN
MOV A,#0FFH ;FALSE
PRG22: ;MORE
CJNE A,#22,PRG23
LCALL VIEW_F
MOV A,#0FFH ;FALSE
PRG23: ;MORE
CJNE A,#23,PRG24
;FLASE
MOV A,#0FFH ;FALSE
PRG24: ;MORE
CJNE A,#24,PRG25
LCALL COMBIN
MOV A,#0FFH ;FALSE
PRG25: ;MORE
CJNE A,#25,PRG26
LCALL SOUND
MOV A,#0FFH ;FALSE
PRG26: ;MORE
CJNE A,#26,PRG27
LCALL VOICE
MOV A,#0FFH ;FALSE
PRG27: ;MORE
CJNE A,#27,PRG28
LCALL ONMIC
MOV A,#0FFH ;FALSE
PRG28: ;MORE
CJNE A,#28,PRG29
LCALL SETDAY
MOV A,#0FFH ;FALSE
PRG29: ;MORE
CJNE A,#29,PRG30
LCALL SEARCHSUB
MOV A,#0FFH ;FALSE
PRG30: ;MORE
CJNE A,#30,PRG31
SETB 39H
LCALL DATABANK
CLR 39H
MOV A,#0FFH ;FALSE
PRG31: ;MORE
CJNE A,#31,PRG32
SETB 39H
LCALL CLEANDATA
CLR 39H
MOV A,#0FFH ;FALSE
PRG32: ;MORE
CJNE A,#32,PRG33
SETB 39H
LCALL VIEW_F
CLR 39H
MOV A,#0FFH ;FALSE
PRG33: ;MORE
CJNE A,#33,PRG34
MOV A,#0FFH ;FALSE
PRG34: ;MORE
CJNE A,#34,PRG35
MOV A,#0FFH ;FALSE
PRG35: ;MORE
CJNE A,#35,PRG36
MOV A,#0FFH ;FALSE
PRG36: ;MORE
CJNE A,#36,PRG37
MOV A,#0FFH ;FALSE
PRG37: ;MORE
CJNE A,#37,PRG38
MOV A,#0FFH ;FALSE
PRG38: ;MORE
CJNE A,#38,PRG39
MOV A,#0FFH ;FALSE
PRG39: ;MORE
CJNE A,#39,XPRGLIST
MOV A,#0FFH ;FALSE
;
XPRGLIST:
RET
ORG 2200H
PAGEVIEW: ;ENTRY POINT FOR "EDIT","EMAIL","VIEW"
CLR EX1
CLR 19H
MOV 11H,#6 ;MORE TIME
MOV 31H,#MAXTIME ;LONG LONG
;CURSOR LINE#
MOV 09H,#MAXLINE ;MAX LINE IN PAGE
JNB 20H,P_VIEW1
MOV A,09H
ADD A,#8 ;MORE LINE TO VIEW IF "MONITOR"
MOV 09H,A
P_VIEW1:
JNB 34H,P_VIEW11
MOV 09H,#31 ;ONLY HAVE 32 LINE IN FLASH "8K"
P_VIEW11:
LCALL LCLEAR1
LCALL LCLEAR2
LCALL CURSOR2
;MOV 1CH,37H ;#0 ; CURSOR AT LINE 0
;MOV 1DH,38H ;#0 ; CURSOR AT COL 0
VIEW0: ;ORG=VIEW:
MOV R7,#MAXWIDTH
INC R7 ;LOOP NEED
LCALL LBEGIN1
LCALL VIEW_AD ; COUNT THE START POINT OF THE VIEW AREA
LCALL VIEWLINE
LCALL LBEGIN2
MOV A,08H
XRL A,09H
JNZ VIEW7
LCALL LCLEAR2
MOV DPTR,#MSG17 ;END OF FILE
LCALL LCDMSG
MOV 1CH,#0 ;CURSOR
AJMP VIEW_GK
VIEW7:
INC DPH
MOV DPL,14H ;R6 ;#0
MOV R7,#MAXWIDTH
INC R7 ;LOOP NEED
LCALL VIEWLINE
DEC DPH
VIEW_GK: ;START POINT
CLR 0CH
LCALL SET_CUR
VIEW_GK1:
SETB EX1
LCALL GETKEY
CLR EX1
JNB 19H,VIEW_GK2
MOV 31H,#MAXTIME
CLR 19H
DJNZ 11H,VIEW_GK2
AJMP XVIEW
VIEW_GK2:
JZ VIEW_GK1
VIEWXX:
MOV B,A
; NEXTKEY CAUSE SCREEN RENEW
; VIEW_GK NO RENEW
C_KEY0: ;DOWN
XRL A,#1
JNZ C_KEY1
LCALL K_DOWN
LCALL KREPEAT
JNB 0CH,VIEW_GK
AJMP NEXTKEY
C_KEY1: ;UP
MOV A,B
XRL A,#2
JNZ C_KEY2
LCALL K_UP
LCALL KREPEAT
JNB 0CH,VIEW_GK
AJMP NEXTKEY
C_KEY2: ;RIGHT
MOV A,B
XRL A,#3
JNZ C_KEY3
LCALL K_RIGHT
LCALL KREPEAT
JNB 0CH,VIEW_GK
AJMP NEXTKEY
C_KEY3: ;LEFT
MOV A,B
XRL A,#4
JNZ C_KEY4
LCALL K_LEFT
LCALL KREPEAT
JNB 0CH,VIEW_GK
AJMP NEXTKEY
C_KEY4: ;ESC
MOV A,B
XRL A,#27
JNZ C_KEY5
AJMP XVIEW
;-----------
SHORTCUT:
AJMP VIEW_GK
;-----------
C_KEY5: ;TAB
MOV A,B
XRL A,#09
JNZ C_KEY19
LCALL T_MOVE
LCALL KREPEAT
JNB 0CH,C_KEY61
AJMP NEXTKEY
C_KEY51:
AJMP VIEW_GK
C_KEY19: ;SHIFT TAB #20
MOV A,B
XRL A,#20
JNZ C_KEY12
LCALL TS_MOVE
LCALL KREPEAT ;WAIT FOR KEY RELEASE
JNB 0CH,C_KEY191
AJMP NEXTKEY
C_KEY191:
AJMP VIEW_GK
C_KEY12: ;END CHANGE HZ START POINT
MOV A,B
XRL A,#05
JNZ C_KEY21
JNB 34H,XC_KEY12 ;NOT IN FLASH MODE
MOV A,46H ;BOUND CHECK
XRL A,#160
JNZ C_KEY122
MOV 46H,#0
MOV 14H,#0
AJMP XC_KEY12
C_KEY122:
MOV A,46H
ADD A,#80
MOV 46H,A
MOV 14H,A
XC_KEY12:
LCALL KREPEAT
AJMP NEXTKEY
C_KEY21: ;SHIFT END
MOV A,B
XRL A,#18
JNZ C_KEY6
JNB 34H,XC_KEY21 ;NOT IN FLASH MODE
INC 48H ;INC BANK
MOV A,48H
XRL A,#MAXBANK
JNZ C_KEY211
MOV 48H,#0 ;SET TO BANK 0
C_KEY211:
LCALL ROMBANK
LCALL ROMAREA
XC_KEY21:
LCALL KREPEAT
AJMP NEXTKEY
C_KEY6: ;BACK
JB 0DH,SHORTCUT ;CAN'T EDIT, (ONLY ARRROW AND ESC KEY ALLOW AND END KEY)
MOV A,B
XRL A,#8
JNZ C_KEY7
LCALL B_KEY
LCALL KREPEAT ;WAIT FOR KEY RELEASE
JNB 0CH,C_KEY61
AJMP NEXTKEY
C_KEY61:
AJMP VIEW_GK
C_KEY7: ;DEL
MOV A,B
XRL A,#06
JNZ C_KEY8
MOV A,14H ;---SCREEN MUST NOT EXIT MAXCOL
ADD A,1DH ;
CJNE A,#MAXCOL,C_KEY7_1
AJMP XC_KEY7
C_KEY7_1:
MOV A,B
JNB 7AH,XC_KEY7
LCALL CUR_AD
LCALL SET_CUR
LCALL B_MOVE
LCALL SET_CUR
XC_KEY7:
LCALL KREPEAT
AJMP VIEW_GK
C_KEY8: ;ENTER
MOV A,B
XRL A,#13
JNZ C_KEY9
JNB 7AH,XC_KEY8
LCALL E_MOVE
LCALL KREPEAT
AJMP NEXTKEY
XC_KEY8: ;DO NOTHING
LCALL KREPEAT
AJMP VIEW_GK
C_KEY9: ;CAP
MOV A,B
MOV A,B
XRL A,#7
JNZ C_KEY10
JNB 79H,C_KEY9_1
CLR 79H
AJMP XC_KEY9
C_KEY9_1:
SETB 79H
XC_KEY9:
LCALL KREPEAT
AJMP VIEW_GK
C_KEY10: ;INS
MOV A,B
XRL A,#10
JNZ C_KEY11
JNB 7AH,C_KEY101
CLR 7AH
AJMP XC_KEY10
C_KEY101:
SETB 7AH
XC_KEY10:
LCALL KREPEAT
AJMP VIEW_GK
C_KEY11: ;2ND
MOV A,B
XRL A,#11
JNZ C_KEY13
JNB 7BH,C_KEY111
CLR 7BH
AJMP XC_KEY11
C_KEY111:
SETB 7BH
XC_KEY11:
LCALL KREPEAT
AJMP VIEW_GK
C_KEY13: ;SHIFT DOWN #14
MOV A,B
XRL A,#14
JNZ C_KEY14
LCALL K_LOWER
XC_KEY13:
LCALL KREPEAT ;WAIT FOR KEY RELEASE
AJMP NEXTKEY
C_KEY14: ;SHIFT UP #15
MOV A,B
XRL A,#15
JNZ C_KEY15
LCALL K_UPPER
XC_KEY14:
LCALL KREPEAT ;WAIT FOR KEY RELEASE
AJMP NEXTKEY
C_KEY15: ;SHIFT RIGHT #16
MOV A,B
XRL A,#16
JNZ C_KEY16
LCALL K_RIGER
XC_KEY15:
LCALL KREPEAT ;WAIT FOR KEY RELEASE
AJMP NEXTKEY
C_KEY16: ;SHIFT LEFT #17
MOV A,B
XRL A,#17
JNZ C_KEY17
LCALL K_LEFER
XC_KEY16:
LCALL KREPEAT ;WAIT FOR KEY RELEASE
AJMP NEXTKEY
C_KEY17: ;SHIFT DEL
MOV A,B
XRL A,#19
JNZ C_KEY18
LCALL CUR_AD
LCALL DELTAIL
XC_KEY17:
LCALL KREPEAT ;WAIT FOR KEY RELEASE
AJMP NEXTKEY
C_KEY18: ;SHIFT BACK
MOV A,B
XRL A,#21
JNZ C_KEY20
LCALL DELHEAD
XC_KEY18:
LCALL KREPEAT ;WAIT FOR KEY RELEASE
AJMP NEXTKEY
C_KEY20: ;A-Z
LCALL AZ_KEY
LCALL KREPEAT ;WAIT FOR KEY RELEASE
JNB 0CH,MOREKEY ;ADDRESS PROBLEM, NEED TWO JUMP
NEXTKEY:
LJMP VIEW0
MOREKEY:
LJMP VIEW_GK
XVIEW:
RET
;NOW 2410
ORG 24E0H
;ORG 2500H
ASC2TIM:
ST_D00: ;A=13
MOV B,A ;STORE A FOR FURTHER USE
XRL A,#13 ;XOR
JNZ ST_DO1
MOV A,#2AH
LCALL DIALONE
MOV A,#2AH
LCALL DIALONE
JNB 1CH,NOTPAGEY ;NOT SENT PAGE
RET
;
NOTPAGEY:
LCALL LCLEAR2 ;MOV TO SECOND LINE AND WAIT FOR RECEIVE
SETB 16H ;NO MORE GETKEY
LCALL STORAGE
LCALL CLEARIRQ
RET
ST_DO1: ;IF=8 ERASE LETTER
MOV A,B
XRL A,#8
JNZ ST_DO2
MOV A,R0
XRL A,#KEYAREA
JZ XST_DO1 ; NO MORE
LCALL REC_BFB
LCALL LCLEAR1
LCALL REC_SHOW
XST_DO1:
MOV A,#23H
LCALL DIALONE
MOV A,#23H
LCALL DIALONE
RET
ST_DO2: ;#27 ESC
MOV A,B
XRL A,#27
JNZ ST_DO3
SETB 11H
RET
ST_DO3: ;#32 SPACE
MOV A,B
XRL A,#32
JNZ ST_DO4
MOV A,B
LCALL LCDST
LCALL REC_BFA
MOV A,#23H
LCALL DIALONE
MOV A,#39H
LCALL DIALONE
RET
ST_DO4: ;"#"
MOV A,B
XRL A,#23H
JNZ ST_DO5
MOV A,B
LCALL LCDST
LCALL REC_BFA
LCALL DIALONE
RET
ST_DO5: ;"*"
MOV A,B
XRL A,#2AH
JNZ ST_DO6
MOV A,B
LCALL LCDST
LCALL REC_BFA
LCALL DIALONE
RET
ST_DO6: ;ARROW 01-04
MOV R7,#4
ST_DLOOP:
MOV A,B
XRL A,R7
JZ XST_DO6
DJNZ R7,ST_DLOOP
AJMP ST_DO7
XST_DO6:
RET
ST_DO7: ;06=DEL SPK ON OFF
MOV A,B
XRL A,#06
JNZ ST_DO8
LCALL SPKONOFF
RET
ST_DO8: ;05 OVER SENT "NNNN"
MOV A,B
XRL A,#05
JNZ ST_NUM
;SENT "NNNN"
MOV R7,#4
ST_DO8_1:
MOV A,#4EH
LCALL LCDST
MOV A,#30H
LCALL DIALONE
MOV A,#35H
LCALL DIALONE
DJNZ R7,ST_DO8_1
SETB 11H
RET
ST_NUM:
MOV R7,#10
MOV R6,#39H
ST_NUM1:
MOV A,B
XRL A,R6
JZ ST_NUM2
DEC R6
DJNZ R7,ST_NUM1
AJMP ST_AZ
ST_NUM2: ;PROCESS
MOV A,B
XRL A,#30H
JNZ ST_NUM3
MOV A,#30H ;SENT "00"
LCALL REC_BFA
LCALL LCDST
LCALL DIALONE
MOV A,#30H
LCALL DIALONE
RET
ST_NUM3: ;1-9
MOV A,B
LCALL LCDST
LCALL REC_BFA
LCALL DIALONE
RET
ST_SYMA:
PUSH DPH
PUSH DPL
MOV A,B
LCALL LCDST
LCALL REC_BFA
CLR C
SUBB A,#21H ;START FROM A
MOV DPTR,#SYMA1
MOV 1AH,DPH
MOV 1BH,DPL
MOV DPTR,#SYMA2
MOV 1EH,DPH
MOV 1FH,DPL
LCALL ST_A2Z_S
POP DPL
POP DPH
RET
ST_A2Z:
PUSH DPH
PUSH DPL
MOV A,B
LCALL LCDST
LCALL REC_BFA
CLR C
SUBB A,#41H ;START FROM A
MOV DPTR,#TIMTA
MOV 1AH,DPH
MOV 1BH,DPL
MOV DPTR,#TIMTB
MOV 1EH,DPH
MOV 1FH,DPL
LCALL ST_A2Z_S
POP DPL
POP DPH
RET
ST_AZ:
MOV A,B
MOV R7,#2FH
ST_AZ1:
MOV A,B ;RESTORE A FROM B
XRL A,R7
JZ ST_SYMA
DEC R7
CJNE R7,#20H,ST_AZ1
MOV R7,#40H
ST_AZ2:
MOV A,B ;RESTORE A FROM B
XRL A,R7
JZ ST_SYMB
DEC R7
CJNE R7,#39H,ST_AZ2
MOV R7,#60H
ST_AZ3:
MOV A,B ;RESTORE A FROM B
XRL A,R7
JZ ST_SYMC
DEC R7
CJNE R7,#5AH,ST_AZ3
MOV R7,#7FH
ST_AZ4:
MOV A,B ;RESTORE A FROM B
XRL A,R7
JZ ST_SYMD
DEC R7
CJNE R7,#7AH,ST_AZ4
MOV R7,#5AH
ST_AZ5:
MOV A,B ;RESTORE A FROM B
XRL A,R7
JZ ST_A2Z
DEC R7
CJNE R7,#40H,ST_AZ5
RET
ST_SYMB:
PUSH DPH
PUSH DPL
MOV A,B
LCALL LCDST
LCALL REC_BFA
CLR C
SUBB A,#3AH ;START FROM A
MOV DPTR,#SYMB1
MOV 1AH,DPH
MOV 1BH,DPL
MOV DPTR,#SYMB2
MOV 1EH,DPH
MOV 1FH,DPL
LCALL ST_A2Z_S
POP DPL
POP DPH
RET
ST_SYMC:
PUSH DPH
PUSH DPL
MOV A,B
LCALL LCDST
LCALL REC_BFA
CLR C
SUBB A,#5BH ;START FROM A
MOV DPTR,#SYMC1
MOV 1AH,DPH
MOV 1BH,DPL
MOV DPTR,#SYMC2
MOV 1EH,DPH
MOV 1FH,DPL
LCALL ST_A2Z_S
POP DPL
POP DPH
RET
ST_SYMD:
PUSH DPH
PUSH DPL
MOV A,B
LCALL LCDST
LCALL REC_BFA
CLR C
SUBB A,#7BH ;START FROM A
MOV DPTR,#SYMD1
MOV 1AH,DPH
MOV 1BH,DPL
MOV DPTR,#SYMD2
MOV 1EH,DPH
MOV 1FH,DPL
LCALL ST_A2Z_S
POP DPL
POP DPH
RET
ST_A2Z_S:
PUSH ACC
MOV DPH,1AH
MOV DPL,1BH
MOVC A,@A+DPTR
LCALL DIALONE
POP ACC
MOV DPH,1EH
MOV DPL,1FH
MOVC A,@A+DPTR
LCALL DIALONE
RET
;ORG 2700H
ASC2API:
;-API USE FOR SEND PAGE ONLY----------
MOV B,A ;STORE A FOR FURTHER USE
;
API_DO3: ;#32 SPACE
MOV A,B
XRL A,#32
JNZ API_NUM
MOV A,B
LCALL LCDST
LCALL REC_BFA
MOV A,#2AH ;*
LCALL DIALONE
MOV A,#31H ;1
LCALL DIALONE
RET
;
API_NUM:
MOV R7,#10
MOV R6,#39H
API_NUM1:
MOV A,B
XRL A,R6
JZ API_NUM2
DEC R6
DJNZ R7,API_NUM1
AJMP API_A2Z
;
API_NUM2: ;PROCESS
MOV A,B
XRL A,#30H
JNZ API_NUM3
MOV A,#30H ;SENT "00"
LCALL REC_BFA
LCALL LCDST
LCALL DIALONE
MOV A,#30H
LCALL DIALONE
RET
;
API_NUM3: ;1-9
MOV A,B
LCALL LCDST
LCALL REC_BFA
LCALL DIALONE
RET
;
API_A2Z:
PUSH DPH
PUSH DPL
MOV A,B
;RANGE CHECK A-Z
CLR C
SUBB A,#41H ;OK START
JC API_OUT ;TOO SMALL
MOV A,#5AH ;OK END
CLR C
SUBB A,B
JC API_OUT ;TOO BIG
AJMP API_DO
;
API_OUT:
MOV A,#3FH ;???? SENT SPACE
LCALL LCDST
LCALL REC_BFA
MOV A,#2AH ;*
LCALL DIALONE
MOV A,#31H ;1
LCALL DIALONE
AJMP XAPI_A2Z
;
API_DO:
MOV A,B
LCALL LCDST
LCALL REC_BFA
CLR C
SUBB A,#41H ;START FROM A
MOV DPTR,#APITA
MOV 1AH,DPH
MOV 1BH,DPL
MOV DPTR,#APITB
MOV 1EH,DPH
MOV 1FH,DPL
LCALL API_SUB
XAPI_A2Z:
POP DPL
POP DPH
RET
;
API_SUB:
PUSH ACC
MOV DPH,1AH
MOV DPL,1BH
MOVC A,@A+DPTR
LCALL DIALONE
POP ACC
MOV DPH,1EH
MOV DPL,1FH
MOVC A,@A+DPTR
LCALL DIALONE
RET
;-CONVERT 0-9,#* TO DIALER VALUE------------
TB_DIAL: ;R_FREE
PUSH 07H ;R7
PUSH 06H ;R6
MOV B,A ;SAVE A
MOV R7,#39H
MOV R6,#9
TB_LOOP:
MOV A,B
XRL A,R7 ;0
JZ XT_DIAL
DEC R7
DJNZ R6,TB_LOOP
MOV A,B
XRL A,#30H
JNZ TB_DIAL1
MOV A,#10
AJMP XT_DIAL1
TB_DIAL1:;PROCESS *
MOV A,B
XRL A,#2AH ;*
JNZ TB_DIAL2
MOV A,#11
AJMP XT_DIAL1
TB_DIAL2:;PROCESS #
MOV A,B
XRL A,#23H ;#
JNZ TB_DIAL3
MOV A,#12
AJMP XT_DIAL1
TB_DIAL3:;PROCESS D
MOV A,B
XRL A,#44H ;"D"
JNZ TB_DIAL4
MOV A,#0
AJMP XT_DIAL1
TB_DIAL4: ;PROCESS ABC
MOV R7,#43H
TB_D4L:
MOV A,B
XRL A,R7
JZ TB_DIALA
DEC R7
CJNE R7,#40H,TB_D4L
AJMP TB_DIAL5 ;NOT ABC
TB_DIALA:
MOV A,R7 ;R7=#41H,#42H,#43H
CLR C
SUBB A,#40H ; 1,2,3
ADD A,#12 ; 13,14,15
AJMP XT_DIAL1
TB_DIAL5:
MOV A,#16 ;FALSE
AJMP XT_DIAL1
XT_DIAL:
;R7-1 CONTAIN 0-9
MOV A,R7
CLR C
SUBB A,#30H ;1-9
XT_DIAL1:
POP 06H ;R6
POP 07H ;R7
RET
ORG 2800H
;--DIAL OUT PROGRAM FOR THE UNDER COMMAND:
;"DIAL": DIAL AND TALK WITH OTHER MACHINE
;"SENT": DIAL AND SENT AN A4 MESSAGE TO OTHE MACHINE
;"PAGER": DIAL AND SENT PRE-TYPE MESSAGE TO MEMO PAGER
; R1+1 CONTAIN PARAMETER START POINT
; R0 CONTAIN LEN OF BUFFER START FROM 30H
;
DIAL:
SETB 70H SPK
LCALL ONLINE
LCALL LONG_DL
;
DIALER:
MOV A,@R1
XRL A,#13
JZ XDIALER ;NO NUMBER
;
INC R1 ;POINT TO PARAMETER
;
MOV 32H,#25
MOV 33H,#25
;
REALDIAL:
MOV A,@R1
XRL A,#13
JZ DIALER1
MOV A,@R1
LCALL DIALONE
INC R1
AJMP REALDIAL
;
DIALER1:
LCALL CLEARIRQ
LCALL REC_CLR
LCALL LCLEAR1
CLR 19H ; TIME NOT OUT
MOV 31H,#MAXTIME
CLR 16H ; NOT OVER
CLR 1BH ;
JNB 1CH, TELTALK
JB 27H,MPAGER
;
LCALL SENTA4
RET
;
MPAGER:
LCALL PAGING
RET
;
XDIALER:
LCALL LCLEAR2
MOV DPTR,#MSG67
LCALL LCDMSG
LCALL OFFLINE
RET
;-------------------------
TELTALK: ;JUST DIAL AND TALK TO OTHER PARTY
MOV DPTR,#MSG59
LCALL LCDMSG
LCALL LCLEAR2
CLR 1AH
TELTALK1:
LCALL NUM_REC
;CJNE A,#44H,TPHONE ; NOT "D" KEY (MACHINE)FOR FIRST, SO JUMP TO TELEPHONE
CJNE A,#30H,TPHONE ; NOT "0" KEY FOR TEST
SETB 1AH ;MARK AS "TWO WAY TALKING"
LCALL LCLEAR2
MOV DPTR,#MSG40 ;ON LINE TALKING
LCALL LCDMSG
LCALL LCLEAR1
LCALL REC_CLR
MOV A,#0
JB 1AH,TELTALK3
;
TELTALK3: ;MACHINE TALKING
;CLR 1AH
MOV 12H,#200
LCALL DL_200M
MOV A,#43H ;"C" ;REPLY TO CALLER TO INDICATE THAT I AM A MACHINE
LCALL DIALONE
MOV 12H,#200
LCALL DL_200M
JB 20H,TELTALK4 ; MONITOR ON
LCALL OFFSPK
TELTALK4:
MOV 34H,#1 ;STORAGE IN AREA 1
SETB 79H ;SURE CAP
LCALL TALKING
CLR 79H ;NOT CAP
CLR 1AH
RET
;
TPHONE: ;IS A TELEPHONE
JB 19H,XTPHONE
LCALL GETKEY
XRL A,#27 ;ONLY ESC CAN CAUSE EXIT IN LOCK TALK
JZ XTPHONE
;LCALL COUNTER
LJMP TELTALK1
;
XTPHONE:
LCALL OFFLINE
RET
;----------------------------------------
TALKING:
JB 19H,XTALKING
JNB 16H,TALKING2
LCALL RECEIVE ;RECEIVE TONE AND SAID
;
XRL A,#13
JNZ TALKING1
LCALL RIGHTCTL
AJMP TALKING
;
TALKING1:
LCALL GETKEY
MOV B,A
XRL A,#27 ;ONLY ESC CAN CAUSE EXIT IN LOCK TALK
JZ XTALKING
MOV A,B
XRL A,#05 ;OVER CAN TAKE BACK CONTROL RIGHT
JNZ TALKING
LCALL LCLEAR1
LCALL REC_CLR
CLR 16H
AJMP TALKING
;
TALKING2:
LCALL KRELEASE
LCALL CHECKLEN
;
TALKING3:
LCALL GETKEY
JB 19H,XTALKING
;
JNB 28H,TALKING3
CLR 11H
LCALL ASC2TIM
JB 11H,XTALKING
LJMP TALKING
;
XTALKING:
MOV A,#1
LCALL SAID
LCALL OFFLINE
RET
;----------------------------
SENTA4: ;SENT PRE-TYPE TO TARGET SET
CLR 1BH
MOV DPTR,#MSG41
LCALL LCDMSG
;
SENTA4_1:
LCALL NUM_REC
CJNE A,#44H,SENTA4_2 ; NOT "D" KEY FOR FIRST
SETB 1BH ;MARK AS "RECEIVE A PAGE"
LCALL LCLEAR1
MOV DPTR,#MSG35
LCALL LCDMSG
LCALL LCLEAR2
MOV A,#0
JB 1BH,SENTA4_3
;
SENTA4_2:
JB 19H,XSENTA4
LCALL GETKEY
XRL A,#27 ;ONLY ESC CAN EXIT, IF NO REPLY
JZ XSENTA4
AJMP SENTA4_1
;
SENTA4_3:
MOV 12H,#200
LCALL DL_200M
CLR 1BH ;
MOV A,#44H ;"D"
LCALL DIALONE
MOV 32H,#10
MOV 33H,#10
LCALL SENDER
;
XSENTA4:
LCALL OFFLINE
RET
;-SUB-FOR SENT PAGER AND SENTA4-----
SENDER: ; SUB FOR SENT A PAGE
LCALL LONG_DL
JB 20H,SENDER0 ; MONITOR ON
;
SENDER0:
MOV DPTR,#RAM
LCALL LCLEAR2
;
SENDER1:
LCALL REC_CLR
MOV 14H,#0
;
LCALL RTRIM ; A CONTAIN LAST LETTER
MOV 1CH,A
MOV DPL,#0
SENDER2:
MOVX A,@DPTR
JB 27H, SENDERA
LCALL ASC2TIM
AJMP SENDERB
SENDERA:
LCALL ASC2API
SENDERB:
INC DPL
DJNZ 1CH,SENDER2
;
JB 27H,SENDERC
MOV A,#13
LCALL ASC2TIM
AJMP SENDERD
SENDERC:
MOV A,#32
LCALL ASC2API
SENDERD:
LCALL LCLEAR1
LCALL REC_SHOW
LCALL LCLEAR2
MOV 12H,#40
LCALL DL_200M
INC DPH
DJNZ 09H, SENDER1
;
MOV DPTR,#MSG17
LCALL LCDMSG
MOV 12H,#250
LCALL DL_200M
RET
;--------------------------
PAGING:
CLR 1BH
MOV 32H,#25 ;TELECOM
MOV 33H,#25
LCALL LCLEAR2
LCALL LCLEAR1
MOV DPTR, #MSG42
LCALL LCDMSG
LCALL WAITKEY
JB 09H,XPAGING ;ESC
JB 19H,XPAGING ;TIMEOUT
CLR 1BH ;
MOV A,#23H ;"#"
LCALL DIALONE
LCALL SENDER
MOV A,#2AH
LCALL DIALONE
MOV A,#2AH
LCALL DIALONE
MOV 12H,#200
LCALL DL_200M
LCALL LCLEAR2
MOV DPTR,#MSG16
LCALL LCDMSG
LCALL WAITKEY
XPAGING:
LCALL OFFLINE
RET
ORG 2A00H
DO_TIM:
MOV B,A ;STORE AS B
;
JB 13H,BASE_* ; "*"
JB 14H,BASE_0 ; "0"
JB 15H,BASE_# ; "#"
JB 21H,BASE_A ; "A"
JB 22H,BASE_B ; "B"
JB 23H,BASE_C ; "C"
JB 24H,BASE_D ; "D"
;
MOV A,B
XRL A,#2AH ;*
JNZ DO_TIM1
SETB 13H
MOV A,#0
RET
DO_TIM1:
MOV A,B
XRL A,#30H ;0
JNZ DO_TIM2
SETB 14H
MOV A,#0
RET
DO_TIM2:
MOV A,B
XRL A,#23H ;#
JNZ DO_TIM3
SETB 15H
MOV A,#0
RET
DO_TIM3:
MOV A,B
XRL A,#41H ;A
JNZ DO_TIM4
SETB 21H
MOV A,#0
RET
;
DO_TIM4:
MOV A,B
XRL A,#42H ;B
JNZ DO_TIM5
SETB 22H
MOV A,#0
RET
;
DO_TIM5:
MOV A,B
XRL A,#43H ;C
JNZ DO_TIM6
SETB 23H
MOV A,#0
RET
;
DO_TIM6:
MOV A,B
XRL A,#44H ;D
JNZ DO_TIM7
SETB 24H
MOV A,#0
RET
;
DO_TIM7: ;NOW 1-9 NO PROCESS NEED
MOV A,B
RET
;
BASE_*:
LCALL BASE*
RET
BASE_0:
LCALL BASE0
RET
BASE_#:
LCALL BASE#
RET
BASE_A:
LCALL BASEA
RET
BASE_B:
LCALL BASEB
RET
BASE_C:
LCALL BASEC
RET
BASE_D:
LCALL BASED
RET
;
;------------------
BASE*:
MOV A,B
XRL A,#2AH ;*
JNZ BASE*1
CLR 13H
MOV A,#13 ;ENTER
RET
BASE*1:
MOV A,B
XRL A,#30H ;0
JNZ BASE*2
CLR 13H
SETB 14H
MOV A,#0 ;NO LETTER
RET
BASE*2:
MOV A,B
XRL A,#23H ;#
JNZ BASE*3
CLR 13H
SETB 15H
MOV A,#0 ;NO LETTER
RET
BASE*3: ;NOW 1-9
MOV A,B
CLR C
SUBB A,#31H
MOV DPTR,#TIM*
MOVC A,@A+DPTR
CLR 13H
RET
;
;-----------------------
BASE0:
MOV A,B
XRL A,#2AH ;*
JNZ BASE01
CLR 14H
SETB 13H
MOV A,#0
RET
BASE01:
MOV A,B
XRL A,#30H ;0
JNZ BASE02
CLR 14H
MOV A,#30H ;"0"
RET
BASE02:
MOV A,B
XRL A,#23H ;#
JNZ BASE03
CLR 14H
SETB 15H
MOV A,#0 ;NO LETTER
RET
BASE03: ;NOW 1-9
MOV A,B
CLR C
SUBB A,#31H
MOV DPTR,#TIM0
MOVC A,@A+DPTR
CLR 14H
RET
;
;------------------------
BASE#:
MOV A,B
XRL A,#2AH ;*
JNZ BASE#1
CLR 15H
SETB 13H
RET
BASE#1:
MOV A,B
XRL A,#30H ;0
JNZ BASE#2
CLR 15H
SETB 14H
MOV A,#0 ;NO LETTER
RET
BASE#2:
MOV A,B
XRL A,#23H ;#
JNZ BASE#3
CLR 15H
MOV A,#8 ;BACK SPACE
RET
;
;----------------------
BASE#3: ;NOW 1-9
MOV A,B
CLR C
SUBB A,#31H
MOV DPTR,#TIM#
MOVC A,@A+DPTR
CLR 15H
RET
;
;-----------------------
BASEA:
MOV A,B
CLR C
SUBB A,#31H
MOV DPTR,#TIMA
MOVC A,@A+DPTR
CLR 21H
RET
;
BASEB:
MOV A,B
CLR C
SUBB A,#31H
MOV DPTR,#TIMB
MOVC A,@A+DPTR
CLR 22H
RET
;
BASEC:
MOV A,B
CLR C
SUBB A,#31H
MOV DPTR,#TIMC
MOVC A,@A+DPTR
CLR 23H
RET
;
BASED:
MOV A,B
CLR C
SUBB A,#31H
MOV DPTR,#TIMD
MOVC A,@A+DPTR
CLR 24H
RET
;ORG 2C00H
RECEIVER:
CLR 13H
CLR 14H
CLR 15H
LCALL REC_CLR
MOV 31H,#MAXTIME
CLR 19H
LCALL CURSOR2
MOV 17H,#0 ;RESET RING COUNT
CLR 2EH
LCALL ONLINE
LCALL SHORT_DL
LCALL LCLEAR2
MOV A,#255
LCALL SAID
;
MOV 32H,#25
MOV 33H,#25
MOV A,#44H ;"D" ECHO
LCALL DIALONE
LCALL CLEARIRQ
LCALL LCLEAR1
MOV DPTR,#MSG39
LCALL LCDMSG
;
REALH0: ;WAIT FOR FIRST KEY TO PRESS
LCALL NUM_REC
;
CJNE A,#44H,REALH1 ; NOT "D" KEY FOR FIRST
LCALL REC_PAGE ;PAGE MODE
MOV 34H,#2 ;STORE IN AREA 2: EMAIL
AJMP REALH5
;
REALH1: ;TIM+ ; FOR RECEIVE DESK TOP MACHINE
MOV 34H,#1 ;STORE IN AREA 1: SHORT MESSAGE
CJNE A,#43H,REALH2 ; NOT "C" KEY FOR FIRST, SO IS A TELEPHONE
LCALL REC_TIMP
AJMP REALH5
;
REALH2: ;TIM FOR RECEIVE TELPHONE SET
JZ REALLOOP
MOV B,A ;SAVE A
LCALL REC_TIM
AJMP REALH5
;
REALLOOP:
JB 19H,XXONHOOK
LCALL GETKEY
XRL A,#27 ;ONLY ESC CAN CAUSE IN LOCK TALK
JZ XXONHOOK
AJMP REALH0
;
REALH5:
SETB 16H ;SO THAT RECEIVE CANNOT TYPE
CLR 19H
MOV 31H,#MAXTIME
CLR 1BH
LCALL TALKING
;
LCALL STORAGE
MOV 34H,#0
RET
;
XXONHOOK:
LCALL OFFLINE
RET
;=====================================
SCLOCK:
;THIS SUB SHOW CLOCK, RING, DETECT TONE
LCALL DIALLOCK
MOV A,TL1
JZ SCLOCK1 ;NO DETECT, GO SHOW CLOCK
C_RING:
MOV TL1,#0
LCALL INITT0
MOV 31H,#15
LCALL REC_CLR
ORL P1,#10000000B MAKE P1 AS INPUT
C_RING1:
;-------------CHECK HZ, IF TOO LOW NOT RING
JB 19H,N_RING
;
MOV A,P1
ANL A, #10000000B MASK EXCEPT BIT7 ;CHECK DIAL TONE
JNZ C_RING11
MOV TL1,#0
RET
;
C_RING11:
CLR C
MOV A,TL1
SUBB A,#14
JC C_RING1 ;A SMALL THEN 14
;
MOV 18H,#RINGOUT ;RING TIMEOUT REST
LCALL LBEGIN1
MOV DPTR,#MSG52
LCALL LCDMSG
;------------CHECK HZ, IF TOO HIGH NOT RING
MOV TL1,#0
LCALL INITT0
MOV 31H,#5
C_RING2:
JB 19H,C_RING3
AJMP C_RING2
C_RING3:
MOV A,TL1
JZ N_RING
CLR C
SUBB A,#25
JNC N_RING
LCALL LBEGIN1
MOV DPTR,#MSG51
LCALL LCDMSG
INC 17H
LCALL SHOWRING ;SHOWRING
AJMP C_RING ;COUNT NOT RING
N_RING:
LCALL LCLEAR2
MOV DPTR,#MSG50
LCALL LCDMSG
MOV TL1,#0
MOV 17H,#0
CLR 2EH ;CID RE-ENABLE
SETB 2CH ;FORCE TO SHOW TITLE
SETB 38H ;FORCE TO JUMP TO STANDBY START
RET
SCLOCK1:
MOV R1,#CLOCK+12 ;SHOW ONLY EVERY SECOND
MOV A,@R1
INC R1
XRL A,@R1 ;0DDH
JZ XSCLOCK
MOV A,35H ;IF DIAL_BF > 0 NOT SHOW CLOCK
JNZ XSCLOCK
LCALL SH_CLOCK
XSCLOCK:
RET
ORG 2D00H
COMIN:
LCALL COMSTART
LCALL LCLEAR1
MOV DPTR,#MSG46
LCALL LCDMSG
MOV 34H,#0 ;PUT TO AREA1
LCALL LOADPOST
MOV 30H,#0 ;SET TO LINE #1
LCALL SAVEPOST
LCALL REC_CLR
MOV 39H,#1 ; CHECKSUM
CLR 19H
MOV 31H,#MAXTIME
CLR RI
LCALL LCLEAR2
MOV DPTR,#MSG62
LCALL LCDMSG
COMIN0: ;WAIT FOR FIRST BYTE TO COME
LCALL GETKEY
JB 28H,XCOMIN2 ;KEY HAD BEEN PRESS
JB 19H,XCOMIN2
JNB RI,COMIN0
MOV A,SBUF ;接受資料
LCALL LCLEAR2
COMIN1:
MOV 31H,#10 ;1 SECOND
CLR RI ;清除接收中斷旗標
COMIN2:
JB 19H,XCOMIN
JNB RI,COMIN2
MOV A,SBUF ;接受資料
MOV B,A
XRL A,#13 ;IF CHR$(13) THEN NEXT LINE
JZ COMIN3 ;SAVE BUFFER TO MEM
XRL 39H,A ;CHECKSUM
MOV A,R0
CLR C
SUBB A,#MAXWIDTH
JNC COMIN4
MOV A,B
LCALL LCDST
COMIN4:
MOV A,R0
CLR C
SUBB A,#MAXCOL
JNC COMIN5
MOV A,B
LCALL REC_BFA
COMIN5:
AJMP COMIN1
COMIN3:
LCALL LCLEAR1
LCALL REC_SHOW
LCALL LCLEAR2
MOV 34H,#0
LCALL STORAGE
AJMP COMIN1
XCOMIN:
LCALL LCLEAR2
MOV DPTR,#MSG60
LCALL LCDMSG
LCALL REC_CLR
MOV 31H,#5
CLR 19H
COMIN6:
JB 19H,XCOMIN1
JNB RI,COMIN6
MOV A,SBUF ;接受資料
LCALL LCDST
XCOMIN1:
XRL A,39H
JZ XCOMIN2
MOV DPTR,#MSG61 ;COM ERROR
LCALL LCDMSG
LCALL BEEP
LCALL WAITKEY
XCOMIN2:
MOV TMOD,#01010001B ;設定計數器0為模式1(16位計數器)
;設定計數器1為模式1(16位計數器)
;由T1腳計算脈沖(C/T=1)
SETB TR1 ;起動計數器1
RET
COMSTART:
LCALL INITT0
; 設為1200BPS
MOV TMOD,#00100001B ;設定計數器0為模式1(16位計數器)
;設定計數器1為模式
;MOV TH1,#230 ;設定計數器 12MH
;MOV TL1,#230 ;
MOV TH1,#243 ;設定計數器 6MH
MOV TL1,#243 ;
SETB TR1 ;起動計數器1
MOV SCON,#01110000B ;設定串列口為模式1
RET
COMOUT:
LCALL COMSTART
LCALL LCLEAR1
MOV DPTR,#MSG46
LCALL LCDMSG
MOV 14H,#0 ;SENT ON PAGE 0 ONLY
LCALL COUNT_C
LCALL LCLEAR2
MOV DPTR,#MSG11
LCALL LCDMSG
LCALL BTRIM
JZ XCOMOUT ;NO WORD IN PAGE
MOV 09H,A ;LAST LINE# ALL BLANK
LCALL WAITKEY
JB 09H,XCOMOUT
JB 19H,XCOMOUT
COMOUT1: ;發送一個回車鍵
CLR TI ;清除發射中斷旗標
MOV A,#13 ;
MOV SBUF,A ;發射資料
C_WAIT:
JNB TI,C_WAIT
MOV DPTR,#RAM
LCALL LCLEAR2
MOV 39H,#1
;
LCALL COMOUT0
;
MOV DPTR,#MSG63
LCALL LCDMSG
LCALL BEEP
LCALL WAITKEY
XCOMOUT:
MOV TMOD,#01010001B ;設定計數器0為模式1(16位計數器)
;設定計數器1為模式1(16位計數器)
;由T1腳計算脈沖(C/T=1)
SETB TR1 ;起動計數器1
RET
COMOUT0:
LCALL REC_CLR
LCALL RTRIM ; A CONTAIN LAST LETTER
MOV 1CH,A
MOV DPL,#0
COMOUT2:
MOVX A,@DPTR
MOV B,A
XRL A,#13
JZ COMOUT4
MOV A,B
LCALL REC_BFA
CLR TI ;清除發射中斷旗標
MOV SBUF,A ;發射資料
C_WAIT1:
JNB TI,C_WAIT1
XRL 39H,A ;CHECKSUM
MOV B,A
MOV A,4CH
XRL A,#MAXWIDTH
JZ COMOUT3
MOV A,B
LCALL LCDST
COMOUT3:
INC DPL
DJNZ 1CH,COMOUT2
COMOUT4:
MOV A,#13
CLR TI ;清除發射中斷旗標
MOV SBUF,A ;發射資料
C_WAIT2:
JNB TI,C_WAIT2
LCALL LCLEAR1
LCALL REC_SHOW
LCALL LCLEAR2
MOV 12H,#40
LCALL DL_200M
INC DPH
DJNZ 09H, COMOUT0
LCALL LONG_DL
;SENT CHECKSUM
MOV A,39H
CLR TI ;清除發射中斷旗標
MOV SBUF,A ;發射資料
C_WAIT3:
JNB TI,C_WAIT3
RET
COMBIN:
MOV R6,#0
MOV R7,#15
LCALL GETMETER (USE R6,R7 AS RANGE BACK WITH B)
JB 12H,MORECOMBIN ;NO PARAMETER,NEED MORE CMD
JNB 1FH,COMBINX ;NOT OUT OF RANGE, NO NEED MORE CMD
MORECOMBIN:
LCALL LCLEAR2
MOV DPTR,#MSG65
LCALL LCDMSG
SETB 08H ;MORE CMD NEED
RET
COMBINX:
MOV 48H,B ;BANK
LCALL ROMBANK
LCALL ROMAREA
LCALL COMSTART
LCALL LCLEAR1
MOV DPTR,#MSG64
LCALL LCDMSG
LCALL ROM_CLR
MOV 39H,#1 ;
CLR 19H
MOV 31H,#MAXTIME
MOV 49H,#0 ;SECTOR INDEX
CLR RI
LCALL LCLEAR2
MOV DPTR,#MSG62
LCALL LCDMSG
COMBIN0: ;WAIT FOR FIRST BYTE TO COME
LCALL GETKEY
JB 28H,XCOMBIN2 ;KEY HAD BEEN PRESS
JB 19H,XCOMBIN2
JNB RI,COMBIN0
MOV A,SBUF ;接受資料
COMBIN00:
LCALL LCLEAR2
MOV A,#32
LCALL FILL_BF
COMBIN1:
MOV 31H,#10 ;1 SECOND
CLR RI ;清除接收中斷旗標
COMBIN2:
JB 19H,XCOMBIN0
JNB RI,COMBIN2
MOV A,SBUF ;接受資料
XRL 39H,A ;CHECKSUM
MOV B,A
MOV A,R0
CLR C
SUBB A,#MAXWIDTH
JNC COMBIN4
MOV A,B
LCALL LCDST
COMBIN4:
MOV A,B
LCALL ROM_BFA
MOV A,R0
JZ COMBIN3 ;R0=0 ROM_BF FULL
AJMP COMBIN1
COMBIN3:
LCALL ROM_STORE
AJMP COMBIN00
XCOMBIN0: ;ENTRY FOR TIMEOUT
MOV A,R0
JZ XCOMBIN ;NO DATA IN THE FLA_BF
LCALL ROM_STORE
XCOMBIN:
LCALL LCLEAR2
MOV DPTR,#MSG60
LCALL LCDMSG
LCALL ROM_CLR
MOV 31H,#5
CLR 19H
COMBIN6:
JB 19H,XCOMBIN1
JNB RI,COMBIN6
MOV A,SBUF ;接受資料
LCALL LCDST
XCOMBIN1:
XRL A,39H
JZ XCOMBIN2
MOV DPTR,#MSG61 ;COM ERROR
LCALL LCDMSG
LCALL BEEP
LCALL WAITKEY
XCOMBIN2:
MOV TMOD,#01010001B ;設定計數器0為模式1(16位計數器)
;設定計數器1為模式1(16位計數器)
;由T1腳計算脈沖(C/T=1)
SETB TR1 ;起動計數器1
RET
;NOW 2F26 ONLY
ORG 3000H
;-GENERAL TIMER SUB-----
SH_CLOCK:
LCALL KEY_CLR
LCALL SH_DATE
LCALL SH_TIME
MOV A,#22
LCALL LCDST
LCALL LCDST
LCALL SH_DAY
MOV R1,#CLOCK+12
MOV A,@R1
INC R1
MOV @R1,A
RET
C_INIT:
MOV TH1,#0
MOV TL1,#0
CLR 2FH
MOV 45H,#3CH
MOV TH2,45H
MOV TL2,#0B0H
RET
;---------------------------
HELP:
RET
;--------------------------
TESTRAM:
;WRITE RAM
LCALL LCLEAR2
MOV DPTR,#MSG47
LCALL LCDMSG
MOV DPTR,#RAM
TESTRAM0:
MOV R6,DPH ;SAVE DPH TO R6
CLR 0AH ;CLEAR ERROR FLAG
LCALL LCLEAR1
MOV DPTR,#MSG14
LCALL LCDMSG
MOV A,R6 ;DPH
LCALL HEXSHOW
MOV DPH,R6
MOV DPL,#0
MOV R7,#0 ;256 BYTES
LCALL TESTRAM1
JNB 0AH,TESTRAM3
LCALL TEST_MS0
TESTRAM3:
MOV A,#0
MOV DPTR,#PIOA
MOVX @DPTR,A
LCALL READKEY
CJNE A,#0,XTEST
MOV DPH,R6 ;RESTORE DPH
INC DPH
MOV DPL,#0
CJNE R6,#9FH,TESTRAM0 ;2+3,4+5,6+7,8+9 32K
LCALL LCLEAR2
MOV DPTR,#MSG13
LCALL LCDMSG
LCALL WAITKEY
XTEST:
MOV DPTR,#OLDCMD
MOV A,#13
MOVX @DPTR,A
RET
;---------------
;---------------
TEST_MS0:
LCALL BEEP
LCALL LCLEAR2
MOV DPTR,#MSG12
LCALL LCDMSG
MOV A,4AH
LCALL HEXSHOW
LCALL LONG_DL
CLR 0AH
LCALL LCLEAR2
MOV DPTR,#MSG47
LCALL LCDMSG
RET
TESTRAM1:
MOVX A,@DPTR
CPL A
MOV B,A
MOVX @DPTR,A
MOVX A,@DPTR
XRL A,B
JZ TESTRAM2
SETB 0AH
MOV 4AH,DPL ;SAVE ERROR CODE
RET
TESTRAM2:
INC DPL
DJNZ R7,TESTRAM1
RET
;------------------------
;------------------------
COUNT_C: ;COUNT_CHARACTER
MOV 1EH,#0
MOV 1FH,#0
LCALL BTRIM
JZ XCOUNT_C
MOV DPTR,#RAM
MOV 09H,A
;
COUNT_C1:
LCALL RTRIM ; A CONTAIN LAST LETTER
CLR C
ADD A,1EH
MOV 1EH,A
JNC COUNT_C2
INC 1FH
COUNT_C2:
INC DPH
DJNZ 09H,COUNT_C1
;
XCOUNT_C:
LCALL LCLEAR1
MOV DPTR,#MSG45
LCALL LCDMSG
LCALL BCD_SHOW
RET
;------------------------
;------------------------
A_CLEAN: ;WRITE ALL " "
LCALL RCLOCK
;CLR 0FH
MOV DPTR,#RAM
MOV R7,#MAXCOL+1
MOV R6,#MAXLINE+1
MOV A,#32
;
A_CLEAN1:
MOVX @DPTR,A
INC DPTR
DJNZ R7,A_CLEAN1
INC DPH
MOV DPL,#0
MOV R7,#MAXCOL+1
DJNZ R6,A_CLEAN1
;
MOV DPTR,#MSG23 ;SOURCE
MOV 1EH,DPH
MOV 1FH,DPL
MOV DPTR,#RAM ;TARGET
LCALL MOVEMSG
;
A_CLEAN3: ;CHOP DATE
MOV DPTR,#RAM+6
MOV R0,#CLOCK
MOV R7,#6
;
A_CLEAN4: ;DATE
MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R7,A_CLEAN4
;
INC R0
INC DPTR
MOV R7,#6
;
A_CLEAN5: ;TIME
MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R7,A_CLEAN5
RET
;------------------------------
CP_TIME:
PUSH 01H
PUSH 07H
MOV R1,#CLOCK+7
MOV R7,#2
CP_TIME1:
MOV A,@R1
MOVX @DPTR,A
INC R1
INC DPTR
DJNZ R7,CP_TIME1
MOV A,#3AH
MOVX @DPTR,A
INC DPTR
MOV R7,#2
CP_TIME2:
MOV A,@R1
MOVX @DPTR,A
INC R1
INC DPTR
DJNZ R7,CP_TIME2
MOV A,#3AH
MOVX @DPTR,A
INC DPTR
MOV R7,#2
CP_TIME3:
MOV A,@R1
MOVX @DPTR,A
INC R1
INC DPTR
DJNZ R7,CP_TIME3
MOV A,#32
MOVX @DPTR,A
INC DPTR
POP 07H
POP 01H
RET
CP_DATE: ;CHOP DATE
PUSH 01H
PUSH 07H
MOV R1,#CLOCK
MOV R7,#2
CP_DATE1:
MOV A,@R1
MOVX @DPTR,A
INC R1
INC DPTR
DJNZ R7,CP_DATE1
MOV A,#3AH
MOVX @DPTR,A
INC DPTR
MOV R7,#2
CP_DATE2:
MOV A,@R1
MOVX @DPTR,A
INC R1
INC DPTR
DJNZ R7,CP_DATE2
MOV A,#3AH
MOVX @DPTR,A
INC DPTR
MOV R7,#2
CP_DATE3:
MOV A,@R1
MOVX @DPTR,A
INC R1
INC DPTR
DJNZ R7,CP_DATE3
MOV A,#32
MOVX @DPTR,A
INC DPTR
POP 07H
POP 01H
RET
SH_DATE:
PUSH 01H
PUSH 07H
MOV DPTR,#MSG5
LCALL LCDMSG
MOV R1,#CLOCK
MOV R7,#2
SH_DATE1:
MOV A,@R1
LCALL LCDST
LCALL KEY_BFA
INC R1
DJNZ R7,SH_DATE1
MOV A,#3AH
LCALL LCDST
LCALL KEY_BFA
MOV R7,#2
SH_DATE2:
MOV A,@R1
LCALL LCDST
LCALL KEY_BFA
INC R1
DJNZ R7,SH_DATE2
MOV A,#3AH
LCALL LCDST
LCALL KEY_BFA
MOV R7,#2
SH_DATE3:
MOV A,@R1
LCALL LCDST
LCALL KEY_BFA
INC R1
DJNZ R7,SH_DATE3
MOV A,#32
LCALL LCDST
POP 07H
POP 01H
RET
SH_TIME:
PUSH 01H
PUSH 07H
MOV DPTR,#MSG6
LCALL LCDMSG
MOV R1,#CLOCK+7
MOV R7,#2
SH_TIME1:
MOV A,@R1
LCALL LCDST
LCALL KEY_BFA
INC R1
DJNZ R7,SH_TIME1
MOV A,#3AH
LCALL LCDST
LCALL KEY_BFA
MOV R7,#2
SH_TIME2:
MOV A,@R1
LCALL LCDST
LCALL KEY_BFA
INC R1
DJNZ R7,SH_TIME2
MOV A,#3AH
LCALL LCDST
LCALL KEY_BFA
MOV R7,#2
SH_TIME3:
MOV A,@R1
LCALL LCDST
LCALL KEY_BFA
INC R1
DJNZ R7,SH_TIME3
MOV A,#32
LCALL LCDST
POP 07H
POP 01H
RET
SH_DAY:
PUSH DPH
PUSH DPL
PUSH 01H
MOV DPTR,#MSG7
MOV R1,#CLOCK+6
MOV A,@R1 ;DAYS VALUE
LCALL KEY_BFA
CLR C
SUBB A,#30H
MOV B,#11
MUL AB
MOV DPL,A
LCALL LCDMSG
POP 01H
POP DPL
POP DPH
RET
;--------------------------
SUB23:
DB "~23~"
WAITKEY:
;WAIT UNTIL TIMEOUT, THIS CAUSE SETB 19H
;ANYKEY PRESS ALSO EXIT BUT NO SETB 09H
LCALL KRELEASE
MOV 12H,#200
LCALL DL_200M
CLR 09H
CLR 19H
MOV 31H,#MAXTIME
;
WAITKEY1:
LCALL GETKEY
JB 19H,XWAITKEY
JB 28H,WAITKEY2 ;KEY HAD PRESS
AJMP WAITKEY1
;
WAITKEY2:
XRL A,#27
JNZ WAITKEY3
SETB 09H
WAITKEY3:
XRL A,#27 ;RESTORE A
XWAITKEY:
RET
LCDMEM: ;LOAD DPTR WITH #DATA AND CALL THIS ; FOR READ XMEMORY TO LCD
PUSH 07H
MOV R7,#40
LCDMEM1:
MOVX A,@DPTR
LCALL LCDST
INC DPL
DJNZ R7,LCDMEM1
POP 07H
RET
DELTAIL: ;FREE
PUSH DPH
PUSH DPL
PUSH 07H
PUSH ACC
MOV A,#MAXCOL
SUBB A,DPL
MOV R7,A
INC R7
DELTAIL1:
MOV A,#32
MOVX @DPTR,A
INC DPL
DJNZ R7,DELTAIL1
POP ACC
POP 07H
POP DPL
POP DPH
RET
DELHEAD:
LCALL SAVETAIL
MOV A,#32
LCALL LINEDEL
MOV DPTR,#RECBF
MOV 1EH,DPH
MOV 1FH,DPL ;SOURCE
MOV 1DH,#0 ;CURSOR AT BEGIN
LCALL CUR_AD ;GET TARGET ADDRESS
LCALL MOVESTR
RET
LINEDEL: ;LOAD A WITH LETTER(NORMAL=32) AND CALL THIS
PUSH DPH
PUSH DPL
PUSH 07H
MOV R7,#MAXCOL
INC R7
LINEDEL1:
MOVX @DPTR,A
INC DPL
DJNZ R7,LINEDEL1
POP 07H
POP DPL
POP DPH
RET
SAVETAIL: ;SAVE TAIL OF THE LINE
LCALL CUR_AD
MOV 1EH,DPH
MOV 1FH,DPL ;SOURCE
MOV DPL,#MAXCOL
MOV A,#13
MOVX @DPTR,A ;CHOP A MARK 13 AT THE END OF LINE (NEED IN SUB MOVESTR)
MOV DPTR,#RECBF
SETB 32H ;CHOP CHR$(13)
LCALL MOVESTR ;MOVE TO #RECBF
LCALL CUR_AD
LCALL DELTAIL ;ERASE TAIL, SINCE CURSOR
RET
LOADTAIL:
MOV DPTR,#RECBF
MOV 1EH,DPH
MOV 1FH,DPL ;SOURCE
LCALL CUR_AD ;SAVE TAIL OF THE LINE
MOV A,#MAXCOL
CLR C
SUBB A,DPL
JC XLOADT
MOV DPTR,#RECBF
MOV DPL,A
MOV A,#13
MOVX @DPTR,A
LCALL CUR_AD
LCALL MOVESTR ;MOVE FROM #RECBF TO CURSOR
XLOADT:
RET
BTRIM: ;CHECK THE PAGE AT GET LAST LINE# OF SPACE
PUSH 07H ;R7
MOV DPTR,#RAM
MOV A,DPH
ADD A,#MAXLINE
MOV DPH,A
MOV R7,#MAXLINE
INC R7 ;LOOP NEED
BTRIM1:
LCALL RTRIM
JNZ BTRIM2
DEC DPH
DJNZ R7,BTRIM1
BTRIM2:
;R7 CONTAIN LAST LINE ALL " "
MOV A,R7
POP 07H
RET
RTRIM: ;READ A LINE AND CUT FROM TAIL UNTIL NO " " STORE IN A
PUSH DPH
PUSH DPL
PUSH 07H ;R7
MOV A,#MAXCOL
ADD A,14H ;R6 ;RANGE HERE
MOV DPL,A
MOV R7,#MAXCOL
INC R7 ;LOOP NEED
RTRIM1:
MOVX A,@DPTR
XRL A,#32
JNZ RTRIM2
DEC DPL
DJNZ R7,RTRIM1
RTRIM2:
;R7 CONTAIN LEN OF LINE
MOV A,R7
POP 07H
POP DPL
POP DPH
RET
VIEW_AD:
; COUNT THE START POINT OF THE VIEW AREA
JB 34H,VIEW_AD1
MOV DPTR,#RAM
AJMP VIEW_AD2
VIEW_AD1:
MOV DPH,4DH
MOV DPL,4EH
VIEW_AD2:
MOV A,DPH
ADD A,08H
MOV DPH,A
MOV A,DPL
ADD A,14H ;R6 ;ADD PAGE START POINT
MOV DPL,A
RET
CUR_AD:
;COUNT THE MEMORY ADDRESS OF CURRENT CURSOR
JB 34H,CUR_AD1 ;FLASH
MOV DPTR,#RAM
AJMP CUR_AD2
CUR_AD1:
MOV DPH,4DH
MOV DPL,4EH
CUR_AD2:
MOV A,DPH
ADD A,08H ;LINE#
ADD A,1CH ;VT CURSOR
MOV DPH,A
MOV A,DPL
ADD A,14H ;SCREEN SHIFT
ADD A,1DH
MOV DPL,A
RET
LOADPOST:
MOV DPTR,#RAM+240
MOV A,DPH
ADD A,34H
MOV DPH,A
MOVX A,@DPTR
MOV 1CH,A
INC DPTR
MOVX A,@DPTR
MOV 1DH,A
INC DPTR
MOVX A,@DPTR
MOV 08H,A
INC DPTR
MOVX A,@DPTR
MOV 14H,A
INC DPTR
MOVX A,@DPTR
MOV 30H,A
RET
SAVEPOST:
MOV DPTR,#RAM+240
MOV A,DPH
ADD A,34H
MOV DPH,A
MOV A,1CH
MOVX @DPTR,A
INC DPTR
MOV A,1DH
MOVX @DPTR,A
INC DPTR
MOV A,08H
MOVX @DPTR,A
INC DPTR
MOV A,14H
MOVX @DPTR,A
INC DPTR
MOV A,30H
MOVX @DPTR,A
RET
SUB27:
DB "~27~"
HEXSHOW: ;FREE
;LOAD A WITH VALUE, CALL THIS TO DISPLAY HEX, RETURN A NO CHANGE
PUSH DPH
PUSH DPL
PUSH ACC
PUSH B
MOV B,A
ANL A,#11110000B
SWAP A
MOV DPTR,#THEX
MOVC A,@A+DPTR
LCALL LCDST
MOV A,B
ANL A,#00001111B
MOV DPTR,#THEX
MOVC A,@A+DPTR
LCALL LCDST
POP B
POP ACC
POP DPL
POP DPH
RET
;------------------------------
;CID:
RET
;DIAL:
RET
;VERSION:
RET
;VIEW:
RET
;EDIT:
RET
;EMAIL:
RET
;SINWAVE:
RET
;TESTDAC:
RET
;TESTSQ:
RET
;T_TYPER:
RET
;BCD_SHOW:
RET
TESTDAC:
CLR EX0 ;開INT0中斷
CLR EX1 ;開INT1中斷
PUSH 06H
PUSH 07H
LCALL LCLEAR1
MOV DPTR,#MSG48
LCALL LCDMSG
LCALL LCLEAR2
MOV DPTR,#MSG47
LCALL LCDMSG
TESTDAC0:
MOV DPTR,#DAC
MOV R7,#0
MOV R6,#255
TESTDAC1:
MOV A,R7
MOVX @DPTR,A
INC R7
CJNE R7,#255,TESTDAC1
TESTDAC2:
MOV A,R7
MOVX @DPTR,A
DEC R7
CJNE R7,#0,TESTDAC2
DJNZ R6,TESTDAC1
MOVX @DPTR,A
MOV DPTR,#PIOA
MOV A, #00000000B ;SCAN
MOVX @DPTR,A
LCALL READKEY
CJNE A,#0,XTESTDAC
LJMP TESTDAC0
XTESTDAC:
POP 07H
POP 06H
SETB EX0 ;開INT0中斷
SETB EX1 ;開INT1中斷
RET
TESTSQ:
LCALL LCLEAR2
LCALL LCLEAR1
SETB 70H SPK
LCALL ONLINE
TESTSQ1:
LCALL COUNTER
MOV DPTR,#PIOA
MOV A, #00000000B ;SCAN
MOVX @DPTR,A
LCALL READKEY
CJNE A,#0,XTESTSQ
LJMP TESTSQ1
XTESTSQ:
LCALL OFFLINE
RET
;=SUB===========================
VIEWLINE:
MOVX A,@DPTR
LCALL LCDST
INC DPTR
DJNZ R7,VIEWLINE
RET
K_LOWER: ;MOST DOWN
MOV 1CH,#1 ;CURSOR AT LINE #2
MOV 08H,09H
DEC 08H
LCALL CUR_AD
RET
K_UPPER: ;MOST UP
MOV 1CH,#0 ;CURSOR AT LINE #1
MOV 08H,#0
LCALL CUR_AD
RET
K_RIGER: ;MOST RIGHT
MOV 14H,#0
LCALL CUR_AD
LCALL RTRIM ;GET LAST LETTER POSITION, RETURN BY A
MOV 1DH,A
MOV A,1DH
CLR C
SUBB A,#MAXWIDTH
JC K_RIGER1
MOV 14H,A
MOV 1DH,#MAXWIDTH
AJMP XK_RIGER
K_RIGER1:
MOV 14H,#0
XK_RIGER:
LCALL CUR_AD
RET
K_LEFER: ;MOST LEFT
MOV 1DH,#0 ;CURSOR AT BEGIN
MOV 14H,#0
LCALL CUR_AD
RET
K_DOWN:
MOV A,09H
XRL A,08H
JZ K_DOWN2
MOV A,1CH
JNZ K_DOWN1
INC 1CH ;CURSOR
AJMP XK_DOWN
K_DOWN1:
SETB 0CH
INC 08H
;MORE TAKE CARE OF CURSOR
MOV A,08H
XRL A,09H
JNZ XK_DOWN
MOV 1CH,#0 ;CURSOR AT LINE 1
AJMP XK_DOWN
K_DOWN2:
SETB 0CH
MOV 1CH,#0 ;CURSOR AT LINE 1
AJMP XK_DOWN1
XK_DOWN:
LCALL CUR_AD
XK_DOWN1:
RET
K_UP:
MOV A,08H
JZ K_UP2
MOV A,1CH
JZ K_UP1
DEC 1CH ;CURSOR
AJMP XK_UP
K_UP1:
SETB 0CH
DEC 08H
AJMP XK_UP
K_UP2:
;SETB 0CH
MOV A,1CH
JZ XK_UP
DEC 1CH ;LESS CURSOR
XK_UP:
LCALL CUR_AD
XK_UP1:
RET
K_RIGHT:
MOV A,1DH
XRL A,#MAXWIDTH
JZ K_RIGHT1
INC 1DH
AJMP XK_RIGHT
K_RIGHT1:
MOV A,1DH
ADD A,14H ;R6 ;HZ SHIFT
CLR C
SUBB A,46H
CLR C
SUBB A,#MAXCOL
JC K_RIGHT2
AJMP XK_RIGHT
K_RIGHT2:
INC 14H ;R6
SETB 0CH
XK_RIGHT:
RET
K_LEFT:
MOV A,1DH ;CURSOR
ADD A,14H ;SHIFT
XRL A,46H
JZ XK_LEFT
MOV A,1DH
JZ K_LEFT1
DEC 1DH
AJMP XK_LEFT
K_LEFT1:
MOV A,14H ;R6
JZ XK_LEFT
DEC 14H ;R6
SETB 0CH
XK_LEFT:
RET
B_KEY: ;BACK
MOV B,A
MOV A,1DH ;HZ CURSOR
JNZ B_KEY1
MOV A,14H ;R6
JNZ B_KEY0 ; LEFT NO MORE
JNB 7AH,XB_KEY
LCALL U_MOVE
SETB 0CH ;SCREEN RENEW
AJMP XB_KEY
B_KEY0:
DEC 14H ;R6
SETB 0CH
AJMP B_KEY2
B_KEY1:
DEC 1DH
B_KEY2:
LCALL CUR_AD
;HERE
JNB 7AH,B_KEY3
LCALL SET_CUR
LCALL B_MOVE
LCALL SET_CUR
AJMP XB_KEY
B_KEY3:
MOV A,#32 ;SPACE
MOVX @DPTR,A
LCALL SET_CUR
MOV A,#32 ;SPACE
LCALL LCDST ;PRINT " "
LCALL SET_CUR
XB_KEY:
RET
B_MOVE:
INC DPL
MOVX A,@DPTR
DEC DPL
MOVX @DPTR,A
PUSH ACC
MOV A,DPL
CLR C
SUBB A,14H
CLR C
SUBB A,#MAXWIDTH+1
POP ACC
JNC B_MOVE1
LCALL LCDST
B_MOVE1:
INC DPL
MOV A,DPL
CJNE A,#MAXCOL,B_MOVE
MOV A,#32 ;BLANK THE LAST
MOVX @DPTR,A
RET
U_MOVE: ;UP MOVE
MOV A,08H
ADD A,1CH
JZ XU_MOVE
LCALL SAVETAIL
MOV A,08H ;LINE#
ADD A,1CH ;VT CURSOR
MOV 08H,A ; NOW POINT TO CURRENT LINE#
MOV 1DH,#0 ; HZ CURSOR
MOV A,1CH
JZ U_MOVE0 ;CURSOR AT FIRST LINE,NEED NO MOVE
DEC 1CH
U_MOVE0:
PUSH 07H
MOV DPTR,#RAM
MOV A,DPH
ADD A,#MAXLINE
MOV 07H,A
MOV DPTR,#RAM
MOV A,DPH
ADD A,08H ;LAST LINE
MOV DPH,A ;SOURCE
XRL A,07H ;LAST LINE
JZ U_MOVE2
U_MOVE1:
INC DPH
MOV 1EH,DPH ;SOURCE
MOV 1FH,DPL
DEC DPH ;TARGET
MOV 47H,#MAXCOL
LCALL MOVEMEM
INC DPH ;RESTORE AT SOURCE
MOV DPL,#0
MOV A,DPH
CJNE A,07H,U_MOVE1
U_MOVE2:
;MUST ADD SPACE TO LAST LINE
MOV 07H,#MAXCOL+1
MOV A,#32
U_MOVE11:
MOVX @DPTR,A
INC DPTR
DJNZ 07H,U_MOVE11
MOV DPL,#0
DEC 08H
LCALL CUR_AD
LCALL RTRIM ;GET STR LEN
MOV 1DH,A
CLR C
SUBB A,#MAXWIDTH+1
JC U_MOVE3
MOV 14H,#MAXWIDTH+1
MOV 1DH,A
U_MOVE3:
LCALL LOADTAIL
XU_MOVE:
POP 07H
RET
E_MOVE: ;ENTER MOVE
PUSH 07H
MOV A,08H
ADD A,1CH
XRL A,#MAXLINE
JZ XE_MOVE
LCALL SAVETAIL
MOV A,08H ;LINE#
ADD A,1CH ;VT CURSOR
MOV 08H,A ; NOW POINT TO CURRENT LINE#
MOV 1DH,#0 ; HZ CURSOR
MOV A,1CH
JNZ E_MOVE0
INC 1CH
E_MOVE0:
MOV DPTR,#RAM
MOV A,DPH
ADD A,08H ;LAST LINE
INC A ;ADD ONE LINE
MOV 07H,A
MOV A,DPH
ADD A,#MAXLINE
MOV DPH,A ; NOW POINT TO LAST LINE
XRL A,07H ; LAST 2ND LINE
JZ E_MOVE2
;
E_MOVE1:
DEC DPH ;POINT TO SOURCE
MOV 1EH,DPH ;SOURCE
MOV 1FH,DPL
INC DPH ;TARGET
MOV 47H,#MAXCOL
LCALL MOVEMEM
DEC DPH ;RESTORE AT SOURCE
MOV DPL,#0
MOV A,DPH
CJNE A,07H,E_MOVE1
;
E_MOVE2:
MOV 14H,#0 ;LINE START
LCALL DELTAIL
LCALL LOADTAIL
;
XE_MOVE:
POP 07H
RET
T_MOVE:
MOV A,1DH ;HZ CURSOR
ADD A,#8
MOV 1DH,A
CLR C
SUBB A,#MAXWIDTH
JC XC_KEY6 ;1DH <=MAXWIDTH
C_KEY6_1:
SETB 0CH ;NEED SCREEN REFLASH
MOV A,1DH
CLR C
SUBB A,#MAXWIDTH
MOV 1DH,#MAXWIDTH
ADD A,14H
MOV 14H,A
MOV A,#MAXCOL
CLR C
RRC A ;/2
ADD A,46H
MOV 07H,A
CLR C
SUBB A,14H
JC C_KEY6_2
AJMP XC_KEY6 ;MAXRANGE >=14H OK NO PROBLEM
C_KEY6_2:
LCALL BEEP
CLR C
MOV 14H,07H
INC 14H ;???? SO THAT MOVE TO THE MOST RIGHT OF THE PAGE
XC_KEY6:
RET
TS_MOVE: ;SHIFT TAB
MOV A,1DH ;HZ CURSOR
CLR C
SUBB A,#8 ;REVERSE 8
JNC T_MOVE1 ;1DH >=8 OK
;
MOV A,14H
CLR C
SUBB A,#8
JC T_MOVE2 ;LESS THAN ZERO
SETB 0CH ;NEED REFLASH
MOV 14H,A
;TEST 14H
CLR C
SUBB A,46H
JNC XT_MOVE ; 14H >=MAXRANGE OK
T_MOVE2:
LCALL BEEP
MOV 14H,46H ;PUT 14H AT START
MOV 1DH,#0
AJMP XT_MOVE
T_MOVE1:
MOV A,1DH
CLR C
SUBB A,#8
MOV 1DH,A
XT_MOVE:
RET
AZ_KEY:
MOV A,14H ;---SCREEN MUST NOT EXIT MAXCOL
ADD A,1DH ;
CJNE A,#MAXCOL, AZ_KEY0 ;NO ADD
RET
AZ_KEY0:
LCALL CUR_AD
MOV A,B ;RESTORE A
JNB 7AH,AZ_KEY2
AZ_KEY1: ;INS MODE
LCALL SET_CUR
LCALL K_MOVE
LCALL SET_CUR
AJMP AZ_KEY3
AZ_KEY2:
MOVX @DPTR,A
LCALL LCDST
AZ_KEY3:
MOV A,1DH ;CHECK CURSOR
CJNE A,#MAXWIDTH,C_KEY5_1
INC 14H ;R6 ;SCREEN MOVE
SETB 0CH
AJMP XAZ_KEY
C_KEY5_1:
INC 1DH
XAZ_KEY:
RET
K_MOVE:
MOVX A,@DPTR
XCH A,B
MOVX @DPTR,A
PUSH ACC
MOV A,DPL
CLR C
SUBB A,14H
CLR C
SUBB A,#MAXWIDTH+1
POP ACC
JNC K_MOVE1
LCALL LCDST
K_MOVE1:
INC DPL
MOV A,DPL
CJNE A,#MAXCOL,K_MOVE
RET
VIEW: ;VIEW SHORT MESSAGE
SETB 0DH
CLR 7CH ;NEWS
CLR 2BH
MOV 34H,#1
LCALL LOADPOST
MOV 46H,#80
LCALL PAGEVIEW
MOV 34H,#1
LCALL SAVEPOST
RET
EMAIL: ;VIEW EMAIL
SETB 0DH
CLR 7CH ;NEWS
CLR 2AH ;EMAIL
MOV 34H,#2
LCALL LOADPOST
MOV 46H,#160
LCALL PAGEVIEW
MOV 34H,#2
LCALL SAVEPOST
RET
EDIT:
CLR 0DH ;CAN EDIT
MOV 14H,#0 ;EDIT ONLY IN PAGE0
LCALL LCLEAR2
MOV DPTR,#MSG22
LCALL LCDMSG
LCALL KEY_CLR
MOV 34H,#0
LCALL LOADPOST
MOV DPTR,#MSG3_2
MOV 50H,DPH
MOV 51H,DPL
MOV 36H,#1
LCALL GET_ANS
JB 09H,X_EDIT ;#27 PRESS; NO DO
MOV A,R0
CLR C
SUBB A,#KEYAREA ;NOW LEN OF CMD
JZ EDIT_1 NO COMMAND
MOV R0,#KEYAREA ;START OF BF
MOV A,@R0
XRL A,#59H ;"Y"
JNZ EDIT_1
LCALL A_CLEAN
MOV 1CH,#0
MOV 1DH,#0
MOV 08H,#0
MOV 14H,#0 ;EDIT ONLY IN PAGE0
EDIT_1:
MOV 2FH,40H
MOV 20H,#00000000B ;NO INTERRUPT
SETB EX1 ;開中斷1
MOV 46H,#0
LCALL PAGEVIEW
CLR EX1
MOV 20H,#00000000B ;STOP ALL INTERRUPT
MOV 40H,2FH
CLR 79H ;CAP
CLR 7AH ;INS
CLR 7BH ;2ND
X_EDIT:
CLR 09H
CLR 19H
LCALL REC_CLR
MOV 34H,#0
LCALL SAVEPOST
RET
;------------------------------
CID: ;CALLER ID
SETB 74H ;ACLOOP
LCALL ONCID
LCALL INITT0
MOV 31H,#13
;
MOV 42H,#0
LCALL REC_CLR
;LCALL LCLEAR1
ORL P1,#00110000B
;
CID1:
MOV 20H,#00100000B ; ONLY CID CAN CHANGE
SETB EX1
MOV A,P1
ANL A, #00100000B ;DCLK
JB 19H,XCID
JZ CID1
;
MOV A,P1 ;GET DATA
ANL A, #00010000B ;DATA
JZ CID3
;
MOV A,42H
RR A
SETB ACC.7
MOV 42H,A
AJMP CID5
;
CID3:
MOV A,42H
RR A
CLR ACC.7 ;FALSE
MOV 42H,A
;
CID5:
MOV A,P1
ANL A, #00100000B ;DCLK
JB 19H,XCID
JNZ CID5
AJMP CID1
;
XCID:
LCALL SCID
MOV 34H,#1
LCALL STORAGE
CLR 74H ;ACLOOP OFF
LCALL OFFCID
CLR EX1
MOV 20H,#00000000B
LCALL SHOWNAME
RET
XSCID:
RET
;
SCID:
MOV A,35H
CLR C
SUBB A,#16
JC XSCID ;TOO SMALL
LCALL LCLEAR1
MOV DPTR,#RECBF
ADD A,DPL
MOV DPL,A
PUSH DPH
PUSH DPL
MOV A,#32
LCALL LCDST
LCALL LCDST
MOV DPTR,#MSG5
LCALL LCDMSG
POP DPL
POP DPH
MOV R7,#2
SCID1:
MOVX A,@DPTR
LCALL LCDST
INC DPL
DJNZ R7,SCID1
MOV A,#2FH
LCALL LCDST
MOV R7,#2
SCID2:
MOVX A,@DPTR
LCALL LCDST
INC DPL
DJNZ R7,SCID2
MOV A,#32
LCALL LCDST
;
PUSH DPH
PUSH DPL
MOV DPTR,#MSG6
LCALL LCDMSG
POP DPL
POP DPH
MOV R7,#2
SCID3:
MOVX A,@DPTR
LCALL LCDST
INC DPL
DJNZ R7,SCID3
MOV A,#2FH
LCALL LCDST
MOV R7,#2
SCID4:
MOVX A,@DPTR
LCALL LCDST
INC DPL
DJNZ R7,SCID4
MOV A,#32
LCALL LCDST
;
PUSH DPH
PUSH DPL
MOV DPTR,#MSG6_1
LCALL LCDMSG
POP DPL
POP DPH
LCALL KEY_CLR
MOV R7,#7
SCID5:
MOVX A,@DPTR
LCALL KEY_BFA
LCALL LCDST
INC DPL
DJNZ R7,SCID5
RET
;------------------------
RIGHTCTL: ;EXCHANGE OF CONTROL RIGHT
JB 1BH,TK01 ;IN PAGE MODE, NO EXCHANGE OF RIGHT
CLR 16H
LCALL LCLEAR1
LCALL STORAGE
RET
TK01:
;MOVE SECOND LINE TO FIRST LINE
LCALL LCLEAR1
LCALL REC_SHOW
LCALL LCLEAR2
LCALL STORAGE
RET
;-------------------------------
CHECKLEN:
MOV A,R0
CLR C
SUBB A,#KEYAREA
XRL A,#39
JNZ XCHECKLEN
LCALL REC_BFB
LCALL LCLEAR2
MOV DPTR,#MSG31
LCALL LCDMSG
LCALL LCLEAR1
LCALL REC_SHOW
MOV A,#23H ;SENT ERASE LAST KEY
LCALL DIALONE
MOV A,#23H
LCALL DIALONE
XCHECKLEN:
RET
;----------------------------------
REC_PAGE:
SETB 1BH ;MARK AS "RECEIVE A PAGE"
SETB 7CH ;NEWS
SETB 2AH ;EMAIL
LCALL LCLEAR1
MOV DPTR,#MSG35
LCALL LCDMSG
LCALL LCLEAR2
LCALL REC_CLR
RET
REC_TIMP:
CLR 1EH ;ENABLE TIM CONVERT
SETB 7CH ;NEWS
SETB 2BH
LCALL LCLEAR1
MOV DPTR,#MSG40
LCALL LCDMSG
LCALL LCLEAR2
LCALL REC_CLR
RET
REC_TIM: ;THIS ONLY TO CONVERT FIRST INCOMING KEY
CLR 1EH ;ENABLE TIM CONVERT
SETB 7CH ;NEWS
SETB 2BH
LCALL LCLEAR1
MOV DPTR,#MSG38
LCALL LCDMSG
LCALL LCLEAR2
LCALL REC_CLR
MOV A,B
LCALL DO_TIM
JZ XREC_TIM
LCALL REC_BFA
LCALL LCDST
LCALL SAID
XREC_TIM:
RET
;--------------------------
RECEIVE: ;TONE RECEIVER WITH COVERT TO TIM
ORL P1,#10000000B MAKE P1 AS INPUT
MOV A,P1
ANL A, #10000000B MASK EXCEPT BIT7 ;IRQ
JZ REC_OK
MOV A,#0
RET
;
REC_OK:
MOV 31H,#MAXTIME
MOV DPTR,#DREG ;CLEAR IRQ
MOVX A,@DPTR
MOV DPTR,#DTMF
MOVX A,@DPTR
ANL A,#00001111B ;MASK
MOV DPTR,#TONE
MOVC A,@A+DPTR ;GET KEY FROM MAP
;
REC_A:
LCALL DO_TIM
JZ XREC
;
REC_B:
MOV B,A ;STORE AT B
XRL A,#08 ;BACK SPACE
JNZ REC_C
MOV A,B
LCALL SAID
MOV A,R0
JZ XREC ; NO MORE
LCALL REC_BFB
LCALL LCLEAR2
LCALL REC_SHOW
AJMP XREC
;
REC_C: ;#13 ENTER(SPELL)
MOV A,B
XRL A,#13
JNZ XREC_1
MOV A,B ;RESTORE
JB 1AH,XREC ;MACHINE TALK NEED "ENTER" CHR$(13)
MOV A,#1
LCALL SAID
SETB 36H
LCALL LCLEAR2
LCALL REC_SHOW
CLR 36H
MOV A,#0
AJMP XREC
XREC_1:
MOV A,R0
XRL A,#57H ;LIMIT AS 39 WORDS MAX
JZ XREC
MOV A,B
LCALL REC_BFA
LCALL LCDST
;
XREC:
LCALL SAID
RET
;--------------------------TIM
STORAGE:
PUSH ACC
MOV DPTR,#RECBF ;SOURCE
MOV 1EH,DPH
MOV 1FH,DPL
MOV A,34H
XRL A,#1 ;EMAIL
JZ STORAGE1
MOV A,34H
XRL A,#2 ;EMAIL
JZ STORAGE2
STORAGE0:
MOV 46H,#0
LCALL S_SHORT
AJMP XSTORAGE
STORAGE1:
MOV 46H,#80
LCALL S_SHORT
AJMP XSTORAGE
STORAGE2:
MOV 46H,#160
LCALL S_SHORT
XSTORAGE:
LCALL REC_CLR
POP ACC
RET
S_SHORT:
LCALL LOADPOST
MOV 08H,30H ;SET LINE# TO LAST LINE OF STORAGE
MOV DPTR,#RAM
MOV A,DPL
ADD A,46H
MOV DPL,A
MOV A,DPH
ADD A,08H ;STORAGE INDEX
MOV DPH,A
MOV A,#32
LCALL LINEDEL
;LCALL CP_DATE ;CHOP DATE
;LCALL CP_TIME ;CHOP TIME
LCALL MOVESTR
INC 08H
MOV A,08H
XRL A,#MAXLINE+1
JNZ XS_SHORT
MOV 08H,#1
XS_SHORT:
MOV DPTR,#RAM ;TARGET
MOV A,DPL
ADD A,46H
MOV DPL,A
MOV A,DPH
ADD A,08H ;STORAGE INDEX
MOV DPH,A
MOV A,#2DH ;"---------"
LCALL LINEDEL
MOV 30H,08H
MOV 1CH,#0 ;MOVE CURSOR AT SECOND LINE
MOV 1DH,#0
MOV 14H,46H
DEC 08H
LCALL SAVEPOST
RET
;-------COUNT FREQUENCY FROM LINE------
COUNTER:
LCALL C_INIT
MOV 44H,#20
;
COUNT1:
MOV TL1,#0
MOV 12H,#2
LCALL DL_200M
MOV A,TL1
JB 2FH,COUNT2
JNZ COUNT1
;
COUNT2: ;START COUNT
LCALL C_INIT
MOV 44H,#20
;
COUNT3:
NOP
NOP
NOP
MOV A,TL1
JB 2FH,COUNT4
JZ COUNT3
;
COUNT4:
LCALL C_INIT
MOV 44H,#3
;
COUNT5:
JB 2FH,SCOUNT
AJMP COUNT5
;
SCOUNT:
MOV A,TH1
ADD A,#30H
LCALL LCDST
MOV A,TL1
ANL A,#11111100B
RR A
RR A
MOV 1EH,A
MOV 1FH,#0
LCALL BCD_SHOW
;
LCALL C_INIT
MOV 44H,#20
;
COUNT6:
SETB 30H
MOV TL1,#0
MOV 12H,#2
LCALL DL_200M
MOV A,TL1
JB 2FH,XCOUNT
CLR 30H
JNZ COUNT6
;
XCOUNT:
JB 30H,XCOUNT1
MOV A,#32
LCALL LCDST
CLR 2FH
RET
;
XCOUNT1:
MOV A,#65
LCALL LCDST
CLR 2FH
RET
;--4 DIGIT BCD SHOW, LOAD 1FH,1EH AND CALL THIS
BCD_SHOW: ;STUPID
PUSH ACC
PUSH B
;
BCD_A:
MOV A,1EH
JZ BCD_B
MOV B,1EH
MOV A,#0
BCD_A1:
CLR C
ADD A,#1
DA A
JNC BCD_A2
INC 1FH
BCD_A2:
DJNZ B,BCD_A1
MOV 1EH,A
;
BCD_B:
MOV A,1FH
JZ BCD_C
MOV B,1FH
MOV A,#0
BCD_B1:
CLR C
ADD A,#1
DA A
DJNZ B,BCD_B1
MOV 1FH,A
;
BCD_C:
MOV A,1FH
ANL A,#11110000B
SWAP A
ADD A,#30H
LCALL LCDST
MOV A,1FH
ANL A,#00001111B
ADD A,#30H
LCALL LCDST
;
BCD_D:
MOV A,1EH
ANL A,#11110000B
SWAP A
ADD A,#30H
LCALL LCDST
MOV A,1EH
ANL A,#00001111B
ADD A,#30H
LCALL LCDST
;
POP B
POP ACC
RET
ROMBANK: ;FREE
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#PIO2C
MOV A,48H
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
FILL_BF: ;SET CHR TO A AND CALL TO FILL
PUSH 07H
MOV DPTR,#FLASH_BF
MOV R7,#0 ;255
FILL_BF1:
MOVX @DPTR,A
INC DPTR
DJNZ R7,FILL_BF1
POP 07H
RET
READROMQUICK: ; QUICK READROM SET BANK TO 48H, SECTOR TO 49H
; LOAD A WITH CHR LEN NEED TO READ 14H WITH START POINT
PUSH ACC
LCALL ROMBANK
LCALL ROMAREA
MOV DPH,4DH
MOV DPL,4EH
MOV A,DPH
ADD A,49H ;SECTOR
MOV 1EH,A
MOV A,DPL
ADD A,14H
MOV 1FH,A
;
MOV DPTR,#FLASH_BF ;TARGET
POP ACC
MOV 47H,A ;CHR# NEED READ
LCALL MOVEMEM
RET
READROM: ; SET BANK TO 48H, SECTOR TO 49H
PUSH ACC
LCALL ROMBANK
LCALL ROMAREA
MOV DPH,4DH
MOV DPL,4EH
MOV A,DPH
ADD A,49H ;SECTOR
MOV 1EH,A
MOV 1FH,DPL
MOV DPTR,#FLASH_BF ;TARGET
MOV 47H,#0 ;256B, 47H=0 MOVE 256 BYTE 1=1BYTE
LCALL MOVEMEM
POP ACC
RET
WRITEROM:
LCALL ROMBANK
LCALL ROMAREA
MOV DPTR,#FLASH_BF ;SOURCE
MOV 1EH,DPH
MOV 1FH,DPL
;
MOV DPH,4DH
MOV DPL,4EH
MOV A,DPH
ADD A,49H ;SECTOR
MOV DPH,A
;
MOV 47H,#0 ;256 BYTE
LCALL MOVEMEM
RET
AD5555:
;A16=0,A15=0,A14=1,A13=0,A12=1, SO
MOV DPTR,#PIO2C
MOV A,#2 ;
MOVX @DPTR,A
MOV DPH,#0D5H
MOV DPL,#55H
RET
AD2AAA:
;A16=0,A15=0,A14=0,A13=1,A12=0, SO
MOV DPTR,#PIO2C
MOV A,#1 ;
MOVX @DPTR,A
MOV DPH,#0CAH
MOV DPL,#0AAH
RET
ROM_EN: ;ROM ENABLE WRITE
LCALL AD5555
MOV A,#0AAH
MOVX @DPTR,A ;WRITE AAH TO 5555H
LCALL AD2AAA
MOV A,#55H
MOVX @DPTR,A ;WRITE 55H TO 2AAAH
LCALL AD5555
MOV A,#80H
MOVX @DPTR,A ;WRITE 80H TO 5555A
MOV A,#0AAH
MOVX @DPTR,A ;WRITE AAH TO 5555A
LCALL AD2AAA
MOV A,#55H
MOVX @DPTR,A ;WRITE 55H TO 2AAA
LCALL AD5555
MOV A,#20H
MOVX @DPTR,A ;WRITE 20H TO 5555A
RET
ROM_DIS:
LCALL AD5555
MOV A,#0AAH
MOVX @DPTR,A ;WRITE AAH TO 5555H
LCALL AD2AAA
MOV A,#55H
MOVX @DPTR,A ;WRITE 55H TO 2AAAH
LCALL AD5555
MOV A,#0A0H
MOVX @DPTR,A ;WRITE 80H TO 5555A
RET
SINWAVE:
LCALL LOADS_TB
CLR EA
MOV DPTR,#DAC
MOV R7,#0
SINT:
MOV R6,#0
SINWAVE1:
LCALL REALSIN
LCALL REALSIN
LCALL REALSIN2
DJNZ R6,SINWAVE1
DJNZ R7,SINT
SETB EA
RET
LOADS_TB: ;LOAD TABLE INTO INTERNAL RAM 80-80+23 (KEY BUFFER AREA)
MOV R0,#128
MOV A,#0
SIN1:
PUSH ACC
MOV DPTR,#SIN_TB
MOVC A,@A+DPTR
MOV @R0,A
POP ACC
INC A
INC R0
CJNE A,#80,SIN1 ;TOTAL 36 DATA
RET
REALSIN:
MOV R0,#128
REALSIN1:
MOV A,@R0
MOVX @DPTR,A
INC R0
CJNE R0,#164,REALSIN1
NOP
NOP
NOP
NOP
RET
REALSIN2:
MOV R0,#164
REALSIN3:
MOV A,@R0
MOVX @DPTR,A
INC R0
NOP
NOP
NOP
NOP
NOP
CJNE R0,#201,REALSIN3
NOP
NOP
NOP
RET
VERSION:
LCALL CURSOR0
LCALL LCLEAR1
MOV DPTR,#MSG1
LCALL LCDMSG
MOV DPTR,#MSG2
LCALL LCDMSG
MOV DPTR,#MSG4
LCALL LCDMSG
LCALL LCLEAR2
MOV DPTR,#MSG32
LCALL LCDMSG
LCALL LONG_DL
LCALL LONG_DL
MOV 48H,#0 ;BANK 0
MOV 49H,#0 ;SECTOR 0
MOV R7,#MAXBANK
VERSION1:
LCALL ROMBANK
LCALL ROMAREA
MOV DPH,4DH
MOV DPL,4EH
LCALL LCLEAR1
LCALL LCDMEM ;SHOW FLASH MEMORY CONTAIN
MOV DPH,4DH
MOV DPL,4EH
INC DPH
LCALL LCLEAR2
LCALL LCDMEM ;SHOW FLASH MEMORY CONTAIN
MOV 12H,#200
LCALL DL_200M
INC 48H
DJNZ R7,VERSION1
MOV 48H,#0 ;BANK 0
MOV 49H,#0 ;SECTOR 0
LCALL LCLEAR2
LCALL LONG_DL
LCALL LONG_DL
RET
ROM_STORE:
LCALL WRITEROM
INC 49H
MOV A,49H
XRL A,#32
JNZ ROM_STORE1
INC 48H ;NEXT BANK
MOV 49H,#0
ROM_STORE1:
RET
VIEW_F: ;VIEW CONTAIN OF FLASH
LCALL LCLEAR2
MOV DPTR,#MSG68
LCALL LCDMSG
LCALL WAITKEY
SETB 34H ;VIEW FLASH
SETB 0DH
MOV 1CH,#0
MOV 1DH,#0
MOV 08H,#0
MOV 14H,#0
MOV 46H,#0
MOV 48H,#0
LCALL ROMBANK
LCALL ROMAREA
LCALL PAGEVIEW
CLR 34H
RET
ROM_BFA: ;接收緩沖進位
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#FLASH_BF
MOV A,DPL
ADD A,R0
MOV DPL,A
POP ACC
MOVX @DPTR,A
INC R0
POP DPL
POP DPH
RET
ROM_BFB: ;接收緩沖退位
DEC R0
RET
ROM_CLR:
MOV R0,#0
RET
;---FILL_BF
;READROM ;TO FLASH_BF
SOUND:
CLR EA ;NO INT
LCALL ONSPK
SOUND0:
MOV 48H,#12 ;BANK1
MOV 49H,#0 ;SECTOR 0
MOV 12H,#50
LCALL DL_200M
MOV R4,#1 ;1 BANK
MOV R1,#127 ;START VALUE
MOV R2,#1 ;GAIN VALUE START
SOUND1:
LCALL ROMBANK
LCALL ROMAREA
MOV DPH,4DH
MOV DPL,4EH
MOV R6,#0 ;256BYTE
MOV R5,#24 ;32 SECTOR
SOUND2:
MOVX A,@DPTR
PUSH DPH ;
PUSH DPL
CLR C
MOV R3,#4 ;8 BIT
SOUND3:
RRC A
LCALL ADM ;R2=GAIN,R1=VALUE
PUSH ACC
MOV A,R1
;LCALL HEXSHOW
MOV DPTR,#DAC
MOVX @DPTR,A
POP ACC
DJNZ R3,SOUND3
; DELAY
MOV R7,#40
SOUND11:
DJNZ R7,SOUND11
POP DPL
POP DPH
INC DPL
DJNZ R6,SOUND2
INC DPH
DJNZ R5,SOUND2
INC 48H
DJNZ R4,SOUND1
LCALL OFFSPK
SETB EA
RET
ADM:
JC ADM2 ;"1"
CLR C
RRC A ;MORE BIT
PUSH ACC
JC ADMEXIT0 ;SAME
ADM1: ; "0"
JB 35H,ADM11 ;NOT SAME AS LAST BIT
MOV A,R2
ADD A,R2
CLR C
MOV R2,A
SUBB A,#MAXGAIN
JC ADMS1
MOV R2,#MAXGAIN ;LIMIT
ADMS1:
MOV A,R1
CLR C
SUBB A,R2
JNC ADM15
MOV A,#0
ADM15:
MOV R1,A
CLR 35H ;SAVE LAST BIT
AJMP ADMEXIT
;
ADM11:
MOV A,R2
CLR C
RRC A ;/2
JNZ ADM12
MOV A,#1 ;MIN VALUE
ADM12:
MOV R2,A
MOV A,R1
CLR C
SUBB A,R2
JNC ADM16
MOV A,#0
ADM16:
MOV R1,A
CLR 35H ;SAVE LAST BIT
AJMP ADMEXIT
;
ADM2: ; "1"
CLR C
RRC A ;MORE BIT
PUSH ACC
JC ADMEXIT0 ;SAME
;
JB 35H,ADM22 ;SAME AS LAST BIT
MOV A,R2
CLR C
RRC A ;/2
JNZ ADM21
MOV A,#1 ;MIN VALUE
ADM21:
MOV R2,A
MOV A,R1
CLR C
ADD A,R2
JNC ADM25
MOV A,#255
ADM25:
MOV R1,A
SETB 35H ;SAVE LAST BIT
AJMP ADMEXIT
;
ADM22:
MOV A,R2
ADD A,R2
CLR C
MOV R2,A
SUBB A,#MAXGAIN
JC ADMS2
MOV R2,#MAXGAIN ;LIMIT
ADMS2:
MOV A,R1
CLR C
ADD A,R2
JNC ADM26
MOV A,#255
ADM26:
MOV R1,A
SETB 35H ;SAVE LAST BIT
AJMP ADMEXIT
ADMEXIT:
POP ACC
RET
ADMEXIT0:
MOV A,R2
CLR C
RRC A; /2
JNZ ADMEXITA
MOV A,#1
ADMEXITA:
MOV R2,A
MOV R7,#10
ADMWAIT1:
DJNZ R7,ADMWAIT1
ADMEXIT1:
MOV R7,#17
ADMWAIT:
DJNZ R7,ADMWAIT
POP ACC
RET
VOICE:
CLR EA ;NO INT
LCALL ONSPK
VOICE0:
MOV 48H,#0 ;BANK1
MOV 49H,#0 ;SECTOR 0
MOV 12H,#50
LCALL DL_200M
MOV R4,#16 ;1 BANK
VOICE1:
LCALL ROMBANK
LCALL ROMAREA
MOV DPH,4DH
MOV DPL,4EH
MOV R6,#0 ;256BYTE
MOV R5,#32 ;32 SECTOR
VOICE2:
MOVX A,@DPTR
PUSH DPH ;
PUSH DPL
MOV DPTR,#DAC
MOVX @DPTR,A
;DELAY
MOV R7,#50
VOICE11:
DJNZ R7,VOICE11
POP DPL
POP DPH
INC DPL
DJNZ R6,VOICE2
INC DPH
DJNZ R5,VOICE2
INC 48H
DJNZ R4,VOICE1
LCALL OFFSPK
SETB EA
RET
SAID:
JNB 1AH,SAID0
; DON'T TALK IF MACHINE TALKING
RET
;
SUB28:
DB "~28~"
SAID0:
; LOAD A WITH ASC VALUE(SEE VOC0:) AND CALL THIS WILL SAID THAT WORD
PUSH DPH
PUSH DPL
PUSH B
MOV B,A
MOV R7,#0
MOV DPTR,#VOC0
SAID1:
MOV A,R7
MOVC A,@A+DPTR
XRL A,B
JZ SAID2 ;MATCH
INC R7
CJNE R7,#MAXVOC,SAID1
AJMP SAID3 ;NO MATCH
SAID2:
MOV A,R7
MOV B,#8
MUL AB
MOV R7,A
MOV 48H,#0 ;BANK1
LCALL ROMBANK
LCALL ROMAREA
MOV DPH,4DH
MOV DPL,4EH
MOV A,DPH
MOV R1,A ;ORG DPH
MOV A,DPL
ADD A,R7
MOV DPL,A
MOV A,DPH
ADD A,B
MOV DPH,A ;NOW POINT TO TARGET
MOVX A,@DPTR
;MOV CHIP,A
INC DPTR
MOVX A,@DPTR
MOV 48H,A ;BANK
INC DPTR
MOVX A,@DPTR
MOV 49H,A ;SECTOR
INC DPTR
MOVX A,@DPTR
MOV R7,A ;START BYTE
INC DPTR
MOVX A,@DPTR
MOV R6,A ;HI
INC R6 ;DJNZ NEED
INC DPTR
MOVX A,@DPTR
MOV R5,A ;LO
INC R5 ;DJNZ NEED
INC DPTR
MOVX A,@DPTR
;MOV SPARE1,A
INC DPTR
MOVX A,@DPTR
;MOV SPARE2,A
LCALL REALVOC
SAID3:
POP B
POP DPL
POP DPH
RET
REALVOC:
CLR EA ;NO INT
RSAID0:
MOV 12H,#50
LCALL DL_200M
RSAID1:
LCALL ROMBANK
LCALL ROMAREA
MOV DPH,4DH
MOV DPL,4EH
MOV A,DPH
ADD A,49H ;SECTOR
MOV DPH,A
MOV A,DPL
ADD A,R7
MOV DPL,A ;NOW POINT TO START POINT
RSAID2:
MOVX A,@DPTR
PUSH DPH ;
PUSH DPL
MOV DPTR,#DAC
MOVX @DPTR,A
; DELAY
MOV R7,#50
RSAID11:
DJNZ R7,RSAID11
POP DPL
POP DPH
INC DPL
MOV A,DPL
JNZ RSAID7
INC DPH
MOV A,DPH
CLR C
SUBB A,R1
XRL A,#20H ;R1=0RG #ROM'S DPH
JNZ RSAID7
MOV DPH,R1
INC 48H
MOV A,48H
XRL A,#MAXBANK
JZ XRSAID
LCALL ROMBANK
LCALL ROMAREA
;
RSAID7:
DJNZ R5,RSAID2
DJNZ R6,RSAID2
;
XRSAID:
SETB EA
RET
DIALLOCK:
LCALL NUM_REC
JZ XOUTNUM
;LCALL LCDST
LCALL REC_BFA
MOV DPTR,#MSG66
LCALL LCDMSG
LCALL REC_SHOW
MOV A,#32
LCALL LCDST
MOV A,#32
LCALL LCDST
MOV TL1,#0
XOUTNUM:
RET
DB "~08~"
NUM_REC:
; NUMBER RECEIVER, RECIEVE 0-9,#*,ABCD, IF A=0 THEN NO TONE RECEIVE
; FREE
ORL P1,#10000000B MAKE P1 AS INPUT
MOV A,P1
ANL A, #10000000B MASK EXCEPT BIT7 ;IRQ
JZ NUM_OK
MOV A,#0
RET
;
NUM_OK:
PUSH DPH
PUSH DPL
MOV 31H,#MAXTIME
MOV DPTR,#DREG ;CLEAR IRQ
MOVX A,@DPTR
MOV DPTR,#DTMF
MOVX A,@DPTR
ANL A,#00001111B ;MASK
MOV DPTR,#TONE
MOVC A,@A+DPTR ;GET KEY FROM MAP
POP DPL
POP DPH
RET
SUB07:
DB "~07~"
ONMIC:
;ON MIC FOR A TIME AND OFF
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#RELAY
SETB 75H
MOV A,2EH
MOVX @DPTR,A
LCALL WAITKEY
MOV DPTR,#RELAY
CLR 75H
MOV A,2EH
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
SUB06:
DB "~06~"
;---DIALTONE GENERATOR-------
; LOAD A WITH 0-9,#*,ABCD AND CALL THIS
DIALONE: ;R_FREE,DPTR FREE
PUSH DPH
PUSH DPL
LCALL TB_DIAL ;CONVERT TO DTMF CODE, IF A=#16 NO DIAL
CJNE A,#16,DIALONE2
MOV 12H,#200 ;200MS
LCALL DL_200M
LCALL DL_200M
LCALL DL_200M
LCALL DL_200M
LCALL DL_200M
AJMP XDIALONE
DIALONE2:
MOV DPTR,#DTMF
MOVX @DPTR,A
MOV DPTR,#DREG
MOV A,#00000101B
MOVX @DPTR,A
MOV 12H,32H
LCALL DL_200M
MOV A,#00000100B
MOVX @DPTR,A
MOV 12H,33H
LCALL DL_200M
XDIALONE:
POP DPL
POP DPH
RET
SUB05:
DB "05~
OFFPHONE:
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#RELAY
SETB 71H ;OFF PHONE
MOV A,2EH
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
SUB04:
DB "~04~"
ONPHONE:
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#RELAY
CLR 71H ;ON PHONE
MOV A,2EH
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
SUB03:
DB "~03~"
OFFSPK:
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#RELAY
CLR 70H
MOV A,2EH
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
SUB02:
DB "~02~"
ONSPK:
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#RELAY
SETB 70H
MOV A,2EH
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
SUB01:
DB "~01~"
SPKONOFF:
;FREE
PUSH DPH
PUSH DPL
PUSH ACC
CPL 70H
MOV A,2EH
MOV DPTR,#RELAY
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
SUB0C:
DB "~0C~"
LONG_DL:
PUSH 12H
MOV 12H,#200
LCALL DL_200M
LCALL DL_200M
LCALL DL_200M
LCALL DL_200M
POP 12H
RET
;--------------------------
SUB0D:
DB "~0D~"
SHORT_DL:
PUSH 12H
MOV 12H,#200
LCALL DL_200M
LCALL DL_200M
POP 12H
RET
;=====LCD SUB=======================
SUB11:
DB "~11~"
LBEGIN1: ;HOME LINE #1
PUSH ACC
LCALL LCDWREG
MOV A,#10000000B ;SET DDRAM POSITION
LCALL LCDSTL
LCALL LCDWRAM
MOV 4CH,#0
POP ACC
RET
SUB13:
DB "~13~"
LBEGIN2: ;HOME LINE #2
PUSH ACC
LCALL LCDWREG
MOV A,#11000000B ;SET DDRAM POSITION
LCALL LCDSTL
LCALL LCDWRAM
MOV 4CH,#0
POP ACC
RET
SUB14:
DB "~14~"
CURSOR0: ;OFF CURSOR
PUSH ACC
LCALL LCDWREG
MOV A,#00001100B
LCALL LCDSTL
LCALL LCDWRAM
POP ACC
RET
SUB15:
DB "~15~"
CURSOR1: ; ON CURSOR
PUSH ACC
LCALL LCDWREG
MOV A,#00001110B ;ON DISPLAY
LCALL LCDSTL
LCALL LCDWRAM
POP ACC
RET
SUB16:
DB "~16~"
CURSOR2: ; ON CURSOR + BLINK
PUSH ACC
LCALL LCDWREG
MOV A,#00001111B ;ON DISPLAY & CURSOR+BLINK
LCALL LCDSTL
LCALL LCDWRAM
POP ACC
RET
SUB17:
DB "~17~"
ONLINE:
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#RELAY
SETB 71H OFFPHONE
SETB 73H HOOK
SETB 77H OFFCID
MOV A,2EH
MOVX @DPTR,A
MOV 12H,#100
LCALL DL_200M
POP ACC
POP DPL
POP DPH
RET
SUB18:
DB "~18~"
OFFLINE:
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#RELAY
CLR 70H ;OFFSPK
CLR 71H ;ONPHONE
CLR 73H ;OFFHOOK
MOV A,2EH
MOVX @DPTR,A
LCALL LONG_DL
MOV TL1,#0
POP ACC
POP DPL
POP DPH
RET
SET_CUR: ;SET CURSOR AT LCD POSITION, 1CH=LINE 1 OR TWO, 1DH=HORIZONTAL
PUSH ACC
LCALL LCDWREG
MOV A,#0
MOV A,1CH
CJNE A,#1,S_CUR1
MOV A,#64
S_CUR1:
ADD A,#128
ADD A,1DH
LCALL LCDSTL
LCALL LCDWRAM
MOV 4CH,1DH
POP ACC
RET
SENT:
SETB 1CH
MOV 14H,#0 ; SENT ON PAGE 0 ONLY
LCALL COUNT_C
LCALL LCLEAR2
MOV DPTR,#MSG11
LCALL LCDMSG
LCALL BTRIM
JZ X_SENT ;NO WORD IN PAGE
MOV 09H,A ;LAST LINE# ALL BLANK
LCALL WAITKEY
JB 09H,X_SENT
JB 19H,X_SENT
LCALL DIAL
X_SENT:
CLR 1CH
RET
CLEARIRQ:
PUSH DPH
PUSH DPL
MOV 12H,#2
LCALL DL_200M
MOV DPTR,#DREG
MOVX A,@DPTR ;CLEAR IRQ
POP DPL
POP DPH
RET
REC_BFB: ;接收緩沖退位
PUSH DPH
PUSH DPL
PUSH ACC
DEC 35H
MOV DPTR,#RECBF
MOV A,DPL
ADD A,35H
MOV DPL,A
MOV A,#13
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
SUB25:
DB "~25~"
MOVESTR:
;MOVE DATA FROM RAM STOP WITH CHR(13) TO RAM
;SETB 32 WILL CAUSE TARGET DATA ALSO END WITH CHR$(13)
;MOVE DPTR WITH TARGET ADDRESS, 1EH,1FH WITH SOURCE AND CALL THIS
;DPTR WILL CHANGE AFTER CALL
PUSH ACC
PUSH B
MOV A,#0
MOVESTR1:
PUSH DPH
PUSH DPL
MOV B,A
MOV DPH,1EH
MOV DPL,1FH
ADD A,DPL
MOV DPL,A
MOVX A,@DPTR
POP DPL
POP DPH
XRL A,#13
JZ XMOVESTR
XRL A,#13 ;RESTORE BACK TO OLD VALUE
MOVX @DPTR,A
MOV A,B
INC A
INC DPTR
AJMP MOVESTR1
XMOVESTR:
JNB 32H,XXRAM
MOV A,#13
MOVX @DPTR,A
CLR 32H
XXRAM:
POP B
POP ACC
RET
SUB24:
DB "~24~"
MOVEMEM:
;MOVE DATA FROM RAM TO RAM
;LOAD SOURCE WITH 1EH AND 1FH, THEN LOAD TARGET WITH DPTR
;LOAD LEN OF DATA TO 47H(ORG MAXCOL), AND CALL THIS
;MAX 256 CAN MOVE, IF NEED MOVE 256 BYTES, 47H=#0
;DPL NOT NEED TO BE START FROM 0
;DPTR WILL CHANGE AFTER CALL
PUSH ACC
PUSH B
MOV A,#0
MOVEMEM1:
PUSH DPH
PUSH DPL
MOV B,A
MOV DPH,1EH
MOV DPL,1FH
ADD A,DPL
MOV DPL,A
MOVX A,@DPTR
POP DPL
POP DPH
MOVX @DPTR,A
MOV A,B
INC A
INC DPTR
CJNE A,47H, MOVEMEM1
POP B
POP ACC
RET
PG4: ;NO USE
RET
ALERT:
MOV R6,#0
MOV R7,#9
LCALL GETMETER (USE R6,R7 AS RANGE BACK WITH B)
JB 12H,XALERT_1 ;NO METER
JB 1FH,XALERT_2 ;OUT OF RANGE
MOV A,B
JZ XALERT_1 ;A="0"
MOV 41H,B ;RING
MOV 13H,B
SETB 37H
SETB 2CH
RET
;
XALERT_1:
MOV 41H,#3 ;ORG VALUE
MOV 13H,#0
CLR 37H
SETB 2CH
RET
;
XALERT_2:
LCALL LCLEAR2
MOV DPTR,#MSG25
LCALL LCDMSG
SETB 08H
RET
MONITOR:
MOV DPTR,#MSG36
LCALL LCDMSG
CLR TR0 ;NO TIME LIMIT
LCALL ONCID
LCALL ONSPK
RET
REC_SHOW:
;SHOW RECEIVE DATA, RETURN A AS LAST CHARACTER
PUSH DPH
PUSH DPL
PUSH B
MOV B,#0
MOV DPTR,#RECBF
RECSHOW1:
MOVX A,@DPTR
XRL A,#13
JZ XRECSHOW
MOVX A,@DPTR
LCALL LCDST
MOV B,A
INC DPTR
JNB 36H,RECSHOW1
MOV 12H,#10
LCALL DL_200M
LCALL SAID
AJMP RECSHOW1
XRECSHOW:
MOV A,B
POP B
POP DPL
POP DPH
RET
RINGMSG:
LCALL CURSOR0
LCALL LBEGIN2
MOV A,17H
ADD A,#30H
LCALL LCDST
MOV DPTR,#MSG8
LCALL LCDMSG
MOV A,18H
;MOV B,#10
;DIV AB
ADD A,#30H
LCALL LCDST
MOV A,#32
LCALL LCDST
RET
SHOWRING: ;SHOW RING
;LCALL RINGMSG
MOV A,17H
XRL A,#1 ;FIRST RING
JNZ SHOWRING0
JB 2EH,SHOWRING0
LCALL CID
AJMP SHOWRING1
;
SHOWRING0:
MOV 12H,#200
LCALL DL_200M
LCALL DL_200M
LCALL DL_200M
;
SHOWRING1:
MOV A,13H
JZ SHOWRING3 ;NO ALERT IF RING REG 0
SHOWRING2:
MOV A,13H
DEC A
CLR C
SUBB A,17H ; IF A > #3 THEN C SET
JNC SHOWRING3
LCALL RECEIVER
;
SHOWRING3:
RET
SETDATE:
LCALL LCLEAR2
MOV DPTR,#MSG69
LCALL LCDMSG
LCALL KEY_CLR
LCALL SH_DATE
LCALL LCLEAR1
MOV DPTR,#MSG3_2
MOV 50H,DPH
MOV 51H,DPL
MOV 36H,#8
LCALL GET_ANS
JB 09H,X_SETDATE ;#27 PRESS; NO DO
MOV A,R0
CLR C
SUBB A,#KEYAREA ;NOW LEN OF CMD
JZ X_SETDATE
MOV R0,#KEYAREA ;START OF BF
MOV R1,#CLOCK
MOV R2,#6 ;SIX DIGIT
DATELOOP:
MOV A,@R0
CLR C
SUBB A,#30H
MOV @R1,A
MOV A,R0
XRL A,#KEYAREA+1
JNZ SETDATE2
INC R0
AJMP SETDATE3
SETDATE2:
MOV A,R0
XRL A,#KEYAREA+4
JNZ SETDATE3
INC R0
SETDATE3:
INC R0
INC R1
DJNZ R2,DATELOOP
LCALL WCLOCK
X_SETDATE:
LCALL LONG_DL
RET
SETTIME:
LCALL LCLEAR2
MOV DPTR,#MSG69
LCALL LCDMSG
LCALL KEY_CLR
LCALL SH_TIME
LCALL LCLEAR1
MOV DPTR,#MSG3_2
MOV 50H,DPH
MOV 51H,DPL
MOV 36H,#8
LCALL GET_ANS
JB 09H,X_SETTIME ;#27 PRESS; NO DO
MOV A,R0
CLR C
SUBB A,#KEYAREA ;NOW LEN OF CMD
JZ X_SETTIME
MOV R0,#KEYAREA ;START OF BF
MOV R1,#CLOCK+7
MOV R2,#6 ;SIX DIGIT
TIMELOOP:
MOV A,@R0
CLR C
SUBB A,#30H
CJNE R2,#6,SETTIME1
SETB ACC.3
SETTIME1:
MOV @R1,A
MOV A,R0
XRL A,#KEYAREA+1
JNZ SETTIME2
INC R0
AJMP SETTIME3
SETTIME2:
MOV A,R0
XRL A,#KEYAREA+4
JNZ SETTIME3
INC R0
SETTIME3:
INC R0
INC R1
DJNZ R2,TIMELOOP
LCALL WCLOCK
X_SETTIME:
LCALL LONG_DL
RET
SETDAY:
LCALL LCLEAR2
MOV DPTR,#MSG69
LCALL LCDMSG
LCALL KEY_CLR
LCALL SH_DAY
LCALL LCLEAR1
MOV DPTR,#MSG3_2
MOV 50H,DPH
MOV 51H,DPL
MOV 36H,#1
LCALL GET_ANS
JB 09H,X_SETDAY ;#27 PRESS; NO DO
MOV A,R0
CLR C
SUBB A,#KEYAREA ;NOW LEN OF CMD
JZ X_SETDAY
MOV R0,#KEYAREA ;START OF BF
MOV R1,#CLOCK+6
MOV A,@R0
CLR C
SUBB A,#30H
MOV @R1,A
LCALL WCLOCK
X_SETDAY:
LCALL LONG_DL
RET
SEARCHSUB: ;SEARCHING SUB ROUTINE ENTRY ADDRESS
;SETB 22,23 USE HERE FOR TEMPERARY USE
LCALL LCLEAR1
CLR 22H
CLR 23H
MOV DPH,#0
MOV DPL,#0
SEARCH0:
MOV A,#0
MOVC A,@A+DPTR
MOV B,A
XRL A,#126 ;"~"
JZ SUB_POINT
JNB 22H,SEARCH1
MOV A,B
LCALL CHECK_DIGIT
JB 10H,SEARCH4 ;A DIGIT
MOV A,B
LCALL CHECK_HEX
JNB 10H,SEARCH1 ;NOT A-F HEX
SEARCH4:
JB 23H, SECONDDIGIT
SETB 23H ;FIRST DIGIT GET
MOV R5,B
AJMP SEARCH1
;
SECONDDIGIT:
MOV R4,B
PUSH DPH
PUSH DPL
INC DPTR ;NEXT ADDRESS
MOV R7,DPH
MOV R6,DPL
POP DPL
POP DPH
LCALL SHOWADDRESS
CLR 22H
CLR 23H
AJMP SEARCH1
;
SUB_POINT:
INC DPTR
MOV A,#0
MOVC A,@A+DPTR
MOV B,A
XRL A,#126
JNZ SEARCH1
INC DPTR
MOV A,#0
MOVC A,@A+DPTR
MOV B,A
XRL A,#126
JNZ SEARCH1
SETB 22H
;
SEARCH1:
INC DPTR
MOV A,DPH
XRL A,#0A0H ;PROGRAM END
JZ XSEARCHSUB
LJMP SEARCH0
XSEARCHSUB:
LCALL LONG_DL
LCALL LONG_DL
LCALL LONG_DL
LCALL LONG_DL
LCALL LONG_DL
RET
SHOWADDRESS: ;R4,R5 CONTAIN
;LJMP OP CODE=02H
;02H+ADDRESS JMP
;SUB ROUTINE INDEX PUT AT BANK0 OF FLASH MEMORY #2 USING Y5
MOV A,R5
LCALL LCDST
MOV A,R4
LCALL LCDST
MOV A,#3DH ;"="
LCALL LCDST
MOV A,R7
LCALL HEXSHOW
MOV A,R6
LCALL HEXSHOW
MOV A,#32
LCALL LCDST
LCALL LONG_DL
RET
CHECK_HEX: ; SETB 10H IF A-F AND CONVERT "A" TO VALUE 10
CLR 10H
PUSH B
MOV B,A
CLR C
SUBB A,#65 ;"A"
JC XCHECK_HEX ;<A
MOV A,#70
CLR C
SUBB A,B
JC XCHECK_HEX
SETB 10H
MOV A,B
CLR C
SUBB A,#55
XCHECK_HEX:
POP B
RET
;--------------------------
ROMAREA: ;CHANGE Y5,OR Y5, TWO FLASH USING SAME SOCKET
JB 39H,ROMAREA1
MOV DPTR,#SOUNDROM
MOV 4DH,DPH
MOV 4EH,DPL
RET
ROMAREA1:
MOV DPTR,#DATAROM
MOV 4DH,DPH
MOV 4EH,DPL
RET
FLASHADDMSG:
MOV DPTR,#MSG78
LCALL LCDMSG
MOV A,48H
LCALL HEXSHOW
MOV DPTR,#MSG79
LCALL LCDMSG
MOV A,49H
LCALL HEXSHOW
RET
DATABANK:
;TO STORE TELEPHONE TO NAME DATA
;STRUCTURE: MAXTELEPHONE 86 512X 12345678 16BYTE
; SECOND NUMBERxx xxxX xxxxxxxx 16BYTE
; CHIP HUA HARDWARE S PTE LTD 32BYTE
; ONE NAME 64BYTE
;ADDRESS: BLK 839,#11-303,WOODLAND ST 82 32
; SINGAPORE 1231 32
;4096*2/128*16=1024 ONE THOUSAND NAME
SETB 0FH ;DATABANK
MOV 48H,#0 ;START FROM BANK0
MOV 49H,#1 ;START FROM SECTOR1
CLR 20H
LCALL REC_CLR
LCALL REC_TAB
LCALL LCLEAR2
DATABANK1:
LCALL DATALINE1
JB 09H, XDATABANK
JB 19H, XDATABANK
MOV A,#0
LCALL SAVE_ANS
DATABANK2:
LCALL DATALINE2
JB 09H, DATABANK1
JB 19H, XDATABANK
MOV A,#32
LCALL SAVE_ANS
DATABANK3:
LCALL DATALINE3
JB 09H, DATABANK2
JB 19H, XDATABANK
MOV A,#48
LCALL SAVE_ANS
DATABANK4:
LCALL DATALINE4
JB 09H, DATABANK3
JB 19H, XDATABANK
MOV A,#64
LCALL SAVE_ANS
DATABANK5:
LCALL DATALINE5
JB 09H, DATABANK4
JB 19H, XDATABANK
MOV A,#96
LCALL SAVE_ANS
;
LCALL CONFIRMATION
JB 09H, DATABANK5
JB 19H, XDATABANK
XRL A,#89 ;"Y" ;TEST A
JNZ LDATABANK
LCALL FINDNSAVE
LDATABANK:
LJMP DATABANK
XDATABANK:
CLR 0FH
RET
DATALINE1:
MOV 1CH,#0 ;DATALINE#
MOV 1DH,#0 ;FIX
;
MOV 14H,#0
MOV DPTR,#MSG70
MOV 50H,DPH
MOV 51H,DPL
MOV 36H,#32
MOV A,14H
LCALL LOAD_ANS
LCALL GET_ANS
RET
DATALINE2:
INC 1CH
INC 1DH
MOV 14H,#32
MOV DPTR,#MSG71
MOV 50H,DPH
MOV 51H,DPL
MOV 36H,#16
MOV A,14H
LCALL LOAD_ANS
LCALL GET_ANS
RET
DATALINE3:
INC 1CH
INC 1DH
MOV 14H,#48
MOV DPTR,#MSG72
MOV 50H,DPH
MOV 51H,DPL
MOV 36H,#16
MOV A,14H
LCALL LOAD_ANS
LCALL GET_ANS
RET
DATALINE4:
INC 1CH
INC 1DH
MOV 14H,#64
MOV DPTR,#MSG73
MOV 50H,DPH
MOV 51H,DPL
MOV 36H,#32
MOV A,14H
LCALL LOAD_ANS
LCALL GET_ANS
RET
DATALINE5:
INC 1CH
INC 1DH
MOV 14H,#96
MOV DPTR,#MSG74
MOV 50H,DPH
MOV 51H,DPL
MOV 36H,#32
MOV A,14H
LCALL LOAD_ANS
LCALL GET_ANS
RET
CONFIRMATION:
INC 1CH
INC 1DH
CLR 20H ;PUT TO LEFT
MOV 14H,#0
LCALL RECTOFLASH
LCALL LCLEAR2
MOV DPTR,#MSG76
LCALL LCDMSG
LCALL MAKESURE
RET
RECTOFLASH:
MOV A,#32
LCALL FILL_BF
MOV DPTR,#RECBF ;SOURCE
MOV R7,#0
RECTOFLASH1: ;KILL #13
MOVX A,@DPTR
XRL A,#13
JNZ RECTOFLASH2
MOV A,#32
MOVX @DPTR,A
RECTOFLASH2:
INC DPTR
DJNZ R7,RECTOFLASH1
MOV DPTR,#RECBF ;SOURCE
MOV 1EH,DPH
MOV 1FH,DPL
MOV DPTR,#FLASH_BF ;TARGET
MOV DPL,14H
MOV 47H,#128 ;DATA LEN
LCALL MOVEMEM
RET
UPSEARCH:
LCALL SECTOR_UP
LCALL READROM
LCALL SHOW_DATA
LCALL REV_CUR
LCALL SEARCHALL
RET
DOWNSEARCH:
LCALL SECTOR_DN
LCALL READROM
LCALL SHOW_DATA
LCALL REV_CUR
LCALL SEARCHALL
RET
SECTOR_UP:
PUSH ACC
CLR 0AH
JNB 20H,SECTOR_UP0
CLR 20H
AJMP XSECTOR_UP
SECTOR_UP0:
MOV A,49H
XRL A,#1
JNZ SECTOR_UP3
MOV A,48H
JNZ SECTOR_UP2
SETB 0AH ;NOT FOUND
AJMP XSECTOR_UP
SECTOR_UP2:
DEC 48H
MOV 49H,#31
SETB 20H
AJMP XSECTOR_UP
SECTOR_UP3:
DEC 49H
SETB 20H
XSECTOR_UP:
POP ACC
RET
SECTOR_DN:
PUSH ACC
CLR 0AH
JB 20H,SECTOR_DN0
SETB 20H
AJMP XXSECTOR_DN
;
SECTOR_DN0:
MOV A,49H
XRL A,#31 ;31 ;MAXSECTOR
JZ SECTOR_DN9 ;LAST
INC 49H
CLR 20H
AJMP XXSECTOR_DN
SECTOR_DN9:
MOV A,48H
XRL A,#8-1 ;15 ;MAXBANK-1
JZ XSECTOR_DN
INC 48H
MOV 49H,#1 ;RESERVE LINE 1
CLR 20H
AJMP XXSECTOR_DN
XSECTOR_DN:
SETB 0AH ;BOTTOM
XXSECTOR_DN:
POP ACC
RET
SEARCHALL:
LCALL KRELEASE
JB 3AH,SEARCHALLUP
LCALL SECTOR_DN
AJMP SEARCHALLDN
SEARCHALLUP:
LCALL SECTOR_UP
SEARCHALLDN:
JB 0AH,XSEARCHALL
LCALL SEARCHDATA
LCALL KEYPRESS
JB 28H,XXXSEARCHALL
JB 0BH,SEARCHALL ;DATA NOT SAME
LCALL READROM
JB 3BH,XXXSEARCHALL ;NO DISPLAY
LCALL SHOW_DATA
XXSEARCHALL:
LCALL REV_CUR
XXXSEARCHALL:
RET
;
XSEARCHALL:
SETB 26H ;NOT FOUND
JB 3BH,XSEARCHMSG3
LCALL LCLEAR2
JB 3AH, XSEARCHMSG1
MOV DPTR,#MSG83
AJMP XSEARCHMSG2
XSEARCHMSG1:
MOV DPTR,#MSG82
XSEARCHMSG2:
LCALL LCDMSG
LCALL REV_CUR
XSEARCHMSG3:
RET
SEARCHDATA:
CLR 0BH ;SAME
MOV 1CH,1DH ;RESTORE
MOV A,1DH ;RESTORE 14H FROM LINE#(FIX VALUE)
MOV DPTR,#TAB00
MOVC A,@A+DPTR
MOV 14H,A
PUSH 14H
JNB 20H,SEARCHDATA0
MOV A,14H
ADD A,#128
MOV 14H,A
SEARCHDATA0:
MOV A,R0
CLR C
SUBB A,#KEYAREA ;LEN OF ANS
JZ XSEARCHDATA
; A=LEN OF READ
LCALL READROMQUICK ;FLASH_BF
MOV DPTR,#FLASH_BF
MOV R0,#KEYAREA
SEARCHDATA1:
MOV A,@R0
MOV B,A
XRL A,#13
JZ XSEARCHDATA
MOVX A,@DPTR
XRL A,B
JZ SEARCHDATA3
SETB 0BH ;ERROR
SEARCHDATA3:
INC R0
INC DPTR
AJMP SEARCHDATA1
XSEARCHDATA:
POP 14H
RET
RIGHTMOVE:
RET
LEFTMOVE:
RET
SAVE_ANS: ;SAVE REC DATA TO RECBF AT FIX LOCATION AND NO CHR$(13)
; A=LOCATION START
MOV DPTR,#RECBF
ADD A,DPL
MOV DPL,A
MOV R0,#KEYAREA
SAVE_ANS1:
MOV A,@R0
XRL A,#13
JZ XSAVE_ANS
XRL A,#13
MOVX @DPTR,A
INC DPL
INC R0
AJMP SAVE_ANS1
;
XSAVE_ANS:
MOV A,#13
MOVX @DPTR,A
RET
LOAD_ANS: ;SAVE REC DATA TO RECBF AT FIX LOCATION AND NO CHR$(13)
; A=LOCATION START
MOV DPTR,#RECBF
ADD A,DPL
MOV DPL,A
MOV R0,#KEYAREA
LOAD_ANS1:
MOVX A,@DPTR
XRL A,#13
JZ XLOAD_ANS
XRL A,#13 ;RESTORE
MOV @R0,A
INC DPL
INC R0
AJMP LOAD_ANS1
;
XLOAD_ANS:
MOV A,#13
MOV @R0,A
RET
SHOW_DATA:
LCALL LCLEAR2
MOV DPTR,#FLASH_BF
MOV A,#0
JNB 20H,SHOW_DATA0
MOV A,#128
SHOW_DATA0:
ADD A,14H
MOV DPL,A
MOV R7,#MAXWIDTH
JNB 25H,SHOW_DATA1
PUSH DPH
PUSH DPL
MOV A,1CH
MOV DPTR,#TAB01
MOVC A,@A+DPTR
MOV R7,A
POP DPL
POP DPH
SHOW_DATA1:
MOVX A,@DPTR
LCALL LCDST
INC DPL
DJNZ R7,SHOW_DATA1
XSHOW_DATA:
RET
CLEANDATA:
;SET ALL FLASH TO " "
;TOTAL 16 BANK SET TO 48H
;TOTAL 32 SECTORS EACH SECTOR=256 BYTES 32*256=8192
;PROGRAM A SECTOR NEED 10MS, I GIVE 20MS
LCALL LCLEAR2
MOV DPTR,#MSG77
LCALL LCDMSG
LCALL MAKESURE
JB 09H, XCLEANDATA
JB 19H, XCLEANDATA
XRL A,#89 ;"Y"
JNZ XCLEANDATA
MOV A,#32
LCALL FILL_BF ;FILL FLASH_BF WITH SPACE
MOV DPTR,#FLASH_BF
MOV DPL,#0
MOV A,#2AH ;"*"
MOVX @DPTR,A ;WRITE "*" TO FIRST BYTE OF FLASH_BF
INC DPTR
MOV A,#30H ;"0"
MOVX @DPTR,A
;
MOV DPL,#128
MOV A,#2AH ;"*"
MOVX @DPTR,A ;WRITE "*" TO HALF BYTE OF FLASH_BF
INC DPTR
MOV A,#31H ;"1"
MOVX @DPTR,A
;
MOV 48H,#0 ;BANK 0
MOV R7,#HALFBANK ;HALF MAXBANK
CLEANDATA1:
MOV 49H,#1 ;SECTOR 1
MOV R6,#31 (32*256=8K)
CLEANDATA2:
LCALL LCLEAR2
LCALL FLASHADDMSG
LCALL WRITEROM
MOV 12H,#200 ;20MS IF 12MHZ
LCALL DL_200M
INC 49H
DJNZ R6,CLEANDATA2
INC 48H
DJNZ R7,CLEANDATA1
XCLEANDATA:
RET
FINDNSAVE:
;FIND EMPTY PLACE TO STORE DATA
;ERASE ALL DATA WITH SPACE
MOV 48H,#0 ;BANK 0
MOV R7,#HALFBANK ;#8
FINDNSAVE1:
MOV 49H,#1 ;SECTOR 0
MOV R6,#MAXSECTOR-1 (32*256=8K)
FINDNSAVE2:
;
MOV A,#1 ;ONE CHR
MOV 14H,#0 ;LEFT
LCALL READROMQUICK
MOV DPTR,#FLASH_BF
MOVX A,@DPTR
XRL A,#2AH ;"*"
JZ SAVEDATA
;
MOV A,#1 ;ONE CHR
MOV 14H,#128 ;RIGHT
LCALL READROMQUICK
MOV DPTR,#FLASH_BF
MOVX A,@DPTR
XRL A,#2AH ;"*"
JZ SAVEDATA
;
INC 49H
DJNZ R6,FINDNSAVE2
INC 48H
DJNZ R7,FINDNSAVE1
XFINDNSAVE:
LCALL LCLEAR2
MOV DPTR,#MSG80
LCALL LCDMSG
LCALL LONG_DL
RET
SAVEDATA:
LCALL READROM ;RESTORE BUFFER
MOV DPTR,#RECBF ;SOURCE
MOV 1EH,DPH
MOV 1FH,DPL
MOV DPTR,#FLASH_BF ;TARGET
MOV DPL,14H
MOV 47H,#128 ;DATA LEN
LCALL MOVEMEM
LCALL WRITEROM
LCALL LCLEAR2
MOV DPTR,#MSG81
LCALL LCDMSG
LCALL FLASHADDMSG
LCALL LONG_DL
RET
DELETEDATA: ;YOU MUST MARKSURE EVERYTHING COMEBACK
LCALL LCLEAR1
MOV DPTR,#MSG84
LCALL LCDMSG
LCALL FLASHADDMSG
MOV DPTR,#MSG85
LCALL LCDMSG
LCALL MAKESURE
JB 09H,XDELETEDATA
JB 19H,XDELETEDATA
XRL A,#89 ;"Y"
JNZ XDELETEDATA
LCALL READROM
MOV DPTR,#FLASH_BF
JNB 20H,DELETEDATA1
MOV DPL,#128
DELETEDATA1:
MOV A,#2AH
MOVX @DPTR,A
LCALL LCLEAR1
LCALL FLASHADDMSG
MOV A,#32
LCALL LCDST
MOV DPTR,#MSG84
LCALL LCDMSG
LCALL WRITEROM
LCALL LONG_DL
XDELETEDATA:
LCALL LCLEAR1
LCALL KEY_CLR
LCALL KEYPREFIX
LCALL REV_CUR
CLR 19H
RET
MAKESURE:
LCALL KRELEASE
SETB 79H ;SURE CAP
CLR 19H ;TIMEOUT
CLR 28H
MOV 31H,#MAXTIME
MAKESURE1:
LCALL GETKEY
JB 28H,MAKESURE2
JB 19H,XMAKESURE
LJMP MAKESURE1
MAKESURE2:
LCALL LCDST
XMAKESURE:
RET
SHOWNAME: ;FOR CALLER ID NAME DISPLAY
SETB 0FH ;DATABANK
SETB 39H
MOV 48H,#0 ;START FROM BANK0
MOV 49H,#1 ;START FROM SECTOR1
CLR 20H
CLR 26H ;ENABLE SEARCH
CLR 3AH ;SEARCHDN
MOV 1CH,#1 ;SEARCH FROM FIELD#2
MOV 1DH,#1 ;SEARCH FROM FIELD#2
SETB 3BH ;DON'T SHOW DATA
LCALL SEARCHALL ;DATA
CLR 3BH
JB 0AH,SHOWNAME1
SETB 25H
MOV 1CH,#0 ;SHOW FIELD#1
MOV 14H,#0
LCALL SHOW_DATA
CLR 25H
AJMP XSHOWNAME
SHOWNAME1:
MOV 48H,#0 ;START FROM BANK0
MOV 49H,#1 ;START FROM SECTOR1
CLR 20H
CLR 26H ;ENABLE SEARCH
MOV 1CH,#2 ;SEARCH FROM FIELD#3
MOV 1DH,#2 ;SEARCH FROM FIELD#3
SETB 3BH
LCALL SEARCHALL ;DATA
CLR 3BH
JB 0AH,XSHOWNAME0
SETB 25H
MOV 1CH,#0 ;SHOW FIELD#1
MOV 14H,#0
LCALL SHOW_DATA
AJMP XSHOWNAME
XSHOWNAME0:
LCALL LCLEAR2
MOV DPTR,#MSG86
LCALL LCDMSG
XSHOWNAME:
CLR 39H
CLR 0FH
RET
|