; *** STARTUP.ASM

; ERROR CODES

CANTINTSYSTEM	EQU 20
CANTOPENWINDOW	EQU 21
CANTOPENSCREEN	EQU 22
CANTALLOCMEM	EQU 23
CANTOPENDEVICE	EQU 24

; *** SYSTEM STARTUP CODE

_START
 MOVE.L SP,_STACK
 MOVE.L A0,COMMAND
 MOVE.L D0,CMDLEN
 SUBA.L A1,A1
 SYSLIB FINDTASK
 MOVE.L D0,_TASK
NOWSTARTUP
 MOVE.L #1,ENDFROMWB	;ASSUME ITS FROM WB
 MOVE.L D0,A2
 TST.L PROC.CLI(A2)	;TEST ID TASK IS FROM CLI
 BEQ.S FROM_WB

FROM_CLI		;CLI PROCESS
 MOVE.L #0,ENDFROMWB
 MOVE.L #1,ENDFROMCLI
 MOVE.L COMMAND,A0
 MOVE.L CMDLEN,D0
 CLR.B -1(A0,D0.W)
 BSR OPENDOS
 DOSLIB INPUT
 MOVE.L D0,STDIN
 DOSLIB OUTPUT
 MOVE.L D0,STDOUT
 MOVE.L D0,STDERR
 BRA NOWDOMAIN

FROM_WB		;WB PROCESS
 BSR OPENDOS
 LEA PROC.MSGPORT(A2),A0
 SYSLIB WAITPORT
 LEA PROC.MSGPORT(A2),A0
 SYSLIB GETMSG
 MOVE.L D0,WBMSG

 IFD WBC		;WANT DEFAULT WB CONSOLE?
DEFAULTCONSOLE
 MOVE.L #NEWCONSOLE,D1
 MOVE.L #MODE_NEWFILE,D2
 DOSLIB OPEN		;OPEN DEFAULT CONSOLE
 MOVE.L D0,STDIN
 MOVE.L D0,STDOUT
 MOVE.L D0,STDERR
 BEQ _STARTERROR	;GIVE UP IF CONSOLE ISN'T THERE
SETCONTASK		;BCPL POINTER
 LSL.L #2,D0
 MOVE.L D0,A0
 MOVE.L _TASK,A2
 MOVE.L FH.TYPE(A0),PROC.CONSOLETASK(A2)
 ENDC

; *** OPEN LIBRARIES AND RUN USER'S CODE 'MAIN'

NOWDOMAIN
 BSR OPENLIBS
 BSR MAIN		;BRANCH TO PROGRAM CODE STARTING AT MAIN
 TST.L ENDFROMWB	;IF WORKBENCH PROGRAM CLOSE DEFAULT CONSOLE WINDOW
 BEQ _ERROR
 MOVE.L STDOUT,D1	;IF IT WASN'T OPENED SKIP IT
 BEQ _ERROR
 DOSLIB CLOSE

; *** NOW CLEAN UP AND EXIT SYSTEM

_ERROR		;RETURN HERE FROM MAIN TO CLEAR THINGS UP AND EXIT
 MOVE.L D0,-(SP)
 TST.L WBMSG		;WAS THERE A WB MESSAGE
 BEQ.S MORFINISH
 MOVE.L WBMSG,A1
 SYSLIB REPLYMSG
MORFINISH
 MOVE.L REMEMBERKEY,D0
 BEQ.S 2$
 LEA REMEMBERKEY,A0
 MOVEQ.L #1,D0
 INTLIB FREEREMEMBER	;GIVE BACK REMEMBER MEMORY
2$
 MOVE.L _GFXBASE,D0	;CLOSE LIBRARIES
 BEQ.S 3$
 BSR _CLOSELIB
3$
 MOVE.L _INTBASE,D0
 BEQ.S 4$
 BSR _CLOSELIB
4$
 MOVE.L _MATHBASE,D0
 BEQ.S 5$
 BSR _CLOSELIB
5$
 MOVE.L _MATHTRANSBASE,D0
 BEQ.S 6$
 BSR _CLOSELIB
6$
 MOVE.L _DOSBASE,D0
 BEQ.S 7$
 BSR _CLOSELIB
7$
 MOVE.L (SP)+,D0
 MOVE.L _STACK,SP
 RTS

_STARTERROR
 MOVEQ #CANTINTSYSTEM,D0
 BRA _ERROR

_OPENLIB
 MOVE.L #0,D0
 SYSLIB OPENLIBRARY
 RTS

_CLOSELIB
 MOVE.L D0,A1
 SYSLIB CLOSELIBRARY
 RTS

OPENDOS
 LEA _DOSNAME,A1
 BSR _OPENLIB
 MOVE.L D0,_DOSBASE
 BEQ _STARTERROR
 RTS

OPENLIBS
 IFD GFX
 LEA _GFXNAME,A1
 BSR _OPENLIB
 MOVE.L D0,_GFXBASE
 BEQ _STARTERROR
 ENDC
 IFD INT
 LEA _INTNAME,A1
 BSR _OPENLIB
 MOVE.L D0,_INTBASE
 BEQ _STARTERROR
 ENDC
 IFD FFP
 LEA _MATHNAME,A1
 BSR _OPENLIB
 MOVE.L D0,_MATHBASE
 BEQ _STARTERROR
 ENDC
 IFD TRA
 LEA _MATHTRANSNAME,A1
 BSR _OPENLIB
 MOVE.L D0,_MATHTRANSBASE
 BEQ _STARTERROR
 ENDC
 RTS

; *** STARTUP DATA STORAGE

_STACK DC.L 0
_TASK DC.L 0
_DOSBASE DC.L 0
_GFXBASE DC.L 0
_INTBASE DC.L 0
_MATHBASE DC.L 0
_MATHTRANSBASE DC.L 0
REMEMBERKEY DC.L 0
COMMAND DC.L 0
CMDLEN DC.L 0
WBMSG DC.L 0
STDIN DC.L 0
STDOUT DC.L 0
STDERR DC.L 0
ENDFROMWB DC.L 0	;=1 IF WB
ENDFROMCLI DC.L 0	;=1 IF CLI
 EVENPC
_DOSNAME DC.B 'dos.library',0		;LIBRARY FILE NAMES
 EVENPC
_GFXNAME DC.B 'graphics.library',0
 EVENPC
_INTNAME DC.B 'intuition.library',0
 EVENPC
_MATHNAME DC.B 'mathffp.library',0
 EVENPC
_MATHTRANSNAME DC.B 'MATHTRANS.LIBRARY',0
 EVENPC
NEWCONSOLE
 DC.B 'CON:20/20/400/100/PROGRAM I/O'
 EVENPC

