· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.HELHEIM —› Загрузка шрифта.

Посл.отвђт Сообщенiе


Дата: Сен 28, 2004 21:22:16

Имеется прога (исходник прилагаю), требуется сделать так, чтоб выводимый тект мог содержать русские буквы. Я так понимаю, нужно как-то загрузить соответствующий font, но совершенно не предполагаю, как это можно сделать. На домашнем компе я просто поковырял биос видюхи и заменил там все шрифты на русифицированные, так что проблема с русскими буквами в досе снята навечно, но на других компах, естественно, вместо букв крякозябры.
Кому не в лом - подскажите или помогите исходничком.
;Sorry for my "pascal" style of programmin'... it's just my first intro...
.model tiny
.386
 locals %%
.code
 org 100h
begin:
 ;set_vga_mode
 mov al,13h
 int 10h
 mov sp,program_size+psp_size+stack_size
 mov ah,4ah
 mov bx,(program_size+psp_size+stack_size) shr 4+1
 int 21h
 ;create buffers
 mov cl,4
 mov di,offset buffer_video
 mov bx,buffer_size shr 4+1
 %%create_buffers:
  mov ah,48h
  int 21h
  push cs
  pop es
  stosw
  pusha
  mov es,ax
  xor ax,ax
  xor di,di
  mov ch,7dh
  rep stosw
  popa
 loop %%create_buffers
 ;get_font_ptr
 mov ax,1130h
 mov bh,03h
 xor bl,bl
 int 10h
 mov word ptr font_addr,bp
 mov word ptr font_addr+2,es
 ;set_fire_palette
 mov bl,max_color
 mov bh,63
 mov cl,63
 mov ch,63
 %%set_1:
  dec bl
  mov al,bl
  and al,1
  jnz %%next1
   dec cl
   dec bh
  %%next1:
  call screen_set_rgb_palette
  cmp bl,2*63
 jnz %%set_1
 %%set_2:
  dec bl
  mov al,bl
  and al,1
  jnz %%next2
   dec ch
  %%next2:
  call screen_set_rgb_palette
  test bl,bl
 jnz %%set_2
 mov bl,10
 xor di,di
 ;for ret
 push di
 %%repeat:
  dec bx
  jnz %%not_change_string
   add di,text_string_size
   cmp di,last_string
   jl %%not_last_string
    xor di,di
   %%not_last_string:
   mov bl,text_show_delay
  %%not_change_string:
  push bx
  push di
  push cs
  pop ds
  mov es,buffer_first
  cmp exit,0
  jnz %%pass
   mov si,offset string
   add si,di
   mov cx,text_x
   mov dx,text_y
   mov ah,text_color
   mov bl,text_scale
   call buffer_write_string
   push es
   pop ds
   xor edx,edx
   mov cx,buffer_size-320*2
   ;random
   mov ax,cs:seed
   add ax,1234
   xor al,ah
   add ax,4321
   xor al,ah
   mov cs:seed,ax
   xor dx,dx
   div cx
   mov byte ptr [edx+320],255
  %%pass:
  push es
  pop ds
  mov es,cs:buffer_second
  mov si,320
  %%water:
   xor ah,ah
   mov al,[si+1]
   mov bx,ax
   mov al,[si-1]
   add bx,ax
   mov al,[si+320]
   add bx,ax
   mov al,[si-320]
   add ax,bx
   shr ax,1
   mov bl,byte ptr es:[si]
   xor bh,bh
   sub ax,bx
   jns %%move
    xor ax,ax
   %%move:
   mov byte ptr es:[si],al
   inc si
   cmp si,64000-320
  jnz %%water
  mov es,cs:buffer_video
  call buffer_move
  push cs
  pop ds
  cmp exit,0
  jnz %%pass_write
   pop di
   mov si,offset string
   add si,di
   mov cx,text_x
   mov dx,text_y
   xor ah,ah
   mov bl,text_scale
   call buffer_write_string
   push di
  %%pass_write:
  push es
  pop ds
  ;just for delay...
  mov cl,blur_count
  %%blur:
   mov di,max_x
   xor ah,ah
   %%b:
    mov al,[di+max_x]
    mov bx,ax
    mov al,[di-max_x]
    add bx,ax
    mov al,[di+1]
    add bx,ax
    mov al,[di-1]
    add bx,ax
    shr bx,2
    mov al,[di]
    add bx,ax
    shr bx,1
    mov [di],bl
    inc di
    cmp di,buffer_size-321
   jnz %%b
  loop %%blur
  ;wait_retrace
  mov dx,3dah
  %%v1:
   in al,dx
   test al,8
  jz %%v1
  %%v2:
   in al,dx
   test al,8
  jnz %%v2
  mov ds,cs:buffer_video
  push 0a000h
  pop es
  call buffer_move
  push cs
  pop ds
  mov ax,buffer_first
  mov bx,buffer_second
  mov buffer_first,bx
  mov buffer_second,ax
  pop di
  pop bx
  cmp exit,0ffh
  jnz %%not_exit
   dec exit_delay
   jnz %%repeat
   jmp short %%real_exit
  %%not_exit:
  in al,60h
  dec al
  jnz %%repeat
   mov exit,0ffh
  jmp %%repeat
 %%real_exit:
 mov ax,0003h
 int 10h
 screen_set_rgb_palette proc near ;bl,bh,cl,ch<-color,rgb.
  pusha
  mov dx,3c8h
  mov al,bl
  out dx,al
  inc dx
  mov al,bh
  out dx,al
  mov al,cl
  out dx,al
  mov al,ch
  out dx,al
  popa
  retn
 screen_set_rgb_palette endp
 buffer_move proc near;ds,es<-source_buffer,dest_buffer
  xor si,si
  xor di,di
  mov ch,7dh
  rep movsw
  retn
 buffer_move endp
 buffer_write_string proc near;es<-buffer,ds:si<-string addres,ah<-color.
  pusha
  %%write:
   lodsb
   test al,al
   jz %%exit
   push bx
   pusha
   push ds
   lds si,font_addr
   push ax
   xor ah,ah
   shl ax,3
   add si,ax
   xor di,di
   add di,cx
   mov ax,dx
   shl ax,8
   add di,ax
   mov ax,dx
   shl ax,6
   add di,ax
   pop ax
   mov dl,bl
   mov bh,bios_font_size
   xor dh,dh
   %%draw_char:
    lodsb
    mov bl,bios_font_size
    %%draw_line:
     shl al,1
     inc ah
     jnc %%next
      push ax
      push di
      xchg ah,al
      mov ah,dl
      %%draw:
       mov cl,dl
       xor ch,ch
       rep stosb
       add di,max_x
       sub di,dx
       dec ah
      jnz %%draw
      pop di
      pop ax
     %%next:
     add di,dx
     dec bl
    jnz %%draw_line
    push dx
    %%l:
     add di,max_x-bios_font_size
     dec dl
    jnz %%l
    pop dx
    dec bh
   jnz %%draw_char
   pop ds
   popa
   pop bx
   push bx
   %%l2:
    add cx,bios_font_size
    dec bl
   jnz %%l2
   pop bx
  jmp short %%write
  %%exit:
  popa
  retn
 buffer_write_string endp
 blur_count equ 5
 text_color equ 255-30*text_scale
 text_show_delay equ 100
 text_scale equ 3
 text_x equ (max_x-(text_string_size-1)*text_scale*bios_font_size)/2+5
 text_y equ 90
 max_x equ 320
 max_y equ 200
 bios_font_size equ 8
 psp_size equ 100h
 stack_size equ 100h
 buffer_size equ 320*200
 video_memory equ 0a000h
 max_color equ 252
 text_string_size equ 14
 string db '             ',0
        db '    Intro    ',0
        db '     by      ',0
        db 'Bart Simpson ',0
        db '   email :   ',0
        db ' bartsimpson ',0
        db '@simpsons.com',0
        db '   site :    ',0
        db '     www     ',0
        db '.bartsimpson ',0
        db '   .nm.ru    ',0
        db '             ',0
 last_string equ $-offset string
 exit_delay db 100
 exit db 0
 buffer_video dw ?
 buffer_first dw ?
 buffer_second dw ?
 buffer_text dw ?
 seed dw ?
 font_addr dd ?
 program_size equ $-offset begin
end begin


Дата: Сен 28, 2004 22:14:10

Павел Соколенко, Программирование SVGA-графики для IBM-PC:
;----------------------------------------------
;Загрузка таблиы символов 8х16 в знакогенератор
;----------------------------------------------
	push	es			;сохранение es
	les	bp,dword ptr RsFnt16	;es:bp - адрес еачала таблицы
	mov	cx,256			;количество символов в таблице
	xor	dx,dx			;смещегие первого символа
	mov	bh,16			;количество байтов на символ
	xor	bl,bl			;номер таблицы в знакогенераторе
	mov	ax,1100h		;код запроса "загрузить таблицу"
	int	10h			;выполнение запроса
	pop	es			;восстановление es
;----------------------------------------------
RsFnt16	dw	?	;смещение таблицы
	dw	?	;сегмент
ну, и таблицу нужно предварительно прочитать из файла.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.054