Как определить "ответ" програмы ДОСу?
Как мне "определить" сообщение этои программы после ее запуска, другой моей прогой??
VAR
str:string[10];
BEGIN
str:=PARAMSTR(1);
IF str='X' THEN WRITELN('WELCOM!!!')
ELSE WRITELN('Go home!!!');
END.
Подскажите пожалуста!
Как мне "определить" сообщение этои программы после ее запуска, другой моей прогой??
VAR
str:string[10];
BEGIN
str:=PARAMSTR(1);
IF str='X' THEN WRITELN('WELCOM!!!')
ELSE WRITELN('Go home!!!');
END.
Если ты хочешь чтобы это саабчение появлялось во время работы другой проги то просто можешь сделать эту прогу с сообщением как модуль и вызывать его из базовой проги, или запускать ее командой EXEC.
... или запускать ее командой EXEC.
Нет так я уже сделал.
Я хотел бы распознать или как нибудь перехватить ее вывод на экран,
Ну например Halt; возращает 0 ,
а вот Halt(1); возвращает 1.
И переменной DOS >errorlever< узнаем резульат завершения проги. И вот тоже самое только со строкой??
Нет так я уже сделал.
Я хотел бы распознать или как нибудь перехватить ее вывод на экран,
Ну например Halt; возращает 0 ,
а вот Halt(1); возвращает 1.
И переменной DOS >errorlever< узнаем резульат завершения проги. И вот тоже самое только со строкой??
В си есть функция gettext. Она копирует кусок экранного буфера. Ее аналогия должна быть и в пасе. Либо читай экранный буфер по адресу $B8000000. Там нечетные биты - символы, а четные - их цвета.
В си есть функция gettext. Она копирует кусок экранного буфера. Ее аналогия должна быть и в пасе. Либо читай экранный буфер по адресу $B8000000.
Ммм-да чтото не находится в Pascal'e function GetXXXX;
А может можно указателями там какими сослаться?? - только я вот не помню "сегмент:смещение" буфера.
Ммм-да чтото не находится в Pascal'e function GetXXXX;
А может можно указателями там какими сослаться?? - только я вот не помню "сегмент:смещение" буфера.
В паскале есть массивы Mem и MemW, для чтения/записи байтов и слов соответственно.
В паскале есть массивы Mem и MemW, для чтения/записи байтов и слов соответственно.
MEM - это просто сказка!!!(Все теперь работает)
MEM - это просто сказка!!!(Все теперь работает)
Еще в паскале есть прекрасная вещь которой нет в си это Absolute
которая связывает переменную с областю памяти
которую пропишеш.
(С помощю неё я скриншоты в дос текстовых екранов делал)
Правда это для текстового режима 03(80х25). ;)
TYPE EKRAN=ARRAY[1..25,1..80,1..2] OF BYTE;
EKRANC=ARRAY[1..25,1..80,1..2] OF CHAR;
VAR
SCR:EKRAN ABSOLUTE $B800:0000;
SCRC:EKRANC ABSOLUTE $B800:0000;
ATRIBUT:BYTE;
{Узнаём атрибут}
FUNCTION ATTR(X,Y:SHORTINT):byte;
BEGIN
ATTR:=SCR[Y,X,2];
END;
(*Узнаём символ*)
FUNCTION SCREEN(X,Y:SHORTINT):byte;
BEGIN
SCREEN:=SCR[Y,X,1];
END;
Еще в паскале есть прекрасная вещь которой нет в си это Absolute
<...>
...которой нет в твоей голове, а не в си.=) Ты наверно просто забыл, что в си можно сделать указатель на любое место в памяти.
P.S. Как неудобно-то вышло.=)
Еще в паскале есть прекрасная вещь которой нет в си это Absolute
Зато в С есть:
malloc();calloc();galloc();
ЗЫ: А в С++ еще new забыл.
Зато в С есть:
malloc();calloc();galloc();
ЗЫ: А в С++ еще new забыл.
Если читать строку из области экрана, то встает вопрос какую? А он не решеается. Проще всего создать массив ответов первой проги и в RetCode возвращать индекс из этого массива.
...которой нет в твоей голове, а не в си.=) Ты наверно просто забыл, что в си можно сделать указатель на любое место в памяти.
P.S. Как неудобно-то вышло.=)
Ну так и в паскале можно динамически с помощю указателей или в си тоже можна статически во время компиляции?
P.S. Как неудобно-то вышло.=) , да о голове-согласен :P
Ну так и в паскале можно динамически с помощю указателей или в си тоже можна статически во время компиляции?
Догадайся с трех раз.
Еще в паскале есть прекрасная вещь которой нет в си это Absolute
Насчет absolute?? ==>Почему программка не работает без нажатья клавиши?
var
pp:byte absolute $0040:$0017;
begin
clrscr;
writeln('Pressed Ctrl...':45);
REPEAT
pp:=pp or $70;delay(1200);
pp:=pp AND $80;delay(1200);
UNTIL KEYPRESSED;
end.
Ты чего? B8000.
Ты чего? B8000.
Неполнял???
Видеопамять лежит по адресу 0xb8000
Видеопамять лежит по адресу 0xb8000
Да как бы это понятно, програмка о другом о индикаторах на клаве.
Но чего она не пашет без нажатья клавиши непонемаю.(по идеи должна)
Нет, разговор был не об этом :)
Насчёт B8000 drish написал в линейной адресации реального режима где используэться 20 битный адрес.
Почемему не работает без нажатия клавиш, это просто, потому что клавиатуру обслуживает $9 прерывание и когда мы нажымаем клавишу визывается обработчик клавиатуры которий и запихывает байт с адреса $0040:$0017 в порт клавиатуры.
Попробуй явно вызвать $9
int 9h
end;
Почему у меня ничего неполучается?
const n=9200;
var
pp:byte absolute $0040:$0017;
i:integer; r:byte;
begin
clrscr;
writeln('BEGINING...':45);
i:=1;
REPEAT
pp:=pp or $70;
asm;
mov r,ah
MOV Ah,$01
int $09
mov ah,r
end;
delay(n);
pp:=pp AND $80;
asm;
mov r,ah
MOV Ah,$01
int $09
mov ah,r
end;
delay(n);
inc(i);
UNTIL i=100;
end.
может я чего не понял какой резултат ты хочеш от программы : чтоб лампочки замигали или реакцию на комбинационные клавиши.
Но вобще я планировал чтобы индикаторы
помигивали там раз в секунду или чуть быстрее.