fixed a bug with LINK instruction not saving address register

This commit is contained in:
Markus Fröschle
2014-09-06 19:27:11 +00:00
parent 3cfcd9e7c3
commit 307c5368b4
2 changed files with 81 additions and 78 deletions

View File

@@ -1,7 +1,8 @@
#set disassemble-next-line on #set disassemble-next-line on
define tr define tr
!killall m68k-bdm-gdbserver #!killall m68k-bdm-gdbserver
target remote | m68k-bdm-gdbserver pipe /dev/bdmcf3 target remote | m68k-bdm-gdbserver pipe /dev/bdmcf3
#target remote localhost:1234
#target remote | m68k-bdm-gdbserver pipe /dev/tblcf3 #target remote | m68k-bdm-gdbserver pipe /dev/tblcf3
#target dbug /dev/ttyS0 #target dbug /dev/ttyS0
#monitor bdm-reset #monitor bdm-reset

View File

@@ -208,7 +208,7 @@
/**********************************************************/ /**********************************************************/
.altmacro .altmacro
.macro irq vector,int_mask,clr_int .macro irq vector,int_mask,clr_int
move.w #0x2700,sr // disable interrupt //move.w #0x2700,sr // disable interrupt
subq.l #8,a7 subq.l #8,a7
movem.l d0/a5,(a7) // save registers movem.l d0/a5,(a7) // save registers
@@ -237,18 +237,18 @@
* If anybody knows of any better way on how to do this - please do! * If anybody knows of any better way on how to do this - please do!
* *
*/ */
.macro mchar st,a,b,c,d,tgt .macro mchar st,a,b,c,d,tgt
\st #\a << 24|\b<<16|\c<<8|\d,\tgt \st #\a << 24|\b<<16|\c<<8|\d,\tgt
.endm .endm
.text .text
_vec_init: _vec_init:
move.l a2,-(sp) // Backup registers move.l a2,-(sp) // Backup registers
mov3q.l #-1,_rt_mod // rt_mod auf super mov3q.l #-1,_rt_mod // rt_mod auf super
clr.l _rt_ssp clr.l _rt_ssp
clr.l _rt_usp clr.l _rt_usp
clr.l _rt_vbr clr.l _rt_vbr
move.l #__RAMBAR0,d0 // exception vectors reside in rambar0 move.l #__RAMBAR0,d0 // exception vectors reside in rambar0
movec d0,VBR movec d0,VBR
move.l d0,a0 move.l d0,a0
@@ -268,7 +268,7 @@ init_vec_loop:
lea access(pc),a1 // set illegal access exception handler lea access(pc),a1 // set illegal access exception handler
move.l a1,0x08(a0) move.l a1,0x08(a0)
.extern _get_bas_drivers .extern _get_bas_drivers
// trap #0 (without any parameters for now) is used to provide BaS' driver addresses to the OS // trap #0 (without any parameters for now) is used to provide BaS' driver addresses to the OS
lea _get_bas_drivers(pc),a1 lea _get_bas_drivers(pc),a1
@@ -326,7 +326,7 @@ init_vec_loop:
*/ */
vector_table_start: vector_table_start:
std_exc_vec: std_exc_vec:
move.w #0x2700,sr // disable interrupt //move.w #0x2700,sr // disable interrupt
subq.l #8,a7 subq.l #8,a7
movem.l d0/a5,(sp) // save registers movem.l d0/a5,(sp) // save registers
move.w 8(sp),d0 // fetch vector move.w 8(sp),d0 // fetch vector
@@ -353,21 +353,21 @@ std_exc_vec:
jsr _xprintf // call xprintf() jsr _xprintf // call xprintf()
add.l #3*4,sp // adjust stack add.l #3*4,sp // adjust stack
noprint: noprint:
movem.l (sp),d0-d1/a0-a1 // restore registers movem.l (sp),d0-d1/a0-a1 // restore registers
lea 4 * 4(sp),sp lea 4 * 4(sp),sp
#endif /* DBG_EXC */ #endif /* DBG_EXC */
add.l _rt_vbr,d0 // + VBR add.l _rt_vbr,d0 // + VBR
move.l d0,a5 move.l d0,a5
move.l (a5),d0 // fetch exception routine address move.l (a5),d0 // fetch exception routine address
move.l 4(sp),a5 // restore a5 move.l 4(sp),a5 // restore a5
move.l d0,4(a7) // store exception routine address move.l d0,4(a7) // store exception routine address
move.w 10(a7),d0 // restore original SR //move.w 10(a7),d0 // restore original SR
bset #13,d0 // set supervisor bit //bset #13,d0 // set supervisor bit
move.w d0,sr // //move.w d0,sr //
move.l (a7)+,d0 // restore d0 move.l (a7)+,d0 // restore d0
rts // jump to exception routine rts // jump to exception routine
@@ -409,15 +409,15 @@ access_mmu:
cmp.l #__FASTRAM_END,d0 // above max User RAM area? cmp.l #__FASTRAM_END,d0 // above max User RAM area?
bge bus_error // -> bus error bge bus_error // -> bus error
lea -5*4(sp),sp // save gcc scratch registers lea -3 * 4(sp),sp // save gcc scratch registers
movem.l d0-d1/a0-a2,(sp) movem.l d1/a0-a1,(sp)
move.l d0,-(sp) // fault address move.l d0,-(sp) // fault address
jsr _mmutr_miss // else we have an MMU TLB miss jsr _mmutr_miss // else we have an MMU TLB miss
addq.l #4,sp addq.l #4,sp
movem.l (sp),d0-d1/a0-a2 // restore gcc scratch registers movem.l (sp),d1/a0-a1 // restore gcc scratch registers
lea 5*4(sp),sp lea 3 * 4(sp),sp
move.l (sp)+,d0 // restore register move.l (sp)+,d0 // restore register
@@ -426,7 +426,7 @@ access_mmu:
bus_error: bus_error:
move.l (sp)+,d0 // restore register move.l (sp)+,d0 // restore register
bra std_exc_vec bra std_exc_vec
zero_divide: zero_divide:
move.w #0x2700,sr // disable interrupt move.w #0x2700,sr // disable interrupt
move.l a0,-(a7) move.l a0,-(a7)
@@ -455,16 +455,16 @@ zd_nal: cmp.w #0x3c,d0 // immediate?
zd_end: zd_end:
move.l a0,12(a7) move.l a0,12(a7)
move.l (a7)+,d0 move.l (a7)+,d0
move.l (a7)+,a0 move.l (a7)+,a0
rte rte
#ifdef _NOT_USED_ #ifdef _NOT_USED_
linea: linea:
move.w #0x2700,sr // disable interrupt move.w #0x2700,sr // disable interrupt
halt halt
nop nop
nop nop
linef: linef:
move.w #0x2700,sr // disable interrupt move.w #0x2700,sr // disable interrupt
halt halt
nop nop
@@ -475,7 +475,7 @@ format:
nop nop
nop nop
//floating point //floating point
flpoow: flpoow:
move.w #0x2700,sr // disable interrupt move.w #0x2700,sr // disable interrupt
halt halt
@@ -516,7 +516,7 @@ irq5text:
.ascii "IRQ5!" .ascii "IRQ5!"
.dc.b 13,10,0 .dc.b 13,10,0
irq6: irq6:
irq 0x74,5,0x20 irq 0x74,5,0x20
irq7: // irq7 is tied to PCI INTA# and PCI INTB# on the M5484LITE irq7: // irq7 is tied to PCI INTA# and PCI INTB# on the M5484LITE
@@ -555,33 +555,33 @@ irq6: // MFP interrupt from FPGA
// screen adr change timed out? // screen adr change timed out?
move.l _video_sbt,d0 move.l _video_sbt,d0
beq irq6_non_sca // nothing to do if 0 beq irq6_non_sca // nothing to do if 0
sub.l #0x70000000,d0 // substract 14 seconds sub.l #0x70000000,d0 // substract 14 seconds
lea MCF_SLT0_SCNT,a5 lea MCF_SLT0_SCNT,a5
cmp.l (a5),d0 // time reached? cmp.l (a5),d0 // time reached?
ble irq6_non_sca // not yet ble irq6_non_sca // not yet
lea -28(a7),a7 // save more registers lea -28(a7),a7 // save more registers
movem.l d0-d4/a0-a1,(a7) // movem.l d0-d4/a0-a1,(a7) //
clr.l d3 // beginn mit 0 clr.l d3 // beginn mit 0
jsr _flush_and_invalidate_caches jsr _flush_and_invalidate_caches
// eintrag suchen // eintrag suchen
irq6_next_sca: irq6_next_sca:
move.l d3,d0 move.l d3,d0
move.l d0,MCF_MMU_MMUAR // addresse move.l d0,MCF_MMU_MMUAR // addresse
move.l #0x106,d4 move.l #0x106,d4
move.l d4,MCF_MMU_MMUOR // suchen -> move.l d4,MCF_MMU_MMUOR // suchen ->
nop nop
move.l MCF_MMU_MMUOR,d4 move.l MCF_MMU_MMUOR,d4
clr.w d4 clr.w d4
swap d4 swap d4
move.l d4,MCF_MMU_MMUAR move.l d4,MCF_MMU_MMUAR
mvz.w #0x10e,d4 mvz.w #0x10e,d4
move.l d4,MCF_MMU_MMUOR // einträge holen aus mmu move.l d4,MCF_MMU_MMUOR // einträge holen aus mmu
nop nop
move.l MCF_MMU_MMUTR,d4 // ID holen move.l MCF_MMU_MMUTR,d4 // ID holen
lsr.l #2,d4 // bit 9 bis 2 lsr.l #2,d4 // bit 9 bis 2
cmp.w #sca_page_ID,d4 // ist screen change ID? cmp.w #sca_page_ID,d4 // ist screen change ID?
bne irq6_sca_pn // nein -> page keine screen area next bne irq6_sca_pn // nein -> page keine screen area next
// eintrag <EFBFBD>ndern // eintrag <EFBFBD>ndern
add.l #std_mmutr,d0 add.l #std_mmutr,d0
@@ -593,9 +593,9 @@ irq6_sca_pn0:
add.l #writethrough_mmudr|MCF_MMU_MMUDR_LK,d1 // page wt and locked add.l #writethrough_mmudr|MCF_MMU_MMUDR_LK,d1 // page wt and locked
irq6_sca_pn1c: irq6_sca_pn1c:
mvz.w #0x10b,d2 // MMU update mvz.w #0x10b,d2 // MMU update
move.l d0,MCF_MMU_MMUTR move.l d0,MCF_MMU_MMUTR
move.l d1,MCF_MMU_MMUDR move.l d1,MCF_MMU_MMUDR
move.l d2,MCF_MMU_MMUOR // setze tlb data only move.l d2,MCF_MMU_MMUOR // setze tlb data only
nop nop
// page copy // page copy
move.l d3,a0 move.l d3,a0
@@ -634,7 +634,7 @@ wait_dma_finished:
cmp.l #6,d0 cmp.l #6,d0
bne wait_dma_finished bne wait_dma_finished
#else #else
irq6_vcd0_loop: irq6_vcd0_loop:
move.l (a0)+,(a1)+ // page copy move.l (a0)+,(a1)+ // page copy
move.l (a0)+,(a1)+ move.l (a0)+,(a1)+
move.l (a0)+,(a1)+ move.l (a0)+,(a1)+
@@ -652,7 +652,7 @@ irq6_sca_pn:
move.l d0,_video_tlb // anfangszustand wieder herstellen move.l d0,_video_tlb // anfangszustand wieder herstellen
clr.l _video_sbt // zeit löschen clr.l _video_sbt // zeit löschen
movem.l (sp),d0-d4/a0-a1 // restore registers movem.l (sp),d0-d4/a0-a1 // restore registers
lea 7 * 4(sp),sp lea 7 * 4(sp),sp
irq6_non_sca: irq6_non_sca:
@@ -670,7 +670,7 @@ non_acsi_dma:
bne irq6_1 bne irq6_1
movem.l (a7),d0/a5 movem.l (a7),d0/a5
addq.l #8,a7 addq.l #8,a7
rte rte
irq6_1: irq6_1:
lea MCF_GPIO_PODR_FEC1L,a5 lea MCF_GPIO_PODR_FEC1L,a5
bclr.b #4,(a5) // led on bclr.b #4,(a5) // led on
@@ -684,9 +684,9 @@ irq6_1:
irq6_2: irq6_2:
// test auf protect mode --------------------- // test auf protect mode ---------------------
move.b DIP_SWITCHa,d0 move.b DIP_SWITCHa,d0
btst #7,d0 btst #7,d0
bne irq6_3 // ja-> bne irq6_3 // ja->
// ------------------------------------------- // -------------------------------------------
move.l 0xF0020000,a5 // vector holen 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
@@ -702,7 +702,7 @@ irq6_3:
mov3q.l #-1,_rt_mod // auf supervisor setzen mov3q.l #-1,_rt_mod // auf supervisor setzen
move.l a5,_rt_usp // rt_usp speichern move.l a5,_rt_usp // rt_usp speichern
move.l _rt_ssp,a5 // rt_ssp holen move.l _rt_ssp,a5 // rt_ssp holen
move.l 12(a7),-(a5) // pc transferieren move.l 12(a7),-(a5) // pc transferieren
move.l 8(a7),-(a5) // sr transferieren move.l 8(a7),-(a5) // sr transferieren
move.l a5,usp // usp setzen move.l a5,usp // usp setzen
move.l 0xF0020000,a5 // vector holen: intack routine move.l 0xF0020000,a5 // vector holen: intack routine
@@ -713,7 +713,7 @@ irq6_3:
move.b #6,2(a7) // intmaske setzen move.b #6,2(a7) // intmaske setzen
rte // und weg rte // und weg
sev_sup6: sev_sup6:
move.l 12(a7),-(a5) // pc transferieren move.l 12(a7),-(a5) // pc transferieren
move.l 8(a7),-(a5) // sr,vec move.l 8(a7),-(a5) // sr,vec
bset #5,2(a5) // auf super setzen bset #5,2(a5) // auf super setzen
move.l a5,usp // usp setzen move.l a5,usp // usp setzen
@@ -735,7 +735,7 @@ blinker:.long 0
acsi_dma: // atari dma acsi_dma: // atari dma
move.l a1,-(a7) move.l a1,-(a7)
move.l d1,-(a7) move.l d1,-(a7)
lea MCF_PSC0_PSCTB_8BIT,a1 // ++ vr lea MCF_PSC0_PSCTB_8BIT,a1 // ++ vr
mchar move.l, 'D,'M','A,'\ ,(a1) mchar move.l, 'D,'M','A,'\ ,(a1)
//move.l #"DMA ",(a1) //move.l #"DMA ",(a1)
@@ -756,9 +756,9 @@ acsi_dma_rl:
move.l (a5),(a1)+ // read 4 bytes move.l (a5),(a1)+ // read 4 bytes
move.l (a5),(a1)+ // read 4 bytes move.l (a5),(a1)+ // read 4 bytes
move.l (a5),(a1)+ // read 4 bytes move.l (a5),(a1)+ // read 4 bytes
moveq #'.',d1 moveq #'.',d1
move.b d1,MCF_PSC0_PSCTB_8BIT move.b d1,MCF_PSC0_PSCTB_8BIT
sub.l #16,d0 // byt counter -16 sub.l #16,d0 // byt counter -16
bpl acsi_dma_rl bpl acsi_dma_rl
@@ -770,9 +770,9 @@ acsi_dma_wl:
move.l (a1)+,(a5) // write 4 byts move.l (a1)+,(a5) // write 4 byts
move.l (a1)+,(a5) // write 4 byts move.l (a1)+,(a5) // write 4 byts
move.l (a1)+,(a5) // write 4 byts move.l (a1)+,(a5) // write 4 byts
moveq #'.',d1 moveq #'.',d1
move.b d1,MCF_PSC0_PSCTB_8BIT move.b d1,MCF_PSC0_PSCTB_8BIT
sub.l #16,d0 // byt counter -16 sub.l #16,d0 // byt counter -16
bpl acsi_dma_wl bpl acsi_dma_wl
@@ -785,10 +785,10 @@ acsi_dma_end:
lea 0xfffffa0b,a5 lea 0xfffffa0b,a5
bclr.b #7,4(a5) // clear int in service mfp bclr.b #7,4(a5) // clear int in service mfp
bclr.b #7,(a5) // clear int pending mfp 0xfffffa0b bclr.b #7,(a5) // clear int pending mfp 0xfffffa0b
move.w #0x0d0a,d1 move.w #0x0d0a,d1
move.w d1,MCF_PSC0_PSCTB_8BIT move.w d1,MCF_PSC0_PSCTB_8BIT
move.l (a7)+,d1 move.l (a7)+,d1
move.l (a7)+,a1 move.l (a7)+,a1
rts rts
@@ -823,7 +823,7 @@ irq7:
handler_psc3: handler_psc3:
move.w #0x2700,sr // disable interrupt move.w #0x2700,sr // disable interrupt
lea -20(a7),a7 lea -20(a7),a7
movem.l d0-d2/a0/a3,(a7) movem.l d0-d2/a0/a3,(a7)
lea MCF_PSC3_PSCRB_8BIT,a3 lea MCF_PSC3_PSCRB_8BIT,a3
move.b (a3),d1 move.b (a3),d1
cmp.b #2,d1 // anforderung rtc daten? cmp.b #2,d1 // anforderung rtc daten?
@@ -837,7 +837,7 @@ handler_psc3:
lea 0xffff8961,a0 lea 0xffff8961,a0
lea MCF_PSC3_PSCTB_8BIT,a3 lea MCF_PSC3_PSCTB_8BIT,a3
clr.l d1 clr.l d1
moveq #64,d2 moveq #64,d2
move.b #0x82,(a3) // header: rtcd mcf->pic move.b #0x82,(a3) // header: rtcd mcf->pic
loop_sr2: loop_sr2:
@@ -871,7 +871,7 @@ handler_gpt0:
blt sca_other // blt sca_other //
lea MCF_SLT0_SCNT,a0 lea MCF_SLT0_SCNT,a0
move.l (a0),_video_sbt // save time move.l (a0),_video_sbt // save time
// FIXME: don't we need to get out here? // FIXME: don't we need to get out here?
@@ -944,18 +944,18 @@ video_copy_data_loop:
// eintrag suchen // eintrag suchen
move.l d0,MCF_MMU_MMUAR // adress move.l d0,MCF_MMU_MMUAR // adress
move.l #0x106,d4 move.l #0x106,d4
move.l d4,MCF_MMU_MMUOR // search -> new one will be offered if not found move.l d4,MCF_MMU_MMUOR // search -> new one will be offered if not found
nop nop
move.l MCF_MMU_MMUOR,d4 move.l MCF_MMU_MMUOR,d4
clr.w d4 clr.w d4
swap d4 swap d4
move.l d4,MCF_MMU_MMUAR move.l d4,MCF_MMU_MMUAR
move.l d0,d1 move.l d0,d1
add.l #MCF_MMU_MMUTR_ID(sca_page_ID)|std_mmutr,d0 add.l #MCF_MMU_MMUTR_ID(sca_page_ID)|std_mmutr,d0
add.l #0x60000000|writethrough_mmudr|MCF_MMU_MMUDR_LK,d1 add.l #0x60000000|writethrough_mmudr|MCF_MMU_MMUDR_LK,d1
mvz.w #0x10b,d2 // MMU update mvz.w #0x10b,d2 // MMU update
move.l d0,MCF_MMU_MMUTR move.l d0,MCF_MMU_MMUTR
move.l d1,MCF_MMU_MMUDR move.l d1,MCF_MMU_MMUDR
move.l d2,MCF_MMU_MMUOR // setzen vidoe maped to 60xxx only data move.l d2,MCF_MMU_MMUOR // setzen vidoe maped to 60xxx only data
nop nop
@@ -991,20 +991,22 @@ video_chg_end:
* low-level interrupt service routine for routines registered with * low-level interrupt service routine for routines registered with
* isr_register_handler() * isr_register_handler()
*/ */
.global _lowlevel_isr_handler .global _lowlevel_isr_handler
.extern _isr_execute_handler .extern _isr_execute_handler
_lowlevel_isr_handler: _lowlevel_isr_handler:
move.w #0x2700,sr // disable interrupts move.w #0x2700,sr
link a6,#-4*4 // make room for lea -5 * 4(sp),sp // make room for
movem.l d0-d1/a0-a1,(sp) // gcc scratch registers and save them movem.l d0-d1/a0-a2,(sp) // gcc scratch registers and save them,
// other registers will be handled by gcc itself
move.w 4(a6),d0 // fetch vector number from stack move.w 5 * 4(sp),d0 // fetch vector number from stack
lsr.l #2,d0 // move it in place lsr.l #2,d0 // move it in place
andi.l #0x000000ff,d0 // mask it out andi.l #0x000000ff,d0 // mask it out
move.l d0,-(sp) // push it move.l d0,-(sp) // push it
jsr _isr_execute_handler // call the C handler jsr _isr_execute_handler // call the C handler
lea 4(sp),sp // adjust stack addq.l #4,sp // adjust stack
movem.l (sp),d0-d1/a0-a1 // restore registers
unlk a6 // cleanup stack movem.l (sp),d0-d1/a0-a2 // restore registers
lea 5 * 4(sp),sp
rte rte