; *** 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