В.В. Сапогов
HELP-драйвер для БК-0010
Каждый, кто когда-либо сталкивался с работой на IBM - совместимых компьютерах наверняка оценил преимущества используемых там так называемых HELP-подсказок. Стоит вкратце напомнить, что представляют из себя HELP-подсказки. При нажатии на определённую клавишу (обычно F1) на экране появляется окно, в которое выводится текст, разъясняющий работу активной в данный момент программы, подсказывающий дальнейшие действия и т.д. Текст в этом HELP-окне можно листать, используя функциональные клавиши компьютера. После нажатия на вторую определённую клавишу (обычно Esc) HELP-окно исчезает с экрана, при этом в исходном виде восстанавливается вся та экранная область, которая была закрыта HELP-окном, после чего активная программа продолжает свою работу.
Подобным же образом можно организовать работу БК, несмотря на очень скромные возможности этого компьютера. Для этого и предназначен HELP-драйвер.
Предлагаемая программа содержит полный текст HELP-драйвера, а также демонстрирует его работу.
Общий объём памяти, занимаемый HELP драйвером составляет 386 байт, кроме того для его работы необходим буферный участок памяти, в котором сохраняется содержимое области экрана, закрываемое HELP-окном. Объём этого буферного участка должен быть 1312 байта. Такой значительный объём буферной памяти объясняется тем, что в ОЗУ БК не сохраняется информация о выводимых на экран символах, поэтому приходится сохранять область экрана как графическую "картинку". Драйвер позволяет выводить текст в окно размером 4*32, располагающееся в центре экрана, этот текст может содержать больше 4-х строк, "прокрутка" текста в окне выполняется с помощью клавиш управления курсором ↓ ↑. Тексты, выводимые в HELP-окно должны быть соответствующе подготовлены и помещены в ОЗУ с определённого адреса.
Для вызова HELP-экрана и его отмены используется одна и та же клавиша КТ. При первом нажатии на неё HELP-окно появляется на экране, при повторном нажатии - исчезает при этом полностью восстанавливается содержимое экрана до вызова HELP-окна. Текст в HELP-окно выводится с помощью темных букв на светлом фоне. После отмены HELP-окна драйвер оставляет неизменными действовавшие до его вызова режимы дисплея, а также положение курсора. Драйвер полностью перемещаем, т.е. загружать его в память можно с любого адреса.
Для разъяснения конкретных деталей использования HELP-драйвера рассмотрим текст программы. Операторы DATA 30-420 содержат коды самого драйвера. В операторах 430-470 выполняется загрузка драйвера в ОЗУ и назначение стартового адреса. Операторы DATA 480-550 содержат тексты, выводимые в два HELP-окна. Строки, содержащиеся в операторах DATA 480-510 - выводятся в первое окно, в операторах 520-550 - во второе. Так как в строковые константы, содержащиеся в операторах DATA нельзя ввести с клавиатуры некоторые символы, например "перевод строки" (код 10), три символа выбраны в качестве служебных. ♠ (код 169, клав.АР2 I) - перевод строки; ♣ (код 180, клав.АР2 Т) - переход к следующему HELP-экрану, т.е. в одно HELP-окно выводится текст, заканчивающийся символом ♣; ♦ (код 184, клав.АР2 X) - конец HELP-текста, этот символ должен стоять самым последним в HELP-тексте.
Тексты, выводимые в HELP-окно должны быть размещены с конкретного адреса ОЗУ. Адрес для первого HELP-экрана назначается в операторе 570, а само размещение выполняет подпрограмма, начинающаяся с оператора 2000. Эта подпрограмма получилась довольно громоздкой из-за того, что оператор РОКЕ не позволяет адресоваться к нечётным адресам памяти. Операторы 590, 600 - выполняют установку HELP-драйвера и передачу ему адреса начала HELP-текста. Подпрограмма, начинающаяся с адреса 2200 заполняет весь экран символом, код которого присваивается переменной I1%. Это необходимо, чтобы проконтролировать правильность восстановления экрана после отмены HELP-окна. Операторы 630-650 контролируют код нажатой клавиши, дальнейшее выполнение программы возможно только после нажатия клавиши ВВОД. В этом месте программы с нажатием КТ можно вызвать HELP-экран и просмотреть весь HELP-Текст, используя клавиши ↑↓. Операторы 660-750 выполняют те же действия, что и операторы 560-650, но для второго HELP-окна. В операторах 760-800 выполняется запрос на выгрузку HELP-драйвера. Драйвер выгружается, если в качестве аргумента ему передаётся нуль, что делается в операторах 810, 820. Если выход из программы выполняется без выгрузки драйвера, то он остаётся загруженным и после её завершения, т.е. в режиме ввода команд Бейсика нажатие на клавишу КТ также будет вызывать появление HELP-окна. При нажатии на все остальные клавиши драйвер никак себя не проявляет. Выгрузить драйвер можно запустив программу с оператора 810 или непосредственно набрав операторы 810, 820 в режиме ввода команд. После выполнения программы можно сохранить драйвер на магнитной ленте командой BSAVE "HELPDR",&O32000,&O32600.
Необходимо отметить, что приведённая программа предназначена для работы в режиме "64 символа в строке", т.е. перед началом её работы необходимо нажать клавиши АР2. Так как на работу драйвера не влияют режимы работы дисплея, то он может работать и в режиме "32 символа в строке", при этом естественно размеры HELP-окна уменьшатся до 4*16, в остальном работа драйвера останется без изменений.
При необходимости можно изменить назначение клавиш, управляющих работой драйвера. Клавиша, код которой подчёркнут в операторе 70 вызывает появление HELP-окна, клавиша, код которой подчёркнут в операторе 390 вызывает отмену HELP-окна. Изменяя указанные коды можно выбирать по своему усмотрению клавиши, управляющие драйвером. Число, выделенное в операторе 160 определяет адрес начала буферной области, в программе этот адрес выбран равным &O33000=13824.
В заключение необходимо отметить, что при применении описанного драйвера в прикладных программах следует по возможности располагать сам драйвер и тексты к нему в старших адресах памяти - ближе к &O40000, чтобы не перекрыть текст самой программы. Однако начальные адреса для их хранения следует выбирать осторожно, потому что как показала практика работы с драйвером, некоторая часть старших адресов используется Бейсиком для служебных целей и если изменить содержимое этих адресов, то можно частично или полностью потерять текст программы.
10 CLEAR 1000 20 DIM A$(256%) 30 DATA 4544, 26048, 24, 3021, 772 40 DATA 4944, 4127, 176, 135, 2591 50 DATA 176, 135 60 DATA 0, 0, 9664 70 DATA 3, 769, 135, 4548, -6716 80 DATA 14,-30714, 5580, 1, 6118 90 DATA 176, 2591, 176,-30698, 4198 100 DATA 4262,-30692, 4134, 6081, -76 110 DATA 17857, -256, 9665, 216, 1800 120 DATA 5568, 18944, 3009, 778, 26048 130 DATA 64, 32323, 262, 5568, 16384 140 DATA -6719, 216, 769, 502, 26048 150 DATA 6736, 9664,-32768,-32764, 17856 160 DATA -32768, 26048, 16384, 5569, 13824 170 DATA 5570, 41, 5571, 32, 3020 180 DATA 772,-28143,-27184, 255, 257 190 DATA -27568, 32456, 26048, 32, 9664 200 DATA -32768,-32764, 17856,-32768, 26048 210 DATA 16384, 32404, 3020, 784,-30692 220 DATA 13760, 16384, 515, 5568, 154 230 DATA -30706,-30692, 13760, 32, 536 240 DATA 5568, 156,-30706, 276, 440 250 DATA 5505, 13761, 32, 515, 5568 260 DATA 156,-30706, 13761, 16384, 515 270 DATA 5568, 154,-30706, 5506, 5505 280 DATA -30700, 5535, 176, 135, 26052 290 DATA 2, 4869, -6716, 2, 5571 300 DATA 1, 8396, 778,-23083, 180 310 DATA 765,-23091, 184, 770, 2691 320 DATA 502, 2764, 287, 5568, 32 330 DATA 5570, 9, 5569, 16, 5571 340 DATA 32,-30700,-30706, 32450, 2690 350 DATA 9666, 13, 757, 5570, 9 360 DATA -30700,-27328, 17856, -256,-23104 370 DATA 169, 517,-23091, 180, 772 380 DATA 2690, 500,-30706, 499,-30714 390 DATA 9664, 3, 514, 2572, 436 400 DATA 9664, 27, 514, 2700, 451 410 DATA 9664, 26, 754, 2764, 3020 420 DATA 701, 2700, 493 430 FOR I%=0% TO &O600 ST2% ' Размещение текста HELP-драйвера 440 READ I1% ' в памяти, начиная с адреса 450 POKE &O32000+I%, I1% ' &O32000 460 NEXT I% 470 DEF USR0=&O32000 480 DATA " Демонстрация работы♠ HELP-дрaйвepa♠ После установки экран♠ вызывается нажатием на кл. КТ♠♣'" 490 DATA " Переход от одного HELP-экрана♠ к другому выполняется с♠ помощью клавиш управления♠ курсором <вверх><вниз>♠♣" 500 DATA " Повторное нажатие на КТ♠ восстанавливает исходный♠ экран♠♣" 510 DATA " Для продолжения работы♠ нажмите сначала КТ, затем♠ ВВОД, затем снова KT♠♣♦" 520 DATA " HELP - драйвер позволяет выво-♠ дить в HELP-экраны различные♠ сообщения в разных частях♠ Вашей программы♠♣" 530 DATA " После установки HELP-драйвер♠ работает до его выгрузки♠ как с активной программой,♠ так и при выходе в БЕЙСИК" 540 DATA " Для правильного применения♠ HELP-драйвера используйте♠ описание, а также текст данной♠ программы♠♠" 550 DATA "♠ Для завершения работы♠ нажмите сначала КТ, затем ВВОД♠♣♦" 560 RESTORE 480 570 I1%=&O31000 ' Размещение в памяти первого 580 GOSUB 2000 ' HELP-текста с адреса &O31000 590 I1%=&O31000 ' Установка 600 I1%=USR0(I1%) ' HELP-драйвера 610 I1%=174% ' Оформление 620 GOSUB 2200 ' экрана 630 B$=INKEY$ ' Ожидание 640 IF B$="" THEN 630 ' нажатия 650 IF ASC(B$)<>10% THEN 630 ' клавиши ВВОД 660 RESTORE 520 670 I1%=&O30000 ' Размещение в памяти второго 680 GOSUB 2000 ' HELP-текста с адреса &O30000 690 I1%=&O30000 ' повторная установка 700 I1%=USR0(I1%) ' HELP-драйвера 710 I1%=178% ' Оформление 720 GOSUB 2200 ' экрана 730 B$=INKEY$ ' Ожидание 740 IF B$="" THEN 730 ' нажатия 750 IF ASC(B$)<>10% THEN 730 ' клавиши ВВОД 760 ? AT(63%,23%) CHR$(10%) 770 ? AT(15%,23%) "ВЫГРУЖАТЬ HELP-ДРАЙВЕР (Y/N) ?"; 780 B$=INKEY$ 790 IF (B$<>"Y")AND(B$<>"y")AND(B$<>"N")AND(B$<>"n") THEN 780 800 IF (B$="N")OR(B$="n") THEN END 810 I1%=0% ' Выгрузка 820 I1%=USR0(I1%) ' HELP-драйвера 830 ? 840 ? AT(17%,23%) "HELP-ДРАЙВЕР ВЫГРУЖЕН" 850 END 2000 READ A$ 2010 FOR I%=1% TO LEN(A$) STEP 2% 2020 IF I%=LEN(A$) THEN J#=0 ELSE J#=ASC(MID$(A$,I%+1%,1%)) 2030 J#=J#*256%+ASC(MID$(A$,I%,1%)) 2040 IF J#>=32767 THEN J#=J#-65536 2050 I2%=I1%+I%-1% 2060 POKE I2%,CINT(J#) 2070 NEXT I% 2080 I1%=I2%+2% 2090 IF MID$(A$,LEN(A$),1%)<>"♦" THEN 2000 2100 RETURN 2200 CLS 2210 FOR I%=1% TO 1472% 2220 ? CHR$(I1%); 2230 NEXT I% 2240 RETURN