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

📄 calc.lst

📁 实现简单的计算器功能,方便又实用,简单易懂,仅供参考
💻 LST
📖 第 1 页 / 共 5 页
字号:

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 8



 Line  I  Addr  Code            Source

  290: 1  0198	C8			XCH	A,R0		;FORCE R0 TO POINT AT THE LARGEST
  291: 1  0199	C9			XCH	A,R1		;EXPONENT
  292: 1  019A	C8			XCH	A,R0
  293: 1				;
  294: 1  019B	FF		LOAD2:	MOV	R7,A		;SAVE THE EXPONENT DELTA IN R7
  295: 1  019C	C2 33			CLR	ADD_IN
  296: 1  019E	BD 00 02		CJNE	R5,#0,$+5
  297: 1  01A1	D2 33			SETB	ADD_IN
  298: 1				;
  299: 1			$EJECT

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 9



 Line  I  Addr  Code            Source

  300: 1				; Load the R1 mantissa
  301: 1				;
  302: 1  01A3	91 43			ACALL	LOADR1_MANTISSA	;LOAD THE SMALLEST NUMBER
  303: 1				;
  304: 1				; Now align the number to the delta exponent
  305: 1				; R4 points to the string of the last digits lost
  306: 1				;
  307: 1  01A5	BF 0B 00		CJNE	R7,#DIGIT+DIGIT+3,$+3
  308: 1  01A8	40 02			JC	$+4
  309: 1  01AA	7F 0A			MOV	R7,#DIGIT+DIGIT+2
  310: 1				;
  311: 1  01AC	75 2A 00		MOV	FP_CARRY,#00	;CLEAR THE CARRY
  312: 1  01AF	71 83			ACALL	RIGHT		;SHIFT THE NUMBER
  313: 1				;
  314: 1				; Set up for addition and subtraction
  315: 1				;
  316: 1  01B1	7F 04			MOV	R7,#DIGIT	;LOOP COUNT
  317: 1  01B3	79 2E			MOV	R1,#FP_DIG78
  318: 1  01B5	74 9E			MOV	A,#9EH
  319: 1  01B7	C3			CLR	C
  320: 1  01B8	9C			SUBB	A,R4
  321: 1  01B9	D4			DA	A
  322: 1  01BA	CC			XCH	A,R4
  323: 1  01BB	70 01			JNZ	$+3
  324: 1  01BD	FC			MOV	R4,A
  325: 1  01BE	B4 50 00		CJNE	A,#50H,$+3	;TEST FOR SUBTRACTION
  326: 1  01C1	30 33 18		JNB	ADD_IN,SUBLP	;DO SUBTRACTION IF NO ADD_IN
  327: 1  01C4	B3			CPL	C		;FLIP CARRY FOR ADDITION
  328: 1  01C5	31 D3			ACALL	ADDLP		;DO ADDITION
  329: 1				;
  330: 1  01C7	50 08			JNC	ADD_R
  331: 1  01C9	05 2A			INC	FP_CARRY
  332: 1  01CB	7F 01			MOV	R7,#1
  333: 1  01CD	71 83			ACALL	RIGHT
  334: 1  01CF	71 3A			ACALL	INC_FP_EXP	;SHIFT AND BUMP EXPONENT
  335: 1				;
  336: 1  01D1	61 2B		ADD_R:	AJMP	STORE_ALIGN_TEST_AND_EXIT
  337: 1				;
  338: 1  01D3	E2		ADDLP:	MOVX	A,@R0
  339: 1  01D4	37			ADDC	A,@R1
  340: 1  01D5	D4			DA	A
  341: 1  01D6	F7			MOV	@R1,A
  342: 1  01D7	18			DEC	R0
  343: 1  01D8	19			DEC	R1
  344: 1  01D9	DF F8			DJNZ	R7,ADDLP	;LOOP UNTIL DONE
  345: 1  01DB	22			RET
  346: 1				;
  347: 1			$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 10



 Line  I  Addr  Code            Source

  348: 1				;
  349: 1  01DC	E2		SUBLP:	MOVX	A,@R0		;NOW DO SUBTRACTION
  350: 1  01DD	FE			MOV	R6,A
  351: 1  01DE	E4			CLR	A
  352: 1  01DF	34 99			ADDC	A,#99H
  353: 1  01E1	97			SUBB	A,@R1
  354: 1  01E2	2E			ADD	A,R6
  355: 1  01E3	D4			DA	A
  356: 1  01E4	F7			MOV	@R1,A
  357: 1  01E5	18			DEC	R0
  358: 1  01E6	19			DEC	R1
  359: 1  01E7	DF F3			DJNZ	R7,SUBLP
  360: 1  01E9	40 11			JC	FSUB6
  361: 1				;
  362: 1			$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 11



 Line  I  Addr  Code            Source

  363: 1				;
  364: 1				; Need to complement the result and sign because the floating
  365: 1				; point accumulator mantissa was larger than the external
  366: 1				; memory and their signs were equal.
  367: 1				;
  368: 1  01EB	B2 78			CPL	FP_SIGN.0
  369: 1  01ED	79 2E			MOV	R1,#FP_DIG78
  370: 1  01EF	7F 04			MOV	R7,#DIGIT	;LOOP COUNT
  371: 1				;
  372: 1  01F1	74 9A		FSUB5:	MOV	A,#9AH
  373: 1  01F3	97			SUBB	A,@R1
  374: 1  01F4	24 00			ADD	A,#0
  375: 1  01F6	D4			DA	A
  376: 1  01F7	F7			MOV	@R1,A
  377: 1  01F8	19			DEC	R1
  378: 1  01F9	B3			CPL	C
  379: 1  01FA	DF F5			DJNZ	R7,FSUB5	;LOOP
  380: 1				;
  381: 1				; Now see how many zeros their are
  382: 1				;
  383: 1  01FC	78 2B		FSUB6:	MOV	R0,#FP_DIG12
  384: 1  01FE	7F 00			MOV	R7,#0
  385: 1				;
  386: 1  0200	E6		FSUB7:	MOV	A,@R0
  387: 1  0201	70 08			JNZ	FSUB8
  388: 1  0203	0F			INC	R7
  389: 1  0204	0F			INC	R7
  390: 1  0205	08			INC	R0
  391: 1  0206	B8 2F F7		CJNE	R0,#FP_SIGN,FSUB7
  392: 1  0209	61 73			AJMP	ZERO_AND_EXIT
  393: 1				;
  394: 1  020B	B4 10 00	FSUB8:	CJNE	A,#10H,$+3
  395: 1  020E	50 01			JNC	FSUB9
  396: 1  0210	0F			INC	R7
  397: 1				;
  398: 1				; Now R7 has the number of leading zeros in the FP ACC
  399: 1				;
  400: 1  0211	E5 30		FSUB9:	MOV	A,FP_EXP	;GET THE OLD EXPONENT
  401: 1  0213	C3			CLR	C
  402: 1  0214	9F			SUBB	A,R7		;SUBTRACT FROM THE NUMBER OF ZEROS
  403: 1  0215	60 0B			JZ	FSUB10
  404: 1  0217	40 09			JC	FSUB10
  405: 1				;
  406: 1  0219	F5 30			MOV	FP_EXP,A	;SAVE THE NEW EXPONENT
  407: 1				;
  408: 1  021B	71 BD			ACALL	LEFT1		;SHIFT THE FP ACC
  409: 1  021D	75 2A 00		MOV	FP_CARRY,#0
  410: 1  0220	61 2B			AJMP	STORE_ALIGN_TEST_AND_EXIT
  411: 1				;
  412: 1  0222	61 6D		FSUB10:	AJMP	UNDERFLOW_AND_EXIT
  413: 1				;
  414: 1			$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 12



 Line  I  Addr  Code            Source

  415: 1				;***************************************************************
  416: 1				;
  417: 1  0224			FLOATING_COMP:	; Compare two floating point numbers
  418: 1					; used for relational operations and is faster
  419: 1					; than subtraction. ON RETURN, The carry is set
  420: 1					; if ARG1 is > ARG2, else carry is not set
  421: 1					; if ARG1 = ARG2, F0 gets set
  422: 1				;
  423: 1				;***************************************************************
  424: 1				;
  425: 1  0224	91 32			ACALL	MDES1		;SET UP THE REGISTERS
  426: 1  0226	E5 24			MOV	A,ARG_STACK
  427: 1  0228	24 0C			ADD	A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
  428: 1  022A	F5 24			MOV	ARG_STACK,A	;POP THE STACK TWICE, CLEAR THE CARRY
  429: 1  022C	EE			MOV	A,R6		;CHECK OUT EXPONENTS
  430: 1  022D	C2 D5			CLR	F0
  431: 1  022F	C3		        CLR     C
  432: 1  0230	9F			SUBB	A,R7
  433: 1  0231	60 0A			JZ	EXPONENTS_EQUAL
  434: 1  0233	40 03			JC	ARG1_EXP_IS_LARGER
  435: 1				;
  436: 1				; Now the ARG2 EXPONENT is > ARG1 EXPONENT
  437: 1				;
  438: 1  0235			SIGNS_DIFFERENT:
  439: 1				;
  440: 1  0235	EB			MOV	A,R3		;SEE IF SIGN OF ARG2 IS POSITIVE
  441: 1  0236	80 01			SJMP	$+3
  442: 1				;
  443: 1  0238			ARG1_EXP_IS_LARGER:
  444: 1				;
  445: 1  0238	EC			MOV	A,R4		;GET THE SIGN OF ARG1 EXPONENT
  446: 1  0239	60 01			JZ	$+3
  447: 1  023B	B3			CPL	C
  448: 1  023C	22			RET
  449: 1				;
  450: 1  023D			EXPONENTS_EQUAL:
  451: 1				;
  452: 1				; First, test the sign, then the mantissa
  453: 1				;
  454: 1  023D	BD 00 F5		CJNE	R5,#0,SIGNS_DIFFERENT
  455: 1				;
  456: 1  0240			BOTH_PLUS:
  457: 1				;
  458: 1  0240	7F 04			MOV	R7,#DIGIT	;POINT AT MS DIGIT
  459: 1  0242	18			DEC	R0
  460: 1  0243	18			DEC	R0
  461: 1  0244	18			DEC	R0
  462: 1  0245	19			DEC	R1
  463: 1  0246	19			DEC	R1
  464: 1  0247	19			DEC	R1
  465: 1				;
  466: 1				; Now do the compare
  467: 1				;
  468: 1  0248	E2		CLOOP:	MOVX	A,@R0
  469: 1  0249	FE			MOV	R6,A
  470: 1  024A	E3			MOVX	A,@R1

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 13



 Line  I  Addr  Code            Source

  471: 1  024B	9E			SUBB	A,R6
  472: 1  024C	70 EA			JNZ	ARG1_EXP_IS_LARGER
  473: 1  024E	08			INC	R0
  474: 1  024F	09			INC	R1
  475: 1  0250	DF F6			DJNZ	R7,CLOOP
  476: 1				;
  477: 1				; If here, the numbers are the same, the carry is cleared
  478: 1				;
  479: 1  0252	D2 D5			SETB	F0
  480: 1  0254	22			RET			;EXIT WITH EQUAL
  481: 1				;
  482: 1			$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 14



 Line  I  Addr  Code            Source

  483: 1			;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  484: 1			;
  485: 1  0255			FLOATING_MUL:	; Floating point multiply
  486: 1			;
  487: 1			;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  488: 1			;
  489: 1  0255	91 30			ACALL	MUL_DIV_EXP_AND_SIGN
  490: 1				;
  491: 1				; check for zero exponents
  492: 1				;
  493: 1  0257	BE 00 02		CJNE	R6,#00,$+5	;ARG 2 EXP ZERO?
  494: 1  025A	61 73			AJMP	ZERO_AND_EXIT
  495: 1				;
  496: 1				; calculate the exponent
  497: 1				;
  498: 1  025C	8D 2F		FMUL1:	MOV	FP_SIGN,R5	;SAVE THE SIGN, IN CASE OF FAILURE
  499: 1				;
  500: 1  025E	EF			MOV	A,R7
  501: 1  025F	60 F9			JZ	FMUL1-2
  502: 1  0261	2E			ADD	A,R6		;ADD THE EXPONENTS
  503: 1  0262	20 E7 05		JB	ACC.7,FMUL_OVER
  504: 1  0265	10 D7 06		JBC	CY,FMUL2	;SEE IF CARRY IS SET
  505: 1				;
  506: 1  0268	61 6D			AJMP	UNDERFLOW_AND_EXIT
  507: 1				;
  508: 1  026A			FMUL_OVER:
  509: 1				;
  510: 1  026A	50 02			JNC	FMUL2		;OK IF SET
  511: 1				;
  512: 1  026C	61 5C		FOV:	AJMP	OVERFLOW_AND_EXIT
  513: 1				;
  514: 1  026E	94 81		FMUL2:	SUBB	A,#129		;SUBTRACT THE EXPONENT BIAS
  515: 1  0270	FE			MOV	R6,A		;SAVE IT FOR LATER
  516: 1				;
  517: 1				; Unpack and load R0
  518: 1				;
  519: 1  0271	71 46			ACALL	UNPACK_R0
  520: 1				;
  521: 1				; Now set up for loop multiply
  522: 1				;
  523: 1  0273	7B 04			MOV	R3,#DIGIT
  524: 1  0275	AC 01			MOV	R4,R1B0
  525: 1				;
  526: 1			$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 15



 Line  I  Addr  Code            Source

  527: 1				;
  528: 1				; Now, do the multiply and accumulate the product
  529: 1				;
  530: 1  0277	8C 01		FMUL3:	MOV	R1B0,R4
  531: 1  0279	E3			MOVX	A,@R1
  532: 1  027A	FA			MOV	R2,A
  533: 1  027B	71 F3			ACALL	MUL_NIBBLE
  534: 1				;
  535: 1  027D	EA			MOV	A,R2
  536: 1  027E	C4			SWAP	A
  537: 1  027F	71 F3			ACALL	MUL_NIBBLE
  538: 1  0281	1C			DEC	R4
  539: 1  0282	DB F3			DJNZ	R3,FMUL3
  540: 1				;
  541: 1				; Now, pack and restore the sign
  542: 1				;
  543: 1  0284	8E 30			MOV	FP_EXP,R6
  544: 1  0286	8D 2F			MOV	FP_SIGN,R5
  545: 1  0288	41 EB			AJMP	PACK		;FINISH IT OFF
  546: 1				;
  547: 1			$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 16



 Line  I  Addr  Code            Source

  548: 1				;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
  549: 1				;
  550: 1  028A			FLOATING_DIV:
  551: 1				;
  552: 1				;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
  553: 1				;
  554: 1  028A	91 32			ACALL	MDES1
  555: 1				;
  556: 1				; Check the exponents
  557: 1				;
  558: 1  028C	8D 2F			MOV	FP_SIGN,R5	;SAVE THE SIGN
  559: 1  028E	BF 00 06		CJNE	R7,#0,DIV0	;CLEARS THE CARRY
  560: 1  0291	71 5C			ACALL	OVERFLOW_AND_EXIT
  561: 1  0293	E4			CLR	A
  562: 1  0294	D2 E3			SETB	ACC.ZERO_DIVIDE
  563: 1  0296	22			RET
  564: 1				;
  565: 1  0297	EE		DIV0:	MOV	A,R6		;GET EXPONENT
  566: 1  0298	60 C0			JZ	FMUL1-2		;EXIT IF ZERO
  567: 1  029A	9F			SUBB	A,R7		;DELTA EXPONENT
  568: 1  029B	20 E7 04		JB	ACC.7,D_UNDER
  569: 1  029E	50 04			JNC	DIV3
  570: 1  02A0	61 6D			AJMP	UNDERFLOW_AND_EXIT
  571: 1				;
  572: 1  02A2	50 C8		D_UNDER:JNC	FOV
  573: 1				;
  574: 1  02A4	24 81		DIV3:	ADD	A,#129		;CORRECTLY BIAS THE EXPONENT
  575: 1  02A6	F5 30			MOV	FP_EXP,A	;SAVE THE EXPONENT
  576: 1  02A8	91 43			ACALL	LOADR1_MANTISSA	;LOAD THE DIVIDED
  577: 1				;
  578: 1  02AA	7A 34			MOV	R2,#FP_ACCC	;SAVE LOCATION
  579: 1  02AC	AB 00			MOV	R3,R0B0		;SAVE POINTER IN R3
  580: 1  02AE	75 2A 00		MOV	FP_CARRY,#0	;ZERO CARRY BYTE

⌨️ 快捷键说明

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