+-----------------------------+ | --- ПРОГРАММИСТАМ --- |# +-----------------------------+# ############################## ЧАСТь #2 ------------------- Magic на Scorpion'e ZS 256 ---------------------------- Вы наверное встречали таки прог- раммы или игры в которых при на- жатии на кнопку Magic ничего не происходит или авторы этих про- изведений прикалываются , т.е. если вы нажмете на Magic, то на экране появляется прикольная надпись или что - то вроде того. Так вот , если вы хотите сделать тоже такой прикол и у вас есть компьютер Scorpion ZS-256, то Вы можете прочитать эту главу, а те у кого нет этого компьютера, могут просто пропустить пару страниц. Для тех кто не знает как можно переключать банки памяти (стра- ницы) я покажу как это делается. Для переключения страниц с 0 по 7 нужно использовать порт #7FFD. Для того чтобы переключить 2 страницу нужно записать в порт #7FFD число #12 : ( число в порт записывается командой OUT (С),А , где С-номер порта , в аккумуляторе А-число ) LD А,#12 LD ВС,#7FFD OUT (С),А RET При помощи этой процедуры Вы можете переключать страницы в обычном ZX-Spectrum'е 128кб. +------------------------------+ | Таблица | | --------- | | страница число которое вы | | будете записывать| | в порт #7FFD. | | 0 #10 | | 1 #11 | | 2 #12 | | З #1З | | 4 #14 | | 5 #15 | | 6 #16 | | 7 #17 | +------------------------------+ Страница 5 всегда расположена в области #4000-#7FFF. Страница 2 в области #8000-#BFFF А в области #С000-#FFFF может находиться любая из страниц с номером 0...7. Для того чтобы переключить стра- ницы с номерами 8...15 нужно использовать дополнительный порт #1FFD. Например, если вы хотите переключить 10 страницу, то вам сначала нужно переключить 2 страницу, а затем записать число #10 в порт #1FFD LD А,#12 ;2 страница LD ВС,#7FFD OUT (С),А LD А,#10 LD ВС,#1FFD OUT (С),А RET В результате переключиться 10 страница - 8+2=10. +------------------------------+ | Таблица #2 | | ------------ | |дополнитель- нужно сначала | |ные страницы переключить | | страницу: | | 8 (0+8=8) 0 | | 9 (1+8=9) 1 | | 10 (2+8=10) 2 | | 11 (З+8=11) З | | 12 (4+8=12) 4 | | 1З (5+8=1З) 5 | | 14 (6+8=14) 6 | | 15 (7+8=15) 7 | | а затем записать| | #10 в порт #1FFD| +------------------------------+ Если переключена 10 страница и вы хотите обратно переключить 2 страницу, то просто нужно запи- сать 0 (ноль) в порт #1FFD. LD А,0 LD ВС,#1FFD OUT (С),А RET Вместо LD А,0 можно использовать XOR А (обнуление аккумулятора). Если вы хотите чтобы при нажатии на Magic компьютер просто завис, то можете воспользоваться про- цедурой: LD А,#10 LD ВС,#7FFD OUT (С),А LD ВС,#1FFD OUT (С),А LD HL,#С000 LD DE,#С001 LD ВС,#ЗFFF LD (HL),0 LDIR LD А,0 LD ВС,#1FFD OUT (С),А RET Эта защита основана на затирании 8 страницы , где расположена основная часть теневого монитора Как она работает: Переключается 0 страница,затем 8 -ая В HL устанавливаем адрес на чала (буфера) 8 страницы. В DE - адрес второго байта буфера. А ВС - счетчик (длина страницы-#ЗFFF) Командой LD (HL),0 очистили пер вый байт буфера, а потом перед- винули все содержимое буфера на один байт и в итоге очистили вто рой байт. Во время работы команды LDIR содержимое HL,DE,ВС не остаются неизменными. После переброски каждого очередного байта HL и DE увеличивается на единицу, а ВС на единицу уменьшается. Благодаря этому после переброски первого байта во второй, DE уже укажет на третий,а HL "подхавит" нулевой байт из второй ячейки и так далее. В общем, весь буфер будет затерт. Вместо нуля можно использовать любое число от 0 до 255 (#0-#FF). Затем снова переключаестя 0-ая страница. Если вы хотите чтобы при нажатии на Magic запускалась ваша прог- рамма то эта процедура как раз для вас : LD HL,ADDR LD А,#10 LD ВС,#7FFD OUT (С),А LD ВС,#1FFD OUT (С),А LD А,255 LD (#СOбЗ),А LD (#С064),HL XOR А OUT (С),А RET ADDR DI IM 1 LD А,#10 ;нужная вам ; страница LD ВС,#7FFD OUT (С),А XOR А LD ВС,#1FFD OUT (С),А EI ; Начало вашей программы... Как она работает: В HL загружается адрес вашей программы. Переключается 8 стра- ница. В аккумулятор А записываем 255 и заносим это значение по адресу #СOбЗ. Адрес вашей прог- раммы записывается в #С064. Переключается 0 страница. ИНВЕРТИРОВАНИЕ СИМВОЛА ВЕРТИКАЛЬНО ------------------------ Эта процедура инвертирует символ вертикально . Например если стрелка направлена вверх, должна стать стрелкой,направленной вниз и наоборот. LD HL,ADDR ;адрес символа ;в ОЗУ (ПЗУ) LD D,Н LD Е,L LD В,8 LOP1 LD А,(HL) INC HL PUSH AF DJNZ LOP1 LD В,8 LOP2 РОР AF LD (DE),А INC DE DJNZ LOP2 RET Как она работает: В пару регистров HL загружает- ся адрес данных символа. Этот же адрес затем копируется в DE. В регистр В загружается значение 8 для использования регистра в ка- честве счетчика. Для каждого байта в аккумулятор загружается имеющееся в насто- ящий момент значение. HL увели- чивается, указывая на следующей байт, а содержимое аккумулятора помещается на стек. Счетчик уменьшается, и, если он не равен 0, подпрограмма возвращается, чтобы повторить процесс для сле- дующего байта. В регистр "В" по- вторно загружается значение 8, чтобы снова использовать его в качестве счетчика. Изображение символа сохранено на стеке. Процедура LOP2 возвращает дан- нные со стека на то же знако- место,но уже в обратном порядке. Байт за байтом берутся со стека и через аккумулятор помещаются по адресу, содержашемуся в DE. DE увеличивается, чтобы указать на следующий байт, а счетчик уменьшается. Если он не равен 0, процедура возвращается к LOP2. В противном случае процедура завершает свою работу. ИНВЕРТИРОВАНИЕ СИМВОЛА ГОРИЗОНТАЛЬНО ------------------------ Эта процедура инвертирует символ горизонтально. Если стрелка нап- равлена влево,становится направ- ленной вправо. LD HL,ADDR ;адрес символа LD А,8 LOP1 LD В,8 LOP2 RR (HL) RL С DJNZ LOP2 LD (HL),С INC HL DEC А OR А JR NZ,LOP1 RET Как она работает: В пару регистров HL загружается адрес данных символа,а в аккуму- лятор загружается количество байтов, которые должны быть ин- вертированы.В регистр В загружа- ется число битов в каждом байте он используется, как счетчик. Байт с адресом в HL сдвигается вправо таким образом,что крайний правый бит копируется во флаг переноса. С - регистр сдвигается влево так, что флаг переноса ко- пируется в крайний правый бит. Счетчик уменьшается. Если счетчик не равен 0, проис- ходит переход к LOP2 для работы со следующем пикселом. Инвертированный байт , который находится в регистре С, помеща- ется в ячейку, из которой он был взят. HL увеличивается, указывая на следующий байт , а аккумулятор уменьшается.Если он не равен 0, происходит переход к LOP1, иначе процедура завершает свою работу. СДВИГ АТРИБуТОВ ВЛЕВО ------------------------ Эта процедура сдвигает атрибуты экрана на одно знакоместо влево. LD HL,22528 LD А,* ;значение 0-255 LD С,24 LOP1 LD В,З1 LOP2 INC HL LD Е,(HL) DEC HL LD (HL),Е INC HL DJNZ LOP2 LD (HL),А INC HL DEC С JR NZ,LOP1 RET Как она работает: В пару регистров HL загружается адрес области атрибутов. Аккуму- лятор загружается значением ат- рибута,вводимым в правую колонку В регистр С загружается коли- чество строк для сдвига. В реги- стр В заносится число на 1 мень- шее,чем число символов в строке, чтобы он использовался,как счет- чик.HL увеличивается, чтобы ука- зать на следующий атрибут, который загружается в Е-регистр. HL уменьшается и по адресу HL помещается значение из Е-реги- стра. HL увеличивается вновь, чтобы показать на следующий ат- рибут.Регистр В уменьшается и, если он не равен 0, то происхо- дит переход к LOP2. HL теперь указывает на правую колонку и по адресу HL помещается значение из аккумулятора. HL увеличивается, чтобы показать на следующую строку.Счетчик строк уменьшается и если он не равен 0,то происхо- дит переход к LOP1, иначе проце- дура завершает свою работу. СДВИГ АТРИБуТОВ ВПРАВО ------------------------ Эта процедура сдвигает атрибуты экрана на одно знакоместо вправо LD HL,2З295 LD А,* ;значение 0-255 LD С,24 LOP1 LD В,З1 LOP2 DEC HL LD Е,(HL) INC HL LD (HL),Е DEC HL DJNZ LOP2 LD (HL),А DEC HL DEC С JR NZ,LOP1 RET Если вы разобрались с процедурой "Сдвиг атрибутов влево" , то вы без труда разберетесь и с этой процедурой.Эти процедуры похожи друг на друга и я не стал пере- писывать одно и тоже два раза. Разбирайтесь сами. ПЕЧАТЬ СООБЩЕНИЯ НА ЭКРАНЕ ---------------------------- Эта процедура поможет вам вывес- ти на экран ваше сообщение. LD А,2 CALL 5бЗЗ LD HL,ТЕХТ CALL PRINT RET PRINT LD А,(HL) СР 255 RET Z RST 16 INC HL JR PRINT ТЕХТ DEFB 22,10,10 DEFM "SCORPION ZS 256" DEFB 255 Как он работает: В аккумулятор А загружаем номер потока 2 (вывод на основ- ной экран). Устанавливаем поток номер 2 при помощи подпрограммы расположеной в ПЗУ по адресу 5бЗЗ.В регистровую пару HL зано- сим адрес вашего сообщения.Вызы- ваем процедуру PRINT. Эта про- цедура осуществляет вывод симво- ла в текущий поток при помощи RST 16 (вывод символа в поток). А сейчас разберем с чего должно начинаться и заканчиваться ваше сообщение. В этом примере первым стоит код управлением позицией печати АТ.Как в обычном BASIC'е после него указываются координа- ты печати. Сообщение должно заканчиватся кодом 255. ВВОД СИМВОЛА C КЛАВИАТуРЫ --------------------------- Для опроса клавиатуры чаще всего используют переменную 2З560, она содержит код последней нажатой клавиши. XOR А LD (2З560),А KLOP LD А,(2З560) OR А JR Z,KLOP RET Как она работает: Обнуляем аккумулятор , заносим его значение в переменную 2З560. Проверяем эту переменную на 0, если она равна 0, то происходит переход к KLOP. Так будет продолжаться без конца пока не будет нажата какая либо клавиша. ЗВуКОВОЙ СИГНАЛ ----------------- Подпрограмма расположена в ПЗУ с адреса 949 (#OЗВ5). Перед вызовом подпрограммы необ- ходимо занести в регистровы пары HL и DE значение от 0 до 655З5, пропорциональные,соответственно, частоте звукового сигнала и его длительности.При этом нужно учи- тывать линейную зависимость между частотой и длительностью - чем выше тон, тем короче звук. Необходимые значения рассчитыва- ются следующем образом : HL=(4З7500/f)-З0.125 DE=f*t где f-частота в Гц,t-время в сек Например, для воспроизведения в течении 1 секунды ноты <<ДО>> первой октавы (частота примерно 261 Гц) в HL помещаем число 1646 а в DE число 261. LD HL,1646 LD DE,261 CALL 949 RET Текст написал Когун Олег. из ChemneSoft+ __________________________________________