クローンデータ解析

 VX-7のクローンデータをパソコンに取り込むことに成功したので、今度はそのデータを解析することにした。

方法

 方法と言っても、実は極めて原始的なもので、要するにVX-7に何か操作を加えるたびにクローンデータを取得し、そのファイルを逐次比較するだけである。
 VX-7の操作の前後でクローンデータに変化があれば、それは、その操作によって変更されたものと考えられるから、これを繰り返すことによって、クローンデータの全貌が解明できるはずである。

メモリ内容のSAVE

 前回の実験で作成した"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]
M002 : [1338] - [134D]
M003 : [134E] - [1363]
M004 : [1364] - [1379]

 (省略)

M447 : [3976] - [398B]
M448 : [398C] - [39A1]
M449 : [39A2] - [39B7]
M450 : [39B8] - [39CD]

2.ワンタッチメモリ

OTM1 : [39CE] - [39E3]
OTM2 : [39E4] - [39F9]
OTM3 : [39FA] - [3A0F]
OTM4 : [3A10] - [3A25]
OTM5 : [3A26] - [3A3B]
OTM6 : [3A3C] - [3A51]
OTM7 : [3A52] - [3A67]
OTM8 : [3A68] - [3A7D]
OTM9 : [3A7E] - [3A93]
OTM0 : [3A94] - [3AA9]

3.プログラマブルメモリスキャン用メモリ

PMS_L01 : [3AAA] - [3ABF]
PMS_U01 : [3AC0] - [3AD5]
PMS_L02 : [3AD6] - [3AEB]
PMS_U02 : [3AEC] - [3B01]
PMS_L03 : [3B02] - [3B17]

 (省略)

PMS_U18 : [3DAC] - [3DC1]
PMS_L19 : [3DC2] - [3DD7]
PMS_U19 : [3DD8] - [3DED]
PMS_L20 : [3DEE] - [3E03]
PMS_U20 : [3E04] - [3E19]

 私が解析に使用したのは、国内仕様("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
01H : 69.3Hz
02H : 71.9Hz
03H : 74.4Hz

 (省略)

2EH : 233.6Hz
2FH : 241.8Hz
30H : 250.3Hz
31H : 254.1Hz

DCSコード

 レコード先頭からのオフセット+19に格納されている。

00H : 023
01H : 025
02H : 026
03H : 031

 (省略)

64H : 732
65H : 734
66H : 743
67H : 754

メモリータグ

 メモリータグの情報は、オフセット+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
00 : 0 1 2 3 4 5 6 7 8 9 SP A B C D E
10 : F G H I J K L M N O P Q R S T U
20 : V W X Y Z a b c d e f g h i j k
30 : l m n o p q r s t u v w x y z .
40 : , : ; ! ” # $ % & ’ ( ) * + − ・
50 : = < > ? @ [ ¥ ] ^ _ \ { | } → ←
60 : ▲ ▼ 〜 *1 ÷ × √ λ μ π φ ω Ω ℃ *2 £
70 : ± ∫ ♪ *3 *4 「 」 ・ ♂ ♀ 〒 あ い う え
80 : お か き く け こ さ し す せ そ た ち つ て と
90 : な に ぬ ね の は ひ ふ へ ほ ま み む め も や
A0 : ゆ よ ら り る れ ろ わ を ん     が ぎ ぐ げ
B0 : ご ざ じ ず ぜ ぞ だ ぢ づ で ど ば び ぶ べ ぼ
C0 : ぱ ぴ ぷ ぺ ぽ ぁ ぃ ぅ ぇ ぉ ゃ ゅ ょ っ ア イ
D0 : ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ
E0 : テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ
F0 : モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン ガ ギ グ ゲ


キャラクタセット1

   +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
00 : ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ ビ ブ ベ ボ
10 : パ ピ プ ペ ポ ァ ィ ゥ ェ ォ ャ ュ ョ ッ 愛 圧
20 : 伊 位 井 育 一 茨 英 衛 越 円 遠 横 岡 沖 屋 温
30 : 音 化 歌 河 火 香 鹿 賀 海 柿 隔 学 潟 間 関 菅
40 : 岩 基 機 気 城 岐 急 救 九 京 教 橋 玉 禁 金 区
50 : 空 熊 栗 群 郡 形 警 月 県 原 言 限 庫 込 古 五
60 : 語 口 広 航 高 合 刻 国 黒 根 佐 災 埼 西 坂 崎
70 : 察 札 沢 澤 三 山 四 士 市 止 紙 滋 児 時 示 自
80 : 七 取 手 殊 酒 州 秋 集 十 重 書 小 消 上 新 森
90 : 神 水 制 青 静 石 設 仙 千 川 線 船 相 総 送 束
A0 : 測 続 村 隊 台 大 第 滝 単 知 中 庁 朝 町 聴 長
B0 : 鳥 定 鉄 天 田 電 戸 都 度 土 島 東 盗 藤 道 徳
C0 : 特 読 栃 奈 縄 二 日 沼 濃 能 馬 売 舶 八 阪 飯
D0 : 尾 媛 百 表 秒 浜 富 府 阜 武 部 幅 福 分 文 聞
E0 : 兵 並 放 芳 防 北 幌 本 毎 万 宮 無 名 木 谷 野
F0 : 葉 陽 絡 梨 良 林 鈴 連 路 六 和 C1 C2 C3 C4 C5

SP:スペース
C1:外字1
C2:外字2
C3:外字3
C4:外字4
C5:外字5

以下は、JISにない(と判断せざるを得ない)キャラクタ
*1:"!!"
*2:華氏温度記号("F"にマル)
*3:音符
*4:カギつきのアンダーバー

 たとえば、『奈良レピ−タ』というメモリータグは、内部ではつぎのように表現されている。

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について

 OFFSET +0の内容については、現在のところ、完全には解明しきれていないが、現時点で以下のことが判明している。

OFFSET +5について

 下位2bitがモードを示すが、上位6bitの詳細は不明。しかし、私が様々な内容を書き込んで実験した限りでは、常時"001100"となっているようである。

OFFSET +14について

 様々な内容をメモリしてみたが、常に00Hであった。貴重なメモリを無駄に消費しているとは思えないが、詳細は不明。

メモリデータ有効性フラグテーブル

 メモリデータ本体の有効性を示す4bitのフラグのテーブルが別に用意されている。
 場所は、[1202]〜[12FB]の250byteであり、下位4bitが奇数番号、上位4bitが偶数番号のメモリーに対応している。

1.一般周波数メモリ

M001 : [1202] bit3-0
M002 : [1202] bit7-4
M003 : [1203] bit3-0
M004 : [1203] bit7-4

 (省略)

M447 : [12E1] bit3-0
M448 : [12E1] bit7-4
M449 : [12E2] bit3-0
M450 : [12E2] bit7-4

2.ワンタッチメモリ

OTM1 : [12E3] bit3-0
OTM2 : [12E3] bit7-4
OTM3 : [12E4] bit3-0
OTM4 : [12E4] bit7-4
OTM5 : [12E5] bit3-0
OTM6 : [12E5] bit7-4
OTM7 : [12E6] bit3-0
OTM8 : [12E6] bit7-4
OTM9 : [12E7] bit3-0
OTM0 : [12E7] bit7-4

3.プログラマブルメモリスキャン用メモリ

PMS_L01 : [12E8] bit3-0
PMS_U01 : [12E8] bit7-4
PMS_L02 : [12E9] bit3-0
PMS_U02 : [12E9] bit7-4
PMS_L03 : [12EA] bit3-0

 (省略)

PMS_U18 : [12F9] bit7-4
PMS_L19 : [12FA] bit3-0
PMS_U19 : [12FA] bit7-4
PMS_L20 : [12FB] bit3-0
PMS_U20 : [12FB] bit7-4

 4bitのフラグの意味は、つぎのとおり。

XX00:メモリデータ本体は、無効
XX01:メモリデータ本体は、消去済み(復活可能)
XX10:(不明)
XX11:メモリデータ本体は、有効

X0XX:スキップメモリーでない
X1XX:スキップメモリー

0XXX:特定メモリーでない
1XXX:特定メモリー

 VX-7のマニュアルによれば、メモリ001は消去不能となっている。従って、[1202]の下位2bitは、"11"でなければならないはず、である。

 また、同じくマニュアルには、メモリ内容を消去する操作を行ったあとであっても、『周波数などを新たに書き込む前であれば、消去した内容を復活できます。』とある。これは、『メモリ内容の消去』という操作は、実はこの有効性フラグを書き換えているに過ぎないことを裏付けるものであると言える。つまり、メモリ内容消去の操作とは、上記の有効性フラグのbit1を1から0に変更することであり、メモリデータ本体は何らの操作も行わない。

メモリグループ所属メモリ数

 メモリグループ(MG)1〜9に属するメモリの数を示すテーブルが準備されている。

[0742] : FFH MG1に所属するメモリがない 00H MG1に所属するメモリが存在する
[0743] : MG1に所属するメモリの数-1 ない場合は、FFH

[0744] : FFH MG2に所属するメモリがない 00H MG2に所属するメモリが存在する
[0745] : MG1に所属するメモリの数-1 ない場合は、FFH

[0746] : FFH MG3に所属するメモリがない 00H MG3に所属するメモリが存在する
[0747] : MG1に所属するメモリの数-1 ない場合は、FFH

[0748] : FFH MG4に所属するメモリがない 00H MG4に所属するメモリが存在する
[0749] : MG1に所属するメモリの数-1 ない場合は、FFH

[074A] : FFH MG5に所属するメモリがない 00H MG5に所属するメモリが存在する
[074B] : MG1に所属するメモリの数-1 ない場合は、FFH

[074C] : FFH MG6に所属するメモリがない 00H MG6に所属するメモリが存在する
[074D] : MG1に所属するメモリの数-1 ない場合は、FFH

[074E] : FFH MG7に所属するメモリがない 00H MG7に所属するメモリが存在する
[074F] : MG1に所属するメモリの数-1 ない場合は、FFH

[0750] : FFH MG8に所属するメモリがない 00H MG8に所属するメモリが存在する
[0751] : MG1に所属するメモリの数-1 ない場合は、FFH

[0752] : FFH MG9に所属するメモリがない 00H MG9に所属するメモリが存在する
[0753] : MG1に所属するメモリの数-1 ない場合は、FFH

メモリグループ所属メモリテーブル

 メモリグループ(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が書き込まれる。

チェックサム(I)

 [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の動作状況を示すフラグ類が集中している可能性がある。

チェックサム(II)

 クローン動作時にVX-7が送りだすbyteのデータのうち、最後の1byte([3F52])はチェックサムのようだ。これは、[0000]から[3F51]までのデータを符号なし2進数として単純に加算した数の下位8bitである。

 冒頭に掲載した"SAVEVX7C.BAS"では、一応、 このチェックサムを検証する機能をつけてある。

注意

 ここに記載された情報は、私が独自に収集したものです。内容の正確性については保証しません。あなたの自己責任でご利用ください。
 VX-7のクローン機能は、あくまでも2台のVX-7を接続したうえで、設定等の情報をコピーするためのものです。ここに記した情報は私が個人的に解析した結果であり、各種のテーブルやフラグの名称は、私が独自に命名したものです。
 この件に関して、(株)バーテックススタンダードもしくはその販売店に問い合わせることはご遠慮ください。

続き

戻る


Copyright by Heian Software Engineering (C)H.S.E. 2002 Allrights reserved.
2002年10月1日 制作 2002年11月10日 修正