STACK	EQU		1FH					
BOTTOM	EQU		00H					
M		EQU		200					
TOP		DATA	3EH					
N		DATA	30H					
NFACT	EQU		31H					
TST:	
MOV	SP,#5FH						
LCALL	SETNULL						
MOV	N,#5							
LCALL	FACT0						
MOV	N,#8							
LCALL	FACT0						
MOV	N,#10						
LCALL	FACT0						
STOP:	LJMP	STOP
FACT0:	
MOV	A,N							
LCALL	DPUSH						
LCALL	FACT						
LCALL	DPOP						
MOV	R5,A							
LCALL	DPOP
MOV	R6,A							
LCALL	DPOP
MOV	R7,A							
LCALL	HBCD						
MOV	R0,#NFACT					
MOV	A,R1							
MOV	@R0,A						
INC		R0
MOV	A,R2
MOV	@R0,A
INC		R0
MOV	A,R3
MOV	@R0,A
INC		R0
MOV	A,R4
MOV	@R0,A
RET
FACT:	
LCALL	DPOP						
CJNE	A,#1,FACT1					
LCALL	DPUSH						
CLR		A
LCALL	DPUSH
LCALL	DPUSH
RET									
FACT1:	
LCALL	DPUSH						
DEC		A							
LCALL	DPUSH						
LCALL	FACT						
LCALL	DPOP						
MOV	R5,A							
LCALL	DPOP
MOV	R6,A
LCALL	DPOP
MOV	R7,A
LCALL	DPOP						
MOV	R3,A							
MOV	A,R7							
MOV	B,R3
MUL		AB							
MOV	R7,A
MOV	A,B
XCH		A,R6							
MOV	B,R3
MUL		AB
ADD		A,R6
MOV	R6,A
CLR		A							
ADDC	A,B
XCH		A,R5
MOV	B,R3
MUL		AB
ADD		A,R5
MOV	R5,A
MOV	A,R7							
LCALL	DPUSH
MOV	A,R6
LCALL	DPUSH
MOV	A,R5
LCALL	DPUSH
RET									
HBCD:	
CLR		A							
MOV	R1,A
MOV	R2,A
MOV	R3,A
MOV	R4,A
MOV	R0,#18H
HB3:
MOV	A,R7
RLC		A
MOV	R7,A
MOV	A,R6
RLC		A
MOV	R6,A
MOV	A,R5
RLC		A
MOV	R5,A
MOV	A,R4
ADDC	A,R4
DA		A							
MOV	R4,A
MOV	A,R3
ADDC	A,R3
DA		A							
MOV	R3,A
MOV	A,R2
ADDC	A,R2
DA		A							
MOV	R2,A
MOV	A,R1
ADDC	A,R1
DA		A							
MOV	R1,A
DJNZ	R0,HB3
RET
SETNULL:
MOV	A,#BOTTOM					
MOV	TOP,A						
RET									
DPUSH:	
MOV	B,A							
MOV	A,TOP						
INC		A							
CJNE	A,#M,PUSH1					
SETB	C							
SJMP	PUSHE						
PUSH1:	
MOV	TOP,A						
MOV	DPH,#STACK					
MOV	DPL,TOP						
MOV	A,B							
MOVX	@DPTR,A						
CLR		C							
PUSHE:	
RET									
DPOP:	
MOV	A,TOP						
CJNE	A,#BOTTOM,POP1				
SETB	C							
SJMP	POPE						
POP1:	
MOV	DPH,#STACK					
MOV	DPL,TOP						
MOVX	A,@DPTR						
DEC		TOP							
CLR		C							
POPE:	
RET									
END



