*
* CHANGES MADE FOR REV 3.0 AUG 83  rdq
*
	MNAME   ASM
	SPRINT

	DEF     ASM_ASM,ASM_POWERUP,ASM_ERRMSG,G_DOLLAR,STACKFUDGE
	DEF     ASM_USERPROGRAM,ASM_CI_SWITCH,ASM_FINDROMS,ASM_CPYMSG
	DEF     ASM_ICACHE_ON,ASM_ICACHE_OFF,ASM_FLUSH_ICACHE              {3/35/85}
	DEF     M68KTYPE,MSYSFLAGS                                      (rdq)
	DEF     HFSBFLG,LOWCODE,ASM_NOBOOT
	DEF     ASM_IAND,ASM_IOR
	LMODE   INITLOAD_INITLOAD
	REFA    INITLOAD_INITLOAD
	INCLUDE ASM_SYMS.TEXT

 SRC MODULE ASM;
 SRC IMPORT SYSGLOBALS;
 SRC EXPORT
 SRC TYPE
 SRC STRINGMAX = STRING[255];
 SRC  PROCEDURE MOVELEFT (ANYVAR S,D: INTEGER; Z:INTEGER);
 SRC  PROCEDURE MOVERIGHT(ANYVAR S,D: INTEGER; Z:INTEGER);
 SRC  PROCEDURE FASTMOVE (       S,D: ANYPTR;  Z:INTEGER);
 SRC  PROCEDURE NEWBYTES(VAR P: ANYPTR;        Z:INTEGER);
 SRC  PROCEDURE POWERUP;
 SRC  PROCEDURE ERRMSG;
 SRC  PROCEDURE FINDROMS;
 SRC  PROCEDURE F_PWR_ON;
 SRC  PROCEDURE FLPYREAD(SECTOR: INTEGER;  ANYVAR BUFFER: INTEGER);
 SRC  PROCEDURE FLPY_WRT(SECTOR: INTEGER;  ANYVAR BUFFER: INTEGER);
 SRC  PROCEDURE FLPYMREAD(SECTOR_COUNT, SECTOR: INTEGER;  ANYVAR BUFFER: INTEGER);
 SRC  PROCEDURE FLPYMWRITE(SECTOR_COUNT, SECTOR: INTEGER;  ANYVAR BUFFER: INTEGER);
 SRC  PROCEDURE FLPYINIT(PTR: ANYPTR; I: SHORTINT);
 SRC  PROCEDURE SETINTLEVEL(LEVEL: INTEGER);
 SRC  FUNCTION  INTLEVEL:  INTEGER;
 SRC  PROCEDURE NEWWORDS(VAR P: ANYPTR; WORDSIZE: INTEGER);
 SRC  PROCEDURE USERPROGRAM (EXECLOC,INITSP: INTEGER);
 SRC  PROCEDURE SAPPEND(VAR DEST: STRING;SRC:STRINGMAX);
 SRC  FUNCTION IAND(A,B: INTEGER): INTEGER;
 SRC  FUNCTION IOR (A,B: INTEGER): INTEGER;
 SRC  PROCEDURE CI_SWITCH;
 SRC  PROCEDURE INITVECTS;
 SRC  PROCEDURE CPYMSG(MSG: STRING255);
 SRC  PROCEDURE NOBOOT;
 SRC  FUNCTION MEMAVAIL:INTEGER;
 SRC  FUNCTION TICKER:INTEGER;
 SRC  PROCEDURE CACHE_ON;
 SRC  PROCEDURE CACHE_OFF;
 SRC  PROCEDURE ICACHE_OFF;
 SRC  PROCEDURE ICACHE_ON;
 SRC  PROCEDURE FLUSH_ICACHE;
 SRC  PROCEDURE CACHE_MODE(WS_MODE:BOOLEAN);
 SRC END;

	REFR    FS_FWRITESTRINT
	REFA    SYSGLOBALS,LOADER

ESCAPECODE      EQU SYSGLOBALS-2
RECOVERBLOCK    EQU SYSGLOBALS-10
HEAPPOINTER     EQU SYSGLOBALS-14
HEAPBASE        EQU SYSGLOBALS-18
IORESULT        EQU SYSGLOBALS-22
SYSDEFS         EQU LOADER-70             LINKED LIST OF PERMANT PROGRAMS

SYSFLAG2        EQU $FFFFFEDA             BOOT ROM FLAGS

SUPSTACKSPACE   EQU 8000        SPACE FOR SUPERVISOR STACK
STACKFUDGE      EQU 500         SLOP SPACE FOR STACK OVERFLOW CHECK

*       MAGIC NUMBERS, CONSULT 'POWERUP' LISTING, DEBUGGER and INITBUG  (rdq)
INITSTACK       EQU $FFFFFB70                                           (rdq)
INITPC          EQU INITSTACK+4                                         (rdq)
INITRECOVER     EQU INITPC+4                                            (rdq)
G_DOLLAR        EQU INITRECOVER+4                                       (rdq)
INITSR          EQU $FFFFFB96                                           (rdq)
M68KTYPE        EQU INITSR+2    PROCESSOR TYPE BYTE 0=68000,else 680xx  (rdq)
MSYSFLAGS       EQU M68KTYPE+1  MORE SYSFLAGS BIT 0 = CACHE PRESENT     (rdq)

LOWMEM          EQU $FFFFFDCE   BOOT ROM DEFINED ADDRESSES
HIGHMEM         EQU $FFFFFB00   LEAVES ROOM FOR VECTORS, MONITOR STUFF, ETC.
TRAP11          EQU $FFFFFF52
TRAP10          EQU $FFFFFF58
TRAP0           EQU $FFFFFF94

F_AREA          EQU $FFFFFED4   BOOTROM 3.0 MAGIC CONSTANTS TO    JS 9/12/83
REMOTE_ADDR     EQU $9A         ALLOW US TO TURN OFF INTERRUPTS   JS 9/12/83
R_INTLVL        EQU 3           IF BOOTING FROM REMOTE INTERFACE  JS 9/12/83
BOOT_ID         EQU $3FFE       CODE BY GREG LAWSON 8/29/83       JS 9/12/83
NO_CARD         EQU $800000                                       JS 9/12/83

CRTMSG          EQU $150
*CRTCLEAR        EQU $148       CAN'T USE DUE TO BOOT ROM BUG
SYSFLAG         EQU -302

JMP             EQU $4EF9
RETURN          EQU A4




LOWCODE EQU *                           LOWEST CODE LOCATION
HIGHCODE EQU *+$100000                  1 MEGABYTE MAX ROM AREA

	DC.B    $F0,$FF,'P',1           ROM HEADER
	DC.L    0,STARTRELOC-*          CHECKSUM, EXECUTION ADDRESS
	DC.B    0,0,0,0,0,0             IDENTIFICATION JUNK

*       RELOCATE A SYSTEM_P FILE LOADED AT THE WRONG ADDRESS BY
*       THE HP-UX BOOTER.  SETS HFSBFLG TO TRUE IF RELOCATION
*       WAS NECESSARY (IT'S NOT IF SYSTEM_P WAS LOADED DIRECTLY BY
*       THE BOOTROM).


* WARNING!!! NEXT TWO LINES EDITED BY TURNIT!!!!
CODESIZE EQU 18308
LOADADDRESS EQU -20000

STARTRELOC EQU  *
	LEA     BOOT_STACK,SP           FIXUP AFTER SECONDARY LOADER

	LEA     LOWCODE,A4              where has OS been loaded?
	LEA     LOADADDRESS,A5
	CMPA.L  A5,A4
	BEQ.S   CODE_IN_PLACE           loaded at proper address

	LEA     HFSBFLG,A0              must be relocated, so it's HFS
	MOVE.B  #1,(A0)

	MOVE.L  #CODESIZE,D0            copy backwards in case of overlap
	ADDA.L  D0,A4                   we will be copying to higher address
	ADDA.L  D0,A5
	BRA.S   MIDLOOP

MOVECODE EQU    *
	MOVE.B  -(A4),-(A5)
MIDLOOP DBRA    D0,MOVECODE

CODE_IN_PLACE EQU *
	JMP     INITLOAD_INITLOAD       OS is now at proper address, so start
*                                       execution

* FLAG TO TELL WHETHER WE BOOTED FROM HFS DISC
* 0 -> NO HFS BOOT, 1 -> HFS BOOT
HFSBFLG DC.W    0

******  ESTABLISH MINIMUM ENVIRONMENT FOR POWERUP LOAD OPERATIONS ********
* NOTE: INITLOAD_INITLOAD  FIRST INSTRUCTION IS JSR ASM_POWERUP
ASM_POWERUP     EQU *
	MOVEA.L (SP)+,RETURN
	LEA     LOWCODE,SP              SOFT SYSTEM STACK = JUST BELOW CODE
	CMPA.L  LOWMEM,SP               TEST FOR HARD OR SOFT SYSTEM
	BHI.S   SOFT                    SOFT IF SP > LOWMEM^
	LEA     HIGHMEM,SP              HARD SYSTEM STACK = HIGH MEMEMORY
SOFT    EQU *

	LEA     -SUPSTACKSPACE(SP),A5   ALLOCATE OPERATING SYSTEM STACK
	LEA     -32768(A5),A5           SYSTEM GLOBALS START AT 32766(A5)
	MOVE.L  A5,G_DOLLAR             SAVE FOR ISR's

	MOVE.L  LOWMEM,HEAPPOINTER(A5)  INITIALIZE HEAP

	CMPI.W  #3,BOOT_ID              3.0 BOOTROM ?         JS 9/12/83
	BNE.S   SKIP                    IF NOT THEN SKIP      JS 9/12/83
	MOVEA.L F_AREA,A0               GET STOLEN RAM PTR    JS 9/12/83
	MOVEA.L REMOTE_ADDR(A0),A0      SEE IF REMOTE BOOT    JS 9/12/83
	CMPA.L  #NO_CARD,A0                                   JS 9/12/83
	BEQ.S   SKIP                    IF NOT THEN SKIP      JS 9/12/83
	CLR.B   R_INTLVL(A0)            ELSE CLEAR INTERRUPTS JS 9/12/83

SKIP    BTST    #4,SYSFLAG2             CHECK FOR 68020               {3/25/85}
	BEQ.S   WHICHP                  IF NOT THEN SKIP              {3/25/85}
	MOVEQ   #0,D0                   ELSE BE SURE ICACHE IS OFF    {3/25/85}
	DC.W    $4E7B,$0002             MOVE D0,CACR                  {3/25/85}
	DC.W    $4E7B,$0002             **********  BUG KLUDGE        {3/25/85}
	BTST    #2,SYSFLAG2             TEST FOR 68030 SFB
	BEQ.S   WHICHP                  DON'T USE WINDOW REG FOR 68020 SFB
	MOVE.L  #TT0_ENABLE,-(SP)       DISABLE DATA CACHING FOR THE ADDRESS
*                                       RANGE $0 - $1FFFFFFF (ALL IO SPACE) SFB
	DC.L    $F0170800               OPCODE TO LOAD THE WINDOW REGISTER
*                                       FROM STACK (NO AUTO-INCREMENT) SFB
	ADDQ    #4,SP                   REMOVE CACHING WORD FROM STACK SFB

WHICHP  BSR     WHICH_PROCESSOR         FINDOUT IF 68000 OR OTHER       (rdq)
	CLR.B   MSYSFLAGS               ASSUME NO CACHES FOR NOW  JWS 3/27/85

	MOVE    #$2000,SR               ENABLE INTERRUPTS

	LEA     TRAP11,A0               SUPERVISOR CALL TRAP
	MOVE    #JMP,(A0)+
	LEA     SUPERCALL,A1
	MOVE.L  A1,(A0)+

*       LEA     TRAP10,A0               ESCAPE(N) TRAP
	MOVE    #JMP,(A0)+
	LEA     ESCN,A1
	MOVE.L  A1,(A0)+

	LEA     TRAP0,A0                COMPILED LINE TRAP
	MOVE    #JMP,(A0)+
	LEA     P_BREAK,A1
	MOVE.L  A1,(A0)+

	JMP     (RETURN)                ALL DONE

ASM_ASM RTS                     ASM MODULE 'BODY'

*****************  TEMPORARY TRAP 10 HANDLER *********************************
ESCN    MOVEA.L RECOVERBLOCK(A5),SP
	RTS

********(rdq)****  PERMANENT TRAP 11 HANDLER *********************************
SUPERCALL EQU *                 TRAP #11, GETS INTO SUPERVISOR MODE, SAVES SR
	TST.B   M68KTYPE
	BNE.S   SUPERCALL_1
	MOVE.W  (SP),-(SP)      MOVE STATUS REGISTER DOWN
	MOVE.L  4(SP),2(SP)     MOVE RETURN ADDRESS DOWN
SUPERCALL_1 EQU *
	MOVE.W  (SP)+,4(SP)     MOVE STATUS REGISTER UP
	RTS                     RETURN TO CALLER IN SUPERVISOR MODE

*****************  TEMPORARY TRAP 0 HANDLER, DISCARDS LINE NO.s *************
P_BREAK ADDQ.L  #2,2(SP)
	RTE

*****************  FINISH ENVIRONMENT SETUP THEN CALL USER PROGRAM **********
ASM_USERPROGRAM EQU     *       PROC USERPROGRAM(ENTRYPOINT,INITSTACK:INTEGER)
	MOVEA.L (SP)+,A3        RETURN ADDRESS
	MOVEA.L (SP)+,A0        INITIAL SP
	MOVEA.L (SP)+,A1        INITIAL PC
	MOVE.L  A3,-(SP)        RESTORE RETURN

	LEA     -STACKFUDGE(A0),A2
	CMPA.L  HEAPPOINTER(A5),A2      COMPARE
	BHI.S   *+4                     TEST
	TRAP    #2                      STACK OVERFLOW

	MOVE.L  RECOVERBLOCK(A5),-(SP)  TRY
	MOVE.L  A6,-(SP)                SAVE A6
	PEA     USER_RECOVER            RECOVER CODE
	MOVE.L  SP,RECOVERBLOCK(A5)

	MOVE.L  SP,INITRECOVER  SAVE FOR DEBUGGER
	MOVE.L  A1,INITPC       SAVE FOR DEBUGGER

	LEA     (A5),A6         FRAME POINTER
	MOVE    A0,USP          SET UP STACK
	MOVE    #$0000,SR       GO INTO USER MODE

	LEA     -8(SP),A2       SPACE FOR RETURN ADDRESS, DYNAMIC LINK
	MOVE.L  A2,INITSTACK    SAVE NON-LOCAL GOTO
	CLR.W   INITSR          FAKE SR FOR STOP KEY                    (rdq)
	CLR.L   HEAPBASE(A5)    FOR MEMORY MANAGER

	JSR     ASM_FLUSH_ICACHE  MAKE SURE ICACHE IS CLEAN      {3/25/85}
	JSR     (A1)            CALL USER PROGRAM

	CLR.W   ESCAPECODE(A5)  NORMAL EXIT
	TRAP    #10             ESCAPE(0), DONE TO CLOSE FILES

USER_RECOVER    EQU *
	MOVEA.L (SP)+,A6        RESTORE A6
	MOVE.L  (SP)+,RECOVERBLOCK(A5)  RESTORE RECOVER BLOCK
	MOVEA.L SP,A0           SAVE STACK POINTER
	TRAP    #11             GET INTO SUPERVISOR MODE
	MOVEA.L A0,SP           RESTORE STACK POINTER
	RTS

*****************  SWITCH TO SUPERVISOR MODE & STACK ************************
ASM_CI_SWITCH EQU *
	MOVEA.L (SP)+,A0        RETURN ADDRESS
	TRAP    #11             GET ONTO SUPERVISOR STACK
	ADDQ    #2,SP           DISCARD SR
	JMP     (A0)            DONE

*****************  HOOK ROM'D MODULES INTO SYSDEFS **************************
K16     EQU     $4000           16 K INCREMENTS
MDLINK  EQU     18              OFFSET OF MODULE DESCRIPTOR
MDSIZE  EQU     40              SIZE OF DESCRIPTOR
ASM_FINDROMS EQU *
	LEA     $20000,A0              BEGINNING OF SEARCH AREA
	MOVEA.L HEAPPOINTER(A5),A1      HEAP START
	MOVE.L  SYSDEFS(A5),D0          LINKED LIST HEAD
SEARCH  CMPI.L  #$F0FF5080,(A0)         PASCAL OPTION?
	BNE.S   NOROM                   NO MATCH
	LEA     MDLINK(A0),A2           LOCATE DESCRIPTOR

COPY    MOVEM.L 4(A2),D1-D7/A3-A4       REMAINDER OF MDB
	MOVEM.L D0-D7/A3-A4,(A1)        COPY ONTO HEAP
	MOVE.L  A1,D0                   INSERT LINK INTO LIST
	ADDA.L  #MDSIZE,A1              ALLOCATE FROM HEAP
	MOVE.L  A1,HEAPPOINTER(A5)      RESTORE HEAP
	MOVE.L  D0,SYSDEFS(A5)          RESTORE LIST

	MOVEA.L (A2),A2         MOVE DOWN CHAIN
	MOVE.L  A2,D1           TEST FOR NIL
	BNE.S   COPY            NOT END OF CHAIN
NOROM   ADDA.W  #K16,A0         NEXT ROM BOUNDARY
	CMPA.L  #$200000,A0     END OF ROM AREA?
	BNE.S   SEARCH          NOPE
FINDXIT RTS

******************** IAND AND IOR ***************************
ASM_IAND MOVEA.L (SP)+,A0
	MOVE.L  (SP)+,D0
	AND.L   (SP)+,D0
	MOVE.L  D0,(SP)
	JMP     (A0)

ASM_IOR MOVEA.L (SP)+,A0
	MOVE.L  (SP)+,D0
	OR.L    (SP)+,D0
	MOVE.L  D0,(SP)
	JMP     (A0)

*****************  CRT CLEAR ROUTINE ****************************************
CRTCLEAR        EQU *
	LINK    A6,#-82
	LEA     (SP),A0
	MOVEQ   #79,D0
	BTST    #0,SYSFLAG      TEST FOR 50 CHAR SCREEN
	BEQ.S   LC1
	MOVEQ   #49,D0
LC1     MOVE.B  #' ',(A0)+
	DBRA    D0,LC1
	CLR.B   (A0)
	CLR.B   -1(A6)
LC2     LEA     (SP),A0
	CLR     D0
	MOVE.B  -1(A6),D0
	JSR     CRTMSG
	ADDQ.B  #1,-1(A6)
	CMPI.B  #24,-1(A6)
	BNE.S   LC2
	UNLK    A6
	RTS

*****************   CANNOT BOOT FROM HFS **************************
ASM_NOBOOT      EQU     *
	JSR     CRTCLEAR
	MOVEQ   #0,D0
	LEA     M2,A0
	JSR     CRTMSG
	BRA.S   *

*****************  INTRODUCTORY MESSAGE ROUTINE  ****************************
ASM_CPYMSG      EQU *
	JSR     CRTCLEAR
	MOVEQ   #0,D0
	LEA     M,A0                    COPYRIGHT NOTICE
	JSR     CRTMSG
	MOVEQ   #2,D0
	MOVEA.L (SP)+,A1
	MOVEA.L (SP)+,A0
	CLR     D1
	MOVE.B  (A0)+,D1
	CLR.B   0(A0,D1)
	MOVE.L  A1,-(SP)
	JSR     CRTMSG
	RTS

*****************  PRIMITIVE ERROR MESSAGE ROUTINE  *************************
STR     EQU -86
I       EQU -4

INT     CLR.L   D1
	MOVE.B  STR(A6),D1
	ADDQ.L  #1,D1
	MOVE.L  D1,I(A6)
	MOVE.B  #80,-(SP)
	PEA     STR(A6)
	PEA     I(A6)
	MOVE.L  D0,-(SP)
	MOVE.W  #-1,-(SP)
	JSR     FS_FWRITESTRINT
	RTS

ASM_ERRMSG  EQU *
	TRAP    #11
	LINK    A6,#STR
	JSR     CRTCLEAR
	MOVEM.L M1,D1-D5
	MOVEM.L D1-D5,STR(A6)
	MOVE.L  IORESULT(A5),D0
	BSR.S   INT
	MOVE.W  ESCAPECODE(A5),D0
	EXT.L   D0
	BSR.S   INT
	CLR.L   D0
	LEA     STR(A6),A0
	CLR     D1
	MOVE.B  (A0),D1
	CLR.B   1(A0,D1)
	ADDQ    #1,A0
	JSR     CRTMSG

	MOVEQ   #28,D0
L       DBRA    D1,L
	DBRA    D0,L

	UNLK    A6
	MOVE    (SP)+,SR
	RTS

******(rdq)******  FIND OUT WHICH PROCESSOR NOW RUNNING **********************
WHICH_PROCESSOR EQU *
	LEA     TRAP11,A0       SETUP TRAP11
	MOVE.W  #JMP,(A0)+      THIS SETUP WILL BE DISCARDED
	MOVE.L  #TRAP_SERV,(A0)
	MOVE.L  SP,D0           SAVE STACK LOCATION
	TRAP    #11             FIND OUT HOW MANY BYTES PUSHED ON STACK
	SUBQ.L  #6,D0
	SNE     M68KTYPE        =0 is 68000 <>0 is 680xx
	RTS
TRAP_SERV       EQU *
	SUB.L   SP,D0
	RTE

*******************  ICACHE MANAGEMENT ROUTINES  ****************************
*
*          3/25/85 BY JWS
*
ASM_ICACHE_OFF EQU *
	BTST    #4,SYSFLAG2     CHECK FOR 68020
	BEQ.S   ICACHE_RET      IF NOT THEN RETURN
	TRAP    #11             BE SURE WE ARE IN SUPERVISOR MODE
	MOVE.L  D0,-(SP)        SAVE A REGISTER
	MOVEQ   #0,D0
ICACHE1 DC.W    $4E7B,$0002     MOVE D0,CACR
	DC.W    $4E7B,$0002     ***** FOR 68020 BUG
	MOVE.L  (SP)+,D0        RESTORE REGS
	MOVE    (SP)+,SR        RESTORE SR
ICACHE_RET RTS
*
*
ASM_ICACHE_ON EQU *
	BTST    #4,SYSFLAG2     CHECK FOR 68020
	BEQ     ICACHE_RET      IF NOT THEN RETURN
	TRAP    #11             GOTO SUPERVISOR MODE
	MOVE.L  D0,-(SP)
	MOVE.W  #$3919,D0       SET ENABLE AND CLEAR BITS (TURN ON D-CACHE
*                               ENABLE WRITE ALLOCATE, AND BURST MODE FOR
*                               68030. SFB/RDQ/DD)
	BRA     ICACHE1
*
*
ASM_FLUSH_ICACHE EQU *
	BTST    #4,SYSFLAG2     CHECK FOR 68020
	BEQ     ICACHE_RET      RET IF NOT
	TRAP    #11             SUPERVISOR STATE
	MOVE.L  D0,-(SP)
	DC.W    $4E7A,$0002     MOVE CACR,D0
	OR.W    #$808,D0        SET CLEAR BIT (ALSO CLEAR 68030 D-CACHE.
*                               SFB/RDQ/DD)
	BRA     ICACHE1

*-----------------------------------------------------------
M       DC.B    'Copyright Hewlett-Packard Company, 1982, 1989.',0
M1      DC.B    18,'IORESULT, ERROR = '
M2      DC.B    'This system file cannot boot from an HFS disc.',0

	NOSYMS
	END


