На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела "Наши Исходники"
Раздел предназначен для публикации различных исходников и программных решений (в виде исходных текстов), которые Вы считаете достойными внимания и/или интересными. Язык исходника значения не имеет. Это может быть C/C++, Pascal, Perl, PHP, C#, Foth, Prolog или любой другой существующий язык программирования. Единственный момент – в названии темы этот язык должен быть указан. Например, «[C++] Представление чисел в римской записи». Сам исходный текст должен содержаться в первом посте темы. Если исходник занимает не больше одного-двух экранов, то допустимо его публикация непосредственно в посте. Иначе исходный текст должен быть прикреплен к посту в виде архива. Кроме того, первый пост должен содержать:

- Информацию о платформе/компиляторе, для которых предназначен исходный текст (если эта информация существенна)
- Ссылку на оригинал и автора (если публикуется чужой исходный текст)
- Максимально подробное описание – какую задачу решает опубликованный исходный текст, и чем он интересен.

Плагиат крайне не приветствуется. Также не приветствуется публикация исходных текстов вирусов, крэков и т. п. информации. Это элементарно противозаконно.

Для быстрого поиска нужного исходника можно воспользоваться навигатором:
Быстрый поиск по разделу
Модераторы: Flex Ferrum
  
> [FASM] Насилуем знакогенератор VGA, Бегущая строка в текстмоде, плавно.
    Вотъ. Использованы куски из моей XVGA, писаные ещё в 1992, так что не обессудьте.
    В качестве мана пользовал Richard Wilton, "Programmer's Guide to PC and PS/2 Video Programming."
    ExpandedWrap disabled
      ;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
    User like an octopus — necromatic spirit with eigth asshole-driven hands...
      Да, славные были времена; работает! :good:
      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script Execution time: 0,0679 ]   [ 14 queries used ]   [ Generated: 18.06.19, 04:48 GMT ]