/* boot.S - main bootup file */ #include #include GDT_SIZE = (gdt_end - gdt) IDT_SIZE = (idt_end - idt) KERNEL_TRACKS = ((KERNEL_BLOCKS+DISK_SECTORS_PER_TRACK-1)/DISK_SECTORS_PER_TRACK) .text .code16 .global start start: xor %ax,%ax int $0x13 # Load kernel mov $0x0001,%cx xor %dh,%dh xor %bx,%bx mov $0x50,%ax mov %ax,%es load_kernel_loop: mov $0x02,%ah mov $DISK_SECTORS_PER_TRACK,%al push %dx int $0x13 pop %dx jc error mov %es,%ax add $(0x20*DISK_SECTORS_PER_TRACK),%ax mov %ax,%es add %dh,%ch or %dh,%dh jnz head0 inc %dh jmp head1 head0: xor %dh,%dh head1: cmp $(KERNEL_TRACKS/2),%ch jb load_kernel_loop ljmp $0x50, $load load: cli mov %cs,%ax mov %ax,%ds mov $0x01,%ah mov $0b0010000000000000,%cx int $0x10 mov $0x36,%al out %al,$0x43 mov $0x9B,%al out %al,$0x40 mov $0x2E,%al out %al,$0x40 key_ready: in $0x64,%al and $0b00000010,%al jnz key_ready mov $0xED,%al out %al,$0x60 key_ready2: in $0x64,%al and $0b00000010,%al jnz key_ready2 xor %al,%al out %al,$0x60 mov $0b00010001,%al out %al,$0x20 out %al,$0xA0 mov $0x20,%al out %al,$0x21 mov $0x28,%al out %al,$0xA1 mov $0b00000100,%al out %al,$0x21 mov $0b00000010,%al out %al,$0xA1 mov $0b00000001,%al out %al,$0x21 out %al,$0xA1 lgdt gdt_struct lidt idt_struct mov %cr0,%eax or $1,%eax mov %eax,%cr0 .byte 0xea .word pmode .word 8 pmode: .code32 mov $16,%ax mov %ax,%ds mov $24,%ax mov %ax,%ss mov $0x1FFF,%esp sti cld pushl $'\f' call print_char addl $4,%esp pushl $0b00001111 pushl $verstring call print_attr addl $8,%esp #call init_floppy #call test done: xor %edx,%edx call kb_read_keycode or %eax,%eax jz done or %edx,%edx jz done and $0b10000000,%al jnz done pushl %edx call print_char addl $4,%esp call floppy_proc jmp done error: jmp error .org 0x1FE .word 0xAA55 .org 0x200 .data gdt: .word 0, 0, 0, 0 # dummy .word 0xFFFF, KERNEL_START, 0x9A00, 0x00CF # kernel code, 4 GB, code exec/read, 386 Segment .word 0xFFFF, KERNEL_START, 0x9200, 0x00CF # kernel data, 4 GB, data read/write, 386 Segment .word 0x2000, 0x8000, 0x9200, 0 # kernel stack, 8192 Bytes, data read/write, base address 0x8000 .word 4000, 0x8000, 0x920B, 0 # VRAM, 4000 Bytes, data read/write, base address 0xB8000 .word 0x0500, 0, 0x9200, 0 # BIOS data, 0x500 Bytes, data read/write, base address 0 gdt_end: idt: .word EXC_DIV_ERROR, CODE_SEL, 0x8E00, 0 .word EXC_DEBUG, CODE_SEL, 0x8E00, 0 .word EXC_NMI, CODE_SEL, 0x8E00, 0 .word EXC_BREAKPOINT, CODE_SEL, 0x8E00, 0 .word EXC_INTO_OVERFLOW, CODE_SEL, 0x8E00, 0 .word EXC_BOUND_OVERFLOW, CODE_SEL, 0x8E00, 0 .word EXC_INVAL_OPCODE, CODE_SEL, 0x8E00, 0 .word EXC_NO_COPROCESSOR, CODE_SEL, 0x8E00, 0 .word EXC_DOUBLE_EXCEPTION, CODE_SEL, 0x8E00, 0 .word EXC_COPROC_PROT_ERROR, CODE_SEL, 0x8E00, 0 .word EXC_INVAL_TSS, CODE_SEL, 0x8E00, 0 .word EXC_SEG_NOT_PRESENT, CODE_SEL, 0x8E00, 0 .word EXC_STACK_FAULT, CODE_SEL, 0x8E00, 0 .word EXC_GEN_PROT_VIOLATION, CODE_SEL, 0x8E00, 0 .word EXC_PAGE_FAULT, CODE_SEL, 0x8E00, 0 .word EXC_RESERVED, CODE_SEL, 0x8E00, 0 .word EXC_COPROCESSOR_ERROR, CODE_SEL, 0x8E00, 0 .word EXC_ALIGN_ERROR, CODE_SEL, 0x8E00, 0 .word EXC_RESERVED, CODE_SEL, 0x8E00, 0 .word EXC_RESERVED, CODE_SEL, 0x8E00, 0 .word EXC_RESERVED, CODE_SEL, 0x8E00, 0 .word EXC_RESERVED, CODE_SEL, 0x8E00, 0 .word EXC_RESERVED, CODE_SEL, 0x8E00, 0 .word EXC_RESERVED, CODE_SEL, 0x8E00, 0 .word EXC_RESERVED, CODE_SEL, 0x8E00, 0 .word EXC_RESERVED, CODE_SEL, 0x8E00, 0 .word EXC_RESERVED, CODE_SEL, 0x8E00, 0 .word EXC_RESERVED, CODE_SEL, 0x8E00, 0 .word EXC_RESERVED, CODE_SEL, 0x8E00, 0 .word EXC_RESERVED, CODE_SEL, 0x8E00, 0 .word EXC_RESERVED, CODE_SEL, 0x8E00, 0 .word EXC_RESERVED, CODE_SEL, 0x8E00, 0 .word IRQ0, CODE_SEL, 0x8E00, 0 .word IRQ1, CODE_SEL, 0x8E00, 0 .word IRQ2, CODE_SEL, 0x8E00, 0 .word IRQ3, CODE_SEL, 0x8E00, 0 .word IRQ4, CODE_SEL, 0x8E00, 0 .word IRQ5, CODE_SEL, 0x8E00, 0 .word IRQ6, CODE_SEL, 0x8E00, 0 .word IRQ7, CODE_SEL, 0x8E00, 0 .word IRQ8, CODE_SEL, 0x8E00, 0 .word IRQ9, CODE_SEL, 0x8E00, 0 .word IRQ10, CODE_SEL, 0x8E00, 0 .word IRQ11, CODE_SEL, 0x8E00, 0 .word IRQ12, CODE_SEL, 0x8E00, 0 .word IRQ13, CODE_SEL, 0x8E00, 0 .word IRQ14, CODE_SEL, 0x8E00, 0 .word IRQ15, CODE_SEL, 0x8E00, 0 idt_end: gdt_struct: .word GDT_SIZE # gdt size .long (KERNEL_START+gdt) # gdt base address idt_struct: .word IDT_SIZE .long (KERNEL_START+idt) verstring: .ascii "WINX " WINX_VERSION "\r\n\0"