boot_usb.asm
2.38 KB
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
;BLACK 0x0
;BLUE 0x1
;GREEN 0x2
;CYAN 0x3
;RED 0x4
;MAGENTA 0x5
;BROWN 0x6
;GREY 0x7
;DARK_GREY 0x8
;LIGHT_BLUE 0x9
;LIGHT_GREEN 0xA
;LIGHT_CYAN 0xB
;LIGHT_RED 0xC
;LIGHT_MAGENTA 0xD
;LIGHT_BROWN 0xE
;WHITE 0xF
[BITS 16]
[org 0x7C00]
JMP Start
clear_screen:
PUSH ax
MOV al, 03h ; Setting the graphical mode 80x25(text)
MOV ah, 00h ; Code of the function of changing video mode
INT 10h ; Call interruption
MOV cl, 0x06
MOV ah, 0x01
INT 10h
POP ax
RETN
print_string: ; Expects null terminated message in si
PUSH ax
for_print_string_0:
MOV al,[si]
OR al,al
JZ end_for_print_string_0
INC si
CALL print_char
JMP for_print_string_0
end_for_print_string_0:
POP ax
RETN
print_sector:
PUSH ebp
MOV ebp, esp
PUSH ax
PUSH bx
PUSH cx
PUSH dx
MOV al, [8 + ebp] ; num
MOV cl, [6 + ebp] ; offset
MOV ah, 2
XOR ch, ch
XOR dh, dh
MOV dl, 0x80
INT 0x13
MOV di, 512
XOR ah, ah
IMUL di, ax
XOR si, si
for_print_sector_0:
CMP si, di
JZ end_for_print_sector_0
MOV al,[es:si]
OR al, al
JZ end_print_char_0
CALL print_char
end_print_char_0:
INC si
JMP for_print_sector_0
end_for_print_sector_0:
POP dx
POP cx
POP bx
POP ax
MOV esp, ebp
POP ebp
RETN
print_char:
PUSH ax
PUSH bx
MOV ah,0x0E ; Specifies that we want to write a character to the screen
MOV bl,0x02 ; Specifies output text color. Not required, but useful to know
MOV bh,0x00 ; Page number. Leave this alone.
INT 0x10 ; Signal video interrupt to BIOS
POP bx
POP ax
RETN
execute_sector:
PUSH ebp
MOV ebp, esp
PUSH ax
PUSH bx
PUSH cx
PUSH dx
MOV ax, [10 + ebp] ; base address
MOV es, ax
MOV al, [8 + ebp] ; num
MOV cl, [6 + ebp] ; offset
MOV ah, 2 ; Function read
XOR ch, ch ; cylinder
XOR dh, dh ; head
MOV dl, 0x80 ; drive
INT 0x13
XOR si, si
PUSH es
PUSH bx
RETF
Start:
XOR ax, ax
MOV ds, ax
MOV ax, 0x1000
MOV es, ax
XOR bx, bx
CALL clear_screen
PUSH 2 ; num
PUSH 2 ; offset
CALL print_sector ; (offset, num)
ADD esp, 4
MOV si,str
CALL print_string
PUSH 0x800; Base address, offset is 0
PUSH 1 ; num
PUSH 4 ; offset
XOR bx, bx;
CALL execute_sector
str: db 'THE GAME',0x0A,0x0D,0x00
TIMES 510 - ($ - $$) db 0
DW 0xAA55