Просмотр полной версии : Многообразие океанских бейсиков
Возможности "Океана-240" все еще плохо изучены. Одним из источников полезных знаний о его архитектуре, помимо дизассемблирования BIOS и BDOS, являются немногие дошедшие до нас программы на BASIC, да и сами бейсики.
Таковых на сегодня у нас имеется два: IBASIC.COM весом 8192 байт с сигнатурой "OKEAN-240 BASIC INTERPRETER V1.2 04/11/86" внутри, и MBASIC.COM размером 24576 байт, с сообщением "Owned by Microsoft BASIC-80 R.5/240" внутри.
Было бы здорово выпустить этим бейсикам кишки, чтобы понять, какие экзотические операторы там есть для низкоуровневого доступа к железу, а также разобраться со встроенными в BIOS графическими процедурами.
В студию приглашается уважаемый ivagor, который собаку съел на потрошении бейсиков для более популярных платформ.
-----
Литература:
https://zx-pk.ru/threads/23483-rodoslovnaya-bejsikov-dlya-580vm80.html
https://zx-pk.ru/threads/29940-rabochie-yachejki-monitora-240-7.html
MB.COM совсем не возбуждает, вариация cp/m-ного микрософтовского бейсика, навскидку без графики и звука (как обычно).
А вот IBASIC.COM очень интересный, готов поспорить, что он не микрософтовский, это редкость для советских ретрокомпов! И токены есть заманчивые. С другой стороны, с немикрософтовскими я не сталкивался, будет сложнее разобраться.
Возник вопрос - для океана есть плагин для работы с образами дисков? IBASIC я запустил через отладчик, но хотелось бы более цивильно работать.
Возник вопрос - для океана есть плагин для работы с образами дисков?
Эмулятор emu уважаемого b2m (да продлятся годы его и обратит он внимание свое на ящик для личной почты своей) имеет в поставке конфигурацию для работы с флопами, так и называется - Okean 240 fdd.cfg.
- - - Добавлено - - -
Еще интересный момент, как минимум один из этих бейсиков дисковый (а то и оба), вот эта дисковость - она, конечно, CP/M-ная. Но вдруг там есть какие-нибудь штрихи или отпечатки, нехарактерные для пресноводных дисковостей?
Про emu я в курсе, вопрос про какие-нибудь удобные средства для работы с образами дисков.
Про mb.com был не прав, поддержка графики там есть.
- - - Добавлено - - -
Бейсики оба дисковые.
- - - Добавлено - - -
Партизанским способом записал IBASIC в образ, но какой-нибудь плагин для Total Commandera или FARa очень желателен.
С плагинами ничем не помогу, тут нужно подтянуть специалистов по работе с образами CP/M.
Коротко про IBASIC.
1. Выгрузка программы - SAVEимя_программы (без кавычек). Расширение будет BSC
2. Загрузка программы
2.1 Можно как параметр при запуске IBASIC имя_программы
2.2 Можно при старте выбрать OLD и указать имя программы.
2.3 В любой момент можно загрузить по OLD (это типа вместо LOAD).
3. Звук
3.1. BELL - звонок
3.2. SOUND параметр1, параметр2 - я не понял, параметры принимает, передает досу, но в обращение к звуковым портам это не выливается.
4. Графика
4.1 GRAF - очистка экрана, вместо CLS
4.2 RECT x,y - прямоугольник из текущей точки до x,y
4.3 COL цвет
4.4 POS x,y - перемещение графического курсора
4.5 LINE x,y - линия из текущей точки до x,y
5. Выход в дос - SYS
Графические операторы и возможности MB.COM можно посмотреть на примере готовых программ здесь (http://azmaster.narod.ru/Ocean-240/Soft/Disketa.zip) (azmaster). Звук в MUZA.BAS сделан OUTами.
3.1. BELL - звонок
Просто через COUT гонят символ с кодом 7?
3.2. SOUND параметр1, параметр2 - я не понял, параметры принимает, передает досу, но в обращение к звуковым портам это не выливается.
Среди ESC последовательностей, поддерживаемых встроенным эмулятором терминала, есть такая, которая принимает два параметра и складывает их в рабочие ячейки монитора BeepDuration и BeepFreq. Этими ячейками пользуется процедура вывода символа, когда ей передают Bell.
А заливки там не видать? В ESC-файле OKEAH.240 определенно есть заливка контуров.
Просто через COUT гонят символ с кодом 7?
да
Среди ESC последовательностей, поддерживаемых встроенным эмулятором терминала, есть такая, которая принимает два параметра и складывает их в рабочие ячейки монитора BeepDuration и BeepFreq. Этими ячейками пользуется процедура вывода символа, когда ей передают Bell.
Тут я ступил, конечно же SOUND задает частоту и длительность для BELL. Просто я ожидал, что он сам будет бипать.
А заливки там не видать?
Заливки в IBASIC я не заметил.
- - - Добавлено - - -
Дополнение про графику, пропустил 2 оператора.
4.6 SET цвет_изображения,цвет_фона - отличается от COL возможностью менять цвет фона
4.7 SYM выражение для печати - аналог PRINT, но с возможностью задания места для печати с точностью до точки (позицию для печати задает предыдущий графический оператор, удобно использовать POS).
- - - Добавлено - - -
Из полезных функций стоит упомянуть CALL(адрес). Вызывает машиннокодовую процедуру и возвращает в качестве результата содержимое аккумулятора на выходе из процедуры.
Управления текстовым курсором не видно? Позиционирование в обоих режимах (цветном 0 и монохромном), и еще интересно отключение курсора в цветном режиме.
Управления текстовым курсором не видно? Позиционирование в обоих режимах (цветном 0 и монохромном), и еще интересно отключение курсора в цветном режиме.
Специальных средств (операторов, функций) для этого нет. Вобще IBASIC очень дохлый, массивы только одномерные, поддержки строковых переменных нет. Зато есть интересные и даже пожалуй мощные
6. Cредства для взаимодействия с машиннокодовыми процедурами.
6.1 Функция ARG(значение) - задает значение пары BC, которое будет передано CALL
6.2 Функция CALL(адрес), про которую я уже упоминал. На входе: BC - значение заданное в ARG, DE - указатель на специальный стек. В качестве результата возвращает содержимое BA (т.е. B как бы старшая половина регистровой пары, A - младшая). Кроме того можно возвратить значение в "стеке", указатель на который был передан в DE.
6.3 Функция POP() - выбирает значение со "стека", с которым работал CALL. Т.е. CALL кроме результата в BA может вернуть и другие результаты работы машиннокодовой процедуры.
6.4 Функция UNTRAP(). Весьма специфическая. Машиннокодовая процедура, вызываемая по CALL или POKE могут изменить ячейку, отвечающую за "стек перехвата ошибок". Как я понимаю, это нужно для расширения возможностей бейсика, например так можно добавить работу со строковыми переменными. UNTRAP снимает с этого стека значение, т.е. убирает перехват.
Еще можно упомянуть, что есть функция INP для чтения портов. Оператора OUT для записи в порты (в отличие от MB.COM) в IBASIC нет.
Но благодаря мощным возможностям по взаимодействию с машиннокодовыми процедурами можно доопределить нужные вещи, хоть печать esc, хоть запись в порты.
Например, для печати esc можно использовать процедурку
4000h mvi c,1Bh
4002h jmp 0913h
Вызов:
5GRAF
10A=CALL(16384)
20PRINT"1234" - нарисует прямоугольник
или
20PRINT"2345" - нарисует линию
tnt23, понимаю, что это не то, что ты хотел - узнать побольше о железе океана из бейсика. Но такой уж бейсик, в машиннозависимых вещах опирается на bios.
ivagor, монументально. А chr или эквивалента для вывода не-ASCII кодов нет?
В том, другом бейсике, вроде был оператор PLOT, и еще, кажется, оператор переключения видеорежимов.
А chr или эквивалента для вывода не-ASCII кодов нет?
В IBASIC нет, поэтому я предложил использовать машиннокодовую процедуру.
Кратко про графические возможности MB.COM
CLS режим. Младший полубайт. 0 - "обычный" режим 256; 8-15 - режим 256 "early scroll"; 1-7 - режим 512.
SCRN палитра,цвет_фона
COLOR цвет изображения
CURS x,y - перемещение графического курсора (режим 256)
PLOT x,y - рисование линии из текущей точки до x,y (режим 256)
Наличие пробела после ключевого слова обязательно
режим 256 "early scroll"
Что бы это могло быть? некоторый бит в служебной ячейке BIOS запрещает скроллинг совсем.
Что бы это могло быть? некоторый бит в служебной ячейке BIOS запрещает скроллинг совсем.
И так можно сказать. При CLS 8-15 будут скроллится только 2 верхние строки, а основной экран останется неподвижным.
Бит 3 (маска 00001000) ячеек BFDC и BFE6. 0 - можно скроллить, 1 - нельзя.
Завершение эпопеи с IBASIC. Все же решил пробежать по служебным директивам (здесь (https://zx-pk.ru/threads/30047-mnogoobrazie-okeanskikh-bejsikov.html?p=997268&viewfull=1#post997268) три из них под номерами 1, 2, 5)
1. Служебные директивы (только те, которые необычные, RUN и LIST не вижу смысла комментировать)
1.1 SCR - просто стирает текущую программу в памяти (в других бейсиках это часто NEW)
1.2 NEW[имя] - как SCR, но с заданием имени.
1.3 SAVE[имя] - выгрузка программы
1.4 OLD[имя] - загрузка программы
1.5 SYS - выход в дос
1.6.1 NAME - показывает текущее имя программы
1.6.2 NAMEимя - задает новое имя программы
1.7 UNSAVE[имя.BSC] или ERA[имя.BSC] - удаление программы с диска
1.8 LLIST - в данном бейсике синоним LIST, такие дела
1.9 NULLаргумент. Аргумент от 0 до 255. Задание задержки при переходе к новой строке или при скролле.
Замечание по поводу директив с именем в квадратных скобках. Это значит, что имя можно указывать, а можно не указывать, и тогда будет использовано имя заданное при старте программы или через NAME (или запрошено в случае OLD).
Дополнение про GRAF - это не просто очистка экрана, этот оператор установит 3й бит в BFDC и BFE6 и получится аналог CLS 8-15 в MB.COM. Выйти из этого режима можно по директиве LIST
И мне все же интересно, какой бейсик был прототипом. Это явно не микрософт.
- - - Добавлено - - -
Свел заметки по IBASIC в один файл и исправил ошибки.
Дополнение про GRAF - это не просто очистка экрана, этот оператор установит 3й бит в BFDC и BFE6 и получится аналог CLS 8-15 в MB.COM. Выйти из этого режима можно по директиве LIST
Существует как минимум два разных BIOS для "Океана", с разными адресами рабочих ячеек. BFDC и BFE6 (занятно, что сразу в двух местах устанавливается бит), похоже, относятся ко второй версии BIOS, в которой добавлены процедуры работы с НГМД и поддержка клавиатуры изменена в сторону "матричных" вариантов.
OLD и UNSAVE это прям BASIC-PLUS-2 для PDP-11. UNTRAP тоже, но из фортрана откуда-то.
И мне все же интересно, какой бейсик был прототипом. Это явно не микрософт.
Спросить уже не у кого https://ocean.ru/index.php/novosti-left/ob-yavleniya/item/964-ushel-iz-zhizni-dmitrij-alekseevich-tilinin
Можно предположить, что перепиливали с чего-то доступного в период с 82 по 86 год. Не считая совсем экзотики, доступны тогда были СМ ЭВМ, клоны PDP-11, а из восьмибитных даже не сообразить сходу.
Существует как минимум два разных BIOS для "Океана", с разными адресами рабочих ячеек. BFDC и BFE6 (занятно, что сразу в двух местах устанавливается бит), похоже, относятся ко второй версии BIOS, в которой добавлены процедуры работы с НГМД и поддержка клавиатуры изменена в сторону "матричных" вариантов.
Пользуюсь конфигом emu Okean-240 fdd, соответственно там используются образы пзу monitorfdd.bin и cpm80fdd.bin
Спросить уже не у кого
Очень жаль
По поводу IBASIC - порядок токенов напоминает xybasic (на котором был основан бейсик для Баширии-2м), но как будто специально изменён порядок оставшихся токенов. Однако первый токен LET на своём месте, больше вроде нигде такого не было. Вот список токенов из исходников:
;branch addresses for command execution, in order of table position
cmdta: dw let
dw ifcom
dw for
dw next
dw goto
dw gosub
dw print
dw input
dw read
dw retrn
dw def
dw dim
dw gtdel
dw restr
dw stop
dw endcm
if not wild
dw null
endif
dw calcm
dw scall
if not wild
dw put
dw poke
dw wait
endif
dw tcoff
dw tcon
dw tpoff
dw tpon
dw break
dw unbrk
if not wild
dw enabl
dw dsabl
dw rndiz
endif
dw rem
dw delay
dw save
dw load
dw list
dw clear
dw newcm
dw run
dw cont
if not camac
dw auto
dw delet
dw edit
dw renum
endif
if not wild
dw move
endif
dw exec
if epstn
dw plot
endif
if sdisk and not c3885
dw open
dw close
dw linpt
dw margn
if bendx
dw bmsos
dw bname
dw bzap
else
dw dircm
dw scrat
endif
endif
if bendx
dw bfils
endif
if camac
dw camcd
dw declr
dw drivr
dw xenab
dw rstat
dw camcl
dw cinit
dw cinhi
dw loopc
dw bypas
dw onlin
dw pulse
dw open
dw close
if not c3885
dw creat
endif
dw lampa
dw bkset
dw block
dw cenab
dw cdsab
dw sttim
else
if wild
dw wgbuf
else
dw assig
endif
if realt
dw sttim
else
dw time
endif
endif
if packi
dw onlin
dw oflin
dw field
endif
dw on ;must follow ONLINE
Помнил про xybasic, но я глянул исходники - они навороченные, и не стал углубляться. А надо было, есть важный общий признак - формат строки совпадает. Получается IBASIC - это какой-то урезанный или старый xybasic или один из первых вариантов.
- - - Добавлено - - -
и UNTRAP там есть
- - - Добавлено - - -
Цитата (http://www.nesssoftware.com/home/mwc/XYBASIC.php) - The first version fit in 4K, with integer arithmetic only. It grew to 8K when I added a floating point package, and to 14K as I added more features. Т.е. был 8 Кб вариант.
Из руководства узнал, в чем была идея директивы NULL.
И все же есть заметные различия XY и I в некоторых моментах. Понятно, что кучи всего очень полезного в 8 Кб версии нет. Но и кое-что общее реализовано иначе. Например в XY это оператор, а в I - функция.
Еще одна похожая черта XY и I - пятибайтный "распакованный" формат чисел. Но вот математические процедуры сильно отличаются, и настолько сильно, что это могло быть сделано специально. Причем даже в мелочах, например байты чисел в обратном порядке, в I cos считается через sin, в XY - наоборот и там много такого. Как я понял из цитаты, приведенной в предыдущем посте, автор для 8K версии математику написал сам ("It grew to 8K when I added a floating point package"), а в поздней навороченной версии, исходники которой теперь доступны, математику зачем-то переписали ("I wrote all except the floating point modules finout, fmath, fpbcd, and xmath.").
Интересно, что IBASIC для океана скорее всего единственный дошедший до наших дней вариант ранних версий XYBASIC.
Могли существовать варианты, разрабатываемые в то же время независимо в различных ВЦ (часто околонаучных, с хорошими связями с зарубежьем по поставкам вычислительной техники и ПО), причем не только на мини-, но и на больших ЭВМ. Наверняка существовали диалекты бейсика для ЕС ЭВМ, там тоже хорошо бы пошарить из академических соображений.
Интересно бы увидеть бейсик для 8080 полностью местного разлива, чтобы оттуда не торчали уши микрософта или еще кого-нибудь западного.
Наверняка существовали диалекты бейсика для ЕС ЭВМ
Наверняка существовали, но вроде ЕС c ВМ80 не было.
На ЕС и СМ существовала кросс-компиляция, что при наличии исходных текстов произвольного бейсика могло облегчать портирование на другие архитектуры.
- - - Добавлено - - -
Интересно бы увидеть бейсик для 8080 полностью местного разлива, чтобы оттуда не торчали уши микрософта или еще кого-нибудь западного.
Когда-то в ЛГУ пилили отечественный компилятор АЛГОЛ-68, если не ошибаюсь. Так что вполне могли существовать и советские бейсики (ГОСТ на бейсик был принят в 1988 году, хехе).
Советские бейсики несомненно были (БКшный вроде полностью свой?), но я конкретно про нацеленные на 8080.
Кросс-средства на ЕС тоже явно были, но не известен (мне) результат их использования для узкой и специфической задачи разработки бейсика под 8080 с нуля.
Пара слов про представление чисел в IBASIC. Всего, как уже писал, 5 байт. Из них три байта - мантисса в BCD (!) формате (шесть цифр). Байт - знак (младший бит 0 - плюс, 1 - минус). И последний байт - порядок (десятичный, не двоичный!).
Интересно бы увидеть бейсик для 8080 полностью местного разлива, чтобы оттуда не торчали уши микрософта или еще кого-нибудь западного.
Похоже вот пример (https://zx-pk.ru/threads/23459-obsuzhdenie-tajna-operatora-edit.html?p=718378&viewfull=1#post718378)
ivagor, бейсик, написанный на форте - это жесть :)
Форт на бейсике был бы еще жестче, но это совсем не практично, разве что на спор кто сделал бы. Или даже форт на бейсике на форте на бейсике (уж чтобы наверняка).
математику зачем-то переписали
Немного углубился и у меня создалось впечатление, что переписали потому что первая реализация была не очень качественная. На примере функции SIN (экспонента, логарифм и арктангенс просто не были реализованы в этой версии XY/IBASIC). Если сравнить с микрософтовскими бейсиками, про которые я писал в общей теме, то там SIN считается рядом с 5 слагаемыми, а в IBASIC - с 6. Но микрософтовцы использовали грамотно усеченный ряд (модифицированные коэффициенты), а в IBASIC буквально школьная реализация - взяты 6 первых коэффициентов ряда Маклорена. Еще своеобразный момент - SIN в IBASIC в зависимости от аргумента считается или рядом для SIN или рядом для COS, в микрософтовском конечно такого нет. В итоге IBASIC считает SIN медленнее микрософтовского и менее точно. Скорее всего в получивших распространение следующих версиях XYBASIC математику подтянули до конкурентоспособного состояния.
Байт - знак (младший бит 0 - плюс, 1 - минус).
Уточню: 0 в этом байте - плюс, не 0 - минус.
ivagor, ты подогреваешь мое желание когда-нибудь сесть в тенечке с кульком черешни и учебником математики.
До сих пор не видел сравнений разных реализаций вычислений с плавающей точкой для 8080, хочется составить некоторое представление.
perestoronin
31.05.2019, 11:22
Форт на бейсике был бы еще жестче
Еще жестче Форт для программируемого калькулятора (https://habr.com/ru/post/452572/)
Ну это такой калькулятор, что для него не только форт могут сделать. Умного ничего сказать не могу, в комментах к первой части статьи все значимые вопросы вроде затронули. Вот если бы, например, в свое время была версия МК-85 с фортом, то интересно было бы сравнить ее конкурентоспособность с бейсиковой.
- - - Добавлено - - -
Извините за оффтоп, но вот ссылка (http://winglion.ru/fforum/viewtopic.php?f=29&t=3214) на подробные технические характеристики МК-161, у производителя я их не нашел.
Скорее всего в получивших распространение следующих версиях XYBASIC математику подтянули до конкурентоспособного состояния.
Посмотрел исходник "следующего" XYBASIC и там SIN считают почти точно как в микрософтовском, такие дела. Но это не значит, что они все сделали как у БГ - логарифм, экспоненту и арктангенс считают по-своему.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot