\ debuffer.fr - Debuffer initialization and softwords.

\ Build the disassembly table.
( debuffer 1.3 - loading... ) cr
load table68k.fr

\ Load online documentation.
load help.fr

: .b ( n -- ) base @ >r hex 00 <#             # # #> r> base ! type space ;
: .w ( n -- ) base @ >r hex 00 <#         # # # # #> r> base ! type space ;
: .l ( n -- ) base @ >r hex 00 <# # # # # # # # # #> r> base ! type space ;

: ?b ( a -- ) @ .b ;   : ?byte ( a -- ) @byte .b ;
: ?w ( a -- ) @ .w ;   : ?word ( a -- ) @word .w ;
: ?l ( a -- ) @ .l ;   : ?long ( a -- ) @long .l ;

\ Convenience words for displaying registers.
: .d0 ( -- ) d0 ?l ;   : .a0 ( -- ) a0 ?l ;
: .d1 ( -- ) d1 ?l ;   : .a1 ( -- ) a1 ?l ;
: .d2 ( -- ) d2 ?l ;   : .a2 ( -- ) a2 ?l ;
: .d3 ( -- ) d3 ?l ;   : .a3 ( -- ) a3 ?l ;
: .d4 ( -- ) d4 ?l ;   : .a4 ( -- ) a4 ?l ;
: .d5 ( -- ) d5 ?l ;   : .a5 ( -- ) a5 ?l ;
: .d6 ( -- ) d6 ?l ;   : .a6 ( -- ) a6 ?l ;   : .fp ( -- ) fp ?l ;
: .d7 ( -- ) d7 ?l ;

: .usp ( -- ) usp ?l ;
: .ssp ( -- ) ssp ?l ;
: .pc  ( -- ) pc  ?l ;
: .sr  ( -- ) sr  ?w ;

: .regs ( -- )
       ." d0:  " .d0   ." a0: " .a0 cr
       ." d1:  " .d1   ." a1: " .a1 cr
       ." d2:  " .d2   ." a2: " .a2 cr
       ." d3:  " .d3   ." a3: " .a3 cr
       ." d4:  " .d4   ." a4: " .a4 cr
       ." d5:  " .d5   ." a5: " .a5 cr
       ." d6:  " .d6   ." a6: " .a6 cr
       ." d7:  " .d7                cr
       ." usp: " .usp               cr
       ." ssp: " .ssp               cr
       ." pc:  " .pc                cr
       ." sr:  " .sr                cr ;

\ Ascii dump
: .addr ( n -- ) base @ >r hex 00 <# 58 hold # # # # # # # # #> r> base ! cr type space ;
: .a ( n -- )
       dup  32 < if 46  else
       dup 128 < if dup else
                    46
       then then emit drop ;
: ?a @byte .a ;

: da ( addr count -- )
       over + over
       do
               i over - 64 mod 0= if i .addr then
               i ?a
       loop drop cr ;

\ Word dump
: dw ( addr count -- )
       2 * over + over
       do
               i over - 24 mod 0= if i .addr then
               i ?word
       2 +loop drop cr ;

\ Long dump
: dd ( addr count -- )
       4 * over + over
       do
               i over - 24 mod 0= if i .addr then
               i ?long
       4 +loop drop cr ;

\ Backtrace - dump the stack.
: bt ( -- )
       pc @ fp @
       begin
               swap ln dup 4 + @long swap dup @long dup rot > 0=
       until 2drop ;

\ Single step.
: step ( -- ) 0x8000 sr w@ or sr w! go ;

\ Step over, a next replacement (next doesn't work for bra, bcc and rts).
\ 0x61 = bsr, 0x4e4f = Systrap, 0x4E 10xx xxxx = JSR
: over ( -- )
               pc @ @byte 0x61 = pc @ @word 0x4e4f = or
               pc @ @word 0xFFC0 and 0x4E80 = or
       if next else step then ;

\ Step out of the current routine.
: out ( addr -- ) fp @ 4 + @long to ;

\ Define more user-friendly "go" and "wait" words.
: wait-msg ( -- ) ." Waiting for debug event... " cr ;
: go   ( -- ) wait-msg go   ;
: wait ( -- ) wait-msg wait ;

\ Go directly into wait mode.
\ .( Type "bye" to exit. Type "help" for online help. ) cr
wait