Какво е IPX и как да го използвате за собствени цели - втора част

Резидентни програми,
работа с IPX

Последния път писахме
програма, която предава най-простото
съобщение от една станция до друга. Програма,
особено на приемащата станция, оказа се
изключително неудобно. След като го стартирате, машината
премина в състояние на дълго и досадно
очаквания и нито една полезна програма за това
изпълнени. За да се избегне такова неприятно
ефекти, мрежовите програми обикновено са,
издадени под формата на местни програми (TSR).
Писането на такива програми само по себе си е бизнес.
доста трудно. Ако искате повече подробности
прочетете го, мога да препоръчам статията
„Този ​​луд, луд, луд свят
резидентни програми "в списанието" Компютър
преса "(брой 4, 5 за 1992 г.).

В тази статия ще опиша само
характеристики на използване от такива програми
IPX възможности. Следователно програмата, в която сме
този път ще пишем, ще бъде много несъвършено: в
няма защита срещу презареждане, то
не може да се разтовари от паметта без рестартиране
системи (това обаче засяга много
търговски TSR), и накрая - върха на есента за
системен програмист - написано е на C, а не
в асемблер. Последното обаче може да бъде
дори интересно: ще видите колко напълно
правилно съставете най-ниското ниво
програми.

ESR не е програма
обработка на прекъсвания, по-специално неговата
разработчикът не е длъжен да се грижи за безопасността
всички регистри. Трябва обаче да се има предвид, че това
програмата се извиква от програмата за части
хардуерно прекъсване IPX. Следователно е желателно,
така че ESR да реагира бързо и да работи, когато
затворени прекъсвания (между другото, когато започне
прекъсванията са затворени). Така че, ако трябва
IPX събитие запис на диск, вход от
клавиатура или някакво друго действие,
дългосрочни или отворени
прекъсва, по-добре е само програмата ESR
излага знак, който трябва периодично
проверено от програма, която изпълнява основното
работа. Как да направите това е описано в споменатото
статия.

Последен път в ефир
За програмите е използван моделът Lаrge. Този път
програмата за приемане е написана за модела Smаll.
И така, между другото, текстът е ipx.h (Листинг 3). някои
се е променило. Нова версия на програмата за въвеждане
(Листинг 1) има две части: инициализация,
който получава контрол при стартиране и
програми за обработка на събития (ESR) - пристигане
съобщения.

Програма за инициализация
изпраща IPX заявка за въвеждане на мрежово съобщение
оставя модула в паметта като
резидентна програма. Моля, имайте предвид, че,
какво да изчислим от какво се нуждае програмата
количеството памет в първите редове се запомня
начално състояние на регистрите на стека (Ss: Sp). За
Това използва фрагмент, написан на
вграден асемблер. Първоначална стойност на двойката
Ss: Sp определя
горната граница на паметта, заета от модула.
Долната гранична стойност се определя от позицията
PSP (префикс на програмния сегмент). По този начин, необходимата сума
паметта се изчислява "без шум", тоест с
излишък. Например никой не остава в паметта
желания PSP и самата програма за инициализация.

TSR ПРИЕМНИК
Листинг 1. TSR приемане
съобщения

#include
#include
#include
#include
#include
#define TargetSocket 0x08
#define Screen 0xb800
#define StrLen 0x50
#pragma check_stack (изключен)
#pragma check_pointer (изключен)
#pragma intrinsic (_enable, _disable)

extern неподписан _stklen = 512;

/ * Край и начало на модула * /

char _huge * tsrtop;
char _huge * tsrbottom;

/ **/
/ *
Програма за получаване и отпечатване на символен низ
(опция за пребиваване)
* /

/ * Споделени променливи * /

неподписан char _far RecieveString [80]; // Получен низ
IPXHeader _far Header;
ECB_2 _far My_ECB;

void out_str (char _far * OutBuf, неподписан char Collor, къса Str,
кратко Col)/* Параметри: изходен низ,
Цвят,
начална линия,
начало на колоната на изданието
*/
неподписан int ScrOff; // Изместване в буфера на екрана
неподписан int i; // Броячът на символа в низа
неподписан знак _far * CountPtr; // Адрес на текущия символ

ScrOff = (StrLen * Str + Col) * 2;
i = 0;
FP_OFF ​​(CountPtr) = ScrOff;
FP_SEG (CountPtr) = Екран;
докато (OutBuf [i]! = 0x00) CountPtr [i * 2] = OutBuf [i];
CountPtr [i * 2 + 1] = Collor;
i ++;
>
>

void _far My_ESR () < //Резидентная программа приема
ECB_2 _far * My_ECB_ptr;
съюз REGS inregs, outregs;
struct SREGS сегрег;

/ * Отпечатайте ред на предпоследния ред
екран */
out_str (RecieveString, 0x2f, 22, 0);

/ * Повторно инициализиране на получаването на съобщение */
My_ECB_ptr = &My_ECB;

/ * Подложка на ЕЦБ */
_asm NOP // Това е необходимо поради грешка в преводача

My_ECB_ptr-> SocketNumber = TargetSocket;