2020.7.10
前へ
次へ
ホームページトップへ戻る

[新連載]復活!TINY BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
すべてはここからはじまりました。
中日電工も。
40年前を振り返りつつ新連載です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜



[第35回]


●中日電工版TINY BASIC(3)先頭のジャンプテーブル

「中日電工版」TINY BASICは「オリジナル版」のTINY BASICをできるだけ変更しないでもとのままのプログラムにすることで「オリジナル版」と対比し易いように考えてあります。
原則としてはそのように考えているのですが、前回お見せしました通り「中日電工版」TINY BASICは先頭にコマンド処理ルーチンへのジャンプテーブルを置いています。
そこは「オリジナル版」と大きく異なっているところです。
勿論ここも「オリジナル版」の通りにできないことはないのですが、それをあえて変更したのはプログラム作成(および今後のプログラム変更)作業の効率化を考えてのことです。

TINY BASICの命令解読の仕組みについては[第19回][第22回]で説明をしました。
たとえば「LIST」「RUN」「NEW」については[第19回]で下のコマンドテーブルをお見せしました。



そして以下のように説明をしました。

’LIST’ ’RUN’ ’NEW’ の文字列があって、各文字列に続いてその命令の処理を行なうプログラムの先頭アドレスが書かれています。
アドレスは通常のメモリ内の配置とは逆に上位バイト、下位バイトの順に置かれています。
さらにその上位バイトは最上位ビットが’1’に置き換えられています。
たとえば’LIST’の処理プログラムの先頭アドレスは016Fなのですがその上位バイト01を81に置き換えています。

その部分については、「中日電工版」のTINY BASICはRAMアドレスの8000にロードしますからアドレスの上位ビットを加工しなくてもそのままで最上位ビットは1になっています。
それはそれとして、わざわざプログラムの先頭にジャンプテーブルを置いたのは別の理由があってのことです。
「オリジナル版」ではたとえばプログラムの一部を書き換えた場合、その変更した場所によっては上のテーブルの2バイトのアドレスが変わってしまいます。
これがたとえばJMP LISTなどのようにジャンプ先をラベルで指定していた場合にはアセンブラが自動的にアドレスを算出してオブジェクトプログラムのアドレス部分を書き換えてくれますから、そのようなことを気にする必要はありません。
しかし上のテーブルデータのようにアドレス部分を「固定データ」としてDBで定義している場合には(さらにそのビットを加工している場合にはなおさら)アセンブラではそこまでの自動変更はしてくれません。

「中日電工版」のように先頭にジャンプテーブルを集めてしまえば、「LIST」は8003、「RUN」は8006、「NEW」は8009でこのジャンプテーブルそのものの並び順を変更したりしない限りは、途中のプログラムを変更したりしても命令解読部分のテーブルアドレスは変わりません。

2020/6/6  9:  tinybst7.txt
END=9FDE
              ;;;TINY BASIC from PALO ALTO
              ;20/3/3 5/8 5/9 5/10 5/11 5/12 5/13 5/28
              ;6/6
              ;
                ;SOUT=$067C;5/10
                SOUT=$10AB
                ;SIN=$06A3
                SIN=$10AE
                REENT=$1033
              ;
                ORG $8000
8000 C35D80     JMP START
8003 C3D681     JMP LIST
8006 C3A681     JMP RUN
8009 C39781     JMP NEW
800C C3D682     JMP NEXT
800F C3B683     JMP LET
8012 C33B83     JMP IFF;"IF"
8015 C3C581     JMP GOTO
8018 C33482     JMP GOSUB
801B C35682     JMP RETURN
801E C33783     JMP REM
8021 C37182     JMP FOR
8024 C35683     JMP INPUT
8027 C3EE81     JMP PRINT
802A C3A081     JMP STOP
802D C3B083     JMP DEFLT
8030 C3E884     JMP RND
8033 C31585     JMP ABS
8036 C31E85     JMP SIZE
8039 C3C684     JMP XP40
803C C38182     JMP FR1;"TO"
803F C39985     JMP QWHAT;"WHAT"
8042 C38D82     JMP FR2;"STEP"
8045 C39382     JMP FR3
8048 C3CA83     JMP XP11;">="
804B C3D083     JMP XP12;"#"
804E C3D683     JMP XP13;">"
8051 C3E583     JMP XP15;"="
8054 C3DD83     JMP XP14;"<="
8057 C3EB83     JMP XP16;"<"
805A C3F183     JMP XP17
              ; 


下は今回の最初のところでお見せした「オリジナル版」に対応する部分の「中日電工版」のプログラムリストです。

879C 0D       TAB1-1:DB 0D
879D 4C495354   "LIST";TAB1
87A1 80         DB 80
87A2 03         DB 03
87A3 52554E     "RUN"
87A6 80         DB 80
87A7 06         DB 06
87A8 4E4557     "NEW"
87AB 80         DB 80
87AC 09       TAB2-1:DB 09 


ジャンプテーブルを先頭に集めて並べたため、上記以外の命令のテーブル部分のアドレスもほとんど機械的に書き込んで作成することができましたし、今後想定されるプログラム変更によってもそれに伴って命令のテーブル部分のアドレスを変更する必要はありません。
できるだけ「オリジナル版」に忠実にしたいと考える中であえて「オリジナル版」と大きく異なる変更を行なった理由はそこにあります。

復活!TINY BASIC[第35回]
2020.7.10upload

前へ
次へ
ホームページトップへ戻る