avva: (Default)
avva ([personal profile] avva) wrote2004-08-01 08:02 pm

TSR (программистское)

Меня попросили сказать, как в 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ом. Не знаю.

Из забытого мной можно составить город.

[identity profile] elmachohebreo.livejournal.com 2004-08-01 10:16 am (UTC)(link)
Есть такая книга - Р. Дункан или Данкан - Профессиональная работа в MS-DOS, вот там подробно описан этот системный вызов TSR, я тебе отвечаю точно, где-то полгода назад я что-то подобное делал, правда, все переводил на С++.

[identity profile] arbat.livejournal.com 2004-08-01 07:08 pm (UTC)(link)
О! Именно! Вспомнил! Вспомнил!

(no subject)

[identity profile] olorin.livejournal.com - 2004-08-02 11:00 (UTC) - Expand

[identity profile] kaizer-tg.livejournal.com 2004-08-01 10:18 am (UTC)(link)
Да, таймер был восьмым 8H, а ещё таймер всегда дергал 1СН, которое по умолчанию было пустым, но туда что-то можно было повесить. Помню это исключительно потому, что единственная написанная мной TSR, устанавливала именно 1СН. (Она играла раз в час "Во поле берёзка стояла).
stas: (Don't panic!)

[personal profile] stas 2004-08-01 10:19 am (UTC)(link)
И программировать там будут под ДОСом? Жуткий город...

[identity profile] avva.livejournal.com 2004-08-01 10:27 am (UTC)(link)
Не только ;)

[identity profile] anton.livejournal.com 2004-08-01 10:21 am (UTC)(link)
А я помню. Правда, и занимался я этим попозже — не 13 лет назад, а всего лишь 8..
А вот из таблицы помню мало, разве что, да, 9,21, и ещё, конечно, 33:)

[identity profile] proxor.livejournal.com 2004-08-01 07:39 pm (UTC)(link)
мышиный драйвер что ли писал? тогда еще надо было 3|4 перехватывать %)

(no subject)

[identity profile] anton.livejournal.com - 2004-08-02 14:11 (UTC) - Expand

(no subject)

[identity profile] 109.livejournal.com - 2004-08-02 14:02 (UTC) - Expand

(no subject)

[identity profile] anton.livejournal.com - 2004-08-02 14:03 (UTC) - Expand

(no subject)

[identity profile] 109.livejournal.com - 2004-08-02 15:02 (UTC) - Expand

:)

[identity profile] dimas.livejournal.com 2004-08-01 10:33 am (UTC)(link)
Помню что надо было переставить на себя одно из прерываний одной из функций int 21h или просто поправив таблицу в первых 4к ОЗУ.

Еще помню рекомендации, что стоит либо мониторить прерывание 13h, либо пользоватся кучей функций int 29h, совершенно недокументированного поначалу, и потом бол-менее описанном в int-list, чтобы не "всплыть" посреди дисковой операции ...

Помню что рекомендовалось перехватывать пользовательский таймер (1Сh), но все хватали 8-ку, ибо с пользовательским была постоянная проблема. 9-ку перехватывали, когда писали всякие драйвера клавиатуры. А еще мы умудрялись писать тср-ки и на паскале, и на Си :)

Re: :)

[identity profile] snyders.livejournal.com 2004-08-01 11:59 am (UTC)(link)
interesno zachem nado bylo hvatat' funkcii 21-go i osobenno 13-go (nizkiy dostup k disku esli ya ne oshibayus') :)))

(no subject)

[identity profile] avva.livejournal.com - 2004-08-01 12:08 (UTC) - Expand

(no subject)

[identity profile] snyders.livejournal.com - 2004-08-01 12:26 (UTC) - Expand

Re: :)

[identity profile] mobilis-m.livejournal.com - 2004-08-01 23:16 (UTC) - Expand

[identity profile] avva.livejournal.com 2004-08-01 10:53 am (UTC)(link)
Как я и сказал, два щелчка. Это неинтересно. Интересно помнить так.

(no subject)

[identity profile] sergeax.livejournal.com - 2004-08-01 10:56 (UTC) - Expand

[identity profile] hedgy.livejournal.com 2004-08-01 10:55 am (UTC)(link)
Последняя фраза просится в стихи :)
Или это и есть цитата из стихов, которых _я_ не помню? :))

[identity profile] avva.livejournal.com 2004-08-01 11:01 am (UTC)(link)
Это отсылка к Бродскому ("Из забывших меня можно составить город", строка из стихотворения "Я входил вместо дикого зверя в клетку...").

(no subject)

[identity profile] hedgy.livejournal.com - 2004-08-01 11:08 (UTC) - Expand

[identity profile] simonff.livejournal.com 2004-08-01 11:02 am (UTC)(link)
Есть такое хорошее англиийское выражение "I've forgotten more things than you ever knew."

[identity profile] moon-aka-sun.livejournal.com 2004-08-01 12:43 pm (UTC)(link)
Это сильно! Спасибо.

(no subject)

[identity profile] maksimka.livejournal.com - 2004-08-01 15:36 (UTC) - Expand

[identity profile] maxvt.livejournal.com 2004-08-01 11:05 am (UTC)(link)
Да... И адреса видеопамяти сразу всплыли из моей extended memory -- B000h для черно-белого и B800h для цветного... (это еще на Паскале)

[identity profile] proxor.livejournal.com 2004-08-01 07:44 pm (UTC)(link)
а еще A000 кажись для графических режимов

[identity profile] sysprg.livejournal.com 2004-08-01 11:06 am (UTC)(link)
Я помню много лет назад мы с [livejournal.com profile] a_jelly насчитали в DOS целых 9 методов для доступа к памяти, которые нужно было предусмотреть в "продвинутой" программе, чтобы получить доступ ко всей памяти машины при всех возможных более и менее стандартных конфигурациях HIMEM, EMM386 и QEMM386. Помню, там даже некоторые версии RAMDISK вмешивались в распределение памяти! И это были еще не последние годы DOS...

[identity profile] leonov.livejournal.com 2004-08-01 11:13 am (UTC)(link)
Недавно, кстати, вспоминал - прислали статью про кейлоггер под DOS, написанный на С, причем некоторые вещи подавались без малейшего объяснения/понимания. Пришлось послать к Стивенсу, а заодно и самому вспомнить молодость - многое, как ни странно, помнил.

[identity profile] http://users.livejournal.com/_under_score_/ 2004-08-01 11:28 am (UTC)(link)
"Кто может вспомнить, что же там такое надо было говорить ДОСу 13 лет назад, чтобы остаться в памяти TSRом. Не знаю."

двадцатое! двадцатое прерывание!

молодость, молодость...

[identity profile] ex-ilyavinar899.livejournal.com 2004-08-01 11:44 am (UTC)(link)
Я помню (http://www.livejournal.com/users/ilyavinarsky/1005785.html) основные черты набора инструкций IBM/360, хотя не открывал их лет 17.

[identity profile] silpol.livejournal.com 2004-08-01 02:07 pm (UTC)(link)
ну это как раз не основные черты, а маловажная деталь - софтверная эмуляция EBCDIC (да-да, микрокоды не есть кремний), дабы у половины скруджей с Wall St. не упал код на их горячо лелеяном COBOL ...

(no subject)

[identity profile] silpol.livejournal.com - 2004-08-02 03:01 (UTC) - Expand

[identity profile] snyders.livejournal.com 2004-08-01 12:05 pm (UTC)(link)
1. Skazat' DOSu, chto u nego 639 K (adres yacheiki ne vspomnu).
2. napisat' draiver
3. kazhetsya kakai-to funkciya 21-go TSR (20 - kazhetsya prosto exit?)

[identity profile] dixi.livejournal.com 2004-08-01 12:15 pm (UTC)(link)
Несколько лет назад понадобилось срочно поставить windows95 на одну машину. Но при этом была проблема - родной scandisk, запускающийся при установке, находил проблему и выходил с кодом ошибки. по ряду причин заниматься проверкой и починкой дисковой структуры было нельзя. Выход стандартный - поместить в дистрибутив win95 любую программу, выходящую с кодом 0 и назвать её scandisk.exe. Пока я думал, какую программу подсунуть, мой коллега (фанат ассемблера) задумался, и в редакторе написал двухбайтную дос-программу прямо в машинных кодах - вызов 20 прерывания с кодом 0.

[identity profile] gdy.livejournal.com 2004-08-01 12:45 pm (UTC)(link)
Гы, это были CD 20, без всяких кодов 0 :-)

(no subject)

[identity profile] dixi.livejournal.com - 2004-08-01 12:48 (UTC) - Expand

(no subject)

[identity profile] avva.livejournal.com - 2004-08-01 12:53 (UTC) - Expand

(no subject)

[identity profile] avva.livejournal.com - 2004-08-01 13:25 (UTC) - Expand

(no subject)

[identity profile] snyders.livejournal.com - 2004-08-01 14:55 (UTC) - Expand

(no subject)

[identity profile] 109.livejournal.com - 2004-08-02 14:09 (UTC) - Expand

[identity profile] gdy.livejournal.com 2004-08-01 12:55 pm (UTC)(link)
Полез посмотреть на старые исходники, не нашёл, но зато попался на глаза VOROBEY.TXT со словами
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.
и т.д. ;-)

[identity profile] avva.livejournal.com 2004-08-01 01:00 pm (UTC)(link)
Было дело. Я до сих пор получаю письма с просьбой это пояснить или улучшить, каждые два месяца примерно. Приходится вежливо объяснять, что я давно этим не занимаюсь и ни хрена не помню ;)

[identity profile] oblomov-jerusal.livejournal.com 2004-08-01 01:04 pm (UTC)(link)
по-моему, int 28h. (Была ли и специальная функция в int 21h для этого?)

[identity profile] avva.livejournal.com 2004-08-01 01:05 pm (UTC)(link)
Была, об этом упоминают в Википедии (см. одну из ссылок выше).

int 28h не помню, но может быть.

[identity profile] snyders.livejournal.com 2004-08-01 01:27 pm (UTC)(link)
Byla dokumentaciya TechHelp i spisok preryvanij Ralf Brown-a (i knizhka Nortona konechno). Im ne bylo ceni.

[identity profile] meshko.livejournal.com 2004-08-01 02:17 pm (UTC)(link)
Там был ещё один способ, который использвоаялся вирусами, я его так и не освоил -- не вызывать прерывание выхода с флагом TSR, а просто перед выходом руками поковыряться в MCB (memory control block), который был просто связанным списком свободных сегментов памяти, чтобы ДОС не затер прорамму после её "нормального" завершения. Если делать так, то release (alt+=) и Volcov Commander такой резидент не видели.

Номеров прерываний тоже не помню... Помню, что у клавиатуры был прямой i/o порт, кажется 0x60, а на наших "Поисках" его не было, поэтому многие игры не работали.

Недавно думал кстати про TSR'ы, именно так: неплохой был бы пост для [livejournal.com profile] avva ;)

[identity profile] snyders.livejournal.com 2004-08-01 02:51 pm (UTC)(link)
Lubaja kul'turnaja karta pamyati pokazivala vse MCB. V pozdnih DOSah, dazhe standartnaya komanda (mem /D kazhetsya) eto dela.

(no subject)

[identity profile] meshko.livejournal.com - 2004-08-01 15:00 (UTC) - Expand

(no subject)

[identity profile] mobilis-m.livejournal.com - 2004-08-01 23:20 (UTC) - Expand

[identity profile] ex-ilyavinar899.livejournal.com 2004-08-01 02:45 pm (UTC)(link)
(голосом ослика Иа-Иа: "его еще надувают...")

У них еще DS!=SS...

[identity profile] oblomov-jerusal.livejournal.com 2004-08-01 02:51 pm (UTC)(link)
А я еще про архитектуру PDP-11 и систему RSX-11 (точнее, про их советские и польские клоны) могу много интересного вспомнить.

[identity profile] avva.livejournal.com 2004-08-01 03:00 pm (UTC)(link)
В СССР я только на Ямахах работал до PCшек; соответственно, могу кое-что вспомнить об ассеблере Z80, о системе спрайтов, и других подобных вещах (не очень многое и вспомню, впрочем).

PDP11 учил немного уже в Израиле. Хорошая платформа.

(no subject)

[identity profile] silpol.livejournal.com - 2004-08-02 03:07 (UTC) - Expand

Да Вы что ?

[identity profile] mfi.livejournal.com - 2004-08-02 05:04 (UTC) - Expand

[identity profile] mobilis-m.livejournal.com 2004-08-01 11:38 pm (UTC)(link)
Насколько не крива моя память ;)
но самый простой способ остаться резидентом в досе это сохранить вектор (которыx 1024, каждые по двойному слову от начала памяти),
выделить себе память (можно там-же), скопироваться туда, выставить туда вектор.
и сделать retn из com-файла

задача резидента - отдавать старый вектор без повреждений.
;)

Дальше конечно все эти выкрутасы что выше.

[identity profile] alexned.livejournal.com 2004-08-01 11:51 pm (UTC)(link)
1. Устанавливаем нужное прерывание на себя (ax = 25xxh, int 21h);
2. Остаемся резидентом int 27h, в каком-то регистре (dx?) указываем системе последний байт резидента.
Все.

[identity profile] abvgd.livejournal.com 2004-08-02 12:00 am (UTC)(link)
Все, что помню - жаркие споры в курилке, называть ли int21h 21-м прерыванием или 33-м.

[identity profile] fenikso.livejournal.com 2004-08-02 12:32 am (UTC)(link)
Есть хорошая книжка по TSR для ассемблера - "TSR и нерезидентные обработчики прерываний", Дмитрий Е. Меламуд. Лежит тут: http://rusdoc.df.ru/material/lang/tsr.zip

Автор - [livejournal.com profile] lamed

Page 1 of 2