Vistas de página en total

Mostrando entradas con la etiqueta window. Mostrar todas las entradas
Mostrando entradas con la etiqueta window. Mostrar todas las entradas

miércoles, 11 de septiembre de 2013

COMANDO "TYPE"

    

  Con todo lo que he ido publicando en este blog hasta ahora, ya estamos en disposición de hacer el primer comando del sistema. En este caso voy a exponer el comando Type. Para evitar que choque con el comando interno del sistema vamos a llamarlo MyType.
      Este programa imprimirá un fichero sobre pantalla o sobre impresora. Y podremos hacerlo de forma continua o de forma paginada.
      Llevará como todos los comandos una ayuda implícita que podrá ser llamada a través de la línea de comandos con '/H', '/h', o '/?'. Cuando se introduzca alguno de estos comandos en la línea aparecerá la siguiente información.

      Este comando muestra el fichero especificado"
      Por Jose Angel Moneo"
      Formato: ver [unidad:][trayecto]fichero(s)        [/M] [/P][/H][/?]

                   /M ....Por páginas
                  /P .....Sobre impresora
                  /H o /?.......Ayuda

   En este caso el programa es muy sencillo. Solo tiene la rutina principal en la que analizamos y ejecutamos el comando y una subrutina para imprimir el fichero. Por lo tanto lo incluyo de forma íntegra en esta entrada.
   Es sencillo, no porque sea fácil hacer esto en ensamblador, sino porque ya dispongo de una librería de funciones y una estructura de programa suficientemente potente, para programar como si lo estuviera haciendo en alto nivel.
    La rutina principal lee la línea de comandos y analiza los parámetros pasados, para realizar posteriormente la acción correspondiente.
    Si no indicamos fichero en la línea de comandos, este Type, solicitará el fichero por ventana emergente mediante el windir.
    En el caso de que se pulse EXC y no se seleccione fichero en el windir, la función saldrá sin hacer nada.
    En una impresión paginada (/M) el fichero se irá imprimiendo, deteniendo el proceso al final de la pantalla y escribiendo "------MAS-----", para indicar que el fichero no ha terminado.
    Al final de proceso, siempre pedirá un CR antes de salir al sistema.

    En este caso, como se ve también he utilizado la macro FOR...NEXT, para realizar los bucles. Existe un SWITCH, en el programa que ha sido implementado de forma directa en ensamblador, ya que es muy simple. En la siguiente entrada creare una macro SWITCH...CASE, para poder ver como simplificar  el programa, aunque en este caso es innecesario, ya que está muy claro.


MYTYPE.ASM
; 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/>.

include io.mac
include argum.mac
include stdio.mac
include string.mac
include main.mac
include window.mac
include hi_level.mac

 .model compact,pascal

.stack 300

.data
dta _dta ?
mens1 db 10,13,"Par metro incorrecto",10,13,0
help db "Este comando muestra el fichero especificado"
     db 10,13,"Por Jose Angel Moneo"
     db 10,13,"Formato: ver [unidad:][trayecto]fichero(s)"
     db "   [/M] [/P][/H[/h] ",10,10,13, "    /M ....Por p ginas",10,13
     db "    /P .....Sobre impresora",10,13,0,"    /H o /? .....Ayuda",10,13,0

mens2 db "falta nombre de fichero",0
mens3 db "El fichero ",0
mens4 db " no existe.",0
mens6 db " No se puede abrir ",0
mens7 db "------------------ Presentando fichero ",0
mens8 db "------------------",10,13,0
mens9 db "-----------MAS----------",10,13,0
hay db 0
sw db 0
sw1 db 0
i db 0
salida dw 0
todo db "*.*",0
total db 40 dup (0)
camino db 40 dup (0)
buffer db 80 dup (0)
handle dw 0
ends

.code

Type proc far
        main
        setdta dta
        argc dl
        inc dl    ;inc 1 ya que cl empieza en 1   
  FOR cl,1,dl
        argv cl,si
        cmp byte ptr [si],'/'
        je switch1
        mov hay,1
        jmp fin_for1

switch1:
        mov ah,[si+1]
        cmp ah,'H'
        je irah
        cmp ah,'h'
        je irah
        cmp ah,'?'
        je irah
        cmp ah,'M'
        je iram
        cmp ah,'m'
        je iram
        cmp ah,'P'
        je irap
        cmp ah,'p'
        je irap

   default:
        puts mens1
        puts help
        exit 1
   irah:
        puts help
        exit 0
  iram:
        mov sw,1
        jmp fin_for1
  irap:
        mov sw1,1
  fin_for1:
     NEXT cl

        cmp hay,0
        jne cpsw
        setcursor off
        windir 5,20,todo,dta._nombre
        cmp dta._nombre,0
        je nada
        call presenta
        exit 0
  nada:
        exit 1

cpsw:
        cmp sw1,1
        jne pantalla
        mov salida,_stdprn
        mov sw,0
        jmp alfor2

Pantalla:
        mov salida,_stdout
alfor2:

   FOR CL,1,DL
       argv cl,si
       cmp byte ptr [si],'/'
       je fin_for2
       getpath camino,[si]
       findfirst [si],_archivo
       jnc presentar
       puts mens3
      
puts  [si]
      
puts mens4
       jmp fin_for2
Presentar:
        call presenta
in_while:
        findnext
        jc fin_for2
        call presenta
        jmp in_while
fin_for2:
   NEXT CL
        exit 0
type endp


presenta proc near
        push cx
        strcpy total,camino
        strcat total,total,dta._nombre
        open total,_r,handle
        jnc abierto
       
puts mens3
       
puts total
       
puts mens6
        pop cx
        ret

abierto:
        clrscr
       
puts mens7
       
puts total
       
puts mens8
        mov cx,3
in_buc:
        read handle,80,buffer
        mov bx,ax
        cmp bx,0
        je salir_buc
        mov si,0
 resto:
        cmp si,bx
        je fin_buc
        write salida,1,[buffer+si]
        cmp byte ptr [buffer+si],10
        pushf
        inc si
        popf
        jne resto
        inc cx
        cmp cx,23
        jne resto
        cmp sw,1
        jne resto
       
puts mens9
        getch al
        mov cx,1
fin_buc:
        jmp in_buc
salir_buc:
        close handle
        getch al
        pop cx
        ret
presenta endp
end type


lunes, 9 de septiembre de 2013

EJEMPLO DE WINDIR Y LINEA DE COMANDOS DOS

    Lo que puse en la última entrada era una librería. Para poder usarla hace falta un programa.
    Este es, pues, un programa ejemplo de uso de la función windir.
    A la función se le pasa  la máscara a buscar y la función presenta los ficheros que encajen con la máscara, permitiendo seleccionar un fichero.
     Cuando se sale de windir, si se seleccionó un fichero, este se almacena en el buffer indicado en el parámetro file, y por lo tanto, lo podemos imprimir en pantalla.
   En este programa se usa la librería argum, de forma que podemos dar la máscara de búsqueda a través de la línea de comandos al llamar al ejecutable. Ejm wdir_ej    *.exe
   La máscara indicada en la línea de comandos será usada como máscara de búsqueda en windir. Si no indicamos nada se busca *.*.
  
   Este programa es pues el primero que pongo con recogida de datos de la línea de comandos.





WDIR_EJ.ASM
; 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/>.


include main.mac
include stdio.mac
include window.mac
include argum.mac

.model compact,pascal
.stack 200

.data
files db "*.*",0
file db 20 dup (0)
retor db 10,13,0

.code

p proc far
     main                 ;inicializa programa
     argc dl              ; comprueba si hay argumentos en la línea de comandos
     cmp dl,0
     jne seguir
     mov si,offset files
     jmp presenta

seguir:
     argv 1,si          ;recoje el primer argumento

presenta:
     windir 5,20,[si],file     ; llama a la función de directorio indicándole la máscara
     printf retor                  ;Imprimer un return
     printf file                      ; imprime el fichero
     ret
p endp
end p

sábado, 7 de septiembre de 2013

WINDIR


   Hoy voy a colocar una función que la hice como parte de la librería window, para presentar, de forma emergente, una ventana para la búsqueda de un fichero.
    La función presenta en pantalla una ventana emergente con los ficheros a buscar, y permite mediante los cursores, desplazarse arriba y abajo por ellos para seleccionar el deseado.
   Esta función es un ejemplo más complejo del uso de todas las funciones que he ido implementando en el blog. Aquí incluyo ya funciones de acceso a fichero. Como se va viendo, el uso de las macros para nombrar de forma diferente las llamadas a las funciones resulta muy cómodo para luego leer el programa.
    Igualmente, en esta función aparece un bucle que he implementado con la macro for



   Con esta función se tiene una forma cómoda de abrir ficheros. Es la implementación de una función equivalente a  OpenFileDialog de windows actual, pero hecha en modo texto y en ensamblador en la época de windows 11.
    Se puede añadir las barras de scroll a la derecha y hacer las implementaciones del ratón, pero para lo que necesitaba me era funcional y rápido tal y como está.
     Devuelve el fichero seleccionado.
     Hice dos versiones, una con memoria dinámica y otra con memoria en disco. Debido a que ahora no funciona la reserva de memoria dinámica por culpa de windows, he colocado la versión de disco.
   Esta versión almacena los ficheros encontrados en un fichero temporal, para poder usarlos durante los scroll. Resultaba más lenta y la abandoné, pero ahora es la única manera de reservar memoria, usando swaping en disco



WINDIR.ASM
; 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/>.


include main.mac
include dos.mac
include window.mac
include stdio.mac
include io.mac
include string.mac

.model compact,pascal

.data
buffer db 400 dup (0)
ffblk _dta ?
temporal db "temporal.tmp",0
handle dw 0
indice dw 0
seleccionado db 0
op db 0
nficheros dw 0
limpia db 14 dup (' '),0

.code
public _windir
_windir proc near uses bx cx dx si di,FsCiz,mascara,fichero,color
     mov bx,fichero
     mov [bx],byte ptr 0
    ;clacula las coordenadas de la ventana
    mov cx,FsCiz 
    mov dx,cx
    add dx,0A11h
    getwindow ch,cl,dh,dl,buffer ; salva el area de pantalla
    mov si,mascara
     ;   se da el dato de puntero a traves de si por usarse lea en la macro  
    draw_win ch,cl,dh,dl,[si]  
    setdta ffblk
    new_file temporal,_archivo,handle
    jnc seguir
    exit 1

seguir:
    mov nficheros,0
    findfirst [si],_TODOS
    jc find 
    mov cx,size ffblk
    otro: write handle,cx,ffblk
    inc nficheros
    findnext
    jnc otro
    find:
    close handle

     mov indice,0
    mov seleccionado,0
    open temporal,_R,handle

nuevalista:
     mov ax,FsCiz
     push ax
     call printlista
     opcion:
     getch op
     cmp op,27
     jne no_esc
     jmp escapar
no_esc:
    cmp op,0
    je opcion
    cmp op,13
    je fin
    cmp op,80
    jne sube
    call bajar
    jmp nuevalista
sube:
    cmp op,72
    jne pgup
    call subir
    jmp nuevalista
pgup:
    cmp op,81
    jne gdn
    call pagup
    jmp nuevalista
gdn:
    cmp op,73
    jne nada
    call pagdn
    jmp nuevalista
nada:
     jmp opcion

fin:
     mov al,seleccionado
     cbw
     add ax,indice
     mov dx,ax
     rseek handle,dx,ffblk
     mov cx,size ffblk
     read handle,cx,ffblk
     mov bx,fichero
     cmp nficheros,0
     jz escapar
     strcpy [bx],ffblk._nombre

escapar:
     close handle
     delete temporal
     mov cx,FsCiz
     mov dx,cx
     add dx,0A11h
     putwindow ch,cl,dh,dl,buffer ;repone el area de pantalla
     ret
_windir endp
pagup proc near
    mov ax,indice
    add ax,9
    cmp ax,nficheros
    jae n_pagup
    mov indice,ax
n_pagup:
    ret
pagup endp
pagdn proc near
     mov ax,indice
     sub ax,9
     cmp ax,0
     jg a_pagdn
     mov ax,0
a_pagdn:
     mov indice,ax
     ret
pagdn endp
subir proc near
     cmp seleccionado,0
     je su1
     dec seleccionado
      jmp su3
su1:
      cmp indice,0
      je su3
     dec indice
su3:
     ret
subir endp
bajar proc near
     xor ax,ax
     mov al,seleccionado
     add ax,indice
     inc ax
    cmp ax,nficheros
    jae b3
    cmp seleccionado,8
    jae b1
    inc seleccionado
    jmp b3
b1:
    inc indice
b3:
    ret
bajar endp
printlista proc near uses bx cx dx, FsCiz
      mov bx,FsCiz
     inc bl
     inc bl
     inc bh
     mov cx,9 
     cmp nficheros,cx
     ja toda
     mov cx,nficheros
toda:
     cmp cx,0
     je fin_lista
     mov dx,size ffblk
     rseek handle,indice,ffblk
lista:
     gotoxy bl,bh
     puts limpia
     read handle,dx,ffblk
     cmp ax,0
     je ot_n
     gotoxy bl,bh
     puts ffblk._nombre
ot_n:
     inc bh
     loop lista
fin_lista:
     mov bx,FsCiz
     inc bh
     inc bl
     mov dx,bx
     add dx,080fh
     wincolor bh,bl,dh,dl,normal
     add bh,seleccionado
     wincolor bh,bl,bh,dl,inverso
     ret
printlista endp

end

miércoles, 28 de agosto de 2013

EJEMPLO DE WINDOW

    Vamos a practicar todo lo anterior.   

    Este es un ejemplo de uso de las ventanas. En este ejemplo vamos a llenar la pantalla con mesajes a través del bucle For...Next. Esperamos pulsación  para luego tomar el fondo de pantalla con getwindow. Posteriormente dibujaremos una ventana con el título "Prueba"mediante draw_win. Esperamos a pulsar y reponemos el fondo original mediante putwindow.




PWINDOW1.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/>.
 
include main.mac
include stdio.mac
include window.mac
include hi_nivel.mac


.model compact,pascal
.stack 200

.data
 ; Tamaño de la ventana  20-5=15 por lo que debemos reservar una mas 16  dw caracter y color
 buffer   dw 16*16 dup (0)   
 valor db 3
 Texto db "Prueba",0
.code

p proc far
        main     
  for valor,0,15
      gotoxy 10,valor
      puts texto
   next valor 
        getch al
        getwindow 5,5,20,20,buffer
        draw_win 5,5,20,20,texto
        getch  al
        putwindow 5,5,20,20,buffer

        exit 0
p endp

end p