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

📄 math.lst

📁 Library for the 8051 microcontroller. such as math routine, hexBCD, LCD, Keyboard, I2C, Remote, Ke
💻 LST
📖 第 1 页 / 共 4 页
字号:
  287:				;
  288:				; alters:    acc
  289:				;====================================================================
  290:
  291:	  00BA	E8		CONV816:       mov    A, r0
  292:	  00BB	30 E7 03	               jnb    acc.7, Pos
  293:	  00BE	79 FF		               mov    r1, #0FFH
  294:	  00C0	22		               ret
  295:
  296:	  00C1	79 00		Pos:           mov    r1, #0
  297:	  00C3	22		               ret
  298:
  299:
  300:				;====================================================================
  301:				; subroutine ADD16
  302:				; 16-Bit Signed (2's Complement) Addition
  303:				;
  304:				; input:     r1, r0 = X
  305:				;            r3, r2 = Y
  306:				;
  307:				; output:    r1, r0 = signed sum S = X + Y
  308:				;            Carry C is set if the result (S) is out of range
  309:				;
  310:				; alters:    acc, C, OV
  311:				;====================================================================
  312:
  313:	  00C4	53 D0 E7	ADD16:         anl    PSW, #0E7H       ; Register Bank 0
  314:	  00C7	E8		               mov     a, r0           ; load X low byte into acc
  315:	  00C8	2A		               add     a, r2           ; add Y low byte
  316:	  00C9	F8		               mov     r0, a           ; put result in Z low byte
  317:	  00CA	E9		               mov     a, r1           ; load X high byte into acc
  318:	  00CB	3B		               addc    a, r3           ; add Y high byte with carry
  319:	  00CC	F9		               mov     r1, a           ; save result in Z high byte
  320:	  00CD	A2 D2		               mov     C, OV
  321:	  00CF	22		               ret
  322:
  323:

ASEM-51 V1.3                                         Copyright (c) 2002 by W.W. Heinz                                         PAGE 7



 Line  I  Addr  Code            Source

  324:				;====================================================================
  325:				; subroutine ADD32
  326:				; 32-Bit Signed (2's Complement) Addition
  327:				;
  328:				; input:     r3, r2, r1, r0 = X
  329:				;            r7, r6, r5, r4 = Y
  330:				;
  331:				; output:    r3, r2, r1, r0 = signed sum S = X + Y
  332:				;            Carry C is set if the result (S) is out of range
  333:				;
  334:				; alters:    acc, C, OV
  335:				;====================================================================
  336:
  337:	  00D0	53 D0 E7	ADD32:         anl    PSW, #0E7H       ; Register Bank 0
  338:	  00D3	E8		               mov     a, r0           ; load X low byte into acc
  339:	  00D4	2C		               add     a, r4           ; add Y low byte
  340:	  00D5	F8		               mov     r0, a           ; save result
  341:	  00D6	E9		               mov     a, r1           ; load X next byte into acc
  342:	  00D7	3D		               addc    a, r5           ; add Y next byte with carry
  343:	  00D8	F9		               mov     r1, a           ; save result
  344:	  00D9	EA		               mov     a, r2           ; load X next byte into acc
  345:	  00DA	3E		               addc    a, r6           ; add Y next byte
  346:	  00DB	FA		               mov     r2, a           ; save result
  347:	  00DC	EB		               mov     a, r3           ; load X high byte into acc
  348:	  00DD	3F		               addc    a, r7           ; add Y high byte with carry
  349:	  00DE	FB		               mov     r3, a
  350:	  00DF	A2 D2		               mov     C, OV
  351:	  00E1	22		               ret
  352:
  353:
  354:				;====================================================================
  355:				; subroutine SUB16
  356:				; 16-Bit Signed (2's Complement) Subtraction
  357:				;
  358:				; input:     r1, r0 = X
  359:				;            r3, r2 = Y
  360:				;
  361:				; output:    r1, r0 = signed difference D = X - Y
  362:				;            Carry C is set if the result (D) is out of range.
  363:				;
  364:				; alters:    acc, C, OV
  365:				;====================================================================
  366:
  367:	  00E2	53 D0 E7	SUB16:         anl    PSW, #0E7H       ; Register Bank 0
  368:	  00E5	E8		               mov     a, r0           ; load X low byte into acc
  369:	  00E6	C3		               clr     C               ; clear carry flag
  370:	  00E7	9A		               subb    a, r2           ; subract Y low byte
  371:	  00E8	F8		               mov     r0, a           ; put result in Z low byte
  372:	  00E9	E9		               mov     a, r1           ; load X high into accumulator
  373:	  00EA	9B		               subb    a, r3           ; subtract Y high with borrow
  374:	  00EB	F9		               mov     r1, a           ; save result in Z high byte
  375:	  00EC	A2 D2		               mov     C, OV
  376:	  00EE	22		               ret
  377:
  378:
  379:				;====================================================================

ASEM-51 V1.3                                         Copyright (c) 2002 by W.W. Heinz                                         PAGE 8



 Line  I  Addr  Code            Source

  380:				; subroutine SUB32
  381:				; 32-Bit Signed (2's Complement) subtraction
  382:				;
  383:				; input:     r3, r2, r1, r0 = X
  384:				;            r7, r6, r5, r4 = Y
  385:				;
  386:				; output:    r3, r2, r1, r0 = signed difference D = X - Y
  387:				;            Carry C is set if the result (D) is out of range.
  388:				;
  389:				; alters:    acc, C, OV
  390:				;====================================================================
  391:
  392:	  00EF	53 D0 E7	SUB32:         anl    PSW, #0E7H       ; Register Bank 0
  393:	  00F2	E8		               mov     a, r0           ; load X low byte into acc
  394:	  00F3	C3		               clr     C               ; clear carry flag
  395:	  00F4	9C		               subb    a, r4           ; subract Y low byte
  396:	  00F5	F8		               mov     r0, a           ; put result in Z low byte
  397:	  00F6	E9		               mov     a, r1           ; repeat with other bytes...
  398:	  00F7	9D		               subb    a, r5
  399:	  00F8	F9		               mov     r1, a
  400:	  00F9	EA		               mov     a, r2
  401:	  00FA	9E		               subb    a, r6
  402:	  00FB	FA		               mov     r2, a
  403:	  00FC	EB		               mov     a, r3
  404:	  00FD	9F		               subb    a, r7
  405:	  00FE	FB		               mov     r3, a
  406:	  00FF	A2 D2		               mov     C, OV           ; set C if external borrow
  407:	  0101	22		               ret
  408:
  409:
  410:				;==================================================================
  411:				; subroutine MUL8
  412:				; 8-Bit x 8-Bit to 16-Bit Product Signed Multiply
  413:				; 2's Complement format
  414:				;
  415:				; input:    r0 = multiplicand X
  416:				;           r1 = multiplier Y
  417:				;
  418:				; output:   r1, r0 = product P = X x Y.
  419:				;
  420:				; calls:    UMUL8, Cr0, Cr1, Mr0r1
  421:				;
  422:				; alters:   acc, C, Bits 21H & 22H
  423:				;==================================================================
  424:
  425:	  0102	53 D0 E7	MUL8:          anl     PSW, #0E7H      ; Register Bank 0
  426:	  0105	11 00		               acall   Cr0             ; 2's comp -> Mag/Sign
  427:	  0107	11 0D		               acall   Cr1             ; 2's comp -> Mag/Sign
  428:	  0109	31 0E		               acall   UMUL8
  429:	  010B	11 84		               acall   Mr0r1           ; Mag/Sign -> 2's Comp
  430:	  010D	22		               ret
  431:
  432:
  433:				;==================================================================
  434:				; subroutine UMUL8
  435:				; 8-Bit x 8-Bit to 16-Bit Product Unsigned Multiply

ASEM-51 V1.3                                         Copyright (c) 2002 by W.W. Heinz                                         PAGE 9



 Line  I  Addr  Code            Source

  436:				;
  437:				; input:    r0 = multiplicand X
  438:				;           r1 = multiplier Y
  439:				;
  440:				; output:   r1, r0 = product P = X x Y.
  441:				;
  442:				; alters:   acc
  443:				;==================================================================
  444:
  445:	  010E	C0 F0		UMUL8:         push    b
  446:	  0110	E8		               mov     a, r0           ; read X and ...
  447:	  0111	89 F0		               mov     b, r1           ; ... Y
  448:	  0113	A4		               mul     ab              ; multiply X and Y
  449:	  0114	A9 F0		               mov     r1, b           ; save result high ...
  450:	  0116	F8		               mov     r0, a           ; ... and low
  451:	  0117	D0 F0		               pop     b
  452:	  0119	22		               ret
  453:
  454:
  455:				;====================================================================
  456:				; subroutine MUL816
  457:				; 8-Bit x 16-Bit to 32-Bit Product signed Multiply
  458:				; 2's Complement format
  459:				;
  460:				; input:    r0 = multiplicand X
  461:				;           r3, r2 = multiplier Y
  462:				;
  463:				; output:   r3, r2, r1, r0 = product P = X x Y (r3 = sign extension)
  464:				;
  465:				; calls:    Cr0, Cr2r3, Mr0r3
  466:				;
  467:				; alters:   acc, C, Bits 21H & 22H
  468:				;====================================================================
  469:
  470:	  011A	C0 F0		MUL816:        push    b
  471:	  011C	53 D0 E7	               anl     PSW, #0E7H      ; Register Bank 0
  472:	  011F	11 00		               acall   Cr0             ; 2's comp -> Mag/Sign
  473:	  0121	11 2E		               acall   Cr2r3           ; 2's comp -> Mag/Sign
  474:	  0123	E8		               mov     a, r0           ; load X low byte into acc
  475:	  0124	8A F0		               mov     b, r2           ; load Y low byte into B
  476:	  0126	A4		               mul     ab              ; multiply
  477:	  0127	C0 E0		               push    acc             ; stack result low byte
  478:	  0129	C0 F0		               push    b               ; stack result high byte
  479:	  012B	E8		               mov     a, r0           ; load X into acc again
  480:	  012C	8B F0		               mov     b, r3           ; load Y high byte into B
  481:	  012E	A4		               mul     ab              ; multiply
  482:	  012F	D0 00		               pop     00H             ; recall X*YL high byte
  483:	  0131	28		               add     a, r0           ; add X*YL high and X*YH low
  484:	  0132	F9		               mov     r1, a           ; save result
  485:	  0133	E4		               clr     a               ; clear accumulator
  486:	  0134	35 F0		               addc    a, b            ; a = b + carry flag
  487:	  0136	FA		               mov     r2, a           ; save result
  488:	  0137	D0 00		               pop     00H             ; get low result
  489:	  0139	7B 00		               mov     r3, #0
  490:	  013B	11 9A		               acall   Mr0r3           ; Mag/Sign -> 2's Comp
  491:	  013D	D0 F0		               pop     b

ASEM-51 V1.3                                        Copyright (c) 2002 by W.W. Heinz                                         PAGE 10



 Line  I  Addr  Code            Source

  492:	  013F	22		               ret
  493:
  494:
  495:				;====================================================================
  496:				; subroutine MUL16
  497:				; 16-Bit x 16-Bit to 32-Bit Product Signed Multiply
  498:				; 2's Complement format
  499:				;
  500:				; input:    r1, r0 = multiplicand X
  501:				;           r3, r2 = multiplier Y
  502:				;
  503:				; output:   r3, r2, r1, r0 = product P = X x Y
  504:				;
  505:				; calls:    UMUL16, Cr0r1, Cr2r3, Mr0r3
  506:				;
  507:				; alters:   acc, C, Bits 21H & 22H
  508:				;====================================================================
  509:
  510:	  0140	53 D0 E7	MUL16:         anl     PSW, #0E7H      ; Register Bank 0
  511:	  0143	11 1A		               acall   Cr0r1           ; 2's comp -> Mag/Sign
  512:	  0145	11 2E		               acall   Cr2r3           ; 2's comp -> Mag/Sign
  513:	  0147	31 4C		               acall   UMUL16
  514:	  0149	11 9A		               acall   Mr0r3           ; Mag/Sign -> 2's Comp
  515:	  014B	22		               ret
  516:
  517:
  518:				;====================================================================
  519:				; subroutine UMUL16
  520:				; 16-Bit x 16-Bit to 32-Bit Product Unsigned Multiply
  521:				;
  522:				; input:    r1, r0 = multiplicand X
  523:				;           r3, r2 = multiplier Y
  524:				;
  525:				; output:   r3, r2, r1, r0 = product P = X x Y
  526:				;
  527:				; alters:   acc, C
  528:				;====================================================================
  529:
  530:	  014C	C0 F0		UMUL16:        push    B
  531:	  014E	C0 82		               push    dpl
  532:	  0150	E8		               mov     a, r0
  533:	  0151	8A F0		               mov     b, r2
  534:	  0153	A4		               mul     ab              ; multiply XL x YL
  535:	  0154	C0 E0		               push    acc             ; stack result low byte
  536:	  0156	C0 F0		               push    b               ; stack result high byte
  537:	  0158	E8		               mov     a, r0
  538:	  0159	8B F0		               mov     b, r3
  539:	  015B	A4		               mul     ab              ; multiply XL x YH
  540:	  015C	D0 00		               pop     00H
  541:	  015E	28		               add     a, r0
  542:	  015F	F8		               mov     r0, a
  543:	  0160	E4		               clr     a
  544:	  0161	35 F0		               addc    a, b
  545:	  0163	F5 82		               mov     dpl, a
  546:	  0165	EA		               mov     a, r2
  547:	  0166	89 F0		               mov     b, r1

ASEM-51 V1.3                                        Copyright (c) 2002 by W.W. Heinz                                         PAGE 11



 Line  I  Addr  Code            Source

  548:	  0168	A4		               mul     ab              ; multiply XH x YL
  549:	  0169	28		               add     a, r0
  550:	  016A	F8		               mov     r0, a
  551:	  016B	E5 82		               mov     a, dpl
  552:	  016D	35 F0		               addc    a, b
  553:	  016F	F5 82		               mov     dpl, a
  554:	  0171	E4		               clr     a
  555:	  0172	34 00		               addc    a, #0
  556:	  0174	C0 E0		               push    acc             ; save intermediate carry
  557:	  0176	EB		               mov     a, r3
  558:	  0177	89 F0		               mov     b, r1
  559:	  0179	A4		               mul     ab              ; multiply XH x YH
  560:	  017A	25 82		               add     a, dpl
  561:	  017C	FA		               mov     r2, a
  562:	  017D	D0 E0		               pop     acc             ; retrieve carry
  563:	  017F	35 F0		               addc    a, b
  564:	  0181	FB		               mov     r3, a
  565:	  0182	A9 00		               mov     r1, 00H
  566:	  0184	D0 00		               pop     00H             ; retrieve result low byte
  567:	  0186	D0 82		               pop     dpl
  568:	  0188	D0 F0		               pop     B
  569:	  018A	22		               ret
  570:
  571:
  572:				;====================================================================
  573:				; subroutine MAC16
  574:				; 16-Bit x 16-Bit to 32-Bit Product signed Multiply-Accumulate
  575:				; 2's Complement format
  576:				;
  577:				; input:    r1, r0 = multiplicand X
  578:				;           r3, r2 = multiplier Y
  579:				;           r7, r6, r5, r4 = 32-bit accumulator Ar
  580:				;
  581:				; output:   r7, r6, r5, r4 = accumulated result Ar =  Ar + (X x Y)
  582:				;           r3, r2, r1, r0 = multiply result M = X x Y
  583:				;           Carry C set if overflow
  584:				;
  585:				; calls:    MUL16
  586:				;
  587:				; alters:   acc, C, Bits 21H & 22H
  588:				;====================================================================
  589:
  590:	  018B	53 D0 E7	MAC16:         anl    PSW, #0E7H       ; Register Bank 0
  591:	  018E	31 43		               acall  MUL16+3
  592:	  0190	EC		               mov    A, r4

⌨️ 快捷键说明

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