Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.17;
Скачать: CL | DM;

Вниз

FreePascal Текстовый режим   Найти похожие ветки 

 
syte_ser78 ©   (2004-01-29 11:24) [0]

Научите неопытного, как заполнить весь экран в текстовом режиме определенным симсолом, кроме цикла

for i:=1 to 80*25 do
write (symbol);


 
Anatoly Podgoretsky ©   (2004-01-29 11:30) [1]

цикл for i := 1 to 25 write(StrConst80);
или даже круче просто write(StrConst2000);

Но первый вариант for i:=1 to 80*25 оптимальнее


 
Думкин ©   (2004-01-29 11:33) [2]

Тут не пробовал, но вообще говоря - что-то вроде:

;Программа типа COM.
;Используем прерывание 05h, и 2Fh(функция C800h)
;Резидентная,должна будет читать экран в файл.
;Активизация PrtScr, Будет записывать в файл:
;c:\pascal\work2\sd.scr
TEXT SEGMENT "CODE"
ASSUME CS:TEXT,DS:TEXT
ORG 100h
LNPAGE=80*25 ;Объем экрана
;Резидентная часть
MYPROC PROC
JMP INIT ;На инициализацию
;Данные резидентной части программы.

OLD_2FH DD 0 ;Старый адрес прерывания 2FH
OLD_05H DD 0 ;Старый адрес прерывания 05H-PrtScr
HANDLE DW ? ;Дескриптор файла
FNAME DB "c:\pascal\work2\SD.SCR",0 ;Имя файла
SCR DB LNPAGE DUP (?)
;Наш видеобуфер
LNDOB EQU $-SCR ;Длина буфера

;Текст резидентной части программы.
;Обработчик 2Fh наш
NEW_2FH PROC
CMP AX,0C800h ;Сравним с нашей функцией
JNE NOTOUR ;Нет-отдаем старому прерыванию
MOV AL,0FFh ;Да -возвращаем присутствие
IRET
NOTOUR:
JMP CS:OLD_2FH ;Прыжок к старому
NEW_2FH ENDP

;Обработчик 05h наш
;Весьма бардачный , но пашет!!!
NEW_05H PROC
;Сохраним регистры
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH DS
PUSH ES

MOV AX,0B800h ;Настроим данные на видеобуфер
MOV DS,AX
MOV SI,0 ;Счетчик пока ноль
PUSH CS ;Настроим приемник
POP ES
mov DI,OFFSET SCR ;Наш буфер
mov CX,LNPAGE ;Объем экрана
CLD ;В порядке роста счетчиков
AB: LODSW ;Работаем по символам
STOSB
LOOP AB

PUSH CS ;Настраиваем DS на программу
POP DS

MOV AH,51h ;Старый PSP
INT 21h
PUSH BX ;Запомним его
MOV AH,50h ;Наш PSP
MOV BX,CS ;Поставим его
INT 21h

mov AH,3Dh ;Файл на чтение/запись
mov AL,1 ;Чтение
mov DX,offset fname ;Наш файл
int 21h
mov handle,AX ;Получим дискриптор

mov AH,42h ;На конец файла
mov AL,02 ;Именно конец
mov BX,handle ;Нашего файла
mov CX,0 ;Совсем конец
mov DX,0 ;Абсолютный
int 21h

mov AH,40h ;Ну и пишем
mov BX,handle ;В наш файл!
mov CX,lndob ;Длина буфера
mov DX,offset scr ;Из буфера
int 21h

mov AH,3Eh ;Прикроем файл
mov BX,handle ;Наш файл?
int 21h

POP BX ;Восстановим старый PSP
MOV AH,50h
INT 21h

;Восстановим регистры
POP ES
POP DS
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
IRET ;На боковую
NEW_05H ENDP

;Собственно программа
ENTRY:
;Ну ничего нет!!
IRET

MYPROC ENDP

RESSIZE EQU $-MYPROC ;РАЗМЕР РЕЗИДЕНТНОЙ

;Инициализация

INIT PROC ;Секция инициализации

;Проверка на загруженность
MOV AX,0C800h ;Наша функция
INT 2Fh ;Должен вернуть AL=FFh
CMP AL,0FFh ;Проверяем
JE INSTALLED ;Да установлена,уходим
;Не загружена Сохраним старое
MOV AH,35h ;Получение вектора
MOV AL,2Fh ;Этого прерывания
INT 21h
MOV WORD PTR OLD_2FH,BX ;Сохраняем адрес
MOV WORD PTR OLD_2FH+2,ES
;Запишем новое
MOV AH,25h ;Установка вектора
MOV AL,2Fh
MOV DX,OFFSET NEW_2FH ;Его адрес
INT 21h
;Установим новый вектор 05h
MOV AH,35h ;Получение вектора
MOV AL,05h ;Этого прерывания
INT 21h
MOV WORD PTR OLD_05H,BX ;Сохраняем адрес
MOV WORD PTR OLD_05H+2,ES
;Запишем новое
MOV AH,25h ;Установка вектора
MOV AL,05h
MOV DX,OFFSET NEW_05H ;Его адрес
INT 21h
;Сообщим о загрузке
MOV AH,09h ;Станд. вывод
MOV DX,OFFSET MES
INT 21h
int 05h
;Оставляем в памяти
MOV DX,(RESSIZE+10Fh)/16 ;Размер
MOV AX,3100h ;Функция оставления
INT 21h

INSTALLED:
;Не загружаем сообщаем
MOV AH,09h ;Станд. вывод
MOV DX,OFFSET MES1
INT 21h

MOV AX,4C01h ;Выход с ошибкой
INT 21h
;Данные программы
MES DB "ПРОГРАММА RSCR ЗАГРУЖЕНА(горячая-PrtScr)",10,13,"$"
MES1 DB "ПРОГРАММА ДАВНО РАБОТАЕТ, БОЛЬШЕ НЕЛЬЗЯ",10,13,"$"

INIT ENDP
TEXT ENDS

END MYPROC

Правда тут счиывание.


 
syte_ser78 ©   (2004-01-29 11:50) [3]


> [2] Думкин © (29.01.04 11:33)
> Тут не пробовал, но вообще говоря - что-то вроде:

Ой, это чтото слишком...


> цикл for i := 1 to 25 write(StrConst80);

Хоть это была и шутка, но всеравно, рабоатет немного быстрее :)


 
PVOzerski ©   (2004-01-29 11:58) [4]

Для какой операционной системы-то надо?


 
syte_ser78 ©   (2004-01-29 12:25) [5]

Дос


 
DiamondShark ©   (2004-01-29 12:28) [6]

Если для Win32, то FillConsoleOutputCharacter


 
pasha_golub ©   (2004-01-29 13:07) [7]

Если для ДОС, то прямое обращение к видеопамяти по адресу $B800:$0000 в текстовом режиме, и по адресу $A000:$0000 в графическом, но в графическом свои заморочки.

Типа так. К сожалению размер памяти не помню


var Mem:array [..] of byte absolute $B800:$0000;


 
Anatoly Podgoretsky ©   (2004-01-29 13:19) [8]

syte_ser78 © (29.01.04 11:50) [3]
Да нет не шцтка, а компромис межу скоростью и дополнительной памятью под константу.

pasha_golub © (29.01.04 13:07) [7]
Для стандартного режима 80*25*2 (по два байта на символ), писать надо словами char+attr, можно ассемблерным циклом на i := 1 to 80*25
Есть еще одна тонкость, для Геркулес адрес не $B800:$0000, а $B000:$0000


 
PVOzerski ©   (2004-01-29 13:24) [9]

2pasha_golub © (29.01.04 13:07) [7]:
Тут не всё так просто. FreePascal - компилятор 32-битный, т.е. строго говоря, истинной DOS-платформы не поддерживает (а использует экстендеры - GO32V2, EMX или WDOSX) и не может адресоваться по типу сегмент:смещение. Однако, по-моему, в документации пути обхода этой проблемы с прямой адресацией описаны.


 
pasha_golub ©   (2004-01-29 13:36) [10]

Anatoly Podgoretsky © (29.01.04 13:19) [8]
Про Геркулеса не знал, спасибо. А вот про char+attr не понял.

PVOzerski © (29.01.04 13:24) [9]
Тоже интересно, а как же обойти энто? Очень интересно.


 
PVOzerski ©   (2004-01-29 13:47) [11]

2pasha_golub © (29.01.04 13:07) [7]
>Тоже интересно, а как же обойти энто? Очень интересно.
Фактически - через соответствующие функции экстендеров. Скорее всего, в исходниках модулей CRT и GRAPH под эти платформы всё можно найти. Еще, по-моему, есть спец. модуль GO32.


 
pasha_golub ©   (2004-01-29 13:49) [12]

PVOzerski © (29.01.04 13:47) [11]
Понято. Спасибо.


 
syte_ser78 ©   (2004-01-29 14:04) [13]

Вот уж не думал что атк сложно быстро заполнить экран одинаковыми символами :(...
Спасибо за советы!



Страницы: 1 вся ветка

Текущий архив: 2004.02.17;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
14-53694
mfender
2004-01-28 08:58
2004.02.17
Почему так тормозит форум?


3-53408
Bless
2004-01-26 17:20
2004.02.17
Как в BeforePost сделать, чтобы последующий Post не вызывался


14-53740
sad
2004-01-28 15:55
2004.02.17
Сисадминам и пользователям на заметку


1-53592
Gad
2004-02-07 11:35
2004.02.17
RichEdit и документы Word


1-53500
Sirus
2004-02-06 07:17
2004.02.17
Как добавить PopupMenu к форме....