home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1995 November
/
PCWK1195.iso
/
inne
/
podstawy
/
dos
/
format
/
2m30src.exe
/
2MBOOTHD.INC
< prev
next >
Wrap
Text File
|
1995-03-06
|
6KB
|
137 lines
;┌───────────────────────────────────────────────────────────────────┐
;│ │
;│ 2MBOOTHD 3.0 - (C) 1994-1995 Ciriaco García de Celis. │
;│ │
;│ Con código del sector de arranque para discos HD/ED. │
;│ │
;└───────────────────────────────────────────────────────────────────┘
CLI
XOR AX,AX
MOV SS,AX
MOV SP,7C00h ; SS:SP inicializado
MOV AX,07C0h
PUSH AX
ADD AX,20h
PUSH AX
POP ES
POP DS
XOR SI,SI
XOR DI,DI
MOV CX,100h
CLD
REP MOVSW ; auto-reubicar este código
MOV BX,DS:[68] ; constante de reubicación
LEA AX,[BX+OFFSET boot_ini - OFFSET _BootHDPrg]
PUSH ES
PUSH AX
RETF ; saltar a boot_ini reubicado
boot_ini: STI
MOV SI,OFFSET boot_txt - OFFSET _BootHDPrg
CALL outmsg
MOV BX,1Eh*4
LDS SI,DWORD PTR SS:[BX]
PUSH DS ; *
PUSH SI ; **
XOR DI,DI
MOV SS:[BX],DI
MOV SS:[BX+2],ES
MOV CX,11
REP MOVSB ; copiar tabla base disco a RAM
PUSH ES
POP DS
MOV AL,DS:[24]
MOV [DI-7],AL ; sectores/pista correctos
XOR AX,AX
MOV ES,AX
MOV BX,7C00h ; ES:BX = 0000:7C00
MOV ES:[BX+1FEh],AX ; boot aún no válido
MOV AX,0201h ; leer un sector
MOV CX,DS:[22]
ADD CX,2 ; el primer sector de la FAT2
XOR DX,DX ; cabezal 0 y unidad A:
PUSH CX
INT 13h ; cargar sector real de boot
POP CX
MOV BX,SS:[413h]
SUB BX,5
MOV AX,64
MUL BX
MOV ES,AX
PUSH BX ; ***
XOR BX,BX
MOV AX,205h ; leer 5 sectores
INC CX ; cilindro 0 y 2º sector FAT2
XOR DX,DX ; cabezal 0 y unidad A:
INT 13h
POP BX ; ***
POP SS:[1Eh*4] ; ** restaurar INT 1Eh
POP SS:[1Eh*4+2] ; *
CMP WORD PTR ES:[2558],0AA55h ; ¿código válido?
JNE boot2 ; SuperBOOT probablemente ya cargado
MOV SS:[413h],BX ; rebajar memoria libre
PUSH ES ; *
MOV AH,8
MOV BL,0
MOV DL,0
INT 13h ; ¿tipo de unidad A:?
MOV AL,BL
MOV AH,0
CMP DL,2
JB ins_sb
PUSH AX
award_pelma: MOV AH,8
MOV BL,0
MOV DL,1 ; ¿tipo de unidad B:?
INT 13h
CMP AH,6 ; la BIOS Award devuelve error
JE award_pelma ; 6 incluso en esta función
POP AX
MOV AH,BL
ins_sb: POP ES ; *
MOV ES:[2558],ES ; segmento del CALL FAR
CALL DWORD PTR ES:[2556] ; instalar SuperBOOT
boot2: MOV AX,201h ; leer un sector
XOR DX,DX ; cabezal 0 y unidad A:
MOV ES,DX
MOV CX,1 ; el sector 1 del cilindro 0
MOV BX,8000h ; acceso de lectura sólo para
PUSH AX ; quitar error "disco cambiado"
INT 13h
POP AX
MOV BX,7C00h
PUSH ES ; apilar dirección 0:7C00h
PUSH BX
CMP WORD PTR ES:[BX+3],"M2"
JNE exec_boot ; el BOOT virtual no es 2M
hd_boot: MOV DL,80h ; primer disco duro
INT 13h ; cargar tabla de particiones
exec_boot: CMP WORD PTR ES:[7DFEh],0AA55h
JNE intenta_hd?
XOR DX,DX ; conviene DX=0 para Microsoft
RETF ; ejecutar partición / BOOT
intenta_hd?: AND DL,DL
JZ hd_boot ; BOOT no válido, probar HD
MOV SI,OFFSET no_boot_txt - OFFSET _BootHDPrg
CALL outmsg
MOV AH,0
INT 16h ; esperar tecla
INT 19h ; volver a arrancar
outmsg: ADD SI,DS:[68]
putchar: CLD
LODSB
AND AL,AL
JZ retorno
MOV AH,0Eh
MOV BX,7
INT 10h ; imprimir carácter
JMP putchar
retorno: RET
boot_txt DB 13,10,"2M SuperBOOT 3.0",13,10,0
no_boot_txt DB 13,10,"¡No botable!",13,10,0