Использованы куски из моей XVGA, писаные ещё в 1992, так что не обессудьте. В качестве мана пользовал Richard Wilton, "Programmer's Guide to PC and PS/2 Video Programming." - Charles Cludge Код (ASM): ;FASM - сохранять в cp866 org 100h push 0B800h ; VRAM seg pop es call CopyFont ; копируем шрифт из знакогенератора в память call TurnCursor ; выключаем курсор call WidthTo9 ; 9 пикселей на символ, иначе будет полосить call Clr2ndFnt ; очищаем вторую банку знакогенератора ;ClrScr mov ax, 0600h ; очищаем экран mov bh, 2h ; зелёненькие буковки на чёрном xor cx, cx ; 0,0 mov dx, 184Fh ; 24,79 int 10h call Fill mov ah, 2 mov bx, 1009h mov si, herald call putXY ;putXY (26,11,kl); mov ah, 2 mov bx, 1A0Ah mov si, kl call putXY @@: call Scroll ;двигаем шрифт во второй банке знакогенератора на 1 пиксель влево mov ah,1 int 16h ;kbhit jz @B mov ax,3 int 10h ; выставляем 3 видеомоду call TurnCursor ; включаем курсор ret ;GTFO ; write ASCIZ string to VRAM directly ; ah = attr ; si -> str ; bl = row ; bh = col putXY: movzx di, bl imul di, (80*2) shl bh, 1 movzx bx,bh add di, bx @@: lodsb or al, al jz @F stosw jmp @B @@: ret WidthTo9: ; Change To 640 Horz Res mov dx, 3cch in al, dx and al, not(4 or 8) mov dx, 3c2h out dx, al ; Turn Off Sequence Controller mov dx, 3c4h xor al, al out dx, al inc dx out dx, al ; Reset Sequence Controller dec dx out dx, al inc dx mov al, 3 out dx, al ; Switch To 8 Pixel Wide Fonts dec dx mov al, 1 out dx, al inc dx in al, dx or al, 1 out dx, al ; Turn Off Sequence Controller dec dx xor al,al out dx, al inc dx out dx, al ; Reset Sequence Controller dec dx out dx, al inc dx mov al, 3 out dx, al ; Center Screen mov dx, 3dah in al, dx mov dx, 3c0h mov al, 13h or 32 out dx, al mov al, 0 out dx, al ret ; готовим видеопамять под бегущую строку Fill: MOV BL, 4 MOV AX, 1103h INT 10h mov dx, 10 ;row mov ax, 0B800h mov es, ax imul di, dx, 160 mov si, di mov cx, 80 xor bl, bl @1: mov [es:di],bl inc di or byte [es:di], 8 inc bl inc di loop @1 ret Ope: ; открываем память знакогенератора, сегмент 0В800h, 32Kb mov si,Open jmp Clo_2 Clo: ; закрываем знакогенератор mov si,Close Clo_2: mov ax,Prgdev call ax call ax ret Prgdev: push ax lodsw xchg dx, ax lodsw xchg cx, ax @@: lodsw out dx, ax loop @B pop ax ret ; port, n, n items data... Open: dw 3C4h, 2, 0402h, 0704h, 3CEh, 3, 0204h, 0005, 0C06h Close: dw 3C4h, 2, 0302h, 0304h, 3CEh, 3, 0004, 1005h, 0E06h ;copy font to ram CopyFont: push ds push es call Ope push es pop ds ; ds=0xB800 push cs pop es xor esi, esi mov edi, FONT mov ecx, 8*256;32*256 ; 256 chars, 32 bytes per char xor eax, eax rep movsd call Clo pop es pop ds ret ; очишаем вторую банку знакогенератора Clr2ndFnt: push es call Ope mov ax, 0BC00h mov es, ax xor ax, ax mov di, ax mov cx, 8*256 rep stosd call Clo pop es ret Scroll: call Ope ; Wait For Retrace mov dx, 3DAh @@: in al, dx test al, 8 jz @b ; Scroll Text One Pixel To The Left mov ax, 0BC00h mov es, ax mov cx, 32 @row: mov di, (79 * 32) - 1 add di, cx shl byte [es:di], 1 pushf sub di, 32 popf push cx mov cx, 79 @chrs: rcl byte [es:di], 1 pushf sub di, 32 popf loop @chrs pop cx loop @row ; cmp word [CharCol],0 ja @F mov word [CharCol],7 inc byte [Counter] jmp @2 @@: dec word [CharCol] @2: cmp byte [Counter], msglen jb @F mov byte [Counter],0 @@: mov di, 9E0h mov cx, 15 @@: mov bx, cx mov al, [es:di+bx] ;al = 0xBC00:0x9E0 + CounterY]} mov bl, [Counter] mov bl, byte [msg+bx] xor bh, bh shl bx, 5 add bx, cx mov ah, byte [FONT+bx] mov bx, word [CharCol] and ah, byte [PwrTbl+bx] xchg bx, cx shr ah, cl xchg bx, cx or al, ah mov bx, cx mov [es:di+bx], al loop @B call Clo ret ; ; ;cursor on/off toggle ; TurnCursor: mov dx, 3D4h ; CRTC register index mov al, 0Ah ; 0Ah - cursor start out dx, al inc dx ; read 3D5h - CRTC data in al, dx btc ax, 5 ; toggle bit5: VGA cursor on(0)/off out dx, al ; & write it away ret ;---------------- herald: db 'Пример плавной бегущей строки в текстовом режиме.',0 kl: db '(#) 2014 by Charles Kludge.',0 msg: db "В чащах юга жил-был цитрус. Да, но фальшивый экземпляр!" db " A quick brown fox jumps over the lazy dog's back. " msglen = $ - msg Counter:db 0 CharCol:dw 8 PwrTbl db 1, 2, 4, 8, 16, 32, 64, 128 ; font save area FONT: rd 256*8