📄 fp-52.lst
字号:
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 + -