ffd14083b56cd24030dbca6c97dbba62fdf5654a
[bootcensus] / src / boot / boot.s
1         .code16
2         .section .boot,"a"
3
4         cli
5         cld
6         # move stack to the top of 512k
7         mov $0x7000, %ax
8         mov %ax, %ss
9         xor %sp, %sp
10         # use the code segment for data access
11         mov %cs, %ax
12         mov %ax, %ds
13         mov %ax, %es
14
15         call clearscr
16
17         mov $_boot2_size, %eax
18         call print_num
19
20         # load the second stage boot loader and jump to it
21         mov $_boot2_size, %eax
22         mov %eax, %ebx
23         shr $9, %eax
24         and $0x1ff, %ebx
25         jz 0f
26         inc %eax
27 0:      pushw %ax
28         pushw $1
29         # set es to the start of the destination buffer to allow reading in
30         # full 64k chunks
31         mov $boot2_addr, %bx
32         shr $4, %bx
33         mov %bx, %es
34         xor %bx, %bx
35         call readsect
36         jmp boot2_addr
37
38         cli
39         hlt
40
41         .set SECT_PER_TRACK, 18
42
43         .set ARG_NSECT, 6
44         .set ARG_SIDX, 4
45         .set VAR_NTRACKS, -2
46
47 # readsect(first, num)
48 readsect:
49         push %bp
50         mov %sp, %bp
51         sub $2, %sp
52
53         # calculate how many tracks to read
54         mov ARG_NSECT(%bp), %ax
55         xor %dx, %dx
56         mov $SECT_PER_TRACK, %cx
57         div %cx
58         cmp $0, %dx
59         jz 0f
60         inc %ax
61 0:      mov %ax, VAR_NTRACKS(%bp)
62
63         xor %cx, %cx
64 0:      cmp VAR_NTRACKS(%bp), %cx
65         jz 0f
66         push %cx
67         call read_track
68         pop %cx
69         jmp 0b
70 0:
71         # TODO cont.
72         pop %bp
73         ret
74
75 read_track:
76         ret
77
78 clearscr:
79         push %es
80         pushw $0xb800
81         pop %es
82         xor %eax, %eax
83         xor %di, %di
84         movl $500, %ecx
85         rep stosl
86         pop %es
87         ret
88
89 print_num:
90         # save es
91         push %es
92
93         xor %cx, %cx
94         movw $numbuf, %si
95         mov $10, %ebx
96
97 0:      xor %edx, %edx
98         div %ebx
99         add $48, %dl
100         mov %dl, (%si)
101         inc %si
102         inc %cx
103         cmp $0, %eax
104         jnz 0b
105
106         # print the backwards string
107         pushw $0xb800
108         pop %es
109         xor %di, %di
110
111 0:      dec %si
112         mov (%si), %al
113         movb %al, %es:(%di)
114         inc %di
115         mov $7, %al
116         movb %al, %es:(%di)
117         inc %di
118         dec %cx
119         jnz 0b
120
121         # restore es
122         pop %es
123         ret
124
125 numbuf: .space 10
126         .org 510
127         .byte 0x55
128         .byte 0xaa
129
130 boot2_addr: