Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.007 c
1-53541
Виталя
2004-02-05 14:25
2004.02.17
Как поймать момент, когда мое приложение теряет активность


1-53506
Kinderrr
2004-02-05 22:39
2004.02.17
Удаление элементов списка.


14-53716
Йцукен
2004-01-28 21:00
2004.02.17
Числа?


8-53646
kvp
2003-10-20 12:52
2004.02.17
Повернуть элипс на произвольный угол


14-53702
Rauf
2004-01-17 17:59
2004.02.17
Кто учится на первом курсе или вообще учится в ХНУ им. Каразина





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский