411 lines
7.5 KiB
ArmAsm
411 lines
7.5 KiB
ArmAsm
* 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
|
||
|