Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ; Programa Mostra memoria
  2. ; Projeto: Clovis Bombardelli e Felipe Gustavo Bombardelli
  3. ; Usar Fasm Assembler
  4. ; Dez/2007
  5.  
  6.  
  7. ; Infos:
  8. ; keys: w - add 0x200 to current memory address
  9. ;       s - sub 0x200
  10. ;       e - add 0x10
  11. ;       d - sub 0x10
  12. ;
  13.  
  14. use32
  15.  
  16.   org    0x0
  17.  
  18. STACK_SIZE=1024
  19.  
  20.   db     'MENUET01'              ; 8 byte id
  21.   dd     0x01                    ; header version
  22.   dd     START                   ; start of code
  23.   dd     I_END                   ; size of image
  24.   dd     I_END+STACK_SIZE        ; memory for app
  25.   dd     I_END+STACK_SIZE        ; esp
  26.   dd     0x0 , 0x0               ; I_Param , I_Icon
  27.  
  28.  
  29.  
  30.  
  31.  
  32. START:
  33.  
  34.  
  35. main:
  36.  
  37.         call monta_quadro
  38.        
  39. .a:     mov eax, 11             ; espera por evento
  40.         int 0x40                        ; 0= -> redraw          
  41.         or al,al
  42.         jz .h
  43.         cmp al, 2                       ; 1= -> REDRAW    
  44.         jb main                 ; 2= -> tecla pressionada    
  45.         jz .c                         ; 3= -> botão pressionado    
  46.  
  47. ; botão
  48.         mov  eax,17                     ;
  49.         int 0x40                        ; OBSERVAÇÕES
  50.         cmp  ah,1                       ; se o botão apertado for fechar, minimizar, maximizar...todos devem ser do sistema
  51.         jnz  .b                 ; mover...etc
  52.         or   eax,-1             ; saida do aplicativo   **************************deve ser do sistema
  53.         int 0x40                ;                                       nunca do aplicativo
  54.  
  55. .b:     jmp .a          ; loop para novo evento  
  56.          
  57.  
  58. ; tecla
  59. .c:     mov  eax,2              ; getkey
  60.         int 0x40
  61.         ;cmp al, 1             
  62.         ;jnz .a
  63.         cmp ah, 'w'
  64.         jne .a1
  65.         add [end_base], 0x200
  66.         jmp main                        ;
  67. .a1:    cmp ah, 's'
  68.         jne .a2
  69.         cmp [end_base], dword 0x80000000
  70.         jbe .a2
  71.         sub [end_base], 0x200  
  72.         jmp main                        ;
  73. .a2:    cmp ah, 'e'
  74.         jne .a3
  75.         add [end_base], 0x10
  76.         jmp main                        ;
  77. .a3:    cmp ah, 'd'
  78.         jne .b1
  79.         cmp [end_base], dword 0x80000000
  80.         jbe .b1
  81.         sub [end_base], 0x10
  82. .b1:    jmp main
  83.  
  84.  
  85. ; atualiza apenas o codigo hex / ascii
  86. .h:
  87.         call hex_loop
  88. ;       inc [contador]          ; usado apenas para testar a dinamica
  89.         jmp .a          ; retorna para buscar novo evento
  90.  
  91.  
  92. monta_quadro:
  93.  
  94.   ; posição inicial, subfunção 1
  95.        
  96.         mov  eax,12                    
  97.         mov  ebx,1                      
  98.         int 0x40
  99.  
  100.   ; Desenha o quadro
  101.        
  102.         mov  eax,0                     ; função 0 : define e monta o quadro
  103.         mov  ebx,100*65536+480         ; [x pos] *65536 + [x lar]
  104.         mov  ecx,100*65536+440         ; [y pos] *65536 + [y alt]
  105.         mov  edx,[cor_janela]            ; cor area RRGGBB
  106.         mov  edi,titulo                ; Titulo
  107.         int 0x40
  108.  
  109.   ; escreve texto no quadro (barra superior)
  110.        
  111.         mov edi,[cor_janela]
  112.         mov  eax,4        
  113.         mov ecx, [cor_texto]
  114.         mov  ebx,8*65536+8
  115.         mov  edx,teste      
  116.         int 0x40              
  117.        
  118.         add  ebx,11             ; adiciona espaço na coord y
  119.        
  120.         mov  eax,4        
  121.         mov ecx, [cor_texto]
  122.         mov  edx,barra1      
  123.         int 0x40  
  124.                        
  125.         call hex_loop
  126.        
  127.   ; posição final, subfunção 2 
  128.        
  129. .d:     mov  eax,12                    
  130.         mov  ebx,2                      
  131.         int 0x40       
  132.        
  133.         ret    
  134.  
  135.   ; buscar conteudo da memoria para mostrar
  136.  
  137. hex_loop:      
  138.         xor eax, eax
  139.         mov ebx, [end_base]     ; endereço base
  140.  
  141.   ; imprime o endereço
  142.        
  143.         mov edx, 8*65536+40 ; posição inicial hex
  144.         mov [pos_ascii], edx
  145.         add [pos_ascii], 360*65536      ; posição inicial ascii
  146.         mov word [pos_x], 0
  147.         mov al, [quant_linhas]
  148.         mov edi,[cor_janela]
  149.  
  150. .c:     push eax                ;
  151.         push edx                ;
  152.        
  153.         push ebx                ; salva endereço base
  154.         mov al, 47
  155.         mov ecx, ebx    ; imprime o endereço
  156.         mov ebx, 0x00080100
  157.         mov esi, [cor_endereco]
  158.         int 0x40
  159.         pop ebx         ;
  160.        
  161.         add edx, 60*65536       ; pula 8 espaços mais alguma coisa
  162.        
  163.   ; busca hexcode      
  164.        
  165.         mov esi, [cor_hexcode]
  166.         mov al, 4
  167.  
  168. .b:     push eax                ; ----------------------------------------------------------ok
  169.                
  170.         mov al, 72      ; ebx= endereço de leitura (nao funcionou...) change this service to another
  171.         int 0x40                ; retorna ecx= dword da posição ebx
  172.  
  173.         push ebx                ; ----------------------------------------------------------ok
  174.         mov ebx, 0x00020100     ; 2 digitos, modo hex
  175.         mov al, 4
  176.  
  177. .a:     push eax                ; controle -------------------------------------------------ok
  178.         push ecx                ; codigo
  179.         push edx                ; posição
  180.         and ecx, 0xff
  181.         mov al, 47
  182.         int 0x40
  183.         call imprime_car$
  184.         pop edx         ;
  185.         pop ecx         ;
  186.         shr ecx, 8
  187.         add edx, (18)*65536
  188.         pop eax         ; ----------------------------------------------------------ok
  189.         dec al
  190.         jnz .a
  191.        
  192.         pop ebx         ; ----------------------------------------------------------ok
  193.         add ebx, 4      ; soma 4 ao endereço base
  194.         pop eax         ; ----------------------------------------------------------ok
  195.         dec al          ; imprimir mais 4 vezes incrementando ebx em 4
  196.         jnz .b
  197.        
  198.         pop edx         ;
  199.         add edx, 10     ;
  200.  
  201.  ; imprime a string ascii      
  202.  
  203.         push ebx
  204.         push edx
  205.         mov al, 4      
  206.         mov ebx, [pos_ascii]    ; endereço na tela
  207.         mov edx, ascii_string   ; endereço da string
  208.         or ecx, [cor_ascii]             ; cor
  209.         int 0x40
  210.         mov [ascii_x], byte 0
  211.         add [pos_ascii], 10
  212.         pop edx
  213.         pop ebx
  214.        
  215.         pop eax         ;      
  216.         dec al
  217.         jnz .c
  218.         ret
  219.  
  220. imprime_car$:           ; ecx tem o caractere a imprimir
  221.        
  222.         push ebx
  223.         xor ebx, ebx
  224.         mov bl, [ascii_x]
  225.         or cl, cl
  226.         jnz .c
  227.         mov cl, 0x20
  228. .c:     mov [ebx+ascii_string], cl     
  229.         inc [ascii_x]
  230.         pop ebx
  231.         ret
  232.        
  233.  
  234. ; para acessar a memoria do sistema:
  235. ;
  236. ;       acessar a base das tabelas de paginaçao
  237. ;       com o endereço buscar o descritor de pagina
  238. ;       ler o endereço físico ndo descritor
  239. ; ou    buscar a pagina do sistema e ler nele o endereço fisico
  240.  
  241. ; DATA AREA
  242. align 0x10
  243. ;contador               dd 0                    ; para testar a dinamica
  244. cor_janela      dd 0x346f72c3           ; atrib, tipo, corRGB
  245. cor_texto       dd 0xc0fffffe           ; fonte variavel, cor branca
  246. cor_endereco    dd 0xc0fffffc
  247. cor_hexcode     dd 0xc0fffffd
  248. cor_ascii               dd 0xc0fffffa
  249. pos_x           db 0
  250. pos_y           db 0
  251. quant_linhas    db 0x20
  252. ascii_x         db 0
  253. end_base                dd 0x80000000           ; ok
  254. pos_ascii               dd 0
  255. ascii_string    rb 0x11
  256. reservado               rb 3
  257.  
  258.  
  259. titulo    db 'Mostra a memoria do sistema operacional',0
  260.  
  261. teste   db '--------  ------------------ Hex Code -------------------   -- A S C I I  --',0
  262. barra1  db 'Address:  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f   0123456789abcdef',0
  263.  
  264.  
  265. align 0x10
  266. I_END:
  267.        
  268.  
  269. ; service 72 from system calls
  270. ;
  271. ; must contain:
  272. ;       mov eax, [eax]
  273. ;       mov [esp+32], eax
  274. ;       ret
  275.  
  276.  
  277.