home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / dsp / dspgroup / macrosrc.arc / GOSUB.ASM < prev    next >
Encoding:
Assembly Source File  |  1983-11-17  |  4.7 KB  |  166 lines

  1.  
  2. *GOSUB MACRO (CALL PROC OR FUNC)
  3. *AFFECTS: STACK, AC, POSSIBLY AR1 AND/OR AR0
  4. *
  5. *      GOSUB ROUTINE,(TO-LIST),(FROM-LIST)
  6. *
  7. *      ROUTINE   := NAME OF FUNC OR PROC BEING CALLED
  8. *      T0-LIST   := TO-ARG|TO-ARG,TO-LIST
  9. *      FROM-LIST := FROM-ARG|FROM-ARG,FROM-LIST
  10. *      
  11. *      TO-ARG    := VARIABLE|(VARIABLE,LENGTH)|
  12. *                   CONST|(CONST)|((CONST,CONST,...,CONST))
  13. *      FROM-ARG  := VARIABLE|(VARIABLE,LENGTH)
  14. *
  15. *      TO-LIST   := A GROUP OF VARIABLES COPIED TO ROUTINE 
  16. *                   FORMAL LOCATIONS BEFORE CALL
  17. *      FROM-LIST := A GROUP OF VARIABLES COPIED FROM FORMAL 
  18. *                   LOCATION AFTER THE RETURN
  19. *      LENGTH    := NUMBER OF WORDS (IF OMITTED, DEFUALT IS ONE)
  20. *      CONST     := CONSTANTS 
  21.  
  22. $GOSB6 $MACRO  B1,B2,B3,B4,B5,B6,B7,B8
  23.        $IF    B1.L#=0
  24.        $GOSB3 :B1:
  25.        $ENDIF
  26.        $IF    B2.L#=0
  27.        $GOSB3 :B2:
  28.        $ENDIF
  29.        $IF    B3.L#=0
  30.        $GOSB3 :B3:
  31.        $ENDIF
  32.        $IF    B4.L#=0
  33.        $GOSB3 :B4:
  34.        $ENDIF
  35.        $IF    B5.L#=0
  36.        $GOSB3 :B5:
  37.        $ENDIF
  38.        $IF    B6.L#=0
  39.        $GOSB3 :B6:
  40.        $ENDIF
  41.        $IF    B7.L#=0
  42.        $GOSB3 :B7:
  43.        $ENDIF
  44.        $IF    B8.L#=0
  45.        $GOSB6 :B8:
  46.        $ENDIF
  47.        $END   GOSB6
  48.  
  49. $GOSB7 $MACRO  B1,B2,B3,B4,B5,B6,B7,B8
  50.        $IF    B1.L#=0
  51.        $GOSB5 :B1:
  52.        $ENDIF
  53.        $IF    B2.L#=0
  54.        $GOSB5 :B2:
  55.        $ENDIF
  56.        $IF    B3.L#=0
  57.        $GOSB5 :B3:
  58.        $ENDIF
  59.        $IF    B4.L#=0
  60.        $GOSB5 :B4:
  61.        $ENDIF
  62.        $IF    B5.L#=0
  63.        $GOSB5 :B5:
  64.        $ENDIF
  65.        $IF    B6.L#=0
  66.        $GOSB5 :B6:
  67.        $ENDIF
  68.        $IF    B7.L#=0
  69.        $GOSB5 :B7:
  70.        $ENDIF
  71.        $IF    B8.L#=0
  72.        $GOSB7 :B8:
  73.        $ENDIF
  74.        $END   GOSB7
  75.  
  76. GOSUB  $MACRO A,B,C
  77.        $CHECK :A:
  78.        $VAR L
  79.        $ASG '$$CNTR' TO L.S
  80.        $ASG 0 TO L.SV    INIT ARG COUNT
  81.        $ASG :A: TO L.SS SAVE CALL NAME
  82.        $IF  B.L#=0
  83.        $GOSB6 :B:
  84.        $ENDIF
  85.        $IF  A.SA&$UNDF
  86.        REF  :A:          DEFINE AS EXTERN
  87.        $ENDIF
  88.        CALL :A:          CALL SUBR
  89.        $ASG 0 TO L.SV    INIT ARG COUNT
  90.        $IF  C.L#=0
  91.        $GOSB7 :C:
  92.        $ENDIF
  93.        $END
  94.  
  95. *MACROS CALLED FROM GOSUB
  96.  
  97. $GOSB3 $MACRO            A,B
  98.        $VAR L,P
  99.        $ASG '$$CNTR' TO L.S        GET COUNTR
  100.        $ASG :L.SS::L.SV: TO P.S    MAKE FORMAL NAME
  101.        $IF  P.SA&$UNDF
  102.        REF  :P:                    DEFINE :P: AS EXTERN
  103.        $ENDIF
  104.        $IF  A.SA&$UNDF             A IS A CONST
  105.        $IF  B.L=0                  ONLY ONE CONST
  106.        $VAR M,Q
  107.        $ASG '$$LAB' TO M.S
  108. V$:M.SV:    EQU :A:                COMPENSATE FOR NEG NUM
  109.        $ASG 'V$' TO Q.S
  110.        $ASG :Q.S::M.SV: TO A.S
  111.        $ASG M.SV+1 TO M.SV
  112.        $IF  (A.SV<256)&(A.SV>-1)     
  113.        LACK :A:                    ACC := 8 BIT CONST
  114.        $ELSE
  115.        REF  LDAC$                  ACC := 16 BIT CONST
  116.        CALL LDAC$
  117.        DATA :A:
  118.        $ENDIF 
  119.        SACL :P:                    SAVE IN :P:
  120.        $ELSE                       MORE THAN ONE CONST
  121.        $IF  B.A&$POPL              MORE THAN TWO CONST
  122.        $ASG B.V+1 TO L.V
  123.        $ELSE
  124.        $ASG 2 TO L.V               L.V = # OF CONST
  125.        $ENDIF
  126.        REF  MOVC$
  127.        CALL MOVC$                  CALL CONST MOVER
  128.        DATA :P:                    TO :P:
  129.        DATA :L.V:                  FOR :L.V: WORDS
  130.        DATA :A:,:B:                THE DATA
  131.        $ENDIF
  132.        $ELSE                       A IS A VARIABLE
  133.        $IF  B.V<2                  SINGLE SYMBOL
  134.        LAC  :A:,0                  LOAD :A:
  135.        SACL :P:,0                  SAVE FOR SUBR IN :P:
  136.        $ELSE
  137.        REF  MOVAB$
  138.        CALL MOVAB$                 CALL MOVER
  139.        DATA :A:                    FROM :A:
  140.        DATA :P:                    TO :P:
  141.        DATA :B.V:                  FOR :B.V: WORDS
  142.        $ENDIF
  143.        $ENDIF
  144.        $ASG L.SV+1 TO L.SV         TO NEXT ARG
  145.        $END
  146.  
  147. $GOSB5 $MACRO            A,B
  148.        $VAR L,P
  149.        $ASG '$$CNTR' TO L.S        TO COUNTR
  150.        $IF  A.L#=0                 NON-BLANK
  151.        $ASG :L.SS::L.SV: TO P.S    MAKE FORMAL NAME
  152.        $IF  P.SA&$UNDF
  153.        REF  :P:                    DEFINE :P: AS EXTERN
  154.        $ENDIF
  155.        $IF  B.V<2                  SINGLE WORD
  156.        LAC  :P:,0                  LOAD :P: FROM SUBR
  157.        SACL :A:,0                  SAVE IN :A:
  158.        $ELSE                       MORE THAN ONE WORD
  159.        REF  MOVAB$
  160.        CALL MOVAB$                 CALL MOVER
  161.        DATA :P:                    FROM :P:
  162.        DATA :A:                    TO :A:
  163.        DATA :B.V:                  FOR :B.V: WORDS
  164.        $ENDIF
  165.        $ASG L.SV+1 TO L.SV         NEXT ARG
  166.        $END