forked from nogueira04/projeto-bootloader
-
Notifications
You must be signed in to change notification settings - Fork 0
/
kernel.asm
219 lines (177 loc) · 4.44 KB
/
kernel.asm
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
org 0x7e00
jmp 0x0000:start
;%include "imageandvideo.asm"
;%include "data.asm"
%include "menu_winner_loser_functions.asm"
data:
%macro print_errors 1
pusha
mov si, erroimage
cmp %1, 1
je .umerro
cmp %1, 2
je .doiserros
cmp %1, 3
je .treserros
.umerro:
mov cx,68
mov dx,60
jmp .printerr
.doiserros:
mov cx,84
mov dx,60
jmp .printerr
.treserros:
mov cx,100
mov dx,60
jmp .printerr
.printerr:
call printimage
popa
%endmacro
%macro check_if_won 2
;%1 = tracejado
;%2 = self
pusha
mov si, %1 ; move a string tracejada para si
mov bl, 1 ; flag para saber se achou "_"
.loopcheck:
lodsb
cmp al, 8 ; checa se a string acabou
je .endcheck
cmp al, 95 ; checa se o char é _
je .found_underscore
jmp .loopcheck
.found_underscore: ; se achar o underscore significa que não ganhou, já que a string não tá completa
xor bl, bl ;zera a flag
jmp .endcheck
.endcheck:
cmp bl, 1
je %2.continue ;passa pra próxima logo
popa
%endmacro
%macro update_score 1
pusha
mov ah, %1
mov al, ah
xor ah, ah
mov di, score_n
call tostring
mov si, score_n
print score_n, [branco], 13, 15
popa
%endmacro
%macro charcmp 2
;1 == mov di,stringtracejada(mc)
;2 == mov si,stringresposta(mcdonalds)
pusha
mov di, %1
mov si, %2
mov dl, 0 ; flag para saber se foi acertado a tentativa
mov bl, al ; move o caractere pego no getchar e armazena em bl
sub bl, 32 ; transformar minúsculo em maiúsculo
.loopcmp:
lodsb ; move o byte[si] para al e incrementa si(string com resposta)
cmp al, 8 ; verifica se acabou a string
je .endloop
cmp al, bl ;compara o byte[di] com o caractere do getchar
je .equal
jne .notequal
.equal:
inc dh ;dh seria o score, que vai ser comparado com o tamanho da string
inc dl
mov byte[di], bl ;move o caractere para o slot da string tracejada
inc di ; incrementa a posição da string pontilhada
jmp .loopcmp
.notequal:
inc di ; incrementa a posição da string pontilhada
jmp .loopcmp
.endloop:
;update_score dh
print %1,[branco],5,10
cmp dl, 0
jne .gotright
je .gotwrong
.gotwrong:
inc cx ;errou a tentativa, cl seria o número de erros
print_errors cx
pusha
;ret VELHOS
popa ;; pusha -> di, sp, bp, bx, dx, cx, ax ->> push cx
;; pusha -> di, sp, bp, bx, dx, NOVO cx, ax
;; popa -> 1 -> di, 2 -> sp, 3 -> bp 4 -> bx, 5-> dx 6-> cx, 7 -> ax
.gotright:
pusha
popa
;ret
%endmacro
%macro game 5
; %1 = logo
; %2 = tracejado
; %3 = resposta
; %4 = próx função (ou mesma)
; %5 = frase da fase
pusha
call set_mode
mov si, %1
call printimage
print %5,[branco],0,0
xor cx, cx
%%loop:
cmp cx, 3
je %%lost
call getchar
charcmp %2, %3
check_if_won %2, %4
jmp %%loop
%%lost:
call loserscreen
popa
%endmacro
logo1:
game mc25, mctracejado, mcresposta, logo1,fase1
.continue:
call delay
xor cx, cx
call limpaTela
logo2:
game pepsi25, pepsitracejado, pepsiresposta, logo2,fase2
.continue:
call delay
xor cx, cx
call limpaTela
logo3:
game linkedin25, linkedintracejado, linkedinresposta, logo3,fase3
.continue:
call delay
xor cx, cx
call limpaTela
logo4:
game volks25, volkstracejado, volksresposta, logo4,fase4
.continue:
call delay
xor cx, cx
call limpaTela
logo5:
game giorgioarmani25, giorgioarmani, giorgioarmaniresposta,logo5 ,fase5
.continue:
call delay
xor cx, cx
call limpaTela
logo6:
game robocin50, robocintracejado, robocinresposta,logo6 ,fase6
.continue:
call delay
call winnerscreen
start:
xor ax, ax
mov ds, ax
mov cx, ax
mov es, ax
mov dx, ax
call set_mode ;chamar modo de vídeo
call delay
call menu
; call game
fim:
jmp $