home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d5xx
/
d583
/
cpuset.lha
/
CPUSet
/
Source
/
cpuset.s
next >
Wrap
Text File
|
1992-01-04
|
27KB
|
576 lines
;Program CPUSet by Nic Wilson Assembled with Macro68
;This source code is copyright Nic Wilson Software
;it may not be used in whole or in part without
;permission of Nic Wilson. It is supplied here as
;example of how to manipulate the caches of the
;68020, 68030, 68040 processors. This source
;calls some macros that are not included in this
;source code. This source code uses the new
;Motorola syntax and was assembled with Macro68
incdir "includes:"
MC68040
super
exeobj
maclib "includes:commonmac/allmacs.mac
include "commonmac/macs.i"
SECTION main,CODE
StartCode ;startup stuff
main move.l (_argv),d0
beq.b noargs
movea.l d0,a0
movea.l (a0),a0
cmpi.b #'?',(a0)
beq.w dispusage
noargs movea.l (4).w,a6 ;get execbase
move.w (AttnFlags,a6),d0 ;check for 040
btst #AFB_68040,d0 ;have we got one?
bne.w do040 ;yup! do 40 code
btst #AFB_68030,d0 ;else check 030
bne.b do030 ;yup! do 30 code
btst #AFB_68020,d0 ;check for 020
beq.w error ;minimum not found
movea.l (4).w,a6
cmpi.w #36,(LIB_VERSION,a6)
bge.b noneed
lea (checkproc,pc),a5
CALLEXEC Supervisor
tst.l d1
bpl.b no040
bset.b #AFB_68040,(AttnFlags+1,a6)
bset.b #AFB_68030,(AttnFlags+1,a6) ;020 should already be
bra.w do040 ;set
no040 btst #CACRB_DBE,d1
beq.b noneed
bset.b #AFB_68030,(AttnFlags+1,a6)
bra.b do030
noneed lea (iburst,pc),a0 ;get data burst gad
ori.w #GFLG_DISABLED,(gg_Flags,a0) ;disable it
lea (dburst,pc),a0 ;get ins burst gad
ori.w #GFLG_DISABLED,(gg_Flags,a0) ;disable it
move.b #-2,(procflag) ;set 020 flag
bra.b do020 ;jump into 030 code
do030 move.b #-1,(procflag) ;set 030 flag
do020 lea (winddatc,pc),a0 ;get second gadget
move.l #dburst,(a0) ;put burst gadgets in
;*********************************************************
;Initialise the gadgets for the 68020 and 68030 processors
;*********************************************************
tst.l (_argv) ;have we CLI args?
bne.w dodos ;do CLI code if so
bsr.w getstat ;get current cache modes
btst #CACRB_EnableI,d0 ;check for ICACHE
bne.b checkdc1 ;if on default settings
move.l #ICText2,(Icache) ;else put off bg text
move.l #ICText2,(ICa) ;and put off fg text
ori.w #SELECTED,(inflag) ;make gadget selected
move.b #1,(ICText) ;reverse bg colour
move.b #2,(ICTextb) ;reverse fg colour
checkdc1 btst #CACRB_EnableD,d0 ;check for DCACHE
bne.b checkib1 ;if on use default
move.l #DCText2,(Dcache) ;else put off bg text
move.l #DCText2,(DCa) ;and put on fg text
ori.w #SELECTED,(dflag) ;make gadget selected
move.b #1,(DCText) ;reverse bg colour
move.b #2,(DCTextb) ;reverse fg colour
;we allow 020 through
;so they will show 'off'
checkib1 btst #CACRB_IBE,d0 ;check for IBURST
bne.b checkdb1 ;if on use default
move.l #IBText2,(IB) ;else put off bg text
move.l #IBText2,(IBa) ;and put on fg text
ori.w #SELECTED,(ibflag) ;make it selected
move.b #1,(IBText) ;reverse bg colour
move.b #2,(IBTextb) ;reverse fg colour
checkdb1 btst #CACRB_DBE,d0 ;check for DBURST
bne.w dowindow ;if on go open window
move.l #DBText2,(DB) ;else put off bg text
move.l #DBText2,(DBa) ;and put on fg text
ori.w #SELECTED,(dbflag) ;select the gadget
move.b #1,(DBText) ;reverse the bg colour
move.b #2,(DBTextb) ;reverse the fg colour
bra.w dowindow ;and go open the window
;**********************************************
;Initialise the gadgets for the 68040 processor
;**********************************************
do040 tst.l (_argv) ;do we have CLI args?
bne.w dodos ;do dos code if so
bsr.w getstat ;get current cache modes
btst #15,d0 ;check for ICACHE
bne.b checkdc ;default if its on
move.l #ICText2,(Icache) ;else put off bg text
move.l #ICText2,(ICa) ;and put on fg text
ori.w #SELECTED,(inflag) ;select the gadget
move.b #1,(ICText) ;reverse the bg colour
move.b #2,(ICTextb) ;reverse the fg colour
checkdc btst #31,d0 ;check for DCACHE
bne.b checkcb ;default if on
move.l #DCText2,(Dcache) ;else put off bg text
move.l #DCText2,(DCa) ;and put on fg text
ori.w #SELECTED,(dflag) ;select the gadget
move.b #1,(DCText) ;reverse the bg colour
move.b #2,(DCTextb) ;reverse the fg colour
checkcb andi.b #$20,d1 ;check for Copyback
bne.b dowindow ;default if on
move.l #CBText2,(CB) ;else put off bg text
move.l #CBText2,(CBa) ;and put on fg text
ori.w #SELECTED,(cflag) ;select the gadget
move.b #1,(CBText) ;reverse the bg colour
move.b #2,(CBTextb) ;reverse the fg colour
dowindow lea (window,pc),a0 ;get the window
CALLINT OpenWindow ;open it
tst.l d0 ;did it open?
beq.w error ;error out if not
move.l d0,(windsave) ;save the ptr
waitloop movea.l (windsave,pc),a0 ;get window ptr
movea.l (wd_UserPort,a0),a0 ;get the msg port
moveq #0,d0 ;set do WaitPort
moveq #0,d1 ;set for ReplyMsg
WaitMsg ;wait for a msg
cmpi.w #1,(gg_GadgetID,a1) ;was it ICACHE
beq.w doi ;do it if so
cmpi.w #2,(gg_GadgetID,a1) ;was it DCACHE
beq.w dod ;do it if so
cmpi.w #3,(gg_GadgetID,a1) ;was it third gad
beq.w docb ;do it if so
cmpi.w #4,(gg_GadgetID,a1) ;was it IBURST
bne.w exitwb ;must be close so exit
bsr.w getstate ;get the gads state
tst.l d0 ;test the return
bmi.b setiboff ;turn it off
move.l #IBText1,(IB) ;else on bg text
move.l #IBText1,(IBa) ;and on fg text
move.b #2,(IBText) ;reverse the fg colour
move.b #1,(IBTextb) ;reverse the bg colour
bsr.w refresh ;refresh the gadget
moveq #0,d3 ;clear cache bits reg
bset #CACRB_IBE,d3 ;set cache bits on
move.l d3,d2 ;set the cache mask
bra.w doit
setiboff move.l #IBText2,(IB) ;the rest of these are
move.l #IBText2,(IBa) ;the similar as ones
move.b #1,(IBText) ;above
move.b #2,(IBTextb)
bsr.w refresh
moveq #0,d2
move.l d2,d3
bset #CACRB_IBE,d2 ;set the cache mask
bra.w doit
dodb bsr.w getstate
tst.l d0
bmi.b setdboff
move.l #DBText1,(DB)
move.l #DBText1,(DBa)
move.b #2,(DBText)
move.b #1,(DBTextb)
bsr.w refresh
moveq #0,d3
bset #CACRB_DBE,d3
move.l d3,d2
bra.b doit
setdboff move.l #DBText2,(DB)
move.l #DBText2,(DBa)
move.b #1,(DBText)
move.b #2,(DBTextb)
bsr.w refresh
moveq #0,d2
move.l d2,d3
bset #CACRB_DBE,d2
bra.b doit
docb tst.b (procflag)
bmi.b dodb
bsr.w getstate
tst.l d0
bmi.b setcboff
move.l #CBText1,(CB)
move.l #CBText1,(CBa)
move.b #2,(CBText)
move.b #1,(CBTextb)
bsr.w refresh
moveq #0,d3
bset #CACRB_CopyBack,d3
move.l d3,d2
doit bsr.w dowb
bra.w waitloop
setcboff move.l #CBText2,(CB)
move.l #CBText2,(CBa)
move.b #1,(CBText)
move.b #2,(CBTextb)
bsr.w refresh
moveq #0,d3
move.l d3,d2
bset #CACRB_CopyBack,d2
bra.b doit
dod bsr.w getstate
tst.l d0
bmi.b setdcoff
move.l #DCText1,(Dcache)
move.l #DCText1,(DCa)
move.b #2,(DCText)
move.b #1,(DCTextb)
bsr.w refresh
moveq #0,d3
bset #CACRB_EnableD,d3
move.l d3,d2
bra.b doit
setdcoff move.l #DCText2,(Dcache)
move.l #DCText2,(DCa)
move.b #1,(DCText)
move.b #2,(DCTextb)
bsr.w refresh
moveq #0,d3
move.l d3,d2
bset #CACRB_EnableD,d2
bra.w doit
doi bsr.w getstate
tst.l d0
bmi.b seticoff
move.l #ICText1,(Icache)
move.l #ICText1,(ICa)
move.b #2,(ICText)
move.b #1,(ICTextb)
bsr.b refresh
moveq #0,d3
bset #CACRB_EnableI,d3
move.l d3,d2
bra.w doit
seticoff move.l #ICText2,(Icache)
move.l #ICText2,(ICa)
move.b #1,(ICText)
move.b #2,(ICTextb)
bsr.b refresh
moveq #0,d3
move.l d3,d2
bset #CACRB_EnableI,d2
bra.w doit
exitwb movea.l (windsave,pc),a0 ;get the window
JMPINT CloseWindow ;close it
refresh movea.l a1,a0 ;refresh the gadget
movea.l (windsave,pc),a1 ;in a1
suba.l a2,a2
moveq #1,d0
JMPINT RefreshGList
;****************************************************
;depending on the processor this routine will go into
;supervisor and return either the cacr in d0 or cacr
;in d0 and dtt1 in d1
;****************************************************
getstat lea (supcode,pc),a5
JMPEXEC Supervisor
supcode movec cacr,d0
tst.b (procflag)
bmi.b sc_xit
movec dtt1,d1
sc_xit rte
;*********************************************
;Test the state of the gadget in a1 and return
;a boolean result in d0
;*********************************************
getstate move.w (gg_Flags,a1),d0
andi.w #GFLG_SELECTED,d0
bne.b gadset
moveq #0,d0
rts
gadset moveq #-1,d0
rts
;**************************************************
;error routine, display credits, do an audible beep
;and flash the screen and exit
;**************************************************
error bsr.b dispcredit
moveq #0,d0
moveq #0,d1
Beep
suba.l a0,a0
CALLINT DisplayBeep
lea (errmsg,pc),a0
bsr.w print
bra.b errorout
dispusage bsr.b dispcredit
lea (usage,pc),a0
bsr.w print
bra.b errorout
dispcredit lea (credit,pc),a0
bsr.w print
errorout rts
dodos lea (credit,pc),a0
bsr.w print
tst.l (_argv)
beq.w exit
movea.l (_argv),a2
move.l (_argc),d7
subq.l #1,d7
tst.l (a2)
beq.w exit
moveq #0,d2
moveq #0,d3
loop lea (cbon,pc),a1 ;CopyBack on
bsr.b docmp
bne.b nocbon
tst.b (procflag)
bmi.w next
bset #CACRB_CopyBack,d3
bset #CACRB_CopyBack,d2
lea (cben,pc),a0
bsr.b print
bra.w next
nocbon lea (cboff,pc),a1 ;CopyBack off
bsr.b docmp
bne.b nocboff
tst.b (procflag)
bmi.w next
bset #CACRB_CopyBack,d2
bclr #CACRB_CopyBack,d3
lea (cbdis,pc),a0
bsr.b print
bra.w next
nocboff lea (icon,pc),a1 ;Ins cache on
bsr.b docmp
bne.b noicon
bset #CACRB_EnableI,d3
bset #CACRB_EnableI,d2
lea (icen,pc),a0
bsr.b print
bra.w next
docmp movea.l (a2),a0
moveq #-1,d0
StringCmp
tst.l d0
rts
print move.l (_stdout),d1
beq.b prexit
DosAPrint
prexit rts
noicon lea (icoff,pc),a1 ;Inc Cache off
bsr.b docmp
bne.b noicoff
bclr #CACRB_EnableI,d3
bset #CACRB_EnableI,d2
lea (icdis,pc),a0
bsr.b print
bra.w next
noicoff lea (dcon,pc),a1 ;Data Cache on
bsr.b docmp
bne.b nodcon
bset #CACRB_EnableD,d3
bset #CACRB_EnableD,d2
lea (dcen,pc),a0
bsr.b print
bra.w next
nodcon lea (dcoff,pc),a1 ;Data Cache off
bsr.b docmp
bne.b nodcoff
bclr #CACRB_EnableD,d3
bset #CACRB_EnableD,d2
lea (dcdis,pc),a0
bsr.w print
bra.w next
nodcoff cmpi.b #-1,(procflag) ;is it the 030
bne.w next ;if not rest are invalid
lea (ibon,pc),a1 ;Ins Burst on
bsr.w docmp
bne.b noibon
bset #CACRB_IBE,d3
bset #CACRB_IBE,d2
lea (iben,pc),a0
bsr.w print
bra.b next
noibon lea (iboff,pc),a1 ;Ins Burst off
bsr.w docmp
bne.b noiboff
bclr #CACRB_IBE,d3
bset #CACRB_IBE,d2
lea (ibdis,pc),a0
bsr.w print
bra.b next
noiboff lea (dbon,pc),a1 ;Data Burst on
bsr.w docmp
bne.b nodbon
bset #CACRB_DBE,d3
bset #CACRB_DBE,d2
lea (dben,pc),a0
bsr.w print
bra.b next
nodbon lea (dboff,pc),a1 ;Data Burst off
bsr.w docmp
bne.b next
bclr #CACRB_DBE,d3
bset #CACRB_DBE,d2
lea (dbdis,pc),a0
bsr.w print
next addq.l #4,a2
dbf d7,loop
dowb lea (do030code,pc),a5
;if we're under V2.0x
movea.l (4).w,a6 ;then there is no need
cmpi.w #36,(LIB_VERSION,a6) ;to do our own code
blt.b isneed ;we'll call the V2.0x
;function instead with
move.l d3,d0 ;the same parameters as
move.l d2,d1 ;we use
JMPEXEC CacheControl
isneed and.l d2,d3 ;d3=cache bits
not.l d2 ;d2=cache mask (inverted)
;< 68040 ?
tst.b (procflag) ;branch if not 68040
bmi.b super
lea (docode,pc),a5 ;get 68040 code
super CALLEXEC Supervisor
exit rts
;****************************************************************
;This is to check for the presence of the 68040, 68030 or 68020
;cpu, we try to set specific modes for each and return the result
;in d1, this is need if we are running under kickstart 1.3
;****************************************************************
checkproc movec cacr,d0
move.l d0,d1 ;I dont use the name CACR_Copyback
bset #31,d1 ;in this place it is misleading
bset #CACRB_DBE,d1
movec d1,cacr
movec cacr,d1
movec d0,cacr
rte
;*******************************************************
;Set the required modes of the 68030 or 68020 processors
;This is called if under kickstart 1.3
;*******************************************************
do030code movec cacr,d0 ;get cache control
or.l d3,d0 ;add our manipulate bits
or.l d3,d2 ;add any set bits to the mask
and.l d2,d0 ;clear unwanted
movec d0,cacr ;set new settings
rte
;*********************************************
;Set the required modes of the 68040 processor
;This is called if under kickstart 1.3
;*********************************************
docode movec cacr,d4 ;get cache control register
move.l d2,d0 ;make a copy of new bits
move.l d3,d1 ;make a copy of the mask
andi.l #$0101,d1 ;clear any cback bit
bset #31,d0 ;set the bit in the mask
moveq #15,d7 ;get 15 into a data reg
lsl.l d7,d1 ;get icache into bit 15
lsl.l d7,d0 ;and do the mask
swap d1 ;swap the 16 bit halves
swap d0 ;swap the mask too
lsl.w #8,d1 ;shift dcache to bit 31
lsl.w #8,d0 ;shift any dcache to bit 31
swap d1 ;return the halves
swap d0 ;and the mask
or.l d1,d4 ;set the bits were gonna manipulate
or.l d1,d0 ;add the set bits in the mask
and.l d0,d4 ;clear the bits not in the mask
andi.l #$80000000,d3 ;clear all except any copyback
rol.l #6,d3 ;shift to its correct position
or.l #$7fffffff,d2 ;add the cleared bits to the mask
rol.l #6,d2 ;shift it too
cpusha dc ;push the data cache to update memory
movec dtt1,d6 ;get transparent trans reg
andi.b #$9f,d6 ;clear the CacheMode bits
or.l d3,d6 ;set our manipulate bit
or.l d3,d2 ;add the bit to the mask
and.l d2,d6 ;clear the unwanted bit
movec d6,dtt1 ;set the reg
cpusha bc ;push data/ins caches to update memory
movec d4,cacr ;and set the cache control
rte
INCLUDE /cpuset/cpuset.window
even
windsave dc.l 0
procflag dc.b 0
cbon dc.b 'CBACK_ON',0
cboff dc.b 'CBACK_OFF',0
icon dc.b 'ICACHE_ON',0
icoff dc.b 'ICACHE_OFF',0
dcon dc.b 'DCACHE_ON',0
dcoff dc.b 'DCACHE_OFF',0
ibon dc.b 'IBURST_ON',0
iboff dc.b 'IBURST_OFF',0
dbon dc.b 'DBURST_ON',0
dboff dc.b 'DBURST_OFF',0
cben dc.b 'COPYBACK CACHE ENABLED',$0a,0
cbdis dc.b 'COPYBACK CACHE DISABLED',$0a,0
icen dc.b 'INSTRUCTION CACHE ENABLED',$0a,0
icdis dc.b 'INSTRUCTION CACHE DISABLED',$0a,0
dcen dc.b 'DATA CACHE ENABLED',$0a,0
dcdis dc.b 'DATA CACHE DISABLED',$0a,0
iben dc.b 'INSTRUCTION BURST ENABLED',$0a,0
ibdis dc.b 'INSTRUCTION BURST DISABLED',$0a,0
dben dc.b 'DATA BURST ENABLED',$0a,0
dbdis dc.b 'DATA BURST DISABLED',$0a,0
credit dc.b $0a,$1b,'[0;33m CPUSet V1.5 ',$1b,'[0;32mWritten in Assembler ',$1b,'[0;m © Nic Wilson',$0a
dc.b ' For 68020, 68030 & 68040 Processors',$0a
dc.b $1b,'[0;32m This program is Shareware',$1b,'[0;m',$0a,$0a,0
errmsg dc.b 'You ',$1b,'[0;33mMUST ',$1b,'[0mhave a 68020, 68030 or 68040 Processor',$1b,'[0;32mCPU',$1b,'[0m',$0a,$0a,0
usage dc.b $0a,$1b,'[0;33m68040-> ',$1b,'[0;32mCPUSet ',$1b,'[0;mICACHE_ON/S,ICACHE_OFF/S,DCACHE_ON/S,DCACHE_OFF/S',$0a
dc.b ' CBACK_ON/S,CBACK_OFF/S',$0a
dc.b $0a,$1b,'[0;33m68030-> ',$1b,'[0;32mCPUSet ',$1b,'[0;mICACHE_ON/S,ICACHE_OFF/S,DCACHE_ON/S,DCACHE_OFF/S',$0a
dc.b ' IBURST_ON] IBURST_OFF/S,DBURST_ON/S,DBURST_ON/S',$0a
dc.b $0a,$1b,'[0;33m68020-> ',$1b,'[0;32mCPUSet ',$1b,'[0;mICACHE_ON/S,ICACHE_OFF/S,DCACHE_ON/S,DCACHE_OFF/S',$0a,$0a,0
END