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

📄 calc.lst

📁 实现简单的计算器功能,方便又实用,简单易懂,仅供参考
💻 LST
📖 第 1 页 / 共 5 页
字号:
 1184: 1  0514	20 52 F3	FRTEST:	JB	FIRST_RADIX,DECX
 1185: 1				;
 1186: 1  0517	20 51 01	FDTEST:	JB	FOUND_RADIX,FDT1
 1187: 1  051A	0E			INC	R6
 1188: 1				;
 1189: 1  051B	20 53 F0	FDT1:	JB	DONE_LOAD,RET_X
 1190: 1  051E	B8 3D 02		CJNE	R0,#FP_ACC8+1,FDT2
 1191: 1  0521	D2 53			SETB	DONE_LOAD
 1192: 1				;
 1193: 1  0523	F6		FDT2:	MOV	@R0,A		;SAVE THE STRIPPED ACCUMULATOR
 1194: 1  0524	08			INC	R0		;BUMP THE POINTER

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 32



 Line  I  Addr  Code            Source

 1195: 1  0525	22			RET			;EXIT
 1196: 1				;
 1197: 1			$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 33



 Line  I  Addr  Code            Source

 1198: 1				;***************************************************************
 1199: 1				;
 1200: 1				; I/O utilities
 1201: 1				;
 1202: 1				;***************************************************************
 1203: 1				;
 1204: 1  0526			INC_AND_GET_DPTR_CHARACTER:
 1205: 1				;
 1206: 1  0526	A3			INC	DPTR
 1207: 1				;
 1208: 1  0527			GET_DPTR_CHARACTER:
 1209: 1				;
 1210: 1  0527	E0			MOVX	A,@DPTR		;GET THE CHARACTER
 1211: 1  0528	B4 20 16		CJNE	A,#' ',PMT1	;SEE IF A SPACE
 1212: 1				;
 1213: 1				; Kill spaces
 1214: 1				;
 1215: 1  052B	80 F9			SJMP	INC_AND_GET_DPTR_CHARACTER
 1216: 1				;
 1217: 1  052D			PLUS_MINUS_TEST:
 1218: 1				;
 1219: 1  052D	B4 E3 02		CJNE	A,#0E3H,$+5	;SEE IF A PLUS, PLUS TOKEN FROM BASIC
 1220: 1  0530	80 0E			SJMP	PMT3
 1221: 1  0532	B4 2B 02		CJNE	A,#'+',$+5
 1222: 1  0535	80 09			SJMP	PMT3
 1223: 1  0537	B4 E5 02		CJNE	A,#0E5H,$+5	;SEE IF MINUS, MINUS TOKEN FROM BASIC
 1224: 1  053A	80 03			SJMP	PMT2
 1225: 1  053C	B4 2D 02		CJNE	A,#'-',PMT1
 1226: 1				;
 1227: 1  053F	D3		PMT2:	SETB	C
 1228: 1				;
 1229: 1  0540	A3		PMT3:	INC	DPTR
 1230: 1				;
 1231: 1  0541	22		PMT1:	RET
 1232: 1				;
 1233: 1			$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 34



 Line  I  Addr  Code            Source

 1234: 1				;***************************************************************
 1235: 1				;
 1236: 1  0542			FLOATING_POINT_OUTPUT:	; Output the number, format is in location 25
 1237: 1				;
 1238: 1				; IF FORMAT = 00 - FREE FLOATING
 1239: 1				;           = FX - EXPONENTIAL (X IS THE NUMBER OF SIG DIGITS)
 1240: 1				;           = NX - N = NUM BEFORE RADIX, X = NUM AFTER RADIX
 1241: 1				;                  N + X = 8 MAX
 1242: 1				;
 1243: 1				;***************************************************************
 1244: 1				;
 1245: 1  0542	91 32			ACALL	MDES1		;GET THE NUMBER TO OUTPUT, R0 IS POINTER
 1246: 1  0544	31 83			ACALL	POP_AND_EXIT	;OUTPUT POPS THE STACK
 1247: 1  0546	EF			MOV	A,R7
 1248: 1  0547	FE			MOV	R6,A		;PUT THE EXPONENT IN R6
 1249: 1  0548	71 46			ACALL	UNPACK_R0	;UNPACK THE NUMBER
 1250: 1  054A	78 2B			MOV	R0,#FP_NIB1	;POINT AT THE NUMBER
 1251: 1  054C	E5 25			MOV	A,FORMAT	;GET THE FORMAT
 1252: 1  054E	FB			MOV	R3,A		;SAVE IN CASE OF EXP FORMAT
 1253: 1  054F	60 49			JZ	FREE		;FREE FLOATING?
 1254: 1  0551	B4 F0 00		CJNE	A,#0F0H,$+3	;SEE IF EXPONENTIAL
 1255: 1  0554	50 73			JNC	EXPOUT
 1256: 1				;
 1257: 1				; If here, must be integer USING format
 1258: 1				;
 1259: 1  0556	EE			MOV	A,R6		;GET THE EXPONENT
 1260: 1  0557	70 02			JNZ	$+4
 1261: 1  0559	7E 80			MOV	R6,#80H
 1262: 1  055B	EB			MOV	A,R3		;GET THE FORMAT
 1263: 1  055C	C4			SWAP	A		;SPLIT INTEGER AND FRACTION
 1264: 1  055D	54 0F			ANL	A,#0FH
 1265: 1  055F	FA			MOV	R2,A		;SAVE INTEGER
 1266: 1  0560	D1 2F			ACALL	NUM_LT		;GET THE NUMBER OF INTEGERS
 1267: 1  0562	CA			XCH	A,R2		;FLIP FOR SUBB
 1268: 1  0563	C3			CLR	C
 1269: 1  0564	9A			SUBB	A,R2
 1270: 1  0565	FF			MOV	R7,A
 1271: 1  0566	50 06			JNC	$+8
 1272: 1  0568	7D 3F			MOV	R5,#'?'		;OUTPUT A QUESTION MARK
 1273: 1  056A	D1 64			ACALL	SOUT1		;NUMBER IS TOO LARGE FOR FORMAT
 1274: 1  056C	A1 9A			AJMP	FREE
 1275: 1  056E	BA 00 07		CJNE	R2,#00,USING0	;SEE IF ZERO
 1276: 1  0571	1F			DEC	R7
 1277: 1  0572	D1 51			ACALL	SS7
 1278: 1  0574	D1 5E			ACALL	ZOUT		;OUTPUT A ZERO
 1279: 1  0576	80 06			SJMP	USING1
 1280: 1				;
 1281: 1  0578	D1 51		USING0:	ACALL	SS7		;OUTPUT SPACES, IF NEED TO
 1282: 1  057A	EA			MOV	A,R2		;OUTPUT DIGITS
 1283: 1  057B	FF			MOV	R7,A
 1284: 1  057C	D1 13			ACALL	OUTR0
 1285: 1				;
 1286: 1  057E	EB		USING1:	MOV	A,R3
 1287: 1  057F	54 0F			ANL	A,#0FH		;GET THE NUMBER RIGHT OF DP
 1288: 1  0581	FA			MOV	R2,A		;SAVE IT
 1289: 1  0582	60 BD			JZ	PMT1		;EXIT IF ZERO

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 35



 Line  I  Addr  Code            Source

 1290: 1  0584	D1 5A			ACALL	ROUT		;OUTPUT DP
 1291: 1  0586	D1 38			ACALL	NUM_RT
 1292: 1  0588	B5 02 03		CJNE	A,2,USINGX	;COMPARE A TO R2
 1293: 1				;
 1294: 1  058B	EA		USINGY:	MOV	A,R2
 1295: 1  058C	C1 48			AJMP	Z7R7
 1296: 1				;
 1297: 1  058E	50 FB		USINGX:	JNC	USINGY
 1298: 1				;
 1299: 1  0590	CA		USING2:	XCH	A,R2
 1300: 1  0591	C3			CLR	C
 1301: 1  0592	9A			SUBB	A,R2
 1302: 1  0593	CA			XCH	A,R2
 1303: 1  0594	D1 48			ACALL	Z7R7		;OUTPUT ZEROS IF NEED TO
 1304: 1  0596	EA			MOV	A,R2
 1305: 1  0597	FF			MOV	R7,A
 1306: 1  0598	C1 13			AJMP	OUTR0
 1307: 1				;
 1308: 1				; First, force exponential output, if need to
 1309: 1				;
 1310: 1  059A	EE		FREE:	MOV	A,R6		;GET THE EXPONENT
 1311: 1  059B	70 04			JNZ	FREE1		;IF ZERO, PRINT IT
 1312: 1  059D	D1 62			ACALL	SOUT
 1313: 1  059F	C1 5E			AJMP	ZOUT
 1314: 1				;
 1315: 1  05A1	7B F0		FREE1:	MOV	R3,#0F0H	;IN CASE EXP NEEDED
 1316: 1  05A3	74 77			MOV	A,#80H-DIGIT-DIGIT-1
 1317: 1  05A5	2E			ADD	A,R6
 1318: 1  05A6	40 21			JC	EXPOUT
 1319: 1  05A8	94 F7			SUBB	A,#0F7H
 1320: 1  05AA	40 1D			JC	EXPOUT
 1321: 1				;
 1322: 1				; Now, just print the number
 1323: 1				;
 1324: 1  05AC	D1 53			ACALL	SINOUT		;PRINT THE SIGN OF THE NUMBER
 1325: 1  05AE	D1 2F			ACALL	NUM_LT		;GET THE NUMBER LEFT OF DP
 1326: 1  05B0	B4 08 02		CJNE	A,#8,FREE4
 1327: 1  05B3	C1 13			AJMP	OUTR0
 1328: 1				;
 1329: 1  05B5	D1 13		FREE4:	ACALL	OUTR0
 1330: 1  05B7	D1 25			ACALL	ZTEST		;TEST FOR TRAILING ZEROS
 1331: 1  05B9	60 57			JZ	U_RET		;DONE IF ALL TRAILING ZEROS
 1332: 1  05BB	D1 5A			ACALL	ROUT		;OUTPUT RADIX
 1333: 1				;
 1334: 1  05BD	7F 01		FREE2:	MOV	R7,#1		;OUTPUT ONE DIGIT
 1335: 1  05BF	D1 13			ACALL	OUTR0
 1336: 1  05C1	70 4F			JNZ	U_RET
 1337: 1  05C3	D1 25			ACALL	ZTEST
 1338: 1  05C5	60 4B			JZ	U_RET
 1339: 1  05C7	80 F4			SJMP	FREE2		;LOOP
 1340: 1				;
 1341: 1  05C9	D1 53		EXPOUT:	ACALL	SINOUT		;PRINT THE SIGN
 1342: 1  05CB	7F 01			MOV	R7,#1		;OUTPUT ONE CHARACTER
 1343: 1  05CD	D1 13			ACALL	OUTR0
 1344: 1  05CF	D1 5A			ACALL	ROUT		;OUTPUT RADIX
 1345: 1  05D1	EB			MOV	A,R3		;GET FORMAT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 36



 Line  I  Addr  Code            Source

 1346: 1  05D2	54 0F			ANL	A,#0FH		;STRIP INDICATOR
 1347: 1  05D4	60 06			JZ	EXPOTX
 1348: 1				;
 1349: 1  05D6	FF			MOV	R7,A		;OUTPUT THE NUMBER OF DIGITS
 1350: 1  05D7	1F			DEC	R7		;ADJUST BECAUSE ONE CHAR ALREADY OUT
 1351: 1  05D8	D1 13			ACALL	OUTR0
 1352: 1  05DA	80 02			SJMP	EXPOT4
 1353: 1				;
 1354: 1  05DC	B1 BD		EXPOTX:	ACALL	FREE2		;OUTPUT UNTIL TRAILING ZEROS
 1355: 1				;
 1356: 1  05DE	D1 62		EXPOT4:	ACALL	SOUT		;OUTPUT A SPACE
 1357: 1  05E0	7D 45			MOV	R5,#'E'
 1358: 1  05E2	D1 64			ACALL	SOUT1		;OUTPUT AN E
 1359: 1  05E4	EE			MOV	A,R6		;GET THE EXPONENT
 1360: 1  05E5	60 04			JZ	XOUT0		;EXIT IF ZERO
 1361: 1  05E7	14			DEC	A		;ADJUST FOR THE DIGIT ALREADY OUTPUT
 1362: 1  05E8	B4 80 05		CJNE	A,#80H,XOUT2	;SEE WHAT IT IS
 1363: 1				;
 1364: 1  05EB	D1 62		XOUT0:	ACALL	SOUT
 1365: 1  05ED	E4			CLR	A
 1366: 1  05EE	80 0C			SJMP	XOUT4
 1367: 1				;
 1368: 1  05F0	40 06		XOUT2:	JC	XOUT3		;NEGATIVE EXPONENT
 1369: 1  05F2	7D 2B			MOV	R5,#'+'		;OUTPUT A PLUS SIGN
 1370: 1  05F4	D1 64			ACALL	SOUT1
 1371: 1  05F6	80 04			SJMP	XOUT4
 1372: 1				;
 1373: 1  05F8	D1 56		XOUT3:	ACALL	MOUT
 1374: 1  05FA	F4			CPL	A		;FLIP BITS
 1375: 1  05FB	04			INC	A		;BUMP
 1376: 1				;
 1377: 1  05FC	C2 E7		XOUT4:	CLR	ACC.7
 1378: 1  05FE	F8			MOV	R0,A
 1379: 1  05FF	7A 00			MOV	R2,#0
 1380: 1  0601	79 48			MOV	R1,#LOW CONVT	;CONVERSION LOCATION
 1381: 1  0603	7B 00			MOV	R3,#HIGH CONVT
 1382: 1  0605	D1 BF			ACALL	CONVERT_BINARY_TO_ASCII_STRING
 1383: 1  0607	78 48			MOV	R0,#LOW CONVT	;NOW, OUTPUT EXPONENT
 1384: 1				;
 1385: 1  0609	E2		EXPOT5:	MOVX	A,@R0		;GET THE CHARACTER
 1386: 1  060A	FD			MOV	R5,A		;OUTPUT IT
 1387: 1  060B	D1 64			ACALL	SOUT1
 1388: 1  060D	08			INC	R0		;BUMP THE POINTER
 1389: 1  060E	E8			MOV	A,R0		;GET THE POINTER
 1390: 1  060F	B5 01 F7		CJNE	A,R1B0,EXPOT5	;LOOP
 1391: 1				;
 1392: 1  0612	22		U_RET:	RET			;EXIT
 1393: 1				;
 1394: 1  0613			OUTR0:	; Output the characters pointed to by R0, also bias ascii
 1395: 1				;
 1396: 1  0613	EF			MOV	A,R7		;GET THE COUNTER
 1397: 1  0614	60 0E			JZ	OUTR		;EXIT IF DONE
 1398: 1  0616	E6			MOV	A,@R0		;GET THE NUMBER
 1399: 1  0617	44 30			ORL	A,#30H		;ASCII BIAS
 1400: 1  0619	08			INC	R0		;BUMP POINTER AND COUNTER
 1401: 1  061A	1F			DEC	R7

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 37



 Line  I  Addr  Code            Source

 1402: 1  061B	FD			MOV	R5,A		;PUT CHARACTER IN OUTPUT REGISTER
 1403: 1  061C	D1 64			ACALL	SOUT1		;OUTPUT THE CHARACTER
 1404: 1  061E	E4			CLR	A		;JUST FOR TEST
 1405: 1  061F	B8 33 F1		CJNE	R0,#FP_NIB8+1,OUTR0
 1406: 1  0622	74 55			MOV	A,#55H		;KNOW WHERE EXIT OCCURED
 1407: 1				;
 1408: 1  0624	22		OUTR:	RET
 1409: 1				;
 1410: 1  0625	A9 00		ZTEST:	MOV	R1,R0B0		;GET POINTER REGISTER
 1411: 1				;
 1412: 1  0627	E7		ZT0:	MOV	A,@R1		;GET THE VALUE
 1413: 1  0628	70 04			JNZ	ZT1
 1414: 1  062A	09			INC	R1		;BUMP POINTER
 1415: 1  062B	B9 33 F9		CJNE	R1,#FP_NIB8+1,ZT0
 1416: 1				;
 1417: 1  062E	22		ZT1:	RET
 1418: 1				;
 1419: 1  062F	EE		NUM_LT:	MOV	A,R6		;GET EXPONENT
 1420: 1  0630	C3			CLR	C		;GET READY FOR SUBB
 1421: 1  0631	94 80			SUBB	A,#80H		;SUB EXPONENT BIAS
 1422: 1  0633	50 01			JNC	NL1		;OK IF NO CARRY
 1423: 1  0635	E4			CLR	A		;NO DIGITS LEFT
 1424: 1				;
 1425: 1  0636	FF		NL1:	MOV	R7,A		;SAVE THE COUNT
 1426: 1  0637	22			RET
 1427: 1				;
 1428: 1  0638	C3		NUM_RT:	CLR	C		;SUBB AGAIN
 1429: 1  0639	74 80			MOV	A,#80H		;EXPONENT BIAS
 1430: 1  063B	9E			SUBB	A,R6		;GET THE BIASED EXPONENT
 1431: 1  063C	50 01			JNC	NR1
 1432: 1  063E	E4			CLR	A
 1433: 1				;
 1434: 1  063F	22		NR1:	RET			;EXIT
 1435: 1				;
 1436: 1  0640	EF		SPACE7:	MOV	A,R7		;GET THE NUMBER OF SPACES
 1437: 1  0641	60 FC			JZ	NR1		;EXIT IF ZERO
 1438: 1  0643	D1 62			ACALL	SOUT		;OUTPUT A SPACE
 1439: 1  0645	1F			DEC	R7		;BUMP COUNTER
 1440: 1  0646	80 F8			SJMP	SPACE7		;LOOP
 1441: 1				;
 1442: 1  0648	FF		Z7R7:	MOV	R7,A
 1443: 1				;
 1444: 1  0649	EF		ZERO7:	MOV	A,R7		;GET COUNTER
 1445: 1  064A	60 F3			JZ	NR1		;EXIT IF ZERO
 1446: 1  064C	D1 5E			ACALL	ZOUT		;OUTPUT A ZERO
 1447: 1  064E	1F			DEC	R7		;BUMP COUNTER
 1448: 1  064F	80 F8			SJMP	ZERO7		;LOOP
 1449: 1				;
 1450: 1  0651	D1 40		SS7:	ACALL	SPACE7
 1451: 1				;
 1452: 1  0653	EC		SINOUT:	MOV	A,R4		;GET THE SIGN
 1453: 1  0654	60 0C			JZ	SOUT		;OUTPUT A SPACE IF ZERO
 1454: 1				;
 1455: 1  0656	7D 2D		MOUT:	MOV	R5,#'-'
 1456: 1  0658	80 0A			SJMP	SOUT1		;OUTPUT A MINUS IF NOT
 1457: 1				;

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 38



 Line  I  Addr  Code            Source

 1458: 1  065A	7D 2E		ROUT:	MOV	R5,#'.'		;OUTPUT A RADIX
 1459: 1  065C	80 06			SJMP	SOUT1
 1460: 1				;
 1461: 1  065E	7D 30		ZOUT:	MOV	R5,#'0'		;OUTPUT A ZERO
 1462: 1  0660	80 02			SJMP	SOUT1
 1463: 1				;
 1464: 1  0662	7D 20		SOUT:	MOV	R5,#' '		;OUTPUT A SPACE
 1465: 1				;
 1466: 1  0664	E1 40		SOUT1:	AJMP	R5OUT
 1467: 1				;
 1468: 1			$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 39



 Line  I  Addr  Code            Source

 1469: 1				;***************************************************************
 1470: 1				;
 1471: 1  0666			CONVERT_ASCII_STRING_TO_BINARY:
 1472: 1				;
 1473: 1				;DPTR POINTS TO ASCII STRING
 1474: 1				;PUT THE BINARY NUMBER IN R2:R0, ERROR IF >64K
 1475: 1				;
 1476: 1				;***************************************************************
 1477: 1				;
 1478: 1  0666	91 51		CASB:	ACALL	HEXSCAN		;SEE IF HEX NUMBER
 1479: 1  0668	92 33			MOV	ADD_IN,C	;IF ADD_IN IS SET, THE NUMBER IS HEX
 1480: 1  066A	F1 33			ACALL	GET_DIGIT_CHECK
 1481: 1  066C	B3			CPL	C		

⌨️ 快捷键说明

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