home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Vectronix 2
/
VECTRONIX2.iso
/
FILES_01
/
PC_V11_A.LZH
/
LIB
/
PCVSTART.S
< prev
next >
Wrap
Text File
|
1991-08-13
|
8KB
|
411 lines
* PCVSTART.S
*
* Pure C Startup Code
*
* Copyright (c) Borland International 1988/89/90
* All Rights Reserved.
*>>>>>> Information <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
* This version of PCSTART.S handles extended argument
* passing via the ARGV= environment variable.
*>>>>>> Export references <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.EXPORT exit, __exit
.EXPORT _BasPag
.EXPORT _app
.EXPORT errno
.EXPORT _AtExitVec, _FilSysVec
.EXPORT _RedirTab
.EXPORT _StkLim
.EXPORT _PgmSize
.EXPORT __text, __data, __bss
*>>>>>> 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
*>>>>>>> Data segment <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.BSS
__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
__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
__text:
******** PcStart ********************************************************
Start:
BRA.B Start0
******* Configuration data
* Redirection array pointer
.DC.L _RedirTab
* Stack size entry
.DC.L _StkSize
******* Pc library copyright note
.ALIGN 16
.DC.B '>>>> PURE-C <<<<'
.DC.B ' for ATARI-ST '
.DC.B ' Version 1.0 '
.DC.B '(C)88-90 Borland'
.DC.B ' International '
EmpStr:
.DC.B $00
.EVEN
******** Pc 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
* := text segment size + data segment size + bss segment size
* + stack size + base page size
* (base page size includes stack size)
MOVE.L TextSegSize(A3),A0
ADD.L DataSegSize(A3),A0
ADD.L BssSegSize(A3),A0
ADD.W #BasePageSize,A0
MOVE.L A0, _PgmSize
* Setup longword aligned application stack
MOVE.L A3,D0
ADD.L A0,D0
AND.B #$FC,D0
MOVE.L D0,A7
* check application flag
TST.W _app
BEQ Start8 * No environment and no arguments
* Free not required memory
MOVE.L A0,-(A7)
MOVE.L A3,-(A7)
MOVE.W #0,-(A7)
MOVE.W #74,-(A7)
TRAP #1
LEA.L 12(A7),A7
* scan environment
MOVE.L A7, D0
SUB.L #_StkSize-4, D0
AND.B #$FC, D0
MOVE.L D0, A1
MOVE.L A1, A4 * this is envp
MOVE.L EnvStrPtr(A3), A2
MOVE.B CmdLine(A3), D5
MOVE.B #'=', D6
MOVE.L #'VGRA', D7
MOVEA.L A7, A6
ScanEnvLoop:
MOVE.L A2, (A1)+
MOVEA.L A2, A5
TST.B (A2)+
BEQ ScanEnvExit
Start1:
TST.B (A2)+
BNE Start1
MOVE.B (A5)+, -(A6)
MOVE.B (A5)+, -(A6)
MOVE.B (A5)+, -(A6)
MOVE.B (A5)+, -(A6)
CMP.L (A6)+, D7 * ARGV ?
BNE ScanEnvLoop
CMP.B (A5), D6 * ARGV= ?
BNE ScanEnvLoop
CMP.B #127, D5 * commandLength == 127 ?
BNE ScanEnvLoop
* now we have found extended arguments
CLR.B -4(A5)
CLR.L -4(A1)
MOVE.L A1, A5 * this is argv
CLR.L D3 * this is argc
MOVE.L A2, (A1)+
xArgLoop:
TST.B (A2)+
BNE xArgLoop
MOVE.L A2, (A1)+
ADDQ.L #1, D3
TST.B (A2)
BNE xArgLoop
MOVE.L A1, A6 * stack limit
CLR.L -(A1)
BRA Start8 * we don't need to parse basepage's tail
ScanEnvExit:
MOVE.L A1, A6 * stack limit
CLR.L -(A1)
* scan commandline
LEA CmdLine(A3), A0
MOVE #1, D3
MOVE.B (A0), D1
EXT.W D1
LEA 1(A0, D1.W), A1
CLR.B (A1)
CLR.l -(A7) * argv[argc] = 0
BRA Start5
Start2: * testing blank (seperator)
CMPI.B #' '+1, (A1)
BPL Start3
CLR.B (A1)
TST.B 1(A1)
BEQ Start3
PEA 1(A1)
ADDQ #1, D3
BRA Start5
Start3: * testing quotation marks
CMPI.B #'"', (A1)
BNE Start5
MOVE.B #0, (A1)
Start4: * scan previous
SUBQ #1, A1
CMPI.B #'"', (A1)
DBEQ D1, Start4
SUBQ #1, D1
BMI Start6
PEA 1(A1)
ADDQ #1, D3
CLR.B (A1)
Start5:
SUBQ.L #1, A1
DBF D1, Start2
Start6:
TST.B 1(A1)
BEQ Start7
PEA 1(A1)
ADDQ #1, D3
Start7:
PEA EmpStr
MOVEA.L A7, A5
* Test if fpu 68881 is present
Start8:
JSR _fpuinit
* calculate stack limit
LEA 256(A6), A6 * minimum stacksize to call library
MOVE.L A6, _StkLim
******* 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 D3, D0
MOVE.L A5, A0
MOVE.L A4, 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