home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / BK-SC1_1.DMS / in.adf / Source.Lha / Startup-Code / near_a6startup.asm < prev    next >
Encoding:
Assembly Source File  |  1996-02-23  |  3.2 KB  |  218 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 startup code is not of much use because the small datamodel a6 is
  11. ; mainly created for shared library programming
  12.  
  13.     XDEF _exit
  14.     XDEF abort__STANDARD
  15.     XDEF _SysBase
  16.     
  17.     XREF _InitModules
  18.     XREF _CleanupModules
  19.     XREF main_
  20.     XREF wbmain__P09WBStartup
  21.  
  22.     XREF _LinkerDB
  23.     XREF __OFFSET
  24.     XREF __BSSBAS
  25.     XREF __BSSLEN
  26.     XREF RESIDENT
  27.     XREF _DDSIZE
  28.     XREF _DDTABLE
  29.     XREF __DATALEN
  30.     
  31.     TTL "NEAR_A6"
  32.     
  33. Forbid        = -132
  34. GetMsg        = -372
  35. ReplyMsg    = -378
  36. WaitPort    = -384
  37.  
  38.     SECTION "startup",CODE
  39.  
  40.     NEAR a6,-1
  41.  
  42.     move.l 4.w,a6
  43.     move.l a7,a5         ; stackframe for _exit
  44.  
  45.     move.l $114(a6),a1      ; ThisTask
  46.     tst.l $AC(a1)
  47.     bne .cli
  48.     
  49.     ; Run from Workbench
  50.     lea $5C(a1),a0
  51.     move.l a0,-(a7)
  52.     jsr WaitPort(a6)
  53.     move.l (a7)+,a0
  54.     jsr GetMsg(a6)
  55.     move.l a6,-(a7)
  56.     move.l d0,-(a7)
  57.     bsr initNearData
  58.     move.l (a7)+,StartupMessage(a6)
  59.     move.l (a7)+,_SysBase(a6)
  60.     move.l a5,returnAddress(a6)
  61.     jsr _InitModules
  62.     move.l StartupMessage(a6),-(a7)
  63.     jsr wbmain__P09WBStartup
  64.     addq.l #4,a7
  65.     jsr _CleanupModules
  66.     move.l _SysBase(a6),a4
  67.     move.l StartupMessage(a6),-(a7)
  68.     bsr exitNearData
  69.     jsr Forbid(a6)
  70.     move.l (a7)+,a1
  71.     jsr ReplyMsg(a6)
  72.     moveq #0,d0
  73.     rts
  74.  
  75. .cli
  76.     move.l a0,-(a7)
  77.     move.l d0,-(a7)
  78.     move.l a6,-(a7)
  79.     bsr initNearData
  80.     move.l (a7)+,_SysBase(a6)
  81.     move.l a5,returnAddress(a6)
  82.     jsr _InitModules
  83.     jsr main_
  84.     addq.l #8,a7
  85.     move.l d0,-(a7)
  86.     jsr _CleanupModules
  87.     move.l _SysBase(a6),a4
  88.     bsr exitNearData
  89.     move.l (a7)+,d0
  90.     rts
  91.  
  92. initNearData
  93. ; _SysBase is in a6, a6 gets _LinkerDB
  94.     moveq #RESIDENT,d0
  95.     bne .resident
  96.     move.l #__BSSLEN,d0
  97.     lea __BSSBAS,a0
  98.     bra .1
  99. .l1
  100.     clr.l (a0)+
  101. .1
  102.     dbf d0,.l1
  103.     lea _LinkerDB,a6
  104.     rts
  105. .resident
  106.     ; alloc DATA/BSS Hunk 
  107.     move.l #__DATALEN,d0
  108.     add.l #__BSSLEN,d0
  109.     lsl.l #2,d0
  110.     moveq #0,d1
  111.     jsr -198(a6) ; AllocMem
  112.     tst.l d0
  113.     beq .nomem
  114.     move.l d0,a4
  115.  
  116.     ; copy DATA
  117.     lea _LinkerDB,a0
  118.     sub.l #__OFFSET,a0
  119.     move.l d0,a1
  120.     move.l #__DATALEN,d0
  121.     lsl.l #2,d0
  122.     jsr -630(a6) ; CopyMemQuick
  123.  
  124.     ; reloc DATA
  125.     move.l #_DDSIZE,d0
  126.     lea _DDTABLE,a0
  127.     bra .2
  128. .l2
  129.     move.l (a0)++,d1
  130.     lsl.l #2,d1
  131.     add.l a4,d1
  132.     move.l d1,a1
  133.     move.l (a1),d1
  134.     add.l a4,d1
  135.     move.l d1,(a1)
  136. .2
  137.     dbf d0,.l2
  138.  
  139.     ; clear BSS
  140.     move.l a4,a0
  141.     move.l #__DATALEN,d0
  142.     lsl.l #2,d0
  143.     add.l d0,a0
  144.     move.l #__BSSLEN,d0
  145.     bra .3
  146. .l3
  147.     clr.l (a0)++
  148. .3
  149.     dbf d0,.l3
  150.  
  151.     move.l a4,a6
  152.     add.l #__OFFSET,a6
  153.     rts
  154. .nomem
  155.     move.l a5,a7
  156.     move.l #999,d0
  157.     rts
  158.  
  159. exitNearData
  160. ; _SysBase is in a4, is moved to a6
  161.     moveq #RESIDENT,d0
  162.     beq .notresident
  163.     move.l a6,a1
  164.     sub.l #__OFFSET,a1
  165.     move.l #__DATALEN,d0
  166.     add.l #__BSSLEN,d0
  167.     lsl.l #2,d0
  168.     move.l a4,a6
  169.     jsr -210(a6) ; FreeMem
  170. .notresident
  171.     rts
  172.  
  173.     SECTION "exit",CODE
  174.  
  175. _exit
  176.     move.l 4(a7),d0
  177.     move.l returnAddress(a6),a7
  178.     move.l d0,-(a7)
  179.     jsr _CleanupModules
  180.     move.l StartupMessage(a6),-(a7)
  181.     move.l _SysBase(a6),a4
  182.     jsr exitNearData
  183.     move.l (a7)+,d2
  184.     beq .nowb
  185.     jsr Forbid(a6)
  186.     move.l d2,a1
  187.     jsr ReplyMsg(a6)
  188. .nowb
  189.     move.l (a7)+,d0
  190.     rts
  191.  
  192.     SECTION "abort_STANDARD",CODE
  193.  
  194. abort__STANDARD
  195.     move.l returnAddress(a6),a7
  196.     move.l StartupMessage(a6),-(a7)
  197.     move.l _SysBase(a6),a4
  198.     jsr exitNearData
  199.     move.l (a7)+,d2
  200.     beq .nowb
  201.     jsr Forbid(a6)
  202.     move.l d2,a1
  203.     jsr ReplyMsg(a6)
  204. .nowb
  205.     moveq #20,d0
  206.     rts
  207.  
  208.     SECTION "startupd",DATA
  209.  
  210. _SysBase
  211.     dc.l 0
  212. returnAddress
  213.     dc.l 0
  214. StartupMessage
  215.     dc.l 0
  216.  
  217.     END
  218.