Ниже приводится листинг оригинальной версии бейсик-блока
VU-File:
50 BORDER t: PAPER 1: INK t: CLEAR 25087: LOAD ""SCREEN$ :
LOAD ""CODE
100 INK 7: DIM f$(32): LET <«29785: GO TO USR 29721
1000 CLS: PRINT "Save a file": GO SUB 6000: GO TO USR a
1005 SAVE g$CODE $.1: PRINT "Press V to VERIFY " ' "or any other
key to continue."
1010 IF INKEY$«WW THEN GO TO 1010
1020 IF INKEY$<>"V" AND INKEY$<>V' THEN GO TO 1200
1100 GO SUB 7000: VERIFY g$CODE
1200 GO TO USR a
2000 CLS: PRINT "Load a file": GO SUB 6000: GO SUB 7000:
LOAD g$CODE s: GO TO USR a
3000 LPRINT f$( TO 32): GO TO USR a
6000 INPUT "Enter file name: "; LINE g$: LET f$( TO 10)=g$:
LET s=CODE f$(11)+256*CODE f$(12): LET NCODE
f$(13)+256*CODE f$(14): RETURN
7000 PRINT '"If the program stops executing and returns to BASIC with
an error code then enter:" ' ' "GO TO USR a" ' 1 "to get back
into VU-File.": RETURN
Комментарии:
Строка 50: стандартная загрузка.
Строка 100: переменная f$(32) используется для распечатки БД
на принтере, а также при формировании заголовка и параметров
для работы с лентой.
Строки 1000... 1200: вызываются из машинного кода нажатием
клавиши 4 в главном меню (SAVE DATA FILE). По желанию (клавиша
V) выполняется проверка сохраненного на ленте файла. «Лейтмо-
тив» GO ТО USR а, повторяемый в разных строках программы, —
возврат в кодовую часть VU-File.
Строка 2000: вызывается клавишей 5 из главного меню для
загрузки БД.
Строка 3000: вызывается из БД клавишами Р или С, ответ-
ственными за распечатку на принтере.
Строка 6000: формирует заголовок файла при работе с лентой.
Переменная s (адрес начала файла) всегда равна 30710.
Строка 7000: в случае ошибки во время работы с лентой выво-
дит на экран напоминание о способе возврата в VU-File.
Поскольку строки 1000, 2000и3000 вызываются из программы
в кодах, их номера менять не следует.
Поскольку все операции с внешними устройствами VU-File
осуществляет из Бейсика, адаптация его к диску достаточно проста.
Основная проблема — недостаток памяти ниже RAMTOP, установ-
ленного на адрес 25087. Поэтому наилучшая политика — все
операции, совершаемые однократно (загрузку VU-File, инициали-
зацию принтера) включить в загрузочный бейсик-блок, заменяе-
мый затем рабочим блоком.
Рабочая дисковая версия VU-File, дополненная теми идеями,
которые были обсуждены в разделе, посвященном работе с принте-
ром, приведена ниже.
Бейсик-блок дисковой версии разбит на две части: загрузочную
и рабочую.
Загрузочная часть:
SO BORDER 1: PAPER t: INK t: CLEAR 25087:
RANDOMIZE USR 15619: REM: LOAD "VU-E$"CODE 16384
55 INK 7: RANDOMIZE USR 15619: REM : LOAD "VU-CCODE
56 PRINT AT 16,7; FLASH 1 ."Printer on? [y/n]": GO SUB 80:
IF ■$<> V AND a$OT THEN GO TO 60
57 RANDOMIZE USR 15619: REM : LOAD "MS"CODE
58 RANDOMIZE USR 23296
59 LET esc=27: LPRINT CHR$ esc;CHR$ 15;CHR$ esc;"Q";
CHR$ 128;CHR$ esc;"CB";: REM condensed - 128 cpl - 60+6 Ipp
60 PAUSE 30: RANDOMIZE USR 15619: REM : LOAD "VU-ms"
80 LET a$=INKEY$: IF a$="" THEN GO TO 80
85 RETURN
В загрузочную часть дисковой версии VU-File вынесены следу-
хщие операции: загрузка картинки и кодовой части VU-File (стро-
ке и 50 и 55), подтверждение работы с принтером (строки 56
л 80...85) и, в случае согласия (клавиша Y), — загрузка драйвера
л инициализация принтера (строки 57...59). При нажатии любой
> ругой клавиши эти операции игнорируются. После этого загружа-
ли основной бейсик-блок VU-File (строка 60), заменяющий загру-
. очный блок.
Основной, рабочий бейсик-блок дисковой версии выполнен сле-
ующйм образом:
100 DIM f$(VAL "32м): LET a=VAL "297855?; LET h=VAL "23673":
LET sf=NOT PI: LET d=VAL "15619": GO TO USR VAL "29721"
1000 CLS : LET sf=PI: PRINT "Save a file" ': GO SUB VAL "6000":
RANDOMIZE USR d: REM : ERASE g$CODE
1010 RANDOMIZE USR d: REM : SAVE g$CODE s(l
1020 RANDOMIZE USR d: REM : VERIFY g$CODE
1200 GO TO USR a
2000 CLS : PRINT "Load a file": GO SUB VAL "6000":
RANDOMIZE USR d: REM : LOAD g$CODE s
2200 GO TO USR a
3000 GO SUB VAL "4000": LPRINT f$( TO VAL "32");:
POKE h,NOT PI: POKE (h+SGN PI),NOT PI
3200 GO TO USR a
4C00 IF PEEK h<PI THEN IF NOT PEEK (h+SGN PI) THEN RETURN
4010 LPRINT CHR$ VAL "12";: RETURN
6000 PAUSE VAL "30": RANDOMIZE USR d: REM : CAT
6005 IF sf THEN PRINT : PRINT "CAUTION: old file will be erased":
LET sf=NOT PI
6010 INPUT "Enter file extension name:" ' "VU"; LINE j$:
LET g$="VU"+j$: LET f$( TO VAL "8")=g$:
LET s=CODE f$(VAL "11")+VAL "256"*CODE f$(VAL "12"):
LET l=CODE f$(VAL "13")+VAL "256"*CODE f$(VAL "14")
6200 RETURN
Основные особенности этой версии в той части, которая касает-
ся работы с принтером, охарактеризованы в соответствующем
разделе этого описания. Остальное достаточно очевидно для тех, кто
работает в системе TR-DOS.
Опыт работы с VU-File показал, что большое неудобство в работе
федставляет невозможность «перемешивать» между собой данные
из разных файлов. А необходимость в этом возникает часто, при
Несмотря на то, что имеет хождение по меньшей мере одна
русифицированная версия VU-Filef автор данного описания прин-
ципиальный противник русификации VU-File по следующим сооб-
ражениям:
1. Русифицированный вариант VU-File утрачивает такое важ-
нейшее свойство, как алфавитное упорядочение записей (это отно-
сится и к другим русифицированным программам обработки БД
на ZX Spectrum, поскольку ни одна из них не включает таблицу
перекодировки).
2. Ввиду того, что вывод символов [,!,{,}, традиционно исполь-
зуемых для размещения русских букв Ш, Щ, ш, щ, в VU-File
заблокирован, при русификации возникает необходимость связы-
вать эти буквы с другими символами (@, # и др.). Этим сразу же
*атрудняется работа с принтером.
3. Русификация VU-File, в зависимости от варианта, ограничи-
вает или совсем исключает возможность использования латинского
Алфавита, что по меньшей мере неудобно, а часто и неприемлемо.
4. Основное достоинство VU-File — большой объем свободной
хамяти для БД. Русификация сокращает его.
Гак что не стремитесь русифицировать VU-File. Может быть, не
быстрее, но уж точно полезнее изучить английский язык.
разделении (из-за недостатка памяти) данных на несколько фай-
лов.
Для преодоления этого недостатка автором этих строк написана
программа VU-joinr комментированный листинг ленточной версии
которой (VU-join2) приводится ниже. Программа объединяет ин-
формацию из двух баз данных в один файл. Соединить три и более
файла можно, применяя VU-join несколько раз.
О REM VU-join2 [tape version] © Y. Rodionov 1993-06-21
10 BORDER 6: PAPER 5: INK 1: CLEAR 30709
20 LET Ы =30710
40 LET c$="1st": LET p=1: GO SUB 300
50 INPUT a$
60 LET c$=*"2nd": LET p=2: GO SUB 300
70 INPUT b$
80 GO SUB 250
90 DIM v(2,5)
100 LET s=0: LET i=1: GO SUB 500
110 LET v(2,3)=v(1,3): LET h=1
120 LET b2=v(1,4)-v(2,3)+b1
130 LET $=Ь2-Ы
140 CLS : BEEP .1,15: PRINT AT 10,0;" LOAD file";
INVERSE 1;" ";b$;" ": LOAD b$CODE b2
150 CLS : LET i=2: IF h THEN GO SUB 500: LET h=NOT h
160 LET m=PEEK v(1,4)
170 IF v(1,2)<>v(2,2) THEN PRINT PAPER p; INK 6; FLASH 1;
AT 10,6;" INCOMPATIBLE FILES ": BEEP 1.5,-15: PAUSE 0: STOP
180 IF v(2,3)Ov(1,3) THEN GO TO 120
190 IF v(1,4)+s>65535 THEN PRINT PAPER p; INK 6; FLASH 1;AT
10,8;" FILES TOO LONG ": BEEP 1.5,-15: PAUSE 0: STOP
200 GO SUB 250
210 POKE v(1,4),m
220 RANDOMIZE (v(1,1)+v(2,1)): POKE 30840,PEEK 23670: POKE
30841 (PEEK 23671
230 RANDOMIZE (v(1,5)+v(2,5)): POKE 30736,PEEK 23670:
POKE 30737,PEEK 23671
240 BEEP .1,12: BEEP .2,18: CLS: PRINT AT 8,6; PAPER 6; FLASH 1;
" OPERATION SUCCESSFUL ";AT 11,0; FLASH 0;
" LOAD VU-warm ": LOAD "VU-warm"
250 BEEP .1,15: CLS: PRINT AT 10,0;" LOAD file"; INVERSE 1;
" ";a$;" ": LOAD a$CODE Ы
260 RETURN
300 PRINT : PRINT AT 20,0; PAPER p; INK 6; BRIGHT 1; FLASH 1;
Select ";c$;" file name
310 RETURN
500 LET v(i,1)=PEEK (30840+s)+256»PEEK (30841+$):
REM Number of records
510 LET v(i,2)=PEEK (30857+s): REM Number of fields
520 LET v(i,3)=PEEK (30850+s)+256*PEEK (30851 +s):
REM Start of data
530 LET v(i,4)=PEEK (30858+s)+256*PEEK (30859+s):
REM Start of free space
540 LET v(i,5)=PEEK (30736+s)+256*PEEK (30737+s):
REM Length of data
550 RETURN
Порядок работы с программой VU-join следующий. После за-
грузки программа предложит вам указать имена первого и второго
соединяемых файлов (строки 50 н 70), после чего перейдет в режим
загрузхи этих файлов. Первый файл загрузится в стандартный для
VU-File адрес 30710 (строка 80). После анализа системных пере-
менных БД, записанных в заголовке файла (подпрограмма в стро-
ках 500...550), загружается второй файл. Делается это таким обра-
зом, чтобы начало его данных совпало с концом данных первого
файла. При этом заголовок второго файла частично накроет
«хвост» первого. Второй файл также подвергается анализу. Данные
о характеристиках обоих файлов заносятся в числовой массив
v(2,5), заданный в строке 90.
Случай, когда два файла, в целом совместимые, различаются,
например, форматом вывода, будет выявлен строкой 180. Если это
обнаружится, то вам будет предложено перезагрузить второй файл
в откорректированный адрес. При полностью совпадающих фор-
матах двух файлов этого не потребуется. Формат результирующего
файла всегда устанавливается по первому из соединяемых файлов.
Если в результате сравнения двух файлов, (строки 160... 190),
будет установлена их несовместимость по числу полей, произойдет
остановка программы в строке 170 с выдачей соответствующего
сообщения, поскольку продолжение работы не имеет смысла. Ана-
логичным образом, если окажется, что размер объединенного фай-
ла превысит размер доступной памяти, произойдет остановка в
строке 190.
Если результат сравнения двух файлов благоприятен и препят-
ствий к их слиянию не обнаружено, требуется повторно загрузить
первый файл (строка 200), после чего будут сформированы сис-
темные переменные объединенного файла (строки 210...230). За-
тем строка 240 проинформирует вас, что все в порядке, и перейдет
к загрузке программы VU-warm, то есть варианта VU-File с «теп-
лым» стартом, отличающимся от стандартного VU-File (см. Прило-
жение 1) строкой 100:
100 INK 7: DIM f$(32): LET a=29785: GO TO USR 29734
Войдя после загрузки в VU-File обычным способом (клавиша 1),
вы можете тут же просмотреть вновь полученную БД, если нужно,
откорректировать ее средствами VU-File и записать из главного
меню на магнитную ленту.
Полезность программы VU-join можно проиллюстрировать сле-
дующим примером. Пусть БД ваших синклеровских программ
занимает 60 килобайт, то есть по необходимости разбита на два
файла по 30 килобайт, причем в свое время вы заносили все
данные подряд. Теперь выяснилось, что лучше было бы в одном
файле иметь все системные программы, а во втором — 'игровые.
Поскольку каждый файл занимает практически всю память,
перед использованием VU-join нужно освободить достаточно места,
разбив каждый из двух исходных файлов на два, содержащих либо
системные, либо игровые программы. Это делается функцией
DELETE, предусмотренной в VU-File: загрузив полный файл, удаля-
ете из него все игровые программы и сохраняете остаток на ленте
(если в свое время вы удосужились предусмотреть в БД ключи для
различения системных программ и игр, вы очень облегчите себе
эту работу с помощью функции SELECT). Затем загружаете повтор-
но полный файл, удаляете из него все системные программы и
снова записываете на ленту. Так же поступаете со вторым исход-
ным файлом. Теперь у вас имеются четыре «половинки»: две
системных и две игровых, которые уже можно попарно соединять
с помощью VU-join.