Esto, también, es un paso
previo para la próxima entrada en la que usaremos estas funciones para
crear funciones de manejo del 8050, como puerto serie, creando un nivel de
enlace mediante dos funciones getcaux, putcaux.
Con estas últimas
crearé un protocolo DH+ Network, para usar de forma sencillas en nuestras
aplicaciones de comunicación serie, creando un nivel de transporte con las
funciones send_dh y recive_dh.
Estas nuevas funciones nos
servirán así mismo, para manejar el puerto CENTRONICS.
En posteriores entradas
veremos cómo usarlo para manejar hadware acoplado a él.
Para dar más cache al
blog incluiré algo de hardware, para acoplar al puerto centronics y así
poder convertir el ordenador en osciloscopio, analizador, o autómata a través
del puerto Centronics.
Ahora simplemente
ampliaremos la cabecera IO.MAC, con estas dos funciones. Incluyo toda la
cabecera nueva.
Estas funciones las
añado a IO, por considerar esta cabecera como una de Entrada-Salida no estándar,
entendiendo como estándar el teclado y la pantalla.
Indico en rojo lo nuevo
IO.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/>.
; constantes para manejo de unidades
ifndef _unidades
_unidades equ 1
;unidades
_A equ 0
_B equ 1
_C equ 2
_D equ 3
endif
; constantes para manejo de archivos
ifndef _atributos
_atributos equ 1
;;atributos de fichero
_O_READ equ 1
_HIDE equ 2
_SISTEM equ 4
_VOL equ 8
_DIR equ 16
_ARCHIVO equ 32
_TODOS equ 00111111B
endif
;posiciones de fseek
_INICIO EQU 0
_FIN EQU 2
_ULTIMA EQU 3
;; modos de acceso
_R EQU 0
_W EQU 1
_R_W EQU 2
;;Estructuras
_DTA struc
_RES_DTA DB 21 DUP (?)
_ATTR DB ?
_HORA DW ?
_FECHA DW ?
_LONG DD ?
_NOMBRE DB 13 DUP (?)
ENDS
;dispositivos standar
_stdin equ 0
_stdout equ 1
_stderr equ 2
_stdaux equ 3
_stdprn equ 4
;; file direccion cadena ascii fichero
;;handle numero de fichero o codigo de retorno
;;atributo es el tipo de fichero
;;si cf =1 error
;;si cf=0 ax es numero de fichero
newfile macro file,atributo,handle
mov ah,3ch
push cx
push dx
mov cx,atributo
lea dx,file
int 21h
pop dx
pop cx
mov handle,ax
endm
;abre un fichero.
; devuelve cf=0 si ok y el handle en la variable handle
;devuelve cf=1 si error y el error en la variable handle
open macro file,atributo,handle
mov ah,3dh
mov al,atributo
push dx
lea dx,file
int 21h
pop dx
mov handle,ax
endm
close macro handle
mov ah,3eh
push bx
mov bx,handle
int 21h
pop bx
endm
;;fichero encontrado esta escrito en la zona DTA
;; offset descripcion
;; 0 reservado para dos
;; 21 atributo de fichero encontado
;; 22 hora
;; 24 fecha
;; 26 tamaño
;; 30 nombre del fichero y extension
;; devuelve CF=1 si hay error
findfirst macro file,atributo
ifndef _find_first
extrn _find_first:near
endif
lea ax,file
push ax
mov ax,atributo
push ax
call _find_first
endm
findnext macro
ifndef _find_next
extrn _find_next:near
endif
call _find_next
endm
;; posicion en un fichero el puntero
;; cx marca la parte alta de la direccion
;; para hacerlo mas sencillo nos limitaremos a 65535 bytes por lo que
;; cx=0
;; el metodo es
;; 0 principio fichero
;; 1 desde la posicion actual
;; 2 desde final de fichero
;; devuelve en dx:ax la direccion en que se ha quedado referida al principo del fichero
fseek macro handle,metodo,posicion
ifndef _fseek
extrn _fseek:near
endif
mov ax,handle
push ax
mov ax,metodo
push ax
mov ax,posicion
push ax
call _fseek
endm
;;obtine direcion de transferencia de disco
;;devuelve en ax un codigo de retorno
;;devuelve en es:bx direccion de DTA
offsetdta macro
mov ah,2fh
int 21h
endm
;READ y WRITE devuelven en ax el número de bytes leidos
;realmente.
read macro handle,n_bytes,buffer
ifndef _read
extrn _read:near
endif
mov ax,handle
push ax
mov ax,n_bytes
push AX
mov ax,offset buffer
push ax
call _read
endm
;lee de un fichero
rseek macro handle,numero,registro
ifndef _rseek
extrn _rseek:near
endif
mov ax,handle
push ax
mov ax,numero
push ax
mov ax,size registro
push ax
call _rseek
endm
; indica el DTA
setdta macro posicion
mov ah,1ah
PUSH DX
lea dx,posicion
int 21h
POP DX
endm
;escribe en un fichero write macro handle,n_bytes,buffer
ifndef _write
extrn _write:near
endif
mov ax,handle
push ax
mov ax,n_bytes
push AX
lea ax,buffer
push ax
call _write
endm
;Toma el path de un camino getpath macro camino,path
ifndef _getpath
extrn _getpath:near
endif
lea ax,camino
push ax
lea ax,path
push ax
call _getpath
endm
; envía un dato a un puerto IO
poke macro direc,dato
push dx
mov dx,direc
mov al,dato
out dx,al
pop dx
endm
;lee un dato de un puerto IO
peek macro direc
push dx
mov dx,direc
in al,dx
pop dx
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.