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

📄 fp52.lst

📁 proteus6.9 sp4 上
💻 LST
📖 第 1 页 / 共 5 页
字号:
  293:	  0096	18			DEC	R0
  294:	  0097	19			DEC	R1
  295:	  0098	DF F8			DJNZ	R7,ADDLP	;LOOP UNTIL DONE
  296:	  009A	22			RET
  297:					;
  298:				$EJECT

ASEM-51 V1.2                                         Copyright (c) 1996 by W.W. Heinz                                         PAGE 9



 Line  I  Addr  Code            Source

  299:					;
  300:	  009B	E2		SUBLP:	MOVX	A,@R0		;NOW DO SUBTRACTION
  301:	  009C	FE			MOV	R6,A
  302:	  009D	E4			CLR	A
  303:	  009E	34 99			ADDC	A,#99H
  304:	  00A0	97			SUBB	A,@R1
  305:	  00A1	2E			ADD	A,R6
  306:	  00A2	D4			DA	A
  307:	  00A3	F7			MOV	@R1,A
  308:	  00A4	18			DEC	R0
  309:	  00A5	19			DEC	R1
  310:	  00A6	DF F3			DJNZ	R7,SUBLP
  311:	  00A8	40 11			JC	FSUB6
  312:					;
  313:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 10



 Line  I  Addr  Code            Source

  314:					;
  315:					; Need to complement the result and sign because the floating
  316:					; point accumulator mantissa was larger than the external
  317:					; memory and their signs were equal.
  318:					;
  319:	  00AA	B2 78			CPL	FP_SIGN.0
  320:	  00AC	79 2E			MOV	R1,#FP_DIG78
  321:	  00AE	7F 04			MOV	R7,#DIGIT	;LOOP COUNT
  322:					;
  323:	  00B0	74 9A		FSUB5:	MOV	A,#9AH
  324:	  00B2	97			SUBB	A,@R1
  325:	  00B3	24 00			ADD	A,#0
  326:	  00B5	D4			DA	A
  327:	  00B6	F7			MOV	@R1,A
  328:	  00B7	19			DEC	R1
  329:	  00B8	B3			CPL	C
  330:	  00B9	DF F5			DJNZ	R7,FSUB5	;LOOP
  331:					;
  332:					; Now see how many zeros their are
  333:					;
  334:	  00BB	78 2B		FSUB6:	MOV	R0,#FP_DIG12
  335:	  00BD	7F 00			MOV	R7,#0
  336:					;
  337:	  00BF	E6		FSUB7:	MOV	A,@R0
  338:	  00C0	70 08			JNZ	FSUB8
  339:	  00C2	0F			INC	R7
  340:	  00C3	0F			INC	R7
  341:	  00C4	08			INC	R0
  342:	  00C5	B8 2F F7		CJNE	R0,#FP_SIGN,FSUB7
  343:	  00C8	41 32			AJMP	ZERO_AND_EXIT
  344:					;
  345:	  00CA	B4 10 00	FSUB8:	CJNE	A,#10H,$+3
  346:	  00CD	50 01			JNC	FSUB9
  347:	  00CF	0F			INC	R7
  348:					;
  349:					; Now R7 has the number of leading zeros in the FP ACC
  350:					;
  351:	  00D0	E5 30		FSUB9:	MOV	A,FP_EXP	;GET THE OLD EXPONENT
  352:	  00D2	C3			CLR	C
  353:	  00D3	9F			SUBB	A,R7		;SUBTRACT FROM THE NUMBER OF ZEROS
  354:	  00D4	60 0B			JZ	FSUB10
  355:	  00D6	40 09			JC	FSUB10
  356:					;
  357:	  00D8	F5 30			MOV	FP_EXP,A	;SAVE THE NEW EXPONENT
  358:					;
  359:	  00DA	51 7C			ACALL	LEFT1		;SHIFT THE FP ACC
  360:	  00DC	75 2A 00		MOV	FP_CARRY,#0
  361:	  00DF	21 EA			AJMP	STORE_ALIGN_TEST_AND_EXIT
  362:					;
  363:	  00E1	41 2C		FSUB10:	AJMP	UNDERFLOW_AND_EXIT
  364:					;
  365:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 11



 Line  I  Addr  Code            Source

  366:					;***************************************************************
  367:					;
  368:	  00E3			FLOATING_COMP:	; Compare two floating point numbers
  369:						; used for relational operations and is faster
  370:						; than subtraction. ON RETURN, The carry is set
  371:						; if ARG1 is > ARG2, else carry is not set
  372:						; if ARG1 = ARG2, F0 gets set
  373:					;
  374:					;***************************************************************
  375:					;
  376:	  00E3	51 F1			ACALL	MDES1		;SET UP THE REGISTERS
  377:	  00E5	E5 24			MOV	A,ARG_STACK
  378:	  00E7	24 0C			ADD	A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
  379:	  00E9	F5 24			MOV	ARG_STACK,A	;POP THE STACK TWICE, CLEAR THE CARRY
  380:	  00EB	EE			MOV	A,R6		;CHECK OUT EXPONENTS
  381:	  00EC	C2 D5			CLR	F0
  382:	  00EE	C3		        CLR     C
  383:	  00EF	9F			SUBB	A,R7
  384:	  00F0	60 0A			JZ	EXPONENTS_EQUAL
  385:	  00F2	40 03			JC	ARG1_EXP_IS_LARGER
  386:					;
  387:					; Now the ARG2 EXPONENT is > ARG1 EXPONENT
  388:					;
  389:	  00F4			SIGNS_DIFFERENT:
  390:					;
  391:	  00F4	EB			MOV	A,R3		;SEE IF SIGN OF ARG2 IS POSITIVE
  392:	  00F5	80 01			SJMP	$+3
  393:					;
  394:	  00F7			ARG1_EXP_IS_LARGER:
  395:					;
  396:	  00F7	EC			MOV	A,R4		;GET THE SIGN OF ARG1 EXPONENT
  397:	  00F8	60 01			JZ	$+3
  398:	  00FA	B3			CPL	C
  399:	  00FB	22			RET
  400:					;
  401:	  00FC			EXPONENTS_EQUAL:
  402:					;
  403:					; First, test the sign, then the mantissa
  404:					;
  405:	  00FC	BD 00 F5		CJNE	R5,#0,SIGNS_DIFFERENT
  406:					;
  407:	  00FF			BOTH_PLUS:
  408:					;
  409:	  00FF	7F 04			MOV	R7,#DIGIT	;POINT AT MS DIGIT
  410:	  0101	18			DEC	R0
  411:	  0102	18			DEC	R0
  412:	  0103	18			DEC	R0
  413:	  0104	19			DEC	R1
  414:	  0105	19			DEC	R1
  415:	  0106	19			DEC	R1
  416:					;
  417:					; Now do the compare
  418:					;
  419:	  0107	E2		CLOOP:	MOVX	A,@R0
  420:	  0108	FE			MOV	R6,A
  421:	  0109	E3			MOVX	A,@R1

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 12



 Line  I  Addr  Code            Source

  422:	  010A	9E			SUBB	A,R6
  423:	  010B	70 EA			JNZ	ARG1_EXP_IS_LARGER
  424:	  010D	08			INC	R0
  425:	  010E	09			INC	R1
  426:	  010F	DF F6			DJNZ	R7,CLOOP
  427:					;
  428:					; If here, the numbers are the same, the carry is cleared
  429:					;
  430:	  0111	D2 D5			SETB	F0
  431:	  0113	22			RET			;EXIT WITH EQUAL
  432:					;
  433:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 13



 Line  I  Addr  Code            Source

  434:				;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  435:				;
  436:	  0114			FLOATING_MUL:	; Floating point multiply
  437:				;
  438:				;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  439:				;
  440:	  0114	51 EF			ACALL	MUL_DIV_EXP_AND_SIGN
  441:					;
  442:					; check for zero exponents
  443:					;
  444:	  0116	BE 00 02		CJNE	R6,#00,$+5	;ARG 2 EXP ZERO?
  445:	  0119	41 32			AJMP	ZERO_AND_EXIT
  446:					;
  447:					; calculate the exponent
  448:					;
  449:	  011B	8D 2F		FMUL1:	MOV	FP_SIGN,R5	;SAVE THE SIGN, IN CASE OF FAILURE
  450:					;
  451:	  011D	EF			MOV	A,R7
  452:	  011E	60 F9			JZ	FMUL1-2
  453:	  0120	2E			ADD	A,R6		;ADD THE EXPONENTS
  454:	  0121	20 E7 05		JB	ACC.7,FMUL_OVER
  455:	  0124	10 D7 06		JBC	CY,FMUL2	;SEE IF CARRY IS SET
  456:					;
  457:	  0127	41 2C			AJMP	UNDERFLOW_AND_EXIT
  458:					;
  459:	  0129			FMUL_OVER:
  460:					;
  461:	  0129	50 02			JNC	FMUL2		;OK IF SET
  462:					;
  463:	  012B	41 1B		FOV:	AJMP	OVERFLOW_AND_EXIT
  464:					;
  465:	  012D	94 81		FMUL2:	SUBB	A,#129		;SUBTRACT THE EXPONENT BIAS
  466:	  012F	FE			MOV	R6,A		;SAVE IT FOR LATER
  467:					;
  468:					; Unpack and load R0
  469:					;
  470:	  0130	51 05			ACALL	UNPACK_R0
  471:					;
  472:					; Now set up for loop multiply
  473:					;
  474:	  0132	7B 04			MOV	R3,#DIGIT
  475:	  0134	AC 01			MOV	R4,R1B0
  476:					;
  477:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 14



 Line  I  Addr  Code            Source

  478:					;
  479:					; Now, do the multiply and accumulate the product
  480:					;
  481:	  0136	8C 01		FMUL3:	MOV	R1B0,R4
  482:	  0138	E3			MOVX	A,@R1
  483:	  0139	FA			MOV	R2,A
  484:	  013A	51 B2			ACALL	MUL_NIBBLE
  485:					;
  486:	  013C	EA			MOV	A,R2
  487:	  013D	C4			SWAP	A
  488:	  013E	51 B2			ACALL	MUL_NIBBLE
  489:	  0140	1C			DEC	R4
  490:	  0141	DB F3			DJNZ	R3,FMUL3
  491:					;
  492:					; Now, pack and restore the sign
  493:					;
  494:	  0143	8E 30			MOV	FP_EXP,R6
  495:	  0145	8D 2F			MOV	FP_SIGN,R5
  496:	  0147	21 AA			AJMP	PACK		;FINISH IT OFF
  497:					;
  498:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 15



 Line  I  Addr  Code            Source

  499:					;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
  500:					;
  501:	  0149			FLOATING_DIV:
  502:					;
  503:					;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
  504:					;
  505:	  0149	51 F1			ACALL	MDES1
  506:					;
  507:					; Check the exponents
  508:					;
  509:	  014B	8D 2F			MOV	FP_SIGN,R5	;SAVE THE SIGN
  510:	  014D	BF 00 06		CJNE	R7,#0,DIV0	;CLEARS THE CARRY
  511:	  0150	51 1B			ACALL	OVERFLOW_AND_EXIT
  512:	  0152	E4			CLR	A
  513:	  0153	D2 E3			SETB	ACC.ZERO_DIVIDE
  514:	  0155	22			RET
  515:					;
  516:	  0156	EE		DIV0:	MOV	A,R6		;GET EXPONENT
  517:	  0157	60 C0			JZ	FMUL1-2		;EXIT IF ZERO
  518:	  0159	9F			SUBB	A,R7		;DELTA EXPONENT
  519:	  015A	20 E7 04		JB	ACC.7,D_UNDER
  520:	  015D	50 04			JNC	DIV3
  521:	  015F	41 2C			AJMP	UNDERFLOW_AND_EXIT
  522:					;
  523:	  0161	50 C8		D_UNDER:JNC	FOV
  524:					;
  525:	  0163	24 81		DIV3:	ADD	A,#129		;CORRECTLY BIAS THE EXPONENT
  526:	  0165	F5 30			MOV	FP_EXP,A	;SAVE THE EXPONENT
  527:	  0167	71 02			ACALL	LOADR1_MANTISSA	;LOAD THE DIVIDED
  528:					;
  529:	  0169	7A 34			MOV	R2,#FP_ACCC	;SAVE LOCATION
  530:	  016B	AB 00			MOV	R3,R0B0		;SAVE POINTER IN R3
  531:	  016D	75 2A 00		MOV	FP_CARRY,#0	;ZERO CARRY BYTE
  532:					;
  533:	  0170	7D FF		DIV4:	MOV	R5,#0FFH	;LOOP COUNT
  534:	  0172	D3			SETB	C
  535:					;
  536:	  0173	8B 00		DIV5:	MOV	R0B0,R3		;RESTORE THE EXTERNAL POINTER
  537:	  0175	79 2E			MOV	R1,#FP_DIG78	;SET UP INTERNAL POINTER
  538:	  0177	7F 04			MOV	R7,#DIGIT	;LOOP COUNT
  539:	  0179	50 17			JNC	DIV7		;EXIT IF NO CARRY
  540:					;
  541:	  017B	E2		DIV6:	MOVX	A,@R0		;DO ACCUMLATION
  542:	  017C	FE			MOV	R6,A
  543:	  017D	E4			CLR	A
  544:	  017E	34 99			ADDC	A,#99H
  545:	  0180	9E			SUBB	A,R6
  546:	  0181	27			ADD	A,@R1
  547:	  0182	D4			DA	A
  548:	  0183	F7			MOV	@R1,A
  549:	  0184	18			DEC	R0
  550:	  0185	19			DEC	R1
  551:	  0186	DF F3			DJNZ	R7,DIV6		;LOOP
  552:					;
  553:	  0188	0D			INC	R5		;SUBTRACT COUNTER
  554:	  0189	40 E8			JC	DIV5		;KEEP LOOPING IF CARRY

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 16



 Line  I  Addr  Code            Source

  555:	  018B	E7			MOV	A,@R1		;GET CARRY
  556:	  018C	94 01			SUBB	A,#1		;CARRY IS CLEARED
  557:	  018E	F7			MOV	@R1,A		;SAVE CARRY DIGIT
  558:	  018F	B3			CPL	C
  559:	  0190	80 E1			SJMP	DIV5		;LOOP
  560:					;
  561:					; Restore the result if carry was found
  562:					;
  563:	  0192	11 92		DIV7:	ACALL	ADDLP		;ADD NUMBER BACK
  564:	  0194	77 00			MOV	@R1,#0		;CLEAR CARRY
  565:	  0196	8A 00			MOV	R0B0,R2		;GET SAVE COUNTER
  566:	  0198	A6 05			MOV	@R0,5		;SAVE COUNT BYTE
  567:					;
  568:	  019A	0A			INC	R2		;ADJUST SAVE COUNTER
  569:	  019B	7F 01			MOV	R7,#1		;BUMP DIVIDEND
  570:	  019D	51 7A			ACALL	LEFT
  571:	  019F	BA 3E CE		CJNE	R2,#FP_ACC8+2,DIV4
  572:					;
  573:	  01A2	D5 30 02		DJNZ	FP_EXP,DIV8
  574:	  01A5	41 2C			AJMP	UNDERFLOW_AND_EXIT
  575:					;
  576:	  01A7	75 2A 00	DIV8:	MOV	FP_CARRY,#0
  577:					;
  578:				$EJECT

ASEM-51 V1.2                                        Copyright (c) 1996 by W.W. Heinz                                         PAGE 17



 Line  I  Addr  Code            Source

  579:					;***************************************************************
  580:					;
  581:	  01AA			PACK:	; Pack the mantissa
  582:					;
  583:					;***************************************************************
  584:					;
  585:					; First, set up the pointers
  586:					;
  587:	  01AA	78 34			MOV	R0,#FP_ACCC
  588:	  01AC	E6			MOV	A,@R0		;GET FP_ACCC
  589:	  01AD	FE			MOV	R6,A		;SAVE FOR ZERO COUNT
  590:	  01AE	60 03			JZ	PACK0		;JUMP OVER IF ZERO

⌨️ 快捷键说明

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