home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_01 / TURBOC_1.LZH / LIB / TCXSTART.S < prev   
Text File  |  1990-03-02  |  9KB  |  469 lines

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