home *** CD-ROM | disk | FTP | other *** search
-
- ;┌───────────────────────────────────────────────────────────────────┐
- ;│ │
- ;│ █████ █ █ ███ █████ █████ │
- ;│ █ ██ ██ █ █ █ █ █ │
- ;│ █████ █ █ █ █ █ █ █ █████ │
- ;│ █ █ █ █ █ █ █ █ │
- ;│ █████ █ █ ███ █████ █████ │
- ;│ │
- ;│ │
- ;│ 2MDOS 1.0 - (C) 1994-1995 Ciriaco García de Celis. │
- ;│ │
- ;│ Para obtener el ejecutable: │
- ;│ TASM 2mdos /m5 │
- ;│ TLINK 2mdos /t │
- ;│ │
- ;│ El fichero 2MFBOOT.DB que se carga con INCLUDE debe obtenerse │
- ;│ previamente a partir de 2MFBOOT.ASM con ayuda de 2MFBMAKE.BAS │
- ;│ │
- ;└───────────────────────────────────────────────────────────────────┘
-
- ON EQU 1 ; constantes booleanas
- OFF EQU 0
-
- ; ------------ Macros de propósito general.
-
- XPUSH MACRO regmem ; apilar lista de registros
- IRP rm, <regmem>
- PUSH rm
- ENDM
- ENDM
-
- XPOP MACRO regmem ; desapilar lista de registros
- IRP rm, <regmem>
- POP rm
- ENDM
- ENDM
-
- ; ------------ Programa.
-
- _PRINCIPAL SEGMENT
- ASSUME CS:_PRINCIPAL, DS:_PRINCIPAL
-
- ORG 100h
-
- ini_residente EQU $
-
- ; ****************************************
- ; * *
- ; * D A T O S R E S I D E N T E S *
- ; * *
- ; ****************************************
-
- inicio: JMP main
-
- ; ------------ Identificación estandarizada del programa.
-
- program_id LABEL BYTE
- segmento_real DW 0 ; segmento real donde será cargado
- offset_real DW 0 ; offset real " " "
- longitud_total DW 0 ; zona de memoria ocupada (párrafos)
- info_extra DB 80h ; bits 0, 1 y 2-> 000: normal, con PSP
- ; 001: bloque UMB XMS
- ; 010: *.SYS
- ; 011: *.SYS formato EXE
- ; bit 7 a 1: «extension_id» definida
- multiplex_id DB 0 ; número Multiplex de este TSR
- vectores_id DW tabla_vectores
- extension_id DW tabla_extra
- DB "*##*"
- autor_nom_ver DB "CiriSOFT:2MDOS:1.0",0
- DB 2 ; número de vectores de interrupción usados
- tabla_vectores EQU $
- i13_40_0 DB 13h ; INT 13h
- ant_i13 LABEL DWORD ; dirección original
- ant_i13_off DW 0
- ant_i13_seg DW 0
- DB 2Fh ; INT 2Fh
- ant_i2F LABEL DWORD ; dirección original
- ant_i2F_off DW 0
- ant_i2F_seg DW 0
-
- tabla_extra LABEL BYTE
- DW ctrl_exterior ; permitido control exterior
- DW 0 ; campo reservado
-
- ctrl_exterior LABEL BYTE
- reubicabilidad DB 1 ; programa 100% reubicable
- activacion DW act
- act DB 1
-
- ; ******************************************************
- ; * *
- ; * C O D I G O Y D A T O S D E 2 M D O S *
- ; * *
- ; ******************************************************
-
- sop2m DB ? ; indica si hay soporte 2M instalado
- sopdcopy DB ON ; por defecto, soporte para DISKCOPY
- opt DB ON ; por defecto, optimización de formateo
- boost DB ON ; por defecto, optimización DiskBoost
- fdread DB ON ; por defecto, con soporte FDREAD
- fmt DB OFF ; por defecto, sin apoyo a MS-DOS FORMAT
- x_hd DW 2 ; sector sliding para alta densidad
- y_hd DW 3
- x_dd DW 1
- y_dd DW 3 ; sector sliding para doble densidad
- mingap DW 32 ; GAP3 mínimo para interleave 1:1
- fmt_A DW 0 ; formato activo en curso (0 DOS/FDF)
- DW 0 ; cilindros/sectores del formato
- fmt_B DW 0 ; ídem para B:
- DW 0
-
- xms_handler LABEL DWORD ; dirección del controlador XMS, si
- xms_hndl_off DW ? ; está instalado
- xms_hndl_seg DW ?
- xms_handle DW 0 ; handle XMS (0 = no utilizada XMS)
-
- ; ------------ Rutina de gestión de INT 2Fh.
-
- nueva_i2F PROC FAR
- STI
- CMP AH,CS:multiplex_id
- JE preguntan
- JMP CS:ant_i2F ; saltar al gestor de INT 2Fh
- preguntan: CMP DI,1992h
- JNE ret_no_info ; no llama alguien del convenio
- MOV AX,ES
- CMP AX,1492h
- JNE ret_no_info ; no llama alguien del convenio
- PUSH CS
- POP ES ; sí llama: darle información
- LEA DI,autor_nom_ver
- ret_no_info: MOV AX,0FFFFh ; "entrada multiplex en uso"
- IRET
- nueva_i2F ENDP
-
- ; ------------ Nueva rutina de gestión de INT 13h.
-
- nueva_i13 PROC
- STI
- CMP DL,1
- JA jmp_bios ; no es disquetera
- CMP AH,2
- JB jmp_bios
- CMP AH,5
- JB fdread_code
- JNE otra_func
- JMP format
- otra_func: CMP AH,18h
- JNE set_old?
- JMP set_media
- set_old?: CMP AH,17h
- JE set_old_media
- jmp_bios: JMP CS:ant_i13
-
- ; ------------ Emulación de FDREAD.
-
- fdread_code: CMP CS:fdread,ON ; funciones 2, 3 y 4
- JNE jmp_bios
- XPUSH <AX, BX, DS>
- XOR BX,BX
- MOV DS,BX
- LDS BX,DS:[1Eh*4] ; DS:BX -> tabla base disco
- ADD AL,CL
- DEC AL
- MOV [BX+4],AL ; sectores/pista necesarios
- MOV BYTE PTR DS:[BX+5],1 ; GAP R/W mínimo
- OR CH,CH ; ¿pista 0?
- XPOP <DS, BX, AX>
- JZ call_i13 ; así es
- PUSH AX ; *
- PUSHF
- CALL CS:ant_i13
- JNC exit_ok ; no hubo error
- CMP AH,3
- JE exit_nok ; protegido de escritura
- CMP AH,6
- JE exit_nok ; cambio de disco
- CMP AH,9
- JE exit_nok ; frontera de DMA (INT 40h)
- POP AX
- XPUSH <DS, BX> ; lo hubo...¿será del stepping?
- MOV BX,40h
- MOV DS,BX
- MOV BX,90h
- ADD BL,DL
- CMP CH,43 ; ¿pista > 43?
- JA quita_step
- XOR BYTE PTR DS:[BX],20h ; invertir doble stepping
- JMP fin_step
- quita_step: AND BYTE PTR DS:[BX],0DFh ; quitar doble stepping
- fin_step: XPOP <BX, DS>
- call_i13: PUSHF
- CALL CS:ant_i13
- PUSH AX
- JMP exit_ok
- exit_nok: STC
- exit_ok: INC SP
- INC SP ; quitar AX de la pila
- RETF 2
-
- ; ------------ Nueva función 17h.
-
- set_old_media: PUSH BX
- CALL ptr_BX_data
- MOV WORD PTR CS:[BX],0 ; formatos flexibles sólo en
- POP BX ; la función 18h, no la 17h
- JMP CS:ant_i13
-
- ; ------------ Nueva función 18h.
-
- set_media: XPUSH <DS, BX> ; *1-2-3
- PUSH CS
- POP DS
- MOV disco,DL
- MOV cilsec,CX
- CALL get_fmt ; buscar el formato solicitado
- JNC hay_fmt ; existe
- f18_bios: MOV CX,cilsec
- MOV DL,disco
- XPOP <BX, DS> ; *1
- JMP jmp_bios ; formato no reconocido (¿?)
- hay_fmt: CMP BYTE PTR [BX+1],0 ; formatos del DOS
- JE fmt_dos_fdf
- CMP sopdcopy,ON
- JNE f18_bios ; no hay soporte DISKCOPY
- CMP BYTE PTR [BX+1],2 ; formatos 2M
- JE fmt_2m
- CMP fdread,ON ; formatos FDFORMAT...
- JE fmt_dos_fdf
- JMP f18_bios ; no se emula soporte FDFORMAT
-
- fmt_2m: MOV BX,[BX+2]
- PUSH BX
- CALL ptr_BX_data
- MOV DI,BX
- POP BX
- MOV [DI],BX ; formato 2M seleccionado
- MOV BX,cilsec
- MOV [DI+2],BX
- MOV f2m_nsects,BL
- MOV f2m_npistas,BH
- XPOP <BX, DS> ; *2
- PUSH CS
- POP ES
- LEA DI,param_f2m ; tabla INT 1Eh para formato 2M
- MOV AH,0
- CLC
- RETF 2
-
- fmt_dos_fdf: PUSH BX
- CALL ptr_BX_data
- MOV WORD PTR [BX],0 ; no es formato 2M
- POP BX
- MOV ptrdat,BX
- MOV CX,cilsec
- CMP CH,43
- JBE p40
- CMP fdread,ON ; si FDREAD OFF, 5.25 no admite 720K
- JNE no_525hd
- XPUSH <AX, BX, CX, DX, DI, ES>
- MOV DL,disco
- MOV AH,8
- PUSHF
- CALL ant_i13
- CMP BL,2 ; ¿unidad de 1.2M?
- XPOP <ES, DI, DX, CX, BX, AX>
- JNE no_525hd
- CMP CL,15 ; si DD -> simular 40 pistas
- JB p40
- no_525hd: MOV CH,79 ; forzar nº de pistas soportado
- JMP p40u80
- p40: MOV CH,39
- p40u80: MOV CL,[BX+2] ; forzar nº de sectores soportado
- MOV DL,disco
- XPOP <BX, DS> ; *3
- PUSHF
- CALL CS:ant_i13 ; la BIOS estándar no protestará
- PUSHF ; *
- XPUSH <DS, SI> ; **
- MOV SI,40h
- MOV DS,SI
- MOV SI,90h
- MOV CL,CS:disco
- MOV CH,0
- ADD SI,CX
- AND BYTE PTR DS:[SI],11011111b ; sin doble stepping
- CMP BYTE PTR CS:cilsec+1,43 ; ¿80 pistas?
- JA step_ok ; así es
- OR BYTE PTR DS:[SI],00100000b ; poner doble stepping
- step_ok: PUSH ES
- POP DS ; DS -> tabla parámetros BIOS
- PUSH CS
- POP ES ; ES -> nuestra futura tabla
- MOV SI,DI
- LEA DI,param_fxx
- MOV CX,13 ; mejor 13 que 11
- CLD
- REP MOVSB ; copiar tabla BIOS a RAM
- LEA DI,param_fxx
- PUSH BX ; ***
- MOV BX,CS:ptrdat
- MOV BL,CS:[BX+3]
- MOV ES:[DI+7],BL ; GAP3 correcto para formateo
- POP BX ; ***
- MOV CX,CS:cilsec
- MOV DL,CS:disco
- XPOP <SI, DS> ; **
- POPF ; *
- MOV ES:[DI+11],CH ; nº pistas solicitado
- MOV ES:[DI+4],CL ; nº sectores solicitado
- RETF 2
-
- ; ------------ Nueva función 5.
-
- format: CMP SI,"2M" ; ¿llaman directamente a 2M?
- JE fmt_estandar
- PUSH BX ; nueva función de formateo
- CALL ptr_BX_data
- CMP WORD PTR CS:[BX],0
- JNE formatea_2m ; formato 2M
- POP BX
- JMP fmt_estandar ; formato DOS/FDF
-
- ; --- Formateo 2M en curso.
-
- formatea_2m: XPUSH <SI, DI, BP> ; * BX ya apilado
- XPUSH <DS, ES> ; **
- XPUSH <CX, DX> ; ***
- XPUSH <CS, CS>
- XPOP <DS, ES>
- CALL build_boot ; construir arranque disco 2M
- XPOP <DX, CX> ; ***
- CALL format_2m ; formatear pista disco 2M
- XPOP <ES, DS> ; **
- XPOP <BP, DI, SI, BX> ; *
- RETF 2
-
- ; --- Formateo estándar/fdformat en curso. Se aplican
- ; las optimizaciones activas a menos que se detecte
- ; un formato extraño en el programa que llama.
-
- fmt_estandar: XPUSH <AX, BX, CX, DX> ; *1-2
- XPUSH <SI, DI, BP>
- XPUSH <DS, ES>
- CMP SI,"2M" ; ¿formateo directo con 2M?
- JE fmt_ok
- MOV SI,BX ; ES:SI buffer
- MOV BL,CH ; cilindro
- MOV BH,DH ; cabezal
- XOR DI,DI
- MOV DS,DI
- LDS DI,DS:[1Eh*4] ; DS:DI -> INT 1Eh
- MOV CL,[DI+4]
- MOV CH,0 ; CX = nº sectores INT 1Eh
- PUSH CX ; **1-2
- test_tam: CMP ES:[SI],BX
- JNE test_raro ; cilindro/cabezal falsos
- CMP BYTE PTR ES:[SI+2],36
- JA test_raro ; nº de sector extraño
- CMP BYTE PTR ES:[SI+2],0
- JE test_raro ; nº de sector extraño
- CMP BYTE PTR ES:[SI+3],2
- JNE test_raro ; el sector no es de 512
- JMP test_otro
- test_raro: POP CX ; **1
- JMP fmt_ok ; respetar formato pedido
- test_otro: ADD SI,4
- LOOP test_tam ; ¿formato normal?
- POP CX ; **2
- CMP CS:boost,ON
- JNE no_boost ; inhibida tecnología DiskBoost
- CMP CL,15
- JE diskboost ; 1.2M
- CMP CL,18
- JNE no_boost ; 1.44M
- diskboost: JMP boostdisk
- no_boost: CMP CL,21
- JE optimiza ; siempre en 1.72M (interleave)
- CMP CS:opt,ON
- JE optimiza ; activada optimización general
- fmt_ok: XPOP <ES, DS>
- XPOP <BP, DI, SI>
- XPOP <DX, CX, BX, AX> ; *1
-
- ; --- Formatear normal sin optimización.
-
- JMP jmp_bios ; función BIOS original
-
- ; --- Formatear con optimización «sector sliding».
-
- optimiza: PUSH CS
- POP ES
- MOV BP,BX ; cabezal/cilindro
- PUSH DX ; * cabezal/unidad
- LEA SI,buffer_extra
- MOV AL,BYTE PTR CS:x_hd
- MOV AH,BYTE PTR CS:y_hd
- CMP CL,15 ; 15 o más sectores -> HD
- JAE xy_ok
- MOV AL,BYTE PTR CS:x_dd
- MOV AH,BYTE PTR CS:y_dd
- xy_ok: PUSH AX ; AL = /X , AH = /Y
- ADD AL,AH
- MUL BL ; cilindro * (X+Y)
- MOV DX,AX
- POP AX
- MUL BH ; cabezal * X
- ADD AX,DX
- XOR DX,DX ; DX:AX = cil * (X+Y) + cab * X
- MOV BL,CL
- MOV BH,0
- DIV BX ; DL = DX:AX MOD sectores = dis
- SUB DL,CL
- NEG DL ; DL = sectores - dis =
- MOV BL,CL ; = primer_sector - 1
- MOV BH,[DI+7] ; GAP3 de formateo
- SUB BH,BYTE PTR CS:mingap ; BH < 0 si GAP3 muy pequeño
- MOV DI,CX
- SHL DI,1
- SHL DI,1 ; DI = CX * 4
- ADD DI,SI ; DI -> final tabla de datos
- MOV AX,SI ; AX -> inicio tabla de datos
- SUB SI,4
- MOV DH,2 ; tamaño 512
- PUSH CX ; **
- genera_pn: ADD SI,4
- INC DX ; siguiente sector en la pista
- CMP DL,BL
- JBE ns_ok
- MOV DL,1 ; empezar desde el 1
- ns_ok: AND BH,BH
- JNS pon_sec ; GAP3 es bastante grande
- ADD SI,4 ; si no, usar interleave 2:1
- CMP SI,DI
- JB pon_sec
- MOV SI,AX
- pon_sec: MOV ES:[SI],BP ; cilindro / cabezal
- MOV ES:[SI+2],DX ; nº sector / tamaño
- LOOP genera_pn
- POP CX ; ** nº sectores
- MOV AL,CL ; AL = sectores
- POP DX ; * DL = unidad, DH = cabezal
- MOV CX,BP
- XCHG CH,CL ; CH = cilindro
- MOV AH,5 ; formatear
- LEA BX,buffer_extra
- PUSHF
- CALL CS:ant_i13
- JMP fmt_ret
-
- ; --- Formatear con optimización «DiskBoost».
-
- boostdisk: PUSH CS
- POP ES
- PUSH [DI+6] ; * preservar [DI+7]
- MOV DH,CL ; DH = sectores
- MOV AH,40 ; GAP3 para 1.2
- CMP CL,15
- JE fmtgp_ok
- MOV AH,45 ; GAP3 para 1.44
- fmtgp_ok: MOV [DI+7],AH ; GAP3 final
- LEA SI,buffer_extra
- INC CL ; como mínimo 1 sector más
- MOV AH,BH ; cabezal
- XOR AH,1 ; 0 en cabezal 1 y 1 en el 0
- ADD AH,CL ; otro sector más en cabezal 0
- PUSH [DI+4] ; ** preservar [DI+4]
- MOV [DI+4],AH ; número de sectores final
- MOV AL,CL ; sectores (15 ó 18) + 1
- MOV CL,AH ; sectores finales (AL + 0 ó 1)
- MOV AH,2 ; tamaño 2 (512 bytes)
- haz_tabla: MOV ES:[SI],BX ; cilindro / cabezal
- MOV ES:[SI+2],AX ; número de sector / tamaño
- CMP AL,DH ; ¿excedido el número normal?
- JBE fmt_nsok ; no
- MOV WORD PTR ES:[SI+2],0 ; pues simular sector raro
- fmt_nsok: INC AL
- CMP AL,[DI+4] ; ¿alcanzado último sector?
- JBE nsec_ok ; no
- MOV AL,1 ; empezar por el primero
- nsec_ok: ADD SI,4
- LOOP haz_tabla ; completar tabla
- MOV AH,5 ; función de formateo
- MOV AL,[DI+4] ; nº sectores finales
- MOV CH,BL ; cilindro
- MOV DH,BH ; cabezal
- LEA BX,buffer_extra ; nuestra tabla
- PUSHF
- CALL CS:ant_i13 ; formatear pista
- POP [DI+4] ; ** restaurar [DI+4]
- POP [DI+6] ; * restaurar [DI+7]
-
- ; --- Retorno tras formateo sin variar flags ni AX.
-
- fmt_ret: XPOP <ES, DS>
- XPOP <BP, DI, SI>
- XPOP <DX, CX, BX> ; *2
- INC SP
- INC SP ; quitar AX de la pila
- RETF 2
-
- ; ------------ Buscar en nuestra tabla el formato solicitado.
-
- get_fmt PROC
- XPUSH <AX, CX, DX> ; *
- XPUSH <SI, DI, BP>
- get_rep: MOV AH,8
- MOV DL,disco
- PUSH ES
- PUSHF
- CALL CS:ant_i13 ; ¿tipo de unidad?
- POP ES
- JNC t_ok
- CMP AH,6
- JE get_rep
- STC
- JMP no_hay_fmt
- t_ok: AND BL,BL
- JZ no_hay_fmt
- DEC BL
- MOV BH,0
- SHL BL,1
- ADD BX,OFFSET tabla_tipos
- MOV BX,[BX] ; BX -> lista formatos
- MOV CX,cilsec
- busca_fmt: CMP CL,[BX]
- JE ese_fmt ; encontrado
- busca_otro: CMP BYTE PTR [BX],0
- JE no_hay_fmt ; fin de la tabla
- ADD BX,4
- JMP busca_fmt
- ese_fmt: CLC ; retorno correcto
- JMP fmt_rt
- no_hay_fmt: STC ; formato no encontrado
- fmt_rt: XPOP <BP, DI, SI>
- XPOP <DX, CX, AX> ; *
- RET
- get_fmt ENDP
-
- nueva_i13 ENDP
-
- ; ------------ Apuntar BX a los datos de la unidad DL.
-
- ptr_BX_data PROC
- LEA BX,fmt_A
- AND DL,DL
- JZ fmtptr_ok
- LEA BX,fmt_B
- fmtptr_ok: RET
- ptr_BX_data ENDP
-
- ; ------------ Datos residentes.
-
- disco DB ?
- cilsec DW ? ; cilindros/sectores en curso
- ptrdat DW ? ; puntero temporal a los datos
-
- t_tams DB 1,2,3,6,11,22 ; sectores 128 ocupados por un
- ; sector mayor en 2MF /M
-
- param_f2m LABEL BYTE ; Tabla formato INT 1Eh
- DB 0BFh, 002h, 025h, 002h ; válida para todos los
- f2m_nsects DB 016h, 01Bh, 0FFh, 06Ch ; formatos 2M ajustando
- DB 0F6h, 00Fh, 008h ; el número de sectores
- f2m_npistas DB 051h, 000h ; y pistas
-
- param_fxx LABEL BYTE ; Tabla formato INT 1Eh
- DB ?, ?, ?, ? ; para formatos del DOS
- DB ?, ?, ?, ? ; y FDFORMAT
- DB ?, ?, ?
- DB ?, ?
-
- tabla_tipos DW t360 ; unidad tipo 1
- DW t1200 ; unidad tipo 2
- DW t720 ; unidad tipo 3
- DW t1440 ; unidad tipo 4
- DW t2880 ; unidad tipo 5 (BIOS AMI)
- DW t2880 ; unidad tipo 6 (BIOS IBM)
-
- ; Estructura de esta tabla (por cada tipo de formato):
- ; 1) DB Nº de sectores del formato (0-última entrada)
- ; 2) DB byte de tipo de formato: (0-DOS, 1-FDF, 2-2M)
- ; 3) DW Sólo si es 2M, puntero a la tabla del formato
- ; 3) DB Sólo si es FDF/DOS, nº sectores "legales"
- ; 4) DB Sólo si es FDF/DOS, GAP3 para formateo
- ; Esta tabla se ordena para que las unidades de mayor
- ; densidad soporten los formatos de doble densidad. En
- ; los formatos comunes a 2M/FDF se coloca primero 2M.
-
- t1200 DB 15,0, 15, 84 ; 1.20M - DOS
- DB 16,1, 15, 64 ; 1.31M - FDF
- DB 17,1, 15, 33 ; 1.39M - FDF
- DB 18,2 ; 1.47M - 2M
- DW f_1476
- DB 18,1, 15, 2 ; 1.47M - FDF
- DB 19,2 ; 1.55M - 2M
- DW f_1558
- t360 DB 8,0, 8, 127 ; 320K - DOS
- DB 9,0, 9, 80 ; 360K - DOS
- DB 10,2 ; 820K - 2M
- DW f_820_525
- DB 10,1, 9, 40 ; 820K - FDF
- DB 11,2 ; 902K - 2M
- DW f_902
- DB 0 ; fin de la tabla 5.25
-
- t2880 DB 36,0, 36, 80 ; 2.88M - DOS
- DB 44,2 ; 3.60M - 2M
- DW f_3608
- DB 46,2 ; 3.77M - 2M
- DW f_3772
- t1440 DB 18,0, 18, 108 ; 1.44M - DOS
- DB 19,1, 18, 72 ; 1.55M - FDF
- DB 20,1, 18, 40 ; 1.64M - FDF
- DB 21,1, 18, 12 ; 1.72M - FDF
- DB 22,2 ; 1.80M - 2M
- DW f_1804
- DB 23,2 ; 1.88M - 2M
- DW f_1886
- t720 DB 9,0, 9, 80 ; 720K - DOS
- DB 10,2 ; 820K - 2M
- DW f_820_350
- DB 10,1, 9, 40 ; 820K - FDF
- DB 12,2 ; 984K - 2M
- DW f_984
- DB 13,2 ; 1.06M - 2M
- DW f_1066
- DB 14,2 ; 1.14M - 2M
- DW f_1148
- DB 0 ; fin de la tabla 3.5
-
- ; --- Sector de arranque de futuro disquete 2M y
- ; área de trabajo para el formateo estándar.
-
- buffer_fmt DB 0E9h ; JMP 16 bit
- bf_jmp DW ? ; offset del salto
- bf_id DB "2M-STV" ; system ID
- bf_fmt DW ? ; formato 2M correspondiente
- DW 512 ; bytes por sector
- bf_sclus DB 1 ; sectores por cluster
- DW 1 ; sectores reservados al comienzo
- DB 2 ; número de copias de la FAT
- bf_root DW 224 ; entradas al directorio raíz
- bf_totsects DW ? ; sectores totales en el disco
- bf_media DB ? ; descriptor de medio
- bf_sectfat DW ? ; sectores ocupados por cada FAT
- bf_sectpista DW ? ; sectores por pista
- DW 2 ; número de cabezales
- DD 0 ; sectores especiales reservados
- DD 0 ; número de sectores (32 bit)
- DB 0 ; unidad física
- DB 0 ; reservado
- DB 29h ; disquete DOS >= 4.0
- DD 00000000h ; número de serie
- DB "NO NAME " ; etiqueta del disco
- DB "FAT12 " ; tipo de FAT
- DB 0 ; reservado por 2M
- bf_checksum DB ? ; checksum de 2M (si empleado)
- DB 7 ; versión formato 7 (SuperBOOT)
- bf_fmt_vels DB ? ; a 1 si formato 2MF/M
- DB ? ; velocidad transferencia pista 0
- DB ? ; velocidad " pista != 0
- bf_ptrboot DW ? ; offset al programa de arranque
- bf_ptrT1 DW 76 ; T1: información para pista 0
- bf_ptrT2 DW ? ; T2: información para pista!=0
- bf_ptrT3 DW ? ; T3: tabla de tamaño de sectores
-
- buffer_extra DB 512 DUP (0) ; espacio para un sector y para
- ; el resto del arranque de 2M
-
- fin_resid_no2m LABEL BYTE
-
- ; *********************************************
- ; * FIN DEL AREA RESIDENTE SIN SOPORTE 2M *
- ; *********************************************
-
- ; ------------ Construir sector de arranque de disquete 2M. A la
- ; entrada, BX apunta al formato en la tabla.
-
- build_boot PROC
- MOV SI,[BX] ; SI -> tabla con información 2M
- MOV BX,[BX+2] ; BL = sectores, BH = cilindros-1
- INC BH ; BH = cilindros
- MOV AX,BX
- MOV AH,0
- MOV bf_sectpista,AX
- MUL BH ; sectores * cilindros
- SHL AX,1 ; por dos cabezales
- MOV bf_totsects,AX
- MOV CX,[SI] ; tipo formato
- MOV bf_fmt,CX
- MOV BL,0F0h ; media ID para 1.47M
- CMP CX,"60"
- JE media_ok
- MOV BL,0FAh ; media ID para el resto
- media_ok: MOV bf_media,BL
- MOV CX,bf_root ; entradas directorio raíz
- SHR CX,1
- SHR CX,1
- SHR CX,1
- SHR CX,1 ; ficheros raiz / 16
- SUB AX,CX ; sectores totales - raiz
- DEC AX ; y menos boot
- MOV BX,3
- MUL BX ; 3 * (NumSect-(FichRaiz>>4)-1)
- XPUSH <AX, DX>
- MOV AX,1024
- MOV DL,bf_sclus
- MOV DH,0
- MUL DX
- ADD AX,6
- MOV BX,AX ; 6 + 1024 * SectCluster
- XPOP <DX, AX>
- DIV BX
- AND DX,DX ; ¿división exacta?
- JZ tfat_ok
- INC AX ; redondear
- tfat_ok: MOV bf_sectfat,AX
- LEA DI,bf_fmt_vels
- ADD SI,2
- CLD
- MOVSB
- MOVSW
- SUB SI,2+3 ; anular ADD y MOVS
- LEA DI,buffer_extra ; información 1ª pista física
- MOV AX,[SI+5]
- MOV [DI],AX ; AL = nº sectores, AH = GAP3
- ADD DI,2
- MOV BX,[SI+7] ; BL = 1º sector, interleave BH
- MOV DL,BH
- MOV DH,0 ; interleave DX
- MOV AH,0 ; AX sectores
- MOV BH,AL ; BH sectores (control bucle)
- MOV CX,AX
- ADD CX,DI ; ptr al último byte de T1 + 1
- MOV BP,DI
- crea_T1: MOV [DI],BL ; poner sector
- INC BL ; siguiente sector
- ADD DI,DX ; factor de interleave
- CMP DI,CX
- JB ptr_ok
- INC BP
- MOV DI,BP ; recargar puntero
- ptr_ok: DEC BH
- JNZ crea_T1
- MOV DI,CX ; puntero a T2
- MOV bf_ptrT2,DI
- SUB bf_ptrT2,OFFSET buffer_fmt
- CMP bf_fmt_vels,1
- JE fmt_stv
- MOV CX,5 ; formato 2MF /F...
- ADD SI,9
- REP MOVSB ; creada T2
- MOV bf_ptrT3,DI
- SUB bf_ptrT3,OFFSET buffer_fmt
- MOV CL,[DI-5]
- MOV CH,0
- MOV AL,[DI-3]
- REP STOSB ; creada T3
- JMP boot_build
- fmt_stv: MOV CX,3 ; formato 2MF /M...
- ADD SI,9
- REP MOVSB ; creando T2
- MOV CL,[DI-1]
- MOV CH,0 ; nº sectores
- PUSH CX ; *
- MOV BX,SI
- ADD BX,CX
- DEC BX ; BX apunta a futura T3 - 1
- MOV DL,129
- crea_t2: MOV [DI],DL ; nº sector a renumerar
- LODSB
- MOV [DI+1],AL ; nº sector final
- PUSH BX ; **
- XLAT
- MOV [DI+2],AL ; tamaño
- LEA BX,t_tams
- XLAT
- ADD DL,AL
- POP BX ; **
- ADD DI,3
- LOOP crea_t2
- POP CX ; *
- MOV bf_ptrT3,DI
- SUB bf_ptrT3,OFFSET buffer_fmt
- REP MOVSB
- boot_build: MOV bf_ptrboot,DI ; apuntar arranque
- SUB bf_ptrboot,OFFSET buffer_fmt
- MOV bf_jmp,DI ; salto al BOOT
- SUB bf_jmp,OFFSET bf_id
- MOV BX,DI
- LEA SI,buffer_fmt[64]
- XOR AL,AL
- eval_chk: DEC BX ; calcular checksum
- CMP BX,SI
- JB pon_chk
- ADD AL,[BX]
- JMP eval_chk
- pon_chk: NEG AL
- MOV bf_checksum,AL
- LEA SI,_BootHDPrg ; código de arranque HD
- MOV CX,_BootHDPrgLong
- CMP bf_sectpista,15
- JAE pr_boot_ok
- LEA SI,_BootDDPrg ; código de arranque DD
- MOV CX,_BootDDPrgLong
- pr_boot_ok: CALL xms_movsb ; copiar arranque
- JZ pr_boot_bien ; (podría fallar en XMS)
- INC bf_checksum ; fallo: forzar mal checksum
- pr_boot_bien: MOV BX,DI
- LEA DI,buffer_fmt[511]
- LEA SI,msg_final[15]
- MOV CX,16
- STD
- firma: CMP DI,BX
- JBE fin_build
- MOVSB ; completar signatura final
- LOOP firma
- fill0: CMP DI,BX
- JBE fin_build
- MOV BYTE PTR [DI],0 ; rellenar de ceros el resto
- DEC DI
- JMP fill0
- fin_build: RET
- build_boot ENDP
-
- ; ------------ Formatear pista de disquete 2M.
-
- format_2m: MOV SI,"2M" ; formateo 2M
- MOV AH,5 ; función de formateo
- XPUSH <CX, DX> ; *
- MOV AL,7Fh
- LEA BX,buffer_fmt ; sector de arranque disco 2M
- PUSHF
- CALL ant_i13 ; invocar el formateo de 2M
- XPOP <DX, CX> ; *
- JC ret_fmt ; fallo
- MOV AL,CH ; no hubo fallo
- OR AL,DH
- JZ init_t0 ; es cilindro 0 y cabezal 0
- CMP bf_fmt_vels,1
- CLC ; no había error
- JNE ret_fmt ; no es formato 2MF /M
- XPUSH <CX, DX> ; *
- MOV AX,bf_sectpista ; nº sectores
- MOV AH,3 ; función de escritura
- OR DH,80h ; forzar escritura física
- MOV CL,1 ; desde el primer sector
- PUSHF
- CALL ant_i13
- JMP ret_fmt_p
- init_t0: XPUSH <CX, DX> ; inicializar primera pista
- MOV AX,301h ; escribir 1 sector
- LEA BX,buffer_fmt ; el sector de arranque físico
- MOV CX,1 ; sector 1
- MOV DH,80h ; no sector de arranque lógico
- PUSHF
- CALL ant_i13 ; grabar arranque físico
- JC ret_fmt_p ; hubo problemas
- MOV CX,bf_sectfat
- CMP CL,8
- JAE crea_SB ; es disco de alta densidad
- CLC ; no había error
- JMP ret_fmt_p
- crea_SB: LEA SI,_Boot2mCode ; grabar SuperBOOT...
- ADD CL,3 ; CL primer sector
- MOV BX,5 ; número de sectores
- graba_SB: PUSH BX ; **1-2
- PUSH CX ; ***1-2
- LEA DI,buffer_extra ; ES:DI -> área de 512 bytes
- MOV CX,512
- CLD
- CALL xms_movsb ; traer sector de XMS/conv.
- JNZ fallo_SB ; fallo del controlador XMS
- POP CX
- PUSH CX
- LEA BX,buffer_extra ; ES:BX buffer
- MOV AX,301h ; escribir 1 sector
- MOV DH,80h ; sector físico, no lógico
- PUSHF
- CALL ant_i13 ; grabar sector SuperBOOT
- POP CX ; ***1
- INC CL ; siguiente sector
- POP BX ; **1
- DEC BX
- JNZ graba_SB ; grabar resto de SuperBOOT
- JMP ret_fmt_p
- fallo_SB: POP CX ; ***2
- POP BX ; **2
- STC ; fallo al grabar SuperBOOT
- MOV AH,32 ; "fallo del controlador" :-)
- ret_fmt_p: XPOP <DX, CX> ; *
- ret_fmt: MOV AL,0
- RET
-
- ; ------------ Ejecutar MOVSB si no hay XMS o simular MOVSB desde la
- ; memoria XMS si la hay. Al offset en SI relativo a la
- ; memoria XMS se le resta el offset de fin_resid_xms para
- ; determinar el desplazamiento efectivo en la XMS.
-
- xms_movsb PROC
- CMP xms_handle,0
- JNE mov_xms
- REP MOVSB
- CMP AL,AL ; ZF = 1 -> no hay error
- JMP ret_xms_movsb
- mov_xms: XPUSH <AX, CX, SI, DS>
- INC CX
- AND CL,11111110b ; nº bytes par
- SUB SI,OFFSET fin_resid_xms ; dirección en XMS
- XOR AX,AX
- PUSH ES
- PUSH DI ; destino ES:DI
- PUSH AX ; destino memoria convencional
- PUSH AX
- PUSH SI ; offset 0:SI en mem. ext.
- PUSH xms_handle ; handle destino XMS
- PUSH AX ; tamaño bloque (parte alta)
- PUSH CX ; tamaño bloque (parte baja)
- PUSH SS
- POP DS
- MOV SI,SP ; DS:SI apuntando a la pila
- MOV AH,0Bh ; función para mover EMB
- CALL CS:xms_handler ; ejecutar función XMS
- ADD SP,16 ; equilibrar pila
- CMP AL,1 ; ¿falló el controlador?
- XPOP <DS, SI, CX, AX>
- JNE ret_xms_movsb ; error (ZF = 0)
- ADD SI,CX
- ADD DI,CX
- XOR CX,CX ; ZF = 1
- ret_xms_movsb: RET
- xms_movsb ENDP
-
- ; Tabla con las definiciones físicas de formatos 2M.
- ; La primera línea de todas las entradas significa:
- ; 1) Códigos del formato
- ; 2) Flag de escritura tras formateo (1 si 2MF/M)
- ; 3) Velocidad de transferencia en pista 0
- ; 4) Velocidad de transferencia en restantes pistas
- ; 5) Sectores físicos de 512 bytes en pista 0
- ; 6) GAP3 para formateo en pista 0
- ; 7) Primer número de sector en pista 0
- ; 8) Interleave en pista 0
- ; Los siguientes bytes (formato para pista!=0):
- ; En el formato estándar (2MF /F):
- ; 1) Sectores físicos de 1 ó 2 Kbytes
- ; 2) GAP3 para formateo
- ; 3) Tamaño sector
- ; 4) sector sliding al conmutar de cabezal (/X)
- ; 5) sector sliding al conmutar de cilindro (/Y)
- ; En el formato de máxima capacidad (2MF /M):
- ; 1) Nº sectores 128 bytes para preformateo
- ; 2) GAP3 para formateo
- ; 3) Sectores físicos efectivos
- ; 4) Sectores numerados (tantos como indique (3))
- ; 5) Tamaños de sector ordenados (ídem)
-
- f_820_525 LABEL BYTE
- DB "05",0,1,1,9,80,1,1
- DB 5,100,3,1,1
- f_902 LABEL BYTE
- DB "01",1,1,1,9,80,1,1
- DB 32,4,5,3,1,4,2,0,4,2,4,3,0
- f_1476 LABEL BYTE
- DB "06",0,0,0,16,60,1,1
- DB 9,50,3,1,2
- f_1558 LABEL BYTE
- DB "02",1,0,0,17,25,1,2
- DB 53,3,6,4,1,5,2,6,3,4,4,2,4,4,3
- f_820_350 LABEL BYTE
- DB "07",0,2,2,9,80,1,1
- DB 5,100,3,1,1
- f_984 LABEL BYTE
- DB "07",0,2,1,9,80,1,1
- DB 6,100,3,1,1
- f_1066 LABEL BYTE
- DB "03",1,2,1,9,80,1,1
- DB 38,5,6,3,1,4,2,0,0,4,2,4,4,0,0
- f_1148 LABEL BYTE
- DB "03",1,2,1,9,80,1,1
- DB 38,2,4,3,1,4,2,4,3,4,4
- f_1804 LABEL BYTE
- DB "08",0,0,0,19,70,1,1
- DB 11,40,3,1,2
- f_1886 LABEL BYTE
- DB "04",1,0,0,19,70,1,1
- DB 64,3,7,4,1,5,2,6,3,7,4,4,4,4,4,3,2
- f_3608 LABEL BYTE
- DB "10",0,3,3,36,108,1,1
- DB 11,126,4,1,2
- f_3772 LABEL BYTE
- DB "09",1,3,3,36,108,1,1
- DB 127,5,12,1,7,2,8,3,9,4,10,5,11,6,12
- DB 4,4,4,4,4,4,4,4,4,4,4,3
-
- msg_final DB "Made in Spain", 0, 055h, 0AAh
-
- fin_resid_xms LABEL BYTE
-
- ; ****************************************************
- ; * FIN DEL AREA RESIDENTE CON DATOS DE 2M EN XMS *
- ; ****************************************************
-
- ; --- Código 2M para grabar en los 5 sectores ocultos
- ; de los disquetes de alta densidad al formatear.
-
- _Boot2mCode: INCLUDE 2MFBOOT.DB
- _Boot2mLong EQU $-OFFSET _Boot2mCode
-
- ; --- Sectores de arranque de los disquetes 2M.
-
- _BootHDPrg: INCLUDE 2MBOOTHD.INC
- _BootHDPrgLong EQU $-OFFSET _BootHDPrg
-
- _BootDDPrg: INCLUDE 2MBOOTDD.INC
- _BootDDPrgLong EQU $-OFFSET _BootDDPrg
-
- fin_residente EQU $ ; fin del área residente en el peor caso
-
- ; ********************************************************************
- ; * FIN DEL AREA RESIDENTE CON DATOS DE 2M EN MEMORIA CONVENCIONAL *
- ; ********************************************************************
-
- bytes_resid_n2 EQU fin_resid_no2m - ini_residente ; sin 2M
- bytes_resid_x EQU fin_resid_xms - ini_residente ; datos 2M en XMS
- bytes_resid EQU fin_residente - ini_residente ; datos 2M no XMS
-
-
- ; *****************************
- ; * *
- ; * I N S T A L A C I O N *
- ; * *
- ; *****************************
-
- main PROC
- LEA BP,parametros
- MOV BX,81h
- CALL obtener_param ; analizar posibles parámetros
- JNC params_ok ; son correctos
- OR error,ERRSINTAX
- JMP informar
- params_ok: CALL inic_general ; inicializar ciertas variables
- TEST error,MALBIOS
- JZ bios_ok
- JMP informar
- bios_ok: CALL set_i40
- CMP param_u,ON ; ¿se solicita desinstalarlo?
- JNE cont_ins ; no
- CALL residente? ; sí: ¿está residente?
- JNC desinstalable
- OR error,NOINSTALADO ; programa aún no instalado
- JMP informar
- desinstalable: CALL testWin
- JNC win_out_ok
- OR error,WIN_UNLOAD
- JMP informar ; no desinstalar desde Windows
- win_out_ok: OR accion,DESINSTALADO
- MOV ES,tsr_seg
- MOV DI,tsr_off
- MOV AH,ES:[DI-9]
- CALL mx_unload ; desinstalarlo:
- JC fallo_desins
- MOV DX,ES:xms_handle
- AND DX,DX
- JZ xms_free ; no usaba XMS
- CMP xms_ins,ON
- JNE xms_free ; que raro...
- MOV AH,0Ah
- CALL gestor_XMS ; liberar XMS
- xms_free: CALL set_i1e ; precauciones tabla base disco
- LEA DI,ptr_info_dos ; restaurar unidades DOS
- JMP settipo
- fallo_desins: OR error,IMPDESINS ; no es posible desinstalar
- JMP informar
- cont_ins: CALL residente?
- JNC ya_reside
- CMP AX,0 ; ¿reside una versión distinta?
- JE instalable
- OR error,NOINSTALABLE ; versión incompatible
- JMP informar
- ya_reside: OR accion,YAINSTALADO
- CMP param_noxms,ON ; /NOXMS sólo admitido 1ª vez
- JNE setpr
- err_1a_vez: OR error,PRIMERAVEZ
- JMP setpr
- instalable: CALL testWin
- JNC win_in_ok
- OR error,WIN_LOAD
- JMP informar ; no instalar desde Windows
- win_in_ok: OR accion,INSTALADO
- MOV AL,OFF
- CMP param_dis,AL
- JE ins_asi ; instalar como /NODISKCOPY
- CALL hay2m?
- JC ins_asi ; si no hay 2M, /NODISKCOPY
- MOV AL,ON ; si hay 2M, /DISKCOPY
- ins_asi: MOV param_dis,AL
- MOV sopdcopy,AL
- MOV sop2m,AL
- CALL instalar_tsr ; instalar el TSR
- JC informar
- setpr: CALL adaptar_param ; parámetros en copia residente
- MOV ES,tsr_seg
- LEA DI,ptr_info_dos ; unidades de tipo normal
- CMP ES:sopdcopy,OFF
- JE settipo ; sin soporte DISKCOPY
- CMP ES:fmt,OFF
- JE settipo ; sin apoyo a FORMAT
- LEA DI,ptr_info_2m ; unidades de tipo 2M
- settipo: CALL set_dev_params
- informar: CMP param_u,ON
- JE inf_ex
- CMP param_dis,ON
- JNE inf_ex
- CMP ES:sopdcopy,ON
- JE inf_ex
- OR error,DISKCOPYNO ; no ha funcionado /DISKCOPY
- inf_ex: CALL info
- MOV DX,mem640 ; tamaño zona residente
- AND DX,DX
- JZ fin_noresid
- MOV AX,3100h
- INT 21h ; terminar residente
- fin_noresid: MOV AX,4C00h
- INT 21h ; terminar no residente
- main ENDP
-
- instalar_tsr PROC
- CALL mx_get_handle ; obtener entrada Multiplex
- JNC handle_ok
- OR error,MX64FULL ; no quedan entradas
- STC
- RET
- handle_ok: MOV multiplex_id,AH ; entrada multiplex
- CMP sopdcopy,ON
- JE pide_xms
- MOV AX,(bytes_resid_n2+15)/16
- MOV parrafos_resid,AX ; sin soporte DISKCOPY
- JMP instalar
- pide_xms: CALL usar_XMS ; si la hay, guai
- instalar: CALL preservar_ints ; tomar nota de vectores
- CMP param_ml,ON ; ¿se indicó parámetro /ML?
- JE instalar_ml ; en efecto
- MOV AX,parrafos_resid ; área residente sin PSP
- CALL UMB_alloc ; pedir memoria superior XMS
- JNC instalar_umb ; hay la suficiente
- MOV AX,parrafos_resid
- CALL UPPER_alloc ; pedir memoria superior DOS 5
- JC instalar_ml ; no hay la suficiente
- MOV ES,AX
- CALL upper_fork ; dejar residente el bloque
- STC ; indicar que usa memoria DOS
- instalar_umb: MOV ES,AX ; segmento del bloque UMB
- MOV DI,0 ; ES:0 zona a donde reubicar
- MOV mem640,DI ; no terminar residente
- JMP instalar_asi
- instalar_ml: ADD parrafos_resid,6 ; respetar 96 bytes de PSP
- MOV AX,parrafos_resid
- MOV mem640,AX ; ocupar memoria convencional
- STC
- MOV DI,96 ; instalación mem. convencional
- CALL free_environ ; liberar espacio de entorno
- STC ; no se usa XMS
- instalar_asi: CALL inicializa_id ; inicializar identificación
- MOV CX,parrafos_resid
- CALL reubicar_prog ; reubicar programa a ES:DI
- CALL activar_ints ; interceptar vectores
- CLC
- RET
- instalar_tsr ENDP
-
-
- ;*********************************************************
- ;* *
- ;* SUBRUTINAS DE PROPOSITO GENERAL PARA LA INSTALACION *
- ;* *
- ;*********************************************************
-
- INCLUDE 2MUTIL.INC
-
- ; ------------ Ya está instalada otra versión distinta del programa.
-
- error_version PROC
- PUSH ES
- LEA DX,mal_ver_txt1
- CALL print
- LES DI,tsr_dir
- MOV AL,':'
- MOV CL,255
- CLD
- REPNE SCASB
- REPNE SCASB
- MOV DL,ES:[DI] ; número de versión
- MOV AH,2
- INT 21h
- MOV DL,'.'
- MOV AH,2
- INT 21h
- MOV DL,ES:[DI+2] ; revisión
- MOV AH,2
- INT 21h
- LEA DX,mal_ver_txt2
- CALL print
- POP ES
- RET
- error_version ENDP
-
- ; ------------ Inicializar ciertas variables.
-
- inic_general PROC
- CALL inic_XMS ; detectar controlador XMS
- MOV AX,(bytes_resid+15)/16
- MOV parrafos_resid,AX ; memoria máxima necesaria
- MOV DL,0
- CALL tipo_disco
- JNC hay_unidad
- MOV DL,1
- CALL tipo_disco
- JNC hay_unidad
- OR error,MALBIOS ; no hay disqueteras
- RET
- hay_unidad: RET
- inic_general ENDP
-
- ; ------------ Poner 3,1 Kb de datos en XMS si la hay.
-
- usar_XMS PROC
- CMP param_noxms,ON
- JE ret_usx ; parámetro /NOXMS
- CMP xms_ins,ON
- JNE ret_usx ; no hay controlador XMS
- MOV AX,XMS_off
- MOV xms_hndl_off,AX ; anotar dirección controlador
- MOV AX,XMS_seg
- MOV xms_hndl_seg,AX
- MOV AH,9 ; pedir memoria extendida
- MOV DX,4 ; 4 kbytes
- CALL gestor_XMS
- CMP AX,1
- JNE ret_usx
- MOV xms_handle,DX
- MOV AX,(bytes_resid_x+15)/16
- MOV parrafos_resid,AX ; memoria mínima necesaria
- XOR AX,AX
- PUSH AX
- PUSH AX ; desplazamiento 0:0
- PUSH DX ; handle destino mem. extendida
- LEA BX,fin_resid_xms
- PUSH CS
- PUSH BX ; segmento:offset
- PUSH AX ; handle fuente memoria conv.
- PUSH AX ; tamaño bloque (parte alta)
- MOV AX,4096
- PUSH AX ; tamaño bloque (parte baja)
- MOV SI,SP ; DS:SI apuntando a la pila
- MOV AH,0Bh ; función para mover EMB
- CALL gestor_XMS ; ejecutar función XMS
- ADD SP,16 ; equilibrar pila
- CMP AL,1 ; ¿falló el controlador?
- JE ret_usx
- MOV xms_handle,0 ; falló, no usada XMS
- MOV AX,(bytes_resid+15)/16
- MOV parrafos_resid,AX ; memoria total necesaria
- ret_usx: RET
- usar_XMS ENDP
-
- ; ------------ Inicializar área «program_id» del programa residente.
- ; A la entrada, ES:DI = seg:off a donde será reubicado
- ; y CF=0 si se utiliza memoria superior XMS.
-
- inicializa_id PROC
- PUSHF
- MOV segmento_real,ES ; anotar segmento del bloque
- MOV offset_real,DI ; ídem con el offset
- MOV AX,parrafos_resid
- MOV longitud_total,AX
- MOV AL,1
- POPF ; CF=0: usar memoria UMB XMS
- JNC info_ok
- DEC AL ; usar memoria convencional
- info_ok: OR info_extra,AL
- RET
- inicializa_id ENDP
-
- ; ------------ Devolver CF=0 si 2M o 2MX están instalados.
-
- hay2m? PROC
- PUSH AX
- PUSH ES
- LEA SI,id_2m ; identificación del programa
- MOV CX,id_2m_tam
- MOV AX,1492h
- MOV ES,AX
- MOV DI,1992h ; ES:DI protocolo de búsqueda
- CALL mx_find_tsr ; buscar si está en memoria
- JNC hay2m?_ret
- LEA SI,id_2mx ; identificación del programa
- MOV CX,id_2mx_tam
- CALL mx_find_tsr
- JNC hay2m?_ret
- STC
- hay2m?_ret: POP ES
- POP AX
- RET
- hay2m? ENDP
-
- ; ------------ Adaptar parámetros del programa ya instalado.
-
- adaptar_param PROC
- PUSH ES
- MOV ES,tsr_seg
- CMP param_dis,-1
- JE hay_fdr?
- MOV AL,param_dis
- CMP AL,OFF
- JE sopdcopy_ok ; siempre válido /NODISKCOPY
- CMP ES:sop2m,ON
- JNE hay_fdr? ; /DISKCOPY válido si hay soporte
- sopdcopy_ok: MOV ES:sopdcopy,AL
- hay_fdr?: CMP param_fdr,-1
- JE hay_opt?
- MOV AL,param_fdr
- MOV ES:fdread,AL
- hay_opt?: CMP param_opt,-1
- JE hay_boo?
- MOV AL,param_opt
- MOV ES:opt,AL
- hay_boo?: CMP param_boo,-1
- JE hay_fmt?
- MOV AL,param_boo
- MOV ES:boost,AL
- hay_fmt?: CMP param_fmt,-1
- JE adap_xh?
- MOV AL,param_fmt
- MOV ES:fmt,AL
- adap_xh?: CMP param_xh,OFF
- JE adap_yh?
- MOV AX,x_hd
- MOV ES:x_hd,AX
- adap_yh?: CMP param_yh,OFF
- JE adap_xd?
- MOV AX,y_hd
- MOV ES:y_hd,AX
- adap_xd?: CMP param_xd,OFF
- JE adap_yd?
- MOV AX,x_dd
- MOV ES:x_dd,AX
- adap_yd?: CMP param_yd,OFF
- JE adap_g?
- MOV AX,y_dd
- MOV ES:y_dd,AX
- adap_g?: CMP param_g,OFF
- JE fin_adap
- MOV AX,mingap
- MOV ES:mingap,AX
- fin_adap: POP ES
- RET
- adaptar_param ENDP
-
- ; ------------ Informar al usuario.
-
- info PROC
- CMP param_ayuda,ON ; ¿solicitud de ayuda?
- JNE info_normal?
- LEA DX,ayuda_txt
- CALL print
- JMP fin_info
- info_normal?: CMP param_xayuda,ON ; ¿solicitud de más ayuda?
- JNE info_normal
- LEA DX,mas_ayuda_txt
- CALL print
- JC salir_hlp
- JMP fin_info
- salir_hlp: LEA DX,limpia_txt ; se pulsó ESC en la ayuda
- CALL print
- JMP fin_info
- info_normal: LEA DX,programa_txt
- CALL print
- TEST error,0FFFFh
- JZ info_ins ; no hay error
- JMP info_err ; lo hay: informar del mismo
- info_ins: LEA DX,instalado_txt
- TEST accion,INSTALADO ; ¿informar "instalado"?
- JZ info_modo
- CALL print
- CALL advertir
- JMP fin_info
- info_modo: LEA DX,ya_instal_txt
- TEST accion,YAINSTALADO ; ¿informar "ya instalado"?
- JNZ acc_ok
- LEA DX,des_ok_txt ; informar "desinstalado"
- CALL print
- JMP fin_info
- acc_ok: CALL print ; instalado/ya instalado...
- PUSH ES
- MOV ES,tsr_seg
- LEA DX,modo_boo_txt
- CALL print
- LEA DX,activo_txt
- CMP ES:boost,ON
- JE boo_onoff_ok
- LEA DX,inactivo_txt
- boo_onoff_ok: CALL print
- LEA DX,modo_opt_txt
- CALL print
- LEA DX,activo_txt
- CMP ES:opt,ON
- JE opt_onoff_ok
- LEA DX,inactivo_txt
- opt_onoff_ok: CALL print
- LEA DX,modo_fdr_txt
- CALL print
- LEA DX,activo_txt
- CMP ES:fdread,ON
- JE fdr_onoff_ok
- LEA DX,inactivo_txt
- fdr_onoff_ok: CALL print
- LEA DX,sopdc_txt ; soporte DISKCOPY
- CMP ES:sopdcopy,ON
- JE modo_sop_ok
- LEA DX,nosopdc_txt ; no hay soporte DISKCOPY
- modo_sop_ok: CALL print
- CMP ES:sop2m,OFF
- JE modo_fmt? ; no hay datos para DISKCOPY
- LEA DX,no_xms_txt
- CMP ES:xms_handle,0
- JE modo_xms_ok
- LEA DX,xms_txt
- modo_xms_ok: CALL print
- modo_fmt?: CMP ES:fmt,OFF
- JE modos_fin
- CMP ES:sopdcopy,OFF
- JE modos_fin
- LEA DX,sop_fmt_txt ; soporte extra para FORMAT
- CALL print
- modos_fin: POP ES
- CALL advertir
- JMP fin_info
- info_err: LEA DX,err_sintax_txt
- TEST error,ERRSINTAX ; ¿error de sintaxis?
- JZ otroerr1
- CALL print
- otroerr1: LEA DX,mal_bios_txt
- TEST error,MALBIOS ; ¿imposible detectar
- JZ otroerr2 ; tipo unidades?
- CALL print
- otroerr2: LEA DX,imp_desins_txt
- TEST error,NOINSTALADO ; no instalado, ¿piden
- JZ otroerr4 ; desinstalar?
- CALL print
- otroerr4: LEA DX,des_no_ok_txt
- TEST error,IMPDESINS ; ¿imposible desinstalar?
- JZ otroerr5
- CALL print
- otroerr5: TEST error,NOINSTALABLE ; ¿versión incorrecta?
- JZ otroerr6
- CALL error_version
- otroerr6: LEA DX,nocabe_txt
- TEST error,MX64FULL ; ¿imposible instalar?
- JZ otroerr8
- CALL print
- otroerr8: LEA DX,win_ld_txt
- TEST error,WIN_LOAD ; ¿instalar desde Windows?
- JZ otroerr9
- CALL print
- otroerr9: LEA DX,win_ul_txt
- TEST error,WIN_UNLOAD ; ¿desinstalar desde Windows?
- JZ otroerr10
- CALL print
- otroerr10: LEA DX,pmt_ins_txt
- TEST error,PRIMERAVEZ ; ¿parámetros no permitidos?
- JZ otroerr11
- CALL print
- otroerr11: LEA DX,pmt_ndc_txt
- TEST error,DISKCOPYNO ; ¿/DISKCOPY imposible?
- JZ fin_info
- CALL print
- fin_info: RET
-
- advertir: MOV AL,param_xh
- ADD AL,param_yh
- ADD AL,param_xd
- ADD AL,param_yd
- ADD AL,param_g
- CMP AL,OFF
- JE fin_adv
- LEA DX,aviso_txt
- CALL print
- fin_adv: RET
-
- info ENDP
-
- ; ------------ Utilizar preferentemente INT 40h en lugar de INT 13h.
- ; para saber si INT 13h en este ordenador acaba llamando
- ; a la INT 40h, se desvía la INT 40h y se provoca un
- ; inocuo reset de disquetes vía INT 13h para comprobar si
- ; pasa por INT 40h.
-
- set_i40 PROC
- CALL test_i40
- TEST accion,I40
- JZ set_i40_ret ; no soportada la INT 40h
- MOV i13_40_0,40h
- MOV i13_40_1,40h ; usar INT 40 en vez de INT 13
- set_i40_ret: RET
- set_i40 ENDP
-
- ; --- Comprobar si la INT 40h está en uso
-
- test_i40: XPUSH <DS, ES> ; *
- MOV AX,3540h
- INT 21h
- XPUSH <ES, BX> ; vector de INT 40h original
- LEA DX,i40_aux
- MOV AX,2540h
- INT 21h ; establecer nueva INT 40h
- XOR AX,AX
- MOV DL,0
- INT 13h ; reset de disco
- XPOP <DX, DS>
- MOV AX,2540h
- INT 21h ; restaurar INT 40h original
- XPOP <ES, DS> ; *
- RET
-
- i40_aux PROC
- OR CS:accion,I40 ; sí utilizada INT 40h
- IRET ; desde la INT 13h
- i40_aux ENDP
-
- ; ------------ Desde Windows, no se permite instalar o desinstalar.
-
- testWin PROC
- PUSH AX
- CMP param_w,ON ; ¿se indicó parámetro /W?
- JE fin_testWin
- MOV AX,1600h
- INT 2Fh
- AND AL,AL ; ¿Windows en modo extendido?
- JZ noWinEnh
- CMP AL,80h ; ¿Windows en modo extendido?
- JE noWinEnh
- siWin: STC ; estamos dentro de Windows
- JMP fin_testWin
- noWinEnh: MOV AX,4680h
- INT 2Fh
- AND AX,AX
- JZ siWin ; Windows en modo real/estándar
- fin_testWin: POP AX
- RET ; CF=1 si dentro de Windows
- testWin ENDP
-
- ; ------------ Al desinstalar, asegurar que el mayor número de sector
- ; en la tabla base de disco es suficiente; por si estaba
- ; activa la emulación FDREAD y esto es DR-DOS.
-
- set_i1e PROC
- PUSH ES
- MOV AX,351Eh
- INT 21h
- CMP BYTE PTR ES:[BX+4],63
- JAE i1e_ok
- MOV BYTE PTR ES:[BX+4],63
- i1e_ok: POP ES
- RET
- set_i1e ENDP
-
-
- ; ***********************************************
- ; * *
- ; * D A T O S N O R E S I D E N T E S *
- ; * *
- ; ***********************************************
-
- ; ------------ Control de instalación.
-
- offsets_ints DW 2 ; número de vectores interceptados
- i13_40_1 DB 13h ; tabla de offsets de los vectores
- DW nueva_i13 ; de interrupción interceptados
- DB 2Fh
- DW nueva_i2F
-
- ; ------------ Parámetros soportados
-
- param_ml DB OFF ; a ON si se indicó parámetro /ML
- param_u DB OFF ; a ON si se indicó parámetro /U
- param_w DB OFF ; a ON si se indicó parámetro /W
- param_xh DB OFF ; a ON si se indicó parámetro /XH
- param_xd DB OFF ; a ON si se indicó parámetro /XD
- param_yh DB OFF ; a ON si se indicó parámetro /YH
- param_yd DB OFF ; a ON si se indicó parámetro /YD
- param_g DB OFF ; a ON si se indicó parámetro /G
- param_ayuda DB OFF ; a ON si se indicó /? /H ó ?
- param_xayuda DB OFF ; a ON si se indicó /??
- param_opt DB -1 ; a ON u OFF según /OPT o /NOOPT
- param_boo DB -1 ; a ON u OFF según /BOOST o /NOBOOST
- param_fdr DB -1 ; a ON u OFF según /FDREAD o /NOFDREAD
- param_fmt DB -1 ; a ON u OFF según /FORMAT o /NOFORMAT
- param_dis DB -1 ; a ON u OFF según /DISKCOPY o /NODISKCOPY
- param_noxms DB OFF ; a ON si se indicó /NOXMS
-
- parametros LABEL BYTE
-
- DB "/??",0
- DW param_xayuda
- DB ON
-
- DB "?",0
- DW param_ayuda
- DB ON
-
- DB "/?",0
- DW param_ayuda
- DB ON
-
- DB "/H",0
- DW param_ayuda
- DB ON
-
- DB "/U",0
- DW param_u
- DB ON
-
- DB "/W",0
- DW param_w
- DB ON
-
- DB "/ML",0
- DW param_ml
- DB ON
-
- DB "/G",1
- DW 0,255
- DW mingap
- DW param_g
- DB ON
-
- DB "/XH",1
- DW 0,255
- DW x_hd
- DW param_xh
- DB ON
-
- DB "/YH",1
- DW 0,255
- DW y_hd
- DW param_yh
- DB ON
-
- DB "/XD",1
- DW 0,255
- DW x_dd
- DW param_xd
- DB ON
-
- DB "/YD",1
- DW 0,255
- DW y_dd
- DW param_yd
- DB ON
-
- DB "/I",0
- DW param_i
- DB ON
-
- DB "/OPt",0
- DW param_opt
- DB ON
-
- DB "/NOOPt",0
- DW param_opt
- DB OFF
-
- DB "/BOost",0
- DW param_boo
- DB ON
-
- DB "/NOBOost",0
- DW param_boo
- DB OFF
-
- DB "/FDread",0
- DW param_fdr
- DB ON
-
- DB "/NOFDread",0
- DW param_fdr
- DB OFF
-
- DB "/FOrmat",0
- DW param_fmt
- DB ON
-
- DB "/NOFOrmat",0
- DW param_fmt
- DB OFF
-
- DB "/DIskcopy",0
- DW param_dis
- DB ON
-
- DB "/NODIskcopy",0
- DW param_dis
- DB OFF
-
- DB "/NOXMs",0
- DW param_noxms
- DB ON
-
- DB 0 ; fin de la tabla
-
- ; ------------ Otras variables.
-
- id_2m DB "CiriSOFT:2M:" ; marcas de presencia de 2M
- id_2m_tam EQU $-OFFSET id_2m
- id_2mx DB "CiriSOFT:2MX:"
- id_2mx_tam EQU $-OFFSET id_2mx
-
- ERRSINTAX EQU 1
- MALBIOS EQU 2
- NOINSTALADO EQU 4
- IMPDESINS EQU 8
- NOINSTALABLE EQU 16
- MX64FULL EQU 32
- WIN_LOAD EQU 64
- WIN_UNLOAD EQU 128
- PRIMERAVEZ EQU 256
- DISKCOPYNO EQU 512
-
- INSTALADO EQU 1 ; códigos de acción e información
- YAINSTALADO EQU 2
- DESINSTALADO EQU 4
- I40 EQU 8
-
- error DW 0 ; variable para acumular errores
- accion DB 0 ; variable que indica lo sucedido
-
- ; ------------ Otras variables.
-
- ptr_info_2m DW 0, 0, i1558, 0, i1886, i3772, i3772
- ptr_info_dos DW 0, 0, i1200, 0, i1440, i2880, i2880
-
- i1558 DB 4, 1 ; sectores iguales / tipo 1.2M
- DW 2, 82 ; detecta cambio / nº pistas
- DB 0 ; tipo de soporte
- DW 512 ; BPB: bytes por sector
- DB 1 ; BPB: sectores por cluster
- DW 1 ; BPB: sectores reservados
- DB 2 ; BPB: número de FATs
- DW 224 ; BPB: entradas en el raíz
- DW 3116 ; BPB: nº total de sectores
- DB 0FAh ; BPB: descriptor de medio
- DW 10 ; BPB: sectores por FAT
- DW 19, 2 ; BPB: sectores pista / cabezas
- DB 14 DUP (0) ; BPB: restantes campos
- i1886 DB 4, 7 ; sectores iguales / tipo 1.44M
- DW 2, 82 ; detecta cambio / nº pistas
- DB 0 ; tipo de soporte
- DW 512 ; BPB: bytes por sector
- DB 1 ; BPB: sectores por cluster
- DW 1 ; BPB: sectores reservados
- DB 2 ; BPB: número de FATs
- DW 224 ; BPB: entradas en el raíz
- DW 3772 ; BPB: nº total de sectores
- DB 0FAh ; BPB: descriptor de medio
- DW 11 ; BPB: sectores por FAT
- DW 23, 2 ; BPB: sectores pista / cabezas
- DB 14 DUP (0) ; BPB: restantes campos
- i3772 DB 4, 9 ; sectores iguales / tipo 2.88M
- DW 2, 82 ; detecta cambio / nº pistas
- DB 0 ; tipo de soporte
- DW 512 ; BPB: bytes por sector
- DB 2 ; BPB: sectores por cluster
- DW 1 ; BPB: sectores reservados
- DB 2 ; BPB: número de FATs
- DW 224 ; BPB: entradas en el raíz
- DW 7544 ; BPB: nº total de sectores
- DB 0FAh ; BPB: descriptor de medio
- DW 12 ; BPB: sectores por FAT
- DW 46, 2 ; BPB: sectores pista / cabezas
- DB 14 DUP (0) ; BPB: restantes campos
- i1200 DB 4, 1 ; sectores iguales / tipo 1.2M
- DW 2, 80 ; detecta cambio / nº pistas
- DB 0 ; tipo de soporte
- DW 512 ; BPB: bytes por sector
- DB 1 ; BPB: sectores por cluster
- DW 1 ; BPB: sectores reservados
- DB 2 ; BPB: número de FATs
- DW 224 ; BPB: entradas en el raíz
- DW 2400 ; BPB: nº total de sectores
- DB 0F9h ; BPB: descriptor de medio
- DW 7 ; BPB: sectores por FAT
- DW 15, 2 ; BPB: sectores pista / cabezas
- DB 14 DUP (0) ; BPB: restantes campos
- i1440 DB 4, 7 ; sectores iguales / tipo 1.44M
- DW 2, 80 ; detecta cambio / nº pistas
- DB 0 ; tipo de soporte
- DW 512 ; BPB: bytes por sector
- DB 1 ; BPB: sectores por cluster
- DW 1 ; BPB: sectores reservados
- DB 2 ; BPB: número de FATs
- DW 224 ; BPB: entradas en el raíz
- DW 2880 ; BPB: nº total de sectores
- DB 0F0h ; BPB: descriptor de medio
- DW 9 ; BPB: sectores por FAT
- DW 18, 2 ; BPB: sectores pista / cabezas
- DB 14 DUP (0) ; BPB: restantes campos
- i2880 DB 4, 9 ; sectores iguales / tipo 2.88M
- DW 2, 80 ; detecta cambio / nº pistas
- DB 0 ; tipo de soporte
- DW 512 ; BPB: bytes por sector
- DB 2 ; BPB: sectores por cluster
- DW 1 ; BPB: sectores reservados
- DB 2 ; BPB: número de FATs
- DW 224 ; BPB: entradas en el raíz
- DW 5760 ; BPB: nº total de sectores
- DB 0F0h ; BPB: descriptor de medio
- DW 9 ; BPB: sectores por FAT
- DW 36, 2 ; BPB: sectores pista / cabezas
- DB 14 DUP (0) ; BPB: restantes campos
-
- ; ------------ Texto.
-
- programa_txt DB 13,10," 2MDOS 1.0",0
-
- instalado_txt DB " instalado.",13,10,255," installed.",13,10,0
-
- ya_instal_txt DB " ya instalado.",13,10,255
- DB " already installed.",13,10,0
-
- modo_boo_txt DB " Optimización de formateo «DiskBoost» ",255
- DB " «DiskBoost» format optimization ",0
-
- modo_opt_txt DB " Optimización de formateo «sector sliding» ",255
- DB " «Sector sliding» format optimization ",0
-
- modo_fdr_txt DB " Emulación FDREAD ",255
- DB " FDREAD emulation ",0
-
- activo_txt DB "activa.",13,10,255,"enabled.",13,10,0
-
- inactivo_txt DB "inhibida.",13,10,255,"disabled.",13,10,0
-
- sopdc_txt DB " Formateo de discos destino 2M/FDFORMAT soportado por DISKCOPY.",13,10,255
- DB " 2M/FDFORMAT target diskettes format supported by DISKCOPY.",13,10,0
-
- nosopdc_txt DB " Sin soporte de formateo para DISKCOPY de discos 2M/FDFORMAT.",13,10,255
- DB " No format support for DISKCOPY of 2M/FDFORMAT disks.",13,10,0
-
- xms_txt DB " Datos residentes para DISKCOPY en memoria extendida.",13,10,255
- DB " Resident DISKCOPY data placed in extended memory.",13,10,0
-
- no_xms_txt DB " Datos residentes para DISKCOPY en memoria convencional.",13,10,255
- DB " Resident DISKCOPY data placed in conventional memory.",13,10,0
-
- sop_fmt_txt DB " Soporte extra para FORMAT de «MS»-DOS habilitado.",13,10,255
- DB " Additional support for «MS»-DOS FORMAT enabled.",13,10,0
-
- aviso_txt DB " Aviso: sector sliding o GAP modificado con opciones no documentadas.",13,10,255
- DB " Warning: sector sliding or GAP modified with undocumented switches.",13,10,0
-
- pmt_ins_txt DB 13,10," El parámetro /NOXMS sólo se admite al instalar.",13,10,255
- DB 13,10," /NOXMS switch is only valid at installation.",13,10,0
-
- pmt_ndc_txt DB 13,10," No se puede activar ya el soporte de formateo para DISKCOPY si"
- DB 13,10," no se activó en el momento de la instalación de este programa.",13,10,255
- DB 13,10," It is not possible to enable now DISKCOPY format support if"
- DB 13,10," it wasn't actived when 2MDOS becomes resident in memory.",13,10,0
-
- nocabe_txt DB ": Instalación imposible.",13,10
- DB " Ya hay 64 programas residentes con la "
- DB "misma técnica.",13,10,255
- DB ": Unable to install.",13,10
- DB " There are already 64 TSR's with the same technique."
- DB 13,10,0
-
- err_sintax_txt DB 13,10," - Parámetro(s) incorrecto(s)."
- DB 13,10," Ejecute 2MDOS /? para obtener "
- DB "ayuda.",13,10,7,255
- DB 13,10," - Incorrect option(s)."
- DB 13,10," Execute 2MDOS /? to obtain help."
- DB 13,10,7,0
-
- mal_bios_txt DB 13,10," - Error: No puedo detectar el tipo de las unidades."
- DB 13,10," Instale 2M-ABIOS ó 2M-XBIOS antes de este programa.",13,10,255
- DB 13,10," - Error: Impossible to detect diskette drive types."
- DB 13,10," Please install 2M-ABIOS or 2M-XBIOS before this program.",13,10,0
-
- win_ld_txt DB " *NO* instalado:",13,10," Este programa debe cargarse ANTES de entrar en Windows.",13,10,7,255
- DB " *NOT* installed:",13,10," This program must be loaded before WINDOWS.",13,10,7,0
- win_ul_txt DB " *NO* desinstalado:",13,10," Este programa debe descargarse fuera de Windows.",13,10,7,255
- DB " *NOT* uninstalled:",13,10," This program must be uninstalled outside of WINDOWS.",13,10,7,0
-
- mal_ver_txt1 DB 13,10," - Error: ya está instalada la versión ",255
- DB 13,10," - Error: Version ",0
- mal_ver_txt2 DB " de este programa.",13,10,7,255
- DB " of this program is already installed.",13,10,7,0
-
- des_ok_txt DB " desinstalado.",13,10,255," uninstalled.",13,10,0
-
- des_no_ok_txt DB 13,10," - Desinstalación imposible (se ha "
- DB "instalado después un programa"
- DB 13,10," que no respeta el convenio y tiene "
- DB "alguna interrupción común).",13,10,7,255
- DB 13,10," - Uninstall unavailable (it has been"
- DB " installed before a program that"
- DB 13,10," does not support CiriSOFT convention"
- DB " and uses a common interrupt).",13,10,7,0
-
- imp_desins_txt DB 13,10," - Programa aún no instalado: "
- DB "imposible desinstalarlo.",13,10,255
- DB 13,10," - Program not installed: "
- DB "impossible to uninstall.",13,10,0
-
- limpia_txt DB 13," ",13,0
-
-
- ayuda_txt LABEL BYTE
- DB 13,10
- DB 13,10," 2MDOS 1.0 - MODULO DE OPTIMIZACION DEL SUBSISTEMA DE DISCO"
- DB 13,10," (C) 1994-1995 Ciriaco García de Celis - Grupo Universitario de Informática"
- DB 13,10," C/Renedo, 2, 4-C; 47005 Valladolid (España) - ciri@gui.uva.es - 2:341/21.8"
- DB 10
- DB 13,10," 2MDOS [/FDread|NOFDread] [/DIskcopy|NODIskcopy] [/FOrmat|NOFOrmat]"
- DB 13,10," [/OPt|NOOPt] [/BOost|NOBOost] [/NOXMs] [/ML] [/U]"
- DB 10
- DB 13,10," ■ Este controlador adicional crea una capa entre 2M y la BIOS para que el DOS"
- DB 13,10," pueda trabajar normalmente con estos disquetes. No es preciso tener instalado"
- DB 13,10," este controlador para soportar los disquetes 2M o para usar 2MF; sin embargo,"
- DB 13,10," con él DISKCOPY puede copiar discos 2M formateando el disco destino. La mayor"
- DB 13,10," utilidad de 2MDOS (con o sin 2M instalado) consiste en optimizar el formateo"
- DB 13,10," de discos estándar del sistema, con las poderosas técnicas «sector sliding» y"
- DB 13,10," DiskBoost. Así, FORMAT (y la mayoría de programas formateadores) crean discos"
- DB 13,10," totalmente estándar mucho más rápidos (sin que haya que instalar después este"
- DB 13,10," programa para poder emplearlos)."
- DB 10
- DB 13,10," ■ Además 2MDOS da soporte por defecto a disquetes no estándar, creados por la"
- DB 13,10," utilidad FDFORMAT y permite a FORMAT poder crear disquetes FDFORMAT."
- DB 10
- DB 13,10," ■ Este programa consume 5,7Kb en equipos sin memoria extendida (o con /NOXMS)"
- DB 13,10," con ella ocupa 2,6 Kb (sólo 1,8 Kb con /NODISKCOPY ó sin 2M instalado). Para"
- DB 13,10," obtener más información sobre los parámetros ejecute 2MDOS /??"
- DB 13,10,255
-
- DB 13,10," 2MDOS 1.0 - DISK SUBSYSTEM OPTIMIZATION UTILITY"
- DB 13,10," (C) 1994-1995 Ciriaco García de Celis - Grupo Universitario de Informática."
- DB 13,10," C/Renedo, 2, 4-C; 47005 Valladolid (Spain) - ciri@gui.uva.es - 2:341/21.8"
- DB 10
- DB 13,10," 2MDOS [/FDread|NOFDread] [/DIskcopy|NODIskcopy] [/FOrmat|NOFOrmat]"
- DB 13,10," [/OPt|NOOPt] [/BOost|NOBOost] [/NOXMs] [/ML] [/U]"
- DB 10
- DB 13,10," ■ This aditional driver improves the interface between 2M and BIOS, to make"
- DB 13,10," DOS capable of normal work with these diskettes. It isn't necessary to load"
- DB 13,10," it to support 2M disks or to run 2MF; but when installed, DOS DISKCOPY can"
- DB 13,10," copy 2M diskettes while formatting the target disk. But the most interesting"
- DB 13,10," feature of using 2MDOS is to improve DOS standard diskette formats (with or"
- DB 13,10," without 2M loaded) with the powerful techniques Sector Sliding & «DiskBoost»."
- DB 13,10," In this way, DOS FORMAT (and most of the rest format utilities) can create"
- DB 13,10," very fast diskettes which are completely standard (and without having to load"
- DB 13,10," 2MDOS to support them in future)."
- DB 10
- DB 13,10," ■ Also, 2MDOS improves by default support for FDFORMAT non standard diskettes"
- DB 13,10," making DOS FORMAT capable of building FDFORMAT diskettes."
- DB 10
- DB 13,10," ■ This program takes 5.7 Kbytes of RAM in systems without XMS memory (or with"
- DB 13,10," /NOXMS switch set) in other case it takes 2.6K (1.8K if /NODISKCOPY switch"
- DB 13,10," set or with 2M not loaded). For more information on switches, try 2MDOS /??"
- DB 13,10,0
-
- mas_ayuda_txt LABEL BYTE
- DB 13,10
- DB 13,10," /DISKCOPY (por defecto si 2M está instalado) y /NODISKCOPY"
- DB 13,10," El soporte DISKCOPY establecido por defecto permite al DISKCOPY de MS-DOS"
- DB 13,10," y DR-DOS poder copiar disquetes 2M/FDFORMAT con la capacidad de formatear"
- DB 13,10," el disco destino si no lo estaba. Realmente el soporte es aún mayor (el"
- DB 13,10," FORMAT de DR-DOS puede incluso formatear disquetes 2M, indicando pistas y"
- DB 13,10," sectores, pero desactiva el SuperBOOT; es mejor emplear 2MF. El FORMAT de"
- DB 13,10," MS-DOS también funciona pero sólo crea bien discos 2M de doble densidad)."
- DB 13,10," Si 2M no está instalado, se activa la opción inversa, que desactiva el"
- DB 13,10," soporte DISKCOPY y economiza algo de memoria."
- DB 10
- DB 13,10," /FORMAT y /NOFORMAT (esta última por defecto)"
- DB 13,10," El soporte FORMAT permite al FORMAT del MS-DOS crear discos 2M y/o FDREAD"
- DB 13,10," de alta densidad. ¡Esta opción NO ES NECESARIA para el FORMAT de DR-DOS!."
- DB 13,10," Si no se activa esta opción, el FORMAT de MS-DOS creará incorrectamente"
- DB 13,10," los discos 2M/FDREAD de alta densidad. Esta opción es poco recomendable;"
- DB 13,10," es mejor activarla sólo puntualmente para crear un disco FDREAD de alta"
- DB 13,10," densidad y volver a inhibirla después porque, si está activa, por defecto"
- DB 13,10," se crearán discos de máxima capacidad; para formatear un disco estándar"
- DB 13,10," habría que forzarlo (/F:1.44, /F:720, /F:360; /F:1.2 debe sustituirse por"
- DB 13,10," /T:80 /N:15, por otra limitación de FORMAT); los demás formatos deben ser"
- DB 13,10," seleccionados indicando pistas y sectores. Otro inconveniente de activar"
- DB 13,10," esta opción es que, con ella activa, bajo el administrador de archivos de"
- DB 13,10," Windows 3 sólo se pueden formatear discos 2M/FDREAD de máxima capacidad."
- DB 10
- DB 13,10," [PULSA UNA TECLA]",1
- DB 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8," ",13,10,10
- DB 13,10," /NOXMS"
- DB 13,10," Con esta opción, los datos residentes para el soporte DISKCOPY se colocan"
- DB 13,10," en memoria convencional o superior en lugar de extendida; dependiendo de"
- DB 13,10," la clase de controlador de memoria, puede suponer economizar 4Kb de XMS ó"
- DB 13,10," 16 Kb de EMS, y emplear 3,1 kbytes más de memoria convencional/superior."
- DB 10
- DB 10
- DB 13,10," /ML"
- DB 13,10," Fuerza la instalación en memoria convencional, del código y datos de este"
- DB 13,10," programa (2MDOS se autoinstala por defecto en memoria superior si puede)."
- DB 10
- DB 10
- DB 13,10," /U"
- DB 13,10," Desinstala el programa de la memoria, si es posible. Desinstalar 2MDOS es"
- DB 13,10," necesario para poder desinstalar 2M, debido a la interconexión de ambos."
- DB 10
- DB 10
- DB 13,10," /FDREAD (por defecto) y /NOFDREAD"
- DB 13,10," Con el soporte FDREAD activo, no es necesario ya instalar la utilidad del"
- DB 13,10," mismo nombre para soportar discos FDFORMAT. Además así FORMAT puede crear"
- DB 13,10," disquetes FDFORMAT (con /DISKCOPY activo) indicando pistas y sectores (el"
- DB 13,10," de MS-DOS no puede crear discos de alta densidad correctamente si no se"
- DB 13,10," indica /FORMAT; el de DR-DOS no tiene problemas)."
- DB 13,10," [PULSA UNA TECLA]",1
- DB 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8," "
- DB 10
- DB 13,10," /OPT (por defecto) y /NOOPT"
- DB 13,10," Con la opción de optimización activa, muy recomendable, 2MDOS intercepta"
- DB 13,10," el funcionamiento del FORMAT del DOS, Norton o PC Tools para optimizar la"
- DB 13,10," numeración de los sectores en las pistas («sector sliding») durante el"
- DB 13,10," proceso de formateo de un disquete estándar. El posterior acceso será más"
- DB 13,10," rápido, sin pérdida alguna de compatibilidad, siendo los nuevos disquetes"
- DB 13,10," tan transportables como los originales del DOS."
- DB 10
- DB 10
- DB 13,10," /BOOST (por defecto) y /NOBOOST"
- DB 13,10," Con esta opción habilitada, los disquetes estándar de 1.2 y 1.44M emplean"
- DB 13,10," la nueva tecnología «DiskBoost», un 15% más rápida que «sector sliding» y"
- DB 13,10," un 50% más de lo normal. Pueden seguir siendo accedidos sin problemas sin"
- DB 13,10," tener instalado 2MDOS en cualquier otra máquina o sistema operativo."
- DB 13,10,255
-
- DB 13,10
- DB 13,10," /DISKCOPY (default if 2M is installed) and /NODISKCOPY"
- DB 13,10," DISKCOPY support set on by default, lets both MS-DOS and DR-DOS DISKCOPY"
- DB 13,10," programs to copy 2M/FDFORMAT diskettes with the capability of format a"
- DB 13,10," unformatted target. The final support is larger (DR-DOS FORMAT is capable"
- DB 13,10," of format 2M diskettes telling it about the number of tracks and sectors,"
- DB 13,10," but disables SuperBOOT feature; so, 2MF is best. MS-DOS format also works"
- DB 13,10," but only format correctly 2M double density disks). When 2M is not loaded"
- DB 13,10," in memory the other option is enabled, to disable DISKCOPY support and to"
- DB 13,10," save some memory."
- DB 10
- DB 13,10," /FORMAT and /NOFORMAT (default)"
- DB 13,10," Format support lets MS-DOS FORMAT build 2M and/or FDREAD high density"
- DB 13,10," disks. This option is NOT NECESSARY with DR-DOS FORMAT!. If this option"
- DB 13,10," is not enabled MS-DOS FORMAT will incorrectly format 2M and FDREAD high"
- DB 13,10," density disks. This option isn't generally recommended; the best solution"
- DB 13,10," is to enable it only before formatting an FDREAD high density disk and"
- DB 13,10," just disable it after. While this option is enabled, the default will be"
- DB 13,10," to format 2M/FDREAD maximum capacity diskettes; to format a standard one"
- DB 13,10," it will be necessary to force it (/F:1.44, /F:720, /F:360; /F:1.2 must be"
- DB 13,10," replaced by /T:80 /N:15 due a FORMAT problem); the rest of the disk"
- DB 13,10," formats can be selected using track/sectors FORMAT switches. Another"
- DB 13,10," problem that appears enabling this option, is that Windows 3 file manager"
- DB 13,10," is only able to format maximum capacity 2M/FDREAD disks."
- DB 13,10," [PRESS ANY KEY]",1
- DB 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8," "
- DB 13,10," /NOXMS"
- DB 13,10," With this switch enabled, the resident data for DISKCOPY support will be"
- DB 13,10," placed in conventional or upper memory, instead of extended memory;"
- DB 13,10," depending on the memory manager type, it can save 4Kb of XMS or 16Kb of"
- DB 13,10," EMS, and to spend over 3.1 Kbytes more of conventional or upper memory."
- DB 10
- DB 10
- DB 13,10," /ML"
- DB 13,10," Forces a conventional memory installation of 2MDOS code and data (this"
- DB 13,10," program is an upper memory self-installating utility)."
- DB 10
- DB 10
- DB 13,10," /U"
- DB 13,10," Tells 2MDOS to uninstall, if possible. To uninstall 2MDOS it's necessary"
- DB 13,10," to be able to uninstall 2M, because of the connection between both TSRs."
- DB 10
- DB 10
- DB 13,10," /FDREAD (default) and /NOFDREAD"
- DB 13,10," With FDREAD support active, it is not necessary to install the program"
- DB 13,10," of the same name to support FDREAD diskettes. Also, DOS FORMAT can build"
- DB 13,10," FDFORMAT disks (if /DISKCOPY is active) telling it about the number of"
- DB 13,10," sectors and tracks (MS-DOS FORMAT can't correctly make high density disks"
- DB 13,10," without /FORMAT switch, but DR-DOS has no problems)."
- DB 13,10," [PRESS ANY KEY]",1
- DB 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8," "
- DB 10
- DB 13,10," /OPT (default) and /NOOPT"
- DB 13,10," With the format optimization enabled (recommended) DOS, Norton, PC Tools,"
- DB 13,10," ...and other format programs will be intercepted in order to DOS optimize"
- DB 13,10," the sector sequence along the tracks («sector sliding») during the format"
- DB 13,10," process of a standard diskette. Resulting access times will be very much"
- DB 13,10," faster, without any compatibility decrease and new diskettes as portable"
- DB 13,10," as DOS primary ones."
- DB 10
- DB 10
- DB 13,10," /BOOST (default) and /NOBOOST"
- DB 13,10," With this option enabled, standard 1.2M and 1.44M diskettes will use the"
- DB 13,10," new «Diskboost» technology, a 15% faster than «sector sliding» and a 50%"
- DB 13,10," faster than DOS normal. These diskettes can be used without problems (and"
- DB 13,10," without installing 2MDOS) in any other computer or operating system."
- DB 13,10,0
-
- buffer_aux DB 64 DUP (0) ; buffer para alguna función del DOS
-
- _PRINCIPAL ENDS
- END inicio
-