[asm] rom font

0

ma ktos jakis kodzik ktory wyswietla znak, na podstawie czcionki z rom fontu, bez uzycia przerwania (szybkosc) ??

Ew. jak to na asma przetlumaczyc:

void _grxDrawChar(word x,word y,byte color,char c)
{
  char *fchar = font + (c << 3);
  byte b = 0x80;
  int ly,lx;
  for(ly = 0; ly < 8; ly++)
  {
     b = 0x80;
     for(lx = 0; lx < 8; lx++)
     {
       if(*fchar & b)
	 grxPutPixel(x + lx,y + ly,color);
       b >>= 1;
     }
     fchar++;
  }
}

gdzie font to: static byte *font = (unsigned char *)0xF000FA6E;

0

MODEL TINY
.386p
.code
org 100h
start:
mov ax,cs
mov ds,ax
mov ax,0013h
int 10h
mov ax,0FFA6h
mov es,ax

push 160
push 100
lea si,tekst
call pisz

xor ax,ax
int 16h
mov ah,4ch
int 21h

tekst DB "SUPER",0

plot:
push es
push ax
shl ax,6
add di,ax
shl ax,2
add di,ax
mov ax,0A000h
mov es,ax
mov es:[di],bl
pop ax
pop es
ret

; WE - X, Y na stosie; Si- tekst; es - segment tekstu :P
@@y equ [BP+4]
@@x equ [BP+6]

pisz:
push bp
mov bp,sp
@dalej:
push si ; zapamietaj polozenie litery w buforze
xor ah,ah
mov bl,[si] ; odczytaj litere
or bl,bl
jz @koniec ; jeśli to litera o kodzie ASCII = 0 to koniec
shl bx, 3 ; pomnoz przez 8
add bx,0Eh ; dodaj 0E
xor cx,cx ; wyczysc CX
@petPos: ; petla litery
push bx ; zapamietaj BX
add bx,cx ; dodaj do niego numer wiersza
mov al, es: [bx] ; odczytaj bajt
push cx ; zapamietaj CX
mov dx,cx ; zapisz DX = CX bedziemy potrzebowac przy rysowaniu
xor cx,cx
@petBit: ; rozbijamy na bity
mov ah,al ; przepisz al do ah
and ah,128 ; czy ostatni bit sie pali
je dal ; jesli nie to papa
push ax ; w innym wypadku narysuj
mov di,cx
add di,@@x
mov ax,dx
add ax,@@y
mov bl,100
call plot
pop ax
dal:
shl al,1 ; przesun bity w lewo
inc cx ; zwieksz licznik bitów
cmp cx,8 ; gdy to nie koniec
jne @petBit ; skocz do sprawdzania bitów
pop cx ; zdejmij stary CX
pop bx ; i stary BX
inc cx ; zwieksz numer wiersza
cmp cx,8 ; jeśli to nie
jne short @petPos ; ostatni to skocz do petli wierszy
mov bx,8
add @@x,bx
pop si ; w innym wypadku zdejmij si
inc si ; zwieksz index litery
jmp @dalej ; lec po następną literke...
@koniec:
pop si
pop bp
ret 4

end start

0

thx ale juz sobie poradziłem z tym ustroństwem :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1