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

📄 fp-52.lst

📁 一个用PROTEUS搭建的51单片机的基本运行系统
💻 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:	FP-52.ASM
	Object File:	FP-52.HEX
	List File:	FP-52.LST



 Line  I  Addr  Code            Source

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



 Line  I  Addr  Code            Source

   44:				;
   45:				$EJECT

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 3



 Line  I  Addr  Code            Source

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



 Line  I  Addr  Code            Source

   78:				;***********************************************************************
   79:				;
   80:				; The following values MUST be provided by the user
   81:				;
   82:				;***********************************************************************
   83:				;
   84:		N      0009	ARG_STACK	EQU	9	;ARGUMENT STACK POINTER
   85:		N      0001	ARG_STACK_PAGE	EQU	1
   86:		N      0017	FORMAT		EQU	23	;LOCATION OF OUTPUT FORMAT BYTE
   87:		N      1990	OUTPUT		EQU	1990H	;CALL LOCATION TO OUTPUT A CHARACTER
   88:		N      0058	CONVT		EQU	58H	;LOCATION TO CONVERT NUMBERS
   89:		N	 19	INTGRC		BIT	25	;BIT SET IF INTGER ERROR
   90:		N	 36	ZSURP		BIT	54	;ZERO SUPRESSION FOR HEX PRINT
   91:				;
   92:				;***********************************************************************
   93:				;
   94:				; The following equates are used internally
   95:				;
   96:				;***********************************************************************
   97:				;
   98:		N      0006	FP_NUMBER_SIZE	EQU	6
   99:		N      0004	DIGIT		EQU	FP_NUMBER_SIZE-2
  100:		N      0000	R0B0		EQU	0
  101:		N      0001	R1B0		EQU	1
  102:		N      0000	UNDERFLOW	EQU	0
  103:		N      0001	OVERFLOW	EQU	1
  104:		N      0002	ZERO		EQU	2
  105:		N      0003	ZERO_DIVIDE	EQU	3
  106:				;
  107:				;***********************************************************************
  108:				$EJECT

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 5



 Line  I  Addr  Code            Source

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



 Line  I  Addr  Code            Source

  153:		N      1993		ORG	1993H
  154:					;
  155:					;**************************************************************
  156:					;
  157:					; The floating point entry points and jump table
  158:					;
  159:					;**************************************************************
  160:					;
  161:	  1993	21 B7			AJMP	FLOATING_ADD
  162:	  1995	21 AD			AJMP	FLOATING_SUB
  163:	  1997	41 6A			AJMP	FLOATING_COMP
  164:	  1999	41 9A			AJMP	FLOATING_MUL
  165:	  199B	41 CF			AJMP	FLOATING_DIV
  166:	  199D	81 96			AJMP	HEXSCAN
  167:	  199F	81 CF			AJMP	FLOATING_POINT_INPUT
  168:	  19A1	A1 87			AJMP	FLOATING_POINT_OUTPUT
  169:	  19A3	E1 04			AJMP	CONVERT_BINARY_TO_ASCII_STRING
  170:	  19A5	C1 AB			AJMP	CONVERT_ASCII_STRING_TO_BINARY
  171:	  19A7	C1 E0			AJMP	MULNUM10
  172:	  19A9	E1 4C			AJMP	HEXOUT
  173:	  19AB	81 C3			AJMP	PUSHR2R0
  174:					;
  175:				$EJECT

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 7



 Line  I  Addr  Code            Source

  176:					;
  177:	  19AD			FLOATING_SUB:
  178:					;
  179:	  19AD	75 A0 01		MOV	P2,#ARG_STACK_PAGE
  180:	  19B0	A8 09			MOV	R0,ARG_STACK
  181:	  19B2	18			DEC	R0		;POINT TO SIGN
  182:	  19B3	E2			MOVX	A,@R0		;READ SIGN
  183:	  19B4	B2 E0			CPL	ACC.0
  184:	  19B6	F2			MOVX	@R0,A
  185:					;
  186:					;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  187:					;
  188:	  19B7			FLOATING_ADD:
  189:					;
  190:					;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  191:					;
  192:					;
  193:	  19B7	91 77			ACALL 	MDES1		;R7=TOS EXP, R6=TOS-1 EXP, R4=TOS SIGN
  194:								;R3=TOS-1 SIGN, OPERATION IS R1 # R0
  195:					;
  196:	  19B9	EF			MOV	A,R7		;GET TOS EXPONENT
  197:	  19BA	60 0D			JZ	POP_AND_EXIT	;IF TOS=0 THEN POP AND EXIT
  198:	  19BC	BE 00 12		CJNE	R6,#0,LOAD1	;CLEAR CARRY EXIT IF ZERO
  199:					;
  200:					;**************************************************************
  201:					;
  202:	  19BF			SWAP_AND_EXIT:	; Swap external args and return
  203:					;
  204:					;**************************************************************
  205:					;
  206:	  19BF	91 6B			ACALL	LOAD_POINTERS
  207:	  19C1	7F 06			MOV	R7,#FP_NUMBER_SIZE
  208:					;
  209:	  19C3	E2		SE1:	MOVX	A,@R0		;SWAP THE ARGUMENTS
  210:	  19C4	F3			MOVX	@R1,A
  211:	  19C5	18			DEC	R0
  212:	  19C6	19			DEC	R1
  213:	  19C7	DF FA			DJNZ	R7,SE1
  214:					;
  215:	  19C9			POP_AND_EXIT:
  216:					;
  217:	  19C9	E5 09			MOV	A,ARG_STACK	;POP THE STACK
  218:	  19CB	24 06			ADD	A,#FP_NUMBER_SIZE
  219:	  19CD	F5 09			MOV	ARG_STACK,A
  220:	  19CF	E4			CLR	A
  221:	  19D0	22			RET
  222:					;
  223:					;
  224:	  19D1	9E		LOAD1:	SUBB	A,R6		;A = ARG 1 EXP - ARG 2 EXP
  225:	  19D2	8F 30			MOV	FP_EXP,R7	;SAVE EXPONENT AND SIGN
  226:	  19D4	8C 2F			MOV	FP_SIGN,R4
  227:	  19D6	50 09			JNC	LOAD2		;ARG1 EXPONENT IS LARGER OR SAME
  228:	  19D8	8E 30			MOV	FP_EXP,R6
  229:	  19DA	8B 2F			MOV	FP_SIGN,R3
  230:	  19DC	F4			CPL	A
  231:	  19DD	04			INC	A		;COMPENSATE FOR EXP DELTA

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 8



 Line  I  Addr  Code            Source

  232:	  19DE	C8			XCH	A,R0		;FORCE R0 TO POINT AT THE LARGEST
  233:	  19DF	C9			XCH	A,R1		;EXPONENT
  234:	  19E0	C8			XCH	A,R0
  235:					;
  236:	  19E1	FF		LOAD2:	MOV	R7,A		;SAVE THE EXPONENT DELTA IN R7
  237:	  19E2	C2 23			CLR	ADD_IN
  238:	  19E4	BD 00 02		CJNE	R5,#0,$+5
  239:	  19E7	D2 23			SETB	ADD_IN
  240:					;
  241:				$EJECT

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 9



 Line  I  Addr  Code            Source

  242:					; Load the R1 mantissa
  243:					;
  244:	  19E9	91 88			ACALL	LOADR1_MANTISSA	;LOAD THE SMALLEST NUMBER
  245:					;
  246:					; Now align the number to the delta exponent
  247:					; R4 points to the string of the last digits lost
  248:					;
  249:	  19EB	BF 0B 00		CJNE	R7,#DIGIT+DIGIT+3,$+3
  250:	  19EE	40 02			JC	$+4
  251:	  19F0	7F 0A			MOV	R7,#DIGIT+DIGIT+2
  252:					;
  253:	  19F2	75 2A 00		MOV	FP_CARRY,#00	;CLEAR THE CARRY
  254:	  19F5	71 C8			ACALL	RIGHT		;SHIFT THE NUMBER
  255:					;
  256:					; Set up for addition and subtraction
  257:					;
  258:	  19F7	7F 04			MOV	R7,#DIGIT	;LOOP COUNT
  259:	  19F9	79 2E			MOV	R1,#FP_DIG78
  260:	  19FB	74 9E			MOV	A,#9EH
  261:	  19FD	C3			CLR	C
  262:	  19FE	9C			SUBB	A,R4
  263:	  19FF	D4			DA	A
  264:	  1A00	CC			XCH	A,R4
  265:	  1A01	70 01			JNZ	$+3
  266:	  1A03	FC			MOV	R4,A
  267:	  1A04	B4 50 00		CJNE	A,#50H,$+3	;TEST FOR SUBTRACTION
  268:	  1A07	30 23 18		JNB	ADD_IN,SUBLP	;DO SUBTRACTION IF NO ADD_IN
  269:	  1A0A	B3			CPL	C		;FLIP CARRY FOR ADDITION
  270:	  1A0B	51 19			ACALL	ADDLP		;DO ADDITION
  271:					;
  272:	  1A0D	50 08			JNC	ADD_R
  273:	  1A0F	05 2A			INC	FP_CARRY
  274:	  1A11	7F 01			MOV	R7,#1
  275:	  1A13	71 C8			ACALL	RIGHT
  276:	  1A15	71 7F			ACALL	INC_FP_EXP	;SHIFT AND BUMP EXPONENT
  277:					;
  278:	  1A17	61 70		ADD_R:	AJMP	STORE_ALIGN_TEST_AND_EXIT
  279:					;
  280:	  1A19	E2		ADDLP:	MOVX	A,@R0
  281:	  1A1A	37			ADDC	A,@R1
  282:	  1A1B	D4			DA	A
  283:	  1A1C	F7			MOV	@R1,A
  284:	  1A1D	18			DEC	R0
  285:	  1A1E	19			DEC	R1
  286:	  1A1F	DF F8			DJNZ	R7,ADDLP	;LOOP UNTIL DONE

⌨️ 快捷键说明

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