moved PSC3 interrupt handler to C code
This commit is contained in:
@@ -457,7 +457,7 @@ irq3:
|
|||||||
irq4: // vbl
|
irq4: // vbl
|
||||||
irq 0x70,4,0x10
|
irq 0x70,4,0x10
|
||||||
|
|
||||||
#if MACHINE_M5484LITE_notyet // handlers for M5484LITE
|
#if MACHINE_M5484LITE // handlers for M5484LITE
|
||||||
|
|
||||||
irq5: // irq5 is tied to PCI INTC# and PCI INTD# on the M5484LITE
|
irq5: // irq5 is tied to PCI INTC# and PCI INTD# on the M5484LITE
|
||||||
move.w #0x2700,sr // disable interrupts
|
move.w #0x2700,sr // disable interrupts
|
||||||
@@ -642,12 +642,7 @@ irq6_1:
|
|||||||
lea MCF_GPIO_PODR_FEC1L,a5
|
lea MCF_GPIO_PODR_FEC1L,a5
|
||||||
bset.b #4,(a5) // led off
|
bset.b #4,(a5) // led off
|
||||||
irq6_2:
|
irq6_2:
|
||||||
// test auf protect mode ---------------------
|
move.l 0xf0020000,a5 // vector holen
|
||||||
move.b DIP_SWITCHa,d0
|
|
||||||
btst #7,d0
|
|
||||||
bne irq6_3 // ja->
|
|
||||||
// -------------------------------------------
|
|
||||||
move.l 0xF0020000,a5 // vector holen
|
|
||||||
add.l _rt_vbr,a5 // basis
|
add.l _rt_vbr,a5 // basis
|
||||||
move.l (a5),d0 // vector holen
|
move.l (a5),d0 // vector holen
|
||||||
move.l 4(a7),a5 // a5 zurück
|
move.l 4(a7),a5 // a5 zurück
|
||||||
@@ -655,33 +650,6 @@ irq6_2:
|
|||||||
move.l (a7)+,d0 // d0 zurück
|
move.l (a7)+,d0 // d0 zurück
|
||||||
move #0x2600,sr
|
move #0x2600,sr
|
||||||
rts
|
rts
|
||||||
irq6_3:
|
|
||||||
move.l usp,a5 // usp holen
|
|
||||||
tst.b _rt_mod // supervisor?
|
|
||||||
bne sev_sup6 // ja ->
|
|
||||||
mov3q.l #-1,_rt_mod // auf supervisor setzen
|
|
||||||
move.l a5,_rt_usp // rt_usp speichern
|
|
||||||
move.l _rt_ssp,a5 // rt_ssp holen
|
|
||||||
move.l 12(a7),-(a5) // pc transferieren
|
|
||||||
move.l 8(a7),-(a5) // sr transferieren
|
|
||||||
move.l a5,usp // usp setzen
|
|
||||||
move.l 0xF0020000,a5 // vector holen: intack routine
|
|
||||||
add.l _rt_vbr,a5 // virtuelle VBR des Systems
|
|
||||||
move.l (a5),12(a7) // hier gehts weiter
|
|
||||||
movem.l (a7),d0/a5 // register zurück
|
|
||||||
addq.l #8,a7
|
|
||||||
move.b #6,2(a7) // intmaske setzen
|
|
||||||
rte // und weg
|
|
||||||
sev_sup6:
|
|
||||||
move.l 12(a7),-(a5) // pc transferieren
|
|
||||||
move.l 8(a7),-(a5) // sr,vec
|
|
||||||
bset #5,2(a5) // auf super setzen
|
|
||||||
move.l a5,usp // usp setzen
|
|
||||||
move.l 0xF0020000,a5 // vector holen: intack routine
|
|
||||||
add.l _rt_vbr,a5 // virtuelle VBR des Systems
|
|
||||||
move.l (a5),12(a7) // hier gehts weiter
|
|
||||||
movem.l (a7),d0/a5 // register zurück
|
|
||||||
rts
|
|
||||||
|
|
||||||
.data
|
.data
|
||||||
blinker:.long 0
|
blinker:.long 0
|
||||||
@@ -781,36 +749,16 @@ irq7:
|
|||||||
* psc3 com PIC MCF
|
* psc3 com PIC MCF
|
||||||
*/
|
*/
|
||||||
handler_psc3:
|
handler_psc3:
|
||||||
|
.extern _pic_interrupt_handler
|
||||||
|
|
||||||
move.w #0x2700,sr // disable interrupt
|
move.w #0x2700,sr // disable interrupt
|
||||||
lea -20(a7),a7
|
lea -4 * 4(sp),sp // save gcc scratch registers
|
||||||
movem.l d0-d2/a0/a3,(a7)
|
movem.l d0-d1/a0-a1,(sp)
|
||||||
lea MCF_PSC3_PSCRB_8BIT,a3
|
|
||||||
move.b (a3),d1
|
|
||||||
cmp.b #2,d1 // anforderung rtc daten?
|
|
||||||
bne psc3_fertig
|
|
||||||
|
|
||||||
lea MCF_PSC0_PSCTB_8BIT,a0 // ++ vr
|
jsr _pic_interrupt_handler // call high level interrupt handler
|
||||||
mchar move.l,'\P,'\I,'C,' ,(a0)
|
|
||||||
mchar move.l,'I,'N,'T,'\ ,(a0)
|
|
||||||
mchar move.l,'R,'T,'C,'!,(a0)
|
|
||||||
mchar move.l,0x0d,0x0a,0,0,(a0)
|
|
||||||
|
|
||||||
lea 0xffff8961,a0
|
movem.l (sp),d0-d1/a0-a1 // restore registers
|
||||||
lea MCF_PSC3_PSCTB_8BIT,a3
|
rte
|
||||||
clr.l d1
|
|
||||||
moveq #64,d2
|
|
||||||
move.b #0x82,(a3) // header: rtcd mcf->pic
|
|
||||||
loop_sr2:
|
|
||||||
move.b d1,(a0)
|
|
||||||
move.b 2(a0),d0
|
|
||||||
move.b d0,(a3)
|
|
||||||
addq.l #1,d1
|
|
||||||
cmp.b d1,d2
|
|
||||||
bne loop_sr2
|
|
||||||
psc3_fertig:
|
|
||||||
movem.l (a7),d0-d2/a0/a3 // restore saved registers
|
|
||||||
lea 20(a7),a7
|
|
||||||
RTE
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* general purpose timer 0 (GPT0): video change, later also others. GPT0 is used as
|
* general purpose timer 0 (GPT0): video change, later also others. GPT0 is used as
|
||||||
|
|||||||
@@ -212,3 +212,25 @@ bool isr_execute_handler(int vector)
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pic_interrupt_handler(void)
|
||||||
|
{
|
||||||
|
uint8_t rcv_byte;
|
||||||
|
|
||||||
|
rcv_byte = MCF_PSC3_PSCRB_8BIT;
|
||||||
|
if (rcv_byte == 2) // PIC requests RTC data
|
||||||
|
{
|
||||||
|
uint8_t *rtc_reg= (uint8_t *) 0xffff8961;
|
||||||
|
uint8_t *rtc_data = (uint8_t *) 0xffff8963;
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
xprintf("PIC interrupt requesting RTC data\r\n");
|
||||||
|
|
||||||
|
MCF_PSC3_PSCTB_8BIT = 0x82; // header byte to PIC
|
||||||
|
do
|
||||||
|
{
|
||||||
|
*rtc_reg = 0;
|
||||||
|
MCF_PSC3_PSCTB_8BIT = *rtc_data;
|
||||||
|
} while (index++ < 64);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user