Como siempre, primero la cabecera con las macros y las constantes asociadas a su manejo.
Esta cabecera es muy importante, pues sus funciones son utilizadas, junto con las de SYDIO y WINDOW para todos los programas complejos.
La funciones open, close y newfile no se implementan en librerías, pues cuando se usan en un programa no se suelen repetir mucho, por lo que no vale la pena el gasto de código extra para paso de parámetros, frente al tamaño de la macro. Por ello lo mantengo como macro.
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
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
setdta macro posicion
mov ah,1ah
PUSH DX
lea dx,posicion
int 21h
POP DX
endm
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
getpath macro camino,path
ifndef _getpath
extrn _getpath:near
endif
lea ax,camino
push ax
lea ax,path
push ax
call _getpath
endm