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

📄 fp-52.lst

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



 Line  I  Addr  Code            Source

  290:					;
  291:	  1A22	E2		SUBLP:	MOVX	A,@R0		;NOW DO SUBTRACTION
  292:	  1A23	FE			MOV	R6,A
  293:	  1A24	E4			CLR	A
  294:	  1A25	34 99			ADDC	A,#99H
  295:	  1A27	97			SUBB	A,@R1
  296:	  1A28	2E			ADD	A,R6
  297:	  1A29	D4			DA	A
  298:	  1A2A	F7			MOV	@R1,A
  299:	  1A2B	18			DEC	R0
  300:	  1A2C	19			DEC	R1
  301:	  1A2D	DF F3			DJNZ	R7,SUBLP
  302:	  1A2F	40 11			JC	FSUB6
  303:					;
  304:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 11



 Line  I  Addr  Code            Source

  305:					;
  306:					; Need to complement the result and sign because the floating
  307:					; point accumulator mantissa was larger than the external
  308:					; memory and their signs were equal.
  309:					;
  310:	  1A31	B2 78			CPL	FP_SIGN.0
  311:	  1A33	79 2E			MOV	R1,#FP_DIG78
  312:	  1A35	7F 04			MOV	R7,#DIGIT	;LOOP COUNT
  313:					;
  314:	  1A37	74 9A		FSUB5:	MOV	A,#9AH
  315:	  1A39	97			SUBB	A,@R1
  316:	  1A3A	24 00			ADD	A,#0
  317:	  1A3C	D4			DA	A
  318:	  1A3D	F7			MOV	@R1,A
  319:	  1A3E	19			DEC	R1
  320:	  1A3F	B3			CPL	C
  321:	  1A40	DF F5			DJNZ	R7,FSUB5	;LOOP
  322:					;
  323:					; Now see how many zeros their are
  324:					;
  325:	  1A42	78 2B		FSUB6:	MOV	R0,#FP_DIG12
  326:	  1A44	7F 00			MOV	R7,#0
  327:					;
  328:	  1A46	E6		FSUB7:	MOV	A,@R0
  329:	  1A47	70 08			JNZ	FSUB8
  330:	  1A49	0F			INC	R7
  331:	  1A4A	0F			INC	R7
  332:	  1A4B	08			INC	R0
  333:	  1A4C	B8 2F F7		CJNE	R0,#FP_SIGN,FSUB7
  334:	  1A4F	61 B8			AJMP	ZERO_AND_EXIT
  335:					;
  336:	  1A51	B4 10 00	FSUB8:	CJNE	A,#10H,$+3
  337:	  1A54	50 01			JNC	FSUB9
  338:	  1A56	0F			INC	R7
  339:					;
  340:					; Now R7 has the number of leading zeros in the FP ACC
  341:					;
  342:	  1A57	E5 30		FSUB9:	MOV	A,FP_EXP	;GET THE OLD EXPONENT
  343:	  1A59	C3			CLR	C
  344:	  1A5A	9F			SUBB	A,R7		;SUBTRACT FROM THE NUMBER OF ZEROS
  345:	  1A5B	60 0B			JZ	FSUB10
  346:	  1A5D	40 09			JC	FSUB10
  347:					;
  348:	  1A5F	F5 30			MOV	FP_EXP,A	;SAVE THE NEW EXPONENT
  349:					;
  350:	  1A61	91 02			ACALL	LEFT1		;SHIFT THE FP ACC
  351:	  1A63	75 2A 00		MOV	FP_CARRY,#0
  352:	  1A66	61 70			AJMP	STORE_ALIGN_TEST_AND_EXIT
  353:					;
  354:	  1A68	61 B2		FSUB10:	AJMP	UNDERFLOW_AND_EXIT
  355:					;
  356:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 12



 Line  I  Addr  Code            Source

  357:					;***************************************************************
  358:					;
  359:	  1A6A			FLOATING_COMP:	; Compare two floating point numbers
  360:						; used for relational operations and is faster
  361:						; than subtraction. ON RETURN, The carry is set
  362:						; if ARG1 is > ARG2, else carry is not set
  363:						; if ARG1 = ARG2, F0 gets set
  364:					;
  365:					;***************************************************************
  366:					;
  367:	  1A6A	91 77			ACALL	MDES1		;SET UP THE REGISTERS
  368:	  1A6C	E5 09			MOV	A,ARG_STACK
  369:	  1A6E	24 0C			ADD	A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
  370:	  1A70	F5 09			MOV	ARG_STACK,A	;POP THE STACK TWICE, CLEAR THE CARRY
  371:	  1A72	EE			MOV	A,R6		;CHECK OUT EXPONENTS
  372:	  1A73	C2 D5			CLR	F0
  373:	  1A75	9F			SUBB	A,R7
  374:	  1A76	60 0A			JZ	EXPONENTS_EQUAL
  375:	  1A78	40 03			JC	ARG1_EXP_IS_LARGER
  376:					;
  377:					; Now the ARG2 EXPONENT is > ARG1 EXPONENT
  378:					;
  379:	  1A7A			SIGNS_DIFFERENT:
  380:					;
  381:	  1A7A	EB			MOV	A,R3		;SEE IF SIGN OF ARG2 IS POSITIVE
  382:	  1A7B	80 01			SJMP	$+3
  383:					;
  384:	  1A7D			ARG1_EXP_IS_LARGER:
  385:					;
  386:	  1A7D	EC			MOV	A,R4		;GET THE SIGN OF ARG1 EXPONENT
  387:	  1A7E	60 01			JZ	$+3
  388:	  1A80	B3			CPL	C
  389:	  1A81	22			RET
  390:					;
  391:	  1A82			EXPONENTS_EQUAL:
  392:					;
  393:					; First, test the sign, then the mantissa
  394:					;
  395:	  1A82	BD 00 F5		CJNE	R5,#0,SIGNS_DIFFERENT
  396:					;
  397:	  1A85			BOTH_PLUS:
  398:					;
  399:	  1A85	7F 04			MOV	R7,#DIGIT	;POINT AT MS DIGIT
  400:	  1A87	18			DEC	R0
  401:	  1A88	18			DEC	R0
  402:	  1A89	18			DEC	R0
  403:	  1A8A	19			DEC	R1
  404:	  1A8B	19			DEC	R1
  405:	  1A8C	19			DEC	R1
  406:					;
  407:					; Now do the compare
  408:					;
  409:	  1A8D	E2		CLOOP:	MOVX	A,@R0
  410:	  1A8E	FE			MOV	R6,A
  411:	  1A8F	E3			MOVX	A,@R1
  412:	  1A90	9E			SUBB	A,R6

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 13



 Line  I  Addr  Code            Source

  413:	  1A91	70 EA			JNZ	ARG1_EXP_IS_LARGER
  414:	  1A93	08			INC	R0
  415:	  1A94	09			INC	R1
  416:	  1A95	DF F6			DJNZ	R7,CLOOP
  417:					;
  418:					; If here, the numbers are the same, the carry is cleared
  419:					;
  420:	  1A97	D2 D5			SETB	F0
  421:	  1A99	22			RET			;EXIT WITH EQUAL
  422:					;
  423:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 14



 Line  I  Addr  Code            Source

  424:				;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  425:				;
  426:	  1A9A			FLOATING_MUL:	; Floating point multiply
  427:				;
  428:				;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  429:				;
  430:	  1A9A	91 75			ACALL	MUL_DIV_EXP_AND_SIGN
  431:					;
  432:					; check for zero exponents
  433:					;
  434:	  1A9C	BE 00 02		CJNE	R6,#00,$+5	;ARG 2 EXP ZERO?
  435:	  1A9F	61 B8			AJMP	ZERO_AND_EXIT
  436:					;
  437:					; calculate the exponent
  438:					;
  439:	  1AA1	8D 2F		FMUL1:	MOV	FP_SIGN,R5	;SAVE THE SIGN, IN CASE OF FAILURE
  440:					;
  441:	  1AA3	EF			MOV	A,R7
  442:	  1AA4	60 F9			JZ	FMUL1-2
  443:	  1AA6	2E			ADD	A,R6		;ADD THE EXPONENTS
  444:	  1AA7	20 E7 05		JB	ACC.7,FMUL_OVER
  445:	  1AAA	10 D7 06		JBC	CY,FMUL2	;SEE IF CARRY IS SET
  446:					;
  447:	  1AAD	61 B2			AJMP	UNDERFLOW_AND_EXIT
  448:					;
  449:	  1AAF			FMUL_OVER:
  450:					;
  451:	  1AAF	50 02			JNC	FMUL2		;OK IF SET
  452:					;
  453:	  1AB1	61 A1		FOV:	AJMP	OVERFLOW_AND_EXIT
  454:					;
  455:	  1AB3	94 81		FMUL2:	SUBB	A,#129		;SUBTRACT THE EXPONENT BIAS
  456:	  1AB5	FE			MOV	R6,A		;SAVE IT FOR LATER
  457:					;
  458:					; Unpack and load R0
  459:					;
  460:	  1AB6	71 8B			ACALL	UNPACK_R0
  461:					;
  462:					; Now set up for loop multiply
  463:					;
  464:	  1AB8	7B 04			MOV	R3,#DIGIT
  465:	  1ABA	AC 01			MOV	R4,R1B0
  466:					;
  467:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 15



 Line  I  Addr  Code            Source

  468:					;
  469:					; Now, do the multiply and accumulate the product
  470:					;
  471:	  1ABC	8C 01		FMUL3:	MOV	R1B0,R4
  472:	  1ABE	E3			MOVX	A,@R1
  473:	  1ABF	FA			MOV	R2,A
  474:	  1AC0	91 38			ACALL	MUL_NIBBLE
  475:					;
  476:	  1AC2	EA			MOV	A,R2
  477:	  1AC3	C4			SWAP	A
  478:	  1AC4	91 38			ACALL	MUL_NIBBLE
  479:	  1AC6	1C			DEC	R4
  480:	  1AC7	DB F3			DJNZ	R3,FMUL3
  481:					;
  482:					; Now, pack and restore the sign
  483:					;
  484:	  1AC9	8E 30			MOV	FP_EXP,R6
  485:	  1ACB	8D 2F			MOV	FP_SIGN,R5
  486:	  1ACD	61 30			AJMP	PACK		;FINISH IT OFF
  487:					;
  488:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 16



 Line  I  Addr  Code            Source

  489:					;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
  490:					;
  491:	  1ACF			FLOATING_DIV:
  492:					;
  493:					;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
  494:					;
  495:	  1ACF	91 77			ACALL	MDES1
  496:					;
  497:					; Check the exponents
  498:					;
  499:	  1AD1	8D 2F			MOV	FP_SIGN,R5	;SAVE THE SIGN
  500:	  1AD3	BF 00 06		CJNE	R7,#0,DIV0	;CLEARS THE CARRY
  501:	  1AD6	71 A1			ACALL	OVERFLOW_AND_EXIT
  502:	  1AD8	E4			CLR	A
  503:	  1AD9	D2 E3			SETB	ACC.ZERO_DIVIDE
  504:	  1ADB	22			RET
  505:					;
  506:	  1ADC	EE		DIV0:	MOV	A,R6		;GET EXPONENT
  507:	  1ADD	60 C0			JZ	FMUL1-2		;EXIT IF ZERO
  508:	  1ADF	9F			SUBB	A,R7		;DELTA EXPONENT
  509:	  1AE0	20 E7 04		JB	ACC.7,D_UNDER
  510:	  1AE3	50 04			JNC	DIV3
  511:	  1AE5	61 B2			AJMP	UNDERFLOW_AND_EXIT
  512:					;
  513:	  1AE7	50 C8		D_UNDER:JNC	FOV
  514:					;
  515:	  1AE9	24 81		DIV3:	ADD	A,#129		;CORRECTLY BIAS THE EXPONENT
  516:	  1AEB	F5 30			MOV	FP_EXP,A	;SAVE THE EXPONENT
  517:	  1AED	91 88			ACALL	LOADR1_MANTISSA	;LOAD THE DIVIDED
  518:					;
  519:	  1AEF	7A 34			MOV	R2,#FP_ACCC	;SAVE LOCATION
  520:	  1AF1	AB 00			MOV	R3,R0B0		;SAVE POINTER IN R3
  521:	  1AF3	75 2A 00		MOV	FP_CARRY,#0	;ZERO CARRY BYTE
  522:					;
  523:	  1AF6	7D FF		DIV4:	MOV	R5,#0FFH	;LOOP COUNT
  524:	  1AF8	D3			SETB	C
  525:					;
  526:	  1AF9	8B 00		DIV5:	MOV	R0B0,R3		;RESTORE THE EXTERNAL POINTER
  527:	  1AFB	79 2E			MOV	R1,#FP_DIG78	;SET UP INTERNAL POINTER
  528:	  1AFD	7F 04			MOV	R7,#DIGIT	;LOOP COUNT
  529:	  1AFF	50 17			JNC	DIV7		;EXIT IF NO CARRY
  530:					;
  531:	  1B01	E2		DIV6:	MOVX	A,@R0		;DO ACCUMLATION
  532:	  1B02	FE			MOV	R6,A
  533:	  1B03	E4			CLR	A
  534:	  1B04	34 99			ADDC	A,#99H
  535:	  1B06	9E			SUBB	A,R6
  536:	  1B07	27			ADD	A,@R1
  537:	  1B08	D4			DA	A
  538:	  1B09	F7			MOV	@R1,A
  539:	  1B0A	18			DEC	R0
  540:	  1B0B	19			DEC	R1
  541:	  1B0C	DF F3			DJNZ	R7,DIV6		;LOOP
  542:					;
  543:	  1B0E	0D			INC	R5		;SUBTRACT COUNTER
  544:	  1B0F	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

  545:	  1B11	E7			MOV	A,@R1		;GET CARRY
  546:	  1B12	94 01			SUBB	A,#1		;CARRY IS CLEARED
  547:	  1B14	F7			MOV	@R1,A		;SAVE CARRY DIGIT
  548:	  1B15	B3			CPL	C
  549:	  1B16	80 E1			SJMP	DIV5		;LOOP
  550:					;
  551:					; Restore the result if carry was found
  552:					;
  553:	  1B18	51 19		DIV7:	ACALL	ADDLP		;ADD NUMBER BACK
  554:	  1B1A	77 00			MOV	@R1,#0		;CLEAR CARRY
  555:	  1B1C	8A 00			MOV	R0B0,R2		;GET SAVE COUNTER
  556:	  1B1E	A6 05			MOV	@R0,5		;SAVE COUNT BYTE
  557:					;
  558:	  1B20	0A			INC	R2		;ADJUST SAVE COUNTER
  559:	  1B21	7F 01			MOV	R7,#1		;BUMP DIVIDEND
  560:	  1B23	91 00			ACALL	LEFT
  561:	  1B25	BA 3E CE		CJNE	R2,#FP_ACC8+2,DIV4
  562:					;
  563:	  1B28	D5 30 02		DJNZ	FP_EXP,DIV8
  564:	  1B2B	61 B2			AJMP	UNDERFLOW_AND_EXIT
  565:					;
  566:	  1B2D	75 2A 00	DIV8:	MOV	FP_CARRY,#0
  567:					;
  568:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 18



 Line  I  Addr  Code            Source

  569:					;***************************************************************
  570:					;
  571:	  1B30			PACK:	; Pack the mantissa
  572:					;
  573:					;***************************************************************
  574:					;
  575:					; First, set up the pointers
  576:					;
  577:	  1B30	78 34			MOV	R0,#FP_ACCC
  578:	  1B32	E6			MOV	A,@R0		;GET FP_ACCC
  579:	  1B33	FE			MOV	R6,A		;SAVE FOR ZERO COUNT
  580:	  1B34	60 03			JZ	PACK0		;JUMP OVER IF ZERO
  581:	  1B36	71 7F			ACALL	INC_FP_EXP	;BUMP THE EXPONENT
  582:	  1B38	18			DEC	R0
  583:					;
  584:	  1B39	08		PACK0:	INC	R0		;POINT AT FP_ACC1
  585:					;

⌨️ 快捷键说明

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