boot.asm
1.89 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
;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 short Start
str: db 'THE GAME ',0x00
clear_screen:
PUSH ax
MOV al, 02h ; Setting the graphical mode 80x25(text)
MOV ah, 00h ; Code of the function of changing video mode
INT 10h ; Call interruption
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, [6 + ebp] ; num
MOV cl, [8 + ebp] ; offset
MOV ah, 2
XOR ch, ch
XOR dx,dx
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
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, 12
for_start_0:
MOV si,str
CALL print_string
;JMP for_start_0
JMP $
TIMES 510 - ($ - $$) db 0
DW 0xAA55