Vistas de página en total

jueves, 22 de agosto de 2013

TRABAJO CON VENTANAS (WINDOW.MAC)



  Siguiendo la filosofía de este blog, voy a aumentar el nivel de presentación  generando más opciones para mi librería.
    Seguimos trabajando con TASM 2.0, y bajo DOS. Vuelvo a repetir que sabemos que todo esto está superado si utilizamos MASM 11, o WinASM, esto lo realicé en 1995, pero aquí trato de mostrar como hacer algo de la nada. Ahora se aprovecha lo que ya está hecho.
    Dado que ahora los ordenador han cambiado mucho en hard y soft, muy a menudo me he encontrado  en la necesidad de usar ordenadores antiguos, para manejar ciertos software implantado hace años o comunicar con ciertas máquinas antiguas.
    Por ello seguiré con TASM 2.0 y Dos. En el caso de la reserva de memoria dinámica, que deberíamos de utilizar para el manejo de ventanas, resulta inoperante si trabajamos bajo windows. El servicio 48h de la interrupción 21h no reserva más de 7 bloques en windows. Por lo tanto si queremos usar este servicio el programa tiene que correr en MS-Dos.
    Para compensar esto cuando llegue a este punto, aunque diré como hacerlo con memoria dinámica, lo haré con memoria estática y Swaping.
   
      Ahora vamos a ver la cabecera de Window.mac. Con ella crearé unas pequeñas funciones para trabajo con ventanas en modo texto en dos.
   
     En esta cabecera definimos colores y las siguientes llamadas
   
windowup - Hace scroll de la ventana hacia arriba
windowdown- Hace scroll de la ventana hacia abajo
getwindow - Toma una área de pantalla y la salva en memoria
putwindow - Toma una zona de memoria y la vuelca en pantalla
window - Dibuja una ventana con su testo de cabecera
wincolor - Cambia el color de una ventana
windir - Realiza un dir sobre una ventana emergente, para seleccionar un fichero


WINDOW.MAC 
; Copyright (C) 2013  José Ángel Moneo Fernández

;    This program is free software: you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;   (at your option) any later version.

;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.

;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <http://www.gnu.org/licenses/>.

ifndef _colores
     _colores equ 1
parpadeo equ 80h
intenso equ 0fh
normal equ 7
subrayado equ 1
inverso equ 70h

negro equ 0
azul equ 1
verde equ 2
cian equ 3
rojo equ 4
magenta equ 5
marron equ 6
gris_claro equ 7
gris_obscuro equ 8
Azul_Claro equ 9
verde_claro equ 10
cian_claro equ 11
rojo_claro equ 12
magenta_claro equ 13
amarillo equ 14
blanco equ 15
endif



;scrool down area de pantalla
;windowdown 10,10,50,50,[lineas]
; si lineas no existe se hace un scrool total
windowup macro Fs,Ciz,Fin,Cde,lineas
ifndef _cls_window
        extrn _cls_window:near
endif

        mov al,Ciz
        mov ah,Fs
        push ax
        mov al,Cde
        mov ah,Fin
        push ax
        mov ah,_color
ifb <lineas>
        mov al,0
else
        mov al, lineas
endif
        push ax
        mov al,1
        call _cls_window

endm

;scrool down area de pantalla
;windowdown 10,10,50,50,[lineas]
; si lineas no existe se hace un scrool total
windowdown macro Fs,Ciz,Fin,Cde,lineas
ifndef _cls_window
        extrn _cls_window:near
endif
        mov al,Ciz
        mov ah,Fs
        push ax
        mov al,Cde
        mov ah,Fin
        push ax
        mov ah,_color
ifb <lineas>
        mov al,0
else
        mov al, lineas
endif
        push ax  
        mov al,2
        call _cls_window

endm

;borra la ventana mediante un scroll
clswindow macro   Fs,Ciz,Fin,Cde
    windowup  Fs,Ciz,Fin,Cde
      
endm

;toma el area de una ventana
getwindow macro Fs,Ciz,Fin,Cde,direc
ifndef _get_put_window
        extrn _get_put_window:near
 endif
        mov al,Ciz
        mov ah,Fs
        push ax
        mov al,Cde
        mov Ah,Fin
        push ax
        lea ax,direc
        push ax
        mov ax,0
        push ax          ;opción 0 get 1 put  2 color
        call _get_put_window

  endm

;repone el area de una ventana
putwindow macro Fs,Ciz,Fin,Cde, direc
ifndef _get_put_window
        extrn _get_put_window:near

 endif
        mov al,Ciz
        mov ah,Fs
        push ax
        mov al,Cde
        mov Ah,Fin
        push ax
        lea ax,direc
        push ax
        mov ax,1
        push ax          ;opción 0 get 1 put  2 color     
        call _get_put_window

  endm

draw_win macro Fs,Ciz,Fin,Cde,Texto
ifndef  _window
      extrn _draw_win:near
endif
        mov al,Ciz
        mov Ah,Fs
        push ax
        mov al,cde
        mov ah,Fin
        push ax

        lea ax,texto
        push ax
        mov ax,_color
        push ax
        call _draw_win


endm

wincolor macro Fs,Ciz,Fin,Cde,color
ifndef   _wincolor
        extrn _get_put_window:near
endif
        mov al,Ciz
        mov ah,Fs
        push ax
        mov al,Cde
        mov ah,Fin
        push ax
        mov ax,color
        push ax
        mov ax,2
        push ax          ;opción 0 get 1 put 2 color
        call _get_put_window

  endm

windir macro Fs,Ciz,mascara,fichero
ifndef _windir
        extrn _windir:near
endif
        mov al,ciz
        mov ah,Fs
        push ax
        lea ax,mascara
        push ax
        lea ax,fichero
        push ax
        mov ax,_color
        push ax
        call _windir

endm




No hay comentarios:

Publicar un comentario

Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.