Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2020, 20:30   #1
ichi
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 138
По умолчанию [Turbo Pascal][DosBox] Как все таки правильно работать с видеопамятью на прямую в текстовом режиме?

Подскажите, по заданию к лабораторной мне надо написать программу "бегущая строка". Проблема в том, что программу я написал, "бегущая строка" работает, но в задание есть условие, чтобы текст присутствовавший на экране до запуска программы, не должен портиться никаким образом. Я ни как не могу понять, такое условие в текстовом режиме не возможно выполнить. Текст, который присутствующий на экране так и так будет портится, т.к. я работаю с видео памятью на прямую. Как можно выполнить данное условие? Есть ли вообще решение к данному условию? Может некорректно написал код программы?

Текст лабораторной:
-----------------------
Написать программу, которая будет работать с видеопамятью. Независимо от конкретного задания программа должна работать резидентно. Текст, присутствовавший на экране до запуска программы, не должен портиться никаким образом.
В программе следует использовать два обработчика прерываний – прерываний таймера и прерываний клавиатуры. Прерывания таймера регламентируют скорость перемещения объекта, причем параметр, характеризующий величину скорости, необходимо задавать с клавиатуры при запуске программы. Информация о параметре, задающем скорость движения, должна выводиться на экран при запуске программы без параметров.
В случае смещения строк на экране (нажатие клавиши ENTER) не должно происходить никаких нежелательных эффектов – раздвоения картинки, дублирования строк или их частей…
По экрану, содержащему некоторую информацию, “бежит” текстовая строка. Положение строки и её текст следует задавать параметрами. Строка “бежит” справа налево, при этом по мере того, как первые символы строки скрываются за границей экрана, они должны появляться из-за его правой границы (т.е. экран как бы замкнут). Однократное нажатие клавиши <Alt> меняет направление движения объекта.

Код программы:
Код:
{$M $1000,0,0}
program mvln;
uses crt, dos;
var	
	OldText: Procedure;
	ScrM: Array[1..25, 1..80] of Record
		symbol: Char;
		attr: Byte;
	end Absolute $B800:$0000;

        Line: String[100];
	CLPos: Word;
	CLSpeed: Byte;
	StartPos, CurPos, LL: Integer;
	temp_str: String[30];

procedure CreepingLine;
begin
  if StartPos > 1 then
    Dec(StartPos)
  else
    StartPos := 80;
  CurPos := StartPos;
  temp_str := ScrM[CLPos, CurPos].symbol + temp_str;
  while (CurPos <= 80) and (CurPos - StartPos <= LL) do begin
    ScrM[CLPos, CurPos].symbol := Line[CurPos - StartPos + 1];
    Inc(CurPos);
  end;
  if StartPos + LL <= 80 then begin
    ScrM[CLPos, StartPos + LL].symbol := temp_str[Length(temp_str)];
    Delete(temp_str, Length(temp_str), 1);
  end;
  if (StartPos >= 81 - LL) then begin
    CurPos := 1;
    while CurPos <= LL - (80 - StartPos + 1) do begin
      ScrM[CLPos, CurPos].symbol := Line[80 - StartPos + 1 + CurPos];
      Inc(CurPos);
    end;
    ScrM[CLPos,LL-(80-StartPos+1)+1].symbol := temp_str[length(temp_str)];
    Delete(temp_str,length(temp_str),1);
  end;
end;

{$F+}
Procedure Text; Interrupt;
Begin
	CreepingLine;
	Inline($9C);
	OldText;
End;
{$F-}

Begin
	StartPos := 81;
	CurPos := 0;
	CLPos := 1;
	temp_str := ('');
        Line := ('1234567890');
	LL := Length(Line);
	GetIntVec($8,@OldText);
	SetIntVec($8,Addr(Text));
	Keep(0);
End.
ichi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В текстовом файле хранится программа, записанная на языке Turbo Pascal. Вычислить и дописать в конец этого файла количество операт Grenki Паскаль, Turbo Pascal, PascalABC.NET 5 13.04.2014 12:00
Работа на прямую с видеопамятью asmars Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 17 01.08.2011 16:05
Не правильно считает.(turbo Pascal) spezzA Паскаль, Turbo Pascal, PascalABC.NET 0 15.06.2011 17:08
Turbo C и Dosbox chester997 Общие вопросы C/C++ 2 02.10.2010 13:01