📄 math.lst
字号:
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 + -