fixed a bug with LINK instruction not saving address register
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
@@ -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
|
||||||
@@ -365,9 +365,9 @@ noprint:
|
|||||||
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
|
||||||
|
|
||||||
@@ -995,16 +995,18 @@ video_chg_end:
|
|||||||
.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
|
||||||
|
|||||||
Reference in New Issue
Block a user