; 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