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.