PC-01 Lviv

It is currently 29 Mar 2024, 01:07

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00




Post new topic  Reply to topic  [ 49 posts ]  Go to page Previous 1 2 3 4 Next
Author Message
PostPosted: 13 Oct 2012, 06:20 
Offline

Joined: 23 Aug 2012, 12:28
Posts: 123
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.


Top
   
PostPosted: 13 Oct 2012, 14:23 
Offline

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


Top
   
PostPosted: 14 Oct 2012, 09:50 
Offline
User avatar

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

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

_________________
Carthago delenda est, Carthaginem delendam esse


Top
   
PostPosted: 15 Oct 2012, 00:06 
Offline

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


Top
   
PostPosted: 15 Oct 2012, 09:42 
Offline

Joined: 23 Aug 2012, 12:28
Posts: 123
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", в котором будет воспринят адрес из скобок и осуществлен переход по этому адресу.


Top
   
PostPosted: 15 Oct 2012, 10:09 
Offline

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


Top
   
PostPosted: 15 Oct 2012, 14:47 
Offline
User avatar

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

_________________
Carthago delenda est, Carthaginem delendam esse


Top
   
PostPosted: 17 Oct 2012, 15:28 
Offline

Joined: 23 Aug 2012, 12:28
Posts: 123
Небольшой сборник баянов.
Пара общеальтаирских особенностей:
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.


Top
   
PostPosted: 17 Oct 2012, 16:49 
Offline

Joined: 23 Aug 2012, 12:28
Posts: 123
Пара дополнений про 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
Top
   
PostPosted: 18 Oct 2012, 22:47 
Offline

Joined: 07 Dec 2010, 16:54
Posts: 227
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", в котором будет воспринят адрес из скобок и осуществлен переход по этому адресу.
ну, если такая пьянка пошла, то можно таблицу токенов расширить, она настраиваемая и этим пользовались.


Top
   
PostPosted: 19 Oct 2012, 05:55 
Offline

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


Top
   
PostPosted: 19 Oct 2012, 16:04 
Offline

Joined: 23 Aug 2012, 12:28
Posts: 123
Уже несколько раз писал про USR, но не фиксировал, что аргумент из скобок записывается в вещественный аккумулятор 24Dh-250h.


Top
   
PostPosted: 21 Oct 2012, 09:48 
Offline

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


Top
   
PostPosted: 22 Oct 2012, 17:06 
Offline
User avatar

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

_________________
Carthago delenda est, Carthaginem delendam esse


Top
   
PostPosted: 22 Oct 2012, 20:49 
Offline

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


Attachments:
CIRC.ZIP [536 Bytes]
Downloaded 335 times
Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 49 posts ]  Go to page Previous 1 2 3 4 Next

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
cron
Powered by phpBB® Forum Software © phpBB Limited