; FILENAME R2D2BN.ASM V3.0 ; DESCRIPTION 89C51RD2BN LOADER (CLOCK 11.0592 MHz) ??? ; ASSEMBLER SXA51 ; START-DATE 23/06/43 ; LAST-DATE 26/02/47 ; SOFTWARE ENG KRIANGSAK B. ; COMPANY SILA RESEARCH CO.,LTD. ; TEL 02-712-2850 FAX 02-381-1447 ; ********** VARIABLE SET ********** BRAT24 EQU 0E8H ;2400 (x2) BRAT48 EQU 0F4H ;4800 (x2) BRAT96 EQU 0FAH ;9600 (x2) BRAT19 EQU 0FDH ;19200 (x2) PGMMTP EQU 0FFF0H ;89C51RD2 SUBROUTINE FCLOCK EQU 11 ;11.0592 MHz ??? ; ********** INTERNAL RAM ********** ORG 0060H BAUDM1: DS 1 ;BAUD-RATE MEMORY X1 BAUDM2: DS 1 ;BAUD-RATE MEMORY X2 DS 3 ;RESERVE BB: DS 1 ;REG BB (REPLACE REG B) BBACK: DS 1 ;REG B BACKUP STTADD: DS 2 ;START ADDRESS ENDADD: DS 2 ;END ADDRESS IXDATA: DS 2 ;GENERAL DATA IYDATA: DS 2 ;GENERAL DATA INPADD: DS 1 ;INPUT BUFFER ADDRESS MEMORY INPBUF: DS 16 ;INPUT BUFFER INPEND: ORG 00DFH SYSSTK: DS 1 DS 32 ENDSTK: ;**** USE B REG AS SYSTEM FLAG **** ERRFAG EQU 0F0H ;ERROR FLAG OPTFAG EQU 0F1H ;OPTION (X) FLAG HEXFAG EQU 0F2H ;HEX FLAG ENDFAG EQU 0F3H ;END FLAG DATAFG EQU 0F4H ;DATA MEMORY FLAG (D,L,P,X COMMAND) LCKFAG EQU 0F5H ;LOCK FLAG FX2FAG EQU 0F6H ;FX2 FLAG GENFAG EQU 0F7H ;GENERAL FLAG ; ********** RESET ************ ORG 0C000H ;TEST RES: MOV A,0A2H ;SET ENBOOT=1 OF 89C51RD2 SETB ACC.5 MOV 0A2H,A WIN: MOV TMOD,#02H ;BOOT-ROM START PROGRAM MOV T2CON,#30H CLR A MOV TH2,A MOV TL2,A JNB RXD,$ JB RXD,$ SETB T2CON.2 JNB RXD,$ CLR T2CON.2 MOV A,TH2 ;CHECK CJNE A,#4,$+3 JNC WIN2 LJMP 0FC18H ;TO PHILIPS BOOT-ROM (WINISP) WIN2: MOV R0,#0FFH ;POWER UP CLEAR INT-RAM WIN21: MOV @R0,#0 DJNZ R0,WIN21 MOV SP,#SYSSTK ;SET STACK MOV B,#0 ;CLEAR SYSTEM FLAG MOV T2CON,#00H MOV TMOD,#20H ;TIMER1 MODE2 MOV SCON,#52H ;SERIAL 8 BIT UART MODE CJNE A,#9,$+3 JNC WIN3 MOV TH1,#BRAT19 ;38400 (19200 FOR SPEED X1) MOV BAUDM2,#38H MOV BAUDM1,#19H MOV A,PCON SETB ACC.7 ;SMOD BIT MOV PCON,A SJMP WINX WIN3: CJNE A,#13H,$+3 JNC WIN4 MOV TH1,#BRAT19 ;19200 MOV BAUDM2,#19H MOV BAUDM1,#96H SJMP WINX WIN4: CJNE A,#2CH,$+3 JNC WIN5 MOV TH1,#BRAT96 ;9600 MOV BAUDM2,#96H MOV BAUDM1,#48H SJMP WINX WIN5: CJNE A,#54H,$+3 JNC WIN6 MOV TH1,#BRAT48 ;4800 MOV BAUDM2,#48H MOV BAUDM1,#24H SJMP WINX WIN6: CJNE A,#0A1H,$+3 JNC WIN7 MOV TH1,#BRAT24 ;2400 MOV BAUDM2,#24H MOV BAUDM1,#12H SJMP WINX WIN7: LJMP RES WINX: SETB TR1 ;TIMER1 ON MOV R2,#1 CALL DTSEC CLR RI LJMP STAR ; ********** CHKS SUB ********** ; FIND CODE CHECKSUM ; OUT = R4,R5 CHKS: MOV DPH,#HIGH RES ;START MOV DPL,#LOW RES MOV R2,#HIGH ENDCODE MOV R3,#LOW ENDCODE MOV IYDATA,#0 ;START CHECKSUM MOV IYDATA+1,#0 CHK1: CLR A ;READ FROM CODE MOVC A,@A+DPTR CALL CHKINC CALL DPCOM JNZ CHK1 RET ; ********* STAR ********** ; START ROUTINE STARB1: DB "R2D2BN Sila Boot Loader v3.0 (89C51RD2BN)",0DH ;??? STARB2: DB " Chip ID. = ",0 STARB3: DB " Security = ",0 STARB4: DB "Vector = ",0 STARB5: DB "Status = ",0 STARB6: DB "Checksum = ",0 STARB7: DB "MCU Speed = x",0 STARB8: DB " Baud Rate = ",0 STAR: MOV BB,#22 ;CLEAR SCREEN STAR1: CALL SLF DJNZ BB,STAR1 MOV DPTR,#STARB1 ;FIRST MESSAGE CALL SBLOCK MOV DPTR,#STARB4 ;VECTOR CALL SBLOCK MOV R0,#FCLOCK MOV R1,#07H MOV DPTR,#2 CALL PGMMTP CALL SBYTEH MOV DPTR,#STARB2 ;CHIP-ID CALL SBLOCK MOV R0,#FCLOCK MOV R1,#00H MOV DPTR,#0 CALL PGMMTP CALL SBYTEH MOV A,#'-' CALL SBYTE MOV R0,#FCLOCK MOV R1,#00H MOV DPTR,#1 CALL PGMMTP CALL SBYTEH MOV R0,#FCLOCK MOV R1,#00H MOV DPTR,#2 CALL PGMMTP CALL SBYTEH CALL SLF MOV DPTR,#STARB5 ;STATUS CALL SBLOCK MOV R0,#FCLOCK MOV R1,#07H MOV DPTR,#1 CALL PGMMTP CALL SBYTEH MOV DPTR,#STARB3 ;SECURITY CALL SBLOCK MOV R0,#FCLOCK MOV R1,#07H MOV DPTR,#0 CALL PGMMTP CJNE A,#0EH,STAR4 SETB LCKFAG STAR4: CALL SBYTEH JNB LCKFAG,STAR5 MOV DPTR,#LCKTAB CALL SBLOCK STAR5: CALL SLF MOV DPTR,#STARB7 ;MCU SPEED CALL SBLOCK MOV R0,#FCLOCK MOV R1,#0 MOV DPTR,#3 CALL PGMMTP RLC A JC STAR6 MOV A,#'1' CALL SBYTE SJMP STAR7 STAR6: MOV A,#'2' CALL SBYTE SETB FX2FAG STAR7: MOV DPTR,#STARB8 ;BAUD RATE CALL SBLOCK MOV A,BAUDM2 JB FX2FAG,STAR71 MOV A,BAUDM1 STAR71: PUSH ACC CALL SBYTEH POP ACC CJNE A,#38H,STAR72 MOV A,#'4' CALL SBYTE SJMP STAR78 STAR72: CJNE A,#19H,STAR78 MOV A,#'2' CALL SBYTE STAR78: CLR A CALL SBYTEH CALL SLF MOV DPTR,#STARB6 ;CHECKSUM CALL SBLOCK CALL CHKS MOV A,IYDATA CALL SBYTEH MOV A,IYDATA+1 CALL SBYTEH CALL SLF CALL SLF SJMP MAIN LCKTAB: DB " (Lock All 3 Bit)",0 ; ********** MAIN ********** ; COMMAND PROMPT MAINB: MOV B,BBACK ;RETURN FROM USER PROGRAM MAIN: MOV A,#'-' ;PROMPT CALL SBYTE ;INPUT A CALL INPUT MOV INPADD,#INPBUF CALL NEXT CJNE R5,#0,$+6 LJMP MAIN ;NOTHING CJNE R5,#1,$+6 LJMP MAIN2 SJMP MAINE ;FIRST FIELD >1 CHAR MAIN2: MOV R0,INPADD ;LOOKUP COMMAND TABLE DEC R0 MOV A,@R0 ;COMMAND CHAR. CJNE A,#'B',$+6 LJMP BLANK CJNE A,#'C',$+6 LJMP CLEAR CJNE A,#'D',$+6 LJMP DISP CJNE A,#'E',$+6 LJMP ERASE CJNE A,#'F',$+6 LJMP ENT CJNE A,#'G',$+6 LJMP RUN CJNE A,#'H',$+6 LJMP HELP CJNE A,#'L',$+6 LJMP LOAD CJNE A,#'P',$+6 LJMP UPLOAD CJNE A,#'R',$+6 LJMP RAMSE CJNE A,#'S',$+6 LJMP LOCK CJNE A,#'X',$+6 LJMP CHECK CJNE A,#'I',$+6 LJMP IRAM CJNE A,#'Y',$+6 LJMP PROX CJNE A,#'Z',$+6 LJMP SPEED CJNE A,#'M',$+6 LJMP MORE CJNE A,#'N',$+6 LJMP NEW CJNE A,#'O',$+6 LJMP OUTP CJNE A,#'T',$+6 LJMP TESTP MAINE: MOV R0,INPADD ;**** ERROR **** (BACK-FIELD) MAINE1: DEC R0 CJNE R0,#INPBUF,$+6 ;IN = R0 (LAST COMMAND LINE) LJMP MAINE4 MOV A,@R0 CJNE A,#' ',MAINE1 MAINE2: MOV BB,#INPBUF ;NEXT-FIELD INC R0 MAINE3: CALL S1B DEC R0 MOV A,R0 CJNE A,BB,MAINE3 MAINE4: CALL S1B MOV DPTR,#MAINET CALL SBLOCK LJMP MAIN MAINET: DB "^ Error",0DH MAINEX: MOV R0,INPADD ;**** ERROR **** (NEXT FIELD) DEC R0 SJMP MAINE2 MAINDIS: MOV DPTR,#DISTAB CALL SBLOCK LJMP MAIN DISTAB: DB "Command Disable ... (Security Lock)",0DH ; ********** BLANK ********** ; BLANK CHECK BLANK: CALL CHEX JB ENDFAG,BLANK0 LJMP MAINE BLANK0: MOV DPTR,#0000H MOV R2,#01FH MOV R3,#0FFH CALL BLANKS MOV DPTR,#B0N JC BLANK01 MOV DPTR,#B0B BLANK01: CALL SBLOCK BLANK1: MOV DPTR,#2000H MOV R2,#03FH MOV R3,#0FFH CALL BLANKS MOV DPTR,#B1N JC BLANK11 MOV DPTR,#B1B BLANK11: CALL SBLOCK BLANK2: MOV DPTR,#4000H MOV R2,#07FH MOV R3,#0FFH CALL BLANKS MOV DPTR,#B2N JC BLANK21 MOV DPTR,#B2B BLANK21: CALL SBLOCK BLANK3: MOV DPTR,#8000H MOV R2,#0BFH MOV R3,#0FFH CALL BLANKS MOV DPTR,#B3N JC BLANK31 MOV DPTR,#B3B BLANK31: CALL SBLOCK LJMP MAIN B0B: DB "Block-0 0000-1FFFH (8K) Blank OK",0DH B0N: DB "Block-0 0000-1FFFH (8K) NOT Blank !!!",0DH B1B: DB "Block-1 2000-3FFFH (8K) Blank OK",0DH B1N: DB "Block-1 2000-3FFFH (8K) NOT Blank !!!",0DH B2B: DB "Block-2 4000-7FFFH (16K) Blank OK",0DH B2N: DB "Block-2 4000-7FFFH (16K) NOT Blank !!!",0DH B3B: DB "Block-3 8000-BFFFH (16K) Blank OK",0DH B3N: DB "Block-3 8000-BFFFH (16K) NOT Blank !!!",0DH BLANKS: CLR A ;CHECK SUBROUTINE MOVC A,@A+DPTR CJNE A,#0FFH,BLANKS2 INC DPTR CALL DPCOM JNZ BLANKS CLR C ;BLANK RET BLANKS2: SETB C ;NOT BLANK RET ; ********** MORE ********** ; BLANK CHECK (RD2BN) MORE: CALL CHEX JB ENDFAG,MORE0 LJMP MAINE MORE0: MOV DPTR,#M0 CALL SBLOCK MOV DPTR,#0000H MOV R2,#00FH MOV R3,#0FFH CALL BLANKS MOV DPTR,#MN JC MORE01 MOV DPTR,#MB MORE01: CALL SBLOCK MORE1: MOV DPTR,#M1 CALL SBLOCK MOV DPTR,#1000H MOV R2,#01FH MOV R3,#0FFH CALL BLANKS MOV DPTR,#MN JC MORE11 MOV DPTR,#MB MORE11: CALL SBLOCK MORE2: MOV DPTR,#M2 CALL SBLOCK MOV DPTR,#2000H MOV R2,#02FH MOV R3,#0FFH CALL BLANKS MOV DPTR,#MN JC MORE21 MOV DPTR,#MB MORE21: CALL SBLOCK MORE3: MOV DPTR,#M3 CALL SBLOCK MOV DPTR,#3000H MOV R2,#03FH MOV R3,#0FFH CALL BLANKS MOV DPTR,#MN JC MORE31 MOV DPTR,#MB MORE31: CALL SBLOCK MORE4: MOV DPTR,#M4 CALL SBLOCK MOV DPTR,#4000H MOV R2,#04FH MOV R3,#0FFH CALL BLANKS MOV DPTR,#MN JC MORE41 MOV DPTR,#MB MORE41: CALL SBLOCK MORE5: MOV DPTR,#M5 CALL SBLOCK MOV DPTR,#5000H MOV R2,#05FH MOV R3,#0FFH CALL BLANKS MOV DPTR,#MN JC MORE51 MOV DPTR,#MB MORE51: CALL SBLOCK MORE6: MOV DPTR,#M6 CALL SBLOCK MOV DPTR,#6000H MOV R2,#06FH MOV R3,#0FFH CALL BLANKS MOV DPTR,#MN JC MORE61 MOV DPTR,#MB MORE61: CALL SBLOCK MORE7: MOV DPTR,#M7 CALL SBLOCK MOV DPTR,#7000H MOV R2,#07FH MOV R3,#0FFH CALL BLANKS MOV DPTR,#MN JC MORE71 MOV DPTR,#MB MORE71: CALL SBLOCK MORE8: MOV DPTR,#M8 CALL SBLOCK MOV DPTR,#8000H MOV R2,#08FH MOV R3,#0FFH CALL BLANKS MOV DPTR,#MN JC MORE81 MOV DPTR,#MB MORE81: CALL SBLOCK MORE9: MOV DPTR,#M9 CALL SBLOCK MOV DPTR,#9000H MOV R2,#09FH MOV R3,#0FFH CALL BLANKS MOV DPTR,#MN JC MORE91 MOV DPTR,#MB MORE91: CALL SBLOCK MOREA: MOV DPTR,#MA CALL SBLOCK MOV DPTR,#0A000H MOV R2,#0AFH MOV R3,#0FFH CALL BLANKS MOV DPTR,#MN JC MOREA1 MOV DPTR,#MB MOREA1: CALL SBLOCK MOREB: MOV DPTR,#MX CALL SBLOCK MOV DPTR,#0B000H MOV R2,#0BFH MOV R3,#0FFH CALL BLANKS MOV DPTR,#MN JC MOREB1 MOV DPTR,#MB MOREB1: CALL SBLOCK LJMP MAIN M0: DB "Block-0 0000-0FFFH (4K)",0 M1: DB "Block-1 1000-1FFFH (4K)",0 M2: DB "Block-2 2000-2FFFH (4K)",0 M3: DB "Block-3 3000-3FFFH (4K)",0 M4: DB "Block-4 4000-4FFFH (4K)",0 M5: DB "Block-5 5000-5FFFH (4K)",0 M6: DB "Block-6 6000-6FFFH (4K)",0 M7: DB "Block-7 7000-7FFFH (4K)",0 M8: DB "Block-8 8000-8FFFH (4K)",0 M9: DB "Block-9 9000-9FFFH (4K)",0 MA: DB "Block-A A000-AFFFH (4K)",0 MX: DB "Block-B B000-BFFFH (4K)",0 MB: DB " Blank OK",0DH MN: DB " NOT Blank !!!",0DH ; ********** CLEAR ********** ; CLEAR DATA (0000-7FFFH) CLEAR: CALL CHEX JB ENDFAG,CLEAR1 LJMP MAINE CLEAR1: MOV DPTR,#0 CLEAR2: CLR A MOVX @DPTR,A INC DPTR MOV A,DPH CJNE A,#80H,CLEAR2 LJMP MAIN ; ********** DISP ********** ; DISPLAY CODE,DATA TO TERMINAL DISP: CLR DATAFG DISP1: CALL CHEX JB ENDFAG,DISPA ;AUTO ADDRESS JB OPTFAG,DISPO JB HEXFAG,DISP2 LJMP MAINE DISP2: MOV STTADD,R2 ;ADDR1 MOV STTADD+1,R3 CALL CHEX JB ENDFAG,DISPB JB HEXFAG,DISP3 LJMP MAINE DISP3: MOV ENDADD,R2 ;ADDR2 MOV ENDADD+1,R3 CALL CHEX JNB ERRFAG,DISP4 LJMP MAINE DISP4: JB ENDFAG,DISP5 LJMP MAINE DISP5: CALL DUMP LJMP MAIN DISPO: SETB DATAFG ;OPTION X (DATA MEMORY) LJMP DISP1 DISPA: MOV R2,STTADD ;AUTO ADDRESS MOV R3,STTADD+1 MOV DPTR,#127 CALL DPADD MOV ENDADD,DPH MOV ENDADD+1,DPL CALL DUMP LJMP MAIN DISPB: MOV R2,STTADD ;ADDR1 (AUTO ADDR2) MOV R3,STTADD+1 MOV DPTR,#127 CALL DPADD MOV ENDADD,DPH MOV ENDADD+1,DPL CALL DUMP LJMP MAIN ; ********** DUMP SUB ********** ; DUMP SUBROUTINE ; IN = STTADD START ADDRESS ; ENDADD FINAL ADDRESS ; REG = ALL DUMP: MOV A,STTADD ;PRINT ADDRESS CALL SBYTEH MOV A,STTADD+1 CALL SBYTEH MOV A,#':' CALL SBYTE CALL S1B MOV R6,#8 ;PRINT DATA IN HEX MOV DPH,STTADD MOV DPL,STTADD+1 CALL IXWR ;BACKUP ADDRESS DUMP3: CALL READS ;FIRST 8 BYTE HEX INC DPTR CALL DUMPHEX CALL S1B DJNZ R6,DUMP3 MOV A,#'-' CALL SBYTE CALL S1B MOV R6,#8 DUMP31: CALL READS ;SECOND 8 BYTE HEX INC DPTR CALL DUMPHEX CALL S1B DJNZ R6,DUMP31 CALL S1B CALL S1B MOV STTADD,DPH MOV STTADD+1,DPL MOV R6,#16 ;PRINT DATA IN ASCII CALL IXRD DUMP4: CALL READS INC DPTR JB LCKFAG,DUMP49 DUMP4X: CJNE A,#7FH,$+3 JNC DUMP40 ;=>7F CJNE A,#20H,$+3 JNC DUMP41 ;=>20 DUMP40: MOV A,#'.' CALL SBYTE SJMP DUMP42 DUMP41: CALL SBYTE DUMP42: DJNZ R6,DUMP4 CALL SLF CALL DPDEC MOV R2,ENDADD MOV R3,ENDADD+1 CALL DPCOM JC DUMP RET DUMP49: JB DATAFG,DUMP4X MOV A,#'?' CALL SBYTE SJMP DUMP42 DUMPHEX: JB LCKFAG,DUMPHEX1 DUMPHEX0:CALL SBYTEH RET DUMPHEX1:JB DATAFG,DUMPHEX0 MOV A,#'?' CALL SBYTE MOV A,#'?' CALL SBYTE RET ; ********** ERASE ********** ; ERASE ERASEZ: LJMP MAINDIS ERASE: JB LCKFAG,ERASEZ CALL CHEX JB HEXFAG,ERASE0 LJMP MAINE ERASE0: MOV IXDATA,R3 CALL CHEX JB ENDFAG,ERASE01 LJMP MAINE ERASE01: MOV A,IXDATA CJNE A,#0,ERASE1 MOV DPTR,#ERASEM0 CALL SBLOCK MOV R0,#FCLOCK MOV R1,#01H MOV DPH,#00H MOV DPL,#0 CALL PGMMTP LJMP MAIN ERASE1: CJNE A,#1,ERASE2 MOV DPTR,#ERASEM1 CALL SBLOCK MOV R0,#FCLOCK MOV R1,#01H MOV DPH,#20H MOV DPL,#0 CALL PGMMTP LJMP MAIN ERASE2: CJNE A,#2,ERASE3 MOV DPTR,#ERASEM2 CALL SBLOCK MOV R0,#FCLOCK MOV R1,#01H MOV DPH,#40H MOV DPL,#0 CALL PGMMTP LJMP MAIN ERASE3: CJNE A,#3,ERASEA MOV DPTR,#ERASEM3 CALL SBLOCK MOV R0,#FCLOCK MOV R1,#01H MOV DPH,#80H MOV DPL,#0 CALL PGMMTP LJMP MAIN ERASEA: CJNE A,#0AH,ERASE9 MOV DPTR,#ERASEMA CALL SBLOCK MOV R0,#FCLOCK MOV R1,#01H MOV DPH,#00H MOV DPL,#0 CALL PGMMTP MOV R0,#FCLOCK MOV R1,#01H MOV DPH,#20H MOV DPL,#0 CALL PGMMTP MOV R0,#FCLOCK MOV R1,#01H MOV DPH,#40H MOV DPL,#0 CALL PGMMTP MOV R0,#FCLOCK MOV R1,#01H MOV DPH,#80H MOV DPL,#0 CALL PGMMTP LJMP MAIN ERASE9: LJMP MAINE ERASEM0: DB "Erasing Block 0000-1FFFH (8K) ...",0DH ERASEM1: DB "Erasing Block 2000-3FFFH (8K) ...",0DH ERASEM2: DB "Erasing Block 4000-7FFFH (16K) ...",0DH ERASEM3: DB "Erasing Block 8000-BFFFH (16K) ...",0DH ERASEMA: DB "Erasing All 0000-BFFFH (48K) ...",0DH ; ********** NEW ********** ; NEW ERASE NEWZ: LJMP MAINDIS NEW: JB LCKFAG,NEWZ CALL CHEX JB HEXFAG,NEW0 LJMP MAINE NEW0: MOV IXDATA,R3 CALL CHEX JB ENDFAG,NEW01 LJMP MAINE NEW01: MOV A,IXDATA CJNE A,#0,NEW1 MOV A,#00H CALL NEWSB MOV R0,#FCLOCK MOV R1,#0CH MOV DPH,#00H MOV DPL,#0 CALL PGMMTP LJMP MAIN NEW1: CJNE A,#1,NEW2 MOV A,#10H CALL NEWSB MOV R0,#FCLOCK MOV R1,#0CH MOV DPH,#10H MOV DPL,#0 CALL PGMMTP LJMP MAIN NEW2: CJNE A,#2,NEW3 MOV A,#20H CALL NEWSB MOV R0,#FCLOCK MOV R1,#0CH MOV DPH,#20H MOV DPL,#0 CALL PGMMTP LJMP MAIN NEW3: CJNE A,#3,NEW4 MOV A,#30H CALL NEWSB MOV R0,#FCLOCK MOV R1,#0CH MOV DPH,#30H MOV DPL,#0 CALL PGMMTP LJMP MAIN NEW4: CJNE A,#4,NEW5 MOV A,#40H CALL NEWSB MOV R0,#FCLOCK MOV R1,#0CH MOV DPH,#40H MOV DPL,#0 CALL PGMMTP LJMP MAIN NEW5: CJNE A,#5,NEW6 MOV A,#50H CALL NEWSB MOV R0,#FCLOCK MOV R1,#0CH MOV DPH,#50H MOV DPL,#0 CALL PGMMTP LJMP MAIN NEW6: CJNE A,#6,NEW7 MOV A,#60H CALL NEWSB MOV R0,#FCLOCK MOV R1,#0CH MOV DPH,#60H MOV DPL,#0 CALL PGMMTP LJMP MAIN NEW7: CJNE A,#7,NEW8 MOV A,#70H CALL NEWSB MOV R0,#FCLOCK MOV R1,#0CH MOV DPH,#70H MOV DPL,#0 CALL PGMMTP LJMP MAIN NEW8: CJNE A,#8,NEW9 MOV A,#80H CALL NEWSB MOV R0,#FCLOCK MOV R1,#0CH MOV DPH,#80H MOV DPL,#0 CALL PGMMTP LJMP MAIN NEW9: CJNE A,#9,NEWA MOV A,#90H CALL NEWSB MOV R0,#FCLOCK MOV R1,#0CH MOV DPH,#90H MOV DPL,#0 CALL PGMMTP LJMP MAIN NEWA: CJNE A,#0AH,NEWB MOV A,#0A0H CALL NEWSB MOV R0,#FCLOCK MOV R1,#0CH MOV DPH,#0A0H MOV DPL,#0 CALL PGMMTP LJMP MAIN NEWB: CJNE A,#0BH,NEWE MOV A,#0B0H CALL NEWSB MOV R0,#FCLOCK MOV R1,#0CH MOV DPH,#0B0H MOV DPL,#0 CALL PGMMTP LJMP MAIN NEWE: LJMP MAINE NEWM1: DB "Erasing Block ",0 NEWM2: DB " (4K) ...",0DH NEWSB: PUSH ACC MOV DPTR,#NEWM1 CALL SBLOCK POP ACC PUSH ACC CALL SBYTEH CLR A CALL SBYTEH MOV A,#'-' CALL SBYTE POP ACC ORL A,#0FH CALL SBYTEH MOV A,#0FFH CALL SBYTEH MOV DPTR,#NEWM2 CALL SBLOCK RET ; ********** ENT ********** ; FILL DATA ENT: CALL CHEX CJNE R5,#0,$+6 LJMP MAINEX MOV STTADD,R2 MOV STTADD+1,R3 CALL CHEX JB ENDFAG,ENT2 LJMP MAINE ENT2: MOV DPH,STTADD MOV DPL,STTADD+1 CALL SBYTEW MOV A,#':' CALL SBYTE MOVX A,@DPTR CALL SBYTEH CALL S1B CALL INPUT MOV INPADD,#INPBUF CALL NEXT CJNE R5,#0,$+6 LJMP MAIN ;CR CJNE R4,#1,$+6 LJMP ENT8 ;NOT HEX CJNE R2,#0,ENT8 ;>1 BYTE MOV A,R3 PUSH ACC CALL NEXT POP ACC CJNE R5,#0,ENT8 MOV DPH,STTADD MOV DPL,STTADD+1 MOVX @DPTR,A ;WRITE INC DPTR MOV STTADD,DPH MOV STTADD+1,DPL SJMP ENT2 ENT8: MOV A,#'E' CALL SBYTE MOV A,#'r' CALL SBYTE MOV A,#'r' CALL SBYTE MOV A,#'o' CALL SBYTE MOV A,#'r' CALL SBYTE CALL SLF LJMP ENT2 ; ********** RUN (GO) ********** ; RUN USER PROGRAM RUN: CALL CHEX JB ENDFAG,RUN1 JB HEXFAG,RUN2 LJMP MAINE RUN1: MOV IXDATA,#0 ;DEFAULT ADDRESS=0000H MOV IXDATA+1,#0 SJMP RUN21 RUN2: MOV IXDATA,R2 MOV IXDATA+1,R3 RUN21: CALL CHEX JB ENDFAG,RUN3 LJMP MAINE RUN3: MOV DPH,IXDATA ;USER ADDRESS MOV DPL,IXDATA+1 CLR A MOVC A,@A+DPTR CJNE A,#0FFH,RUN4 MOV DPTR,#RUNER CALL SBLOCK LJMP MAIN RUN4: MOV BBACK,B ;B MEMO MOV A,#LOW MAINB ;FOR USER-RETURN PUSH ACC MOV A,#HIGH MAINB PUSH ACC PUSH DPL ;PC PUSH DPH RET ;GO RUNER: DB "Program BLANK ...",0DH ; ********** HELP ********** ; HELP COMMAND HELP: CALL CHEX JB ENDFAG,HELP1 LJMP MAINE HELP1: MOV DPTR,#HELPT HELP2: CLR A MOVC A,@A+DPTR INC DPTR CJNE A,#0,$+6 LJMP MAIN CJNE A,#0DH,$+6 LJMP HELP4 CALL SBYTE SJMP HELP2 HELP4: CALL SLF SJMP HELP2 HELPT: DB "R2D2BN v3.0",0DH ;??? DB "19 Commands Summary",0DH DB "Option [X] for Data Memory",0DH DB "------ Syntax ------ ---------- ------------ Description ------------",0DH DB "B Code Blank Check",0DH DB "C Data Clear (32K RAM 0000-7FFFH)",0DH DB "D [X] [addr] [addr] Code,Data Dump Memory",0DH DB "E block Code Erase (block 0-3,A=All)",0DH DB "F addr Data Fill Hex",0DH DB "G [addr] Code Go (Run)",0DH DB "H Help",0DH DB "I Internal RAM dump",0DH DB "L [X] [addr] Code,Data downLoad INTEL-HEX File from PC",0DH DB "M Code 4K Blank Check",0DH DB "N block Code 4K Erase (block 0-B)",0DH DB "O bit-port [0,1] Out Port (Except P30,P31)",0DH DB "P [X] range Code,Data uPload INTEL-HEX File to PC",0DH DB "R Data Ram Select (Internal,External)",0DH DB "S Security Lock (All 3 Bit)",0DH DB "T port Test Port (In)",0DH DB "X [X] range Code,Data Find Checksum",0DH DB "Y Set Flash Speed x2",0DH DB "Z [1,2] Set Current Speed x1,x2",0DH,0 ; ********** LOAD ********** ; DOWNLOAD INTEL-HEX FILE LOADZ: LJMP MAINDIS LOAD: JB LCKFAG,LOADZ CLR DATAFG LOAD0: CALL CHEX JB ENDFAG,LOAD3 JB HEXFAG,LOAD2 JB OPTFAG,LOAD1 LJMP MAINE LOAD1: SETB DATAFG SJMP LOAD0 LOAD2: MOV STTADD,R2 ;STEAM ADDRESS FROM COMMAND MOV STTADD+1,R3 MOV R6,#1 ;SET STEAM FLAG CALL CHEX JB ENDFAG,RECVX LJMP MAINE LOAD3: MOV STTADD,#0 ;CLEAR OFFSET ADDRESS MOV STTADD+1,#0 MOV R6,#0 ;CLEAR STEAM FLAG RECVX: MOV DPTR,#LOADM1 ;SHOW TEXT.. CALL SBLOCK ;SEND TEXT BLOCK CALL SBLOCK RECV0: CALL RBYTE ;FIRST BYTE CJNE A,#0DH,$+6 ;DON'T CARE 0DH LJMP RECV0 CJNE A,#0AH,$+6 ;DON'T CARE 0AH LJMP RECV0 CJNE A,#' ',$+6 ;DON'T CARE BLANK LJMP RECV0 CJNE A,#'O',$+6 LJMP RECVO CJNE A,#'S',$+6 LJMP RECVS CJNE A,#':',$+6 LJMP RECV11 SJMP RECVE RECV1: CALL RBYTE CJNE A,#':',RECV1 RECV11: MOV R7,#0 ;CLEAR CHECKSUM CALL RBYTEHC ;BYTE COUNT [OUT A HEX,R7=CHKS] MOV R5,A ;COUNTER CALL RBYTEHC MOV DPH,A ;ADDRESS HIGH CALL RBYTEHC MOV DPL,A ;ADDRESS LOW CALL RBYTEHC CJNE A,#00H,RECV8 ;END OF FILE CJNE R6,#1,RECV15 ;CHECK FIRST STEAM-OFFSET ADDRESS MOV R2,DPH MOV R3,DPL MOV DPH,STTADD MOV DPL,STTADD+1 CALL DPSUB MOV STTADD,DPH MOV STTADD+1,DPL MOV DPH,R2 MOV DPL,R3 MOV R6,#0 RECV15: MOV R2,STTADD ;OFFSET PROCESS MOV R3,STTADD+1 CALL DPADD RECV2: CALL RBYTEHC ;DATA LOOP CALL WRITES INC DPTR DJNZ R5,RECV2 MOV A,R7 ;CHECKSUM CPL A INC A MOV BB,A CALL RBYTEHC CJNE A,BB,RECVE CALL RBYTE ;CR CALL RBYTE ;LF SJMP RECV1 RECV8: MOV A,R7 ;END OF FILE CPL A INC A MOV BB,A CALL RBYTEH ;READ SERIAL ,OUT A CJNE A,BB,RECVE CALL RBYTE ;CR CALL RBYTE ;LF LJMP MAIN RECVE: MOV DPTR,#LOADME ;ERROR CALL SBLOCK LJMP MAIN RECVS: MOV R6,#1 ;STREAM RECEIVE RECVO: CALL RBYTEH ;OFFSET RECEIVE MOV STTADD,A ;ADDRESS HIGH CALL RBYTEH MOV STTADD+1,A ;ADDRESS LOW CALL RBYTE ;CR CALL RBYTE ;LF LJMP RECV0 LOADM1: DB "Download INTEL-HEX File",0DH LOADM2: DB "Please Send File form PC",0DH LOADME: DB "Download ERROR !",07H,0DH ; ********** UPLOAD ********** ; UPLOAD INTEL-HEX FILE UPLOADZ: LJMP MAINDIS UPLOAD: JB LCKFAG,UPLOADZ CLR DATAFG UPLOAD0: CALL CHEX ;ADDR1 JB HEXFAG,UPLOAD2 JB OPTFAG,UPLOAD1 LJMP MAINE UPLOAD1: SETB DATAFG SJMP UPLOAD0 UPLOAD2: MOV STTADD,R2 MOV STTADD+1,R3 CALL CHEX ;ADDR2 JB HEXFAG,UPLOAD3 LJMP MAINE UPLOAD3: MOV ENDADD,R2 MOV ENDADD+1,R3 CALL CHEX JB ENDFAG,UPLOAD4 LJMP MAINE UPLOAD4: MOV DPTR,#UPLDM1 ;MESSAGE CALL SBLOCK CALL SBLOCK CALL SBLOCK UPLOAD5: CALL RBYTE ;WAIT ENTER CJNE A,#0DH,UPLOAD5 MOV DPH,STTADD MOV DPL,STTADD+1 MOV R5,#0 ;CLEAR END FLAG SEND0: MOV R7,#0 ;START CHECK SUM MOV A,#':' ;FIRST BYTE CALL SBYTE CALL SENDC ;CHECK LOOP COUNTER MOV A,R6 CALL SBYTEHC MOV A,DPH CALL SBYTEHC ;ADDRESS MOV A,DPL CALL SBYTEHC CLR A CALL SBYTEHC ;00 SEND1: CALL READS CALL SBYTEHC ;DATA INC DPTR DJNZ R6,SEND1 MOV A,R7 ;CHECKSUM CPL A INC A CALL SBYTEH CALL SLF CJNE R5,#1,SEND0 MOV DPTR,#SENDTB ;END LINE CALL SBLOCK SEND4: CALL RBYTE CJNE A,#0DH,SEND4 LJMP MAIN SENDC: MOV A,DPH ;CHECK LINE LOOP XCH A,R2 MOV DPH,A MOV A,DPL XCH A,R3 MOV DPL,A MOV DPH,ENDADD MOV DPL,ENDADD+1 CALL DPSUB MOV A,DPH JNZ SENDC9 MOV A,DPL CJNE A,#0FH,$+6 LJMP SENDC8 JNC SENDC9 MOV R5,#1 ;LAST LINE (<10H LOOP) MOV R6,DPL INC R6 MOV DPH,R2 MOV DPL,R3 RET SENDC8: MOV R5,#1 ;LAST LINE (10H LOOP) SENDC9: MOV DPH,R2 ;10H LOOP MOV DPL,R3 MOV R6,#10H ;LOOP COUNTER RET SENDTB: DB ":00000001FF",0DH UPLDM1: DB "Upload INTEL-HEX File",0DH UPLDM2: DB "Please Set Cature=ON",0DH UPLDM3: DB "Type ENTER to Start & End",0DH ; ********** LOCK ********** ; SECURITY LOCK (ALL 3 BIT) LOCKZ: LJMP MAINDIS LOCK9: CALL SLF LJMP MAIN LOCK: CALL CHEX JB ENDFAG,LOCK1 LJMP MAINE LOCK1: JB LCKFAG,LOCKZ MOV DPTR,#LOCKM1 CALL SBLOCK CALL SBLOCK LOCK12: CALL RBYTE CJNE A,#0AH,$+6 LJMP LOCK12 CJNE A,#'Y',LOCK2 SJMP LOCK4 LOCK2: CJNE A,#'y',LOCK9 LOCK4: CALL SBYTE CALL SLF MOV R0,#FCLOCK ;BIT 1 MOV R1,#05H MOV DPTR,#0 CALL PGMMTP MOV R0,#FCLOCK ;BIT 2 MOV R1,#05H MOV DPTR,#1 CALL PGMMTP MOV R0,#FCLOCK ;BIT 3 MOV R1,#05H MOV DPTR,#2 CALL PGMMTP LOCK5: MOV DPTR,#LOCKM3 CALL SBLOCK SETB LCKFAG LJMP MAIN LOCKM1: DB "Security Lock (All 3 Bit) ...",0DH LOCKM2: DB "Please Confirm (Y) ",0 LOCKM3: DB "Lock OK ...",0DH ; ********** RAMSE ********** ; RAM SELECT RAMSE: CALL CHEX JB ENDFAG,RAMSE1 LJMP MAINE RAMSE1: MOV A,08EH ;AUXR SFR CPL ACC.1 MOV 08EH,A MOV DPTR,#RAMSEM1 JB ACC.1,RAMSE2 MOV DPTR,#RAMSEM2 RAMSE2: CALL SBLOCK LJMP MAIN RAMSEM1: DB "Select External",0DH RAMSEM2: DB "Select Internal (768 Byte in MCU) 000-2FFH",0DH ; ********** CHECK ********** ; FIND CHECKSUM CHECK: CLR DATAFG CALL CHEX ;ADDR1 JB OPTFAG,CHECK0 JB HEXFAG,CHECK1 LJMP MAINE CHECK0: SETB DATAFG CALL CHEX ;ADDR1 JB HEXFAG,CHECK1 LJMP MAINE CHECK1: MOV IXDATA,R2 MOV IXDATA+1,R3 CALL CHEX ;ADDR2 JB HEXFAG,CHECK12 LJMP MAINE CHECK12: MOV IYDATA,R2 MOV IYDATA+1,R3 CALL CHEX JB ENDFAG,CHECK13 LJMP MAINE CHECK13: MOV DPH,IXDATA MOV DPL,IXDATA+1 MOV R2,IYDATA MOV R3,IYDATA+1 CHECK2: MOV IYDATA,#0 ;FIND MOV IYDATA+1,#0 CHECK3: CALL READS CALL CHKINC CALL DPCOM JNZ CHECK3 CALL READS CALL CHKINC MOV A,IYDATA CALL SBYTEH MOV A,IYDATA+1 CALL SBYTEH CALL SLF LJMP MAIN CHKINC: ADD A,IYDATA+1 MOV IYDATA+1,A MOV A,IYDATA ADDC A,#0 MOV IYDATA,A INC DPTR RET CHKINCD: ADD A,IYDATA+1 ;NO INC DPTR MOV IYDATA+1,A MOV A,IYDATA ADDC A,#0 MOV IYDATA,A RET ; ********** IRAM ********** IRAM: CALL CHEX JB ENDFAG,IRAM1 LJMP MAINE IRAM1: MOV DPTR,#IRAMT1 ;FIRST 8 BYTE SHOW XX CALL SBLOCK MOV R0,#08H ;START ADDRESS SJMP IRAM5 IRAM2: MOV A,R0 ;PRINT ADDRESS CALL SBYTEH MOV A,#':' CALL SBYTE CALL S1B MOV R6,#8 ;PRINT DATA IN HEX IRAM3: MOV A,@R0 ;FIRST 8 BYTE HEX INC R0 CALL SBYTEH CALL S1B DJNZ R6,IRAM3 MOV A,#'-' CALL SBYTE CALL S1B IRAM5: MOV R6,#8 IRAM6: MOV A,@R0 ;SECOND 8 BYTE HEX INC R0 CALL SBYTEH CALL S1B DJNZ R6,IRAM6 CALL SLF CJNE R0,#0,IRAM2 MOV DPTR,#IRAMT2 CALL SBLOCK LJMP MAIN IRAMT1: DB "00: XX XX XX XX XX XX XX XX - ",0 IRAMT2: DB "User Area = 08-5FH and 80-DFH",0DH ; ********** PROX ********** ; SET FLASH SPEED X2 (FX2,6-Clock) PROXY: MOV DPTR,#PROXMY CALL SBLOCK LJMP MAIN PROXZ: LJMP MAINDIS PROX9: CALL SLF LJMP MAIN PROX: CALL CHEX JB ENDFAG,PROX1 LJMP MAINE PROX1: JB LCKFAG,PROXZ JB FX2FAG,PROXY MOV DPTR,#PROXM1 CALL SBLOCK CALL SBLOCK CALL SBLOCK CALL SBLOCK PROX12: CALL RBYTE CJNE A,#0AH,$+6 LJMP PROX12 CJNE A,#'Y',PROX2 SJMP PROX4 PROX2: CJNE A,#'y',PROX9 PROX4: CALL SBYTE CALL SLF MOV R0,#FCLOCK ;SPEED X2 MOV R1,#06H MOV DPH,#0 MOV DPL,#02H MOV A,#80H CALL PGMMTP MOV DPTR,#PROXM5 CALL SBLOCK SJMP $ PROXM1: DB "Set Flash Speed x2 (FX2,6-Clock) ...",0DH PROXM2: DB "! Back to Speed x1 (FX2,12-Clock)",0DH PROXM3: DB "! Use WinISP - Full Chip Erase",0DH PROXM4: DB "Please Confirm (Y) ",0 PROXM5: DB "Set OK ... Please Reset (Hardware)",0DH PROXMY: DB "Already Flash Speed x2",0DH ; ********** SPEED ********** ; SET CURRENT SPEED X1 X2 SPEEDZ: MOV DPTR,#PROXMY CALL SBLOCK MOV DPTR,#SPEEDM4 CALL SBLOCK LJMP MAIN SPEED: CALL CHEX JB HEXFAG,SPEED0 LJMP MAINE SPEED0: JB FX2FAG,SPEEDZ MOV IXDATA,R3 CALL CHEX JB ENDFAG,SPEED01 LJMP MAINE SPEED01: MOV A,IXDATA CJNE A,#1,SPEED1 ;SPEED X1 MOV 8FH,#0 MOV A,BAUDM1 CALL SPUP CALL SPSET MOV R2,#1 CALL DTSEC MOV DPTR,#SPEEDM1 CALL SBLOCK MOV DPTR,#SPEEDM3 CALL SBLOCK LJMP MAIN SPEED1: CJNE A,#2,SPEED9 ;SPEED X2 MOV 8FH,#01H MOV A,BAUDM1 CALL SPSET MOV R2,#1 CALL DTSEC MOV DPTR,#SPEEDM2 CALL SBLOCK MOV DPTR,#SPEEDM3 CALL SBLOCK LJMP MAIN SPEED9: LJMP MAINE SPEEDM1: DB "Set Current Speed x1",0 SPEEDM2: DB "Set Current Speed x2",0 SPEEDM3: DB " & Auto Change Buad Rate",0DH SPEEDM4: DB "Z Command Disable ...",0DH SPUP: CJNE A,#19H,SPUP1 ;**** SPEED UP **** MOV A,#38H RET SPUP1: CJNE A,#96H,SPUP2 MOV A,#19H RET SPUP2: CJNE A,#48H,SPUP3 MOV A,#96H RET SPUP3: CJNE A,#24H,SPUP4 MOV A,#48H RET SPUP4: CJNE A,#12H,SPUP5 MOV A,#24H SPUP5: RET SPSET: PUSH ACC ;**** RESET SPEED (X2) **** MOV A,PCON CLR ACC.7 ;CLEAR SMOD BIT MOV PCON,A POP ACC CJNE A,#24H,SPSET1 MOV TH1,#BRAT24 RET SPSET1: CJNE A,#48H,SPSET2 MOV TH1,#BRAT48 RET SPSET2: CJNE A,#96H,SPSET3 MOV TH1,#BRAT96 RET SPSET3: CJNE A,#19H,SPSET4 MOV TH1,#BRAT19 RET SPSET4: CJNE A,#38H,SPSET5 MOV TH1,#BRAT19 MOV A,PCON SETB ACC.7 ;SMOD BIT MOV PCON,A SPSET5: RET ; ********** OUTP ********** ; OUT PORT OUTP: CALL CHEX JB HEXFAG,OUTP1 LJMP MAINE OUTP1: MOV IXDATA,R3 CALL CHEX JB HEXFAG,OUTP2 LJMP MAINE OUTP2: MOV IXDATA+1,R3 CALL CHEX JB ENDFAG,OUTP21 LJMP MAINE OUTP21: MOV A,IXDATA+1 CJNE A,#0,OUTP3 SJMP OUTP5 OUTP3: CJNE A,#1,OUTP4 SJMP OUTP5 OUTP4: LJMP MAINE OUTP5: MOV C,ACC.0 MOV GENFAG,C MOV A,IXDATA CJNE A,#00H,OUTPX01 MOV C,GENFAG MOV P0.0,C LJMP MAIN OUTPX01: CJNE A,#01H,OUTPX02 MOV C,GENFAG MOV P0.1,C LJMP MAIN OUTPX02: CJNE A,#02H,OUTPX03 MOV C,GENFAG MOV P0.2,C LJMP MAIN OUTPX03: CJNE A,#03H,OUTPX04 MOV C,GENFAG MOV P0.3,C LJMP MAIN OUTPX04: CJNE A,#04H,OUTPX05 MOV C,GENFAG MOV P0.4,C LJMP MAIN OUTPX05: CJNE A,#05H,OUTPX06 MOV C,GENFAG MOV P0.5,C LJMP MAIN OUTPX06: CJNE A,#06H,OUTPX07 MOV C,GENFAG MOV P0.6,C LJMP MAIN OUTPX07: CJNE A,#07H,OUTPX10 MOV C,GENFAG MOV P0.7,C LJMP MAIN OUTPX10: CJNE A,#10H,OUTPX11 MOV C,GENFAG MOV P1.0,C LJMP MAIN OUTPX11: CJNE A,#11H,OUTPX12 MOV C,GENFAG MOV P1.1,C LJMP MAIN OUTPX12: CJNE A,#12H,OUTPX13 MOV C,GENFAG MOV P1.2,C LJMP MAIN OUTPX13: CJNE A,#13H,OUTPX14 MOV C,GENFAG MOV P1.3,C LJMP MAIN OUTPX14: CJNE A,#14H,OUTPX15 MOV C,GENFAG MOV P1.4,C LJMP MAIN OUTPX15: CJNE A,#15H,OUTPX16 MOV C,GENFAG MOV P1.5,C LJMP MAIN OUTPX16: CJNE A,#16H,OUTPX17 MOV C,GENFAG MOV P1.6,C LJMP MAIN OUTPX17: CJNE A,#17H,OUTPX20 MOV C,GENFAG MOV P1.7,C LJMP MAIN OUTPX20: CJNE A,#20H,OUTPX21 MOV C,GENFAG MOV P2.0,C LJMP MAIN OUTPX21: CJNE A,#21H,OUTPX22 MOV C,GENFAG MOV P2.1,C LJMP MAIN OUTPX22: CJNE A,#22H,OUTPX23 MOV C,GENFAG MOV P2.2,C LJMP MAIN OUTPX23: CJNE A,#23H,OUTPX24 MOV C,GENFAG MOV P2.3,C LJMP MAIN OUTPX24: CJNE A,#24H,OUTPX25 MOV C,GENFAG MOV P2.4,C LJMP MAIN OUTPX25: CJNE A,#25H,OUTPX26 MOV C,GENFAG MOV P2.5,C LJMP MAIN OUTPX26: CJNE A,#26H,OUTPX27 MOV C,GENFAG MOV P2.6,C LJMP MAIN OUTPX27: CJNE A,#27H,OUTPX32 MOV C,GENFAG MOV P2.7,C LJMP MAIN OUTPX32: CJNE A,#32H,OUTPX33 MOV C,GENFAG MOV P3.2,C LJMP MAIN OUTPX33: CJNE A,#33H,OUTPX34 MOV C,GENFAG MOV P3.3,C LJMP MAIN OUTPX34: CJNE A,#34H,OUTPX35 MOV C,GENFAG MOV P3.4,C LJMP MAIN OUTPX35: CJNE A,#35H,OUTPX36 MOV C,GENFAG MOV P3.5,C LJMP MAIN OUTPX36: CJNE A,#36H,OUTPX37 MOV C,GENFAG MOV P3.6,C LJMP MAIN OUTPX37: CJNE A,#37H,OUTPZ MOV C,GENFAG MOV P3.7,C LJMP MAIN OUTPZ: LJMP MAINE ; ********** TESTP ********** ; TEST PORT (IN) TESTP: CALL CHEX JB HEXFAG,TESTP0 LJMP MAINE TESTP0: MOV IXDATA,R3 CALL CHEX JB ENDFAG,TESTP01 LJMP MAINE TESTP01: MOV A,IXDATA CJNE A,#0,TESTP1 MOV R7,#0 CALL TESTS LJMP MAIN TESTP1: CJNE A,#1,TESTP2 MOV R7,#1 CALL TESTS LJMP MAIN TESTP2: CJNE A,#2,TESTP3 MOV R7,#2 CALL TESTS LJMP MAIN TESTP3: CJNE A,#3,TESTP4 MOV R7,#3 CALL TESTS LJMP MAIN TESTP4: LJMP MAINE TESTS: CJNE R7,#0,TESTS1 ;DISPLAY BYTE MOV A,P0 SJMP TESTS5 TESTS1: CJNE R7,#1,TESTS2 MOV A,P1 SJMP TESTS5 TESTS2: CJNE R7,#2,TESTS3 MOV A,P2 SJMP TESTS5 TESTS3: MOV A,P3 TESTS5: MOV R5,#8 TESTS6: RLC A PUSH ACC MOV A,#'1' JC TESTS7 MOV A,#'0' TESTS7: CALL SBYTE POP ACC DJNZ R5,TESTS6 MOV A,#0DH CALL SBYTE JB RI,TESTS9 MOV R2,#0 ;DELAY TESTS8: MOV R3,#0 DJNZ R3,$ DJNZ R2,TESTS8 SJMP TESTS TESTS9: CALL RBYTE CALL SLF LJMP MAIN ; ********** READS,WRITES SUB ********** READS: JB DATAFG,READS1 CALL ISPRC RET READS1: CALL ISPRD RET WRITES: JB DATAFG,WRITES1 CALL ISPWC RET WRITES1: CALL ISPWD RET ; ********** ISPWC,ISPWD SUB ********** ; ISP WRITE CODE,DATA ; IN = DPTR ; = A ; REG = A ISPWD: MOVX @DPTR,A RET ISPWC: PUSH 00H PUSH 01H MOV R0,#FCLOCK MOV R1,#02H CALL PGMMTP POP 01H POP 00H RET ; ********** ISPRC,ISPRD SUB ********** ; ISP READ CODE,DATA ; IN = DPTR ; OUT = A ; REG = A ISPRD: MOVX A,@DPTR RET ISPRC: CLR A MOVC A,@A+DPTR RET ; ********** DTSEC SUB ********** ; DELAY 1/10 SECOND ; IN = R2 ; REG = R2,R3,R4 DTSEC: MOV R3,#358 DTSEC1: MOV R4,#0 DJNZ R4,$ NOP NOP DJNZ R3,DTSEC1 DJNZ R2,DTSEC RET ; ********** SBYTE SUB ********** ; SEND BYTE ; IN = A ; REG = NO SBYTE: JNB TI,$ ;WAIT FOR SEND OK CLR TI MOV SBUF,A RET ; ********** SBYTEH SUB ********** ; SEND 2 BYTE HEX FROM A ; IN = A ; REG = A,R2,R3 SBYTEH: CALL HTOA MOV A,R2 CALL SBYTE MOV A,R3 CALL SBYTE RET SBYTEHC: XCH A,R7 ;R7=CHECKSUM ADD A,R7 XCH A,R7 CALL SBYTEH RET ; ********** SBYTEW SUB ********** ; SEND 4 BYTE FROM SPTR ; IN = DPTR ; REG = A,R2,R3 SBYTEW: MOV A,DPH CALL SBYTEH MOV A,DPL CALL SBYTEH RET ; ********** SBLOCK SUB ********** ; SEND BLOCK ; IN = DPTR ROM-ADDRESS (END BY 0 OR 0DH) ; OUT = DPTR (NEXT) ; REG = A,DPTR SBLOCK: CLR A MOVC A,@A+DPTR CJNE A,#0,SBLOCK1 INC DPTR ;NEXT ADDRESS RET ;EXIT BY 0 SBLOCK1: CJNE A,#0DH,SBLOCK2 CALL SLF ;CR/LF INC DPTR ;NEXT ADDRESS RET ;EXIT BY ODH SBLOCK2: CALL SBYTE INC DPTR JMP SBLOCK ; ********** SBLANK SUB ********** ; SEND 1 BLANK ; REG = A S1B: MOV A,#' ' CALL SBYTE RET ; ********** SLF SUB ********** ; PRINT CR/LF ; REG = A SLF: MOV A,#0DH CALL SBYTE MOV A,#0AH CALL SBYTE RET ; ********** RBYTE SUB ********** ; READ ONE BYTE ; OUT = A ; REG = A RBYTE: JNB RI,$ ;WAIT FOR RECEIVE OK CLR RI MOV A,SBUF RET ; ********** RBYTEH SUB ********** ; READ HEX-ASCII FROM SERIAL (2 BYTE) ; OUT = A ; REG = A,R2,R3 RBYTEH: CALL RBYTE ;MOV A,SBUF MOV R2,A CALL RBYTE MOV R3,A CALL ATOH ;ASCII TO HEX RET RBYTEHC: CALL RBYTEH ;R7=CHECKSUM,OUT A XCH A,R7 ADD A,R7 XCH A,R7 RET ; ********** HTOA SUB ********** ; CONVERT HEX TO ASCII ; IN = A ; OUT = R2,R3 ; REG = A,R2,R3 HTOA: PUSH ACC SWAP A CALL HTOAS MOV R2,A POP ACC CALL HTOAS MOV R3,A RET HTOAS: ANL A,#0FH CJNE A,#0AH,$+3 JNC HTOAS1 ORL A,#30H RET HTOAS1: SUBB A,#9 ORL A,#40H RET ; ********** ATOH SUB ********** ; ASCII TO HEX CONVERT ; IN = R2,R3 30H,41H ; OUT = A 0AH ; REG = A,R2 ATOH: MOV A,R2 CALL ATOHS SWAP A MOV R2,A MOV A,R3 CALL ATOHS ORL A,R2 RET ATOHS: CJNE A,#'A',$+3 ;#41H JC ATOHS1 ADD A,#9 ATOHS1: ANL A,#0FH RET ; ********** CHEX SUB ********** ; CHECK HEX OF NEXT WORD ; IN = INPADD START BUFFER ; OUT = INPADD NEXT BUFFER ; OPTFAG 0=NOTHING 1=OPTION (X) ; ERRFAG 0=NOTHING 1=ERROR ; HEXFAG 0=NOTHING 1=HEX ; ENDFAG 0=NOTHING 1=END ; R2,R3 DATA IN HEX (IF HEXFAG=1) ; REG = ALL CHEX: CLR OPTFAG CLR ERRFAG CLR HEXFAG CLR ENDFAG CALL NEXT CJNE R5,#0,CHEX1 SETB ENDFAG ;END RET CHEX1: CJNE R5,#1,CHEX2 DEC R0 MOV A,@R0 CJNE A,#'X',CHEX2 SETB OPTFAG ;OPTION (X) RET CHEX2: CJNE R5,#5,$+3 JNC CHEX5 ;CHAR => 5 CJNE R4,#0,CHEX5 SETB HEXFAG ;IS HEX RET CHEX5: SETB ERRFAG ;ERROR RET ; ********** NEXT SUB ********** ; SEARCH NEXT FIELD OF COMMAND LINE ; IN = INPADD START BUFFER ; OUT = INPADD NEXT BUFFER ; R2,R3 DATA IN HEX ; R4 TEXT FLAG 0=HEX 1=TEXT ; R5 CHARECTOR COUNT (0=NOTHING) ; REG = ALL NEXT: CLR A MOV R2,A MOV R3,A MOV R4,A MOV R5,A MOV R6,#1 ;FIRST FLAG MOV R0,INPADD NEXT0: MOV A,@R0 ;BY PASS BLANK CJNE A,#' ',NEXT1 INC R0 SJMP NEXT0 NEXT1: MOV A,@R0 ;READ LOOP CJNE A,#' ',$+6 LJMP NEXT9 CJNE A,#0DH,$+6 LJMP NEXT9 CJNE A,#'0',$+3 JC NEXT5 ;<0 CJNE A,#'F'+1,$+3 JNC NEXT5 ;>F CJNE A,#'A',$+3 JNC NEXT2 ;IS A-F CJNE A,#'9'+1,$+3 JNC NEXT5 ;>9 7FH CALL SBYTE ;ECHO & WRITE BUFFER CALL UPPER MOV @R0,A INC R0 CJNE R0,#INPEND,$+3 JC INPUT1 ; R2,R3 ; IN = DPTR,R2,R3 ; OUT = A,CY ; REG = A DPCOM: PUSH DPL CLR C MOV A,DPL SUBB A,R3 MOV DPL,A MOV A,DPH SUBB A,R2 ORL A,DPL POP DPL RET ; ********** DPDEC SUB ********** ; DPTR = DPTR - 1 ; IN = DPTR ; OUT = DPTR ; = A (ZERO FLAG) ; REG = A DPDEC: XCH A,DPL JNZ $+4 DEC DPH DEC A XCH A,DPL MOV A,DPH ORL A,DPL RET ENDCODE: END