home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 317b.lha / RCS_Sources / rsbx.lib / xc.asm < prev   
Assembly Source File  |  1989-12-05  |  8KB  |  352 lines

  1. *
  2. * This is a copy of c.a, distributed with the Lattice 5.04 compiler, that has
  3. *    been hacked to support my LaunchChild calls. There is no WorkBench
  4. *    support in this startup.
  5. *
  6. *                    Ray
  7. *
  8. *
  9. * C initial startup procedure under AmigaDOS
  10. * Use the following command line to make c.o
  11. * asm -u -iINCLUDE: c.a
  12. *
  13. * Use the following command line to make cres.o
  14. * asm -u -dRESIDENT -iINCLUDE: -ocres.o c.a
  15. *
  16.     INCLUDE    "exec/types.i"
  17.     INCLUDE    "exec/alerts.i"
  18.     INCLUDE    "exec/nodes.i"
  19.     INCLUDE    "exec/lists.i"
  20.     INCLUDE    "exec/ports.i"
  21.     INCLUDE    "exec/libraries.i"
  22.     INCLUDE    "exec/tasks.i"
  23.     INCLUDE    "exec/memory.i"
  24.     INCLUDE    "exec/execbase.i"
  25.     INCLUDE    "libraries/dos.i"
  26.     INCLUDE    "libraries/dosextens.i"
  27.     INCLUDE    "exec/funcdef.i"
  28.     INCLUDE    "exec/exec_lib.i"
  29.     INCLUDE    "libraries/dos_lib.i"
  30.  
  31. MEMFLAGS    EQU    MEMF_CLEAR+MEMF_PUBLIC
  32. AbsExecBase    EQU    4
  33.  
  34. ; some usefull macros:
  35.  
  36. callsys macro
  37.     CALLLIB _LVO\1
  38.     endm
  39.     
  40.     xdef    _XCEXIT        * exit(code) is standard way to leave C.
  41.     xdef    _@XCEXIT
  42.     
  43.     xref    _LinkerDB    * linker defined base value
  44.     xref    __BSSBAS    * linker defined base of BSS
  45.     xref    __BSSLEN    * linker defined length of BSS
  46.     IFD    RESIDENT
  47.     xref    _RESLEN
  48.     xref    _RESBASE
  49.     xref    _NEWDATAL
  50.     xref    __stack
  51.     ENDC
  52.     
  53. *    library references
  54.  
  55.     section text,code
  56.  
  57.     xref    __xmain            * Name of C program to start with.
  58.     xref    _MemCleanup        * Free all allocated memory
  59.     xref    ___fpinit        * initialize floating point
  60.     xref    ___fpterm        * terminate floating point
  61.     
  62. start:
  63.     movem.l d1-d6/a0-a6,-(a7)
  64.  
  65.     move.l    a0,a2            * save command pointer
  66.     move.l    d0,d2            * and command length
  67.     lea    _LinkerDB,a4        * load base register
  68.     move.l    AbsExecBase.W,a6
  69.  
  70. *------ are we running as a son of Workbench?
  71.     move.l    ThisTask(a6),A3
  72.     tst.l    pr_CLI(A3)
  73.     bne.s    fromCLI
  74.     
  75. *=======================================================================
  76. *====== Workbench Startup Code =========================================
  77. *=======================================================================
  78.  
  79. fromWorkbench:
  80.  
  81.     lea    pr_MsgPort(A3),a0    * our process base
  82.     callsys WaitPort
  83.     lea    pr_MsgPort(A3),a0    * our process base
  84.     callsys GetMsg
  85.     move.l    d0,a2
  86.  
  87. *$* should put recoverable alert here
  88.  
  89. *------    return the startup message to our parent
  90. *    we forbid so workbench can't UnLoadSeg() us
  91. *    before we are done:
  92.     callsys    Forbid
  93.     move.l    a2,a1
  94.     callsys    ReplyMsg
  95.  
  96.     moveq.l    #-1,D0
  97.     
  98.     movem.l (a7)+,d1-d6/a0-a6
  99.     rts
  100.     
  101. *=======================================================================
  102. *====== CLI Startup Code ===============================================
  103. *=======================================================================
  104.  
  105. fromCLI:
  106.     IFND    RESIDENT
  107.         lea    __BSSBAS,a3        * get base of BSS
  108.         moveq    #0,d1
  109.         move.l    #__BSSLEN,d0        * get length of BSS in longwords
  110.         bra.s    clr_lp            * and clear for length given
  111. clr_bss        move.l    d1,(a3)+
  112. clr_lp        dbf    d0,clr_bss
  113.         move.l    a7,__StackPtr(A4)    * Save stack ptr
  114.         move.l    a6,_SysBase(A4)
  115.     ENDC
  116.     
  117.  
  118.     IFD    RESIDENT
  119.         movem.l    d2,-(a7)
  120.         movem.l a0-a2,-(a7)
  121.  
  122. *------        get the size of the stack, if CLI use cli_DefaultStack
  123.  
  124.         move.l    ThisTask(a6),A3
  125.         move.l    pr_CLI(A3),d1
  126.         lsl.l    #2,d1
  127.         move.l    d1,a0
  128.         move.l    cli_DefaultStack(a0),d1
  129.         lsl.l    #2,d1            * # longwords -> # bytes
  130.  
  131. dostack:
  132.         moveq    #0,d2            * use d2 as flag for newstack or not
  133.         move.l    #RESLEN,d0
  134.         cmp.l    __stack(a4),d1        * This a4 is in the original 
  135.                         * set of data
  136.         bcc.s    nochange    
  137.         move.l    __stack(a4),d1
  138.         add.l    d1,d0            * increase size of mem for new stack
  139.         moveq    #1,d2            * set flag
  140.         
  141. nochange:
  142.         move.l    d1,a3            * save stacksize to set up stack checking
  143.         move.l    #MEMFLAGS,d1
  144.         callsys AllocMem
  145.         tst.l    d0
  146.         bne.s    ok1
  147.         movem.l    (a7)+,d2/a0-a2
  148. *$* ACK!!!
  149. *$*        rts
  150. *$* ACK!!!
  151.  
  152. ok1:        move.l    d0,a0
  153.         move.l    d0,a2
  154.  
  155.     ;a2 now has difference
  156.         move.l    d0,a1
  157.         move.l    #NEWDATAL,d0
  158.         sub.l    #RESBASE,a4
  159.     ;copy data over
  160. cpy:        move.l    (a4)+,(a0)+
  161.         subq.l    #1,d0
  162.         bne.s    cpy
  163.     ;a4 now points at number of relocs
  164.         move.l    (a4)+,d0
  165. reloc:        beq.s    nreloc
  166.         move.l    a1,a0
  167.         add.l    (a4)+,a0        * a0 now has add of reloc
  168.         add.l    (a0),a2
  169.         move.l    a2,(a0) 
  170.         move.l    a1,a2            * restore offset
  171.         subq.l    #1,d0
  172.         bra.s    reloc
  173.  
  174. nreloc:        move.l    a1,a4            * set up new base register
  175.         add.l    #RESBASE,a4
  176.  
  177.         move.l    #RESLEN,realdatasize(a4)
  178.         movem.l (a7)+,a0-a2
  179.  
  180.         move.l    a6,_SysBase(A4)
  181.         tst.b    d2
  182.         movem.l    (a7)+,d2        * restore d2 
  183.         movem.l a7,__StackPtr(A4)    * Save stack ptr (movem doesn't
  184.                         * change flags
  185.         beq.s    nochg2
  186.  
  187. *------        set up new stack
  188.         move.l    a4,d0
  189.         sub.l    #RESBASE,d0
  190.         add.l    #RESLEN,d0
  191.         add.l    __stack(a4),d0        * here a4 will be pointing at the
  192.                         * new data, but _stack will be the
  193.                         * same if all goes well
  194.  
  195.         sub.l    #128,d0            * 128 down for good measure
  196.         move.l    d0,a7
  197.         move.l    __stack(a4),d0
  198.         move.l    d0,4(a7)        * fill in size of new stack    
  199.         add.l    d0,_realdatasize(a4)     * need to know how much to free later
  200.  
  201. nochg2:
  202. *------        Set _base for stack checking
  203.         move.l    a7,d1
  204.         sub.l    a3,d1            * get top of stack
  205.         add.l    #128,D1            * allow for parms overflow
  206.         move.l    D1,__base(A4)        * save for stack checking
  207.  
  208.     ENDC
  209.  
  210. clrwb:
  211.     clr.l    _WBenchMsg(A4)
  212.  
  213. *-----    clear any pending signals
  214.     moveq    #0,d0
  215.     move.l    #$00003000,d1
  216.     callsys    SetSignal
  217.     
  218.  
  219. *------ attempt to open DOS library:
  220.     lea    DOSName(PC),A1
  221.     moveq.l #0,D0
  222.     callsys OpenLibrary
  223.     move.l    D0,_DOSBase(A4)
  224.     bne.s    ok2
  225.     moveq.l #100,d0
  226.     bra.w    exit2
  227.  
  228. ok2:
  229. *=======================================================================
  230. *
  231. * Entry: D2 = command length
  232. *    A2 = Command pointer
  233.  
  234.     ifnd    RESIDENT        * we need to set _base if not resident
  235.         move.l    a7,D0        * get top of stack
  236.         sub.l    4(a7),D0    * compute bottom 
  237.         add.l    #128,D0        * allow for parms overflow
  238.         move.l    D0,__base(A4)    * save for stack checking
  239.     endc
  240.     
  241. *------ find command name:
  242.     move.l    ThisTask(a6),A3
  243.     move.l    pr_CLI(a3),a0
  244.     add.l    a0,a0        * bcpl pointer conversion
  245.     add.l    a0,a0
  246.     move.l    cli_CommandName(a0),a1
  247.     add.l    a1,a1        * bcpl pointer conversion
  248.     add.l    a1,a1
  249.  
  250. *------ collect parameters:
  251.     move.b    (a1)+,d0
  252.     move.l    a1,__ProgramName(A4)
  253.  
  254.  
  255.     move.l    d2,-(A7)        * push command line length
  256.     move.l    a2,-(A7)        * push command line address
  257.  
  258. *=============================================
  259. *------ common code --------
  260. *=============================================
  261.  
  262. main    jsr    ___fpinit(PC)        * Initialize floating point
  263.     jsr    __xmain(PC)        * call C entrypoint
  264.     moveq.l    #0,d0            * set successful status
  265.     bra.s    exit2
  266. *
  267.  
  268. _XCEXIT:
  269.     move.l    4(SP),d0        * extract return code
  270. _@XCEXIT:
  271. exit2:
  272.     move.l    d0,-(a7)
  273.     move.l    __ONEXIT(A4),d0        * exit trap function?
  274.     beq.s     exit3
  275.     move.l    d0,a0
  276.     jsr    (a0)
  277. exit3    move.l    __Children(a4),d0    * if we have any children
  278.     beq.s    exit4            *    orphan them
  279.     move.l    d0,a0
  280.     move.l    (a0),a0
  281.     jsr    (a0)
  282. exit4    jsr    _MemCleanup(PC)        * cleanup leftover memory alloc.
  283.     move.l    AbsExecBase.W,a6
  284.     move.l    _DOSBase(A4),a1
  285.     callsys CloseLibrary        * close Dos library
  286.  
  287.     jsr    ___fpterm(PC)        * clean up any floating point
  288.  
  289. *------ this rts sends us back to DOS:
  290. exitToDOS:
  291.     IFD    RESIDENT
  292.         move.l    realdatasize(a4),d0
  293.         move.l    a4,a1
  294.         sub.l    #RESBASE,a1
  295.         move.l    AbsExecBase.W,a6
  296.         move.l    (A7)+,d6
  297.         movea.l    __StackPtr(a4),a5
  298.         callsys    FreeMem
  299.         move.l    d6,d0
  300.         movea.l    a5,sp
  301.     ELSE
  302.         move.l    (A7)+,D0
  303.         movea.l    __StackPtr(a4),SP    * restore stack ptr
  304.     ENDC
  305.     
  306.     movem.l (a7)+,d1-d6/a0-a6
  307.     rts
  308.  
  309.  
  310. DOSName     dc.b    'dos.library',0
  311.  
  312.     section __MERGED,BSS
  313. *
  314.     xref    _DOSBase
  315.  
  316.     xdef    _NULL,_SysBase,_WBenchMsg
  317.     xdef    _curdir,__mbase,__mnext,__msize,__tsize
  318.     xdef    __oserr,__OSERR,__FPERR,__SIGFPE,__ONERR,__ONEXIT,__ONBREAK
  319.     xdef    __SIGINT
  320.     xdef    __ProgramName,__StackPtr,__base
  321.     xdef    __Children
  322.  
  323. *
  324.     ifd    RESIDENT
  325. realdatasize    ds.l    1    * size of memory allocated for data +
  326.                 * possible stack
  327.     endc
  328.     
  329. _NULL        ds.l    1    *
  330. __base        ds.l    1    * base of stack
  331. __mbase        ds.l    1    * base of memory pool
  332. __mnext        ds.l    1    * next available memory location
  333. __msize        ds.l    1    * size of memory pool
  334. __tsize        ds.l    1    * total size?
  335. __oserr        equ    *
  336. __OSERR        ds.l    1
  337. __FPERR        ds.l    1
  338. __SIGFPE    ds.l    1
  339. __SIGINT    ds.l    1
  340. __ONERR        ds.l    1
  341. __ONEXIT    ds.l    1
  342. __ONBREAK    ds.l    1
  343. _curdir         ds.l    1
  344. _SysBase    ds.l    1
  345. _WBenchMsg    ds.l    1
  346. __StackPtr    ds.l    1
  347. stdin        ds.l    1
  348. __ProgramName    ds.l    1
  349. __Children    ds.l    1
  350.         END
  351.