подскажите новичку, в бейсике можно включить режим 512 для самого интерпретатора, обычного редактирования программ ? очень нравится узкий шрифт Монитора. можно ли так же в Бейсике?
Вид для печати
подскажите новичку, в бейсике можно включить режим 512 для самого интерпретатора, обычного редактирования программ ? очень нравится узкий шрифт Монитора. можно ли так же в Бейсике?
В 2.5 можно только побаловаться
Нормально пользоваться (печатать буквы и рисовать графику) в режиме высокого разрешения можно в Бейсике-Корвет
Есть еще вариант - загрузить в 06Ц Эмулятор Монитора Старт-1200, переключиться в режим высокого разрешения ($, вернее "солнышко"), потом запустить бейсик. Но нормально пользоваться не получится, т.к. 1) Эмулятор Монитора неправильно задает палитру в режиме высокого разрешения; 2) Бейсик-Сигнал нормально не поддерживает режим высокого разрешения.
Если графика не нужна, то еще можно использовать бейсики для cp/m.
Глянул дизассемблированный исходник Бейсика, выложенный в первом посте. Честно говоря - удивлён сколько там неоптимальностей в коде. Ведь нетрудно было написать и короче и быстрее....
Сделал игру (для конкурса) на Бейсике v.2996. Делал и тестировал в эмуляторе V06x (от svofski) - там удобно формат файла .ASC закинул в окошко и не нужно никаких команд набирать всё автоматически запускается. На днях собирал работы для конкурса и конвертнул из .ASC в формат Бейсика .CAS
и запустил его на других эмуляторах - игра запускается показывает меню стартует основная часть и потом виснет на моменте когда скроллинг экрана происходит. Чтобы это могло быть ? Почему в V06x всё работает, а в других эмуляторах виснет ?
Этот CAS в v06x нормально работает? Если да, то проблему надо искать в эмуляции, возможно не в эмуляции самого вектора, а в перехвате загрузки. Если нет, то стоит попробовать конверснуть ASC->CAS каким-нибудь другим способом.
Насколько понимаю, если кинуть ASC в v06x, то он формирует в памяти программу, которая работает и которую надо сохранить из v06x. Не помню, умеет ли v06x сохранять в cas. Если не умеет, то можно сохранить в wav, загрузить wav в другой эмулятор и сохранить в cas.
metamorpho, v06x сохраняет неправильный cas, или v06x не грузит .cas, полученный Vector06CBasic.exe ?
v06x .cas, полученный Vector06CBasic.exe, грузит но также как и другие эмуляторы зависает при работе программы
в тоже самое время v06x ту же самую программу но в формате .asc грузит и всё работает
сохранять в v06x в формате .cas не пробовал, а наверное зря :) нужно будет попробовать
- - - Добавлено - - -
А как сохранять в v06x в формате .cas ?
А, не получается написать CSAVE"TEST" ? Да, я думаю я это недоделал -- у меня локально это частично работает, но я не опубликовывал.
В твоей ситуации наверное можно попробовать сравнить результат загрузки из .CAS с исходным текстом. Это не самое приятное занятие наверное, но я думаю так получится быстрее всего найти проблему и может быть найти способ ее обойти. Если это срочно, присылай текст -- вместе быстрее найдем.
Можно еще так попробовать. С помощью Vector06CBasic конверснуть asc(txt)->cas а потом cas->koi7 и сравнить с исходным вариантом. Теоретически может быть засада в пробелах.
CSAVE"TEST" попробовал - сначала тишина была (просто "проглотил" команду и всё) потом на третий раз пошёл звук куда-то что-то выгрузил, но я так и не нашёл куда :)
Нет это не срочно, надеюсь Lafrom31 сможет запустить на стриме программу через V06x.
А завтра (или сегодня) уже в общий доступ архив конкурсных программ выложу.
Для одноцветной векторной анимации, как в SP_LINE (летне-зимний ретроград), в модернизированных бейсиках лучше использовать тройную буферизацию.
В 2.5 это работает не на 100% хорошо, т.к. если в нем прерывание пришлось на выполнение SCREEN0, то часть цветов (которые успели обработаться) перепрограммируются, а оставшиеся - в следующее прерывание. Идеально (для переключения видеостраниц) перепрограммировать палитру в 2.5 можно только с привлечением ассемблерных подпрограмм. В 2.5 без ассемблера можно уменьшить вероятность попадания прерывания на SCREEN0 за счет минимизации времени выполнения этой команды (минимум перепрограммируемых цветов и по возможности быстрое для интерпретации представление этих цветов).
Очень шустро работает алгоритм.
SCREEN.,1,.,.,.,W,W,W здесь как я понял точки это нули ?
Чем точки использовать лучше ? Это где-то описывалось в руководстве по Бейсику или это ещё одно из "скрытых" возможностей Бейсика ?
IF(X1AND255)<>X1THEN ...... (X1AND255)<>X1 как это расшифровать на русский язык ? :) предполагаю одна часть такая "если Х1>255"
Про "быстрые нули" писал здесь.
Расшифровать IF(X1AND255)<>X1THEN можно так IF X1>255 OR X1<0 THEN
В 2.996 примерно на 4.5%. Одно сравнение, одна логическая операция и скобки против двух сравнений и логической операции.
Можно учесть, что бОльшую часть времени фигура летает вдали от границ и еще немного ускорить.
Вспомнил пример векторной анимации из ZX-РЕВЮ 95\1. Автор оригинальной программы - Ульянов А.М. Картинки мне кажется с PC.
morph1 - однократная анимация без прекалка
morph3 - зацикленная анимация с прекалком
Прокатит, только стоит спрятать &FF00 в переменную и избавиться от скобок. Тогда получается еще ускорить triplbuf7.
Ещё вариант: IF HI(X1) AND 255 THEN
В линейке 2.5 такой функции нет.
Можно еще учесть симметрию фигуры и границ.
Да. Понятно, что это подходит для проверки прямоугольников со стороной от 0 до степени двойки-1. Более общий и, что приятно, более быстрый вариант - использовать массив с отмеченными границами. Приложил пример, еще там учтена симметрия фигуры. К первоначальной идее иллюстрации тройной буферизации это прямого отношения не имеет (тем более "морфинг" более содержательный пример), но пусть летает побыстрее, почему бы и нет. Переводить все переменные на однобуквенные не стал для сохранения читаемости.
Твистер на бейсике, душераздирающее зрелище. Надо конечно делать на асме, но если не хочется, то можно воспользоваться мощью современных эмуляторов. В Emu80 (начиная с 4.0.498) LAlt+PgUp пока не станет приемлемо. В Emu можно удерживать F9.
Upd: twister6 совместим и с режимом 12 МГц в VV (F10).
Ускорил как смог. Здесь аж двухбайтная машиннокодовая процедура, поэтому twister6 (где только бейсик) тоже оставил.
Округление в клонах msbasic (наверняка где-то уже было)
A=SGN(A)*INT(ABS(A)+.5)
В программах иногда используются "бесконечные" циклы с заранее неизвестным числом повторений (может быть реализован выход из цикла по проверке некоторых условий, этот момент я не трогаю).
Как правило для зацикливания в таких случаях используется GOTO назад, например:
1 REM
10 REM
100 REM
199 GOTO234
200 REM
234 REM
999 GOTO199
basic 2.5 - 7900 тактов на итерацию
basic 2.996 - 4100 тактов на итерацию
Можно ускорить подобные циклы используя FOR:
1 REM
10 REM
100 REM
199 FORI=.TO1STEP.:GOTO234
200 REM
234 REM
999 GOTO199 - ошибка, в этой строке должно быть 999 NEXT
basic 2.5 - 5760 тактов на итерацию
basic 2.996 - 2828 тактов на итерацию
Выигрыш очевиден, причем если перед строкой начала цикла (199 в примере) будет больше других строк, то вариант с GOTO будет еще замедляться, а на FOR это не влияет.
В модернизированных бейсиках есть еще один потенциальный плюс - FOR не перебивает кеширование переходов, если они используются и внутри цикла, как в приведенном примере (поэтому в 2.996 относительный выигрыш больше).
Объясни, пожалуйста, почему добавление лишних операторов что-то ускоряет и почему нельзя было просто написать 999 GOTO234 -- в чем смысл 199 GOTO234 ?
Лишний FOR исполняется один раз и это потребует
в basic 2.5 - 4980 тактов
в basic 2.996 - 2272 такта
Т.е. за 2-3 итерации (а цикл то "бесконечный") это время будет скомпенсировано и пойдет чистый выигрыш.
А выигрыш за счет
1) Парсинг NEXT быстрее, чем GOTO+номер
2) Адрес начала цикла в NEXT сохранен FORом и сразу переходим куда надо. В GOTO надо еще найти строку (если речь не о модернизированном бейсике и если номер не совпал с "кешем").
Это порча жизни кешированию переходов и ближе к реальности, когда в содержательной программе внутри цикла будут переходы, скорее всего условные.
Спасибо, я умудрился скопировать хвост варианта NEXT из варианта GOTO, а правильный вариант такой
1 REM
10 REM
100 REM
199 FORI=.TO1STEP.:GOTO234
200 REM
234 REM
999 NEXT
Не хотел там править, чтобы было понятен последующий диалог. Сейчас поправил, надеюсь с разными датами исходного сообщения и правки будет понятнее.
Могу только повторить, что для варианта с GOTO199 это перебивание кеширования номера строки в 2.996, чтобы лучше соответствовало реальным программам, у которых внутри циклов бывают переходы.
Узкоспецифический вопрос - какой вариант записи дробных чисел быстрее для парсинга и преобразования во внутреннее представление?
В 2.5 A=.1 или A=.9 быстрее, чем A=1E-1 или A=9E-1. Но при наличии нулей после запятой вариант с E становится предпочтительнее: A=1E-2 или A=9E-2 быстрее, чем A=.01 или A=.09.
В 2.996 вариант с E всегда быстрее.
Ну и я уже писал, что при частом использовании числа большой (по модулю) степени и/или с большим количеством знаков после запятой его выгоднее присвоить переменной и пользоваться ей.
Понятно. То есть это попытка приблизить бенчмарк к реальности, а не часть рекомендованного паттерна. Тебе наверное трудно в это поверить, но это совершенно не очевидно. Это выглядит в контексте примера как какой-то особый трюк, который позволяет все разогнать в два раза. По-моему совсем не вредно такие примеры подробно документировать.
Согласен, надо было четче разграничить суть и дополнительные бантики.
Суть простая - в "бесконечных" циклах вместо
GOTO назад
быстрее делать так
FORI=.TO1STEP.
...
NEXT
Переменная I выбрана случайным образом, можно использовать и другие буквы.
В msbasicах (даже версий 5.x) нет команды досрочного прерывания цикла FOR...NEXT, но есть как минимум два варианта, как это сделать.
1. Очевидный.
Если мы проверили внутри цикла некое условие и оказалось, что надо цикл прервать, то присваиваем переменной цикла конечное значение и переходим на NEXT.
Строго говоря можно взять значение чуть меньше, главное чтобы (это значение+шаг цикла)>конечное значение. Это может иметь смысл, например если конечное значение дробное, а мы хотим для краткости и скорости использовать целое.
2. Менее очевидный. Годится при наличии вложенных циклов.
Если нам надо досрочно окончить внутренний цикл, то делаем переход за пределы внутреннего NEXT. Главное - надо в NEXT внешнего цикла обязательно добавить имя переменной этого цикла.
NEXT с указанием переменной сбросит со стека "лишнее" и дойдет до своей переменной. Особенно эффективен этот вариант для прерывания сразу нескольких внутренних циклов с выходом во внешний.
Вариант 1 при наличии вложенных циклов тоже годится, но скорее всего вариант 2 будет чуть быстрее, хотя лучше проверять конкретные случаи.
Пробный подход к шейдерной штуке. Невыносимо медленно и по качеству изображения уступает оригиналу, но что-то в этом есть.
С дизером намного лучше, ну и перешел с желтого на зеленый.
Переделал тригонометрию на LUT, в 2.996 ускорение почти в 3 раза (но все равно очень медленно).