ZXNet эхоконференция «code.zx»


тема: Полезные наработки



от: Алексей Валерьевич Акатов
кому: All
дата: 09 May 2006
Hello, All

Предлагаю в этой теме публиковать интересные решения касательно Spectrum. Я
тоже по мере появления свободного времени буду выкладывать свои старые (т.к.
новых нет и не может быть) интересные наработки.

Воспроизведение магнитофонной записи через бипер Спектрума:
┌─- code ───
DI
IN A, (254)
RRA
RRA
OUT (254), A
JR $ - 8
└── code ───
Откомпилированное:
┌─- code ───
243
219, 254
31
31
211, 254
24, 248
└── code ───
Идея: берем бит состояния магнитофона и посылаем его на бипер. В свое время я
делал специальные загрузчики к своим программам, которые выполняли подобный код
в течении нескольких секунд, а сразу после загрузчика на ленте проговаривалось
название программы. Получалось, что после загрузки очень маленького загрузчика
Спектрум говорил (!) название программы с достаточно высоким качеством звука.
Еще этот метод позволяет защитить программу от копирование с помощью спец софта
(copy и т.п.), т.к. если за загрузчиком вместо речи сразу будет следовать
следующий блок, то он окажется пропущенным (из-за паузы в несколько секунд).

от: Алексей Валерьевич Акатов
кому: All
дата: 09 May 2006
Hello, Arigato

Hебольшой драйвер Sinclair-джойстиков
Полезным он окажется при программировании на Бейсике. В отличии от Kempston
джойстика, который можно опросить через порт 31 (если память не изменяет) прямо
Бейсик-командой, с Sinclair джойстиком дела обстоят хуже. Облегчит эту задачу
преведенный драйвер. Используется формат 1,2,3,4,5 для Sinclair II и 6,7,8,9,0
для Sinclair I.
Код самого драйвера (адрес 65129):
┌─- code ───
ORG FE69h
PUSH AF
PUSH BC
LD B, 00011111b
LD A, 239
IN A, (254)
AND B
XOR B
LD (23670), A
LD A, 247
IN A,(254)
AND B
XOR B
LD (23671), A
POP BC
POP AF
JP 56
└── code ───
Откомпилированный вариант (для упрощения непосредственного ввода):
┌─- code ───
245
197
6, 31
62, 239
219, 254
160
168
50, 118, 92
62, 247
219, 254
160
128
50, 119, 92
193
241
195, 56, 0
└── code ───
Для активации работы драйвера используем такую подпрограмму:
┌─- code ───
PUSH AF
DI
LD A, 9
LD I, A
IM2
EI
POP AF
RET
└── code ───
Откомпилированная: 254, 243, 62, 9, 237, 71, 237, 94, 251, 241, 201
Для остановки работы драйвера исполняем следующую процедуру:
┌─- code ───
DI
IM1
EI
RET
└── code ───
Откомпилированная: 243, 237, 86, 251, 201
В результате состояние джойстика Sinclair I будет записываться в системную
переменную SEED (адрес: 23670), а Sinclair II в SEED+1 (23671). О состоянии
джойстика говорят отдельные биты: стрельбы - D0, вверх - D1, вниз - D2, вправо
- D3, влево - D4. Если бит установлен - клавиша нажата, если сброшен - не
нажата. Т.к. системная переменная SEED используется генератором случайных
чисел, то может оказаться необходимым изменить адрес записи состояний
джойстиков (если это нарушит нормальную генерацию псевдослучайных чисел).

от: Wladimir Bulchukey
кому: All
дата: 09 May 2006
Hello, Arigato

Ari> Идея: берем бит состояния магнитофона и посылаем его на бипер. В свое
Ari> время я делал специальные загрузчики к своим программам, которые
Ari> выполняли подобный код в течении нескольких секунд, а сразу после
Ari> загрузчика на ленте проговаривалось название программы. Получалось,
Ari> что после загрузки очень маленького загрузчика Спектрум говорил (!)
Ari> название программы с достаточно высоким качеством звука. Еще этот
Ari> метод позволяет защитить программу от копирование с помощью спец
Ari> софта (copy и т.п.), т.к. если за загрузчиком вместо речи сразу будет
Ari> следовать следующий блок, то он окажется пропущенным (из-за паузы в
Ari> несколько секунд).

Вопрос: при обычной загрузке программы на исполнение её загрузчик как-то
пытается распознать речевой фрагмент или просто делает паузу на несколько
секунд?

от: Алексей Валерьевич Акатов
кому: All
дата: 09 May 2006
Hello, Wlodek

Wlo> Вопрос: при обычной загрузке программы на исполнение её загрузчик
Wlo> как-то пытается распознать речевой фрагмент или просто делает паузу
Wlo> на несколько секунд?

В приведенном мною примере зацикливание бесконечное, т.е. через бипер будет
играть все, что поступает с магнитафона. Для загрузчика надо сделать не
бесконечный цикл, а подобрать такое количество итераций, что бы успеть
проговорить запись речи.
P.S. Распозновать ни кто ничего не пытается (это не подсилу Speccy), просто то,
что есть на ленте, то и воспроизводится...

от: Robus
кому: All
дата: 10 May 2006
Hello, Arigato

А у меня то же есть весёлая процедурка, интересно кто-нибудь узнает что это за
звук, который она выдаст ?
┌─- CODE ───

LD HL,0
LD A,L
M1 RRCA
RRCA
AND 15
LD E,A
LD D,0
PUSH HL
LD L,(HL)
CALL 949
POP HL
DEC L
JR NZ,M1
RET

└── CODE ───


И ещё вот эта:
┌─- CODE ───

LD HL,0
LD DE,1
M1 PUSH HL
LD L,(HL)
PUSH DE
CALL 949
POP DE
POP HL
DEC L
JR NZ,M1
RET

└── CODE ───

от: TomCaT
кому: All
дата: 10 May 2006
Hello, Arigato

Ari> Получалось, что после загрузки очень маленького загрузчика Спектрум
Ari> говорил (!) название программы с достаточно высоким качеством звука.
Ari> Еще этот метод позволяет защитить программу от копирование с помощью
Ari> спец софта (copy и т.п.), т.к. если за загрузчиком вместо речи сразу
Ari> будет следовать следующий блок, то он окажется пропущенным (из-за
Ari> паузы в несколько секунд).

То-то я думал, зачем дискованый "Armageddon Man" что-то говорит... красиво,
конечно, но это -- бывшая tape-защита... яясно :)

от: Алексей Валерьевич Акатов
кому: All
дата: 10 May 2006
Hello, Robus

Rob> А у меня то же есть весёлая процедурка, интересно кто-нибудь узнает
Rob> что это за звук, который она выдаст ?

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

от: Robus
кому: All
дата: 11 May 2006
Hello, Arigato

Ari> Если не трудно, приведи откомпилированный вариант в десятичной
Ari> системе, что бы с помощью POKE ввести. Просто ради такой маленькой
Ari> проги даже ассемблер запускать не хочется, а переводить вручную
Ari> лень...

Hу зачем же поками, сделаем прямо загрузчик, в моём асме это всего 3 минуты. =)

Файл: Less-003.zip http://zx.pk.ru/attachment.php?attachmentid=3186

от: Valery Grigoriev
кому: All
дата: 14 May 2006
Hello, Arigato

Ari> Воспроизведение магнитофонной записи через бипер Спектрума:
Ari> Код:
Ari> DI
Ari> IN A, (254)
Ari> RRA
Ari> RRA
Ari> OUT (254), A
Ari> JR $ - 8

А я быстрее, причём намного быстрее

1) Вариант без всяких изворотов - это твой

2) вариант с изворотами - в D заполняем #40, после чего если добавить после in
a,(254) add a,d то во флаге переноса будет значение нужного бита (кто не верит
пусть проверит)

Тогда

DI
IN A, (254)
ADD A,D
OUT (254), A
JR $ - 7

3) И это не предел
Переход всегда осуществляется по одному и тому же адресу... а значит можно его
запрограммировать и ускориться
Даже если просто вголую заменить JR на JP то уже каждый цикл будет на 2 такта
быстрее (10 тактов для JP и 12 тактов для JR)

DI
LD HL,METKA
METKA:IN A, (254)
ADD A,D
OUT (254), A
JP (HL)

4) И это не предел, можно ещё уменьшить затраты (как?).

Просто! Развернём

DI
LD HL,METKA
METKA:IN A, (254)
ADD A,D
OUT (254), A

IN A, (254)
ADD A,D
OUT (254), A



IN A, (254)
ADD A,D
OUT (254), A

JP (HL)

В этом случае накладные расходы связанные с переходом JP (HL) будут
минимальные, и быстрее проигрывать состояние УХА ничего не будет (по крайней
мере напрямую).

А вот если работать через память (вначале оцифровывать а затем проигрывать)там
можно уж совсем быстро (за 21 такт), но это уже будет совсем некороткая
процедурка (((-;

А если просто (заранее оцифрованный звук) выводить там и до 12 тактов можно
дорасти (((-; Если заинтересовались читайте мою статью, в 3-Bit была первая
часть, а вторая часть пока неопубликована.




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

Похожие статьи:
Проходилки - Секреты по прохождению игр: Robin of Ssherwood.
С миру по биту - письма читателей об играх, дискаводах и демах.
Информация - Для личных писем.
Softmaking - территория закона. О проблемах пиратства на Speccy.
Анкета - Sсаlеsmаnn.

В этот день...   19 апреля