home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Vectronix 2
/
VECTRONIX2.iso
/
FILES_07
/
TURBOC_1.ZIP
/
LIB
/
TCXSTART.S
< prev
Wrap
Text File
|
1990-03-02
|
9KB
|
469 lines
* TCXSTART.S
*
* Turbo C Extended Startup Code, Version 1.1
*
* Copyright (c) Borland International 1988/89
* All Rights Reserved.
*>>>>>> Information <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
* This extended version of TCSTART.S handles I/O redirection
* commands on the application's command line.
* Don't use this version if your preferred command line shell
* implements I/O redirection.
*>>>>>> Export references <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.EXPORT exit, _exit
.EXPORT _BasPag
.EXPORT _app
.EXPORT errno
.EXPORT _AtExitVec, _FilSysVec
.EXPORT _RedirTab
.EXPORT _StkLim
.EXPORT _PgmSize
*>>>>>> Import references <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.IMPORT main
.IMPORT _FpuInit
.IMPORT _StkSize
.IMPORT _FreeAll
*>>>>>> Data structures <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
* Base page structure
.OFFSET 0
TpaStart:
.DS.L 1
TpaEnd:
.DS.L 1
TextSegStart:
.DS.L 1
TextSegSize:
.DS.L 1
DataSegStart:
.DS.L 1
DataSegSize:
.DS.L 1
BssSegStart:
.DS.L 1
BssSegSize:
.DS.L 1
DtaPtr:
.DS.L 1
PntPrcPtr:
.DS.L 1
Reserved0:
.DS.L 1
EnvStrPtr:
.DS.L 1
Reserved1:
.DS.B 7
CurDrv:
.DS.B 1
Reserved2:
.DS.L 18
CmdLine:
.DS.B 128
BasePageSize:
.DS 0
*>>>>>>> Constants <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
ARGV EQU A2
BASPAGPTR EQU A3
ENVP EQU A4
REDIROUT EQU A5
REDIRIN EQU A6
ARGC EQU D3
REDIRFLAG EQU D4
REDIROHNDL EQU D5
REDIRIHNDL EQU D6
REDOUT EQU 00
REDAPP EQU 01
REDIN EQU 02
stdin EQU 00
stdout EQU 01
*>>>>>>> Data segment <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.BSS
* Pointer to base page
_BasPag:
.DS.L 1
* Applikation flag
_app:
.DS.W 1
* Stack limit
_StkLim:
.DS.L 1
* Program size
_PgmSize:
.DS.L 1
* Redirection address table
_RedirTab:
.DS.L 6
*>>>>>>> Initialized data segment <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.DATA
* Global error variable
errno:
.DC.W 0
* Vector for atexit
_AtExitVec:
.DC.L 0
* Vector for file system deinitialization
_FilSysVec:
.DC.L 0
*>>>>>>> Code segment <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.CODE
******** TcStart ********************************************************
Start:
BRA.B Start0
******* Configuration data
* Redirection array pointer
.DC.L _RedirTab
* Stack size entry
.DC.L _StkSize
******* Tc library copyright note
.ALIGN 16
.DC.B '>>> TURBO-C <<<<'
.DC.B ' for ATARI-ST '
.DC.B ' Version 1.1 '
.DC.B '(C)88/89 Borland'
.DC.B ' International '
EmpStr:
.DC.B $00
.EVEN
******** Tc startup code
* Setup pointer to base page
Start0:
MOVE.L A0, A3
MOVE.L A3, D0
BNE ACC
MOVE.L 4(A7), A3 ; BasePagePointer from Stack
MOVEQ.L #1, D0 ; Program is Application
BRA APP
ACC:
CLR.W D0 ; Program is DeskAccessory
APP:
MOVE.L A3, _BasPag
* Setup applikation flag
MOVE.W D0,_app
* Compute size of required memory
* Compute size of required memory
* := text segment size + data segment size + bss segment size
* + stack size + base page size
* (base page size includes stack size)
MOVE.L TextSegSize(BASPAGPTR),A0
ADD.L DataSegSize(BASPAGPTR),A0
ADD.L BssSegSize(BASPAGPTR),A0
ADD.W #BasePageSize,A0
* Setup longword aligned application stack
MOVE.L BASPAGPTR,D0
ADD.L A0,D0
AND.B #$FC,D0
MOVE.L D0,A7
* Setup stack limit variable
SUB.L #_StkSize-256,D0
MOVE.L D0,_StkLim
* scan environment
SUB.L #250, D0
AND.B #$FC, D0
MOVE.L D0, A1
MOVE.L A1, A4
MOVE.L EnvStrPtr(BASPAGPTR), A2
MOVE.L A2, (A1)+
Start1:
TST.B (A2)+
BNE Start1
MOVE.L A2, (A1)+
TST.B (A2)+
BNE Start1
CLR.L -(A1)
* Free not required memory
MOVE.L A0,-(A7)
MOVE.L BASPAGPTR,-(A7)
MOVE.W #0,-(A7)
MOVE.W #74,-(A7)
TRAP #1
LEA.L 12(A7),A7
* Test if fpu 68881 is present
JSR _FpuInit
* scan commandline
LEA CmdLine(BASPAGPTR), A0
MOVE #1, ARGC
MOVE.B (A0), D1
EXT.W D1
CLR REDIRFLAG
LEA 1(A0, D1.W), A1
CLR.B (A1)
CLR.l -(A7) * argv[argc] = 0
BRA Start7
Start2: * testing output redirection
CMPI.B #'>', (A1)
BNE Start3
CLR.B (A1)
SUBQ #1, A1
LEA 2(A1), REDIROUT
BSET #REDOUT, REDIRFLAG
SUBQ #1, D1
BMI Start8
CMPI.B #'>', (A1) * append ?
BNE Start3
CLR.B (A1)
BSET #REDAPP, REDIRFLAG
BRA Start7
Start3: * testing input redirection
CMPI.B #'<', (A1)
BNE Start4
CLR.B (A1)
LEA 1(A1), REDIRIN
BSET #REDIN, REDIRFLAG
BRA Start7
Start4: * testing blank (seperator)
CMPI.B #' '+1, (A1)
BPL Start5
CLR.B (A1)
TST.B 1(A1)
BEQ Start5
PEA 1(A1)
ADDQ #1, ARGC
BRA Start7
Start5: * testing quotation marks
CMPI.B #'"', (A1)
BNE Start7
MOVE.B #0, (A1)
Start6: * scan previous
SUBQ #1, A1
CMPI.B #'"', (A1)
DBEQ D1, Start6
TST D1
BMI Start8
PEA 1(A1)
ADDQ #1, ARGC
CLR.B (A1)
Start7:
SUBQ.L #1, A1
DBF D1, Start2
Start8:
TST.B 1(A1)
BEQ Start9
PEA 1(A1)
ADDQ #1, ARGC
Start9:
PEA EmpStr
MOVE.L A7, ARGV
* EXECUTE REDIRECTION
SUB.L #$A, A7 * GET SPACE FOR PARAMS ON STACK
BTST #REDOUT, REDIRFLAG
BEQ Start12
MOVE.L REDIROUT, 2(A7)
BTST #REDAPP, REDIRFLAG
BEQ Start10
MOVE #1, 6(A7)
MOVE #$3D, (A7) * Fopen
TRAP #1
TST.L D0
BMI Start10
MOVE D0, D5
MOVE #2, 8(A7)
MOVE D5, 6(A7)
CLR.L 2(A7)
MOVE #$42, (A7) * Fseek
TRAP #1
MOVE D5, D0
BRA Start11
Start10:
CLR 6(A7)
MOVE #$3C, (A7)
TRAP #1 * Fcreate
TST.L D0
BMI Start12
Start11:
MOVE D0, 4(A7)
MOVE #stdout, 2(A7)
MOVE #$46, (A7) * Fforce
TRAP #1
Start12:
BTST #REDIN, REDIRFLAG
BEQ Start13
MOVE #0, 6(A7)
MOVE.L REDIRIN, 2(A7)
MOVE #$3D, (A7) * Fopen
TRAP #1
TST.L D0
BMI Start13
MOVE D0, 4(A7)
MOVE #stdin, 2(A7)
MOVE #$46, (A7) * Fforce
TRAP #1
Start13:
ADD.L #$A, A7 * FREE PARAMETER SPACE
******* Execute main program *******************************************
*
* Parameter passing:
* <D0.W> = Command line argument count (argc)
* <A0.L> = Pointer to command line argument pointer array (argv)
* <A1.L> = Pointer to tos environment string (env)
MOVE ARGC, D0
MOVE.L ARGV, A0
MOVE.L ENVP, A1
JSR main
******** exit ***********************************************************
*
* Terminate program
*
* Entry parameters:
* <D0.W> = Termination status : Integer
* Return parameters:
* Never returns
exit:
MOVE.W D0,-(A7)
* Execute all registered atexit procedures
MOVE.L _AtExitVec,D0
BEQ _exit
MOVE.L D0,A0
JSR (A0)
* Deinitialize file system
_exit:
MOVE.L _FilSysVec,D0
BEQ Exit1
MOVE.L D0,A0
JSR (A0)
* Deallocate all heap blocks
Exit1:
JSR _FreeAll
* Program termination with return code
MOVE.W #76,-(A7)
TRAP #1
******* Module end *****************************************************
.END