-
Notifications
You must be signed in to change notification settings - Fork 0
/
main32.asm
144 lines (122 loc) · 4.81 KB
/
main32.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
;#########################################################################
;@file main.asm
;@brief Aplicacion principal
; Intel x86 compatible en 32 bit.
;@author Agustin Alba Chicar
;@date Octubre, 2015
;#########################################################################
;********************************************************************************
; Simbolos externos y globales
;********************************************************************************
%include "video.inc"
%include "pagination.inc"
%include "fifo.inc"
%include "keyboard.inc"
GLOBAL main32Start
;Simbolos de video
EXTERN videoClearScreen
EXTERN videoPrint
;Simbolos de puertos
EXTERN portWrite
EXTERN portRead
;Simbolos de numeric
EXTERN numericRandomLoadSeed
EXTERN numericGetRandomNumber
;Simbolos de exception
EXTERN exceptionLoadHandlers
EXTERN exceptionSetNewPagePointer
EXTERN exceptionSetNewDestinationPointer
;Sibolos de interrupciones
EXTERN interruptLoadHandlers
EXTERN interrruptLoadKeyboardCallback
;Simbolos de fifo
EXTERN fifoInit
EXTERN fifoPush
EXTERN fifoPop
;Simbolos del driver de teclado
EXTERN keyboardInitFIFO
EXTERN keyboardRead
EXTERN keyboardISRHandler
EXTERN keyboardGetChar
;Sibmbolos del driver de sistema
EXTERN systemSleep
EXTERN systemEnableInterrupts
EXTERN systemDisableInterrupts
EXTERN systemConfigure1MSTick
EXTERN systemGetTickCount
EXTERN systemLoadTickHandler
;********************************************************************************
; Defines
;********************************************************************************
%define NEW_PAGE_PHYSICAL_ADDRESS_START 0x160000
USE32
;********************************************************************************
; Datos no inicializados
;********************************************************************************
;********************************************************************************
; Datos inicializados
;********************************************************************************
SECTION .data
initMessage db "Testeando tick...", NULL
endMessage db "Fin de aplicacion", NULL
;********************************************************************************
; Datos no inicializados
;********************************************************************************
SECTION .bss
main32Data resd 1
main32Buffer resb 2
main32TickCount resd 1
;********************************************************************************
; Aplicacion principal de 32bit.
; Me pongo a leer el teclado a la espera de la presion de la tecla ESC. Primero
; testeo que haya actividad en el teclado, luego testeo la tecla propiamente dicha
; y evaluo si es la tecla ESC. Sino escribo la tecla adquirida en pantalla
;********************************************************************************
section .main32
main32Start:
; call exceptionLoadHandlers ; Cargo los handlers de excepciones
;
; call interruptLoadHandlers ; Cargo los handlers de interupciones
mov eax, keyboardISRHandler ; Cargo el callback del handler de teclado
push eax
call interrruptLoadKeyboardCallback
add esp, 4
mov eax, NEXT_TABLE_PAGE_POINTER ; Cargo en eax el valor del puntero a la proxima tabla y lo seteo
push eax
call exceptionSetNewPagePointer
add esp, 4 ; Balance de pila
mov eax, NEW_PAGE_PHYSICAL_ADDRESS_START; Cargo el valor de la direccion fisica a donde voy a dirigir las paginas nuevas
push eax
call exceptionSetNewDestinationPointer
add esp, 4
call keyboardInitFIFO ; Inicializo la FIFO del teclado
; call systemConfigure1MSTick ; Configuro el tick de 1ms
; call systemLoadTickHandler ; Configuro el tick handler
call systemGetTickCount ; Obtengo la cuenta de tick y despues la guardo en la variable
mov [main32TickCount], eax
call systemEnableInterrupts ; Habilito las interrupciones
call videoClearScreen ; Limpio la pantalla y escribo un mensaje
push VIDEO_WORD_FOREGROUND_BLUE_MASK | VIDEO_WORD_FOREGROUND_RED_MASK | VIDEO_WORD_FOREGROUND_GREEN_MASK | VIDEO_WORD_INTENSITY_MASK
push 0
push 0
push initMessage
call videoPrint
add esp, 16
main32MainLoop:
call systemSleep ; Duermo
call systemGetTickCount ; Obtengo la cuenta de tick
mov [main32TickCount], eax ; Cargo la variable
cmp eax, 10000 ; Comparo la cuenta de tick contra 100
jne main32MainLoop
main32EndOfApp:
call systemDisableInterrupts ;Deshabilito las interrupciones
call videoClearScreen ; Limpio la pantalla y escribo un mensaje
push VIDEO_WORD_FOREGROUND_BLUE_MASK | VIDEO_WORD_FOREGROUND_RED_MASK | VIDEO_WORD_FOREGROUND_GREEN_MASK | VIDEO_WORD_INTENSITY_MASK
push 0
push 0
push endMessage
call videoPrint
add esp, 16
main32EndOfAppLoop:
call systemSleep
jmp main32EndOfAppLoop