Advertisement
Ladies_Man

#NUP ADD_88_LE (PDP-11) rk1

Jun 17th, 2014
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .psect code gbl,rel,con,i,ro
  2.  
  3. ;void add88( int88_x c, int88_x a, int88_x b )
  4. ;c = a + b
  5. ;typedef int int88_x[6];
  6. ;LE
  7.  
  8. madd::  mov R2, -(SP)
  9.        mov R3, -(SP)
  10.        mov R4, -(SP)
  11.        mov R5, -(SP)
  12.  
  13.        mov 12(SP), R0   ;C
  14.        mov 14(SP), R1   ;A
  15.        mov 16(SP), R2   ;B
  16.  
  17.        mov #5, R3   ;counter
  18.        clr R4
  19.  
  20. loop:   mov R4, R5  ; + prev carry
  21.        clr R4      
  22.        add (R1)+, R5    ; + A[]
  23.        adc R4
  24.        add (R2)+, R5    ; + B[]
  25.        adc R4
  26.        mov R5, (R0)+    ;C[] = A[] + B[]
  27.        sob R3, loop
  28.  
  29. ;для хранения вектора используется нечетное число байт
  30. ;в последенем слове используется только байт с младшим адресом
  31. ;^^если такого условия нет, то опустить то, что ниже
  32.  
  33.        movb R4, R5  ; + carry
  34.        add (R1), R5     ; + A
  35.        add (R2), R5     ; + B
  36.        movb R5, (R0)
  37.  
  38.        mov 12(SP), R0
  39.        mov (SP)+, R5
  40.        mov (SP)+, R4
  41.        mov (SP)+, R3
  42.        mov (SP)+, R2
  43.  
  44.        return
  45. .end
  46.  
  47.  
  48. //Main.c (Decus C):
  49.  
  50. typedef int int88_x[6];
  51.  
  52. main()
  53.  
  54. {
  55.         int88_x a, b, c;
  56.  
  57.         a[0] = 1; a[1] = 2; a[2] = 3; a[3] = 4; a[4] = 5; a[5] = 6;
  58.         b[0] = 1; a[1] = 3; a[2] = 3; a[3] = 7; a[4] = 6; a[5] = 5;
  59.         madd ( c, a, b );
  60.  
  61.         printf( "\r|%04x|%04x|%04x|%04x|%04x|%04x\r\n",
  62.             c[0], c[1], c[2], c[3], c[4], c[5] );
  63.  
  64.         return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement