PC-01 Lviv
http://pc01.lviv.ua/forum/

Стандартный Basic 2.0
http://pc01.lviv.ua/forum/viewtopic.php?f=22&t=189
Page 3 of 4

Author:  ivagor [ 13 Oct 2012, 06:20 ]
Post subject:  Re: Стандартный Basic 2.0

CIRCLE и PAINT взгляну, но судя по тому, как они рисуют (визуально), реализованы они хорошо.
Небольшое дополнение про LIST и USR. В том посте я не упомянул DEFUSR. Связка DEFUSR + USR (если нужно вызывать каждый раз разные подпрограммы) работает примерно в 2,5 раза быстрее POKE+POKE+USR, но LIST, как ни странно, все же быстрее. И даже если только один раз использовать DEFUSR и вызывать все время одну процедуру, то последовательность LISTов быстрее последовательности USR примерно в 2 раза. С другой стороны, из USR проще вернуть результат в переменную, стоящую в левой части. Хотя штатной поддержки нет, но можно сохранить нужное значение в вещественном аккумуляторе (24Dh-250h). А вобще для передачи аргументов машиннокодовым процедурам и возврата значений можно использовать технику, предложенную (для векторовского бейсика, но разница в основном только в адресах процедур) Филипповым http://sensi.org/~svo/scalar/media/w/Vector_User.djvu страницы 41-43.

Author:  ivagor [ 13 Oct 2012, 14:23 ]
Post subject:  Re: Стандартный Basic 2.0

Для львовистов (или как правильно?) наверно это привычно, а для меня удивительно - PAINT жужжит, из-за постоянных out 0C2h с 0 и 0FFh (неаккуратно сделали). Меняя форму и размеры заливаемой фигуры можно влиять на высоту и длительность жужжания.

Author:  liberation [ 14 Oct 2012, 09:50 ]
Post subject:  Re: Стандартный Basic 2.0

Quote:
Для львовистов (или как правильно?) наверно это привычно, а для меня удивительно - PAINT жужжит, из-за постоянных out 0C2h с 0 и 0FFh (неаккуратно сделали). Меняя форму и размеры заливаемой фигуры можно влиять на высоту и длительность жужжания.
Я подозреваю, что переключение через 0 и 0xFF было реализована еще тогда, когда порт 0xC2 не отвечал за вывод звука и прочие эффекты, только за подключение VRAM. Иначе такую небрежность со стороны разработчиков трудно объяснить (гусары, ни слова про раздолбайство). :D

Кстати, еще вопрос, был ли ПК-01 с пищалкой изначально.

Author:  sadfsdfsdaf [ 15 Oct 2012, 00:06 ]
Post subject:  Re: Стандартный Basic 2.0

Quote:
С другой стороны, из USR проще вернуть результат в переменную, стоящую в левой части. Хотя штатной поддержки нет, но можно сохранить нужное значение в вещественном аккумуляторе (24Dh-250h)
есть varptr(), можно писать сразу в нужные переменные
Quote:
Для львовистов (или как правильно?) наверно это привычно, а для меня удивительно - PAINT жужжит, из-за постоянных out 0C2h с 0 и 0FFh (неаккуратно сделали). Меняя форму и размеры заливаемой фигуры можно влиять на высоту и длительность жужжания.
не только он, ещё locate (и ещё ряд команд)

Author:  ivagor [ 15 Oct 2012, 09:42 ]
Post subject:  Re: Стандартный Basic 2.0

Quote:
есть varptr(), можно писать сразу в нужные переменные
Quote:
А вобще для передачи аргументов машиннокодовым процедурам и возврата значений можно использовать технику, предложенную (для векторовского бейсика, но разница в основном только в адресах процедур) Филипповым http://sensi.org/~svo/scalar/media/w/Vector_User.djvu страницы 41-43.
Принципиальное преимущество USR перед LIST - его можно использовать сразу в выражениях, типа A=B+USR(0)*С. Если это не нужно, то, конечно, можно использовать хоть USR, хоть LIST "с параметрами" (как в ссылке на материал Филиппова, что я привел), передавая в качестве параметров переменные, в которые машиннокодовая процедура запишет результат, найдя адреса по именам (использовав машиннокодовый аналог varptr). А можно даже не передавать имена переменных в качестве параметров, а просто заранее определиться, какие переменные будут использоваться для возврата результатов.
Можно совместить "поведение как функции" USR и "вызов с непосредственно заданного адреса" LIST, задавая в качестве аргумента USR адрес вызываемой подпрограммы. Тогда DEFUSR должен указывать на "диспетчер USR", в котором будет воспринят адрес из скобок и осуществлен переход по этому адресу.

Author:  ivagor [ 15 Oct 2012, 10:09 ]
Post subject:  Re: Стандартный Basic 2.0

Quote:
не только он, ещё locate (и ещё ряд команд)
Скорее всего щелкающие/жужжащие операторы еще есть, но конкретно в locate выводят FDh и FFh в порт C2h, т.е. звуковой 0й бит не трогают. Может надо какое-то специфическое сочетание параметров?
Еще могут быть щелчки при переходах от операторов, в которых переключение ВОЗУ по FD/FF к операторам с 00/02.
Меня несколько удивляет использование разных вариантов (FD/FF, 00/02, 00/FF) в разных случаях.

Author:  liberation [ 15 Oct 2012, 14:47 ]
Post subject:  Re: Стандартный Basic 2.0

Quote:
Еще могут быть щелчки при переходах от операторов, в которых переключение ВОЗУ по FD/FF к операторам с 00/02.
Меня несколько удивляет использование разных вариантов (FD/FF, 00/02, 00/FF) в разных случаях.
Раскопки на форуме позволили найти интересную реплику sadfsdfsdaf по этому поводу:
Quote:
с принтером ещё была проблема. всё по той же причине - переключения видео-ОЗУ 2-мя способами, на него уходили лишние сигналы стробирования, в результате чего печатался мусор в ходе работы LOCATE/PAINT

Author:  ivagor [ 17 Oct 2012, 15:28 ]
Post subject:  Re: Стандартный Basic 2.0

Небольшой сборник баянов.
Пара общеальтаирских особенностей:
1. Если в качестве аргумента VAL сначала записано нормальное число, а потом ерунда, то результатом преобразования будет только "нормальное число". Например VAL("12#$%^&*") даст 12.

2. Т.к. стек для FOR/NEXT и GOSUB/RETURN общий, то их "перекрещивание" приводит к ошибкам.
Например
10 FOR I=1 TO 1
20 GOSUB 100
30 STOP
100 NEXT
110 RETURN
выдаст ?NF (NEXT без FOR) в строке 100

а если так
10 GOSUB 100
20 NEXT
30 STOP
100 FOR I=1 TO 1
110 RETURN
то, выдаст ?NF (NEXT без FOR) в строке 20, т.е. RETURN "сбросит" цикл, начатый в строке 100.

3. Львовский баян. Палитра 7, задаваемая с использованием процедуры 0DE3Ch (в т.ч. оператором COLOR) совпадает с палитрой 0.

Author:  ivagor [ 17 Oct 2012, 16:49 ]
Post subject:  Re: Стандартный Basic 2.0

Пара дополнений про VAL
1. Пробелы в аргументе пропускаются, поэтому A=VAL("1 2 3") присвоит A=123.
2. Сразу я что-то не сообразил, а ведь игнорирование "ерунды" после содержательной части дает возможность иметь различающиеся "содержательные" и отображаемые числа, аналогично подмене номеров строк в GOTO/GOSUB (http://lvovpc.ho.ua/forum/viewtopic.php ... 9&start=26). Пример приложил.

Attachments:
VAL225.ZIP [166 Bytes]
Downloaded 391 times

Author:  sadfsdfsdaf [ 18 Oct 2012, 22:47 ]
Post subject:  Re: Стандартный Basic 2.0

Quote:
Еще могут быть щелчки при переходах от операторов, в которых переключение ВОЗУ по FD/FF к операторам с 00/02.
Думаю, это оно и было, т.к. в основном коде используется 00/02.
Услышать легко, например, запустить заводскую игру "Ракета" (на Бейсике), там этот эффект даже "музыкальным фоном" выступает :-)
Quote:
3. Львовский баян. Палитра 7, задаваемая с использованием процедуры 0DE3Ch (в т.ч. оператором COLOR) совпадает с палитрой 0.
Не факт, в доке так прямо и сказано - палитры 7 нету :-)
Quote:
<палитра> - номер палитры. Параметр должен принимать значения в диапазоне от 0 до 6.
Quote:
2. Т.к. стек для FOR/NEXT и GOSUB/RETURN общий, то их "перекрещивание" приводит к ошибкам.
А вот это скорее "фича", код самого бейсика я не смотрел, но такое поведение оговаривалось в документации. А, например, в трансляторах форта вообще обычно специально проверяют флаг на вершине стека управления, чтобы не смешивать элементы управляющих структур (хотя можно! М.Гассаненко в своё время предлагал для этого случая обобщить доступ к этому стеку и предоставить в виде открытой спецификации (у него ряд статей был, типа такой: "Открытый интерпретатор: переносимость манипуляций на стеке возвратов")).
Quote:
Можно совместить "поведение как функции" USR и "вызов с непосредственно заданного адреса" LIST, задавая в качестве аргумента USR адрес вызываемой подпрограммы. Тогда DEFUSR должен указывать на "диспетчер USR", в котором будет воспринят адрес из скобок и осуществлен переход по этому адресу.
ну, если такая пьянка пошла, то можно таблицу токенов расширить, она настраиваемая и этим пользовались.

Author:  ivagor [ 19 Oct 2012, 05:55 ]
Post subject:  Re: Стандартный Basic 2.0

Quote:
Quote:
3. Львовский баян. Палитра 7, задаваемая с использованием процедуры 0DE3Ch (в т.ч. оператором COLOR) совпадает с палитрой 0.
Не факт, в доке так прямо и сказано - палитры 7 нету :-)
Quote:
<палитра> - номер палитры. Параметр должен принимать значения в диапазоне от 0 до 6.
Ну я доку (про 0-6) почитал, посмотрел, что палитру 7 задать можно и она совпадает с 0, подумал, что про это наверняка в каких-нибудь "секретах ПК-01" писали и поэтому повторение этого факта в своем исполнении обозвал баяном.

Author:  ivagor [ 19 Oct 2012, 16:04 ]
Post subject:  Re: Стандартный Basic 2.0

Уже несколько раз писал про USR, но не фиксировал, что аргумент из скобок записывается в вещественный аккумулятор 24Dh-250h.

Author:  ivagor [ 21 Oct 2012, 09:48 ]
Post subject:  Re: Стандартный Basic 2.0

Встретил странное утверждение в описании языка "БЕЙСИК" (цитирую по BasicBook.pdf):
"Индексная переменная обозначается записью, состоящей из идентификатора массива и следующего за ним в круглых скобках списка индексов. Число индексов не должно превышать два и в списке они разделяются запятой.", т.е. якобы допустимы максимум двумерные массивы.
Максимальное число индексов массива в львовском варианте бейсика равно 13, если взять минимальное количество элементов (2) по каждой размерности, что соответствует объявлению
DIM A[$](1,1,1,1,1,1,1,1,1,1,1,1,1)
Массив при этом (за вычетом небольшой преамбулы) будет занимать 2^13*4=32768 байт. Массив с 14 индексами бейсик не даст объявить, а если бы и дал, то для его размещения не хватило бы памяти.

Author:  liberation [ 22 Oct 2012, 17:06 ]
Post subject:  Re: Стандартный Basic 2.0

Никаких откровений не сообщу, просто поделюсь наблюдением, которое вынес, просматривая стандартную документацию. Так вот, операторы DEF USR, CIRCLE и PAINT вынесены в отдельное приложение "Дополнительные операторы Бейсика". Можно предположить, что они были добавлены в интерпретатор в последнюю очередь. Любопытно, что в разделе "2.3 Графика" руководства программиста оператор PAINT описан как отдельная процедура в ПЗУ ("2.3.7 Закраска замкнутой фигуры ( PAINT )."), что подразумевает автономность от интерпретатора, тогда как CIRCLE вообще нигде не упоминается, скорее всего он слишком крепко завязан на Бейсике. Интересно, насколько трудно было бы вызвать CIRCLE из программы в кодах? Или выставление необходимых системных переменных и перемещение кода в ОЗУ напрочь лишало такую затею смысла?

Author:  ivagor [ 22 Oct 2012, 20:49 ]
Post subject:  Re: Стандартный Basic 2.0

Quote:
Интересно, насколько трудно было бы вызвать CIRCLE из программы в кодах?
Приложил самый простой вариант - рисование круга, но можно рисовать и дугу и эллипс.

Attachments:
CIRC.ZIP [536 Bytes]
Downloaded 335 times

Page 3 of 4 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/