home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / bbs / comm / cyberpager-1.5.lha / CyberPager / source / startup / startup.a
Text File  |  1993-06-17  |  4KB  |  249 lines

  1.  INCLUDE "exec/types.i"
  2.  INCLUDE "exec/execbase.i"
  3.  INCLUDE "exec/memory.i"
  4.  INCLUDE "libraries/dosextens.i"
  5.  
  6.  XREF @main
  7.  
  8.  XREF _LVOOpenLibrary
  9.  XREF _LVOOldOpenLibrary
  10.  XREF _LVOCloseLibrary
  11.  XREF _LVOSetSignal
  12.  XREF _LVOForbid
  13.  XREF _LVOWaitPort
  14.  XREF _LVOGetMsg
  15.  XREF _LVOReplyMsg
  16.  XREF _LVOSetIoErr
  17.  XREF _LVOAllocVec
  18.  XREF _LVOFreeVec
  19.  XREF _LVOOutput
  20.  XREF _LVOWrite
  21.  
  22.  XREF _LinkerDB
  23.  XREF __BSSBAS
  24.  XREF __BSSLEN
  25.  XREF _RESLEN
  26.  XREF _RESBASE
  27.  XREF _NEWDATAL
  28.  
  29. LIBCALL    MACRO
  30.     jsr _LVO\1(a6)
  31.     ENDM
  32.  
  33.   SECTION StartCode,CODE
  34.  
  35.     bra.s    init
  36.  
  37. ; copyright message
  38.     dc.b "Copyright ",$A9," 1993 by Christopher A. Wichura",0
  39.     dc.b "All rights reserved.",0
  40.  
  41. init:
  42.     movem.l    d0/a0,-(sp)
  43.  
  44. ; first off we will check for our workbench message, if any.  we will store
  45. ; the pointer to it in d7 temporarily until we actually copy the data
  46. ; segment over.  otherwise we wouldn't be residentiable.
  47.  
  48.     moveq    #0,d7        ; clear out longword
  49.  
  50. ; get address of our task
  51.     move.l    (4.w),a6
  52.     move.l    ThisTask(a6),a3
  53.  
  54. ; clear any pending signals
  55.     moveq    #0,d0
  56.     move.l    #$00003000,d1
  57.     LIBCALL    SetSignal
  58.  
  59. ; check for workbench message
  60.     tst.l    pr_CLI(a3)
  61.     bne.s    FromCLI
  62.  
  63.     lea    pr_MsgPort(a3),a0
  64.     LIBCALL    WaitPort
  65.     lea    pr_MsgPort(a3),a0
  66.     LIBCALL    GetMsg
  67.     move.l    d0,d7
  68.  
  69. FromCLI:
  70.     lea    DOSlib(pc),a1
  71.     moveq    #37,d0
  72.     LIBCALL    OpenLibrary
  73.     tst.l    d0
  74.     bne.s    DoMain
  75.  
  76.     lea    DOSlib(pc),a1
  77.     LIBCALL    OldOpenLibrary
  78.     tst.l    d0
  79.     beq.s    bomb
  80.  
  81.     move.l    d0,a6
  82.     LIBCALL    Output
  83.     move.l    d0,d1
  84.     beq.s    bomb
  85.  
  86.     lea    Msg1(pc),a0
  87.     move.l    a0,d2
  88.     moveq    #Msg1Len,d3
  89.     LIBCALL    Write
  90.  
  91.     move.l    a6,a1
  92.     move.l    (4.w),a6
  93.     LIBCALL    CloseLibrary
  94.  
  95. bomb:    addq.l    #8,sp        ; pop d0/a0 off stack
  96.  
  97.     move.l    d7,d0        ; check if we have a workbench startup
  98.     bsr    ReplyWB        ; message and reply it if so
  99.  
  100.     moveq    #0,d0
  101.     rts
  102.  
  103. DoMain:
  104.     move.l    d0,-(sp)
  105.  
  106.     lea    _LinkerDB,a4
  107.     sub.l    #_RESBASE,a4
  108.  
  109. ; get mem to hold data and bss stuff
  110.     move.l    #_RESLEN,d0
  111.     move.l    #MEMF_PUBLIC+MEMF_CLEAR,d1
  112.     LIBCALL    AllocVec
  113.     tst.l    d0
  114.     bne.s    gotmem
  115.  
  116. ; no mem available so bomb out
  117.     move.l    d7,d0        ; check for wb startup message and reply
  118.     bsr    ReplyWB        ; it if present
  119.  
  120.     move.l    (sp)+,a6    ; get dos base
  121.     addq.l    #8,sp        ; pop d0/a0 off of stack
  122.  
  123.     moveq    #ERROR_NO_FREE_STORE,d1
  124.     LIBCALL    SetIoErr
  125.  
  126.     move.l    a6,a1
  127.     move.l    (4.w),a6
  128.     LIBCALL    CloseLibrary
  129.  
  130.     moveq    #20,d0
  131.     rts
  132.  
  133. ; get ready to copy data over into freshly alloced data area
  134. gotmem:    move.l    d0,a0
  135.     move.l    d0,a2
  136.  
  137.     move.l    d0,a1
  138.     move.l    #_NEWDATAL,d0
  139. cpy:    move.l    (a4)+,(a0)+
  140.     subq.l    #1,d0
  141.     bne.s    cpy
  142.  
  143. ; now do the relocs for resident data
  144.     move.l    (a4)+,d0
  145. reloc:    beq.s    nreloc
  146.     move.l    a1,a0
  147.     add.l    (a4)+,a0
  148.     add.l    (a0),a2
  149.     move.l    a2,(a0)
  150.     move.l    a1,a2
  151.     subq.l    #1,d0
  152.     bra.s    reloc
  153.  
  154. nreloc:    move.l    a1,a4
  155.     add.l    #_RESBASE,a4
  156.  
  157.     BASEREG    a4
  158.  
  159. ; stash some important junk away
  160.     move.l    (sp)+,_DOSBase(a4)
  161.     move.l    d7,_WBenchMsg(a4)
  162.  
  163.     move.l    (4.w),a6
  164.     move.l    a6,_SysBase(a4)
  165.  
  166. ; call our main program.  we call the main routine with the following
  167. ; arguments:
  168. ;
  169. ;   d0 = length of command line
  170. ;   a0 = pointer to command line
  171. ;   a1 = pointer to workbench startup message (or NULL)
  172.  
  173.     movem.l    (sp)+,d0/a0
  174.     movem.l    sp,__StackPtr(a4)
  175.  
  176.     movea.l    d7,a1
  177.     jsr    @main
  178.     moveq    #0,d0
  179.     bra.s    Exit
  180.  
  181.  XDEF __XCEXIT
  182. __XCEXIT:
  183.     move.l    4(sp),d0
  184.  XDEF @_XCEXIT
  185. @_XCEXIT:
  186.  
  187. Exit:    move.l    d0,d3            ; save return code in safe place
  188.  
  189.     move.l    _WBenchMsg(a4),d0    ; check if we need to reply the
  190.     bsr    ReplyWB            ; workbench startup message
  191.  
  192.     move.l    _DOSBase(a4),a6
  193.     moveq    #0,d1
  194.     LIBCALL    SetIoErr
  195.  
  196.     move.l    a6,a1
  197.     move.l    (4.w),a6
  198.     LIBCALL    CloseLibrary
  199.  
  200.     movea.l    __StackPtr(a4),sp
  201.  
  202.     move.l    a4,a1
  203.     sub.l    #_RESBASE,a1
  204.     LIBCALL    FreeVec
  205.  
  206.     move.l    d3,d0            ; restore return code
  207.     rts
  208.  
  209. ; this subroutine is called when we try to check if we need to reply
  210. ; the workbench message.  This is done because we do this in more than
  211. ; one place.
  212.  
  213. ReplyWB:
  214.     move.l    d0,d2
  215.     beq.s    1$
  216.  
  217.     move.l    (4.w),a6
  218.     LIBCALL    Forbid
  219.     movea.l    d2,a1
  220.     LIBCALL    ReplyMsg
  221.  
  222. 1$    rts
  223.  
  224. ; ---- This is the data we need for the startup module.  we don't put it in
  225. ;      a data segment, though, or it would end up being copied over when we
  226. ;      clone the data hunk and this stuff isn't needed anywhere else...
  227.  
  228. DOSlib    dc.b "dos.library",0
  229.  
  230. Msg1    dc.b "You need KickStart V37 or greater.",10,0
  231. Msg1Len    EQU *-Msg1
  232.     ds.w 0
  233.  
  234. ; ---- This is the BBS segment that holds various startup junk for us.
  235.  
  236.    SECTION __MERGED,DATA
  237.  
  238.  XDEF _DOSBase
  239.  XDEF _SysBase
  240.  XDEF _WBenchMsg
  241.  XDEF __StackPtr
  242.  
  243. _DOSBase    dc.l 0
  244. _SysBase    dc.l 0
  245. _WBenchMsg    dc.l 0
  246. __StackPtr    dc.l 0
  247.  
  248.    END
  249.