	mname   ROMcall

	def     asm_f_pwr_on,asm_flpyread,asm_flpy_wrt,asm_flpyinit
	def     asm_flpymread,asm_flpymwrite,asm_cache_on,asm_cache_off
	def     boot_lifhead,boot_findfile
	def     boot_minit,boot_mfopen,boot_mfclose,boot_mread
	def     asm_cache_mode                          rdq 10 jan 89
	refa    sysglobals,msysflags
	REFA    ASM_ICACHE_OFF,ASM_ICACHE_ON,ASM_FLUSH_ICACHE  3/27/85
	LMODE   ASM_ICACHE_OFF,ASM_ICACHE_ON,ASM_FLUSH_ICACHE  3/27/85
	INCLUDE ASM_SYMS.TEXT

escapecode      equ sysglobals-2
recoverblock    equ sysglobals-10
intvec2         equ -72                 vector for interrupt level 2
boot_id         equ $3FFE
SYSFLAG2        equ $FFFFFEDA

*  hard coded addresses:
flpyread        equ $120        288
flpy_wrt        equ $124        292
fintrupt        equ $128        296
flpyinit        equ $12C        300
flpymread       equ $130        304
flpymwrite      equ $134        308
f_pwr_on        equ $144        324
lifhead         equ     $18C
*findfile        equ     $190

minit           equ     $4004
mfopen          equ     $4008
mfclose         equ     $4010
mread           equ     $400C

A       equ     a0      address of boot ROM routine
R       equ     a4      return address
F       equ     d4      function result


boot_mfopen     equ  *
	lea     mfopen,A

f2_16   movea.l (sp)+,R                         get return address
	movem.l (sp)+,d1-d4                     get parameters
	move.l  R,-(sp)                         put return address back
	bsr.s   fixit                           get into boot ROM environment
	clr.w   -(sp)                           function result
	movem.l d1-d4,-(sp)                     push parameters
	bra.s   rom_fun


boot_minit      equ  *
	lea     minit,A

f2_4    movea.l (sp)+,R                         get return address
	move.l  (sp)+,d1                        get parameters
	move.l  R,-(sp)                         put return address back
	bsr.s   fixit                           get into boot ROM environment
	clr.w   -(sp)                           function result
	move.l  d1,-(sp)                        push parameters

rom_fun jsr     (A)                             call boot ROM
	move.w  (sp)+,F                         get function result
	bsr.s   unfix                           return to user environment
	move.w  F,4(sp)                         put back function result
	rts                                     return

asm_flpyinit equ *
	lea     flpyinit,A
	movea.l (sp)+,R                         get return address
	movem.w (sp)+,d1-d3                     get parameters
	move.l  R,-(sp)                         put return address back
	BSR.S   FIXIT                   (rdq)   get into boot ROM environment
	movem.w d1-d3,-(sp)                     push parameters

rom_jsr jsr     (A)                             call boot ROM
ROM_XIT bsr.s   unfix                           restore user envirnoment
	rts                                     return to user

fixit   LEA     ROM_RECOVER,A1                  (rdq)
	movea.l (sp)+,R                         fetch return address
	trap    #11                             get into supervisor mode
	BTST    #4,SYSFLAG2                     DO WE HAVE A 68020   3/27/85
	BEQ.S   fixitb                          IF NOT THEN SKIP
	JSR     ASM_CACHE_OFF                   DISABLE EXTERNAL CACHE
	JSR     ASM_ICACHE_OFF                  TURN OFF 68020 ICACHE  3/27/85
fixitb  lea     intvec2,a3                      save floppy vector
	move.w  (a3)+,-(sp)                     save jmp/jsr
	move.l  (a3)+,-(sp)                     save address
	move.l  #fintrupt,-(a3)                 set up boot ROM floppy vector
	move.w  #$4EF9,-(a3)                    (jmp)
	link    a5,#-2                          primitive try/recover
	PEA     (A1)                            (rdq) RECOVER ADDRESS
	pea     (sp)
	CMPI.W  #3,BOOT_ID                      3.0 BUG FIX jws
	BNE.S   FIXIT1                          3.0 BUG FIX jws
	BSR     ASM_CACHE_OFF                   3.0 BUG FIX jws
FIXIT1  jmp     (R)                             return to call

UNFIX   CMPI.W  #3,BOOT_ID                      3.0 BUG FIX jws
	BNE.S   UNFIX1                          3.0 BUG FIX jws
	BSR     ASM_CACHE_ON                    3.0 BUG FIX jws
UNFIX1  movea.l (sp)+,R                         fetch return address
	unlk    a5                              pop recover stuff
	lea     intvec2+6,a3                    restore floppy vector
	move.l  (sp)+,-(a3)                     address
	move.w  (sp)+,-(a3)                     jmp
	move    (sp)+,sr                        restore user mode
	BTST    #4,SYSFLAG2                IS THIS A 68020?
	BEQ.S   UNFXRT                     IF NOT THEN SKIP
	JSR     ASM_ICACHE_ON              FLUSH ICACHE  3/27/85
	TST.B   MSYSFLAGS                  DO WE HAVE EXT. CACHE?
	BEQ.S   UNFXRT                     IF NOT THEN SKIP
	MOVEA.L #CACHE_CTL,A0              CLEAR 68020 CACHE
	MOVE.W  (A0),D0                    FETCH CURRENT STATUS
	ANDI.W  #$0007,D0                  CLEAR TST AND ERR BITS
	OR.B    #$64,D0                    SET CE, IEN, FPE  BITS
	MOVE.W  D0,(A0)                    PUT IT BACK
UNFXRT  jmp     (R)                             return to call



boot_mread      equ  *
	lea     mread,A

byte_14 movea.l (sp)+,R                         get return address
	movem.w (sp)+,d1-d7                     get parameters
	move.l  R,-(sp)                         put return address back
	bsr     fixit                           get into boot ROM environment
	movem.w d1-d7,-(sp)                     push parameters
	bra     rom_jsr



boot_mfclose    equ *
	lea     mfclose,A
	bra.s   no_parm

asm_f_pwr_on equ *
	lea     f_pwr_on,A                      boot ROM mini reset

no_parm bsr     fixit                           get into boot ROM environment
	bra     rom_jsr



boot_lifhead equ *
	lea     lifhead,A
	bra.s   byte_8

asm_flpy_wrt equ *
	lea     flpy_wrt,A                      boot ROM single-sector write
	bra.s   byte_8

asm_flpyread equ *
	lea     flpyread,A                      boot ROM single-sector read

byte_8  movea.l (sp)+,R                         get return address
	movem.l (sp)+,d1-d2                     get parameters
	move.l  R,-(sp)                         put return address back
	bsr     fixit                           get into boot ROM environment
	movem.l d1-d2,-(sp)                     push parameters
	bra     rom_jsr



asm_flpymwrite equ *
	lea     flpymwrite,A                    boot ROM multisector write
	bra.s   byte_12

asm_flpymread equ *
	lea     flpymread,A                     boot ROM multisector read

byte_12 movea.l (sp)+,R                         get return address
	movem.l (sp)+,d1-d3                     get parameters
	move.l  R,-(sp)                         put return address back
	bsr     fixit                           get into boot ROM environment
	movem.l d1-d3,-(sp)                     push parameters
	bra     rom_jsr

rom_recover equ *                               escape from boot ROM
	move.w  (sp)+,d4                        get escapecode
	bsr     unfix                           return to user environment
	move.w  d4,escapecode(a5)               restore escapecode
	trap    #10                             escape(escapecode)



FUBUFFER EQU     $FFFFFDD2       FLOPPY UNIVERSAL BUFFER {RQ}

BOOT_FINDFILE   EQU *
	 MOVEA.L (SP)+,A1              RETURN ADDRESS
	 MOVE.L  (SP)+,D2              GET DIR START
	 MOVE.L  (SP)+,D3              GET DIR LEN
	 MOVEA.L (SP)+,A0              GET FILE NAME ADDR
	 MOVEA.L (SP)+,A4              GET ADDR OF CAT ENTRY
	 MOVE.L  A1,-(SP)              RESTORE RETURN ADDRESS
NXTDSECTOR LEA   FUBUFFER,A2
	 MOVEM.L D2/D3/A0/A2/A4,-(SP)     SAVE REGS
	 MOVE.L  D2,-(SP)
	 MOVE.L  A2,-(SP)              READ THE NEXT
	 BSR.S   ASM_FLPYREAD          DIRECTORY SECTOR
	 MOVEM.L (SP)+,D2/D3/A0/A2/A4  RESTORE REGS
	 MOVEQ   #8,D1                 (8 ENTRIES/SECTOR)
CHECKTYPE CMPI.W #-1,10(A2)            CHECK LOGICAL EOD
	 BEQ.S   NOTFOUND
	 TST.W  10(A2)                 IGNORE PURGED FILES
	 BEQ.S   NXTDENTRY
	 MOVEA.L A0,A1                 SAVE NAME POINTER
	 MOVEA.L  A2,A3                COPY ENTRY POINTER
	 MOVEQ    #4,D4                SET CHARACTER COUNTER
CHKNAME  CMPM.W  (A1)+,(A3)+           MATCH CHARACTERS
	 DBNE    D4,CHKNAME
	 BNE.S   NXTDENTRY
	 MOVE.L  A2,(A4)               STORE THE CAT ENTRY ADDR.
	 RTS

NXTDENTRY ADDA   #32,A2                INCREMENT
	 SUBQ.L  #1,D1                 TO NEXT ENTRY
	 BGT.S   CHECKTYPE
	 ADDQ.L  #1,D2                 INCREMENT
	 SUBQ.L  #1,D3                 TO NEXT DIRECTORY
	 BGT.S   NXTDSECTOR            SECTOR
NOTFOUND MOVE.W  #-1,ESCAPECODE(A5)    ESCAPECODE := -1
	 TRAP   #10

*---rdq---ROUTINES TO TURN CACHE OFF AND ON-------------------------------
*
*         MODIFIED FOR WOPR CACHE -- ADDED FPE, IEN BITS  3/25/85  JWS
*
CACHE_CTL EQU   $5F400E

ASM_CACHE_OFF   EQU *
	BTST    #0,MSYSFLAGS
	BEQ.S   XIT
	ANDI.W  #$0063,CACHE_CTL        CLEAR TST, ERR AND CE BITS
XIT     RTS

ASM_CACHE_ON    EQU *
	BTST    #0,MSYSFLAGS
	BEQ     XIT
	BTST    #4,SYSFLAG2            CHECK FOR 68020
	BNE.S   TURNON                 IF SO THEN SKIP READ
	SUBA.L  A0,A0           READ 16K BYTES FROM HIGH MEM DOWN
	MOVE.W  #4095,D0        TO FLUSH THE CACHE
CACHEO1 MOVE.L  -(A0),D1
	DBRA    D0,CACHEO1
TURNON  LEA     CACHE_CTL,A0
	MOVE.W  (A0),D0                 FETCH CURRENT STATUS
	ANDI.W  #$0007,D0               CLEAR TST AND ERR BITS
	OR.B    #$64,D0                 SET CE, IEN, FPE  BITS
	MOVE.W  D0,(A0)                 PUT IT BACK
	RTS
*---rdq-------------------------------------------------------------------
*---routine to do complete setup & take down of caches
*-- used in rev 3.22 to do proper switch to bootrom mode

SET_TT0 EQU     *       D0 CONTAINS VALUE FOR TT0
	BTST    #4,SYSFLAG2     68020 ?
	BEQ.S   XIT_TT0
	BTST    #2,SYSFLAG2     68030 ?
	BEQ.S   XIT_TT0
*==========================================================================
* Stuff between the '=======' lines is new for the '040. JWH 12/15/89.
	BTST    #3,SYSFLAG2
	BNE     ITSA_30
	TRAP    #11
	MOVE    (SP)+,D1        SAVE SR
	DC.L    $4E7B0006       MOVEC  D0,DTT0
	DC.L    $4E7B0004       MOVEC  D0,ITT0  JWH - 4/30/90.
	MOVE    D1,SR           RESTORE SR
	BRA     XIT_TT0
*==========================================================================
ITSA_30   TRAP    #11     ENSURE SUPERVISOR MODE
	MOVE    (SP)+,D1        SAVE SR
	MOVE.L  D0,-(SP)
	DC.L    $F0170800    PMOVE (SP),TT0
	ADDQ    #4,SP
	MOVE    D1,SR           RESTORE SR
XIT_TT0 RTS

ASM_CACHE_MODE  EQU     *
	MOVEA.L (SP)+,A4        RETURN ADDRESS
	TST.B   (SP)+           TEST ARG
	BEQ.S   CM_BOOTROM
* SETUP FOR WORKSTATION OPERATIONS (caches on)
	MOVE.L  #TT0_ENABLE,D0  DISABLE DATA CACHING FOR IO SPACE
	BTST    #3,SYSFLAG2     040 ??
	BNE     OLD_WAY
	MOVE.L  #DTT0_ENABLE,D0
OLD_WAY BSR     SET_TT0
	BSR     ASM_CACHE_ON
	JSR     ASM_ICACHE_ON
	JMP     (A4)

* SETUP FOR BOOTROM OPERATIONS (caches off)
CM_BOOTROM EQU  *
	BSR     ASM_CACHE_OFF
	JSR     ASM_ICACHE_OFF
	MOVEQ   #0,D0           DISABLE TT0
	BSR     SET_TT0
	JMP     (A4)

	nosyms
	end
