📄 fp52.lst
字号:
591: 01B0 31 F9 ACALL INC_FP_EXP ;BUMP THE EXPONENT
592: 01B2 18 DEC R0
593: ;
594: 01B3 08 PACK0: INC R0 ;POINT AT FP_ACC1
595: ;
596: 01B4 74 08 PACK1: MOV A,#8 ;ADJUST NIBBLE POINTER
597: 01B6 F9 MOV R1,A
598: 01B7 28 ADD A,R0
599: 01B8 F8 MOV R0,A
600: 01B9 B6 05 00 CJNE @R0,#5,$+3 ;SEE IF ADJUSTING NEEDED
601: 01BC 40 13 JC PACK3+1
602: ;
603: 01BE D3 PACK2: SETB C
604: 01BF E4 CLR A
605: 01C0 18 DEC R0
606: 01C1 36 ADDC A,@R0
607: 01C2 D4 DA A
608: 01C3 D6 XCHD A,@R0 ;SAVE THE VALUE
609: 01C4 30 E4 09 JNB ACC.4,PACK3
610: 01C7 D9 F5 DJNZ R1,PACK2
611: ;
612: 01C9 18 DEC R0
613: 01CA 76 01 MOV @R0,#1
614: 01CC 31 F9 ACALL INC_FP_EXP
615: 01CE 80 06 SJMP PACK4
616: ;
617: 01D0 19 PACK3: DEC R1
618: 01D1 E9 MOV A,R1
619: 01D2 C3 CLR C
620: 01D3 C8 XCH A,R0
621: 01D4 98 SUBB A,R0
622: 01D5 F8 MOV R0,A
623: ;
624: 01D6 79 2B PACK4: MOV R1,#FP_DIG12
625: ;
626: ; Now, pack
627: ;
628: 01D8 E6 PLOOP: MOV A,@R0
629: 01D9 C4 SWAP A ;FLIP THE DIGITS
630: 01DA 08 INC R0
631: 01DB D6 XCHD A,@R0
632: 01DC 42 06 ORL 6,A ;ACCUMULATE THE OR'ED DIGITS
633: 01DE F7 MOV @R1,A
634: 01DF 08 INC R0
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 18
Line I Addr Code Source
635: 01E0 09 INC R1
636: 01E1 B9 2F F4 CJNE R1,#FP_SIGN,PLOOP
637: 01E4 EE MOV A,R6
638: 01E5 70 03 JNZ STORE_ALIGN_TEST_AND_EXIT
639: 01E7 75 30 00 MOV FP_EXP,#0 ;ZERO EXPONENT
640: ;
641: ;**************************************************************
642: ;
643: 01EA STORE_ALIGN_TEST_AND_EXIT: ;Save the number align carry and exit
644: ;
645: ;**************************************************************
646: ;
647: 01EA 51 E5 ACALL LOAD_POINTERS
648: 01EC 89 24 MOV ARG_STACK,R1 ;SET UP THE NEW STACK
649: 01EE 78 30 MOV R0,#FP_EXP
650: ;
651: ; Now load the numbers
652: ;
653: 01F0 E6 STORE2: MOV A,@R0
654: 01F1 F3 MOVX @R1,A ;SAVE THE NUMBER
655: 01F2 18 DEC R0
656: 01F3 19 DEC R1
657: 01F4 B8 2A F9 CJNE R0,#FP_CARRY,STORE2
658: ;
659: 01F7 E4 CLR A ;NO ERRORS
660: ;
661: 01F8 22 PRET: RET ;EXIT
662: ;
663: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 19
Line I Addr Code Source
664: 01F9 INC_FP_EXP:
665: ;
666: 01F9 05 30 INC FP_EXP
667: 01FB E5 30 MOV A,FP_EXP
668: 01FD 70 F9 JNZ PRET ;EXIT IF NOT ZERO
669: 01FF D0 E0 POP ACC ;WASTE THE CALLING STACK
670: 0201 D0 E0 POP ACC
671: 0203 41 1B AJMP OVERFLOW_AND_EXIT
672: ;
673: ;***********************************************************************
674: ;
675: 0205 UNPACK_R0: ; Unpack BCD digits and load into nibble locations
676: ;
677: ;***********************************************************************
678: ;
679: 0205 C0 01 PUSH R1B0
680: 0207 79 32 MOV R1,#FP_NIB8
681: ;
682: 0209 E2 ULOOP: MOVX A,@R0
683: 020A 54 0F ANL A,#0FH
684: 020C F7 MOV @R1,A ;SAVE THE NIBBLE
685: 020D E2 MOVX A,@R0
686: 020E C4 SWAP A
687: 020F 54 0F ANL A,#0FH
688: 0211 19 DEC R1
689: 0212 F7 MOV @R1,A ;SAVE THE NIBBLE AGAIN
690: 0213 18 DEC R0
691: 0214 19 DEC R1
692: 0215 B9 2A F1 CJNE R1,#FP_NIB1-1,ULOOP
693: ;
694: 0218 D0 01 POP R1B0
695: ;
696: 021A 22 LOAD7: RET
697: ;
698: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 20
Line I Addr Code Source
699: ;**************************************************************
700: ;
701: 021B OVERFLOW_AND_EXIT: ;LOAD 99999999 E+127, SET OV BIT, AND EXIT
702: ;
703: ;**************************************************************
704: ;
705: 021B 78 2E MOV R0,#FP_DIG78
706: 021D 74 99 MOV A,#99H
707: ;
708: 021F F6 OVE1: MOV @R0,A
709: 0220 18 DEC R0
710: 0221 B8 2A FB CJNE R0,#FP_CARRY,OVE1
711: ;
712: 0224 75 30 FF MOV FP_EXP,#0FFH
713: 0227 31 EA ACALL STORE_ALIGN_TEST_AND_EXIT
714: ;
715: 0229 D2 E1 SETB ACC.OVERFLOW
716: 022B 22 RET
717: ;
718: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 21
Line I Addr Code Source
719: ;**************************************************************
720: ;
721: 022C UNDERFLOW_AND_EXIT: ;LOAD 0, SET UF BIT, AND EXIT
722: ;
723: ;**************************************************************
724: ;
725: 022C 51 32 ACALL ZERO_AND_EXIT
726: 022E E4 CLR A
727: 022F D2 E0 SETB ACC.UNDERFLOW
728: 0231 22 RET
729: ;
730: ;**************************************************************
731: ;
732: 0232 ZERO_AND_EXIT: ;LOAD 0, SET ZERO BIT, AND EXIT
733: ;
734: ;**************************************************************
735: ;
736: 0232 51 39 ACALL FP_CLEAR
737: 0234 31 EA ACALL STORE_ALIGN_TEST_AND_EXIT
738: 0236 D2 E2 SETB ACC.ZERO
739: 0238 22 RET ;EXIT
740: ;
741: ;**************************************************************
742: ;
743: 0239 FP_CLEAR:
744: ;
745: ; Clear internal storage
746: ;
747: ;**************************************************************
748: ;
749: 0239 E4 CLR A
750: 023A 78 3D MOV R0,#FP_ACC8+1
751: ;
752: 023C F6 FPC1: MOV @R0,A
753: 023D 18 DEC R0
754: 023E B8 29 FB CJNE R0,#FP_TEMP,FPC1
755: 0241 22 RET
756: ;
757: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 22
Line I Addr Code Source
758: ;**************************************************************
759: ;
760: 0242 RIGHT: ; Shift ACCUMULATOR RIGHT the number of nibbles in R7
761: ; Save the shifted values in R4 if SAVE_ROUND is set
762: ;
763: ;**************************************************************
764: ;
765: 0242 7C 00 MOV R4,#0 ;IN CASE OF NO SHIFT
766: ;
767: 0244 C3 RIGHT1: CLR C
768: 0245 EF MOV A,R7 ;GET THE DIGITS TO SHIFT
769: 0246 60 22 JZ RIGHT5-1 ;EXIT IF ZERO
770: 0248 94 02 SUBB A,#2 ;TWO TO DO?
771: 024A 50 1F JNC RIGHT5 ;SHIFT TWO NIBBLES
772: ;
773: ; Swap one nibble then exit
774: ;
775: 024C C0 00 RIGHT3: PUSH R0B0 ;SAVE POINTER REGISTER
776: 024E C0 01 PUSH R1B0
777: ;
778: 0250 79 2E MOV R1,#FP_DIG78 ;LOAD THE POINTERS
779: 0252 78 2D MOV R0,#FP_DIG56
780: 0254 EC MOV A,R4 ;GET THE OVERFLOW REGISTER
781: 0255 D7 XCHD A,@R1 ;GET DIGIT 8
782: 0256 C4 SWAP A ;FLIP FOR LOAD
783: 0257 FC MOV R4,A
784: ;
785: 0258 E7 RIGHTL: MOV A,@R1 ;GET THE LOW ORDER BYTE
786: 0259 D6 XCHD A,@R0 ;SWAP NIBBLES
787: 025A C4 SWAP A ;FLIP FOR STORE
788: 025B F7 MOV @R1,A ;SAVE THE DIGITS
789: 025C 18 DEC R0 ;BUMP THE POINTERS
790: 025D 19 DEC R1
791: 025E B9 2A F7 CJNE R1,#FP_DIG12-1,RIGHTL ;LOOP
792: ;
793: 0261 E7 MOV A,@R1 ;ACC = CH8
794: 0262 C4 SWAP A ;ACC = 8CH
795: 0263 54 0F ANL A,#0FH ;ACC = 0CH
796: 0265 F7 MOV @R1,A ;CARRY DONE
797: 0266 D0 01 POP R1B0 ;EXIT
798: 0268 D0 00 POP R0B0 ;RESTORE REGISTER
799: 026A 22 RET
800: ;
801: 026B FF RIGHT5: MOV R7,A ;SAVE THE NEW SHIFT NUMBER
802: 026C E4 CLR A
803: 026D C5 2A XCH A,FP_CARRY ;SWAP THE NIBBLES
804: 026F C5 2B XCH A,FP_DIG12
805: 0271 C5 2C XCH A,FP_DIG34
806: 0273 C5 2D XCH A,FP_DIG56
807: 0275 C5 2E XCH A,FP_DIG78
808: 0277 FC MOV R4,A ;SAVE THE LAST DIGIT SHIFTED
809: 0278 80 CB SJMP RIGHT1+1
810: ;
811: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 23
Line I Addr Code Source
812: ;***************************************************************
813: ;
814: 027A LEFT: ; Shift ACCUMULATOR LEFT the number of nibbles in R7
815: ;
816: ;***************************************************************
817: ;
818: 027A 7C 00 MOV R4,#00H ;CLEAR FOR SOME ENTRYS
819: ;
820: 027C C3 LEFT1: CLR C
821: 027D EF MOV A,R7 ;GET SHIFT VALUE
822: 027E 60 22 JZ LEFT5-1 ;EXIT IF ZERO
823: 0280 94 02 SUBB A,#2 ;SEE HOW MANY BYTES TO SHIFT
824: 0282 50 1F JNC LEFT5
825: ;
826: 0284 C0 00 LEFT3: PUSH R0B0 ;SAVE POINTER
827: 0286 C0 01 PUSH R1B0
828: 0288 78 2A MOV R0,#FP_CARRY
829: 028A 79 2B MOV R1,#FP_DIG12
830: ;
831: 028C E6 MOV A,@R0 ;ACC=CHCL
832: 028D C4 SWAP A ;ACC = CLCH
833: 028E F6 MOV @R0,A ;ACC = CLCH, @R0 = CLCH
834: ;
835: 028F E7 LEFTL: MOV A,@R1 ;DIG 12
836: 0290 C4 SWAP A ;DIG 21
837: 0291 D6 XCHD A,@R0
838: 0292 F7 MOV @R1,A ;SAVE IT
839: 0293 08 INC R0 ;BUMP POINTERS
840: 0294 09 INC R1
841: 0295 B8 2E F7 CJNE R0,#FP_DIG78,LEFTL
842: ;
843: 0298 EC MOV A,R4
844: 0299 C4 SWAP A
845: 029A D6 XCHD A,@R0
846: 029B 54 F0 ANL A,#0F0H
847: 029D FC MOV R4,A
848: ;
849: 029E D0 01 POP R1B0
850: 02A0 D0 00 POP R0B0 ;RESTORE
851: 02A2 22 RET ;DONE
852: ;
853: 02A3 FF LEFT5: MOV R7,A ;RESTORE COUNT
854: 02A4 E4 CLR A
855: 02A5 CC XCH A,R4 ;GET THE RESTORATION BYTE
856: 02A6 C5 2E XCH A,FP_DIG78 ;DO THE SWAP
857: 02A8 C5 2D XCH A,FP_DIG56
858: 02AA C5 2C XCH A,FP_DIG34
859: 02AC C5 2B XCH A,FP_DIG12
860: 02AE C5 2A XCH A,FP_CARRY
861: 02B0 80 CB SJMP LEFT1+1
862: ;
863: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 24
Line I Addr Code Source
864: 02B2 MUL_NIBBLE:
865: ;
866: ; Multiply the nibble in R7 by the FP_NIB locations
867: ; accumulate the product in FP_ACC
868: ;
869: ; Set up the pointers for multiplication
870: ;
871: 02B2 54 0F ANL A,#0FH ;STRIP OFF MS NIBBLE
872: 02B4 FF MOV R7,A
873: 02B5 78 3C MOV R0,#FP_ACC8
874: 02B7 79 32 MOV R1,#FP_NIB8
875: 02B9 E4 CLR A
876: 02BA F5 33 MOV FP_ACCX,A
877: ;
878: 02BC 18 MNLOOP: DEC R0 ;BUMP POINTER TO PROPAGATE CARRY
879: 02BD 26 ADD A,@R0 ;ATTEMPT TO FORCE CARRY
880: 02BE D4 DA A ;BCD ADJUST
881: 02BF 30 E4 03 JNB ACC.4,MNL0 ;DON'T ADJUST IF NO NEED
882: 02C2 18 DEC R0 ;PROPAGATE CARRY TO THE NEXT DIGIT
883: 02C3 06 INC @R0 ;DO THE ADJUSTING
884: 02C4 08 INC R0 ;RESTORE R0
885: ;
886: 02C5 D6 MNL0: XCHD A,@R0 ;RESTORE INITIAL NUMBER
887: 02C6 8F F0 MOV B,R7 ;GET THE NUBBLE TO MULTIPLY
888: 02C8 E7 MOV A,@R1 ;GET THE OTHER NIBBLE
889: 02C9 A4 MUL AB ;DO THE MULTIPLY
890: 02CA 75 F0 0A MOV B,#10 ;NOW BCD ADJUST
891: 02CD 84 DIV AB
892: 02CE C5 F0 XCH A,B ;GET THE REMAINDER
893: 02D0 26 ADD A,@R0 ;PROPAGATE THE PARTIAL PRODUCTS
894: 02D1 D4 DA A ;BCD ADJUST
895: 02D2 30 E4 02 JNB ACC.4,MNL1 ;PROPAGATE PARTIAL PRODUCT CARRY
896: 02D5 05 F0 INC B
897: ;
898: 02D7 08 MNL1: INC R0
899: 02D8 D6 XCHD A,@R0 ;SAVE THE NEW PRODUCT
900: 02D9 18 DEC R0
901: 02DA E5 F0 MOV A,B ;GET BACK THE QUOTIENT
902: 02DC 19 DEC R1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -