1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Плавно бегущая строка в текстмоде

Тема в разделе "WASM.DOS/BIOS/Vesa/ports", создана пользователем _edge, 29 дек 2016.

  1. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    576
    Адрес:
    Russia
    Использованы куски из моей XVGA, писаные ещё в 1992, так что не обессудьте.
    В качестве мана пользовал Richard Wilton, "Programmer's Guide to PC and PS/2 Video Programming."


    - Charles Cludge

    Код (ASM):
    1.     ;FASM - сохранять в cp866
    2.         org 100h
    3.         push    0B800h      ; VRAM seg
    4.         pop es
    5.         call    CopyFont    ; копируем шрифт из знакогенератора в память
    6.         call    TurnCursor  ; выключаем курсор
    7.         call    WidthTo9    ; 9 пикселей на символ, иначе будет полосить
    8.         call    Clr2ndFnt   ; очищаем вторую банку знакогенератора
    9.     ;ClrScr
    10.         mov ax, 0600h   ; очищаем экран
    11.         mov bh, 2h          ; зелёненькие буковки на чёрном
    12.         xor cx, cx      ; 0,0
    13.         mov dx, 184Fh   ; 24,79
    14.         int 10h
    15.         call    Fill
    16.         mov ah, 2
    17.         mov bx, 1009h
    18.         mov si, herald
    19.         call    putXY
    20.     ;putXY (26,11,kl);
    21.         mov ah, 2
    22.         mov bx, 1A0Ah
    23.         mov si, kl
    24.         call    putXY
    25.    
    26.     @@: call    Scroll  ;двигаем шрифт во второй банке знакогенератора на 1 пиксель влево
    27.         mov ah,1
    28.         int 16h     ;kbhit
    29.         jz  @B
    30.    
    31.         mov ax,3
    32.         int 10h ; выставляем 3 видеомоду
    33.         call    TurnCursor  ; включаем курсор
    34.         ret     ;GTFO
    35.     ; write ASCIZ string to VRAM directly
    36.     ; ah = attr
    37.     ; si -> str
    38.     ; bl = row
    39.     ; bh = col
    40.     putXY:
    41.         movzx   di, bl
    42.         imul    di, (80*2)
    43.         shl bh, 1
    44.         movzx   bx,bh
    45.         add di, bx
    46.     @@: lodsb
    47.         or  al, al
    48.         jz  @F
    49.         stosw
    50.         jmp @B
    51.     @@: ret
    52.    
    53.     WidthTo9:
    54.     ; Change To 640 Horz Res
    55.         mov dx, 3cch
    56.         in  al, dx
    57.         and al, not(4 or 8)
    58.         mov dx, 3c2h
    59.         out dx, al
    60.    
    61.     ; Turn Off Sequence Controller
    62.         mov dx, 3c4h
    63.         xor al, al
    64.         out dx, al
    65.         inc dx
    66.         out dx, al
    67.    
    68.     ; Reset Sequence Controller
    69.         dec dx
    70.         out dx, al
    71.         inc dx
    72.         mov al, 3
    73.         out dx, al
    74.    
    75.     ; Switch To 8 Pixel Wide Fonts
    76.         dec dx
    77.         mov al, 1
    78.         out dx, al
    79.         inc dx
    80.         in  al, dx
    81.         or  al, 1
    82.         out dx, al
    83.    
    84.     ; Turn Off Sequence Controller
    85.         dec dx
    86.         xor al,al
    87.         out dx, al
    88.         inc dx
    89.         out dx, al
    90.    
    91.     ; Reset Sequence Controller
    92.         dec dx
    93.         out dx, al
    94.         inc dx
    95.         mov al, 3
    96.         out dx, al
    97.    
    98.     ; Center Screen
    99.         mov dx, 3dah
    100.         in  al, dx
    101.         mov dx, 3c0h
    102.         mov al, 13h or 32
    103.         out dx, al
    104.         mov al, 0
    105.         out dx, al
    106.         ret
    107.     ; готовим видеопамять под бегущую строку
    108.     Fill:
    109.             MOV BL, 4
    110.             MOV AX, 1103h
    111.             INT 10h
    112.             mov dx, 10      ;row
    113.         mov ax, 0B800h
    114.         mov es, ax
    115.         imul    di, dx, 160
    116.         mov si, di
    117.         mov cx, 80
    118.         xor bl, bl
    119.     @1: mov [es:di],bl
    120.         inc di
    121.         or  byte [es:di], 8
    122.         inc bl
    123.         inc di
    124.         loop    @1
    125.         ret
    126.    
    127.     Ope:    ; открываем память знакогенератора, сегмент 0В800h, 32Kb
    128.         mov si,Open
    129.         jmp Clo_2
    130.    
    131.     Clo:    ; закрываем знакогенератор
    132.         mov si,Close
    133.     Clo_2:  mov ax,Prgdev
    134.         call    ax
    135.         call    ax
    136.         ret
    137.    
    138.     Prgdev:
    139.         push    ax
    140.         lodsw
    141.         xchg    dx, ax
    142.         lodsw
    143.         xchg    cx, ax
    144.     @@: lodsw
    145.         out dx, ax
    146.         loop    @B
    147.         pop ax
    148.         ret
    149.     ; port, n, n items data...
    150.     Open:       dw  3C4h, 2, 0402h, 0704h, 3CEh, 3, 0204h, 0005, 0C06h
    151.     Close:      dw  3C4h, 2, 0302h, 0304h, 3CEh, 3, 0004, 1005h, 0E06h
    152.    
    153.     ;copy font to ram
    154.     CopyFont:
    155.         push    ds
    156.         push    es
    157.         call    Ope
    158.         push    es
    159.         pop ds  ; ds=0xB800
    160.         push    cs
    161.         pop es
    162.         xor esi, esi
    163.         mov edi, FONT
    164.         mov ecx, 8*256;32*256   ; 256 chars, 32 bytes per char
    165.         xor eax, eax
    166.         rep movsd
    167.         call    Clo
    168.         pop es
    169.         pop ds
    170.         ret
    171.     ; очишаем вторую банку знакогенератора
    172.     Clr2ndFnt:
    173.         push    es
    174.         call    Ope
    175.         mov ax, 0BC00h
    176.         mov es, ax
    177.         xor ax, ax
    178.         mov di, ax
    179.         mov cx, 8*256
    180.         rep stosd
    181.         call    Clo
    182.         pop es
    183.         ret
    184.    
    185.     Scroll:
    186.         call    Ope
    187.     ; Wait For Retrace
    188.         mov dx, 3DAh
    189.     @@: in  al, dx
    190.         test    al, 8
    191.             jz  @b
    192.     ; Scroll Text One Pixel To The Left
    193.         mov ax, 0BC00h
    194.         mov es, ax
    195.         mov cx, 32
    196.     @row:
    197.         mov di, (79 * 32) - 1
    198.         add di, cx
    199.         shl byte [es:di], 1
    200.         pushf
    201.         sub di, 32
    202.         popf
    203.         push    cx
    204.         mov cx, 79
    205.     @chrs:
    206.         rcl byte [es:di], 1
    207.         pushf
    208.         sub di, 32
    209.         popf
    210.         loop    @chrs
    211.         pop cx
    212.         loop    @row
    213.     ;
    214.         cmp word [CharCol],0
    215.         ja  @F
    216.         mov word [CharCol],7
    217.         inc byte [Counter]
    218.         jmp @2
    219.     @@: dec word [CharCol]
    220.     @2:
    221.         cmp byte [Counter], msglen
    222.         jb  @F
    223.         mov byte [Counter],0
    224.     @@:
    225.         mov di, 9E0h
    226.         mov cx, 15
    227.     @@: mov bx, cx
    228.         mov al, [es:di+bx] ;al = 0xBC00:0x9E0 + CounterY]}
    229.         mov bl, [Counter]
    230.         mov bl, byte [msg+bx]
    231.         xor bh, bh
    232.         shl bx, 5
    233.         add bx, cx
    234.         mov ah, byte [FONT+bx]
    235.         mov bx, word [CharCol]
    236.         and ah, byte [PwrTbl+bx]
    237.         xchg    bx, cx
    238.         shr ah, cl
    239.         xchg    bx, cx
    240.         or  al, ah
    241.         mov bx, cx
    242.         mov [es:di+bx], al
    243.         loop    @B
    244.         call    Clo
    245.         ret
    246.     ;
    247.     ;
    248.     ;cursor on/off toggle
    249.     ;
    250.     TurnCursor:
    251.         mov dx, 3D4h    ; CRTC register index
    252.         mov al, 0Ah     ; 0Ah - cursor start
    253.         out dx, al
    254.         inc dx      ; read 3D5h - CRTC data
    255.         in  al, dx
    256.         btc ax, 5       ; toggle bit5: VGA cursor on(0)/off
    257.         out dx, al      ; & write it away
    258.         ret
    259.     ;----------------
    260.     herald: db  'Пример плавной бегущей строки в текстовом режиме.',0
    261.     kl: db  '(#) 2014 by Charles Kludge.',0
    262.     msg:    db  "В чащах юга жил-был цитрус. Да, но фальшивый экземпляр!"
    263.         db  " A quick brown fox jumps over the lazy dog's back. "
    264.     msglen  =   $ - msg
    265.     Counter:db  0
    266.     CharCol:dw  8
    267.     PwrTbl  db  1, 2, 4, 8, 16, 32, 64, 128
    268.     ; font save area
    269.     FONT:   rd  256*8
     

    Вложения:

    • Charles.zip
      Размер файла:
      3 КБ
      Просмотров:
      131
    • charles.png
      charles.png
      Размер файла:
      14,6 КБ
      Просмотров:
      501