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

📄 calc.lst

📁 实现简单的计算器功能,方便又实用,简单易懂,仅供参考
💻 LST
📖 第 1 页 / 共 5 页
字号:
  581: 1				;
  582: 1  02B1	7D FF		DIV4:	MOV	R5,#0FFH	;LOOP COUNT
  583: 1  02B3	D3			SETB	C
  584: 1				;
  585: 1  02B4	8B 00		DIV5:	MOV	R0B0,R3		;RESTORE THE EXTERNAL POINTER
  586: 1  02B6	79 2E			MOV	R1,#FP_DIG78	;SET UP INTERNAL POINTER
  587: 1  02B8	7F 04			MOV	R7,#DIGIT	;LOOP COUNT
  588: 1  02BA	50 17			JNC	DIV7		;EXIT IF NO CARRY
  589: 1				;
  590: 1  02BC	E2		DIV6:	MOVX	A,@R0		;DO ACCUMLATION
  591: 1  02BD	FE			MOV	R6,A
  592: 1  02BE	E4			CLR	A
  593: 1  02BF	34 99			ADDC	A,#99H
  594: 1  02C1	9E			SUBB	A,R6
  595: 1  02C2	27			ADD	A,@R1
  596: 1  02C3	D4			DA	A
  597: 1  02C4	F7			MOV	@R1,A
  598: 1  02C5	18			DEC	R0
  599: 1  02C6	19			DEC	R1
  600: 1  02C7	DF F3			DJNZ	R7,DIV6		;LOOP
  601: 1				;
  602: 1  02C9	0D			INC	R5		;SUBTRACT COUNTER
  603: 1  02CA	40 E8			JC	DIV5		;KEEP LOOPING IF CARRY

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 17



 Line  I  Addr  Code            Source

  604: 1  02CC	E7			MOV	A,@R1		;GET CARRY
  605: 1  02CD	94 01			SUBB	A,#1		;CARRY IS CLEARED
  606: 1  02CF	F7			MOV	@R1,A		;SAVE CARRY DIGIT
  607: 1  02D0	B3			CPL	C
  608: 1  02D1	80 E1			SJMP	DIV5		;LOOP
  609: 1				;
  610: 1				; Restore the result if carry was found
  611: 1				;
  612: 1  02D3	31 D3		DIV7:	ACALL	ADDLP		;ADD NUMBER BACK
  613: 1  02D5	77 00			MOV	@R1,#0		;CLEAR CARRY
  614: 1  02D7	8A 00			MOV	R0B0,R2		;GET SAVE COUNTER
  615: 1  02D9	A6 05			MOV	@R0,5		;SAVE COUNT BYTE
  616: 1				;
  617: 1  02DB	0A			INC	R2		;ADJUST SAVE COUNTER
  618: 1  02DC	7F 01			MOV	R7,#1		;BUMP DIVIDEND
  619: 1  02DE	71 BB			ACALL	LEFT
  620: 1  02E0	BA 3E CE		CJNE	R2,#FP_ACC8+2,DIV4
  621: 1				;
  622: 1  02E3	D5 30 02		DJNZ	FP_EXP,DIV8
  623: 1  02E6	61 6D			AJMP	UNDERFLOW_AND_EXIT
  624: 1				;
  625: 1  02E8	75 2A 00	DIV8:	MOV	FP_CARRY,#0
  626: 1				;
  627: 1			$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 18



 Line  I  Addr  Code            Source

  628: 1				;***************************************************************
  629: 1				;
  630: 1  02EB			PACK:	; Pack the mantissa
  631: 1				;
  632: 1				;***************************************************************
  633: 1				;
  634: 1				; First, set up the pointers
  635: 1				;
  636: 1  02EB	78 34			MOV	R0,#FP_ACCC
  637: 1  02ED	E6			MOV	A,@R0		;GET FP_ACCC
  638: 1  02EE	FE			MOV	R6,A		;SAVE FOR ZERO COUNT
  639: 1  02EF	60 03			JZ	PACK0		;JUMP OVER IF ZERO
  640: 1  02F1	71 3A			ACALL	INC_FP_EXP	;BUMP THE EXPONENT
  641: 1  02F3	18			DEC	R0
  642: 1				;
  643: 1  02F4	08		PACK0:	INC	R0		;POINT AT FP_ACC1
  644: 1				;
  645: 1  02F5	74 08		PACK1:	MOV	A,#8		;ADJUST NIBBLE POINTER
  646: 1  02F7	F9			MOV	R1,A
  647: 1  02F8	28			ADD	A,R0
  648: 1  02F9	F8			MOV	R0,A
  649: 1  02FA	B6 05 00		CJNE	@R0,#5,$+3	;SEE IF ADJUSTING NEEDED
  650: 1  02FD	40 13			JC	PACK3+1
  651: 1				;
  652: 1  02FF	D3		PACK2:	SETB	C
  653: 1  0300	E4			CLR	A
  654: 1  0301	18			DEC	R0
  655: 1  0302	36			ADDC	A,@R0
  656: 1  0303	D4			DA	A
  657: 1  0304	D6			XCHD	A,@R0		;SAVE THE VALUE
  658: 1  0305	30 E4 09		JNB	ACC.4,PACK3
  659: 1  0308	D9 F5			DJNZ	R1,PACK2
  660: 1				;
  661: 1  030A	18			DEC	R0
  662: 1  030B	76 01			MOV	@R0,#1
  663: 1  030D	71 3A			ACALL	INC_FP_EXP
  664: 1  030F	80 06			SJMP	PACK4
  665: 1				;
  666: 1  0311	19		PACK3:	DEC	R1
  667: 1  0312	E9			MOV	A,R1
  668: 1  0313	C3			CLR	C
  669: 1  0314	C8			XCH	A,R0
  670: 1  0315	98			SUBB	A,R0
  671: 1  0316	F8			MOV	R0,A
  672: 1				;
  673: 1  0317	79 2B		PACK4:	MOV	R1,#FP_DIG12
  674: 1				;
  675: 1				; Now, pack
  676: 1				;
  677: 1  0319	E6		PLOOP:	MOV	A,@R0
  678: 1  031A	C4			SWAP	A		;FLIP THE DIGITS
  679: 1  031B	08			INC	R0
  680: 1  031C	D6			XCHD	A,@R0
  681: 1  031D	42 06			ORL	6,A		;ACCUMULATE THE OR'ED DIGITS
  682: 1  031F	F7			MOV	@R1,A
  683: 1  0320	08			INC	R0

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 19



 Line  I  Addr  Code            Source

  684: 1  0321	09			INC	R1
  685: 1  0322	B9 2F F4		CJNE	R1,#FP_SIGN,PLOOP
  686: 1  0325	EE			MOV	A,R6
  687: 1  0326	70 03			JNZ	STORE_ALIGN_TEST_AND_EXIT
  688: 1  0328	75 30 00		MOV	FP_EXP,#0	;ZERO EXPONENT
  689: 1				;
  690: 1				;**************************************************************
  691: 1				;
  692: 1  032B			STORE_ALIGN_TEST_AND_EXIT:	;Save the number align carry and exit
  693: 1				;
  694: 1				;**************************************************************
  695: 1				;
  696: 1  032B	91 26			ACALL	LOAD_POINTERS
  697: 1  032D	89 24			MOV	ARG_STACK,R1	;SET UP THE NEW STACK
  698: 1  032F	78 30			MOV	R0,#FP_EXP
  699: 1				;
  700: 1				; Now load the numbers
  701: 1				;
  702: 1  0331	E6		STORE2:	MOV	A,@R0
  703: 1  0332	F3			MOVX	@R1,A		;SAVE THE NUMBER
  704: 1  0333	18			DEC	R0
  705: 1  0334	19			DEC	R1
  706: 1  0335	B8 2A F9		CJNE	R0,#FP_CARRY,STORE2
  707: 1				;
  708: 1  0338	E4			CLR	A		;NO ERRORS
  709: 1				;
  710: 1  0339	22		PRET:	RET			;EXIT
  711: 1				;
  712: 1			$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 20



 Line  I  Addr  Code            Source

  713: 1  033A			INC_FP_EXP:
  714: 1				;
  715: 1  033A	05 30			INC	FP_EXP
  716: 1  033C	E5 30			MOV	A,FP_EXP
  717: 1  033E	70 F9			JNZ	PRET		;EXIT IF NOT ZERO
  718: 1  0340	D0 E0			POP	ACC		;WASTE THE CALLING STACK
  719: 1  0342	D0 E0			POP	ACC
  720: 1  0344	61 5C			AJMP	OVERFLOW_AND_EXIT
  721: 1				;
  722: 1			;***********************************************************************
  723: 1			;
  724: 1  0346			UNPACK_R0:	; Unpack BCD digits and load into nibble locations
  725: 1			;
  726: 1			;***********************************************************************
  727: 1				;
  728: 1  0346	C0 01			PUSH	R1B0
  729: 1  0348	79 32			MOV	R1,#FP_NIB8
  730: 1				;
  731: 1  034A	E2		ULOOP:	MOVX	A,@R0
  732: 1  034B	54 0F			ANL	A,#0FH
  733: 1  034D	F7			MOV	@R1,A		;SAVE THE NIBBLE
  734: 1  034E	E2			MOVX	A,@R0
  735: 1  034F	C4			SWAP	A
  736: 1  0350	54 0F			ANL	A,#0FH
  737: 1  0352	19			DEC	R1
  738: 1  0353	F7			MOV	@R1,A		;SAVE THE NIBBLE AGAIN
  739: 1  0354	18			DEC	R0
  740: 1  0355	19			DEC	R1
  741: 1  0356	B9 2A F1		CJNE	R1,#FP_NIB1-1,ULOOP
  742: 1				;
  743: 1  0359	D0 01			POP	R1B0
  744: 1				;
  745: 1  035B	22		LOAD7:	RET
  746: 1				;
  747: 1			$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 21



 Line  I  Addr  Code            Source

  748: 1				;**************************************************************
  749: 1				;
  750: 1  035C			OVERFLOW_AND_EXIT:	;LOAD 99999999 E+127,  SET OV BIT, AND EXIT
  751: 1				;
  752: 1				;**************************************************************
  753: 1				;
  754: 1  035C	78 2E			MOV	R0,#FP_DIG78
  755: 1  035E	74 99			MOV	A,#99H
  756: 1				;
  757: 1  0360	F6		OVE1:	MOV	@R0,A
  758: 1  0361	18			DEC	R0
  759: 1  0362	B8 2A FB		CJNE	R0,#FP_CARRY,OVE1
  760: 1				;
  761: 1  0365	75 30 FF		MOV	FP_EXP,#0FFH
  762: 1  0368	71 2B			ACALL	STORE_ALIGN_TEST_AND_EXIT
  763: 1				;
  764: 1  036A	D2 E1			SETB	ACC.OVERFLOW
  765: 1  036C	22			RET
  766: 1				;
  767: 1			$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 22



 Line  I  Addr  Code            Source

  768: 1				;**************************************************************
  769: 1				;
  770: 1  036D			UNDERFLOW_AND_EXIT:	;LOAD 0, SET UF BIT, AND EXIT
  771: 1				;
  772: 1				;**************************************************************
  773: 1				;
  774: 1  036D	71 73			ACALL	ZERO_AND_EXIT
  775: 1  036F	E4			CLR	A
  776: 1  0370	D2 E0			SETB	ACC.UNDERFLOW
  777: 1  0372	22			RET
  778: 1				;
  779: 1				;**************************************************************
  780: 1				;
  781: 1  0373			ZERO_AND_EXIT:		;LOAD 0, SET ZERO BIT, AND EXIT
  782: 1				;
  783: 1				;**************************************************************
  784: 1				;
  785: 1  0373	71 7A			ACALL	FP_CLEAR
  786: 1  0375	71 2B			ACALL	STORE_ALIGN_TEST_AND_EXIT
  787: 1  0377	D2 E2			SETB	ACC.ZERO
  788: 1  0379	22			RET			;EXIT
  789: 1				;
  790: 1				;**************************************************************
  791: 1				;
  792: 1  037A			FP_CLEAR:
  793: 1				;
  794: 1				; Clear internal storage
  795: 1				;
  796: 1				;**************************************************************
  797: 1				;
  798: 1  037A	E4			CLR	A
  799: 1  037B	78 3D			MOV	R0,#FP_ACC8+1
  800: 1				;
  801: 1  037D	F6		FPC1:	MOV	@R0,A
  802: 1  037E	18			DEC	R0
  803: 1  037F	B8 29 FB		CJNE	R0,#FP_TEMP,FPC1
  804: 1  0382	22			RET
  805: 1				;
  806: 1			$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 23



 Line  I  Addr  Code            Source

  807: 1				;**************************************************************
  808: 1				;
  809: 1  0383			RIGHT:	; Shift ACCUMULATOR RIGHT the number of nibbles in R7
  810: 1				; Save the shifted values in R4 if SAVE_ROUND is set
  811: 1				;
  812: 1				;**************************************************************
  813: 1				;
  814: 1  0383	7C 00			MOV	R4,#0		;IN CASE OF NO SHIFT
  815: 1				;
  816: 1  0385	C3		RIGHT1:	CLR	C
  817: 1  0386	EF			MOV	A,R7		;GET THE DIGITS TO SHIFT
  818: 1  0387	60 22			JZ	RIGHT5-1	;EXIT IF ZERO
  819: 1  0389	94 02			SUBB	A,#2		;TWO TO DO?
  820: 1  038B	50 1F			JNC	RIGHT5		;SHIFT TWO NIBBLES
  821: 1				;
  822: 1				; Swap one nibble then exit
  823: 1				;
  824: 1  038D	C0 00		RIGHT3:	PUSH	R0B0		;SAVE POINTER REGISTER
  825: 1  038F	C0 01			PUSH	R1B0
  826: 1				;
  827: 1  0391	79 2E			MOV	R1,#FP_DIG78	;LOAD THE POINTERS
  828: 1  0393	78 2D			MOV	R0,#FP_DIG56
  829: 1  0395	EC			MOV	A,R4		;GET THE OVERFLOW REGISTER
  830: 1  0396	D7			XCHD	A,@R1		;GET DIGIT 8
  831: 1  0397	C4			SWAP	A		;FLIP FOR LOAD
  832: 1  0398	FC			MOV	R4,A
  833: 1				;
  834: 1  0399	E7		RIGHTL:	MOV	A,@R1		;GET THE LOW ORDER BYTE
  835: 1  039A	D6			XCHD	A,@R0		;SWAP NIBBLES
  836: 1  039B	C4			SWAP	A		;FLIP FOR STORE
  837: 1  039C	F7			MOV	@R1,A		;SAVE THE DIGITS
  838: 1  039D	18			DEC	R0		;BUMP THE POINTERS
  839: 1  039E	19			DEC	R1
  840: 1  039F	B9 2A F7		CJNE	R1,#FP_DIG12-1,RIGHTL	;LOOP
  841: 1				;
  842: 1  03A2	E7			MOV	A,@R1		;ACC = CH8
  843: 1  03A3	C4			SWAP	A		;ACC = 8CH
  844: 1  03A4	54 0F			ANL	A,#0FH		;ACC = 0CH
  845: 1  03A6	F7			MOV	@R1,A		;CARRY DONE
  846: 1  03A7	D0 01			POP	R1B0		;EXIT
  847: 1  03A9	D0 00			POP	R0B0		;RESTORE REGISTER
  848: 1  03AB	22			RET
  849: 1				;
  850: 1  03AC	FF		RIGHT5:	MOV	R7,A		;SAVE THE NEW SHIFT NUMBER
  851: 1  03AD	E4			CLR	A
  852: 1  03AE	C5 2A			XCH	A,FP_CARRY	;SWAP THE NIBBLES
  853: 1  03B0	C5 2B			XCH	A,FP_DIG12
  854: 1  03B2	C5 2C			XCH	A,FP_DIG34
  855: 1  03B4	C5 2D			XCH	A,FP_DIG56
  856: 1  03B6	C5 2E			XCH	A,FP_DIG78
  857: 1  03B8	FC			MOV	R4,A		;SAVE THE LAST DIGIT SHIFTED
  858: 1  03B9	80 CB			SJMP	RIGHT1+1
  859: 1				;
  860: 1			$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 24



 Line  I  Addr  Code            Source

  861: 1				;***************************************************************
  862: 1				;
  863: 1  03BB			LEFT:	; Shift ACCUMULATOR LEFT the number of nibbles in R7
  864: 1				;
  865: 1				;***************************************************************
  866: 1				;
  867: 1  03BB	7C 00			MOV	R4,#00H		;CLEAR FOR SOME ENTRYS
  868: 1				;
  869: 1  03BD	C3		LEFT1:	CLR	C
  870: 1  03BE	EF			MOV	A,R7		;GET SHIFT VALUE
  871: 1  03BF	60 22			JZ	LEFT5-1		;EXIT IF ZERO
  872: 1  03C1	94 02			SUBB	A,#2		;SEE HOW MANY BYTES TO SHIFT
  873: 1  03C3	50 1F			JNC	LEFT5
  874: 1				;
  875: 1  03C5	C0 00		LEFT3:	PUSH	R0B0		;SAVE POINTER
  876: 1  03C7	C0 01			PUSH	R1B0
  877: 1  03C9	78 2A			MOV	R0,#FP_CARRY
  878: 1  03CB	79 2B			MOV	R1,#FP_DIG12

⌨️ 快捷键说明

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