📄 fp52.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: 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 + -