home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_01 / PC_V11_A.LZH / LIB / PCVSTART.S < prev    next >
Text File  |  1991-08-13  |  8KB  |  411 lines

  1. *      PCVSTART.S
  2. *
  3. *      Pure C Startup Code
  4. *
  5. *      Copyright (c) Borland International 1988/89/90
  6. *      All Rights Reserved.
  7.  
  8.  
  9. *>>>>>> Information <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  10.  
  11. *        This version of PCSTART.S handles extended argument
  12. *        passing via the ARGV= environment variable.
  13.  
  14.  
  15. *>>>>>> Export references <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  16.  
  17.         .EXPORT exit, __exit
  18.  
  19.         .EXPORT _BasPag
  20.         .EXPORT _app
  21.         .EXPORT errno
  22.         .EXPORT _AtExitVec, _FilSysVec
  23.         .EXPORT _RedirTab
  24.         .EXPORT _StkLim
  25.         .EXPORT _PgmSize
  26.  
  27.         .EXPORT __text, __data, __bss
  28.  
  29. *>>>>>> Import references <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  30.  
  31.         .IMPORT main
  32.         .IMPORT _fpuinit
  33.         .IMPORT _StkSize
  34.         .IMPORT _FreeAll
  35.  
  36.  
  37.  
  38.  
  39. *>>>>>> Data structures <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  40.  
  41.  
  42. * Base page structure
  43.  
  44.         .OFFSET 0
  45.  
  46. TpaStart:
  47.         .DS.L   1
  48. TpaEnd:
  49.         .DS.L   1
  50. TextSegStart:
  51.         .DS.L   1
  52. TextSegSize:
  53.         .DS.L   1
  54. DataSegStart:
  55.         .DS.L   1
  56. DataSegSize:
  57.         .DS.L   1
  58. BssSegStart:
  59.         .DS.L   1
  60. BssSegSize:
  61.         .DS.L   1
  62. DtaPtr:
  63.         .DS.L   1
  64. PntPrcPtr:
  65.         .DS.L   1
  66. Reserved0:
  67.         .DS.L   1
  68. EnvStrPtr:
  69.         .DS.L   1
  70. Reserved1:
  71.         .DS.B   7
  72. CurDrv:
  73.         .DS.B   1
  74. Reserved2:
  75.         .DS.L   18
  76. CmdLine:
  77.         .DS.B   128
  78. BasePageSize:
  79.         .DS     0
  80.  
  81.  
  82.  
  83. *>>>>>>> Data segment <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  84.  
  85.         .BSS
  86. __bss:
  87.  
  88. * Pointer to base page
  89.  
  90. _BasPag:
  91.         .DS.L   1
  92.  
  93.  
  94. * Applikation flag
  95.  
  96. _app:
  97.         .DS.W   1
  98.  
  99.  
  100. * Stack limit
  101.  
  102. _StkLim:
  103.         .DS.L   1
  104.  
  105. * Program size
  106.  
  107. _PgmSize:
  108.         .DS.L   1
  109.  
  110. * Redirection address table
  111.  
  112. _RedirTab:
  113.         .DS.L   6
  114.  
  115. *>>>>>>> Initialized data segment <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  116.  
  117.         .DATA
  118. __data:
  119.  
  120. * Global error variable
  121.  
  122. errno:
  123.         .DC.W   0
  124.  
  125.  
  126. * Vector for atexit
  127.  
  128. _AtExitVec:
  129.         .DC.L   0
  130.  
  131.  
  132. * Vector for file system deinitialization
  133.  
  134. _FilSysVec:
  135.         .DC.L   0
  136.  
  137.  
  138. *>>>>>>> Code segment <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  139.  
  140.         .CODE
  141. __text:
  142.  
  143.  
  144. ******** PcStart ********************************************************
  145.  
  146. Start:
  147.         BRA.B   Start0
  148.  
  149.  
  150.  
  151. ******* Configuration data
  152.  
  153.  
  154. * Redirection array pointer
  155.  
  156.         .DC.L   _RedirTab
  157.  
  158.  
  159. * Stack size entry
  160.  
  161.         .DC.L   _StkSize
  162.  
  163.  
  164.  
  165. ******* Pc library copyright note
  166.  
  167.         .ALIGN  16
  168.  
  169.         .DC.B   '>>>> PURE-C <<<<'
  170.         .DC.B   '  for ATARI-ST  '
  171.         .DC.B   '  Version  1.0  '
  172.         .DC.B   '(C)88-90 Borland'
  173.         .DC.B   ' International  '
  174.  
  175. EmpStr:
  176.         .DC.B   $00
  177.         .EVEN
  178.  
  179.  
  180.  
  181. ******** Pc startup code
  182.  
  183. * Setup pointer to base page
  184.  
  185. Start0:
  186.         MOVE.L  A0, A3
  187.         MOVE.L  A3, D0
  188.         BNE     ACC
  189.  
  190.         MOVE.L  4(A7), A3   ; BasePagePointer from Stack
  191.         MOVEQ.L #1, D0      ; Program is Application
  192.         BRA     APP
  193. ACC:
  194.         CLR.W   D0          ; Program is DeskAccessory
  195.  
  196. APP:
  197.  
  198.         MOVE.L  A3, _BasPag
  199.  
  200. * Setup applikation flag
  201.  
  202.         MOVE.W  D0,_app
  203.  
  204.  
  205. * Compute size of required memory
  206. * := text segment size + data segment size + bss segment size
  207. *  + stack size + base page size
  208. * (base page size includes stack size)
  209.  
  210.         MOVE.L  TextSegSize(A3),A0
  211.         ADD.L   DataSegSize(A3),A0
  212.         ADD.L   BssSegSize(A3),A0
  213.         ADD.W   #BasePageSize,A0
  214.         MOVE.L  A0, _PgmSize
  215.  
  216. * Setup longword aligned application stack
  217.  
  218.         MOVE.L  A3,D0
  219.         ADD.L   A0,D0
  220.         AND.B   #$FC,D0
  221.         MOVE.L  D0,A7
  222.  
  223. * check application flag
  224.  
  225.         TST.W   _app
  226.         BEQ     Start8  * No environment and no arguments
  227.  
  228. * Free not required memory
  229.  
  230.         MOVE.L  A0,-(A7)
  231.         MOVE.L  A3,-(A7)
  232.         MOVE.W  #0,-(A7)
  233.         MOVE.W  #74,-(A7)
  234.         TRAP    #1
  235.         LEA.L   12(A7),A7
  236.  
  237. * scan environment
  238.  
  239.         MOVE.L    A7, D0
  240.         SUB.L   #_StkSize-4, D0
  241.         AND.B   #$FC, D0
  242.         MOVE.L  D0, A1
  243.         MOVE.L  A1, A4                    * this is envp
  244.         MOVE.L  EnvStrPtr(A3), A2
  245.         MOVE.B    CmdLine(A3), D5
  246.         MOVE.B    #'=', D6
  247.         MOVE.L    #'VGRA', D7
  248.         MOVEA.L    A7, A6
  249.  
  250. ScanEnvLoop:
  251.         MOVE.L  A2, (A1)+
  252.         MOVEA.L    A2, A5
  253.         TST.B   (A2)+
  254.         BEQ        ScanEnvExit
  255. Start1:
  256.         TST.B   (A2)+
  257.         BNE     Start1
  258.  
  259.         MOVE.B    (A5)+, -(A6)
  260.         MOVE.B    (A5)+, -(A6)
  261.         MOVE.B    (A5)+, -(A6)
  262.         MOVE.B    (A5)+, -(A6)
  263.         CMP.L    (A6)+, D7        * ARGV ?
  264.         BNE        ScanEnvLoop
  265.         CMP.B    (A5), D6        * ARGV= ?
  266.         BNE        ScanEnvLoop
  267.         CMP.B    #127, D5        * commandLength == 127 ?
  268.         BNE        ScanEnvLoop
  269.  
  270.         * now we have found extended arguments
  271.         CLR.B    -4(A5)
  272.         CLR.L    -4(A1)
  273.         MOVE.L    A1, A5            * this is argv
  274.         CLR.L    D3                * this is argc        
  275.         MOVE.L    A2, (A1)+
  276.  
  277. xArgLoop:
  278.         TST.B    (A2)+
  279.         BNE        xArgLoop
  280.         MOVE.L    A2, (A1)+
  281.         ADDQ.L    #1, D3
  282.         TST.B    (A2)
  283.         BNE        xArgLoop                
  284.         MOVE.L    A1, A6            * stack limit
  285.         CLR.L    -(A1)
  286.         BRA        Start8            * we don't need to parse basepage's tail
  287.  
  288. ScanEnvExit:
  289.         MOVE.L    A1, A6            * stack limit
  290.         CLR.L   -(A1)
  291.  
  292. * scan commandline
  293.         LEA     CmdLine(A3), A0
  294.         MOVE    #1, D3
  295.         MOVE.B  (A0), D1
  296.         EXT.W   D1
  297.         LEA     1(A0, D1.W), A1
  298.         CLR.B   (A1)
  299.         CLR.l   -(A7)           * argv[argc] = 0
  300.         BRA     Start5
  301.  
  302. Start2:                         * testing blank (seperator)
  303.         CMPI.B  #' '+1, (A1)
  304.         BPL     Start3
  305.         CLR.B   (A1)
  306.         TST.B   1(A1)
  307.         BEQ     Start3
  308.         PEA     1(A1)
  309.         ADDQ    #1, D3
  310.         BRA     Start5
  311.  
  312. Start3:                         * testing quotation marks
  313.         CMPI.B  #'"', (A1)
  314.         BNE     Start5
  315.         MOVE.B  #0, (A1)
  316.  
  317. Start4:                         * scan previous
  318.         SUBQ    #1, A1
  319.         CMPI.B  #'"', (A1)
  320.         DBEQ    D1, Start4
  321.         SUBQ    #1, D1
  322.         BMI     Start6
  323.         PEA     1(A1)
  324.         ADDQ    #1, D3
  325.         CLR.B   (A1)
  326.  
  327. Start5:
  328.         SUBQ.L  #1, A1
  329.         DBF     D1, Start2
  330.  
  331. Start6:
  332.         TST.B   1(A1)
  333.         BEQ     Start7
  334.         PEA     1(A1)
  335.         ADDQ    #1, D3
  336.  
  337. Start7:
  338.         PEA     EmpStr
  339.         MOVEA.L A7, A5
  340.  
  341. * Test if fpu 68881 is present
  342.  
  343. Start8:
  344.         JSR     _fpuinit
  345.  
  346. * calculate stack limit
  347.         LEA        256(A6), A6        * minimum stacksize to call library
  348.         MOVE.L    A6, _StkLim
  349.  
  350. ******* Execute main program *******************************************
  351. *
  352. * Parameter passing:
  353. *   <D0.W> = Command line argument count (argc)
  354. *   <A0.L> = Pointer to command line argument pointer array (argv)
  355. *   <A1.L> = Pointer to tos environment string (env)
  356.  
  357.         MOVE    D3, D0
  358.         MOVE.L  A5, A0
  359.         MOVE.L  A4, A1
  360.         JSR     main
  361.  
  362.  
  363.  
  364. ******** exit ***********************************************************
  365. *
  366. * Terminate program
  367. *
  368. * Entry parameters:
  369. *   <D0.W> = Termination status : Integer
  370. * Return parameters:
  371. *   Never returns
  372.  
  373. exit:
  374.         MOVE.W  D0,-(A7)
  375.  
  376. * Execute all registered atexit procedures
  377.  
  378.         MOVE.L  _AtExitVec,D0
  379.         BEQ     __exit
  380.  
  381.         MOVE.L  D0,A0
  382.         JSR     (A0)
  383.  
  384.  
  385. * Deinitialize file system
  386.  
  387. __exit:
  388.         MOVE.L  _FilSysVec,D0
  389.         BEQ     Exit1
  390.  
  391.         MOVE.L  D0,A0
  392.         JSR     (A0)
  393.  
  394.  
  395. * Deallocate all heap blocks
  396.  
  397. Exit1:
  398.         JSR     _FreeAll
  399.  
  400.  
  401. * Program termination with return code
  402.  
  403.         MOVE.W  #76,-(A7)
  404.         TRAP    #1
  405.  
  406.  
  407.  
  408. ******* Module end *****************************************************
  409.  
  410.         .END
  411.