📄 fp52.lst
字号:
293: 0096 18 DEC R0
294: 0097 19 DEC R1
295: 0098 DF F8 DJNZ R7,ADDLP ;LOOP UNTIL DONE
296: 009A 22 RET
297: ;
298: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 9
Line I Addr Code Source
299: ;
300: 009B E2 SUBLP: MOVX A,@R0 ;NOW DO SUBTRACTION
301: 009C FE MOV R6,A
302: 009D E4 CLR A
303: 009E 34 99 ADDC A,#99H
304: 00A0 97 SUBB A,@R1
305: 00A1 2E ADD A,R6
306: 00A2 D4 DA A
307: 00A3 F7 MOV @R1,A
308: 00A4 18 DEC R0
309: 00A5 19 DEC R1
310: 00A6 DF F3 DJNZ R7,SUBLP
311: 00A8 40 11 JC FSUB6
312: ;
313: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 10
Line I Addr Code Source
314: ;
315: ; Need to complement the result and sign because the floating
316: ; point accumulator mantissa was larger than the external
317: ; memory and their signs were equal.
318: ;
319: 00AA B2 78 CPL FP_SIGN.0
320: 00AC 79 2E MOV R1,#FP_DIG78
321: 00AE 7F 04 MOV R7,#DIGIT ;LOOP COUNT
322: ;
323: 00B0 74 9A FSUB5: MOV A,#9AH
324: 00B2 97 SUBB A,@R1
325: 00B3 24 00 ADD A,#0
326: 00B5 D4 DA A
327: 00B6 F7 MOV @R1,A
328: 00B7 19 DEC R1
329: 00B8 B3 CPL C
330: 00B9 DF F5 DJNZ R7,FSUB5 ;LOOP
331: ;
332: ; Now see how many zeros their are
333: ;
334: 00BB 78 2B FSUB6: MOV R0,#FP_DIG12
335: 00BD 7F 00 MOV R7,#0
336: ;
337: 00BF E6 FSUB7: MOV A,@R0
338: 00C0 70 08 JNZ FSUB8
339: 00C2 0F INC R7
340: 00C3 0F INC R7
341: 00C4 08 INC R0
342: 00C5 B8 2F F7 CJNE R0,#FP_SIGN,FSUB7
343: 00C8 41 32 AJMP ZERO_AND_EXIT
344: ;
345: 00CA B4 10 00 FSUB8: CJNE A,#10H,$+3
346: 00CD 50 01 JNC FSUB9
347: 00CF 0F INC R7
348: ;
349: ; Now R7 has the number of leading zeros in the FP ACC
350: ;
351: 00D0 E5 30 FSUB9: MOV A,FP_EXP ;GET THE OLD EXPONENT
352: 00D2 C3 CLR C
353: 00D3 9F SUBB A,R7 ;SUBTRACT FROM THE NUMBER OF ZEROS
354: 00D4 60 0B JZ FSUB10
355: 00D6 40 09 JC FSUB10
356: ;
357: 00D8 F5 30 MOV FP_EXP,A ;SAVE THE NEW EXPONENT
358: ;
359: 00DA 51 7C ACALL LEFT1 ;SHIFT THE FP ACC
360: 00DC 75 2A 00 MOV FP_CARRY,#0
361: 00DF 21 EA AJMP STORE_ALIGN_TEST_AND_EXIT
362: ;
363: 00E1 41 2C FSUB10: AJMP UNDERFLOW_AND_EXIT
364: ;
365: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 11
Line I Addr Code Source
366: ;***************************************************************
367: ;
368: 00E3 FLOATING_COMP: ; Compare two floating point numbers
369: ; used for relational operations and is faster
370: ; than subtraction. ON RETURN, The carry is set
371: ; if ARG1 is > ARG2, else carry is not set
372: ; if ARG1 = ARG2, F0 gets set
373: ;
374: ;***************************************************************
375: ;
376: 00E3 51 F1 ACALL MDES1 ;SET UP THE REGISTERS
377: 00E5 E5 24 MOV A,ARG_STACK
378: 00E7 24 0C ADD A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
379: 00E9 F5 24 MOV ARG_STACK,A ;POP THE STACK TWICE, CLEAR THE CARRY
380: 00EB EE MOV A,R6 ;CHECK OUT EXPONENTS
381: 00EC C2 D5 CLR F0
382: 00EE C3 CLR C
383: 00EF 9F SUBB A,R7
384: 00F0 60 0A JZ EXPONENTS_EQUAL
385: 00F2 40 03 JC ARG1_EXP_IS_LARGER
386: ;
387: ; Now the ARG2 EXPONENT is > ARG1 EXPONENT
388: ;
389: 00F4 SIGNS_DIFFERENT:
390: ;
391: 00F4 EB MOV A,R3 ;SEE IF SIGN OF ARG2 IS POSITIVE
392: 00F5 80 01 SJMP $+3
393: ;
394: 00F7 ARG1_EXP_IS_LARGER:
395: ;
396: 00F7 EC MOV A,R4 ;GET THE SIGN OF ARG1 EXPONENT
397: 00F8 60 01 JZ $+3
398: 00FA B3 CPL C
399: 00FB 22 RET
400: ;
401: 00FC EXPONENTS_EQUAL:
402: ;
403: ; First, test the sign, then the mantissa
404: ;
405: 00FC BD 00 F5 CJNE R5,#0,SIGNS_DIFFERENT
406: ;
407: 00FF BOTH_PLUS:
408: ;
409: 00FF 7F 04 MOV R7,#DIGIT ;POINT AT MS DIGIT
410: 0101 18 DEC R0
411: 0102 18 DEC R0
412: 0103 18 DEC R0
413: 0104 19 DEC R1
414: 0105 19 DEC R1
415: 0106 19 DEC R1
416: ;
417: ; Now do the compare
418: ;
419: 0107 E2 CLOOP: MOVX A,@R0
420: 0108 FE MOV R6,A
421: 0109 E3 MOVX A,@R1
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 12
Line I Addr Code Source
422: 010A 9E SUBB A,R6
423: 010B 70 EA JNZ ARG1_EXP_IS_LARGER
424: 010D 08 INC R0
425: 010E 09 INC R1
426: 010F DF F6 DJNZ R7,CLOOP
427: ;
428: ; If here, the numbers are the same, the carry is cleared
429: ;
430: 0111 D2 D5 SETB F0
431: 0113 22 RET ;EXIT WITH EQUAL
432: ;
433: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 13
Line I Addr Code Source
434: ;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
435: ;
436: 0114 FLOATING_MUL: ; Floating point multiply
437: ;
438: ;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
439: ;
440: 0114 51 EF ACALL MUL_DIV_EXP_AND_SIGN
441: ;
442: ; check for zero exponents
443: ;
444: 0116 BE 00 02 CJNE R6,#00,$+5 ;ARG 2 EXP ZERO?
445: 0119 41 32 AJMP ZERO_AND_EXIT
446: ;
447: ; calculate the exponent
448: ;
449: 011B 8D 2F FMUL1: MOV FP_SIGN,R5 ;SAVE THE SIGN, IN CASE OF FAILURE
450: ;
451: 011D EF MOV A,R7
452: 011E 60 F9 JZ FMUL1-2
453: 0120 2E ADD A,R6 ;ADD THE EXPONENTS
454: 0121 20 E7 05 JB ACC.7,FMUL_OVER
455: 0124 10 D7 06 JBC CY,FMUL2 ;SEE IF CARRY IS SET
456: ;
457: 0127 41 2C AJMP UNDERFLOW_AND_EXIT
458: ;
459: 0129 FMUL_OVER:
460: ;
461: 0129 50 02 JNC FMUL2 ;OK IF SET
462: ;
463: 012B 41 1B FOV: AJMP OVERFLOW_AND_EXIT
464: ;
465: 012D 94 81 FMUL2: SUBB A,#129 ;SUBTRACT THE EXPONENT BIAS
466: 012F FE MOV R6,A ;SAVE IT FOR LATER
467: ;
468: ; Unpack and load R0
469: ;
470: 0130 51 05 ACALL UNPACK_R0
471: ;
472: ; Now set up for loop multiply
473: ;
474: 0132 7B 04 MOV R3,#DIGIT
475: 0134 AC 01 MOV R4,R1B0
476: ;
477: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 14
Line I Addr Code Source
478: ;
479: ; Now, do the multiply and accumulate the product
480: ;
481: 0136 8C 01 FMUL3: MOV R1B0,R4
482: 0138 E3 MOVX A,@R1
483: 0139 FA MOV R2,A
484: 013A 51 B2 ACALL MUL_NIBBLE
485: ;
486: 013C EA MOV A,R2
487: 013D C4 SWAP A
488: 013E 51 B2 ACALL MUL_NIBBLE
489: 0140 1C DEC R4
490: 0141 DB F3 DJNZ R3,FMUL3
491: ;
492: ; Now, pack and restore the sign
493: ;
494: 0143 8E 30 MOV FP_EXP,R6
495: 0145 8D 2F MOV FP_SIGN,R5
496: 0147 21 AA AJMP PACK ;FINISH IT OFF
497: ;
498: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 15
Line I Addr Code Source
499: ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
500: ;
501: 0149 FLOATING_DIV:
502: ;
503: ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
504: ;
505: 0149 51 F1 ACALL MDES1
506: ;
507: ; Check the exponents
508: ;
509: 014B 8D 2F MOV FP_SIGN,R5 ;SAVE THE SIGN
510: 014D BF 00 06 CJNE R7,#0,DIV0 ;CLEARS THE CARRY
511: 0150 51 1B ACALL OVERFLOW_AND_EXIT
512: 0152 E4 CLR A
513: 0153 D2 E3 SETB ACC.ZERO_DIVIDE
514: 0155 22 RET
515: ;
516: 0156 EE DIV0: MOV A,R6 ;GET EXPONENT
517: 0157 60 C0 JZ FMUL1-2 ;EXIT IF ZERO
518: 0159 9F SUBB A,R7 ;DELTA EXPONENT
519: 015A 20 E7 04 JB ACC.7,D_UNDER
520: 015D 50 04 JNC DIV3
521: 015F 41 2C AJMP UNDERFLOW_AND_EXIT
522: ;
523: 0161 50 C8 D_UNDER:JNC FOV
524: ;
525: 0163 24 81 DIV3: ADD A,#129 ;CORRECTLY BIAS THE EXPONENT
526: 0165 F5 30 MOV FP_EXP,A ;SAVE THE EXPONENT
527: 0167 71 02 ACALL LOADR1_MANTISSA ;LOAD THE DIVIDED
528: ;
529: 0169 7A 34 MOV R2,#FP_ACCC ;SAVE LOCATION
530: 016B AB 00 MOV R3,R0B0 ;SAVE POINTER IN R3
531: 016D 75 2A 00 MOV FP_CARRY,#0 ;ZERO CARRY BYTE
532: ;
533: 0170 7D FF DIV4: MOV R5,#0FFH ;LOOP COUNT
534: 0172 D3 SETB C
535: ;
536: 0173 8B 00 DIV5: MOV R0B0,R3 ;RESTORE THE EXTERNAL POINTER
537: 0175 79 2E MOV R1,#FP_DIG78 ;SET UP INTERNAL POINTER
538: 0177 7F 04 MOV R7,#DIGIT ;LOOP COUNT
539: 0179 50 17 JNC DIV7 ;EXIT IF NO CARRY
540: ;
541: 017B E2 DIV6: MOVX A,@R0 ;DO ACCUMLATION
542: 017C FE MOV R6,A
543: 017D E4 CLR A
544: 017E 34 99 ADDC A,#99H
545: 0180 9E SUBB A,R6
546: 0181 27 ADD A,@R1
547: 0182 D4 DA A
548: 0183 F7 MOV @R1,A
549: 0184 18 DEC R0
550: 0185 19 DEC R1
551: 0186 DF F3 DJNZ R7,DIV6 ;LOOP
552: ;
553: 0188 0D INC R5 ;SUBTRACT COUNTER
554: 0189 40 E8 JC DIV5 ;KEEP LOOPING IF CARRY
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 16
Line I Addr Code Source
555: 018B E7 MOV A,@R1 ;GET CARRY
556: 018C 94 01 SUBB A,#1 ;CARRY IS CLEARED
557: 018E F7 MOV @R1,A ;SAVE CARRY DIGIT
558: 018F B3 CPL C
559: 0190 80 E1 SJMP DIV5 ;LOOP
560: ;
561: ; Restore the result if carry was found
562: ;
563: 0192 11 92 DIV7: ACALL ADDLP ;ADD NUMBER BACK
564: 0194 77 00 MOV @R1,#0 ;CLEAR CARRY
565: 0196 8A 00 MOV R0B0,R2 ;GET SAVE COUNTER
566: 0198 A6 05 MOV @R0,5 ;SAVE COUNT BYTE
567: ;
568: 019A 0A INC R2 ;ADJUST SAVE COUNTER
569: 019B 7F 01 MOV R7,#1 ;BUMP DIVIDEND
570: 019D 51 7A ACALL LEFT
571: 019F BA 3E CE CJNE R2,#FP_ACC8+2,DIV4
572: ;
573: 01A2 D5 30 02 DJNZ FP_EXP,DIV8
574: 01A5 41 2C AJMP UNDERFLOW_AND_EXIT
575: ;
576: 01A7 75 2A 00 DIV8: MOV FP_CARRY,#0
577: ;
578: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 17
Line I Addr Code Source
579: ;***************************************************************
580: ;
581: 01AA PACK: ; Pack the mantissa
582: ;
583: ;***************************************************************
584: ;
585: ; First, set up the pointers
586: ;
587: 01AA 78 34 MOV R0,#FP_ACCC
588: 01AC E6 MOV A,@R0 ;GET FP_ACCC
589: 01AD FE MOV R6,A ;SAVE FOR ZERO COUNT
590: 01AE 60 03 JZ PACK0 ;JUMP OVER IF ZERO
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -