LTCD_060719.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:45:17 +02:00
commit f86e69648b
156 files changed
+49537

No files matched your search

+185
View File
@@ -0,0 +1,185 @@
//This only boots to primary IDE, unit 0
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
#define WIN_MULTREAD 0xC4 /* read sectors using multiple mode*/
#define WIN_DEV_RESET 0x08
#define WIN_READ_NATIVE_MAX 0xF8
#define WIN_SET_MAX 0xF9
#define ERR_STAT 0x01
#define INDEX_STAT 0x02
#define ECC_STAT 0x04 /* Corrected error */
#define DRQ_STAT 0x08
#define SEEK_STAT 0x10
#define WRERR_STAT 0x20
#define READY_STAT 0x40
#define BUSY_STAT 0x80
#define BAD_R_STAT (BUSY_STAT | ERR_STAT)
#define BAD_W_STAT (BAD_R_STAT | WRERR_STAT)
#define BAD_STAT (BAD_R_STAT | DRQ_STAT)
#define DRIVE_READY (READY_STAT | SEEK_STAT)
#define DATA_READY (DRQ_STAT)
#define IDE_BASE0 0x1F0
#define IDE_BASE1 0x3F6
#define IDE_DATA_REG (IDE_BASE0+0)
#define IDE_FEATURE_REG (IDE_BASE0+1)
#define IDE_NSECTOR_REG (IDE_BASE0+2)
#define IDE_SECTOR_REG (IDE_BASE0+3)
#define IDE_LCYL_REG (IDE_BASE0+4)
#define IDE_HCYL_REG (IDE_BASE0+5)
#define IDE_SELECT_REG (IDE_BASE0+6)
#define IDE_STATUS (IDE_BASE0+7)
#define IDE_CMD (IDE_BASE0+7)
#define IDE_CONTROL_REG (IDE_BASE1+0)
USE16
BHD2_START::
DU1 32 DUP(0);
BHD2_CODE::
CLI
CLD
MOV AX,BOOT_HIGH_LOC
MOV SS,AX
MOV ES,AX
MOV SP,2*BLK_SIZE
CALL U2 GET_IP
GET_IP:
POP BX
SUB BX,GET_IP
SHR 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
DU1 0xEA;
DU2 BHD2_HISTART,BOOT_HIGH_LOC;
BHD2_WAIT_BUSY:
MOV DX,IDE_STATUS
IN AL,DX
AND AL,BUSY_STAT
JNZ BHD2_WAIT_BUSY
RET
BHD2_ATA_CMD:
PUSH AX
MOV DX,IDE_FEATURE_REG
XOR AL,AL
OUT DX,AL
POP AX
MOV DX,IDE_CMD
OUT DX,AL
RET
BHD2_SELECT:
MOV DX,IDE_SELECT_REG
MOV AL,0xE0 //Unit 0
OUT DX,AL
RET
BHD2_BLK:: DU4 ?;
BHD2_HISTART:
//Init Drive
CALL BHD2_SELECT
MOV AL,WIN_DEV_RESET
CALL BHD2_ATA_CMD
CALL BHD2_WAIT_BUSY
CALL BHD2_SELECT
MOV AL,WIN_READ_NATIVE_MAX
CALL BHD2_ATA_CMD
CALL BHD2_WAIT_BUSY
MOV DX,IDE_CONTROL_REG
MOV AL,8
OUT DX,AL
MOV DX,IDE_SECTOR_REG
XOR AL,AL
OUT DX,AL
MOV DX,IDE_NSECTOR_REG
OUT DX,AL
MOV DX,IDE_LCYL_REG
OUT DX,AL
MOV DX,IDE_HCYL_REG
OUT DX,AL
MOV DX,IDE_SELECT_REG
OR AL,0xEF //Unit 0
OUT DX,AL
MOV AL,WIN_SET_MAX
CALL BHD2_ATA_CMD
CALL BHD2_WAIT_BUSY
BHD2_RESTART::
MOV CX,512 //Gets patched
MOV AX,BOOT_ADDRESS/16
MOV ES,AX
@@1: XOR DI,DI
PUSH CX
//READ BLK
MOV DX,IDE_CONTROL_REG
MOV AL,8
OUT DX,AL
MOV DX,IDE_SECTOR_REG
MOV AL,U1 [BHD2_BLK]
OUT DX,AL
MOV DX,IDE_NSECTOR_REG
MOV AL,1 //Blk Cnt
OUT DX,AL
MOV DX,IDE_LCYL_REG
MOV AL,U1 [BHD2_BLK+1]
OUT DX,AL
MOV DX,IDE_HCYL_REG
MOV AL,U1 [BHD2_BLK+2]
OUT DX,AL
MOV DX,IDE_SELECT_REG
MOV AL,U1 [BHD2_BLK+3]
OR AL,0xE0 //Unit 0
OUT DX,AL
MOV AL,WIN_MULTREAD
CALL BHD2_ATA_CMD
MOV DX,IDE_STATUS
@@10: IN AL,DX
AND AL,DATA_READY
JZ @@10
MOV CX,BLK_SIZE/2
MOV DX,IDE_DATA_REG
REP_INSW
CALL BHD2_WAIT_BUSY
POP CX
INC U4 [BHD2_BLK]
MOV AX,ES
ADD AX,BLK_SIZE/16
MOV ES,AX
LOOP @@1
MOV EBX,BOOT_CODE_HARDDRIVE
DU1 0xEA;
BHD2_JMP_START::
DU2 0,BOOT_ADDRESS/16;
BHD2_END::
END
}