ZX-Ревю 1995 №3 1994 г.

Читатель-читателю - Некоторые аппаратные проблемы Практическое применение музыкального процессора. MAGIC-SEARCHER.


ЧИТАТЕЛЬ-ЧИТАТЕЛЮ

п

Некоторые аппаратные проблемы

(С) Кирилл Громов,

г.Москва, 1995.

Я - давний поклонник Speccy, спешу поделиться с Вами несколькими своими "изысками".

1. Расставим точки над INT!

Так выглядит времянка INT, период - 20 мкс, длительность -8-15 мкс:

Данную задачу вполне следующая цепочка:

- гот

Рис.1.

решает

Гасящий импульс (гас.имп.) снимается со счетчика/делителя базовой частоты кварцевого резонатора. Нужная длительность подбирается по устойчивой работе клавиатуры, это не всегда 8-9 мкс, иногда нужно больше. Может быть, придется этот импульс пропустить через инвертор, если он идет в противофазе. В "Дельта-С" это 13 вывод микросхемы DDI5.1 (НЕЮ).

Можно гасить INT так:

Рис.2.

Это нужно для того, чтобы в TURBO-режиме обеспечить нужную длительность. "Гашение41 происходит по гас.имп. или в цикле подтверждения прерывания. DI - 555TM2 или 1533ТМ2. Номинал конденсатора С1 (см. рис.1) - некритичен (в разумных пределах), он лежит в диапазоне 100 - 1000 пФ,

Этим приемом удается в PR0FI укоротить INT вдвое, чтобы избежать повторного захвата процессором.

2. Порт #FF.

Собственно говоря, это не порт, а состояние шины данных, когда не выбрано устройство. Наилучшим образом решается в схемах с правильной времянкой синх-ро-сигналов ("Дельта-С", "PROFI") и вот, почему.

Идея такая (см. рис.3). Соединить выхода AT0-AT8 регистра атрибутов с шиной данных D0-D7 через резисторы 820 Ом (при условии "подтянутости" шины данных к +5В через резисторы 10 кОм). В "Дель-те-С" RG ATR это DD63, DD56 TM8.

1

Дюра

rg atr

йт0

ат8

рпу5-

1

St"

1" J 820

rg bup

08

Рис.3.

Все происходит следующим образом. При обращении к несуществующему устройству (порту):

Если идет формирование бор-(FLD2 - активен), то с шины идет "подхват" кода текущего атрибута через резисторы R1-R8.

2. Если идет формирование экрана (FLD2 - пассивен), RG ATTR находится в высокоимпедансном состоянии - на D0-D7 код 255.

В PROFI нужно лишь (обозначения для платы v 4.0):

- перерезать 1-й вывод D59 и завести его на FLD2 (си. схему рис.3);

- перекинуть выводы матрицы U57 с D65 (Р0-Р7) на D59 (11-18).

Если времянка Вашего компьютера правильная (к PENTAGON-128 это не относится), то RG ATTR "закроется" до подтверждения прерывания за счет FLD2 сигнала поля бордюра (вот вся суть!), и шина данных засорена не будет. В "Дельте-С", возможно, нужно будет подкорректировать С1 (си. рис.1).

После этих доработок в "Дель-те-С" и PROFI пошли все програн-мы, включая ARKANOID 1 и мифическую F.I.R.E. -Ничего не дрожит, все нормально! А если в "Дельте-С" заиенить прошивку ПЗУ на "родную", Вы вообще получите фирменный "ZX-Spectrum+" (сам сравнивал, ну совсеи не отличишь по работе)! В програиие VENOM STRIKES BACK совпадают бордюрные и экранные линии, а по надписи вверху экрана по диагонали (!) поднимаются цветные полосы (!!) толщиной 1-5 пикселов (!!!) - эффект - изуиительный!

Кстати, все сказанное относится к Чебоксарскии "Дельтам". В других схеиах принцип тот же, и, если Вы дружите с паяльникои и читаете схемы, то без труда найдете в своей коипьютере и RG ATR и шину данных, разуиеется.

Если же Ваш компьютер обделен хорошей времянкой (а-ууу, пента-гонщики!), то вот Ваи схеиа (си.рис.4).

ЛА2

АО— А1

А2 — a3 — а4 — a3 — ав — а7

|_flflL ЙТ7--

«5-1 j

ou i0rq—^

ГП52—

Рис.4.

апз

at0-

ati-

ат2-

атз-

лл1

cs1

I

—, at4—

атз—

1 атв—

ЛЛ1

ат7—

1

— DO

— D1

— D2

— 03

d4

— DS D6

— 07

Это "псевдо"-порт #FF, сделанный по-науке. АТ0-АТ7 - это атюи-буты, взятые с RG ATR, a FLD2 - с С5 на "Солон"-овской схеме.

Схемы не конкретизированы, но я даю принцип и саиые яркие при-иеры, а в конкретных случаях нужен свой подход. Например, обла-дателяи "Ангстремов" и "Балтиков" можно только посочувствовать (особенно, первый). Даже "Ленинград" иожно "довести до уна"!

3. KEMPSTON и порты вообще.

ЧИТАТЕЛЬ-ЧИТАТЕЛЮ

Сколько же иожно "сажать" свои порты к IORQ, забывая о существовании КНГМД! Ведь таи же специально для Вас (по схеме PENTA-GON-128 - D85, б вывод) OIORQ сделан! Ведь у KEMPSTON и RG ВГ93 один и тот же адрес #1F!

ла—ю—о* Н<3—06

Ч<3—07

Рис.5.

Все по науке: IN #1F - 0, конфликта во время обращения к КНГМД нет. Все тесты говорят O.K.

Если у Вас нет КНГМД в коипьютере, все равно не поленитесь, сделайте так (на примере "Дель-ты-С"), в будущем голова болеть не будет, когда будете подключать дисковод (си. рис.6).

ПЯЯ5-

5

pa»v*M

чт.пзу i'

В »ы».

0073-

(cs rom)

- ЧТ.П8У

<С8)

Рис.6.

-quiorq

Щ-4. TURBO-КНГМД.

Соберите схеиу (см. рис.7) и головка Вашего НГМД будет ерзать по диску в два раза быстрее! Это проверено на PROFI и PENTAGON-128.

1 МГц -

2 МГц-

ВГ9Э

<WG> '

8

t MX 0 |

; «

к 24 Bb

14

EZ1 SE1 fSEO

Рис.7.

На рисунке 8 представлена обобщенная схема KEMPSTON/#FF.

Ч 1

1ТАТЕЛЬ-Ч

i Т А Т Е Л Ю |

вполне можно исключить микросхему 555ЛА2 (1533ЛА2), заведя на ОЕ CCS микросхемы D4 сигнал "поле бордюра" (FLD2) с 1 вывода ИР23, тогда работа порта #FF будет как в фирменном Speccy. То есть атрибуты будут читаться при попытке выбрать любой несуществующий порт. Пример:

10 PRINT IN 1: GO ТО 10

10 PRINT IN 255: GO TO 10

Результаты должны быть аналогичны. Значение 56 чередуется с 255. проверено в PENTAGON 128.

По всем вопросам звоните: 397-29-17 20.00 ДО 23.00) (обязательно

представьтесь).

Наиболее детально проконсультирую по любому выше поднятому вопросу (хотя, надеюсь, уже ответу) вплоть до номеров выводов микросхем. Контактный адрес:

Диоды - любы* импцльоны*

115597, г.Москва, Гурьевский пр-зд, д.19,к.2,кв.311, Громову К.Ю.

Рис.8. Обобщенная схема KEMPSTON / #FF.

Если ваш компьютер позволит, можете не ставить микросхемы D2, D4, а соединить АТ0-АТ7 с резисторами (штриховые линии), резисторы, возможно, придется подбирать^_

OU I0RQ - этот сигнал есть в схемах КНГМД, если у Вас "кассетный" Speccy, можно использовать I0RQ, но лучше собрать цепочку его формирования (см. рис.6).

Поскольку в схему уже заложено "монтажное ИЛИ" на R1-R8, то

HELP !!! Очень нужна информация (как можно полнее), особенно первоисточники на иностранных языках по AY-3-8910 (YM2149F), по 16-разрядному контр. СР1600/1610 или 8-разрядному программируемому интерф. контр. PIC1650. Очень нужно DISASSEMBLE с описанием SOS 128 (что-то аналогичное книге Ло-гана по SOS 48).

Практическое применение музыкального процессора

Многие читатели в своих письмах просят подробнее рассказать о работе музыкального сопроцессора АУ-3-8910/12. Письмо с некоторыми ответами прислал Руслан Васильков из г. Зеленогорека (Красноярск-45). Учитывая многочисленные письма читателей, его сведения мы дополнили данными из книги "А.Ларченко и И.Родионова »ZX-Spectrum * TR-DOS для пользователей и программистов**.

MUSIC CHIP является регистро-во-ориентированным генератором звука. Микросхеиа музыкального процессора имеет три независимых канала для формирования звука (А,В,С) и два двунаправленных восьмиразрядных канала ввода/вывода - IRA и IRB соответственно. Через канал IRA осуществляется связь с принтером, вывод сигналов для специального музыкального интерфейса MIDI и, кроме этого, связь со специальной выносной клавиатурой функциональных клавиш, используеиых в расширенном интерпретаторе Бейсика.

Функции иузыкального процессора выполняются при помощи 16 внутренних регистров (RO...R15). Регистры двунаправленные, то есть информацию из них можно записывать и считывать.

Доступ к регистрам музыкального процессора осуществляется при помощи двух портоВ: #BFFD (49149) и #FFFD (65533). Для этого номер регистра (0...15) необходимо выдать в порт #FFFD (65533). После этого становится возможна передача данных между этим "установленным0 или текущим регистром и микропроцессором. Для смены текущего регистра надо в порт #FFFD заслать новый номер и так далее.

После того, как текущий регистр выбран, можно выполнить его чтение/запись. Для записи байта надо выполнить команду вывода в порт #BFFD (49149), а для чтения - команду ввода из порта #FFFD.

N per.

назначение или содержание

Значение

0,2,4

нижние 8 бит частоты голосов А,В,С

0-255

1/3,5

Верхние 4 бита частоты голосов А,В,С

0-15

6

Управление частотой генератора шума

0-31

7

Управл. смесителем и вводом/выводом

0-255

8,9,10

Управление амплитудой каналов А,В,С

0-15

11

Нижние 8 бит управ, периодои пакета

0-255

12

Верхние 8 бит упр. периодои пакета

0-255

13

Выбор формы волнового пакета

0-15

14,15

Регистры портов ввода/вывода

0-255

Три спаренных регистра R0/R1, R2/R3, R4/R5 используются для выработки частоты тона соответственно каналов А, В, и С. Необходимые двенадцатиразрядные значения образуются из 8 битов младшего по номеру регистра и четырех младших битов старшего по номеру регистра.

Младшие пять разрядов регистра R6 задают частоту шуиа.

Основным при работе иузыкального процессора является регистр R7. Его главное значение - определять , какие каналы должны участвовать в образовании звука и определять направление обмена портов ввода/вывода. Его структура показана ниже. "Ноль" соответствует включению определенной позиции, а "единица" - выключению (см. таблицу на след.стр.).

Установка битов О...2 в "единицу" приведет к запрещению вывода частоты тона в каналы А,В,С соответственно.

ЧИТАТЕЛЬ-ЧИТАТЕЛЮ

Бит

Назначение

0

Тон A

Выбор

1

Тон В

канала

2

Тон С

для тона

3

Шум А

Выбор

4

Шум В

канала

5

Шум С

для шума

6

Порт В

Управление

7

Порт А

вводом/выводом

Установка битов 3...5 в "единицу" приведет к запрещению вывода частоты шума в каналы А,В,С соответственно.

При сброшенном в "ноль" бите б или 7 канал ввода/вывода (IRB или IRA соответственно) работает на ввод, а при установленном в "единицу" - на вывод информации.

Младшие пять разрядов регистров R8, R9 и R10 управляют амплитудой соответственно каналов А, В и С.

Спаренные регистры R11/R12 образуют шестнадцатиразрядное значение огибающей выходного сигнала, регистр R11 несет младший байт, a R12 - старший.

Младшие четыре разряда регистра R13 управляют формой и режимом огибающей выходного сигнала: Бит 0 - затухание. Бит 1 - чередование. Бит 2 - нарастание. Бит 3 - продолжение.

Регистры R14 и R15 используются соответственно для связи с каналами ввода/вывода IRA и IRB. Содержимое этих регистров можно в любой момент считывать и записывать, на формировании звука это

никагк не отражается.

* * *

(С) Руслан Васильков, 1995.

Если засылать нужное число в каждый регистр, то можно получать неплохие звуки, а если звуки еще и объединить, то получится мелодия, но вручную это сделать очень непросто. Итак, как сказано выше.

чтобы управлять музыкальным процессором, надо номер регистра заслать в порт 65533, а значение регистра - в порт 49149. Чтобы получить звук, надо иметь в памяти компьютера 15 байтов в виде данных плюс программу воспроизведения. Последняя может быть как на Бейсике, так и на ассемблере.

Ниже приведена программа "AY-ВЕЕР". Она позволяет создать некоторые звуки.

О REM +------AY-BEEP------+

О REM | Written by |

0 REM | Vasilkov Ruslan I 0 REM 128.03.95. Zelenogorskl

0 REM +---------------------+

1 BORDER 0: PAPER 0: INK 7: С

LS

2 LET nl»255: LET p=4e4: LET z=2: LET x=0: LET q=0: LET n=0

8 FOR n=0 TO 1: FOR m«0 TO 7: PRINT PAPER 3; INK 0;AT n*5+l,

m*4+l;(n*8+m); PAPER 0; INK 7;AT

n*5+2,m*4+l;PEEK (4e4+n*8+m),: NEXT m: NEXT n

9 PRINT PAPER 2;AT z,x;")";C HR$ 8; OVER 1;"D"; OVER 0; PAPER

0;PEEK p

10 LET n=PEEK p: LET y$=INKEY$ : IF y$="" THEN GO TO 10

12 IF y$="o" OR y$="p" THEN P RINT AT Z,X;" "

14 IF y$="q" THEN LET n=n+l

15 IF y$="a" THEN LET n=n-l 17 IF y$="p" THEN LET p=p+l:

LET n=PEEK p: LET x=x+4

19 IF y$="o" THEN LET p=p-l: LET n=PEEK p: LET x=x-4

21 IF y$="c" THEN FOR i=40000 TO 40015: POKE i,0: LET j*i-400 00: OUT 65533,j: OUT 49149,0: NE XT i: GO TO 8

35 IF y$="b" AND q=0 THEN PRI NT AT 4,0,,: LET q-1: GO TO 60 37 IF y$="b" AND q=l THEN LET q=0

50 IF y$=" " THEN OUT 65533,7 : OUT 49149,255 100 IF x>30 AND z=2 THEN LET z -7: LET x=0

110 IF x<0 AND z-7 THEN LET Z« 2: LET xs28

120 IF x>30 AND Z-7 THEN LET p =40000: LET n=PEEK p: LET Z=2: L ET x=0

130 IF x<0 AND Z-2 THEN LET p=

ЧИТАТЕЛЬ-ЧИТАТЕЛЮ

40015: LET n-PEEK p: LET z»7: LE T xs28

140 LET m«p-40000

141 IF m-1 OR m=3 OR m=5 OR m=8 OR m«9 OR Ш»10 OR m«13 THEN LE

T nl=15 150 IF m=6 THEN LET nl=31 160 IF m»0 OR m=2 OR m»4 OR m»7 OR m»ll OR m=12 OR m=14 OR m*15 THEN LET nl-255 170 IF n>lll THEN LET 11=0: PRIN T AT 2 X+2 *" M 180 IF n<0 THEN LET n=nl 190 IF m<0 THEN LET m=21 200 IF m>21 THEN LET m=0 300 POKE p,n: PRINT PAPER 2;AT z,x;")";CHR$ 8; OVER 1;"D"; OVE R 0; PAPER 0;PEEK p;" ": OUT 655 33,m: OUT 49149,n: IF q-1 THEN GO TO 10

400 LET a-PEEK 40007: FOR i-7 T О 0 STEP -1: LET s«INT (a/2): LE T sl«s*2: LET d«(a-sl): PRINT AT 4,i+23;d: LET a-s: NEXT i: GO T О 10

Управление программой:

О, P - управление курсором.

Q, А - увеличение и уменьшение значения регистра (в соответствии с таблицей).

В - включение/выключение двоичной системы регистра R7.

С - очистка всех регистров.

SPACE - выключение звука.

Программа очень проста в обращении. Запись выполняется в тот регистр, на котором находится курсор. Попробуйте задать следующие значения: Rl-1; R4-3; R5-1; R7-56; R8-12; R9-12. Вы услышите мелодичный звук.

Однако следует заметить, что эта программа не музыкальный редактор» а только "испытательный стенд" для музыкального процессора, с ее помощью можно немного "поиграть" с регистрами музыкального процессора, чтобы лучше понять принцип его работы.

Чтобы воспроизвести звук без этой програимы, необходимо запомнить (записать) все регистры со значениями, а затем использовать как DATA в Бейсике или машинных кодах. В Бейсике это может выглядеть так:

10 FOR п»0 ТО 15 20 READ п 30 OUT 65535,П 40 OUT 49149,111 50 NEXT П 60 DATA ...

Фрагмент на ассемблере» выполняющий ту же функцию:

XOR

A

LD

HL,DATA

LD

ВС,65533

OUT

(С),A

PUSH

AF

LD

A,(HL)

LD

ВС,49149

OUT

(C),A

POP

AF

INC

HL

INC

A

CP

15

RET

Z

3R

LOOP

DEFB

. . .

* * *

(С) Влад, г.оленегорск, 1995.

Эта программа будет полезна тем, кто собирается самостоятельно делать "музыкалки", она проверяет наличие музыкального процессора.

XOR

A

LD

BC,#FFFD

OUT

(C),A

XOR

A

LD

B,#BF

OUT

<C),A

LD

BC,#FFFD

OUT

(C),A

IN

A,(C>

OR

A

OR

NZ,WARNING

WARNING ......

В том случае, если музыкальный процессор отсутствует, программа

переходит на метку WARNING. * * *

_

ЧИТАТЕЛЬ-ЧИТАТЕЛЮ

MAGIC-SEARCHER

(С) Илья Фомин, г.С.Петербург.

долей вероятности и будет находится по адресу искомого параметра. При обнаружении совпадения программа выдает на экран адрес, который она вычисляет по формуле 16384 + (256 * номер сектора от начала файла) + смещение в секторе.

Как показывает практика всего таких совпадений может быть несколько, в том числе несколько из них бывают чисто случайные, но все-же их не настолько много, чтобы нельзя было "отделить зерна от плевел".

Следует иметь в виду, что если программа выводит на экран интересующий вас параметр в виде числа, а не какими либо символами (человечками и т.п.), то вполне возможно надо искать не указанное число, а его ASCII код.

В качестве примера могу сказать, что поиск бессмертия в игре DIZZY Y с помощью этой программы занял около 5 минут.

Бейсик-файл программы MAGIC-SEARCHER.

5 INK VAL "7": PAPER NOT PI: BORDER NOT PI: CLEAR VAL "32767" : PRINT "SEARCHER FOR MAGIC-FILE S": RANDOMIZE USR VAL "15619": R EM : LOAD "SEARCHc"CODE 62E3

10 PRINT "FILENAME 1:";: INPUT A$: PRINT A$1

15 FOR I-VAL "64E3" TO VAL "64 016": POKE I,VAL "32": NEXT I

20 FOR I«VAL "1" TO LEN A$: PO KE I+VAL "63999",CODE A$(I): NEX T I

21 PRINT "FILENAME 2:";: INPUT B$: PRINT B$'

22 FOR I=VAL "Iй TO LEN B$: PO KE I+VAL "64007",CODE B$(I): NEX T I

30 PRINT "DATA FOR FILE ";A$;" :";: INPUT DI: PRINT DI•

40 PRINT "DATA FOR FILE ";B$;" :";: INPUT D2: PRINT D2»

50 POKE VAL "64017",DI:' POKE V AL "64018",D2

55 PRINT #VAL , "1";" PRESS ANY KEY TO START SEARCH": PAUSE VAL и 0»

ЧИТАТЕЛЬ-ЧИТАТЕЛЮ

ЧИТАТЕЛЬ-ЧИТАТЕЛЮ

60 CLS : RANDOMIZE USR VAL "62

RET

E3"

LF28C

LD

A,#43

70 PRINT "CONTINUE ? (Y/N )":

LD

(#5CE5),A

INPUT A$

LD

C,#0A

75 IF A$S"Y(

" OR A$="y" THEN G

CALL

#3D13

0 TO 10

LD

А,С

80 STOP

BIT

7,A

3P

NZ,LF2D8

Кодовый файл программы называ

LD

C, #08

ется "SEARCHERc"CODE 62000,316.

CALL

#3D13

Предлагаем его дизассемблер,

LD

DE,(#5CEB)

полученный при помощи команды "Т"

LD

HL,#4000

монитора MONS4

(обратное ассемб-

LD

B,#1B

лирование в текстовый файл).

LD

C, #05

CALL

#3D13

ORG

62000

LD

HL,(#5CF4)

ENT

$

PUSH

HL

»

LD

DE,LF360

XOR

A

LD

ВС,#0005

DEC

A

CALL

#203C

LD

(#5C8C), A

LD

DE,# 5CDD

LD

A,#02

LD

ВС,#0008

CALL

#1601

CALL

#203C

DI

LD

A,#QD

LD

HL,#FA00

RST

#10 T

LD

DE,#5CDD

LD

ВС,#0ОС8

LD

ВС,#0008

CALL

#1F3D

LDIR

CALL

#0D6B

CALL

LF28C

LD

A,#02

LD

(#FA13),HL

CALL

#1601

LD

HL,#FA08

POP

HL

LD

DE,#5CDD

RET

LD

ВС,#0008

LF2D8

LD

DE,LF343

LDIR

LD

ВС,#0010

CALL

LF28C

CALL

#203C

LD

(#FA15),HL

POP

HL

LD

DE,LF365

RET

LD

ВС,#0007

LF2E3

LD

DE,(#FA13)

CALL

#203C

LD

B, #37

LD

A, #0D

LD

C, #05

RST

#10

LD

HL,#8000

CALL

LF2E3

CALL

#3D13

LD

DE,#0000

LD

HL,(#5CF4)

CALL

LF30C

LD

(#FA13),HL

PUSH

DE

LD

DE,(#FA15)

CALL

LF2E3

LD

B, #37

POP

DE

LD

C, #05

CALL

LF30C

LD

HL,#B700

PUSH

DE

CALL

#3D13

CALL

LF2E3

LD

HL,(#5CF4)

POP

DE

LD

(#FA15),HL

CALL

LF30C

RET

LD

DE,LF353

LF30C

LD

HL,#8000

LD

BC,#000C

LD

ВС,#B700

CALL

#203C

LF312

LD

А,(ВС)

ЧИТАТЕЛЬ-ЧИТАТЕЛЮ

CP

(HL)

JR

Z,LF33A

PUSH

HL

PUSH

BC

PUSH

DE

LD

A,(HL)

LD

HL,#FA11

CP

(HL)

JR

NZ,LF337

LD

A,(BC)

LD

HL,#FA12

CP

(HL)

JR

NZ,LF337

LD

HL,#5B00

ADC

HL,DE

PUSH

HL

POP

BC

CALL

#2D2E

CALL

#2DE3

LD

A,#0D

RST

#10

LF337

POP

DE

POP

BC

POP

HL

LF33A

INC

HL

INC

BC

INC

DE

LD

A,H

CP

#B7

JR

NZ,LF312

RET

LF343

DEFM

"FILE NOT

LF353

DEFM

"SEARCH El

DEFB

0

LF360

DEFM

"FILE "

LF365

DEFM

"SEARCH:"

Шестнадцатиричный дамп блока кодов иSEARCHERcмCODE 62000,316

F230

AF

3D

32

8C

5C

3E

02

CD

35

F238

01

16

F3

21

00

FA

11

DD

3D

F240

5C

01

08

00

ED

BO

CD

8C

8D

F248

F2

22

13

FA

21

08

FA

11

8F

F250

DD

5C

01

08

00

ED

BO

CD

EE

F258

8C

F2

22

15

FA

11

65

F3

62

F260

01

07

00

CD

3C

20

3E

OD

CE

F268

D7

CD

E3

F2

11

00

00

CD

B1

F270

ОС

F3

D5

CD

E3

F2

DI

CD

76

F278

ОС

F3

D5

CD

E3

F2

DI

CD

7E

F280

ОС

F3

11

53

F3

01

ОС

00

D5

F288

CD

3C

20

C9

3E

43

32

E5

04

F290

5C

0E

OA

CD

13

3D

79

CB

57

F298

7F

C2

D8

F2

OE

08

CD

13

8B

F2A0

3D

ED

5B

EB

5C

21

00

40

BF

F2A8

06

IB

OE

05

CD

13

3D

2A

15

F2B0

F4

5C

E5

11

60

F3

01

05

41

F2B8

00

CD

3C

20

11

DD

5C

01

IE

F2C0

08

00

CD

3C

20

3E

OD

D7

05

F2C8

01

C8

00

CD

3D

IF

CD

6B

E4

F2D0

OD

3E

02

CD

01

16

El

C9

9D

F2D8

11

43

F3

01

10

00

CD

3C

2B

F2E0

20

El

C9

ED

5B

13

FA

06

F7

F2E8

37

OE

05

21

00

80

CD

13

A5

F2F0

3D

2A

F4

5C

22

13

FA

ED

Э5

F2F8

5B

15

FA

06

37

OE

05

21

C5

F300

00

B7

CD

13

3D

2A

F4

5C

41

F308

22

15

FA

C9

21

00

80

01

97

F310

00

B7

OA

BE

28

24

E5

C5

78

F318

D5

7E

21

11

FA

BE

20

17

7F

F320

OA

21

12

FA

BE

20

10

21

59

F328

00

5B

ED

5A

E5

CI

CD

2E

5E

F330

2D

CD

E3

2D

3E

OD

D7

DI

20

F338

CI

El

23

03

13

7C

FE

B7

37

F340

20

DO

C9

46

49

4C

45

20

2C

F348

4E

4F

54

20

46

4F

55

4E

84

F350

44

20

21

53

45

41

52

43

36

F358

48

20

45

4E

44

20

21

00

CB

F360

46

49

4C

45

20

53

45

41

6C

F368

52

43

48

ЗА

00

00

00

00

72

Если у Вас будет все же вызывать трудности мотделение зерен от плевелм, то можно немного доработать программу таким образом, чтобы сравнивать не два МА-GIC-файла, а три, полученных при помощи последовательного иубиения" героя.

По просьбе корреспондента публикуем его адрес.

Обменяю, куплю, продам программы для ZX SPECTRUM на дискетах. Обсуждение программ и т.д. Синклеристы, пишите.

195272 г.С.Петербург, ул.Руставели, д.20, кв.85 Фомину Илье Владленовичу.

Если у вас есть модем и выход в FIDO, то мой адрес в FIDO:

2:5030/94.28 на имя Ilya Fomin. * * *

^TrfftlCTfUl

Сегодняшний разговор мы начнем с темы, по которой пришел не один десяток писем. Все они начинались примерно одинаково: "Предлагаю вашему вниманию процедуру очистки экрана, которая короче, чем в TERMINATOR-2. Ее длина равна...".

Писем пришло очень много. Неплохие варианты процедур прислали: Георгий Норикрр из подмосковного

Серпухова, Алексей_Соколов из

г.Чебоксары, Met"?frHflP Корота из Краснодара, Виталий Серов из Магнитогорска . Владимир Зореев из Нижегородской обл. прислал более короткую процедуру, чем его же предыдущий вариант (ZX-PEBI0-95, N2, стр.44). Очень хороший вариант (25 байтов) получился у Антона Сидоренко из п.Мурмаши Мурманской обл. Но побвдиявлвм на сегодняшний день признана прог-рамма А.Палоусова (возможна ошибка - фамилия неразборчива) из г.Комсомольск-на-Амуре. Его результат - 24 байта. Но разговор о его программе чуть ниже.

Так как писем пришло очень иного, то иы, конечно, не сможем напечатать их все. Поэтому постараемся обобщить присланный материал и проанализировать ход мысли программистов. Может быть этот анализ поможет читателям и при разработке других процедур.

Итак, приступин. в целом, ал-горитм большинства присланных работ выглядит так. Для очистки ячеек файла атрибутов в один из регистров, скажем, Е, заносится наска, сдвигая которую вправо и сравнивая с ней атрибут по AND, будем выполнять его постепенное обнуление:

LD Е,%01111111

Для этого организуется цикл из 8 повторений:

LD В,8

Теперь в регистровую пару, наприиер, HL, заносится адрес начала файла атрибутов (22528):

LI LD HLf #5800

Далее происходит сравнение числа, определяющего атрибут, со значением маски, в результате старший бит атрибута будет обнулен:

L2 LD А, (HL) AND Б LD (HL),А

Затем следует инкремент регистра HL и проверка на достижения конца файла атрибутов, которая, во иногих программах выглядит так:

LD

DE,768

INC

HL

DEC

DE

LD

A,D

OR

E

OR

NZ,L2

Такой вариант занимает в памяти 9 байтов, однако, наиболее догадливые воспользовались тем фактом, что адрес первой ячейки, следующей за файлои атрибутов, равен #5В00 (начало буфера принтера) . Тогда этот фрагмент ножет выглядеть так:

INC HL INC HL

LD А,Н или: LD А,#5В

CP #5В CP Н

JR NZ,L2 JR NZ,L2

(оба варианта по количеству байтов равнозначны).

Длина такой конструкции составляет б байтов. Проверяется достижение регистром HL начала буфера принтера. Если конец файла атрибутов не достигнут, то происходит повторение для следующей ячейки, иначе - переход ко второй части процедуры - задержке.

Для обеспечения требуемой задержки иногие программисты использовали двухбайтовую регистровую пару, наприиер, DE:

LD DE,SPEED

L3 DEC DE

LD A,D

OR E

JR NZ,L3

такая конструкция занимает 8 байтов, однако многие сообразили, что можно обойтись и однобайтовым регистром, если воспользоваться для задержки командой HALT:

LD С,PAUSE HALT DEC С JR NZ,L3

занимает

Такая конструкция всего 6 байтов.

Далее следует очень важная команда, изменяющая значение маски перед следующим проходом:

SRL Е

После этой команды произойдет обнуление еще одного старшего включенного бита. Далее следует зацикливающая команда и повторение цикла для всех 8 битов числа из файла атрибутов.

L3

тателей, выполняет гашение экрана побитным обнулением атрибутов, начиная со старших разрядов и заканчивая младшими. Если атрибут имеет значение 1 (PAPER О; INK 1), то он таким и останется на протяжении 7 проходов, и только на последнем проходе обнулится.

В принципе, для уменьшения значения чисел, определяющих атрибуты, не обязательно использовать маску, можно при каждом проходе логически сдвигать вправо непосредственно сам атрибут число, адресуемое HL, при помощи SRL (HL). Тогда немного изменится алгоритм "затухания". Атрибут, имеющий значение 1 обнулится уже при первом проходе. Тогда вместо:

LD Е,%01111111

L2 LD A, (HL) AND Е LD (HL),А




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Юмор - Словарик.
Введение - приступайте к чтению первого номера *ZX-CITY*.
Фэнтези - Айзенк Азимов "Человек, который никогда не мал".
Эротика - Любовь в Автобусе.
Полезное - Очищаем воду, варим картофель и другие советы.

В этот день...   29 марта