avva: (Default)
[personal profile] avva
Меня попросили сказать, как в 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ом. Не знаю.

Из забытого мной можно составить город.
Page 1 of 4 << [1] [2] [3] [4] >>

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

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

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

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

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

:)

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

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

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

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

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

Date: 2004-08-01 10:56 am (UTC)
From: [identity profile] sergeax.livejournal.com
"Помнить так" всё подряд невозможно, и, наверное, даже вредно :)

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

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

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

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

Date: 2004-08-01 11:08 am (UTC)
From: [identity profile] hedgy.livejournal.com
Точно, спасибо :)
Я этот стих, конечно, читала, но вот не опознала в таком виде.

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

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

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

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

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

Re: :)

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

Date: 2004-08-01 12:05 pm (UTC)
From: [identity profile] snyders.livejournal.com
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?)

Date: 2004-08-01 12:08 pm (UTC)
From: [identity profile] avva.livejournal.com
Товарищ правильно написал. Я тоже вспомнил. Садишься на 13-е прерывание и ничего с ним не делаешь, только мониторишь вход/выход на операции чтения/записи. Когда кто-то вызвал чтение/запись, во время выполнения ставишь флаг у себя внутри. Теперь, если ты хочешь всплывать по нажатию клавиши (показывавать юзеру какое-то меню, что-то делать итп.) и для этого перехватываешь 9-е прерывание, то ты смотришь на этот свой флаг и не всплываешь, если кто-то в этот момент читает/пишет диск. Вместо этого ставишь другой флаг, который напомнит тебе, что нужно всплыть, когда вернётся вызванный тобой первоначальный обработчик 13-го прерывания.

Если этого всего не делать, то есть (реальная) опасность того, что загубишь чью-то операцию чтения/записи, когда всплывёшь по нажатию клавиши во время дисковой активности. Т.к. не все TSRы были достаточно умными, умные юзеры помнили, что лучше подождать, пока не горит лампочка диска, перед тем, как вызывать какой-нибудь TSR по клавише ;)

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

Date: 2004-08-01 12:26 pm (UTC)
From: [identity profile] snyders.livejournal.com
Tochno! No vot etogo, ya uzhe sovsem ne pomnil, poka ne prochel tvoj koment, hotya kogda-to delal. Tam eshe chto-to pro "re-enterabel'nost'" bilo.

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

Date: 2004-08-01 12:45 pm (UTC)
From: [identity profile] gdy.livejournal.com
Гы, это были CD 20, без всяких кодов 0 :-)
Page 1 of 4 << [1] [2] [3] [4] >>

January 2026

S M T W T F S
    1 2 3
45678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 3rd, 2026 06:26 pm
Powered by Dreamwidth Studios