Переворот экрана
Модератор: Andy
-
- Сообщения: 2
- Зарегистрирован: 30 май 2009, 23:29
Подскажите, пожалуйста, как организовать поворот экрана на 180 градусов по вертикали в текстовом режиме(80*25) под DOSом.
Код: Выделить всё
mov ax, 0B800h
mov es, ax
mov cx, 40*25
xor si, si
mov di, 80*25-2
@loop:
mov ax, es:[si]
xchg ax, es:[di]
mov es:[si], ax
add si, 2
sub di, 2
loop @loop
It's a long way to the top if you wanna rock'n'roll
-
- Сообщения: 2
- Зарегистрирован: 30 май 2009, 23:29
У меня этот код не работает. Почему?
Потому что это код переворота экрана, а не всей программы в целом. Остальная "оформительская" часть, которая не имеет отношения к перевороту - за кадром, в т.ч. и выход в дос.
It's a long way to the top if you wanna rock'n'roll
somewhere, у тебя ж экран не переворачивается, а только символы местами переставляются.
Думается, автор спрашивал несколько другое
Думается, автор спрашивал несколько другое

Значит плюс к этому коду менять таблицу знакогенератора, повернув каждый символ на 180 градусов. Чтение и запись битовой таблицы символов:
Код: Выделить всё
INT 10 - VIDEO - TEXT-MODE CHARACTER GENERATOR FUNCTIONS (PS, EGA, VGA)
AH = 11h
The following functions will cause a mode set, completely resetting
the video environment, but without clearing the video buffer
AL = 00h, 10h: load user-specified patterns
ES:BP -> user table
CX = count of patterns to store
DX = character offset into map 2 block
BL = block to load in map 2
BH = number of bytes per character pattern
AL = 01h, 11h: load ROM monochrome patterns (8 by 14)
BL = block to load
AL = 02h, 12h: load ROM 8 by 8 double-dot patterns
BL = block to load
AL = 03h: set block specifier
BL = block specifier
(EGA/MCGA) bits 0,1 = block selected by chars with attribute bit 3 = 0
bits 2,3 = block selected by chars with attribute bit 3 = 1
(VGA) bits 0,1,4 = block selected by attribute bit 3 = 0
bits 2,3,5 = block selected by attribute bit 3 = 1
AL = 04h, 14h: load ROM 8x16 character set (VGA)
BL = block to load
The routines called with AL=1xh are designed to be called only
immediately after a mode set and are similar to the routines called
with AL=0xh, except that:
Page 0 must be active.
Bytes/character is recalculated.
Max character rows is recalculated.
CRT buffer length is recalculated.
CRTC registers are reprogrammed as follows:
R09 = bytes/char-1 ; max scan line (mode 7 only)
R0A = bytes/char-2 ; cursor start
R0B = 0 ; cursor end
R12 = ((rows+1)*(bytes/char))-1 ; vertical display end
R14 = bytes/char ; underline loc
AL = 20h: set user 8 by 8 graphics characters (INT 1F)
ES:BP -> user table
AL = 21h: set user graphics characters
ES:BP -> user table
CX = bytes per character
BL = row specifier
00h user set
DL = number of rows
01h 14 rows
02h 25 rows
03h 43 rows
AL = 22h: ROM 8 by 14 set
BL = row specifier (see above)
AL = 23h: ROM 8 by 8 double dot
BL = row specifier (see above)
AL = 24h: load 8x16 graphics characters (VGA/MCGA)
BL = row specifier (see above)
AL = 29h: load 8x16 graphics characters (Compaq Systempro)
BL = row specifier (see above)
It's a long way to the top if you wanna rock'n'roll
которую здесь дали не подошла
http://programmersforum.ru/showthread.php?t=52314
http://programmersforum.ru/showthread.php?t=52314
icq:3(один)7748666
mail:airyashov( а)inbox.ru
mail:airyashov( а)inbox.ru