MegaCraZy6
@MegaCraZy6
Юзерь

Где ошибка в двойной буферизации?

Нужна помощь, написал простую программку, работает в видео режиме 320на200, суть в том что она может выводить спрайты, потом понял что нужно сделать второй буфер ( ну как понял, задавал вопрос на тостере ), сделал вроде как чтоб все что раньше выводилось в видеобуфер, выводилось в обычный буфер, а от туда уже вызовом draw, перемещал то что лежит в буфере в видео буфер.

Все работает отлично на виртуалке, эмуляторах.
А вот на железе проблемы. Заливка экрана работает отлично. А вот вместо спрайта выводит пару пикселей, совсем нет от спрайта, и не в той позиции он должен был быть.

Код:
#make_boot# 

org 7c00h 
use16 
jmp start 

e: 
mov ax,cs 
mov ds,ax 
mov es,ax 
ret 


put_pix: 
push ax 
push dx 
mov ax,9000h
mov es, ax 
mov ax,320 
mul cx 
pop dx 
add ax,dx 
mov di,ax 
pop ax 
stosb 
ret 

fill_disp: 
push ax 
mov ax,9000h
mov ds,ax 
pop ax 
mov ah,al 
mov bx,0000h 
mov [bx],ax 
p0: 
add bx,2 
mov [bx],ax 
cmp bx,0FFFEh 
jz e 
jmp p0 

e_draw: 
pop dx 
pop bx 
mov [x],dx 
mov [y],bx  
mov ax,cs 
mov ds,ax 
mov es,ax 
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,9000h  
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 

draw_display: 
mov di,0000h 
mov bx,0000h 
mov si,0000h 
mov ax,9000h
mov ds,ax 
mov ax,0A000h 
mov es,ax 
draw_display_1: 
cmp bx,0FFFFh 
jz draw_display_2 
mov al,[bx] 
stosb 
inc bx 
jmp draw_display_1 
draw_display_2: 
jz e 


left_sprite: 
sub [x],01h 
jmp p3 
right_sprite: 
add [x],01h 
jmp p3 

start: 
cld
mov ah, 0 
mov al, 13h 
int 10h 
mov al,40 
;call fill_disp 
mov di,0000h 
mov si,0000h 
mov bx,sprite 
;call draw_sprite 
p4: 
mov ah,01h 
int 16h 
jz p7 
mov ah,00h 
int 16h 
cmp al,'a' 
jz left_sprite 
cmp al,'d' 
jz right_sprite 
p7: 
p3: 
mov di,0000h 
mov si,0000h 
mov al,40 
call fill_disp 
mov di,0000h 
mov si,0000h 
mov bx,sprite 
call draw_sprite 
mov di,0000h
mov si,0000h
call draw_display 
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


PS: Не могу понять в чем дело, уже пару раз задаю вопрос как это решить. Никто помочь не может говорят искать ошибку, я то ищу, уже через дебагер перерыл все, ну нету ошибок, в идеале все должно работать, даже пытался переписать код заново, результаты разные но толку как-то нету
  • Вопрос задан
  • 74 просмотра
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы