home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_01 / LATTIC_3.LZH / SRC / C.S < prev    next >
Text File  |  1990-06-26  |  13KB  |  869 lines

  1. **
  2. ** c.s - Lattice C 5 startup routine
  3. **
  4. ** Started 19/8/89 Alex G. Kiernan
  5. **
  6. ** Copyright (c) 1990 HiSoft
  7. **
  8.  
  9. **
  10. ** Flags    Use
  11. ** =====    ===
  12. ** AUTO        Auto-detect program type
  13. ** DA        Desk Accessory
  14. ** GST        GST Format mods
  15. ** NOALVS    Use no external PC-relative code
  16. ** NOBASER    Use no base-relative code
  17. ** REGARGS    Use register calling conventions
  18. ** RESIDENT    Allow program to be resident
  19. ** SHORTINT    Use default short integers
  20. **
  21.     include    basepage.i
  22.     include    gemdos.i
  23.     include    sysvar.i
  24.  
  25.     xdef    ___start
  26.     
  27.     xref    __STACK,__STKDELTA,__BLKSIZ
  28.     xref    @_setargv,__MSTEP,__MemHeap
  29.     xref    __VDIinit,__FPCinit,__ENEED,__MNEED
  30.     xref    __DATALEN,__BSSLEN,__DATABAS,__RESBASE
  31.  
  32.     xdef    __pbase,__tos,__base,__clkstart
  33.     xdef    _errno,__oserr,__OSERR,__country
  34.     xdef    __saveD2A2,__savePC
  35.     xdef    __msiz,__mblk,__maxblk
  36.  
  37.     IFD    AUTO
  38.     xdef    __XMODE
  39.     
  40.     xref    __AESpb,__AEScontrol,__AESglobal,__AESintin,__AESintout
  41.     xref    __AESaddrin,__AESaddrout
  42.     IFD    REGARGS
  43.     xref    @appl_exit
  44.     ELSE
  45.     xref    _appl_exit
  46.     ENDC
  47.     ENDC
  48.     
  49.     IFND    DA
  50.     xdef    _environ,__ENVC,__onbrk
  51.     IFD    REGARGS
  52.     xref    @_main
  53.     ELSE
  54.     xref    __main
  55.     ENDC
  56.     ELSE
  57.     xref    __DAHeap
  58.     IFD    REGARGS
  59.     xref    @main
  60.     ELSE
  61.     xref    _main
  62.     ENDC
  63.     ENDC
  64.     
  65.     IFD    REGARGS
  66.     xdef    @_XCEXIT
  67.     ELSE
  68.     xdef    __XCEXIT
  69.     ENDC
  70.  
  71.     CSECT    code,0
  72.  
  73.     IFD    GST
  74.     xdef    __LinkerDB
  75.     ELSE
  76.     xref    __LinkerDB
  77.     ENDC
  78.  
  79. ___start
  80.     IFD    AUTO
  81.     moveq    #2,d4
  82.     move.l    a0,a2
  83.     move.l    a0,d0
  84.     bne.s    isada
  85.     ENDC
  86.  
  87.     IFD    DA
  88.     move.l    #stack,a7
  89.     move.l    a0,a2
  90.     ELSE
  91.     move.l    4(a7),a2        get program base page
  92.     ENDC
  93.     
  94.     IFD    RESIDENT        we're resident so we've some work to do
  95.  
  96. ;    moveq    #4,d4            assume we are resident
  97.     move.l    a2,a1
  98.     lea    $100(a1),a1
  99.     lea    __DATABAS,a0
  100.     lea    ___start(pc),a3
  101.     cmp.l    a3,a1
  102.     bne.s    gotram
  103.  
  104. ;    moveq    #0,d4            until we know we're not resident
  105.     
  106.     add.l    p_tlen(a2),a1        add size of text
  107.     add.l    p_dlen(a2),a1        add size of data
  108.     
  109. gotram    move.l    a1,a3
  110.     
  111.     move.l    #__DATALEN,d0        copy the static data
  112.     bra.s    dfirst
  113.     
  114. dloop    move.l    (a0)+,(a1)+
  115. dfirst    dbf    d0,dloop
  116.  
  117. zerbss    move.l    #__BSSLEN,d0        zero the bss
  118.     moveq    #0,d1
  119.     bra.s    bfirst
  120.  
  121. bloop    move.l    d1,(a1)+
  122. bfirst    dbf    d0,bloop
  123.  
  124.     move.l    (a0)+,d0        fetch the relocation word
  125.     bmi.s    allind
  126.     move.l    a3,d3
  127.     add.l    d0,a3
  128.  
  129.     moveq    #127,d2            and step through a GEMDOS relocation table
  130.     add.w    d2,d2
  131.     
  132. addnxt    add.l    d3,(a3)            relocate a longword
  133.  
  134. nextb    move.b    (a0)+,d1        get relocation offset
  135.     beq.s    allind
  136.     cmp.b    #1,d1            check for jumps
  137.     bne.s    isnorm
  138.     add.w    d2,a3
  139.     bra.s    nextb
  140. isnorm    add.w    d1,a3
  141.     bra.s    addnxt
  142. allind
  143.     move.l    d3,a4
  144.     add.l    #__RESBASE,a4
  145.     move.l    a1,a3
  146.  
  147.     ELSE
  148.  
  149.     lea    __LinkerDB,a4
  150.  
  151.     IFD    AUTO
  152.     moveq    #0,d4
  153.     bra.s    notada
  154. isada    
  155.     lea    __LinkerDB,a4
  156.  
  157.     move.l    #isada2,a7
  158.  
  159.     IFD    NOBASER
  160.     move.l    #___start,__base
  161.     ELSE
  162.     move.l    #___start,__base(a4)
  163.     ENDC
  164.  
  165. notada
  166.     ENDC
  167.  
  168.     IFD    DA
  169.     IFD    NOBASER
  170.     move.l    #base,__base
  171.     ELSE
  172.     move.l    #base,__base(a4)
  173.     ENDC
  174.     ENDC
  175.  
  176.     ENDC
  177.     
  178.     IFD    NOBASER
  179.     move.l    a2,__pbase        put it somewhere so user can get to it
  180.     ELSE
  181.     move.l    a2,__pbase(a4)
  182.     ENDC
  183.  
  184.     clr.l    -(a7)
  185.     move.w    #$20,-(a7)
  186.     trap    #1
  187.  
  188.     IFD    NOBASER
  189.     move.l    (_hz_200).w,__clkstart        start time for clock()
  190.     ELSE
  191.     move.l    (_hz_200).w,__clkstart(a4)
  192.     ENDC
  193.     
  194.     move.l    (_sysbase).w,a0        get _sysbase
  195.     move.l    8(a0),a0        get os_beg
  196.     
  197.     IFD    NOBASER
  198.     move.w    2(a0),__tos        fetch TOS version number
  199.     ELSE
  200.     move.w    2(a0),__tos(a4)        fetch TOS version number
  201.     ENDC
  202.  
  203.     move.w    $1c(a0),d1
  204.     lsr.w    #1,d1
  205.     
  206.     IFD    NOBASER
  207.     IFD    SHORTINT
  208.     move.w    d1,__country
  209.     ELSE
  210.     move.w    d1,__country+2
  211.     ENDC
  212.     ELSE
  213.     IFD    SHORTINT
  214.     move.w    d1,__country(a4)
  215.     ELSE
  216.     move.w    d1,__country+2(a4)
  217.     ENDC
  218.     ENDC
  219.     
  220.     IFND    DA
  221.     clr.l    ($380).w        so we can spot exceptions
  222.     ENDC
  223.     
  224.     move.l    d0,2(a7)
  225.     move.w    #$20,(a7)
  226.     trap    #1
  227.  
  228.     IFND    DA
  229.     IFD    AUTO
  230.     cmp.b    #2,d4
  231.     beq    isada2
  232.     ENDC
  233.     IFND    RESIDENT
  234.     move.l    p_bbase(a2),a1        fetch bss base
  235.     add.l    p_blen(a2),a1        add size of bss
  236.     ELSE
  237.     move.l    a3,a1
  238.     ENDC
  239.     
  240.     IFD    NOBASER
  241.     move.l    a1,_environ        give user environ variable
  242.     ELSE
  243.     move.l    a1,_environ(a4)
  244.     ENDC
  245.     
  246.     lea.l    p_cmdlin(a2),a0
  247.     cmp.b    #$7f,(a0)        Atari extended command line flag
  248.     seq    d7
  249.     
  250.     move.l    p_env(a2),a5
  251.     tst.b    (a5)            ;;;;;
  252.     bne.s    chk_env            ;;;;;
  253.     tst.b    1(a5)
  254.     beq    envread
  255.     addq.w    #1,a5
  256. chk_env
  257.     tst.b    (a5)
  258.     beq    envread
  259.     move.l    a5,(a1)+
  260.  
  261.     IFD    SHORTINT
  262.     IFD    NOBASER
  263.     addq.w    #1,__ENVC
  264.     ELSE
  265.     addq.w    #1,__ENVC(a4)
  266.     ENDC    
  267.     ELSE
  268.     IFD    NOBASER
  269.     addq.l    #1,__ENVC
  270.     ELSE
  271.     addq.l    #1,__ENVC(a4)
  272.     ENDC    
  273.     ENDC
  274.     
  275. ;    tst.b    d7
  276. ;    beq    nt_argv
  277.     cmp.b    #'A',(a5)        try for a match with ARGV=
  278.     bne.s    nt_argv
  279.     move.l    a5,a3
  280.     addq.w    #1,a5
  281.     cmp.b    #'R',(a5)+
  282.     bne    nt_pbp
  283.     cmp.b    #'G',(a5)+
  284.     bne    nt_pbp
  285.     cmp.b    #'V',(a5)+
  286.     bne    nt_pbp
  287.     cmp.b    #'=',(a5)+
  288.     bne    nt_pbp
  289.     
  290.     moveq    #0,d0
  291.     move.b    d0,(a3)            tie off old argv
  292.     move.l    d0,-4(a1)
  293.     
  294.     tst.b    d7
  295.     beq    envread
  296.  
  297.     jsr    fixenv(pc)
  298.     
  299.     move.l    a1,a3
  300.     lea    1(a0),a6
  301.     bsr    chkstk
  302.     
  303. skp_arg    tst.b    (a5)+
  304.     bne.s    skp_arg
  305.     move.l    a5,(a1)+
  306.     tst.b    (a5)
  307.     bne.s    skp_arg
  308.     clr.l    -4(a1)            NULL terminate argv[] like UN*X
  309.     bra    go_main
  310.     
  311. nt_argv    cmp.b    #'_',(a5)+        try for a match with _PBP=
  312.     bne.s    nt_pbp            This isn't Atari supported either
  313.     cmp.b    #'P',(a5)+        but is used by Craft
  314.     bne.s    nt_pbp
  315.     cmp.b    #'B',(a5)+
  316.     bne.s    nt_pbp
  317.     cmp.b    #'P',(a5)+
  318.     bne.s    nt_pbp
  319.     cmp.b    #'=',(a5)+
  320.     bne.s    nt_pbp
  321.     subq.w    #4,a1
  322.     tst.b    d7
  323.     bne.s    nt_pbp
  324.     
  325.     moveq.l    #0,d1            _PBP found now check it
  326.     moveq.l    #0,d0
  327. get_pbp    move.b    (a5)+,d0
  328.     beq.s    got_pbp
  329.     lsl.l    #4,d1
  330.     cmp.b    #'0',d0
  331.     bcs.s    nt_pbp
  332.     cmp.b    #'9',d0
  333.     bcc.s    try_af
  334.     and.b    #$f,d0
  335.     add.l    d0,d1
  336.     bra.s    get_pbp
  337. try_af    cmp.b    #'A',d0
  338.     bcs.s    nt_pbp
  339.     cmp.b    #'z',d0
  340.     bcc.s    nt_pbp
  341.     cmp.b    #'F',d0
  342.     bls.s    is_af
  343.     cmp.b    #'a',d0
  344.     bcs.s    nt_pbp
  345.  
  346. is_af    and.b    #$f,d0
  347.     add.b    #9,d0
  348.     add.l    d0,d1
  349.     bra.s    get_pbp
  350. got_pbp    cmp.l    p_parent(a2),d1
  351.     seq    d7
  352.     bra    chk_env
  353.  
  354. nt_pbp    tst.b    (a5)+
  355.     bne.s    nt_pbp
  356.     beq    chk_env
  357.     
  358. envread    clr.l    (a1)+
  359.     jsr    fixenv(pc)
  360.     move.l    a1,a3            no ARGV= found so do it the old way
  361. ;    lea.l    p_cmdlin(a2),a0
  362.     moveq    #0,d0
  363.     move.b    (a0)+,d0
  364.     cmp.b    #125,d0            Pexec always copies 125 chars
  365.     bhi.s    no_null
  366.     clr.b    0(a0,d0.w)        if < 125 we must null term
  367.  
  368. no_null    move.l    a0,a6
  369.     bsr    chkstk
  370.     
  371.     IFD    NOALVS
  372.     jsr    @_setargv
  373.     ELSE
  374.     jsr    @_setargv(pc)
  375.     ENDC
  376.     move.l    d0,a1
  377.     
  378. go_main    move.l    a1,d2        save a1 for argc calculation
  379.     
  380.     moveq    #16,d0
  381.     IFD    NOBASER
  382.     cmp.w    #$104,__tos    tos 1.4 or greater ?
  383.     ELSE
  384.     cmp.w    #$104,__tos(a4)    tos 1.4 or greater ?
  385.     ENDC
  386.     bcs.s    ot2
  387.     moveq    #64,d0
  388.  
  389. ot2
  390.     IFD    NOBASER
  391.     IFD    SHORTINT
  392.     move.w    d0,__maxblk
  393.     ELSE
  394.     move.l    d0,__maxblk
  395.     ENDC
  396.     ELSE
  397.     IFD    SHORTINT
  398.     move.w    d0,__maxblk(a4)
  399.     ELSE
  400.     move.l    d0,__maxblk(a4)
  401.     ENDC
  402.     ENDC
  403.  
  404.     IFD    NOBASER
  405.     move.l    a1,__mblk
  406.     ELSE
  407.     move.l    a1,__mblk(a4)
  408.     ENDC
  409.  
  410.     move.l    d0,d1
  411.     bra.s    fst
  412. cmb    clr.l    (a1)+
  413. fst    dbf    d1,cmb
  414.  
  415.     IFD    NOBASER
  416.     move.l    a1,__msiz
  417.     ELSE
  418.     move.l    a1,__msiz(a4)
  419.     ENDC
  420.  
  421.     bra.s    fmst
  422. cms    clr.l    (a1)+
  423. fmst    dbf    d0,cms
  424.  
  425.     IFD    NOBASER
  426.     move.l    __MNEED,d0    find initial heap size
  427.     ELSE
  428.     move.l    __MNEED(a4),d0    find initial heap size
  429.     ENDC
  430.     cmp.l    #512,d0        minimum size
  431.     ble.s    nomneed
  432.     addq.l    #3,d0
  433.     and.w    #~3,d0
  434.     cmp.l    #$1fffc,d0
  435.     bge.s    nomneed
  436.     
  437.     IFD    NOBASER
  438.     move.l    a1,__MemHeap    setup heap pointer
  439.     ELSE
  440.     move.l    a1,__MemHeap(a4)    setup heap pointer
  441.     ENDC
  442.  
  443.     clr.l    (a1)+        no next block
  444.     move.l    d0,(a1)+    length available
  445.     subq.l    #4,d0
  446.     move.l    d0,(a1)+    length free
  447.     addq.w    #4,a1
  448.     move.l    a1,-4(a1)    rover
  449.     move.w    #$8000,(a1)+
  450.     clr.l    (a1)+
  451.     move.l    d0,d1
  452.     lsr.l    #2,d0
  453.     bset    #15,d0
  454.     move.w    d0,(a1)
  455.     add.l    d1,a1
  456.  
  457. nomneed
  458.     IFD    NOBASER
  459.     add.l    __STKDELTA,a1    add on chicken factor
  460.     ELSE
  461.     add.l    __STKDELTA(a4),a1    add on chicken factor
  462.     ENDC
  463.  
  464.     IFD    NOBASER
  465.     move.l    a1,__base    set up stack base
  466.     ELSE
  467.     move.l    a1,__base(a4)    set up stack base
  468.     ENDC
  469.  
  470.     IFD    NOBASER
  471.     add.l    __STACK,a1
  472.     ELSE
  473.     add.l    __STACK(a4),a1
  474.     ENDC
  475.  
  476.     move.l    a1,d1        longword align stack for performance on TT
  477.     addq.l    #4,d1
  478.     and.w    #~3,d1
  479.     move.l    d1,a1
  480.     
  481.     IFD    NOBASER
  482.     tst.l    __MSTEP        automatic _mstep sizing ?
  483.     ELSE
  484.     tst.l    __MSTEP(a4)
  485.     ENDC
  486.     
  487.     bne.s    no_amst
  488.     move.l    a7,d1        work out how much we are returning
  489.     sub.l    a1,d1
  490.     lsr.l    #4,d1        set to 1/16 of returned size
  491.  
  492.     IFD    NOBASER
  493.     cmp.w    #$104,__tos    tos 1.4 or greater ?
  494.     ELSE
  495.     cmp.w    #$104,__tos(a4)    tos 1.4 or greater ?
  496.     ENDC
  497.     bcs.s    old_tos
  498.     lsr.l    #2,d1        use 1/64 for new tos, be less greedy
  499.  
  500. old_tos    addq.l    #2,d1        round up (not allowing a zero value)
  501.     bclr    #0,d1        and word align
  502.  
  503.     IFD    NOBASER
  504.     move.l    d1,__MSTEP
  505.     ELSE
  506.     move.l    d1,__MSTEP(a4)
  507.     ENDC
  508.     
  509.     IFD    NOBASER
  510.     move.l    __BLKSIZ,d0        Resize __BLKSIZ for minimal pool spillage
  511.     ELSE
  512.     move.l    __BLKSIZ(a4),d0
  513.     ENDC
  514.  
  515.     divu    d0,d1
  516.     move.w    d1,d0
  517.     clr.w    d1
  518.     swap    d1
  519.     addq.w    #1,d0
  520.  
  521.     IFD    NOBASER
  522.     move.l    __BLKSIZ,d3
  523.     ELSE
  524.     move.l    __BLKSIZ(a4),d3
  525.     ENDC
  526.  
  527.     sub.l    d1,d3
  528.     divu    d0,d3
  529.     
  530.     swap    d3
  531.     clr.w    d3
  532.     swap    d3
  533.  
  534.     not.l    d3
  535.     sub.l    #27,d3
  536.     and.w    #$fffc,d3
  537.     
  538.     IFD    NOBASER
  539.     add.l    d3,__BLKSIZ
  540.     ELSE
  541.     add.l    d3,__BLKSIZ(a4)
  542.     ENDC
  543.  
  544. no_amst    move.l    a1,a7
  545.     sub.l    a3,d2
  546.     move.l    a3,-(a7)    char *argv[]
  547.     IFD    SHORTINT
  548.     lsr.w    #2,d2        divide by pointer size
  549.     subq.w    #1,d2        subtract one to correct for NULL we added
  550.     move.w    d2,-(a7)     int argc
  551.     ELSE
  552.     lsr.l    #2,d2        divide by pointer size
  553.     subq.l    #1,d2        subtract one to correct for NULL we added
  554.     move.l    d2,-(a7)     int argc
  555.     ENDC
  556.     sub.l    a2,a1        calculate length we need
  557.     add.l    #$100,a1    add in base page
  558.     move.l    a1,-(a7)
  559.     move.l    a2,-(a7)
  560.     move.w    #0,-(a7) 
  561.     move.w    #m_shrink,-(a7)    release memory back to GEM
  562.     trap    #1
  563.     lea    12(a7),a7
  564.     ENDC
  565.  
  566.     IFD    AUTO
  567.     or.w    #3,d4            assume auto-folder TOS prog
  568.  
  569.     lea    __AEScontrol(A4),A0
  570.     lea    __AESpb(a4),a1
  571.     move.l    A0,(a1)+
  572.     lea    __AESglobal(A4),A0
  573.     move.l    A0,(a1)+
  574.     lea    __AESintin(A4),A0
  575.     move.l    A0,(a1)+
  576.     lea    __AESintout(A4),A0
  577.     move.l    A0,(a1)+
  578.     lea    __AESaddrin(A4),A0
  579.     move.l    A0,(a1)+
  580.     lea    __AESaddrout(A4),A0
  581.     move.l    A0,(a1)+
  582.     moveq    #00,D0
  583.  
  584.     IFD    NOBASER
  585.     lea    __AESpb,a0
  586.     ELSE
  587.     lea    __AESpb(a4),a0
  588.     ENDC
  589.  
  590.     move.l    (a0),a1
  591.     move.l    #$0a000100,d0
  592.     movep.l    d0,1(a1)
  593.     move.l    a0,d1
  594.     move.w    #200,d0
  595.     trap    #2
  596.  
  597.     cmp.w    #200,d0
  598.     beq.s    isada2
  599.  
  600.     IFD    NOBASER
  601.     lea    __AESintout,a0
  602.     ELSE
  603.     lea    __AESintout(a4),a0
  604.     ENDC
  605.     move.w    (a0),d0
  606.     bmi.s    aeserr
  607.  
  608.     IFD    REGARGS
  609.     IFD    NOALVS
  610.     jsr    @appl_exit
  611.     ELSE
  612.     jsr    @appl_exit(pc)
  613.     ENDC
  614.     ELSE
  615.     IFD    NOALVS
  616.     jsr    _appl_exit
  617.     ELSE
  618.     jsr    _appl_exit(pc)
  619.     ENDC
  620.     ENDC    
  621.  
  622. aeserr
  623.     bclr    #1,d4            mark as a regular prog
  624.     dc.w    $a000
  625.     tst.w    -598(a0)
  626.     bne.s    isada2
  627.  
  628.     bclr    #0,d4            mark as a TOS prog
  629.     
  630. isada2
  631.     IFD    SHORTINT
  632.     IFD    NOBASER
  633.     move.w    d4,__XMODE
  634.     ELSE
  635.     move.w    d4,__XMODE(a4)
  636.     ENDC
  637.     ELSE
  638.     IFD    NOBASER
  639.     move.l    d4,__XMODE
  640.     ELSE
  641.     move.l    d4,__XMODE(a4)
  642.     ENDC
  643.     ENDC
  644.     ENDC
  645.     
  646.     IFD    NOALVS
  647.     jsr    __VDIinit    wake up VDI if it's required
  648.     jsr    __FPCinit    wake up FPC if it's required
  649.     IFD    DA
  650.     IFD    REGARGS
  651.     jsr    @main
  652.     ELSE
  653.     jsr    _main
  654.     ENDC
  655.     ELSE
  656.     IFD    REGARGS
  657.     IFD    SHORTINT
  658.     move.w    (a7)+,d0
  659.     ELSE
  660.     move.l    (a7)+,d0
  661.     ENDC
  662.     move.l    (a7)+,a0
  663.     jsr    @_main        off to main program
  664.     ELSE
  665.     jsr    __main        off to main program
  666.     ENDC
  667.     ENDC
  668.     ELSE
  669.     jsr    __VDIinit(pc)    wake up VDI if it's required
  670.     jsr    __FPCinit(pc)    wake up FPC if it's required
  671.     IFD    DA
  672.     IFD    REGARGS
  673.     jsr    @main(pc)
  674.     ELSE
  675.     jsr    _main(pc)
  676.     ENDC
  677.     ELSE
  678.     IFD    REGARGS
  679.     IFD    SHORTINT
  680.     move.w    (a7)+,d0
  681.     ELSE
  682.     move.l    (a7)+,d0
  683.     ENDC
  684.     move.l    (a7)+,a0
  685.     jsr    @_main(pc)
  686.     ELSE
  687.     jsr    __main(pc)
  688.     ENDC
  689.     ENDC
  690.     ENDC
  691.     
  692.     IFD    DA
  693.     IFD    REGARGS
  694. @exit
  695. @_exit
  696. @_XCEXIT
  697.     ELSE
  698. _exit
  699. __exit
  700. __XCEXIT
  701.     ENDC
  702.     illegal
  703.     ELSE
  704.     move.w    d0,(a7)
  705.     bra.s    term
  706.     
  707.     IFD    REGARGS
  708. @_XCEXIT
  709.     move.w    d0,(a7)
  710.     ELSE
  711. __XCEXIT
  712.     IFD    SHORTINT
  713.     addq.w    #4,a7        move return code to top of stack
  714.     ELSE
  715.     addq.w    #6,a7
  716.     ENDC
  717.     ENDC
  718.     
  719. term
  720.     IFD    NOBASER
  721.     move.l    __onbrk,d0
  722.     ELSE
  723.     move.l    __onbrk(a4),d0
  724.     ENDC
  725.     
  726.     beq.s    done
  727.  
  728.     move.l    d0,-(a7)
  729.     move.w    #$102,-(a7)
  730.     move.w    #5,-(a7)
  731.     trap    #13
  732.     addq.w    #8,a7
  733.     
  734. done    move.w    #p_term,-(a7)
  735.     trap    #1
  736.  
  737.     illegal
  738.  
  739.     
  740. chkstk    cmp.b    #'=',(a6)        stack size specification ?
  741.     bne.s    skp_stk
  742.  
  743.     addq.w    #1,a6
  744.     moveq    #0,d1
  745.  
  746. digit
  747.     moveq    #0,d2
  748.     move.b    (a6)+,d2
  749.     sub.w    #$30,d2
  750.     blt.s    donestk
  751.     cmp.w    #9,d2
  752.     bgt.s    donestk
  753.     add.l    d1,d1
  754.     move.l    d1,d3
  755.     add.l    d1,d1
  756.     add.l    d1,d1
  757.     add.l    d3,d1
  758.     add.l    d2,d1
  759.     bra.s    digit
  760.     
  761. donestk    move.b    -1(a6),d2
  762.     beq.s    got_stk
  763.     sub.b    #32,d2
  764.     bne.s    skp_stk
  765. got_stk    tst.l    d1
  766.     beq.s    skp_stk
  767.  
  768.     IFD    NOBASER
  769.     move.l    d1,__STACK
  770.     ELSE
  771.     move.l    d1,__STACK(a4)
  772.     ENDC
  773.  
  774.     move.l    a6,a0
  775. skp_stk    rts
  776.  
  777. fixenv
  778.     IFD    SHORTINT
  779.     moveq    #0,d0
  780.     IFD    NOBASER
  781.     move.w    __ENVC,d0
  782.     ELSE
  783.     move.w    __ENVC(a4),d0
  784.     ENDC    
  785.     moveq    #0,d1
  786.     IFD    NOBASER
  787.     move.w    __ENEED,d1
  788.     ELSE
  789.     move.w    __ENEED(a4),d1
  790.     ENDC
  791.     ELSE
  792.     IFD    NOBASER
  793.     move.l    __ENVC,d0
  794.     ELSE
  795.     move.l    __ENVC(a4),d0
  796.     ENDC    
  797.     IFD    NOBASER
  798.     move.l    __ENEED,d1
  799.     ELSE
  800.     move.l    __ENEED(a4),d1
  801.     ENDC
  802.     ENDC
  803.     cmp.l    d0,d1
  804.     bcs.s    noteneed
  805.     move.l    d1,d0
  806. noteneed
  807.     add.l    d0,d0
  808.     add.l    d0,d0
  809.     add.l    d0,a1
  810.     rts
  811.     ENDC
  812.  
  813.     IFD    NOBASER
  814.     CSECT    udata,2
  815.     ELSE
  816.     CSECT    __MERGED,2
  817.     ENDC    
  818.  
  819.     IFD    GST
  820.  
  821. __LinkerDB
  822.     ENDC
  823.  
  824.     IFND    DA
  825. _environ    ds.l    1
  826. __onbrk    ds.l    1
  827.     ENDC
  828.     
  829. __pbase    ds.l    1
  830. __savePC    ds.l    1
  831. __saveD2A2    ds.l    2
  832. __base    ds.l    1
  833. __clkstart    ds.l    1
  834. __msiz    ds.l    1
  835. __mblk    ds.l    1
  836.  
  837.     IFD    AUTO
  838. __XMODE
  839.     IFD    SHORTINT
  840.     ds.w    1
  841.     ELSE
  842.     ds.l    1
  843.     ENDC
  844.     ENDC
  845.     
  846.     IFD    SHORTINT
  847. __maxblk    ds.w    1
  848. _errno    ds.w    1
  849.     IFND    DA
  850. __ENVC    ds.w    1
  851.     ENDC
  852.     ELSE
  853. __maxblk    ds.l    1
  854. _errno    ds.l    1
  855.     IFND    DA
  856. __ENVC    ds.l    1
  857.     ENDC
  858.     ENDC
  859.  
  860. __OSERR
  861. __oserr    ds.l    1
  862. __tos    ds.w    1
  863. __country    ds.l    1
  864.     IFD    DA
  865. base    ds.b    256    Desk Accessory stack size
  866. stack
  867.     ENDC
  868.     END
  869.