Переворот экрана

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
пользователь
Сообщения: 2
Зарегистрирован: 30 май 2009, 23:29

Подскажите, пожалуйста, как организовать поворот экрана на 180 градусов по вертикали в текстовом режиме(80*25) под DOSом.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Код: Выделить всё

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

У меня этот код не работает. Почему?
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Потому что это код переворота экрана, а не всей программы в целом. Остальная "оформительская" часть, которая не имеет отношения к перевороту - за кадром, в т.ч. и выход в дос.
It's a long way to the top if you wanna rock'n'roll
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

somewhere, у тебя ж экран не переворачивается, а только символы местами переставляются.
Думается, автор спрашивал несколько другое :)
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Значит плюс к этому коду менять таблицу знакогенератора, повернув каждый символ на 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
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

которую здесь дали не подошла
http://programmersforum.ru/showthread.php?t=52314
icq:3(один)7748666
mail:airyashov( а)inbox.ru
Ответить