Files
FireBee_SVN/BaS_GNU/usb/store/debug2.S
Markus Fröschle 522d92cc5f experimental branch to build BaS with a GNU toolchain.
branched from Rev 38 of trunk
2012-10-11 09:50:51 +00:00

841 lines
15 KiB
ArmAsm

/* Debug the CT60
*
* Didier Mequignon, 2003-2006, e-mail: aniplay@wanadoo.fr
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
.chip 68040
.globl exception
#ifdef COLDFIRE
.globl null
#include "fire.h"
#endif
#include "vars.h"
#define DEBUG
#ifdef DEBUG
.global display_string,hex_long,hex_word,hex_byte,display_char,wait_key,_debug
#endif
.text
#ifdef COLDFIRE
null:
clr.l 0x380 // not valid
move.l SP,0x3C0
move.l A6,0x3BC
lea 0x384,A6
movem.l D0-D7/A0-A5,(A6)
clr.l 0x3C8 // USP
moveq #-1,D1
#endif
exception:
clr.l memvalid
lea.l mess1(PC),A0
bsr display_string
#ifdef COLDFIRE
ext.l D1
addq.l #1,D1
move.l D1,D7 // vector number
#else
addq.w #1,D1
move.w D1,D7 // vector number
#endif
moveq #0,D0
move.w D7,D0
#ifdef COLDFIRE
.chip 68060
divu #10,D0
.chip 5200
move.l D0,D1
and.l #7,D0
beq.s .ex1
or.l #0x30,D0
bsr display_char
.ex1:
swap D1
move.w D1,D0
or.l #0x30,D0
#else
divu #10,D0
and.w #7,D0
beq.s .ex1
or.w #0x30,D0
bsr display_char
.ex1:
swap d0
or.w #0x30,D0
#endif
bsr display_char
moveq #0x3A,D0
bsr display_char
moveq #0x20,D0
bsr display_char
lea.l tab_mess_exc(PC),A0
move.w D7,D0
bsr display_tab
moveq #13,D0
bsr display_char
moveq #10,D0
bsr display_char
#ifdef COLDFIRE
tst.w D7
beq .ex0
#endif
lea.l mess2(PC),A0 // SR
bsr display_string
#ifdef COLDFIRE
move.w save_sr,D0 // SR
#else
move.l 0x3C0,A0 //SSP
move.w (A0),D0
#endif
bsr hex_word // SR
lea.l mess3(PC),A0
bsr display_string
#ifdef COLDFIRE
move.w save_sr,D2 // SR
and.l #0xB71F,D2
#else
move.l 0x3C0,A0 //SSP
move.w (A0),D2 // SR
and.w #0xB71F,D2
#endif
lea.l tab_status(PC),A1
moveq #15,D1
.ex5:
btst.l D1,D2
beq.s .ex6
moveq #0,D0
move.b (A1,D1),D0
move.w D0,D3
#ifdef COLDFIRE
and.l #0xF8,D3
cmp.l #0x30,D3
#else
and.w #0xF8,D3
cmp.w #0x30,D3
#endif
bne.s .ex4
move.w D0,-(SP)
moveq #0x49,D0 // I
bsr display_char
move.w (SP)+,D0
.ex4:
bsr display_char
moveq #0x20,D0
bsr display_char
.ex6:
#ifdef COLDFIRE
subq.l #1,D1
bpl.s .ex5
.ex0:
#else
dbf D1,.ex5
#endif
lea.l mess4(PC),A0 // PC
bsr display_string
#ifdef COLDFIRE
move.l save_pc,D0 // PC
#else
move.l 0x3C0,A0 // SSP
move.l 2(A0),D0 // PC
#endif
bsr hex_long
lea.l mess10(PC),A0 // Basepage
bsr display_string
move.l 0x6EE4,D0
bsr hex_long
#ifdef COLDFIRE
tst.w D7
beq .ex2
#endif
lea.l mess5(PC),A0 // CACR
bsr display_string
#ifdef COLDFIRE
.chip 68060
movec.l CACR,D0 // from value stored in the CF68KLIB
.chip 5200
bsr hex_long
cmp.l #2,D7
bne.s .ex2
lea.l mess6(PC),A0 // address fault
bsr display_string
move.l address_fault,D0 // from value stored in the CF68KLIB
bsr hex_long
#else /* ATARI - CT60 */
movec.l CACR,D0
bsr hex_long
cmp.w #2,D7
beq.s .ex3 // Acces Fault
cmp.w #3,D7
beq.s .ex3 // Adress Error
cmp.w #5,D7
beq.s .ex3 // Zero Divide
cmp.w #9,D7
bne .ex2 // <> Trace
.ex3:
lea.l mess6(PC),A0 // address fault
bsr display_string
move.l 0x3C0,A0 // SSP
move.l 8(A0),D0 // address fault
bsr hex_long
cmp.w #2,D7
bne .ex2 // <> Acces Fault
lea.l mess7(PC),A0 // FSLW
bsr display_string
move.l 0x3C0,A0 // SSP
move.l 12(A0),D0 // FSLW
bsr hex_long
lea.l mess3(PC),A0
bsr display_string
moveq #13,D0
bsr display_char
moveq #10,D0
bsr display_char
move.l 0x3C0,A0 // SSP
move.l 12(A0),D2 // FSLW
and.l #0x0BFFFFFD,D2
lea.l tab_fslw1(PC),A1
lea.l tab_fslw2(PC),A2
lea.l tab_fslw3(PC),A3
moveq #31,D1
moveq #0,D3
.ex13:
btst.l D1,D2
beq.s .ex14
moveq #0,D0
move.b (A1,D3),D0
bsr display_char
moveq #0,D0
move.b (A2,D3),D0
cmp.b #0x20,D0
beq.s .ex12
bsr display_char
moveq #0,D0
move.b (A3,D3),D0
cmp.b #0x20,D0
beq.s .ex12
bsr display_char
.ex12:
moveq #0x20,D0
bsr display_char
.ex14:
addq.w #1,D3
dbf D1,.ex13
#endif /* COLDFIRE */
.ex2:
lea.l mess8(PC),A0 // SSP
bsr display_string
move.l 0x3C0,D0 // SSP
bsr hex_long
lea.l mess9(PC),A0 // USP
bsr display_string
move.l 0x3C8,D0 // USP
bsr hex_long
lea.l 0x384,A1 // registers
lea.l 32(A1),A2
moveq #7,D1
.ex8:
moveq #13,D0
bsr display_char
moveq #10,D0
bsr display_char
moveq #0x44,D0
bsr display_char
moveq #7,D0
#ifdef COLDFIRE
sub.l D1,D0
or.l #0x30,D0
#else
sub.w D1,D0
or.w #0x30,D0
#endif
move.w D0,-(SP)
bsr display_nb
move.l (A1),D0
bsr hex_long // data registers
moveq #0x20,D0
bsr display_char
tst.w D1
beq.s .ex9
moveq #0x41,D0
bsr display_char
move.w (SP),D0
bsr display_nb
move.l (A2),D0
bsr hex_long // address registers
moveq #0x20,D0
bsr display_char
.ex9:
addq.l #2,SP
addq.l #4,A1
addq.l #4,A2
#ifdef COLDFIRE
subq.l #1,D1
bpl.s .ex8
#else
dbf D1,.ex8
#endif
moveq #13,D0
bsr display_char
.loop_wait_key:
#ifdef COLDFIRE
#ifdef DEBUG
move.w #1,-(SP) // AUX
#else
move.w #2,-(SP) // CON
#endif
#else
move.w #2,-(SP) // CON
#endif
move.w #2,-(SP) // Bconin
trap #13
addq.l #4,SP
ext.l D0
move.l D0,-(SP)
move.l #0x5F504349,D0
lea 0xED0000,A0 // 128 KB
cmp.l (A0),D0 // _PCI
beq.s .pci_drivers
lea 0xEC0000,A0 // 192 KB
cmp.l (A0),D0 // _PCI
beq.s .pci_drivers
lea 0xEB0000,A0 // 256 KB
cmp.l (A0),D0 // _PCI
beq.s .pci_drivers
lea 0xEA0000,A0 // 320 KB
cmp.l (A0),D0 // _PCI
bne.s .no_pci_drivers
.pci_drivers:
jsr 40(A0) // drivers PCI in flash, add dbug (68k disassembler)
move.l D0,(SP)
bne .no_pci_drivers
addq.l #4,SP
bra.s .loop_wait_key
.no_pci_drivers:
move.l (SP)+,D0
#ifdef COLDFIRE
and.l #0xFF,D0
cmp.l #0x6D,D0 // m
#else
cmp.b #0x6D,D0 // m
#endif
beq.s .memory_dump
#ifdef COLDFIRE
cmp.l #0x70,D0 // p
#else
cmp.b #0x70,D0 // p
#endif
beq.s .patch_memory
#ifdef DEBUG
#ifdef COLDFIRE
cmp.l #0x20,D0
#else
cmp.b #0x20,D0
#endif
bne .loop_wait_key
lea mess14(PC),A0
bsr display_string
#endif
rts
.memory_dump:
lea mess11(PC),A0 // memory dump
bsr display_string
bsr get_hex_value
move.l D0,A0
bsr dump
bra .loop_wait_key
.patch_memory:
lea mess12(PC),A0 // patch memory
bsr display_string
bsr get_hex_value
move.l D0,A1
lea mess13(PC),A0 // value
bsr display_string
bsr get_hex_value
cmp.l #0x100,D0
bcc.s .word_value
move.b D0,(A1)
lea crlf(PC),A0
bsr display_string
move.l A1,D0
bsr hex_long
moveq #0x20,D0
bsr display_char
move.b (A1),D0
bsr hex_byte
bra .loop_wait_key
.word_value:
cmp.l #0x10000,D0
bcc.s .long_value
move.w D0,(A1)
lea crlf(PC),A0
bsr display_string
move.l A1,D0
bsr hex_long
moveq #0x20,D0
bsr display_char
move.w (A1),D0
bsr hex_word
bra .loop_wait_key
.long_value:
move.l D0,(A1)
lea crlf(PC),A0
bsr display_string
move.l A1,D0
bsr hex_long
moveq #0x20,D0
bsr display_char
move.l (A1),D0
bsr hex_long
bra .loop_wait_key
display_nb:
bsr display_char
moveq #0x3A,D0
bsr display_char
moveq #0x24,D0
bsr display_char
rts
display_tab:
#ifdef COLDFIRE
move.l D1,-(SP)
#endif
move.w D0,-(SP)
moveq #0,D0
.dt1:
#ifdef COLDFIRE
move.b (A0),D1
extb.l D1
cmp.l #-1,D1
beq.s .dt3
moveq #0,D1
move.w (SP),D1
cmp.l D1,D0
#else
cmp.b #-1,(A0)
beq.s .dt3
cmp.w (SP),D0
#endif
beq.s .dt4
.dt2:
tst.b (A0)+
bne.s .dt2
#ifdef COLDFIRE
addq.l #1,D0
#else
addq.w #1,D0
#endif
bra.s .dt1
.dt4:
bsr display_string
.dt3:
addq.l #2,SP
#ifdef COLDFIRE
move.l (SP)+,D1
#endif
rts
hex_long:
move.l D0,-(SP)
swap D0
bsr.s hex_word
move.l (SP)+,D0
hex_word:
move.w D0,-(SP)
#ifdef COLDFIRE
lsr.l #8,D0
bsr.s hex_byte
move.w (SP)+,D0
hex_byte:
move.w D0,-(SP)
lsr.l #4,D0
bsr.s hex_char
move.w (SP)+,D0
hex_char:
and.l #0xF,D0
or.l #0x30,D0
cmp.l #0x3A,D0
bcs.s display_char
addq.l #7,D0
display_char:
and.l #0xFF,D0
#ifdef DEBUG /* warning !!! If serial mouse */
move.l D1,-(SP)
.wait_uart:
move.b MCF_UART_USR0,D1
and.l #MCF_UART_USR_TXRDY,D1
beq.s .wait_uart
move.b D0,MCF_UART_UTB0 // send the character
move.l (SP)+,D1
#else
lea -24(SP),SP
movem.l D0-D2/A0-A2,(SP)
move.w D0,-(sp)
move.w #2,-(SP)
move.w #3,-(SP) // Bconout
trap #13
addq.l #6,SP
movem.l (SP),D0-D2/A0-A2
lea 24(SP),SP
#endif /* DEBUG */
rts
#else /* ATARI */
lsr.w #8,D0
bsr.s hex_byte
move.w (SP)+,D0
hex_byte:
move.w D0,-(SP)
lsr.b #4,D0
bsr.s hex_char
move.w (SP)+,D0
hex_char:
and.b #0xF,D0
or.b #0x30,D0
cmp.b #0x3A,D0
bcs.s display_char
addq.b #7,D0
display_char:
and.w #0xFF,D0
movem.l D0-D2/A0-A2,-(SP)
move.w D0,-(sp)
move.w #2,-(SP)
move.w #3,-(SP) // Bconout
trap #13
addq.l #6,SP
movem.l (SP)+,D0-D2/A0-A2
rts
#endif /* COLDFIRE */
display_string:
#ifdef COLDFIRE
move.l D0,-(SP)
move.l A0,-(SP)
#else
movem.l D0/A0,-(SP)
#endif
.os2:
move.b (A0)+,D0
beq.s .os1
bsr display_char
bra.s .os2
.os1:
#ifdef COLDFIRE
move.l (SP)+,A0
move.l (SP)+,D0
#else
movem.l (SP)+,D0/A0
#endif
rts
get_hex_value:
#ifdef COLDFIRE
lea -56(SP),SP
movem.l D1-A5,(SP)
link A6,#-8
moveq #0,D7
.loop_get_value:
#ifdef DEBUG
move.w #1,-(SP) // AUX
#else
move.w #2,-(SP) // CON
#endif
move.w #2,-(SP) // Bconin
trap #13
addq.l #4,SP
and.l #0xFF,D0
cmp.l #13,D0
beq.s .conv_get_value
cmp.l #8,D0
bne.s .not_backspace
tst.w D7
ble.s .loop_get_value
bsr display_char
subq.l #1,D7
bra.s .loop_get_value
.not_backspace:
cmp.l #0x30,D0
bcs.s .loop_get_value
cmp.l #0x39,D0
bls.s .number_value
cmp.l #0x41,D0
bcs.s .loop_get_value
cmp.l #0x46,D0
bls.s .letter_value
cmp.l #0x61,D0
bcs.s .loop_get_value
cmp.l #0x66,D0
bhi.s .loop_get_value
.letter_value:
bsr display_char
and.l #0x0F,D0
add.l #9,D0
bra.s .store_value
.number_value:
bsr display_char
and.l #0x0F,D0
.store_value:
move.b D0,-8(A6,D7)
addq.l #1,D7
cmp.l #8,D7
bcs .loop_get_value
.conv_get_value:
moveq #0,D0
subq.l #1,D7
bmi.s .end_get_value
moveq #0,D6
.loop_value:
asl.l #4,D0
moveq #0,D1
move.b -8(A6,D6),D1
or.l D1,D0
addq.l #1,D6
subq.l #1,D7
bpl.s .loop_value
.end_get_value:
tst.l D0
unlk A6
movem.l (SP),D1-A5
lea 56(SP),SP
#else /* ATARI */
movem.l D1-A5,-(SP)
link A6,#-8
moveq #0,D7
.loop_get_value:
move.w #2,-(SP) // CON
move.w #2,-(SP) // Bconin
trap #13
addq.l #4,SP
cmp.b #13,D0
beq.s .conv_get_value
cmp.b #8,D0
bne.s .not_backspace
tst.w D7
ble.s .loop_get_value
bsr display_char
subq.w #1,D7
bra.s .loop_get_value
.not_backspace:
cmp.b #0x30,D0
bcs.s .loop_get_value
cmp.b #0x39,D0
bls.s .number_value
cmp.b #0x41,D0
bcs.s .loop_get_value
cmp.b #0x46,D0
bls.s .letter_value
cmp.b #0x61,D0
bcs.s .loop_get_value
cmp.b #0x66,D0
bhi.s .loop_get_value
.letter_value:
bsr display_char
and.b #0x0F,D0
add.b #9,D0
bra.s .store_value
.number_value:
bsr display_char
and.b #0x0F,D0
.store_value:
move.b D0,-8(A6,D7)
addq.w #1,D7
cmp.w #8,D7
bcs.s .loop_get_value
.conv_get_value:
moveq #0,D0
subq.w #1,D7
bmi.s .end_get_value
moveq #0,D6
.loop_value:
asl.l #4,D0
or.b -8(A6,D6),D0
addq.w #1,D6
dbf D7,.loop_value
.end_get_value:
tst.l D0
unlk A6
movem.l (SP)+,D1-A5
#endif /* COLDFIRE */
rts
dump:
#ifdef COLDFIRE
lea -20(SP),SP
movem.l D0-D2/A0-A1,(SP)
#else
movem.l D0-D2/A0-A1,-(SP)
#endif
move.l A0,A1
moveq #3,D1
.loop_dump1:
lea crlf(PC),A0
bsr display_string
move.l A1,D0
bsr hex_long
moveq #0x20,D0
bsr display_char
moveq #15,D2
.loop_dump2:
move.b (A1)+,D0
bsr hex_byte
moveq #0x20,D0
bsr display_char
#ifdef COLDFIRE
subq.l #1,D2
bpl.s .loop_dump2
#else
dbf D2,.loop_dump2
#endif
lea -16(A1),A1
moveq #15,D2
.loop_dump3:
move.b (A1)+,D0
#ifdef COLDFIRE
and.l #0xFF,D0
cmp.l #0x20,D0
bcs.s .dump_bad_char
cmp.l #0x7F,D0
#else
cmp.b #0x20,D0
bcs.s .dump_bad_char
cmp.b #0x7F,D0
#endif
bcs.s .dump_ok
.dump_bad_char:
moveq #0x2E,D0
.dump_ok:
bsr display_char
#ifdef COLDFIRE
subq.l #1,D2
bpl.s .loop_dump3
subq.l #1,D1
bpl.s .loop_dump1
movem.l (SP),D0-D2/A0-A1
lea 20(SP),SP
#else
dbf D2,.loop_dump3
dbf D1,.loop_dump1
movem.l (SP)+,D0-D2/A0-A1
#endif
rts
crlf: .byte 13,10,0
mess1: .byte 13,10
.asciz "EXCEPTION PROCESSING "
mess2: .byte 13,10
.asciz "Status Register (SR): $"
mess3: .asciz ", bits to 1: "
mess4: .byte 13,10
.asciz "Program Counter (PC): $"
mess5: .byte 13,10
.asciz "Cache Register (CACR): $"
mess6: .byte 13,10
.asciz "Address Fault: $"
mess7: .byte 13,10
.asciz "Fault Status Word (FSLW): "
mess8: .byte 13,10
.asciz "Supervisor Stack (SSP): $"
mess9: .byte 13,10
.asciz "User Stack (USP): $"
mess10: .byte 13,10
.asciz "Basepage: $"
mess11: .byte 13,10
.asciz "Memory dump (hex) ? "
mess12: .byte 13,10
.asciz "Patch memory (hex) ? "
mess13: .byte 13,10
.asciz "Value (hex) ? "
mess14: .byte 13,10
.ascii "Pterm"
.byte 13,10,0
tab_mess_exc:
#ifdef COLDFIRE
.asciz "Null (jump or call)"
#else
.byte 0
#endif
.byte 0
.asciz "Access Fault"
.asciz "Address Error"
.asciz "Illegal Instruction"
.asciz "Integer Zero Divide"
.byte 0
.byte 0
.asciz "Privilege Violation"
.asciz "Trace"
.asciz "Line A"
.asciz "Line F"
.asciz "Emulator Interrupt"
.byte 0
.asciz "Format Error"
.asciz "Uninitialised Interrupt"
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.asciz "Spurious Interrupt"
.asciz "Interrupt level 1"
.asciz "Interrupt level 2"
.asciz "Interrupt level 3"
.asciz "Interrupt level 4"
.asciz "Interrupt level 5"
.asciz "Interrupt level 6"
.asciz "Interrupt level 7"
.asciz "Trap #0"
.asciz "Trap #1"
.asciz "Trap #2"
.asciz "Trap #3"
.asciz "Trap #4"
.asciz "Trap #5"
.asciz "Trap #6"
.asciz "Trap #7"
.asciz "Trap #8"
.asciz "Trap #9"
.asciz "Trap #10"
.asciz "Trap #11"
.asciz "Trap #12"
.asciz "Trap #13"
.asciz "Trap #14"
.asciz "Trap #15"
.byte -1
tab_status: .ascii "CVZNX 012 MS T"
tab_fslw1: .ascii " M LRWSSTTTTTIPSPPIPSWTRWTB S"
tab_fslw2: .ascii " A K ZZTTMMMOBBTTLFPPWEETP S"
tab_fslw3: .ascii " 1010210 EEAB E RE E"