⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fp52.lst

📁 proteus6.9 sp4 上
💻 LST
📖 第 1 页 / 共 5 页
字号:

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 1





       MCS-51 Family Cross Assembler   A S E M - 5 1   V 1.2
       =====================================================



	Source File:	FP52.ASM
	Object File:	FP52.HEX
	List File:	FP52.LST



 Line  I  Addr  Code            Source

    1:				; This is a complete BCD floating point package for the 8051 micro-
    2:				; controller. It provides 8 digits of accuracy with exponents that
    3:				; range from +127 to -127. The mantissa is in packed BCD, while the
    4:				; exponent is expressed in pseudo-twos complement. A ZERO exponent
    5:				; is used to express the number ZERO. An exponent value of 80H or
    6:				; greater than means the exponent is positive, i.e. 80H = E 0,
    7:				; 81H = E+1, 82H = E+2 and so on. If the exponent is 7FH or less,
    8:				; the exponent is negative, 7FH = E-1, 7EH = E-2, and so on.
    9:				; ALL NUMBERS ARE ASSUMED TO BE NORMALIZED and all results are
   10:				; normalized after calculation. A normalized mantissa is >=.10 and
   11:				; <=.99999999.
   12:				;
   13:				; The numbers in memory assumed to be stored as follows:
   14:				;
   15:				; EXPONENT OF ARGUMENT 2   =   VALUE OF ARG_STACK+FP_NUMBER_SIZE
   16:				; SIGN OF ARGUMENT 2       =   VALUE OF ARG_STACK+FP_NUMBER_SIZE-1
   17:				; DIGIT 78 OF ARGUMENT 2   =   VALUE OF ARG_STACK+FP_NUMBER_SIZE-2
   18:				; DIGIT 56 OF ARGUMENT 2   =   VALUE OF ARG_STACK+FP_NUMBER_SIZE-3
   19:				; DIGIT 34 OF ARGUMENT 2   =   VALUE OF ARG_STACK+FP_NUMBER_SIZE-4
   20:				; DIGIT 12 OF ARGUMENT 2   =   VALUE OF ARG_STACK+FP_NUMBER_SIZE-5
   21:				;
   22:				; EXPONENT OF ARGUMENT 1   =   VALUE OF ARG_STACK
   23:				; SIGN OF ARGUMENT 1       =   VALUE OF ARG_STACK-1
   24:				; DIGIT 78 OF ARGUMENT 1   =   VALUE OF ARG_STACK-2
   25:				; DIGIT 56 OF ARGUMENT 1   =   VALUE OF ARG_STACK-3
   26:				; DIGIT 34 OF ARGUMENT 1   =   VALUE OF ARG_STACK-4
   27:				; DIGIT 12 OF ARGUMENT 1   =   VALUE OF ARG_STACK-5
   28:				;
   29:				; The operations are performed thusly:
   30:				;
   31:				; ARG_STACK+FP_NUMBER_SIZE = ARG_STACK+FP_NUMBER_SIZE # ARG_STACK
   32:				;
   33:				; Which is ARGUMENT 2 = ARGUMENT 2 # ARGUMENT 1
   34:				;
   35:				; Where # can be ADD, SUBTRACT, MULTIPLY OR DIVIDE.
   36:				;
   37:				; Note that the stack gets popped after an operation.
   38:				;
   39:				; The FP_COMP instruction POPS the ARG_STACK TWICE and returns status.
   40:				;
   41:				;**********************************************************************
   42:				;
   43:				$EJECT

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 2



 Line  I  Addr  Code            Source

   44:				;**********************************************************************
   45:				;
   46:				; STATUS ON RETURN - After performing an operation (+, -, *, /)
   47:				;                    the accumulator contains the following status
   48:				;
   49:				; ACCUMULATOR - BIT 0 - FLOATING POINT UNDERFLOW OCCURED
   50:				;
   51:				;             - BIT 1 - FLOATING POINT OVERFLOW OCCURED
   52:				;
   53:				;             - BIT 2 - RESULT WAS ZER0
   54:				;
   55:				;             - BIT 3 - DIVIDE BY ZERO ATTEMPTED
   56:				;
   57:				;             - BIT 4 - NOT USED, 0 RETURNED
   58:				;
   59:				;             - BIT 5 - NOT USED, 0 RETURNED
   60:				;
   61:				;             - BIT 6 - NOT USED, 0 RETURNED
   62:				;
   63:				;             - BIT 7 - NOT USED, 0 RETURNED
   64:				;
   65:				; NOTE: When underflow occures, a ZERO result is returned.
   66:				;       When overflow or divide by zero occures, a result of
   67:				;       .99999999 E+127 is returned and it is up to the user
   68:				;       to handle these conditions as needed in the program.
   69:				;
   70:				; NOTE: The Compare instruction returns F0 = 0 if ARG 1 = ARG 2
   71:				;       and returns a CARRY FLAG = 1 if ARG 1 is > ARG 2
   72:				;
   73:				;***********************************************************************
   74:				;
   75:				$EJECT

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 3



 Line  I  Addr  Code            Source

   76:				;***********************************************************************
   77:				;
   78:				; The following values MUST be provided by the user
   79:				;
   80:				;***********************************************************************
   81:				;
   82:		N      0001	ARG_STACK_PAGE	EQU	01h	;External memory page for arg stack
   83:		N      0024	ARG_STACK	EQU	24H	;ARGUMENT STACK POINTER
   84:		N      0025	FORMAT		EQU	25H	;LOCATION OF OUTPUT FORMAT BYTE
   85:				;OUTPUT		EQU	R5OUT	;CALL LOCATION TO OUTPUT A CHARACTER in R5
   86:		N      0048	CONVT		EQU	0048H	;String addr TO CONVERT NUMBERS
   87:		B	 31	INTGRC		BIT	26H.1	;BIT SET IF INTEGER ERROR
   88:		B	 33	ADD_IN		BIT	26H.3	;DCMPXZ IN BASIC BACKAGE
   89:		B	 36	ZSURP		BIT	26H.6	;ZERO SUPRESSION FOR HEX PRINT
   90:				;
   91:				;***********************************************************************
   92:				;
   93:				; The following equates are used internally
   94:				;
   95:				;***********************************************************************
   96:				;
   97:		N      0006	FP_NUMBER_SIZE	EQU	6
   98:		N      0004	DIGIT		EQU	FP_NUMBER_SIZE-2
   99:		N      0000	R0B0		EQU	0
  100:		N      0001	R1B0		EQU	1
  101:		N      0000	UNDERFLOW	EQU	0
  102:		N      0001	OVERFLOW	EQU	1
  103:		N      0002	ZERO		EQU	2
  104:		N      0003	ZERO_DIVIDE	EQU	3
  105:				;
  106:				;***********************************************************************
  107:				$EJECT

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 4



 Line  I  Addr  Code            Source

  108:					;**************************************************************
  109:					;
  110:					; The following internal locations are used by the math pack
  111:					; ordering is important and the FP_DIGITS must be bit
  112:					; addressable
  113:					;
  114:					;***************************************************************
  115:					;
  116:		N      0028	FP_STATUS	EQU	28H		;NOT used data pointer me
  117:		N      0029	FP_TEMP		EQU	FP_STATUS+1	;NOT USED
  118:		N      002A	FP_CARRY	EQU	FP_STATUS+2	;USED FOR BITS
  119:		N      002B	FP_DIG12	EQU	FP_CARRY+1
  120:		N      002C	FP_DIG34	EQU	FP_CARRY+2
  121:		N      002D	FP_DIG56	EQU	FP_CARRY+3
  122:		N      002E	FP_DIG78	EQU	FP_CARRY+4
  123:		N      002F	FP_SIGN		EQU	FP_CARRY+5
  124:		N      0030	FP_EXP		EQU	FP_CARRY+6
  125:		B	 78	MSIGN		BIT	FP_SIGN.0
  126:		B	 50	XSIGN		BIT	FP_CARRY.0
  127:		B	 51	FOUND_RADIX	BIT	FP_CARRY.1
  128:		B	 52	FIRST_RADIX	BIT	FP_CARRY.2
  129:		B	 53	DONE_LOAD	BIT	FP_CARRY.3
  130:		N      002B	FP_NIB1		EQU	FP_DIG12
  131:		N      002C	FP_NIB2		EQU	FP_NIB1+1
  132:		N      002D	FP_NIB3		EQU	FP_NIB1+2
  133:		N      002E	FP_NIB4		EQU	FP_NIB1+3
  134:		N      002F	FP_NIB5		EQU	FP_NIB1+4
  135:		N      0030	FP_NIB6		EQU	FP_NIB1+5
  136:		N      0031	FP_NIB7		EQU	FP_NIB1+6
  137:		N      0032	FP_NIB8		EQU	FP_NIB1+7
  138:		N      0033	FP_ACCX		EQU	FP_NIB1+8
  139:		N      0034	FP_ACCC		EQU	FP_NIB1+9
  140:		N      0035	FP_ACC1		EQU	FP_NIB1+10
  141:		N      0036	FP_ACC2		EQU	FP_NIB1+11
  142:		N      0037	FP_ACC3		EQU	FP_NIB1+12
  143:		N      0038	FP_ACC4		EQU	FP_NIB1+13
  144:		N      0039	FP_ACC5		EQU	FP_NIB1+14
  145:		N      003A	FP_ACC6		EQU	FP_NIB1+15
  146:		N      003B	FP_ACC7		EQU	FP_NIB1+16
  147:		N      003C	FP_ACC8		EQU	FP_NIB1+17
  148:		N      003D	FP_ACCS		EQU	FP_NIB1+18
  149:					;
  150:				$EJECT

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 5



 Line  I  Addr  Code            Source

  151:
  152:		C      0000	FP_BASE		EQU	$
  153:
  154:					;**************************************************************
  155:					;
  156:					; The floating point entry points and jump table
  157:					;
  158:					;**************************************************************
  159:					;
  160:	  0000	01 30			AJMP	FLOATING_ADD
  161:	  0002	01 26			AJMP	FLOATING_SUB
  162:	  0004	01 E3			AJMP	FLOATING_COMP
  163:	  0006	21 14			AJMP	FLOATING_MUL
  164:	  0008	21 49			AJMP	FLOATING_DIV
  165:	  000A	61 10			AJMP	HEXSCAN
  166:	  000C	61 49			AJMP	FLOATING_POINT_INPUT
  167:	  000E	81 01			AJMP	FLOATING_POINT_OUTPUT
  168:	  0010	A1 7E			AJMP	CONVERT_BINARY_TO_ASCII_STRING
  169:	  0012	A1 25			AJMP	CONVERT_ASCII_STRING_TO_BINARY
  170:	  0014	A1 5A			AJMP	MULNUM10
  171:	  0016	A1 C6			AJMP	HEXOUT
  172:				;
  173:				; the remaining jump to routines were extracted from basic52
  174:				; by me to make the floating point software stand alone
  175:				;
  176:	  0018	61 3D			AJMP	PUSHR2R0			; INTEGER to FLOAT
  177:	  001A	C1 0B			AJMP	IFIX				; FLOAT to INTEGER
  178:	  001C	C1 4C			AJMP	PUSHAS				; PUSH R2:R0 TO ARGUMENT
  179:	  001E	C1 48			AJMP	POPAS				; POP ARGUMENT TO R3:R1
  180:	  0020	C1 69			AJMP	MOVAS				; COPY ARGUMENT
  181:	  0022	C1 8D			AJMP	AINT				; INT FUNCTION
  182:	  0024	C1 B5			AJMP	PUSHC				; PUSH ARG IN DPTR TO STACK
  183:					;
  184:				$EJECT

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 6



 Line  I  Addr  Code            Source

  185:					;
  186:	  0026			FLOATING_SUB:
  187:					;
  188:	  0026	75 A0 01		MOV	P2,#ARG_STACK_PAGE
  189:	  0029	A8 24			MOV	R0,ARG_STACK
  190:	  002B	18			DEC	R0		;POINT TO SIGN
  191:	  002C	E2			MOVX	A,@R0		;READ SIGN
  192:	  002D	B2 E0			CPL	ACC.0
  193:	  002F	F2			MOVX	@R0,A
  194:					;
  195:					;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  196:					;
  197:	  0030			FLOATING_ADD:
  198:					;
  199:					;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  200:					;
  201:					;
  202:	  0030	51 F1			ACALL 	MDES1		;R7=TOS EXP, R6=TOS-1 EXP, R4=TOS SIGN
  203:								;R3=TOS-1 SIGN, OPERATION IS R1 # R0
  204:					;
  205:	  0032	EF			MOV	A,R7		;GET TOS EXPONENT
  206:	  0033	60 0D			JZ	POP_AND_EXIT	;IF TOS=0 THEN POP AND EXIT
  207:	  0035	BE 00 12		CJNE	R6,#0,LOAD1	;CLEAR CARRY EXIT IF ZERO
  208:					;
  209:					;**************************************************************
  210:					;
  211:	  0038			SWAP_AND_EXIT:	; Swap external args and return
  212:					;
  213:					;**************************************************************
  214:					;
  215:	  0038	51 E5			ACALL	LOAD_POINTERS
  216:	  003A	7F 06			MOV	R7,#FP_NUMBER_SIZE
  217:					;
  218:	  003C	E2		SE1:	MOVX	A,@R0		;SWAP THE ARGUMENTS
  219:	  003D	F3			MOVX	@R1,A
  220:	  003E	18			DEC	R0
  221:	  003F	19			DEC	R1
  222:	  0040	DF FA			DJNZ	R7,SE1
  223:					;
  224:	  0042			POP_AND_EXIT:
  225:					;
  226:	  0042	E5 24			MOV	A,ARG_STACK	;POP THE STACK
  227:	  0044	24 06			ADD	A,#FP_NUMBER_SIZE
  228:	  0046	F5 24			MOV	ARG_STACK,A
  229:	  0048	E4			CLR	A
  230:	  0049	22			RET
  231:					;
  232:					;
  233:	  004A	9E		LOAD1:	SUBB	A,R6		;A = ARG 1 EXP - ARG 2 EXP
  234:	  004B	8F 30			MOV	FP_EXP,R7	;SAVE EXPONENT AND SIGN
  235:	  004D	8C 2F			MOV	FP_SIGN,R4
  236:	  004F	50 09			JNC	LOAD2		;ARG1 EXPONENT IS LARGER OR SAME
  237:	  0051	8E 30			MOV	FP_EXP,R6
  238:	  0053	8B 2F			MOV	FP_SIGN,R3
  239:	  0055	F4			CPL	A
  240:	  0056	04			INC	A		;COMPENSATE FOR EXP DELTA

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 7



 Line  I  Addr  Code            Source

  241:	  0057	C8			XCH	A,R0		;FORCE R0 TO POINT AT THE LARGEST
  242:	  0058	C9			XCH	A,R1		;EXPONENT
  243:	  0059	C8			XCH	A,R0
  244:					;
  245:	  005A	FF		LOAD2:	MOV	R7,A		;SAVE THE EXPONENT DELTA IN R7
  246:	  005B	C2 33			CLR	ADD_IN
  247:	  005D	BD 00 02		CJNE	R5,#0,$+5
  248:	  0060	D2 33			SETB	ADD_IN
  249:					;
  250:				$EJECT

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 8



 Line  I  Addr  Code            Source

  251:					; Load the R1 mantissa
  252:					;
  253:	  0062	71 02			ACALL	LOADR1_MANTISSA	;LOAD THE SMALLEST NUMBER
  254:					;
  255:					; Now align the number to the delta exponent
  256:					; R4 points to the string of the last digits lost
  257:					;
  258:	  0064	BF 0B 00		CJNE	R7,#DIGIT+DIGIT+3,$+3
  259:	  0067	40 02			JC	$+4
  260:	  0069	7F 0A			MOV	R7,#DIGIT+DIGIT+2
  261:					;
  262:	  006B	75 2A 00		MOV	FP_CARRY,#00	;CLEAR THE CARRY
  263:	  006E	51 42			ACALL	RIGHT		;SHIFT THE NUMBER
  264:					;
  265:					; Set up for addition and subtraction
  266:					;
  267:	  0070	7F 04			MOV	R7,#DIGIT	;LOOP COUNT
  268:	  0072	79 2E			MOV	R1,#FP_DIG78
  269:	  0074	74 9E			MOV	A,#9EH
  270:	  0076	C3			CLR	C
  271:	  0077	9C			SUBB	A,R4
  272:	  0078	D4			DA	A
  273:	  0079	CC			XCH	A,R4
  274:	  007A	70 01			JNZ	$+3
  275:	  007C	FC			MOV	R4,A
  276:	  007D	B4 50 00		CJNE	A,#50H,$+3	;TEST FOR SUBTRACTION
  277:	  0080	30 33 18		JNB	ADD_IN,SUBLP	;DO SUBTRACTION IF NO ADD_IN
  278:	  0083	B3			CPL	C		;FLIP CARRY FOR ADDITION
  279:	  0084	11 92			ACALL	ADDLP		;DO ADDITION
  280:					;
  281:	  0086	50 08			JNC	ADD_R
  282:	  0088	05 2A			INC	FP_CARRY
  283:	  008A	7F 01			MOV	R7,#1
  284:	  008C	51 42			ACALL	RIGHT
  285:	  008E	31 F9			ACALL	INC_FP_EXP	;SHIFT AND BUMP EXPONENT
  286:					;
  287:	  0090	21 EA		ADD_R:	AJMP	STORE_ALIGN_TEST_AND_EXIT
  288:					;
  289:	  0092	E2		ADDLP:	MOVX	A,@R0
  290:	  0093	37			ADDC	A,@R1
  291:	  0094	D4			DA	A
  292:	  0095	F7			MOV	@R1,A

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -