📄 fp-52.lst
字号:
586: 1B3A 74 08 PACK1: MOV A,#8 ;ADJUST NIBBLE POINTER
587: 1B3C F9 MOV R1,A
588: 1B3D 28 ADD A,R0
589: 1B3E F8 MOV R0,A
590: 1B3F B6 05 00 CJNE @R0,#5,$+3 ;SEE IF ADJUSTING NEEDED
591: 1B42 40 13 JC PACK3+1
592: ;
593: 1B44 D3 PACK2: SETB C
594: 1B45 E4 CLR A
595: 1B46 18 DEC R0
596: 1B47 36 ADDC A,@R0
597: 1B48 D4 DA A
598: 1B49 D6 XCHD A,@R0 ;SAVE THE VALUE
599: 1B4A 30 E4 09 JNB ACC.4,PACK3
600: 1B4D D9 F5 DJNZ R1,PACK2
601: ;
602: 1B4F 18 DEC R0
603: 1B50 76 01 MOV @R0,#1
604: 1B52 71 7F ACALL INC_FP_EXP
605: 1B54 80 06 SJMP PACK4
606: ;
607: 1B56 19 PACK3: DEC R1
608: 1B57 E9 MOV A,R1
609: 1B58 C3 CLR C
610: 1B59 C8 XCH A,R0
611: 1B5A 98 SUBB A,R0
612: 1B5B F8 MOV R0,A
613: ;
614: 1B5C 79 2B PACK4: MOV R1,#FP_DIG12
615: ;
616: ; Now, pack
617: ;
618: 1B5E E6 PLOOP: MOV A,@R0
619: 1B5F C4 SWAP A ;FLIP THE DIGITS
620: 1B60 08 INC R0
621: 1B61 D6 XCHD A,@R0
622: 1B62 42 06 ORL 6,A ;ACCUMULATE THE OR'ED DIGITS
623: 1B64 F7 MOV @R1,A
624: 1B65 08 INC R0
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 19
Line I Addr Code Source
625: 1B66 09 INC R1
626: 1B67 B9 2F F4 CJNE R1,#FP_SIGN,PLOOP
627: 1B6A EE MOV A,R6
628: 1B6B 70 03 JNZ STORE_ALIGN_TEST_AND_EXIT
629: 1B6D 75 30 00 MOV FP_EXP,#0 ;ZERO EXPONENT
630: ;
631: ;**************************************************************
632: ;
633: 1B70 STORE_ALIGN_TEST_AND_EXIT: ;Save the number align carry and exit
634: ;
635: ;**************************************************************
636: ;
637: 1B70 91 6B ACALL LOAD_POINTERS
638: 1B72 89 09 MOV ARG_STACK,R1 ;SET UP THE NEW STACK
639: 1B74 78 30 MOV R0,#FP_EXP
640: ;
641: ; Now load the numbers
642: ;
643: 1B76 E6 STORE2: MOV A,@R0
644: 1B77 F3 MOVX @R1,A ;SAVE THE NUMBER
645: 1B78 18 DEC R0
646: 1B79 19 DEC R1
647: 1B7A B8 2A F9 CJNE R0,#FP_CARRY,STORE2
648: ;
649: 1B7D E4 CLR A ;NO ERRORS
650: ;
651: 1B7E 22 PRET: RET ;EXIT
652: ;
653: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 20
Line I Addr Code Source
654: 1B7F INC_FP_EXP:
655: ;
656: 1B7F 05 30 INC FP_EXP
657: 1B81 E5 30 MOV A,FP_EXP
658: 1B83 70 F9 JNZ PRET ;EXIT IF NOT ZERO
659: 1B85 D0 E0 POP ACC ;WASTE THE CALLING STACK
660: 1B87 D0 E0 POP ACC
661: 1B89 61 A1 AJMP OVERFLOW_AND_EXIT
662: ;
663: ;***********************************************************************
664: ;
665: 1B8B UNPACK_R0: ; Unpack BCD digits and load into nibble locations
666: ;
667: ;***********************************************************************
668: ;
669: 1B8B C0 01 PUSH R1B0
670: 1B8D 79 32 MOV R1,#FP_NIB8
671: ;
672: 1B8F E2 ULOOP: MOVX A,@R0
673: 1B90 54 0F ANL A,#0FH
674: 1B92 F7 MOV @R1,A ;SAVE THE NIBBLE
675: 1B93 E2 MOVX A,@R0
676: 1B94 C4 SWAP A
677: 1B95 54 0F ANL A,#0FH
678: 1B97 19 DEC R1
679: 1B98 F7 MOV @R1,A ;SAVE THE NIBBLE AGAIN
680: 1B99 18 DEC R0
681: 1B9A 19 DEC R1
682: 1B9B B9 2A F1 CJNE R1,#FP_NIB1-1,ULOOP
683: ;
684: 1B9E D0 01 POP R1B0
685: ;
686: 1BA0 22 LOAD7: RET
687: ;
688: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 21
Line I Addr Code Source
689: ;**************************************************************
690: ;
691: 1BA1 OVERFLOW_AND_EXIT: ;LOAD 99999999 E+127, SET OV BIT, AND EXIT
692: ;
693: ;**************************************************************
694: ;
695: 1BA1 78 2E MOV R0,#FP_DIG78
696: 1BA3 74 99 MOV A,#99H
697: ;
698: 1BA5 F6 OVE1: MOV @R0,A
699: 1BA6 18 DEC R0
700: 1BA7 B8 2A FB CJNE R0,#FP_CARRY,OVE1
701: ;
702: 1BAA 75 30 FF MOV FP_EXP,#0FFH
703: 1BAD 71 70 ACALL STORE_ALIGN_TEST_AND_EXIT
704: ;
705: 1BAF D2 E1 SETB ACC.OVERFLOW
706: 1BB1 22 RET
707: ;
708: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 22
Line I Addr Code Source
709: ;**************************************************************
710: ;
711: 1BB2 UNDERFLOW_AND_EXIT: ;LOAD 0, SET UF BIT, AND EXIT
712: ;
713: ;**************************************************************
714: ;
715: 1BB2 71 B8 ACALL ZERO_AND_EXIT
716: 1BB4 E4 CLR A
717: 1BB5 D2 E0 SETB ACC.UNDERFLOW
718: 1BB7 22 RET
719: ;
720: ;**************************************************************
721: ;
722: 1BB8 ZERO_AND_EXIT: ;LOAD 0, SET ZERO BIT, AND EXIT
723: ;
724: ;**************************************************************
725: ;
726: 1BB8 71 BF ACALL FP_CLEAR
727: 1BBA 71 70 ACALL STORE_ALIGN_TEST_AND_EXIT
728: 1BBC D2 E2 SETB ACC.ZERO
729: 1BBE 22 RET ;EXIT
730: ;
731: ;**************************************************************
732: ;
733: 1BBF FP_CLEAR:
734: ;
735: ; Clear internal storage
736: ;
737: ;**************************************************************
738: ;
739: 1BBF E4 CLR A
740: 1BC0 78 3D MOV R0,#FP_ACC8+1
741: ;
742: 1BC2 F6 FPC1: MOV @R0,A
743: 1BC3 18 DEC R0
744: 1BC4 B8 29 FB CJNE R0,#FP_TEMP,FPC1
745: 1BC7 22 RET
746: ;
747: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 23
Line I Addr Code Source
748: ;**************************************************************
749: ;
750: 1BC8 RIGHT: ; Shift ACCUMULATOR RIGHT the number of nibbles in R7
751: ; Save the shifted values in R4 if SAVE_ROUND is set
752: ;
753: ;**************************************************************
754: ;
755: 1BC8 7C 00 MOV R4,#0 ;IN CASE OF NO SHIFT
756: ;
757: 1BCA C3 RIGHT1: CLR C
758: 1BCB EF MOV A,R7 ;GET THE DIGITS TO SHIFT
759: 1BCC 60 22 JZ RIGHT5-1 ;EXIT IF ZERO
760: 1BCE 94 02 SUBB A,#2 ;TWO TO DO?
761: 1BD0 50 1F JNC RIGHT5 ;SHIFT TWO NIBBLES
762: ;
763: ; Swap one nibble then exit
764: ;
765: 1BD2 C0 00 RIGHT3: PUSH R0B0 ;SAVE POINTER REGISTER
766: 1BD4 C0 01 PUSH R1B0
767: ;
768: 1BD6 79 2E MOV R1,#FP_DIG78 ;LOAD THE POINTERS
769: 1BD8 78 2D MOV R0,#FP_DIG56
770: 1BDA EC MOV A,R4 ;GET THE OVERFLOW REGISTER
771: 1BDB D7 XCHD A,@R1 ;GET DIGIT 8
772: 1BDC C4 SWAP A ;FLIP FOR LOAD
773: 1BDD FC MOV R4,A
774: ;
775: 1BDE E7 RIGHTL: MOV A,@R1 ;GET THE LOW ORDER BYTE
776: 1BDF D6 XCHD A,@R0 ;SWAP NIBBLES
777: 1BE0 C4 SWAP A ;FLIP FOR STORE
778: 1BE1 F7 MOV @R1,A ;SAVE THE DIGITS
779: 1BE2 18 DEC R0 ;BUMP THE POINTERS
780: 1BE3 19 DEC R1
781: 1BE4 B9 2A F7 CJNE R1,#FP_DIG12-1,RIGHTL ;LOOP
782: ;
783: 1BE7 E7 MOV A,@R1 ;ACC = CH8
784: 1BE8 C4 SWAP A ;ACC = 8CH
785: 1BE9 54 0F ANL A,#0FH ;ACC = 0CH
786: 1BEB F7 MOV @R1,A ;CARRY DONE
787: 1BEC D0 01 POP R1B0 ;EXIT
788: 1BEE D0 00 POP R0B0 ;RESTORE REGISTER
789: 1BF0 22 RET
790: ;
791: 1BF1 FF RIGHT5: MOV R7,A ;SAVE THE NEW SHIFT NUMBER
792: 1BF2 E4 CLR A
793: 1BF3 C5 2A XCH A,FP_CARRY ;SWAP THE NIBBLES
794: 1BF5 C5 2B XCH A,FP_DIG12
795: 1BF7 C5 2C XCH A,FP_DIG34
796: 1BF9 C5 2D XCH A,FP_DIG56
797: 1BFB C5 2E XCH A,FP_DIG78
798: 1BFD FC MOV R4,A ;SAVE THE LAST DIGIT SHIFTED
799: 1BFE 80 CB SJMP RIGHT1+1
800: ;
801: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 24
Line I Addr Code Source
802: ;***************************************************************
803: ;
804: 1C00 LEFT: ; Shift ACCUMULATOR LEFT the number of nibbles in R7
805: ;
806: ;***************************************************************
807: ;
808: 1C00 7C 00 MOV R4,#00H ;CLEAR FOR SOME ENTRYS
809: ;
810: 1C02 C3 LEFT1: CLR C
811: 1C03 EF MOV A,R7 ;GET SHIFT VALUE
812: 1C04 60 22 JZ LEFT5-1 ;EXIT IF ZERO
813: 1C06 94 02 SUBB A,#2 ;SEE HOW MANY BYTES TO SHIFT
814: 1C08 50 1F JNC LEFT5
815: ;
816: 1C0A C0 00 LEFT3: PUSH R0B0 ;SAVE POINTER
817: 1C0C C0 01 PUSH R1B0
818: 1C0E 78 2A MOV R0,#FP_CARRY
819: 1C10 79 2B MOV R1,#FP_DIG12
820: ;
821: 1C12 E6 MOV A,@R0 ;ACC=CHCL
822: 1C13 C4 SWAP A ;ACC = CLCH
823: 1C14 F6 MOV @R0,A ;ACC = CLCH, @R0 = CLCH
824: ;
825: 1C15 E7 LEFTL: MOV A,@R1 ;DIG 12
826: 1C16 C4 SWAP A ;DIG 21
827: 1C17 D6 XCHD A,@R0
828: 1C18 F7 MOV @R1,A ;SAVE IT
829: 1C19 08 INC R0 ;BUMP POINTERS
830: 1C1A 09 INC R1
831: 1C1B B8 2E F7 CJNE R0,#FP_DIG78,LEFTL
832: ;
833: 1C1E EC MOV A,R4
834: 1C1F C4 SWAP A
835: 1C20 D6 XCHD A,@R0
836: 1C21 54 F0 ANL A,#0F0H
837: 1C23 FC MOV R4,A
838: ;
839: 1C24 D0 01 POP R1B0
840: 1C26 D0 00 POP R0B0 ;RESTORE
841: 1C28 22 RET ;DONE
842: ;
843: 1C29 FF LEFT5: MOV R7,A ;RESTORE COUNT
844: 1C2A E4 CLR A
845: 1C2B CC XCH A,R4 ;GET THE RESTORATION BYTE
846: 1C2C C5 2E XCH A,FP_DIG78 ;DO THE SWAP
847: 1C2E C5 2D XCH A,FP_DIG56
848: 1C30 C5 2C XCH A,FP_DIG34
849: 1C32 C5 2B XCH A,FP_DIG12
850: 1C34 C5 2A XCH A,FP_CARRY
851: 1C36 80 CB SJMP LEFT1+1
852: ;
853: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 25
Line I Addr Code Source
854: 1C38 MUL_NIBBLE:
855: ;
856: ; Multiply the nibble in R7 by the FP_NIB locations
857: ; accumulate the product in FP_ACC
858: ;
859: ; Set up the pointers for multiplication
860: ;
861: 1C38 54 0F ANL A,#0FH ;STRIP OFF MS NIBBLE
862: 1C3A FF MOV R7,A
863: 1C3B 78 3C MOV R0,#FP_ACC8
864: 1C3D 79 32 MOV R1,#FP_NIB8
865: 1C3F E4 CLR A
866: 1C40 F5 33 MOV FP_ACCX,A
867: ;
868: 1C42 18 MNLOOP: DEC R0 ;BUMP POINTER TO PROPAGATE CARRY
869: 1C43 26 ADD A,@R0 ;ATTEMPT TO FORCE CARRY
870: 1C44 D4 DA A ;BCD ADJUST
871: 1C45 30 E4 03 JNB ACC.4,MNL0 ;DON'T ADJUST IF NO NEED
872: 1C48 18 DEC R0 ;PROPAGATE CARRY TO THE NEXT DIGIT
873: 1C49 06 INC @R0 ;DO THE ADJUSTING
874: 1C4A 08 INC R0 ;RESTORE R0
875: ;
876: 1C4B D6 MNL0: XCHD A,@R0 ;RESTORE INITIAL NUMBER
877: 1C4C 8F F0 MOV B,R7 ;GET THE NUBBLE TO MULTIPLY
878: 1C4E E7 MOV A,@R1 ;GET THE OTHER NIBBLE
879: 1C4F A4 MUL AB ;DO THE MULTIPLY
880: 1C50 75 F0 0A MOV B,#10 ;NOW BCD ADJUST
881: 1C53 84 DIV AB
882: 1C54 C5 F0 XCH A,B ;GET THE REMAINDER
883: 1C56 26 ADD A,@R0 ;PROPAGATE THE PARTIAL PRODUCTS
884: 1C57 D4 DA A ;BCD ADJUST
885: 1C58 30 E4 02 JNB ACC.4,MNL1 ;PROPAGATE PARTIAL PRODUCT CARRY
886: 1C5B 05 F0 INC B
887: ;
888: 1C5D 08 MNL1: INC R0
889: 1C5E D6 XCHD A,@R0 ;SAVE THE NEW PRODUCT
890: 1C5F 18 DEC R0
891: 1C60 E5 F0 MOV A,B ;GET BACK THE QUOTIENT
892: 1C62 19 DEC R1
893: 1C63 B9 2A DC CJNE R1,#FP_NIB1-1,MNLOOP
894: ;
895: 1C66 25 33 ADD A,FP_ACCX ;GET THE OVERFLOW
896: 1C68 D4 DA A ;ADJUST
897: 1C69 F6 MOV @R0,A ;SAVE IT
898: 1C6A 22 RET ;EXIT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -