📄 calc.lst
字号:
879: 1 ;
880: 1 03CD E6 MOV A,@R0 ;ACC=CHCL
881: 1 03CE C4 SWAP A ;ACC = CLCH
882: 1 03CF F6 MOV @R0,A ;ACC = CLCH, @R0 = CLCH
883: 1 ;
884: 1 03D0 E7 LEFTL: MOV A,@R1 ;DIG 12
885: 1 03D1 C4 SWAP A ;DIG 21
886: 1 03D2 D6 XCHD A,@R0
887: 1 03D3 F7 MOV @R1,A ;SAVE IT
888: 1 03D4 08 INC R0 ;BUMP POINTERS
889: 1 03D5 09 INC R1
890: 1 03D6 B8 2E F7 CJNE R0,#FP_DIG78,LEFTL
891: 1 ;
892: 1 03D9 EC MOV A,R4
893: 1 03DA C4 SWAP A
894: 1 03DB D6 XCHD A,@R0
895: 1 03DC 54 F0 ANL A,#0F0H
896: 1 03DE FC MOV R4,A
897: 1 ;
898: 1 03DF D0 01 POP R1B0
899: 1 03E1 D0 00 POP R0B0 ;RESTORE
900: 1 03E3 22 RET ;DONE
901: 1 ;
902: 1 03E4 FF LEFT5: MOV R7,A ;RESTORE COUNT
903: 1 03E5 E4 CLR A
904: 1 03E6 CC XCH A,R4 ;GET THE RESTORATION BYTE
905: 1 03E7 C5 2E XCH A,FP_DIG78 ;DO THE SWAP
906: 1 03E9 C5 2D XCH A,FP_DIG56
907: 1 03EB C5 2C XCH A,FP_DIG34
908: 1 03ED C5 2B XCH A,FP_DIG12
909: 1 03EF C5 2A XCH A,FP_CARRY
910: 1 03F1 80 CB SJMP LEFT1+1
911: 1 ;
912: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 25
Line I Addr Code Source
913: 1 03F3 MUL_NIBBLE:
914: 1 ;
915: 1 ; Multiply the nibble in R7 by the FP_NIB locations
916: 1 ; accumulate the product in FP_ACC
917: 1 ;
918: 1 ; Set up the pointers for multiplication
919: 1 ;
920: 1 03F3 54 0F ANL A,#0FH ;STRIP OFF MS NIBBLE
921: 1 03F5 FF MOV R7,A
922: 1 03F6 78 3C MOV R0,#FP_ACC8
923: 1 03F8 79 32 MOV R1,#FP_NIB8
924: 1 03FA E4 CLR A
925: 1 03FB F5 33 MOV FP_ACCX,A
926: 1 ;
927: 1 03FD 18 MNLOOP: DEC R0 ;BUMP POINTER TO PROPAGATE CARRY
928: 1 03FE 26 ADD A,@R0 ;ATTEMPT TO FORCE CARRY
929: 1 03FF D4 DA A ;BCD ADJUST
930: 1 0400 30 E4 03 JNB ACC.4,MNL0 ;DON'T ADJUST IF NO NEED
931: 1 0403 18 DEC R0 ;PROPAGATE CARRY TO THE NEXT DIGIT
932: 1 0404 06 INC @R0 ;DO THE ADJUSTING
933: 1 0405 08 INC R0 ;RESTORE R0
934: 1 ;
935: 1 0406 D6 MNL0: XCHD A,@R0 ;RESTORE INITIAL NUMBER
936: 1 0407 8F F0 MOV B,R7 ;GET THE NUBBLE TO MULTIPLY
937: 1 0409 E7 MOV A,@R1 ;GET THE OTHER NIBBLE
938: 1 040A A4 MUL AB ;DO THE MULTIPLY
939: 1 040B 75 F0 0A MOV B,#10 ;NOW BCD ADJUST
940: 1 040E 84 DIV AB
941: 1 040F C5 F0 XCH A,B ;GET THE REMAINDER
942: 1 0411 26 ADD A,@R0 ;PROPAGATE THE PARTIAL PRODUCTS
943: 1 0412 D4 DA A ;BCD ADJUST
944: 1 0413 30 E4 02 JNB ACC.4,MNL1 ;PROPAGATE PARTIAL PRODUCT CARRY
945: 1 0416 05 F0 INC B
946: 1 ;
947: 1 0418 08 MNL1: INC R0
948: 1 0419 D6 XCHD A,@R0 ;SAVE THE NEW PRODUCT
949: 1 041A 18 DEC R0
950: 1 041B E5 F0 MOV A,B ;GET BACK THE QUOTIENT
951: 1 041D 19 DEC R1
952: 1 041E B9 2A DC CJNE R1,#FP_NIB1-1,MNLOOP
953: 1 ;
954: 1 0421 25 33 ADD A,FP_ACCX ;GET THE OVERFLOW
955: 1 0423 D4 DA A ;ADJUST
956: 1 0424 F6 MOV @R0,A ;SAVE IT
957: 1 0425 22 RET ;EXIT
958: 1 ;
959: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 26
Line I Addr Code Source
960: 1 ;***************************************************************
961: 1 ;
962: 1 0426 LOAD_POINTERS: ; Load the ARG_STACK into R0 and bump R1
963: 1 ;
964: 1 ;***************************************************************
965: 1 ;
966: 1 0426 75 A0 01 MOV P2,#ARG_STACK_PAGE
967: 1 0429 A8 24 MOV R0,ARG_STACK
968: 1 042B 74 06 MOV A,#FP_NUMBER_SIZE
969: 1 042D 28 ADD A,R0
970: 1 042E F9 MOV R1,A
971: 1 042F 22 RET
972: 1 ;
973: 1 ;***************************************************************
974: 1 ;
975: 1 0430 MUL_DIV_EXP_AND_SIGN:
976: 1 ;
977: 1 ; Load the sign into R7, R6. R5 gets the sign for
978: 1 ; multiply and divide.
979: 1 ;
980: 1 ;***************************************************************
981: 1 ;
982: 1 0430 71 7A ACALL FP_CLEAR ;CLEAR INTERNAL MEMORY
983: 1 ;
984: 1 0432 91 26 MDES1: ACALL LOAD_POINTERS ;LOAD REGISTERS
985: 1 0434 E2 MOVX A,@R0 ;ARG 1 EXP
986: 1 0435 FF MOV R7,A ;SAVED IN R7
987: 1 0436 E3 MOVX A,@R1 ;ARG 2 EXP
988: 1 0437 FE MOV R6,A ;SAVED IN R6
989: 1 0438 18 DEC R0 ;BUMP POINTERS TO SIGN
990: 1 0439 19 DEC R1
991: 1 043A E2 MOVX A,@R0 ;GET THE SIGN
992: 1 043B FC MOV R4,A ;SIGN OF ARG1
993: 1 043C E3 MOVX A,@R1 ;GET SIGN OF NEXT ARG
994: 1 043D FB MOV R3,A ;SIGN OF ARG2
995: 1 043E 6C XRL A,R4 ;ACC GETS THE NEW SIGN
996: 1 043F FD MOV R5,A ;R5 GETS THE NEW SIGN
997: 1 ;
998: 1 ; Bump the pointers to point at the LS digit
999: 1 ;
1000: 1 0440 18 DEC R0
1001: 1 0441 19 DEC R1
1002: 1 ;
1003: 1 0442 22 RET
1004: 1 ;
1005: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 27
Line I Addr Code Source
1006: 1 ;***************************************************************
1007: 1 ;
1008: 1 0443 LOADR1_MANTISSA:
1009: 1 ;
1010: 1 ; Load the mantissa of R0 into FP_Digits
1011: 1 ;
1012: 1 ;***************************************************************
1013: 1 ;
1014: 1 0443 C0 00 PUSH R0B0 ;SAVE REGISTER 1
1015: 1 0445 78 2E MOV R0,#FP_DIG78 ;SET UP THE POINTER
1016: 1 ;
1017: 1 0447 E3 LOADR1: MOVX A,@R1
1018: 1 0448 F6 MOV @R0,A
1019: 1 0449 19 DEC R1
1020: 1 044A 18 DEC R0
1021: 1 044B B8 2A F9 CJNE R0,#FP_CARRY,LOADR1
1022: 1 ;
1023: 1 044E D0 00 POP R0B0
1024: 1 0450 22 RET
1025: 1 ;
1026: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 28
Line I Addr Code Source
1027: 1 ;***************************************************************
1028: 1 ;
1029: 1 0451 HEXSCAN: ; Scan a string to determine if it is a hex number
1030: 1 ; set carry if hex, else carry = 0
1031: 1 ;
1032: 1 ;***************************************************************
1033: 1 ;
1034: 1 0451 B1 27 ACALL GET_DPTR_CHARACTER
1035: 1 0453 C0 83 PUSH DPH
1036: 1 0455 C0 82 PUSH DPL ;SAVE THE POINTER
1037: 1 ;
1038: 1 0457 E0 HEXSC1: MOVX A,@DPTR ;GET THE CHARACTER
1039: 1 0458 F1 35 ACALL DIGIT_CHECK ;SEE IF A DIGIT
1040: 1 045A 40 12 JC HS1 ;CONTINUE IF A DIGIT
1041: 1 045C 91 71 ACALL HEX_CHECK ;SEE IF HEX
1042: 1 045E 40 0E JC HS1
1043: 1 ;
1044: 1 0460 C2 E5 CLR ACC.5 ;NO LOWER CASE
1045: 1 0462 B4 48 03 CJNE A,#'H',HEXDON
1046: 1 0465 D3 SETB C
1047: 1 0466 80 01 SJMP HEXDO1 ;NUMBER IS VALID HEX, MAYBE
1048: 1 ;
1049: 1 0468 C3 HEXDON: CLR C
1050: 1 ;
1051: 1 0469 D0 82 HEXDO1: POP DPL ;RESTORE POINTER
1052: 1 046B D0 83 POP DPH
1053: 1 046D 22 RET
1054: 1 ;
1055: 1 046E A3 HS1: INC DPTR ;BUMP TO NEXT CHARACTER
1056: 1 046F 80 E6 SJMP HEXSC1 ;LOOP
1057: 1 ;
1058: 1 0471 HEX_CHECK: ;CHECK FOR A VALID ASCII HEX, SET CARRY IF FOUND
1059: 1 ;
1060: 1 0471 C2 E5 CLR ACC.5 ;WASTE LOWER CASE
1061: 1 0473 B4 47 00 CJNE A,#'F'+1,$+3 ;SEE IF F OR LESS
1062: 1 0476 40 01 JC HC1
1063: 1 0478 22 RET
1064: 1 ;
1065: 1 0479 B4 41 00 HC1: CJNE A,#'A',$+3 ;SEE IF A OR GREATER
1066: 1 047C B3 CPL C
1067: 1 047D 22 RET
1068: 1 ;
1069: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 29
Line I Addr Code Source
1070: 1 ;
1071: 1 047E PUSHR2R0:
1072: 1 ;
1073: 1 047E 7B 00 MOV R3,#HIGH CONVT ;CONVERSION LOCATION
1074: 1 0480 79 48 MOV R1,#LOW CONVT
1075: 1 0482 D1 BF ACALL CONVERT_BINARY_TO_ASCII_STRING
1076: 1 0484 74 0D MOV A,#0DH ;A CR TO TERMINATE
1077: 1 0486 F3 MOVX @R1,A ;SAVE THE CR
1078: 1 0487 90 00 48 MOV DPTR,#CONVT
1079: 1 ;
1080: 1 ; Falls thru to FLOATING INPUT
1081: 1 ;
1082: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 30
Line I Addr Code Source
1083: 1 ;***************************************************************
1084: 1 ;
1085: 1 048A FLOATING_POINT_INPUT: ; Input a floating point number pointed to by
1086: 1 ; the DPTR
1087: 1 ;
1088: 1 ;***************************************************************
1089: 1 ;
1090: 1 048A 71 7A ACALL FP_CLEAR ;CLEAR EVERYTHING
1091: 1 048C B1 27 ACALL GET_DPTR_CHARACTER
1092: 1 048E B1 2D ACALL PLUS_MINUS_TEST
1093: 1 0490 92 78 MOV MSIGN,C ;SAVE THE MANTISSA SIGN
1094: 1 ;
1095: 1 ; Now, set up for input loop
1096: 1 ;
1097: 1 0492 78 34 MOV R0,#FP_ACCC
1098: 1 0494 7E 7F MOV R6,#7FH ;BASE EXPONENT
1099: 1 0496 D2 D5 SETB F0 ;SET INITIAL FLAG
1100: 1 ;
1101: 1 0498 F1 33 INLOOP: ACALL GET_DIGIT_CHECK
1102: 1 049A 50 07 JNC GTEST ;IF NOT A CHARACTER, WHAT IS IT?
1103: 1 049C 54 0F ANL A,#0FH ;STRIP ASCII
1104: 1 049E B1 00 ACALL STDIG ;STORE THE DIGITS
1105: 1 ;
1106: 1 04A0 A3 INLPIK: INC DPTR ;BUMP POINTER FOR LOOP
1107: 1 04A1 80 F5 SJMP INLOOP ;LOOP FOR INPUT
1108: 1 ;
1109: 1 04A3 B4 2E 0C GTEST: CJNE A,#'.',GT1 ;SEE IF A RADIX
1110: 1 04A6 20 51 63 JB FOUND_RADIX,INERR
1111: 1 04A9 D2 51 SETB FOUND_RADIX
1112: 1 04AB B8 34 F2 CJNE R0,#FP_ACCC,INLPIK
1113: 1 04AE D2 52 SETB FIRST_RADIX ;SET IF FIRST RADIX
1114: 1 04B0 80 EE SJMP INLPIK ;GET ADDITIONAL DIGITS
1115: 1 ;
1116: 1 04B2 20 D5 57 GT1: JB F0,INERR ;ERROR IF NOT CLEARED
1117: 1 04B5 B4 65 02 CJNE A,#'e',$+5 ;CHECK FOR LOWER CASE
1118: 1 04B8 80 03 SJMP $+5
1119: 1 04BA B4 45 33 CJNE A,#'E',FINISH_UP
1120: 1 04BD B1 26 ACALL INC_AND_GET_DPTR_CHARACTER
1121: 1 04BF B1 2D ACALL PLUS_MINUS_TEST
1122: 1 04C1 92 50 MOV XSIGN,C ;SAVE SIGN STATUS
1123: 1 04C3 F1 33 ACALL GET_DIGIT_CHECK
1124: 1 04C5 50 45 JNC INERR
1125: 1 ;
1126: 1 04C7 54 0F ANL A,#0FH ;STRIP ASCII BIAS OFF THE CHARACTER
1127: 1 04C9 FD MOV R5,A ;SAVE THE CHARACTER IN R5
1128: 1 ;
1129: 1 04CA A3 GT2: INC DPTR
1130: 1 04CB F1 33 ACALL GET_DIGIT_CHECK
1131: 1 04CD 50 0D JNC FINISH1
1132: 1 04CF 54 0F ANL A,#0FH ;STRIP OFF BIAS
1133: 1 04D1 CD XCH A,R5 ;GET THE LAST DIGIT
1134: 1 04D2 75 F0 0A MOV B,#10 ;MULTIPLY BY TEN
1135: 1 04D5 A4 MUL AB
1136: 1 04D6 2D ADD A,R5 ;ADD TO ORIGINAL VALUE
1137: 1 04D7 FD MOV R5,A ;SAVE IN R5
1138: 1 04D8 50 F0 JNC GT2 ;LOOP IF NO CARRY
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 31
Line I Addr Code Source
1139: 1 04DA 7D FF MOV R5,#0FFH ;FORCE AN ERROR
1140: 1 ;
1141: 1 04DC ED FINISH1:MOV A,R5 ;GET THE SIGN
1142: 1 04DD 30 50 09 JNB XSIGN,POSNUM ;SEE IF EXPONENT IS POS OR NEG
1143: 1 04E0 C3 CLR C
1144: 1 04E1 9E SUBB A,R6
1145: 1 04E2 F4 CPL A
1146: 1 04E3 04 INC A
1147: 1 04E4 40 09 JC FINISH2
1148: 1 04E6 74 01 MOV A,#01H
1149: 1 04E8 22 RET
1150: 1 ;
1151: 1 04E9 2E POSNUM: ADD A,R6 ;ADD TO EXPONENT
1152: 1 04EA 50 03 JNC FINISH2
1153: 1 ;
1154: 1 04EC 74 02 POSNM1: MOV A,#02H
1155: 1 04EE 22 RET
1156: 1 ;
1157: 1 04EF CE FINISH2:XCH A,R6 ;SAVE THE EXPONENT
1158: 1 ;
1159: 1 04F0 FINISH_UP:
1160: 1 ;
1161: 1 04F0 8E 30 MOV FP_EXP,R6 ;SAVE EXPONENT
1162: 1 04F2 B8 34 02 CJNE R0,#FP_ACCC,$+5
1163: 1 04F5 71 7A ACALL FP_CLEAR ;CLEAR THE MEMORY IF 0
1164: 1 04F7 E5 24 MOV A,ARG_STACK ;GET THE ARG STACK
1165: 1 04F9 C3 CLR C
1166: 1 04FA 94 0C SUBB A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
1167: 1 04FC F5 24 MOV ARG_STACK,A ;ADJUST FOR STORE
1168: 1 04FE 41 EB AJMP PACK
1169: 1 ;
1170: 1 0500 C2 D5 STDIG: CLR F0 ;CLEAR INITIAL DESIGNATOR
1171: 1 0502 70 0B JNZ STDIG1 ;CONTINUE IF NOT ZERO
1172: 1 0504 B8 34 08 CJNE R0,#FP_ACCC,STDIG1
1173: 1 0507 30 52 04 JNB FIRST_RADIX,RET_X
1174: 1 ;
1175: 1 050A DE 02 DECX: DJNZ R6,RET_X
1176: 1 ;
1177: 1 050C 74 FF INERR: MOV A,#0FFH
1178: 1 ;
1179: 1 050E 22 RET_X: RET
1180: 1 ;
1181: 1 050F 20 53 02 STDIG1: JB DONE_LOAD,FRTEST
1182: 1 0512 C2 52 CLR FIRST_RADIX
1183: 1 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -