| 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 была первая
 часть, а вторая часть пока неопубликована.
 
 |