Консультация № 193128
22.04.2018, 00:55
0.00 руб.
0 2 1

Здравствуйте уважаемые эксперты!
Подскажите, пожалуйста, на примерах (с поясниниями), как рассчитать рамку окна в центре экрана?
Дано:
нулевая видеостраница в текстовом режиме (№ 0);
Адрес 0B800:0000h – 0B800:0FFFh
Экран 80х25.
видеорежим 3;
Задание, вывести рамку в середину экрана (в середину экрана 80х25).
Регистры, операторы, числа по высоте, и ширине – ваши, на ваше усмотрение.
---------------
С уважением, KerenskyAF

Обсуждение

давно
Старший Модератор
31795
6196
22.04.2018, 17:46
общий
это ответ
Здравствуйте, kerenskyaf!

Код TASM:
[code lang=asm h=200]model tiny,pascal
.code
org 100h
szScreenH equ 80;разиер экрана
szPole equ 2;кол-во байт на символ(символ+аттрибут)
RamkaH equ 10;левый верхний угол по горизонтали
RamkaV equ 05;левый верхний угол по вертикали
szRamkaH equ 20;разиер по горизонтали
szRamkaV equ 9;размер по вертикали
Fon equ 3;цвет фона
color equ 15;цвет выводимого символа
Simbol equ '*';выводимый сивол
Space equ ' ';пробел для фона
;цстанавливаем режим
begin: mov ax,3
int 10h
;сегментный регистр настраиваем на видео буфер
mov ax,0B800h
mov es,ax
cld
;рисуем фон
mov ax,(RamkaV*szScreenH+RamkaH)*szPole
MOV bx,szRamkav;
mov cx,szRamkaH;
mov dx,(Fon*16+color)*100h+space;
call Squere,ax,bx,cx,dx
;рисуем линию символов рамки горизонтальную
mov ax,(RamkaV*szScreenH+RamkaH)*szPole
MOV bx,1;
mov cx,szRamkaH;
mov dx,(Fon*16+color)*100h+simbol;
call Squere,ax,bx,cx,dx
;рисуем линию символов рамки вертикальную
mov ax,(RamkaV*szScreenH+RamkaH+szRamkaH)*szPole
MOV bx,szRamkaV;
mov cx,1;
mov dx,(Fon*16+color)*100h+simbol;
call Squere,ax,bx,cx,dx
;рисуем линию символов рамки горизонтальную
mov ax,((RamkaV+szRamkaV-1)*szScreenH+RamkaH)*szPole
MOV bx,1;
mov cx,szRamkaH;
mov dx,(Fon*16+color)*100h+simbol;
call Squere,ax,bx,cx,dx
;рисуем линию символов рамки вертикальную
mov ax,(RamkaV*szScreenH+RamkaH)*szPole
MOV bx,szRamkaV;
mov cx,1;
mov dx,(Fon*16+color)*100h+simbol;
call Squere,ax,bx,cx,dx
;возврат в ОСь
ret
;
Squere proc a:word,b:word,c:word,d:word
uses ax,cx,di
mov di,a
mov cx,b
mov ax,d
@@01: push cx
push di
mov cx,c
rep stosw
pop di
add di,szScreenH*szPole
; add di,c
pop cx
loop @@01
ret
Squere endp
end BEGIN[/code]
Результат работы на картинке(у меня WIN7-32 бита).
Удачи!
Прикрепленные файлы:
277abd4e0c43cc37a9c48030e3c22cba41562267.jpg
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
22.04.2018, 17:51
общий
Адресаты:
В коде Вы увидите много того, что другие компиляторы научились делать недавно, а tasm делал это в далеких 80-х
Прикрепленные файлы:
487098fb45d01eeead90307c8c5ea686.jpg
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа