Страница 1 из 1

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

Добавлено: 30 май 2009, 23:36
пользователь
Подскажите, пожалуйста, как организовать поворот экрана на 180 градусов по вертикали в текстовом режиме(80*25) под DOSом.

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

Добавлено: 31 май 2009, 13:06
somewhere

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

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

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

Добавлено: 31 май 2009, 23:35
пользователь
У меня этот код не работает. Почему?

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

Добавлено: 01 июн 2009, 09:16
somewhere
Потому что это код переворота экрана, а не всей программы в целом. Остальная "оформительская" часть, которая не имеет отношения к перевороту - за кадром, в т.ч. и выход в дос.

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

Добавлено: 01 июн 2009, 09:31
BBB
somewhere, у тебя ж экран не переворачивается, а только символы местами переставляются.
Думается, автор спрашивал несколько другое :)

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

Добавлено: 01 июн 2009, 11:27
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)

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

Добавлено: 03 июн 2009, 09:23
airyashov
которую здесь дали не подошла
http://programmersforum.ru/showthread.php?t=52314