Annotation of gforth/debug.fs, revision 1.1
1.1 ! anton 1: \ DEBUG.FS Debugger 12jun93jaw
! 2:
! 3: decimal
! 4:
! 5: VARIABLE IP \ istruction pointer for debugger
! 6:
! 7: \ Formated debugger words 12jun93jaw
! 8:
! 9: false [IF]
! 10:
! 11: Color: Men#
! 12: <A red >b yellow >f bold A> Men# CT!
! 13:
! 14: CREATE D-LineIP 80 cells allot
! 15: CREATE D-XPos 300 chars allot align
! 16: CREATE D-LineA 80 cells allot
! 17: VARIABLE ^LineA
! 18:
! 19: VARIABLE D-Lines
! 20: VARIABLE D-Line
! 21: VARIABLE D-MaxLines 10 D-MaxLines !
! 22: VARIABLE D-Bugline
! 23:
! 24: : WatcherInit
! 25: D-MaxLines @ 3 + YPos ! 0 D-Line ! ;
! 26:
! 27: : (lines)
! 28: 1 cells ^LineA +!
! 29: O-PNT@ ^LineA @ ! ;
! 30:
! 31: VARIABLE Body
! 32:
! 33: : ScanWord ( body -- )
! 34: dup body !
! 35: c-init
! 36: ScanMode c-pass !
! 37: C-Formated on 0 Level !
! 38: C-ClearLine on
! 39: Colors on
! 40: 0 XPos ! 0 YPos !
! 41: O-INIT
! 42: dup MakePass
! 43: DisplayMode c-pass !
! 44: c-stop off
! 45: D-LineIP 80 cells erase
! 46: 0 D-Lines ! dup D-LineIP !
! 47: O-PNT@ D-LineA ! D-LineA ^LineA !
! 48: ['] (lines) IS nlcount
! 49: XPos @ D-XPos c!
! 50: BEGIN analyse
! 51: D-Lines @ YPos @ <>
! 52: IF YPos @ D-Lines !
! 53: dup YPos @ cells D-LineIP + !
! 54: THEN
! 55: XPos @ over Body @ - 0 1 cells um/mod nip chars
! 56: D-XPos + c!
! 57: C-Stop @
! 58: UNTIL drop
! 59: O-PNT@ YPos @ 1+ cells D-LineA + !
! 60: -1 YPos @ 1+ cells D-LineIP + !
! 61: O-DEINIT
! 62: C-Formated off
! 63: 0 D-Line !
! 64: ['] noop IS nlcount ;
! 65:
! 66: : SearchLine ( addr -- n )
! 67: D-LineIP D-Lines @ 0
! 68: ?DO dup @ 2 pick U> IF 2drop I 1- UNLOOP EXIT THEN
! 69: cell+
! 70: LOOP 2drop 0 ;
! 71:
! 72: : Display ( n -- )
! 73: dup cells D-LineA + @ O-Buffer +
! 74: swap D-MaxLines @ + D-Lines @ min 1+
! 75: cells D-LineA + @ O-Buffer +
! 76: over - type ;
! 77:
! 78: \ [IFDEF] Green Colors on [THEN]
! 79: \ dup D-TableL + C@ dup Level ! dup XPos ! spaces 0 YPos !
! 80: \ D-LineIP + @ C-Stop off
! 81: \ BEGIN
! 82: \ [IFDEF] Green IP @ over =
! 83: \ IF hig# C-Highlight ! ELSE C-Highlight off THEN
! 84: \ [THEN]
! 85: \ Analyse
! 86: \ C-Stop @ YPos @ D-MaxLines @ u>= or
! 87: \ UNTIL drop ;
! 88:
! 89: : TopLine
! 90: 0 0 at-xy
! 91: Men# CT@ attr!
! 92: ." OSB-DEBUG (C) 1993 by Jens A. Wilke" cr cr
! 93: \ one step beyond
! 94: 0 CT@ attr! ;
! 95:
! 96: : BottomLine
! 97: 0 D-MaxLines @ 3 + at-xy
! 98: Men# CT@ attr!
! 99: ." U-nnest D-one N-est A-bort" cr
! 100: 0 CT@ attr! ;
! 101:
! 102: VARIABLE LastIP
! 103:
! 104: : (supress)
! 105: YPos @ D-MaxLines @ U>=
! 106: IF c-output off THEN ;
! 107:
! 108: : DispIP
! 109: ['] (supress) IS nlcount
! 110: dup SearchLine D-Line @ - dup YPos ! 2 +
! 111: over Body @ - 0 1 cells um/mod nip chars D-XPos + c@
! 112: swap AT-XY
! 113: Analyse drop
! 114: ['] noop IS nlcount
! 115: c-output on ;
! 116:
! 117: : Watcher ( -- )
! 118: TopLine
! 119: IP @ SearchLine dup D-Line @ dup D-MaxLines @ +
! 120: within
! 121: IF drop D-Line @ Display
! 122: ELSE D-MaxLines @ 2/ - 0 max dup D-Line !
! 123: Display
! 124: THEN
! 125: C-Formated off Colors on
! 126: \ LastIP @ ?DUP IF DispIP THEN
! 127: Hig# C-Highlight !
! 128: IP @ DispIP IP @ LastIP !
! 129: C-Formated on C-Highlight off
! 130: BottomLine ;
! 131:
! 132:
! 133: ' noop ALIAS \w immediate
! 134:
! 135: \ end formated debugger words
! 136:
! 137: [ELSE]
! 138: ' \ alias \w immediate
! 139:
! 140: : scanword ( body -- )
! 141: c-init C-Output off
! 142: ScanMode c-pass !
! 143: dup MakePass
! 144: 0 Level !
! 145: 0 XPos !
! 146: DisplayMode c-pass !
! 147: MakePass
! 148: C-Output on ;
! 149: [THEN]
! 150:
! 151: : .n 0 <# # # # # #S #> ctype bl cemit ;
! 152:
! 153: : d.s ." [ " depth . ." ] "
! 154: depth 4 min dup 0 ?DO dup i - pick .n LOOP drop ;
! 155:
! 156: : NoFine XPos off YPos off
! 157: NLFlag off Level off
! 158: C-Formated off
! 159: [IFDEF] Colors Colors off [THEN]
! 160: ;
! 161:
! 162: : disp-step
! 163: DisplayMode c-pass ! \ change to displaymode
! 164: \ Branches Off \ don't display
! 165: \ \ BEGIN and THEN
! 166: cr
! 167: \w YPos @ 1+ D-BugLine !
! 168: \w Watcher
! 169: c-stop off
! 170: \w 0 D-BugLine @ at-xy
! 171: Base @ hex IP @ 8 u.r space IP @ @ 8 u.r space
! 172: Base !
! 173: NoFine 10 XPos !
! 174: \w D-Bugline @ YPos !
! 175: ip @ DisplayMode c-pass ! Analyse drop
! 176: 25 XPos @ - 0 max spaces ." -> " ;
! 177:
! 178: : get-next ( -- n | n n )
! 179: DebugMode c-pass !
! 180: ip @ Analyse ;
! 181:
! 182: : jump ( addr -- )
! 183: r> drop \ discard last ip
! 184: >r ;
! 185:
! 186: AVARIABLE DebugLoop
! 187:
! 188: : breaker r> 1 cells - IP ! DebugLoop @ jump ;
! 189:
! 190: CREATE BP 0 , 0 ,
! 191: CREATE DT 0 , 0 ,
! 192:
! 193: : set-bp ( 0 n | 0 n n -- )
! 194: 0. BP 2!
! 195: ?dup IF dup BP ! dup @ DT !
! 196: ['] Breaker swap !
! 197: ?dup IF dup BP cell+ ! dup @ DT cell+ !
! 198: ['] Breaker swap ! drop THEN
! 199: THEN ;
! 200:
! 201: : restore-bp ( -- )
! 202: BP @ ?dup IF DT @ swap ! THEN
! 203: BP cell+ @ ?dup IF DT cell+ @ swap ! THEN ;
! 204:
! 205: VARIABLE Body
! 206:
! 207: : NestXT ( xt -- true | body false )
! 208: DebugMode c-pass ! C-Output off
! 209: xtc C-Output on
! 210: c-pass @ DebugMode = dup
! 211: IF ." Cannot debug" cr
! 212: THEN ;
! 213:
! 214: VARIABLE Nesting
! 215:
! 216: : Leave-D
! 217: [IFDEF] Colors Colors on [THEN]
! 218: C-Formated on
! 219: C-Output on ;
! 220:
! 221: VARIABLE Unnest
! 222:
! 223: : D-KEY ( -- flag )
! 224: BEGIN
! 225: Unnest @ IF 0 ELSE key THEN
! 226: CASE [char] n OF IP @ @ NestXT EXIT ENDOF
! 227: [char] s OF Leave-D
! 228: -128 THROW ENDOF
! 229: [char] a OF Leave-D
! 230: -128 THROW ENDOF
! 231: [char] d OF Leave-D
! 232: cr ." Done..." cr
! 233: Nesting off
! 234: r> drop IP @ >r
! 235: EXIT ENDOF
! 236: [char] ? OF cr ." Nest Stop Done Unnest" cr
! 237: ENDOF
! 238: [char] u OF Unnest on true EXIT ENDOF
! 239: drop true EXIT
! 240: ENDCASE
! 241: AGAIN ;
! 242:
! 243: : (debug) ( body -- )
! 244: 0 Nesting !
! 245: BEGIN Unnest off
! 246: cr ." Scanning code..." cr C-Formated on
! 247: dup scanword IP !
! 248: cr ." Nesting debugger ready!" cr
! 249: \w WatcherInit 0 CT@ attr! page
! 250: BEGIN disp-step D-Key
! 251: WHILE C-Stop @ 0=
! 252: WHILE 0 get-next set-bp
! 253: IP @ jump
! 254: [ here DebugLoop ! ]
! 255: restore-bp
! 256: d.s
! 257: REPEAT
! 258: Nesting @ 0= ?EXIT
! 259: -1 Nesting +! r>
! 260: ELSE
! 261: IP @ >r 1 Nesting +!
! 262: THEN
! 263: AGAIN ;
! 264:
! 265: : dbg ' NestXT ?EXIT (debug) ;
! 266:
! 267: : test 1 2 4 swap dup . ;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>