Попробуем написать загрузчик и ядро.Ядром у нас будет обычный битмап.Пишем на fasm, т.к. он позволяет устанавливать код в разных местах сегмента.Т.е. можно написать код стартующий с 7с00, а потом стартующий с 0h.
-Заголовок файла (BITMAPFILEHEADER)
-Заголовок изображения (BITMAPINFOHEADER, может отсутствовать). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP)
-Палитра (может отсутствовать)
Для начала подготовим ядро.Что мы знаем о битмапе?он состоит к верху дном проще говоря,по этому и рисовать будем к верху дном.и сохранять в 256 цветах (по 1 байту как раз) и размерами 320*200 пикселей (равному режиму 0x13). получается у меня такая няша:
(фуууу, слабак!)))
далее смотрим по структуре: битмап это тупо рисунок с заголовками и палитрой.Их надо откусить.
-Заголовок файла (BITMAPFILEHEADER)
-Заголовок изображения (BITMAPINFOHEADER, может отсутствовать). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP)
-Палитра (может отсутствовать)
1-й заголовок -14 байт
2-й заголовок -40 байт
палитра - это 256 записей RGB (4 байта) что составит еще 1кб.
всего надо откусить 1078 байт. открываем в любом хекс редакторе и откусываем.
должен получиться размер картинки 64000 байт.
терь собсна код:
первое загрузочный сектор.тут все как "обычно"
USE16
org 7C00h
EntryPoint:
mov ax, cs
cli
mov ss, ax
mov ds, ax
mov es, ax
mov sp, EntryPoint ; настраиваем сегменты и т.д. и т.п.
sti
cld
push dx ; запоминаем какой диск
mov ax, 3
int 10h
xor dx, dx
mov bx, 15
mov ax, 1301h ; выдаем , мол все зер гут
mov bp, BootMsg
mov cx, BootMsgEnd - BootMsg
int 10h
pop dx
mov ax, 9000h ; сегмент куда будут кидаться данные
mov es, ax
mov ah, 2 ;2 сектор
mov al, (KernelEnd - KernelStartCode) / 512 ; кол-во секторов, отведенных под ядро
xor dh, dh
mov cx, 2h
xor bx, bx
int 13h ; читаем
jc Error
jmp 9000h:0000h ; передаем управление на заданный адрес
Error:
;если ошибка- че то там делаем
BootMsg db "Boot Sector Loaded"
BootMsgEnd:
TIMES 510-($-$$) DB 0
DW 0AA55h
Теперь идет непосредственно ядро:
KernelStart:
org 0h
KernelStartCode:
jmp KernelCode
BootDisk DB ?
KernelMsg db "Kernel Started"
KernelMsgEnd:
; процедура чтения сектора по номеру.
; вход ax= номер сектора
; es:bx= куда кинуть
ReadSectors:
push ax
push cx
cwd
mov cx, 18
div cx
mov cx, dx
inc cx
xor dh, dh
shr ax, 1
rcl dh, 1
mov ch, al
shl ah, 4
or cl, ah
mov dl, [BootDisk]
mov ax, 0201h
int 13h
pop cx
pop ax
ret
KernelCode:
;извещаем что мы подгрузились
mov [BootDisk], dl
mov dx, 0100h
mov bx, 15
mov ax, 1301h
mov bp, KernelMsg
mov cx, KernelMsgEnd - KernelMsg
int 10h
xor ax, ax ; ждем нажатия клавиши и устанавливаем режим 320*200*256
int 16h
mov ax, 13h
int 10h
mov ax, 0A000h ; начало непосредственно прямого вывода в видеобуффер
mov es, ax
xor bx, bx
mov ax, 2
m1:
call ReadSectors ;читаем сектора пока не выведем все
add bx, 512
inc ax
cmp ax, 125
jne m1
xor ax, ax
int 16h ;ждем нажатия и ребутим ПК
jmp 0FFFFh:0000h
TIMES 0 - ($-KernelStart) mod 512 DB 0 ; уравниваем размеры
KernelEnd:
file '2.bmp' ; инклюдим наше ядро
Вот собсно и все. проверить как оно работает можно в боше.
ЭХЭХЭ)
ну вот собсно и усе).
А ТЕПЕРЬ БУДЕТ ТАКОЙ СЕ НАБОЛЕВШИЙ ПОСТ СКРИПТУМ))))))))
Я тут размышлял.на самом деле,сегодня уже 31 октября, лето вспоминаю как будто неделю назад,время бежит просто очень быстро, представить трудно что через 8-9 месяцев я буду говорить не "о черт,завтра на пары",а "о черт,завтра на работу", хотя без работы жизнь бы вообще была хер знает какой, если ни деньги ни хера материальное не приносит стимула и удовольствия.Надо искать свою нишу.И надо стараться держать рядом с собой только проверенных и лучших друзей,заниматься своим делом.Играйте музыку, программируйте аццкую хрень,бухайте в конце концов, читайте что нибудь стоящее (лично я прочел некоторые вещи Кафки,хотя еще в школе наотрез отказывался читать это).в общем не теряйте время.
пысышки:
уже целая коллекция гугл нексусов). подумываю 7 поменять на 10 теперь)
а это я учусь)
еще кое что: этот код мы как то давно со slesh-em чудили, он даже где то выкидывал его кажется.однако разобраться че он там грузит и как трудновато,так что я решил (давно хотел)его сюда закинуть и рассказать как применить и как работает).
Комментариев нет:
Отправить комментарий