fixed USB booting issue
[bootcensus] / src / boot / boot2.s
1 # this is the second-stage boot loader
2         .code16
3         .section .boot2,"a"
4
5         .extern ser_putchar
6
7         mov $0x13, %ax
8         int $0x10
9
10         movb $10, %al
11         call ser_putchar
12
13         # copy palette
14         mov $logo_pal, %si
15         xor %cl, %cl
16
17 0:      xor %eax, %eax
18         mov $0x3c8, %dx
19         movb %cl, %al
20         outb %al, %dx
21         #### DBG
22         call ser_print_num
23         mov $58, %al
24         call ser_putchar
25         mov $32, %al
26         call ser_putchar
27         xor %eax, %eax
28         ####
29         inc %dx
30         # red
31         movb (%si), %al
32         inc %si
33         shr $2, %al
34         outb %al, %dx
35         #### DBG
36         call ser_print_num
37         mov $32, %al
38         call ser_putchar
39         xor %eax, %eax
40         ####
41         # green
42         movb (%si), %al
43         inc %si
44         shr $2, %al
45         outb %al, %dx
46         #### DBG
47         call ser_print_num
48         mov $32, %al
49         call ser_putchar
50         xor %eax, %eax
51         ####
52         # blue
53         movb (%si), %al
54         inc %si
55         shr $2, %al
56         outb %al, %dx
57         #### DBG
58         call ser_print_num
59         mov $32, %al
60         call ser_putchar
61         mov $10, %al
62         call ser_putchar
63         xor %eax, %eax
64         ####
65         add $1, %cl
66         jnc 0b
67
68         # copy pixels
69         pushw $0xa000
70         pop %es
71         xor %di, %di
72         mov $logo_pix, %eax
73         shr $4, %eax
74         mov %ax, %ds
75         xor %si, %si
76         mov $16000, %ecx
77         rep movsl
78
79         cli
80         hlt
81
82         # expects string pointer in ds:si
83 ser_print_str:
84         pusha
85
86 0:      mov (%si), %al
87         cmp $0, %al
88         jz .Lend
89         call ser_putchar
90         inc %si
91         jmp 0b
92
93 .Lend:  popa
94         ret
95
96
97         # expects number in eax
98 ser_print_num:
99         # save registers
100         pusha
101
102         movw $numbuf + 16, %si
103         movb $0, (%si)
104         mov $10, %ebx
105 .Lconvloop:
106         xor %edx, %edx
107         div %ebx
108         add $48, %dl
109         dec %si
110         mov %dl, (%si)
111         cmp $0, %eax
112         jnz .Lconvloop
113
114         call ser_print_str
115
116         # restore regs
117         popa
118         ret
119
120 numbuf: .space 16
121
122 logo_pal:
123         .incbin "logo.pal"
124
125         .align 16
126 logo_pix:
127         .incbin "logo.raw"