137 lines
1.9 KiB
Plaintext
137 lines
1.9 KiB
Plaintext
asm {
|
|
#define BOOT_ADDRESS 0x040000
|
|
#define BLK_SIZE 0x200
|
|
#define LT_XSUM 0xA5CF3796
|
|
#define BOOT_HIGH_LOC ((0xA0000-2*BLK_SIZE)>>4)
|
|
|
|
#define BOOT_CODE_FLOPPY 1
|
|
#define BOOT_CODE_HARDDRIVE 2
|
|
#define BOOT_CODE_CDROM 3
|
|
#define BOOT_CODE_RAM 4
|
|
|
|
USE16
|
|
BFD_START::
|
|
DU1 32 DUP(0);
|
|
BFD_CODE::
|
|
CLI
|
|
CLD
|
|
MOV AX,0xB800
|
|
MOV FS,AX
|
|
MOV AX,BOOT_HIGH_LOC
|
|
MOV SS,AX
|
|
MOV ES,AX
|
|
MOV SP,2*BLK_SIZE
|
|
STI
|
|
|
|
CALL GET_IP
|
|
GET_IP:
|
|
POP BX
|
|
SUB BX,GET_IP
|
|
SAR BX,4
|
|
MOV AX,CS //COPY HIGH
|
|
ADD AX,BX
|
|
MOV DS,AX
|
|
MOV CX,BLK_SIZE
|
|
XOR SI,SI
|
|
XOR DI,DI
|
|
REP_MOVSB
|
|
|
|
XOR AX,AX
|
|
XOR DX,DX
|
|
INT 0x13
|
|
|
|
DU1 0xEA;
|
|
DU2 BFD_RESTART,BOOT_HIGH_LOC;
|
|
|
|
BFD_RESTART::
|
|
MOV CX,512 //patched with Blk cnt
|
|
MOV DX,512 //patched with sector#
|
|
MOV AX,BOOT_ADDRESS/16
|
|
MOV GS,AX
|
|
PUSH AX
|
|
|
|
BFD_LOOP:
|
|
PUSH CX
|
|
|
|
MOV AH,0x70
|
|
MOV AL,CH
|
|
CALL CVTHEX
|
|
MOV U2 FS:[0],AX
|
|
MOV AL,CL
|
|
SHR AL,4
|
|
CALL CVTHEX
|
|
MOV U2 FS:[2],AX
|
|
MOV AL,CL
|
|
CALL CVTHEX
|
|
MOV U2 FS:[4],AX
|
|
|
|
MOV AX,DX
|
|
PUSH DX
|
|
XOR DX,DX
|
|
MOV BX,18
|
|
DIV BX
|
|
MOV CL,DL //CL=sector
|
|
INC CL
|
|
MOV DH,AL
|
|
AND DH,1 //DH=head
|
|
SHR AX,1
|
|
MOV CH,AL //CH=cyl
|
|
XOR DL,DL //DL=Drive
|
|
MOV AX,GS
|
|
MOV ES,AX
|
|
ADD AX,BLK_SIZE/16
|
|
PUSH AX
|
|
XOR BX,BX //ES:[BX]=buf
|
|
MOV AH,2 //AH=read code
|
|
MOV AL,1 //1 blk
|
|
PUSH FS
|
|
PUSH GS
|
|
|
|
INT 0x13
|
|
|
|
POP GS
|
|
POP FS
|
|
|
|
POP GS
|
|
POP DX
|
|
INC DX
|
|
POP CX
|
|
LOOP BFD_JMP_BACK
|
|
|
|
//Check CheckSum
|
|
POP DS
|
|
XOR ESI,ESI
|
|
MOV ECX,U4 8[ESI]
|
|
SHR ECX,4
|
|
MOV EBX,LT_XSUM
|
|
@@10: LODSD
|
|
XOR EBX,EAX
|
|
LODSD
|
|
XOR EBX,EAX
|
|
LODSD
|
|
XOR EBX,EAX
|
|
LODSD
|
|
XOR EBX,EAX
|
|
XOR ESI,ESI
|
|
MOV AX,DS
|
|
INC AX
|
|
MOV DS,AX
|
|
LOOP @@10
|
|
OR EBX,EBX
|
|
JNZ U2 BFD_RESTART
|
|
|
|
MOV EBX,BOOT_CODE_FLOPPY
|
|
DU1 0xEA;
|
|
BFD_JMP_START::
|
|
DU2 0,BOOT_ADDRESS/16;
|
|
BFD_JMP_BACK:
|
|
JMP U2 BFD_LOOP
|
|
CVTHEX: AND AL,15
|
|
CMP AL,9
|
|
JBE @@1
|
|
ADD AL,'A'-'9'-1
|
|
@@1: ADD AL,'0'
|
|
RET
|
|
BFD_END::
|
|
END
|
|
} |