VX-7のクローンデータをパソコンに取り込むことに成功したので、今度はそのデータを解析することにした。
方法と言っても、実は極めて原始的なもので、要するにVX-7に何か操作を加えるたびにクローンデータを取得し、そのファイルを逐次比較するだけである。
VX-7の操作の前後でクローンデータに変化があれば、それは、その操作によって変更されたものと考えられるから、これを繰り返すことによって、クローンデータの全貌が解明できるはずである。
前回の実験で作成した"SAVEVX7.BAS"は、VX-1でのメモリデータ読み出し/書き込み実験で使用したプログラムを流用したものである。したがって、ごく簡単な定数の変更で他機種のクローンデータ取得に流用できるが、逆にVX-7特有のクローンデータ授受のプロトコルには対応していない。そのため、"受け側"のVX-7から返される応答信号(06H)を人間がキーボードから入力してやる必要がある。これは結構メンドウくさい。しかも、VX-7のクローンデータ解析のためには、イヤになる程、メモリ内容SAVEの操作を繰り返すことになる。
そこで、"SAVEVX7.BAS"をバージョンアップし、VX-7特有の応答信号を自動的に送信して、ノータッチでVX-7のクローンデータをパソコンに取り込むプログラム"SAVEVX7C.BAS"を作成した。
10000 '********************************************************** 10010 ' 10020 'VERTEX STANDARD VX-7 10030 'クローンデータ読み出しプログラム Ver3.00 (Sep 29 2002) 10040 ' 10050 'Copyright by Heian Software Engineering 10060 '(C)2002 H.S.E. Allrights reserved. 10070 ' 10080 '********************************************************** 10090 ' 10100 *START 10110 CLEAR 10120 DEFINT A-Z 10130 WIDTH 80,25:CONSOLE 0,25,1,1:COLOR 7,0,0,7,2:CLS 2 10140 ' 10150 KEY 2,"system"+CHR$(&HD) 10160 ' 10170 COMPORT.NAME$="COM1:N81NN":'通信ポートファイルディスクリプタ 10180 COMPORT.SPEED=8:'通信速度 8:19200,0:SPEEDコマンドによる 10190 ' 10200 RXD.MAX=&H3FFF 10210 ACK=&H6 10220 ' 10230 VERSION$="SAVEVX7A.BAS VER 3.00" 10240 GOTO *MAIN 10250 ' 10260 'HEX.CHR$ 10270 *READ.HEX.CHR 10280 DIM HEX.CHR$(255) 10290 RESTORE *READ.HEX.CHR 10300 FOR READ.HEX.CHR.W=0 TO 255:READ HEX.CHR$(READ.HEX.CHR.W):NEXT 10310 DATA 00,01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F 10320 DATA 10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F 10330 DATA 20,21,22,23,24,25,26,27,28,29,2A,2B,2C,2D,2E,2F 10340 DATA 30,31,32,33,34,35,36,37,38,39,3A,3B,3C,3D,3E,3F 10350 DATA 40,41,42,43,44,45,46,47,48,49,4A,4B,4C,4D,4E,4F 10360 DATA 50,51,52,53,54,55,56,57,58,59,5A,5B,5C,5D,5E,5F 10370 DATA 60,61,62,63,64,65,66,67,68,69,6A,6B,6C,6D,6E,6F 10380 DATA 70,71,72,73,74,75,76,77,78,79,7A,7B,7C,7D,7E,7F 10390 DATA 80,81,82,83,84,85,86,87,88,89,8A,8B,8C,8D,8E,8F 10400 DATA 90,91,92,93,94,95,96,97,98,99,9A,9B,9C,9D,9E,9F 10410 DATA A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF 10420 DATA B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,BA,BB,BC,BD,BE,BF 10430 DATA C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,CA,CB,CC,CD,CE,CF 10440 DATA D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,DA,DB,DC,DD,DE,DF 10450 DATA E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,EA,EB,EC,ED,EE,EF 10460 DATA F0,F1,F2,F3,F4,F5,F6,F7,F8,F9,FA,FB,FC,FD,FE,FF 10470 RETURN 10480 ' 10490 *READ.ERROR.MES 10500 DIM ERROR.MES$(100) 10510 RESTORE *READ.ERROR.MES 10520 *READ.ERROR.MES.1000 10530 READ ERROR.MES.W 10540 IF ERROR.MES.W<0 THEN RETURN 10550 READ ERROR.MES$(ERROR.MES.W) 10560 GOTO *READ.ERROR.MES.1000 10570 DATA 0,"--- 正常終了(000) ---" 10580 DATA 1,"*** 受信データが多すぎます。(001) ***" 10590 DATA 2,"*** ブロック受信に失敗しました。(002) ***" 10600 DATA 3,"*** 強制中断(003) ***" 10610 DATA 4,"*** チェックサムが一致しません。(004) ***" 10620 DATA 5,"*** ブロック受信に失敗しました。(005) ***" 10630 DATA -1,"" 10640 ' 10650 ' 10660 *COMPORT.INIT 10670 OPEN COMPORT.NAME$ AS #1 10680 IF COMPORT.SPEED=0 THEN GOTO *COMPORT.INIT.1000 10690 OUT &H75,COMPORT.SPEED MOD 256 10700 OUT &H75,COMPORT.SPEED \ 256 10710 *COMPORT.INIT.1000 10720 RXD.NX=0 10730 RXD.IHBT=0 10740 DIM RXD(RXD.MAX) 10750 ON COM GOSUB *COMPORT.INT 10760 RETURN 10770 ' 10780 *COMPORT.INT 10790 *COMPORT.INT.1000 10800 IF LOC(1)=0 THEN ERROR.CX=0:RETURN 10810 IF RXD.NX>&H3F52 THEN ERROR.CX=1:RETURN 10820 COMPORT.INT.W=ASC(INPUT$(1,1)) 10830 IF RXD.IHBT<>0 THEN IF COMPORT.INT.W=ACK THEN RXD.IHBT=0:ERROR.CX=0:RETURN ELSE RXD.IHBT=0:ERROR.CX=5:RETURN 10840 RXD(RXD.NX)=COMPORT.INT.W 10850 RXD.NX=RXD.NX+1 10860 GOTO *COMPORT.INT 10870 ' 10880 ' 10890 *STOP.INT 10900 ERROR.C=3 10910 *FINISH 10920 IF ERROR.C<>0 THEN COLOR 2:BEEP 10930 PRINT 10940 PRINT ERROR.MES$(ERROR.C):PRINT 10950 COM OFF 10960 CLOSE 10970 COLOR 7 10980 END 10990 ' 11000 ' 11010 *MAIN 11020 ON STOP GOSUB *STOP.INT 11030 STOP ON 11040 GOSUB *READ.ERROR.MES 11050 GOSUB *READ.HEX.CHR 11060 INPUT "出力(ログ)ファイル名:",OUT.FILE.NAME$ 11070 LINE INPUT "コメント:",RMKS$ 11080 PRINT 11090 PRINT "[MON]を押しながらVX−7の電源を入れてください。":PRINT 11100 PRINT "VX−7のLCDに”CLONE”と表示されたら、パソコンのスペースバーを押してください。":PRINT 11110 *MAIN.0100 11120 IF INKEY$<>"" THEN GOTO *MAIN.0100 11130 *MAIN.0150 11140 IF INKEY$<>" " THEN GOTO *MAIN.0150 11150 GOSUB *COMPORT.INIT 11160 COM ON 11170 PRINT "VX−7の[BAND]キーを押してください。":PRINT 11180 ' 11190 *MAIN.1000 11200 PRINT.N=0 11210 PRINT:PRINT "第1ブロック受信":PRINT 11220 *MAIN.1010 11230 IF ERROR.CX<>0 THEN ERROR.C=ERROR.CX:GOTO *FINISH 11240 RXD.N=RXD.NX 11250 IF PRINT.N<RXD.N THEN PRINT HEX.CHR$(RXD.N \ 256)+HEX.CHR$(RXD.N MOD 256):PRINT.N=RXD.N 11260 IF RXD.N<&HA THEN GOTO *MAIN.1010 11270 IF RXD.N>&HA THEN ERROR.C=2:GOTO *FINISH 11280 RXD.IHBT=-1:PRINT #1,CHR$(ACK); 11290 ' 11300 *MAIN.2000 11310 PRINT:PRINT "第2ブロック受信":PRINT 11320 *MAIN.2010 11330 IF ERROR.CX<>0 THEN ERROR.C=ERROR.CX:GOTO *FINISH 11340 RXD.N=RXD.NX 11350 IF PRINT.N<RXD.N THEN PRINT HEX.CHR$(RXD.N \ 256)+HEX.CHR$(RXD.N MOD 256):PRINT.N=RXD.N 11360 IF RXD.N<&H12 THEN GOTO *MAIN.2010 11370 IF RXD.N>&H12 THEN ERROR.C=2:GOTO *FINISH 11380 RXD.IHBT=-1:PRINT #1,CHR$(ACK); 11390 ' 11400 *MAIN.3000 11410 PRINT:PRINT "第3ブロック受信":PRINT 11420 *MAIN.3010 11430 IF ERROR.CX<>0 THEN ERROR.C=ERROR.CX:GOTO *FINISH 11440 RXD.N=RXD.NX 11450 IF PRINT.N<RXD.N THEN PRINT HEX.CHR$(RXD.N \ 256)+HEX.CHR$(RXD.N MOD 256):PRINT.N=RXD.N 11460 IF RXD.N<&H3F52 THEN GOTO *MAIN.3010 11470 IF RXD.N>&H3F52 THEN ERROR.C=2:GOTO *FINISH 11480 ' 11490 *MAIN.4000 11500 PRINT:PRINT "チェックサムを検証しています。":PRINT 11510 MAIN.W.SUM=0:MAIN.W=0 11520 FOR MAIN.W=0 TO &H3F51 11530 MAIN.W.SUM=(MAIN.W.SUM+RXD(MAIN.W)) MOD 256 11540 IF MAIN.W MOD 100=0 THEN PRINT "*"; 11550 NEXT 11560 PRINT 11570 IF RXD(&H3F52)<>MAIN.W.SUM THEN ERROR.C=4:GOTO *FINISH 11580 IF ERROR.CX<>0 THEN ERROR.C=ERROR.CX:GOTO *FINISH 11590 PRINT:PRINT "チェックサムが一致しました。":PRINT 11600 ' 11610 COM OFF 11620 CLOSE 1 11630 ' 11640 *MAIN.5000 11650 OPEN OUT.FILE.NAME$ FOR OUTPUT AS #1 11660 PRINT "データファイルを作成します。":PRINT 11670 PRINT #1,"' "+VERSION$ 11680 PRINT #1,"' "+DATE$+" "+TIME$ 11690 PRINT #1,"' "+RMKS$ 11700 FOR MAIN.W=0 TO &H3F52 11710 PRINT #1,HEX.CHR$(MAIN.W \ 256)+HEX.CHR$(MAIN.W MOD 256)+" : "+HEX.CHR$(RXD(MAIN.W)) 11720 NEXT 11730 ERROR.C=0:GOTO *FINISH |
このプログラム使った場合のVX-7のメモリデータのSAVE方法はつぎのとおりである。
1) VX-7と自作インターフェース、パソコンを接続する。 2) パソコンの電源を入れ、MS-DOSを起動する。 3) N88-BASIC(86)を起動し、プログラムをLOAD、更にRUNする。 4) "出力(ログ)ファイル名:"の入力を促されるので、適当なファイル名を入力する。 5) "コメント:"の入力を促されるので、必要があればコメントを入力する。このコメントは、出力ファイルの中に記録されるだけで、他に意味はない。 6) VX-7の操作等が示されるので、指示通りに操作する。 7) "--- 正常終了(000) ---"が表示されれば、OK。 |
ここに示したプログラムは、PC-9800シリーズ用のN88-BASIC(86)(MS-DOS版)で書かれたものなので、一般のWindowsマシンでは動かない。また、自作インターフェースがないと動作させることはできない。私のPC-9821Xa12(Pentium 120MHz)とVX-7(Serial No 2G020469)、自作インターフェースで動作確認を行っているが、他の環境で動作可能か否かは未確認である。
例によって、行:10690と10700で8253(相当)を直接コントロールする暴挙に出ているので、いわゆる"8MHz系"の9801/9821では使えない。また、システムがハングアップする可能性もある。また、あくまでも実験用なので、エラー処理などは大幅に省略している。
"SAVEVX7C.BAS"で生成されるファイルは、純粋に"送り側"のVX-7が送出したデータだけである。("SAVEVX7.BAS"で生成されるファイルには、"受け側"から返される応答信号(06H)が2つ記録されている。)
"LOADVX7.BAS"は、"SAVEVX7.BAS"で生成されるファイルをもとにVX-7にデータを書き込むプログラムであるから、"SAVEVX7C.BAS"で生成されるファイルは書き込むことができない。
筆者は、ここに示したプログラムの著作権を放棄するものではないが、営利を目的としない限り、誰でも自由に利用・改変してよい。WindowsやMacOSに移植する試みは大歓迎であり、ドンドンやっていただきたい。(事後にいいので、私まで連絡をいただけるとありがたい!) ただし、このプログラムを使用した結果、パソコンやVX-7に不可逆的な変化(=故障など)が生じても、筆者は一切責任を負わないので、あらかじめ了解願いたい。
プログラムの使用条件、ダウンロード等は、こちらにどうぞ。
現在までに判明したVX-7のクローンデータの構成のうち、メモリに関するものを示す。なお、[ ]内は、クローンデンータ先頭からのオフセット(16進表現)である。他にホームメモリが11チャネルぶん存在するが、今回の実験では、一応、対象外とする。
メモリデータ本体は、1レコードあたり22byte(固定長)で構成されている。
一般周波数メモリ(001〜450):450レコード、ワンタッチメモリ(OTM1〜OTM0):10レコード、プログラマブルメモリスキャン用メモリ(L01・U01〜L20・U20):20組40レコード、全部あわせて500レコードである。メモリ容量にすると11,000byteであり、VX-7のクローンデータの実に2/3を占めていることになる。
それぞれのレコードの先頭オフセットは、次のとおり。
1.一般周波数メモリ M001 : [1322] - [1337] (省略) M447 : [3976] - [398B] 2.ワンタッチメモリ OTM1 : [39CE] - [39E3] 3.プログラマブルメモリスキャン用メモリ PMS_L01 : [3AAA] - [3ABF] (省略) PMS_U18 : [3DAC] - [3DC1] |
私が解析に使用したのは、国内仕様("Jマークつき)の"VX-7"であるが、米国仕様にしか存在しないはずの220MHz帯ホームメモリ(と思われる)領域が準備されていることは興味深い。
ホームメモリを除いて、この領域は、VX-7の全リセット([BAND] + [V/M] + [4] を押しながら電源on)を行っても初期化されないようなので、注意を要する。
1つのメモリレコードは22byteであり、下表のようなフィールド構成となっている。
OFFSET (レコード先頭から) |
意 味 | 備 考 |
+0 | (不明) | 現在のところ、不明。 ただし、HALF DEVの場合は、bit1が"1"になる模様。 |
+1 | 出力・ステップ等 | |
+2 | 周波数100MHz・10MHz | |
+3 | 周波数1MHz・100KHz | |
+4 | 周波数10KHz・1KHz | |
+5 | モード | bit7-2については、現在のところ、不明。(つねに"001100XX"??) |
+6 | メモリータグ1文字目 | |
+7 | メモリータグ2文字目 | |
+8 | メモリータグ3文字目 | |
+9 | メモリータグ4文字目 | |
+10 | メモリータグ5文字目 | |
+11 | メモリータグ6文字目 | |
+12 | メモリータグ7文字目 | |
+13 | メモリータグ8文字目 | |
+14 | (不明) | 現在のところ、不明。(つねに00H??) |
+15 | 送信周波数100MHz・10MHz | |
+16 | 送信周波数1MHz・100KHz | |
+17 | 送信周波数10KHz・1KHz | |
+18 | トーン周波数 | 0〜49 |
+19 | DCSコード | 0〜103 |
+20 | トーンスケルチ/DCS | bit7-2については、現在のところ、不明。 |
+21 | メモリータグキャラクタセット |
メモリの周波数情報は、レコード先頭からのオフセット+2〜4と+15〜17に格納されている。
オフセット+2〜4は主となる周波数、つまり、メモリ周波数そのものである。100MHzから1KHzまで10進表現で6桁をBCD表現で3byteに納めている。12.5KHzステップの場合、0.5KHzの端数が出るが、これは記憶されていない。
オフセット+15〜17は副となる周波数である。通常は、デュプレクス運用の際のオフセット周波数が格納されているが、送受信別々の周波数を記憶させた場合は、送信周波数そのものが格納されるようである。
レコード先頭からのオフセット+2のbit 7-6で表現される。
00XXXXXX:L1 01XXXXXX:L2 10XXXXXX:L3 11XXXXXX:Hi |
レコード先頭からのオフセット+2のbit 5-4で表現される。+DUP及び-DUPの場合は、オフセット+15〜17で示される周波数は、送受信周波数間隔である。送受信周波数を別々に記憶させた場合(TXRX)は、オフセット+15〜17で示される周波数は、送信周波数である。
XX00XXXX:SIMP XX01XXXX:-DUP XX10XXXX:+DUP XX11XXXX:TXRX |
レコード先頭からのオフセット+2のbit 3-0で表現される。
XXXX0000:5KHz XXXX0001:10KHz XXXX0010:12.5KHz XXXX0011:15KHz XXXX0100:20KHz XXXX0101:25KHz XXXX0110:50KHz XXXX0111:100KHz XXXX1000:9KHz |
レコード先頭からのオフセット+5のbit 1-0で表現される。
XXXXXX00:N-FM XXXXXX01:AM XXXXXX10:W-FM XXXXXX11:(不明) |
レコード先頭からのオフセット+20の上位2bitで表現される。
XXXXXX00:トーンスケルチ/DCSなし XXXXXX01:トーンエンコーダのみ XXXXXX10:トーンスケルチ XXXXXX11:DCS |
レコード先頭からのオフセット+18に格納されている。
00H : 67.0Hz (省略) 2EH : 233.6Hz |
レコード先頭からのオフセット+19に格納されている。
00H : 023 (省略) 64H : 732 |
メモリータグの情報は、オフセット+6〜+13までと+21に納められている。
オフセット+6〜+13は、文字コードそのものである。文字列の長さを示す情報はなく、7文字以下のタグをつけた場合、末尾はスペース(0AH)で埋められる。
VX-7のキャラクタセットは2種類あり、いずれを使っているかはオフセット+21に格納された1byteで示される。オフセット+21の第
n bitが"0"の場合、メモリータグの n+1 文字目はキャラクタセット0を使っていることを示す。"1"の場合は、キャラクタセット1である。
キャラクタセット0 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 注 SP:スペース 以下は、JISにない(と判断せざるを得ない)キャラクタ |
たとえば、『奈良レピ−タ』というメモリータグは、内部ではつぎのように表現されている。
OFFSET | +6 | +7 | +8 | +9 | +10 | +11 | +12 | +13 | +21 |
DATA | C3H | F4H | F7H | 11H | 4EH | DDH | 0AH | 0AH | 0BH (00001011) |
奈 | 良 | レ | ピ | − | タ | (空白) | (空白) | 1,2,4文字目がキャラクタセット1 (赤字) (bit0,1,3が1) |
"もっとたくさんの漢字を使えないか..."というのは、VX-7ユーザー共通の感想であろうが、メモリータグの構造を見る限り、ファームウエアの大幅改修なくして文字種を増やすことは極めて困難といわざるを得ない。
なお、蛇足ながら、VX-7のキャラクタセットには、長音記号("ー")がない。マイナス記号("−")で代用すればいいという発想だと思うが、"ー"と"−"を混同するのはパソコン初心者にありがちな初歩的ミスで、個人的には極めて不満である。
OFFSET +0の内容については、現在のところ、完全には解明しきれていないが、現時点で以下のことが判明している。
下位2bitがモードを示すが、上位6bitの詳細は不明。しかし、私が様々な内容を書き込んで実験した限りでは、常時"001100"となっているようである。
様々な内容をメモリしてみたが、常に00Hであった。貴重なメモリを無駄に消費しているとは思えないが、詳細は不明。
メモリデータ本体の有効性を示す4bitのフラグのテーブルが別に用意されている。
場所は、[1202]〜[12FB]の250byteであり、下位4bitが奇数番号、上位4bitが偶数番号のメモリーに対応している。
1.一般周波数メモリ M001 : [1202] bit3-0 (省略) M447 : [12E1] bit3-0 2.ワンタッチメモリ OTM1 : [12E3] bit3-0 3.プログラマブルメモリスキャン用メモリ PMS_L01 : [12E8] bit3-0 (省略) PMS_U18 : [12F9] bit7-4 |
4bitのフラグの意味は、つぎのとおり。
XX00:メモリデータ本体は、無効 X0XX:スキップメモリーでない 0XXX:特定メモリーでない |
VX-7のマニュアルによれば、メモリ001は消去不能となっている。従って、[1202]の下位2bitは、"11"でなければならないはず、である。
また、同じくマニュアルには、メモリ内容を消去する操作を行ったあとであっても、『周波数などを新たに書き込む前であれば、消去した内容を復活できます。』とある。これは、『メモリ内容の消去』という操作は、実はこの有効性フラグを書き換えているに過ぎないことを裏付けるものであると言える。つまり、メモリ内容消去の操作とは、上記の有効性フラグのbit1を1から0に変更することであり、メモリデータ本体は何らの操作も行わない。
メモリグループ(MG)1〜9に属するメモリの数を示すテーブルが準備されている。
[0742] : FFH MG1に所属するメモリがない 00H MG1に所属するメモリが存在する [0744] : FFH MG2に所属するメモリがない 00H MG2に所属するメモリが存在する [0746] : FFH MG3に所属するメモリがない 00H MG3に所属するメモリが存在する [0748] : FFH MG4に所属するメモリがない 00H MG4に所属するメモリが存在する [074A] : FFH MG5に所属するメモリがない 00H MG5に所属するメモリが存在する [074C] : FFH MG6に所属するメモリがない 00H MG6に所属するメモリが存在する [074E] : FFH MG7に所属するメモリがない 00H MG7に所属するメモリが存在する [0750] : FFH MG8に所属するメモリがない 00H MG8に所属するメモリが存在する [0752] : FFH MG9に所属するメモリがない 00H MG9に所属するメモリが存在する |
メモリグループ(MG)1〜9に属するメモリを示すテーブルが準備されている。
MG1 : [0EA2] - [0F01] MG2 : [0F02] - [0F61] MG3 : [0F62] - [0FC1] MG4 : [0FC2] - [1021] MG5 : [1022] - [1081] MG6 : [1082] - [10E1] MG7 : [10E2] - [1141] MG8 : [1142] - [11A1] MG9 : [11A2] - [1201] |
1つのメモリグループごとに96byteあり、そのメモリグループに属するメモリ番号-1が、16bitの2進数で最大48個格納されている。格納は、オフセットの小さいほうから、上位8bit、下位8bitの順であり、Intelの8bitマイクロプロセッサとは逆である。余った領域は、FFHで埋められる。
たとえば、メモリ001、003、257の3つがメモリグループ1に所属している場合、オフセット[0EA2]に00H、[0EA3]に00H、[0EA4]に00H、[0EA5]に02H、[0EA6]に01H、[0EA7]に00H、[0EA8]から[0F01]まではFFHが書き込まれる。
メモリグループ使用の有無を示すフラグがあり、メモリグループを使用する場合、これを書き換える必要がある。
[05BA] および [063A] : FFH
メモリグループを使用しない 00H メモリグループを使用する [05BB] および [063B] : 最後に使用したメモリグループ番号-1 |
[05BA]と[063A]は同一内容で、メモリグループ使用の有無を示す。メモリグループをまったく使用しない場合に限り、FFHが書き込まれる。そうでない場合は、00Hである。
[05BB]と[063B]は同一内容で、最後に使用したメモリグループ番号-1が書き込まれる。
[0611]は、[0592]から[0610]までのデータを符号なし2進数として単純に加算した数の下位8bit、同様に、[0691]は、[0612]から[0690]までを加算したチェックサムとなっている。
前述のメモリグループ有効性フラグとあわせて、賢明な読者は、[0592]から[0611]までの128byteと、[0612]から[0691]までの128byteは、まったく同一内容ではないかと気づかれたのではないかと思う。
どうやらこの領域は、その時点でのVX-7の動作状態を示すフラグなどが集中しているようである。更にいえば、[0012]から[0091]、[0092]から[0111]、....[0612]から[0691]は、同一構造のテーブルになっている。
現在のところ詳細は判明していないが、この領域は、VX-7自慢の(?)ハイパーメモリ機能に関係しているのは間違いがない。ハイパーメモリは、無線機の状態をそのままメモリする機能であるが、ソフトウエアの観点から言えば、その時点での動作状態フラグを一括して保存/復帰すればいいわけであるから、そのための作業領域があって当然である。
逆に言えば、[0592]から[0611]までの128byteには、VX-7の動作状況を示すフラグ類が集中している可能性がある。
クローン動作時にVX-7が送りだすbyteのデータのうち、最後の1byte([3F52])はチェックサムのようだ。これは、[0000]から[3F51]までのデータを符号なし2進数として単純に加算した数の下位8bitである。
冒頭に掲載した"SAVEVX7C.BAS"では、一応、 このチェックサムを検証する機能をつけてある。
ここに記載された情報は、私が独自に収集したものです。内容の正確性については保証しません。あなたの自己責任でご利用ください。 |
Copyright by Heian Software Engineering (C)H.S.E.
2002 Allrights reserved.
2002年10月1日 制作 2002年11月10日 修正