PDA

Просмотр полной версии : Полезные наработки



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

Воспроизведение магнитофонной записи через бипер Спектрума:

DI
IN A, (254)
RRA
RRA
OUT (254), A
JR $ - 8
Откомпилированное:

243
219, 254
31
31
211, 254
24, 248

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

Arigato
08.05.2006, 22:03
Небольшой драйвер Sinclair-джойстиков
Полезным он окажется при программировании на Бейсике. В отличии от Kempston джойстика, который можно опросить через порт 31 (если память не изменяет) прямо Бейсик-командой, с Sinclair джойстиком дела обстоят хуже. Облегчит эту задачу преведенный драйвер. Используется формат 1,2,3,4,5 для Sinclair II и 6,7,8,9,0 для Sinclair I.
Код самого драйвера (адрес 65129):

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
Откомпилированный вариант (для упрощения непосредственного ввода):

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
Для активации работы драйвера используем такую подпрограмму:

PUSH AF
DI
LD A, 9
LD I, A
IM2
EI
POP AF
RET
Откомпилированная: 254, 243, 62, 9, 237, 71, 237, 94, 251, 241, 201
Для остановки работы драйвера исполняем следующую процедуру:

DI
IM1
EI
RET
Откомпилированная: 243, 237, 86, 251, 201
В результате состояние джойстика Sinclair I будет записываться в системную переменную SEED (адрес: 23670), а Sinclair II в SEED+1 (23671). О состоянии джойстика говорят отдельные биты: стрельбы - D0, вверх - D1, вниз - D2, вправо - D3, влево - D4. Если бит установлен - клавиша нажата, если сброшен - не нажата. Т.к. системная переменная SEED используется генератором случайных чисел, то может оказаться необходимым изменить адрес записи состояний джойстиков (если это нарушит нормальную генерацию псевдослучайных чисел).

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

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

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

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


LD HL,0
M1 LD A,L
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


И ещё вот эта:



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

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

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

Arigato
10.05.2006, 09:50
А у меня то же есть весёлая процедурка, интересно кто-нибудь узнает что это за звук, который она выдаст ?
Если не трудно, приведи откомпилированный вариант в десятичной системе, что бы с помощью POKE ввести. Просто ради такой маленькой проги даже ассемблер запускать не хочется, а переводить вручную лень...

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

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

GriV
14.05.2006, 12:32
Воспроизведение магнитофонной записи через бипер Спектрума:
Код:
DI
IN A, (254)
RRA
RRA
OUT (254), A
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 была первая часть, а вторая часть пока неопубликована.