home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Amiga / Applications / Mathematiques / NLCalc.lha / NLCalc / Source / c.a next >
Text File  |  1991-06-06  |  3KB  |  95 lines

  1.     xdef    _XCEXIT            * exit(code) is standard way to leave C.
  2.  
  3.     xref    _LinkerDB        * linker defined base value
  4.     xref    __BSSBAS        * linker defined base of BSS
  5.     xref    __BSSLEN        * linker defined length of BSS
  6.  
  7.     xref    __main            * Name of C program to start with.
  8.     xref    _AbsExecBase        * ExecBase librayr pointer
  9.     xref    _FindTask        * FindTask() routine
  10.     xref    _DOSBase        * DOSBase library pointer
  11.  
  12.  
  13. *    library references
  14.  
  15.     csect    text,0,0,1,2    * any xref's after this are 16-bit reloc
  16.  
  17.     xref    _LVOFindTask
  18.     xref    _LVOForbid
  19.     xref    _LVOOpenLibrary
  20.     xref    _LVOCloseLibrary
  21.  
  22. start:
  23.     move.l    a7,d0            * save old stack ptr
  24.     movem.l    d1-d6/a0-a6,-(a7)    * save registers on stack
  25.     move.l    d0,a5            * save old stack frame
  26.     move.l    a7,__StackPtr        * Save stack ptr
  27.  
  28.     move.l    _AbsExecBase,a6        * set up for Exec Call (FindTask)
  29.     move.l    a6,_SysBase        * save ExecBase in _SysBase
  30.     suba.l    a1,a1            * load a zero
  31.     jsr     _LVOFindTask(a6)    * FindTask(0)
  32.     move.l    d0,a4            * use A4 as pointer to Task
  33.  
  34. openDOS:
  35.     lea    DOSName,A1              * point to DOSName
  36.     moveq.l    #0,D0            * load a zero
  37.     jsr    _LVOOpenLibrary(a6)    * Open the DOS library
  38.     move.l    D0,_DOSBase        * store its pointer in _DOSBase
  39.     bne    Call_Main        * if OpenLibrary failed then error
  40.     moveq.l    #100,d0            *   with code 100
  41.     bra    exit2            * skip running the main program
  42.  
  43. Call_Main:
  44.     lea    __BSSBAS,a6        * get base of BSS
  45.     move.l    #__BSSLEN,d0        * get length of BSS in longwords
  46.     beq.s    main            * if no bss
  47.     subq.l    #1,d0            * number of iterations
  48.     moveq    #0,d1            * value to store (zero)
  49. clr_bss move.l    d1,(a6)+        * store and increment pointer
  50.     dbf    d0,clr_bss        * decrement count and repeat
  51.  
  52. main    lea    _LinkerDB,a6        * load base register
  53.     jsr    __main                * call C entrypoint
  54.     moveq.l    #0,d0            * set successful status
  55.     bra.s    exit2
  56.  
  57. _XCEXIT:
  58.     move.l    4(SP),d0        * extract return code
  59. exit2:
  60.         move.l    d0,-(a7)        * save it temporarily
  61.  
  62.     move.l    _SysBase,a6        * prepare for Exec call (CloseLibrary)
  63.     move.l    _DOSBase,a1        * closing DOS library
  64.     jsr    _LVOCloseLibrary(a6)    * call CloseLibrary()
  65.  
  66.         MOVE.L    (A7)+,D0        * get back return code
  67.     movea.l  __StackPtr,SP        * restore stack ptr
  68.     movem.l    (a7)+,d1-d6/a0-a6    * restore registers
  69.     rts
  70.  
  71.  
  72.  
  73.     csect    __MERGED,1
  74.  
  75.         xdef    _SysBase
  76.         xdef    __oserr
  77.         xdef    __OSERR
  78.         xdef    __ONBREAK
  79.         xdef    __FPERR,__SIGFPE,__ECS
  80.     xdef    __ProgramName,__StackPtr
  81.  
  82. __oserr        dc.l    0
  83. __OSERR        dc.l    0
  84. __ONBREAK    dc.l    0
  85. __FPERR         dc.l    0
  86. __SIGFPE        dc.l    0
  87. __ECS           dc.l    0
  88. _SysBase    dc.l    0
  89. __StackPtr    dc.l    0
  90. __ProgramName    dc.l    0
  91. DOSName     dc.b    'dos.library',0
  92.  
  93.     END
  94.  
  95.