Odczytuje z pamieci 2 bajty, mam yasm jako kompilator i jest ogolnie ok ale mam maly prblem a mianowicie:
Mam w pamieci pod adresem xxxx:0x022B slowo: 0x00, 0x01 i na logige powinno odczytac tak:
bl = 0x01
bh = 0x00
i tak odczytuje wczesniej na poczatku programu inne dane z pamieci i dziala jak nalezy
ale niestety zamiast tego mam odczytane tak:
bl = 0x00
bh = 0x01
czyli odwrotnie niz powinno :(
Tak odczytuje:
add ax, 0x002C
mov di, ax
mov bx, [di]
mov [blockout], bx
Moze cos przeoczylem? jakas dzika flaga albo cos?
Tu jest caly kod programu a raczej prawiec skonczonego bootloadera:
[bits 16]
;main boot
start: cli
mov ax, 0x07C0
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFF
sti
mov ax,0x0003
int 0x10 ;clear and set screen
mov ax, 0x1112
xor bl, bl
int 0x10 ;8x8 fonts
mov si, booting
call message
call discinfo
mov ax, kerneldir
mov [filename], ax
mov ax, [longdir]
mov [namelenght], ax
mov ax, [rootdir]
mov [blockin], ax
call search ;searching first block of /kernel/
mov ax, kernelfile
mov [filename], ax
mov ax, [longfile]
mov [namelenght], ax
mov ax, [blockout]
;pusha
;add ax, 20
;mov ah, 0x0E
;mov al, '.'
;int 0x10
;popa
mov [blockin], ax
call search ;searching second block of kernel.bin
jmp loadit
;a20 start function
a20: in al, 0x92
test al, 0x02
jnz a20end ;a20 is set
or al, 0x02
out 0x92, al
a20end: ret
;disc information function
discinfo: mov ax, 0x0001
mov [block], ax
call readit ;reading sector from floppy
mov ax, [ds:0x022C]
mov [rootdir], ax
mov ax, [ds:0x0216]
mov [tablestart], ax
mov ax, [ds:0x0220]
mov [datastart], ax
ret
;variables for disc
rootdir dw 0x0000
tablestart dw 0x0000
datastart dw 0x0000
;search function
search: xor cx, cx
searchmain: inc cx
mov ax, [blockin]
mov bx, [datastart]
add ax, bx
mov [block], ax
call readit ;reading sector from floppy
pusha
mov cx, 0x0008
mov ax, 0x0200
searchloop: pusha
cld
mov di, ax
mov si, [filename]
mov cx, [namelenght]
rep cmpsb
je found ;found file on floppy
popa
add ax, 64
loop searchloop
jmp notfound
found: popa
add ax, 0x002C
mov di, ax
mov bx, [di] <<--- to smierdzi i nie dziala jak nalezy :(
mov [blockout], bx
pusha
mov dh, bh
mov dl, bl
mov ah, 0x0E
;mov al, '.'
mov al, bh
add al, 20
int 0x10
mov al, bl
add al, 20
int 0x10
;mov al, dh
;add al, 20
;int 0x10
popa
;pusha
;mov bx, 0x2000
;add ax, bx
;mov si, 0x0200
;call message
;popa
popa
ret
notfound: popa
cmp cx, 0x0800
jae error
mov dx, [blockin]
mov [nextin], dx
call nextblock
mov dx, [nextout]
cmp dx, 0xFFF0
ja error
mov bx, [nextin]
cmp dx, bx
je error
mov dx, [nextout]
mov [blockin], dx
jmp searchmain
;variables for search
filename dw 0x0000
namelenght dw 0x0000
blockin dw 0x0000
blockout dw 0x0000
;nextblock function
nextblock: pusha
;pusha
;mov ah, 0x0E
;mov al, '|'
;int 0x10
;popa
xor dx, dx
mov ax, [nextin]
mov bx, 256
div bx
mov cx, [tablestart]
add ax, cx
mov [block], ax
call readit
mov cx, 0x0200
mov ax, 2
mov bx, dx
mul bx
add ax, cx
;mov si, ax
;call message
mov si, ax
mov bx, [ds:si]
mov [nextout], bx
popa
ret
;variables for nextblock
nextin dw 0x0000
nextout dw 0x0000
;readit function
readit: pusha
xor dx, dx
mov ax, [block]
mov bx, 36
div bx
mov [scierzka], al
mov ax, dx
xor dx, dx
mov bx, 18
div bx
mov [glowica], al
inc dl
mov [sektor], dl
mov ah, 0x02
mov al, 0x01
mov cl, [sektor]
mov ch, [scierzka]
mov dl, 0x00
mov dh, [glowica]
mov bx, 0x0200
int 0x13
jc error
popa
ret
;variables for read
block dw 0x0000
scierzka db 0x00
sektor db 0x00
glowica db 0x00
;loadit jumper
loadit: mov ax, [blockout]
mov [nextin], ax
mov cx, 0x0500 ;max 640KB kernel size
loaditloop: pusha
mov ax, [nextin]
mov bx, [datastart]
add bx, ax
mov [block], bx
call readit
pusha
;kopiujemy do pamieci tam hen hen przy pomocy a20 powyzej 1MB
;pusha
;mov ah, 0x0E
;mov al, '.'
;int 0x10
;popa
popa
call nextblock
mov ax, [nextout]
mov [nextin], ax
cmp ax, 0xFFFE
je jumpit
cmp ax, 0xFFF0
ja error
popa
loop loaditloop
jmp error
jumpit: popa
jmp jumpit
call a20
;skaczemy do jajka z ustawionymi odpowienio rejestrami
;error
error: mov si, errormessage
call message
for: jmp for
;message function
message: cld
mov ah, 0x0E
messagechar: lodsb
cmp al, 0x00
jz messageend
int 0x10
jmp messagechar
messageend: ret
;messages for bootloader
booting db 'Booting', 0x00
kerneldir db 'kernel', 0x00
longdir dw 0x0007
kernelfile db 'kernel.bin', 0x00
longfile dw 0x000B
errormessage db '.Error', 0x00
;times 510 - ($ - start) db 0
;db 0x55
;db 0xAA