Написал код. Суть в том что это потом хочу внедрить в свою мини ОС. Поэтому только прерывания биоса.
Для вывода графики использую 13-той режим, из int 10h. а для самого вывода сделал процедуру которая ложит прямо в видеобуфер цвет пикселя. Сделал так-же возможность создать спрайт ( ну вроде єто спрайт можно назвать ). сделал чтоб координата X могла меняться спомощю клавиш "a" и "b", а чтоб стереть старый спрайт заново рисую весь екран. И при этом происходит заметное такое моргание в виртуалке, и не очень заметное но все-же на реал железе. Как можно этого избавиться HELP.
Исходник:
#make_boot#
org 7c00h
use16
jmp start
e:
ret
put_pix:
push ax
push dx
mov ax, 0a000h
mov es, ax
mov ax,320
mul cx
pop dx
add ax,dx
mov di,ax
pop ax
stosb
ret
fill_disp:
mov di,0000h
mov cx,0000h
mov dx,0
p0:
cmp dx,320
jz p1
call put_pix
inc dx
jmp p0
p1:
cmp cx,200
jz e
inc cx
mov dx,0
jmp p0
e_draw:
pop dx
pop bx
mov [x],dx
mov [y],bx
ret
draw_sprite_nexline:
inc si
mov al,00h
cmp al,[bx+si]
jz e_draw
dec si
add [y],01h
mov ax,[x_ret]
mov [x],ax
inc si
jmp draw_sprite_1
draw_sprite:
mov ax,bx
mov dx,[x]
mov bx,[y]
push bx
push dx
mov bx,ax
mov ax,[x]
mov [x_ret],ax
mov si,0000h
draw_sprite_1:
mov ax, 0a000h
mov es, ax
mov ax,320
mov cx,[y]
mul cx
mov dx,[x]
add ax,dx
mov di,ax
mov al,[bx+si]
cmp al,255
jz draw_sprite_2
stosb
draw_sprite_2:
inc si
mov al,00h
cmp al,[bx+si]
jz draw_sprite_nexline
add [x],1
jmp draw_sprite_1
left_sprite:
sub [x],01h
jmp p3
right_sprite:
add [x],01h
jmp p3
start:
mov ah, 0
mov al, 13h
int 10h
mov al,50
call fill_disp
mov di,0000h
mov si,0000h
mov bx,sprite
call draw_sprite
p4:
mov ah,00h
int 16h
cmp al,'a'
jz left_sprite
cmp al,'d'
jz right_sprite
p3:
mov di,0000h
mov si,0000h
mov al,50
call fill_disp
mov di,0000h
mov si,0000h
mov bx,sprite
call draw_sprite
jmp p4
x_ret dw 0
x dw 160
y dw 100
sprite db 15,15,15,15,15,15,15,15,15,0,15,15,15,15,15,15,15,15,15,0,15,15,255,15,15,15,40,15,15,0,15,15,15,15,15,15,15,15,15,0,15,15,15,15,15,15,15,15,15,0,15,15,40,40,40,40,40,15,15,0,15,15,15,15,15,15,15,15,15,0,0