* 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: * = Command line argument count (argc) * = Pointer to command line argument pointer array (argv) * = Pointer to tos environment string (env) MOVE D3, D0 MOVE.L A5, A0 MOVE.L A4, A1 JSR main ******** exit *********************************************************** * * Terminate program * * Entry parameters: * = 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