; FILENAME REM55.ASM V3.0 ; DESCRIPTION 89C55 REMOTE MONITOR ; HARDWARE ANY DIP40 MCS-51 BOARD (USE ONLY SERIAL PORT) ; ; ASSEMBLER SXA51 ; START-DATE 29/08/34 ; UPDATE 20/01/48 ; SOFTWARE ENG. KRIANGSAK B. ; COMPANY SILA RESEARCH CO.,LTD. ; TEL 02-712-2850-2 FAX 02-381-1447 ; ********** WORKING INTERNAL RAM ********** ORG 0000H ;**** USER AREA **** DS 8 ;REGISTER R0-R7 BANK-0 (VIRTUAL) DS 24 ;REGISTER BANK-1,2,3 (USER-STACK) DS 32 ;**** REG & SFR AREA **** VTREG: DS 8 ;VIRTUAL REGISTER VTSP: DS 1 ;SFR BUFFER VTDPL: DS 1 VTDPH: DS 1 VTPSW: DS 1 VTACC: DS 1 VTB: DS 1 ;**** FIXED MEMORY **** PMMADD: DS 2 ;PROGRAM ADDRESS DMMADD: DS 2 ;DATA ADDRESS RUNADD: DS 2 ;RUN ADDRESS (PC) BRKADD: DS 2 ;BREAK ADDRESS POWMEM: DS 1 ;POWER UP CODE BAUDMM: DS 1 ;BAUD RATE MEMORY INTBUF: DS 2 ;INTERRUPT ADDRESS BUFFER ;**** FLEXIBLE MEMORY **** IXDATA: DS 2 ;IX DATA MEMORY (GENERAL) IYDATA: DS 2 ;IY DATA MEMORY (GENERAL) IZDATA: DS 2 ;IZ DATA MEMORY (GEMERAL) STTADD: DS 2 ;START ADDRESS ENDADD: DS 2 ;END ADDRESS DESADD: DS 2 ;DESTINATION ADDRESS ASMBUF: DS 8+1 ;ASM,UNA BUFFER INPMEM: DS 1 ;INPBUF MEMORY (FOR INPXA,INPAX) ;**** CHANGE EXT.RAM TO INT.RAM **** ;BY SUBROUTINE INPXA,INPAX INPBUF: DS 41 ;INPUT BUFFER (40 CHR.MAX) INPEND: TABMEM: DS 4 ;OPCODE MEMORY (ASMX) ;**** MONITOR STACK & USER AREA **** STACK: DS 19 ;STACK DS 80 ;USER INTEND: ; ********** VARIABLE SET ********** PROMPT EQU '-' ;PROMPT CHARECTOR BRAT12 EQU 0E8H ;1200 BAUD RATE VAR. BRAT24 EQU 0F4H ;2400 BRAT48 EQU 0FAH ;4800 BRAT96 EQU 0FDH ;9600 MULFG EQU 00H ;MUL FLAG GENFAG EQU B.0 ;FOR GENERAL USED SMOD EQU B.7 ;FOR BAUD FUNCTION POWCOD EQU 0A5H ;POWER UP CODE ; ********** VECTOR ********** ; INTERRUPT VECTOR ADDRESS JUMP ORG 0000H STTROM: LJMP RES ;RESET IE0VEC: LJMP 8003H ;EXT-INT-0 (FOR USER) DB 0FFH,0FFH,0FFH DB 0FFH,0FFH TF0VEC: LJMP 800BH ;TIMER-0 (FOR USER) DB 0FFH,0FFH,0FFH DB 0FFH,0FFH IE1VEC: LJMP 8013H ;EXT-INT-1 (FOR USER) DB 0FFH,0FFH,0FFH DB 0FFH,0FFH TF1VEC: LJMP 801BH ;TIMER-1 (FOR USER) DB 0FFH,0FFH,0FFH DB 0FFH,0FFH RTIVEC: LJMP 8023H ;RI & TI UART (FOR USER) DB 0FFH,0FFH,0FFH DB 0FFH,0FFH TF2VEC: LJMP 802BH ;TIMER-2 (FOR USER) 89C52 DB 0FFH,0FFH,0FFH DB 0FFH,0FFH ENDVEC: LJMP ENDV ;END-PROGRAM VECTOR 0033H BRKVEC: LJMP BRK ;SOFTWARE BREAK (MONITOR) TBKVEC: LJMP TBK ;STEP BREAK (MONITOR) DB 0FFH,0FFH,0FFH,0FFH ;SYSTEM CALL VECTOR START ADDRESS 0040H LJMP SUBDA ;01 LJMP DMSEC ;02 LJMP DTSEC ;03 LJMP DSEC ;04 LJMP TABLE ;05 LJMP DPDEC ;06 LJMP DPADD ;07 LJMP DPSUB ;08 LJMP DPMUL ;09 LJMP DPDIV ;10 LJMP DPCOM ;11 LJMP DPAX ;12 LJMP DPXA ;13 LJMP IXRD ;14 LJMP IXWR ;15 LJMP IXINC ;16 LJMP IXDEC ;17 LJMP IXADD ;18 LJMP IXSUB ;19 LJMP IXCOM ;20 LJMP IXAC ;21 LJMP IXAX ;22 LJMP IXXA ;23 LJMP DBADD ;24 LJMP DBSUB ;25 LJMP SBYTE ;26 LJMP SBYTEH ;27 LJMP SBYTEW ;28 LJMP SBLOCK ;29 LJMP SBLANK ;30 LJMP SLF ;31 LJMP RBYTE ;32 LJMP RBYTEH ;33 LJMP RBYTEW ;34 LJMP BAUDS ;35 LJMP HTOA ;36 LJMP ATOH ;37 LJMP HTOD ;38 LJMP DTOH ;39 LJMP UPPER ;40 ; ********** RESET ************ ; SYSTEM RESET RES: MOV R2,#40H ;POWER UP DELAY RES1: MOV R3,#0 DJNZ R3,$ DJNZ R2,RES1 MOV SP,#STACK ;MONITOR STACK MOV A,POWMEM ;CHECK POWER UP CJNE A,#POWCOD,$+6 LJMP RES7 ;RESET BY KEY ;**** POWER UP **** MOV R0,#08H ;CLEAR INT-RAM MOV R2,#256-8 RES4: MOV @R0,#0 INC R0 DJNZ R2,RES4 MOV TMOD,#20H ;TIMER1 MODE2 MOV SCON,#52H ;SERIAL 8 BIT UART MODE MOV TH1,#BRAT96 ;9600 BPS SETB TR1 ;TIMER1 ON RESCHK: MOV DPTR,#0000H ;CHECK SPACE BAR IN 1 SECOND RESCHK1: JB RI,RES5 NOP NOP NOP INC DPTR MOV A,DPH ORL A,DPL JNZ RESCHK1 MOV DPTR,#8000H MOVX A,@DPTR CJNE A,#00H,$+6 LJMP RESCHK CJNE A,#0FFH,$+6 LJMP RESCHK MOV RUNADD,#80H ;AUTO RUN AT 8000H MOV RUNADD+1,#00H PUSH RUNADD+1 PUSH RUNADD RET ;GO RES5: LCALL RBYTE ;AUTO BAUD RATE CJNE A,#0F0H,$+3 ;CHECK 19200 JC RES50 MOV R2,#19H MOV B,PCON SETB SMOD MOV PCON,B SJMP RES58 RES50: CJNE A,#20H,RES51 ;CHECK 9600 MOV R2,#96H SJMP RES58 RES51: CJNE A,#00H,RES5 LCALL RBYTE ;SECOND BYTE FOR 12,24,48 CJNE A,#00H,RES52 ;CHECK 1200 MOV TH1,#BRAT12 MOV R2,#12H SJMP RES58 RES52: CJNE A,#80H,RES53 ;CHECK 2400 MOV TH1,#BRAT24 MOV R2,#24H SJMP RES58 RES53: CJNE A,#0F8H,RES5 MOV TH1,#BRAT48 MOV R2,#48H RES58: MOV BAUDMM,R2 MOV R2,#22 RES581: LCALL SLF DJNZ R2,RES581 RES59: MOV DPTR,#RESTB1 ;POWER UP TEXT LCALL SBLOCK MOV DPTR,#RESTB2 LCALL SBLOCK MOV DPTR,#RESTB3 LCALL SBLOCK MOV A,BAUDMM PUSH ACC LCALL SBYTEH POP ACC CJNE A,#19H,RES59X MOV A,#'2' LCALL SBYTE RES59X: CLR A LCALL SBYTEH LCALL SLF MOV DPTR,#RESTB5 LCALL SBLOCK LCALL CHKS MOV A,IYDATA LCALL SBYTEH MOV A,IYDATA+1 LCALL SBYTEH LCALL SLF LCALL SLF MOV POWMEM,#POWCOD ;POWER UP DEFAULT MOV PMMADD,#80H MOV PMMADD+1,#0 MOV DMMADD,#80H MOV DMMADD+1,#0 SJMP RES8 ;**** RESET **** RES7: MOV TMOD,#20H ;TIMER1 MODE2 MOV SCON,#52H ;SERIAL 8 BIT UART MODE MOV A,BAUDMM ;BAUD RATE FROM MEMORY LCALL BAUDS SETB TR1 ;TIMER1 ON LCALL SLF LCALL SLF MOV DPTR,#RESTB4 ;DISPLAY SYSTEM RESET LCALL SBLOCK RES8: LCALL BRKCHK ;RESET DEFAULT LJMP NEWX ;SAME AS NEW COMMAND (SFR ONLY) RESTB1: DB "REM55 Remote Monitor v3.0",0DH RESTB2: DB "2005 Sila Research Co.,Ltd.",0DH RESTB3: DB "Baud Rate :",0 RESTB4: DB "System Reset ...",0DH RESTB5: DB "Checksum :",0 ; ********** CHKS SUB ********** ; FIND CODE CHECKSUM ; OUT = IYDATA CHKS: MOV DPH,#HIGH STTROM ;START MOV DPL,#LOW STTROM MOV R2,#HIGH ENDROM MOV R3,#LOW ENDROM MOV IYDATA,#0 ;START CHECKSUM MOV IYDATA+1,#0 CHK1: CLR A ;READ FROM CODE MOVC A,@A+DPTR LCALL CHKINC LCALL DPCOM JNZ CHK1 RET ; ********** MAIN ********** ; MAIN PROGRAM (INPUT & CHECK COMMAND) MAIN: MOV SP,#STACK MOV A,#PROMPT LCALL SBYTE LCALL INPUT MOV DPTR,#INPBUF LCALL NEXT CJNE R5,#0,$+6 LJMP MAIN ;NOTHING CJNE R5,#1,$+6 LJMP MAIN60 LJMP MAINE ;FIRST FIELD >1 CHAR MAIN60: PUSH DPH ;LOOKUP COMMAND TABLE PUSH DPL ;--\ LCALL DPDEC LCALL INPAX ;COMMAND CHAR. MOV B,A MOV R3,#0 MOV DPTR,#MAINT1 MAIN6: CLR A ;COMPARE LOOP MOVC A,@A+DPTR INC R3 INC DPTR CJNE A,#0,MAIN61 POP DPL ;--/ POP DPH LJMP MAINE ;NO COMMAND MAIN61: CJNE A,B,MAIN6 MOV DPTR,#MAINT2 ;YES, NEXT TABLE SJMP MAIN63 MAIN62: INC DPTR INC DPTR MAIN63: DJNZ R3,MAIN62 CLR A MOVC A,@A+DPTR MOV R2,A MOV A,#1 MOVC A,@A+DPTR MOV R3,A POP DPL ;--/ POP DPH MOV A,R3 ;EXIT PUSH ACC MOV A,R2 PUSH ACC RET ;GO (DPTR = NEXT COMMAND LINE) MAINE: MOV SP,#STACK ;**** SYNTAX ERROR **** (BACK-FIELD) MOV R2,#HIGH INPBUF ;IN = DPTR (LAST COMMAND LINE) MOV R3,#LOW INPBUF MAINE1: LCALL DPCOM ;FIND START ERROR-FIELD JZ MAINEX LCALL DPDEC LCALL INPAX CJNE A,#' ',MAINE1 INC DPTR MAINEX: MOV SP,#STACK ;**** SYNTAX ERROR **** (NEXT-FIELD) MOV R2,DPH MOV R3,DPL MOV DPTR,#INPBUF MAINE3: LCALL S1B LCALL DPCOM INC DPTR JNZ MAINE3 MOV DPTR,#MAINET LCALL SBLOCK LJMP MAIN MAINET: DB "^ Syntax Error",0DH MAINT1: DB "ABCDEFGHILMNOPQRSTUVXY",0 MAINT2: DW ASM,BREAK,COMP,DISP DW ENT,FILL,GO,HELP DW INTR,LOAD,MOVE,NEW,OUTP DW UPLOAD,QUIT,REG,SEA DW TRACE,UASM,VAR,CHECK,TESTP ; ********** ASM ********** ASM: LCALL CHEX CJNE R5,#0,$+6 LJMP MAINEX MOV STTADD,R2 MOV STTADD+1,R3 LCALL CEND ASM1: MOV DPH,STTADD MOV DPL,STTADD+1 LCALL SBYTEW MOV A,#':' LCALL SBYTE LCALL INPUT LCALL ASMB MOV DPTR,#INPBUF LCALL TEXT CJNE R5,#0,$+6 LJMP MAIN ;END LCALL ASMX ;PASS 1 (SYNTAX) CJNE A,#0,ASM1 LCALL ASMY ;PASS 2 (TABLE) SJMP ASM1 ; ********** ASMX SUB ********** ; LINE COMPILER (CHECK SYNTAX AND NAME) ; IN = DPTR,R5 -> INPBUF TEXT INPUT (EXT.RAM) ; OUT = A FLAG 0=OK 1=ERROR ; REG = ALL ; STTADD = ASSEMBLER ADDRESS ; ENDADD = INPBUF ADDRESS ; IX,IY,IZ = OPERAND 1,2,3 DATA ; TABMEM = TABLE MEMORY (EXT.RAM) ; ASMBUF = CONVERT WORKING ASMX: CLR A ;FIRST CLEAR MOV IXDATA,A MOV IXDATA+1,A MOV IYDATA,A MOV IYDATA+1,A MOV IZDATA,A MOV IZDATA+1,A PUSH DPH ;CLEAR OUTPUT PUSH DPL MOV R2,#4 MOV DPTR,#TABMEM ASMX0: LCALL INPXA INC DPTR DJNZ R2,ASMX0 POP DPL POP DPH ASMX1: MOV ENDADD,DPH ;**** MNEMONIC **** MOV ENDADD+1,DPL CJNE R5,#9,$+3 JC $+5 LJMP ASMXE ;CHAR>8 LCALL ASMXL LCALL MTOH CJNE A,#0,$+6 LJMP ASMXE ;MNEMONIC ERROR MOV DPTR,#TABMEM LCALL INPXA ;CODE MOV DPH,ENDADD ;**** OPERAND1 **** MOV DPL,ENDADD+1 LCALL TEXT CJNE R5,#0,ASMX2 LJMP ASMX7 ;NO OPERAND ASMX2: MOV ENDADD,DPH MOV ENDADD+1,DPL CJNE R5,#9,$+3 JC $+5 LJMP ASMXE ;CHAR>8 LCALL ASMXL LCALL OTOH CJNE A,#0,$+6 LJMP ASMX21 MOV DPTR,#TABMEM+1 LCALL INPXA ;CODE SJMP ASMX30 ASMX21: LCALL ASMXH CJNE A,#0,$+6 LJMP ASMXE MOV DPTR,#TABMEM+1 LCALL INPXA ;HEX-CODE MOV IXDATA,R2 ;HEX MOV IXDATA+1,R3 ASMX30: MOV DPH,ENDADD ;**** OPERAND2 **** MOV DPL,ENDADD+1 LCALL TEXT CJNE R5,#0,ASMX3 LJMP ASMX7 ;NO OPERAND ASMX3: MOV ENDADD,DPH MOV ENDADD+1,DPL CJNE R5,#9,$+3 JC $+5 LJMP ASMXE ;CHAR>8 LCALL ASMXL LCALL OTOH CJNE A,#0,$+6 LJMP ASMX31 MOV DPTR,#TABMEM+2 LCALL INPXA ;CODE SJMP ASMX40 ASMX31: LCALL ASMXH CJNE A,#0,$+6 LJMP ASMXE MOV DPTR,#TABMEM+2 LCALL INPXA ;HEX-CODE MOV IYDATA,R2 ;HEX MOV IYDATA+1,R3 ASMX40: MOV DPH,ENDADD ;**** OPERAND3 **** MOV DPL,ENDADD+1 LCALL TEXT CJNE R5,#0,ASMX4 LJMP ASMX7 ;NO OPERAND ASMX4: MOV ENDADD,DPH MOV ENDADD+1,DPL CJNE R5,#9,$+3 JNC ASMXE LCALL ASMXL LCALL OTOH CJNE A,#0,$+6 LJMP ASMX41 MOV DPTR,#TABMEM+3 LCALL INPXA ;CODE SJMP ASMX5 ASMX41: LCALL ASMXH CJNE A,#0,$+6 LJMP ASMXE MOV DPTR,#TABMEM+3 LCALL INPXA ;HEX-CODE MOV IZDATA,R2 ;HEX MOV IZDATA+1,R3 ASMX5: MOV DPH,ENDADD ;CHECK END MOV DPL,ENDADD+1 LCALL TEXT CJNE R5,#0,ASMXE ASMX7: CLR A RET ASMXE: MOV DPTR,#ASMXET ;ASM ERROR LCALL SBLOCK MOV A,#1 RET ASMXET: DB " Assembler Syntax Error !",7,0DH ; ********** ASMY SUB ********** ; LINE COMPILER (CHECK TABLE AND LOAD OPCODE TO STTADD) ; IN = STTADD ASSEMBLER ADDRESS ; = IX,IY,IZ OPERAND 1,2,3 DATA ; = TABMEM TABLE MEMORY (EXT.RAM) ; REG = ALL ; ASMBUF = COMPARE WORKING, OPCODE MEMORY ASMY: MOV DPTR,#TABMEM ;LOAD TABMEM TO ASMBUF MOV R0,#ASMBUF MOV R2,#4 ASMY1: LCALL INPAX MOV @R0,A INC DPTR INC R0 DJNZ R2,ASMY1 MOV DPTR,#MCS51T ;SEARCH TABLE MOV R7,#0 ;OPCODE COUNT (256) ASMY2: MOV R2,#4 MOV R3,#0 MOV R0,#ASMBUF ASMY21: MOV A,R3 ;COMPARE MOVC A,@A+DPTR MOV B,A MOV A,@R0 CJNE A,B,ASMY25 INC R0 INC R3 DJNZ R2,ASMY21 SJMP ASMY3 ;= ASMY25: MOV R2,#0 ;NEXT COMPARE MOV R3,#5 LCALL DPADD INC R7 CJNE R7,#0,ASMY2 LJMP ASMYF ;NOT FOUND ASMY3: MOV ASMBUF,R7 ;FRIST OPCODE MOV A,#4 MOVC A,@A+DPTR PUSH ACC ANL A,#0FH MOV ASMBUF+3,A ;NO. OF BYTE POP ACC SWAP A ANL A,#0FH ;A=PATTERN CJNE A,#1,ASMY42 ;**** PAT1 **** MOV A,IXDATA ;11 BIT ADDRESS ANL A,#0F8H MOV B,A MOV A,STTADD ANL A,#0F8H CJNE A,B,ASMYF ;OUT OF RANGE MOV A,IXDATA ;A10 A9 A8 SWAP A RL A ANL A,#0E0H MOV B,A CLR A ;CHECK ACALL OR AJMP MOVC A,@A+DPTR CJNE A,#1,ASMY32 MOV A,B ;ACALL ORL A,#11H SJMP ASMY34 ASMY32: MOV A,B ;AJMP ORL A,#01H ASMY34: MOV ASMBUF,A MOV A,IXDATA+1 ;A7 - A0 MOV ASMBUF+1,A LJMP ASMY7 ASMY42: CJNE A,#2,ASMY43 ;**** PAT2 **** MOV A,IXDATA MOV ASMBUF+1,A MOV A,IXDATA+1 MOV ASMBUF+2,A LJMP ASMY7 ASMY43: CJNE A,#3,ASMY44 ;**** PAT3 **** MOV A,#1 MOVC A,@A+DPTR CJNE A,#1,ASMY431 MOV A,IXDATA ;OPERAND1 CJNE A,#0,ASMYF MOV A,IXDATA+1 MOV ASMBUF+1,A LJMP ASMY7 ASMY431: MOV A,IYDATA ;OPERAND2 CJNE A,#0,ASMYF MOV A,IYDATA+1 MOV ASMBUF+1,A LJMP ASMY7 ASMY44: CJNE A,#4,ASMY45 ;**** PAT4 **** MOV A,IXDATA CJNE A,#0,ASMYF MOV A,IXDATA+1 MOV ASMBUF+1,A MOV DPH,IYDATA MOV DPL,IYDATA+1 LCALL CREL MOV ASMBUF+2,A LJMP ASMY7 ASMYF: LJMP ASMYE ASMY45: CJNE A,#5,ASMY46 ;**** PAT5 **** MOV A,#1 MOVC A,@A+DPTR CJNE A,#1,ASMY451 MOV A,IXDATA ;OPERAND1 CJNE A,#0,ASMYF MOV A,IXDATA+1 MOV ASMBUF+1,A LJMP ASMY7 ASMY451: MOV A,IYDATA ;OPERAND2 CJNE A,#0,ASMYF MOV A,IYDATA+1 MOV ASMBUF+1,A LJMP ASMY7 ASMY46: CJNE A,#6,ASMY47 ;**** PAT6 **** MOV A,IXDATA CJNE A,#0,ASMYF MOV A,IXDATA+1 MOV ASMBUF+2,A MOV A,IYDATA CJNE A,#0,ASMYF MOV A,IYDATA+1 MOV ASMBUF+1,A JMP ASMY7 ASMY47: CJNE A,#7,ASMY48 ;**** PAT7 **** MOV A,IXDATA CJNE A,#0,ASMYF MOV A,IXDATA+1 MOV ASMBUF+1,A MOV A,IYDATA CJNE A,#0,ASMYF MOV A,IYDATA+1 MOV ASMBUF+2,A JMP ASMY7 ASMY48: CJNE A,#8,ASMY49 ;**** PAT8 **** MOV A,#1 MOVC A,@A+DPTR CJNE A,#1,ASMY481 MOV A,IXDATA ;OPERAND1 CJNE A,#0,ASMYF MOV A,IXDATA+1 MOV ASMBUF+1,A MOV DPH,IYDATA MOV DPL,IYDATA+1 LCALL CREL MOV ASMBUF+2,A LJMP ASMY7 ASMY481: MOV A,IYDATA ;OPERAND2 CJNE A,#0,ASMYF MOV A,IYDATA+1 MOV ASMBUF+1,A MOV DPH,IZDATA MOV DPL,IZDATA+1 LCALL CREL MOV ASMBUF+2,A LJMP ASMY7 ASMY49: CJNE A,#9,ASMY4A ;**** PAT9 **** MOV A,IYDATA CJNE A,#0,ASMYE MOV A,IYDATA+1 MOV ASMBUF+1,A LJMP ASMY7 ASMY4A: CJNE A,#10,ASMY4B ;**** PAT10 **** MOV A,IYDATA CJNE A,#0,ASMYE MOV A,IYDATA+1 MOV ASMBUF+1,A MOV DPH,IZDATA MOV DPL,IZDATA+1 LCALL CREL MOV ASMBUF+2,A SJMP ASMY7 ASMY4B: CJNE A,#11,ASMY4C ;**** PAT11 **** MOV A,IYDATA MOV ASMBUF+1,A MOV A,IYDATA+1 MOV ASMBUF+2,A SJMP ASMY7 ASMY4C: CJNE A,#12,ASMY7 ;**** PAT12 **** MOV A,#1 MOVC A,@A+DPTR CJNE A,#1,ASMY4C1 MOV DPH,IXDATA MOV DPL,IXDATA+1 LCALL CREL MOV ASMBUF+1,A SJMP ASMY7 ASMY4C1: MOV DPH,IYDATA MOV DPL,IYDATA+1 LCALL CREL MOV ASMBUF+1,A ASMY7: MOV DPH,STTADD ;LOAD TO STTADD MOV DPL,STTADD+1 MOV R0,#ASMBUF MOV R7,ASMBUF+3 ASMY71: MOV A,@R0 MOVX @DPTR,A INC DPTR INC R0 DJNZ R7,ASMY71 MOV STTADD,DPH MOV STTADD+1,DPL RET ASMYE: MOV DPTR,#ASMYET ;ASM ERROR LCALL SBLOCK RET ASMYET: DB " Assembler Command Error !",7,0DH ; ********** CREL SUB ********** ; RELATIVE CALCULATE ; IN = DPTR TARGET ADDRESS ; = STTADD PROGRAM ADDRESS ; = ASMBUF+3 NO. OF BYTE ; OUT = A RELATIVE ; REG = ALL CREL: MOV R2,STTADD MOV R3,STTADD+1 MOV A,ASMBUF+3 DEC A ADD A,R3 MOV R3,A MOV A,#0 ADDC A,R2 MOV R2,A ;R2,R3 = rr ADDRESS LCALL DPCOM JZ CREL4 JC CREL4 LCALL DPSUB ;JUMP TO HIGH LCALL DPDEC MOV A,DPH ;CHECK OVER RANGE CJNE A,#0,CRELE MOV A,DPL CJNE A,#80H,$+3 JNC CRELE RET ;A=OUTPUT ;JUMP TO LOW CREL4: XCH A,DPH ;SWAP DPTR - R2,R3 XCH A,R2 XCH A,DPH XCH A,DPL XCH A,R3 XCH A,DPL LCALL DPSUB ;CHECK OVER RANGE MOV A,DPH CJNE A,#0,CRELE MOV A,DPL CJNE A,#80H,$+3 JNC CRELE CPL A RET ;A=OUTPUT CRELE: LCALL ASMYE ;RANGE ERROR POP ACC POP ACC ;CLEAR RET RET ; ********** ASMXH SUB ********** ; CHECK OPERAND = HEX,#HEX,/HEX (INCLUDE SFR-NAME,BIT-NAME) ; IN = ASMBUF FIELD-TEXT ; OUT = A 0=ERROR 1=HEX 2=#HEX 3=/HEX ; = R2,R3 HEX ; REG = ALL ASMXH: MOV A,ASMBUF ;CHECK # AND / CJNE A,#'#',ASMXH1 MOV R7,#2 SJMP ASMXH4 ASMXH1: CJNE A,#'/',ASMXH2 MOV R7,#3 SJMP ASMXH4 ASMXH2: MOV R7,#1 SJMP ASMXH5 ASMXH4: MOV R0,#ASMBUF ;SHIFT FIRST BYTE (#/) MOV R1,#ASMBUF+1 MOV R2,#7 ASMXH41: MOV A,@R1 MOV @R0,A INC R0 INC R1 DJNZ R2,ASMXH41 MOV ASMBUF+7,#' ' ASMXH5: MOV A,ASMBUF ;CHECK HEX CJNE A,#'0',$+3 JC ASMXH7 CJNE A,#'9'+1,$+3 JNC ASMXH7 MOV R0,#ASMBUF ;IS REAL-HEX MOV R2,#0 MOV R3,#0 MOV R4,#0 ;DIGIT COUNT MOV R5,#8 ASMXH6: MOV A,@R0 ;BY PASS FIRST ZERO CJNE A,#'0',ASMXH61 INC R0 DJNZ R5,ASMXH6 SJMP ASMXH65 ;IS ZERO ASMXH61: MOV A,@R0 CJNE A,#' ',$+6 LJMP ASMXH65 CJNE A,#'H',$+6 LJMP ASMXH65 CJNE A,#'0',$+3 JC ASMXH6E ;<0 CJNE A,#'F'+1,$+3 JNC ASMXH6E ;>F CJNE A,#'A',$+3 JNC ASMXH62 ;IS A-F CJNE A,#'9'+1,$+3 JNC ASMXH6E ;>9 ASMBUF ; IN = R5 CHAR. COUNT ; = DPTR INPBUF ADDRESS ; REG = ALL ASMXL: LCALL ASMXC MOV A,R5 MOV R2,#0 MOV R3,A LCALL DPSUB MOV R0,#ASMBUF ;LOAD ASMXL1: LCALL INPAX MOV @R0,A INC R0 INC DPTR DJNZ R5,ASMXL1 RET ; ********** ASMB SUB ********** ; CHANGE COMMA TO BLANK IN INPBUF ; IN = INPBUF ; OUT = INPBUF ; REG = ALL ASMB: MOV DPTR,#INPBUF MOV R2,#40 ASMB1: LCALL INPAX CJNE A,#',',ASMB2 MOV A,#' ' LCALL INPXA ASMB2: INC DPTR DJNZ R2,ASMB1 RET ; ********** BREAK ********** BREAK: LCALL CHEX CJNE R5,#0,$+6 LJMP BREAK5 MOV BRKADD,R2 MOV BRKADD+1,R3 LCALL CEND LJMP MAIN BREAK5: MOV DPH,BRKADD ;DISPLAY MOV DPL,BRKADD+1 LCALL SBYTEW LCALL SLF LJMP MAIN ; ********** COMP ********** ; COMPARE BLOCK COMP: LCALL CHEX CJNE R5,#0,$+6 LJMP MAINEX MOV STTADD,R2 MOV STTADD+1,R3 LCALL CHEX CJNE R5,#0,$+6 LJMP MAINEX MOV ENDADD,R2 MOV ENDADD+1,R3 LCALL NEXT CJNE R5,#0,$+6 LJMP MAINEX CJNE R4,#0,COMH ;IS COMPARE HEX CJNE R5,#5,$+3 JC COMP1 LJMP MAINE COMP1: MOV DESADD,R2 MOV DESADD+1,R3 LCALL CEND MOV DPH,STTADD ;COMPARE PROCESS MOV DPL,STTADD+1 MOV R4,DESADD MOV R5,DESADD+1 COMP2: MOVX A,@DPTR ;READ DATA TO A,B MOV B,A PUSH DPH ;--\ PUSH DPL MOV DPH,R4 MOV DPL,R5 MOVX A,@DPTR POP DPL POP DPH ;--/ CJNE A,B,COMP4 COMP3: MOV A,#1 ;NEXT ADD A,R5 MOV R5,A MOV A,#0 ADDC A,R4 MOV R4,A MOV R2,ENDADD MOV R3,ENDADD+1 LCALL DPCOM INC DPTR JNZ COMP2 LJMP MAIN COMP4: MOV R7,A ;DISPLAY NOT MATCH ADDRESS LCALL SBYTEW ;FIRST ADDRESS MOV A,#':' LCALL SBYTE MOV A,B LCALL SBYTEH LCALL S1B MOV A,R4 ;SECOND ADDRESS LCALL SBYTEH MOV A,R5 LCALL SBYTEH MOV A,#':' LCALL SBYTE MOV A,R7 LCALL SBYTEH LCALL SLF SJMP COMP3 ; ********** COMH ********** COMHE: LJMP MAINE COMH: CJNE R5,#1,COMHE ;>1 CHAR LCALL DPDEC LCALL INPAX INC DPTR CJNE A,#'H',COMHE LCALL CHEX CJNE R5,#0,$+6 LJMP MAINE CJNE R2,#0,COMHE ;DATA > 1 BYTE MOV IXDATA,R3 LCALL CEND MOV DPH,STTADD ;COMPARE PROCESS MOV DPL,STTADD+1 COMH1: MOVX A,@DPTR CJNE A,IXDATA,COMH4 COMH2: MOV R2,ENDADD MOV R3,ENDADD+1 LCALL DPCOM INC DPTR JNZ COMH1 LJMP MAIN COMH4: MOV R7,A ;DISPLAY NOT MATCH ADDRESS LCALL SBYTEW MOV A,#':' LCALL SBYTE MOV A,R7 LCALL SBYTEH LCALL SLF SJMP COMH2 ; ********** DISP ********** DISP: LCALL CHEX CJNE R5,#0,$+6 LJMP DISPA ;AUTO ADDRESS MOV DMMADD,R2 MOV DMMADD+1,R3 LCALL CHEX CJNE R5,#0,$+6 LJMP DISP1 ;ADDR1 MOV ENDADD,R2 MOV ENDADD+1,R3 LCALL CEND LCALL DUMP ;ADDR1 ADDR2 LJMP MAIN DISPA: MOV R2,DMMADD ;AUTO ADDRESS MOV R3,DMMADD+1 MOV DPTR,#127 LCALL DPADD MOV ENDADD,DPH MOV ENDADD+1,DPL LCALL DUMP LJMP MAIN DISP1: MOV R2,DMMADD ;ADDR1 MOV R3,DMMADD+1 MOV DPTR,#127 LCALL DPADD MOV ENDADD,DPH MOV ENDADD+1,DPL LCALL DUMP LJMP MAIN ; ********** DUMP SUB ********** ; DATA-MEM DUMP SUBROUTINE ; IN = DMMADD START ADDRESS ; ENDADD FINAL ADDRESS ; REG = ALL DUMP: MOV A,DMMADD ;PRINT ADDRESS LCALL SBYTEH MOV A,DMMADD+1 LCALL SBYTEH MOV A,#':' LCALL SBYTE LCALL S1B MOV R6,#8 ;PRINT DATA IN HEX MOV DPH,DMMADD MOV DPL,DMMADD+1 LCALL IXWR ;BACKUP ADDRESS DUMP3: MOVX A,@DPTR ;FIRST 8 BYTE HEX INC DPTR LCALL SBYTEH LCALL S1B DJNZ R6,DUMP3 MOV A,#'-' LCALL SBYTE LCALL S1B MOV R6,#8 DUMP31: MOVX A,@DPTR ;SECOND 8 BYTE HEX INC DPTR LCALL SBYTEH LCALL S1B DJNZ R6,DUMP31 LCALL S1B LCALL S1B MOV DMMADD,DPH MOV DMMADD+1,DPL MOV R6,#16 ;PRINT DATA IN ASCII LCALL IXRD DUMP4: MOVX A,@DPTR INC DPTR CJNE A,#7FH,$+3 JNC DUMP40 ;=>7F CJNE A,#20H,$+3 JNC DUMP41 ;=>20 DUMP40: MOV A,#'.' LCALL SBYTE SJMP DUMP42 DUMP41: LCALL SBYTE DUMP42: DJNZ R6,DUMP4 LCALL SLF MOV R2,ENDADD MOV R3,ENDADD+1 LCALL DPCOM JZ DUMP JC DUMP RET ; ********** ENT ********** ; ENTER DATA (DATA MEMORY) ENT: LCALL CHEX CJNE R5,#0,$+6 LJMP MAINEX MOV STTADD,R2 MOV STTADD+1,R3 LCALL CEND ENT2: MOV DPH,STTADD MOV DPL,STTADD+1 LCALL SBYTEW MOV A,#':' LCALL SBYTE MOVX A,@DPTR LCALL SBYTEH LCALL S1B LCALL INPUT MOV DPTR,#INPBUF LCALL 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 LCALL 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,#07H ;BEEP & AGAIN LCALL SBYTE LJMP ENT2 ; ********** FILL ********** ; FILL MEMORY WITH HEX FILL: LCALL CHEX CJNE R5,#0,$+6 LJMP MAINEX MOV STTADD,R2 MOV STTADD+1,R3 LCALL CHEX CJNE R5,#0,$+6 LJMP MAINEX MOV ENDADD,R2 MOV ENDADD+1,R3 LCALL CHEX CJNE R5,#0,$+6 LJMP MAINEX CJNE R2,#0,FILLE MOV IXDATA,R3 LCALL NEXT CJNE R5,#0,FILLE MOV DPH,STTADD ;FILL PROCESS MOV DPL,STTADD+1 MOV R2,ENDADD MOV R3,ENDADD+1 FILL2: MOV A,IXDATA MOVX @DPTR,A LCALL DPCOM INC DPTR JC FILL2 LJMP MAIN FILLE: LJMP MAINE ; ********** GO ********** GO: LCALL CHEX CJNE R5,#0,$+6 LJMP GO1 ;AUTO PC MOV RUNADD,R2 MOV RUNADD+1,R3 LCALL CEND GO1: MOV DPH,RUNADD ;CHECK OPCODE<>0 MOV DPL,RUNADD+1 CLR A MOVC A,@A+DPTR CJNE A,#0,GO2 MOV DPTR,#GOERRT LCALL SBLOCK LJMP MAIN GO2: MOV ASMBUF+3,#0 ;CLEAR BREAK FLAG MOV A,BRKADD ORL A,BRKADD+1 JZ GO4 MOV DPH,BRKADD ;SET-BREAK MOV DPL,BRKADD+1 MOV R2,RUNADD MOV R3,RUNADD+1 LCALL DPCOM JZ GO4 JC GO4 MOVX A,@DPTR ;LCALL OP-CODE MOV ASMBUF,A MOV A,#02H MOVX @DPTR,A INC DPTR MOVX A,@DPTR ;BRKVEC H-ADDRESS MOV ASMBUF+1,A MOV A,#HIGH BRKVEC MOVX @DPTR,A INC DPTR MOVX A,@DPTR ;BRKVEC L-ADDRESS MOV ASMBUF+2,A MOV A,#LOW BRKVEC MOVX @DPTR,A MOV ASMBUF+3,#1 ;SW-BREAK FLAG GO4: LCALL EXIT ;EXIT PROCESS MOV SP,VTSP PUSH RUNADD+1 ;PC PUSH RUNADD RET ;GO GOERRT: DB "No Program !",07H,0DH ; ********** BRK ********** ; SOFTWARE-BREAK RETURN BRK: MOV VTSP,SP ;RETURN BY SOFTWARE-BREAK MOV SP,#STACK LCALL RETS MOV RUNADD,BRKADD MOV RUNADD+1,BRKADD+1 LCALL BRKCHK MOV DPH,RUNADD MOV DPL,RUNADD+1 LCALL SBYTEW MOV DPTR,#BRKTB LCALL SBLOCK LJMP MAIN BRKTB: DB " Break",0DH ; ********** BRKCHK SUB ********** ; BREAK CHECK SUB. FOR RESET,ENDVEC ; MEANING - SET SW-BREAK,TRACE-BREAK BUT NOT PASS-BREAK-ADDRESS BRKCHK: MOV A,ASMBUF+3 ;BREAK FLAG CJNE A,#0,BRKCHK1 RET BRKCHK1: CJNE A,#1,BRKCHK3 MOV DPH,BRKADD ;SW-BREAK MOV DPL,BRKADD+1 BRKCHK2: MOV A,ASMBUF ;BYTE 0 MOVX @DPTR,A INC DPTR MOV A,ASMBUF+1 ;BYTE 1 MOVX @DPTR,A INC DPTR MOV A,ASMBUF+2 ;BYTE 2 MOVX @DPTR,A RET BRKCHK3: MOV DPH,DESADD ;TRACE-BREAK MOV DPL,DESADD+1 SJMP BRKCHK2 ; ********** ENDV ********** ; RETURN TO MONITOR ENDV: MOV VTSP,SP ;RET FROM USER PROGRAM MOV SP,#STACK LCALL RETS ENDV1: LCALL BRKCHK MOV DPTR,#ENDVT LCALL SBLOCK LJMP MAIN ENDVT: DB "End Program ...",0DH ; ********** EXIT SUB ********** ; LOAD SFR & Rn FOR USER PROGRAM (EXCEPT SP) EXIT: MOV A,VTPSW ANL A,#18H CJNE A,#0,EXIT1 ;REG IS NOT BANK-0 MOV R0,VTREG ;REG (ONLY BANK-0) MOV R1,VTREG+1 MOV R2,VTREG+2 MOV R3,VTREG+3 MOV R4,VTREG+4 MOV R5,VTREG+5 MOV R6,VTREG+6 MOV R7,VTREG+7 EXIT1: MOV DPL,VTDPL ;SFR MOV DPH,VTDPH MOV PSW,VTPSW MOV A,VTACC MOV B,VTB RET ; ********** RETS SUB ********** ; RETURN SFR & Rn FROM USER PROGRAM (EXCEPT SP) RETS: MOV VTDPL,DPL ;SFR MOV VTDPH,DPH MOV VTPSW,PSW MOV VTACC,A MOV VTB,B CLR RS0 ;REG BANK-0 CLR RS1 MOV VTREG,R0 MOV VTREG+1,R1 MOV VTREG+2,R2 MOV VTREG+3,R3 MOV VTREG+4,R4 MOV VTREG+5,R5 MOV VTREG+6,R6 MOV VTREG+7,R7 RET ; ********** HELP ********** HELP: LCALL CEND MOV DPTR,#HELPT HELP1: CLR A MOVC A,@A+DPTR INC DPTR CJNE A,#0,$+6 LJMP MAIN CJNE A,#0DH,$+6 LJMP HELP4 LCALL SBYTE SJMP HELP1 HELP4: LCALL SLF SJMP HELP1 HELPT: DB "REM55 Command Summary ...",0DH DB "A addr Assembler",0DH DB "B [addr] Break Set/Display",0DH DB "C range addr Compare Block",0DH DB " range H byte Compare Byte",0DH DB "D [addr] [addr] Display Memory",0DH DB "E addr Enter Data",0DH DB "F range byte Fill Memory",0DH DB "G [addr] Go (Run)",0DH DB "H Help",0DH DB "I [addr] Internal RAM Set/Display",0DH DB "L [addr] downLoad INTEL-HEX File from PC",0DH DB "M range addr Move Momory",0DH DB "N New (Clear User INT-RAM, Register & SFR)",0DH DB "O bit-port [0,1] Out Port",0DH DB "P range uPload INTEL-HEX File to PC",0DH DB "Q Quit (Power off or Reset)",0DH DB "R [reg value] Register & SFR Set/Display",0DH DB "S range byte ... Search Memory (8 Byte Max)",0DH DB "T [addr] Trace (Single Step)",0DH DB "U [addr] [addr] Unassembler (Program Memory)",0DH DB "V Vector Address Interrupt",0DH DB "X range Find Checksum",0DH DB "Y port In Port",0DH,0 ; ********** INTR ********** ; INTERNAL RAM DISPLAY INTR: LCALL CHEX CJNE R5,#0,$+6 LJMP INTR1 LJMP INTE INTR1: MOV R7,#0 ;ADDRESS INTR2: MOV A,R7 ;PRINT ADDRESS LCALL SBYTEH MOV A,#':' LCALL SBYTE LCALL S1B MOV R6,#8 ;PRINT DATA IN HEX MOV A,R7 MOV R5,A INTR3: MOV A,R5 ;FIRST 8 BYTE HEX LCALL RDINT INC R5 LCALL SBYTEH LCALL S1B DJNZ R6,INTR3 MOV A,#'-' LCALL SBYTE LCALL S1B MOV R6,#8 INTR31: MOV A,R5 ;SECOND 8 BYTE HEX LCALL RDINT INC R5 LCALL SBYTEH LCALL S1B DJNZ R6,INTR31 CJNE R7,#40H,$+5 ;CHECK WORKING (*) SJMP INTR38 CJNE R7,#50H,$+5 SJMP INTR38 CJNE R7,#60H,$+5 SJMP INTR38 CJNE R7,#70H,$+5 SJMP INTR38 CJNE R7,#80H,$+5 SJMP INTR38 CJNE R7,#90H,$+5 SJMP INTR38 CJNE R7,#0A0H,INTR39 INTR38: MOV A,#'*' LCALL SBYTE SJMP INTR3A INTR39: LCALL S1B INTR3A: LCALL S1B MOV R6,#16 ;PRINT DATA IN ASCII INTR4: MOV A,R7 LCALL RDINT INC R7 CJNE A,#7FH,$+3 JNC INTR40 ;=>7F CJNE A,#20H,$+3 JNC INTR41 ;=>20 INTR40: MOV A,#'.' LCALL SBYTE SJMP INTR42 INTR41: LCALL SBYTE INTR42: DJNZ R6,INTR4 LCALL SLF CJNE R7,#0,INTR8 INTR7: MOV DPTR,#INTRT1 LCALL SBLOCK LJMP MAIN INTR8: LJMP INTR2 INTRT1: DB "( * = Monitor Working Area )",0DH ; READ INTERNAL-RAM (VIRTUAL CARE) ; IN = A ADDRESS ; OUT = A DATA ; REG = A,R0 RDINT: CJNE A,#8,$+3 JNC RDINT1 ADD A,#VTREG ;VIRTUAL RDINT1: MOV R0,A MOV A,@R0 RET ; WRITE INTERNAL-RAM (VIRTUAL CARE) ; IN = A ADDRESS ; = R2 DATA ; REG = A,R0 WRINT: CJNE A,#8,$+3 JNC WRINT1 ADD A,#VTREG ;VIRTUAL WRINT1: MOV R0,A MOV A,R2 MOV @R0,A RET ; ********** INTE ********** ; INTERNAL RAM ENTER DATA INTE: CJNE R2,#0,$+6 LJMP INTE0 LJMP MAINE ;>1 BYTE INTE0: MOV STTADD,R3 LCALL CEND INTE2: MOV A,STTADD LCALL SBYTEH MOV A,#':' LCALL SBYTE MOV A,STTADD LCALL RDINT LCALL SBYTEH LCALL S1B LCALL INPUT MOV DPTR,#INPBUF LCALL NEXT CJNE R5,#0,$+6 LJMP MAIN ;CR CJNE R4,#1,$+6 LJMP INTE8 ;NOT HEX CJNE R2,#0,INTE8 ;>1 BYTE MOV A,R3 PUSH ACC LCALL NEXT POP ACC CJNE R5,#0,INTE8 MOV R2,A MOV A,STTADD LCALL WRINT ;WRITE MOV A,STTADD INC A MOV STTADD,A SJMP INTE2 INTE8: MOV A,#07H ;BEEP & AGAIN LCALL SBYTE LJMP INTE2 ; ********** LOAD ********** ; DOWNLOAD INTEL-HEX FILE FROM PC LOAD: LCALL CHEX CJNE R5,#0,$+6 LJMP LOAD2 MOV STTADD,R2 ;STEAM ADDRESS FROM COMMAND MOV STTADD+1,R3 MOV R6,#1 ;SET STEAM FLAG LCALL CEND SJMP RECVX LOAD2: MOV STTADD,#0 ;CLEAR OFFSET ADDRESS MOV STTADD+1,#0 MOV R6,#0 ;CLEAR STEAM FLAG RECVX: MOV DPTR,#LOADM1 LCALL SBLOCK RECV0: LCALL 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,#'O',$+6 LJMP RECVO CJNE A,#'S',$+6 LJMP RECVS CJNE A,#':',$+6 LJMP RECV11 LJMP RECVE RECV1: LCALL RBYTE CJNE A,#':',RECV1 RECV11: MOV R7,#0 ;CLEAR CHECKSUM LCALL RBYTEHC ;BYTE COUNT MOV R5,A ;COUNTER LCALL RBYTEHC MOV DPH,A ;ADDRESS HIGH LCALL RBYTEHC MOV DPL,A ;ADDRESS LOW LCALL 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 LCALL 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 LCALL DPADD RECV2: LCALL RBYTEHC ;DATA LOOP MOVX @DPTR,A INC DPTR DJNZ R5,RECV2 MOV A,R7 ;CHECKSUM CPL A INC A MOV B,A LCALL RBYTEHC CJNE A,B,RECVE LCALL RBYTE ;CR LCALL RBYTE ;LF SJMP RECV1 RECV8: MOV A,R7 ;END OF FILE CPL A INC A MOV B,A LCALL RBYTEH CJNE A,B,RECVE LCALL RBYTE ;CR LCALL RBYTE ;LF LJMP MAIN RECVE: MOV DPTR,#LOADME ;ERROR LCALL SBLOCK LJMP MAIN RECVS: MOV R6,#1 ;STREAM RECEIVE RECVO: LCALL RBYTEH ;OFFSET RECEIVE MOV STTADD,A ;ADDRESS HIGH LCALL RBYTEH MOV STTADD+1,A ;ADDRESS LOW LCALL RBYTE ;CR LCALL RBYTE ;LF LJMP RECV0 LOADM1: DB "Download INTEL-HEX File ...",0DH LOADME: DB "Download ERROR !",07H,0DH ; ********** MOVE ********** ; MOVE DATA MEMORY MOVE: LCALL CHEX CJNE R5,#0,$+6 LJMP MAINEX MOV STTADD,R2 MOV STTADD+1,R3 LCALL CHEX CJNE R5,#0,$+6 LJMP MAINEX MOV ENDADD,R2 MOV ENDADD+1,R3 LCALL CHEX CJNE R5,#0,$+6 LJMP MAINEX MOV DESADD,R2 MOV DESADD+1,R3 LCALL NEXT CJNE R5,#0,MOVEE MOV R2,STTADD MOV R3,STTADD+1 MOV R4,ENDADD MOV R5,ENDADD+1 MOV R6,DESADD MOV R7,DESADD+1 LCALL MOVES LJMP MAIN MOVEE: LJMP MAINE ; ********** NEW ********** NEW: LCALL CEND MOV R0,#08H ;CLEAR USER INT-RAM (LOW) MOV R2,#64-8 NEW4: MOV @R0,#0 INC R0 DJNZ R2,NEW4 MOV R0,#0B0H ;CLEAR USER INT-RAM (UP) MOV R2,#80 NEW41: MOV @R0,#0 INC R0 DJNZ R2,NEW41 MOV R0,#VTREG ;CLEAR VIRTUAL REG. MOV R2,#8 NEW5: MOV @R0,#0 INC R0 DJNZ R2,NEW5 NEWX: MOV VTACC,#0 ;SFR MOV VTB,#0 MOV VTPSW,#0 MOV VTSP,#7 MOV VTDPH,#0 MOV VTDPL,#0 MOV P1,#0FFH MOV RUNADD,#80H MOV RUNADD+1,#0 LJMP MAIN ; ********** UPLOAD ********** ; UPLOAD INTEL-HEX FILE UPLOAD: LCALL CHEX CJNE R5,#0,$+6 LJMP MAINEX MOV STTADD,R2 MOV STTADD+1,R3 LCALL CHEX CJNE R5,#0,$+6 LJMP MAINEX MOV ENDADD,R2 MOV ENDADD+1,R3 LCALL CEND MOV DPTR,#UPLDM1 ;MESSAGE LCALL SBLOCK MOV DPTR,#UPLDM3 LCALL SBLOCK UPLOAD1: LCALL RBYTE ;WAIT ENTER CJNE A,#0DH,UPLOAD1 MOV DPH,STTADD MOV DPL,STTADD+1 MOV R5,#0 ;CLEAR END FLAG SEND0: MOV R7,#0 ;START CHECK SUM MOV A,#':' ;FIRST BYTE LCALL SBYTE LCALL SENDC ;CHECK LOOP COUNTER MOV A,R6 LCALL SBYTEHC MOV A,DPH LCALL SBYTEHC ;ADDRESS MOV A,DPL LCALL SBYTEHC CLR A LCALL SBYTEHC ;00 SEND1: MOVX A,@DPTR LCALL SBYTEHC ;DATA INC DPTR DJNZ R6,SEND1 MOV A,R7 ;CHECKSUM CPL A INC A LCALL SBYTEH LCALL SLF CJNE R5,#1,SEND0 MOV DPTR,#SENDTB ;END LINE LCALL SBLOCK SEND4: LCALL 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 LCALL 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 UPLDM3: DB "Type ENTER to Start and Finish",0DH ; ********** QUIT ********** QUIT: LCALL CEND MOV DPTR,#QUITTB LCALL SBLOCK MOV POWMEM,#0 ;CLEAR POWER CODE SJMP $ ;SLEEP QUITTB: DB "REM55 QUIT ! Power off or Reset ...",0DH ; ********** REG ********** ; REGISTER DISPLAY REG: LCALL NEXT CJNE R5,#0,$+6 LJMP REG4 LJMP REGS REG4: MOV DPTR,#REGT1 ;DISPLAY LCALL SBLOCK MOV A,VTPSW RR A RR A RR A ANL A,#03H ORL A,#30H LCALL SBYTE ;BANK NO. LCALL SLF MOV DPTR,#REGT2 LCALL SBLOCK MOV A,VTPSW ;REGISTER DISPLAY RR A RR A RR A ANL A,#03H MOV B,#8 MUL AB ;A=ADDRESS MOV R7,#8 ;R0-R7 REG5: PUSH ACC LCALL RDINT LCALL SBYTEH LCALL S1B POP ACC INC A DJNZ R7,REG5 CJNE A,#8,REG51 MOV A,#'*' LCALL SBYTE REG51: LCALL SLF MOV DPTR,#REGT3 ;SFR DISPLAY LCALL SBLOCK MOV DPTR,#REGT4 ;SP LCALL SBLOCK MOV A,VTSP LCALL REGDV LCALL SBLOCK ;DPH MOV A,VTDPL LCALL REGDV LCALL SBLOCK ;DPL MOV A,VTDPH LCALL REGDV LCALL SLF LCALL SBLOCK ;PCON MOV A,PCON LCALL REGDN LCALL SBLOCK ;TCON MOV A,TCON LCALL REGDN LCALL SBLOCK ;TMOD MOV A,TMOD LCALL REGDN LCALL SLF LCALL SBLOCK ;P1 MOV A,P1 LCALL REGDN LCALL SBLOCK ;SCON MOV A,SCON LCALL REGDN LCALL SBLOCK ;IE MOV A,IE LCALL REGDN LCALL SLF LCALL SBLOCK ;IP MOV A,IP LCALL REGDN LCALL SBLOCK ;T2CON MOV A,T2CON LCALL REGDN LCALL SBLOCK ;PSW MOV A,VTPSW LCALL REGDV LCALL SLF LCALL SBLOCK ;ACC MOV A,VTACC LCALL REGDV LCALL SBLOCK ;B MOV A,VTB LCALL REGDV LCALL SLF MOV DPTR,#REGT5 LCALL SBLOCK LCALL S1B MOV DPH,RUNADD MOV DPL,RUNADD+1 LCALL SBYTEW LCALL S1B LCALL S1B MOV DPTR,#REGT6 LCALL SBLOCK LJMP MAIN REGT1: DB "Register Bank ",0 REGT2: DB "R0 R1 R2 R3 R4 R5 R6 R7",0DH REGT3: DB "Special Function Registers (SFR)",0DH REGT5: DB "Program Counter =",0 REGT6: DB "( * = Virtual Register )",0DH REGT4: DB " SP",0 DB " DPL",0 DB " DPH",0 DB " PCON",0 DB " TCON",0 DB " TMOD",0 DB " P1",0 DB " SCON",0 DB " IE",0 DB " IP",0 DB "T2CON",0 DB " PSW",0 DB " ACC",0 DB " B",0 DB " R0",0 ;FOR REGS DB " R1",0 DB " R2",0 DB " R3",0 DB " R4",0 DB " R5",0 DB " R6",0 DB " R7",0 ; REGD SUB ; DISPLAY HEX & BINARY ROUTINE ; IN = A DATA ; REG = ALL,IXDATA REGD: MOV IXDATA,A ;HEX MOV A,#'=' LCALL SBYTE MOV A,IXDATA LCALL SBYTEH LCALL S1B MOV A,#'<' LCALL SBYTE MOV A,IXDATA ;BINARY MOV R7,#8 REGD1: RLC A PUSH ACC ;--\ JC REGD12 MOV A,#'0' LCALL SBYTE SJMP REGD13 REGD12: MOV A,#'1' LCALL SBYTE REGD13: POP ACC ;--/ DJNZ R7,REGD1 MOV A,#'>' LCALL SBYTE RET REGDV: LCALL REGD ;VIRTUAL DISPLAY LCALL S1B MOV A,#'*' LCALL SBYTE LCALL S1B LCALL S1B RET REGDN: LCALL REGD ;NORMAL DISPLAY LCALL S1B LCALL S1B LCALL S1B LCALL S1B RET ; ********** REGS ********** ; REGISTER SET REGS: CJNE R5,#6,$+3 JC REGS1 LJMP MAINE ;CHAR>5 REGS1: MOV ENDADD,DPH ;BACKUP LAST ADDRESS OF INPBUF MOV ENDADD+1,DPL MOV R0,#ASMBUF+4 ;MOVE REG-FIELD TO ASMBUF REGS2: LCALL DPDEC LCALL INPAX MOV @R0,A DEC R0 DJNZ R5,REGS2 REGS3: CJNE R0,#ASMBUF,$+3 ;PRE-FIELD BY BLANK JC REGS4 MOV @R0,#' ' DEC R0 SJMP REGS3 REGS4: MOV R2,#HIGH REGT4 ;COMPARE WITH TABLE MOV R3,#LOW REGT4 MOV R6,#1 ;COUNTER REGS41: MOV DPH,R2 ;COMPARE 5 BYTE MOV DPL,R3 MOV R0,#ASMBUF MOV R7,#5 REGS42: MOV A,@R0 MOV IXDATA,A CLR A MOVC A,@A+DPTR CJNE A,IXDATA,REGS45 INC R0 INC DPTR DJNZ R7,REGS42 SJMP REGS5 ;= REGS45: INC R6 CJNE R6,#22+1,REGS46 MOV DPH,ENDADD MOV DPL,ENDADD+1 LJMP MAINE ;REG. NAME ERROR REGS46: MOV DPTR,#6 ;NEXT COMPARE LCALL DPADD MOV R2,DPH MOV R3,DPL SJMP REGS41 ;BACK LOOP REGS5: MOV IXDATA,R6 MOV DPH,ENDADD MOV DPL,ENDADD+1 LCALL CHEX ;VALUE FIELD CJNE R5,#0,$+6 LJMP MAINEX CJNE R2,#0,$+6 LJMP REGS6 LJMP MAINE REGS6: MOV IXDATA+1,R3 LCALL CEND MOV R3,IXDATA+1 MOV A,IXDATA CJNE A,#1,REGS71 MOV VTSP,R3 ;SP SJMP REGS9 REGS71: CJNE A,#2,REGS72 MOV VTDPL,R3 ;DPL SJMP REGS9 REGS72: CJNE A,#3,REGS73 MOV VTDPH,R3 ;DPH SJMP REGS9 REGS73: CJNE A,#4,REGS74 MOV PCON,R3 ;PCON SJMP REGS9 REGS74: CJNE A,#5,REGS75 MOV TCON,R3 ;TCON SJMP REGS9 REGS75: CJNE A,#6,REGS76 MOV TMOD,R3 ;TMOD SJMP REGS9 REGS76: CJNE A,#7,REGS77 MOV P1,R3 ;P1 SJMP REGS9 REGS77: CJNE A,#8,REGS78 MOV SCON,R3 ;SCON SJMP REGS9 REGS78: CJNE A,#9,REGS79 MOV IE,R3 ;IE SJMP REGS9 REGS79: CJNE A,#10,REGS80 MOV IP,R3 ;IP SJMP REGS9 REGS80: CJNE A,#11,REGS81 MOV T2CON,R3 ;T2CON SJMP REGS9 REGS81: CJNE A,#12,REGS82 MOV VTPSW,R3 ;PSW SJMP REGS9 REGS82: CJNE A,#13,REGS83 MOV VTACC,R3 ;ACC SJMP REGS9 REGS83: CJNE A,#14,REGS84 MOV VTB,R3 ;B SJMP REGS9 REGS84: CLR C ;REGISTER R0-R7 SUBB A,#15 MOV R2,A MOV A,VTPSW ;FIND REGISTER BANK RR A RR A RR A ANL A,#03H MOV B,#8 MUL AB ;A=BANK ADDRESS ADD A,R2 ;A=REGISTER ADDRESS MOV B,R3 MOV R2,B LCALL WRINT REGS9: LJMP MAIN ; ********** SEA ********** ; SEARCH MEMORY SEAE: LJMP MAINE SEA: LCALL CHEX CJNE R5,#0,$+6 LJMP MAINEX MOV STTADD,R2 MOV STTADD+1,R3 LCALL CHEX CJNE R5,#0,$+6 LJMP MAINEX MOV ENDADD,R2 MOV ENDADD+1,R3 LCALL CHEX CJNE R5,#0,$+6 LJMP MAINEX CJNE R2,#0,SEAE MOV ASMBUF,R3 ;FIRST BYTE MOV R0,#ASMBUF+1 ;CLEAR ASMBUF (8 BYTE) MOV R2,#8 SEA1: MOV @R0,#0 INC R0 DJNZ R2,SEA1 MOV IXDATA,#ASMBUF+1 ;NEXT BYTE SEA2: LCALL CHEX CJNE R5,#0,$+6 LJMP SEA4 MOV R0,IXDATA CJNE R0,#ASMBUF+8,$+6 LJMP MAINE ;>8 BYTE CJNE R2,#0,SEAE ;NOT 8 BIT HEX MOV A,R3 MOV @R0,A INC R0 MOV IXDATA,R0 SJMP SEA2 SEA4: MOV DPH,STTADD ;SEARCH PROCESS MOV DPL,STTADD+1 SEA5: PUSH DPH ;--\ PUSH DPL MOV R0,#ASMBUF ;COMPARE STRING SEA51: MOVX A,@DPTR CLR C SUBB A,@R0 JNZ SEA7 ;NOT EQUAL INC DPTR INC R0 CJNE @R0,#0,SEA51 MOV DPH,STTADD ;DISPLAY ADDRESS MOV DPL,STTADD+1 LCALL SBYTEW LCALL SLF SEA7: POP DPL ;--/ POP DPH MOV R2,ENDADD MOV R3,ENDADD+1 LCALL DPCOM INC DPTR MOV STTADD,DPH MOV STTADD+1,DPL JNZ SEA5 LJMP MAIN ; ********** TRACE ********** TRACE: LCALL CHEX CJNE R5,#0,$+6 LJMP TRACE1 ;AUTO PC MOV RUNADD,R2 MOV RUNADD+1,R3 LCALL CEND TRACE1: MOV DPH,RUNADD ;CHECK OPCODE LENGTH MOV DPL,RUNADD+1 CLR A MOVC A,@A+DPTR MOV DPH,#0 MOV DPL,A MOV R2,#0 MOV R3,#5 LCALL DPMUL MOV R2,#HIGH MCS51T MOV R3,#LOW MCS51T LCALL DPADD ;DPTR=TABLE MOV A,#4 MOVC A,@A+DPTR ANL A,#0FH ;LENGTH MOV R2,#0 ;NEXT OPCODE MOV R3,A MOV DPH,RUNADD MOV DPL,RUNADD+1 LCALL DPADD MOV DESADD,DPH ;BACKUP BREAK ADDRESS MOV DESADD+1,DPL MOVX A,@DPTR ;LCALL OP-CODE MOV ASMBUF,A MOV A,#02H MOVX @DPTR,A INC DPTR MOVX A,@DPTR ;TBKVEC H-ADDRESS MOV ASMBUF+1,A MOV A,#HIGH TBKVEC MOVX @DPTR,A INC DPTR MOVX A,@DPTR ;TBKVEC L-ADDRESS MOV ASMBUF+2,A MOV A,#LOW TBKVEC MOVX @DPTR,A MOV ASMBUF+3,#2 ;TRACE-BREAK FLAG LCALL EXIT ;EXIT PROCESS MOV SP,VTSP PUSH RUNADD+1 ;PC PUSH RUNADD RET ;GO ; ********** TBK ********** ; TRACE-BREAK RETURN TBK: MOV VTSP,SP ;RETURN BY TRACE-BREAK MOV SP,#STACK LCALL RETS MOV RUNADD,DESADD MOV RUNADD+1,DESADD+1 LCALL BRKCHK MOV DPTR,#TBKT1 ;DISPLAY TRACE PROCESS LCALL SBLOCK ;PC MOV DPH,RUNADD MOV DPL,RUNADD+1 LCALL SBYTEW MOV DPTR,#TBKT2 ;A LCALL SBLOCK MOV A,VTACC LCALL SBYTEH MOV DPTR,#TBKT3 ;B LCALL SBLOCK MOV A,VTB LCALL SBYTEH MOV DPTR,#TBKT4 ;DPTR LCALL SBLOCK MOV DPH,VTDPH MOV DPL,VTDPL LCALL SBYTEW MOV DPTR,#TBKT5 ;PSW LCALL SBLOCK MOV A,VTPSW LCALL SBYTEH MOV DPTR,#TBKT6 ;SP LCALL SBLOCK MOV A,VTSP LCALL SBYTEH MOV DPTR,#TBKT7 ;R0-R7 LCALL SBLOCK MOV A,VTPSW ;FIND BANK RR A RR A RR A ANL A,#03H MOV B,#8 MUL AB ;A=ADDRESS MOV R7,#8 ;R0-R7 TBK5: PUSH ACC LCALL RDINT LCALL SBYTEH LCALL S1B POP ACC INC A DJNZ R7,TBK5 LCALL SLF LJMP MAIN TBKT1: DB "PC=",0 TBKT2: DB " A=",0 TBKT3: DB " B=",0 TBKT4: DB " DPTR=",0 TBKT5: DB " PSW=",0 TBKT6: DB " SP=",0 TBKT7: DB " R0-R7=",0 ; ********** UASM ********** ; UNASSEMBLER (PROGRAM MEMORY) ; DESADD = AUTO LINE FLAG UASM: LCALL CHEX CJNE R5,#0,UASM1 MOV DESADD,#1 ;AUTO ADDRESS LCALL UASMX LJMP MAIN UASM1: MOV PMMADD,R2 MOV PMMADD+1,R3 LCALL CHEX CJNE R5,#0,UASM2 MOV DESADD,#1 ;ADDR1 LCALL UASMX LJMP MAIN UASM2: MOV ENDADD,R2 MOV ENDADD+1,R3 LCALL CEND MOV DESADD,#0 ;ADDR1 ADDR2 LCALL UASMX LJMP MAIN ; ********** UASMX SUB ********** ; IN = PMMADD START ADDRESS ; = ENDADD END ADDRESS (NOT USE IF AUTO) ; = DESADD AUTO LINE FLAG (1 BYTE) ; REG = ALL UASMX: MOV DESADD+1,#0 ;LINE COUNT UASMX1: MOV DPH,PMMADD ;FIND TABLE MOV DPL,PMMADD+1 CLR A MOVC A,@A+DPTR MOV DPH,#0 MOV DPL,A MOV R2,#0 MOV R3,#5 LCALL DPMUL MOV R2,#HIGH MCS51T MOV R3,#LOW MCS51T LCALL DPADD MOV IXDATA,DPH ;TABLE ADDRESS MOV IXDATA+1,DPL MOV A,PMMADD ;**** ADDRESS **** LCALL SBYTEH MOV A,PMMADD+1 LCALL SBYTEH MOV A,#':' LCALL SBYTE LCALL S1B MOV DPH,IXDATA ;**** OPCODE **** MOV DPL,IXDATA+1 MOV A,#4 MOVC A,@A+DPTR ANL A,#0FH CJNE A,#0,$+6 LJMP UASMXE MOV R7,A ;NO. OF BYTE MOV R6,#10 ;CHAR COUNT MOV DPH,PMMADD MOV DPL,PMMADD+1 UASMX2: CLR A MOVC A,@A+DPTR LCALL SBYTEH INC DPTR DEC R6 DEC R6 DJNZ R7,UASMX2 UASMX22: LCALL S1B ;BLANK DJNZ R6,UASMX22 MOV DPH,IXDATA ;**** MNEMONIC **** MOV DPL,IXDATA+1 CLR A MOVC A,@A+DPTR LCALL HTOM MOV R7,#5 UASMX3: CLR A MOVC A,@A+DPTR LCALL SBYTE INC DPTR DJNZ R7,UASMX3 LCALL S1B LCALL S1B UASMX4: MOV DPH,IXDATA ;**** OPERAND1 **** MOV DPL,IXDATA+1 MOV A,#1 MOVC A,@A+DPTR CJNE A,#0,$+6 LJMP UASMX8 ;NO OPERAND CJNE A,#1,$+6 LJMP UASMX40 ;IS ADDRESS LCALL HTOO LCALL SOPER LJMP UASMX5 UASMX40: MOV A,#4 ;IS ADDRESS (REPLACE BY HEX) MOVC A,@A+DPTR SWAP A ANL A,#0FH ;PATTERN MOV DPH,PMMADD MOV DPL,PMMADD+1 CJNE A,#1,UASMX41 MOV A,DPH ;ABSOLUTE ADDRESS (AJMP,ACALL) ANL A,#0F8H ;A15,A14,A13,A12,A11 MOV R2,A CLR A MOVC A,@A+DPTR SWAP A RR A ANL A,#07H ;A10,A9,A8 ORL A,R2 MOV R2,A MOV A,#1 MOVC A,@A+DPTR MOV R3,A ;A7,A6,A5,A4,A3,A2,A1,A0 LCALL SWORD LJMP UASMX5 UASMX41: CJNE A,#2,UASMX42 MOV A,#1 ;ADDRESS 16 BIT MOVC A,@A+DPTR MOV R2,A MOV A,#2 MOVC A,@A+DPTR MOV R3,A LCALL SWORD LJMP UASMX5 UASMX42: CJNE A,#12,UASMX43 MOV A,#1 ;ADDRESS RELATIVE MOVC A,@A+DPTR LCALL SREL LJMP UASMX5 UASMX43: CJNE A,#3,$+6 LJMP UASMX44 CJNE A,#4,UASMX45 UASMX44: MOV A,#1 ;BIT ADDRESS MOVC A,@A+DPTR LCALL SBITN LJMP UASMX5 UASMX45: CLR A ;INT-RAM , SFR ADDRESS MOVC A,@A+DPTR ;CHECK OP-CODE = 85H MOV R2,#1 CJNE A,#85H,UASMX46 MOV R2,#2 UASMX46: MOV A,R2 MOVC A,@A+DPTR LCALL SADDN UASMX5: MOV DPH,IXDATA ;**** OPERAND2 **** MOV DPL,IXDATA+1 MOV A,#2 MOVC A,@A+DPTR CJNE A,#0,$+6 LJMP UASMX8 ;NO OPERAND PUSH ACC MOV A,#',' LCALL SBYTE POP ACC CJNE A,#1,$+6 LJMP UASMX51 ;IS ADDRESS CJNE A,#2,$+6 LJMP UASMX51 ;IS #DATA CJNE A,#3,$+6 LJMP UASMX51 ;IS /ADDRESS LCALL HTOO LCALL SOPER LJMP UASMX6 UASMX51: MOV R7,A ;IS ADDRESS OR DATA (REPLACE BY HEX) MOV A,#4 ;R7 BACKUP OPERAND CODE MOVC A,@A+DPTR SWAP A ANL A,#0FH ;PATTERN MOV DPH,PMMADD MOV DPL,PMMADD+1 CJNE A,#3,UASMX53 CJNE R7,#3,UASMX52 MOV A,#'/' ;/BIT ADDRESS LCALL SBYTE UASMX52: MOV A,#1 ;BIT ADDRESS MOVC A,@A+DPTR LCALL SBITN LJMP UASMX6 UASMX53: CJNE A,#4,UASMX54 MOV A,#2 ;ADDRESS RELATIVE MOVC A,@A+DPTR LCALL SREL LJMP UASMX6 UASMX54: CJNE A,#5,UASMX55 MOV A,#1 ;INT-RAM , SFR ADDRESS MOVC A,@A+DPTR LCALL SADDN LJMP UASMX6 UASMX55: CJNE A,#6,UASMX56 CLR A ;INT-RAM , SFR ADDRESS MOVC A,@A+DPTR ;CHECK OP-CODE = 85H MOV R2,#2 CJNE A,#85H,UASMX551 MOV R2,#1 UASMX551:MOV A,R2 MOVC A,@A+DPTR LCALL SADDN JMP UASMX6 UASMX56: CJNE A,#7,UASMX57 MOV A,#'#' ;#DATA LCALL SBYTE MOV A,#2 MOVC A,@A+DPTR LCALL SBYT LJMP UASMX6 UASMX57: CJNE A,#8,UASMX58 CLR A ;CHECK OPCODE MOVC A,@A+DPTR CJNE A,#0B5H,UASMX571 MOV A,#1 ;INT-RAM , SFR ADDRESS MOVC A,@A+DPTR LCALL SADDN LJMP UASMX6 UASMX571:MOV A,#2 ;ADDRESS RELATIVE MOVC A,@A+DPTR LCALL SREL LJMP UASMX6 UASMX58: CJNE A,#11,UASMX59 MOV A,#'#' ;#DATA16 LCALL SBYTE MOV A,#1 MOVC A,@A+DPTR MOV R2,A MOV A,#2 MOVC A,@A+DPTR MOV R3,A LCALL SWORD LJMP UASMX6 UASMX59: CJNE A,#12,UASMX5A MOV A,#1 ;ADDRESS RELATIVE MOVC A,@A+DPTR LCALL SREL LJMP UASMX6 UASMX5A: MOV A,#'#' ;#DATA (9-10 PATTERN CODE) LCALL SBYTE MOV A,#1 MOVC A,@A+DPTR LCALL SBYT UASMX6: MOV DPH,IXDATA ;**** OPERAND3 **** MOV DPL,IXDATA+1 MOV A,#3 MOVC A,@A+DPTR CJNE A,#0,$+6 LJMP UASMX8 ;NO OPERAND PUSH ACC MOV A,#',' LCALL SBYTE POP ACC CJNE A,#1,$+6 LJMP UASMX61 ;IS ADDRESS LCALL HTOO LCALL SOPER LJMP UASMX8 UASMX61: MOV DPH,PMMADD ;IS ADDRESS (REPLACE BY HEX) MOV DPL,PMMADD+1 MOV A,#2 MOVC A,@A+DPTR LCALL SREL UASMX8: LCALL SLF MOV DPH,IXDATA ;NEXT ADDRESS MOV DPL,IXDATA+1 MOV A,#4 MOVC A,@A+DPTR ANL A,#0FH MOV R2,#0 MOV R3,A MOV DPH,PMMADD MOV DPL,PMMADD+1 LCALL DPADD MOV PMMADD,DPH MOV PMMADD+1,DPL MOV A,DESADD CJNE A,#1,UASMX81 INC DESADD+1 ;CHECK END BY LINE MOV A,DESADD+1 CJNE A,#16,UASMX9 RET ;EXIT UASMX81: MOV R2,ENDADD ;CHECK END BY ADDRESS MOV R3,ENDADD+1 LCALL DPCOM JZ UASMX9 JC UASMX9 RET ;EXIT UASMX9: LJMP UASMX1 UASMXE: MOV DPTR,#UASMXET ;UASM ERROR LCALL SBLOCK RET UASMXET: DB "Uassembler ERROR !",0DH ; ********** UASMX ANY-SUB ********** ; SWORD SUB (SEND 16 BIT ADDRESS) ; IN = R2,R3 ; REG = A,R2,R3 SWORD: MOV A,R2 SWAP A ANL A,#0FH CJNE A,#0AH,$+3 JC SWORD1 MOV A,#'0' ;ZERO BEFORE A-F LCALL SBYTE SWORD1: MOV A,R3 PUSH ACC ;--\ MOV A,R2 LCALL SBYTEH POP ACC ;--/ LCALL SBYTEH MOV A,#'H' LCALL SBYTE RET ; SBYT SUB (SEND 8 BIT ADDRESS) ; IN = A ; REG = A,R2,R3 SBYT: PUSH ACC SWAP A ANL A,#0FH CJNE A,#0AH,$+3 JC SBYT1 MOV A,#'0' ;ZERO BEFORE A-F LCALL SBYTE SBYT1: POP ACC LCALL SBYTEH MOV A,#'H' LCALL SBYTE RET ; SADDN SUB (SEND NAME OF INT-ADDRESS OR SFR) ; IN = A ; REG = ALL SADDN: MOV R6,A LCALL HTON CJNE A,#0,$+6 LJMP SADDN8 MOV R7,#6 ;SFR-NAME SADDN1: CLR A MOVC A,@A+DPTR CJNE A,#' ',SADDN2 RET SADDN2: LCALL SBYTE INC DPTR DJNZ R7,SADDN1 RET SADDN8: MOV A,R6 LCALL SBYT ;NOT SFR-NAME RET ; SBITN SUB (SEND NAME OF BIT-ADDRESS) ; IN = A ; REG = ALL SBITN: MOV R7,A LCALL HTOB CJNE A,#0,$+6 LJMP SBITN8 MOV R7,#5 ;BIT-NAME SBITN1: CLR A MOVC A,@A+DPTR CJNE A,#' ',SBITN2 RET SBITN2: LCALL SBYTE INC DPTR DJNZ R7,SBITN1 RET SBITN8: MOV A,R7 LCALL SBYT ;NOT BIT-NAME RET ; SOPER SUB (SEND OPERAND BY LENGHT) ; IN = DPTR INDEX TO OPERNAD NAME ; REG = ALL SOPER: MOV R7,#7 SOPER1: CLR A MOVC A,@A+DPTR CJNE A,#' ',SOPER2 RET SOPER2: LCALL SBYTE INC DPTR DJNZ R7,SOPER1 RET ; SREL SUB (SEND RELATIVE ADDRESS rr) ; IN = A RELATIVE ; = IXDATA OPCODE TABLE ; = PMMADD CURRENT ADDRESS ; REG = ALL SREL: MOV R7,A MOV DPH,IXDATA MOV DPL,IXDATA+1 MOV A,#4 MOVC A,@A+DPTR ANL A,#0FH ;NO. OF BYTE DEC A MOV DPH,PMMADD MOV DPL,PMMADD+1 MOV R2,#0 MOV R3,A LCALL DPADD ;DPTR=ADDRESS AT RELATIVE VALUE MOV R2,#0 MOV A,R7 MOV C,ACC.7 JC SREL4 INC A ;+127 MOV R3,A LCALL DPADD SJMP SREL7 SREL4: CPL A ;-128 MOV R3,A LCALL DPSUB SREL7: MOV R2,DPH MOV R3,DPL LCALL SWORD RET ; ********** VAR ********** ; VECTOR ADDRESS DISPLAY VAR: LCALL CEND MOV DPTR,#VART1 VAR1: CLR A MOVC A,@A+DPTR INC DPTR CJNE A,#0,$+6 LJMP MAIN CJNE A,#0DH,$+6 LJMP VAR2 LCALL SBYTE SJMP VAR1 VAR2: LCALL SLF SJMP VAR1 VART1: DB "Interrupts Vector Address ...",0DH VART2: DB "1. INT0 8003H",0DH DB "2. TF0 800BH",0DH DB "3. INT1 8013H",0DH DB "4. TF1 801BH",0DH DB "5. RI + TI 8023H",0DH DB "6. TF2 + EXF2 802BH",0DH DB "7. END-VECTOR 0033H",0DH,0 ; ********** CHECK ********** ; FIND CHECKSUM CHECK: LCALL CHEX ;ADDR1 CJNE R5,#0,$+6 LJMP MAINE CHECK1: MOV IXDATA,R2 MOV IXDATA+1,R3 LCALL CHEX ;ADDR2 CJNE R5,#0,$+6 LJMP MAINE CHECK12: MOV IYDATA,R2 MOV IYDATA+1,R3 LCALL CEND 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: MOVX A,@DPTR LCALL CHKINC LCALL DPCOM JNZ CHECK3 MOVX A,@DPTR LCALL CHKINC MOV A,IYDATA LCALL SBYTEH MOV A,IYDATA+1 LCALL SBYTEH LCALL SLF LJMP MAIN CHKINC: ADD A,IYDATA+1 MOV IYDATA+1,A MOV A,IYDATA ADDC A,#0 MOV IYDATA,A INC DPTR RET ; ********** OUTP ********** ; OUT PORT OUTP: LCALL CHEX CJNE R5,#0,$+6 LJMP MAINE OUTP1: MOV IXDATA,R3 LCALL CHEX CJNE R5,#0,$+6 LJMP MAINE OUTP2: MOV IXDATA+1,R3 LCALL CEND 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: LCALL CHEX CJNE R5,#0,$+6 LJMP MAINE TESTP0: MOV IXDATA,R3 LCALL CEND TESTP01: MOV A,IXDATA CJNE A,#0,TESTP1 MOV R7,#0 LCALL TESTS LJMP MAIN TESTP1: CJNE A,#1,TESTP2 MOV R7,#1 LCALL TESTS LJMP MAIN TESTP2: CJNE A,#2,TESTP3 MOV R7,#2 LCALL TESTS LJMP MAIN TESTP3: CJNE A,#3,TESTP4 MOV R7,#3 LCALL 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: LCALL SBYTE POP ACC DJNZ R5,TESTS6 MOV A,#0DH LCALL SBYTE JB RI,TESTS9 MOV R2,#0 ;DELAY TESTS8: MOV R3,#0 DJNZ R3,$ DJNZ R2,TESTS8 SJMP TESTS TESTS9: LCALL RBYTE LCALL SLF LJMP MAIN ; ********** TEXT SUB ********** ; SEARCH NEXT FIELD OF COMMAND LINE (FOR ASM ONLY) ; IN = DPTR START BUFFER ; OUT = DPTR NEXT BUFFER ; R5 CHARECTOR COUNT (0=NOTHING) ; REG = ALL TEXT: MOV R5,#0 TEXT0: LCALL INPAX ;BY PASS BLANK CJNE A,#' ',TEXT1 INC DPTR SJMP TEXT0 TEXT1: LCALL INPAX ;READ LOOP CJNE A,#' ',$+6 LJMP TEXT9 CJNE A,#0DH,$+6 LJMP TEXT9 INC R5 INC DPTR SJMP TEXT1 TEXT9: RET ;EXIT ; ********** NEXT SUB ********** ; SEARCH NEXT FIELD OF COMMAND LINE ; IN = DPTR START BUFFER ; OUT = DPTR NEXT BUFFER ; R2,R3 DATA IN HEX ; R4 TEXT FLAG 0=HEX 1=TEXT ; R5 CHARECTOR COUNT (0=NOTHING) ; REG = ALL NEXT: MOV R2,#0 MOV R3,#0 MOV R4,#0 MOV R5,#0 MOV R6,#1 ;FIRST FLAG NEXT0: LCALL INPAX ;BY PASS BLANK CJNE A,#' ',NEXT1 INC DPTR SJMP NEXT0 NEXT1: LCALL INPAX ;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 5 CJNE R4,#1,$+6 LJMP MAINE ;NOT HEX RET ; ********** CEND SUB ********** ; CHECK END INPBUF / IF END RETURN ELSE SYNTAX ERROR ; IN = DPTR START ADDRESS AT INPBUF ; OUT = SAME AS NEXT-SUB ; REG = ALL CEND: LCALL NEXT CJNE R5,#0,CEND1 RET CEND1: LJMP MAINE ;NOT END ; ********** INPUT SUB ********** ; INPUT TO INPBUF ; OUT = INPBUF (END BY 0DH) ; REG = ALL INPUT: MOV DPTR,#INPBUF INPUT1: LCALL RBYTE CJNE A,#0DH,INPUT2 LCALL INPXA LCALL SLF RET ;EXIT BY CR INPUT2: CJNE A,#08H,$+6 LJMP INPUT3 ;BACKSPACE CJNE A,#20H,$+3 JC INPUT4 ;<20H CJNE A,#7FH,$+3 JNC INPUT4 ;=>7FH LCALL SBYTE ;ECHO & WRITE BUFFER LCALL UPPER LCALL INPXA INC DPTR MOV R2,#HIGH INPEND MOV R3,#LOW INPEND LCALL DPCOM JC INPUT1 ; DEST ***** MOV DPL,R3 ;MOVE ADDRESS UP MOVX A,@DPTR MOV DPH,R6 MOV DPL,R7 MOVX @DPTR,A MOV DPH,R4 MOV DPL,R5 LCALL DPCOM JNZ MOVES41 RET ;FINISH MOVES41: MOV DPH,R2 ;NEXT ADDRESS MOV DPL,R3 INC DPTR MOV R2,DPH MOV R3,DPL MOV DPH,R6 MOV DPL,R7 INC DPTR MOV R6,DPH MOV R7,DPL SJMP MOVES4 ; ********** HTOM SUB ********** ; HEX-CODE TO MNEMONIC ; IN = A 1-44 (IN HEX) ; OUT = DPTR START TABLE ADDRESS ; REG = ALL HTOM: DEC A MOV B,#5 MUL AB MOV DPTR,#HTOMT MOV R2,#0 MOV R3,A LCALL DPADD RET ; ********** MTOH SUB ********** ; MNEMONIC TO HEX-CODE ; IN = ASMBUF START TABLE ADDRESS ; OUT = A HEX (0-44) 0=ERROR ; REG = ALL MTOH: MOV DPTR,#HTOMT MOV R4,#1 ;OUTPUT MTOH1: MOV R2,#5 MOV R3,#0 MOV R0,#ASMBUF MTOH2: MOV A,R3 ;COMPARE 5 BYTE MOVC A,@A+DPTR CLR C SUBB A,@R0 JNZ MTOH3 INC R0 INC R3 DJNZ R2,MTOH2 MOV A,R4 RET ;EXIT MTOH3: MOV R2,#0 MOV R3,#5 LCALL DPADD INC R4 CJNE R4,#44+1,MTOH1 ;NEXT COMPARE CLR A ;ERROR RET HTOMT: DB "ACALL" DB "ADD " DB "ADDC " DB "AJMP " DB "ANL " DB "CJNE " DB "CLR " DB "CPL " DB "DA " DB "DEC " DB "DIV " DB "DJNZ " DB "INC " DB "JB " DB "JBC " DB "JC " DB "JMP " DB "JNB " DB "JNC " DB "JNZ " DB "JZ " DB "LCALL" DB "LJMP " DB "MOV " DB "MOVC " DB "MOVX " DB "MUL " DB "NOP " DB "ORL " DB "POP " DB "PUSH " DB "RET " DB "RETI " DB "RL " DB "RLC " DB "RR " DB "RRC " DB "SETB " DB "SJMP " DB "SUBB " DB "SWAP " DB "XCH " DB "XCHD " DB "XRL " ; ********** HTOO SUB ********** ; HEX-CODE TO OPERAND ; IN = A 4-20 (IN HEX) ; OUT = DPTR START TABLE ADDRESS ; REG = ALL HTOO: CJNE A,#4,$+3 JNC HTOO1 RET HTOO1: CLR C SUBB A,#4 MOV B,#7 MUL AB MOV DPTR,#HTOOT MOV R2,#0 MOV R3,A LCALL DPADD RET ; ********** OTOH SUB ********** ; OPERAND TO HEX-CODE ; IN = ASMBUF START TABLE ADDRESS ; OUT = A HEX (4-20) 0=ERROR ; REG = ALL OTOH: MOV DPTR,#HTOOT MOV R4,#4 ;OUTPUT OTOH1: MOV R2,#7 MOV R3,#0 MOV R0,#ASMBUF OTOH2: MOV A,R3 ;COMPARE 7 BYTE MOVC A,@A+DPTR CLR C SUBB A,@R0 JNZ OTOH3 INC R0 INC R3 DJNZ R2,OTOH2 MOV A,R4 RET ;EXIT OTOH3: MOV R2,#0 MOV R3,#7 LCALL DPADD INC R4 CJNE R4,#20+1,OTOH1 ;NEXT COMPARE CLR A ;ERROR RET HTOOT: DB "@A+DPTR" DB "@A+PC " DB "@DPTR " DB "@R0 " DB "@R1 " DB "A " DB "AB " DB "C " DB "DPTR " DB "R0 " DB "R1 " DB "R2 " DB "R3 " DB "R4 " DB "R5 " DB "R6 " DB "R7 " ; ********** HTON SUB ********** ; HEX-CODE TO SFR-NAME ; IN = A SFR-ADDRESS ; OUT = DPTR START NAME ADDRESS ; = A 0=NOT FOUND 1=OK ; REG = ALL HTON: MOV R7,#26 MOV B,A MOV DPTR,#HTONT HTON1: CLR A MOVC A,@A+DPTR CJNE A,B,HTON2 INC DPTR ;FOUND MOV A,#1 RET HTON2: MOV R2,#0 MOV R3,#7 LCALL DPADD DJNZ R7,HTON1 ;NEXT CLR A RET ; ********** NTOH SUB ********** ; SFR-NAME TO HEX-CODE ; IN = ASMBUF START NAME ADDRESS ; OUT = A SFR-ADDRESS 0=ERROR ; REG = ALL NTOH: MOV DPTR,#HTONT+1 MOV R4,#26 NTOH1: MOV R2,#6 MOV R3,#0 MOV R0,#ASMBUF NTOH2: MOV A,R3 ;COMPARE 5 BYTE MOVC A,@A+DPTR CLR C SUBB A,@R0 JNZ NTOH3 INC R0 INC R3 DJNZ R2,NTOH2 LCALL DPDEC ;FOUND CLR A MOVC A,@A+DPTR RET ;EXIT NTOH3: MOV R2,#0 MOV R3,#7 LCALL DPADD DJNZ R4,NTOH1 ;NEXT COMPARE CLR A ;ERROR (NOT FOUND) RET HTONT: DB 080H,"P0 " DB 081H,"SP " DB 082H,"DPL " DB 083H,"DPH " DB 087H,"PCON " DB 088H,"TCON " DB 089H,"TMOD " DB 08AH,"TL0 " DB 08BH,"TL1 " DB 08CH,"TH0 " DB 08DH,"TH1 " DB 090H,"P1 " DB 098H,"SCON " DB 099H,"SBUF " DB 0A0H,"P2 " DB 0A8H,"IE " DB 0B0H,"P3 " DB 0B8H,"IP " DB 0C8H,"T2CON " DB 0CAH,"RCAP2L" DB 0CBH,"RCAP2H" DB 0CCH,"TL2 " DB 0CDH,"TH2 " DB 0D0H,"PSW " DB 0E0H,"ACC " DB 0F0H,"B " ; ********** HTOB SUB ********** ; HEX-CODE TO BIT-NAME ; IN = A 80-F7 (IN HEX) ; OUT = DPTR START TABLE ADDRESS ; = A 0=NOT FOUND 1=OK ; REG = ALL HTOB: CJNE A,#80H,$+3 JNC HTOB1 CLR A ;<80H RET HTOB1: CLR C ;INDEX SUBB A,#80H MOV DPH,#0 MOV DPL,A MOV R2,#0 MOV R3,#5 LCALL DPMUL MOV R2,#HIGH HTOBT MOV R3,#LOW HTOBT LCALL DPADD CLR A ;CHECK BLANK NAME MOVC A,@A+DPTR CJNE A,#' ',HTOB2 CLR A RET ;NOT FOUND EXIT HTOB2: MOV A,#1 RET ;FOUND EXIT ; ********** BTOH SUB ********** ; BIT-NAME TO HEX-CODE ; IN = ASMBUF START TABLE ADDRESS ; OUT = A HEX (80-F7) 0=ERROR ; REG = ALL BTOH: MOV DPTR,#HTOBT MOV R4,#80H ;OUTPUT BTOH1: MOV R2,#5 MOV R3,#0 MOV R0,#ASMBUF BTOH2: MOV A,R3 ;COMPARE 5 BYTE MOVC A,@A+DPTR CLR C SUBB A,@R0 JNZ BTOH3 INC R0 INC R3 DJNZ R2,BTOH2 MOV A,R4 RET ;EXIT BTOH3: MOV R2,#0 MOV R3,#5 LCALL DPADD INC R4 BTOH4: CJNE R4,#0F7H+1,BTOH1 ;NEXT COMPARE CLR A ;ERROR RET HTOBT: DB "P0.0 " ;P0 (80) DB "P0.1 " DB "P0.2 " DB "P0.3 " DB "P0.4 " DB "P0.5 " DB "P0.6 " DB "P0.7 " DB "IT0 " ;TCON (88) DB "IE0 " DB "IT1 " DB "IE1 " DB "TR0 " DB "TF0 " DB "TR1 " DB "TF1 " DB "P1.0 " ;P1 (90) DB "P1.1 " DB "P1.2 " DB "P1.3 " DB "P1.4 " DB "P1.5 " DB "P1.6 " DB "P1.7 " DB "RI " ;SCON (98) DB "TI " DB "RB8 " DB "TB8 " DB "REN " DB "SM2 " DB "SM1 " DB "SM0 " DB "P2.0 " ;P2 (A0) DB "P2.1 " DB "P2.2 " DB "P2.3 " DB "P2.4 " DB "P2.5 " DB "P2.6 " DB "P2.7 " DB "EX0 " ;IE (A8) DB "ET0 " DB "EX1 " DB "ET1 " DB "ES " DB "ET2 " DB " " DB "EA " DB "RXD " ;P3 (B0) DB "TXD " DB "INT0 " DB "INT1 " DB "T0 " DB "T1 " DB "WR " DB "RD " DB "PX0 " ;IP (B8) DB "PT0 " DB "PX1 " DB "PT1 " DB "PS " DB "PT2 " DB " " DB " " DB " " ; (C0) DB " " DB " " DB " " DB " " DB " " DB " " DB " " DB "CPRL2" ; (C8) DB "CT2 " DB "TR2 " DB "EXEN2" DB "TLCK " DB "RCLK " DB "EXF2 " DB "TF2 " DB "P " ;PSW (D0) DB " " DB "OV " DB "RS0 " DB "RS1 " DB "F0 " DB "AC " DB "CY " DB " " ; (D8) DB " " DB " " DB " " DB " " DB " " DB " " DB " " DB "ACC.0" ;ACC (E0) DB "ACC.1" DB "ACC.2" DB "ACC.3" DB "ACC.4" DB "ACC.5" DB "ACC.6" DB "ACC.7" DB " " ; (E8) DB " " DB " " DB " " DB " " DB " " DB " " DB " " DB "B.0 " ;B (F0) DB "B.1 " DB "B.2 " DB "B.3 " DB "B.4 " DB "B.5 " DB "B.6 " DB "B.7 " DB " " ; (F8) DB " " DB " " DB " " DB " " DB " " DB " " DB " " ; ********** MCS-51 TABLE ********** ; MNEMONIC OPERAND1 OPERAND2 OPERAND3 PATTERN,BYTE MCS51T: DB 1CH,00H,00H,00H,01H ;00 DB 04H,01H,00H,00H,12H ;01 DB 17H,01H,00H,00H,23H ;02 DB 24H,09H,00H,00H,01H ;03 DB 0DH,09H,00H,00H,01H ;04 DB 0DH,01H,00H,00H,52H ;05 DB 0DH,07H,00H,00H,01H ;06 DB 0DH,08H,00H,00H,01H ;07 DB 0DH,0DH,00H,00H,01H ;08 DB 0DH,0EH,00H,00H,01H ;09 DB 0DH,0FH,00H,00H,01H ;0A DB 0DH,10H,00H,00H,01H ;0B DB 0DH,11H,00H,00H,01H ;0C DB 0DH,12H,00H,00H,01H ;0D DB 0DH,13H,00H,00H,01H ;0E DB 0DH,14H,00H,00H,01H ;0F DB 0FH,01H,01H,00H,43H ;10 DB 01H,01H,00H,00H,12H ;11 DB 16H,01H,00H,00H,23H ;12 DB 25H,09H,00H,00H,01H ;13 DB 0AH,09H,00H,00H,01H ;14 DB 0AH,01H,00H,00H,52H ;15 DB 0AH,07H,00H,00H,01H ;16 DB 0AH,08H,00H,00H,01H ;17 DB 0AH,0DH,00H,00H,01H ;18 DB 0AH,0EH,00H,00H,01H ;19 DB 0AH,0FH,00H,00H,01H ;1A DB 0AH,10H,00H,00H,01H ;1B DB 0AH,11H,00H,00H,01H ;1C DB 0AH,12H,00H,00H,01H ;1D DB 0AH,13H,00H,00H,01H ;1E DB 0AH,14H,00H,00H,01H ;1F DB 0EH,01H,01H,00H,43H ;20 DB 04H,01H,00H,00H,12H ;21 DB 20H,00H,00H,00H,01H ;22 DB 22H,09H,00H,00H,01H ;23 DB 02H,09H,02H,00H,92H ;24 DB 02H,09H,01H,00H,52H ;25 DB 02H,09H,07H,00H,01H ;26 DB 02H,09H,08H,00H,01H ;27 DB 02H,09H,0DH,00H,01H ;28 DB 02H,09H,0EH,00H,01H ;29 DB 02H,09H,0FH,00H,01H ;2A DB 02H,09H,10H,00H,01H ;2B DB 02H,09H,11H,00H,01H ;2C DB 02H,09H,12H,00H,01H ;2D DB 02H,09H,13H,00H,01H ;2E DB 02H,09H,14H,00H,01H ;2F DB 12H,01H,01H,00H,43H ;30 DB 01H,01H,00H,00H,12H ;31 DB 21H,00H,00H,00H,01H ;32 DB 23H,09H,00H,00H,01H ;33 DB 03H,09H,02H,00H,92H ;34 DB 03H,09H,01H,00H,52H ;35 DB 03H,09H,07H,00H,01H ;36 DB 03H,09H,08H,00H,01H ;37 DB 03H,09H,0DH,00H,01H ;38 DB 03H,09H,0EH,00H,01H ;39 DB 03H,09H,0FH,00H,01H ;3A DB 03H,09H,10H,00H,01H ;3B DB 03H,09H,11H,00H,01H ;3C DB 03H,09H,12H,00H,01H ;3D DB 03H,09H,13H,00H,01H ;3E DB 03H,09H,14H,00H,01H ;3F DB 10H,01H,00H,00H,0C2H ;40 DB 04H,01H,00H,00H,12H ;41 DB 1DH,01H,09H,00H,52H ;42 DB 1DH,01H,02H,00H,73H ;43 DB 1DH,09H,02H,00H,92H ;44 DB 1DH,09H,01H,00H,52H ;45 DB 1DH,09H,07H,00H,01H ;46 DB 1DH,09H,08H,00H,01H ;47 DB 1DH,09H,0DH,00H,01H ;48 DB 1DH,09H,0EH,00H,01H ;49 DB 1DH,09H,0FH,00H,01H ;4A DB 1DH,09H,10H,00H,01H ;4B DB 1DH,09H,11H,00H,01H ;4C DB 1DH,09H,12H,00H,01H ;4D DB 1DH,09H,13H,00H,01H ;4E DB 1DH,09H,14H,00H,01H ;4F DB 13H,01H,00H,00H,0C2H ;50 DB 01H,01H,00H,00H,12H ;51 DB 05H,01H,09H,00H,52H ;52 DB 05H,01H,02H,00H,73H ;53 DB 05H,09H,02H,00H,92H ;54 DB 05H,09H,01H,00H,52H ;55 DB 05H,09H,07H,00H,01H ;56 DB 05H,09H,08H,00H,01H ;57 DB 05H,09H,0DH,00H,01H ;58 DB 05H,09H,0EH,00H,01H ;59 DB 05H,09H,0FH,00H,01H ;5A DB 05H,09H,10H,00H,01H ;5B DB 05H,09H,11H,00H,01H ;5C DB 05H,09H,12H,00H,01H ;5D DB 05H,09H,13H,00H,01H ;5E DB 05H,09H,14H,00H,01H ;5F DB 15H,01H,00H,00H,0C2H ;60 DB 04H,01H,00H,00H,12H ;61 DB 2CH,01H,09H,00H,52H ;62 DB 2CH,01H,02H,00H,73H ;63 DB 2CH,09H,02H,00H,92H ;64 DB 2CH,09H,01H,00H,52H ;65 DB 2CH,09H,07H,00H,01H ;66 DB 2CH,09H,08H,00H,01H ;67 DB 2CH,09H,0DH,00H,01H ;68 DB 2CH,09H,0EH,00H,01H ;69 DB 2CH,09H,0FH,00H,01H ;6A DB 2CH,09H,10H,00H,01H ;6B DB 2CH,09H,11H,00H,01H ;6C DB 2CH,09H,12H,00H,01H ;6D DB 2CH,09H,13H,00H,01H ;6E DB 2CH,09H,14H,00H,01H ;6F DB 14H,01H,00H,00H,0C2H ;70 DB 01H,01H,00H,00H,12H ;71 DB 1DH,0BH,01H,00H,32H ;72 DB 11H,04H,00H,00H,01H ;73 DB 18H,09H,02H,00H,92H ;74 DB 18H,01H,02H,00H,73H ;75 DB 18H,07H,02H,00H,92H ;76 DB 18H,08H,02H,00H,92H ;77 DB 18H,0DH,02H,00H,92H ;78 DB 18H,0EH,02H,00H,92H ;79 DB 18H,0FH,02H,00H,92H ;7A DB 18H,10H,02H,00H,92H ;7B DB 18H,11H,02H,00H,92H ;7C DB 18H,12H,02H,00H,92H ;7D DB 18H,13H,02H,00H,92H ;7E DB 18H,14H,02H,00H,92H ;7F DB 27H,01H,00H,00H,0C2H ;80 DB 04H,01H,00H,00H,12H ;81 DB 05H,0BH,01H,00H,32H ;82 DB 19H,09H,05H,00H,01H ;83 DB 0BH,0AH,00H,00H,01H ;84 DB 18H,01H,01H,00H,63H ;85 DB 18H,01H,07H,00H,52H ;86 DB 18H,01H,08H,00H,52H ;87 DB 18H,01H,0DH,00H,52H ;88 DB 18H,01H,0EH,00H,52H ;89 DB 18H,01H,0FH,00H,52H ;8A DB 18H,01H,10H,00H,52H ;8B DB 18H,01H,11H,00H,52H ;8C DB 18H,01H,12H,00H,52H ;8D DB 18H,01H,13H,00H,52H ;8E DB 18H,01H,14H,00H,52H ;8F DB 18H,0CH,02H,00H,0B3H ;90 DB 01H,01H,00H,00H,12H ;91 DB 18H,01H,0BH,00H,32H ;92 DB 19H,09H,04H,00H,01H ;93 DB 28H,09H,02H,00H,92H ;94 DB 28H,09H,01H,00H,52H ;95 DB 28H,09H,07H,00H,01H ;96 DB 28H,09H,08H,00H,01H ;97 DB 28H,09H,0DH,00H,01H ;98 DB 28H,09H,0EH,00H,01H ;99 DB 28H,09H,0FH,00H,01H ;9A DB 28H,09H,10H,00H,01H ;9B DB 28H,09H,11H,00H,01H ;9C DB 28H,09H,12H,00H,01H ;9D DB 28H,09H,13H,00H,01H ;9E DB 28H,09H,14H,00H,01H ;9F DB 1DH,0BH,03H,00H,32H ;A0 DB 04H,01H,00H,00H,12H ;A1 DB 18H,0BH,01H,00H,32H ;A2 DB 0DH,0CH,00H,00H,01H ;A3 DB 1BH,0AH,00H,00H,01H ;A4 DB 00H,00H,00H,00H,00H ;A5 RESERVE DB 18H,07H,01H,00H,52H ;A6 DB 18H,08H,01H,00H,52H ;A7 DB 18H,0DH,01H,00H,52H ;A8 DB 18H,0EH,01H,00H,52H ;A9 DB 18H,0FH,01H,00H,52H ;AA DB 18H,10H,01H,00H,52H ;AB DB 18H,11H,01H,00H,52H ;AC DB 18H,12H,01H,00H,52H ;AD DB 18H,13H,01H,00H,52H ;AE DB 18H,14H,01H,00H,52H ;AF DB 05H,0BH,03H,00H,32H ;B0 DB 01H,01H,00H,00H,12H ;B1 DB 08H,01H,00H,00H,32H ;B2 DB 08H,0BH,00H,00H,01H ;B3 DB 06H,09H,02H,01H,0A3H ;B4 DB 06H,09H,01H,01H,83H ;B5 DB 06H,07H,02H,01H,0A3H ;B6 DB 06H,08H,02H,01H,0A3H ;B7 DB 06H,0DH,02H,01H,0A3H ;B8 DB 06H,0EH,02H,01H,0A3H ;B9 DB 06H,0FH,02H,01H,0A3H ;BA DB 06H,10H,02H,01H,0A3H ;BB DB 06H,11H,02H,01H,0A3H ;BC DB 06H,12H,02H,01H,0A3H ;BD DB 06H,13H,02H,01H,0A3H ;BE DB 06H,14H,02H,01H,0A3H ;BF DB 1FH,01H,00H,00H,52H ;C0 DB 04H,01H,00H,00H,12H ;C1 DB 07H,01H,00H,00H,32H ;C2 DB 07H,0BH,00H,00H,01H ;C3 DB 29H,09H,00H,00H,01H ;C4 DB 2AH,09H,01H,00H,52H ;C5 DB 2AH,09H,07H,00H,01H ;C6 DB 2AH,09H,08H,00H,01H ;C7 DB 2AH,09H,0DH,00H,01H ;C8 DB 2AH,09H,0EH,00H,01H ;C9 DB 2AH,09H,0FH,00H,01H ;CA DB 2AH,09H,10H,00H,01H ;CB DB 2AH,09H,11H,00H,01H ;CC DB 2AH,09H,12H,00H,01H ;CD DB 2AH,09H,13H,00H,01H ;CE DB 2AH,09H,14H,00H,01H ;CF DB 1EH,01H,00H,00H,52H ;D0 DB 01H,01H,00H,00H,12H ;D1 DB 26H,01H,00H,00H,32H ;D2 DB 26H,0BH,00H,00H,01H ;D3 DB 09H,09H,00H,00H,01H ;D4 DB 0CH,01H,01H,00H,83H ;D5 DB 2BH,09H,07H,00H,01H ;D6 DB 2BH,09H,08H,00H,01H ;D7 DB 0CH,0DH,01H,00H,0C2H ;D8 DB 0CH,0EH,01H,00H,0C2H ;D9 DB 0CH,0FH,01H,00H,0C2H ;DA DB 0CH,10H,01H,00H,0C2H ;DB DB 0CH,11H,01H,00H,0C2H ;DC DB 0CH,12H,01H,00H,0C2H ;DD DB 0CH,13H,01H,00H,0C2H ;DE DB 0CH,14H,01H,00H,0C2H ;DF DB 1AH,09H,06H,00H,01H ;E0 DB 04H,01H,00H,00H,12H ;E1 DB 1AH,09H,07H,00H,01H ;E2 DB 1AH,09H,08H,00H,01H ;E3 DB 07H,09H,00H,00H,01H ;E4 DB 18H,09H,01H,00H,52H ;E5 DB 18H,09H,07H,00H,01H ;E6 DB 18H,09H,08H,00H,01H ;E7 DB 18H,09H,0DH,00H,01H ;E8 DB 18H,09H,0EH,00H,01H ;E9 DB 18H,09H,0FH,00H,01H ;EA DB 18H,09H,10H,00H,01H ;EB DB 18H,09H,11H,00H,01H ;EC DB 18H,09H,12H,00H,01H ;ED DB 18H,09H,13H,00H,01H ;EE DB 18H,09H,14H,00H,01H ;EF DB 1AH,06H,09H,00H,01H ;F0 DB 01H,01H,00H,00H,12H ;F1 DB 1AH,07H,09H,00H,01H ;F2 DB 1AH,08H,09H,00H,01H ;F3 DB 08H,09H,00H,00H,01H ;F4 DB 18H,01H,09H,00H,52H ;F5 DB 18H,07H,09H,00H,01H ;F6 DB 18H,08H,09H,00H,01H ;F7 DB 18H,0DH,09H,00H,01H ;F8 DB 18H,0EH,09H,00H,01H ;F9 DB 18H,0FH,09H,00H,01H ;FA DB 18H,10H,09H,00H,01H ;FB DB 18H,11H,09H,00H,01H ;FC DB 18H,12H,09H,00H,01H ;FD DB 18H,13H,09H,00H,01H ;FE DB 18H,14H,09H,00H,01H ;FF ; ********** INPXA SUB ********** ; CHANGE MOVX @DPTR,A -> CALL INPXA ; FOR INPBUF INT.RAM ; REG = NO INPXA: MOV INPMEM,R0 MOV R0,DPL MOV @R0,A MOV R0,INPMEM RET ; ********** INPAX SUB ********** ; CHANGE MOVX A,@DPTR -> CALL INPAX ; FOR INPBUF INT.RAM ; REG = NO INPAX: MOV INPMEM,R0 MOV R0,DPL MOV A,@R0 MOV R0,INPMEM RET ; ********** SUBDA SUB ********** [ 01 ] ; BCD ADJUST AFTER SUBB ; IN = A,CARRY,AUX-CARRY ; OUT = A,CARRY ; REG = A SUBDA: JC SUBDA2 ;SUBB BCD ADJUST JB AC,SUBDA1 RET ;C=0,AC=0 SUBDA1: ADD A,#0FAH ;C=0,AC=1 CLR C RET SUBDA2: JB AC,SUBDA3 ADD A,#0A0H ;C=1,AC=0 SETB C RET SUBDA3: ADD A,#09AH ;C=1,AC=1 SETB C RET ; ********** DMSEC SUB ********** [ 02 ] ; DELAY 1/1000 SECOND ; IN = R2 ; REG = R2,R3 DMSEC: MOV R3,#230 ;1 MSEC LOOP DMSEC1: NOP NOP DJNZ R3,DMSEC1 DJNZ R2,DMSEC RET ; ********** DTSEC SUB ********** [ 03 ] ; DELAY 1/10 SECOND ; IN = R2 ; REG = R2,R3,R4 DTSEC: MOV R3,#179 DTSEC1: MOV R4,#0 DJNZ R4,$ NOP NOP DJNZ R3,DTSEC1 DJNZ R2,DTSEC RET ; ********** DSEC SUB ********** [ 04 ] ; DELAY SECOND ; IN = R1 ; REG = R1,R2,R3,R4 DSEC: MOV R2,#10 LCALL DTSEC DJNZ R1,DSEC RET ; ********** TABLE SUB ********** [ 05 ] ; TABLE SEARCH ; IN = A RECORD NO. 0-FFH (HEX) ; = R2 RECORD SIZE 0-FFH (HEX) ; = DPTR START ADDRESS ; OUT = DPTR RECORD ADDRESS ; REG = A,R1,R2,R3,R4,R5,DPTR TABLE: PUSH DPH PUSH DPL MOV DPH,#0 MOV DPL,A MOV A,R2 MOV R2,#0 MOV R3,A LCALL DPMUL POP ACC MOV R3,A POP ACC MOV R2,A LCALL DPADD RET ; ********** DPDEC SUB ********** [ 06 ] ; DPTR = DPTR - 1 ; IN = DPTR ; OUT = DPTR ; = A (ZERO FLAG) ; REG = NO DPDEC: XCH A,DPL JNZ $+4 DEC DPH DEC A XCH A,DPL RET ; ********** DPADD SUB ********** [ 07 ] ; DPTR = DPTR + R2,R3 ; IN = DPTR,R2,R3 ; OUT = DPTR ; REG = A,DPTR DPADD: MOV A,DPL ADD A,R3 MOV DPL,A MOV A,DPH ADDC A,R2 MOV DPH,A RET ; ********** DPSUB SUB ********** [ 08 ] ; DPTR = DPTR - R2,R3 ; IN = DPTR,R2,R3 ; OUT = DPTR ; REG = A,DPTR DPSUB: CLR C MOV A,DPL SUBB A,R3 MOV DPL,A MOV A,DPH SUBB A,R2 MOV DPH,A RET ; ********** DPMUL SUB ********** [ 09 ] ; DPTR = DPTR * R2,R3 ; IN = DPTR MULTIPLER ; = R2,R3 MULTIPLICAND ; OUT = DPTR RESULT ; = CARRY FLAG SET WHEN RESULT OVERFLOW ; REG = A,R1,R2,R3,R4,R5,DPTR DPMUL: MOV R4,#0 ;CLEAR RESULT MOV R5,#0 CLR MULFG MOV R1,#16 DPMUL1: MOV A,R5 ;*2 ADD A,R5 MOV R5,A MOV A,R4 ADDC A,R4 MOV R4,A JNC DPMUL2 ;NO CARRY SETB MULFG ;OVERFLOW DPMUL2: MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A JNC DPMUL3 MOV A,R5 ;R4R5=R4R5+DPTR ADD A,DPL MOV R5,A MOV A,R4 ADDC A,DPH MOV R4,A JNC DPMUL3 ;NO CARRY SETB MULFG ;OVERFLOW DPMUL3: DJNZ R1,DPMUL1 MOV DPH,R4 MOV DPL,R5 MOV C,MULFG ;LOAD MULFG TO CARRY RET ; ********** DPDIV SUB ********** [ 10 ] ; DPTR = DPTR / R2,R3 ; IN = DPTR DIVIDEND ; = R2,R3 DIVISOR ; OUT = DPTR RESULT ; = R4,R5 REMAINDER ; = CARRY FLAG SET WHEN HAS REMAINDER ; REG = A,R1,R4,R5,DPTR DPDIV: CLR C MOV R4,#0 ;CLEAR RESULT MOV R5,#0 MOV R1,#16 DPDIV1: MOV A,DPL RLC A MOV DPL,A MOV A,DPH RLC A MOV DPH,A MOV A,R5 ;*2 (WITH CARRY) ADDC A,R5 MOV R5,A MOV A,R4 ADDC A,R4 MOV R4,A MOV A,R5 ;R4R5=R4R5-R2R3 (WITH CARRY) SUBB A,R3 MOV R5,A MOV A,R4 SUBB A,R2 MOV R4,A JNC DPDIV2 MOV A,R5 ;R4R5=R4R5+R2R3 ADD A,R3 MOV R5,A MOV A,R4 ADDC A,R2 MOV R4,A DPDIV2: CPL C DJNZ R1,DPDIV1 MOV A,DPL ;*2 (WITH CARRY) ADDC A,DPL MOV DPL,A MOV A,DPH ADDC A,DPH MOV DPH,A MOV A,R4 ORL A,R5 JZ DPDIV3 SETB C ;HAS REMAINDER->CARRY SET RET DPDIV3: CLR C ;NO REMAINDET->CARRY CLEAR RET ; ********** DPCOM SUB ********** [ 11 ] ; COMPARE WORD (16 BIT) DPTR <> R2,R3 ; IN = DPTR,R2,R3 ; OUT = CY,A ; 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 ; ********** DPOFF SUB ********** ; DPTR = DPTR + R0 ; IN = R0,DPTR ; OUT = DPTR ; REG = DPTR DPOFF: PUSH ACC MOV A,R0 ADD A,DPL MOV DPL,A MOV A,#0 ADDC A,DPH MOV DPH,A POP ACC RET ; ********** DPAX SUB ********** [ 12 ] ; A = @R0+DPTR FROM EXT-MEM ; IN = R0,DPTR ; OUT = A ; REG = A DPAX: PUSH DPH PUSH DPL LCALL DPOFF MOVX A,@DPTR POP DPL POP DPH RET ; ********** DPXA SUB ********** [ 13 ] ; @R0+DPTR = A TO EXT-RAM ; IN = A,R0,DPTR ; REG = A DPXA: PUSH DPH PUSH DPL LCALL DPOFF MOVX @DPTR,A POP DPL POP DPH RET ; ********** IXRD SUB ********** [ 14 ] ; IX READ ; IN = IXDATA ; OUT = DPTR ; REG = DPTR IXRD: MOV DPH,IXDATA MOV DPL,IXDATA+1 RET ; ********** IXWR SUB ********** [ 15 ] ; IX WRITE ; IN = DPTR ; OUT = IXDATA ; REG = NO IXWR: MOV IXDATA,DPH MOV IXDATA+1,DPL RET ; ********** IXINC SUB ********** [ 16 ] ; IX=IX+1 ; IN = IXDATA ; OUT = IXDATA ; REG = NO IXINC: PUSH DPH PUSH DPL LCALL IXRD INC DPTR LCALL IXWR POP DPL POP DPH RET ; ********** IXDEC SUB ********** [ 17 ] ; IX=IX-1 ; IN = IXDATA ; OUT = IXDATA,A ; REG = A IXDEC: PUSH DPH PUSH DPL LCALL IXRD LCALL DPDEC LCALL IXWR POP DPL POP DPH RET ; ********** IXADD SUB ********** [ 18 ] ; IX=IX+R2,R3 ; IN = IXDATA,R2,R3 ; OUT = IXDATA ; REG = A IXADD: PUSH DPH PUSH DPL LCALL IXRD LCALL DPADD LCALL IXWR POP DPL POP DPH RET ; ********** IXSUB SUB ********** [ 19 ] ; IX=IX-R2,R3 ; IN = IXDATA,R2,R3 ; OUT = IXDATA ; REG = A IXSUB: PUSH DPH PUSH DPL LCALL IXRD LCALL DPSUB LCALL IXWR POP DPL POP DPH RET ; ********** IXCOM SUB ********** [ 20 ] ; COMPARE IX & R2,R3 ; IN = IXDATA,R2,R3 ; OUT = A,CY ; REG = A IXCOM: PUSH DPH PUSH DPL LCALL IXRD LCALL DPCOM POP DPL POP DPH RET ; ********** IXAC SUB ********** [ 21 ] ; A=@A+IXDATA (PROGRAM-MEM) ; IN = A,IXDATA ; OUT = A ; REG = A IXAC: PUSH DPH PUSH DPL LCALL IXRD MOVC A,@A+DPTR POP DPL POP DPH RET ; ********** IXAX SUB ********** [ 22 ] ; A=@R0+IXDATA (DATA-MEM) ; IN = IXDATA,R0 ; OUT = A ; REG = A IXAX: PUSH DPH PUSH DPL LCALL IXRD LCALL DPAX POP DPL POP DPH RET ; ********** IXXA SUB ********** [ 23 ] ; @R0+IXDATA=A (DATA-MEM) ; IN = A,IXDATA,R0 ; REG = A IXXA: PUSH DPH PUSH DPL LCALL IXRD LCALL DPXA POP DPL POP DPH RET ; ********** DBADD SUB ********** [ 24 ] ; DPTR = DPTR + R2,R3 (BCD) ; IN = DPTR,R2,R3 ; OUT = DPTR ; REG = A,DPTR DBADD: MOV A,DPL ADD A,R3 DA A MOV DPL,A MOV A,DPH ADDC A,R2 DA A MOV DPH,A RET ; ********** DBSUB SUB ********** [ 25 ] ; DPTR = DPTR - R2,R3 (BCD) ; IN = DPTR,R2,R3 ; OUT = DPTR ; REG = A,DPTR DBSUB: CLR C MOV A,DPL SUBB A,R3 LCALL SUBDA MOV DPL,A MOV A,DPH SUBB A,R2 LCALL SUBDA MOV DPH,A RET ; ********** SBYTE SUB ********** [ 26 ] ; SEND BYTE ; IN = A ; REG = NO SBYTE: JNB TI,$ ;WAIT FOR SEND OK CLR TI MOV SBUF,A PUSH ACC MOV A,#80H SBYTE1: DEC A JNZ SBYTE1 POP ACC RET ; ********** SBYTEH SUB ********** [ 27 ] ; SEND 2 BYTE HEX FROM A ; IN = A ; REG = A,R2,R3 SBYTEH: LCALL HTOA MOV A,R2 LCALL SBYTE MOV A,R3 LCALL SBYTE RET SBYTEHC: XCH A,R7 ;R7=CHECKSUM ADD A,R7 XCH A,R7 LCALL SBYTEH RET ; ********** SBYTEW SUB ********** [ 28 ] ; SEND 4 BYTE FROM SPTR ; IN = DPTR ; REG = A,R2,R3 SBYTEW: MOV A,DPH LCALL SBYTEH MOV A,DPL LCALL SBYTEH RET ; ********** SBLOCK SUB ********** [ 29 ] ; 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 LCALL SLF ;CR/LF INC DPTR ;NEXT ADDRESS RET ;EXIT BY ODH SBLOCK2: LCALL SBYTE INC DPTR SJMP SBLOCK ; ********** SBLANK SUB ********** [ 30 ] ; SEND BLANK ; IN = R2 (NO OF BLANK) ; REG = A,R2 SBLANK: MOV A,#' ' LCALL SBYTE DJNZ R2,SBLANK RET ; ********** SLF SUB ********** [ 31 ] ; PRINT CR/LF ; REG = A SLF: MOV A,#0DH LCALL SBYTE MOV A,#0AH LCALL SBYTE RET ; ********** Sxxx SUB ********** S1B: MOV A,#' ' LCALL SBYTE RET ; ********** RBYTE SUB ********** [ 32 ] ; OUT = A ; REG = A RBYTE: JNB RI,$ ;WAIT FOR RECEIVE OK CLR RI MOV A,SBUF RET ; ********** RBYTEH SUB ********** [ 33 ] ; READ HEX-ASCII FROM SERIAL (2 BYTE) ; OUT = A ; REG = A,R2,R3 RBYTEH: LCALL RBYTE MOV R2,A LCALL RBYTE MOV R3,A LCALL ATOH RET RBYTEHC: LCALL RBYTEH ;R7=CHECKSUM XCH A,R7 ADD A,R7 XCH A,R7 RET ; ********** RBYTEW SUB ********** [ 34 ] ; READ BYTE WORD FROM SERIAL (4 BYTE) ; OUT = DPTR ; REG = A,R2,R3,DPTR RBYTEW: LCALL RBYTEH MOV DPH,A LCALL RBYTEH MOV DPL,A RET ; ********** BAUDS SUB ********** [ 34 ] ; SET BAUD RATE (SERIAL) ; IN = A (12H,24H,48H,96H,19H) ; REG = B BAUDS: MOV B,PCON CJNE A,#19H,BAUDS1 MOV TH1,#BRAT96 ;19200 SETB SMOD SJMP BAUDS7 BAUDS1: CJNE A,#96H,BAUDS2 MOV TH1,#BRAT96 ;9600 CLR SMOD SJMP BAUDS7 BAUDS2: CJNE A,#48H,BAUDS3 MOV TH1,#BRAT48 ;4800 SJMP BAUDS7 BAUDS3: CJNE A,#24H,BAUDS4 MOV TH1,#BRAT24 ;2400 SJMP BAUDS7 BAUDS4: CJNE A,#12H,BAUDS71 MOV TH1,#BRAT12 ;1200 BAUDS7: MOV PCON,B BAUDS71: RET ; ********** HTOA SUB ********** [ 36 ] ; CONVERT HEX TO ASCII ; IN = A ; OUT = R2,R3 ; REG = A,R2,R3 HTOA: PUSH ACC SWAP A LCALL HTOAS MOV R2,A POP ACC LCALL 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 ********** [ 37 ] ; ASCII TO HEX CONVERT ; IN = R2,R3 30H,41H ; OUT = A 0AH ; REG = A,R2 ATOH: MOV A,R2 LCALL ATOHS SWAP A MOV R2,A MOV A,R3 LCALL ATOHS ORL A,R2 RET ATOHS: CJNE A,#'A',$+3 JC ATOHS1 ADD A,#9 ATOHS1: ANL A,#0FH RET ; ********** HTOD SUB ********** [ 38 ] ; HEX TO DECIMAL ; IN = DPTR ; OUT = R1,R2,R3 ; REG = A,R0,R1,R2,R3,R4,R5,DPTR HTOD: CLR A ;CLEAR OUTPUT MOV R1,A MOV R2,A MOV R3,A MOV R4,#16 ;SHIFT 16 BIT HTOD1: MOV A,DPL RLC A MOV DPL,A MOV A,DPH RLC A MOV DPH,A MOV R5,#3 ;ADD DECIMAL MOV R0,#3 ;INDEX TO R3 HTOD2: MOV A,@R0 ADDC A,ACC DA A MOV @R0,A DEC R0 DJNZ R5,HTOD2 DJNZ R4,HTOD1 RET ; ********** DTOH SUB ********** [ 39 ] ; DECIMAL TO HEX ; IN = R1,R2,R3 ; OUT = DPTR ; REG = A,R0,R1,R2,R3,R4,R5,DPTR DTOH: MOV R4,#16 DTOH1: MOV R5,#3 ;SHIFT & SUB MOV R0,#1 ;INDEX TO R1 CLR C DTOH2: MOV A,@R0 RRC A PUSH PSW ;-[ JNB ACC.7,DTOH3 CLR C SUBB A,#30H DTOH3: JNB ACC.3,DTOH4 CLR C SUBB A,#03H DTOH4: MOV @R0,A INC R0 POP PSW ;-] DJNZ R5,DTOH2 MOV A,DPH RRC A MOV DPH,A MOV A,DPL RRC A MOV DPL,A DJNZ R4,DTOH1 RET ; ********** UPPER SUB ********** [ 40 ] ; CHANGE LOWER CHAR. TO UPPER CHAR. ; IN = A ; OUT = A ; REG = A UPPER: CJNE A,#61H,$+3 JNC UPPER1 RET ;UNDER UPPER1: CJNE A,#7BH,$+3 JC UPPER2 RET ;OVER UPPER2: SUBB A,#31 RET ;IS LOWER ENDROM: END