код длинный, но первую часть вообще мжно не смотреть, где начинается магия я выделил коментом ;=====. суть в том, что я читаю сектор с сидюка, от туда беру четыре байта инфы (размер корневого каталога) и ложу их в две переменные. затем я хочу использовать эту инфу и хренакс у меня уже там нули, заместо 800h... также затираются сообщения. весь прикол в том, что трется и вначале кода, и в конце... (RootSize1 - в начале кода, RootSize2 - в конце)
Код:
use16
org 7C00h
start:
jmp far 0:boot
RootSize1 dd 5h
boot: ;прыжок для занесения в cs 0
cli
mov ax, cs ;настройка сегментных регистров
mov ds, ax
xor ax, ax
mov [device], dl
mov es, ax
mov sp, 7C00h ;установка sp на начало кода (т.к. стек растет вниз, код не затрется)
mov ax, 0B800h
mov fs, ax ;fs направим на область текстовой видео-памяти
mov ax, 0f00h
mov gs, ax
sti
mov ax, 3
int 10h ;установка видеомоды + очистка экрана
call MenuItem1
GetKey:
xor ax, ax
int 16h
cmp al, 0Dh
je OK
cmp ah, 48h
je up
cmp ah, 50h
je down
jmp short GetKey
OK:
cmp [MenuItem], 0
jne StartOS
mov si, load_C
mov di, 8000h
mov cx, end_C-load_C
cld
rep movsb
jmp 8000h
up:
cmp [MenuItem], 0
je GetKey
call MenuItem1
jmp short GetKey
down:
cmp [MenuItem], 1
je GetKey
call MenuItem2
jmp short GetKey
MenuItem1:
mov [MenuItem], 0
xor dx, dx
mov cx, 18
mov bx, 4Fh
mov bp, load1
mov ax, 1301h
int 10h
mov bp, load2
mov cx, 23
mov dx, 0100h
mov bx, 0fh
int 10h
ret
MenuItem2:
mov [MenuItem], 1
xor dx, dx
mov cx, 18
mov bx, 0Fh
mov bp, load1
mov ax, 1301h
int 10h
mov bp, load2
mov cx, 23
mov dx, 0100h
mov bx, 4fh
int 10h
ret
load_C:
mov ax, 3
int 10h
mov ax, 0201h
mov dx, 80h
mov cx, 1
mov bx, 7c00h
int 13h
push es
push 7C00h
retf
end_C:
;========================================================================================
StartOS:
mov ax, 3
int 10h
pushd 16 ;сектор который нужно прочитать
push gs ;сегмент в который будет произведено чтение
call ReadSector
mov eax, [gs:0A6h]
mov [RootSize1], eax ;ложу одно
mov [RootSize2], eax
mov di, 0h
mov eax, [RootSize1]
call dword2hex
mov di, 160
mov eax, [RootSize2]
call dword2hex
xor eax, eax
int 16h
call debug
;=========================================================================
;pushd [gs:166]
;pushd [gs:158]
;push 500h
;call ReadFile
mov ax, 3
int 10h
;call debug
;mov si, 9400h
;mov di, 2000
FindFile:
;xor cx, cx
;mov cl, [si+32]
;mov dword [fs:di], '6666'
;or cx, cx
;je .NextFile
;add si, 33
;push 9Fh
;push 0
;push 0
;push si
;call WriteString
;sub si, 33
;xor ax, ax
;int 16h
.NextFile:
;xor ax, ax
;mov al, [si]
;add si, ax
;add di, 2
;jmp FindFile
Exit:
jmp $
ReadFile:
push bp
mov bp, sp
mov ecx, [bp+10]
add ecx, 7FFh
shr ecx, 11
mov dx, [bp+4]
mov eax, [bp+6]
.NextSector:
push eax
push dx
call ReadSector
add dx, 80h
loop .NextSector
mov sp, bp
pop bp
ret 6
ReadSector:
push bp
mov bp, sp
push ax dx si
mov ax, [bp+4] ;формируем пакет для EDD
mov [DataSeg], ax ;сегмент
mov eax, [bp+6]
mov [LBAlow], eax ;сетора в формате LBA
mov ah, 42h
mov si, Packet ;адрес пакета
mov dl, [device] ;номер привода с которого грузится загрузчик
int 13h
jc .error ;если произошла ошибка то скажем об этом и зависнем
pop si dx ax
mov sp, bp
pop bp
ret 6
.error:
push ErrorMsg1
call WriteString
jmp $
;void WriteString(char *str, word x, word y, word color)
WriteString:
push bp
mov bp, sp
push ax di si
mov ax, [bp+6]
mov bx, 160
mul bx
mov di, ax
mov ax, [bp+8]
shl ax, 1
add di, ax
mov si, [bp+4]
push es
push fs
pop es ;es на сегмент видео-памяти ;будем писать в самое начало
mov ax, [bp+10] ;аттрибуты символов
@@:
lodsb
or al, al ;пока не встретим нуль
je @f
stosw ;пишем символы в видео-память
jmp @b
@@:
pop es
pop si di ax
mov sp, bp
pop bp
ret 8
debug:
push es
push ds
pusha
push gs
push gs
pop es
pop ds
;=========================================
call MenuItem1 ;затирается
xor ecx, ecx
mov ecx, [RootSize1];достаю другое
;shr cx, 4
;dec cx
mov di, 160*10+2*50
mov eax, ecx
call dword2hex
mov ecx, [RootSize2]
;shr cx, 4
;dec cx
mov di, 160*11+2*50
mov eax, ecx
call dword2hex
xor ax, ax
int 16h
;=================================================
xor di, di
xor si, si
.a1:
push cx
mov cx, 16
push di
.a2:
lodsb
call byte2hex
add di, 6
mov ax, di
mov di, 2000
call word2hex
mov di, ax
xor ax, ax
int 16h
loop .a2
pop di
add di, 160
pop cx
mov ax, cx
push di
mov di, 2180
call word2hex
mov cx, ax
pop di
xor ax, ax
int 16h
loop .a1
popa
pop ds
pop es
ret
byte2hex:
pusha
push ax
shr al, 4
cmp al, 9
ja @1
or al, 30h
jmp write1
@1:
add al, 'A'-10
write1:
mov ah, 0Fh
mov word [fs:di], ax
pop ax
add di, 2
and al, 0fh
cmp al, 9
ja @2
or al, 30h
jmp write2
@2:
add al, 'A'-10
write2:
mov ah, 0Fh
mov word [fs:di], ax
popa
ret
word2hex:
pusha
xchg al, ah
call byte2hex
add di, 4
xchg al, ah
call byte2hex
popa
ret
dword2hex:
push eax
push eax
shr eax, 16
call word2hex
add di, 8
pop eax
and eax, 0ffffh
call word2hex
pop eax
ret
align 4 ;выравнивание на адрес кратный четырем
Packet:
db 0x10 ; размер пакета
db 0x00
dw 0x0001 ; число читаемых секторов
dw 0x0000 ; смещение
DataSeg dw 0x0000 ;сегмент данных
LBAlow dd 0x00000000 ;сектор в формате LBA
dd 0x00000000
ErrorMsg1 db 'Error read table ways.', 0
HelloMsg db 'Hello world from CD-ROM bootloader!', 0
device db ?
load1 db 'Load from disk C:\'
load2 db 'Starting Fatal_Error OS'
MenuItem db 0
RootSize2 dd 12345678h