石原 博の覚書

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

FORTHでマルチタスク

2021-09-26 14:33:19 | 日記

CP/Mには割り込みがないが、F83でもマルチタスクが可能(cooperative型)。しかし色々調べてみたが有効な利用方法が見つからない。画面の一部に時計を出そうと思ってもCP/Mには時計はないし、プリンタをつないでいるわけでもないのでプリンタスプーラ的なことも出来ない。せいぜいバックグラウンドでカウントアップさせるタスクを動かして、定期的に見ることぐらいでしか確認出来ない。
これでは面白くないので、Arduino+FlashForthでLチカなるものでマルチタスクを試してみた。(FlashForthはAVRやPICで使えるらしい)

ハードウエアは Arduino pro mini 5V 16MHz。書き込みはUSBASP+avrdude。

ff5.0.zipをダウンロードして展開すると、hexファイルがあるので328-16MHz-38400.hexを使用した。(アセンブルからしても良いのだけどAVRStudioとか必要そうなので後回し)

通常どおり、Vcc, GND, MISO, MOSI, SCK, RSTを接続してEPROMへ書き込み。

$ avrdude -c usbasp -p m328p -U flash:w:328-16MHz-38400.hex 

avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: reading input file "328-16MHz-38400.hex"
avrdude: input file 328-16MHz-38400.hex auto detected as Intel Hex
avrdude: writing flash (32608 bytes):

Writing | ################################################## | 100% 4.30s

avrdude: 32608 bytes of flash written
avrdude: verifying flash memory against 328-16MHz-38400.hex:
avrdude: load data flash data from input file 328-16MHz-38400.hex:
avrdude: input file 328-16MHz-38400.hex auto detected as Intel Hex
avrdude: input file 328-16MHz-38400.hex contains 32608 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 2.43s

avrdude: verifying ...
avrdude: 32608 bytes of flash verified

avrdude: safemode: Fuses OK (E:FD, H:DA, L:FF)

avrdude done.  Thank you.


後はputty等でシリアルに接続してOK

注意点
 ANS に準拠しているらしいが、FlashFothはF83とはいろいろ違う。
 ・F83のようなITC(Indirect Threaded Code)やDTC(Direct Threaded Code)ではなくSTC(Subroutine Threded Code)
 ・forgetがない。marker を使う。
 ・do loopがない。for next を使う。
 ・F83で便利に使っていた see がない。
 ・組み込みなのでファイルシステムがない。エディタもないしloadも出来ない。
 ・定義したワードはepromに書かれるので電源を切っても保存される。
 ・最小限のワードだけ定義されており、必要に応じて同梱されている定義、do loop(doloop.fs)とか、アセンブラ(asm.fs, asm2.fs)とか、see(see.fs, see2.fs)とか、マルチタスク(task.fs)とか。
 ・母艦のエディタでプログラムを作成し、putty等で貼り付ければ良いと考えたが、puttyのShift-INSでは書き込みが速すぎて文字の取りこぼしが出る。->同梱されている ff-shell.tclやff-shell.pyを使用する必要がある(linux)

マルチタスクの例
FlashForth Shellからtask.fs をsendしてから以下を入力

-------------
marker -test

$23 constant PINB
$24 constant DDRB
$20 constant PORT5

PORT5 DDRB c!
: ledOnOff 10 for PORT5 PINB c! 1000 ms next ;

0 20 20 0 task: led_flash
: start ['] ledOnOff led_flash tinit led_flash run  ;
--------------

マルチタスクでAruduino Pro miniのLEDが点滅することが確認出来た。


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と判断して範囲が設定されるため、そこで終わってしまう。

 


Tarbell Basic

2021-09-05 10:04:24 | 日記

CP/Mが動くハードが何種類も出来たが、それだけでは面白くない。

有り難いことに、インターネット上に様々なソフトがある。そこでいくつかダウンロードして動かしてみた。

Tarbell BASIC
CPMUG031 TBASICA4〜6.ASM
CPMUG032 TBASICA1〜3.ASM, TBASICIO.ASM, RTMASM.COM 

TBASICは7つのソースTBASIC1〜6.ASMおよびTBASICIO.ASMから作成出来る。ただしTBASIC1〜6.ASMをアセンブルするために、RTMASM.COMが必要となる(RTMASM.DOC参照)
またTBASICIOは通常どおりASMでアセンブルし、最終DDTを使用し結合する。

注意点
 RTMASM.COMの仕様が良くわからないが、CPMUG032をAドライブ、CPMUG031をBドライブとする必要がある。最初別のドライブでアセンブルしようとして、
} AS TBASICA1
TRIED TO OPEN NONEXISTENT FILE
というエラーとなった。明示的にドライブを指定すれば良いのかもしれないが未確認。

A>dir
A: CATALOG  32  : READ     ME  : RTMASM   COM : RTMASM   DOC
A: TBASICA1 ASM : TBASICA2 ASM : TBASICA3 ASM : TBASICIO ASM
A: UGFORM      
A>B:
B>dir
B: CATALOG  31  : TBASIC   1   : TBASIC   10  : TBASIC   11 
B: TBASIC   12  : TBASIC   13  : TBASIC   14  : TBASIC   15 
B: TBASIC   2   : TBASIC   3   : TBASIC   4   : TBASIC   5  
B: TBASIC   6   : TBASIC   7   : TBASIC   8   : TBASIC   9  
B: TBASIC   A   : TBASIC   AD  : TBASIC   B1  : TBASIC   B2 
B: TBASIC   C   : TBASIC   COM : TBASIC   CPM : TBASIC   D1 
B: TBASIC   D2  : TBASIC   E   : TBASIC   H   : TBASIC   HEX
B: TBASIC   I   : TBASIC   IND : TBASIC   J   : TBASIC   K  
B: TBASIC   SYM : TBASIC   TOC : TBASICA4 ASM : TBASICA5 ASM
B: TBASICA6 ASM
B>A:
A>rtmasm

********************* ASSEMBLER ******************
<<<<<<<<<<<<<<<<<<<<<<<< RTM >>>>>>>>>>>>>>>>>>>>>
BY TOM DILATUSH
JUNE 1978

} LN

} LE

} SY TBASIC

} HX TBASIC

} AS TBASICA1
END OF ASSEMBLY TABLE USEDBLE
} QT

[[[[[[[[   ASSEMBLER LOSING CONTROL   ]]]]]]]]
RunCPM Version 5.3 (CP/M 2.2 60K)

A>


A>asm TBASICIO
CP/M ASSEMBLER - VER 2.0
04D1
004H USE FACTOR
END OF ASSEMBLY

RunCPM Version 5.3 (CP/M 2.2 60K)

A>DDT  
DDT VERS 1.4
-ITBASICIO.HEX
-R
NEXT  PC
0451 0000
-ITBASIC.HEX
-R
NEXT  PC
53C5 53BC
-^C
RunCPM Version 5.3 (CP/M 2.2 60K)

0x53は10進では83なので

A>save 83 TBASIC.COM
A>TBASIC


TARBELL CASSETTE BASIC
BY REAL TIME MICROSYSTEMS, CHULA VISTA, CA
FOR TARBELL ELECTRONICS, CARSON, CA
RELEASE 5.2  AUGUST 16, 1978

>:

:10 FOR A=0 TO 10
:20   PRINT A
:30 NEXT A
:
>LIST
10 FOR A=0 TO 10
20 PRINT A
30 NEXT A

>RUN
 0 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 

行番号は不要なのでこんなことも出来る。

>NEW

>:

:FOR A=0 TO 10
:PRINT A
:NEXT A
:
>RUN
 0 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 

>


感想
サイズは21KBと非常に大きいが、TinyBasic等とかなり異なる
・通常のBASICと違い行番号はない。GOTO等の飛び先は文字列となる。番号もラベルとして扱われる。
・行番号を使わないためエディタはラインエディタ
・起動直後はDirectモードとなり、コマンド実行可能
・: または 「ENTER」 で Entryモードとなり、プログラムの入力が可能となる。:ラベル、ENTER ラベルで、ラベル行の前に入力。空行入力でDirectモードになる
・EDIT ラベル で ラベルを編集するEdit モード QでDirectモードとなる
ネット上に Tarbell_BASIC_Oct78.pdf等のマニュアルがある。色々できそうだが難しい。

DISKへの保存
どうもユーザ定義PGを使い保存するようだが、難しくて今のところ良くわからない。
------------------
?USR(LOC("ファイル名"))   ------ファイルのopen
CSAVE A                   ------保存
?USR(0)                   ------ファイルのclose