home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_01 / PC_V11_A.LZH / LIB / PCXSTART.S < prev    next >
Text File  |  1992-03-05  |  10KB  |  488 lines

  1. *      PCXSTART.S
  2. *
  3. *      Pure C Extended Startup Code
  4. *
  5. *      Copyright (c) Borland International 1988/89/90
  6. *      All Rights Reserved.
  7.  
  8.  
  9. *>>>>>> Information <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  10.  
  11. *        This extended version of PCSTART.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.         .EXPORT __text, __data, __bss
  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. *>>>>>>> Locals <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  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.     ARGVFLAG    EQU     D7
  98.  
  99.  
  100. *>>>>>>> Constants <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  101.  
  102.     REDOUT      EQU     00
  103.     REDAPP      EQU     01
  104.     REDIN       EQU     02
  105.  
  106.     stdin       EQU     00
  107.     stdout      EQU     01
  108.  
  109.  
  110. *>>>>>>> Data segment <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  111.  
  112.         .BSS
  113. __bss:
  114.  
  115. * Pointer to base page
  116.  
  117. _BasPag:
  118.         .DS.L   1
  119.  
  120.  
  121. * Applikation flag
  122.  
  123. _app:
  124.         .DS.W   1
  125.  
  126.  
  127. * Stack limit
  128.  
  129. _StkLim:
  130.         .DS.L   1
  131.  
  132. * Program size
  133.  
  134. _PgmSize:
  135.         .DS.L   1
  136.  
  137. * Redirection address table
  138.  
  139. _RedirTab:
  140.         .DS.L   6
  141.  
  142.  
  143. *>>>>>>> Initialized data segment <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  144.  
  145.         .DATA
  146. __data:
  147.  
  148. * Global error variable
  149.  
  150. errno:
  151.         .DC.W   0
  152.  
  153.  
  154. * Vector for atexit
  155.  
  156. _AtExitVec:
  157.         .DC.L   0
  158.  
  159.  
  160. * Vector for file system deinitialization
  161.  
  162. _FilSysVec:
  163.         .DC.L   0
  164.  
  165.  
  166. *>>>>>>> Code segment <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  167.  
  168.         .CODE
  169. __text:
  170.  
  171.  
  172. ******** PcStart ********************************************************
  173.  
  174. Start:
  175.         BRA.B   Start0
  176.  
  177.  
  178.  
  179. ******* Configuration data
  180.  
  181.  
  182. * Redirection array pointer
  183.  
  184.         .DC.L   _RedirTab
  185.  
  186.  
  187. * Stack size entry
  188.  
  189.         .DC.L   _StkSize
  190.  
  191.  
  192.  
  193. ******* Pc library copyright note
  194.  
  195.         .ALIGN  16
  196.  
  197.         .DC.B   '>>>> PURE-C <<<<'
  198.         .DC.B   '  for ATARI-ST  '
  199.         .DC.B   '  Version  1.0  '
  200.         .DC.B   '(C)88-90 Borland'
  201.         .DC.B   ' International  '
  202.  
  203. EmpStr:
  204.         .DC.B   $00
  205.         .EVEN
  206.  
  207.  
  208.  
  209. ******** Pc startup code
  210.  
  211. * Setup pointer to base page
  212.  
  213. Start0:
  214.         MOVE.L  A0, A3
  215.         MOVE.L  A3, D0
  216.         BNE     ACC
  217.  
  218.         MOVE.L  4(A7), A3       ; BasePagePointer from Stack
  219.         MOVEQ.L #1, D0          ; Program is Application
  220.         BRA     APP
  221. ACC:
  222.         CLR.W   D0              ; Program is DeskAccessory
  223.  
  224. APP:
  225.  
  226.         MOVE.L  A3, _BasPag
  227.  
  228. * Setup applikation flag
  229.  
  230.         MOVE.W  D0,_app
  231.  
  232.  
  233. * Compute size of required memory
  234. * := text segment size + data segment size + bss segment size
  235. *  + stack size + base page size
  236. * (base page size includes stack size)
  237.  
  238.         MOVE.L  TextSegSize(BASPAGPTR),A0
  239.         ADD.L   DataSegSize(BASPAGPTR),A0
  240.         ADD.L   BssSegSize(BASPAGPTR),A0
  241.         ADD.W   #BasePageSize,A0
  242.         MOVE.L  A0, _PgmSize
  243.  
  244. * Setup longword aligned application stack
  245.  
  246.         MOVE.L  BASPAGPTR,D0
  247.         ADD.L   A0,D0
  248.         AND.B   #$FC,D0
  249.         MOVE.L  D0,A7
  250.  
  251. * Setup stack limit variable
  252.  
  253.         SUB.L   #_StkSize-256,D0
  254.         MOVE.L  D0,_StkLim
  255.  
  256. * scan environment
  257.         CLR.W    ARGVFLAG        * assume no extended arguments
  258.         SUB.L   #250, D0
  259.         AND.B   #$FC, D0
  260.         MOVE.L  D0, A1
  261.         MOVE.L  A1, ENVP
  262.         MOVE.L  EnvStrPtr(BASPAGPTR), A2
  263.         MOVE.L  A2, (A1)+
  264. Start1:
  265.         TST.B   (A2)+
  266.         BNE     Start1
  267.         MOVE.L  A2, (A1)+
  268.         TST.B   (A2)+
  269.         BNE     Start1
  270.         CLR.L   -(A1)
  271.  
  272. * check application flag
  273.  
  274.         TST.W   _app
  275.         BEQ     Start14   * No arguments
  276.  
  277. * Free not required memory
  278.  
  279.         MOVE.L  A0,-(A7)
  280.         MOVE.L  BASPAGPTR,-(A7)
  281.         MOVE.W  #0,-(A7)
  282.         MOVE.W  #74,-(A7)
  283.         TRAP    #1
  284.         LEA.L   12(A7),A7
  285.  
  286. * scan commandline
  287.         LEA     CmdLine(BASPAGPTR), A0
  288.         MOVE    #1, ARGC
  289.         MOVE.B  (A0), D1
  290.  
  291.         CMP.B   #126, D1        * Is this a valid command_tail length ?
  292.         BMI     vallidLength
  293.         ADDQ.L  #1, A0
  294.         MOVEQ.L #-1, D1
  295. getLen:
  296.         ADDQ    #1, D1
  297.         MOVE.B  (A0)+, D0
  298.         BNE     getLen
  299.         LEA     CmdLine(BASPAGPTR), A0
  300.  
  301. vallidLength:
  302.         EXT.W   D1
  303.         CLR     REDIRFLAG
  304.         LEA     1(A0, D1.W), A1
  305.         CLR.B   (A1)
  306.         CLR.l   -(A7)           * argv[argc] = 0
  307.         BRA     Start7
  308.  
  309. Start2:                         * testing output redirection
  310.         CMPI.B  #'>', (A1)
  311.         BNE     Start3
  312.         CLR.B   (A1)
  313.         SUBQ    #1, A1
  314.         LEA     2(A1), REDIROUT
  315.         BSET    #REDOUT, REDIRFLAG
  316.         SUBQ    #1, D1
  317.         BMI     Start8
  318.         CMPI.B  #'>', (A1)      * append ?
  319.         BNE     Start3
  320.         CLR.B   (A1)
  321.         BSET    #REDAPP, REDIRFLAG
  322.         BRA     Start7
  323.  
  324. Start3:                         * testing input redirection
  325.         CMPI.B  #'<', (A1)
  326.         BNE     Start4
  327.         CLR.B   (A1)
  328.         LEA     1(A1), REDIRIN
  329.         BSET    #REDIN, REDIRFLAG
  330.         BRA     Start7
  331.  
  332. Start4:                         * testing blank (seperator)
  333.         CMPI.B  #' '+1, (A1)
  334.         BPL     Start5
  335.         CLR.B   (A1)
  336.         TST.B   1(A1)
  337.         BEQ     Start5
  338.         PEA     1(A1)
  339.         ADDQ    #1, ARGC
  340.         BRA     Start7
  341.  
  342. Start5:                         * testing quotation marks
  343.         CMPI.B  #'"', (A1)
  344.         BNE     Start7
  345.         MOVE.B  #0, (A1)
  346.  
  347. Start6:                         * scan previous
  348.         SUBQ    #1, A1
  349.         CMPI.B  #'"', (A1)
  350.         DBEQ    D1, Start6
  351.         SUBQ    #1, D1
  352.         BMI     Start8
  353.         PEA     1(A1)
  354.         ADDQ    #1, ARGC
  355.         CLR.B   (A1)
  356.  
  357. Start7:
  358.         SUBQ.L  #1, A1
  359.         DBF     D1, Start2
  360.  
  361. Start8:
  362.         TST.B   1(A1)
  363.         BEQ     Start9
  364.         PEA     1(A1)
  365.         ADDQ    #1, ARGC
  366.  
  367. Start9:
  368.         PEA     EmpStr
  369.         MOVE.L  A7, ARGV
  370.  
  371. * EXECUTE REDIRECTION
  372.         SUB.L   #$A, A7             * GET SPACE FOR PARAMS ON STACK
  373.         BTST    #REDOUT, REDIRFLAG
  374.         BEQ     Start12
  375.         MOVE.L  REDIROUT, 2(A7)
  376.         BTST    #REDAPP, REDIRFLAG
  377.         BEQ     Start10
  378.         MOVE    #1, 6(A7)
  379.         MOVE    #$3D, (A7)          * Fopen
  380.         TRAP    #1
  381.         TST.L   D0
  382.         BMI     Start10
  383.         MOVE    D0, D5
  384.         MOVE    #2, 8(A7)
  385.         MOVE    D5, 6(A7)
  386.         CLR.L   2(A7)
  387.         MOVE    #$42, (A7)          * Fseek
  388.         TRAP    #1
  389.         MOVE    D5, D0
  390.         BRA     Start11
  391. Start10:
  392.         CLR 6(A7)
  393.         MOVE    #$3C, (A7)
  394.         TRAP    #1                  * Fcreate
  395.         TST.L   D0
  396.         BMI     Start12
  397. Start11:
  398.         MOVE    D0, 4(A7)
  399.         MOVE    #stdout, 2(A7)
  400.         MOVE    #$46, (A7)          * Fforce
  401.         TRAP    #1
  402.  
  403. Start12:
  404.         BTST    #REDIN, REDIRFLAG
  405.         BEQ     Start13
  406.         MOVE    #0, 6(A7)
  407.         MOVE.L  REDIRIN, 2(A7)
  408.         MOVE    #$3D, (A7)          * Fopen
  409.         TRAP    #1
  410.         TST.L   D0
  411.         BMI     Start13
  412.         MOVE    D0, 4(A7)
  413.         MOVE    #stdin, 2(A7)
  414.         MOVE    #$46, (A7)          * Fforce
  415.         TRAP    #1
  416.  
  417.  
  418. Start13:
  419.         ADD.L   #$A, A7             * FREE PARAMETER SPACE
  420.  
  421. * Test if fpu 68881 is present
  422.  
  423. Start14:
  424.         JSR     _fpuinit
  425.  
  426. ******* Execute main program *******************************************
  427. *
  428. * Parameter passing:
  429. *   <D0.W> = Command line argument count (argc)
  430. *   <A0.L> = Pointer to command line argument pointer array (argv)
  431. *   <A1.L> = Pointer to tos environment string (env)
  432.  
  433.         MOVE    ARGC, D0
  434.         MOVE.L  ARGV, A0
  435.         MOVE.L  ENVP, A1
  436.         JSR     main
  437.  
  438.  
  439.  
  440. ******** exit ***********************************************************
  441. *
  442. * Terminate program
  443. *
  444. * Entry parameters:
  445. *   <D0.W> = Termination status : Integer
  446. * Return parameters:
  447. *   Never returns
  448.  
  449. exit:
  450.         MOVE.W  D0,-(A7)
  451.  
  452. * Execute all registered atexit procedures
  453.  
  454.         MOVE.L  _AtExitVec,D0
  455.         BEQ     __exit
  456.  
  457.         MOVE.L  D0,A0
  458.         JSR     (A0)
  459.  
  460.  
  461.  
  462. * Deinitialize file system
  463. __exit:
  464.  
  465.         MOVE.L  _FilSysVec,D0
  466.         BEQ     Exit1
  467.  
  468.         MOVE.L  D0,A0
  469.         JSR     (A0)
  470.  
  471.  
  472. * Deallocate all heap blocks
  473.  
  474. Exit1:
  475.         JSR     _FreeAll
  476.  
  477.  
  478. * Program termination with return code
  479.  
  480.         MOVE.W  #76,-(A7)
  481.         TRAP    #1
  482.  
  483.  
  484.  
  485. ******* Module end *****************************************************
  486.  
  487.         .END
  488.