В.В. Сапогов

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

 

Performed by © gid, 2012-2022.