initial commit, asm operating system with the MikeOS bootloader
This commit is contained in:
108
source/kernel.asm
Executable file
108
source/kernel.asm
Executable file
@@ -0,0 +1,108 @@
|
||||
; ==================================================================
|
||||
; MikeOS -- The Mike Operating System kernel
|
||||
; Copyright (C) 2006 - 2022 MikeOS Developers -- see doc/LICENSE.TXT
|
||||
;
|
||||
; This is loaded from the drive by BOOTLOAD.BIN, as KERNEL.BIN.
|
||||
; First we have the system call vectors, which start at a static point
|
||||
; for programs to use. Following that is the main kernel code and
|
||||
; then additional system call code is included.
|
||||
; ==================================================================
|
||||
|
||||
|
||||
BITS 16
|
||||
CPU 386 ; pusha offsets depends on a 386 or better
|
||||
; FS and GS require a 386 or better
|
||||
|
||||
%DEFINE CRAWOS_VER '0.0.2' ; OS version number
|
||||
%DEFINE CRAWOS_API_VER 1 ; API version for programs to check
|
||||
|
||||
|
||||
; This is the location in RAM for kernel disk operations, 24K
|
||||
; after the point where the kernel has loaded; it's 8K in size,
|
||||
; because external programs load after it at the 32K point:
|
||||
|
||||
disk_buffer equ 24576
|
||||
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; OS CALL VECTORS -- Static locations for system call vectors
|
||||
; Note: these cannot be moved, or it'll break the calls!
|
||||
|
||||
; The comments show exact locations of instructions in this section,
|
||||
; and are used in programs/mikedev.inc so that an external program can
|
||||
; use a CrawOS system call without having to know its exact position
|
||||
; in the kernel source code...
|
||||
|
||||
os_call_vectors:
|
||||
jmp os_main ; 0000h -- Called from bootloader
|
||||
jmp os_print_string ; 0003h
|
||||
jmp os_read_input
|
||||
jmp os_display_input
|
||||
jmp os_start_cli
|
||||
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; START OF MAIN KERNEL CODE
|
||||
|
||||
os_main:
|
||||
cli ; Clear interrupts
|
||||
mov ax, 0
|
||||
mov ss, ax ; Set stack segment and pointer
|
||||
mov sp, 0FFFFh
|
||||
sti ; Restore interrupts
|
||||
|
||||
cld ; The default direction for string operations
|
||||
; will be 'up' - incrementing address in RAM
|
||||
|
||||
mov ax, 2000h ; Set all segments to match where kernel is loaded
|
||||
mov ds, ax ; After this, we don't need to bother with
|
||||
mov es, ax ; segments ever again, as MikeOS and its programs
|
||||
mov fs, ax ; live entirely in 64K
|
||||
mov gs, ax
|
||||
|
||||
cmp dl, 0
|
||||
je no_change
|
||||
mov [bootdev], dl ; Save boot device number
|
||||
push es
|
||||
mov ah, 8 ; Get drive parameters
|
||||
int 13h
|
||||
pop es
|
||||
and cx, 3Fh ; Maximum sector number
|
||||
mov [SecsPerTrack], cx ; Sector numbers start at 1
|
||||
movzx dx, dh ; Maximum head number
|
||||
add dx, 1 ; Head numbers start at 0 - add 1 for total
|
||||
mov [Sides], dx
|
||||
|
||||
no_change:
|
||||
call os_clear_screen
|
||||
call os_start_cli
|
||||
|
||||
bootdev db 0
|
||||
SecsPerTrack dw 18
|
||||
Sides dw 2
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; SYSTEM VARIABLES -- Settings for programs and system calls
|
||||
|
||||
|
||||
; Time and date formatting
|
||||
|
||||
fmt_12_24 db 0 ; Non-zero = 24-hr format
|
||||
|
||||
fmt_date db 0, '/' ; 0, 1, 2 = M/D/Y, D/M/Y or Y/M/D
|
||||
; Bit 7 = use name for months
|
||||
; If bit 7 = 0, second byte = separator character
|
||||
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; FEATURES -- Code to pull into the kernel
|
||||
|
||||
%INCLUDE "features/screen.asm"
|
||||
%INCLUDE "features/cli.asm"
|
||||
%INCLUDE "features/power.asm"
|
||||
%INCLUDE "features/strings.asm"
|
||||
|
||||
; ==================================================================
|
||||
; END OF KERNEL
|
||||
; ==================================================================
|
||||
|
Reference in New Issue
Block a user