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

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