Вот вопрос:
10 FLASH 1:PAPER 3:1NK 7:BRIGHT 0
20 PRINT AT 10,12;" "
30 PRINT ATTR (10,12)
ответ:159
подскажите а как наоборот,у меня есть цифра 159,как узнать что
FLASH= 1:PAPER =3:1NK =7
Вид для печати
Вот вопрос:
10 FLASH 1:PAPER 3:1NK 7:BRIGHT 0
20 PRINT AT 10,12;" "
30 PRINT ATTR (10,12)
ответ:159
подскажите а как наоборот,у меня есть цифра 159,как узнать что
FLASH= 1:PAPER =3:1NK =7
разделить число на 8 - остаток = INK, еще на 8 - остаток = Paper, остальное если не 0, то либо Flash=1, либо Bright=1, по обстоятельствам
На бейсике это очень очень медленно наверно будет.
Скажите ведь эта 159 где то хранится,т.е. и если я в эту ячейку занесу другую цифру (другой цвет)
5 poke YYYY,159
10 print at 11,12;"X"
то должно напечатать "Х" определённого цвета (ink paper).
и мне не надо будет указывать ink и paper в бейсике.
Можно так ?
poke 23693, n
А можно и по-другому!
Заранее заготовить четыре таблички по 256 байт.
В первой -- какой Ink будет с этим Attr, во второй -- Paper, третьей -- Bright, четвертой -- Flash.
Взять четыре переменные, обозвать их ink, paper, flash и bright.
Сделать LET ink=<адрес первой таблички> и т. д.
И теперь PEEK (ink+A) как раз будет цветом чернил!
Это будет повеселей моих табличек.
---------- Post added at 19:15 ---------- Previous post was at 19:14 ----------
Но стоп! Разве в Zx Basic-е по-нормальному выполняются логические команды?
Если нет, то типа такого.
let p=аттрибут
let ink=p - (128*(p>128))
let ink=ink - (64*(ink>64))
let ink=ink - (32*(ink>32))
let ink=ink - (16*(ink>16))
let ink=ink - (8*(ink>8))
let paper=INT(p/8)
let paper=paper - (128*(paper>128))
let paper=paper - (64*(paper>64))
let bright=INT(p/64)
letbright=bright - (128*(bright>128))
let flash=INT(p/128)
Но конечно это медленный способ, массив быстрей будет, а самое быстрое - таблички.
Можно и асм-подпрограммку замутить подключив её к DEF FN.
Вот как тут описано: http://zxpress.ru/book_articles.php?id=1539
Но тогда уж и PEEK вместо ATTR :)
Я попробовал.
Получилась функция, расположенная в первой строке.
1 DEF FN a(x,y,p)=USR VAL "23910": REM здесь маш. код
x и y - координаты на экране;
p - параметр, указывающий возвращаемый элемент цвета:
p=7 - ink;
p=56 - paper;
p=64 - bright;
p=128 - flash.
Не советую вводить другие параметры p, проверки корректности нет и может зависнуть!
Для работы нужно, чтобы PROG=23867, иначе необходимо пересчитать значение в кавычках PROG+43
В прикрепленном имедже есть файл primer.B, показывающий работу функции.
З.Ы. Есть небольшая проблема. После первой строки нарушается вывод листинга на экран (его не видно). Введение в следующей строке управляющих кодов цвета, проблему не решило. Может кто знает, как это исправить?
Вложение удалено мной. Причина - устранение проблем с выводом листинга.
Исправленная функция в моем сообщении ниже.
Ну варианты навскидку:
1. Постоянно юзать LIST 10 + ENTER
2. Расположить маш.код не после REM, а где-нибудь в другом месте (скорректировав стек и т.п.)
3. Подправить код - чернеет всё после кода #16 (#5D7B) (упр.код AT и дальше комп понимает что идут коррдинаты, а они обе #29, вот и перемещается позиция печати за экран и выдаётся код ошибки), т.е. можно скорректировать прогу так, чтоб этой цифры не было.
Там (#5D7A) команду LD H,#16 - заменить на:
LD H,#17
DEC H
Ну или вроде того...
Может быть шустрее было-бы сделать по другому.
1. Требуемый параметр всегда задаём в одной и той-же переменной (ну к примеру attr) и там указываем что нужно. 0=инк, 1=папер, 2=бордер, 3=брайт, 4= флэш (хотя нафик он нужен по сути-то, но...)
2. Бэйсик-прога при запуске выясняет значения PROG и адрес переменных attr,x,y и подставляет в соответсвующее место кода.
3. После этого всего (назовём это инициализацией) можно делать так:
LET attr=0:LET x=10:LET y=20 (хотим узнать инк по коорд 10,20)
LET attr=USR адрес кода (в котором уже есть адреса всех нужных переменных (они появились там после инициализации) и который тупо берет эти значения и выяснив что нужно от него в данный момент, возвращает значение атрибута в регистровой паре BC, которую интерпритатор бэйсика уже сам запихает в attr).
Сдаётся мне что это будет быстрей, но могу ошибатся, надо проверять, сравнивать с предыдущими вариантами. Бог в помощь!
P.S. А вообще пора уже писать компилируемый вариант бейсика ("сам-знаеш-кто" не надо кричать "Я ведь тебе говорил!". Помню. Может быть и займусь.)
P.S.S AndTorp (или женя999, кому там надо) зачем это выяснение атрибутов вообще нужно?
Опиши для чего тебе эти числа, может быть как-то проще можно решить?
Спасибо за разъяснение. Исправил.
Возможно и быстрее, но я хотел сделать простую в использовании функцию.
Да, это было бы хорошо! И побольше графических возможностей, как в PRO-DOS. И хорошо бы реализация работы с прерываниями.
Это нужно Жене, я просто попробовал реализовать.
Исправленный вариант.