石原 博の覚書

電子工作に関する日々の覚書を記載します

F83のデバッガとその注意点

2021-09-19 11:11:44 | 日記


F83には非常に単純なデバッガがある。

・使用方法
  debug ワード としてデバッグするワードを指定すると、以降ワードを実行するとスタックの内容を表示して入力待ちになる
 例
  : fact dup 0= if drop 1 else dup 1- recurse * then ;  ok
    debug fact  ok
  3 fact       3 
  DUP          --> (入力待ち)

   入力待ち状態で、
  ・スペースあるいは改行で次へ
  ・Q デバッグ終了
  ・F Forthの実行が可能
     デバッガへの戻りは resume
  ・C ステップモード(入力待ちあり)からトレースモード(スタックを印字するが入力待ちしない)へ移行し実行を続行

  DUP              3       3  
  0=               3       0  
  ?BRANCH          3      
  DUP              3       3  
  1-               3       2  
  FACT             3       2  
  DUP              3       2       2 
  .......

 デバッグ終了は
  unbug

・注意点1
  Cで戻るとトレースモードになるが、その後ステップモードに戻る方法がない

  強制的に戻すには  変数 slow に 0 を代入することが必要。(slow は vocabulary bugに定義されている)
    : stepping 0 [ bug ] slow ! ; とか : tracing -1 [ bug ] slow ! ; とか定義して置くのが良いかも


・注意点2
    内部的なことだが、debugワードでは不審な点がある。
    その1
   : DEBUG (S -- )
        ' 2- DUP [ BUG ] 'UNNEST (DEBUG) ;
 
     ここで「2-」しているは、CFA->PFAなので「2+」ではないだろうか?

  その2
      : 'UNNEST (S Pfa -- Pfa' )
        BEGIN 1+ DUP @ ['] UNNEST = UNTIL ;

      ここで「1+」しているが、ワード中のUNNESTを探している訳なので「2+」ではないだろうか?

・注意点3
    デバッグはアドレス範囲で指定されているため、forgetしてワードを消しても残る。

・注意点4
   debug は簡易なので以下のようなことが起きる。

      ' unnest . 361  ok  なので、

   : test 1 . 2 . 361 . 3 . 4 . ;  ok
   test 1 2 361 3 4  ok
   debug test  ok
   test       2       0 
   1            -->       2       0       1 
   .            --> 1       2       0 
   2            -->       2       0       2 
   .            --> 2       2       0 
   (LIT)        --> 361 3 4  ok

   リテラルの361をunnestと判断して範囲が設定されるため、そこで終わってしまう。

 



最新の画像もっと見る

コメントを投稿