First reveal
This commit is contained in:
1 parent
bd644795d2
commit
b1aa62b1a1
1 file changed
+258
+258
@@ -0,0 +1,258 @@
|
||||
ORG 0x7C00
|
||||
BITS 16
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; SLRboot
|
||||
; Bootloader for SingOS
|
||||
; version 0.2.0.0-exp
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
cli
|
||||
mov [disk_identifier], dl
|
||||
mov ax, 0x1000
|
||||
mov ss, ax
|
||||
mov sp, 0xb000
|
||||
mov ax, 0
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
sti
|
||||
mov si, 0x7c00
|
||||
mov di, 0x600
|
||||
mov cx, 0x200
|
||||
rep movsb
|
||||
mov bx, relocated
|
||||
sub bx, 0x7600 ; Calculate the offset.
|
||||
push bx
|
||||
retf ; Return far
|
||||
;jmp long 0:bx
|
||||
|
||||
relocated:
|
||||
|
||||
mov si, message ; Put address of the null-terminated string to output into 'si'
|
||||
call print ; Call our string-printing routine
|
||||
|
||||
;mov ax, 0x0050
|
||||
;mov es, ax ;Section to write into
|
||||
;mov ah, 0x2 ;Read sectors from drive
|
||||
;mov al, 0x08 ;Number of sectors to read (31 * 512 = 15872 bytes)
|
||||
;mov ch, 0x0 ;Low 8 bits of cylinder
|
||||
;mov cl, 0x11 ;First sector to read (bits 0-5), upper bits of cylinder (bits 6-7)
|
||||
;mov dh, 0x0 ;Head number
|
||||
;mov dl, [disk_identifier] ;Drive number
|
||||
;mov bx, 0x0000 ;Offset into section
|
||||
;int 0x13 ;Low level disk services
|
||||
mov ah, 2
|
||||
mov al, 0x08
|
||||
mov bx, 0x7c00
|
||||
mov BYTE dl, [disk_identifier]
|
||||
mov BYTE dh, [partition_2.start_CHS + 1] ;byte [si + 1]
|
||||
mov BYTE cl, [partition_2.start_CHS + 2]
|
||||
mov BYTE ch, [partition_2.start_CHS] ;First sector to read (bits 0-5), upper bits of cylinder (bits 6-7)
|
||||
int 0x13
|
||||
;mov ax, 0x0
|
||||
;mov ds, ax
|
||||
mov ax, 89 ; lba adress
|
||||
jmp long 0x0:0x7c00
|
||||
|
||||
cli
|
||||
hlt
|
||||
|
||||
|
||||
%IF 1
|
||||
cli
|
||||
jmp long 0x0000:start
|
||||
|
||||
start:
|
||||
xor ax, ax
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
mov ss, ax
|
||||
mov [disk_identifier], dl
|
||||
|
||||
; initialize stack
|
||||
; Set up 4K stack after this bootloader
|
||||
; [Remember: Effective Address = Segment*16 + Offset]
|
||||
mov ax, 0x7C0 ; Set 'ax' equal to the location of this bootloader divided by 16
|
||||
add ax, 0x20 ; Skip over the size of the bootloader divided by 16
|
||||
mov ss, ax ; Set 'ss' to this location (the beginning of our stack region)
|
||||
mov sp, 8192 ; Set 'ss:sp' to the top of our 8K stack
|
||||
sti
|
||||
mov si, message ; Put address of the null-terminated string to output into 'si'
|
||||
call print ; Call our string-printing routine
|
||||
|
||||
mov si, enter_debug_mode
|
||||
call print
|
||||
call printCRLF
|
||||
;%IF 0
|
||||
; here goes wait call, for the user to enter debug mode.
|
||||
; Wating for 2 seconds:
|
||||
mov ah, 0x86 ; code for waiting interupt call
|
||||
mov cx, 0x001e ; high count of microseconds
|
||||
mov dx, 0x8480 ; low count
|
||||
int 0x15
|
||||
|
||||
.busy_wait_for_key:
|
||||
xor ax, ax
|
||||
mov ah, 0x01 ; BIOS call to wait for key
|
||||
int 0x16
|
||||
jnz debug_mode
|
||||
|
||||
; entering system check:
|
||||
mov si, enter_system_check
|
||||
|
||||
mov si, sys_check_ok ; Put address of the null-terminated string to output into 'si'
|
||||
call print ; Call our string-printing routine
|
||||
|
||||
mov si, boot_system ; Put address of the null-terminated string to output into 'si'
|
||||
call print ; Call our string-printing routine
|
||||
|
||||
;This goes first as to now overwrite %ah and %al.
|
||||
;mov ax, 0x0050
|
||||
;mov es, ax ;Section to write into
|
||||
;mov ah, 0x2 ;Read sectors from drive
|
||||
;mov al, 0x08 ;Number of sectors to read (31 * 512 = 15872 bytes)
|
||||
;mov ch, 0x0 ;Low 8 bits of cylinder
|
||||
;mov cl, 0x11 ;First sector to read (bits 0-5), upper bits of cylinder (bits 6-7)
|
||||
;mov dh, 0x0 ;Head number
|
||||
;mov dl, [disk_identifier] ;Drive number
|
||||
;mov bx, 0x0000 ;Offset into section
|
||||
;int 0x13 ;Low level disk services
|
||||
|
||||
;jnc notcarry
|
||||
;mov si, error_str
|
||||
;call print
|
||||
;jmp endcarrycheck
|
||||
|
||||
notcarry:
|
||||
;mov si, success_str
|
||||
;call print
|
||||
;call printCRLF
|
||||
|
||||
mov ax, 0x0
|
||||
mov ds, ax
|
||||
mov ax, 89 ; lba adress
|
||||
|
||||
jmp 0x50:0x0000 ; Jump to the kernel
|
||||
|
||||
endcarrycheck:
|
||||
cli ; Clear the Interrupt Flag (disable external interrupts)
|
||||
hlt ; Halt the CPU (until the next external interrupt)
|
||||
|
||||
debug_mode:
|
||||
mov si, .welcome_debug
|
||||
call print
|
||||
cli ; Clear the Interrupt Flag (disable external interrupts)
|
||||
hlt
|
||||
|
||||
.welcome_debug db 'This is debug mode', 0
|
||||
|
||||
;Routine for printing a 'ax' as hex
|
||||
dumpax:
|
||||
pusha ; save registers
|
||||
mov bx, ax
|
||||
mov ah, 0xE ; Teletype output
|
||||
|
||||
mov cx, 4 ; 4 nipples in a 16 bit word
|
||||
.loop:
|
||||
rol bx, 4 ; rotate to next nipple
|
||||
mov al, bl ; we copy to al because we need to mask only the low 4 bits
|
||||
and al, 1111b ; Do the masking
|
||||
add al, '0' ; convert to ASCII
|
||||
cmp al, '9' ; If we are greater than 9 ascii, we add 7 to make digit 10 be represented as 'A'
|
||||
jbe .skip ; -|-
|
||||
add al, 7 ; -|-
|
||||
.skip: ; -|-
|
||||
int 0x10 ; BIOS call 'output'
|
||||
loop .loop
|
||||
|
||||
popa ; restore registers
|
||||
ret
|
||||
|
||||
printCRLF:
|
||||
mov ah, 0xE
|
||||
mov al, 13
|
||||
int 0x10
|
||||
mov al, 10
|
||||
int 0x10
|
||||
ret
|
||||
%ENDIF
|
||||
; Routine for outputting string in 'si' register to screen
|
||||
print:
|
||||
mov ah, 0xE ; Specify 'int 0x10' 'teletype output' function
|
||||
; [AL = Character, BH = Page Number, BL = Colour (in graphics mode)]
|
||||
.printchar:
|
||||
lodsb ; Load byte at address SI into AL, and increment SI
|
||||
cmp al, 0
|
||||
je .done ; If the character is zero (NUL), stop writing the string
|
||||
int 0x10 ; Otherwise, print the character via 'int 0x10'
|
||||
jmp .printchar ; Repeat for the next character
|
||||
.done:
|
||||
ret
|
||||
|
||||
data:
|
||||
message db 'SLRboot for SingOS! v0.2.0.0-exp',13,10,0
|
||||
enter_debug_mode db 'Press d to enter bootloader debug mode',13,10,0
|
||||
enter_system_check db 'Performing system check:',13,10,0
|
||||
sys_check_ok db 'System check ok', 13, 10, 0
|
||||
boot_system db 'Read SingOS from disk', 13, 10, 0
|
||||
error_str db 'Error', 0
|
||||
success_str db 'Success', 0
|
||||
disk_identifier db 0
|
||||
|
||||
; Pad to 510 bytes (boot sector size minus 2) with 0s, and finish with the two-byte standard boot signature
|
||||
times 446-($-$$) db 0 ; First partion entry
|
||||
partition_1:
|
||||
.active_partition db 0x00
|
||||
.start_CHS db 0x00, 0x00, 0x11;0x20, 0x21, 0x00
|
||||
.disk_type db 0x83
|
||||
.end_CHS db 0x8C, 0x3D, 0x0F
|
||||
.start_LBA db 0x00, 0x08, 0x00, 0x00
|
||||
.size db 0x00, 0xC8, 0x03, 0x00
|
||||
|
||||
partition_2:
|
||||
.active_partition db 0x80
|
||||
.start_CHS db 0x8C, 0x3E, 0x0F
|
||||
.disk_type db 0x83
|
||||
.end_CHS db 0xFF, 0xFF, 0xFF
|
||||
.start_LBA db 0x00, 0xD0, 0x03, 0x00
|
||||
.size db 0x00, 0x28, 0x1C, 0x03
|
||||
|
||||
partition_3:
|
||||
.active_partition db 0x00
|
||||
.start_CHS db 0x00, 0x00, 0x00
|
||||
.disk_type db 0x00
|
||||
.end_CHS db 0x00, 0x00, 0x00
|
||||
.start_LBA db 0x00, 0x00, 0x00, 0x00
|
||||
.size db 0x00, 0x00, 0x00, 0x00
|
||||
|
||||
partition_4:
|
||||
.active_partition db 0x00
|
||||
.start_CHS db 0x00, 0x00, 0x00
|
||||
.disk_type db 0x00
|
||||
.end_CHS db 0x00, 0x00, 0x00
|
||||
.start_LBA db 0x00, 0x00, 0x00, 0x00
|
||||
.size db 0x00, 0x00, 0x00, 0x00
|
||||
|
||||
times 510-($-$$) db 0
|
||||
dw 0xAA55 ; => 0x55 0xAA (little endian byte order)
|
||||
; bootloder debug_mode goes here
|
||||
|
||||
times 8192-($-$$) db 0
|
||||
|
||||
|
||||
|
||||
; mov si, 0x7be
|
||||
; cmp byte [si], al
|
||||
; jne 0x33
|
||||
; add si, 0x10
|
||||
; cmp si, 0x7fe
|
||||
; jne 0x24
|
||||
; jmp 0x49
|
||||
; mov ah, 2
|
||||
; mov al, 1
|
||||
; mov bx, 0x7c00
|
||||
; mov dl, 0x80
|
||||
; mov dh, byte [si + 1]
|
||||
; mov cx, word [si + 2]
|
||||
; int 0x13
|
||||
; jmp long 0:0x7c00
|
||||
|
||||
; jmp 0x49
|
||||
Reference in new issue
Block a user