home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1995 November
/
PCWK1195.iso
/
inne
/
podstawy
/
dos
/
format
/
2m30src.exe
/
2M.ASM
< prev
next >
Wrap
Assembly Source File
|
1995-03-06
|
51KB
|
1,224 lines
;┌───────────────────────────────────────────────────────────────────┐
;│ │
;│ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▄ ▒▒▒▒▄ ▒▒▒▒▄ │
;│ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█ ▒▒▒▒▒▄ ▒▒▒▒▒█ │
;│ ▀▀▀▀▀▀▀▀▀▀▒▒▒▒█ ▒▒▒▒▒▒▄ ▒▒▒▒▒▒█ │
;│ ▒▒▒▒█ ▒▒▒▒▒▒▒▄▒▒▒▒▒▒▒█ │
;│ ▒▒▒▒█ ▒▒▒▒█▒▒▒▒▒█▒▒▒▒█ │
;│ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█ ▒▒▒▒█ ▒▒▒█▀▒▒▒▒█ ▒▒▒▒▒▒▒▒▒▒▄ ▒▒▒▒▒▒▄ │
;│ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█ ▒▒▒▒█ ▒█▀ ▒▒▒▒█ ▀▀▀▀▀▀▀▒▒█ ▒▒▒▒█▀▀▀▒▒▄ │
;│ ▒▒▒▒█▀▀▀▀▀▀▀▀▀▀▀ ▒▒▒▒█ ▀ ▒▒▒▒█ ▒▒█ ▒▒█▀▒▒▄ ▒▒█ │
;│ ▒▒▒▒█ ▒▒▒▒█ ▒▒▒▒█ ▒▒▒▒▒▒▒▒█ ▒▒█ ▒▒█ ▒▒█ │
;│ ▒▒▒▒█ ▒▒▒▒█ ▒▒▒▒█ ▀▀▀▀▀▒▒█ ▒▒█ ▒▒█ ▒▒█ │
;│ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▄ ▒▒▒▒█ ▒▒▒▒█ ▒▒█ ▒▒█ ▀▒▒▒▒█ │
;│ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█ ▒▒▒▒█ ▒▒▒▒█ ▒▒▒▒▒▒▒▒▒▒█ ▒▒▄ ▀▒▒▒▒▒▒█▀▀ │
;│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀ ▀▀ ▀▀▀▀▀▀ │
;│ │
;│ 2M 3.0 - (C) 1993-1995 Ciriaco García de Celis. │
;│ │
;│ SOPORTE PARA DISQUETES CON MAYOR CAPACIDAD DE LA NORMAL │
;│ CREADOS POR LA UTILIDAD 2MF │
;│ │
;│ - Para PC, XT o AT con controladora y unidades de alta. │
;│ - Programación directa del controlador de disquetes y del DMA. │
;│ - Soporte para sectores de más de 512 bytes (economizar GAPs). │
;│ - Mezcla de sectores de distinto tamaño en la misma pista. │
;│ - Ruptura del límite habitual de 80 pistas (incluido 360K). │
;│ - Emulación de sectores de 512 bytes en INT 13h. │
;│ - Función 5 (INT 13h) reforzada para formatear los nuevos discos. │
;│ - El soporte residente opera eficazmente bajo DOS y WINDOWS 3.X │
;│ │
;│ Para la versión AT: Para la versión PC/XT: │
;│ TASM 2m /m5 TASM 2m, 2mx /m5 /dXT │
;│ TLINK 2m /t TLINK 2mx /t │
;│ │
;└───────────────────────────────────────────────────────────────────┘
IFDEF XT
XTX EQU ,"X",
ELSE
.286 ; versión para AT o superior
XTX EQU ,
ENDIF
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
IFNDEF XT
XPUSHA MACRO
PUSHA
ENDM
XPOPA MACRO
POPA
ENDM
XSHL MACRO regmem, cuenta
SHL regmem,cuenta
ENDM
DELAY MACRO ; estados de espera
JMP SHORT $+2 ; para AT obsoleto
JMP SHORT $+2
ENDM
DDS MACRO
PUSH 40h
POP DS
ENDM
DES MACRO
PUSH 40h
POP ES
ENDM
PMICRO MACRO ; retardo de aprox. 15,09 µs
LOCAL pmicro_iter ; (exactamente 18/1193180 sg.)
pmicro_iter: DELAY
IN AL,61h ; Esta macro puede ejecutarse
AND AL,10h ; repetitivamente (se apoya en
CMP AL,AH ; AX) para hacer retardos a
JE pmicro_iter ; través de la temporización
MOV AH,AL ; del refresco de la memoria
ENDM ; dinámica de los AT.
ELSE
XPUSHA MACRO
XPUSH <AX, BX, CX, DX, SI, DI>
ENDM
XPOPA MACRO
XPOP <DI, SI, DX, CX, BX, AX>
ENDM
XSHL MACRO regmem, cuenta
REPT cuenta
SHL regmem,1
ENDM
ENDM
DELAY MACRO ; sin estados de espera
ENDM
DDS MACRO
PUSH AX
MOV AX,40h
MOV DS,AX
POP AX
ENDM
DES MACRO
PUSH AX
MOV AX,40h
MOV ES,AX
POP AX
ENDM
ENDIF
; ------------ 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:2M" XTX ":3.0",0
DB 2 ; número de vectores de interrupción usados
tabla_vectores EQU $
vieja_i13 DB 13h ; INT 13h
ant_int13 LABEL DWORD ; dirección original
ant_int13_off DW 0
ant_int13_seg DW 0
DB 2Fh ; INT 2Fh
ant_int2F LABEL DWORD ; dirección original
ant_int2F_off DW 0
ant_int2F_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 *
; * *
; ***********************************************
INCLUDE 2MKERNEL.INC
fin_residente EQU $ ; fin del área residente sin contar el buffer
bytes_resid EQU fin_residente-ini_residente
; *****************************
; * *
; * 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: CMP param_l,ON
JNE ins_mem
JMP informar
ins_mem: CALL inic_general ; inicializar ciertas variables
CALL pc_ok?
TEST error,MALPC or MALDOS or MALBIOS or MALDRV
JZ proc_tsr
JMP informar ; no hay configuración correcta
proc_tsr: 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
TEST BYTE PTR ES:[DI-10],2
JZ no_sys
OR error,INSTALADOSYS ; no desinstalar versión SYS
JMP informar
no_sys: CALL hay2mdos?
JC no_2mdos
OR error,HAY2MDOSDES ; desinstalar antes 2MDOS
JMP informar
no_2mdos: MOV AH,ES:[DI-9]
CALL mx_unload ; desinstalarlo:
JC err_ins ; no ha sido posible
IFNDEF XT
MOV AX,sbootseg
AND AX,AX
JZ sboot_d_ok ; no hay copia SuperBOOT
MOV ES,AX
MOV BX,ES:[0]
MOV ES:[BX].cambio,ON ; simular cambio A:
MOV BX,ES:[2]
MOV ES:[BX].cambio,ON ; simular cambio B:
ENDIF
sboot_d_ok: JMP informar
err_ins: OR error,IMPDESINS ; no es posible
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
IFDEF XT
CALL adaptar_param ; parámetros en copia residente
ENDIF
JMP informar
instalable: CALL hay2mdos?
JC tw
OR error,HAY2MDOSINS ; instalar antes que 2MDOS
JMP informar
tw: CALL testWin
JNC win_in_ok
OR error,WIN_LOAD
JMP informar ; no instalar desde Windows
win_in_ok: OR accion,INSTALADO
CALL instalar_tsr ; instalar el TSR
JC informar
IFNDEF XT
MOV AX,sbootseg
AND AX,AX
JZ sboot_i_ok ; no hay copia SuperBOOT
MOV ES,AX
MOV BX,ES:[0]
MOV ES:[BX].control2m_flag,OFF ; anularla control A:
MOV BX,ES:[2]
MOV ES:[BX].control2m_flag,OFF ; anularla control B:
ENDIF
sboot_i_ok: MOV ES,tsr_seg
informar: 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 para 2M
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
MOV mem640,AX ; copia de seguridad :)
CALL UMB_alloc ; pedir memoria superior XMS
JC busca_upper ; no hay la suficiente
LEA BX,buffer_io-256 ; AX:BX dirección del buffer
CALL testDMA
PUSH AX
MOV DX,AX
MOV AH,12h
CALL gestor_XMS ; redimensionar bloque memoria
CMP AX,1
JE xms_redim_ok
MOV AX,mem640
MOV parrafos_resid,AX ; función no soportada
xms_redim_ok: POP AX
CLC ; indicar que usa memoria XMS
JMP instalar_umb
busca_upper: MOV AX,parrafos_resid
CALL UPPER_alloc ; pedir memoria superior DOS 5
JC instalar_ml ; no hay la suficiente
LEA BX,buffer_io-256 ; AX:BX dirección del buffer
CALL testDMA
XPUSH <AX, ES>
MOV ES,AX
MOV AH,4Ah
INT 21h ; redimensionar bloque memoria
CALL upper_fork ; dejar residente el bloque
XPOP <ES, AX>
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,CS
LEA BX,buffer_io-(256-96)
CALL testDMA
MOV mem640,BX ; 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,(bytes_resid+15)/16 ; sin contar el buffer
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. La memoria consumida
; se calcula para el peor de los casos, cuando el buffer
; residente ocupa incluso el doble debido al DMA.
inic_general PROC
CALL inic_XMS ; detectar controlador XMS
MOV AX,(bytes_resid+tbuffer*2+15)/16
MOV parrafos_resid,AX ; memoria máxima necesaria
IFDEF XT
CALL testAT
JNC skip_tmtest ; en AT no calcularlo [*]
CALL cte_tiempos
MOV tbase,AX ; cte. retardo para 1/18,2 seg.
skip_tmtest: ENDIF
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: MOV DL,0
CALL tipo_disco
MOV info_A.tipo_drv,BL ; guardar tipo unidad A:
MOV DL,1
CALL tipo_disco
MOV info_B.tipo_drv,BL ; guardar tipo unidad B:
RET
inic_general 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 2MDOS está instalado.
hay2mdos? PROC
XPUSH <ES, DI>
LEA SI,id_2mdos ; identificación del programa
MOV CX,id_2mdos_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
XPOP <DI, ES>
RET
hay2mdos? ENDP
; ------------ Adaptar parámetros de un 2MX ya instalado.
; Sólo se actualiza la constante de retardo, por si el
; turbo de la máquina fue conmutado.
IFDEF XT
adaptar_param PROC
PUSH ES
MOV ES,tsr_seg
MOV AX,tbase
MOV ES:tbase,AX
POP ES
RET
adaptar_param ENDP
ENDIF
; ------------ Informar al usuario.
info PROC
CMP param_ayuda,ON ; ¿solicitud de ayuda?
JNE info_p?
LEA DX,ayuda_txt
CALL print
JMP fin_info
info_p?: CMP param_l,ON
JNE info_normal
LEA DX,infop_txt
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"?
JNZ acc_ok
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...
CALL info_drvs
LEA DX,dma_cross_txt
TEST accion,BUFFERPLUS ; ¿el DMA cruzaba frontera?
JZ dma_ok
CALL print
dma_ok: JMP fin_info
info_err: LEA DX,mal_pc_txt
TEST error,MALPC ; ¿no es ordenador adecuado?
JZ otroerr1
CALL print
otroerr1: LEA DX,mal_dos_txt
TEST error,MALDOS ; ¿DOS incorrecto?
JZ otroerr21
CALL print
otroerr21: LEA DX,mal_bios_txt
TEST error,MALBIOS ; ¿BIOS obsoleta?
JZ otroerr22
CALL print
otroerr22: LEA DX,mal_drv_txt
TEST error,MALDRV ; ¿Unidades de doble?
JZ otroerr23
CALL print
otroerr23: LEA DX,err_sintax_txt
TEST error,ERRSINTAX ; ¿error de sintaxis?
JZ otroerr3
CALL print
otroerr3: 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: LEA DX,inst_sys_txt
TEST error,INSTALADOSYS ; ¿instalada versión *.SYS?
JZ otroerr5x
CALL print
otroerr5x: LEA DX,inst_2mdos_txt
TEST error,HAY2MDOSINS ; ¿instalar antes que 2MDOS?
JZ otroerr5y
CALL print
otroerr5y: LEA DX,dins_2mdos_txt
TEST error,HAY2MDOSDES ; ¿desinstalar antes 2MDOS?
JZ otroerr5z
CALL print
otroerr5z: 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 fin_info
CALL print
fin_info: RET
info ENDP
; --- Informar de las unidades controladas por 2M.
info_drvs PROC
MOV DL,0
CALL tipo_disco
CALL pr_tipo
MOV DL,1
CALL tipo_disco
CALL pr_tipo
LEA DX,crlf_txt
CALL print
RET
info_drvs ENDP
; --- Imprimir unidad y su tipo.
pr_tipo PROC
CMP BL,2
JE tp_ok
CMP BL,4
JE tp_ok
CMP BL,5
MOV BL,5
JAE tp_ok
RET
tp_ok: PUSH BX
ADD DL,'A'
MOV AH,2
INT 21h
POP BX
SUB BL,2
MOV BH,0
SHL BX,1
ADD BX,OFFSET tabla_ndrvs
MOV DX,[BX]
CALL print
RET
pr_tipo ENDP
; ------------ Comprobar que la configuración es la adecuada. Para
; saber si la INT 13h de 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 la INT 40h. Si está cargado el código SuperBOOT, se
; utiliza no obstante siempre la INT 13h (para anularlo
; por completo).
pc_ok? PROC
IFNDEF XT
CALL SuperBOOT?
JNE no_superboot
MOV sbootseg,AX ; segmento SuperBOOT
JMP test_dos ; es SuperBOOT: usar INT 13h
ENDIF
no_superboot: CALL test_i40
TEST accion,I40
JZ test_dos ; no soportada la INT 40h
MOV nueva_i13,40h
MOV vieja_i13,40h ; usar INT 40 en vez de INT 13
test_dos: MOV AH,30h
INT 21h
XCHG AH,AL
CMP AX,31Eh ; ¿DOS 3.30 o superior?
MOV AX,MALDOS
JB pc_nok
CALL testAT
MOV AX,MALPC
IFNDEF XT
JC pc_nok
ELSE
JNC pc_nok ; [*]
ENDIF
TEST error,MALBIOS
JNZ pc_ok ; con ese error vale
MOV AX,MALDRV
CMP info_A.tipo_drv,2 ; ¿unidad A: de 1.2?
JE pc_ok
CMP info_A.tipo_drv,4 ; ¿unidad A: de 1.44 ó 2.88?
JAE pc_ok
CMP info_B.tipo_drv,2 ; ¿unidad B: de 1.2?
JE pc_ok
CMP info_B.tipo_drv,4 ; ¿unidad B: de 1.44 ó 2.88?
JAE pc_ok
pc_nok: OR error,AX
pc_ok: TEST error,MALPC
JZ pc_ok?_ret
AND error,MALPC ; ese error basta
pc_ok?_ret: RET
pc_ok? ENDP
; --- Devolver ZF=1 si 2M está instalado en SuperBOOT.
; La rutina funciona aunque QEMM modifique de modo
; temporal el límite de memoria a casi un mega en
; la llamada a INT 12h.
IFNDEF XT
SuperBOOT? PROC
PUSH ES
INT 12h ; tamaño memoria convencional
MOV BX,640
CMP AX,256
JB base_sc_ok ; dato extraño
CMP AX,640
JA base_sc_ok ; dato extraño
MOV BX,AX
base_sc_ok: MOV AX,BX
ADD AX,127 ; redondeo
MOV CL,7
SHR AX,CL
SHL AX,CL ; hacia frontera de 128K
MOV CX,AX
SUB CX,BX ; buscar en área posible
DEC AX
MOV BX,64
MUL BX ; AX = segmento de SuperBOOT
CLD
scan_boot: MOV ES,AX
MOV DI,6
LEA SI,id_boot
PUSH CX ; *
MOV CX,id_boot_tam
REP CMPSB
POP CX ; *
JE haysb_ret ; ZF = 1 -> 2M SuperBOOT
SUB AX,64
LOOPNZ scan_boot ; buscar 1K más abajo
nohaysb_ret: CMP SP,0 ; ZF = 0 -> no es SuperBOOT
haysb_ret: POP ES
RET
SuperBOOT? ENDP
ENDIF
; --- 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
; --- Detectar 286 ó superior.
testAT PROC
PUSH AX
PUSHF
POP AX
OR AH,70h ; intentar activar bit 12, 13 ó 14
PUSH AX ; del registro de estado
POPF
PUSHF
POP AX
AND AH,0F0h
CMP AH,0F0h
JE testedAT
STC
testedAT: CMC ; CF = 0 en AT y 1 en PC/XT
POP AX
RET
testAT ENDP
; ------------ Comprobar que el buffer para el DMA en la copia
; residente no cruza una frontera. En ese caso se emplea
; otro buffer ubicado tras el habitual, lo que aumenta el
; consumo de memoria de este área. A la entrada AX apunta
; al segmento que contendrá el buffer y BX el offset. Si
; no se produce el cruce, se disminuye «parrafos_resid»
; para economizar memoria; incluso aunque se produzca,
; esta variable se reduce en lo posible. A la vuelta,
; «parrafos_resid» y BX indican la memoria definitiva
; ocupada por el programa.
testDMA PROC
XPUSH <AX, CX, DX>
MOV CX,16
MUL CX
ADD AX,BX
ADC DX,0 ; DX:AX = dirección 20 bits
MOV CX,DX
PUSH AX
ADD AX,tbuffer-1 ; buffer para el mayor sector
ADC DX,0
POP AX
MOV BX,parrafos_resid
SUB BX,tbuffer/16 ; mejor supuesto posible
CMP DX,CX
JE dmatested
NEG AX
ADD AX,15
MOV CL,4
SHR AX,CL
ADD BX,AX ; consumo adicional
SHL AX,CL
ADD AX,OFFSET buffer_io
MOV buffer,AX ; nueva posición del buffer
OR accion,BUFFERPLUS ; aviso al usuario
dmatested: MOV parrafos_resid,BX
XPOP <DX, CX, AX>
RET
testDMA ENDP
; ------------ Desde Windows, no se permite instalar o desinstalar 2M.
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
; ------------ Calcular la constante de retardo básica para perder
; exactamente 54,925 ms. Con una regla de 3 se podrá
; después aplicar para hacer retardos de milisegundos.
IFDEF XT
cte_tiempos PROC
XPUSH <DS, ES, BX, CX, DX>
MOV AX,3508h
INT 21h
XPUSH <ES, BX> ; preservar vector de INT 8
PUSH DS
MOV AX,40h
MOV DS,AX
MOV AL,DS:[6Ch]
espera_i8: CMP AL,DS:[6Ch]
JE espera_i8 ; esperar INT 8 ... para que no
POP DS
LEA DX,i8_crono ; venga otra en un buen rato...
MOV AX,2508h
INT 21h ; nueva rutina de INT 8
IN AL,21h
PUSH AX ; preservar estado de IRQ's
MOV AL,11111110b
OUT 21h,AL ; permitir sólo IRQ0
MOV AH,0 ; fase
MOV CX,0 ; contador
MOV BX,CX ; seguiría a 0 si fallara
EVEN ; forzar alineamiento
cuenta_iter: DEC CX ; <─┐ bucle básico de retardo
JMP SHORT $+2 ; │
JNZ cuenta_iter ; <─┘ lo interrumpirá INT 8
POP AX ; anterior estado de IRQ's
OUT 21h,AL
XPOP <DX, DS>
PUSH BX ; valor real contado
MOV AX,2508h ; restaurar vector de INT 8
INT 21h
POP AX ; (65536-AX) vueltas en 54,9 ms
NEG AX ; constante de retardo básica
XPOP <DX, CX, BX, ES, DS>
RET
i8_crono: INC AH ; nueva INT 8 que interrumpe
CMP AH,1 ; el bucle de retardo
JE fase1
CMP AH,2
JE fase2
i8_exit: MOV AL,20h
OUT 20h,AL
IRET
fase1: MOV CX,0 ; sincronizar con el reloj
JMP i8_exit
fase2: MOV BX,CX ; anotar constante de retardo
MOV CX,1 ; forzar fin del bucle
JMP i8_exit
cte_tiempos ENDP
ENDIF
; ***********************************************
; * *
; * 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
nueva_i13 DB 13h ; tabla de offsets de los vectores
DW ges_int13 ; de interrupción interceptados
DB 2Fh
DW ges_int2F
; ------------ 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_l DB OFF ; a ON si se indicó parámetro /L
param_w DB OFF ; a ON si se indicó parámetro /W
param_ayuda DB OFF ; a ON si se indicó /? /H ó ?
parametros LABEL BYTE
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 "/I",0
DW param_i
DB ON
DB "/L",0
DW param_l
DB ON
DB 0 ; fin de la tabla
MALPC EQU 1 ; Códigos de error
MALDOS EQU 2
MALBIOS EQU 4
MALDRV EQU 8
ERRSINTAX EQU 16
NOINSTALADO EQU 32
IMPDESINS EQU 64
INSTALADOSYS EQU 128
HAY2MDOSINS EQU 256
HAY2MDOSDES EQU 512
NOINSTALABLE EQU 1024
MX64FULL EQU 2048
WIN_LOAD EQU 4096
WIN_UNLOAD EQU 8192
INSTALADO EQU 1 ; códigos de acción e información
YAINSTALADO EQU 2
DESINSTALADO EQU 4
BUFFERPLUS EQU 8
I40 EQU 16
error DW 0 ; variable para acumular errores
accion DB 0 ; variable que indica lo sucedido
IFNDEF XT
sbootseg DW 0 ; segmento SuperBOOT (si presente)
ENDIF
id_2mdos DB "CiriSOFT:2MDOS:" ; marca de presencia de 2MDOS
id_2mdos_tam EQU $-OFFSET id_2mdos
id_boot DB "2M-STV" ; marca de presencia SuperBOOT
id_boot_tam EQU $-OFFSET id_boot
; ------------ Texto.
programa_txt DB 13,10," 2M" XTX " 3.0",0
instalado_txt DB " instalado en ",255," installed on ",0
IFNDEF XT
ya_instal_txt DB " ya instalado en ",255
DB " already installed on ",0
ELSE
ya_instal_txt DB " reajustando base de tiempos; instalado en ",255
DB " adjusting delay loop; already installed on ",0
ENDIF
tabla_ndrvs DW t12
DW 0
DW t144
DW t288
t12 DB ":1.2M ",0
t144 DB ":1.44M ",0
t288 DB ":2.88M ",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."
crlf_txt DB 13,10,0
err_sintax_txt DB 13,10," - Parámetro(s) incorrecto(s)."
DB 13,10," Ejecute 2M" XTX " /? para obtener "
DB "ayuda.",13,10,7,255
DB 13,10," - Incorrect option(s)."
DB 13,10," Execute 2M" XTX " /? to obtain help."
DB 13,10,7,0
IFNDEF XT
mal_pc_txt DB 13,10," - Error: Necesario ordenador AT. Utilice 2MX en esta máquina.",13,10,255
DB 13,10," - Error: Needs AT system. Use 2MX on this computer.",13,10,0
ELSE
mal_pc_txt DB 13,10," - Error: Necesario ordenador PC/XT. Utilice 2M en esta máquina.",13,10,255
DB 13,10," - Error: Needs PC/XT system. Use 2M on this computer.",13,10,0
ENDIF
mal_dos_txt DB 13,10," - Error: Necesaria versión DOS 3.30 ó posterior.",13,10,255
DB 13,10," - Error: Needs at least DOS 3.30 or above.",13,10,0
mal_bios_txt DB 13,10," - Error: No puedo detectar el tipo de las unidades. Instale 2M-?BIOS antes.",13,10,255
DB 13,10," - Error: Impossible to detect drive types. Please install 2M-?BIOS before.",13,10,0
mal_drv_txt DB 13,10," - Error: Necesaria(s) unidad(es) de alta densidad.",13,10,255
DB 13,10," - Error: Needs high-density floppy drive(s).",13,10,0
dma_cross_txt DB " - Nota: El buffer de E/S cruzaba una frontera de DMA y fue ampliado.",13,10
DB " Cambie la ubicación en memoria de 2M" XTX " para ahorrar unos bytes.",13,10,255
DB " - Note: I/O buffer has been extended because 2M" XTX " crosses a DMA boundary.",13,10
DB " Modify the memory location of 2M" XTX " to save a little memory.",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
inst_sys_txt DB 13,10," - Instalado como controlador de dispositivo; no desinstalable.",13,10,255
DB 13,10," - Installed as device driver: unable to uninstall.",13,10,0
inst_2mdos_txt DB 13,10," - Error: necesario instalar este programa *antes* que 2MDOS.",13,10,255
DB 13,10," - Error: needed to install this program *before* 2MDOS.",13,10,0
dins_2mdos_txt DB 13,10," - Error: necesario desinstalar primero 2MDOS.",13,10,255
DB 13,10," - Error: needed to uninstall first 2MDOS.",13,10,0
IFNDEF XT
ayuda_txt LABEL BYTE
DB 13,10,10
DB " 2M 3.0 - CONTROLADOR PARA ACCESO A DISCOS FORMATEADOS CON TECNOLOGIA STV.",13,10
DB " (C) 1993-1995 Ciriaco García de Celis - Grupo Universitario de Informática",13,10
DB " C/Renedo, 2, 4-C; 47005 Valladolid (España) - ciri@gui.uva.es - 2:341/21.8",13,10
DB 10
DB " Sintaxis: 2M [/ML] [/U] [/L]",13,10
DB 10
DB " ■ Tras ejecutarlo, 2M se queda residente en memoria, para dar soporte a discos",13,10
DB " de formato 2M creados por 2MF. 2M es una aplicación «CARDWARE». Esta permitida",13,10
DB " su distribución gratuíta SIN MODIFICACIONES. Información sobre cómo conseguir",13,10
DB " el paquete completo e información de licencia con 2M /L.",13,10
DB 10
DB " ■ 2M precisa para operar:",13,10
DB " - Un equipo AT o superior con las disqueteras bien indicadas en el SETUP.",13,10
DB " - Al menos una disquetera de alta densidad (las de doble no son controladas).",13,10
DB " - 5168 bytes de memoria superior o en su defecto 5264 de memoria convencional.",13,10
DB " - Sistema operativo DOS y/o WINDOWS 3.X, otros entornos no son contemplados.",13,10
DB " - Utilidad 2MF para formatear los disquetes 2M.",13,10
DB " ■ 2M ofrece:",13,10
DB " - Soporte para disquetes de 902K (5¼-DD) hasta 3772K (3½-ED) en A: y en B:.",13,10
DB " - Soporte INT 13h para que los programas comerciales puedan formatear en 2M.",13,10
DB 10
DB " ■ Con /ML se fuerza la instalación en memoria convencional (2M se auto-instala",13,10
DB " automáticamente en memoria superior) y con /U se desinstala, si es posible.",13,10
DB 255
DB 13,10,10
DB " 2M 3.0 - DISKETTE DRIVE CONTROLLER FOR STV DISKETTE FORMAT TECHNOLOGY.",13,10
DB " (C) 1993-1995 Ciriaco García de Celis - Grupo Universitario de Informática.",13,10
DB " C/Renedo, 2, 4-C; 47005 Valladolid (Spain) - ciri@gui.uva.es - 2:341/21.8",13,10
DB 10
DB " Syntax: 2M [/ML] [/U] [/L]",13,10
DB 10
DB " ■ After being executed without options, the program becomes resident in memory",13,10
DB " to support 2M disks built by 2MF. 2M is a «CARDWARE» package. The distribution",13,10
DB " is only authorized WITHOUT MODIFY. How to get the complete package and license",13,10
DB " information with 2M /L.",13,10
DB 10
DB " ■ 2M requires:",13,10
DB " - An AT or above computer with diskette drives correctly set on SETUP.",13,10
DB " - At least one high-density floppy drive (double ones are not drived).",13,10
DB " - 5168 bytes of upper memory or 5264 bytes of conventional memory instead.",13,10
DB " - DOS and/or WINDOWS 3.X system, another environs are not still supported.",13,10
DB " - 2MF utility program to format 2M diskettes.",13,10
DB " ■ 2M gives you:",13,10
DB " - Support for diskettes from 902K (5¼-DD) up to 3772K (3½-ED) on A: and B:.",13,10
DB " - INT 13h code improves a new 2M format service for high-level applications.",13,10
DB 10
DB " ■ With /ML a conventional memory installation can be forced (this is an upper",13,10
DB " memory self-installating utility) and /U tells 2M to uninstall, if possible.",13,10
DB 0
ELSE
ayuda_txt LABEL BYTE
DB 13,10,10
DB " 2MX 3.0 - CONTROLADOR PARA ACCESO A DISCOS FORMATEADOS CON TECNOLOGIA STV.",13,10
DB " (C) 1993-1995 Ciriaco García de Celis - Grupo Universitario de Informática",13,10
DB " C/Renedo, 2, 4-C; 47005 Valladolid (España) - ciri@gui.uva.es - 2:341/21.8",13,10
DB 10
DB " Sintaxis: 2MX [/ML] [/U] [/L]",13,10
DB 10
DB " ■ Tras ejecutarlo, 2MX se queda residente en memoria para dar soporte a discos",13,10
DB " de formato 2M creados por 2MF. 2M es una aplicación «CARDWARE». Esta permitida",13,10
DB " su distribución gratuíta SIN MODIFICACIONES. Información sobre cómo conseguir",13,10
DB " el paquete completo e información de licencia con 2MX /L.",13,10
DB 10
DB " ■ 2MX precisa para operar:",13,10
DB " - Un equipo PC/XT con una BIOS moderna (o 2M-XBIOS instalado en su defecto).",13,10
DB " - Al menos una disquetera de alta densidad (las de doble no son controladas).",13,10
DB " - 5376 bytes de memoria superior o en su defecto 5472 de memoria convencional.",13,10
DB " - Sistema operativo DOS y/o WINDOWS 3.X, otros entornos no son contemplados.",13,10
DB " - Utilidad 2MF para formatear los disquetes 2M.",13,10
DB " ■ 2MX ofrece:",13,10
DB " - Soporte para disquetes de 902K (5¼-DD) hasta 3772K (3½-ED) en A: y en B:.",13,10
DB " - Soporte INT 13h para que los programas comerciales puedan formatear en 2M.",13,10
DB 10
DB " ■ Con /ML se fuerza la instalación en memoria convencional (2MX se autoinstala",13,10
DB " automáticamente en memoria superior) y con /U se desinstala, si es posible.",13,10
DB 255
DB 13,10,10
DB " 2MX 3.0 - DISKETTE DRIVE CONTROLLER FOR STV DISKETTE FORMAT TECHNOLOGY.",13,10
DB " (C) 1993-1995 Ciriaco García de Celis - Grupo Universitario de Informática.",13,10
DB " C/Renedo, 2, 4-C; 47005 Valladolid (Spain) - ciri@gui.uva.es - 2:341/21.8",13,10
DB 10
DB " Syntax: 2MX [/ML] [/U] [/L]",13,10
DB 10
DB " ■ After being executed without options, the program becomes resident in memory",13,10
DB " to support 2M disks built by 2MF. 2M is a «CARDWARE» package. The distribution",13,10
DB " is only authorized WITHOUT MODIFY. How to get the complete package and license",13,10
DB " information with 2MX /L.",13,10
DB 10
DB " ■ 2MX requires:",13,10
DB " - A PC/XT computer with a modern BIOS (or with 2M-XBIOS installed instead).",13,10
DB " - At least one high-density floppy drive (double ones are not drived).",13,10
DB " - 5376 bytes of upper memory or 5472 bytes of conventional memory instead.",13,10
DB " - DOS and/or WINDOWS 3.X system, another environs are not still supported.",13,10
DB " - 2MF utility program to format 2M diskettes.",13,10
DB " ■ 2MX gives you:",13,10
DB " - Support for diskettes from 902K (5¼-DD) up to 3772K (3½-ED) on A: and B:.",13,10
DB " - INT 13h code improves a new 2M format service for high-level applications.",13,10
DB 10
DB " ■ With /ML a conventional memory installation can be forced (this is an upper",13,10
DB " memory self-installating utility) and /U tells 2MX to uninstall, if possible.",13,10
DB 0
ENDIF
infop_txt LABEL BYTE
DB 13,10
DB 10
DB "──────────────── LICENCIA DE USO Y CONDICIONES DE DISTRIBUCION ────────────────",13,10
DB " Es legal copiar 2M sin cobrar dinero (a lo sumo los costes de distribución) a",13,10
DB "cualquier otra persona. Quien decida utilizar algún programa del paquete 2M con",13,10
DB "la excepción de 2M.COM y 2MX.COM deberá enviarme una postal. Para utilizar sólo",13,10
DB "2M.COM o 2MX.COM no es obligatorio enviar la postal (sólo es opcional), ya que",13,10
DB "dichos programas así como el formato de disco 2M, su sector de arranque y el",13,10
DB "código SuperBOOT son de dominio público. Esto permite a las empresas incluir",13,10
DB "sólo 2M.COM o 2MX.COM en sus distribuciones de productos en discos 2M, sin",13,10
DB "que sus clientes tengan la obligación de enviarme la postal. Aunque me gustaría",13,10
DB "que incluyeran también el fichero original (2M30.ZIP) si les sobra espacio.",13,10
DB 10
DB " ESTA PROHIBIDO modificar este programa o cualquier otro del paquete sin mi",13,10
DB "consentimiento. En caso de distribuir algún fichero que no sea 2M.COM ó 2MX.COM",13,10
DB "será obligatorio distribuir el paquete 2M completo.",13,10
DB 10
DB " Si usted no dispone del paquete 2M completo, puede conseguirlo en Internet en",13,10
DB "ftp.gui.uva.es (pub/pc/2m), oak.oakland.edu (SymTel/msdos/diskutil) así como en",13,10
DB "garbo.uwasa.fi (pc/format); por teléfono en la BBS DataByte (+34 -83 -307574:",13,10
DB "00-24h, 1200-28800, Grupo Varios, Area de Ficheros del GUI y Login:). Ventajas",13,10
DB "del paquete completo: más ayuda (2M-INFO), formateador (2MF), optimizador de",13,10
DB "formateo de discos estándar (2MDOS), discos de más capacidad (2MGUI: 3½ ->1176,",13,10
DB "1972, 3944 y 5¼ -> 976, 1639), actualización BIOS (2M-ABIOS y 2M-XBIOS). La",13,10
DB "licencia de uso para el paquete completo consiste en enviar una tarjeta postal.",13,10
DB 255
DB 13,10
DB 10
DB "─────────────────── USE LICENSE AND DISTRIBUTION CONDITIONS ───────────────────",13,10
DB " It is legal to copy 2M without charge (or charging a little distribution fee)",13,10
DB "for anyone. Whoever who decides to use a program from 2M package, except 2M.COM",13,10
DB "and 2MX.COM must send me a postcard. To use only 2M.COM or 2MX.COM it isn't an",13,10
DB "obligation to send the postcard (it's only optional), since this program and",13,10
DB "2M disk formats, their boot records and SuperBOOT code are public domain. This",13,10
DB "permits any company to include only 2M.COM and/or 2MX.COM in his own products",13,10
DB "distributed on 2M disks, without having their customers the obligation on send",13,10
DB "me the postcard. But I would like them to include the original file (2M30.ZIP)",13,10
DB "if they have any remaining free space on their disk(s).",13,10
DB 10
DB " IT IS FORBIDDEN to modify this program or any other included in the package",13,10
DB "without my permission. If any file except 2M.COM or 2MX.COM is distributed, it",13,10
DB "is also obligatory to include the complete 2M package.",13,10
DB 10
DB " If you still haven't got the complete 2M package, you can get it on the",13,10
DB "Internet at ftp.gui.uva.es (pub/pc/2m), oak.oakland.edu (SymTel/msdos/diskutil)",13,10
DB "or garbo.uwasa.fi (pc/format); by telephone on DataByte BBS (+34 -83 -307574:",13,10
DB '00-24h, 1200-28800, Group Varios, "Area de Ficheros del GUI y Login:"). Benefit',13,10
DB "of complete package: more help (2M-INFO), disk formatter (2MF), standard disks",13,10
DB "format optimizer (2MDOS), more capacity disks (2MGUI: 3½ ->1176, 1972, 3944 and",13,10
DB "5¼ -> 976, 1639), disk BIOS update (2M-ABIOS and 2M-XBIOS). The use licence",13,10
DB "for the complete package consist of sending me a postcard.",13,10
DB 0
buffer_aux DB 64 DUP (0) ; buffer para alguna función del DOS
_PRINCIPAL ENDS
END inicio