MS-DOSテキストから写研SK-TEXTの変換ソフト作成

MS-DOSテキストを電算写植テキストに変換するプログラムが自分で書けるのではないか。写研用SK-TEXTの読み出し書き込みが少し解ったので、データ変換にチャレンジする事にしました。
PC-9801用MS-DOS版BASICにバージョンアップしたとき、重要なDSKI$関数、 DSKO$関数がサポートされなくなっていました。MS-DOSの恩恵を受けるためにも、8インチFD(EBCDIC)の読み書き関数を作成することが必要でした。多くの時間がかかりましたが、その後Quick BASICに移植するときに役立ちました。
当時市販の変換ソフトがありましたが大変高価でした。出力センターでも変換サービスがありましたが小回りがききませんでした。

当初の目標
自力で8インチFDの読み書き用関数を作成する。
ダンププログラムを作成し写研SK-TEXTファイルの構造を調べる。
MS-DOSと写研SK-TEXT変換用テーブル第一水準を作成する。
Quick BASICプログラムに関数埋め込みと呼び出しの使用方法を探る。


解ってしまえば簡単なことだが

小さな関数を作成するため参考になる本と言語を用意しました。C言語、MASM、大型電算機コードEBCDIC、8インチFDのBIOSなど参考書を積み上げると1メートルの高さになった。この時期は大変勉強になりました。とくに大変だったのがコンピュータの進歩は早くて「少し古い参考書はすぐ書店から消える」という現実でした。いざ探すとなると見つからない本が何冊もありました。その反面、何気なく買い込んだパソコン専門書の内容が理解できず、そのままにしていた本が何冊かありました。
プログラム作成時にこの「死蔵参考書」が大変役立ちました。「ここが理解できれば」という最後の最後の難関ソースコードは1000円均一ワゴンセールで何気なく購入していた「古いプロクラム集の中に書かれた1行の中」にあった。灯台元暗しでした。

データ変換プログラムの勉強を始めてだいたい3年くらいの年月で変換ソフトが完成しました。このソフトを使用すれば「ワープロ入力時に特定の記号を付加する」ことで、データ変換後、サイバートの組み版が飛躍的に能率の良いものになりました。
第一号の変換ソフトの性能は1分間当たり750文字。(PC-9801Vm2)
その後PC-9801T(32ビット16MHz)で1分間で9500文字と実用スピードになりました。

サイバートは文字組み専用機で版下に必要な機能しかありませんが、日本語組み版に関しては高い能力がありました。さらに作成したデータを印画紙出力するときのエラーは皆無です。しかし、パソコンDTPアプリケーションのようにカラー製版データを書き出す能力はありません。1999年、時代の流れとともにその役目を終えています。



読み出し書き込み関数

'----------------------------------------------------------------------
'SKフロッピーディスクルーチンQuick BASIC用
'わずかこれだけのプログラムを作成するために大変苦労しました。
'DSKI$、 DSKO$の2つの関数さえあればと何度も思いました。
'----------------------------------------------------------------------
'Quick BASICにマシン語をデータとして埋め込み利用プログラムの一部

P = VARPTR(ASMCODE(1))
M.SEG = VARSEG(ASMCODE(1))
    'マシン語データをメモリーに格納する
RESTORE FD.READ
   FOR I = 0 TO &H95
   READ D$: D = VAL("&H" + D$): POKE P + I, D
NEXT I
    'MASMで作成したデータ BIOSを直接コントロール INT 1BH
FD.READ:
DATA 55,8B,EC,52,51,53,06,8B,46,06,2E,A2,8C,00,8B,46
DATA 08,2E,A2,8D,00,8B,46,0A,2E,A2,8E,00,8B,46,0C,2E
DATA A2,8F,00,8B,46,0E,2E,A2,90,00,8B,46,10,2E,A2,91
DATA 00,8B,46,12,2E,A3,92,00,8B,46,14,2E,A3,94,00,2E
DATA A0,8C,00,8A,E0,24,0F,3C,06,74,08,3C,05,74,04,B0
DATA 60,EB,31,2E,A0,8D,00,2E,8B,1E,92,00,2E,8A,2E,91
DATA 00,2E,8A,0E,8E,00,2E,8A,36,8F,00,2E,8A,16,90,00
DATA 2E,8B,2E,94,00,1E,07,90,CD,1B,90,90,72,04,32,C0
DATA EB,02,86,C4,32,E4,07,5B,59,5A,5D,CF,00,00,00,00
DATA 00,00,00,00,00,00


    '(BYVAL VARPTR(DISKBUF),読みだしDATA格納BUF取得
dtl = &H100     '読みだしBYTE, FM/128byte=&H80,MFM/256bytes=&H100
srn = 0        'セクター長 0=128,1=256,2=512,3=1024bytes/sector
S = 7         'セクター
H = 0         'サーフェス 0 or 1
T = 0         'トラック 0 TO 77
drno = &H92     'ドライブ装置NO. A=&H90,B=&H91,C=&H92,D=&H93
mode = &H16    'BIOSコマンド 読み出し :IF T=0 AND H=0 THEN &H16 ELSE &H56
            ' 書き出し :IF T=0 AND H=0 THEN &H15 ELSE &H55
----------------------------------------------------------------------
'SKフロッピーディスクチェックルーチン
'フロッピーディスクのボリュームを調べるだけのルーチン
'0トラック、0サーフェス、7セクタ(単密128バイト)を読み出す
'----------------------------------------------------------------------

S = 0: T = 0: S = 7: srn = 0: mode = &H16
DEF SEG = M.SEG
CALL ABSOLUTE(BYVAL VARPTR(DISKBUF),
    BYVAL dtl, BYVAL srn, BYVAL S, BYVAL H, BYVAL T, BYVAL drno, BYVAL mode, P)
    'マシン語コール
LEV$ = ""
FOR J = 38 TO 41
   CD = ASC(MID$(DISKBUF, J, 1))
   LEV$ = LEV$ + CHR$(ET(CD))  'ET(CD)はEBCDICからMS-DOSのコードテーブル
NEXT J
VOL$ = LEV$: PRINT : LOCATE 1, 51: PRINT "FD="; VOL$
    'PRINT VOL$; dtl; srn; S; H; T; drno; mode

以上はプログラムの一部ですが、プログラム内部にマシン語データを組み込み、CALL命令で呼び出すものです。今から考えると楽しい時間だったと思います。

1ページに戻る  トップページに戻る