откуда растут уши у советских бейсиков

Советские программируемые калькуляторы, микрокомпьютеры и большие ЭВМ, не попавшие в другие разделы

Moderator: Shaos

User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

VituZz wrote:Функция 05h BIOS Int16h - это не то, что нужно?
BIOS Int16h АН = 05h — Поместить символ в буфер клавиатуры.
К сожалению - нет. Тут как раз надо, чтобы сработало INT 9 - аппаратно пришел скан-код.
Кстати говоря, Int16h Васик подменяет своими - поэтому трюки с Int16h никакие
не удались.
VituZz wrote:Кроме того, если в порт 60h послать код EEh, то клава ответит также кодом EEh (эхо).
Пробовал... но поскольку это не сканкод - эффекта не возымело.

Ещё есть такого типа - вызвать тестовую последовательность. Тоже не подходит.

Самое подходящее - повторить последний скан-код. Но где уверенность,
что он там был?
Можно сказать, что наверняка хоть один но был! А может и не случиться...

Смысл этого резидента моего - дать возможность больше работать мышью...
Так вот мне казалось, что INT 9 - красивое решение, - хоть раз да клавишу
придётся нажать?
А практика показывает - что может и не случиться...
Васюк вызывается щелчком мыши - вот уже и предыдущего нажатия нет...
А в Васюке при отладке - выделяешь мышью, комментировать строки можно тоже мышью...
Выходит - нужного нажатия, чтоб произошло INT 9 - можно и недождаться совсем... :wink:
iLavr
User avatar
VituZz
God
Posts: 1343
Joined: 13 Nov 2010 04:06

Post by VituZz »

Манипулирование напрямую с буфером скан-кодов и его указателем (или даже с контроллером прерываний) не приводит к нужному эффекту? Нужные книжки остались на даче, а из памяти уже выветрилось всё...
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

VituZz wrote:Манипулирование напрямую с буфером скан-кодов и его указателем (или даже с контроллером прерываний) не приводит к нужному эффекту?
Нет... эти вещи же все выше INT 9 по уровню...
INT 9 - это ж аппаратное прерывание, которое как раз и кладет код
в кольцевой буфер...

А чтоб оно случилось - клавиатура и должна выдать код...

Кстати под Вендой это делается просто:

Image

Виртуальная клавиатура как раз и организует "фальшивые" INT 9 для
сессии DOS.
А вот в чистом DOS нужно аппаратное прерывание от клавиатуры.

Но в принципе это всё не так страшно... просто я надеялся - вдруг кто знает редкий
недокументированный трюк из своего опыта...
iLavr
User avatar
VituZz
God
Posts: 1343
Joined: 13 Nov 2010 04:06

Post by VituZz »

Что-то я запутался...
Если плясать от печки. Клава по факту нажатия вырабатывает скан-код, шлёт его в контроллер а-ля 8042, который вырабатывает прерывание IRQ1. Вектор, разумеется, указывает на память, куда и передаётся управление - Int 9h. Как бы именно аппаратное прерывание не представляется мне совершенно необходимым, вызвав Int 9h с необходимым антуражем, можно вроде добиться тех же результатов...
Аппаратное прерывание - IRQ1. Int 9h - программное. Или я уже совсем всё забыл?
Блин, надо везти книжки домой, вспоминать молодость :D .
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Да ты не попутал - ты совершенно прав: номер запроса на аппаратное прерывание - IRQ1,
Вектор прерывание - 09h.
Аппаратное нужно всего один раз после старта резидентного меню и QBasic-а,
чтобы они выстроились правильно в цепочке перехватов INT 9.
После чего драйвер меню через это INT 9 действительно чисто программно делает INT 9.

Клик мыши по экрану драйвер меню как раз сам преобразует в вызовы INT 9
с нужными сканкодами, чтобы QBasic делал "copy", "paste" и др. безо всякого
нажатия клавиатуры.

Но для этого драйвер меню должен 1 раз встать в очередь обслуживания
INT 9 перед QBasic-ом.



PS. И не вози ты с дачи книжки! Тут где-то и я и Хардыч выкладывали
электронный тех-хелп... Год-то 2012-й! - пора переходить на безбумажные
технологии!
:lol:
iLavr
b2m
Devil
Posts: 905
Joined: 26 May 2003 06:57

Post by b2m »

Lavr wrote:Но для этого драйвер меню должен 1 раз встать в очередь обслуживания
INT 9 перед QBasic-ом.
Не понимаю, в чём проблема.
Обычно перехватывают ещё и прерывание по таймеру, и следят за нужными векторами.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

А программно щелкнуть инт9 религия не позволяет?
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:А программно щелкнуть инт9 религия не позволяет?
Позволяет. Но ещё раз повторяю - поскольку в первый момент над резидентом
нет Васика - щелкать INT 9 нет никакого смысла.

Я уже несколько раз объяснил связку:
1. резидентное меню берёт INT 9 на себя и следит, что оно само первое в очереди его обслуживания во время вызова INT 9.
2. QBasic становится поверх резидента и перехватывает INT 9 на себя.
3. По первому нажатию клавиши в QBasic резидентное меню определяет внутри INT 9, что оно не первое. Оно меняет очередь, чтобы стать первым, а QBasic поставить вторым.
4. Теперь резидентное меню может "обманывать" QBasic, подставляя ему коды клавиш через INT 9.

Code: Select all

@QBMENU.COM
@qb.exe %1 /AH /L C:\QBASIC\BASFILE.QLB
Что значит щелкать INT 9 самому: в конце цепочки перехватов INT 9 в
конце концов находится настоящее INT 9, которое полезет в настоящие
железные порты, где его никто ни с чем не звал... :wink:
И что оно будет делать? Я лично не знаю...

Иначе - да... может и можно было бы шлёпать им, скажем, по таймеру...
iLavr
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Lavr wrote:Иначе - да... может и можно было бы шлёпать им, скажем, по таймеру...
Не, ну ставимся в очередь в инт9, смотрим что не первые - меняемся с первым (или сдвигаем всю очередь, чтобы не нарушать порядок). Так нельзя что-ли?
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

У меня такое впечатление, что я в пустоту рассказываю... :(
Когда мы не первые, то первый - QBasic. Он взял на себя обработку
аппаратного прерывания.
Мы по таймеру "хлопаем" INT 9, но мы - после QBasic-а, а он по INT 9 идёт
в железный порт обработать до нас прерывание - а там нефига нет - что он
будет делать? - Я лично не знаю...
INT 09h wrote:Как работает стандартный обработчик клавиатурного прерывания INT 09h, входящий в состав BIOS?

Этот обработчик выполняет следующие действия:
читает из порта 60h скан-код нажатой клавиши;
записывает вычисленное по скан-коду значение ASCII-кода нажатой клавиши в специальный буфер клавиатуры, расположенный в области данных BIOS;
устанавливает в 1 бит 7 порта 61h, разрешая дальнейшую работу клавиатуры;
возвращает этот бит в исходное состояние;
записывает в порт 20h значение 20h для правильного завершения обработки аппаратного прерывания.
Раз QBasic взял эти функции на себя - а он почему-то всё любит
делать сам даже INT 16h подменяет своим и по стандартным трюкам
к нему с клавиатурой не подезть...

Так вот что он бует делать перед нами - если аппаратно ничего не случилось,
а мы его глупо обманули?
iLavr
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Нужно подменить функцию подмены векторов и запретить наглую подмену КуВасиком векторов! :3
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Да вобщем-то не шибко принципиальный момент. Просто когда я программировал
эту всю затею, то думал, что если ты зашел в среду программирования, то будешь
на кнопки обязательно нажимать... И первое-же нажатие обеспечивает связку
резидентного меню с QBasic-ом, что практически незаметно случается...

Но Вендавоз так избаловал мышами, что кнопки я нажимать отвык... :lol:
Не мог же я такого предусмотреть? :wink:

Вся фигня в том, что трудно отследить, кто перехватывает прерывание, нет таких
штатных средств...
Уже когда оно перехвачено - я определяю QBasic по сигнатуре в его внутренней
функции INT 9.
А так - если бы был другой признак - "вот QBasic пришел и INT 9 уже перехватил" -
то и проблем бы не было... :D


PS. Но что меня искренне удивило, это резидентное меню, расточенное конкретно
под QBasic, срабатывает и под некоторыми другими творeниями M$
...
:o
Last edited by Lavr on 31 Aug 2012 23:39, edited 1 time in total.
iLavr
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

Re:

Post by Stan »

Lavr wrote:Я до сих пор с удовольствием люблю что-либо декомпильнуть,
последнее - был QBasic от M$ - я в нём полазил под Идой...

Реальные исходники QBasic 1.1 от этих самых M$ имеются вот на этой странице:

Download MS Basic versions

Вот они: Download MS Qbasic 1.1 source code
Это на тот случай, если кому-либо интересны принципы работы QBasic .

Заодно на этой странице есть практически все дистрибутивы винрарных версий Васиков от M$,
начиная от ancient version of MS Basic for the CP/M (1977) и заканчивая Microsoft Visual Basic 4.0.
angry_troll
Doomed
Posts: 449
Joined: 08 Apr 2013 04:04
Location: 213.247.249.139

Re:

Post by angry_troll »

Shaos wrote:первый прототип бейсика для альтаира писался собственноручно Алленом и Гейтсом на университетском PDP-10
Вот падлюки, машинное время поди на университетском-то им даром было, зато потом сколько жалоб от этих змеюк было, что ихние никчёмные бейсики и прочий шлак тырили... :rotate:

ps: ударим некропостингом по оффтопику!
привет засранцу лавру :)
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re:

Post by Lavr »

Lavr wrote:А вот, собственно и знаменитый Интерпретатор бейсика для Altair 8800.
Толку в нём, наверное, никакого, но как знаменитый прадедушка - в коллекцию... :wink:
Интерпретатор бейсика, с которого и пошла вся история майкрософт... 1975 год.
Запустить можно на любом эмуляторе Альтаира 8800. Второй файлик как раз и
является вспомогательным файлом, необходимым для запуска бейсика на этом
эмуляторе.
Источник
В этом нашем Интернете, как что дельное и полезное - так пропадает... :-? а всякие ерундовины,
лицекниги, кошечки и тытрубка - плодятся безмерно... :o

Решил скачать себе хорошо прокомментированные исходники Altair BASIC 3.2 (4K Edition).
А то на них уже ссылаются только в Веб-архив... а они пока еще живые есть! :lol:


P.S. Кстати, что довольно интересно: когда я сам декомпилировал Бейсики, меня смущало,
что в ряде случаев есть JMP в середину другой инструкции. Это сбивает с толку дизассемблер,
но меня больше беспокоило - не ошибки ли это, появившиеся когда все друг у друга эти
Бейсики тянули? Оказалось, что это фирменные фичи юного Билла Гейца...
:wink:
Reuben Harris has disassembled an early Altair Basic binary, and his conclusion is that the 1975 Bill Gates was a true hacker in the finest sense of the word.
In more than one instance, for example, Gates's code jumps to the second or third byte of a 2- or 3-byte 8080 instruction. What looks like an error is just a way to save a byte here and there.
This is what some might call "running light without overbyte." And that was what mattered in 1975. Dennis Allison, this magazine's cofounder, once told me that there is only space and time, and you have to decide which to conserve. (Those are not even remotely his words, but I'm pulling this one out from behind my own mental furniture after more than a decade. He did say something to that effect.) In 1975, when speed was a luxury and saving 3 bytes might mean the difference between being able to implement a feature and not being able to implement it, what you conserved was space. Bill was very good at this.
iLavr