⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calc.lst

📁 实现简单的计算器功能,方便又实用,简单易懂,仅供参考
💻 LST
📖 第 1 页 / 共 5 页
字号:
  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 + -