Текст
                    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 Цена договорная