TightCoderEx
Here is the pixel.asm where variable are defined in the end of [section .data]
; Compilado usando nasm:
; nasm -fbin pixel.asm -o pixel.exe
;===========================================================
org 100h
section .text
jmp main
%include "print.inc"
%include "mouse.inc"
%include "fuente.inc"
%include "pintar.inc"
%include "dir.inc"
%include "ExE.inc"
%include "openf.inc"
;-------------------------------------------------------
main:
mov ax, 4f02h ;establece el modo de video SVGA 800x600
mov bx, 103h
int 10h
;--------------------------------------------------
;BEGIN: Pintar Interfaz de usuario
;--------------------------------------------------
pintar_cuadro 0,0,800,21,[color_fondo_menu] ;Coloreamos la barra de menu
pushString boton_file,0,0 ;Dibujamos todos los Strings de las funciones del
pushString boton_edit,60,0 ;Menu en su lugar corresponiente
pushString boton_view,120,0
pushString boton_seq,180,0
pushString boton_help,460,0
pushString boton_exit,520,0
;--------------------------------------------------
;END: Pintar Interfaz de usuario
;--------------------------------------------------
;-------------------------------------------------------
;Llamada a la funcion que inicializa nuestro mouse/cursor
call set_mouse
;-------------------------------------------------------
;--------------------------------------------------
;BEGIN: Bucle Principial del Sistema
;--------------------------------------------------
;El parametro ah = 08h utilizado con la interrupcion
;int21h, nos permite continuar con el procesamiento
;del sistema
bucle:
mov ah,08h
int 21h
cmp byte[sacame],1 ;Si el FLAG = 1 podemos llamar a la salida
je _exit_ ;del programa
cmp al,'x' ;Compara el input de teclado almacenado en
je _exit_ ;al y llama a salir si fue igual a 'X'
jmp bucle
;--------------------------------------------------
;END: Bucle Principial del Sistema
;--------------------------------------------------
;--------------------------------------------------
;BEGIN: On-Click Actions-Handlers (Manejadores de Clic)
;--------------------------------------------------
; Las siguientes funciones se utilizan para encontrar
; el último clic del mouse y la posición donde se realizó
; para llamar a la 'funcion' correspondiente de cada 'menu item'
;Primero guardamos todos los valores de los registros en stack
;y preguntamos si la posicion y del mouse esta dentro de las dimensiones del menu,
;en caso de no estarlo, finalizamos.
find:
pusha
cmp word[y_clic],20
jg finalizar
;Verificamos que le dimos clic al item 'file'
;Para esto comparamos la posicion de x del clic
;Si esta posicion se encuentra entre el rango que ocupan
;todas las letras del item desde su posicion inicial,
;entonces llamamos a la funcion correspondiente del item.
;Para saber si esta dentro del rango del item se dan valores
;fijos en donde empezará el item y donde terminara, de la forma:
; ITEM_X_POS+(LETRA_TAMANO*TOTAL_LETRAS)
;-----------
;En caso de que el clic sea en una posicon anterior o posterior al
;rango, llamamos a la funcion del menu correspondiente que se
;encuentra al lado del actual.
find_file:
cmp word[x_clic],40 ;Comparamos si el clic sobrepasa el limite derecho
jg find_edit ;de ser asi saltamos al 'find' del siguiente
pintar_cuadro 0,21,100,61,[color_fondo_menu] ;limpiamos la pantalla
call imprime_file ;llamamos la funcion correspondiente del item
jmp finalizar ;finalizamos
find_edit:
cmp word[x_clic],60
jl finalizar
cmp word[x_clic],100
jg find_view
;pintar_cuadro 300,200,70,20
call imprime_edit
jmp finalizar
find_view:
cmp word[x_clic],120
jl finalizar
cmp word[x_clic],160
jg find_seq
call imprime_view
jmp finalizar
find_seq:
cmp word[x_clic],180
jl finalizar
cmp word[x_clic],440
jg find_help
call imprime_seq255
jmp finalizar
find_help:
cmp word[x_clic],460
jl finalizar
cmp word[x_clic],500
jg find_exit
call imprime_help
jmp finalizar
find_exit:
cmp word[x_clic],520
jl finalizar
cmp word[x_clic],560
jg finalizar
mov byte[sacame],1
;--Para finalizar solo devolvemos los valores de los registros desde el stack
;y retornamos a la posicion original.
finalizar:
popa
ret
;--------------------------------------------------
;END: On-Click Actions-Handlers (Manejadores de Clic)
;--------------------------------------------------
;--------------------------------------------------
;BEGIN: On-Click Actions (Acciones de cada item)
;--------------------------------------------------
;Se utilizan 'estados' para saber que accion se realizara antes de
;llamar a una funcion a la que se dio clic en un item del menu.
;Estos estados estan enumerados del 1-7 y cada uno
;corresponde al menu item que se le dio clic.
imprime_file:
pusha
cmp byte[estado_menus],1 ;Si estamos en el estado=1 continuamos con la funcion
je continua
cmp byte[estado_menus],7 ;Si estamos en el estado=7 entonces limpiamos la pantalla
je do_clean
jmp continua
do_clean:
call clear_screen
continua:
pushString file,30,200 ;Imprimimos la accion que se realizó
pushString file_archivo,0,21 ;Imprimimos el submenu 'Archivo'
mov byte[estado_menus],1 ;mueve un 1 a estado_menus si file está activado
popa
ret
imprime_edit:
pusha
;Verificacion de Estados y limpieza de pantalla
cmp byte[estado_menus],0
je _continua
cmp byte[estado_menus],1
pintar_cuadro 0,21,100,40,[color_fondo_pant]
pintar_cuadro 0,100,800,400,[color_fondo_pant]
cmp byte[estado_menus],7
je _do_clean
jmp _continua
_do_clean:
call clear_screen
_continua: ;Accion del Item
pushString edit,30,200
mov byte[estado_menus],2
popa
ret
imprime_view:
pusha
;Verificacion de Estados y limpieza de pantalla
cmp byte[estado_menus],0
je .continua
cmp byte[estado_menus],1
pintar_cuadro 0,21,100,40,[color_fondo_pant]
pintar_cuadro 0,100,800,400,[color_fondo_pant]
cmp byte[estado_menus],7
je .do_clean
jmp .continua
.do_clean:
call clear_screen
;Accion del Item
.continua:
pushString view,30,200
mov byte[estado_menus],3
popa
ret
imprime_help:
pusha
;Verificacion de Estados y limpieza de pantalla
cmp byte[estado_menus],0
je __continua
cmp byte[estado_menus],1
pintar_cuadro 0,21,100,40,[color_fondo_pant]
pintar_cuadro 0,100,800,400,[color_fondo_pant]
cmp byte[estado_menus],7
je __do_clean
jmp _continua
__do_clean:
call clear_screen
;Accion del Item
__continua:
pushString help,30,200
mov byte[estado_menus],4
popa
ret
;--------------------------------------------------
;END: On-Click Actions (Acciones de cada item)
;--------------------------------------------------
;--------------------------------------------------
;BEGIN: Sub Menu Query (Clic al sub menu)
;--------------------------------------------------
;Aqui identificamos si se le dio clic a un submenu
;actualmente solo tenemos 'archivo' del menu item 'file'
;Se pregunta si el clic en 'Y' y en 'X' esta en el rango
;donde se dibujo el submenu-item y llamamos su funcion correspondiente.
find_sub_menu:
pusha
;En estas comparaciones verificamos qe estemos dentro del rango
;en el caso de no estarlo, entonces salimos de la seleccion
cmp word[y_clic],41
jg sal_find_sel
cmp word[y_clic],20
jl sal_find_sel
cmp word[x_clic],100
jg sal_find_sel
;Limpiamos la pantalla y llamamos a la funcion que nos muestra los
;archivos en un directorio, y ponemos el estado del menu = 6
pintar_cuadro 0,21,340,300,[color_fondo_pant]
call view_dir
mov byte[estado_menus],6
popa
ret
;--------------------------------------------------
;END: Sub Menu Query (Clic al sub menu)
;--------------------------------------------------
;--------------------------------------------------
;BEGIN: (Encontrar el archivo seleccionado)
;--------------------------------------------------
;Aqui se busca secuencialmente el archivo que fue seleccionado para ser abierto,
;ejecutado o pintado.
;Funciona revisando si la posicion del clic del mouse esta en el rango del directorio
;listado, de ser asi, entonces se itera comparando la posicion del clic en Y, con
;un contador que se aumenta con el Tamaño de la altura de el texto por cada ciclo.
;De esta manera se guarda el 'numero' del archivo en una variable 'file_num', que luego
;es utilizada para abrir el archivo numero 'file_num'.
find_selected:
pusha
;Verificacion del rango del clic
cmp word[y_clic],130
jl sal_find_sel
cmp word[x_clic],150
jg sal_find_sel
mov word[y_sel_file],130
;Si el estado del menu sigue siendo 0, entonces se seguira revisando.
cmp byte[estado_menus],0
je try_again
;Iteracion principal
;donde se aumente Y en 20 y se pregunta si el clic fue en el archivo que
;esta mostrado a partir de esa posicion.
;En caso de ser asi, se llama a la funcion 'openfile' que abre el archivo
try_again:
inc word[file_num]
add word[y_sel_file],20
mov ax,[y_sel_file]
cmp word[y_clic],ax
jg try_again
dec word[file_num]
pintar_cuadro 0,21,340,600,[color_fondo_pant]
call openfile
jmp endingsel
;Marcamos el final de la seleccion y se colocan los estados
;definidos para esto.
endingsel:
mov word[file_num],0
mov word[estado_menus],7
jmp sal_find_sel
sal_find_sel:
popa
ret
;--------------------------------------------------
;END: (Encontrar el archivo seleccionado)
;-----------------------------
;--------------------------------------------------
;BEGIN: Secuencia (0-255)
;--------------------------------------------------
;-----Imprimir secuencia
imprime_seq255:
pusha
call clear_screen
__continua2:
mov si,0
mov cx,1
mov ax,1
mov bp,25 ;Y position
seqcont:
;--centenas
centenas_seq:
cmp cx,100
jl decenas_seq
mov bh,100 ;divisor
div bh ;dividimos
mov [di],ah
add ax,48
mov [char],ax
call fixFila2
mov [x_origen],si
mov [y_origen],bp
call print_char
add si,12
sub ax,48
mov ax,[di]
;-- fin centenas
;--decenas
decenas_seq:
mov bh,10 ;divisor
div bh ;dividimos
cmp cx,0
je unidades_seq
add ax,48
mov [char],ax
call fixFila1
mov [x_origen],si
mov [y_origen],bp
call print_char
add si,12
sub ax,48
;--fin decena
;--unidades
unidades_seq:
add ah,48
mov [char],ah
call fixFila
mov [x_origen],si
mov [y_origen],bp
call print_char
cmp ax,100
;--fin unidades
inc cx
mov ax,cx
add si,32
cmp ax,256
jne seqcont
mov byte[estado_menus],7
mov si,0
mov cx,0
mov ax,0
mov bp,0
popa
ret
;-----fin imprimir secuencia
;--Aumentar en y si nos pasamos del borde de la pantalla
;unidad
fixFila:
cmp si,800
jg action_fixFila
ret
action_fixFila:
mov si,0
add bp,22
ret
;decena
fixFila1:
cmp si,780
jg action_fixFila1
ret
action_fixFila1:
mov si,0
add bp,22
ret
;centena
fixFila2:
cmp si,760
jg action_fixFila2
ret
action_fixFila2:
mov si,0
add bp,22
ret
;--
;--------------------------------------------------
;END: Secuencia (0-255)
;--------------------------------------------------
;Este 'metodo' limpia la pantalla sin incluir el menu.
clear_screen:
pusha
pintar_cuadro 21,21,800,580,[color_fondo_pant]
popa
ret
;Aqui hacemos la finalizacion del programa.
_exit_:
mov ax,00h ;restaura el ratón a sus valores predeterminados
int 33h
mov ah,00h
mov al,03h
int 10h
ret
;----------------------------------------------------------------------------------
;Seccion de inicializacion de variables que se van a utilizar en el programa.
section .data
savess dw 0
savesp dw 0
ancho_letra dw 10
alto_letra dw 20
xmax dw 799
y_sel_file dw 0
file_num dw 0
sacame db 0
color_forma_char db 0x00f
color_fondo_pant db 0x000
color_fondo_menu db 0x002
color_cursor db 0x006
color_pintar db 0x000
estado_menus db 0
openstatus db 0
char db 0
letra times 200 db 0
pixels times 200 db 0
cadena times 81 db 0
cursor db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0
db 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0
db 0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0
db 0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0
db 0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0
db 0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0
db 0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0
db 0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0
db 0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0
db 0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
MarginBMP_X dw 5
MarginBMP_Y dw 200
boton_file db 'FILE',0
len dw $-boton_file
boton_edit db 'EDIT',0
boton_view db 'VIEW',0
boton_seq db 'IMPRIMIR_SECUENCIA_NUMEROS',0
boton_help db 'HELP',0
boton_exit db 'EXIT',0
file db 'USTED SELECCIONO LA OPCION FILE',0
edit db 'USTED SELECCIONO LA OPCION EDIT',0
view db 'USTED SELECCIONO LA OPCION VIEW',0
seq db 'USTED SELECCIONO LA OPCION IMPRIMIR_SECUENCIA_NUMEROS',0
help db 'USTED SELECCIONO LA OPCION HELP',0
exit db 'USTED SELECCIONO LA OPCION EXIT',0
archivo db 'Usted selecciono la opcion Archivo',0
file_archivo db 'Archivo ',0
file_program db 'Programa ',0
file_vacio db ' ',0
salir db 0
x_origen dw 0
res db '5120',0
y_origen dw 0
x_pixel dw 0
y_pixel dw 0
x_clic dw 0
y_clic dw 0
x_origen_cadena dw 0
y_origen_cadena dw 0
x_pintar dw 0
y_pintar dw 0
ancho_pintar dw 0
alto_pintar dw 0
filename times 81 db 0
bothersomTR dw 01000h
bmpIndex dw 0
bmpW dw 0 ;0x12
bmpH dw 0 ;0x16
bmpData dw 0 ;ah
RED db 0
GREEN db 0
BLUE db 0
DataSET db 0
;pos for file text
x_ini dw 40h
y_ini dw 40h
finalvar dw 0
bufferIDX db 0h
;--------------------------------------------------------------------------
;Seccion de variables no inicializadas que usaremos en el programa.
section .bss
read_len resw 01h
filehndl resw 01h
x_pos resw 01h
y_pos resw 01h
iobuf resb 03h
startEXE resw 0h