單片機源程序
;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
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
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
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
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: ;鍵盤重復(fù)
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
;-------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
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
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 ;關(guān)中斷
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
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
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
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
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
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
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
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
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
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
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 ;清除接收中斷旗標(biāo)
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
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 ;接受資料
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
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
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
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
;------------------------
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
;--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
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
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
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
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
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
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