LTCD_060719.ISO
This commit is contained in:
commit
f86e69648b
156 files changed
+49537
No files matched your search
@@ -0,0 +1,360 @@
|
||||
USE16
|
||||
JMP U2 J_START2
|
||||
////**************************PROCEDURE*************************
|
||||
// ASM Global variables required for 16-bit start-up
|
||||
ALIGN 4,0x90
|
||||
SYS_BOOT_BASE:: DU4 ?; //Fixed offset from start used by reboot_J
|
||||
SYS_BOOT_HEADER_BASE:: DU4 ?;
|
||||
OS_32START:: DU4 INIT_OS;
|
||||
|
||||
ALIGN 16,0x90
|
||||
GDTTAB:: DU1 MAXGDT*8 DUP(0);
|
||||
SYS_BOOT_CODE:: DU4 0xFF;
|
||||
SYS_MEMBLKS:: DU4 0;
|
||||
FREE_GDT_LIST:: DU4 0;
|
||||
ADAM_TSS:: DU1 TSS_STRUCT_SIZE DUP(0);
|
||||
SYS_TEMP_PTR:: DU4 0,0;
|
||||
|
||||
////**************************PROCEDURE*************************
|
||||
//EBX is SYS_BOOT_CODE (value passed from boot blk)
|
||||
J_START2::
|
||||
MOV AX,(0xA0000-2*BLK_SIZE)/16
|
||||
MOV SS,AX
|
||||
MOV SP,2*BLK_SIZE
|
||||
PUSH EBX //will be SYS_BOOT_CODE
|
||||
MOV AX,0xB800
|
||||
MOV ES,AX
|
||||
MOV U4 ES:[0],('L'+0xF000)+0x10000*('T'+0xF000)
|
||||
MOV U4 ES:[4],0
|
||||
MOV ECX,1200000 //Delay
|
||||
CALL BUSY_WAIT
|
||||
|
||||
CALL U2 GET_IP
|
||||
GET_IP:
|
||||
POP BX
|
||||
SUB BX,GET_IP
|
||||
SHR BX,4
|
||||
MOV AX,CS
|
||||
ADD AX,BX
|
||||
PUSH AX
|
||||
PUSH U2 J_START3
|
||||
RETF
|
||||
J_START3::
|
||||
//XSUM OSMain
|
||||
MOV AX,CS
|
||||
DEC AX
|
||||
MOV DS,AX
|
||||
XOR ESI,ESI
|
||||
MOV ECX,U4 8[ESI] //Get length
|
||||
SHR ECX,4
|
||||
MOV EBX,LT_XSUM
|
||||
@@2: 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 @@2
|
||||
MOV U4 ES:[4],'O'+65536*'K'+0xF000F000
|
||||
OR EBX,EBX
|
||||
JZ J_CONT_START
|
||||
|
||||
//XSUM Error
|
||||
MOV U4 ES:[4],'X'+65536*'M'+0xF000F000
|
||||
@@3: JMP @@3
|
||||
|
||||
BUSY_WAIT::
|
||||
MOV DX,0x379 //Par Port
|
||||
@@1: IN AL,DX
|
||||
DEC ECX
|
||||
JNZ @@1
|
||||
RET
|
||||
////**************************PROCEDURE*************************
|
||||
J_CONT_START:
|
||||
STI
|
||||
//Enter Graphics Mode
|
||||
exe {
|
||||
I8 ch,video_mode;
|
||||
do {
|
||||
CrLf;
|
||||
coutln "1) VGA 640x480x16";
|
||||
coutln "2) SVGA 800x600x16--not supported by all computers";
|
||||
cout "Video Mode:";
|
||||
ch=GetChar;
|
||||
} while (ch<'1' || ch>'2');
|
||||
video_mode=ch-'0';
|
||||
switch (video_mode) {
|
||||
case 1:
|
||||
ExePutS("MOV AX,0x12");
|
||||
break;
|
||||
case 2:
|
||||
ExePutS("MOV AX,0x6A");
|
||||
break;
|
||||
}
|
||||
}
|
||||
INT 0x10 //ENABLE VGA
|
||||
|
||||
//Get memory map
|
||||
MOV AX,0xE801
|
||||
INT 0x15
|
||||
MOV AX,CS
|
||||
MOV DS,AX
|
||||
ADD DX,0x101
|
||||
MOV U2 [SYS_MEMBLKS+2],DX
|
||||
|
||||
CLI
|
||||
|
||||
//Enable A20
|
||||
IN AL,0x92
|
||||
OR AL,2
|
||||
OUT 0x92,AL
|
||||
|
||||
CLD //Start with known registers
|
||||
MOV AX,CS
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
MOV FS,AX
|
||||
MOV GS,AX
|
||||
XOR EAX,EAX
|
||||
XOR EBX,EBX
|
||||
XOR ECX,ECX
|
||||
XOR EDX,EDX
|
||||
XOR ESI,ESI
|
||||
XOR EDI,EDI
|
||||
XOR EBP,EBP
|
||||
|
||||
XOR EAX,EAX
|
||||
MOV AX,CS
|
||||
SHL EAX,4
|
||||
MOV U4 [SYS_BOOT_BASE],EAX
|
||||
|
||||
POP U4 [SYS_BOOT_CODE]
|
||||
|
||||
MOV BX,CS
|
||||
DEC BX
|
||||
MOV GS,BX
|
||||
MOV EBX,U4 GS:[4]
|
||||
ADD EAX,EBX
|
||||
SUB EAX,16
|
||||
MOV U4 [SYS_BOOT_HEADER_BASE],EAX
|
||||
|
||||
MOV U4 [GDTTAB+SYS_BOOT_DS_SEL],0x000FFFF
|
||||
MOV U4 [GDTTAB+SYS_BOOT_DS_SEL+4],0x0CF9200
|
||||
MOV U4 [GDTTAB+SYS_BOOT_CS_SEL],0x000FFFF
|
||||
MOV U4 [GDTTAB+SYS_BOOT_CS_SEL+4],0x0CF9A00
|
||||
MOV EAX,U4 [SYS_BOOT_BASE]
|
||||
ADD U4 [GDTTAB+SYS_BOOT_DS_SEL+2],EAX
|
||||
ADD U4 [GDTTAB+SYS_BOOT_CS_SEL+2],EAX
|
||||
|
||||
// SETUP POINTER TO LIMIT AND BASE
|
||||
//OF GDT. USE ENTRY (0) BECAUSE IT IS
|
||||
//INVALID.
|
||||
MOV U2 [SYS_TEMP_PTR],MAXGDT*8-1
|
||||
MOV EAX,U4 [SYS_BOOT_BASE]
|
||||
ADD EAX,GDTTAB+NULL_SEL
|
||||
MOV U4 [SYS_TEMP_PTR+2],EAX
|
||||
MOV U2 [SYS_TEMP_PTR+6],0
|
||||
|
||||
// LGDT FU2 SYS_TEMP_PTR
|
||||
DU1 0x67,0x0F,0x01,0x15;
|
||||
DU4 SYS_TEMP_PTR;
|
||||
|
||||
// MOV EAX,CR0 //ENTER PROTECTED MODE!!
|
||||
DU1 0x0F,0x20,0xC0;
|
||||
|
||||
OR AL,1
|
||||
|
||||
|
||||
// MOV CR0,EAX
|
||||
DU1 0x0F,0x22,0xC0;
|
||||
|
||||
DU1 0x66,0xEA; //JMP SYS_CS_SEL:INIT_OS
|
||||
DU4 INIT_OS;
|
||||
DU2 SYS_BOOT_CS_SEL;
|
||||
////**************************PROCEDURE*************************
|
||||
// ASM Global variables not required for 16-bit start-up
|
||||
ALIGN 8,0x90
|
||||
IDTTAB:: DU1 MAXIDT*8 DUP(0);
|
||||
SYS_HEAP_BASE:: DU4 0x100000;
|
||||
SYS_HEAP_LIMIT:: DU4 0;
|
||||
|
||||
exe {
|
||||
ExePrintF("SYS_GRMODE:: DU4 %d;",video_mode);
|
||||
}
|
||||
SYS_GRWIDTH:: DU4 ?;
|
||||
SYS_GRHEIGHT:: DU4 ?;
|
||||
|
||||
SYS_FLAGS:: DU4 0x8; //RAW_CRT_OUT=8
|
||||
SYS_IRQ_FLAGS:: DU4 0;
|
||||
SYS_IRQ_BUSY_FLAGS:: DU4 0;
|
||||
SYS_TEXTBASE:: DU4 0;
|
||||
SYS_GRBASE:: DU4 0;
|
||||
SYS_GRBASE2:: DU4 0;
|
||||
SYS_CUR_RAW_SCAN_CODE:: DU4 0;
|
||||
SYS_CUR_SCAN_CODE:: DU4 0;
|
||||
SYS_EXTERN_TABLE:: DU4 0;
|
||||
MEM_FREE_LIST:: DU4 0;
|
||||
FREE_PAGE_HASH:: DU4 FREE_PAGE_HASH_SIZE DUP(0);
|
||||
FREE_PAGE_HASH2:: DU4 32 DUP(0);
|
||||
PROGRESS1:: DU8 0;
|
||||
PROGRESS2:: DU8 0;
|
||||
PROGRESS3:: DU8 0;
|
||||
PROGRESS4:: DU8 0;
|
||||
SYS_SWAPS_CNTER:: DU4 0;
|
||||
SYS_CUR_FOCUS_TASK:: DU4 0;
|
||||
|
||||
|
||||
////**************************PROCEDURE*************************
|
||||
ALIGN 16,0x90
|
||||
USE32
|
||||
INIT_OS::
|
||||
MOV AX,SYS_BOOT_DS_SEL //LOAD DS SELECTOR
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
|
||||
MOV U4 [GDTTAB+ZERO_DS_SEL],0x0000FFFF
|
||||
MOV U4 [GDTTAB+ZERO_DS_SEL+4],0x00CF9200
|
||||
MOV U4 [GDTTAB+SYS_CS_SEL],0x0000FFFF
|
||||
MOV U4 [GDTTAB+SYS_CS_SEL+4],0x00CF9A00
|
||||
|
||||
//INIT FREE GDT ENTRIES
|
||||
MOV U4 [FREE_GDT_LIST],0
|
||||
MOV ECX,MAXGDT-FIRST_FREE_SEL/8
|
||||
MOV EAX,FIRST_FREE_SEL
|
||||
@@3: MOV EBX,U4 [FREE_GDT_LIST]
|
||||
MOV U4 GDTTAB[EAX],EBX
|
||||
MOV U4 [FREE_GDT_LIST],EAX
|
||||
ADD EAX,8
|
||||
LOOP @@3
|
||||
|
||||
//Patch absolute addresses
|
||||
MOV ESI,U4 [SYS_BOOT_HEADER_BASE]
|
||||
MOV EDI,U4 [SYS_BOOT_BASE]
|
||||
MOV AX,ZERO_DS_SEL
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
MOV ECX,U4 1[ESI]
|
||||
LEA ESI,U4 1+4+1[ESI]
|
||||
@@10: LODSD
|
||||
ADD EAX,EDI
|
||||
ADD U4 [EAX],EDI
|
||||
LOOP @@10
|
||||
|
||||
MOV AX,ZERO_DS_SEL
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
MOV FS,AX
|
||||
MOV GS,AX
|
||||
MOV SS,AX
|
||||
MOV ESP,0x800000 //TEMP
|
||||
|
||||
DU1 0xEA; //JMP SYS_CS_SEL:CONT_INIT_OS
|
||||
DU4 CONT_INIT_OS;
|
||||
DU2 SYS_CS_SEL;
|
||||
|
||||
CONT_INIT_OS::
|
||||
MOV U4 [SYS_HEAP_BASE],0x100000
|
||||
CALL INIT_MEM
|
||||
|
||||
//INIT INTERRUPT TABLE
|
||||
MOV ECX,MAXIDT
|
||||
MOV EDI,IDTTAB
|
||||
MOV ESI,IRQ_VECTORS
|
||||
@@1: LODSW
|
||||
STOSW
|
||||
MOV AX,SYS_CS_SEL
|
||||
STOSW
|
||||
MOV AX,0x8E00 //E=32-bit irq gate
|
||||
STOSW
|
||||
MOVSW
|
||||
LOOP @@1
|
||||
|
||||
MOV U2 [SYS_TEMP_PTR],MAXIDT*8-1
|
||||
MOV U4 [SYS_TEMP_PTR+2],IDTTAB
|
||||
MOV U2 [SYS_TEMP_PTR+6],0
|
||||
// LIDT FU2 SYS_TEMP_PTR
|
||||
DU1 0x0F,0x01,0x1D;
|
||||
DU4 SYS_TEMP_PTR;
|
||||
|
||||
//INIT SYSTEM TSS
|
||||
PUSH 0
|
||||
PUSH DEFAULT_STACK
|
||||
PUSH 0
|
||||
PUSH ADAM_TSS
|
||||
CALL CP_INIT_TSS+4
|
||||
ADD ESP,16
|
||||
MOV FS,AX
|
||||
MOV ESP,U4 FS:[TSS_ESP]
|
||||
|
||||
CALL INIT_FLOATING_CONSTANTS
|
||||
|
||||
JMP U4 CP_OS_MAIN+4
|
||||
|
||||
////**************************PROCEDURE*************************
|
||||
CP_REBOOT::
|
||||
MOV EAX,ZERO_DS_SEL
|
||||
MOV ES,AX
|
||||
MOV U2 ES:[0x472],0
|
||||
|
||||
MOV AL,0x8F
|
||||
OUT 0x70,AL
|
||||
OUT 0xEB,AL
|
||||
MOV AL,0
|
||||
OUT 0x71,AL
|
||||
OUT 0xEB,AL
|
||||
MOV AL,0
|
||||
OUT 0x70,AL
|
||||
OUT 0xEB,AL
|
||||
|
||||
IN AL,0x92
|
||||
OR AL,1
|
||||
OUT 0x92,AL
|
||||
OUT 0xEB,AL
|
||||
@@100: JMP @@100
|
||||
|
||||
|
||||
////**************************PROCEDURE*************************
|
||||
FC_1:: DU8 0;
|
||||
FC_PI:: DU8 0;
|
||||
FC_PI2:: DU8 0;
|
||||
FC_E:: DU8 0;
|
||||
FC_LOG2_10:: DU8 0;
|
||||
FC_LOG2_E:: DU8 0;
|
||||
FC_LOG10_2:: DU8 0;
|
||||
FC_LOGE_2:: DU8 0;
|
||||
INIT_FLOATING_CONSTANTS::
|
||||
PUSH EBP
|
||||
MOV EBP,ESP
|
||||
SUB ESP,8
|
||||
FLD1
|
||||
FSTP U4[FC_1]
|
||||
FLDPI
|
||||
FSTP U4[FC_PI]
|
||||
FLDPI
|
||||
FLDPI
|
||||
FADDP
|
||||
FSTP U4[FC_PI2]
|
||||
FLDL2T
|
||||
FSTP U4[FC_LOG2_10]
|
||||
FLDL2E
|
||||
FSTP U4[FC_LOG2_E]
|
||||
FLDLG2
|
||||
FSTP U4[FC_LOG10_2]
|
||||
FLDLN2
|
||||
FSTP U4[FC_LOGE_2]
|
||||
|
||||
FLD1
|
||||
FSTP U4 -8[EBP]
|
||||
CALL CP_EXP
|
||||
MOV U4 [FC_E],EAX
|
||||
MOV U4 [FC_E+4],EDX
|
||||
|
||||
ADD ESP,8
|
||||
POP EBP
|
||||
RET
|
||||
Reference in new issue
Block a user