ЧИТАТЕЛЬ-ЧИТАТЕЛЮ
Некоторые аппаратные проблемы
(С) Кирилл Громов,
г.Москва, 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.
Рис.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).
АО— А1
А2 — a3 — а4 — a3 — ав — а7
апз
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).
pa»v*M
чт.пзу i'
В »ы».
0073-
(cs rom)
-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 битов числа из файла атрибутов.
тателей, выполняет гашение экрана побитным обнулением атрибутов, начиная со старших разрядов и заканчивая младшими. Если атрибут имеет значение 1 (PAPER О; INK 1), то он таким и останется на протяжении 7 проходов, и только на последнем проходе обнулится.
В принципе, для уменьшения значения чисел, определяющих атрибуты, не обязательно использовать маску, можно при каждом проходе логически сдвигать вправо непосредственно сам атрибут число, адресуемое HL, при помощи SRL (HL). Тогда немного изменится алгоритм "затухания". Атрибут, имеющий значение 1 обнулится уже при первом проходе. Тогда вместо:
LD Е,%01111111
L2 LD A, (HL) AND Е LD (HL),А