找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2700|回复: 9
打印 上一主题 下一主题
收起左侧

8052单片机制作台式通讯机

[复制链接]
跳转到指定楼层
楼主
这是我早些年制作台时通信设备是写的代码,其中包括许多外部元件如实时时钟,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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:609550 发表于 2022-5-12 11:09 | 只看该作者
楼主高能!佩服,佩服!
回复

使用道具 举报

板凳
ID:283954 发表于 2022-5-12 23:41 | 只看该作者
masdz 发表于 2022-5-12 11:09
楼主高能!佩服,佩服!

这玩意儿现在没有什么用了,但代码还是可以作为参考,我已经忘记是怎样做“人机互动”了哈。








回复

使用道具 举报

地板
ID:699945 发表于 2022-5-14 16:20 | 只看该作者
竟然是汇编写的,牛
回复

使用道具 举报

5#
ID:283954 发表于 2022-5-14 19:42 | 只看该作者
r121 发表于 2022-5-14 16:20
竟然是汇编写的,牛

汇编好!什么都看得见,所有错误都是自己犯的,不会有语法错误造成的困扰。
回复

使用道具 举报

6#
ID:78271 发表于 2022-5-15 21:55 | 只看该作者
汇编写的,真不错,记得刚开始接触51时,也爱看汇编程序,
回复

使用道具 举报

7#
ID:25231 发表于 2022-5-18 23:39 | 只看该作者
老前辈汇编写的nb
回复

使用道具 举报

8#
ID:744744 发表于 2022-5-23 12:21 来自手机 | 只看该作者
一句也看不懂
回复

使用道具 举报

9#
ID:200118 发表于 2022-6-16 16:33 | 只看该作者
汇编写得好。
回复

使用道具 举报

10#
ID:454811 发表于 2022-6-17 16:29 | 只看该作者
刚接触单片机的时候也是用汇编,自从接触了C,再也不用汇编了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表