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