home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / BK-SC1_1.DMS / in.adf / Source.Lha / Startup-Code / nearstartup.asm < prev    next >
Encoding:
Assembly Source File  |  1996-02-23  |  3.2 KB  |  211 lines

  1.  
  2. ; StormC Startupcode
  3. ; $VER StormC Startupcode 1.05 (21.02.95)
  4.  
  5. ; Copyright HAAGE & PARTNER Computer GmbH
  6.  
  7. ; datamodel: NEAR
  8. ; codemodel: FAR
  9.  
  10. ; This is a minimal startup code for residentable programs.
  11.  
  12.     XDEF _exit
  13.     XDEF abort__STANDARD
  14.     XDEF _SysBase
  15.     
  16.     XREF _InitModules
  17.     XREF _CleanupModules
  18.     XREF main_
  19.     XREF wbmain__P09WBStartup
  20.  
  21.     XREF _LinkerDB
  22.     XREF __OFFSET
  23.     XREF __BSSBAS
  24.     XREF __BSSLEN
  25.     XREF RESIDENT
  26.     XREF _DDSIZE
  27.     XREF _DDTABLE
  28.     XREF __DATALEN
  29.     
  30.     TTL "NEAR"
  31.     
  32. Forbid        = -132
  33. GetMsg        = -372
  34. ReplyMsg    = -378
  35. WaitPort    = -384
  36.  
  37.     SECTION "startup",CODE
  38.  
  39.     NEAR a4,-1
  40.  
  41.     move.l 4.w,a6
  42.     move.l a7,a5         ; stackframe for _exit
  43.  
  44.     move.l $114(a6),a1      ; ThisTask
  45.     tst.l $AC(a1)
  46.     bne .cli
  47.     
  48.     ; Run from Workbench
  49.     lea $5C(a1),a0
  50.     move.l a0,-(a7)
  51.     jsr WaitPort(a6)
  52.     move.l (a7)+,a0
  53.     jsr GetMsg(a6)
  54.     move.l d0,-(a7)
  55.     bsr initNearData
  56.     move.l (a7)+,StartupMessage(a4)
  57.     move.l a6,_SysBase(a4)
  58.     move.l a5,returnAddress(a4)
  59.     jsr _InitModules
  60.     move.l StartupMessage(a4),-(a7)
  61.     jsr wbmain__P09WBStartup
  62.     addq.l #4,a7
  63.     jsr _CleanupModules
  64.     move.l _SysBase(a4),a6
  65.     move.l StartupMessage(a4),-(a7)
  66.     bsr exitNearData
  67.     jsr Forbid(a6)
  68.     move.l (a7)+,a1
  69.     jsr ReplyMsg(a6)
  70.     moveq #0,d0
  71.     rts
  72.  
  73. .cli
  74.     move.l a0,-(a7)
  75.     move.l d0,-(a7)
  76.     bsr initNearData
  77.     move.l a6,_SysBase(a4)
  78.     move.l a5,returnAddress(a4)
  79.     jsr _InitModules
  80.     jsr main_
  81.     addq.l #8,a7
  82.     move.l d0,-(a7)
  83.     jsr _CleanupModules
  84.     move.l _SysBase(a4),a6
  85.     bsr exitNearData
  86.     move.l (a7)+,d0
  87.     rts
  88.  
  89. initNearData
  90.     moveq #RESIDENT,d0
  91.     bne .resident
  92.     move.l #__BSSLEN,d0
  93.     lea __BSSBAS,a0
  94.     bra .1
  95. .l1
  96.     clr.l (a0)+
  97. .1
  98.     dbf d0,.l1
  99.     lea _LinkerDB,a4
  100.     rts
  101. .resident                            ; copy DATA/BSS
  102.     ; alloc DATA/BSS hunk
  103.     move.l #__DATALEN,d0
  104.     add.l #__BSSLEN,d0
  105.     lsl.l #2,d0
  106.     moveq #0,d1
  107.     jsr -198(a6) ; AllocMem
  108.     tst.l d0
  109.     beq .nomem
  110.     move.l d0,a4
  111.  
  112.     ; copy DATA
  113.     lea _LinkerDB,a0
  114.     sub.l #__OFFSET,a0
  115.     move.l d0,a1
  116.     move.l #__DATALEN,d0
  117.     lsl.l #2,d0
  118.     jsr -630(a6) ; CopyMemQuick
  119.  
  120.     ; reloc DATA
  121.     move.l #_DDSIZE,d0
  122.     lea _DDTABLE,a0
  123.     bra .2
  124. .l2
  125.     move.l (a0)++,d1
  126.     lsl.l #2,d1
  127.     add.l a4,d1
  128.     move.l d1,a1
  129.     move.l (a1),d1
  130.     add.l a4,d1
  131.     move.l d1,(a1)
  132. .2
  133.     dbf d0,.l2
  134.  
  135.     ; clear BSS
  136.     move.l a4,a0
  137.     move.l #__DATALEN,d0
  138.     lsl.l #2,d0
  139.     add.l d0,a0
  140.     move.l #__BSSLEN,d0
  141.     bra .3
  142. .l3
  143.     clr.l (a0)++
  144. .3
  145.     dbf d0,.l3
  146.  
  147.     add.l #__OFFSET,a4         ; NEVER trash a4, you can't load again
  148.     rts
  149. .nomem
  150.     move.l a5,a7
  151.     move.l #999,d0
  152.     rts
  153.  
  154. exitNearData
  155.     moveq #RESIDENT,d0
  156.     beq .notresident
  157.     move.l a4,a1                ; a4 MUST still point to DATA hunk
  158.     sub.l #__OFFSET,a1
  159.     move.l #__DATALEN,d0
  160.     add.l #__BSSLEN,d0
  161.     lsl.l #2,d0
  162.     jsr -210(a6) ; FreeMem
  163. .notresident
  164.     rts
  165.  
  166.     SECTION "exit",CODE
  167.  
  168. _exit
  169.     move.l 4(a7),d0
  170.     move.l returnAddress(a4),a7
  171.     move.l d0,-(a7)
  172.     jsr _CleanupModules
  173.     move.l StartupMessage(a4),-(a7)
  174.     move.l _SysBase(a4),a6
  175.     jsr exitNearData
  176.     move.l (a7)+,d2
  177.     beq .nowb
  178.     jsr Forbid(a6)
  179.     move.l d2,a1
  180.     jsr ReplyMsg(a6)
  181. .nowb
  182.     move.l (a7)+,d0
  183.     rts
  184.  
  185.     SECTION "abort_STANDARD",CODE
  186.  
  187. abort__STANDARD
  188.     move.l returnAddress(a4),a7
  189.     move.l StartupMessage(a4),-(a7)
  190.     move.l _SysBase(a4),a6
  191.     jsr exitNearData
  192.     move.l (a7)+,d2
  193.     beq .nowb
  194.     jsr Forbid(a6)
  195.     move.l d2,a1
  196.     jsr ReplyMsg(a6)
  197. .nowb
  198.     moveq #20,d0
  199.     rts
  200.  
  201.     SECTION "startupd",DATA
  202.  
  203. _SysBase
  204.     dc.l 0
  205. returnAddress
  206.     dc.l 0
  207. StartupMessage
  208.     dc.l 0
  209.  
  210.     END
  211.