summaryrefslogtreecommitdiffstats
path: root/boot/load.S
blob: f7a6ba0b49b6463447c61e2b5b425e94d291efe0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
/* boot.S - main bootup file */

#include <asm/boot.h>
#include <asm/version.h>

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"