MegaCraZy6
@MegaCraZy6
Юзерь

Загрузчик, работает в виртуалке, а на реал железе нет, что делать где ошибка?

Пишу для режима реального времени ( вроде так он називается )

Итак сразу исходник:
#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,8000h
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,8000h 
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 
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,8000h
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,8000h
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: 
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,60
call fill_disp
mov di,0000h 
mov si,0000h    
mov bx,sprite 
call draw_sprite
call draw_display
jmp p4 




x_ret dw 0 
x dw 5
y dw 5 


sprite db 30,30,30,30,30,0,30,30,30,30,30,0,30,30,30,30,30,0,30,30,30,30,30,0,30,30,30,30,30,0,30,30,30,30,30,0,0,0


По сути там реализована, заливка экрана, создание спрайтов, и чтоб это не мерцало создал второй буффер через который это уже выводиться на екран, И о да это чудо работает в виртуалке, я смог написать сам кусок кода и все дела подумал я.. Запустил без емуляции в железе, и там началось то черный екран, то куча разных пикселей, как бутто залез на какой-то используемый кусок кода.. И я не особо понимаю где найти памьять для второго видео буффера я думал что его вобше нет но мне ответили.

320x200 - это 64 КБ, а не 64 МБ, как вы писали выше.
если вы используете real mode и вам доступен 1 МБ - незачем писать про 64 МБ.
половина от 1 МБ - это около 500 КБ. сюда влезет 7-8 видеобуферов по 64 КБ.


Я уже менял пару раз нахождение буффера и так ничего и не получается. Подскажите что и как?
  • Вопрос задан
  • 71 просмотр
Пригласить эксперта
Ответы на вопрос 1
@forspamonly2
не ставя под вопрос целесообразность самого обучения (бывают у людей и бесполезнее увлечения), не могу не отметить бестолковость методологии.

учить сам ассемблер, учиться писать бутлоадер и учиться рисовать графику - это три разные вещи. зачем вы себе всё усложняете, смешав всё в одну кучу и пытаясь понять разом?

бут сектор вообще не должен ничего рисовать, его задача загрузить и проинициализировать основной загрузчик и передать ему управление.

писать на асме в реальном режиме (адресации, а не времени) проще всего собирая досовские com-файлы, запуская их в виртуальной дос-машине какой-нибудь старой винды (типа winXP), и отлаживая каким-нибудь досовским отладчиком (типа турбо-дебаггера). пройдёте пошагово один раз свой код и сразу поймёте что не так.

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

потом, когда напишете свой графический кусок, отдельно сделаете простейший загрузчик для него, и будет вам счастье.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы