/
Текст
dDUM|iiiia| mog
9661
II
0LS0-6980NSSI
"• if
& •*
"\«v>
%
<x"
x w4V»*
»*•
О",.»"’
f'' r^,'-'- .^'.rfD'
V/’VfO^^oV*’,,V-’ \л
.'Л*
X, ;>
<»«<
<5*
' .»»..-> .„>* XXX <’
»,<>
.-V’X
• I'5'
XvSlV'
Ilin
11/96
Illi
СОДЕРЖАНИЕ
Учредитель: НТК “Инфотех”
ЧИТАЙТЕ В НОМЕРЕ:
УРОКИ ПРОГРАММИРОВАНИЯ
А.КАЛИНОВСКИЙ. ПРОГРАММНЫЕ ПРЕРЫВАНИЯ ....................2
А.САРГОВЕЦ. ПАКЕТ ВОСПРОИЗВЕДЕНИЯ-ЗАПИСИ ОЦИФРОВАННЫХ
ЗВУКОВ DIGPAK.............................................4
ДИАЛОГ ПРОГРАММИСТОВ
С.ГЛЕБОВ. ПРОГРАММА ТРЕХМЕРНОЙ ГРАФИКИ....................9
А.ДЕШКО. ДОРАБОТКА СИНТЕЗАТОРА РЕЧИ ..................... 11
К.ХИЛЬКО. ПРОГРАММА ФОРМАТИРОВАНИЯ ЛИСТИНГОВ
ПАСКАЛЬ-ПРОГРАММ.........................................12
В.МИХАЙЛОВ. ПРОГРАММА “ТАЙМЕР” ДЛЯ “БК0010-01” .......... 14
Д.ШПИЛЕВСКИЙ. О ЗАГРУЗКЕ РЕЗИДЕНТНЫХ ПРОГРАММ............ 14
РАБОТАЕМ ГРАМОТНО
А.БУЛОЙЧИК, А.ПАНЕНКО, Р.РЫЖКОВИЧ. ПОДКЛЮЧЕНИЕ ЦИФРОВОГО
ОСЦИЛЛОГРАФА С9-8 К КОМПЬЮТЕРУ...........................15
РЕЦЕПТЫ
А.ШАБРОНОВ. ИЗМЕРЕНИЕ RLC ЧЕРЕЗ ПРИНТЕРНЫЙ ПОРТ......... 17
Г.ТЯПИЧЕВ. ROBOTRON РАБОТАЕТ С IBM PC................... 18
МИР 8 БИТ
С.ПРОХНЕВСКИЙ. АССОЦИАТИВНЫЙ СОПРОЦЕССОР................ 19
В. ТА ТУР. КОНТРОЛЛЕР НГМД НА INTEL 8272.............. 21
NEMO. КОНТРОЛЛЕР IDE/АТ ВИНЧЕСТЕРА ДЛЯ
“ZX-SPECTRUM” С IS DOS...................................24
Т.НУГУМАНОВ. ЕЩЕ РАЗ О РЕМОНТЕ “ДЕНДИ”....................25
Ю.СТЕФАНОВИЧ. ОЧИСТКА ОКНА НА “ZXSPECRUM”................26
А.ЗАСТУПНЕВИЧ. ОБ УДВОЕНИИ СИМВОЛОВ ПО ВЫСОТЕ И ШИРИНЕ....27
КОММУНИКАЦИИ
PATRICK DOUGLAS CRISPEN. CNET — COMPUTER NETWORK.........28
У ШКОЛЬНОЙ доски
В.УБИЙКОНЬ. ИТЕРАЦИОННЫЕ МЕТОДЫ РЕШЕНИЯ
СИСТЕМЫ ЛИНЕЙНЫХ УРАВНЕНИЙ...............................30
ДОМАШНЕЕ ЗАДАНИЕ.........................................31
ИГРОТЕКА
С.РЮМИК. КОЛЛЕКЦИОНЕРУ КОМПЬЮТЕРНЫХ ЭКРАНОВ...............33
В.УСОВ. ПРОГРАММА “УРОЖАЙ”................................36
рацио
пюОишопЬ
Приложение: Ваш компьютер
Издается с сентября 1995 г.
Главный редактор
Валентин БЕНЗАРЬ
Зам. гл.редактора
Иван БЕЛЬСКИЙ
Выпускающий редактор
Елена ЛЕВИТМАН
Редакторы разделов:
Виктор ЕРМОЛЕНКО,
Анатолий КОРБИТ
Янина БЕЛЬСКАЯ — компьютерная
верстка
Оксана НАЙДОВИЧ,
Ольга КРИВЕЛЬ — компьютерный
набор
Оформление обложки —
Надежда БОГОМОЛОВА,
Наталья БЕЛЬСКАЯ
Техническая графика —
Татьяна БЕЛЬСКАЯ,
Александр ОЛЬХОВСКИЙ,
Мария ФЕДОСЕЕВА
Отдел экспедирования и рассылки
журналов — Наталья ПАСЫНКОВА,
тел. (0172) 22-14-34.
Адрес для писем:
220050, г.Минск-50, а/я 41.
E-mail: rl@rl. belpcik. minsk. by
Адрес редакции: Минск,
ул. Авакяна, 30-1-2.
Тел./Факс: (0172) 22-14-34.
Приобретение отдельных номеров
журналов — в магазине “Сельхозкнига”
по адресу: Минск, пр. Ф.Скорины, д.92.
(Ст. метро “Московская”).
Расчетный счет 3012202650014 в Октябрь-
ском РКЦ Ленинского отделения Белбиз-
несбанка в г.Минске МФО 153001763 код
763, для НТК “Инфотех”. Корр, счет
700161963 в Главном управлении Нацио-
нального банка РБ по г.Минску и Минской
обл. (адрес банка: 220099, Беларусь, Минск,
ул. Казинца, 21, корп. 3).
Журнал зарегистрирован Министерством
информации Республики Беларусь 13.11.95г.
(per. удост. N1240).
Подписанок печати 15.10.96.
Формат 60 х 84 1/8. Печать офсетная.
4,5 печ. л. Зак. 012.
Отпечатано с оригинал-макета, изготовлен-
ного редакцией журнала, в МУ НТК
“Инфотех”.
© Радиолюбитель
Радиолюбитель. Ваш компьютер 11/96
УРОКИ ПРОГРАММИРОВАНИЯ
Уважаемые читатели!
“Радиолюбителю” идет шестой год. Число его подписчиков воз-
росло за это время в десятки раз. Очевидно тем, кто начал читать
его недавно, интересно узнать что они “прозевали”, а тем, кто
читает “РЛ” с первых номеров, наверняка знакома ситуация, ког-
да твердо помнишь, что нужная статья была когда-то где-то в
“РЛ”, но где именно?
Чтобы помочь сразу всем, мы выпустили “Путеводитель по
РЛ” — тематическое (по разделам и рубрикам) содержание жур-
нала за 1991...1995 гг. с краткими аннотациями всех статей и за-
меток, в формате “РЛ” объемом 60 с.
Чтобы получить “Путеводитель по РЛ” необходимо почто-
вым переводом перечислить 10 000 рос.рублей или 25 000 бел.руб-
лей за один экземпляр на наш расчетный счет 3012202650014
в Октябрьском РКЦ Ленинского отделения Белбизнесбанка в
г.Минске МФО 153001763 код 763, для НТК “Инфотех”. Корр.
счет 700161963 в Главном управлении Национального банка РБ
по г.Мпнску и Минской обл. (адрес банка: 220099, Беларусь,
Минск, ул. Казинца, 21, к. 3).
В эту сумму входят и почтовые расходы. На корешке почто-
вого перевода разборчиво напишите Ваш адрес с обязательным
указанием индекса отделения связи и полностью фамилии, име-
ни и отчества, а в графе “Для письма” укажите: Прошу выслать
А.КАЛИНОВСКИЙ,
г.Минск, БГУИР, ФИТиУ, I курс.
ПРОГРАММНЫЕ
ПРЕРЫВАНИЯ
Важнейшей чертой архитектуры MS-DOS является сис-
тема прерываний. Реализована она следующим образом.
Первые 1024 байта RAM отведены под таблицу из 256
четырехбайтных векторов прерываний (адресов про-
грамм-обработчиков прерываний — ISR), при этом
2 байта отведено на сегментную часть адреса и 2 байта —
на смещение, поэтому ISR могут располагаться в любом
месте RAM.
Ниже представлены наиболее необходимые для полно-
ценной работы прерывания BIOS.
Int 00h — вызывается при возникновении деления на
ноль.
Int 01 h — используется при пошаговом выполнении про-
грамм.
Int 02h — NMI — немаскируемое аппаратное прерыва-
ние.
Int 05h — печать текущего содержимого экрана при на-
жатии клавиши Print Screen (при наличии соответствую-
щих драйверов).
Int 08h — системней ддцмер — автоматически вызыва-
ется 18,2 раза в секунду.
Int 09h — BIOS-обработчик* клавиатуры — автомата- х
чески вызывается при нажатии или отпускании клавиш,
преобразует коды клавиатурного микропроцессора и за-
писывает их в буфер клавиатуры.
Int 10h — видеосервис BIOS.
Int llh — определение конфигурации системы. При вы-
зове в АХ возвращается слово состояния:
бит 0 —- установлен хотя бы один НГМД;
бит 1 —установлен математический сопроцессор;
бит 2 — установлена мышь;
биты 4...5 — видеорежим: 01 — символьный цветной
40x25; 10 — символьный цветной 80x25; 11 — символь-
ный монохромный 80x25;
биты 6...7 — число приводов гибких магнитных дисков;
биты 9... 11 — количество портов RS-232C (СОМ);
бит 12 — установлен игровой адаптер;
бит 13 — принтер подключен через последовательный
порт (для РС-ХТ — установлен внутренний модем);
биты 14... 15 — количество подключенных принтеров.
Int 12h — определение размера RAM (оперативной па-
мяти). При вызове в АХ возвращается размер RAM в Кб
(память свыше 1 Мб не учитывается).
Int 13h — интерфейс BIOS с НГМД.
Int 16h — BIOS-функции обслуживания клавиатуры:
- функция 00h позволяет получить символьный код и
scan-код введённого символа. В АН возвращается scan-
код, в AL — ASCII-код символа. Если введённого сим-
вола в буфере нет, функция ждёт нажатия клавиши;
- функция 01h возвращает признак наличия в буфере
клавиатуры введенного символа. Если введенных симво-
лов нет, устанавливается флаг нуля, в противном случае
в АН возвращается scan-код, в AL — ASCII-код симво-
ла;
- функция 02h возвращает в AL байт флагов BIOS, оп-
ределяющий текущее положение служебных клавиш:
бит 0 — нажата правая клавиша SHIFT;
бит 1 — нажата левая клавиша SHIFT;
бит 2 — нажата клавиша CTRL;
бит 3 — нажата клавиша ALT;
бит 4 — установлен режим SCROLL LOCK;
бит 5 — установлен режим NUM LOCK;
бит 6 — установлен режим CAPS LOCK;
бит 7 — установлен режим INSERT.
Int 17h — BIOS-управление принтером:
- функция 00h позволяет вывести один символ на при-
нтер с получением кода завершения. Функции передают-
ся в АН — 00h (номер функции), в AL — код символа, в
DX — номер принтера. Функция возвращает в АН код
завершения:
бит 0 — сбой по тайм-ауту (принтер не отвечает);
Дрт 3 — ошибка ввода-вывода;
бит 4 — принтер находится в режиме ON LINE;
бит 5 — отсутствует бумага;
бит 6 — сигнал подтверждения;
2
Радиолюбитель. Ваш компьютер 11/96
УРОКИ ПРОГРАММИРОВАНИЯ
бит 7 — готовность принтера.
- функция Olh инициализирует принтер. Функции пе-
редаются в АН — Olh (номер функции), в DX — номер
принтера. Функция возвращает в АН код завершения;
- функция 02h позволяет получить текущее состояние
принтера. Функции передаются в АН — 02h, в DX —
номер принтера. Функция возвращает в АН код завер-
шения.
lot 19h — перезагрузка системы. Если слово по адресу
0:0472h не равно 1234b, выполняется тест памяти (“хо-
лодная перезагрузка”).
Int lAh — “служба реального времени”.
Int 20h...3Fh — зарезервированы для DOS.
Остальные прерывания почти не используются в сис-
теме и могут быть задействованы программистом по сво-
ему усмотрению.
Если при выполнении программы процессор встреча-
ет инструкцию INT (программное прерывание), в стек
записывается 6 байт: текущее значение программного
счётчика CS:IP и регистр флагов. Далее в CS:IP заносит-
ся адрес соответствующего прерывания из таблицы ISR
и выполняется сама ISR.
Собственно программа-обработчик прерывания (ISR)
— это программа, построенная с соблюдением следую-
щих правил:
- в самом начале она сохраняет все регистры процессо-
ра:
- перед своим завершением она восстанавливает все
регистры;
- завершается она инструкцией IRET, после которой
процессор извлекает из стека 6 байт и помещает их в CS,
IP и регистр флагов.
При использовании пакета Turbo Pascal от програм-
миста не требуется особых усилий по соблюдению этих
правил. В заголовке процедуры-обработчика прерывания
достаточно всего лишь указать ключевое слово
INTERRUPT. Ниже приведен пример простейшей про-
граммы, использующей процедуру-обработчик прерыва-
ния таймера — Int8.
{$14 16384, 0, 10000 }
{ $F+)
PROGRAM Demol;
USDS
Crt,Dos; {подключение необходимых для работы модулей}
VAR
l:byte; {счетчик обращений к прерыванию 8}
R:Registers ; {тип данных - регистры}
P:pointer; {указатель на "старую" ISR Int8}
PROCEDURE Int8;INTERRUPT; {процедура-обработчик}
BEGIN
Intr ($70,R); {вызов "старого" обработчика}
inc (I); {увеличение счетчика на 1}
TF I-36 THEN BEGIN
I :=0;
GoToXY (1-t-Round (Random (70 ) ) , 1+Round (Random (23)));
Wnte (' METALLICA' )
{печать текста в случайном месте экрана,
если 1 = 3 6, I.е. прошло примерно 2 секунды}
END
END;
BEGIN
GetInLVec ( 8,Р) ; {сохранение адреса "старого"
обработчика прерывания Int8}
1:=0;
SetlntVec(8,@lnt8); {установка "нового" обработчика}
SetlntVec(70, Р) ;
{установка "старого" обработчика на 70-е прерывание
для последующего его вызова в новом обработчике}
SwapVectors;
Кеер(0) {резидентное завершение программы}
END.
Использование программных прерываний на Turbo
Pascal предельно просто. Пользователь должен подклю-
чить стандартный модуль Dos, объявить переменную
стандартного типа Registers — это запись с регистрами
центрального процессора:
TYPE
(Registers record used by Intr and MsDos)
Registers = RECORD
CASE Integer OF
0: (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags: Word);
1: (AL,AH,BL,BH,CL,CH,DL,DH: Byte);
END;
В регистр АН загружается номер функции прерывания,
а в остальные регистры — конкретные необходимые для
этой функции параметры.
Рассмотрим, например, функцию вывода последова-
тельности символов в режиме TTY без перемещения кур-
сора (монитор EGA и выше):
USES
Dos ;
CONST
S : string[21]='Red Hot Chili Peppers';
VAR
R:Registers;
BEGIN
WITH R DO BEGIN
AH:=$13; {Номер функции вывода строки в режиме TTY}
AL:=$0; {Подфункция вывода строки без перемещения
курсора}
ВН:=$0; {Номер видеостраницы}
BL:=$02; {Байт атрибутов выводимой строки}
СХ:=$15; {Длина выводимой цепочки символов}
DH:=$01; {Номер строки (координата Y)}
DL:=$01; {Номер столбца (координата X)}
ES:=seg(S[1] ) ; {Сегментный адрес и смещение}
BP:=ofs(S[1]); {буфера с цепочкой символов}
Intr($10,R); {Выполнение программного прерывания
$10 с регистрами, загружаемыми из R}
END;
END.
Можно привести и более привлекательный пример ис-
пользования прерываний.
USES
Crt,Dos;
VAR
R:Registers;
C:boolean;
BEGIN
C:=True; ClrScr;
REPEAT
WITH R DO BEGIN
AH:=$0B; {Номер функции установки цветовой
палитры и рамки}
ВН:=$00; {Подфункция установки цвета
рамки экрана в символьном режиме}
BL:=byte(C); {Номер цвета рамки}
END;
Intr($10,R);
C:=NOT С
UNTIL False;
END.
Программа циклически изменяет цвет бордюра (рамки)
экрана с синего на черный и обратно. Цвет рамки можно
задавать, конечно, любой в регистре BL.
3
Радиолюбитель. Ваш компьютер 11/96
В заключение отметим, что прерывания особенно ши-
роко используются при разработке резидентных про-
грамм, драйверов устройств. Например если “повесить”
соответствующий обработчик прерывания таймера Int 8,
можно периодически получать управление для органи-
зации постоянного музыкального сопровождения своей
программы.
Антось САРГОВЕЦ,
Беларусь, г.Минск, БГУИР,
ФИТиУ, I курс.
ПАКЕТ
ВОСПРОИЗВЕДЕНИЯ-
ЗАПИСИ
ОЦИФРОВАННЫХ
ЗВУКОВ DIGPAK
Пакет DIGPAK написан фирмой Audio Solutions и фак-
тически состоит из набора программ, воспроизводящих
звуковые эффекты через строго определенные Звуковые
драйверы. Например программа IBMSND.COM воспро-
изводит звуки на PC Speaker, SBPRO.COM — на Sound
Blaster Pro.-
Это резидентные программы, которые воспроизводят
стандартные оцифрованные звуковые выборки на различ-
ном аппаратном обеспечении (ух!) и позволяют упростить
написание игр и воспроизведение звуков.
Тот, кто встречался с этой проблемой, знает, что не са-
мое приятное занятие — переписывать функцию исполне-
ния звукового эффекта для различной звуковой аппарату-
ры. В случае с DIGPAK эта проблема исчезает совсем. До-
статочно загрузить драйвер, установить необходимые па-
раметры (заметьте, одинаковые для всех звуковых устройств!)
и вызвать драйвер. А еще DIGPAK может записывать звук с
внешнего устройства в память (сбросить буфер на диск —
секундное дело, и не стоит обижаться на Audio Solutions за
то, что не предусмотрена возможность записи сразу на диск).
Однако серьезным препятствием может оказаться отсутст-
вие аппаратуры для записи звука.
В пакет еще обычно включается набор MIDPAK (ав-
тор — Miles Design Corp.), предназначенный для воспро-
изведения музыки на MIDI-совместимых картах (AdLib,
SB, SB Pro и т. д.). Однако MIDPAK заслуживает отдель-
ного разговора.
Драйверы DIGPAK можно найти во многих игровых
программах. Конечно же, в первую очередь попробуйте
найти у законных распространителей или на BBS (све-
жие версии). Есть ценный совет: шарьте лучше по игруш-
кам с оцифрованными звуками. В последнее время появ-
ляется все больше игр, использующих DIGPAK как сред-
4
Радиолюбитель. Ваш компьютер 11/96
УРОКИ ПРОГРАММИРОВАНИЯ
ство воспроизведения эффектов.
Могу поделиться опытом: в VALHALL есть драйвера
для SB Pro, Disney Sound Source (Covox — совместимая
карта на LPT I), Sound Blaster, Adlib Music Synthesizer и
PC Speaker (Beeper). Версия DIGPAK — 2.1. Еще реко-
мендую покопаться в SVGA-покере Strip Poker Pro (ди-
ректория “SOUND”) — там много драйверов (есть даже
для фонового воспроизведения на Beeper).
DIGPAK (не полный) вместе с MIDPAK’om можно на-
йти в Mario’s Games Gallery.
Как вы, наверное, уже поняли, DIGPAK — резидент, и
к его функциям может обращаться любая программа, в
том числе и резидентная. Большинство драйверов DIG-
PAK поддерживает фоновое воспроизведение, что, конеч-
но же, несколько снижает скорость работы компьютера,
однако конечный результат это оправдывает — вам не
надо заботиться о звуке, достаточно лишь проверить байт
статуса DIGPAK для проверки загруженности звуково-
го устройства. Это позволяет создать, например, резиден-
тный озвучиватель клавиатуры, и вообще предоставляет
много возможностей.
DIGPAK поддерживает только ключ “/и” — “Выгру-
зить из памяти”. Однако чтобы выгрузить его из памяти,
необходимо чтобы DIGPAK был последней загруженной
резидентной программой.
Фактически DIGPAK проигрывает набор байтов на зву-
ковом устройстве, и неважно — что именно вы проигрыва-
ете: звуковой файл или нечто совсем невообразимое; раз-
ница лишь в том, что вы услышите. Насчет звуковых эф-
фектов хочу дать совет — создавайте их сами с помощью
Sound Blaster или чего-то похожего. Однако пригодятся и
“выдранные” из игр звуки. Часто звуки сохранены в фай-
лах с расширениями VOC, RAW, SND, WAV. Обычно в них
хранятся неупакованные данные. Характерно, что файлы
SND и RAW обычно не имеют заголовков. В файлах VOC
и WAV в заголовок включаются некоторые параметры зву-
кового эффекта, такие как частота исполнения, длина зву-
ковых данных, версия файла и т.д. Кстати, будьте осторож-
ны с VOC-файлами — поздние версии этих файлов могут
быть упакованы. Конечно же, поищите еще по директори-
ям “SOUND*.*”.
Звуковой драйвер DIGPAK перехватывает обычно сво-
бодный вектор прерывания 66h и обслуживает функции (ко-
торые посылаются в регистре АХ) с номерами от 688h до
69Ah (для версии 3.0). Старшие версии могут обслуживать
больше функций. В таблице приведен список некоторых
самых важных из них с небольшими комментариями.
Структура, на которую указывает пара DS:SI, занима-
ет 12 байт. Вот её описание:
Bufferoffset dw ?
BufferSegment dw ?
Length dw ?
StatusFlagOffset dw ?
StatusFlagSegment dw ?
Frequency dw ?
Расскажем подробнее о каждом поле.
Пара BufferSegment и BufferOffset указывает на место-
нахождение в памяти оцифрованного фрагмента (Buffer-
Segment — сегментный адрес буфера, BufferOffset — сме-
щение внутри этого сегмента).
IIIHQHIII
УРОКИ ПРОГРАММИРОВАНИЯ
Функция Регистр Значение Краткое описание
DigPlay AX DS:SI 688h указатель на структуру Просто проигрывает оцифрованные данные. Она может изменять содержимое буфера, поэтому лучше использовать комбинацию функций DigPlay2 и MassageAudio (сначала MassageAudio).
SoundStatus AX 689h Если сейчас выводится звуковой эффект, в АХ возвращается 1, если нет — 0. Начиная с версии 3.1 в регистре ВХ возвращается версия драйвера DIGPAK.
MassageAudio AX DS:SI 68Ah указатель на структуру Преобразование данных в выходной формат аппаратного обеспечения (необходимо для 1-битного PC Speaker и некоторых других).
DigPlay 2 AX DS:SI 68Bh указатель на структуру Аналогична DigPlay, за исключением того, что содержимое буфера не изменяется, и считается, что данные преобразованы под аппаратное обеспечение.
AudioCapabilities AX 68Ch Выдача данных о возможностях аппаратного обеспечения и возможностях драйвера. На выходе биты в регистре АХ отвечают: 0 - 1 поддерживается фоновое воспроизведение; = 0 не поддерживается. 1 - 1 исходные данные должны быть преобразованы для выходного устройства (как Beeper); - 0 устройство способно воспроизводить неформатированные 8-битные беззнаковые звуковые данные (Covox, SB, Disney SS). 2 - 1 устройство может воспроизводить звук только с фиксированой частотой, но звуковой драйвер способен понизить частоту входных данных; - 0 устройство способно воспроизводить звук с указанной пользователем частотой. 3 - 1 устройство использует вектор прерывания таймера во время воспроизведения звука. 4 - 1 драйвер поддерживает разделение таймера (недоступно в Protected mode). 5 - 1 поддерживается режим ожидания. 6 - 1 поддерживается режим стереопанорамы. 7 - 1 поддерживается воспроизведение 8-битного РСМгСтереозвука. 8 - 1 поддерживается запись звука. 9 - 1 поддерживается режим обратной записи DMA. DX : Если драйвер может воспроизводить данные только с определенной частотой, в регистре DX содержится значение этой частоты.
StopSound AX 68Fh Немедленно останавливает вывод звука.
SetTimerDivisorRate AX DX 693h делитель частоты Перепрограммирует микросхему 8253 (таймер) на другую частоту.
Post AudioPending AX DS:SI 695h указатель на структуру Ставит в очередь второй музыкальный фрагмент, который будет воспроизведен сразу по окончании текущего. Выход: АХ=0 — началось воспроизведение фрагмента; АХ=1 — фрагмент поставлен в очередь на воспроизведение; АХ=2 — в очереди уже имеется фрагмент, поэтому данный фрагмент в очередь не поставлен.
AudioPendingStatus AX 696h Выдача текущего состояния двойного буфера функции PostAudioPending. Выход: АХ=0 никакой фрагмент не воспроизводится;
5
Радиолюбитель. Ваш компьютер 11/96
УРОКИ ПРОГРАММИРОВАНИЯ
Функция Регистр Значение Краткое описание
АХ=1 один фрагмент воспроизводится, другой ожидает своей очереди; АХ=2 фрагмент воспроизводится, но очередь пуста.
SetStereoPan АХ DX 697h 0=100% правый 64=50% оба 127=100% левый Позволяет управлять процентным соотношением звука в каналах (только стереокарты). Выход: АХ = 0 команда проигнорирована, драйвер не поддерживает стерео; АХ = 1 команда выполнена.
SetPlayMode АХ DX 698h 0 - 8-бит 1 - 8-бит стерео 2 - 16-бит 3 - 16-бит стерео Установить режим записи-воспроизведения РСМ. Выход: АХ = 0 режим не поддерживается; АХ = 1 команда выполнена.
Адрес флага ожидания и адрес “семафора” DigPak АХ 699h Выход: AX:DX — указатель на флаг ожидания; ВХ:СХ — указатель на “семафор”. Эта и старшие функции работают начиная с v3.0 DIGPAK.
Установка режима записи АХ DX 69Ah 0 - вкл. 1 - выкл. Позволяет включить режим записи или воспроизведения звука. Поддерживается только на Sound Blaster.
Переменная Length — длина оцифрованного фрагмента
в байтах. Так как эта переменная — слово, длина проигры-
ваемого фрагмента не может быть больше 65535 байт. Од-
нако с помощью функции PostAudioPending (‘‘Поставить в
очередь музыкальный фрагмент”) на драйверах с фоновым
воспроизведением можно фактически без перерыва испол-
нить два фрагмента по 64 Кб или один на 128 Кб.
Пара StatusFlagSegment и StatusFlagOffset указывает на
байт статуса в памяти.
Frequency — частота исполнения фрагмента. Перемен-
ной типа Word вполне хватает для нормального воспро-
изведения-записи звука, т.к. максимальная частота, под-
держиваемая современными аудиокартами, приблизи-
тельно равна 44 кГц.
Итак, с чего начать? Конечно же, с проверки наличия в
памяти драйвера DIGPAK. И сразу же проблема — спе-
циальных функций для проверки наличия в памяти са-
мого себя DIGPAK не поддерживает. Да и вызов преры-
вания 66h без установленного DIGPAK чреват послед-
ствиями — в зависимости от BIOS вектор 66h может ука-
зывать на любое место в памяти (обычно 0000:0000), и
машина может “подвиснуть”.
Однако драйвер DIGPAK проверяет наличие своей ре-
зидентной части в памяти! Как? Да очень просто — по-
лучает адрес, на который указывает вектор 6611, и если
адрес не равен 0000:0000, проверяет, находится ли ком-
бинация “KERN” по адресу полученного вектора со сме-
щением, уменьшенным на 6. Если это так, то драйвер в
памяти. Если там находится не “KERN”, a “MIDI” —
значит загружен MIDPAK (кстати, DIGPAK не может
быть загружен после MIDPAK’a).
Между прочим, этот способ проверки не документирован!
Раскопал я его дизассемблированием драйвера DIGPAK. По-
этому, если подобная функция не найдет в памяти более
старший драйвер DIGPAK (хоть это и вряд ли возможно,
ведь надо как-то проверять нахождение в памяти старых
версий драйвера) — я не виноват. Предупреждение’, при
проверке отличайте большие буквы от маленьких — у них
совершенно разные коды! Вот пример процедуры на Ас-
семблере, проверяющей нахождение в памяти DIGPAK:
Test_DIGPAK proc
push ds
push si
push ax
xor ax,ax
mov ds,ax
mov si,66h*4
Ids si,[si]
о r s i, s i ;
jz Not_Loaded ;
sub si,6
cmp [si],'IM' ;
jne Verify_DPK ;
cmp [ si+2],'ID'
jne Not_Loaded
jmp Set_Error ;
Verify_DPK:
cmp [ si],'EK'
jne Not_Loaded
cmp [si+2],'NR'
jne Not_Loaded
Set_Error:
stc ;
jmp Exit
Not_Loaded: ;
clc
Сохраним старые регистры
(Гиппократ: не навреди!)
обнулим АХ
установим DS:SI
на адрес вектора 66h (т.е. 0:198h)
адрес в памяти занимает 4 байта
загрузим в DS:SI
двойное слово по адресу 0:198п
адрес нулевой?
да — драйвер не загружен, выход
не забываем порядок следования байт
MIDPAK загружен?
ошибка — MIDPAK загружен!
MIDPAK не загружен, a DIGPAK?
установить CF — драйвер в памяти
драйвер не загружен
Exit:
pop ах
Pop
pop
ret
si
ds
Test_DIGPAK endp
; попользовался — положи на место!
6
Радиолюбитель. Ваш компьютер 11/96
Нн«П|||||
Эта процедура после вызова устанавливает флажок CF
если драйвер загружен, и сбрасывает этот флажок в дру-
гом случае.
Итак, драйвер загружен, наличие его в памяти прове-
рено. Теперь следующий шаг: проигрываем звуковой
фрагмент. Для одноразового воспроизведения можно
воспользоваться функцией DigPlay (AX=688h).
Однако если вы пишете не проигрыватель эффектов, а
игру или что-то другое, что требует воспроизводить один
эффект несколько раз, например на Tandy (З-voice) или
Beeper (1-voice), сначала преобразуйте данные (если, ко-
нечно, у вас стандартные неупакованные данные) с по-
мощью функции MassageAudio (AX=68Ah) и потом ис-
полняйте его “сколько влезет”.
В общем, рассмотрим простенький паскалевский при-
мер исполнения звукового эффекта, уже находящегося в
памяти. Сразу предупреждаю — программа вряд ли бу-
дет работать, т.к. для бедного Паскаля (да и для боль-
шинства других языков) столько статических переменных
— многовато. Лучше, конечно, выделять динамически
память и проигрывать оттуда, но об этом немного позд-
нее. Кстати, не вздумайте менять порядок следования пе-
ременных в программе: DIGPAK не поймет — где сме-
щение, а где частота...
uses Dos;
type
DIGPAKStrueture=гecord
{ Ox, и люблю я понятные и длинные названия }
Bufferoffset, Buffersegment: Word;
Length: Word;
StatusFlagOffset, StatusFlagSegment: Word;
Frequency: Word
end;
var
ReadBuffer: array[1..65536] of Byte;
Structure: DIGPAKStructure;
Reg: Registers;
StatusFlag: Byte;
procedure MassageAudio;
begin
Reg.AX:=$68A;
Reg.DS:=Seg(St ruct ure);
Reg.SI:=Ofs(Strucutre);
Intr ($66,Reg)
end :
procedure DigPlay2;
{ Функция DigPlay была сохранена в драйвере только
для совместимости со старыми,версиями, поэтому мы
будем пользоваться только функцией DigPlay2. }
begin
R.АХ:=$68В;
R.DS:=Seg(Strucutre);
R.SI:=Ofs(Structure);
Intr($66,Reg)
end;
Begin
...{ Тут мы будем читать звуковые данные из файла }
Reg.Frequency: = { А тут надо установить частоту }
Reg.Length:- { и размер эффекта }
Structure.StatusFlagSegment:=Seg(StatusFlag);
Strucutre.StatusFlagOffset:=Ofs(StatusFlag);
MassageAudiо;
DigPlay2
End.
В этом примере достаточно ошибок, и самая главная
из них — это то, что вы услышите при фоновом драйве-
ре, невысокой частоте и длинном звуковом фрагменте
сразу после запуска и сразу после выхода из программы.
УРОКИ ПРОГРАММИРОВАНИЯ
Объясняю: после выхода из программы DOS освобожда-
ет память, использованную программой, и использует её
по своему усмотрению. Драйвер не знает, что данные из-
менились, и там уже могут быть вовсе не звуковые дан-
ные; да ему и все равно что играть. Поэтому предупреж-
дение тем, кто захочет написать плейер или нечто подо-
бное — проверяйте PostAudioPendingStatus.
Выходов тут два — оставить программу резидентом
(а после завершения звукового эффекта выгрузить её
из памяти) или подождать пока драйвер не закончит
исполнять эффект (а только потом выйти). Сразу пред-
упреждаю: первый путь небезопасен, ибо DOS может
сразу загрузить другую программу, и освобождение
занятой памяти становится довольно проблематичным.
Однако эта тема мало касается DIGPAK’a, поэтому
хватит об этом.
Да, чуть не забыл: для авторов игр появляется другая про-
блема — одновременное исполнение нескольких звуков (на-
пример шум ветра и голос героя). Тут также два выхода:
первый — прервать фоновый звук (шум ветра) и исполнить
нужный фрагмент. Недостатки, я думаю, очевидны. Вто-
рой путь, хоть и тоже не лишенный недостатков, все же луч-
ше. Из закона о суперпозиции волн следует, что эффекты
можно побайтно сложить (при условии, что у них одинако-
вая частота). А теперь о недостатках. Обычно звуковые
файлы являются 8-битными, а это значит, что эффекты мож-
но складывать при условии что сумма не выходит за грани-
цу 255. Выход, конечно же, есть — изменять громкость эф-
фекта, т.е. отнимать константу от каждого байта эффекта
или нечто подобное. Однако этому тоже есть предел — не
меньше нуля. И еще иногда надо подстраивать частоту для
правильного наложения звуков.
Итак, осталось немного — написать свой проигрыва-
тель эффектов (player), базированный на DIGPAK’e.
Ниже я привожу текст программы с небольшими ком-
ментариями. Кстати, из-за особенностей процедуры
BlockRead эта программа в Паскале версии 5.5 работать
не будет — это я уже проверил. Если хотите знать поче-
му — разбирайтесь...
program DigPlayer;
uses Dos;
type
DIGRecord=record
Soundoffset:Word;
{ Структура записи DIGPAK'а. Еще раз напомню: }
{ не меняйте порядок следования полей! }
SoundSegment:Word;
SoundLength:Word;
StatFlagOffset:Word;
StatFlagSegment:Word;
Frequency:Word
end;
var
R:Registers;
F:file;
P:array[1..10]of Pointer;
{ Это указатели на внутренний буфер. 10 - }
{ потому что максимальный блок памяти,
выделяемый Паскалем = 64 КЬ }
Freq,Left,FragNum,N,Count:Word;
FSize:Longlnt;
DIGRec:DIGRecord;
StatFlag:Byte;
function DIGPAK_Loaded:Boolean;
Радиолюбитель. Ваш компьютер 11/96
УРОКИ ПРОГРАММИРОВАНИЯ
HinQiHII
{ Функция проверки нахождения в памяти }
{ драйвера DIGPAK'а }
var
V66Seg, V660ffs: Word;
{ переменные, хранящие адрес вектора 66h }
begin
V66Offs:=MemW[0:$ 198];
{ Возьмем адрес вектора прямо из памяти! }
V66Seg:=MemW[0:$19А];
{ Адрес 0000:0198h хранит 4-х байтный адрес 66h}
DIGPAK_Loaded:=True;
if (V66Seg=0)or(V660ffs=0) then
DIGPAK_Loaded:=False;
V660ffs:=V660ffs-6;
if (MemW[V66Seg:V660ffs]<>$454B) or
(MemW[V66Seg:V660ffs+2]<>$4E52)
then DIGPAK_Loaded:=False
{ Проверка комбинации 'KERN' по нужному адресу }
end;
procedure MassageAudio(Countl,N1:Word);
{ Процедурка конвертации данных в
аппаратно-поддерживаемый формат }
begin
R.AX:=$68A; { функция драйвера DIGPAK'а }
DIGRec.SoundSegment:=Seg(Р[N1]л);
{ Заполнение полей записи }
DIGRec.Soundoffset:=Ofs(Р[N1]Л);
DIGRec.Frequency:=Freq;
DIGRec.SoundLength:=Count1 ;
DIGRec.Stat FlagSegment:=Seg(StatFlag);
DIGRec.StatFlagOffset:=Ofs(StatFlag) ;
R.DS:=Seg(DIGRec) ;
R. SI:=Ofs(DIGRec) ;
Intr($66,R)
end;
procedure DigPlay2(Countl,N1:Word);
begin
R.AX:=$68B;
DIGRec . SoundSegment :=Seg(P[Nl]z') ;
DIGRec.Soundoffset:=0fs(P[N1]Л);
DIGRec.Frequency:=Freq;
DIGRec.SoundLength:=Countl;
DIGRec.StatFlagSegment:=Seg(StatFlag);
DIGRec.StatFlagOffset:=Ofs(StatFlag) ;
R.DS:=Seg(DIGRec) ;
R. SI:=Ofs(DIGRec) ;
Intr($66, R)
end;
function DoubleBufferNotEmpty:Boolean;
{ Проверка исполнения в текущий момент }
{ звукового фрагмента }
begin
R.АХ:=$696;
{ Функция PostAudioPending }
Intr($66,R);
if R.AX=0 then
DoubleBufferNotEmpty:=False
else
DoubleBufferNotEmpty:=True
end;
Begin
{ Это трэйдмарка моя: }
Writein('HellJaws'+
' digital player(based on DIGPak) vl. 0 1996.');
if not DIGPAK_Loaded then
{ Проверим, не повиснет ли машина? }
begin
WriteLN('Error: DIGPAK driver not loaded!');
Halt
end;
if ParamStr(1)=''then
begin
Writein('Usage: dig_play filename <frequency>');
Halt
end;
if ParamStr(2)<>'' then
Vai(ParamStr(2),Freq,N)
else Freq:=5000;
Assign(F,ParamStr(1));
{ Подготовка файла с эффектом к чтению }
ReSet(F,1);
FSize:=FileSize(F);
if FSize<65535 then
Count:=FSize
else
Count:=65535;
for N: =1 to FSize div Count do
begin
GetMem(P[N],Count) ;
{ Получаем память на эффект... }
BlockRead(F,Р[N]Л,Count);
{ ... читаем часть его (64Kb)...}
MassageAudio(Count,N)
{ ... и сразу преобразуем данные }
end;
FragNum:=N;
{ Количество загруженных фрагментов }
Left:=0;
if FSize mod CountoO then
begin
Left:=FSize-N*Count ;
Inc(N);
GetMem(P[N],Left);
BlockRead(F,P[N]Л,Left);
{ А тут мы читаем остаток файла (его длина<64КЬ) }
MassageAudio(Left,N)
end;
for N:=l to FragNum do
begin
DigPlay2(Count,N);
{ А теперь исполняем прочитанное }
repeat
{ Подождем, пока драйвер не закончит исполнение
текущего фрагмента (особенно на фоновых
драйверах) }
until DoubleBufferNotEmpty;
FreeMem(Р[N],Count) { Освободим часть памяти }
end;
if LeftoO then
begin
repeat until DoubleBufferNotEmpty;
DigPlay2(N+l,Left) ;
{ повторим то же самое для остатка файла }
FreeMem(Р[N+1] , Left)
end
End.
Конечно, эта программа далека от идеала (как, впро-
чем, и любая другая), и несколько советов по оптимиза-
ции я могу дать.
1. Для фоновых драйверов загрузите сначала один
блок 64 Кб, преобразуйте данные и сразу же его ис-
полняйте. Пока он исполняется, загрузите в память
следующую часть, преобразуйте ее и сразу ставьте в
очередь на исполнение (функция PostAudioPending).
Проверьте, не окончилось ли исполнение первого фраг-
мента. Если это так, загрузите на его место следующую
часть, и т.д.
2. Введите проверку на нехватку памяти, ведь програм-
ма читает сразу весь файл в память, а вполне может ока-
заться, что он больше объема доступной памяти. Файл
читается в память сразу весь во избежание перерывов в
звучании при отсутствии фонового драйвера.
3. Попробуйте переписать эту программу на Ассембле-
ре, чтобы сделать резидентный player. Желательно, ко-
нечно, сделать подгрузку данных во время исполнения.
8
Радиолюбитель. Ваш компьютер 11/96
ДИАЛОГ ПРОГРАММИСТОВ
С.ГЛЕБОВ,
г.Минск, ШЮП при кафедре ВМиП, ФИТиУ, БГУИР,
секция “Программирование и вычислительная
математика”.
ПРОГРАММА
ТРЕХМЕРНОЙ
ГРАФИКИ
Во многих играх, демонстрациях, заставках применя-
ется трехмерная графика — изображение объемных объ-
ектов на плоском экране компьютера. Здесь представле-
но описание программы, которая может помочь с лег-
костью запрограммировать любой трехмерный объект.
Программа может быть реализована в Turbo С 2.0 или
любой более поздней версии языка Си (ВС++, C++ и т.д.).
Она создает трехмерный объект с помощью линий, со-
единяющих заданные точки.
Листинг программы следующий:
♦ define RADIUS 0
♦ define FROM_NULL 1
♦ define XPLUS 2
♦ define YPLUS 3
♦define COLOR 4
♦include <graphics.h>
♦include <math.h>
♦include <dos.h>
♦include <stdio.h>
♦include <dir.h>
♦include <stdlib.h>
♦include <io.h>
♦include <alloc.h>
♦include <conio.h>
♦include <process.h>
char tangles[32];
char oldc[4] = { 0, 0, 0, 0 };
char total_fig=l;
int info[32] [128] [5] , i,t,k;
float f, sinmas[361], cosmas[361];
char curfig=0,curang=0,curstad=0;
int curx=320, cury=100,_curang=0,currad=0;
int oldx=320, oldy=l00;
int oc=0,xangle=0,yangle=0 ;
/* вывод сообщения об ошибке */
void errormsg(const char *msg)
{
puts(msg);
exit ( 0) ;
}
/* установка необходимых параметров клавиатуры */
void typematic(void)
{
_BX=0;
_AH=3;
_AL=5;
geninterrupt(0x16);
}
/* приведение угла к нормальному значению */
int prived(int angle)
{
while (angle>360) angle-=360;
while(angle<0) angle+=360;
return angle;
}
/* сохранение фигуры в файле */
void savefigure(char *filename)
{
FILE *fp;
int st;
unlink(filename);
fp=fopen(filename,"wb");
write(fileno (fp), &total_fig,1) ;
write(fileno(fp),&tangles,32);
st=write(fileno ( fp),info,total_fig*128 0) ;
if (st==-l)
{
errormsg("Error writing output file.");
}
fclose(fp);
}
/* чтение фигуры из файла */
void readletter(char *filename)
{
FILE *fp;
fp=fopen(filename,"rb");
if (fp==NULL)
errormsg("File not found or access denied.");
read(fileno(fp),&total_fig,1);
if (total_fig>32) errormsg("Invalid 3d file.");
read(fileno(fp),&tangles,32) ;
for (i=0;i<32;i + + ) if (tangles[i]>128)
errormsg("Invalid 3d file.");
if (read(fileno(fp),infо ,total_fig*1280) ==-l)
, errormsg("Error reading file.");
fclose(fp);
}
/* значение синуса угла */
float sn(int angle)
{
return sinmas[prived(angle) ] ;
}
/* значение косинуса угла */
float cs(int angle)
{
return cosmas[prived(angle) ] ;
}
/* вывод фигуры на экран */
void dispfig(char total_fig,char tangles[32],
int info[32][128][5],int xangle,
int yangle,int xadd,int yadd)
{
int x,y,oldx,oldy,i,t;
for (i=0;i<total_fig;i++)
{
oldx=(int)((float)(info[i][0][RADIUS])*
sn (info[i] [0] [FROM_NULL]+xangle) *6.4)+
info[i][0][XPLUS];
oldy=(int)((float)(info[i][0][RADIUS])*
cs(info[i] [0] [FROM-NULL]+yangle)*2) +
info[i][0][YPLUS];
oldx+=xadd;
oldy+=yadd;
moveto(oldx,oldy);
for (t=l;tctangles[i];t++)
{
x=(int) ((float) (info[i] [t] [RADIUS])*
sn(info[i] [t] [FROM_NULL]+xangle) * 6.4 ) +
info[i][t][XPLUS];
y=(int)((float)(info[i][t][RADIUS])*
cs(info[i][t][FROM_NULL]+yangle)*2)+
info[i][t][YPLUS];
x+=xadd;
y+=yadd;
setcolor(info[i][t][COLOR]);
lineto (x,у);
}
setcolor(info[i][0][COLOR]);
lineto(oldx,oldy);
}
}
/* вывод статус-строки */
void dispcurstad(int curstad)
{
char mas[2];
setcolor (0);
bar (0, 0,640,20) ;
setcolor(15);
if (curstad==0)
9
Радиолюбитель. Ваш компьютер 11/96
[|||>
ДИАЛОГ ПРОГРАММИСТОВ
outtextxy(О, 0, "Put the central point.");
if (curstad==l) outtextxy(0,0,"Put the main point.");
outtextxy(300, 0,"Current angle: ");
outtextxy(450,0, itoa(curang,mas,10));
outtextxy(480,0,"Current figure: ");
outtextxy(600,0,itoa(curfig,mas,10));
}
/★ определение значения X и Y ★/
void createxy(void)
{
curx=(unsigned) ((float) currad*sn(prived(_curang))*6.4)+
infofcurfig][curang][XPLUS];
cury=(unsigned)((float)currad*cs(prived(_curang))*2)+
info[curfig][curang][YPLUS];
}
/* установка параметров по умолчанию */
void _default(void)
{
curx=info[curfig] [curang] [XPLUS];
cury=info[curfig][curang][YPLUS];
_curang=info[curfig][curang][FROM_NULL];
currad=infо[curfig][curang][RADIUS];
}
/* вывод на экран курсора */
void putpoint(void)
{
putpixel(oldx,oldy, oc) ;
putpixel(oldx-1,oldy,oldc[0]);
putpixel(oldx+1,oldy,oldc[1]);
putpixel(oldx,oldy+1,oldc[2]);
putpixel(oldx,oldy-1,oldc[3]);
oc=getpixel(curx,cury);
oldc[0]=getpixel(curx-1,cury);
oldc[1]=getpixel(curx+1,cury);
oldc[2]=getpixel(curx,cury+1);
oldc[3]=getpixel(curx,cury-1);
putpixel(curx,cury,6);
putpixel(curx-1,cury,6);
putpixel(curx+1,cury,6);
putpixel (curx,cury+1,6) ;
putpixel (curx,cury-1,6) ;
oldx=curx;oldy=cury;
}
/* контроль экрана */
void newdisp(void)
{
cleardevice();
dispcurstad(curstad);
dispfig(total_fig, tangles, info, xangle, yangle, 0,0) ;
}
/* основная программа */
void main(void)
{
int gd=DETECT,gm=0, c=0 , stat=0 ;
FILE *fp;
char access;
char name[12];
initgraph(&gd,&gm, "") ;
printf("Enter name of file to load, or to create:");
scanf("%s",name);
/* Загрузка файлов данных */
fp=fopen("sinus.dat","rb");
if (fp==NULL)
{
puts ("File not found (sinus.dat).");
return;
}
stat+=read(fileno(fp),sinmas,sizeof(float)*361);
fclose(fp);
fp=fopen("cosinus.dat","rb") ;
if (fp==NULL)
{
puts("File not found (cosinus.dat) . ") ;
return;
}
stat+=read(fileno(fp),cosmas,sizeof(float)*361);
fclose (fp);
if (stat!=361*8)
{
puts("Bad or missing math files.");
return;
}
/* Установка параметров по умолчанию */
printf ("Preparing new data record. . .");
for (i=0;i<32;i + + ) for(t=0;t<128 ; t+ + )
for(k=0;k<2;k++) info[i][t][k]=0;
for (i=0;i<32;i + + ) for (t=0;t<128;t+ + )
{
info[i][t][XPLUS]=320;
info[i][t][YPLUS]=100;
info[i][t][COLOR]=15;
)
puts("DONE.");
/* Загрузка файла с графикой */
fp=fopen(name,"rb") ;
if (fp==NULL)
{
printf("File not found, create? (Y/N)");
c=getch();
printf("\n");
if (c==' Y' I I c=='y')
{
fp=fopen(name,"wb");
if (fp==NULL)
errormsg("Cannot create this file.");
} else exit (0);
}
else
{
fclose(fp);
readletter(name);
}
fclose(fp);
typematic ();
setfillstyle (0,0) ;
newdisp();
putpoint ();
/* Собственно программа контроля */
while(с!=27)
{
c=getch();
if (c==0) c=getch()<<8;
if (curang+l>tangles[curfig])
tangles[curfig]=curang+l;
if (c==72*256)
{
if (curstad==0) cury—;
if (curstad==l) currad++;
}
if (c==80*256)
{
if (curstad==0) cury++;
if (curstad==l) currad—;
)
if (c==75*256)
{
if (curstad==0) curx—;
if (curstad==l) _curang—;
}
if (c==77*256)
{
if (curstad==0) curx++;
if (curstad==l) _curang++;
}
if (c==59*256 && curang>0)
{
curang—;
dispcurstad(curstad);
—default();
}
if (c==60*256 && curfig>0)
{
curfig—;
dispcurstad(curstad);
—default();
}
if (c==61*256)
{
10
Радиолюбитель. Ваш компьютер 11/96
Illi
Hill
ДИАЛОГ ПРОГРАММИСТОВ
curfig++;
if (curfig>total_fig) total_fig++;
if (curstad==O) total_fig—;
dispcurstad(curstad) ;
_default();
}
if (c==' q' | | c==' Q' )
{
yangle +-=2 ;
newdi sp () ;
}
if (c=—z a' || c==' A' )
{
yangle-=2;
newdi sp() ;
}
if <c=='o' II c=='O')
{
xangle-="2;
newdisp();
)
if (c==' p' I I c==' P' )
{
xangle+=2;
newdisp();
}
if (c==' c' II c=='C')
{
setcolor (15);
bar(0,0,200,30);
setcolor (0);
bar(32,10, 168,20) ;
setcolor (3) ;
moveto(32,10);
scanf("%d",info[curfig][curang][COLOR]);
newdisp();
}
if (c=-68*256)
{
if (curs tad^O ) total_fig—;
savefigure(name);
restorecrtmode () ;
exit (0);
}
if (c==13)
{
access^O;
if (curstad=-=0)
(
info[curfig][curang][XPLUS]=curx;
info[curfig][curang][YPLUS]=cury;
cu r s t ad’--1 ;
_de fa ult () ;
access=l;
}
if (curstad==l && access==0)
{
info[curfig][curang][RADIUS]=currad;
info [cur fig] [curang] [FROM_NULL]=_curang;
curstad=0;
curangH ;
_de fault() ;
}
newdisp();
}
if (curstad==l) createxyf);
putpoint() ;
}
restorecrtmode() ;
}
Для ускорения вычислений в данной программе ис-
пользованы два файла — sinus.dat и cosinus.dat. Эти фай-
лы представляют собой заранее высчитанные значения
синусов и косинусов углов от 0 до тс*2 с шагом л/180.
Таким образом, в них находятся значения синусов и ко-
синусов углов от 0° до 360°. Эти файлы можно создать с
помощью такой программы:
#include <stdio.h>
#include <math.h>
#include <io.h>
void main(void)
{
int i ;
FILE *fp;
float mas[360];
/* Вычисляем и сохраняем массивы данных */
for (i = 0;i<360;i + + ) mas [i]=sin((float)i/6.283);
fp=fopen("s inus.dat","wb");
write(fileno(fp),mas,sizeof(float)*360);
fclose (fp);
for (i=0;i<360;i + + ) mas[i]=cos((float)i/6.283);
fp=fopen("cosinus.dat","wb");
write(fileno(fp),mas,sizeof(float)*360);
fclose (fp) ;
}
В заключение хочу добавить, что использование функ-
ции puts в графическом режиме не является ошибкой. Она
исполняется через прерывание INT 21 h, которое правиль-
но работает в любом режиме.
А.ДЕШКО,
658302, Россия, Алтайский край,
Поспелихинский р-н, с.Клепечиха.
ДОРАБОТКА
СИНТЕЗАТОРА РЕЧИ
Однажды я увидел в журнале “РЛ” [1] программу “Син-
тезатор речи” для компьютера “ZX-Spectrum”, сразу же
ввел ее в компьютер и проверил. Синтезирование мне
очень понравилось, но “диалог” с пользователем, если
это можно так назвать, сразу не понравился. Недавно я
решил доработать эту программу, чтобы она стала веж-
ливее к пользователю и более информативной. Програм-
ма проверена на компьютере “Дельта-С” (совместимый
с “ZX-Spectrum”).
10 CLEAR 32767: LET К=0
20 FOR N~65050 TO 65109: READ A: POKE N,A
30 LET K=K+A: NEXT N
40 IF KO7936 THEN CLS: PRINT AT 11,8; FLASH 1;
" ERROR IN DATA ": STOP ,
50 POKE 65083,7: LET A=7: CLS: PRINT AT 11,0;
"Press ENTER to start load sound": PAUSE 0: CLS:
PRINT AT 11,10; FLASH 1; " LOAD SOUND ": RANDOMIZE
USR 65050
60 CLS: PRINT AT 10,9;"END LOAD SOUND"; AT 12,8;
FLASH 1;" STOP THE TAPE ": PAUSE 200
70 CLS: PRINT AT 10,1;"PLAY OR CHANGE SPEED OR LOAD
?"; AT 12,4;" (P-Play/C-Change/L-load)": PAUSE 0
80 IF INKEY$ = "P" THEN CLS: PRINT AT 11,10;"MODE : " ;
FLASH 1;" PLAY ": RANDOMIZE USR 65078: CLS: PRINT AT
11,11; FLASH 1;" END PLAY ": PAUSE 125: GO TO 70
90 IF INKEY$="C" THEN CLS: PRINT AT 10,11;"SPEED =
";A; AT 12,6; "MODE:"; FLASH 1;" CHANGE SPEED ":
INPUT "SPEED ? (GHANGE 2 TO 12) :";A: POKE 65083,A:
CLS: PRINT AT 11,11;"SPEED = ";A: PAUSE 100: GO TO 70
100 IF INKEY$="L" THEN CLS: PRINT AT 11,7;"MODE:";
FLASH 1;" LOAD SOUND ": PAUSE 150: GO TO 50
110 GO TO 70
120 DATA 243,33,0,128,6,8,219,254,203,119,32,2
130 DATA 203,254,203,62,16,244,203,14,35,124,254,254
140 DATA 32,234,251,201,243,33,0,128,6,7,203,70,40
150 DATA 4,62,7,211,254,62,255,211,254,203,6,16,240
. 160 DATA 203,6,35,124,254,254,32,230,251,201
11
Радиолюбитель. Ваш компьютер 11/96
Hill
11111
ДИАЛОГ ПРОГРАММИСТОВ
Краткое описание доработанной программы
С ее помощью вы можете записывать в память компь-
ютера 5,3 с звучания музыки, речи и т.п. Затем можно
эту запись воспроизводить с любой скоростью, но к со-
жалению, качество воспроизведения не очень хорошее
(зависит от магнитофона).
До включения компьютера к нему необходимо подклю-
чить магнитофон с записью музыки, речи т.п.
После запуска программы на экране появляется над-
пись: “Press ENTER to start load sound” (нажмите EN-
TER для начала загрузки звука). Нажмите ENTER, и звук
будет загружаться в память компьютера, о чем свидетель-
ствует мигающая надпись: “LOAD SOUND” (загрузка
звука). Если же после запуска на экране появляется ми-
гающая надпись: “ERROR IN DATA” (ошибка в DATA),
еще раз проверьте строки DATA.
После загрузки звука на экране появляются надписи:
“END LOAD SOUND” (конец загрузки звука) и мигаю-
щая “STOP THE ТАРЕ” (остановите магнитофон). Сде-
лайте то, что просит компьютер, и после появления над-
писей через 4 с появятся новые: “PLAY OR CHANGE
SPEED OR LOAD?” (игра, т.е. повтор загруженного зву-
ка, или смена скорости, или загрузка?) и ниже: “(Р-Р1ау/
C-Change/L-Load)”(P-Hrpa/C-CMeHa/L-3arpy3Ka). На-
жмите на одну из предложенных клавиш.
Если вы нажали “Р”, на экране появляется мигающее
“PLAY” (Игра) и звучит загруженный звук. Через 2,5 с
режим можно выбрать заново.
Если вы нажали “С”, на экране появится мигающее
“CHANGE SPEED” (смена скорости), а в самой нижней
строке экрана “SPEED? (CHANGE 2 ТО 12)”: (Скорость?
(Смена от 2 до 12)) и мигающий курсор в виде “?”. Введите
желаемую скорость (от 2 до 12). На самом деле менять ско-
рость можно в более значительных пределах, например от
1 до 50, при этом скорость воспроизведения 1 — очень быс-
трая, а скорость 50 — очень медленная. Нормальной ско-
ростью воспроизведения является 7. Если вы нажали кла-
вишу “L”, на экране появляется мигающее “LOAD SO-
UND” (загрузка звука) и через 3 с вновь “Press ENTER to
start Load Sound” и т.д. При этом скорость воспроизведе-
ния звука опять становится равной 7, в чем можно убедить-
ся, нажав клавишу “С” после загрузки звука.
Литература
1. Солошенко В. Синтезатор речи для ZX-Spectrum//Pa-
диолюбитель. — 1992. — N7. — С. 12.
к.хилько,
г.Минск, СШ 60, 9“Б”кл.
ПРОГРАММА
ФОРМАТИРОВАНИЯ
ЛИСТИНГОВ
ПАСКАЛЬ-ПРОГРАММ
Программа MAKENICE предназначена для формати-
рования исходного текста по стандартам написания про-
грамм, принятым на языке Turbo-Pascal.
Применять данную программу можно в том случае,
если исходный текст программы трудно поддается пони-
манию. В результате работы программы появляется
структурированный файл, который достаточно легко
воспринимается (пример — листинг 2).
Для запуска программы необходимо набрать текст,
приведенный в листинге 3, а затем откомпилировать его
с помощью Turbo-Pascal 7.0.
Полученный в результате .EXE файл следует запускать
из среды MS-DOS с двумя параметрами: первый пара-
метр указывает имя файла с исходным текстом програм-
мы, второй — в какой файл записать полученный текст.
В программе идет последовательный анализ исходно-
го текста. Служебные слова записываются с новой стро-
ки, происходит увеличение пробельного отступа и т.д.
Во время форматирования на экране виден размер обра-
ботанного файла и количество обработанных строк кода.
Внимание: при форматировании текста, который не про-
ходит компиляцию Turbo-Pascal из-за ошибок синтакси-
са, программа, возможно, будет работать неправильно.
Данная программа может подтолкнуть думающего про-
граммиста к созданию алгоритмического языка. Ведь при
компиляции исходного текста на любом языке первой
стадией является синтаксический разбор, а потом уже
построение машинного кода.
Листинг 1. Исходный текст примера в изначальном
виде:
program demol;uses crt;label l;var i,j,c,rnd,pyt:
byte;begin clrscr;write('Max.число для отгад'+
'ывания:');readin(rnd);write(' Max.количество ход' +
'ов :');readln(pyt);randomize;i:=random(rnd)+ 1;
c:=random(pyt)+round(rnd/10)+1;1:write('ваш вари'+
'ант:');Readln(j);if c<>0 then dec(c); if j<i then
writeln(j,' меньше чем надо,попыток:', с) ; if j>i
then writein(j,' больше чем надо,попыток:',с);if
j=i then begin writeln('УГАДАЛ МОЕ ЧИСЛО...'); exit
end; if c=0 then begin writeln('ПРОЛЕТЕЛ... Я заг' +
'адал:',!); exit end; goto 1; end.
Листинг 2. Текст примера после форматирования:
Program Demol;
Uses
crt;
Label
1;
Var
i,j,c,rnd,pyt : byte;
Begin
clrscr;
write('Max.число для отгадывания:') ;
readln(rnd);
write('Max.количество ходов :') ;
readln(pyt) ;
randomize;
i:=random(rnd)+ 1;
c:=random(pyt)+round(rnd/10)+ 1;
1:
write('ваш вариант:') ;
Readln(j);
if c<>0
Then
12
Радиолюбитель. Ваш компьютер 11/96
ДИАЛОГ ПРОГРАММИСТОВ
dec(с);
if j<i
Then
writein (j,' меньше чем надо,попытокс) ;
if j>i
Then
writein(j,' больше чем надо,попыток:', с) ;
if j = i
Then
Begin
writein('УГАДАЛ МОЕ ЧИСЛО...') ;
exit
End ;
if c=0
Then
Begin
writein ('ПРОЛЕТЕЛ ... Я загадал:',!) ;
exit
End ;
goto 1;
End .
Листинг 3. Исходный текст программы MAKENICE:
Program MAKENICE;
Label 1;
Function UpStr (S:String) :String;
Var
I: Byte ;
Begin
For I:=l To Length(S) Do S [ I] :=UpCase(S[I]);
UpStr:=S;
End;
Const
{ ключевые слова, после которых ставится ВВОД и весь }
{ текст смещается на 1 символ вправо }
RICnt = 14 ;
RIArr : Array[1..RICnt ] Of String=(
'Uses','Interface','Implementation' ,'Label',
'Type','Const','Var' , 'Begin' , 'End' , ' Then' ,
'Else','Asm','Record','Object');
Var
P : String ;
S,T,R : String ;
I, J : Byte ;
F : Text ;
0 : Text ;
A : Array[1..200] Of String[10] ;
В : Array[1..200] Of Char ;
C : Word ;
Line : Longlnt ;
Size : Longlnt ;
Begin
WriteLn('Программа для форматирования текстов ' +
'написанных на языке Turbo-Pascal.');
If ParamCount<l Then
Begin
WriteLn('Необходимо 2 параметра:');
WriteLn('Первый: имя файла исходника.');
WriteLn('Второй: имя файла приемника.');
Exit ;
End;
If ParamStr(1)=ParamStr(2) Then
Begin
WriteLn('Ошибка!Имя файла исходника не должно'+
'совпадать с именем файла приемника.');
Exit;
End;
Assign(F,paramstr(1));
Reset (F) ;
Assign(0,paramstr(2));
Rewrite(0);
P: = '' ;
C:=0;
Line:=0;
S i z e : = 0 ;
While NOT Eof(F) Do
Begin
ReadLn(F,S);
Inc(Line);
Inc (Size,Length(S)+2);
If (Line mod 100)=0 Then
Write ('Всего строк:',Line:5,'.Обработанный ' +
'размер(в Kb):',Size div 1024+1,#13);
While Pos(' ;',S)<>0 Do
Delete(S,Pos (' ;',S),1) ;
If S='' Then
Begin
WriteLn(0,S);
Continue
End;
I:=l;
While Length(S)<>I Do
Begin
If s=f' Then Break;
While S[l]=' ' Do Delete (S,1,1);
While S[Length(S)]=' ' Do
Delete(S,Length(S),1);
If S[I]=#39 Then (начало строки=>ищем конец)
For I:=I+1 To Length(S) Do
If S[I]=#39 Then Break;
If S [1]=' {' Then
{начало комментария=>ищем конец)
! For I:=I+1 To Length(S) Do
If S[I]='}' Then Break;
If S [1]=' (' Then
For I:=I+1 To Length(S) Do
If S [1]=')' Then Break;
If S [1]=';' Then
Begin
R:=Copy(S,1,1-1);
Delete (S,1,I);
If R<>" Then WriteLn (0, P+R+' ;');
If 00 Then
If (A[C]='ELSE')or(A[C]='THEN') Then
Begin
Dec(C,1) ;
Delete(P,1,1);
End;
Goto 1;
End;
T;='';
For I:=I To Length(S) Do
If S[I] in [';','
,#39]
Then Break
Else T:=T+S[I];
For J:=l To RICnt Do
If UpStr(T)=UpStr(RIArr[J]) Then
Begin
R:=Copy(S,1,I-1-Length(RIArr[J]));
If RO" Then WriteLn(0,P+R);
If 00 Then
Begin
R:=A[C] ;
If ((R=' CONST' )or(R='TYPE')or(R='VAR')or
(R='LABEL')or(R='USES'))or
((R='BEGIN')and(UpStr(T)='END'))or
((R='ASM')and(UpStr(T)='END'))or
((R='THEN')and(UpStr (T)='ELSE'))or
((R='OBJECT')and(UpStr(T)=' END' ) ) Then
Begin
Delete(P,1,1);
A[C]:='';
Dec(C) ;
End
End;
If S[I] in [' ;','.'] Then R:=S[I]
Else R:=' ';
R:=P+RlArr[J]+' '+R;
WriteLn(0,R);
If C>1 Then
If (UpStr(T)='END')and((A[C]='ELSE')
or(A[C]='THEN')) Then
Begin
Delete(P,1,1);
13
Радиолюбитель. Ваш компьютер 11/96
Illi
ДИАЛОГ ПРОГРАММИСТОВ
Ilin
A[C]:='';
Dec(C) ;
End;
R:=UpStr(T);
If (R='CONST')or(R='TYPE')or(R='VAR')
or(R='LABEL')or(R='USES')or
(R='BEGIN' )or(R='ASM' ) or(R='OBJECT' )
or(R='THEN') or(R='ELSE')Then
Begin
Inc(C);
If 0200 Then Halt;
A[C]:=R;
P:=P+' ';
End;
Delete (S,1, I) ;
Goto 1;
End;
If I=Length(S) Then Break Else Inc(I);
End ;
If SO" Then WriteLn(0,P+S);
End ;
Close(F);
Close(0);
End.
В.МИХАЙЛОВ,
702186, Ташкентская обл.,
Бостанлыкский р-н, п.Чарвак,
Филиал горного садоводства.
ПРОГРАММА “ТАЙМЕР”
ДЛЯ “БК0010-01”
Перед запуском программы выполните:
? CHR (155)
Это переводит компьютер в режим 23x64 символа. В стро-
ках 80... 120 количество пробелов от кавычек до начала таб-
лицы — 24.
10 CLS
20 ? АТ (13,10)"Введите нужное время в минутах"
30 INPUT N
40 IF N=0 THEN END
50 N=N-1
60 CLS
70 0
80 7" J A."
90 2" |мин | сек|"
100 ? " _| 4-"
110 ?" I : |"
120 ? " + + "
1 30 7
140 ? АТ *17,8) "Вы ввели время";N+1;"мин"
150 FOR I=N ТО О STEP -1
160 FOR J=59 ТО О STEP -1
170 FOR J% = 1 TO 50
180 OUT &0177716,64%, 1%
190 OUT &0177716,64%, 0%
200 NEXT J%
210 ? AT (32,5) ; J
22 0 ? AT (26,5) ; I
230 FOR A=1 TO 496
240 NEXT A,J,I
250 ? AT (17,9) "Ваше время вышло!";
260 ? At (17,10) "Нажмите любую клавишу";
270 FOR Х=1 ТО 2
280 FOR J%=1 ТО 20
290 OUT &0177716, 64%, 1%
300 FOR I%==1 ТО X
310 NEXT 1%
320 OUT &0177716,64%, 0%
330 NEXT J%, X
340 IF INKEY$="" THEN 270
350 CLS
360 ? AT (17,10)"Еще засечь (Д/Н)?";
370 I$=INKEY$
380 IF 1$="" THEN 370
390 IF ASC (1$-) =68 THEN 10
400 IF ASC (I$)=100 THEN 10
410 IF ASC (I$)=228 THEN 10
420 IF ASC (I$)=196 THEN 10
430 CLS
440 END
Д.ШПИЛЕВСКИЙ,
г.Минск, БГУИР, I курс,
О ЗАГРУЗКЕ тел. 71-44-02.
РЕЗИДЕНТНЫХ
ПРОГРАММ
В дополнение к моей статье [1] сообщаю следующее.
Программа, на которой я строю объяснение этой техно-
логии, хорошо подходит для иллюстрирования принци-
па работы резидентных программ, но для программы,
предназначенной для реальной задачи, необходимо кое-
что изменить. Самое главное — старый обработчик не
должен быть “повешен” на неиспользуемый вектор, так
как неиспользуемым он является сейчас. А учитывая то,
что выходят все новые и новые версии DOS, кто знает,
сколько он еще таковым пробудет.
Кроме того, различные программы могут сами исполь-
зовать зарезервированные вектора, и если на них попа-
дут обработчики перехваченных прерываний, машина
повиснет. Выход — вызывать старый обработчик не че-
рез неиспользуемый вектор, а через far-переход на ста-
рую процедуру обработки:
cseg segment
assume cs:cseg,ds:cseg,es:cseg,ss:cseg
org lOOh
begin: jmp main
old dd ?
my proc far
- - - - ;проверка повторной загрузки
- - - - ;резидента и новый обработчик
jmp dword ptr cs:[old]
my endp
main proc near
- - - - ;проверка на повторную загрузку
- - - - ;резидента
mov ax,3509h переустановка
int 21h ;векторов
mov word ptr old,bx ;и сохранение
mov word ptr old+2,es ;резидентом
mov ax,2509h
mov dx,offset my ;
int 21h
mov dx,offset main
int 27h ;
main endp
cseg ends
end begin
Литература
1. Шпилевский Д. Технология разработки резидентных
программ на языке Ассемблера//Радиолюбитель. Ваш
компьютер. — 1995. — Сентябрь. — С. 12.
14
Радиолюбитель. Ваш компьютер 11/96
РАБОТАЕМ ГРАМОТНО
imifsgiiiii
А.БУЛОЙЧИК, А.ПАНЕНКО, Р.РЫЖКОВИЧ,
220023, г.Минск, ул.Макаёнка, 12,
Республиканский Центр технического
творчества' учащихся.
ПОДКЛЮЧЕНИЕ
ЦИФРОВОГО
ОСЦИЛЛОГРАФА С9-8
К КОМПЬЮТЕРУ
Осциллограф С9-8 позволяет накапливать данные из-
мерений в цифровом виде, при этом весь диапазон на-
пряжения делится на 256 уровней. Для передачи резуль-
татов в ЭВМ в осциллографе предусмотрен интерфейс
КОП (канал общего пользования).
Интерфейс КОП — аналог шины IEEE-488. Однако ис-
пользование его стандартным способом требует установ-
ки в компьютер специального контроллера — отдельной
платы, которая занимает место и довольно капризна в
работе.
Подробная документация по интерфейсу труднодоступ-
на, и разработка программ требует довольно много вре-
мени. А самое главное — найти контроллер сегодня до-
статочно сложно. Поэтому самый лучший выход из та-
кой ситуации — постараться обойтись без него. Дело в
том, что те функции, которые выполняются аппаратно
контроллером, вполне успешно можно смоделировать
программно с помощью параллельного порта.
Прежде всего, необходимо позаботиться о том, чтобы
параллельный (принтерный) порт компьютера смог при-
нимать данные. Если используется компьютер типа IBM
АТ, прежде всего нужно убедиться, что плата портов вво-
да-вывода соответствует стандарту EPP (enhanced paral-
lel port), т.е. параллельный порт — двунаправленный. В
этом случае направление передачи данных устанавлива-
ется битом 5 порта управления (379h). Если же использу-
ется машина типа ЕС-1841, то изначально порт ввода-
вывода у нее является однонаправленным, и бит 5 не ис-
пользуется. Чтобы исправить этот недостаток конструк-
ции, нужна небольшая переделка.
Суть ее состоит в следующем: вывод Z (1) микросхемы
КР1533ИР23 (положение на плате — К10) отсоединяется от
Рис. 1
КР1533ИР23
К10
D1 D2 D3 D4 D5 D6 D7 D8 С Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Z
КР1533ТМ9
платы и соединя-
ется с выводом Q6
(15) микросхемы
КР1533ТМ9 (пол-
ожение на плате —
Е7, рис.1). Это
позволяет управ-
лять направлени-
ем передачи дан-
ных, переключая
разряд 5 порта уп-
равления принте-
ра (379h).
В обычном со-
стоянии в этом разряде устанавливается “0”, и передача
идет как прежде — от компьютера к внешнему устройст-
ву. Таким образом, работа с принтером не нарушается.
Когда вы засылаете в этот разряд “1”, компьютер начи-
нает принимать данные. Прочитать их можно через порт
данных (378h).
Для работы мы задействуем разряды данных порта для
передачи данных, а разряды управления — для выдачи
управляющих сигналов осциллографу.
В комплекте с осциллографом поставляется кабель для
подключения к контроллеру КОП для ЕС-1841. Разъем
для подключения к компьютеру — такой же как и для
подключения к параллельному порту ЕС-1841 (рис.2), что
значительно облегчает задачу. Однако разводка контак-
тов, конечно же, не совпадает. Вы должны переделать раз-
водку кабеля в соответствии с таблицей. Номера контак-
тов разъема КОП осциллографа С9-8 показаны на рис.З.
Для IBM АТ нужные номера контактов можно опреде-
лить по названиям, приведенным в таблице, используя
схему разъема параллельного порта.
В документации осциллографа описаны два способа об-
мена данными через интерфейс — управление работой ос-
циллографа командами интерфейса КОП, передаваемыми
с компьютера, и просто передача всех данных из осциллог-
рафа в компьютер по нажатию клавиши ТПД на задней па-
нели осциллографа. Для второго способа алгоритм рабо-
ты очень простой — нужно выставить на шине направле-
8 7 1
15
00800000 0000000
Рис. 2
1
Z3
в
А
ние передачи, устано-
вить готовность к при-
ему, после чего нажать
переключатель ТПД.
Осциллограф начина-
ет передавать данные.
Передача одного
байта от осциллогра-
фа (источник) к компь-
ютеру (приемник) вы-
глядит так, как пока-
Сигнал параллельного порта Контакт разъема параллельного порта Контакт разъема осциллографа Сигнал интерфейса КОП
Ground А7...А14 12,14,16,18.20 GND
Data 0 В4 1 DIO1
Data I ВЗ 3 DIO2
Data 2 В2 5 DIO3
Data 3 В! 7 DIO4
Data 4 В6 2 DIO5
Data 5 В7 4 DIO6
Data 6 В8 6 DIO7
Data 7 В9 8 DIO8
BUSY В5 И DAY
SLCT IN ВЮ 21 ATN
AUTO FEED ВИ 13 NRFD
STROBE В12 15 NDAC
INIT В13 17 IFC
PE В15 9 EOI
15
Радиолюбитель. Ваш компьютер 11/96
РАБОТАЕМ ГРАМОТНО
зано на рис.4:
- приемник устанавливает бит NRFD — готовность к
приему данных;
- источник выдает на шину данных байт данных и ус-
танавливает бит DAV — строб данных;
- после того как приемник прочитал данные, он уста-
навливает бит NDAC — данные прочитаны.
В шине IEEE-488 используется негативная логика и
стандартные TTL-схемы с открытым коллектором. Ло-
гический ноль — напряжение +5...2,4 В. Если какое-либо
из устройств устанавливает логическую “1”, эта линия
переходит в состояние 0...0,8 В. Так как некоторые ли-
нии параллельно-
го порта допол-
нительно инвер-
тированы, там
где нужно данные
инвертируются
программно.
Формат переда-
чи данных таков.
Сначала переда-
ется заголовок данных — количество каналов, задержки, ди-
апазон измерений. Затем — сами данные сплошным блоком.
Текущее значение напряжения в каждой точке осциллограм-
мы передается в виде номера уровня (число от 0 до 255).
Программа для приема данных написана на языке Си
использовалась на компьютере ЕС-1841 с переделанным
принтерным портом.
#include <dos.h>
typedef unsigned char byte;
struct
(
float vl,v2; /* напряжение по каналам ★/
float dr; /* период дискретизации ★/
byte chan; /* к-во каналов ★/
byte dat[2048]; /★ данные */
} recvd;
#define mask 0x24
#define coi 0x379
#define coo 0x37A
#define datp 0x378
#define biNRFD 0x02
#define biNDAC 0x01
#define biDAV 0x80
/★ бит управления направлением передачи:
0 - от компьютера, 1 - в компьютер */
float volts [ 10 ]=•{ 0.050, 0.100, 0.200, 0.500,
1.0, 2.0, 5.0, 10.0, 20.0, 50.0};
float diskr[27]={50Е-9, 100Е-9, 200E-9,
500Е-9, 1000Е-9, 2000Е-9
5Е-6, 10Е-6, 20Е-6,
50Е-6, 100Е-6, 200Е-6,
500Е-6, 1000Е-6, 2000Е-6
5Е-3, 10Е-3, 20Е-3,
50Е-3, 100Е-3, 200Е-3,
500Е-3, 1000Е-3, 2000Е-3
5.0, 10 .0, 20.0}
/* приём байта */
byte getbyte(void)
(
byte get;
/★ ожидание строба данных ★/
while (inportb(coi) & biDAV);
/★ получение данных */
get=inportb(datp);
/* сбрасываем готовность к приёму и устанавливаем
бит принятости данных */
outportb(coo,biNDAC I mask);
/* ожидаем сброса строба ★/
while (!(inportb (coi) & biDAV));
/★ устанавливаем готовность к приему ★/
outportb(coo,biNRFD | mask);
return ~get;
}
/★ возвращает 0, если данные приняты,
1 - если ошибка приема ★'/
int getdata(void)
{
byte dat, dat2;
byte oldu; /★ старое значение порта управления ★/
int i,ip,j ;
oldu=inportb(coo);
/★ устанавливаем направление передачи данных
из осциллографа в компьютер
и бит готовности к приёму ★/
outportb(coo,mask | biNRFD);
/* приём заголовка ★/
while (getbyte()!='В') getbyte (); getbyte ();
do
{
ip=0 ;
dat=getbyte();
if (dat<'C' I I dat>'L') goto verr;
switch (dat)
{
case ' C': dat=getbyte();
recvd.vl=volts[(dat & OxOF)];
break;
case 'D': dat=getbyte();
recvd.v2=volts[(dat & OxOF)];
break;
case ’E': dat=getbyte();
dat2=getbyte ();
j=((dat & 0x0F)<<4) | (dat2 & OxOF);
if (j>26) goto verr;
recvd.dr=diskr[j];
break;
case 'F': dat=getbyte();
dat2=getbyte();
j=((dat & OxOF) «4) | (dat2 & OxOF);
switch (j)
{
case 0x00:
case 0x10:
recvd.chan=l ;
break;
case OxOC:
recvd.chan=2 ;
break;
default: goto verr;
}
break;
case 'G': ip=l; break;
case 'H': ip=l; break;
case 'I': ip=3; break;
case 'J': ip=3; break;
case ' K': ip=3; break;
}
for (j=0; j<ip; j++) getbyte();
} while (dat’ =' L');
for (i=0; К2 04 8; i++)
{
recvd.dat[i]=getbyte();
}
outportb(coo,oldu & imask);
return 0;
/* устанавливаем прежнее значение порта управления */
verr: outportb(coo,oldu & Imask);
return 1;
}
Литература
1. Сопряжение датчиков и устройств ввода данных с
компьютерами IBM PC: Пер. с англ./ Под ред. У.Том-
пкинса, Дж.Уэбстера. — М.: Мир. — 1992. — 595 с.
От редакции. При подключении других устройств с интер-
фейсом КОП необходимо иметь в виду, что стандарт IEEE-
488 предусматривает иную чем в отечественной аппаратуре
нумерацию контактов разъема (контакты по верхней сто-
роне ножа нумеруются от 1 до 12, а по нижней — от 13 до
24). Однако геометрическое расположение соответствую-
щих цепей отвечает описанному в статье.
16
Радиолюбитель. Ваш компьютер 11/96
РЕЦЕПТЫ
А.ШАБРОНОВ,
633157, Новосибирская обл.,
Новосибирский р-н, п/о Плотниково.
щей. Ее следует написать на Ассемблере или в машин-
ИЗМЕРЕНИЕ RLC
ЧЕРЕЗ ПРИНТЕРНЫЙ
ПОРТ
В практике радиолюбителей измерение величин RLC
занимает одно из основных мест. Применив функцио-
нальное преобразование величин RLC в частоту и ис-
ных кодах.
Ниже представлена программа на языке FORTH [2], ко-
торая показывает принцип написания ПО для данного
устройства.
В скобках приводятся комментарии.
.( Программа
( примитивы
HEX
CODE GEN1
DX, 378 #, MOV
AL, 3 #, MOV,
AL, DX, OUT,
NEXT END-CODE
пользуя полевые транзисторы, удается измерять RLC
через принтерный порт компьютера без дополнительно-
го источника питания. Выходной мощности порта хва-
тает для работы генератора на КМОП-транзисторах. На
CODE GENO
DX, 378 #, MOV,
AL, 0 #, MOV,
AL, DX, OUT,
NEXT END-CODE
рис.1 представлена схема устройства для измерения RLC
с помощью ЭВМ ЕС-1841, которое подсоединяется к разъ-
ему А04.3 платы ЕС 1841.004 (разъем параллельного пор-
CODE FX?
На транзисторах
VT1, VT2 собран
функциональный
преобразователь на
основе S-эффекта во-
льтамперной харак-
теристики, который
описан в [1]. VT3 ис-
пользуется для согла-
сования генератора
со входом порта. Пи-
тание подается от ли-
ний РЕ, ШДО для генератора и SLCT, ШД1 для схемы
согласования. Считывание информации производится че-
рез линию ACKNLG.
Принцип работы устройства основан на измерении из-
менения частоты генератора при включении в цепь до-
полнительных R, L, С. Частота генератора определяется
в основном индуктивностью L, и ее качественная зави-
симость от активного сопротивления R представлена на
рис.2 (добротность катушек принимаем одинаковой).
Следует помнить, что рис.2 относится только к актив-
ному измеряемому сопротивлению.
Чем больше индуктивность, тем более пологая зависи-
мость и шире измерительный участок.
Точность измерения ограничена предельной частотой
опроса порта принтера (адрес 379 для ЕС-1841 и анало-
гичных ей). Ориентировочно на один опрос требуется
20...30 мкс, поэтому программу на этапе измерения час-
тоты необходимо делать максимально быстродействую-
379 #, MOV,
О #,
О #,
DX
BX
CX
BEGIN,
AL, DX,
AL, 7F #
?Z UNTIL
MOV
MOV
IN,
, CMP,
BEGIN,
AL, DX, IN,
AL, 3F#, CMP
?Z UNTIL,
BEGIN,
BX
AL.
AL.
измерения RLC - принцип )
Форт-Ассемблера )
(16-я система счисления)
(включение генератора)
(адрес порта данных в DX)
(ШДО,1 = 1,1- , в AL)
(установка ШДО,1=1,1)
(окончание описания
(слова включения генератора)
(выключение генератора)
(адрес порта данных в DX)
(ШДО,1=0,0 в AL)
(установка ШДО,1=0,0)
(окончание описания
(слова выключения генератора)
(начало описания измерения
(длительности, 0 0 —> Т+ Т-)
(адрес порта готовности в DX)
(подготовка BX, СХ для)
(накопления Т?^и Т-)
(начало 1-го цикла,
(перепад Т- в Т+)
(опрос порта, 3F —
(7F — вход+, выход
(второму циклу при
(иначе к началу 1-го цикла)
(начало 2-го цикла, ждущего)
(перепад Т+ в Т-, и)
(все аналогично 1-му
(далее синхронизация
(установилась, в 3-м
(цикле накопление Т+
(начало 3-го цикла, измерение,)
(накопление в ВХ, пока вход)
(не равен 7F)
ждущего)
вход-,)
входе =7F)
INC,
DX, IN,
7F #, CMP
UNTIL,
BEGIN
ex
AL
AL.
INC,
DX, IN,
3F #, CMP,
UNTIL,
0 [BP]+, BX, MOV,
2 [BP]+, CX, MOV,
NEXT END-CODE
циклу,)
(окончание 3-го цикла, в)
(ВХ накопилось количество)
(проходов по 3-му циклу, т.е.)
(время пока вход был равен Т-)
(начало 4-го цикла, аналогично)
в СХ время Т+)
(3-му,
DECIMAL
: RLC?
BEGIN 0 0 FX? +
отсчет периода = " . CR
KEY 27 (код ESC-выход) = UNTIL
GEN;
(передача в стек пара-)
(метров результатов)
(окончание описания)
(слова измерения дли-)
(тельности периода генера-)
(тора устройства)
(переход в 10 с.с)
GEN1
Главное слово <RLC?> (в терминах языка FORTH сло-
во — это оператор, подпрограмма, модуль) выполняет в
бесконечном цикле измерения длительности периода час-
тоты генератора.
Конечные же, программу можно улучшить:
- контролировать по внутреннему динамику компьюте-
ра выполнения отсчетов;
- выдавать результаты измерения в виде графика или
гистограммы;
17
Радиолюбитель. Ваш компьютер 11/96
iiiiimiiiii
РЕЦЕПТЫ
- ввести меню и шкалу линейности для различных ин-
дуктивностей и при различных подключаемых измеряе-
мых величинах.
Ориентировочно для измерения активных сопротивлений
в пределах до 30...40 кОм с погрешностью 200...400 Ом тре-
буется индуктивность 1...2 Гн. Автор использовал торои-
дальный трансформатор от малогабаритного сетевого бло-
ка питания мощностью 20...25 Вт.
Возможно применение данной приставки-генератора
и для других целей, например:
- для получения информации о биологически активных
точках человека;
- для изготовления “емкостного реле”: если измеритель-
ные выводы сделать достаточно длинными, устройство
способно фиксировать присутствие или отсутствие опе-
ратора.
За консультацией по более полному программному обес-
печению можно обращаться к автору.
Литература
1. Радио. — 1996. — N5. — С.35.
2. Баранов С.Н., Ноздрунов Н.Р. Язык Форт и его реа-
лизации. — Л.: Машиностроение, 1988.
Г.ТЯПИЧЕВ (UA3XBI),
249400, Калужская обл.,
г.Людиново, ул.Московская, 9 — 50.
ROBOTRON РАБОТАЕТ
С IBM PC
После приобретения IBM PC мне пришлось соединить
этот компьютер с принтером ROBOTRON СМ 6329,
снабженным интерфейсом ИРПР. Думаю, что мой опыт
может пригодиться радиолюбителям.
Мною была разработана программа драйвера
PRNT.SYS, который резидентно располагается в памя-
ти и срабатывает по команде “Печать” от любых тексто-
вых редакторов, от команды copy <filename> PRNИ Дру-
гих программ. Аналогичный драйвер был сделан и для
устройства LPT1. Оба этих драйвера запускаются в ра-
боту соответствующей строкой в файле CONFIG.SYS
(DEVICE=C:\PRNT.SYS И DEVICE=C:\\PLPT.SYS). КаЖДЫЙ
из драйверов поддерживает работу одного принтера с ин-
терфейсом ИРПР через параллельный порт и двух при-
нтеров с интерфейсом RS-232 через последовательные
порты СОМ1 и COM2. При этом на принтере ROBOT-
RON распечатываются как латинские буквы, так и ки-
риллица.
Основой драйвера является подпрограмма согласова-
ния компьютера с принтером, листинг которой представ-
лен ниже. Любители программировать на Ассемблере
IBM PC могут на базе этой программы разработать свои
программы для распечатки различных текстов, либо но-
вые варианты драйверов.
Подключение параллельного порта IBM PC выполня-
ется следующим образом:
1. Все информационные линии LPT1 — DATA0...DA-
TA? (выводы 2...9 разъема LPT1) подсоединяются непос-
редственно к информационным выводам принтера
D0...D7 соответственно номерам линий.
2. Все линии GND (выводы 18...25 разъема LPT1) под-
соединяются к соответствующим линиям Z (нулевым)
принтера.
3. Линия контроля наличия бумаги (вывод 12 разъема
LPT1) может быть подсоединена либо на линию GND
через резистор 300 Ом, либо к выводу А4 принтера.
4. Линия BUSY (вывод И разъема LPT1) подсоединя-
ется непосредственно к линии АС принтера.
5. Линия STROBE (вывод 1 разъема LPT1) у меня под-
соединена к линии SC принтера через повторитель на
цифровых элементах. Можно попробовать обойтись и без
повторителей.
Заинтересованным читателям могу дать письменную
консультацию (при наличии конверта с обратным адресом).
Ниже приведен листинг подпрограммы согласования
IBM PC с принтером ИРПР. На входе: адрес текстовой стоки — в регистре SI, количество знаков в тексте — в регистре СХ.
ВО : PUSH DX Занести регистры и флаги в
PUSH BX стек
PUSH PUSHF CX
MOV DX,0379H ; Проверить готовность принтера
В1 : IN AL ,* DX принять символ
TEST AL,080H Если нет готовности
JE Bl — повторить
MOV AL,[SI] Взять символ из текста
NOT AL Поменять нулевые биты на единичные и наоборот
MOV DX,0378H ; Взять адрес порта
OUT DX,AL Выдать символ в порт
MOV DX,037AH ; Выдать сигнал принтеру для
MOV AL, 01 приема
OUT DX,AL выданного сигнала
В2 : MOV DX,0379H ; Убедиться в приеме
IN AL, DX принтером
TEST AL,08OH символа
JNZ B2 Если нет — повторить
MOV DX,037AH ; Снять сигнал о выдаче
MOV AL, 0 0 символа
OUT DX,AL на принтер
MOV DX,0378H ; Убрать
MOV AL,0FFH символ
OUT DX,AL из порта
POPE Вернуть данные
POP CX флагов
POP BX и
POP DX регистров
INC SI К следующему символу
DEC CX Уменьшить счетчик
CMP CX,00 Проверить, все ли символы распечатаны
JNE BO Если нет — распечатать новый
символ
RET 1 Если все символы распечатаны, ! вернуться в исходную программу
Ищу ПЗУ для принтера D-100 для переделки его на интер-
фейс Centronix и альтернативную кодировку русских букв.
Подойдет файл прошивки ПЗУ от принтера D-100E/PC.
И.РУЦКИЙ,
220095, г.Минск, пр.Рокоссовского, 50 — 25,
тел.238-46-49.
\/
18
Радиолюбитель. Ваш компьютер 11/96
МИР 8 БИТ
С.ПРОХНЕВСКИЙ,
613005, г.Киров, Октябрьский р-н,
с.Русское, ул.Юбилейная, 6 — 15.
АССОЦИАТИВНЫЙ
СОПРОЦЕССОР
Создавая базы данных на восьмиразрядных машинах
типа “Корвет”, “Спектрум”, “Орион”, мне пришлось
столкнуться с резким снижением скорости поиска инфор-
мации при работе на интерпретаторе “Basic”. Особенно
остро эта проблема встала при возрастании объема базы
данных свыше 100 Кб.
Рассмотрим типичный дисковод с диаметром дискеты
5,25 дюйма. Скорость вращения дискеты — 5 об/с, фор-
мат — пять однокилобайтных секторов на дорожку. Опе-
рационная система организует черезсекторный обмен с
диском, т.е. если логические сектора следуют в порядке
1,2, 3, 4, 5, то физические считаются в порядке 1,3, 5, 2, 4.
Для того чтобы подготовиться к считыванию следую-
щего сектора, процессор должен затратить какое-то вре-
мя. Если это время не превышает времени прохода одно-
го сектора, по окончании подготовительных операций
происходит считывание следующего сектора. Если же
время подготовки оказывается больше времени поворо-
та на один сектор, для считывания следующего требует-
ся целый оборот диска.
Теперь рассмотрим фактические затраты времени. Счи-
тывание одного сектора происходит за 1000/(5*5)=40 мс.
При черезсекторном обмене скорость считывания одной
дорожки происходит за два оборота диска, т.е. за
1000/2,5=400 мс. Если время подготовки к считыванию
превышает 40 мс, считывание следующего сектора про-
исходит через 1000/5=200 мс, а вся дорожка считывается
за 6 оборотов диска или за 1,2 с. Таким образом, 100 Кб
файл просматривается за 24 с против 8 при
черезсекторном обмене. На практике дела
обстоят еще хуже. Дело в том, что анализ
одного сектора на языке высокого уровня за-
нимает 3...4 оборота диска, и 24 расчетные
секунды перерастают в 96, а это уже недопус-
тимо по эргономическим соображениям.
Для решения этих и других задач, связан-
ных с информационным поиском, был разработан и ис-
пытан “Ассоциативный сопроцессор” (АС).
АС позволяет вести многоаспектный поиск в проходя-
щем потоке. Максимальная скорость потока — 5 МГц,
разрядность магистрали данных — 8 бит, объем ОЗУ со-
процессора — 2 Кб.
На рис.1 представлена блок-схема устройства. Оно со-
стоит из регистра и ОЗУ ссылок. Искомая последователь-
ность подается на восемь младших адресов. Принцип
работы устройства объясняет табл.1.
Предположим, нам необходимо в базе данных найти сло-
во СПОРТ. Код очередного знака с магистрали данных под-
Табл.1
N блока Код знака (МД) N следующего блока (А8...А10) Признак окончания поиска
000 С 001 0
001 п 010 0
010 о 011 0
он р 100 0
100 т 000 1
з
ается на разряды А0...А7
ОЗУ. Одновременно из
регистра на разряды
А8...А10 подается код
следующего блока. Так
как в регистре первона-
чально записаны нули,
выбранным оказывается блок с нулевым номером. Во все
ячейки ОЗУ, кроме ячейки, определяемой знаками искомой
последовательности, записаны нули. В момент появления
на магистрали кода буквы “С” на шинах D0...D2 ОЗУ по-
является код ссылки на следующий блок, т.е. комбинация
001. В момент снятия кода “С” с магистали этот код запи-
сывается в регистр. Такое движение по цепочке происхо-
дит до тех пор, пока не будет достигнут ее конец, определя-
емый кодом признака окончания поиска. Если в середине
последовательности на магистрали появляется код, отлич-
ный от искомого, происходит срыв с цепочки и переход в
исходную позицию, т.е. к символу “С”.
Принципиальная схема устройства показана на рис.2
и особых пояснений не требует. АС настроен на работу с
микропроцессором КР580ВМ80А, сопряженным с кон-
троллером ПДП КР580ВТ57. Считывание информации
из контроллера дисковода происходит по одному из ка-
налов ПДП. При работе с другими типами компьютеров
узел сопряжения должен быть соответствующим образом
переделан.
В табл.2 приведены режимы работа и сигналы, обес-
печивающие функционирование АС. с
Таол.2
АО WRIO RDIO DACK0 Режимы работы ассоциативного сопроцессора
0 1 0 1 Чтение признака окончания последовательности
1 1 0 1 Инициализация поиска (обнуление DD10)
0 0 1 1 Запись в регистры DD12, DD13
1 0 1 1 Запись в ИМС DD2...DD9
X X 0 0 Поиск по ассоциативному признаку(режнм ПДП)
При программировании АС на многоаспектный поиск
следует придерживаться трех основных правил:
1. В одном и том же блоке не могут находиться два оди-
наковых знака, адресованных к разным блокам.
2. В младшем по счету блоке (во избежание зациклива-
ния) должна происходить адресация к более старшему
блоку.
3. Длина искомой последовательности не должна пре-
вышать восьми байт, что вполне достаточно для боль-
шинства практических приложений.
Ниже приводятся подпрограммы, обеспечивающие ра-
боту данного сопроцессора.
19
Радиолюбитель. Ваш компьютер 11/96
МИР 8 БИТ
Hill
9
DO
D1
D2
D3
D4
D5
D6
D7
9
KI
T
7
2
3
DD1 К555КП14
13
ЛГ
Т
7
T
7
-oEl
!<>ЁТ
AD <-
A1 <-
A2<
A3
A4
A5
A6
A7
БЛКВВ
WRIO
RDIO
DACKO
з
17
BO
B1
B2
B3
S
>E0
D1
D2
D3
D4
AO
A1
A2
A3
11
IT
IT
IT
-DD12 K155TM7
2
T
7
7
13
RG
8
17
17
IT
Q1
Q2
Q3
Q4
B”
9“
KT
ТГ
1Z
16
15
10
9
DD13 K155TM7
2
T
7
7
D1
D2
D3
D4
RG
Q1
Q2
Q3
Q4
16
15
10
9
9
10
11
12
DD14 К155ЛА2
3
DD17.1
DD17.4
0017.3
8_______
0017.2
A_______
8
DD2...DD9 К565РУ2
11
IT
IT
IT
D01
D02
D03
D04
cs
D01
D02
D03
D04
T
DD16.1
2ГП-
DD16.2
pD16.3 ?DD15 4
------KT
RAM
101
I02
I03
IO4
|12
1Z
TZ
TZ
RAM
101
I02
I03
I04
12
IT
1Z
1Z
DD10 K155TM8
13
12"
“7
T
DO
D1
D2
D3
c
R
ТГ
|15
ДО n
Q0<&
01 S
01 <S-
02 4-
Q3<^
DD15.1
DD17.5
J2
DD16.4
11
1Z
12
IT
DD15.2
DD17.6
11
10
11
DD11 К155ЛН6
2
6
DD15.3
DO
D1
D2
-oV1
Q0(£
Q1<£
02
03
1
A
2
8
DD15 К155ЛАЗ
0016 К155ЛЕ1
DD17 К155ЛН1
A0=0 RDIO =0
чтение из DD11
AO=1 RDIO =0
инициализация поиска
(обнуление DD10)
AO=D WdTD =0
запись b RG DD12.DD13
поиск по оссоц.призм.
4
5
6
7
8
9
£
9
Z
T
13 (
5
8
п
> IRQ
Рис. 2
; очистка ОЗУ сопроцессора MVI D,10H ; в разрядах 4-7 адрес следующего блока
MEMZ:PUSH Н WP0:MOV A,M
LXI Н, 0 ; подготовить регистр к работе OUT OBOH записать код последовательности
MZ0:MOV A, L MOV A, D
OUT 0B0H ; записать младший адрес в регистр OUT 0B1H записать адресацию
MOV А,Н ; записать старший адрес в разрядах 0-3 INX H указатель на следующий код
OUT 0В1Н ; и код переадресации в разрядах 4-7 DOR E конец последовательности?
INX Н ; следующий адрес. JZ WP1 ; да
MOV А,Н MVI A,11H ; код инкрементирования
ANI 8 ; все ОЗУ обнулено? ADD D ; сформировать новые адреса
JZ MZ0 ; нет MOV D,A ; поместить в рабочий регистр
POP Н ; восстановить регистр JMP WP0 ; продолжить запись
RET ; выйти из подпрограммы WP1:MVI A,80H ; признак конца посл-ти
; запись поискового слова и инициализация поиска ORA D ; объединить с текущим адресом
; HL — указатель на начало слова OUT 0B1H ; записать признак конца посл-ти
; Е — длина слова (не более 8 символов) POP D
WRPS : PUSH D ; в разрядах 0-3 адрес текущего блока IN RET OOH ; иниализация поиска
20
Радиолюбитель. Ваш компьютер 11/96
iiiiig>iiii
мир а бит
Испытания АС проводились на ЭВМ типа “Радио-86РК”
и показали его высокую эффективность. Испытания про-
ходили в среде ОС СРМ-80 V2.2 совместно с интерпретато-
ром BASIC “Микрон”, приспособленным для работы в дан-
ной ОС. В конце контрольного файла объемом 100 Кб —
была записана уникальная последовательность. Для по-
иска этой последовательности обычными языковыми
средствами потребовалось 2 мин. машинного времени.
После установки данного АС это время сократилось до
10 с. Такое значительное сокращение времени произош-
ло вследствие того, что “неперспективные” сектора сразу
отбрасывались. При этом анализировалось только состоя-
ние бита признака окончания последовательности в порте
ОВОН.
На рис.З изображены алгоритмы поиска информации без
участия сопроцессора и с его применением.
После ввода очередного сектора в алгоритме, изобра-
Рис. 3
(^B~xod~~^
BBecmu новый сектор
Проверить на совпадение
средствами интерпретатора
нет
| ба
СВыхоа) а)
женном на рис.За, сразу идет проверка средствами ин-
терпретатора, что может занимать достаточно много вре-
мени. В алгоритме на рис.36 первичная проверка сводится
к анализу состояния контрольного бита несколькими ко-
мандами, написанными в машинных кодах. Если задан-
ная последовательность не будет найдена, вводится сле-
дующий сектор и поиск продолжается.
Если же в промелькнувшем потоке найдена заданная
последовательность, производится поиск информации с
участием языковых средств. Наличие второго цикла сви-
детельствует о том, что в процессе поиска может возни-
кнуть информационный шум, который отсеивается при
участии центрального процессора.
Наиболее интересным приложением может быть исполь-
зование данного АС при многоаспектном поиске. Рассмот-
рим такую возможность на практическом примере.
Табл.3
лу 1. Обойти создавшуюся ситуацию можно, если букву “О”
в слове ‘ТИЛКО” разместить в блоке номер 6. Таким обра-
зом, код этого слова принимает вид 1 2 3 6 8.
Предположим, нам необходимо отыскать следующие
фамилии: ГИЛКО, ИВАНОВ, ПЕТРОВ, СИДОРОВ,
ДЕМИДОВ, ТИМОФЕЕВ. В сопроцессоре эту информа-
цию можно расположить несколькими различными спо-
собами. Наиболее простой из них — просто записать всю
информацию в сопроцессор. При этом она разместится в
256-байтных секторах в соответствии с табл.З.
Из этой таблицы видно, что в словах “ГИЛКО” и “ИВА-
НОВ” (как и “ПЕТРОВ”) в 4-м блоке есть две буквы “О”,
адресованные к разным блокам, что противоречит прави-
Развивая данную идею и применив специальный алго-
ритм формирования блока поисковых признаков, полу-
чаем табл.4.
Следует отметить, что программировать АС более чем
на восемь поисковых признаков не рекомендуется, так как
это может привести к увеличению информационного шума
и, как следствие, к снижению эффективности работы АС.
В.ТАТУР,
г.Минск, тел.246-86-25.
КОНТРОЛЛЕР НГМД
НА INTEL 8272
(Окончание. Начало в N10/96)
К сожалению, разработанное программное обеспече-
ние не может быть непосредственно перенесено на ПРК
“Орион” из-за существенных аппаратных различий. Ис-
ходя из этого, в качестве программного обеспечения кон-
троллера предлагается исходный текст драйвера, что от-
крывает возможность создания собственного ПО, адек-
ватного имеющейся аппаратуре и поставленной задаче.
Floppy disk controler driver
RS: EQU BASE /основной регистр состояния RS
RIO: EQU BASE+1 /регистр данных RIO
MODE: EQU BASE+2 /регистр управления режимами
/контроллера (DD5)
***** Инициализация контроллера **********
INIT: MVI А,22Н /сброс контроллера
OUT MODE
21
Радиолюбитель. Ваш компьютер 11/96
МИР 8 БИТ
mil
XRA A
INTT: DCR JNZ A INTT
MVI OUT k, 11H MODE ;Етакт = 4 МГц
CALL SSTK /сохранить указ.стека в буфере
MVI CALL LDA CALL LDA CALL k, 3 ODAT SRTHUT ODAT HHLT ODAT ;команда "определить"
CALL RDSO ;чтение состояния прерывания
CALL RDPSW /чтение RS
JMP TRKO /команда TRACKO
ODAT: PUSH PSW /запись байта в контроллер
MVI B, 1FH /с проверкой готовности
ODTT: DCR В
JZ IN RAL JNC POP OUT RET MSTT RS ODTT PSW RIO /на обработку ошибки "зависание"
IDAT: MVI B, 1FH /чтение байта из контроллера
IDTT: DCR В /с проверкой готовности
JZ IN RAL JNC IN RET MSTT RS IDTT RIO /на обработку ошибки "зависание"
SSTK: LXI DAD INX INX SHLD RET H,0 SP H H STACK /сохранить указ.стека в буфере
******** Команда "Инициализация (TRACKO)" ****
TRACKO: CALL SSTK /сохранить указатель стека
TRKO: CALL READY /?готовность накопителя
MVI CALL MVI CALL CALL A, 7 ODAT k, DDS ODAT RDSO /команда 'TRACKO'
RDPSW: : IN CPI RZ AN I CPI RS 80H OCOH OCOH /чтение осн.слова состояния RS
JZ XRA RET RDP A /ошибка завершения
RDP: CALL RDSO /чтение состояния прерывания
JMP MSTCOM /на обработку ошибки /выполнения команды
RDSO: MVI k, 8 /команда "чтение
CALL ODAT /состояния прерывания"
CALL STA IDAT SWW / ST0
* AN I MOV 0D8H C, A
CALL IDAT / ST1
STA AN I ORA RET SWW+1 7FH C /А=0 - успешно, А!=0 - с ошибкой
******** Команда "Позиционирование" **********
POS: CALL SSTK /сохранить указ.стека в буфере
CALL RDPSW /чтение RS
CALL READY /готовность накопителя
MVI CALL LDA MOV k, OFH ODAT HDDD C, A /команда "позиционирование"
LDA DDS
ORA C
CALL ODAT
LDA CLND /текущий цилиндр
CALL ODAT
CALL RDSO
JMP RDPSW /возврат
/с кодом завершения команды
READY:MVI D,OFH /?Готов
RR1: MVI A, 4 /команда "чтение состояния ST3"
CALL ODAT
LDA HDDD
CALL ODAT
CALL IDAT /чтение ST3
MOV В, A
RAL
JC MSTBRK /на обработку
/"неисправность накопителя"
MOV А, В
AN I 20Н /проверка готовности накопителя
RNZ /нормальное завершение
DCR D
JNZ RR1
JMP MSTRDY /на обработку ошибки "не готов"
********** команда "Чтение данных в буфер" ************
RRD: MVI А,26Н /ОАбН -двусторонная операция
LXI D,RRR /режим чтения
JMP RCOM /SEK = 1, SEKK = 9
/ - считывается девять секторов
********** команда "Считывание дорожки" *********
RRDD: MVI А,22Н /0А2Н - двусторонная операция
LXI D,RRR /режим чтения
JMP RCOM
*********** команда "Запись данных из буфера" ******
WRR: MVI k, 05Н /085Н - двусторонная операция
LXI D,WWW /режим записи
JMP RCOM
************ команда "Запись удаленных данных" *****
WDD: MVI к, 09Н /SEK=SEKK=N дефектного сектора
LXI D,WWW
JMP RCOM
************ команда "Сканирование до =" ***********
SCAN: MVI к, 31Н /0В1Н - многодорожечная операция
LXI D,WWW /режим записи данных
JMP RCOM
RCOM: MOV В, А
CALL SSTK /сохранение указателя стека
PUSH D /адрес перехода к программе
/чтения RRR или записи WWW
LDA MFM /режим FM/MFM
RRC
RRC
ORA В
CALL ODAT
LDA HDDD /сторона диска
MOV С, А
LDA DDS /адрес накопителя
ORA С
CALL ODAT
LDA CLND /номер цилиндра
CALL ODAT
MOV к, С
AN I 4
RRC
RRC
CALL ODAT
LDA SEK /начальный сектор
CALL ODAT
LDA N
CALL ODAT
LDA SEKK /конечный сектор, если SEK = SEKK
CALL ODAT / - обработка одного сектора
LDA GPLRW
CALL ODAT
LDA N
ORA А
LDA BYTES /байтов в секторе
22
Радиолюбитель. Ваш компьютер 11/96
Ilin
мир а бит
JZ MV I RDC A, OFFH
RDC: LHLD RDMA ; адрес буфера данных
OUT CDAT
RET
Чтение данных с диска ********
RRR: LX I B,0F0D0H ;0F0H - готовн. выдачи байта
JMP RDCL ;0D0H - норм.заверш.команды
RDCR: IN RIO запись байта в буфер данных
MOV M, A
I NX H
RDCL : IN RS
CMP в ?данные готовы
JZ RDCR
CMP c ?конец чтения
JNZ RDCL
RDCE: MV I C, 7 считывание кодов заверш.команды
LX I D,SWW ; в буфер слов сост.контроллера
RDEE: CALL I DAT
STAX D
INX D
DCR C
JNZ RDEE
RRCE: LXI D,SWW ; проверка корректности
LDAX D завершения
INX D
AN I 0D8H
JNZ MSTSO / на обраб.признака ошибки в ST0
LDAX D
INX D
AN I 7FH
JNZ MSTS1 ; -/- в ST1
LDAX D
INX D
AN I 37H
JNZ MSTS2 ; -/- в ST2
JMP RDPSW ; : возврат с кодом заверш.команды
MSTCOM:DS nn ; Программы расшифровки слов
JMP MST ; состояния ST0...ST2 в целях ;экономии места опущены.Значение
MSTS0 : DS nn ; : битов слов состояния приведено
JMP MST В [1,3].
MSTS1: : DS nn
JMP MST
MSTS2: : DS nn
JMP MST
MSTBRK:LXI H,LMSTB ;ошибка "Неисправен накопитель"
JMP MST
MSTRDY:LXI H,LMSTR ;ошибка "Накопитель не готов"
JMP MST
MSTT: LXI H,LMSTT ;ошибка TIME OUT
MST; CALL PRINT /Для "ОРИОН-128" PRINT=0F818H
LHLD SPHL STACK ;восстановить указатель стека
JMP RDPSW ;вернуться с кодом ошибки
Г ****** * Форматирование цилиндра *********
FRMCL LDA EOT /подготовка данных для
I NR A ;форматирования
MOV В, A
LDA CLND
MOV C, A
LDA HDDD
AN I 4
RRC
RRC
MOV Dz A
LDA N
MOV Ez A
XRA A
INR A
LHLD RDMA
FRR: MOV MZC ; : запись данных в буфер
INX H ;фактор смещения для секторов=1
MOV Mz D
INX H
MOV Mz A
INX H
MOV M, E
INX H
INR A
CMP В
JNZ FRR
FRMT: LDA MFM ;команда "форматировать цилиндр'
RRC
RRC
ORI ODH
CALL ODAT
LDA HDDD
MOV C, A
LDA DDS
ORA C
CALL ODAT
LDA N
CALL ODAT
LDA EOT
CALL ODAT
LDA GPLF
CALL ODAT
MVI A, 0
CALL ODAT
LHLD RDMA
*• * * Запись данных на диск *******
WWW: LXI Bz0B0D0H ;ОВОН - готовн. приема байта,
JMP WDCL ;0D0H - норм.завершение команды
WDCR: MOV A,M /запись байта на диск
OUT RIO
INX H
WDCL: IN RS /?следующий байт
CMP В
JZ WDCR
CMP С ;?завершить команду
JNZ WDCL
JMP RDCE ;считать признаки оконч.команды ; (STO,STI,ST2,C,HZRZN)
DDS: DB 0 ;адрес накопителя
HEAD: DB 2 ;число головок
CYL: DB 80 ;число цилиндров
EOT: DB 9 ;секторов на дорожке
BYTES : DB 512 ;число байтов в секторе
MFM: DB 1 /О-FM, 1-MFM
N: DB 2 ;число байтов в ceKTope=128*2AN
GPLRW : DB 20H /интервал для операций чт./зап.
GPLF: DB ЗОН /интервал для операции форматир
SRTHUT:DB OEFH /SRT-частота шагов,
/HUT-время разгрузки головки
HHLT: DB 31H /время загрузки головки
HDDD: DB 0 /ОН-дорожка 0, 4Н-дорожка 1
SEK: DB 1 /текущей сектор
SEKK: DB 1 /конечный обрабатываемый сектор
CLND: DB 0 /текущий цилиндр
SWW: DS 7 /буфер слов сост.контроллера
STACK : DS 2 /буфер сохранения указателя /стека при входе в драйвер
RDMA: DS 2 /адрес буфера данных
ЛИТЕРАТУРА:
1. Коваленко В.А., Москалевский А.И., Солдатенко Л.М.
Контроллер гибкого магнитного диска КР1810ВГ72А//
Микропроцессорные средства и системы. — 1990. — N1.
— С.7.
2. Щелкунов Н.Н., Дианов А.П. Организация контрол-
леров ГМД//Микропроцессорные средства и системы. —
1990. — N4. — С.70.
3. Микропроцессорный комплект К1810. Структура,
программирование, применение: Справочная книга/Под
ред.Ю.Н.Казаринова. — М: Высшая школа, 1990.
23
Радиолюбитель. Ваш компьютер 11/96
Ilin
Hill
МИР 8 БИТ
© Nemo
NEMO,
194100, С.-Петербург, а/я 213, •
тел.(812) 159-55-69.
КОНТРОЛЛЕР IDE/АТ
ВИНЧЕСТЕРА ДЛЯ
“ZX-SPECTRUM” С
IS DOS
вывода и блокировки обращения соответственно;
- DOS/ — сигнал указывает в логическом “0” обраще-
ния либо к дисковой системе TR DOS, либо к служеб-
ным 16 К памяти. Сигнал используется для устранения
конфликта с системой TR-DOS.
Если вы устанавливаете плату не в KAY-256, рекомен-
дуется использовать разъемы ОНп-КС-23Р, СНП 15-96/140,
СНП14-112/170.
Программная часть — работа с IDE винчестером в среде
IS DOS
Для работы с IDE винчестером необходимы:
- операционная система IS DOS версии 4.0 и выше;
- драйвер IDE винчестера ide+.blk;
- настройщик параметров драйвера idetune.com.
В комплект контроллера входит системная дискета IS DOS,
содержащая сокращенный комплект IS DOS версии 4.0, а
также набор для программной поддержки винчестера.
Контроллер позволяет
подключить к “ZX-SPECT-
RUM” стандартный HDD.
Технические характерис-
тики контроллера:
Тип шины — КАУ-шина;
Ток потребления (акт./
пасс, режимы) — 0,25/0,2 А;
Объем HDD (поддержи-
ваемый ОС) -- 96 Мб;
Тип ОС -- IS DOS;
Интерфейс винчестера —
IDE/AT:l6 бит;
Скорость обмена (TUR-
BO KAY-256) — 0,15 Мб/с.
Устройство выполнено в
виде двунаправленного пе-
рекодировщик а/буфера
восьмиразрядной KAY-
шины в шестнадцатираз-
рядную шину IDE/АТ ус-
тройства, работающего че-
рез плоский кабель. Соот-
ветствующие разъемы —
винчестера и контроллера;
ЦЕПЬ
X2.1
KOHT.
18
28
38
48
D8
01
D2
D6
OS
03
58
68
"78~
88
98
108
118
128
138
148
07
08
DI
D2
D6
D3
D4
ЦЕПЬ
IPAQ/
RD/
UR/
tn/
-1SV
Gt©
158 —
T5g~ -
188
Ж
208
218
ж
248
258
268
276
288
298
388
I0RQ/
RD/
UR/
til/
*SU
GND
♦5U
DOS/
GNO
GNO
__
Al
R2
R3
IQGE/
GND
X2.2
KOHT
1A
2R
3R
4R
SR
6A
7R
8Д
9A
10R
HR
l.?R .
13A
14R
♦SU
QOS/
GND
R0
ST
__A2
A3
ТЖГ7
GNO
08___3
01___4
D2___7
Pl ~ 6
D4__12
05__14
06 1?
D7 18
URH 11,
D4
08
DI
D2
03
D4
05
06
07
RG
Q0
Qi
Q2
Q3
Q4
QS
Q6
Q7
2 HDS
S HD9
6 HDI0
9 HD 11
12 HO12
IS H0I3
16 H0|4
19 HOIS
|O€
SSS
И»23
03
H08 3
H09 4
HO 10 7
H011 6
HQ 12 13
HD13 14
HDI4 Ц
HOIS 18
JOR 11,
RDM 1]
08
DI
02
03
D4
05
06
07
D5
08
01
02
03
Q4
05
06
Q7
RG
S5S
IP22
RES/
R7
ж:
RS
R4
♦SO
GNO
GND 1
DOS/ 2
♦ SU 3
П1/
82 5
R0
RI
А2
>Е2
>Е1
2___D8
5 bi
6 02
3—ST
12__D4
15__DS
16 06
19 P7
ISA —
ТЕЙ~ —
17A —
18A —
та~-
20A —
21A —
те?г—
23A —
24Я_ —
Д$я_-
2GA —
27A —
28А
29R
30А
D1
DC
1S33
ИД7
RES/
R7
A6
AS
R4
_*5U
GND
js
системной KAY-шины материнской платы и контролле-
ра — совпадают поконтактно. Запрещается перестыков-
ка плат, интерфейсов и питающих разъемов при включен-
ном питании. Светодиод Н1 указывает обращение к HDD.
С программной точки зрения устройство представляет
собой массив портов, два из которых являются двунап-
равленными портами передачи данных, остальные — пор-
тами управления HDD. Не рекомендуется обращение к
портам на низком уровне, т.к. это может привести к поте-
ре данных. Все обращения к HDD осуществляются через
ОС IS DOS. При подключении убедитесь в достаточной
мощности источника питания компьютера. Типовое пот-
ребление тока винчестером по 5 В — около 1 А, в режиме
разгона — до 2 А (10...20 с).
Сигналы разъема Х2.1/Х2.2, обозначенные являются
выводами CPU Z80.
Прочие сигналы:
- IORQ/,IOGE/ — сигнал обращения к портам ввода-
0?
06 3 2?
M s g
оз 6|"r
те—Hg
01 0 S
E8L 19ГТГ
10A 1TC.S
BF
sss
АЛ6
02
UR/ 3
Ml/ 6
10RQ/ 5,
Й0
Al
A2
E3
DC
1533
ИД7
88
81
82
83
84
85
86
87
18
HO 7
17 HOG
]g~"№C
IS HO 4
14 HD3
13..ЙМ
12 H01
11 HO0
RES/ о
ГМ
0U/
5
6
Rl
10 RDM
0
1
3 iU-ljEb
Tor
6N0
06.1
A0
BF
88
81
82
83
Aoe RTS
D6.2
BF
12RESET
14 HR2
1Г~ЙЙТ
18 HR0
IDA/
RESET
GND
HD 7
HDS
HOT"
HD9
нБГ~
Н01Э
HD 4
HD||
H03
HOI 2
Нб2
HD13
H01___
HD 14
нов
HOIS
GNO
I OU/
R1 ™
3 1QGE/
♦5U
GHD
SSS
АП5
88
81
82
83
Ь А0
I 81
* R2
- 83
^0Е
R3___Ц
R4___13
IOA-15
♦SV 17
Ей. 19,
♦su
ИА1
HRL
HR 2
CS8
£SJ_
ACT
X1
KOHT.
1
T~
ZTZ
4
5
6
7
8
9
10
11
_Д2_
13
14
IS
"ГТ"
~TT~
~TT~
~20~~
21
IT"
23
24
3Z
26
27
_2fi_
29
38
33
34
36
37
"53*
19
— 18
ЦЕПЬ
RE SEI
GNO
HD7
HD8
HD6
HD9
HDS
HD18
H04
HO) 1
H03
HO 12
HD 2
HO 13
HO!
H014
HD8
HOIS
5ho
KEV
DtlARQ
6n6
10U/
GND
JOR/
GND
IQCHRDY
_A£-
РПАСК
GNO
IRQ
Н1016/
HA1
P01AG/
'~W
HR2
CS0/
ACT1U/
GND
8ид со стороны деталей
контакт имя
•13 D7
’14 DO
•15 D1
•12 D2
•10 D6
•9 D5
•в D3
•7 D4
•20 IOAQ
•21 RD
*22 WR
Ml
+5v
GND
ИМЯ КОНТАКТ
+5v
DOS/ DD3O/1
GNO
GNO
A0 *30
At ‘31
A2 ‘32
A3 *33
iOGE/ DD14/13
GND
•26
•37
•36
*35
•34
+5y
GND
•- «и&од CPU ZBO
24
Радиолюбитель. Ваш компьютер 11/96
Для установки винчестера необходимо:
- загрузить систему IS DOS с прилагаемого диска;
- выбрать количество логических устройств, на кото-
рые вы хотите разделить объем винчестера. При этом
необходимо помнить о том, что максимальный размер
одного устройства в IS DOS — не более 16 Мбайт, а об-
щее количество устройств не должно превышать 6 (вклю-
чая и 2 дисковода, или 8 при использовании специальной
программы выбора устройств choose.res или для версии
IS DOS старше 4.0). Рекомендуемое количество — 3...4.
Это значение должно быть вписано в байт Spectal описа-
теля файла ide+.blk. Для этого установите курсор на этот
файл, нажмите клавишу “6” (Rename), а затем SS+SPA-
СЕ. В открывшемся окне атрибутов найдите Spectal и вве-
дите туда выбранное число логических устройств; выпол-
ните “Save”;
- загрузите драйвер ide.+blk (set ide+.blk или нажмите
ENTER) и вызовите bat-файл memtune.bat. Этот файл
настраивает параметры драйвера, загружаемого в па-
мять, оставляя без изменений файл драйвера на диске,
поэтому его можно использовать без предварительной
настройки параметров.
При загрузке программа настройки пытается выполнить
autodetect винчестера и определить количество головок,
дисков и секторов. Если это не удается, она выводит со-
общение “параметры винта прочитать не удалось” и вы-
ставляет значения по умолчанию (из файла). Если это про-
изошло — не пугайтесь, а просто возьмите значения из
паспорта НЖМД или из справочника. Впишите количес-
тво головок (HD), секторов (SC) и треков (TR) в соответ-
ствующие строки окна параметров. Затем вычислите на-
чальные треки для каждого из ваших устройств. При этом
помните, что хотя устройства А и В “перекрываются”
дисководами, им надо задать “фиктивные” параметры,
повторяющие параметры других устройств. Поясним это
на примере.
Допустим, мы разделяем HDD 20 Мб на 3 устройства раз-
мерами 5 Мб, 10 Мб и 5 Мб. Вычисляем начальную доро-
жку для второго устройства Т2 (для первого — она равна 0):
Т2-(SZ1(Mb)*2048)/SC*HD
где SZ1 — размер 1-го устройства в Мб;
SC — число секторов на дорожке;
HD — число головок винта.
Полученное значение округляем до целого и получаем 301.
Рассчитываем значение ТЗ по формуле:
ТЗ=Т2+(SZ2(Mb)*2048)/SC-О,5*HD
Полученное значение округляем до целого и получаем
451. Таким образом, мы имеем: Т0=0; Т1-301; Т2=451. Впи-
сываем в строки “А'* и “В” Т1 и Т2 соответственно (эти зна-
чения будут “перекрыты” драйвером флоппи-диска), в стро-
ку “С” вписываем значение ТЗ, а далее — в строки “D” и
“Е” — снова Tl, Т2 и т.д. по кругу. Реально действующими
в данном случае будут устройства С, D и Е. Размеры ус-
тройств программа вычисляет автоматически.
По окончании настройки не забудьте выполнить “Save”
для сохранения параметров и выпишите значения объемов
устройств из соответствующих строк;
- создайте на каждом устройстве корневой каталог (про-
грамма create.com) с размером устройства, взятым из про-
мир а бит
граммы-настройщика (графа Size). Устройства надо со-
здавать в режиме NO BOOT, без проверки, каталог луч-
ше сделать сегментированным;
- убедитесь в работоспособности созданных устройств
путем копирования на них каких-либо файлов, после чего
повторите процедуру настройки, использовав файл
fil_tune.bat. В строке меню выпишите значения, которые
вы получили при первоначальной настройке и выполни-
те “Save”. Драйвер настроен;
- впишите в autoexec.bat строку: Q:RES\SET Q:HDD\idat.blk
Теперь вы можете работать с винчестером. Если вы уве-
рены в себе, можете опустить пробную настройку в памяти
mem_tune.bat и настраивать сразу файл fil_tune.bat.
Т.НУГУМАНОВ,
475012, Республика Казахстан,
г.Кокшетау, ул.Сакко и Ванцетти, 201 — 54.
ЕЩЕ РАЗ О РЕМОНТЕ
“ДЕНДИ”
Если в джойстике ТВ-приставки типа “Денди” вышла из
строя микросхема, ее можно заменить отечественной —
К555ИР9. Принципиальная электрическая схема, поясняю-
щая замену, представлена на рис.1. У К555ИР9 (сложный
восьмиразрядный сдвиговый регистр) задействованы:
- восемь входов параллельной загрузки (D0...D7);
- вход управления параллельной загрузкой РЕ;
- вход импульсов сдвига С;
- инверсный выход OUT;
- входы питания микросхемы.
Все кнопки джойстика подключены по одной ко вхо-
дам D0..D7. При нажатой кнопке состояние входа низкое,
при ненажатой — высокое. В режиме основного меню
картриджа через каждые 20 мс (кадровая частота) проис-
ходит параллельная загрузка состояний входов D0...D7
в регистр по единичному импульсу сигнала РЕ (рис.2).
Таким образом код нажатой кнопки или кнопок заносит-
ся в регистр. Далее семь импульсов сдвига С выводят код
25
Радиолюбитель. Ваш компьютер 11/96
МИР 3 вит
и
Временные диаграммы.
Рис. 2
25 75 125 175
25 75 125 175
Входной сигнал РЕ (импульсы
загрузки состояния кнопок, Т=20мс)
—•————-----------------=*- t(мкс)
(ходной сигнал С
^импульсы сддига)
----^Имкс)
1 2 3 4 5 6 7
I I I Выходной сигнал OUT
1 2 3 4 5 6 7 (нажата кнопка ВЫБОР)
Нмкс)
из регистра в процессор, который по полученному числу
определяет нажатие кнопки или кнопок и отрабатывает
его в соответствии с программой.
В режиме основного меню картриджа сигнал РЕ двойной
— через 200 мкс после первого импульса следует второй. В
других режимах сигнал РЕ одиночный, и вместо двух посы-
лок последовательного кода имеется только одна. С процес-
сора сигнал РЕ поступает активным единичным импульсом,
но у К555ИР9 параллельная загрузка происходит при ни-
зком уровне на входе РЕ. Поэтому проинвертируем сигнал
РЕ транзисторным ключом (транзистор КТ315А).
В некоторых моделях “Денди” я обнаружил наличие еще
одного импульса сдвига С, однако это на работу переде-
ланных джойстиков не повлияло. Временные диаграммы
сняты на ТВ-приставке “Сюбор SB-255”. Переделка про-
изводилась навесным монтажом.
Литература
1. Шило В.Л. Популярные цифровые микросхемы:
Справочник. — 2-е изд., испр. — Челябинск: Металлур-
гия, 1989. — 352 с. — (Массовая радиобиблиотека.
Вып.1111).
2. Галкин В.И и др. Полупроводниковые приборы:
Справочник/В.И.Галкин, А.Л.Булычев, П.М.Лямин. —
Мн.: Беларусь, 1994. — 347 с.
Ю.СТЕФАНОВИЧ,
213860, Могилевская обл.,
г.Глуск, ул.Интернациональная, 14.
ОЧИСТКА ОКНА
НА “ZX SPECRUM”
Данная процедура предназначена для очистки любого
окна экрана “ZX-Spectrum” тремя способами. Один из них
— просто очистка окна, а два других — с эффектами, что
неплохо смотрится в программах.
Процедура написана на Ассемблере GENS 4.0.
Кодовый блок после трансляции может располагаться
в любом месте памяти. Вызываться может как из Бейсика,
так и из Ассемблера путем задания прямого адреса проце-
дуры или, как в данном случае, со смещением +4. Если
addr — начальный адрес (CLS-1), то:
call addr+4 — адрес вызова (CLS-2);
call addr+8 — адрес вызова (CLS).
Можно, конечно, сделать и иначе, например так: в какой-
нибудь адрес памяти (AD) засылается номер процедуры и
вызывается по одному адресу (addr). Это можно осуществить
путем написания несложной процедуры типа:
addr LD A, (AD)
СР 0
JR Z, CLS
СР 1
JR Z, CLS1
СР 2
JR Z, CLS2
JR CLS
В этом случае в изначальной программе строки 30...80
удаляются и заменяются новыми.
10 ORG 50000
20 ENT $
21 ; ВЫЗОВ ПРОЦЕДУРЫ CLS С ЭФФЕКТОМ N.1
30 CALL СЕ
4 0 RET
41 ; ВЫЗОВ ПРОЦЕДУРЫ CLS С ЭФФЕКТОМ N.2
50 CALL RND
60 RET
61 , ; ВЫЗОВ ПРОЦЕДУРЫ CLS
70 CALL CLS”
80 RET
81 , ; ОСНОВНАЯ ПРОЦЕДУРА CLS. ЭФФ. N.I
90 ( :е LD DE, (YX) ;B DE ЗАНОСИМ КООРДИНАТЫ
100 LD A, E ;ВЕРХНЕГО ЛЕВОГО УГЛА ОКНА
110 AND 24 /В ЗНАКОМЕСТАХ
120 OR 64 /И РАСЧЕТ АДРЕСА ЛЕВОЙ ВЕРХНЕЙ
130 LD H, A ;ТОЧКИ ОКНА В ЭКРАННОМ ФАЙЛЕ
140 LD A,E
150 AND 7
160 OR A
170 RRA
180 RRA
190 RRA
200 RRA
210 ADD A, D
220 LD L, A ;АДРЕС В HL
230 LD DE,1000 ;АДРЕС НАЧАЛА ТАБЛ.СЛУЧАЙНЫХ
240 PR LD B, 12 ;ЗНАЧЕНИЙ И СЧЕТЧИК ПРОХОДОВ.
250 Ml PUSH BC ;ЗАПОМИНАЕМ СЧЕТЧИК И АДРЕС
260 PUSH HL ;ВЕРХНЕГО БАЙТА
270 LD A, (V) ;ЛИНИЙ ПО ВЫСОТЕ ОКНА
280 LD B, A /В СЧЕТЧИК
290 М2 PUSH BC ;ЗАПОМИНАЕМ СЧЕТЧИК
300 PUSH HL /И АДРЕС
310 LD A, (DL) /ДЛИНА ОКНА В БАЙТАХ
320 LD B, A /ЗАНОСИМ В СЧЕТЧИК
330 М3 LD А,- (DE) /ОБРАБОТКА БАЙТА
340 МС AND (HL) /ЭКРАНА И
350 LD (HL),A /ЗАНОСИМ ОБРАТНО НА ЭКРАН
360 INC DE /УВЕЛИЧЕНИЕ СЧЕТЧИКОВ АДРЕСОВ
370 INC HL
380 DJNZ М3 /ВОЗВРАТ ДЛЯ СЛЕДУЮЩЕГО БАЙТА
390 POP HL /ВОЗВРАТ АДРЕСА НАЧАЛА ЛИНИИ
400 INC H /И ПЕРЕРАСЧЕТ НА
410 LD A, H /СЛЕДУЮЩУЮ ЛИНИЮ
420 AND 7
430 JR NZ,M4
440 LD A, H
450 SUB 8
460 LD H, A
470 LD A, L
480 ADD A, 32
490 LD L, A
500 JR NC,M4
510 LD A, H
520 ADD A, 8
530 LD H, A
540 М4 POP BC /ВОЗВРАТ СЧЕТЧИКА ПО ВЫСОТЕ
550 DJNZ М2 /И ВОЗВРАТ ДЛЯ СЛЕДУЮЩЕЙ ЛИНИИ
26
Радиолюбитель. Ваш компьютер 11/96
Hill
МИР S БИТ
560 LD B, 4 ;ЗАДЕРЖКА ДЛЯ ДОСТИЖЕНИЯ 700 LD A, 175 ; КОМАНДА XOR A
570 М5 HALT ;ЭФФЕКТА 710 LD (MC),A ;ВМЕСТО AND(HL)
580 DJNZ M5 720 CALL Ml ;ВЫЗОВ ОСНОВНОЙ ПРОЦЕДУРЫ
590 POP HL ;ВОЗВРАТ АДРЕСА НАЧАЛА ОКНА И 730 LD A, 166 ;КОМАНДА AND (HL)
600 POP BC ;СЧЕТЧИКА ПРОХОДОВ 740 LD (MC),A ;ВОССТАНАВЛИВАЕМ
610 DJNZ Ml ;В НАЧАЛО, ЕСЛИ НЕ НОЛЬ. 750 RET ;ВЫХОД ИЗ ПРОЦЕДУРЫ
620 RET ;ВЫХОД ИЗ ПРОЦЕДУРЫ 751 ; ПРОЦЕДУРА CLS ДЛЯ ОКНА
630 YX DEFB 2,5 ;КООРД.У,Х ВЕРХ.ЛЕВ.УГЛА ОКНА 760 CLS LD A, 1 ;ОДИН ПРОХОД
640 V DEFB 60 ;ЧИСЛО ЛИНИЙ ПО ВЫСОТЕ В ПИКС. 770 LD (PR+1),A ;ВМЕСТО 12-ТИ
650 DL DEFB 20 ;ШИРИНА ОКНА В ЗНАКОМЕСТАХ 780 LD A, 175 ;КОМАНДА XOR А
651 ;ПРОЦЕДУРА ОЧИСТКИ ОКНА С ЭФФЕКТОМ N.2 790 LD (MC),A ;ВМЕСТО AND (HL)
660 RND LD A, 174 ;ЗАМЕНА КОМАНДЫ AND(HL) 800 CALL CE ;ВЫЗОВ ОСНОВНОЙ ПРОЦЕДУРЫ
670 LD (MC) , A ;КОМАНДОЙ XOR(HL) В ОСНОВНОЙ 810 LD A, 12 ;ВОССТАНАВЛИВАЕМ ЧИСЛО
680 CALL CE ;ПРОЦЕДУРЕ И ЕЕ ВЫЗОВ 820 LD (PR+1),A ;ПРОХОДОВ
681 ; СТРОКИ 690 -720 ОКОНЧАТЕЛЬНО ОЧИЩАЮТ ОКНО И МОГУТ 830 LD A, 166 ;КОМАНДУ AND (HL)
682 ; HE ИСПОЛЬЗОВАТЬСЯ 840 LD (MC),A ;ВОССТАНАВЛИВАЕМ
690 LD В, 1 ;ОДИН ПРОХОД 850 RET ;ВЫХОД ИЗ ПРОЦЕДУРЫ
А.ЗАСТУПНЕВИЧ,
220021, г.Минск, ул.Челюскинцев, 73 — 15,
тел.(017) 242-33-60.
ОБ УДВОЕНИИ
СИМВОЛОВ ПО ВЫСОТЕ
И ШИРИНЕ
cy ADR+35 — количест-
во раз увеличения симво-
ла по вертикали (L2-1).
Листинг 2
Печать символов двойной
Алгоритмы, предложенные
в [1], написаны несколько не-
рационально. Например алго-
ритм расчета адреса экранной
области занимает слишком
много места в памяти (около
36 байт), а это влияет и на быс-
тродействие.
Мой вариант удвоения раз-
мера (листинг 1...3) имеет сле-
дующие особенности:
- программа работает в лю-
бых адресах ОЗУ;
- она более компактна;
- не имеет дефектов печати
на 7-й и 15-й позициях по вер-
тикали.
Но есть один недостаток:
из-за маленького объема про-
цедур не анализируется выход
за границы экранной области,
что, в принципе, может при-
вести к зависанию или непра-
вильной работе Бейсика. Од-
нако если все обращения про-
изводятся правильно, никаких
проблем с этими процедурами
нет. В процедурах использу-
ются такие переменные:
ADR — адрес размещения в
ОЗУ;
ADR+1 — код буквы;
ADR+3 — позиция X — по
горизонтали в знакоместах;
ADR+4 — позиция Y — по вертикали в знакоместах.
В процедуре печати символов двойной высоты по адре-
Листинг 1
Печать символов двойной
высоты
ORG 40000
LD А,О
LD ВС,О
PUSH AF
LD А, В
CALL 3742
LD А, С
ADD A, L
LD L,A
POP AF
PUSH HL
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE, (23606)
ADD HL,DE
EX DE,HL
POP HL
LD B, 8
LI PUSH BC
LD A,(DE)
INC DE
LD C,A
LD B, 2
L2 LD (HL),C
INC H
LD A,H
AND 7
JR NZ,LC
LD A, L
ADD A,32
LD L,A
JR C,LC
LD A,H
SUB 8
LD H,A
LC DJNZ L2
POP BC
DJNZ LI
RET
ширины
LD А,О
LD ВС,О
PUSH AF
LD А, В
CALL 3742
LD А, С
ADD A, L
LD L,A
POP AF
PUSH HL
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE, (23606)
ADD HL,DE
EX DE,HL
POP HL
LD C, 8
L3 PUSH DE
PUSH HL
LD B, 8
LD ,(DE)
LI RLCA
PUSH AF
RL E
RL D
POP AF
RL E
RL D
DJNZ LI
LD (HL),D
INC L
JR NZ,L2
LD A,H
ADD A,8
LD H,A
L2 LD(HL),E
POP HL
POP DE
INC H
INC DE
DEC C
JR NZ,L3
RET
Листинг 3
Печать символов двойной
высоты и ширины
LD А, О
LD ВС,О
PUSH AF
LD А, В
CALL 3742
LD А, С
ADD A, L
LD L,A
POP AF
PUSH HL
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE, (23606)
ADD HL,DE
EX DE,HL
POP HL
LD C, 8
L3 PUSH DE
LD B, 8
LD A,(DE)
LI RLCA
PUSH AF
RL E
RL D
POP AF
RL E
RL D
DJNZ LI
LD B, 2
LA PUSH HL
LD (HL),D
INC L
JR NZ,LC
LD A, 8
ADD A,H
LD H,A
LC LD(HL),E
POP HL
INC H
LD A,H
AND 7
JR NZ,LB
LD A,L
ADD A,32
LD L,A
JR C,LB
LD A,H
SUB 8
CD H,A
LB DJNZ LA
DEC C
JR NZ,L3
RET
Литература
1. Ваш компьютер. — 1996. — N7.
27
Радиолюбитель. Ваш компьютер 11/96
|1П'|п|"1П
КОММУНИКАЦИИ
Patrick Douglas CRISPEN,
Университет Алабама, США,
crispen@campus.mci.net
http://www.ua.edu/~crispen/
CNET — COMPUTER
NETWORK
Описать область деятельности CNet в двух словах до-
статочно сложно. “CNET: The Computer Network” — это
компания информационных технологий, предлагающая
как телевизионные программы, так и “букет” по-настоя-
щему удачных (cool) серверов на World Wide Web. Их спи-
сок включает:
- CNET.COM (http://www.cnet.com/) — ОДНО ИЗ Луч-
ших мест на Web с последними новостями, обзорами про-
дукции и информацией о компьютерах и Интернете;
- SHAREWARE.COM (http : //www . shareware . com/) —
онлайновая библиотека с более чем 190000 программа-
ми (бесплатными и shareware);
- NEWS.COM (http: //www. news. com/) — первая онлай-
новая служба, посвященная новостям компьютерной тех-
нологии;
- SEARCH.COM (http://www.search.com/) — ОГрОМ-
ная коллекция указателей почти на все средства поиска в
Инетернете.
Поскольку CNet так велика — можно провести целый
день на одном из серверов и не просмотреть его пол-
ностью — остановимся на некоторых интересных местах.
Начнем с ее основной Web-страницы:
http://www.cnet.сот/
CNet — бесплатная служба, она получает средства от
рекламодателей. Однако вам необходимо стать “подпис-
чиком”, чтобы получить доступ к некоторым файлам и
услугам. Подписка — бесплатная. Чтобы подписаться,
нажмите на “Join now for FREE” в верхнем левом углу
страницы CNet ИЛИ войдите В http : / /www. cnet. com/Com-
munity/Mservice/registration . html (ДЛЯ ЭТОГО, ОДНакО,
требуется броузер, способный работать с формами блан-
ков).
Главная Web-страница CNet делится на три секции.
Левая часть (желтого цвета) — указатель всех “отделе-
ний” CNet. Средняя часть содержит связи с самыми но-
выми или наиболее популярными статьями и страница-
ми CNet. В дальней, правой части расположены связи со
всем остальным материалом. CNet обновляет свои стра-
ницы почти каждый день, поэтому трудно в точности
описать, что вы найдете, обратившись туда.
Пока рассмотрим, что предлагает CNet, обратившись
к левой (желтой) части страницы. CNet имеет 10 основ-
ных отделений. Главное из них — NEWS (http://
www. news. com/), которое имеет две секции:
- Top stories (http://www.news.com/) — главные новос-
ти;
- CNET Radio (http: //www. news . com/Radio/) — “радио”.
Чтобы уследить за всеми главными новостями послед-
них технологий, может потребоваться все ваше время (в
том числе и рабочее). К счастью, CNet создала “news.com”
— онлайновую службу, целиком посвященную новостям
цифрового мира. News.com содержит 9 секций:
- Front Page (новости первой страницы);
- The Net (об Интернете);
- Computing (о компьютерах и программировании);
- Intranets (о сетевых службах);
- Business (компьютерный бизнес);
- Perspectives (редакционные комментарии);
- Newsmakers (персоналии);
- Rumor Mill (“мельница слухов”).
Информация здесь касается только технологии. Итак,
если вас интересуют последние потрясения в Sybase или
дата выхода Netscape Navigator 4.0 beta — это место как
раз для вас.
Не забыты и те, кто обладает только e-mail доступом.
News.com издает e-mail бюллетень под названием “News-
Dispatch”, для подписки на который надо послать пись-
мо по адресу
listserv@dispatch.cnet.com
с командой
subscribe news-dispatch ВашеИмя ВашаФамилия
в тексте письма, указав ваше реальное имя и фамилию
латинскими буквами.
Но двинемся дальше. “Радио” CNet переносит вас на
страницу, где каждый день предлагаются по три звуко-
вых интервью или аудио-клипа, которые вы можете про-
слушать с помощью своего броузера.
Второе основное отделение CNet — это REVIEWS
(http: //www. cnet. com/Content/Reviews/) — обзоры. ТОЛЬ-
КО об одном этом отделении можно было бы написать
целую статью. REVIEWS имеет 6 секций:
- Hotlist (http://www.cnet.com/Content/Reviews/Hot/) —
“горячий список”, обзоры абсолютно лучших, по мнению
CNet, программ и аппаратуры. “Горячий список” обнов-
ляется каждую пятницу;
- Just in (http://www.cnet.com/Content/Reviews/Hands/)
— самые последние обзоры лучших (а также худших)
компьютерных новинок;
- All Comparisons (http://www.cnet.com/Content/
Reviews/compare/) — сравнительные обзоры (например
Netscape против Internet Explorer; лучший провайдер Ин-
тернет; и т.д.). У автора это самая любимая часть CNet.
Посмотрите сами, и вы увидите почему;
- CD-ROM central (http ://www.cnet.com/Content/Re-
views /Cdcentrai/) — подробные обзоры практически
всех когда-либо выпущенных CD ROM;
- Best of the Web (http://www.cnet.com/Content/
Reviews/Bestofweb/) — обзоры Лучших Web-СерверОВ.
CNet описывает в неделю только пять страниц, поэтому
в обзор попадает только самое исключительное. Не за-
будьте посмотреть и новые обзоры, и архивы прошлых
победителей “Best of the Web”;
- List all (http://www.cnet.com/Content/Reviews/
contents. html) — коллекция обзоров co страниц “Just in”
........ 28
Радиолюбитель. Ваш компьютер 11/96
КОММУНИКАЦИИ
и “All comparisons”.
Следующее отделение CNet, которое мы посетим —
Features (http://www.cnet.com/Content/Features/).
Features (очерки) напоминает небольшой журнал и со-
стоит из четырех секций:
- Techno (http://www.cnet.com/Content/Features/
Techno/) — статьи о самой последней технологии (JAVA,
Megabone, цифровое спутниковое TV, и т.п.);
- How to (http://www.cnet.com/Content/Features/
Howto/) — секреты и советы на любую тему от улучше-
ния Netscape до усовершенствования процессора;
- Digital life (http://www.cnet.com/Content/Features/
Dlife/) — статьи о том, как с помощью всех этих Интер-
нетовских “штучек” улучшить свою реальную жизнь (не
забыли о такой?);
- List all (http://www.cnet.com/Content/Features/
contents.html) — содержание, то есть материал из вы-
шеназванных секций.
Те моменты, когда автор не занят чтением электронной
почты, он старается использовать для игры в “You Don’t
Know Jack” или “Eric’s Ultimate Solitaire” на своем Макин-
тоше, и потому Игровой центр CNet — Gamecenter
(http : / /www. cne t. com/Gamecenter) — ОДНО ИЗ самых ЛЮ-
бимых им мест.
Игровой центр имеет 6 секций (или 7, если считать “List
all”):
- Gaming news (http: //www. cnet. com/Gamecenter/News/).
Эта страница преподносит последние новости о выпуске
компьютерных игр, предстоящих играх, которые еще раз-
рабатываются, и заметки от гигантов игровой програм-
мной индустрии. Вот если бы они могли бы еще сказать,
когда выйдет “Myst 2”...;
- Shoot-OUtS (http: / /www. cnet. com/Gamecenter/Shoot/).
Оказывается, автор не единственный, кто не знает раз-
ницу между “Quake” и “Duke Nukem 3D.” К счастью, ре-
бята из CNet провели сравнительные тесты целой охап-
ки очень похожих между собой компьютерных игр, что-
бы выяснить, какая из них самая лучшая на самом деле;
- Gaming guides (http://www.cnet.com/Gamecenter/
Guide/). Не знаете, как выиграть в игре “Civilization II”?
Заблудились в “Descent”? Тогда эта секция для вас! Стра-
ница игровых руководств дает советы, раскрывает тех-
нику и некоторые обманные штучки, чтобы побеждать в
самых популярных компьютерных играх;
- Exclusives! (http://www.cnet.com/Gamecenter/
Exclusives/). Хотя большая часть Игрового центра пос-
вящена коммерческим играм, эта секция содержит пере-
ходы к самым лучшим бесплатным и shareware-играм для
Макинтоша и PC. У них также есть великолепная стра-
ница “10 величайших игр всех времен”, но автор призна-
ется, что он бойкотирует эту страницу, потому что на ней
не упоминается “Myst”;
- Reviews (http: // WWW . cnet. com/Gamecenter/Reviews / ).
Эта секция содержит подробные обзоры (со снимками эк-
рана) около полусотни игр, наиболее популярных на рын-
ке сегодня;
- Sneak peeks(http://www.cnet.com/Gamecenter/Sneak/).
Здесь можно просмотреть новые игры даже до того как
они будут выпущены для публики.
CNet имеет в своем штате достаточно много очень ува-
жаемых журналистов, и коллекцию их статей можно на-
йти в отделении “Personalities” (http://www.cnet.com/
Content/Voices/). Вот лишь некоторые имена:
- John С.Dvorak (http://www.cnet.com/Content/TV/
Dvorak). Dvorak в CNet — штатный рецензент по самым
“свежевыпеченным” CD ROM, дающий рекомендации,
стоит ли их купить, попробовать или пройти мимо. Что
самое главное — на ei о странице содержится указатель
всех обзоров CD ROM, которые он когда-либо сделал;
- Douglas Rushkoff (http://www.cnet.com/Content/
voices/Rushkoff). Его последняя статья “Internet Imperi-
alism?” посвящена Интернету как международному явле-
нию;
- Christopher Barr (http://www.cnet.com/Content/
Voices/Barr/). Этот журналист иногда может быть слиш-
ком прямолинеен, но честность его ртатей всегда подку-
пает. Если вы хотите отсеять болтовню и узнать правду
о JAVA, cookies, сетевом компьютере за 500 долларов и
о битве Microsoft против Netscape, обратитесь к статьям
Barr’а;
- Rafe Needleman (http://www.cnet.com/content/
voices/Needleman). Здесь вы найдете последние донесе-
ния с линии фронта войны броузеров;
- Movers and shakers (http://www.cnet.com/Content/
voices/Movers/). Эта секция рассказывает о самых инте-
ресных и влиятельных людях, определяющих форму циф-
рового мира. Однако, список этот далеко не полон... Он
не содержит автора этого материала.
Пользоваться CNet удобнее, если входить сразу в сек-
цию какого-нибудь отделения, нежели через домашнюю
страницу этого отделения. По мнению автора, секции
организованы гораздо проще, и там легче ориентировать-
ся.
Информация приводится из “Internet Tourbus” с разре-
шения издателей. Перевод с сокращениями В.Ермоленко.
Рисунок О. Попова.
29
Радиолюбитель. Ваш компьютер 11/96
Illi
у ШКОЛЬНОЙ ДОСКИ
В.УБИЙКОНЬ,
г.Минск, БГУИР, ФИТУиУ, каф.ВМиП,
тел.239-98-56.
ИТЕРАЦИОННЫЕ
МЕТОДЫ РЕШЕНИЯ
СИСТЕМЫ ЛИНЕЙНЫХ
УРАВНЕНИЙ
В данной статье мы рассмотрим итерационные мето-
ды решения системы линейных алгебраических уравне-
ний (СЛАУ) вида:
[А]-х = В (1)
Как уже отмечалось [1], алгоритмы итерационных ме-
тодов решения СЛАУ вида (1) заключаются в следующем:
1. Преобразуем исходную систему (1) к виду:
х = [G] - х + с
(2)
где [G] — преобразованная матрица коэффициентов, по-
лученная из (1), с — преобразованный вектор-столбец.
Методику получения матрицы [G] и вектора с рассмот-
рим на конкретном примере. Пусть дана исходная СЛАУ:
Xj - 2 • х2 + 3 • х3 = О
< 2 • Xj + 5 • х2 - 3 • х3 = 27
3 • X] + 2 • х2 + 6 • х3 = 2
(3)
В данном случае матрица [А] коэффициентов равна
х<0) = 1, х'0)=1, х<°> = 1,... х<°>=1 (6)
Затем по формуле (5) вычисляется новое значение векто-
ра решения х , вычисленное значение вектора решения
х(1) подставляется в правую часть формулы (5) и вычисля-
ется новое уточнение решения (вектор х^2)) и т.д.
Процесс итерации (уточнений) решения для системы (5)
сходится к решению, если выполняются три условия:
|< = тах£ |&,.| <1 а)
1 7=1
Н; =maxf|g,7|<i b)
J / = 1 V/
.... I Л п I ,2
<1 »>
Запись ||g|| в курсе математики называется нормой мат-
рицы [G]. В формуле (7) приведены варианты вычисле-
ния нормы матрицы [G].
Метод простой итерации имеет улучшение, называемое
методом Зейделя. Суть метода Зейделя состоит в том, что
при вычислении очередного уточнения в формулу (2) под-
ставляются уже вычисленные компоненты вектора х :
Дк ) Дк) Дк) _ _
А| , Л2 , ..., , 1 .С .
^K)='i4-4K)+ i ^ДЧ)+с/ (8)
7=1 7='+1
Такое усовершенствование ускоряет сходимость к точ-
ному решению почти в два раза!
В заключение приведу тексты программ [2,3], реализу-
ющие рассмотренные алгоритмы.
и=
1 -2 3
2 5-3
3-2 6
, вектор-столбец
В =
О
27
2
а) Бейсик-программа для решения СЛАУ методом про-
стых итераций:
Выделим из каждого уравнения системы (3) неизвест-
ные Xj (i=1,2,3), преобразовывая систему (3) к виду
Xi = 0 • xj + 2 • х2 + 3 • х3 + О
х2 = 2 • Xj - 4 • х2 + 3 • х3 + 27 >
х3 = -3 • Xj + 2 • х2 - 5 • х3 + 2
(4)
Таким образом после преобразования системы мы по-
лучили преобразованную матрицу [G] вида:
О 2-3
[G] = -2-4 3
-3 2-5
О
и вектор-столбец
27
2
с —
2. После преобразования СЛАУ (1) к виду (2) итераци-
онный процесс нахождения вектора неизвестных х с за-
данием начальных значений вектора х производится по
следующей рекуррентной формуле:
х(к) =[G]i(K'1)+E, к=1,2Д...
Алгоритм использования формулы (5) заключается в
следующем.
Для начала вычислений задаётся начальное приближе-
ние вектора х к вектору решения, например
1 REM МЕТОД ПРОСТЫХ ИТЕРАЦИЙ
10 REM В.П.Дьяконов." СПРАВОЧНИК ....... " 20.06.96
20 REM input п
21 N=3
22 DIM A(N,N),X(N),Z(N)
30 PRINT" input eps":INPUT EPS
31 REM EPS=.0001
33 A(1,1)=4:A(1,2)=.24:A(1,3)=-.O8
34 A (2,1)=9.000001E-02:A(2,2)=3:A(2,3)=-.15
35 A(3,1)=.04:A(3,2)=-.08:A(3,3)=4
40 Z (l)=0:Z(2)=0:Z(3)=0
41 В (1)=8:В(2)=9:В(3)=20
90 ITER=0
91 REM for i=l to n
92 REM input z(i)
93 REM next i
100 K=0
101 FOR 1=1 TO N:X(I)=-B(I)
102 PRINT " итерация=";ITER
110 FOR J=1 TO N :X (I)=X(I)+A(I,J)*Z(J) r
120 NEXT J
121 IF ABS (X (I)/АД, I) ) >=EPS THEN K=1
130 X (I) =Z (I)-X (I)/АД, I)
131 NEXT I
140 FOR 1=1 TO N:Z(I)=X(I):NEXT I
150 ITER=ITER+1:IF K=1 THEN GOTO 100
160 PRINT" ----------------- РЕШЕНИЕ---------"
170 FOR 1=1 TO N
171 PRINT" x[";I;"]=";X[I]
172 NEXT I
30
Радиолюбитель.Ваш компьютер 11/96
Illi
У школьной доски
173 PRINT"================ число итераций=";ITER;
180 END
Ь) Бейсик-программа для решения СЛАУ методом Зей-
деля:
1 REM Метод ЗЕЙДЕЛЯ
10 REM В.П.Дьяконов." СПРАВОЧНИК ........ " 19.09.96
20 REM input п
21 N=3
22 DIM A (N, N) , X (N) , Z (N)
30 PRINT" input eps":INPUT EPS
31 REM EPS=.0001
33 A(1,1)=10:A(1,2)=1:A (1,3) =1
34 A (2,1)=2:A(2,2)=10:A(2,3)=1
35 A (3, 1) =2 : A (3,2) =2 : A (3, 3) =10
40 Z (l)=0:Z (2)=0:Z (3)=0
41 В(1) =12:B(2)=13:В(3)=14
90 ITER=0
91 REM for i=l to n
92 REM input z (i)
93 REM next i
100 K=0
101 FOR 1=1 TO N:X(I)=-B(I)
110 FOR J=1 TO N :X(I)=X(I)+A(I,J)*Z(J)
120 NEXT J
121 IF ABS(X(I)/А(1, I))>=EPS THEN K=1
130 X (I) =Z(I)-X(I)/А (I,I) : Z(I)=X (I)
131 NEXT I
150 ITER=ITER4-1 : IF K=1 THEN GOTO 100
160 PRINT" ------------- РЕШЕНИЕ----------"
170 FOR 1=1 TO N
171 PRINT" x [";!;"]=";X[I]
172 NEXT I
173 PRINT"================ число итераций=";ITER;
180 END
чальных значений векторах. Точность решения (пере-
менная eps) равна 0,000001.
0 1 2.7 0
0 1 2.0 1
X
0 1 4.0 4
xl 0.999564 0.999567 0.999553 0.999552
х2 0.999564 0.999564 0.999556 0.999556
хЗ 1.001304 1.001304 1.001336 1.001336
Количество итераций 207 73 219 206
Обращаем ваше внимание на тот факт, что : исходная
система уравнений ; вида:
X, + х2 +х3 : -3 ’1 1 Г Гз“
< 2 • Xj + х2 + х3 = = 4, [А] = -211 , в= 4 (9)
X] + 3 • х2 +х3= ;5 1 3 1 |_5_
преобразована к эквивалентной системе:
6 • X] + 6 • х2 + 4 • х3 = 16
ч 6 • X] + I Т х2 + 5 • Х3 = 22 , [c]-x = D. где
4 * X] + 5 • х2 + 3 • л-3 = 12
“1 2 11 ГЗ“ Г1б“
5 = [а]гв= 1 13-4 = 22 , (Ю)
1 1 1 5 12
*— —
’1 2 11 "1 1 г "6 6 4‘
МО 113- 2 11 = = 6 11 5
1 1 1 1 3 1 4 5 3
с) Паскаль-программа для решения СЛАУ
методом Зейделя:
program zeidel_l; (* 19.09.96 *)
(* метод Зейделя решения СЛАУ *)
uses crt;
var xl,x2,x3,eps,yl,у2,уЗ,a,b,с:real;
iter:integer;
begin clrscr;
writein (' вводятся начальные значения');
{ xl:=1;x2:=1;хЗ:=1; }
{ xl:=0;x2:=0;хЗ:=0; }
{ xl:=2.7;x2:=2.0;x3:=4.0; }
xl:=l;x2:=0;x3:=4.0;
eps:=0.000001;iter:=0;
repeat iter:=iter-H;
yl:=-x2-0.66666667*x3+2.66666667;
у 2:=-0.5455*yl-0.45458*x3+2;
y3:=-l.333333333*yl-l.66666667*y2+4;
0a:=abs(yl~xl);b:=abs(y2-x2);
0c:=abs(y3-x3);
if a<b then a:=b;
if a<c then a:=c;
xl:=yl;x2:=y2;x3:=y3;
until a<=eps;
writein;writeIn;
write (' ...................... решение .... 4 ' ) ;
writein (' ..................................' ) ;
write(' xl=',xl:6:6,' x2=',x2:6:6 4);
writeln(' 0 x3=',x3:6:6,' iter=',iter:6);
writein (' ======-=============================' ) ;
writein;
repeat until keypressed;
end.
Сравните приведенные в таблице решения, полученные
по программе Zeidel_l .pas в зависимости от заданных на-
В уравнение для вычисления нового значения (перемен-
ная у2) подставляется значение уь вычисленное ранее в про-
грамме, а при вычислении нового значения у3 используют-
ся уже вычисленные ранее значения yj и у2. В этом — суть
метода Зейделя. Попробуйте решить этим методом исход-
ную систему (9) без предварительного преобразования по
формулам (10). Сходимости к решению не будет!
ЛИТЕРАТУРА
1. Радиолюбитель.Ваш компьютер. — 1996. — N9. —
С.31-32.
2. В.П.Дьяконов. Справочник по алгоритмам и про-
граммам на языке Бейсик для персональных ЭВМ. — М.:
Наука, 1987. — С.225-226.
3. В.М.Заварыкин, В.Г.Житомирский, М.П.Лапчик.
Численные методы. — М.: Просвещение, 1990. — 174 с.
ДОМАШНЕЕ ЗАДАНИЕ
Продолжаем публикацию задач олимпиад по информати-
ке и вычислительной технике г.Ленинграда.
Первые 3 задачи приведены в “РЛ. Ваш компьютер”
N10/96, с. 34.
Задача 4
Даны числа Xl,Y1;X2,Y2;X3,Y3 — координаты трех
каких-то вершин четырехугольника в прямоугольной
системе координат. Вычислить и напечатать координа-
ты четвертой вершины.
31
Радиолюбитель. Ваш компьютер 11/96
Hill
У школьной доски
Задача 5
Соревнования по прыжкам в высоту проводились по
следующим правилам. Если спортсмен сбивал планку, он
выбывал из дальнейшей борьбы, в противном случае —
становился в конец очереди. Известно, что: спортсменов
было N; сначала они прыгали в порядке своих номеров
от 1 до N; между двумя последовательными неудачами
каждый раз было М удачных прыжков; последним сбил
планку спортсмен с номером Т. Напечатайте номера пры-
гунов в том порядке, в котором они сбивали планку. (При-
мер: если N = 10, М=3, Т=8, должны быть напечатаны
числа?, 1,5, 10,6,3,2, 4,9, 8).
Задача 6
Трамвайные билеты имеют номера из шести цифр от
000000 до 999999. Билет называется “счастливым”, если сум-
ма 1-й, 3-й и 5-й цифр равна сумме 2-й, 4-й и 6-й цифр. Вы-
числить и напечатать количество “счастливых” билетов.
Задача 7
Дано положительное целое число К и К целых чисел
А(1), ..., А(К). Вычислить наибольшее возможное значе-
ние суммы S(M,N)=A(M)+A(M + l)+...+A(N-l)+A(N), где
1<M<N<K.
Примечание', число К столь велико, что числа А(1), А(2),
..., А(К) занимают примерно одну пятую памяти, отво-
димой для хранения данных, а на выполнение К2 даже
простейших операций не хватает времени.
МОДИФИКАЦИЯ. Дано положительное целое число
К и К целых чисел А(1),...,А(К), сумма которых равна 0.
Числа были написаны по кругу. Вычислить максималь-
ное значение суммы стоящих подряд чисел.
Задача 8
Устройство вывода вашей ЭВМ печатает на странице N
строк, состоящих из М символов. Расстояние между цен-
трами соседних символов составляет: по горизонтали — Н
единиц длины, по вертикали — V единиц. Начало коорди-
нат находится в центре страницы. “Нарисовать” символом
* две окружности с центрами в точках с координатами
X1,Y1 и X2,Y2 и радиусами соответственно R1 и R2.
Примечание: если окружности не умещаются целиком
на странице, “рисовать” надо только те их части, кото-
рые умещаются.
Задача 9
Из листа клетчатой бумаги размером M*N клеток уда-
лили некоторые клетки. На сколько кусков распадется
оставшаяся часть листа?
Пример: если из шахматной доски удалить все клетки од-
ного цвета, то оставшаяся часть распадется на 32 куска.
МОДИФИКАЦИЯ. То же, но перед удалением клеток
лист склеили в цилиндр высотой N.
Задача 10
а) Имеется N карточек. На каждой стороне каждой кар-
точки написано одно целое число. Известно, что каждое
из чисел 1, ...,N встречается на карточках дважды. Тре-
буется узнать, можно ли карточки выложить так, чтобы
32
Радиолюбитель.Ваш компьютер 11/96
каждое из чисел I, ...,N было на верхней стороне одной
из карточек; если можно, то указать для каждой карточ-
ки, как ее класть.
б) Имеется N тетраэдров. На каждой грани каждого
тетраэдра написано одно целое число. Известно, что каж-
дое из чисел 1, ...,N встречается на тетраэдрах четыре раза.
Требуется узнать, можно ли поставить тетраэдры на стол
так, чтобы каждое из чисел 1,...,N встречалось на верх-
них гранях трижды; если можно, то указать для каждого
тетраэдра, как его ставить.
Задача 11
а) На клетчатой бумаге нарисовали окружность целого
радиуса R с центром на пересечении линий. Найти К —
количество клеток, целиком лежащих в этой окружности.
Пример: если R=5, то К=60.
б) трехмерное пространство разбито на кубики с ребром
длины 1. Сколько из них помещается в сфере радиуса R,
центр которой находится в вершине одного из кубиков?
Пример: в сфере радиуса 3 помещается 56 кубиков.
Задача 12
а) Дана конечная последовательность, состоящая из
левых и правых круглых скобок. Узнать, можно ли доба-
вить в нее цифры и знаки арифметических действий, так
чтобы получилось правильное арифметическое выраже-
ние.
б) Дана конечная последовательность, состоящая из
левых и правых круглых и квадратных скобок. Узнать,
можно ли добавить в нее цифры и знаки арифметических
действий, так чтобы получилось правильное арифмети-
ческое выражение.
Задача 13
На прямой окрасили N отрезков. Известны координа-
та L[I] левого конца I-го отрезка и координата R[I] пра-
вого конца I-го отрезка для 1=1 Найти сумму длин
всех частей прямой.
Примечание: число N столь велико, что на выполнение
N*N даже простейших операций не хватит времени.
МОДИФИКАЦИЯ. На окружности окрасили N дуг.
Известны угловая координата L[I] начала и R[I] конца 1-ой
дуги (от начала к концу двигались, закрашивая дугу про-
тив часовой стрелки). Какая доля окружности окрашена?
Задача 14
Дана последовательность из N целых чисел, среди ко-
торых нет двух одинаковых. Требуется вычеркнуть ми-
нимально возможное количество чисел, так чтобы остав-
шиеся шли в порядке возрастания. На печать следует
выдать К — количество оставшихся чисел и сами числа в
порядке их следования.
Примечание: число N столь велико, что на выполнение
N*N даже простейших операций не хватит времени.
МОДИФИКАЦИЯ. Даны N положительных целых
чисел, которые не делятся ни на какие простые числа,
кроме 2 и 3. Требуется выбросить минимально возмож-
ное количество чисел, так чтобы из любых двух остав-
шихся одно делилось на другое.
игротека
С.РЮМИК,
250033, г.Чернигов-33, а/я 1772.
КОЛЛЕКЦИОНЕРУ
КОМПЬЮТЕРНЫХ
ЭКРАНОВ
В душе каждый из нас коллекционер. Страсть к соби-
рательству рождается у человека с детства. Марки, знач-
ки, монеты, плакаты — редкий человек не прошел через
эти увлечения.
Радиолюбительское коллекционирование специфично:
кто собирает старинные радиоприемники, кто — подшив-
ки радиолюбительских журналов, кто — компьютерные
программы.
Термин “коллекция” произошел от латинского “COL-
LECTIO” — собирание, и предполагает накопление, сис-
тематизацию и изучение объектов коллекционирования.
Возьмем, к пример, компьютерную тематику. Отечествен-
ные радиолюбительские компьютеры ведут отсчет от “Мик-
ро-80”, далее, с различными модификациями — “Радио-
86РК”, “Специалист”, “Орион-128”, “ZX-Spectrum”.
Тем, кто самостоятельно собрал хоть один из этих
компьютеров, знакомо чувство сожаления, когда прихо-
дит время расставаться с одной машиной и осваивать
другую, более мощную и перспективную. От прежней
модели остаются либо воспоминания, либо красиво сде-
ланная конструкция, которую через годы можно будет
не без гордости показать внукам.
“ZX-Spectrum’’-совместимые компьютеры имеют шанс
оставить после себя “нерукотворный памятник” благо-
даря развитому программному обеспечению. Действи-
тельно, наработать за десяток лет около 10 тысяч единиц
программного продукта — неплохой показатель.
Вот тут-то и открывается поле деятельности для кол-
лекционера. Первое, что напрашивается — это попытать-
ся собрать все игровые и прикладные программы для
“ZX-Spectrum”. Однако представить себе коллекцию из
500...700 кассет или дискет довольно трудно, да и особой
ценности такое собрание не представляет. Надо признать,
что игры для “ZX-Spectrum” образца 80-х годов стояли у
истоков самого жанра компьютерных развлечений и слу-
жили лишь полигоном для обкатки идей различных иг-
ровых направлений: ARCADE, ADVENTURE, STRATE-
GY, SIMULATORS, MANAGEMENT и др.
Следствием этого стала известная “жесткость” диало-
га человека с компьютером — минимум сервиса и мак-
симум наказания за малейшую провинность. Плюс к тому
— низкая “играбельность” программ и многочисленные
повторы сюжетов. Аналогичная ситуация — с большин-
ством прикладных программ.
Но вот фирменные графические заставки к “Спектру-
мовским” играм как правило прорисованы художника-
ми-профессионалами и вызывают только восхищение.
Часто сама программа не ахти какая, а от экрана не от-
ведешь глаз.
Напрашивается идея — составить коллекцию компьютер-
ных экранов для “ZX-Spectrum” — это и память о домаш-
нем компьютере, и эстетическое удовлетворение, и пред-
мет для изучения продукции разных фирм-производителей.
ПРЕДМЕТ КОЛЛЕКЦИОНИРОВАНИЯ
После того как определена цель коллекционирования,
необходимо выбрать носитель хранения информации и
оценить физический объем размещения коллекции. Пос-
леднее обстоятельство немаловажно в условиях ограни-
ченного домашнего пространства.
Для архивации и тиражирования подойдут носители на
магнитной основе — винчестеры, дискеты, магнитофон-
ные кассеты.
Преимущество винчестеров неоспоримо с точки зрения
минимальных габаритов и быстроты поиска информации.
Однако редкий “ZX-Spectrum’’-совместимый компьютер
обладает интерфейсом подключения винчестера и програм-
мной поддержкой дискового пространства.
Коллекция экранов на магнитофонных кассетах имеет
следующие недостатки: большой физический объем,
сложность оперативного поиска информации, ненадеж-
ность длительного хранения данных.
Дискетный вариант коллекции является компромис-
сным со всех точек зрения и при наличии дискового ин-
33
Радиолюбитель. Ваш компьютер 11/96
||||<ЕЗ«'|||
ИГРОТЕКА
терфейса TR-DOS (IS DOS) может считаться оптимальным
решением. Немаловажен и тот факт, что многие програм-
мы выпуска последних лет распространяются исключи-
тельно на дискетах.
Однако иметь коллекцию компьютерных экранов толь-
ко для просмотра на телевизоре или мониторе — не со-
всем удобно. Больше впечатлений остается от альбомов
с HARD COPY — “твердой” распечаткой экранов на
принтере. Разработчики периферии для “ZX-Spectrum”
предусмотрели вариант вывода цветных картинок. Для
этого используются принтеры типа SEICOSHA GP-700,
Microline 80 и 82, CGP115, МСР40, МСР80, SCP80, под-
ключенные к интерфейсу “ZX-LPRINT-III Interface” фир-
мы EUROELECTRONICS или к его радиолюбительской
копии [1]. Причем для модели SEICOSHA GP-700 коман-
да COPY работает в полном цвете, а для остальных — в
четырехцветном варианте.
Реалии сегодняшней жизни таковы, что на практике цве-
товую палитру проще передать черно-белой штриховкой
на широко распространенных матричных 8-игольчатых
принтерах. Программная поддержка графических редакто-
ров типа “ARTSTUDIO” (ОСР, 1985), “THE ARTIST-П”
(Softtechnics, 1986) позволяет печатать полутоновые изобра-
жения GREY DUMP увеличенного формата 2x2 или 3x3.
Универсальный драйвер печати SCREEN MANAGER
(С.Ханцис, Ижевск, 1994) имеет еще более широкие возмож-
ности полутоновой графики, вплоть до задания любой
штриховки для каждого цветового оттенка.
В операционной системе IS DOS также имеются мощ-
ные средства печати картинок различного масштаба,
включая полутоновые градации.
Однако за красоту приходится платить увеличением фи-
зического объема коллекции. Известно, что изображение в
“ZX-Spectrum” формируется матрицей 192 х 256 точек, и
если отпечатать на принтере нормальный (1x1) черно-бе-
лый экран, все единичные пикселы независимо от цвета
будут выглядеть черными точками, а нулевые пикселы —
белым фоном.
В дальнейших рассуждениях применяются специальные
термины, требующие пояснения. Полиграфисты США,
Канады и некоторых других стран размеры шрифтов тра-
диционно обозначают в единицах, именуемых пунктами.
Согласно стандарту, в дюйме (1 дюйм = 2,54 см) уклады-
вается 72 пункта.
Расстояние между иглами печатающей головки матрич-
ного принтера составляет ровно 1 пункт или 1/72 дюйма.
Нетрудно подсчитать, что размер экрана 1 х 1 при печа-
ти с одинаковой плотностью по горизонтали и вертика-
ли (72 точки/дюйм х 72 точки/дюйм) составляет 67 х 90
мм. Для экрана, увеличенного в 2 раза — 134 х 180 мм, в
3 раза — 201 х 270 мм.
Если коллекцию компьютерных экранов разместить на
стандартных листах формата А4 (210 х 298 мм), то с двух
сторон должно поместиться 6...8 нормальных экранов, 4 —
увеличенных в 2 раза и только 2 — увеличенных в 3 раза.
Рисунки 1 х 1 плохо поддаются полутоновой штрихов-
ке. Тонкие цветные линии и надписи однозначно оказы-
ваются белыми или черными. Распечатывать напрямую
такие экраны без предварительной обработки не реко-
34
Радиолюбитель. Ваш компьютер 11/96
мендуется. Проведите простой эксперимент с Бейсик-
программой (листинг I).
Листинг 1 '
10 REM *NO COLOR SCREEN*
20 LOAD ""SCREENS : FOR a-22528 TO 23295
30 POKE a,56: NEXT a: BEEP 1,1
40 IF INKEY$="" THEN GO TO 40
50 CLS : GO TO 20__________________________________
Загрузите на выбор несколько экранов игровых про-
грамм и посмотрите, что произойдет с рисунком При сня-
тии цвета. Именно такое изображение — резкое, с квад-
ратными окантовками, часто инверсное — и будет отпе-
чатано на принтере в режиме 1x1. Для настоящей кол-
лекции иметь такие экраны без предварительной обра-
ботки неприемлемо.
Рисунок 3x3 позволяет иметь полноценную 8-цветную
штриховку, хотя по размеру он больше соответствует
плакатному жанру. Два минуса снижают его шансы -
разрастание объема коллекции и печать боком вдоль
листа с неудобным обозрением в альбоме.
В этом случае рисунок 2x2 близок к золотой середине.
Поэтому в качестве основы коллекции компьютерных эк
ранов предлагается выбирать размеры 1 х 1 и 2 х 2 на лис-
тах формата А4 с предварительной графической обработ-
кой изображения. Это не догма, более того, включение в
коллекцию в обоснованных случаях экранов 3x3 только
разнообразит общее впечатление.
ПРИНЦИП КОЛЛЕКЦИОНИРОВАНИЯ
Коллекционирование, в отличие от простого собиратель
ства, предполагает соблюдение определенных принципов
и канонов. Применительно к теме компьютерных экранов
коллекционер должен определить для себя следующее.
Во-первых — выбрать направление коллекционирова-
ния, т.е. можно собирать абсолютно все экраны (пример
но 10000 шт. [2]); можно — только игровые (7000...8000 шт)
или прикладные (2000...3000 шт.); можно для каждой шры
собирать 2 картинки - экранную заставку плюс один
игровой экран; можно ограничиться определенными
жанрами, например текстовые ADVENTURE или музы-
кальные программы для AY3-8910/12 и т.д.
Во-вторых — выбрать способ хранения информации.
Hln^nlll
Магнитофонные кассеты могут служить средством вре-
менного хранения или для пересылки по почте. Архива-
ция коллекции на дискетах позволяет в будущем перене-
сти изображение через программу-эмулятор на другой
компьютер. Если это IBM-машина с цветным принтером,
то проблема хранения коллекции на винчестере, а также
проблема получения цветных рисунков будет сразу же
решена. Возможной окажется печать на лазерном черно-
белом принтере или на матричном 24-игольчатом. Из
этого следует, что начинать коллекционирование мож-
но даже без принтера, подключенного к “ZX-Spectrum”.
Физический объем дискетной коллекции 10000 экранов
(67 Мб) с учетом компрессии составляет 40...50 дискет.
Предпочтение в хранении следует отдать системе IS DOS,
которая не накладывает жестких ограничений на коли-
чество (128) файлов на дискете, как в TR-DOS.
В-третьих — выбрать размер “твердой” копии. Пол-
ная коллекция 10000 экранов с распечаткой на 8-иголь-
чатом принтере в масштабе 2x2 займет примерно 12 па-
пок для дипломных проектов.
Если перейти на полутоновую печать лазерным принте-
ром в масштабе 1x1, объем коллекции можно уменьшить в
1,5...2 раза при повышении качества изображения.
Нельзя также забывать о главных канонах коллекцио-
нирования — “чистота” коллекции (стремиться для лю-
бой игры получить фирменный, а не хакерский экран);
защита авторских прав (на экранных заставках не дори-
совывать и не стирать надписи типа “Дупанов Алексей
был здесь”, даже если очень хочется); использование раз-
личных каталогов и сборников описаний игр [3], состав-
ление картотеки коллекции (любая фирменная или само-
дельная “электронная” картотека на любом компьюте-
ре, для “ZX-Spectrum” — программы Masterfile, VU-File);
активный обмен информацией с коллекционерами (чес-
тность и порядочность в переписке).
Используя обмен, можно сформировать солидную кол-
лекцию даже из начальной сотни экранных файлов.
ВИДЫ ЭКРАННЫХ ИЗОБРАЖЕНИЙ
Как известно, в компьютере “ZX-Spectrum” для вывода
изображения используется экранная область памяти
(#4000...#57FF) объемом 6144 байтов и область цветовых
атрибутов (#5800...#5AFF) объемом 768 байтов. В итоге
полный или, по-другому, стандартный экран занимает 6912
байтов с начальным адресом расположения #4000 (16384).
Первая задача, которая стоит перед коллекционером
— это из каждой программы получить экранную картин-
ку в виде стандартного файла. Следует различать поня-
тия “начальное изображение”, “экранная заставка”, “ти-
тульный экран” и “игровая картинка”.
Типовая структура игровой программы для “ZX-Spect-
rum” включает 3 основных блока: начальный Бейсик-загруз-
чик, экранный файл и основной кодовый файл (рис.1).
Бейсик-загрузчик обычно формирует текстовые и не-
сложные графические изображения с надписями типа
Name Type Start Lenght
KRION в 10 237
krion$ с 16384 6912
РИС. 1 krion с 30000 32000
ИГРОТЕКА
“’’QUICKSILVA presents”, “Cracked by Bill Gilbert” и т.д.
Это относится к понятию “начальное изображение”.
Далее идет загрузка “экранной заставки”, где изображе-
на как правило запоминающаяся картинка с фирменным
знаком и прорисовкой сюжета игры. Можно предположить,
что “экранная заставка” первоначально задумывалась как
средство, помогающее скрасить томительное ожидание
ввода основного кодового блока с магнитофона. С течени-
ем времени оказалось, что эта художественная миниатюра
незаменима в рекламе игровых программ. Броская картин-
ка и красивое описание сюжета — вот предпосылка успеш-
ной реализации программного продукта.
В конце загрузки основного кодового блока “экранная
заставка” сменяется “титульным (начальным, исходным)
экраном”, на котором указано меню выбора функций и
вспомогательная информация, часто оформленная в виде
бегущей строки.
“Игровая картинка” — это моментальная фотография
какого-либо фрагмента самой игры.
Из рассмотренных вариантов изображения лишь “экран-
ная заставка” может являться полноценным предметом
коллекционирования. Однако очень часто программы по-
падают к пользователю в исковерканном хакерами виде —
без экранного файла или с экраном от другой программы,
или вообще только с начальным сообщением.
В этом случае коллекционер должен сам определить, на
какой картинке содержится наиболее полная информация.
Такой экранный файл следует оставить в коллекции на вре-
менное хранение до приобретения полноценного экрана.
Может случиться, что “экранной заставки” или “ти-
тульного экрана” как таковых в программе вообще нет.
Выбирать не приходится, лучше иметь хоть какую-нибудь
картинку на память об игре, чем вообще никакой.
В любом случае желательно, чтобы на компьютерном
экране было полное название программы, сведения об
авторах (фирме) и дате выпуска.
Небольшой нюанс: для фирменной продукции доста-
точно иметь полное название программы, остальные све-
дения можно почерпнуть из каталогов. Для нефирмен-
ной продукции, а также при отсутствии на экране назва-
ния программы, авторских прав, года выпуска необхо-
димо провести дополнительные исследования. Недоста-
ющие сведения можно найти в титрах титульного экра-
на, внутри Бейсик-загрузчиков и кодовых файлов.
Особый интерес представляют случаи, когда для одной
программы имеются два чуть-чуть отличающихся экра-
на. Какой из них оставить в коллекции?
Вот характерные случаи.
BOULDER-3: на одном из двух экранов, кроме всего
прочего, указан год выпуска программы (1986); одноз-
начно, этот экран для коллекции более приемлем.
TRANTOR: в правом нижнем углу инициалы хакера
— в одном случае “Nik.В”, в другом — “DISKED
N.R.’9O"; в коллекцию попадет экран, в котором хакерс-
кая надпись занимает меньшую площадь.
FREDDY HARDEST: на одном из экранов имеется над-
пись “J.CUBEDO”; однако это фамилия не автора, а хаке-
ра, т.к. надпись несколько закрывает подбородок героя; в
коллекции останется другой экран, где нет надписи.
(Продолжение следует)
35
Радиолюбитель. Ваш компьютер 11/96
ИГРОТЕКА
В.УСОВ,
220046, г.Минск, ул.Холмогорская, 20 — 1.
ПРОГРАММА “УРОЖАЙ”
Простая, не занимающая много места в памяти компьюте-
ра, но эффективная и интересная (по сравнению с аналогич-
ными программами), эта игра позволяет интересно провес-
ти вечер.
Программа написана на тему, предложенную в журнале
“Техника — молодежи” в 80-х годах. Эта экономическая (с
элементами юмора) игра и в наше время очень актуальна.
Правила пользования приводятся в самой программе.
Программа написана на основном подмножестве языка
BASIC, что делает ее легкой в адаптации. Автор использо-
вал BASIC-COLOR v2.5 (“Вектор-ОбЦ”).
0 REM 220046, г.Минск, ул.Холмогорская, 20-1; Усов В.Г.
1 REM ИГРА - УРОЖАЙ -
2 CLS: COLOR 7,0: PLOT 80,127,2
3 LINE 2,3,BS: РР1ИТ"УРОЖАЙ"
4 COLOR 7,10: BEEP 1,-8
5 COLOR 7,9: BEEP 1,6
6 COLOR 7,4: BEEP 1,-2
7 COLOR 7,3: BEEP 1,4
8 CLS
9 COLOR 15,0
13 REM UVG
16 PRINT"НУЖНЫ ЛИ ПРАВИЛА ИГРЫ ?"
17 PRINT" ОТВЕТЬТЕ ДА ИЛИ НЕТ "
18 INPUT Q$
19 IF <2$="ДА" THEN 520
20 IF Q$="HET" THEN 21
21 CLS
23 INPUT " ЗАДАЙТЕ ОБЩУЮ ПЛОЩАДЬ ПАХОТНОЙ ЗЕМЛИ И
КОЛИЧЕСТВО ДЕНЕГ В КАССЕ -:",S0,D
24 F=1
25 INPUT" ВВЕДИТЕ СТОИМОСТЬ ОСВОЕНИЯ 1 ГА НОВОЙ ЗЕМЛИ
(НАПРИМЕР : 300 РУБ):",К1
26 INPUT" ВВЕДИТЕ СТОИМОСТЬ ОБРАБОТКИ 1 ГА ЗЕМЛИ
(НАПРИМЕР : 30 РУБ):",К2
27 INPUT" ВВЕДИТЕ СРЕДНЮЮ УРОЖАЙНОСТЬ (1.1):",КЗ
28 INPUT" ВВЕДИТЕ ПОСТОЯННЫЕ ОТЧИСЛЕНИЯ В ГОСБЮДЖЕТ (3500
РУБ):",В
29 INPUT" ВВЕДИТЕ ССУДНЫЙ КОЭФФИЦИЕНТ (20%)Т.Е.1.2:",К4
30 PRINT" КОЛИЧЕСТВО ДЕНЕГ В КАССЕ :";Б;"РУБ."
35 PRINT" НАЧИНАЕТСЯ ";Б;"-Й ГОД ПРАВЛЕНИЯ ."
40 PAUSE 2: INPUT" ВЫДЕЛИТЕ СРЕДСТВА НА ОСВОЕНИЕ НОВЫХ
ЗЕМЕ-ЛЬ :",DS
50 IF DS<0 THEN PRINT"OI1IHBKA ! ОТРИЦАТЕЛЬНАЯ СУММА .":
GOTO 40
55 IF DS>D THEN PRINT" У ВАС НЕТ СТОЛЬКО ДЕНЕГ .": GOTO 40
0060 D=D-DS
70 IF D=0 THEN PRINT" A ДЕНЕЖКИ-TO КОНЧИЛИСЬ": PAUSE 1:
GOTO 80
80 S0=S0+DS/Kl: S=S0: C=0: 1=3
90 PAUSE 1: CLS: РР1ИТ"КОЛИЧЕСТВО HE ЗАСЕЯНЫХ ПОЛЕЙ-";!;"
И ЕЩЕ HE ОБРАБОТАННАЯ ПАШНЯ - ";S;" ГА"
100 PRINT" ВВЕДИТЕ ПЛОЩАДЬ , ОТВЕДЕННУЮ ПОД "
110 IF 1=1 THEN PRINT"КУКУРУЗУ": GOTO 140
120 IF 1=2 THEN РР1№Т"ГШ1ЕНИЦУ": GOTO 140
130 IE’ 1=3 THEN PRINT"РОЖЬ"
140 INPUT S(I)
150 IF S(I)<0 THEN PRINT" А ЕЩЕ МЕНЬШЕ HE МОЖЕШЬ ?": PAUSE
1: GOTO 90
160 IF S<S(I) THEN PRINT" ВЫ ЗАХВАТЧИК И ВАМ НУЖНА ЧУЖАЯ
ЗЕМЛЯ ?": PAUSE 1: GOTO 90
165 D(I)=S(I)*K2
170 IF D(I)>D THEN 200
175 D=D-D(I) :S=S-S (I)
180 IF INT(RND(1)*10)>5 THEN C=C+D(I)*(КЗ+1/(3*1)) : GOTO
210
190 C=C+D(I)*(КЗ-1/(3*1)): GOTO 210
200 PRINT" HE ХВАТИЛО ДЕНЕГ .": PAUSE 1: GOTO 90
210 IF I>1 THEN 1=1-1: GOTO 90
220 PAUSE 1: CLS: PRINT" ДЕНЕГ В КАССЕ ОСТАЛОСЬ -
";Б;"РУБ."
230 INPUT" ВЫДЕЛИТЕ СРЕДСТВА НА СБОР ДАРОВ ПРИРОДЫ :",DG
240 IF DG<0 THEN PRINT" HE НАДО ЗАКУПАТЬ ГРИБЫ И
РАЗБРАСЫВАТЬ ПО ЛЕСУ .": PAUSE 1: GOTO 230
245 IF DG>D THEN PRINT" ГДЕ БУДЕМ ДЕНЬГИ БРАТЬ ?": PAUSE 1:
GOTO 230
250 D=D-DG
260 IF D=0 THEN PRINT" ДЕНЕЖКИ КОНЧИЛИСЬ .": PAUSE 1: GOTO 270
270 C=C+2*S0*ATN(DG/S0)
280 PAUSE 1: CLS: PRINT" ДЕНЕГ В КАССЕ ИМЕЕТСЯ - ";О;"РУБ."
290 INPUT" ВЫДЕЛИТЕ СРЕДСТВА НА ОХРАНУ СОБРАННОГО УРОЖАЯ
: ", DC
300 IF DC<0 THEN PRINT" РЕШИЛИ ВСЕ ТЩАТЕЛЬНО СГНОИТЬ .": PAUSE
1: GOTO 290
305 IF DOD THEN PRINT" НАДО ПРОСИТЬ МИЛОСТЫНЮ .": PAUSE 1:
GOTO 290
310 D=D-DC
320 IF D=0 THEN PRINT" КАРМАНЫ ПУСТЫ GOTO 330
330 C=2*C/PI*ATN(DC)
340 PAUSE 2: CLS: PRINT" ВЫ ДОЛЖНЫ ПЕРЕЧИСЛИТЬ В ГОСБЮДЖЕТ -
";В;"РУБ."
350 INPUT" ВВЕДИТЕ ОТЧИСЛЕНИЯ В ГОСБЮДЖЕТ:",DL
355 IF DL>B THEN PRINT" МНЕ ЧУЖОГО НЕ НАДО.": GOTO 340
360 IF DL<0 THEN PRINT" HE НАДО МОШЕННИЧАТЬ .": GOTO 340
365 IF DL>D THEN PRINT" ИНТЕРЕСНО , ГДЕ ВЫ ВОЗЬМЕТЕ ДЕНЬГИ .":
PAUSE 2: GOTO 385
370 PRINT
380 IF DL<B THEN PRINT" КОГО ХОТИТЕ НАДУТЬ ?": GOTO 400
385 D=D-DL
390 IF D<0 THEN PRINT" ПРИХОДИТСЯ ДАТЬ ССУДУ .": GOTO 410
395 GOTO 420
400 PRINT" ВЫ HE ДОПЛАТИЛИ В ГОСБЮДЖЕТ :";DL-B: PAUSE 1: GOTO
340
410 K5=0: K5=D*(-1): D=D+K5: K5=K5*K4
420 D=D+C: D=D-K5
425 PAUSE 5: CLS: PRINT
430 IF D<0 THEN PRINT" ВЫ ПРОИГРАЛИ ! СДАЙТЕ ДЕЛА , У ВЫХОДА
ВАС ЖДУТ РАБОТНИКИ МИЛИЦИИ .": GOTO 435
433 GOTO 440
435 PRINT" КАКОЙ ПОЗОР НА ";F;"-OM ГОДУ ПРАВЛЕНИЯ !": GOTO 470
440 К5=0
450 PRINT" В КАССЕ ДЕНЕГ - ";Б;"РУБ.": PAUSE 5: CLS
455 F=F+1
460 GOTO 30
470 PRINT: PRINT: PRINT: BEEP 2,2
480 PRINT" В КАССЕ ОСТАЛОСЬ ДЕНЕГ - ";В;"РУБ."
490 STOP
520 РР1ИТ"ПРАВИЛА ИГРЫ: ВЫ ДИРЕКТОР СОВХОЗА, В ВАШЕМ
РАСПОРЯЖЕНИИ 1000 ГА ПАХОТНОЙ ЗЕМЛИ, ПРИ-ЛЕГАЮШИЕ ЛЕСНЫЕ УГОДЬЯ
И СУММА "
530 PRINT"35000 РУБ. ЗАДАЧА - РАЦИОНАЛЬНО ВЕСТИ ХО-ЗЯЙСТВО ,
ЧТОБЫ ОБЕСПЕЧИТЬ ЕЖЕГОДНЫЕ ОТЧИ-СЛЕНИЯ В ГОСБЮДЖЕТ НЕ МЕНЕЕ "
540 PRINT"3500 РУБ. ЗЕМЛЯ ЕСЛИ ЕЕ ВСПАХАТЬ, ЗАСЕЯТЬ , СНЯТЬ
УРОЖАЙ , ПРИНОСИТ В СРЕДНЕМ 10% ПРИБЫЛИ (ОБРАБОТКА 1 ГА СТОИТ "
550 PRINT"30 РУБ.).НА НЕЙ МОЖНО ВЫРАЩИВАТЬ В ЛЮБОЙ ПРОПОРЦИИ
3 КУЛЬТУРЫ : РОЖЬ , ПШЕНИЦУ, КУ-КУРУЗУ . СРЕДНИЙ ДОХОД ОТ НИХ "
560 PRINT"OHHHAKOB , НО ИЗ-ЗА ПОГОДНЫХ И КОНЪЮНКТУР-НЫХ
УСЛОВИЙ ПОДВЕРГАЕТСЯ НЕПРЕДСКАЗУЕМЫМ КОЛЕБАНИЯМ : "
570 РР1ЫТ"РОЖЬ ДАЕТ 110+/-11%; ПШЕНИЦА - 110+/-17%; КУКУРУЗА -
110+/-33% ОТ ВЛОЖЕННЫХ СРЕДСТВ, ПОЭТОМУ МОГУТ ПРИНОСИТЬ ИЛИ "
580 РР1ИТ"ПРИБЫЛЬ , ИЛИ УБЫТКИ ."
590 PAUSE 30: CLS
600 PRINT" ЧАСТЬ ЗЕМЛИ МОЖНО НЕ ЗАСЕВАТЬ , ЕСЛИ ТАК ХОЧЕТСЯ
ИЛИ НЕТ ДЕНЕГ . "
610 PRINT" ЕСЛИ ДЕЛА ИДУТ ХОРОШО , МОЖНО ВЫДЕЛИТЬ СРЕДСТВА
НА ОСВОЕНИЕ НОВЫХ ЗЕМЕЛЬ ( 1 ГА ОБХОДИТСЯ В 300 РУБ.)"
620 PRINT" СПИСЫВАТЬ (УМЕНЬШАТЬ) ВЫДЕЛЕННУЮ ПЛОЩАДЬ НЕЛЬЗЯ . "
630 PRINT" ВТОРОЙ ИСТОЧНИК ДОХОДА : СБОР И РЕАЛИЗА- ЦИЯ ДАРОВ
ПРИРОДЫ - ГРИБОВ, ЯГОД И Т.Д.; ПРИ МАЛЫХ ЗАТРАТАХ ДАЕТ 100% "
640 РР1ЫТ"ПРИБЫЛИ , НО ПО МЕРЕ УВЕЛИЧЕНИЯ ВЛОЖЕННЫХ СРЕДСТВ
ПАДАЕТ (Т.К. ПЛОЩАДЬ ЛЕСОВ ПРОПОР-ЦИОНАЛЬНА ПЛОЩАДИ ПОЛЕЙ )."
650 РР1ЫТ"НЕОБХОДИМ ОПТИМУМ ЗАТРАТ Т.К. НОВЫЕ СБОР - ЩИКИ НЕ
СОБЕРУТ БОЛЬШЕ , ЧЕМ ИМЕЕТСЯ ЯГОД И ГРИБОВ ."
660 PRINT" УРОЖАЙ ТРЕБУЕТСЯ СОХРАНИТЬ , ВЫДЕЛИВ СРЕДСТВА
: НА СКЛАДЫ , СТОРОЖЕЙ ,СОБАК И ПРОЧЕЕ ."
670 PRINT"ECnH МАЛО , ТО УРОЖАЙ ПОГИБНЕТ , МНОГО - НЕНУЖНЫЙ
РАСХОД СРЕДСТВ."
680 PAUSE 30: CLS
690 PRINT" ВСЕ ВЫПЛАТЫ ПРОИЗВОДЯТСЯ ИЗ ИМЕЮЩИХСЯ НАЛИЧНЫХ
СРЕДСТВ, ЛИШЬ ДЛЯ ПОГАШЕНИЯ ОТЧИ-СЛЕНИЙ В ГОСБЮДЖЕТ МОЖНО ВЗЯТЬ
700 РР1№Г"НЕБОЛЫИУЮ ССУДУ В БАНКЕ , НО В ЭТОМ СЛУЧАЕ ПОСЛЕ -
РЕАЛИЗАЦИИ УРОЖАЯ ВОЗВРАЩАТЬ ПРИДЕТСЯ НА 20% БОЛЬШЕ . "
710 РР1ЫТ"ЕСЛИ НЕ ХВАТИТ СРЕДСТВ , ТО ПЕНЯЙТЕ НА СЕ-БЯ..."
720 PAUSE 10: CLS
730 PRINT" ЖЕЛАЮ УДАЧИ !": PAUSE 5
740 GOTO 21
36
Радиолюбитель. Ваш компьютер 11/96
220050, Минск, a/я 41, BELARUS, Minsk, Box 41
ISSN 0869-0510. Радиолюбитель. Ваш компьютер, 1996
Цена договорная