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

📄 fp-52.lst

📁 一个用PROTEUS搭建的51单片机的基本运行系统
💻 LST
📖 第 1 页 / 共 5 页
字号:
  899:					;
  900:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 26



 Line  I  Addr  Code            Source

  901:					;***************************************************************
  902:					;
  903:	  1C6B			LOAD_POINTERS:	; Load the ARG_STACK into R0 and bump R1
  904:					;
  905:					;***************************************************************
  906:					;
  907:	  1C6B	75 A0 01		MOV	P2,#ARG_STACK_PAGE
  908:	  1C6E	A8 09			MOV	R0,ARG_STACK
  909:	  1C70	74 06			MOV	A,#FP_NUMBER_SIZE
  910:	  1C72	28			ADD	A,R0
  911:	  1C73	F9			MOV	R1,A
  912:	  1C74	22			RET
  913:					;
  914:					;***************************************************************
  915:					;
  916:	  1C75			MUL_DIV_EXP_AND_SIGN:
  917:					;
  918:					; Load the sign into R7, R6. R5 gets the sign for
  919:					; multiply and divide.
  920:					;
  921:					;***************************************************************
  922:					;
  923:	  1C75	71 BF			ACALL	FP_CLEAR	;CLEAR INTERNAL MEMORY
  924:					;
  925:	  1C77	91 6B		MDES1:	ACALL	LOAD_POINTERS	;LOAD REGISTERS
  926:	  1C79	E2			MOVX	A,@R0		;ARG 1 EXP
  927:	  1C7A	FF			MOV	R7,A		;SAVED IN R7
  928:	  1C7B	E3			MOVX	A,@R1		;ARG 2 EXP
  929:	  1C7C	FE			MOV	R6,A		;SAVED IN R6
  930:	  1C7D	18			DEC	R0		;BUMP POINTERS TO SIGN
  931:	  1C7E	19			DEC	R1
  932:	  1C7F	E2			MOVX	A,@R0		;GET THE SIGN
  933:	  1C80	FC			MOV	R4,A		;SIGN OF ARG1
  934:	  1C81	E3			MOVX	A,@R1		;GET SIGN OF NEXT ARG
  935:	  1C82	FB			MOV	R3,A		;SIGN OF ARG2
  936:	  1C83	6C			XRL	A,R4		;ACC GETS THE NEW SIGN
  937:	  1C84	FD			MOV	R5,A		;R5 GETS THE NEW SIGN
  938:					;
  939:					; Bump the pointers to point at the LS digit
  940:					;
  941:	  1C85	18			DEC	R0
  942:	  1C86	19			DEC	R1
  943:					;
  944:	  1C87	22			RET
  945:					;
  946:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 27



 Line  I  Addr  Code            Source

  947:					;***************************************************************
  948:					;
  949:	  1C88			LOADR1_MANTISSA:
  950:					;
  951:					; Load the mantissa of R0 into FP_Digits
  952:					;
  953:					;***************************************************************
  954:					;
  955:	  1C88	C0 00			PUSH	R0B0		;SAVE REGISTER 1
  956:	  1C8A	78 2E			MOV	R0,#FP_DIG78	;SET UP THE POINTER
  957:					;
  958:	  1C8C	E3		LOADR1:	MOVX	A,@R1
  959:	  1C8D	F6			MOV	@R0,A
  960:	  1C8E	19			DEC	R1
  961:	  1C8F	18			DEC	R0
  962:	  1C90	B8 2A F9		CJNE	R0,#FP_CARRY,LOADR1
  963:					;
  964:	  1C93	D0 00			POP	R0B0
  965:	  1C95	22			RET
  966:					;
  967:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 28



 Line  I  Addr  Code            Source

  968:					;***************************************************************
  969:					;
  970:	  1C96			HEXSCAN:	; Scan a string to determine if it is a hex number
  971:						; set carry if hex, else carry = 0
  972:					;
  973:					;***************************************************************
  974:					;
  975:	  1C96	B1 6C			ACALL	GET_DPTR_CHARACTER
  976:	  1C98	C0 83			PUSH	DPH
  977:	  1C9A	C0 82			PUSH	DPL		;SAVE THE POINTER
  978:					;
  979:	  1C9C	E0		HEXSC1:	MOVX	A,@DPTR		;GET THE CHARACTER
  980:	  1C9D	F1 ED			ACALL	DIGIT_CHECK	;SEE IF A DIGIT
  981:	  1C9F	40 12			JC	HS1		;CONTINUE IF A DIGIT
  982:	  1CA1	91 B6			ACALL	HEX_CHECK	;SEE IF HEX
  983:	  1CA3	40 0E			JC	HS1
  984:					;
  985:	  1CA5	C2 E5			CLR	ACC.5		;NO LOWER CASE
  986:	  1CA7	B4 48 03		CJNE	A,#'H',HEXDON
  987:	  1CAA	D3			SETB	C
  988:	  1CAB	80 01			SJMP	HEXDO1		;NUMBER IS VALID HEX, MAYBE
  989:					;
  990:	  1CAD	C3		HEXDON:	CLR	C
  991:					;
  992:	  1CAE	D0 82		HEXDO1:	POP	DPL		;RESTORE POINTER
  993:	  1CB0	D0 83			POP	DPH
  994:	  1CB2	22			RET
  995:					;
  996:	  1CB3	A3		HS1:	INC	DPTR		;BUMP TO NEXT CHARACTER
  997:	  1CB4	80 E6			SJMP	HEXSC1		;LOOP
  998:					;
  999:	  1CB6			HEX_CHECK:	;CHECK FOR A VALID ASCII HEX, SET CARRY IF FOUND
 1000:					;
 1001:	  1CB6	C2 E5			CLR	ACC.5		;WASTE LOWER CASE
 1002:	  1CB8	B4 47 00		CJNE	A,#'F'+1,$+3	;SEE IF F OR LESS
 1003:	  1CBB	40 01			JC	HC1
 1004:	  1CBD	22			RET
 1005:					;
 1006:	  1CBE	B4 41 00	HC1:	CJNE	A,#'A',$+3	;SEE IF A OR GREATER
 1007:	  1CC1	B3			CPL	C
 1008:	  1CC2	22			RET
 1009:					;
 1010:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 29



 Line  I  Addr  Code            Source

 1011:					;
 1012:	  1CC3			PUSHR2R0:
 1013:					;
 1014:	  1CC3	7B 00			MOV	R3,#HIGH CONVT	;CONVERSION LOCATION
 1015:	  1CC5	79 58			MOV	R1,#LOW CONVT
 1016:	  1CC7	F1 04			ACALL	CONVERT_BINARY_TO_ASCII_STRING
 1017:	  1CC9	74 0D			MOV	A,#0DH		;A CR TO TERMINATE
 1018:	  1CCB	F3			MOVX	@R1,A		;SAVE THE CR
 1019:	  1CCC	90 00 58		MOV	DPTR,#CONVT
 1020:					;
 1021:					; Falls thru to FLOATING INPUT
 1022:					;
 1023:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 30



 Line  I  Addr  Code            Source

 1024:					;***************************************************************
 1025:					;
 1026:	  1CCF			FLOATING_POINT_INPUT:	; Input a floating point number pointed to by
 1027:							; the DPTR
 1028:					;
 1029:					;***************************************************************
 1030:					;
 1031:	  1CCF	71 BF			ACALL	FP_CLEAR	;CLEAR EVERYTHING
 1032:	  1CD1	B1 6C			ACALL	GET_DPTR_CHARACTER
 1033:	  1CD3	B1 72			ACALL	PLUS_MINUS_TEST
 1034:	  1CD5	92 78			MOV	MSIGN,C		;SAVE THE MANTISSA SIGN
 1035:					;
 1036:					; Now, set up for input loop
 1037:					;
 1038:	  1CD7	78 34			MOV	R0,#FP_ACCC
 1039:	  1CD9	7E 7F			MOV	R6,#7FH		;BASE EXPONENT
 1040:	  1CDB	D2 D5			SETB	F0		;SET INITIAL FLAG
 1041:					;
 1042:	  1CDD	F1 EB		INLOOP:	ACALL	GET_DIGIT_CHECK
 1043:	  1CDF	50 07			JNC	GTEST		;IF NOT A CHARACTER, WHAT IS IT?
 1044:	  1CE1	54 0F			ANL	A,#0FH		;STRIP ASCII
 1045:	  1CE3	B1 45			ACALL	STDIG		;STORE THE DIGITS
 1046:					;
 1047:	  1CE5	A3		INLPIK:	INC	DPTR		;BUMP POINTER FOR LOOP
 1048:	  1CE6	80 F5			SJMP	INLOOP		;LOOP FOR INPUT
 1049:					;
 1050:	  1CE8	B4 2E 0C	GTEST:	CJNE	A,#'.',GT1	;SEE IF A RADIX
 1051:	  1CEB	20 51 63		JB	FOUND_RADIX,INERR
 1052:	  1CEE	D2 51			SETB	FOUND_RADIX
 1053:	  1CF0	B8 34 F2		CJNE	R0,#FP_ACCC,INLPIK
 1054:	  1CF3	D2 52			SETB	FIRST_RADIX	;SET IF FIRST RADIX
 1055:	  1CF5	80 EE			SJMP	INLPIK		;GET ADDITIONAL DIGITS
 1056:					;
 1057:	  1CF7	20 D5 57	GT1:	JB	F0,INERR	;ERROR IF NOT CLEARED
 1058:	  1CFA	B4 65 02		CJNE	A,#'e',$+5	;CHECK FOR LOWER CASE
 1059:	  1CFD	80 03			SJMP	$+5
 1060:	  1CFF	B4 45 33		CJNE	A,#'E',FINISH_UP
 1061:	  1D02	B1 6B			ACALL	INC_AND_GET_DPTR_CHARACTER
 1062:	  1D04	B1 72			ACALL	PLUS_MINUS_TEST
 1063:	  1D06	92 50			MOV	XSIGN,C		;SAVE SIGN STATUS
 1064:	  1D08	F1 EB			ACALL	GET_DIGIT_CHECK
 1065:	  1D0A	50 45			JNC	INERR
 1066:					;
 1067:	  1D0C	54 0F			ANL	A,#0FH		;STRIP ASCII BIAS OFF THE CHARACTER
 1068:	  1D0E	FD			MOV	R5,A		;SAVE THE CHARACTER IN R5
 1069:					;
 1070:	  1D0F	A3		GT2:	INC	DPTR
 1071:	  1D10	F1 EB			ACALL	GET_DIGIT_CHECK
 1072:	  1D12	50 0D			JNC	FINISH1
 1073:	  1D14	54 0F			ANL	A,#0FH		;STRIP OFF BIAS
 1074:	  1D16	CD			XCH	A,R5		;GET THE LAST DIGIT
 1075:	  1D17	75 F0 0A		MOV	B,#10		;MULTIPLY BY TEN
 1076:	  1D1A	A4			MUL	AB
 1077:	  1D1B	2D			ADD	A,R5		;ADD TO ORIGINAL VALUE
 1078:	  1D1C	FD			MOV	R5,A		;SAVE IN R5
 1079:	  1D1D	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

 1080:	  1D1F	7D FF			MOV	R5,#0FFH	;FORCE AN ERROR
 1081:					;
 1082:	  1D21	ED		FINISH1:MOV	A,R5		;GET THE SIGN
 1083:	  1D22	30 50 09		JNB	XSIGN,POSNUM	;SEE IF EXPONENT IS POS OR NEG
 1084:	  1D25	C3			CLR	C
 1085:	  1D26	9E			SUBB	A,R6
 1086:	  1D27	F4			CPL	A
 1087:	  1D28	04			INC	A
 1088:	  1D29	40 09			JC	FINISH2
 1089:	  1D2B	74 01			MOV	A,#01H
 1090:	  1D2D	22			RET
 1091:					;
 1092:	  1D2E	2E		POSNUM:	ADD	A,R6		;ADD TO EXPONENT
 1093:	  1D2F	50 03			JNC	FINISH2
 1094:					;
 1095:	  1D31	74 02		POSNM1:	MOV	A,#02H
 1096:	  1D33	22			RET
 1097:					;
 1098:	  1D34	CE		FINISH2:XCH	A,R6		;SAVE THE EXPONENT
 1099:					;
 1100:	  1D35			FINISH_UP:
 1101:					;
 1102:	  1D35	8E 30			MOV	FP_EXP,R6	;SAVE EXPONENT
 1103:	  1D37	B8 34 02		CJNE	R0,#FP_ACCC,$+5
 1104:	  1D3A	71 BF			ACALL	FP_CLEAR	;CLEAR THE MEMORY IF 0
 1105:	  1D3C	E5 09			MOV	A,ARG_STACK	;GET THE ARG STACK
 1106:	  1D3E	C3			CLR	C
 1107:	  1D3F	94 0C			SUBB	A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
 1108:	  1D41	F5 09			MOV	ARG_STACK,A	;ADJUST FOR STORE
 1109:	  1D43	61 30			AJMP	PACK
 1110:					;
 1111:	  1D45	C2 D5		STDIG:	CLR	F0		;CLEAR INITIAL DESIGNATOR
 1112:	  1D47	70 0B			JNZ	STDIG1		;CONTINUE IF NOT ZERO
 1113:	  1D49	B8 34 08		CJNE	R0,#FP_ACCC,STDIG1
 1114:	  1D4C	30 52 04		JNB	FIRST_RADIX,RET_X
 1115:					;
 1116:	  1D4F	DE 02		DECX:	DJNZ	R6,RET_X
 1117:					;
 1118:	  1D51	74 FF		INERR:	MOV	A,#0FFH
 1119:					;
 1120:	  1D53	22		RET_X:	RET
 1121:					;
 1122:	  1D54	20 53 02	STDIG1:	JB	DONE_LOAD,FRTEST
 1123:	  1D57	C2 52			CLR	FIRST_RADIX
 1124:					;
 1125:	  1D59	20 52 F3	FRTEST:	JB	FIRST_RADIX,DECX
 1126:					;
 1127:	  1D5C	20 51 01	FDTEST:	JB	FOUND_RADIX,FDT1
 1128:	  1D5F	0E			INC	R6
 1129:					;
 1130:	  1D60	20 53 F0	FDT1:	JB	DONE_LOAD,RET_X
 1131:	  1D63	B8 3D 02		CJNE	R0,#FP_ACC8+1,FDT2
 1132:	  1D66	D2 53			SETB	DONE_LOAD
 1133:					;
 1134:	  1D68	F6		FDT2:	MOV	@R0,A		;SAVE THE STRIPPED ACCUMULATOR
 1135:	  1D69	08			INC	R0		;BUMP THE POINTER

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 32



 Line  I  Addr  Code            Source

 1136:	  1D6A	22			RET			;EXIT
 1137:					;
 1138:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 33



 Line  I  Addr  Code            Source

 1139:					;***************************************************************
 1140:					;
 1141:					; I/O utilities
 1142:					;
 1143:					;***************************************************************
 1144:					;
 1145:	  1D6B			INC_AND_GET_DPTR_CHARACTER:
 1146:					;
 1147:	  1D6B	A3			INC	DPTR
 1148:					;
 1149:	  1D6C			GET_DPTR_CHARACTER:
 1150:					;
 1151:	  1D6C	E0			MOVX	A,@DPTR		;GET THE CHARACTER
 1152:	  1D6D	B4 20 16		CJNE	A,#' ',PMT1	;SEE IF A SPACE
 1153:					;
 1154:					; Kill spaces
 1155:					;
 1156:	  1D70	80 F9			SJMP	INC_AND_GET_DPTR_CHARACTER
 1157:					;
 1158:	  1D72			PLUS_MINUS_TEST:
 1159:					;
 1160:	  1D72	B4 E3 02		CJNE	A,#0E3H,$+5	;SEE IF A PLUS, PLUS TOKEN FROM BASIC
 1161:	  1D75	80 0E			SJMP	PMT3
 1162:	  1D77	B4 2B 02		CJNE	A,#'+',$+5
 1163:	  1D7A	80 09			SJMP	PMT3
 1164:	  1D7C	B4 E5 02		CJNE	A,#0E5H,$+5	;SEE IF MINUS, MINUS TOKEN FROM BASIC
 1165:	  1D7F	80 03			SJMP	PMT2
 1166:	  1D81	B4 2D 02		CJNE	A,#'-',PMT1
 1167:					;
 1168:	  1D84	D3		PMT2:	SETB	C
 1169:					;
 1170:	  1D85	A3		PMT3:	INC	DPTR
 1171:					;
 1172:	  1D86	22		PMT1:	RET
 1173:					;
 1174:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 34



 Line  I  Addr  Code            Source

 1175:					;***************************************************************
 1176:					;
 1177:	  1D87			FLOATING_POINT_OUTPUT:	; Output the number, format is in location 23
 1178:					;
 1179:					; IF FORMAT = 00 - FREE FLOATING
 1180:					;           = FX - EXPONENTIAL (X IS THE NUMBER OF SIG DIGITS)
 1181:					;           = NX - N = NUM BEFORE RADIX, X = NUM AFTER RADIX
 1182:					;                  N + X = 8 MAX
 1183:					;
 1184:					;***************************************************************
 1185:					;
 1186:	  1D87	91 77			ACALL	MDES1		;GET THE NUMBER TO OUTPUT, R0 IS POINTER
 1187:	  1D89	31 C9			ACALL	POP_AND_EXIT	;OUTPUT POPS THE STACK
 1188:	  1D8B	EF			MOV	A,R7
 1189:	  1D8C	FE			MOV	R6,A		;PUT THE EXPONENT IN R6
 1190:	  1D8D	71 8B			ACALL	UNPACK_R0	;UNPACK THE NUMBER
 1191:	  1D8F	78 2B			MOV	R0,#FP_NIB1	;POINT AT THE NUMBER
 1192:	  1D91	E5 17			MOV	A,FORMAT	;GET THE FORMAT
 1193:	  1D93	FB			MOV	R3,A		;SAVE IN CASE OF EXP FORMAT
 1194:	  1D94	60 49			JZ	FREE		;FREE FLOATING?
 1195:	  1D96	B4 F0 00		CJNE	A,#0F0H,$+3	;SEE IF EXPONENTIAL
 1196:	  1D99	50 73			JNC	EXPOUT
 1197:					;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -