tcbpg

Untitled

Nov 3rd, 2011
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. BITS 16
  2.  
  3. %include "macrosimpresion.mac"
  4. %include "macrosmodoreal.mac"
  5. ;%include "macrosmodoprotegido.mac"
  6.  
  7. %define KORG 0x1200
  8. %define ADDRESS_PD 0x00100000
  9. %define ADDRESS_PT 0x00101000
  10. %define BASE_PILA 0x18000
  11.  
  12. global start
  13. global imprimir_texto
  14. global llenar_pantalla
  15.  
  16. extern tsss
  17. extern gdt
  18. extern GDT_DESC
  19. extern IDT_DESC
  20. extern inicializar_idt
  21. extern resetear_pic
  22. extern habilitar_pic
  23. extern deshabilitar_pic
  24.  
  25. extern inicializar_dir_kernel
  26.  
  27. ;Aca arranca todo, en el primer byte.
  28. start:
  29.         cli ;no me interrumpan por ahora
  30.         ;xchg bx, bx
  31.         jmp bienvenida
  32.  
  33. ;aca ponemos todos los mensajes
  34. iniciando: db 'Iniciando el kernel...'
  35. iniciando_len equ $ - iniciando
  36.  
  37. bienvenida:
  38.  
  39.         IMPRIMIR_MODO_REAL iniciando, iniciando_len, 0x07, 0, 0
  40.  
  41.         ;Habilitar A20
  42.         call habilitar_A20
  43.  
  44.         ;Deshabilitar las interrupciones
  45.         cli
  46.        
  47.         ;Pasar a modo protegido
  48.         lgdt [GDT_DESC]
  49.  
  50.         ;Prendo el bit para modo protegido
  51.         mov eax, cr0
  52.         or eax,1
  53.         mov cr0,eax
  54.  
  55.         ;Pego el salto     
  56.         jmp 0x30:modo_protegido
  57. BITS 32
  58. modo_protegido:    
  59.         ;Cargar segmentos.
  60.         xor ax,ax
  61.         xchg bx,bx
  62.         ;El selector en 0x20 es el de datos
  63.         mov ax, 0x20
  64.         mov ds, ax
  65.         mov es, ax
  66.         mov ss, ax
  67.  
  68.         ;El selector en 0x10 es el de video
  69.         mov ax, 0x10
  70.         mov fs, ax
  71.  
  72.         ;Seteo la pila de kernel
  73.         mov esp, BASE_PILA
  74.         mov ebp, BASE_PILA
  75.  
  76.         ;Listo, imprimamos
  77.         call imprimir_pantalla
  78.  
  79.         ;Inicializar la IDT
  80.         call inicializar_idt
  81.         lidt [IDT_DESC]
  82.        
  83.         ;BOOOOOOOOOOOOOOOOMM!!!!
  84.         ;mov dword [fs : 0xFFFFFFFF], 172
  85.         ;xchg bx,bx
  86.        
  87. ;       xchg bx,bx
  88. ;       mov eax, 0x0
  89. ;       mov ebx, 0x0
  90. ;       div bx
  91.        
  92.         ;Habilitar paginacion
  93.  
  94.         ;Armar estructuras
  95.         xchg bx,bx
  96.         call inicializar_dir_kernel
  97. ;       mov ecx, 1024
  98. ;       mov ebx, ADDRESS_PD
  99.  
  100. ;       .loadPd:
  101. ;           mov dword [ebx+ecx*4], 0x00000002
  102. ;       loop .loadPd
  103.  
  104. ;       mov dword [ADDRESS_PD], ADDRESS_PT + 0x3
  105.        
  106. ;       mov ecx, 1024
  107. ;       mov ebx, ADDRESS_PT
  108. ;       mov edx, 0x1000 * 1024
  109. ;       .loadPt:
  110. ;           mov dword [ebx+ecx*4],edx
  111. ;           add dword [ebx+ecx*4], 0x00000003
  112. ;           sub edx, 0x1000
  113. ;       loop .loadPt
  114.  
  115.         xchg bx,bx
  116.         mov dword [ADDRESS_PT+512*4], 0x000B8003
  117.    
  118.         ;Iniciar paging
  119.         mov eax, cr3       
  120.         mov eax, ADDRESS_PD
  121.         mov cr3, eax       
  122.         mov eax, cr0
  123.         or eax, 0x80000000
  124.         mov cr0, eax
  125.  
  126.         mov edi, 0x200000
  127.         mov esi, nombre_grupo
  128.         mov ecx, nombre_grupo_len      
  129.         mov ah, 0x70
  130.  
  131.         call imprimir_texto_paginacion
  132.        
  133.         call resetear_pic
  134.         call habilitar_pic
  135.  
  136.         sti    
  137.         ;Inicializar el scheduler de tareas
  138.  
  139.         ;Construir tarea idle
  140.        
  141.         ;Construir primer worm
  142.  
  143.         ;Saltar a la primer tarea
  144.  
  145.         jmp $
  146.  
  147. llenar_pantalla:
  148.     push edx
  149.     push es
  150.     mov dx, fs
  151.     mov es, dx
  152.     rep stosw
  153.     pop es 
  154.     pop edx
  155.     ret
  156.  
  157. imprimir_texto:    
  158. .imprimir_texto:
  159.     mov al, [ds: ebx + edx]    
  160.     mov [fs:edi], ax
  161.     inc edx
  162.     add edi,2
  163.     loop .imprimir_texto
  164.     ret
  165.  
  166. imprimir_texto_paginacion:     
  167. .imprimir_texto_paginacion:
  168.     mov al, [esi+edx]      
  169.     mov [edi+2*edx], ax
  170.     inc edx
  171.     loop .imprimir_texto_paginacion
  172.     ret
  173.  
  174. imprimir_pantalla:
  175.     ;Vamos a imprimir a ver que pasa
  176.     xor edi, edi
  177.     xor edx, edx
  178.     xor eax, eax
  179.  
  180.     mov ecx, PIXELS_PANTALLA ;Todo el buffer.
  181.  
  182. ;Llena la pantalla sin loops :D
  183.     call llenar_pantalla
  184.    
  185. ;Pongo la primer linea en blanco
  186.     mov ax, 0x7F00
  187.     xor edi, edi
  188.     mov ecx, PIXELS_LINEA
  189.  
  190.     call llenar_pantalla
  191.  
  192.     mov edi, BYTES_PANTALLA
  193.     sub edi, BYTES_LINEA
  194.     mov ecx, PIXELS_LINEA
  195.  
  196. ;Pongo la ultima linea en blanco       
  197.     call llenar_pantalla
  198.  
  199. ;Imprimo el 0123456789     
  200.     xor eax, eax
  201.     xor edx, edx
  202.     mov edi, BYTES_LINEA
  203.     ;Saco el espacio para que entre    
  204.     mov ebx, protegido
  205.     sub edi, protegido_len
  206.     sub edi, protegido_len
  207.     mov ecx, protegido_len
  208.     mov ah, 0x70
  209.  
  210.     call imprimir_texto
  211.     ret
  212.  
  213. protegido: db '0123456789'
  214. protegido_len equ $ - protegido
  215.  
  216. nombre_grupo: db 'Siddharta Kiwi'
  217. nombre_grupo_len equ $ - nombre_grupo
  218.  
  219. %include "a20.asm"
  220.  
Advertisement
Add Comment
Please, Sign In to add comment