home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1996 February
/
PCWK0296.iso
/
sharewar
/
dos
/
program
/
tdsk22sr
/
bitdisk.asm
next >
Wrap
Assembly Source File
|
1995-06-21
|
66KB
|
1,485 lines
;┌───────────────────────────────────────────────────────────────────┐
;│ │
;│ BITDISK 1.1 - Source code for the 256-bytes Resizeable Ramdisk │
;│ │
;│ 100% freeware - 100% public domain │
;│ │
;│ (C) 1994-1995 Ciriaco García de Celis Email: ciri@gui.uva.es │
;│ Grupo Universitario de Informática Fidonet: 2:341/21.8 │
;│ Facultad de Ciencias │
;│ Universidad de Valladolid (Spain) │
;│ │
;│ ■ Contributions to save memory, and German messages by: │
;│ Axel Christoph Frinke <acfrinke@uni-bonn.de> │
;│ ■ Switchar support added by │
;│ Matthias Paul <mpaul@ibh.rwth-aachen.de> │
;│ │
;│ The world's smallest resizeable RamDisk driver for DOS/WINDOWS │
;│ │
;│ - Only takes 256 bytes of conventional/upper memory!! │
;│ - Supports XMS memory. Only for AT or better. │
;│ - 100% English, Spanish and German messages. │
;│ - Based on XDISK driver (published in spanish PC-WORLD │
;│ edition, June 1993) and TDSK (article from spanish │
;│ edition of Microsoft Systems Journal, November 1992). │
;│ │
;│ Assembly with TASM/MASM and link with TLINK/LINK │
;│ No warranties for damages or malfunction │
;│ │
;└───────────────────────────────────────────────────────────────────┘
; ------------ Please excuse spanish comments in some source
; sections, if you don't understand them well.
.286 ; only 286 or better CPU
XPUSH MACRO regmem ; push a list of registers
IRP rm, <regmem>
PUSH rm
ENDM
ENDM
XPOP MACRO regmem ; pop a list of registers
IRP rm, <regmem>
POP rm
ENDM
ENDM
; ************ Ramdisk: Init of resident area.
_BITDISK SEGMENT
ASSUME CS:_BITDISK, DS:_BITDISK
DD -1 ; chain with other device drivers
DW 0 ; attributes word
DW estrategia ; strategy routine
DW interrupcion ; interrupt routine
DB 1 ; number of drives
cs_bitdisk DW ?
id_bitdisk DB "BDK" ; this is BITDISK
letra_unidad DB ? ; ASCII drive letter of disk ('C',...)
status EQU BYTE PTR StatPtr+2
; 0: disk not formatted
; 1: used XMS 2.0+ memory
; 0FFh: INIT still not run
cambiado EQU BYTE PTR cambptr+3
; after formatting the RamDisk is set
; to 0FFh (to mean "disk change")
drv_media EQU 0FAh ; media descriptor byte
bpb_ptr DW bpb ; points to disk BPB
bpb LABEL BYTE ; These BPB values are arbitrary, but
bytes_sector DW 512 ; they are correct (if not, DOS may
sect_cluster DB 1 ; hang while loading the device driver
sect_reserv DW 1 ; and performing its internal calcs).
num_fats DB 1
entradas_raiz DW 128
num_sect DW 128
media_byte DB drv_media
sectores_fat DW 4
fin_bpb EQU $
; ------------ Strategy and interrupt routines of RamDisk.
; Important: It is assumed that DOS calls first the
; strategy routine, and then (without
; modifying ES:BX) the interrupt one.
interrupcion PROC FAR
PUSHA ; *
PUSH DS ; **
PUSH ES
POP DS ; DS:BX -> request header
XPUSH <BX, DS>
MOV AX,2 ; AH = 0, AL = 2
StatPtr: CMP AH,0FFH ; patched area (location of status)
JE exit_error ; unformatted disk: error
XLAT ; AX = [BX+2] = order (AH = 0)
patch_init: JMP init ; after install: XOR BP,BP/DEC AX
JNZ no_media_chk ; the order is not 1
cambptr: MOV BYTE PTR [BX+14],0; patched area (location of cambiado)
MOV CS:cambiado,1 ; the disk will not change more...
JMP exit_ok
no_media_chk: DEC AX
JNZ no_build_bpb ; the order is not 2
MOV WORD PTR [BX+18],OFFSET bpb
MOV [BX+20],CS
exit_ok: MOV AX,100h
JMP exit_
no_build_bpb: SUB AL,6
JZ prep_io ; order 8: write (BP=0)
DEC AX
JZ prep_io ; order 9: write verify
INC BP
ADD AL,5
JZ prep_io ; order 4: read (BP=1)
MOV AL,3 ; unsupported order
exit_error: MOV AH,81h
exit_: XPOP <DS, BX>
exit_final: MOV [BX+3],AX
POP DS ; **
POPA ; *
estrategia: RET
interrupcion ENDP
; prepare registers for I/O
prep_io: LES DI,[BX+14] ; * buffer adrress in ES:DI
LDS AX,[BX+18] ; number of sectors in AX
MOV BX,DS ; first sector, DS undefined!
direct_io: MOV SI,CS:bytes_sector
ADD AX,BX
JNC io_ok? ; last sector < 65536
io_no_ok: MOV AL,8 ; «sector not found»
JMP exit_error
io_ok?: CMP AX,CS:num_sect
JA io_no_ok ; ending sector outside!
SUB AX,BX
MUL SI ; DX(CF):AX = block size
RCR AX,1 ; CF:AX/2 -> AX = words
MOV CX,DI
NEG CX ; 10000h-CX: CF=1 if CX<>0
CMC ; CF:CX bytes to the end of
RCR CX,1 ; segment = (10000h-DI)/2
CMP AX,CX
JAE io_cx_ok
MOV CX,AX ; * size: CX words
io_cx_ok: JCXZ io_no_ok ; CX=0 if DI=0FFFFh (fatal)
MOV AX,BX ; initial sector
MUL SI ; * offset in DX:AX
DEC BP ; read/write in the disk
JNZ xms_escribe
XPUSH <ES,DI,BP> ; segm:offs and destination handle
xms_escribe: XPUSH <DX,AX> ; offset DX:AX
DB 68h ; opcode of «PUSH inmediate»
xms_handle DW ? ; source/destination handle
JZ xms_general
INC BP ; this makes BP = 0
XPUSH <ES,DI,BP> ; segm:offs and source handle
xms_general: SHL CX,1 ; words -> bytes
RCL BP,1 ; BP was 0
XPUSH <BP,CX> ; block size in BP:CX
MOV SI,SP
PUSH SS
POP DS ; DS:SI pointing to stack
MOV AH,0Bh ; function to move EMB
DB 9Ah ; opcode of CALL FAR SEG:OFF
xms_driver LABEL DWORD ; address of XMS driver
xms_desp DW ?
xms_segm DW ?
ADD SP,16 ; equilibrate stack
SHR AX,1 ; bit 0 from AX -> CF
JC exit_ok
trans_error: XPOP <DS, BX>
MOV WORD PTR [BX+18],AX ; 0 sectors moved (AX=0)
MOV AX,810Ch ; error code
JMP exit_final
; <<< Ends of resident code for RamDisk >>>
; ************ Instalación (desde CONFIG.SYS).
init PROC
MOV WORD PTR CS:patch_init,0ED31h ; código XOR BP,BP
MOV BYTE PTR CS:patch_init+2,48h ; código DEC AX
INC CS:status ; 0: disco no formateado
MOV CS:cs_bitdisk,CS ; inicializar esa variable
MOV BYTE PTR [BX+13],1 ; una unidad de disco
LEA AX,bpb_ptr
MOV [BX+18],AX
MOV [BX+20],CS ; inicializado puntero BPB
MOV AL,[BX+22] ; unidad en DOS 3.0+
ADD AL,'A'
PUSH CS
POP DS
MOV letra_unidad,AL ; guardar letra de unidad
MOV inf_drv_conf,AL
LEA DX,install_txt
CALL imprimir
LEA DX,inf_drv_conf
CALL imprimir
XPOP <DS, BX> ; DS:BX -> request header
XPUSH <BX, DS>
MOV WORD PTR [BX+14],OFFSET init ; área residente
MOV [BX+16],CS
JMP exit_ok
init ENDP
; ************ Redefinición (invocada desde el AUTOEXEC.BAT o el DOS).
main PROC FAR
MOV AX,_BITDISK ; programa de un segmento
MOV DS,AX ; DS: -> _BITDISK
MOV BX,81h ; ES:BX línea de órdenes
CALL ges_param ; procesar parámetros
CMP param_h,ON
JE exit_instalar ; piden ayuda
MOV AX,DS
MOV ES,AX ; ES: --> _BITDISK
CALL reside_bitdsk? ; ¿instalado BITDISK?
CMP segm_bitdisk,0
JE salida_fatal ; no instalado aún
MOV ES,segm_bitdisk ; ES: --> disco residente
TEST lista_err,ERROR0 ; ¿error sintaxis?
JNZ exit_instalar ; sí: no modificar disco
CMP param_unidad,0
JE disco_defecto ; no indicada letra unidad
CALL obtener_segm ; segmento de la unidad
JC salida_fatal ; fallo (no es un BITDISK)
disco_defecto: CMP param_tdiscof,ON
JNE exit_instalar ; no indicado nuevo tamaño
CMP ES:status,0
JE cont_instalar ; no estaba formateado aún
CALL desinstala ; liberar memoria ocupada
cont_instalar: CALL info_xms ; evaluar memoria XMS
CMP tdisco,0 ; ¿se reservará memoria?
JE exit_instalar ; no: no hay más que hacer
CALL reserva_xms ; reservar memoria
JC exit_instalar ; fallo reservando memoria
CALL params_disco ; adaptar parámetros disco
CALL formatear ; BOOT, FAT y ROOT
exit_instalar: CALL info_bitdisk ; informar sobre el disco
MOV AX,4C00h
INT 21h ; final
salida_fatal: LEA DX,bitdisk_noins
JNC mens_ok
LEA DX,bitdisk_noes
mens_ok: CALL imprimir
MOV AX,4C00h
INT 21h
main ENDP
; ------------ Leer los parámetros de la línea de comandos (ES:BX).
ges_param PROC
CALL swc_patch ; align to switchar
CALL busca_param ; saltar delimitadores
JC fin_param ; no hay más parámetros
swchr0: CMP AX,"i/"
JE cod_tel
swchr1: CMP AX,"?/"
JE si_ayuda
swchr2: CMP AX,"h/"
JNE no_ayuda
si_ayuda: MOV param_h,ON
JMP fin_param
cod_tel: ADD BX,3
CMP BYTE PTR ES:[BX-1],'='
JE p_id_ok
CMP BYTE PTR ES:[BX-1],':'
JE p_id_ok
p_id_ok: CALL obt_num ; leer código telefónico
MOV param_i,ON
MOV codigo_tfno,AX
JMP ges_param
no_ayuda: CMP AH,':'
JNE no_unidad
AND AL,255-32 ; poner en mayúsculas
MOV param_unidad,AL
ADD BX,2
CALL busca_param
JC fin_param
no_unidad: CALL obt_num
MOV param_tdisco,AX ; es numérico: tamaño del disco
MOV param_tdiscof,ON ; parámetro de tamaño indicado
CALL busca_param
JC fin_param
CALL obt_num
MOV param_tsect,AX ; tamaño de sector
CALL busca_param
JC fin_param
CALL obt_num
MOV param_tdir,AX ; entradas al directorio
CALL busca_param
JC fin_param
CALL obt_num
MOV param_tcluster,AX ; tamaño de cluster
fin_param: CALL validar
RET
ges_param ENDP
validar PROC
MOV AX,param_tdisco ; ¿números correctos?
OR AX,param_tsect
OR AX,param_tdir
OR AX,param_tcluster
CMP AX,0FFFFh
JE sintax_err
CMP param_tdisco,0
JE valida_tsect ; no indicado tamaño (o 0)
CMP param_tdisco,4
JB sintax_err
CMP param_tdisco,32768
JA sintax_err
valida_tsect: CMP param_tsect,0
JE valida_tclus ; no indicado tamaño de sector
CMP param_tsect,64
JE valida_tclus
CMP param_tsect,128
JE valida_tclus
CMP param_tsect,256
JE valida_tclus
CMP param_tsect,512
JNE sintax_err
valida_tclus: CMP param_tcluster,256
JB fin_validar
sintax_err: MOV param_tdiscof,OFF ; no definir disco ahora
MOV param_tdisco,0
MOV param_tsect,0
MOV param_tdir,0
MOV param_tcluster,0
OR lista_err,ERROR0 ; aviso de error de sintaxis
fin_validar: RET
validar ENDP
busca_param PROC ; saltar delimitadores
DEC BX
p_delimit: INC BX
MOV AX,ES:[BX]
CMP AL,' '
JE p_delimit ; espacio en blanco
CMP AL,9
JE p_delimit ; tabulador
CMP AL,13
JE p_final ; CR ó LF indican el final
CMP AL,10
JE p_final
OR AX," " ; poner en minúsculas
CLC
RET
p_final: STC ; se acabaron los parámetros
RET
busca_param ENDP
obt_num PROC ; leer número: devolver 65535
XPUSH <CX,DX,SI> ; si hay error
XOR AX,AX ; número en proceso de creación
otro_digito: MOV CL,ES:[BX]
CMP CL,'0'
JB no_digito
CMP CL,'9'
JBE digito_ok
no_digito: CMP CL,' ' ; posibles delimitadores...
JE fin_num
CMP CL,9
JE fin_num
CMP CL,13
JE fin_num
CMP CL,10
JE fin_num
swchr3: CMP CL,'/'
JE fin_num
JMP num_incorr
digito_ok: XOR DX,DX
MOV SI,10
MUL SI ; AX = AX * 10
JC num_incorr
XOR CH,CH
SUB CL,'0'
ADD AX,CX ; AX = AX + dato
JC num_incorr
INC BX
JMP otro_digito
num_incorr: MOV AX,65535 ; indicar valor incorrecto
fin_num: XPOP <SI,DX,CX>
RET
obt_num ENDP
swc_patch PROC
XPUSH <AX,CX,DX,DI,ES>
MOV DL, '/' ; assume default, if no switchar-supported
MOV AX, 3700h
INT 21h
CMP AL, 00h ; should indicate 'function supported'
JNE swc_nosup
CMP DL, ' ' ; couldn't be valid switchar below space
JNA swc_nosup
MOV BYTE PTR [swchr0+1],DL
MOV BYTE PTR [swchr1+1],DL
MOV BYTE PTR [swchr2+1],DL
MOV BYTE PTR [swchr3+2],DL
MOV AL, '/'
CLD
MOV DI, OFFSET bitdisk_noins
MOV CX, bitdisk_noes-bitdisk_noins; length
PUSH CS
POP ES
swc_loop: REPNZ SCASB ; adapt this, if the help pages text will
CMP BYTE PTR [DI], '?'; change in the future.
JNE swc_nosup ; by the moment it scans only for '/?'
MOV BYTE PTR [DI-1],DL; replace occurence with current switchar
CMP CX, 0
JA swc_loop
swc_nosup: XPOP <ES,DI,DX,CX,AX>
RET
swc_patch ENDP
; ------------ Obtener el segmento de la unidad BITDISK indicada.
obtener_segm PROC
CALL lista_drv
LEA SI,area_trabajo-4
busca_ultimo: ADD SI,4
CMP WORD PTR [SI],0
JNE busca_ultimo ; realmente, el primero
recorre_dsks: SUB SI,4
CMP SI,OFFSET area_trabajo
JB bitdsk_no_hay
CMP BYTE PTR [SI+3],1
JNE recorre_dsks
PUSH DS
MOV DS,[SI]
MOV AL,letra_unidad
POP DS
CMP AL,param_unidad ; disco BITDISK ¿es el buscado?
JNE recorre_dsks
MOV letra_unidad,AL ; inicializar letra de unidad
MOV AX,[SI]
MOV segm_bitdisk,AX ; inicializar segmento
MOV ES,AX
CLC
RET
bitdsk_no_hay: STC
RET
obtener_segm ENDP
; ------------ Verificar la presencia en memoria de BITDISK.
reside_bitdsk? PROC
XPUSH <AX,DX,SI>
CALL lista_drv
LEA SI,area_trabajo-4
busca_final: ADD SI,4
CMP WORD PTR [SI],0
JNE busca_final ; ir al final de la tabla
busca_bdsk: SUB SI,4
CMP SI,OFFSET area_trabajo
JB fin_busca ; no reside (segm_bitdisk = 0)
CMP BYTE PTR [SI+3],1
JNE busca_bdsk
MOV AX,[SI] ; encontrada unidad BITDISK
MOV segm_bitdisk,AX
PUSH DS
MOV DS,AX
MOV AL,letra_unidad
POP DS
MOV letra_unidad,AL
fin_busca: XPOP <SI,DX,AX>
RET
reside_bitdsk? ENDP
; ------------ Crear lista con todos los dispositivos de bloque.
lista_drv PROC
XPUSH <BX,CX,DI,ES>
MOV AH,52h ; "Get list of lists"
INT 21h ; obtener puntero en ES:BX
ADD BX,22h ; versiones del DOS 3.1+
LEA DI,area_trabajo-4 ; tabla de dispositivos-4
disp_otro: ADD DI,4
disp_skip: LES BX,ES:[BX] ; siguiente dispositivo
CMP BX,-1
JE disp_fin
TEST BYTE PTR ES:[BX+5],80h
JNZ disp_skip ; es dispositivo de caracteres
MOV CL,ES:[BX+10] ; es de bloques
MOV [DI],ES ; anotar dirección
MOV [DI+2],CL
MOV BYTE PTR [DI+3],0 ; de momento, no es BITDISK
PUSH DI
LEA SI,id_bitdisk ; identificación de BITDISK
MOV DI,SI
MOV CX,3
CLD
REP CMPSB ; ¿es BITDISK?
POP DI
JNE disp_otro ; de bloques, pero no BITDISK
MOV AX,ES:cs_bitdisk ; segmento real de BITDISK
MOV [DI],AX ; corregir dirección en tabla
INC BYTE PTR [DI+3] ; indicar dispositivo BITDISK
JMP disp_otro ; buscar hasta completar tabla
disp_fin: MOV WORD PTR [DI],0 ; final de la lista
XPOP <ES,DI,CX,BX>
RET
lista_drv ENDP
; ------------ Liberar la memoria ocupada por un BITDISK residente
desinstala PROC
MOV DX,ES:xms_handle
MOV AH,0Ah
CALL ES:xms_driver
CMP AX,1
JE desinstalado ; éxito al liberar memoria XMS
STC
desinstalado: MOV ES:status,0 ; disco «no formateado»
JNC desins_ok
OR lista_err,ERROR14 ; fallo al liberar memoria
STC
desins_ok: RET
desinstala ENDP
; ------------ Determinar cantidad de memoria XMS que hay para BITDISK
info_xms PROC
MOV tdisco,0 ; ley de Murphy
PUSH ES
MOV AX,4300h
INT 2Fh
CMP AL,80h ; ¿hay controlador XMS?
JNE xms_ok
MOV AX,4310h ; obtener su dirección
INT 2Fh
MOV xms_segm,ES
MOV xms_desp,BX
MOV AH,8
CALL xms_driver ; preguntar memoria libre
AND AX,AX
JNZ xms_kb_ok ; no hubo fallo
CMP BL,0A0h
JE xms_kb_ok ; asignada ya toda la memoria
TEST BL,80h
JZ xms_kb_ok ; no hay memoria XMS disponible
OR lista_err,ERROR8 ; fallo real del controlador
xms_kb_ok: CMP AX,4 ; mayor bloque XMS disponible
JB xms_ok
MOV xms_kb,AX ; mínimo necesario: 4 Kb
xms_ok: POP ES
MOV AX,param_tdisco
MOV BX,xms_kb
AND BX,BX
JNZ usara_xms
OR lista_err,ERROR6 ; no hay memoria XMS disponible
JMP mem_infoado
usara_xms: CMP AX,BX
JBE usar_xms ; piden algo razonable
MOV AX,BX
OR lista_err,ERROR4 ; rebajado el tamaño
usar_xms: MOV tdisco,AX
MOV status,1 ; indicar memoria extendida
mem_infoado: RET
info_xms ENDP
; ------------ Reservar la memoria llamando al controlador XMS.
reserva_xms PROC
MOV AH,9
MOV DX,tdisco
CALL xms_driver ; pedir memoria XMS
AND AX,AX
JNZ mem_rda_xms
OR lista_err,ERROR8 ; fallo del controlador XMS
STC ; indicar error
mem_rda_xms: MOV xms_handle,DX
RET
reserva_xms ENDP
; ------------ Definir valores por defecto y adaptar los parámetros.
params_disco PROC
MOV AX,tdisco ; en Kb
MOV BX,AX ; entradas de directorio propuestas
MOV CL,1 ; sectores por cluster propuestos
CMP AX,128 ; ¿disco de 128 Kb o menos?
JBE prop_ok
MOV BX,128
CMP AX,512 ; ¿disco de 512 Kb o menos?
JBE prop_ok
MOV BX,256
CMP AX,2042 ; ¿disco de casi 2 Mb o menos?
JBE prop_ok
MOV CL,2 ; evitar FAT16
CMP AX,4084 ; ¿disco de casi 4 Mb o menos?
JBE prop_ok
MOV CL,4 ; evitar FAT16 hasta 8 Mb
MOV BX,384
CMP AX,16384 ; ¿disco de menos de 16 Mb?
JB prop_ok
MOV BX,512
prop_ok: MOV tdir,BX
MOV tcluster,CL ; inicializar valores recomendados
MOV DX,1024 ; AX = tamaño del disco en Kb
MUL DX ; DX:AX = bytes totales del disco
MOV CX,param_tsect
AND CX,CX
JNZ tsect_def ; se ha definido tamaño de sector
tsect_rec: MOV CX,tsect ; tamaño por defecto
tsect_def: CALL divCX
JNC nsect_ok ; menos de 65536 sectores: correcto
OR lista_err,ERROR11
JMP tsect_rec ; asumir por defecto y recalcular
nsect_ok: MOV tsect,CX
MOV numsect,AX
MOV BX,AX
SHR BX,1 ; BX = 1/2 del nº total de sectores
MOV CX,param_tdir
AND CX,CX
JNZ tdir_def ; se ha definido nº entradas
tdir_rec: MOV CX,tdir ; nº por defecto
tdir_def: MOV AX,tsect
XOR DX,DX
MOV SI,32 ; 32 bytes = tamaño entrada direct.
DIV SI ; AX nº entradas direct. por sector
XCHG AX,CX
XOR DX,DX ; DX:AX = nº de entradas
DIV CX ; CX = entradas en cada sector
AND DX,DX ; AX = nº sectores del ROOT
JZ dir_ok?
INC AX ; redondear tamaño de ROOT
dir_ok?: CMP AX,BX ; BX = 1/2 nº sectores del disco
JB dir_ok
OR lista_err,ERROR12 ; directorio excesivo
JMP tdir_rec ; directorio por defecto
dir_ok: MOV sdir,AX
MUL tsect
MOV CX,32
CALL divCX
MOV tdir,AX ; optimizar tamaño de directorio
MOV AX,512
XOR DX,DX
DIV tsect ; 512 / tamaño de sector
MOV BL,tcluster
XOR BH,BH
MUL BX ; ajustar tamaño de cluster
AND AL,AL
JZ propclus_ok
MOV tcluster,AL
propclus_ok: MOV BX,param_tcluster
AND BX,BX
JNZ tcluster_def ; se ha definido tamaño de cluster
tcluster_rec: MOV BL,tcluster ; tamaño por defecto
XOR BH,BH
tcluster_def: SHL BX,1
CMP BX,numsect ; ¿cabe seguro un cluster?
JB tcluster_ok
tcluster_mal: OR lista_err,ERROR13 ; tamaño de cluster incorrecto
JMP tcluster_rec
tcluster_ok: SHR BX,1
MOV AX,tsect
MUL BX ; DX:AX = tamaño de cluster
JC tcluster_mal
CMP AX,31744
JA tcluster_mal ; cluster de más de 31 Kb
MOV tcluster,BL ; sectores por cluster
MOV tamcluster,AX ; tamaño de cluster
MOV SI,3
CALL eval_clust ; obtener nº más alto de cluster
CMP AX,4086
JAE fat16 ; el nº más alto supera 4085
MOV CX,3
MUL CX ; clusters * 3
SHR DX,1
RCR AX,1 ; clusters * 3 / 2 = clusters * 1,5
JMP calc_sfat
fat16: MOV SI,4
CALL eval_clust
SHL AX,1
RCL DX,1 ; clusters * 2
calc_sfat: DIV tsect ; AX = nº sectores de FAT aprox.
AND DX,DX
JZ fat_ok
INC AX ; redondeo
fat_ok: MOV sfat,AX
MOV AX,numsect ; nº total de sectores
DEC AX ; descontar BOOT
SUB AX,sdir ; descontar ROOT
SUB AX,sfat ; descontar FAT
MOV CL,tcluster
XOR CH,CH
XOR DX,DX
DIV CX ; AX = número real de clusters
INC AX ; se numeran desde 2
MOV ultclus,AX
RET
params_disco ENDP
eval_clust PROC ; obtener el nº más alto de cluster
MOV AX,numsect
DEC AX ; restar BOOT
SUB AX,sdir ; restar ROOT
MUL tsect ; DX:AX = nsect * tamsect
SHL AX,1
RCL DX,1 ; DX:AX = nsect * tamsect * 2
MOV CX,tamcluster
SHL CX,1
ADD CX,SI ; CX = 2 * tamcluster + SI
DIV CX
INC AX ; los clusters se numeran desde 2
AND DX,DX ; ¿sobra un «cacho» de cluster?
JZ clust_eval ; redondear: ¡es preferible que
INC AX ; sobre un poco de FAT a que falte!
clust_eval: XOR DX,DX ; resultado en DX:AX
RET
eval_clust ENDP
; ------------ Inicializar la BOOT, FAT y ROOT del disco virtual.
formatear PROC
MOV AX,tsect ; preparar BPB
MOV bytes_sector,AX
MOV AL,tcluster
MOV sect_cluster,AL
MOV AX,tdir
MOV entradas_raiz,AX
MOV AX,numsect
MOV num_sect,AX
MOV AX,sfat
MOV sectores_fat,AX
MOV AL,0FFh ; ha habido «cambio» de disco
MOV cambiado,AL
MOV ES:cambiado,AL ; actualizar variables...
MOV AL,status
MOV ES:status,AL
MOV AX,xms_handle
MOV ES:xms_handle,AX
MOV AX,xms_desp
MOV ES:xms_desp,AX
MOV AX,xms_segm
MOV ES:xms_segm,AX
LEA CX,fin_bpb
LEA SI,bpb ; actualizar BPB
SUB CX,SI
MOV DI,SI
CLD
REP MOVSB
PUSH ES ; *
MOV AX,DS ; formatear el disco
MOV ES,AX
LEA SI,boot_sect
LEA DI,area_trabajo
MOV CX,128
CLD
REP MOVSB ; primeros 128 bytes del BOOT
XOR AX,AX
MOV CX,512-128
REP STOSB ; a 0 resto del área de trabajo
LEA DI,area_trabajo
ADD DI,tsect
MOV [DI-2],0AA55h ; marca de sector válido
CALL escribe_sectAX ; escribir sector BOOT (AX=0)
LEA DI,area_trabajo
MOV CX,tsect
REP STOSB ; borrar area de trabajo
MOV AX,sfat
ADD AX,sdir ; AX = sectores fat + dir. raiz
ini_fat: CMP AX,1
JE pfat
CALL escribe_sectAX ; inicializar directorio raiz
DEC AX ; y últimos sectores de la FAT
JMP ini_fat
pfat: LEA DI,area_trabajo
MOV BYTE PTR [DI],drv_media
MOV AX,0FFFFh ; inicializar 3 bytes FAT...
MOV DS:[DI+1],AX
CMP ultclus,4086 ; ¿menos de 4085 clusters?
JB pfat_ok
MOV DS:[DI+3],AL ; inicializar 4º byte FAT
pfat_ok: MOV AX,1
CALL escribe_sectAX ; primer sector FAT preparado
LEA SI,dir_raiz
LEA DI,area_trabajo
MOV CX,32
REP MOVSB
MOV AX,sfat
INC AX
CALL escribe_sectAX ; primer sector raiz preparado
POP ES ; *
RET
formatear ENDP
escribe_sectAX PROC ; Escribir sector nº AX del disco
PUSHF ; *
PUSHA ; **
PUSH ES ; ***
MOV ES,segm_bitdisk
PUSH CS
LEA BX,retf2
PUSH BX ; apilar segundo retorno
PUSH ES
PUSH WORD PTR ES:[8] ; apilar rutina de interrupción
PUSH CS
LEA BX,retf1
PUSH BX ; apilar primer retorno
PUSH ES
PUSH WORD PTR ES:[6] ; apilar rutina de estrategia
LEA BX,orden_write
LEA DX,area_trabajo
MOV [BX+14],DX ; dirección de transferencia
MOV [BX+16],DS
MOV [BX+20],AX ; sector inicial
PUSH CS
POP ES
RETF ; ejecutar rutina de estrategia
retf1: RETF ; ejecutar rutina de interrupción
retf2: POP ES ; ***
POPA ; **
POPF ; * restaurar bit DF
RET
escribe_sectAX ENDP
; ------------ Informar sobre el disco virtual instalado.
info_bitdisk PROC
LEA DX,ayuda_txt
CMP param_h,ON ; ¿solicitud de ayuda?
JNE cont_info ; no
JMP info_exit
cont_info: MOV AL,letra_unidad
MOV inf_unidad,AL
LEA DX,info_txt
CALL imprimir
LEA DX,inf_unidad
CALL imprimir
CMP ES:status,0
JNE info_reporte
LEA DX,info_nof_txt ; disco no formateado
CALL imprimir
CMP lista_err,0
JNE info_err ; mensajes de advertencia
JMP info_ret
info_reporte: LEA DX,inf_tdisco
CALL imprimir
MOV AX,ES:num_sect
MUL ES:bytes_sector
MOV BX,1024
DIV BX
MOV CL,5
CALL print_32
LEA DX,inf_tsector
CALL imprimir
MOV AX,ES:bytes_sector
XOR DX,DX
MOV CL,5
CALL print_32
LEA DX,inf_tdir
CALL imprimir
MOV AX,ES:entradas_raiz
XOR DX,DX
MOV CL,5
CALL print_32
LEA DX,inf_tcluster
CALL imprimir
MOV AL,ES:sect_cluster
XOR AH,AH
XOR DX,DX
MOV CL,5
CALL print_32
LEA DX,inf_final
CMP lista_err,0
JE info_exit ; sin mensajes de advertencia
CALL imprimir ; ... o con ellos
LEA DX,cabec_adv_txt
CALL imprimir ; cabecera de advertencias
info_err: MOV AX,lista_err
LEA BX,tabla_mensajes-2
MOV CX,16 ; 16 posibles mensajes
busca_err: ADD BX,2
SHR AX,1
JC informa
mas_mens: LOOP busca_err ; no se produce ese error
JMP info_ret
informa: MOV DX,[BX] ; dirección del mensaje
CALL imprimir
JMP mas_mens ; acabar con todos
info_exit: CALL imprimir
info_ret: RET
info_bitdisk ENDP
; ------------ Dividir DX:AX / CX sin desbordamientos.
divCX PROC ; Cociente en AX y resto en DX.
XPUSH <BX,SI,CX,AX,DX> ; Si el cociente excede los
MOV SI,32 ; 16 bits, CF=1 y todos los
XOR BX,BX ; registros intactos.
divmas: SHL AX,1
RCL DX,1
RCL BX,1
CMP BX,CX
JB dividido ; "no cabe"
SUB BX,CX
INC AL ; 1 al cociente
dividido: DEC SI
JNZ divmas
AND DX,DX
JZ div_ok
XPOP <DX,AX> ; error
STC
JMP div_fin
div_ok: MOV DX,BX ; resto en DX y cociente en AX
ADD SP,4 ; «sacar» sin sacar DX y AX
CLC
div_fin: XPOP <CX,SI,BX> ; recuperar CX, SI y BX
RET
divCX ENDP
; --- Imprimir un nº decimal de 32 bits en DXAX formateado por CL.
;
; Entradas:
; Si bit 4 = 1 --> se imprimirán signos separadores de millar
; bits 0-3 = nº total de dígitos (incluyendo separadores de
; millar y parte fraccional)
; bits 5-7 = nº de dígitos de la parte fraccional (cuantos
; dígitos de DXAX, empezando por la derecha,
; se consideran parte fraccional, e irán precedidos
; del correspondiente separador)
;
; Salidas: nº impreso, ningún registro modificado.
;
; * Ejemplo, si DXAX=9384320 y CL=010 1 1011
; se imprimirá ( '_' representa un espacio en blanco ): __93.843,20
print_32 PROC
PUSH DS
PUSH ES
PUSH CS
PUSH CS
POP DS
POP ES
PUSH AX ; preservar todos los registros
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSHF
MOV formato_pr32,CL ; byte del formato de impresión elegido
MOV CX,idioma_seps
separ_pr32: MOV millares_pr32,CH ; separador de millares
MOV fracc_pr32,CL ; separador parte fraccional
MOV BX,OFFSET tabla_pr32
MOV CX,10
digit_pr32: PUSH CX
PUSH AX
PUSH DX
XOR DI,DI
MOV SI,1 ; DISI = 1
DEC CX ; CX - 1
JCXZ hecho_pr32
factor_pr32: SAL SI,1
RCL DI,1 ; DISI * 2
MOV DX,DI
MOV AX,SI
SAL SI,1
RCL DI,1
SAL SI,1
RCL DI,1 ; DISI * 8
ADD SI,AX
ADC DI,DX ; DISI = DISI*8 + DISI*2 = DISI*10
LOOP factor_pr32 ; DISI = DISI*10*10* ... (CX-1 veces)
hecho_pr32: POP DX ; luego DISI = 10 elevado a (CX-1)
POP AX ; CX se recuperará más tarde
MOV CL,0FFh
rep_sub_pr32: INC CL
SUB AX,SI
SBB DX,DI ; DXAX = DXAX - DISI
JNC rep_sub_pr32 ; restar el factor cuanto se pueda
ADD AX,SI ; subsanar el desbordamiento:
ADC DX,DI ; DXAX = DXAX + DISI
ADD CL,'0' ; pasar binario a ASCII
MOV [BX],CL
POP CX ; CX se recupera ahora
INC BX
LOOP digit_pr32 ; próximo dígito del número
STD ; transferencias (MOVS) hacia atrás
DEC BX ; BX apunta al último dígito
MOV final_pr32,BX ; último dígito
MOV ent_frac_pr32,BX ; frontera parte entera/fraccional
MOV CL,5
MOV AL,formato_pr32
SHR AL,CL ; AL = nº de decimales
AND AL,AL
JZ no_frac_pr32 ; ninguno
MOV CL,AL
XOR CH,CH
MOV SI,final_pr32
MOV DI,SI
INC DI
REP MOVSB ; correr cadena arriba (hacer hueco)
INC final_pr32
MOV AL,fracc_pr32
MOV [DI],AL ; poner separador de parte fraccional
MOV ent_frac_pr32,SI ; indicar nueva frontera
no_frac_pr32: MOV AL,formato_pr32
TEST AL,16 ; interpretar el formato especificado
JZ poner_pr32 ; imprimir como tal
entera_pr32: MOV CX,final_pr32 ; añadir separadores de millar
SUB CX,ent_frac_pr32
ADD CX,3
MOV SI,final_pr32
MOV DI,SI
INC DI
REP MOVSB ; correr cadena arriba (hacer hueco)
MOV AL,millares_pr32
MOV [DI],AL ; poner separador de millares
INC final_pr32
MOV ent_frac_pr32,SI ; usar esta variable como puntero
SUB SI,OFFSET tabla_pr32
CMP SI,3
JAE entera_pr32 ; próximo separador
poner_pr32: MOV BX,final_pr32
MOV BYTE PTR [BX+1],0 ; delimitador de fin de cadena
MOV BX,OFFSET tabla_pr32
MOV principio_pr32,BX ; inicio de cadena
limpiar_pr32: MOV AL,[BX]
CMP AL,'0'
JE blanco_pr32 ; cero a la izda --> poner " "
CMP AL,millares_pr32 ; separador millares a la izda
JE blanco_pr32
CMP AL,fracc_pr32
JNE acabar_pr32
MOV BYTE PTR [BX-1],'0' ; reponer 0 antes de la coma
DEC principio_pr32
acabar_pr32: MOV AL,formato_pr32 ; imprimir
AND AL,00001111b
XOR AH,AH
MOV DX,final_pr32
SUB DX,AX
INC DX ; DX = offset 'principio'
AND AX,AX
JNZ format_pr32 ; longitud especificada por el usuario
MOV DX,principio_pr32 ; longitud obtenida del número
format_pr32: CALL imprimir
POPF ; restaurar todos los registros
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
RET ; salida del procedimiento
blanco_pr32: MOV BYTE PTR [BX],' ' ; sustituir 0 ó separador de millares
INC BX ; a la izda. por espacio en blanco
INC principio_pr32
CMP BX,final_pr32
JB limpiar_pr32
MOV DX,BX ; es el número 0.000.000.00X
JMP SHORT acabar_pr32 ; imprimir
formato_pr32 DB 0
DB 5 DUP (' ') ; espacios en blanco para cubrir la
; mayor plantilla que pueda ser espe-
; cificada en el formato
tabla_pr32 DT 0 ; reservar 14 bytes (nº más ., más ASCIIZ)
DW 0,0 ; aquí se solapa un buffer de 32 bytes
millares_pr32 DB '.' ; separador de millares
fracc_pr32 DB ',' ; " parte fraccional
final_pr32 DW 0 ; offset al último byte a imprimir
principio_pr32 DW 0 ; " " primer " " "
ent_frac_pr32 DW 0 ; offset a la frontera entero-fracc.
DT 0 ; $ - tabla_pr32 = 32 bytes usados por
; INT 21h al principio de print_32
print_32 ENDP
; ------------ Imprimir cadena en DS:DX delimitada por un 0 ó un 255.
; Si acaba en 0, se imprime como tal; en caso contrario,
; se supone que el mensaje es multilingüe y los diversos
; idiomas (1, 2, ... N) separan sus cadenas por sucesivos
; códigos 255. El carácter de control 127 realiza una
; pausa hasta que se pulsa una tecla.
imprimir PROC
XPUSH <AX, BX, CX, DX, SI, DI, ES>
CMP idioma,0
JNE pr_decidir
PUSH DX ; *
MOV AH,30h
INT 21h
XCHG AH,AL
MOV CX,AX ; CX = versión del DOS
CMP param_i,ON
MOV AX,codigo_tfno
MOV BX,1234h
JNE pr_busca_cod ; parámetro /I=cod no indicado
MOV BX,AX
MOV AL,0FFh
CMP BX,255
JAE pr_cod ; código mayor o igual de 255
MOV AL,BL ; código menor de 255
pr_cod: CMP CX,200h
JAE pr_cod_tfno ; DOS >= 2.X
pr_busca_cod: CMP CX,200h
MOV AX,1 ; inglés para DOS < 2.X
JB pr_habla_ax
MOV AL,0
pr_cod_tfno: LEA DX,area_trabajo
MOV AH,38h
XPUSH <BX, CX>
INT 21h ; obtener información del pais
XPOP <CX, AX>
JC pr_habla_ax ; fallo en la función
CMP CX,20Bh
JE pr_habla_ax ; DOS 2.11: AX cód. telefónico
CMP CX,300h
MOV AX,1
JB pr_habla_ax ; 2.x excepto 2.11: mala suerte
MOV AX,BX
LEA BX,area_trabajo
MOV CH,[BX+7] ; separador de millares
MOV CL,[BX+9] ; separador de decimales
MOV idioma_seps,CX
pr_habla_ax: LEA BX,info_paises-2
MOV CX,1 ; supuesto idioma 1
pr_busca_idi: ADD BX,2
MOV DX,[BX]
CMP AX,DX
JE pr_habla_ese
AND DX,DX
JNZ pr_busca_idi
INC CX ; será otro idioma
CMP [BX+2],DX
JNE pr_busca_idi ; no es fin de la tabla
pr_habla_ese: MOV idioma,CL
POP DX ; *
pr_decidir: MOV CL,idioma
MOV CH,0 ; nº de idioma a usar (1..N)
MOV BX,DX
pr_busca_msg: MOV DX,BX
DEC BX
pr_busca_ter: INC BX
CMP BYTE PTR [BX],0
JE pr_usar_ese ; acaba en 0: no buscar más
CMP BYTE PTR [BX],255
JNE pr_busca_ter
INC BX
LOOP pr_busca_msg ; acaba en 255 pero no es ese
pr_usar_ese: MOV BX,DX
DEC BX
pr_cad_lon: INC BX
CMP BYTE PTR [BX],0
JE prlong_ok
CMP BYTE PTR [BX],127 ; carácter de pausa
JE prpausa
CMP BYTE PTR [BX],255
JNE pr_cad_lon ; calcular longitud
JMP prlong_ok
prpausa: PUSH BX
MOV CX,BX
SUB CX,DX
CALL pr_cad ; imprimir hasta el código 127
pr_limpbuf: MOV AH,1
INT 16h
JZ pr_notec
MOV AH,0
INT 16h ; limpiar buffer del teclado
JMP pr_limpbuf
pr_notec: MOV AH,0
INT 16h ; esperar tecla
POP BX
INC BX
MOV DX,BX
CMP AL,27 ; ¿tecla ESC?
STC
JE pr_ret
JMP pr_cad_lon ; imprimir el resto
prlong_ok: MOV CX,BX
SUB CX,DX
CALL pr_cad ; terminar impresión
CLC
pr_ret: XPOP <ES, DI, SI, DX, CX, BX, AX> ; CF=1 si se pulsó ESC
RET
pr_cad: MOV AH,40h
MOV BX,1
INT 21h ; imprimir con el DOS
RET
imprimir ENDP
; ************ Datos no residentes para la instalación
ON EQU 1 ; constantes booleanas
OFF EQU 0
segm_bitdisk DW 0 ; segmento donde reside BITDISK
param_unidad DB 0 ; número de disco si indicada unidad
param_i DB OFF
param_tdiscof DB OFF ; a ON si se define tamaño de disco
param_tdisco DW 0 ; tamaño de disco (si se define)
param_tsect DW 0 ; tamaño de sector (si se define)
param_tdir DW 0 ; número de entradas (si se define)
param_tcluster DW 0 ; tamaño de cluster (si se define)
param_h DB OFF ; a ON si indicado parámetro /? o /H
tdisco DW ? ; tamaño de disco (Kb)
ultclus DW ? ; número más alto de cluster
tamcluster DW ? ; tamaño de cluster (bytes)
sdir DW ? ; sectores para directorio raiz
xms_kb DW 0 ; Kb de memoria XMS libres
idioma DB 0 ; selecciona el número de idioma (1..N)
idioma_seps DW ",." ; separadores de millares/decimales
codigo_tfno DW ? ; valor de /I= si se indica
; --- Código telefónico de países de habla
; hispana (mucha o poca).
info_paises DW 54 ; Argentina
DW 591 ; Bolivia
DW 57 ; Colombia
DW 506 ; Costa Rica
DW 56 ; Chile
DW 593 ; Ecuador
DW 503 ; El Salvador
DW 34 ; España
DW 63 ; Filipinas
DW 502 ; Guatemala
DW 504 ; Honduras
DW 212 ; Marruecos
DW 52 ; México
DW 505 ; Nicaragua
DW 507 ; Panamá
DW 595 ; Paraguay
DW 51 ; Perú
DW 80 ; Puerto Rico
DW 508 ; República Dominicana
DW 598 ; Uruguay
DW 58 ; Venezuela
DW 3 ; Latinoamérica
DW 0 ; fin de la información
; --- Código telefónico de países de habla alemana.
DW 41 ; Switzerland
DW 43 ; Austria
DW 49 ; Germany
DW 0 ; fin de la información
DW 0 ; no más idiomas
boot_sect LABEL BYTE
JMP SHORT botar
DB 90h,"BDSK 1.1" ; NOP/identificación del sistema
tsect DW 512 ; tamaño de sector por defecto
tcluster DB ? ; sectores por cluster
DB 1,0,1 ; sectores reservados/nº de FATs
tdir DW ? ; número de entradas al dir. raiz
numsect DW ? ; nº sectores del disco (<=32Mb)
DB drv_media ; descriptor de medio
sfat DW ? ; sectores por FAT
DW 1, 1 ; sectores por pista / cabezas
DB 15 DUP (0) ; últimos datos
botar: DB 0EAh ; código de JMP FAR...
DW 0,0FFFFh ; ...FFFF:0000 (programa BOOT)
DB "(C)1994 CiriSOFT"; resto (de primeros 64 bytes)
DB ". Grupo Universitario de Informá"
DB "tica (GUI) - Valladolid (Spain)",0 ; (128 bytes)
dir_raiz DB "BITDISK " ; Directorio raiz: primera entrada
DB 8 ; atributo de etiqueta de volúmen
DB 10 DUP (0) ; reservado
DW 1*2048+10*32 ; hora 1:10
DW 1+7*32+14*512 ; fecha 1/7/94
DW 0,0,0 ; últimos bytes (hasta 32)
orden_write DB 0, 1 ; longitud cabecera / nº unidad
DB 8 ; orden write
DW 0 ; palabra de estado devuelta
DD 0, 0 ; uso interno
DB 0FAh ; descriptor de medio
DD ? ; dirección E/S
DW 1 ; 1 sector
DW ? ; primer sector
DD 0, 0 ; no usados
; ------------ Areas de datos para información del disco virtual
install_txt DB 13,10,"Disco virtual BITDISK instalado en ",255
DB 13,10,"BITDISK 1.1 RAM-Disk installiert auf ",255
DB 13,10,"BITDISK 1.1 RAM-Disk installed on ",0
inf_drv_conf DB "D:",13,10,0
info_txt DB 13,10,"Unidad BITDISK ",255
DB 13,10,"Laufwerk BITDISK ",255
DB 13,10,"Drive BITDISK ",0
inf_unidad LABEL BYTE
DB "D:",0
info_nof_txt DB " sin formatear.",13,10,255
DB " nicht formatiert.",13,10,255
DB " unformatted.",13,10,0
inf_tdisco DB 13,10," - Tamaño del disco: ",255
DB 13,10," - Laufwerksgröße: ",255
DB 13,10," - Disk size: ",0
inf_tsector DB " Kbytes ",13,10," - Tamaño de sector: ",255
DB " KB ",13,10," - Sektorengröße: ",255
DB " Kbytes ",13,10," - Sector size: ",0
inf_tdir DB " bytes",13,10," - Entradas raiz: ",255
DB " Bytes",13,10," - Verz.-Einträge: ",255
DB " bytes",13,10," - Root entries: ",0
inf_tcluster DB 13,10," - Sectores/cluster: ",255
DB 13,10," - Sektoren/Cluster: ",255
DB 13,10," - Sectors/cluster: ",0
inf_final DB 13,10,0
ERROR0 EQU 1
ERROR4 EQU 16
ERROR6 EQU 64
ERROR8 EQU 256
ERROR11 EQU 2048
ERROR12 EQU 4096
ERROR13 EQU 8192
ERROR14 EQU 16384
lista_err DW 0 ; palabra que indica los mensajes a imprimir
tabla_mensajes DW m0,m0,m0,m0,m4,m0,m6,m0,m8,m0,m0,m11,m12,m13,m14
cabec_adv_txt DB " - Advertencias y/o errores:",13,10,255
DB " - Warnungen und/oder Fehler:",13,10,255
DB " - Warnings and/or errors:",13,10,0
m0 DB " + Error de sintaxis o parámetro fuera de rango (no",13,10
DB " se define el disco o no se altera el definido)",13,10,255
DB " + Syntaxfehler oder Parameter außerhalb des zulässigen",13,10
DB " Bereichs (Die RAM-Disk ist nicht verändert).",13,10,255
DB " + Syntax error or parameter out of range (the",13,10
DB " disk is not defined and is not modified).",13,10,0
m4 DB " + La memoria solicitada no existe: rebajada.",13,10,255
DB " + Die angeforderte Speichergröße existiert nicht und wurde reduziert.", 13,10,255
DB " + Memory requested does not exist: size reduced.",13,10,0
m6 DB " + No existe memoria XMS.",13,10,255
DB " + Kein XMS-Speicher verfügbar.",13,10,255
DB " + There is not XMS memory available.",13,10,0
m8 DB " + Fallo del controlador XMS.",13,10,255
DB " + Fehler des XMS-Managers.",13,10,255
DB " + XMS controller failure.",13,10,0
m11 DB " + Tamaño sector incorrecto: asignado por defecto",13,10,255
DB " + Ungültige Sektorengröße: wird durch Vorgabewert ersetzt.",13,10,255
DB " + Incorrect sector size: stablished by default.",13,10,0
m12 DB " + Nº entradas erróneo: establecido por defecto.",13,10,255
DB " + Ungültige Anzahl von Verzeichniseinträgen: wird durch Vorgabewert ersetzt",13,10,255
DB " + Incorrect number of root entries: established by default.",13,10,0
m13 DB " + Tamaño cluster erróneo: asignado por defecto.",13,10,255
DB " + Ungültige Clustergröße: wird durch Vorgabewert ersetzt..",13,10,255
DB " + Cluster size incorrect: stablished by default.",13,10,0
m14 DB " + FATAL: fallo al liberar la memoria ocupada.",13,10,255
DB " + ACHTUNG: Freigabe des belegten Speichers unmöglich.",13,10,255
DB " + FATAL: impossible to free the allocated memory.",13,10,0
bitdisk_noins LABEL BYTE
DB 13,10,"BITDISK 1.1 - EL DISCO VIRTUAL XMS DE MENOR CONSUMO DE MEMORIA.",13,10
DB " - Instale primero BITDISK desde CONFIG.SYS (con DEVICE).",13,10
DB " - Este controlador sólo consume ¡256 bytes de memoria!",13,10
DB " - Puede solicitar ayuda con BITDISK /?",13,10,255
DB 13,10,"BITDISK 1.1 - Der verstellbare RAM-Disk-Treiber für XMS."
DB 13,10," - Installieren Sie erst BITDISK in der CONFIG.SYS (mit DEVICE)."
DB 13,10," - Dieser Treiber benötigt nur 256 Bytes konventionellen "
DB "oder oberen Speicher!",13,10
DB " - Hilfe ist verfügbar mit BITDISK /?",13,10,255
DB 13,10,"BITDISK 1.1 - THE WORLD'S SMALLEST XMS RESIZEABLE RAMDISK."
DB 13,10," - Install first BITDISK from CONFIG.SYS (with DEVICE)."
DB 13,10," - This controller takes only 256 bytes of conventional "
DB "or upper memory!",13,10
DB " - Help is available with BITDISK /?",13,10,0
; switchar patching goes from bitdisk_noins until this area!!!
bitdisk_noes DB 13,10,"BITDISK 1.1",13,10
DB " - La unidad indicada no es un dispositivo BITDISK 1.1",13,10,255
DB " - Angegebener Buchstabe kennzeichnet kein Laufwerk von BITDISK 1.1.",13,10,255
DB " - Drive letter indicated isn't a BITDISK 1.1 device.",13,10,0
ayuda_txt LABEL BYTE
DB 13,10,10," BITDISK 1.1 - (C) Grupo Universitario de Informática "
DB "- Valladolid (España).",13,10,"(C) 1995 Ciriaco García de Celis "
DB "- Email: ciri@gui.uva.es - FidoNET 2:341/21.8",13,10
DB " Disco virtual en XMS para sistemas AT consumiendo sólo 256 bytes de memoria."
DB 13,10," * * * Este programa (sin cambios) es de DOMINIO PUBLICO "
DB "y GRATUITO * * *",13,10,10
DB " Después de instalar BITDISK en el fichero CONFIG.SYS (con una "
DB "línea similar",13,10,"a DEVICEHIGH=BITDISK.EXE) se le puede "
DB "ejecutar desde el DOS para formatearlo:",13,10,10," BITDISK 64 "
DB 9,9," (formatea un disco virtual de 64 Kb en memoria XMS)",13,10
DB " BITDISK 256",9,9," (lo reformatea ampliándolo a 256 Kb)",13,10
DB " BITDISK 0 ",9,9," (lo anula totalmente, recuperando toda la "
DB "memoria)",13,10," BITDISK E: 100",9," (formatea el BITDISK E: con "
DB "100 Kb)",13,10," BITDISK ",9,9," (muestra información del disco "
DB "sin alterarlo)",13,10,10," Sintaxis:",13,10
DB " BITDISK [U:] [tamaño [tamaño_sector [fich_raiz [tamaño_"
DB "cluster]]]]",13,10,10," El tamaño ha de estar comprendido entre "
DB "4 y 32768 Kb; el tamaño de sector ha",13,10,"de ser 64, 128, 256 ó"
DB " 512 (DRDOS sólo lo soporta 128 ó superior); los ficheros",13,10
DB "admitidos en el directorio raíz pueden oscilar desde 1 "
DB "hasta donde sea posible",13,10,"para el tamaño del disco; el "
DB "tamaño de clúster indica el nº de sectores por",13,10
DB "cluster (en MS-DOS debe ser potencia de 2; no hay problemas "
DB "con DR-DOS). Para",13,10,"indicar un parámetro hay que indicar los anteriores "
DB "(0-evaluación automática).",13,10,255
DB 13,10,10," BITDISK 1.1 - (C) Grupo Universitario de Informática "
DB "- Valladolid (Spain).",13,10,"(C) 1995 Ciriaco García de Celis "
DB "- Email: ciri@gui.uva.es - FidoNET 2:341/21.8",13,10,"XMS-RAM-"
DB "Disk für AT-Systeme, benötigt 256 Bytes konventionellen/oberen Speicher"
DB 13,10,"* * * Dieses Programm ist PUBLIC DOMAIN und FREEWARE (ohne "
DB "Veränderungen) * * *",13,10,10," Nach der Installation in "
DB "CONFIG.SYS (mit einer Zeile wie DEVICE=BITDISK.EXE)",13,10
DB "können Sie es zur Neuformatierung von der Kommandozeile aufrufen."
DB " Beispiele:",13,10,10," BITDISK 64 ",9,9,"(legt eine RAM-Disk von "
DB "64 KB im XMS an)",13,10," BITDISK 256",9,9,"(erhöht die Größe "
DB "auf 256 KB: Inhalte werden gelöscht!)",13,10," BITDISK 0 ",9
DB 9,"(gibt den belegten Speicher wieder frei)",13,10," BITDISK E: "
DB "100",9,"(legt BITDISK E: mit 100 KB an)",13,10," BITDISK ",9,9
DB "(Anzeige der Informationen ohne Änderung)",13,10,10," Vollständige"
DB " Syntax:",13,10,10," BITDISK [U:] [Größe [Sektorengröße [Verzeichnis"
DB "einträge [Clustergröße]]]]",13,10,10," Die Größe muß in 4-32768 KB "
DB "liegen; Sektorengröße muß 64, 128, 256 oder 512",13,10,"Bytes sein "
DB " (DRDOS unterstützt nicht 64). Verzeichniseinträge können von 1 bis"
DB 13,10,"Disk-Obergrenze sein; die Clustergröße (Anzahl Sektoren pro "
DB "Cluster), muß bei",13,10,"MS-DOS eine Zweierpotenz sein (keine "
DB "Probleme bei DRDOS). Falls ein Parameter 0",13,10,"ist, verwendet "
DB "BITDISK Vorgabewerte (außer bei der Disk-Größe).",13,10,255
DB 13,10,10," BITDISK 1.1 - (C) Grupo Universitario de Informática "
DB "- Valladolid (Spain).",13,10,"(C) 1995 Ciriaco García de Celis "
DB "- Email: ciri@gui.uva.es - FidoNET 2:341/21.8",13,10," XMS RAM "
DB "Disk for AT systems taking 256 bytes of conventional/upper memory."
DB 13,10,"* * * This program (without modifications) is PUBLIC DOMAIN "
DB "and FREEWARE * * *",13,10,10," After install BITDISK in "
DB "CONFIG.SYS (with a line like to DEVICE=BITDISK.EXE)",13,10
DB "you can execute it from DOS command line in order to format disk."
DB " Examples:",13,10,10," BITDISK 64 ",9,9,"(Formats a 64 Kb RAM "
DB "disk in XMS memory)",13,10," BITDISK 256",9,9,"(Reformats it "
DB "up to 256 Kb: all data will be lost!)",13,10," BITDISK 0 ",9,9
DB "(Unformat it freezing all memory ocupied)",13,10," BITDISK E: "
DB "100",9,"(Formats BITDISK E: with 100 Kb)",13,10," BITDISK ",9
DB 9,"(Show disk information without modify it)",13,10,10," Complete"
DB " syntax:",13,10,10," BITDISK [U:] [size [sector_size "
DB "[files_root [cluster_size]]]]",13,10,10," Size must be in the "
DB "range 4-32768 Kb; sector size must be 64, 128, 256 or 512",13,10
DB "bytes (DRDOS does not support 64 bytes-sector). Files on root "
DB "directory can be",13,10,"from 1 up to disk size limit; the "
DB "cluster size (number of sectors by cluster)",13,10,"must be "
DB "power of 2 in MS-DOS (there is no problem with DRDOS). If any "
DB "parameter",13,10,"except disk size is set to 0, BITDISK will "
DB "assume default values.",13,10,0
area_trabajo EQU $
DB 4096 DUP (?)
_BITDISK ENDS
_PILA SEGMENT STACK 'STACK'
DB 768 DUP (?) ; 0,75 Kb de pila son suficientes
_PILA ENDS
END main