home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 8
/
FreshFishVol8-CD2.bin
/
bbs
/
hard
/
zeusscsi.lha
/
ZeusSCSI
/
ConfigMem.asm
< prev
next >
Wrap
Assembly Source File
|
1993-12-21
|
8KB
|
348 lines
; ConfigMem.asm - resident module to configure PPI 32bit memory
;
; Written by Michael L. Hitch
; Montana State University
; osymh@msu.oscs.montana.edu
;
include "exec/types.i"
include "exec/nodes.i"
include "exec/memory.i"
include "exec/resident.i"
include "exec/execbase.i"
include "libraries/configvars.i"
include "libraries/expansion.i"
include "hardware/cia.i"
include "hardware/custom.i"
xref _LVOAddMemList
xref _LVOOpenLibrary
xref _LVOCloseLibrary
xref _LVOFindConfigDev
xref _LVOAllocMem
xref _LVOSumKickData
xref _LVOForbid
xref _LVOPermit
xref _LVOSupervisor
xref _LVOCacheControl
xref _ciaa
xref _custom
csect text
;
; Program entry point
;
movem.l d2-d3/a2/a6,-(sp)
move.l 4,a6
;
; *** process command line arguments
;
jsr AddResident(pc) ; Add program to KickMemPtr list
;*** check status?
;
btst #AFB_68040,AttnFlags+1(a6) ; is it 68040?
bne.s Init_68040
; *** 68040 not detected on WB1.3
cmp.w #36,LIB_VERSION(a6) ; check if 2.0 or later
bge.s Skip_Init ; AFB_68040 is valid
moveq #AFF_68030!AFF_68020,d0
and.w AttnFlags(a6),d0 ; Kludge for WB1.3
bne.s Skip_Init
Init_68040:
lea myCacheClear(pc),a5
jsr _LVOSupervisor(a6)
moveq #0,d0
move.l #CACRF_EnableD,d1
jsr _LVOCacheControl(a6)
move.l d0,-(sp)
jsr TagInit(pc)
move.l d0,d3
move.l (sp)+,d0
move.l #CACRF_EnableD,d1
jsr _LVOCacheControl(a6)
move.l d3,d0
Skip_Init:
movem.l (sp)+,d2-d3/a2/a6
rts
myCacheClear:
cpusha bc
rte
;
;
AddResident
move.l KickMemPtr(a6),a0
1$:
move.l a0,d0
beq.s NewResident ; Not found
move.l LN_NAME(a0),a1 ; name of this entry
lea TagName(pc),a2 ; my name
2$:
move.b (a1)+,d0
cmp.b (a2)+,d0
bne.s 3$
tst.b d0
bne 2$
; found entry
moveq #1,d0
rts
3$:
move.l (a0),a0 ; Next entry
bra 1$
;
; Layout of memory block
; ds.b 8 Overhead space for AllocAbs
; ds.b ML_SIZE Memory entry list
; ds.b ME_SIZE Memory entry
; ds.b 8 RomTab pointer array
; ds.b nnn Resident module
;
KM_RTPTR equ ML_SIZE+ME_SIZE ; Location of RomTag pointer array
KM_SIZE equ KM_RTPTR+8 ; Size of KickMem info header
;
NewResident:
moveq #KM_SIZE+8,d0 ; size of KickMem header + 8 byte overhead
add.l RomTag+6(pc),d0
sub.l RomTag+2(pc),d0 ; add length of resident module
move.l #MEMF_24BITDMA!MEMF_CLEAR,d1
jsr _LVOAllocMem(a6) ; allocate memory
tst.l d0
bne.s 1$
moveq #KM_SIZE+8,d0 ; size of KickMem header + 8 byte overhead
add.l RomTag+6(pc),d0
sub.l RomTag+2(pc),d0 ; add length of resident module
move.l #MEMF_CHIP!MEMF_CLEAR,d1
jsr _LVOAllocMem(a6) ; allocate memory
tst.l d0
bne.s 1$
moveq #2,d0
rts
1$:
move.l d0,a0 ; a0 = address of allocated memory
lea 8(a0),a2 ; a2 = address of MemList
move.b #NT_MEMORY,LN_TYPE(a2) ; initialize MemList
move.w #1,ML_NUMENTRIES(a2)
move.l a0,ML_ME(a2)
moveq #KM_SIZE+8,d0 ; size of KickMem header + 8 byte overhead
move.l d0,ML_ME+ME_LENGTH(a2)
move.l RomTag+6(pc),d0
sub.l RomTag+2(pc),d0 ; d0 = length of resident module
add.l d0,ML_ME+ME_LENGTH(a2)
lea KM_SIZE+8(a0),a0 ; point to RomTag structure
lea RomTag(pc),a1
move.l a0,d1
sub.l a1,d1 ; relocation offset for RomTag addresses
move.l a0,KM_RTPTR(a2) ; RomTag Pointer
subq.l #1,d0
2$: move.b (a1)+,(a0)+ ; copy resident module
dbra d0,2$
move.l KM_RTPTR(a2),a0 ; Point to RomTag structure
add.l d1,RT_MATCHTAG(a0) ; relocate absolute addresses
add.l d1,RT_ENDSKIP(a0)
add.l d1,RT_NAME(a0)
add.l d1,RT_IDSTRING(a0)
add.l d1,RT_INIT(a0)
move.l RT_NAME(a0),LN_NAME(a2) ; set MemList name same as RomTag name
;*** add to KickMemPtr & KickTagPtr
jsr _LVOForbid(a6)
lea KickMemPtr(a6),a0
3$: move.l (a0),d0
beq.s 4$
move.l d0,a0
bra 3$
4$: tst.l KickMemPtr(a6)
beq.s 5$
move.l a0,LN_PRED(a2) ; is this really needed?
move.l a2,(a0)
bra.s 6$
5$: move.l a2,KickMemPtr(a6)
6$: move.l KickTagPtr(a6),d0
beq.s 7$
bset #31,d0
move.l d0,KM_RTPTR+4(a2) ; link to existing RomTag pointer array
7$: lea KM_RTPTR(a2),a0 ; address of our RomTag pointer array
move.l a0,KickTagPtr(a6)
jsr _LVOSumKickData(a6)
move.l d0,KickCheckSum(a6)
jsr _LVOPermit(a6)
;*** call resident initialization routine?
moveq #0,d0
rts
;
dc.b "$VER: ConfigMem 37.4 (19.10.93)",0
;
; The resident RomTag structure
;
RomTag: dc.w RTC_MATCHWORD
dc.l RomTag
dc.l EndModule
dc.b RTF_COLDSTART
dc.b 37
dc.b NT_KICKMEM
dc.b 111
dc.l TagName
dc.l TagID
dc.l TagInit
TagName: dc.b "Config32",0
TagID: dc.b "PPI ConfigMem32 37.4 (19.10.93)",$0d,$0a,0
MemName: dc.b "PPI 32Bit RAM",0
ZeusName: dc.b "ZEUS 32Bit RAM",0
;ZeusName2: dc.b "ZEUS 32Bit RAM ][",0
ExpName: EXPANSIONNAME
ds.w 0
MemAttr: dc.l MEMF_LOCAL!MEMF_FAST!MEMF_PUBLIC
TagInit:
movem.l d2/d3/a2/a4,-(sp)
lea _custom,a0 ; Address of custom chip
move.w potinp(a0),d0 ; Read register
ori.w #$0c00,d0 ; Set output, data = 1
move.w d0,potgo(a0)
moveq #127,d0
1$: dbra d0,1$
move.w potinp(a0),d0 ; Read data
andi.w #$0400,d0 ; Test if Mouse right button pressed
beq.s SkipMouse ; Yes, don't check left button
lea _ciaa,a0
btst #6,ciapra(a0) ; Test if Mouse left button pressed
beq.s TagExit ; Yes, skip it
SkipMouse:
btst #AFB_68040,AttnFlags+1(a6) ; is it 68040?
bne.s Is_68040
cmp.w #36,LIB_VERSION(a6) ; if 2.0 or later
bge.s TagExit ; AFB_68040 is valid
; *** 68040 not detected on WB1.3
moveq #AFF_68030!AFF_68020,d0
and.w AttnFlags(a6),d0 ; Kludge for WB1.3
bne.s Is_68040
TagExit:
moveq #0,d0
movem.l (sp)+,d2/d3/a2/a4
rts
Is_68040:
lea MemList(a6),a0 ; get address of memory list
Chk_0: move.l (a0),d0 ; get next entry
beq.s Chk_1 ; End of list
move.l d0,a0
move.l LN_NAME(a0),a1 ; memory node name
lea MemName(pc),a2 ; Check PPI 040 memory
moveq #13,d0
1$: cmpm.b (a1)+,(a2)+
dbne d0,1$
beq.s TagExit ; matched: already configured
move.l LN_NAME(a0),a1
lea ZeusName(pc),a2 ; Check Zeus 040 memory
moveq #14,d0
2$: cmpm.b (a1)+,(a2)+
dbne d0,2$
beq.s TagExit ; matched: already configured
bra.s Chk_0
Chk_1:
;
; Get PP&S board address, read configuration switches
;
lea ExpName(pc),a1 ; open expansion library
moveq #0,d0
jsr _LVOOpenLibrary(a6)
tst.l d0
beq TagExit ; couldn't open library
move.l a6,-(sp)
move.l d0,a6
move.l #2026,d0 ; manufacturer code
; move.l #105,d1 ; product code = PPI 040
; move.l #150,d1 ; product code = Zeus 040
moveq #-1,d1 ; product code = any
lea 0,a0
jsr _LVOFindConfigDev(a6)
move.l a6,a1
move.l (sp)+,a6
move.l d0,a2
jsr _LVOCloseLibrary(a6)
move.l a2,d0
beq TagExit
cmpi.b #150,cd_Rom+er_Product(a2) ; product code = Zeus 040
bne TagExit
move.l cd_BoardAddr(a2),a0
;get flags & compute autoconfig setting
;**** turn off caching ****
;
; Need to leave hole if autoconfiguring memory
;
lea $08000000,a0 ; search 32 bit memory area for
Next_32: ; installed memory
move.l #$aaaaaaaa,d2
move.l #$55555555,d3 ; patterns for test
Find_Start:
move.l (a0),d0 ; save contents
move.l 4(a0),d1
move.l d2,(a0) ; write pattern 1
move.l d3,4(a0) ; write pattern 2
nop
nop
cmp.l (a0),d2 ; compare pattern 1
bne.s 1$ ; failed
cmp.l 4(a0),d3 ; compare pattern 2
beq.s Found_Start ; found start of memory
1$:
move.l d0,(a0)
move.l d1,4(a0)
add.l #$00100000,a0 ; test on 1Meg boundary
cmp.l #$0a000000,a0 ; at end of region?
blt Find_Start
No_More:
;*** turn caching back on ***
moveq #1,d0
movem.l (sp)+,d2/d3/a2/a4
rts
Found_Start:
move.l d0,(a0) ; restore original contents
move.l d1,4(a0)
cmp.l #$0c000000,a2 ;*** Kludge
beq.s No_More
move.l a0,a2 ; copy memory start
Find_End:
cmp.l #$0c000000,a2 ;*** Kludge
; cmp.l #$08100000,a2 ;*** Kludge
beq.s Found_End ;*** Kludge
move.l (a2),d0 ; save contents
move.l 4(a2),d1
move.l d2,(a2) ; write pattern 1
move.l d3,4(a2) ; write pattern 2
nop
nop
cmp.l (a2),d2 ; compare pattern 1
bne.s Found_End ; failed, at end of region
cmp.l 4(a2),d3 ; compare pattern 2
bne.s Found_End
move.l d0,(a2) ; restore original contents
move.l d1,4(a2)
add.l #$00100000,a2
bra Find_End
Found_End:
move.l a2,d0 ; compute size
sub.l a0,d0
move.l MemAttr(pc),d1 ; attributes
moveq #30,d2 ; priority
; lea MemName(pc),a1 ; name
lea ZeusName(pc),a1 ; name
; c