Форум: "Потрепаться";
Текущий архив: 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.48 MB
Время: 0.009 c