TSR (программистское)
Aug. 1st, 2004 08:02 pmМеня попросили сказать, как в DOSе пишут TSR-программы. Помните, были такие, в памяти постоянно висели?
TSR: Terminate and Stay Resident. Это я ещё помню. А вот как их делают, совершенно забыл. Что-то там надо было сообщить ДОСу... кажется, сколько памяти считать занятой после выхода, чтобы command.com выше неё заново запустить, а не переписать поверх TSRа. А потом как-то выйти через int21... обычным путём или каким-то особенным?
Пытаюсь вспомнить и не могу. А ведь когда-то написал их немалое число. Висели они, милые, и перехватывали какие-то прерывания... брр, какие же это были прерывания? На клавиатуру было два, аппаратное и BIOSовое. Кажется, 09 и 16. 21 ещё приходилось прослушивать пару раз, для всяких трюков более сложных. И таймер, конечно — а каким был таймер? Восьмым? Не помню тоже.
Ещё их можно было запускать в верхней памяти, вот. Которая от 640kb то 1Mb. Но ещё не забываем про буфер дисплея (адреса были разные, для графического, текстового монохромного, и текстового цветного режимов. Только не помню, какие это были адреса). И expanded memory, когда была, туда же где-то мэппилась, да? И ещё extended была, которой мне не пришлось воспользоваться программным образом, только expanded пару раз.
Вот интересно, помнит кто-то вот так сходу, что должна делать TSR-программа, чтобы грамотно всё устроить? Не подсматривая в Гугль или ещё куда? Ясно ведь, что в два щелчка можно всё найти, это неинтересно. Не подсматривая — помнит кто? Отзовитесь.
Если есть такие люди, то я им, наверное, завидую. Или нет. Не знаю даже. Знаю одно: моя память по-другому устроена. Я не помню таких вещей. Из моей памяти всё медленно, но очень-очень верно улетучивается. Не пользовался каким-то языком программирования пару лет — забыл. Не какие-то глубокие вещи даже забыл, а на уровне “как переменные объявлять”. Про APIs, как эти прерывания злосчастные, уже и говорить нечего.
Может, это к лучшему? Может, это хлам, который и стоит забывать? Всегда же можно подучить и вспомнить, если есть необходимость; да и приходится нередко. А может и не так. Почему хлам? Кто его знает, как человеческая память устроена, и какие у неё возможности. То, что в ней много сидит технических сведений, которые сейчас не нужны, не значит вовсе, что они занимают какое-то нужное место, и мешают что-то другое запомнить. Тогда остаётся только завидовать тем, у кого этот процесс угасания памяти не так ярко выражен, как у меня. Кто может вспомнить, что же там такое надо было говорить ДОСу 13 лет назад, чтобы остаться в памяти TSRом. Не знаю.
Из забытого мной можно составить город.
TSR: Terminate and Stay Resident. Это я ещё помню. А вот как их делают, совершенно забыл. Что-то там надо было сообщить ДОСу... кажется, сколько памяти считать занятой после выхода, чтобы command.com выше неё заново запустить, а не переписать поверх TSRа. А потом как-то выйти через int21... обычным путём или каким-то особенным?
Пытаюсь вспомнить и не могу. А ведь когда-то написал их немалое число. Висели они, милые, и перехватывали какие-то прерывания... брр, какие же это были прерывания? На клавиатуру было два, аппаратное и BIOSовое. Кажется, 09 и 16. 21 ещё приходилось прослушивать пару раз, для всяких трюков более сложных. И таймер, конечно — а каким был таймер? Восьмым? Не помню тоже.
Ещё их можно было запускать в верхней памяти, вот. Которая от 640kb то 1Mb. Но ещё не забываем про буфер дисплея (адреса были разные, для графического, текстового монохромного, и текстового цветного режимов. Только не помню, какие это были адреса). И expanded memory, когда была, туда же где-то мэппилась, да? И ещё extended была, которой мне не пришлось воспользоваться программным образом, только expanded пару раз.
Вот интересно, помнит кто-то вот так сходу, что должна делать TSR-программа, чтобы грамотно всё устроить? Не подсматривая в Гугль или ещё куда? Ясно ведь, что в два щелчка можно всё найти, это неинтересно. Не подсматривая — помнит кто? Отзовитесь.
Если есть такие люди, то я им, наверное, завидую. Или нет. Не знаю даже. Знаю одно: моя память по-другому устроена. Я не помню таких вещей. Из моей памяти всё медленно, но очень-очень верно улетучивается. Не пользовался каким-то языком программирования пару лет — забыл. Не какие-то глубокие вещи даже забыл, а на уровне “как переменные объявлять”. Про APIs, как эти прерывания злосчастные, уже и говорить нечего.
Может, это к лучшему? Может, это хлам, который и стоит забывать? Всегда же можно подучить и вспомнить, если есть необходимость; да и приходится нередко. А может и не так. Почему хлам? Кто его знает, как человеческая память устроена, и какие у неё возможности. То, что в ней много сидит технических сведений, которые сейчас не нужны, не значит вовсе, что они занимают какое-то нужное место, и мешают что-то другое запомнить. Тогда остаётся только завидовать тем, у кого этот процесс угасания памяти не так ярко выражен, как у меня. Кто может вспомнить, что же там такое надо было говорить ДОСу 13 лет назад, чтобы остаться в памяти TSRом. Не знаю.
Из забытого мной можно составить город.
no subject
Date: 2004-08-01 10:16 am (UTC)no subject
Date: 2004-08-01 07:08 pm (UTC)(no subject)
From:no subject
Date: 2004-08-01 10:18 am (UTC)no subject
no subject
Date: 2004-08-01 10:27 am (UTC)no subject
Date: 2004-08-01 10:21 am (UTC)А вот из таблицы помню мало, разве что, да, 9,21, и ещё, конечно, 33:)
no subject
Date: 2004-08-01 07:39 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From::)
Date: 2004-08-01 10:33 am (UTC)Еще помню рекомендации, что стоит либо мониторить прерывание 13h, либо пользоватся кучей функций int 29h, совершенно недокументированного поначалу, и потом бол-менее описанном в int-list, чтобы не "всплыть" посреди дисковой операции ...
Помню что рекомендовалось перехватывать пользовательский таймер (1Сh), но все хватали 8-ку, ибо с пользовательским была постоянная проблема. 9-ку перехватывали, когда писали всякие драйвера клавиатуры. А еще мы умудрялись писать тср-ки и на паскале, и на Си :)
Re: :)
Date: 2004-08-01 11:59 am (UTC)(no subject)
From:(no subject)
From:Re: :)
From:no subject
Date: 2004-08-01 10:50 am (UTC)http://www.clipx.net/ng/dos5/
http://www.delorie.com/djgpp/doc/dpmi/
no subject
Date: 2004-08-01 10:53 am (UTC)(no subject)
From:no subject
Date: 2004-08-01 10:55 am (UTC)Или это и есть цитата из стихов, которых _я_ не помню? :))
no subject
Date: 2004-08-01 11:01 am (UTC)(no subject)
From:Последняя фраза просится в стихи ??
From: (Anonymous) - Date: 2004-08-01 07:21 pm (UTC) - Expandno subject
Date: 2004-08-01 11:02 am (UTC)no subject
Date: 2004-08-01 12:43 pm (UTC)(no subject)
From:no subject
Date: 2004-08-01 11:05 am (UTC)no subject
Date: 2004-08-01 07:44 pm (UTC)no subject
no subject
Date: 2004-08-01 11:13 am (UTC)no subject
Date: 2004-08-01 11:28 am (UTC)двадцатое! двадцатое прерывание!
молодость, молодость...
no subject
Date: 2004-08-01 11:44 am (UTC)no subject
Date: 2004-08-01 02:07 pm (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2004-08-01 12:05 pm (UTC)2. napisat' draiver
3. kazhetsya kakai-to funkciya 21-go TSR (20 - kazhetsya prosto exit?)
no subject
Date: 2004-08-01 12:15 pm (UTC)no subject
Date: 2004-08-01 12:45 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2004-08-01 12:55 pm (UTC)Hi there,
The issue of notifying user-mode thread from a kernel-mode driver, or calling a user-mode routine from same, is very often discussed here. и т.д. ;-)
no subject
Date: 2004-08-01 01:00 pm (UTC)no subject
Date: 2004-08-01 01:04 pm (UTC)no subject
Date: 2004-08-01 01:05 pm (UTC)int 28h не помню, но может быть.
ошибка вышла.
From:no subject
Date: 2004-08-01 01:27 pm (UTC)no subject
Date: 2004-08-01 02:17 pm (UTC)Номеров прерываний тоже не помню... Помню, что у клавиатуры был прямой i/o порт, кажется 0x60, а на наших "Поисках" его не было, поэтому многие игры не работали.
Недавно думал кстати про TSR'ы, именно так: неплохой был бы пост для
no subject
Date: 2004-08-01 02:51 pm (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2004-08-01 02:45 pm (UTC)У них еще DS!=SS...
no subject
Date: 2004-08-01 02:51 pm (UTC)no subject
Date: 2004-08-01 03:00 pm (UTC)PDP11 учил немного уже в Израиле. Хорошая платформа.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:Да Вы что ?
From:Re: Да Вы что ?
From:С нежностью ...
From:no subject
Date: 2004-08-01 11:38 pm (UTC)но самый простой способ остаться резидентом в досе это сохранить вектор (которыx 1024, каждые по двойному слову от начала памяти),
выделить себе память (можно там-же), скопироваться туда, выставить туда вектор.
и сделать retn из com-файла
задача резидента - отдавать старый вектор без повреждений.
;)
Дальше конечно все эти выкрутасы что выше.
no subject
Date: 2004-08-01 11:51 pm (UTC)2. Остаемся резидентом int 27h, в каком-то регистре (dx?) указываем системе последний байт резидента.
Все.
no subject
Date: 2004-08-02 12:00 am (UTC)no subject
Date: 2004-08-02 12:32 am (UTC)Автор -