📄 calc.lst
字号:
581: 1 ;
582: 1 02B1 7D FF DIV4: MOV R5,#0FFH ;LOOP COUNT
583: 1 02B3 D3 SETB C
584: 1 ;
585: 1 02B4 8B 00 DIV5: MOV R0B0,R3 ;RESTORE THE EXTERNAL POINTER
586: 1 02B6 79 2E MOV R1,#FP_DIG78 ;SET UP INTERNAL POINTER
587: 1 02B8 7F 04 MOV R7,#DIGIT ;LOOP COUNT
588: 1 02BA 50 17 JNC DIV7 ;EXIT IF NO CARRY
589: 1 ;
590: 1 02BC E2 DIV6: MOVX A,@R0 ;DO ACCUMLATION
591: 1 02BD FE MOV R6,A
592: 1 02BE E4 CLR A
593: 1 02BF 34 99 ADDC A,#99H
594: 1 02C1 9E SUBB A,R6
595: 1 02C2 27 ADD A,@R1
596: 1 02C3 D4 DA A
597: 1 02C4 F7 MOV @R1,A
598: 1 02C5 18 DEC R0
599: 1 02C6 19 DEC R1
600: 1 02C7 DF F3 DJNZ R7,DIV6 ;LOOP
601: 1 ;
602: 1 02C9 0D INC R5 ;SUBTRACT COUNTER
603: 1 02CA 40 E8 JC DIV5 ;KEEP LOOPING IF CARRY
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 17
Line I Addr Code Source
604: 1 02CC E7 MOV A,@R1 ;GET CARRY
605: 1 02CD 94 01 SUBB A,#1 ;CARRY IS CLEARED
606: 1 02CF F7 MOV @R1,A ;SAVE CARRY DIGIT
607: 1 02D0 B3 CPL C
608: 1 02D1 80 E1 SJMP DIV5 ;LOOP
609: 1 ;
610: 1 ; Restore the result if carry was found
611: 1 ;
612: 1 02D3 31 D3 DIV7: ACALL ADDLP ;ADD NUMBER BACK
613: 1 02D5 77 00 MOV @R1,#0 ;CLEAR CARRY
614: 1 02D7 8A 00 MOV R0B0,R2 ;GET SAVE COUNTER
615: 1 02D9 A6 05 MOV @R0,5 ;SAVE COUNT BYTE
616: 1 ;
617: 1 02DB 0A INC R2 ;ADJUST SAVE COUNTER
618: 1 02DC 7F 01 MOV R7,#1 ;BUMP DIVIDEND
619: 1 02DE 71 BB ACALL LEFT
620: 1 02E0 BA 3E CE CJNE R2,#FP_ACC8+2,DIV4
621: 1 ;
622: 1 02E3 D5 30 02 DJNZ FP_EXP,DIV8
623: 1 02E6 61 6D AJMP UNDERFLOW_AND_EXIT
624: 1 ;
625: 1 02E8 75 2A 00 DIV8: MOV FP_CARRY,#0
626: 1 ;
627: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 18
Line I Addr Code Source
628: 1 ;***************************************************************
629: 1 ;
630: 1 02EB PACK: ; Pack the mantissa
631: 1 ;
632: 1 ;***************************************************************
633: 1 ;
634: 1 ; First, set up the pointers
635: 1 ;
636: 1 02EB 78 34 MOV R0,#FP_ACCC
637: 1 02ED E6 MOV A,@R0 ;GET FP_ACCC
638: 1 02EE FE MOV R6,A ;SAVE FOR ZERO COUNT
639: 1 02EF 60 03 JZ PACK0 ;JUMP OVER IF ZERO
640: 1 02F1 71 3A ACALL INC_FP_EXP ;BUMP THE EXPONENT
641: 1 02F3 18 DEC R0
642: 1 ;
643: 1 02F4 08 PACK0: INC R0 ;POINT AT FP_ACC1
644: 1 ;
645: 1 02F5 74 08 PACK1: MOV A,#8 ;ADJUST NIBBLE POINTER
646: 1 02F7 F9 MOV R1,A
647: 1 02F8 28 ADD A,R0
648: 1 02F9 F8 MOV R0,A
649: 1 02FA B6 05 00 CJNE @R0,#5,$+3 ;SEE IF ADJUSTING NEEDED
650: 1 02FD 40 13 JC PACK3+1
651: 1 ;
652: 1 02FF D3 PACK2: SETB C
653: 1 0300 E4 CLR A
654: 1 0301 18 DEC R0
655: 1 0302 36 ADDC A,@R0
656: 1 0303 D4 DA A
657: 1 0304 D6 XCHD A,@R0 ;SAVE THE VALUE
658: 1 0305 30 E4 09 JNB ACC.4,PACK3
659: 1 0308 D9 F5 DJNZ R1,PACK2
660: 1 ;
661: 1 030A 18 DEC R0
662: 1 030B 76 01 MOV @R0,#1
663: 1 030D 71 3A ACALL INC_FP_EXP
664: 1 030F 80 06 SJMP PACK4
665: 1 ;
666: 1 0311 19 PACK3: DEC R1
667: 1 0312 E9 MOV A,R1
668: 1 0313 C3 CLR C
669: 1 0314 C8 XCH A,R0
670: 1 0315 98 SUBB A,R0
671: 1 0316 F8 MOV R0,A
672: 1 ;
673: 1 0317 79 2B PACK4: MOV R1,#FP_DIG12
674: 1 ;
675: 1 ; Now, pack
676: 1 ;
677: 1 0319 E6 PLOOP: MOV A,@R0
678: 1 031A C4 SWAP A ;FLIP THE DIGITS
679: 1 031B 08 INC R0
680: 1 031C D6 XCHD A,@R0
681: 1 031D 42 06 ORL 6,A ;ACCUMULATE THE OR'ED DIGITS
682: 1 031F F7 MOV @R1,A
683: 1 0320 08 INC R0
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 19
Line I Addr Code Source
684: 1 0321 09 INC R1
685: 1 0322 B9 2F F4 CJNE R1,#FP_SIGN,PLOOP
686: 1 0325 EE MOV A,R6
687: 1 0326 70 03 JNZ STORE_ALIGN_TEST_AND_EXIT
688: 1 0328 75 30 00 MOV FP_EXP,#0 ;ZERO EXPONENT
689: 1 ;
690: 1 ;**************************************************************
691: 1 ;
692: 1 032B STORE_ALIGN_TEST_AND_EXIT: ;Save the number align carry and exit
693: 1 ;
694: 1 ;**************************************************************
695: 1 ;
696: 1 032B 91 26 ACALL LOAD_POINTERS
697: 1 032D 89 24 MOV ARG_STACK,R1 ;SET UP THE NEW STACK
698: 1 032F 78 30 MOV R0,#FP_EXP
699: 1 ;
700: 1 ; Now load the numbers
701: 1 ;
702: 1 0331 E6 STORE2: MOV A,@R0
703: 1 0332 F3 MOVX @R1,A ;SAVE THE NUMBER
704: 1 0333 18 DEC R0
705: 1 0334 19 DEC R1
706: 1 0335 B8 2A F9 CJNE R0,#FP_CARRY,STORE2
707: 1 ;
708: 1 0338 E4 CLR A ;NO ERRORS
709: 1 ;
710: 1 0339 22 PRET: RET ;EXIT
711: 1 ;
712: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 20
Line I Addr Code Source
713: 1 033A INC_FP_EXP:
714: 1 ;
715: 1 033A 05 30 INC FP_EXP
716: 1 033C E5 30 MOV A,FP_EXP
717: 1 033E 70 F9 JNZ PRET ;EXIT IF NOT ZERO
718: 1 0340 D0 E0 POP ACC ;WASTE THE CALLING STACK
719: 1 0342 D0 E0 POP ACC
720: 1 0344 61 5C AJMP OVERFLOW_AND_EXIT
721: 1 ;
722: 1 ;***********************************************************************
723: 1 ;
724: 1 0346 UNPACK_R0: ; Unpack BCD digits and load into nibble locations
725: 1 ;
726: 1 ;***********************************************************************
727: 1 ;
728: 1 0346 C0 01 PUSH R1B0
729: 1 0348 79 32 MOV R1,#FP_NIB8
730: 1 ;
731: 1 034A E2 ULOOP: MOVX A,@R0
732: 1 034B 54 0F ANL A,#0FH
733: 1 034D F7 MOV @R1,A ;SAVE THE NIBBLE
734: 1 034E E2 MOVX A,@R0
735: 1 034F C4 SWAP A
736: 1 0350 54 0F ANL A,#0FH
737: 1 0352 19 DEC R1
738: 1 0353 F7 MOV @R1,A ;SAVE THE NIBBLE AGAIN
739: 1 0354 18 DEC R0
740: 1 0355 19 DEC R1
741: 1 0356 B9 2A F1 CJNE R1,#FP_NIB1-1,ULOOP
742: 1 ;
743: 1 0359 D0 01 POP R1B0
744: 1 ;
745: 1 035B 22 LOAD7: RET
746: 1 ;
747: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 21
Line I Addr Code Source
748: 1 ;**************************************************************
749: 1 ;
750: 1 035C OVERFLOW_AND_EXIT: ;LOAD 99999999 E+127, SET OV BIT, AND EXIT
751: 1 ;
752: 1 ;**************************************************************
753: 1 ;
754: 1 035C 78 2E MOV R0,#FP_DIG78
755: 1 035E 74 99 MOV A,#99H
756: 1 ;
757: 1 0360 F6 OVE1: MOV @R0,A
758: 1 0361 18 DEC R0
759: 1 0362 B8 2A FB CJNE R0,#FP_CARRY,OVE1
760: 1 ;
761: 1 0365 75 30 FF MOV FP_EXP,#0FFH
762: 1 0368 71 2B ACALL STORE_ALIGN_TEST_AND_EXIT
763: 1 ;
764: 1 036A D2 E1 SETB ACC.OVERFLOW
765: 1 036C 22 RET
766: 1 ;
767: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 22
Line I Addr Code Source
768: 1 ;**************************************************************
769: 1 ;
770: 1 036D UNDERFLOW_AND_EXIT: ;LOAD 0, SET UF BIT, AND EXIT
771: 1 ;
772: 1 ;**************************************************************
773: 1 ;
774: 1 036D 71 73 ACALL ZERO_AND_EXIT
775: 1 036F E4 CLR A
776: 1 0370 D2 E0 SETB ACC.UNDERFLOW
777: 1 0372 22 RET
778: 1 ;
779: 1 ;**************************************************************
780: 1 ;
781: 1 0373 ZERO_AND_EXIT: ;LOAD 0, SET ZERO BIT, AND EXIT
782: 1 ;
783: 1 ;**************************************************************
784: 1 ;
785: 1 0373 71 7A ACALL FP_CLEAR
786: 1 0375 71 2B ACALL STORE_ALIGN_TEST_AND_EXIT
787: 1 0377 D2 E2 SETB ACC.ZERO
788: 1 0379 22 RET ;EXIT
789: 1 ;
790: 1 ;**************************************************************
791: 1 ;
792: 1 037A FP_CLEAR:
793: 1 ;
794: 1 ; Clear internal storage
795: 1 ;
796: 1 ;**************************************************************
797: 1 ;
798: 1 037A E4 CLR A
799: 1 037B 78 3D MOV R0,#FP_ACC8+1
800: 1 ;
801: 1 037D F6 FPC1: MOV @R0,A
802: 1 037E 18 DEC R0
803: 1 037F B8 29 FB CJNE R0,#FP_TEMP,FPC1
804: 1 0382 22 RET
805: 1 ;
806: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 23
Line I Addr Code Source
807: 1 ;**************************************************************
808: 1 ;
809: 1 0383 RIGHT: ; Shift ACCUMULATOR RIGHT the number of nibbles in R7
810: 1 ; Save the shifted values in R4 if SAVE_ROUND is set
811: 1 ;
812: 1 ;**************************************************************
813: 1 ;
814: 1 0383 7C 00 MOV R4,#0 ;IN CASE OF NO SHIFT
815: 1 ;
816: 1 0385 C3 RIGHT1: CLR C
817: 1 0386 EF MOV A,R7 ;GET THE DIGITS TO SHIFT
818: 1 0387 60 22 JZ RIGHT5-1 ;EXIT IF ZERO
819: 1 0389 94 02 SUBB A,#2 ;TWO TO DO?
820: 1 038B 50 1F JNC RIGHT5 ;SHIFT TWO NIBBLES
821: 1 ;
822: 1 ; Swap one nibble then exit
823: 1 ;
824: 1 038D C0 00 RIGHT3: PUSH R0B0 ;SAVE POINTER REGISTER
825: 1 038F C0 01 PUSH R1B0
826: 1 ;
827: 1 0391 79 2E MOV R1,#FP_DIG78 ;LOAD THE POINTERS
828: 1 0393 78 2D MOV R0,#FP_DIG56
829: 1 0395 EC MOV A,R4 ;GET THE OVERFLOW REGISTER
830: 1 0396 D7 XCHD A,@R1 ;GET DIGIT 8
831: 1 0397 C4 SWAP A ;FLIP FOR LOAD
832: 1 0398 FC MOV R4,A
833: 1 ;
834: 1 0399 E7 RIGHTL: MOV A,@R1 ;GET THE LOW ORDER BYTE
835: 1 039A D6 XCHD A,@R0 ;SWAP NIBBLES
836: 1 039B C4 SWAP A ;FLIP FOR STORE
837: 1 039C F7 MOV @R1,A ;SAVE THE DIGITS
838: 1 039D 18 DEC R0 ;BUMP THE POINTERS
839: 1 039E 19 DEC R1
840: 1 039F B9 2A F7 CJNE R1,#FP_DIG12-1,RIGHTL ;LOOP
841: 1 ;
842: 1 03A2 E7 MOV A,@R1 ;ACC = CH8
843: 1 03A3 C4 SWAP A ;ACC = 8CH
844: 1 03A4 54 0F ANL A,#0FH ;ACC = 0CH
845: 1 03A6 F7 MOV @R1,A ;CARRY DONE
846: 1 03A7 D0 01 POP R1B0 ;EXIT
847: 1 03A9 D0 00 POP R0B0 ;RESTORE REGISTER
848: 1 03AB 22 RET
849: 1 ;
850: 1 03AC FF RIGHT5: MOV R7,A ;SAVE THE NEW SHIFT NUMBER
851: 1 03AD E4 CLR A
852: 1 03AE C5 2A XCH A,FP_CARRY ;SWAP THE NIBBLES
853: 1 03B0 C5 2B XCH A,FP_DIG12
854: 1 03B2 C5 2C XCH A,FP_DIG34
855: 1 03B4 C5 2D XCH A,FP_DIG56
856: 1 03B6 C5 2E XCH A,FP_DIG78
857: 1 03B8 FC MOV R4,A ;SAVE THE LAST DIGIT SHIFTED
858: 1 03B9 80 CB SJMP RIGHT1+1
859: 1 ;
860: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 24
Line I Addr Code Source
861: 1 ;***************************************************************
862: 1 ;
863: 1 03BB LEFT: ; Shift ACCUMULATOR LEFT the number of nibbles in R7
864: 1 ;
865: 1 ;***************************************************************
866: 1 ;
867: 1 03BB 7C 00 MOV R4,#00H ;CLEAR FOR SOME ENTRYS
868: 1 ;
869: 1 03BD C3 LEFT1: CLR C
870: 1 03BE EF MOV A,R7 ;GET SHIFT VALUE
871: 1 03BF 60 22 JZ LEFT5-1 ;EXIT IF ZERO
872: 1 03C1 94 02 SUBB A,#2 ;SEE HOW MANY BYTES TO SHIFT
873: 1 03C3 50 1F JNC LEFT5
874: 1 ;
875: 1 03C5 C0 00 LEFT3: PUSH R0B0 ;SAVE POINTER
876: 1 03C7 C0 01 PUSH R1B0
877: 1 03C9 78 2A MOV R0,#FP_CARRY
878: 1 03CB 79 2B MOV R1,#FP_DIG12
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -