You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.3 KiB
ArmAsm
53 lines
1.3 KiB
ArmAsm
17 years ago
|
|
||
|
/*
|
||
|
* File: mcf5xxx.s
|
||
|
* Purpose: Lowest level routines for all ColdFire processors.
|
||
|
*
|
||
|
* Notes:
|
||
|
*
|
||
|
* Function copied from mcf5xxx.S provided by FreeScale.
|
||
|
*/
|
||
|
|
||
|
.global french_cheese
|
||
|
|
||
|
.text
|
||
|
|
||
|
/********************************************************************/
|
||
|
/*
|
||
|
* This routines changes the IPL to the value passed into the routine.
|
||
|
* It also returns the old IPL value back.
|
||
|
* Calling convention from C:
|
||
|
* old_ipl = asm_set_ipl(new_ipl);
|
||
|
* For the Diab Data C compiler, it passes return value thru D0.
|
||
|
* Note that only the least significant three bits of the passed
|
||
|
* value are used.
|
||
|
*/
|
||
|
|
||
|
portSET_IPL:
|
||
|
link A6,#-8
|
||
|
movem.l D6-D7,(SP)
|
||
|
|
||
|
move.w SR,D7 /* current sr */
|
||
|
|
||
|
move.l D7,D0 /* prepare return value */
|
||
|
andi.l #0x0700,D0 /* mask out IPL */
|
||
|
lsr.l #8,D0 /* IPL */
|
||
|
|
||
|
move.l 8(A6),D6 /* get argument */
|
||
|
andi.l #0x07,D6 /* least significant three bits */
|
||
|
lsl.l #8,D6 /* move over to make mask */
|
||
|
|
||
|
andi.l #0x0000F8FF,D7 /* zero out current IPL */
|
||
|
or.l D6,D7 /* place new IPL in sr */
|
||
|
move.w D7,SR
|
||
|
|
||
|
movem.l (SP),D6-D7
|
||
|
lea 8(SP),SP
|
||
|
unlk A6
|
||
|
rts
|
||
|
|
||
|
/********************************************************************/
|
||
|
.end
|
||
|
|
||
|
|