; Programa Mostra memoria
; Projeto: Clovis Bombardelli e Felipe Gustavo Bombardelli
; Usar Fasm Assembler
; Dez/2007


; Infos:
; keys: w - add 0x200 to current memory address
;	s - sub 0x200
;	e - add 0x10
;	d - sub 0x10
;

use32

  org    0x0

STACK_SIZE=1024

  db     'MENUET01'              ; 8 byte id
  dd     0x01                    ; header version
  dd     START                   ; start of code
  dd     I_END                   ; size of image
  dd     I_END+STACK_SIZE        ; memory for app
  dd     I_END+STACK_SIZE        ; esp
  dd     0x0 , 0x0               ; I_Param , I_Icon

include 'lang.inc' ;language support



START:


main:

	call monta_quadro

.a:	mov eax, 11		; espera por evento
	int 0x40			; 0= -> redraw
	or al,al
	jz .h
	cmp al, 2			; 1= -> REDRAW
	jb main			; 2= -> tecla pressionada
	jz .c                         ; 3= -> botão pressionado

; botão
	mov  eax,17      		;
	int 0x40                   	; OBSERVAÇÕES
	cmp  ah,1        		; se o botão apertado for fechar, minimizar, maximizar...todos devem ser do sistema
	jnz  .b     		; mover...etc
	or   eax,-1   		; saida do aplicativo   **************************deve ser do sistema
	int 0x40            	; 					nunca do aplicativo

.b:	jmp .a   	; loop para novo evento


; tecla
.c:	mov  eax,2		; getkey
	int 0x40
	;cmp al, 1
	;jnz .a
	cmp ah, 'w'
      	jne .a1
      	add [end_base], 0x200
	jmp main			;
.a1:  	cmp ah, 's'
      	jne .a2
      	cmp [end_base], dword 0x80000000
      	jbe .a2
      	sub [end_base], 0x200
	jmp main			;
.a2:	cmp ah, 'e'
      	jne .a3
      	add [end_base], 0x10
	jmp main			;
.a3:  	cmp ah, 'd'
      	jne .b1
      	cmp [end_base], dword 0x80000000
      	jbe .b1
      	sub [end_base], 0x10
.b1:	jmp main


; atualiza apenas o codigo hex / ascii
.h:
	call hex_loop
;	inc [contador]		; usado apenas para testar a dinamica
	jmp .a		; retorna para buscar novo evento


monta_quadro:

  ; posição inicial, subfunção 1

    	mov  eax,12
    	mov  ebx,1
    	int 0x40

  ; Desenha o quadro

    	mov  eax,0                     ; função 0 : define e monta o quadro
    	mov  ebx,100*65536+480         ; [x pos] *65536 + [x lar]
    	mov  ecx,100*65536+440         ; [y pos] *65536 + [y alt]
    	mov  edx,[cor_janela]        	 ; cor area RRGGBB
    	mov  edi,titulo                ; Titulo
    	int 0x40

  ; escreve texto no quadro (barra superior)

  	mov edi,[cor_janela]
  	mov  eax,4
	mov ecx, [cor_texto]
	mov  ebx,8*65536+8
	mov  edx,teste
	int 0x40

  	add  ebx,11		; adiciona espaço na coord y

  	mov  eax,4
	mov ecx, [cor_texto]
	mov  edx,barra1
	int 0x40

 	call hex_loop

  ; posição final, subfunção 2

.d:	mov  eax,12
    	mov  ebx,2
    	int 0x40

	ret

  ; buscar conteudo da memoria para mostrar

hex_loop:
   	xor eax, eax
   	mov ebx, [end_base]	; endereço base

  ; imprime o endereço

   	mov edx, 8*65536+40 ; posição inicial hex
   	mov [pos_ascii], edx
   	add [pos_ascii], 360*65536	; posição inicial ascii
   	mov word [pos_x], 0
   	mov al, [quant_linhas]
	mov edi,[cor_janela]

.c:   	push eax		;
   	push edx		;

   	push ebx		; salva endereço base
   	mov al, 47
   	mov ecx, ebx	; imprime o endereço
   	mov ebx, 0x00080100
   	mov esi, [cor_endereco]
   	int 0x40
	pop ebx		;

	add edx, 60*65536	; pula 8 espaços mais alguma coisa

  ; busca hexcode

	mov esi, [cor_hexcode]
	mov al, 4

.b:	push eax		; ----------------------------------------------------------ok

 	mov al, 72	; ebx= endereço de leitura (nao funcionou...) change this service to another
	int 0x40		; retorna ecx= dword da posição ebx

   	push ebx	 	; ----------------------------------------------------------ok
 	mov ebx, 0x00020100	; 2 digitos, modo hex
 	mov al, 4

.a:	push eax		; controle -------------------------------------------------ok
 	push ecx		; codigo
 	push edx		; posição
 	and ecx, 0xff
 	mov al, 47
 	int 0x40
 	call imprime_car$
 	pop edx		;
 	pop ecx		;
 	shr ecx, 8
 	add edx, (18)*65536
 	pop eax		; ----------------------------------------------------------ok
 	dec al
 	jnz .a

 	pop ebx		; ----------------------------------------------------------ok
 	add ebx, 4	; soma 4 ao endereço base
 	pop eax		; ----------------------------------------------------------ok
 	dec al		; imprimir mais 4 vezes incrementando ebx em 4
 	jnz .b

	pop edx		;
 	add edx, 10	;

 ; imprime a string ascii

 	push ebx
 	push edx
 	mov al, 4
      	mov ebx, [pos_ascii]	; endereço na tela
      	mov edx, ascii_string	; endereço da string
      	or ecx, [cor_ascii]		; cor
      	int 0x40
 	mov [ascii_x], byte 0
 	add [pos_ascii], 10
 	pop edx
 	pop ebx

 	pop eax		;
 	dec al
 	jnz .c
	ret

imprime_car$:		; ecx tem o caractere a imprimir

	push ebx
	xor ebx, ebx
	mov bl, [ascii_x]
	or cl, cl
      	jnz .c
      	mov cl, 0x20
.c:	mov [ebx+ascii_string], cl
	inc [ascii_x]
	pop ebx
	ret


; para acessar a memoria do sistema:
;
;	acessar a base das tabelas de paginaçao
;	com o endereço buscar o descritor de pagina
; 	ler o endereço físico ndo descritor
; ou 	buscar a pagina do sistema e ler nele o endereço fisico

; DATA AREA
align 0x10
;contador		dd 0			; para testar a dinamica
cor_janela  	dd 0x346f72c3		; atrib, tipo, corRGB
cor_texto 	dd 0xc0fffffe		; fonte variavel, cor branca
cor_endereco	dd 0xc0fffffc
cor_hexcode	dd 0xc0fffffd
cor_ascii		dd 0xc0fffffa
pos_x		db 0
pos_y		db 0
quant_linhas	db 0x20
ascii_x		db 0
end_base		dd 0x80000000		; ok
pos_ascii		dd 0
ascii_string	rb 0x11
reservado		rb 3

if lang eq it
	titulo    db 'Visualizza la memoria del sistema operativo',0
	teste	db '--------  ----------------- Codice Hex  -----------------   -- A S C I I  --',0
	barra1	db 'Indirizzo:00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f   0123456789abcdef',0

else if lang eq es
	titulo    db 'Mostra a memoria do sistema operacional',0
	teste	db '--------  ------------------ Hex Code -------------------   -- A S C I I  --',0
	barra1	db 'Address:  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f   0123456789abcdef',0

else
	titulo    db 'Displays the operating system memory',0
	teste	db '--------  ------------------ Hex Code -------------------   -- A S C I I  --',0
	barra1	db 'Address:  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f   0123456789abcdef',0
end if

align 0x10
I_END:


; service 72 from system calls
;
; must contain:
;       mov eax, [eax]
;	mov [esp+32], eax
;	ret