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

+298
View File
@@ -0,0 +1,298 @@
asm {
#define BOOT_ADDRESS 0x040000
#define BLK_SIZE 0x200
#define CD_BLK_SIZE 2048
#define BOOT_HIGH_LOC ((0xA0000-5*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_NOP 0x00
#define WIN_DEV_RESET 0x08
#define WIN_PACKETCMD 0xA0 /* Send a packet cmd. */
#define ERR_STAT 0x01
#define DRQ_STAT 0x08
#define SEEK_STAT 0x10
#define READY_STAT 0x40
#define BUSY_STAT 0x80
#define DRIVE_READY (READY_STAT | SEEK_STAT)
#define DATA_READY (DRQ_STAT)
#define IDE_PRIMARY_BASE 0x1F0
#define IDE_SECONDARY_BASE 0x170
#define IDE_DATA_REG (0)
#define IDE_FEATURE_REG (1)
#define IDE_NSECTOR_REG (2)
#define IDE_SECTOR_REG (3)
#define IDE_LCYL_REG (4)
#define IDE_HCYL_REG (5)
#define IDE_SELECT_REG (6)
#define IDE_STATUS (7)
#define IDE_CMD (7)
#define IDE_CONTROL_REG (0x3F6-0x1F0)
USE16
BCD2_START::
CLD
MOV AX,BOOT_HIGH_LOC
MOV ES,AX
MOV SS,AX
MOV SP,5*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,CD_BLK_SIZE
XOR SI,SI
XOR DI,DI
REP_MOVSB
MOV AX,SS
MOV DS,AX
MOV AX,BOOT_ADDRESS/16
MOV ES,AX
XOR DI,DI //ES:[DI]=DEST
MOV SI,MSG_PS
CALL BCD2_PUTS
XOR AH,AH
INT 0x16
MOV SI,IDE_SECONDARY_BASE
CMP AL,'S'
JE @@12
CMP AL,'s'
JE @@12
MOV SI,IDE_PRIMARY_BASE
@@12:
/**********
PUSH ES
XOR AX,AX
MOV ES,AX
MOV AL,U1 ES:[0x3EE]
POP ES
*******/
PUSH SI
MOV SI,MSG_UNIT
CALL BCD2_PUTS
XOR AH,AH
INT 0x16
POP SI
SHL AL,4
OR AL,0xE0
MOV U1 [BCD2_UNIT_VALUE+1],AL
CLI
DU1 0xEA;
DU2 BCD2_MAIN,BOOT_HIGH_LOC;
MSG_PS::
DU1 "\r\n\r\n\r\n\r\n"
"\r\nBooting LoseThos Operating System from CD-ROM..."
"\r\n\r\nPlease specify the location of the CD-ROM"
"\r\ndrive you are booting from. (I don't know how"
"\r\nto detect it.) Typically, CD-ROMs are on the"
"\r\nsecondary controller, so press 's' if this is the case."
"\r\n\r\n (p)rimary or (s)econdary IDE controller:",0;
MSG_UNIT::
DU1 "\r\n\r\nTypically, CD-ROMs are the master unit, so"
"\r\npress '0' if this is the case."
"\r\n\r\n Unit (0=Master or 1=Slave):",0;
BCD2_PUTS::
LODSB
OR AL,AL
JZ BCD2_RET
MOV AH,0x0E
MOV BX,0x07
INT 0x10
JMP BCD2_PUTS
BCD2_STAT::
MOV DX,SI
ADD DX,IDE_STATUS
IN AL,DX
BCD2_RET:
RET
BCD2_SELECT_UNIT::
MOV DX,SI
ADD DX,IDE_SELECT_REG
BCD2_UNIT_VALUE::
MOV AL,0xF0 //Gets patched
OUT DX,AL
RET
BCD2_CMD::
MOV AH,AL
XOR AL,AL
MOV DX,SI
ADD DX,IDE_FEATURE_REG
OUT DX,AL
MOV AL,AH
MOV DX,SI
ADD DX,IDE_CMD
OUT DX,AL
RET
BCD2_WAIT_NOT_BUSY::
CALL BCD2_STAT
AND AL,BUSY_STAT
JNZ BCD2_WAIT_NOT_BUSY
RET
BCD2_WAIT_DRQ::
CALL BCD2_STAT
AND AL,DRQ_STAT
JZ BCD2_WAIT_DRQ
RET
BCD2_PKT::
PUSH AX
CALL BCD2_WAIT_DRQ
POP BX
MOV AL,BH
MOV AH,BL
MOV DX,SI
ADD DX,IDE_DATA_REG
OUT DX,AX
RET
BCD2_RESET::
CALL BCD2_SELECT_UNIT
MOV AL,WIN_DEV_RESET
CALL BCD2_CMD
CALL BCD2_WAIT_NOT_BUSY
RET
BCD2_MAIN::
CALL BCD2_RESET
BCD2_WAIT_READY::
MOV ECX,100000 //Busy wait
MOV DX,0x379 //Par Port
@@1: IN AL,DX
DEC ECX
JNZ @@1
BCD2_WAIT_READY2::
CALL BCD2_SELECT_UNIT
MOV AL,WIN_NOP
CALL BCD2_CMD
CALL BCD2_WAIT_NOT_BUSY
CALL BCD2_STAT
AND AL,READY_STAT
JNZ @@1
CALL BCD2_RESET
JMP BCD2_WAIT_READY
@@1: CALL BCD2_SELECT_UNIT
MOV AL,WIN_PACKETCMD
CALL BCD2_CMD
MOV AX,0x1B00
CALL BCD2_PKT
XOR AX,AX
CALL BCD2_PKT
MOV AX,0x0100
CALL BCD2_PKT
XOR AX,AX
CALL BCD2_PKT
XOR AX,AX
CALL BCD2_PKT
XOR AX,AX
CALL BCD2_PKT
CALL BCD2_WAIT_NOT_BUSY
MOV DX,SI
ADD DX,IDE_FEATURE_REG
IN AL,DX
OR AL,AL
JNZ BCD2_WAIT_READY
BCD2_SEND_READ::
MOV AL,8
MOV DX,SI
ADD DX,IDE_CONTROL_REG
OUT DX,AL
CALL BCD2_SELECT_UNIT
MOV AL,0
MOV DX,SI
ADD DX,IDE_LCYL_REG
OUT DX,AL
MOV AL,8
INC DX //IDE_HCYL_REG
OUT DX,AL
MOV AL,WIN_PACKETCMD
CALL BCD2_CMD
MOV AX,0xA800
CALL BCD2_PKT
BCD2_BLK_HI::
MOV AX,512
CALL BCD2_PKT
BCD2_BLK_LO::
MOV AX,512
CALL BCD2_PKT
XOR AX,AX //cnt_hi
CALL BCD2_PKT
BCD2_BLK_CNT::
MOV AX,512
PUSH AX
CALL BCD2_PKT
XOR EAX,EAX
CALL BCD2_PKT
POP AX //cnt
SHL EAX,10
MOV EBX,EAX
@@10: CALL BCD2_WAIT_DRQ
XOR ECX,ECX
MOV DX,SI
ADD DX,IDE_HCYL_REG
IN AL,DX
MOV CH,AL
MOV DX,SI
ADD DX,IDE_LCYL_REG
IN AL,DX
MOV CL,AL
SHR1 CX
JZ @@10
CMP CX,0x7F00
JB @@20
MOV CX,0x7F00
@@20: PUSH CX
MOV DX,SI
ADD DX,IDE_DATA_REG
REP_INSW
MOV AX,DI
SHR AX,4
MOV DX,AX
MOV AX,ES
ADD AX,DX
MOV ES,AX
AND DI,0xF
POP CX
SUB EBX,ECX
JZ @@100 //TODO look-up branch
JNC @@10
@@100: CALL BCD2_WAIT_NOT_BUSY
MOV AX,SI
SHL EAX,16
MOV AH,U1 [BCD2_UNIT_VALUE+1]
MOV AL,BOOT_CODE_CDROM
MOV EBX,EAX
DU1 0xEA;
BCD2_JMP_START::
DU2 0,BOOT_ADDRESS/16;
BCD2_END::
END
}