first commit
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
*~
|
||||
build/*
|
||||
@@ -0,0 +1,50 @@
|
||||
ASM=nasm
|
||||
|
||||
SRC_DIR=src
|
||||
BUILD_DIR=build
|
||||
|
||||
.PHONY: all floppy_image kernel bootloader clean always
|
||||
|
||||
#
|
||||
# Floppy image
|
||||
# * use dd to create 1.44MB blank image file
|
||||
# * apply FAT12 filesystem to image
|
||||
# * copy 512 byte bootloader binary to image using dd (overwriting first sector)
|
||||
# * copy kernel binary to filesystem
|
||||
# + this step wtill fail if bootloader binary does not contain proper FAT12 headers
|
||||
#
|
||||
floppy_image: $(BUILD_DIR)/main_floppy.img
|
||||
|
||||
$(BUILD_DIR)/main_floppy.img: bootloader kernel
|
||||
dd if=/dev/zero of=$(BUILD_DIR)/main_floppy.img bs=512 count=2880
|
||||
mkfs.fat -F 12 -n "WEESLOS" $(BUILD_DIR)/main_floppy.img
|
||||
dd if=$(BUILD_DIR)/bootloader.bin of=$(BUILD_DIR)/main_floppy.img conv=notrunc
|
||||
mcopy -i $(BUILD_DIR)/main_floppy.img $(BUILD_DIR)/kernel.bin "::kernel.bin"
|
||||
|
||||
#
|
||||
# Bootloader
|
||||
#
|
||||
bootloader: $(BUILD_DIR)/bootloader.bin
|
||||
|
||||
$(BUILD_DIR)/bootloader.bin: always
|
||||
$(ASM) $(SRC_DIR)/bootloader/boot.asm -f bin -o $(BUILD_DIR)/bootloader.bin
|
||||
|
||||
#
|
||||
# Kernel
|
||||
#
|
||||
kernel: $(BUILD_DIR)/kernel.bin
|
||||
|
||||
$(BUILD_DIR)/kernel.bin: always
|
||||
$(ASM) $(SRC_DIR)/kernel/main.asm -f bin -o $(BUILD_DIR)/kernel.bin
|
||||
|
||||
#
|
||||
# Always
|
||||
#
|
||||
always:
|
||||
mkdir -p $(BUILD_DIR)
|
||||
|
||||
#
|
||||
# Clean
|
||||
#
|
||||
clean:
|
||||
rm -rf $(BUILD_DIR)/*
|
||||
@@ -0,0 +1,86 @@
|
||||
org 0x7c00
|
||||
bits 16
|
||||
|
||||
%define ENDL 0x0d, 0x0a
|
||||
|
||||
;; FAT12 header start
|
||||
jmp short start
|
||||
nop
|
||||
|
||||
bdb_oem: db 'MSWIN4.1' ;8 bytes
|
||||
bdb_bytes_per_sector: dw 512
|
||||
bdb_sectors_per_cluster: db 1
|
||||
bdb_reserved_sctors: dw 1
|
||||
bdb_fat_count: db 2
|
||||
bdb_dir_entries_count: dw 0E0h
|
||||
bdb_total_sectors: dw 2880 ; 2880 * 512 = 1.44MB
|
||||
bdb_media_descriptor_type: db 0F0h ; F0 = 3.5" floppy
|
||||
bdb_sectors_per_fat: dw 9 ; 9 sectors/FAT
|
||||
bdb_sectors_per_track: dw 18
|
||||
bdb_heads: dw 2
|
||||
bdb_hidden_sector_count: dd 0
|
||||
bdb_large_sector_count: dd 0
|
||||
|
||||
;; Extended boot record
|
||||
ebr_drive_number: db 0 ; 0x00 = floppy, 0x80 hdd
|
||||
db 0 ; reserved byte
|
||||
ebr_signature: db 29h ; magic number?
|
||||
ebr_volume_id: db 69h, 69h, 69h, 69h ; serial number
|
||||
ebr_volume_label: db 'WEESLOS ' ; must be 11 bytes, pad with spaces
|
||||
ebr_system_id: db 'FAT12 ' ; must be 8 bytes, pad with spaces
|
||||
|
||||
;; FAT12 header end
|
||||
|
||||
start:
|
||||
jmp main
|
||||
|
||||
;; Prints a string to the screen.
|
||||
;; Params:
|
||||
;; - ds;si points to string
|
||||
;;
|
||||
puts:
|
||||
;; push crap to stack that can/will be modified
|
||||
push si
|
||||
push ax
|
||||
push bx
|
||||
.loop:
|
||||
lodsb ; loads next character into al
|
||||
or al, al ; verify if next character is null
|
||||
jz .done ; conditonal jump ifeq zero (if result of OR instruction above is zero)
|
||||
|
||||
mov ah, 0x0e ; 0x0e "Teletype Output" subfunction of BIOS interrupt 0x10
|
||||
mov bh, 0 ; set page number to 0
|
||||
int 0x10 ; Call BIOS interrupt
|
||||
|
||||
jmp .loop
|
||||
.done:
|
||||
;; retrieve crap and return
|
||||
pop bx
|
||||
pop ax
|
||||
pop si
|
||||
ret
|
||||
|
||||
|
||||
main:
|
||||
;; Data segment setup
|
||||
mov ax, 0 ; canot write to ds/es directly
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
|
||||
;; Stack initalization
|
||||
mov ss, ax
|
||||
mov sp, 0x7c00 ; stack will grow downwards in memory as it is filled
|
||||
|
||||
;; print message
|
||||
mov si, msg_hello
|
||||
call puts
|
||||
|
||||
hlt ; stop executing
|
||||
|
||||
.halt:
|
||||
jmp .halt ; really make sure we're not executing random shit
|
||||
|
||||
msg_hello: db 'Hello Shitass!', ENDL, 0 ; named constant
|
||||
|
||||
times 510-($-$$) db 0 ; pad program with zeros up to byte 510
|
||||
dw 0AA55h ; BIOS requires last two bytes of first sector to be AA55
|
||||
@@ -0,0 +1,58 @@
|
||||
org 0x7c00
|
||||
bits 16
|
||||
|
||||
%define ENDL 0x0d, 0x0a
|
||||
|
||||
start:
|
||||
jmp main
|
||||
|
||||
;; Prints a string to the screen.
|
||||
;; Params:
|
||||
;; - ds;si points to string
|
||||
;;
|
||||
puts:
|
||||
;; push crap to stack that can/will be modified
|
||||
push si
|
||||
push ax
|
||||
push bx
|
||||
.loop:
|
||||
lodsb ; loads next character into al
|
||||
or al, al ; verify if next character is null
|
||||
jz .done ; conditonal jump ifeq zero (if result of OR instruction above is zero)
|
||||
|
||||
mov ah, 0x0e ; 0x0e "Teletype Output" subfunction of BIOS interrupt 0x10
|
||||
mov bh, 0 ; set page number to 0
|
||||
int 0x10 ; Call BIOS interrupt
|
||||
|
||||
jmp .loop
|
||||
.done:
|
||||
;; retrieve crap and return
|
||||
pop bx
|
||||
pop ax
|
||||
pop si
|
||||
ret
|
||||
|
||||
|
||||
main:
|
||||
;; Data segment setup
|
||||
mov ax, 0 ; canot write to ds/es directly
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
|
||||
;; Stack initalization
|
||||
mov ss, ax
|
||||
mov sp, 0x7c00 ; stack will grow downwards in memory as it is filled
|
||||
|
||||
;; print message
|
||||
mov si, msg_hello
|
||||
call puts
|
||||
|
||||
hlt ; stop executing
|
||||
|
||||
.halt:
|
||||
jmp .halt ; really make sure we're not executing random shit
|
||||
|
||||
msg_hello: db 'Hello Shitass!', ENDL, 0 ; named constant
|
||||
|
||||
times 510-($-$$) db 0 ; pad program with zeros up to byte 510
|
||||
dw 0AA55h ; BIOS requires last two bytes of first sector to be AA55
|
||||
Reference in New Issue
Block a user