home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / newc_dev / ls40.lzh / src / mycres.a < prev    next >
Text File  |  1989-07-29  |  5KB  |  247 lines

  1. * mycres.a - Specialized C initial startup procedure under AmigaDOS
  2. * Adapted for LS use from c.a by Justin V. McCormick 89-05-12
  3. * Converted to CAPE 89-06-03
  4. *
  5.     IFD    CAPE            ; Special OP flags for CAPE
  6.  
  7.     CSYMFMT
  8.     BASEREG    B
  9.     SMALLOBJ
  10.     OPTIMON
  11.     ADDSYM
  12.     include "work:ipre.i"        ; A precompiled collection of the below...
  13.  
  14.     ELSE
  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    "workbench/startup.i"
  28.     INCLUDE    "exec/funcdef.i"
  29.     INCLUDE    "exec/exec_lib.i"
  30.     INCLUDE    "libraries/dos_lib.i"
  31.  
  32.     ENDC
  33.  
  34.     
  35. MEMFLAGS    EQU    MEMF_CLEAR+MEMF_PUBLIC
  36.  
  37. ; some usefull macros:
  38.  
  39. SYS    MACRO    *
  40.     IFGT    NARG-2
  41.     FAIL    !!!
  42.     ENDC
  43.     IFEQ    NARG-2
  44.     MOVE.L    \2,a6
  45.     ENDC
  46.     JSR    _LVO\1(a6)
  47.     ENDM
  48.     
  49.     XDEF    XCEXIT            ; exit(code) is standard way to leave C.
  50.     XDEF    @XCEXIT
  51.  
  52.     XREF    @myalloc
  53.     XREF    @myfree
  54.     XREF    @astrncpy        ; String copy routine
  55.     XREF    DOSBase
  56.     XREF    LinkerDB        ; linker defined base value
  57.     XREF    NEWDATAL
  58.     XREF    RESBASE
  59.     XREF    RESLEN
  60.     XREF    _BSSBAS            ; linker defined base of BSS
  61.     XREF    _BSSLEN            ; linker defined length of BSS
  62.     XREF    @_main            ; Name of C program to start with.
  63. ;    XREF    @MemCleanup        ; Free all allocated memory
  64.  
  65.     SECTION    CODE
  66. * --------------------------------------------------------------------- *
  67. start:
  68.     move.l    a0,a2            ; save command pointer
  69.     move.l    d0,d2            ; and command length
  70.     lea    LinkerDB,a4        ; load base register
  71.  
  72.     movem.l    d0-d1/a0-a2,-(sp)
  73.     sub.l    #RESBASE,a4
  74.     move.l    #RESLEN,d0
  75.     move.l    #MEMFLAGS,d1
  76.     SYS    AllocMem,4
  77.     tst.l    d0
  78.      bne    1$
  79.     movem.l    (sp)+,d0-d1/a0-a2
  80.     rts
  81.     
  82. 1$
  83.     move.l    d0,a0
  84.     move.l    d0,a2
  85.  
  86. ; a2 now has difference
  87.     move.l    d0,a1
  88.     move.l    #NEWDATAL,d0
  89. ; copy data over
  90. cpy:
  91.     move.l    (a4)+,(a0)+
  92.     subq.l    #1,d0
  93.     bne    cpy
  94. ; a4 now points at number of relocs
  95.     move.l    (a4)+,d0
  96. reloc:
  97.      beq.s    nreloc
  98.     move.l    a1,a0
  99.     add.l    (a4)+,a0        ; a0 now has add of reloc
  100.     add.l    (a0),a2
  101.     move.l    a2,(a0) 
  102.     move.l    a1,a2            ; restore offset
  103.     subq.l    #1,d0
  104.     bra    reloc
  105.  
  106. nreloc:
  107.      move.l    a1,A4            ; set up new base register
  108.     add.l    #RESBASE,A4
  109.     movem.l    (sp)+,d0-d1/a0-a2
  110.  
  111.     movea.l    4,a6
  112.     move.l    a6,SysBase(A4)
  113.     move.l    sp,_StackPtr(A4)    ; Save stack ptr
  114.  
  115. ; get the address of our task
  116.     move.l    ThisTask(a6),a3
  117.  
  118. ; clear any pending signals
  119.     moveq    #0,d0
  120.     move.l    #$00003000,d1
  121.     SYS    SetSignal
  122.     
  123. ; are we running as a son of Workbench?
  124.     tst.l    pr_CLI(a3)
  125.      bne.s    fromCLI
  126.  
  127. * --------------------------------------------------------------------- *
  128. * Workbench Startup Code
  129. fromWorkbench:
  130. ; wait for a message from our starter
  131.     lea    pr_MsgPort(a3),a0    ; our process base
  132.     SYS    WaitPort
  133.     lea    pr_MsgPort(a3),a0    ; our process base
  134.     SYS    GetMsg
  135.     move.l    d0,d2
  136.      beq.w    exitToDOS
  137.  
  138. ; return the startup message to our parent
  139. ; we forbid so workbench can't UnLoadSeg() us
  140. ; before we are done:
  141.     SYS    Forbid
  142.     movea.l    d2,a1
  143.     SYS    ReplyMsg
  144.     bra.w    exitToDOS
  145.  
  146. * --------------------------------------------------------------------- *
  147. * CLI Startup Code
  148. ; Entry: d2 = command length
  149. ;     a2 = Command pointer
  150. fromCLI:
  151. ; attempt to open DOS library:
  152.     lea    DOSName(PC),a1
  153.     moveq    #0,d0
  154.     SYS    OpenLibrary
  155.     move.l    d0,DOSBase(A4)
  156.      bne.s    1$
  157.     moveq    #100,d0
  158.     bra.s    exit2
  159. 1$
  160. ; find command name:
  161.     move.l    pr_CLI(a3),a3
  162.     add.l    a3,a3            ; bcpl pointer conversion
  163.     add.l    a3,a3
  164.     move.l    cli_CommandName(a3),a3
  165.     add.l    a3,a3            ; bcpl pointer conversion
  166.     add.l    a3,a3
  167.  
  168. ; collect parameters:
  169.     move.l    d2,d0            ; get command line length
  170.     moveq.l #0,d1
  171.     move.b    (a3)+,d1
  172.     add.l    d1,d0            ; add length of command name
  173.     addq.l    #1,d0            ; allow for space after command 
  174.     jsr    @myalloc        ; allocate enough space for whole cmd line
  175.     tst.l    d0
  176.      beq.s    closeDOS        ; Oops, allocate failed
  177.     move.l    d0,_CmdLine(A4)
  178.  
  179. ; copy command name into allocated space
  180.     movea.l    a3,a1
  181.     movea.l    d0,a0
  182.     moveq    #0,d0
  183.     move.b    -1(a3),d0
  184.     jsr    @astrncpy
  185.  
  186. ; insert a space unless command itself is the only argument
  187.     cmpi.w    #2,d2
  188.      bcs.s    2$
  189.     move.b    #' ',(a0)+
  190.     
  191. ; Append/copy command line into allocated space
  192.     move.l    d2,d0
  193.     movea.l    a2,a1
  194.     jsr    @astrncpy
  195. 2$
  196.     movea.l    _CmdLine(A4),a0        ; push command line address
  197.  
  198. * --------------------------------------------------------------------- *
  199. * Call @_main
  200. main:
  201.     jsr    @_main            ; call C entrypoint
  202.     moveq.l #0,d0            ; set successful status
  203.     bra.s    exit2
  204. XCEXIT:
  205.     move.l    4(sp),d0        ; extract exit return code
  206. @XCEXIT:
  207. exit2:
  208.     move.l    d0,-(sp)        ; Save exit return status
  209.  
  210.     movea.l    _CmdLine(A4),a0
  211.     jsr    @myfree            ; Free command line
  212.  
  213. ;    jsr    @MemCleanup        ; Free malloced resources
  214.  
  215. closeDOS:
  216. ; Close the DOS library
  217.     move.l    DOSBase(A4),a1
  218.     SYS    CloseLibrary,4        ; close Dos library
  219.  
  220. ; this rts sends us back to DOS:
  221. exitToDOS:
  222.     move.l    #RESLEN,d0
  223.     movea.l    A4,a1
  224.     suba.l    #RESBASE,a1
  225.     move.l    (sp)+,d7        ; Grab exit return code
  226.     movea.l _StackPtr(A4),sp    ; restore stack ptr
  227.     SYS    FreeMem,4
  228.     move.l    d7,d0            ; Put exit return code in d0
  229.     rts
  230.  
  231. *-----------------------------------------------------------------------
  232. DOSName    dc.b    'dos.library',0
  233.  
  234.  
  235.     SECTION _MERGED,BSS
  236. * --------------------------------------------------------------------- *
  237.     XDEF    _CmdLine
  238.     XDEF    SysBase
  239.     XDEF    _StackPtr
  240. _CmdLine:
  241.     ds.b    4
  242. SysBase:
  243.     ds.b    4
  244. _StackPtr
  245.     ds.b    4
  246.     END
  247.