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

📄 fp52.lst

📁 proteus6.9 sp4 上
💻 LST
📖 第 1 页 / 共 5 页
字号:
  903:	  02DD	B9 2A DC		CJNE	R1,#FP_NIB1-1,MNLOOP
  904:					;
  905:	  02E0	25 33			ADD	A,FP_ACCX	;GET THE OVERFLOW
  906:	  02E2	D4			DA	A		;ADJUST
  907:	  02E3	F6			MOV	@R0,A		;SAVE IT
  908:	  02E4	22			RET			;EXIT
  909:					;
  910:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 25



 Line  I  Addr  Code            Source

  911:					;***************************************************************
  912:					;
  913:	  02E5			LOAD_POINTERS:	; Load the ARG_STACK into R0 and bump R1
  914:					;
  915:					;***************************************************************
  916:					;
  917:	  02E5	75 A0 01		MOV	P2,#ARG_STACK_PAGE
  918:	  02E8	A8 24			MOV	R0,ARG_STACK
  919:	  02EA	74 06			MOV	A,#FP_NUMBER_SIZE
  920:	  02EC	28			ADD	A,R0
  921:	  02ED	F9			MOV	R1,A
  922:	  02EE	22			RET
  923:					;
  924:					;***************************************************************
  925:					;
  926:	  02EF			MUL_DIV_EXP_AND_SIGN:
  927:					;
  928:					; Load the sign into R7, R6. R5 gets the sign for
  929:					; multiply and divide.
  930:					;
  931:					;***************************************************************
  932:					;
  933:	  02EF	51 39			ACALL	FP_CLEAR	;CLEAR INTERNAL MEMORY
  934:					;
  935:	  02F1	51 E5		MDES1:	ACALL	LOAD_POINTERS	;LOAD REGISTERS
  936:	  02F3	E2			MOVX	A,@R0		;ARG 1 EXP
  937:	  02F4	FF			MOV	R7,A		;SAVED IN R7
  938:	  02F5	E3			MOVX	A,@R1		;ARG 2 EXP
  939:	  02F6	FE			MOV	R6,A		;SAVED IN R6
  940:	  02F7	18			DEC	R0		;BUMP POINTERS TO SIGN
  941:	  02F8	19			DEC	R1
  942:	  02F9	E2			MOVX	A,@R0		;GET THE SIGN
  943:	  02FA	FC			MOV	R4,A		;SIGN OF ARG1
  944:	  02FB	E3			MOVX	A,@R1		;GET SIGN OF NEXT ARG
  945:	  02FC	FB			MOV	R3,A		;SIGN OF ARG2
  946:	  02FD	6C			XRL	A,R4		;ACC GETS THE NEW SIGN
  947:	  02FE	FD			MOV	R5,A		;R5 GETS THE NEW SIGN
  948:					;
  949:					; Bump the pointers to point at the LS digit
  950:					;
  951:	  02FF	18			DEC	R0
  952:	  0300	19			DEC	R1
  953:					;
  954:	  0301	22			RET
  955:					;
  956:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 26



 Line  I  Addr  Code            Source

  957:					;***************************************************************
  958:					;
  959:	  0302			LOADR1_MANTISSA:
  960:					;
  961:					; Load the mantissa of R0 into FP_Digits
  962:					;
  963:					;***************************************************************
  964:					;
  965:	  0302	C0 00			PUSH	R0B0		;SAVE REGISTER 1
  966:	  0304	78 2E			MOV	R0,#FP_DIG78	;SET UP THE POINTER
  967:					;
  968:	  0306	E3		LOADR1:	MOVX	A,@R1
  969:	  0307	F6			MOV	@R0,A
  970:	  0308	19			DEC	R1
  971:	  0309	18			DEC	R0
  972:	  030A	B8 2A F9		CJNE	R0,#FP_CARRY,LOADR1
  973:					;
  974:	  030D	D0 00			POP	R0B0
  975:	  030F	22			RET
  976:					;
  977:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 27



 Line  I  Addr  Code            Source

  978:					;***************************************************************
  979:					;
  980:	  0310			HEXSCAN:	; Scan a string to determine if it is a hex number
  981:						; set carry if hex, else carry = 0
  982:					;
  983:					;***************************************************************
  984:					;
  985:	  0310	71 E6			ACALL	GET_DPTR_CHARACTER
  986:	  0312	C0 83			PUSH	DPH
  987:	  0314	C0 82			PUSH	DPL		;SAVE THE POINTER
  988:					;
  989:	  0316	E0		HEXSC1:	MOVX	A,@DPTR		;GET THE CHARACTER
  990:	  0317	B1 F4			ACALL	DIGIT_CHECK	;SEE IF A DIGIT
  991:	  0319	40 12			JC	HS1		;CONTINUE IF A DIGIT
  992:	  031B	71 30			ACALL	HEX_CHECK	;SEE IF HEX
  993:	  031D	40 0E			JC	HS1
  994:					;
  995:	  031F	C2 E5			CLR	ACC.5		;NO LOWER CASE
  996:	  0321	B4 48 03		CJNE	A,#'H',HEXDON
  997:	  0324	D3			SETB	C
  998:	  0325	80 01			SJMP	HEXDO1		;NUMBER IS VALID HEX, MAYBE
  999:					;
 1000:	  0327	C3		HEXDON:	CLR	C
 1001:					;
 1002:	  0328	D0 82		HEXDO1:	POP	DPL		;RESTORE POINTER
 1003:	  032A	D0 83			POP	DPH
 1004:	  032C	22			RET
 1005:					;
 1006:	  032D	A3		HS1:	INC	DPTR		;BUMP TO NEXT CHARACTER
 1007:	  032E	80 E6			SJMP	HEXSC1		;LOOP
 1008:					;
 1009:	  0330			HEX_CHECK:	;CHECK FOR A VALID ASCII HEX, SET CARRY IF FOUND
 1010:					;
 1011:	  0330	C2 E5			CLR	ACC.5		;WASTE LOWER CASE
 1012:	  0332	B4 47 00		CJNE	A,#'F'+1,$+3	;SEE IF F OR LESS
 1013:	  0335	40 01			JC	HC1
 1014:	  0337	22			RET
 1015:					;
 1016:	  0338	B4 41 00	HC1:	CJNE	A,#'A',$+3	;SEE IF A OR GREATER
 1017:	  033B	B3			CPL	C
 1018:	  033C	22			RET
 1019:					;
 1020:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 28



 Line  I  Addr  Code            Source

 1021:					;
 1022:	  033D			PUSHR2R0:
 1023:					;
 1024:	  033D	7B 00			MOV	R3,#HIGH CONVT	;CONVERSION LOCATION
 1025:	  033F	79 48			MOV	R1,#LOW CONVT
 1026:	  0341	B1 7E			ACALL	CONVERT_BINARY_TO_ASCII_STRING
 1027:	  0343	74 0D			MOV	A,#0DH		;A CR TO TERMINATE
 1028:	  0345	F3			MOVX	@R1,A		;SAVE THE CR
 1029:	  0346	90 00 48		MOV	DPTR,#CONVT
 1030:					;
 1031:					; Falls thru to FLOATING INPUT
 1032:					;
 1033:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 29



 Line  I  Addr  Code            Source

 1034:					;***************************************************************
 1035:					;
 1036:	  0349			FLOATING_POINT_INPUT:	; Input a floating point number pointed to by
 1037:							; the DPTR
 1038:					;
 1039:					;***************************************************************
 1040:					;
 1041:	  0349	51 39			ACALL	FP_CLEAR	;CLEAR EVERYTHING
 1042:	  034B	71 E6			ACALL	GET_DPTR_CHARACTER
 1043:	  034D	71 EC			ACALL	PLUS_MINUS_TEST
 1044:	  034F	92 78			MOV	MSIGN,C		;SAVE THE MANTISSA SIGN
 1045:					;
 1046:					; Now, set up for input loop
 1047:					;
 1048:	  0351	78 34			MOV	R0,#FP_ACCC
 1049:	  0353	7E 7F			MOV	R6,#7FH		;BASE EXPONENT
 1050:	  0355	D2 D5			SETB	F0		;SET INITIAL FLAG
 1051:					;
 1052:	  0357	B1 F2		INLOOP:	ACALL	GET_DIGIT_CHECK
 1053:	  0359	50 07			JNC	GTEST		;IF NOT A CHARACTER, WHAT IS IT?
 1054:	  035B	54 0F			ANL	A,#0FH		;STRIP ASCII
 1055:	  035D	71 BF			ACALL	STDIG		;STORE THE DIGITS
 1056:					;
 1057:	  035F	A3		INLPIK:	INC	DPTR		;BUMP POINTER FOR LOOP
 1058:	  0360	80 F5			SJMP	INLOOP		;LOOP FOR INPUT
 1059:					;
 1060:	  0362	B4 2E 0C	GTEST:	CJNE	A,#'.',GT1	;SEE IF A RADIX
 1061:	  0365	20 51 63		JB	FOUND_RADIX,INERR
 1062:	  0368	D2 51			SETB	FOUND_RADIX
 1063:	  036A	B8 34 F2		CJNE	R0,#FP_ACCC,INLPIK
 1064:	  036D	D2 52			SETB	FIRST_RADIX	;SET IF FIRST RADIX
 1065:	  036F	80 EE			SJMP	INLPIK		;GET ADDITIONAL DIGITS
 1066:					;
 1067:	  0371	20 D5 57	GT1:	JB	F0,INERR	;ERROR IF NOT CLEARED
 1068:	  0374	B4 65 02		CJNE	A,#'e',$+5	;CHECK FOR LOWER CASE
 1069:	  0377	80 03			SJMP	$+5
 1070:	  0379	B4 45 33		CJNE	A,#'E',FINISH_UP
 1071:	  037C	71 E5			ACALL	INC_AND_GET_DPTR_CHARACTER
 1072:	  037E	71 EC			ACALL	PLUS_MINUS_TEST
 1073:	  0380	92 50			MOV	XSIGN,C		;SAVE SIGN STATUS
 1074:	  0382	B1 F2			ACALL	GET_DIGIT_CHECK
 1075:	  0384	50 45			JNC	INERR
 1076:					;
 1077:	  0386	54 0F			ANL	A,#0FH		;STRIP ASCII BIAS OFF THE CHARACTER
 1078:	  0388	FD			MOV	R5,A		;SAVE THE CHARACTER IN R5
 1079:					;
 1080:	  0389	A3		GT2:	INC	DPTR
 1081:	  038A	B1 F2			ACALL	GET_DIGIT_CHECK
 1082:	  038C	50 0D			JNC	FINISH1
 1083:	  038E	54 0F			ANL	A,#0FH		;STRIP OFF BIAS
 1084:	  0390	CD			XCH	A,R5		;GET THE LAST DIGIT
 1085:	  0391	75 F0 0A		MOV	B,#10		;MULTIPLY BY TEN
 1086:	  0394	A4			MUL	AB
 1087:	  0395	2D			ADD	A,R5		;ADD TO ORIGINAL VALUE
 1088:	  0396	FD			MOV	R5,A		;SAVE IN R5
 1089:	  0397	50 F0			JNC	GT2		;LOOP IF NO CARRY

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 30



 Line  I  Addr  Code            Source

 1090:	  0399	7D FF			MOV	R5,#0FFH	;FORCE AN ERROR
 1091:					;
 1092:	  039B	ED		FINISH1:MOV	A,R5		;GET THE SIGN
 1093:	  039C	30 50 09		JNB	XSIGN,POSNUM	;SEE IF EXPONENT IS POS OR NEG
 1094:	  039F	C3			CLR	C
 1095:	  03A0	9E			SUBB	A,R6
 1096:	  03A1	F4			CPL	A
 1097:	  03A2	04			INC	A
 1098:	  03A3	40 09			JC	FINISH2
 1099:	  03A5	74 01			MOV	A,#01H
 1100:	  03A7	22			RET
 1101:					;
 1102:	  03A8	2E		POSNUM:	ADD	A,R6		;ADD TO EXPONENT
 1103:	  03A9	50 03			JNC	FINISH2
 1104:					;
 1105:	  03AB	74 02		POSNM1:	MOV	A,#02H
 1106:	  03AD	22			RET
 1107:					;
 1108:	  03AE	CE		FINISH2:XCH	A,R6		;SAVE THE EXPONENT
 1109:					;
 1110:	  03AF			FINISH_UP:
 1111:					;
 1112:	  03AF	8E 30			MOV	FP_EXP,R6	;SAVE EXPONENT
 1113:	  03B1	B8 34 02		CJNE	R0,#FP_ACCC,$+5
 1114:	  03B4	51 39			ACALL	FP_CLEAR	;CLEAR THE MEMORY IF 0
 1115:	  03B6	E5 24			MOV	A,ARG_STACK	;GET THE ARG STACK
 1116:	  03B8	C3			CLR	C
 1117:	  03B9	94 0C			SUBB	A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
 1118:	  03BB	F5 24			MOV	ARG_STACK,A	;ADJUST FOR STORE
 1119:	  03BD	21 AA			AJMP	PACK
 1120:					;
 1121:	  03BF	C2 D5		STDIG:	CLR	F0		;CLEAR INITIAL DESIGNATOR
 1122:	  03C1	70 0B			JNZ	STDIG1		;CONTINUE IF NOT ZERO
 1123:	  03C3	B8 34 08		CJNE	R0,#FP_ACCC,STDIG1
 1124:	  03C6	30 52 04		JNB	FIRST_RADIX,RET_X
 1125:					;
 1126:	  03C9	DE 02		DECX:	DJNZ	R6,RET_X
 1127:					;
 1128:	  03CB	74 FF		INERR:	MOV	A,#0FFH
 1129:					;
 1130:	  03CD	22		RET_X:	RET
 1131:					;
 1132:	  03CE	20 53 02	STDIG1:	JB	DONE_LOAD,FRTEST
 1133:	  03D1	C2 52			CLR	FIRST_RADIX
 1134:					;
 1135:	  03D3	20 52 F3	FRTEST:	JB	FIRST_RADIX,DECX
 1136:					;
 1137:	  03D6	20 51 01	FDTEST:	JB	FOUND_RADIX,FDT1
 1138:	  03D9	0E			INC	R6
 1139:					;
 1140:	  03DA	20 53 F0	FDT1:	JB	DONE_LOAD,RET_X
 1141:	  03DD	B8 3D 02		CJNE	R0,#FP_ACC8+1,FDT2
 1142:	  03E0	D2 53			SETB	DONE_LOAD
 1143:					;
 1144:	  03E2	F6		FDT2:	MOV	@R0,A		;SAVE THE STRIPPED ACCUMULATOR
 1145:	  03E3	08			INC	R0		;BUMP THE POINTER

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 31



 Line  I  Addr  Code            Source

 1146:	  03E4	22			RET			;EXIT
 1147:					;
 1148:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 32



 Line  I  Addr  Code            Source

 1149:					;***************************************************************
 1150:					;
 1151:					; I/O utilities
 1152:					;
 1153:					;***************************************************************
 1154:					;
 1155:	  03E5			INC_AND_GET_DPTR_CHARACTER:
 1156:					;
 1157:	  03E5	A3			INC	DPTR
 1158:					;
 1159:	  03E6			GET_DPTR_CHARACTER:
 1160:					;
 1161:	  03E6	E0			MOVX	A,@DPTR		;GET THE CHARACTER
 1162:	  03E7	B4 20 16		CJNE	A,#' ',PMT1	;SEE IF A SPACE
 1163:					;
 1164:					; Kill spaces
 1165:					;
 1166:	  03EA	80 F9			SJMP	INC_AND_GET_DPTR_CHARACTER
 1167:					;
 1168:	  03EC			PLUS_MINUS_TEST:
 1169:					;
 1170:	  03EC	B4 E3 02		CJNE	A,#0E3H,$+5	;SEE IF A PLUS, PLUS TOKEN FROM BASIC
 1171:	  03EF	80 0E			SJMP	PMT3
 1172:	  03F1	B4 2B 02		CJNE	A,#'+',$+5
 1173:	  03F4	80 09			SJMP	PMT3
 1174:	  03F6	B4 E5 02		CJNE	A,#0E5H,$+5	;SEE IF MINUS, MINUS TOKEN FROM BASIC
 1175:	  03F9	80 03			SJMP	PMT2
 1176:	  03FB	B4 2D 02		CJNE	A,#'-',PMT1
 1177:					;
 1178:	  03FE	D3		PMT2:	SETB	C
 1179:					;
 1180:	  03FF	A3		PMT3:	INC	DPTR
 1181:					;
 1182:	  0400	22		PMT1:	RET
 1183:					;
 1184:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 33



 Line  I  Addr  Code            Source

 1185:					;***************************************************************
 1186:					;
 1187:	  0401			FLOATING_POINT_OUTPUT:	; Output the number, format is in location 25
 1188:					;
 1189:					; IF FORMAT = 00 - FREE FLOATING
 1190:					;           = FX - EXPONENTIAL (X IS THE NUMBER OF SIG DIGITS)
 1191:					;           = NX - N = NUM BEFORE RADIX, X = NUM AFTER RADIX
 1192:					;                  N + X = 8 MAX
 1193:					;
 1194:					;***************************************************************
 1195:					;
 1196:	  0401	51 F1			ACALL	MDES1		;GET THE NUMBER TO OUTPUT, R0 IS POINTER
 1197:	  0403	11 42			ACALL	POP_AND_EXIT	;OUTPUT POPS THE STACK
 1198:	  0405	EF			MOV	A,R7
 1199:	  0406	FE			MOV	R6,A		;PUT THE EXPONENT IN R6
 1200:	  0407	51 05			ACALL	UNPACK_R0	;UNPACK THE NUMBER

⌨️ 快捷键说明

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