LTCD_070816.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:45:20 +02:00
1 parent d14bbc24f9
commit 0e9364ff4c
506 files changed
+157705 -41812

No files matched your search

+457
View File
@@ -0,0 +1,457 @@
USE16
JMP U2 LOSETHOS_START2
////**************************PROCEDURE*************************
// ASM Global variables required for 16-bit start-up
ALIGN 4,OC_NOP
SYS_BOOT_BASE:: DU4 ?; //Fixed offset from start used by reboot
SYS_BOOT_HEADER_BASE:: DU4 ?;
SYS_OS_32START:: DU4 INIT_OS;
ALIGN 16,OC_NOP
SYS_GDTTAB:: DU1 MAXGDT*16 DUP(0);
SYS_BOOT_CODE:: DU4 0xFF;
SYS_MEMBLKS:: DU4 0;
SYS_FREE_GDT_LIST:: DU4 0;
ALIGN 8,OC_NOP
SYS_ADAM_TSS:: DU1 TSS_STRUCT_SIZE DUP(0);
SYS_TEMP_PTR:: DU4 0,0,0;
////**************************PROCEDURE*************************
//EBX is SYS_BOOT_CODE (value passed from boot blk)
LOSETHOS_START2::
MOV AX,(0xA0000-2<<BLK_SIZE_BITS)/16
MOV SS,AX
MOV SP,2<<BLK_SIZE_BITS
PUSH EBX //will be SYS_BOOT_CODE
MOV AX,0xB800
MOV ES,AX
MOV U4 ES:[0],('L'+0x1000)+('T'+0x2000)<<16
MOV U4 ES:[4],0
MOV ECX,100000 //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 LOSETHOS_START3
RETF
LOSETHOS_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
//$FG,4$If you debug, use text video memory$FG$
MOV U4 ES:[4],'O'+65536*'K'+0xF000F000
OR EBX,EBX
JZ LOSETHOS_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*************************
LOSETHOS_CONT_START:
STI
/***********
MOV AX,0x4F00
INT 0x10 //GET MODES
PUSH DS
PUSH ES
MOV CX,0x100
MOV SI,DI
XOR DI,DI
MOV AX,ES
MOV DS,AX
MOV AX,0x8000
MOV ES,AX
REP_MOVSB
POP ES
POP DS
***********/
//Enter Graphics Mode
MOV BX,0x12
MOV AX,0x4F02
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 [SYS_GDTTAB+SYS_BOOT_DS_SEL],0x000FFFF
MOV U4 [SYS_GDTTAB+SYS_BOOT_DS_SEL+4],0x0CF9200
MOV U4 [SYS_GDTTAB+SYS_BOOT_CS_SEL],0x000FFFF
MOV U4 [SYS_GDTTAB+SYS_BOOT_CS_SEL+4],0x0CF9A00
MOV EAX,U4 [SYS_BOOT_BASE]
ADD U4 [SYS_GDTTAB+SYS_BOOT_DS_SEL+2],EAX
ADD U4 [SYS_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*16-1
MOV EAX,U4 [SYS_BOOT_BASE]
ADD EAX,SYS_GDTTAB+NULL_SEL
MOV U4 [SYS_TEMP_PTR+2],EAX
MOV U2 [SYS_TEMP_PTR+6],0
LGDT U4 [SYS_TEMP_PTR]
MOV EAX,SYS_START_CR0
// 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,OC_NOP
SYS_IDTTAB:: DU1 MAXIDT*16 DUP(0);
SYS_HEAP_BASE:: DU8 0x100000+0x1000*(NUM_PML1+NUM_PML2+NUM_PML3+NUM_PML4);
SYS_HEAP_LIMIT:: DU8 0;
SYS_FLAGS:: DU8 0;
SYS_TEXTBASE:: DU8 0;
SYS_CUR_SCAN_CODE:: DU8 0;
SYS_EXTERN_TABLE:: DU8 0;
SYS_MEM_FREE_LIST:: DU8 0;
SYS_MEM_FREE_2MEG_LIST:: DU8 0;
SYS_FREE_PAGE_HASH:: DU8 FREE_PAGE_HASH_SIZE DUP(0);
SYS_FREE_PAGE_HASH2:: DU8 64 DUP(0);
SYS_PROGRESS1:: DU8 0;
SYS_PROGRESS2:: DU8 0;
SYS_PROGRESS3:: DU8 0;
SYS_PROGRESS4:: DU8 0;
SYS_CUR_FOCUS_TASK:: DU8 0;
SYS_TIMER:: DU8 1;
SYS_JIFFIES:: DU8 1;
SYS_MP_CPU_STRUCTS:: DU8 0;
SYS_MP_CNT:: DU8 1;
SYS_UNCACHED_MP_CNT:: DU8 0;
SYS_TEMP_CPU0_STRUCT:: DU1 CPU_STRUCT_SIZE DUP (0);
ALIGN CPU_CACHE_LINE_WIDTH,OC_NOP
//Align to cache-line boundary,
// compensating for 16 byte segment header
DU1 CPU_CACHE_LINE_WIDTH-16 DUP(0);
SYS_SEMA_IRQS:: DU1 NUM_IRQ_SEMAS*SEMA_STRUCT_SIZE DUP(0);
SYS_SEMA_IRQ_BUSY:: DU1 NUM_IRQ_SEMAS*SEMA_STRUCT_SIZE DUP(0);
SYS_SEMAS:: DU1 NUM_SYS_SEMAS*SEMA_STRUCT_SIZE DUP(0);
////**************************PROCEDURE*************************
ALIGN 16,OC_NOP
USE32
INIT_OS::
PUSH U4 SYS_START_RFLAGS
POPFD
MOV EAX,SYS_START_CR0
// MOV CR0,EAX
DU1 0x0F,0x22,0xC0;
MOV AL,0xFF
OUT 0x21,AL //mask interrupts
OUT 0xA1,AL
MOV AX,SYS_BOOT_DS_SEL //LOAD DS SELECTOR
MOV DS,AX
MOV ES,AX
MOV U4 [SYS_GDTTAB+ZERO_DS_SEL] ,0x0000FFFF
MOV U4 [SYS_GDTTAB+ZERO_DS_SEL+4] ,0x00CF9200
MOV U4 [SYS_GDTTAB+SYS_CS_SEL] ,0x0000FFFF
MOV U4 [SYS_GDTTAB+SYS_CS_SEL+4] ,0x00CF9A00
MOV U4 [SYS_GDTTAB+SYS_CS64_SEL] ,0x00000000
MOV U4 [SYS_GDTTAB+SYS_CS64_SEL+4] ,0x00209A00
//INIT FREE GDT ENTRIES
MOV U4 [SYS_FREE_GDT_LIST],0
MOV ECX,MAXGDT-FIRST_FREE_SEL/16
MOV EAX,FIRST_FREE_SEL
@@3: MOV EBX,U4 [SYS_FREE_GDT_LIST]
MOV U4 SYS_GDTTAB[EAX],EBX
MOV U4 [SYS_FREE_GDT_LIST],EAX
ADD EAX,16
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::
XOR EAX,EAX
MOV U4 [SYS_FLAGS],EAX
MOV U4 [SYS_FLAGS+4],EAX
MOV EDI,U4 SYS_SEMAS
MOV ECX,NUM_SYS_SEMAS*SEMA_STRUCT_SIZE/4
REP_STOSD
MOV U4 [SYS_HEAP_BASE],0x100000+0x1000*(NUM_PML1+NUM_PML2+NUM_PML3+NUM_PML4)
CALL INIT_MEM
PUSH U4 0
CALL INIT_EM64T
USE64
//INIT INTERRUPT TABLE
MOV RCX,MAXIDT
MOV RDI,U4 SYS_IDTTAB
MOV RSI,U4 IRQ_VECTORS
@@1: MOVSW
MOV AX,SYS_CS64_SEL
STOSW
MOV AX,0x8E00 //E=32-bit irq gate
STOSW
MOVSW
XOR EAX,EAX
STOSQ
LOOP @@1
MOV RAX,U4 SYS_TEMP_PTR
MOV U2 [RAX],MAXIDT*16-1
MOV U4 2[RAX],SYS_IDTTAB
MOV U2 6[RAX],0
MOV U4 8[RAX],0
REX
LIDT U4 [RAX]
//INIT CPU0 STRUCT
PUSH U4 SYS_TEMP_CPU0_STRUCT
PUSH 0
CALL CP_INIT_CPU_STRUCT
ADD RSP,16
PUSH RAX
CALL CP_PUT_GS_BASE
ADD RSP,8
//INIT ADAM TSS
MOV RDI,U4 SYS_ADAM_TSS
MOV RCX,TSS_STRUCT_SIZE
XOR EAX,EAX
REP_STOSB
PUSH DEFAULT_STACK
PUSH U4 SYS_ADAM_TSS
CALL CP_INIT_TSS
ADD RSP,16
CALL PUT_FS_BASE
MOV RSP,U8 TSS_RSP[RAX]
CALL INIT_FLOATING_CONSTS
JMP U4 CP_OS_MAIN
//Continues $LK,"CP_OS_MAIN","FF:::/LT/OSMain/OSEnd.CPZ,CP_OS_MAIN"$
////**************************PROCEDURE*************************
USE32
INIT_EM64T::
//MOV EAX,CR4
DU1 0x0F,0x20,0xE0;
OR EAX,0xB0
//MOV CR4,EAX
DU1 0x0F,0x22,0xE0;
MOV EAX,0x100000+0x1000*(NUM_PML1+NUM_PML2+NUM_PML3)
//MOV CR3,EAX
DU1 0x0F,0x22,0xD8;
MOV ECX,IA32_EFER
XOR EDX,EDX
MOV EAX,IA32F_LME
WRMSR
//MOV EAX,CR0
DU1 0x0F,0x20,0xC0;
OR EAX,0x80000000 //enable paging
//MOV CR0,EAX
DU1 0x0F,0x22,0xC0;
DU1 0xEA; //JMP SYS_CS64_SEL:EM64T_PART3
DU4 EM64T_PART3;
DU2 SYS_CS64_SEL;
USE64
EM64T_PART3:
RET
////**************************PROCEDURE*************************
INIT_FLOATING_CONSTS::
PUSH RBP
MOV RBP,RSP
SUB RSP,8
FLD1
MOV RAX,U4 FC_1
FSTP U8[RAX]
FLDPI
MOV RAX,U4 FC_PI
FSTP U8[RAX]
FLDPI
FLDPI
FADDP
MOV RAX,U4 FC_PI2
FSTP U8[RAX]
FLDL2T
MOV RAX,U4 FC_LOG2_10
FSTP U8[RAX]
FLDL2E
MOV RAX,U4 FC_LOG2_E
FSTP U8[RAX]
FLDLG2
MOV RAX,U4 FC_LOG10_2
FSTP U8[RAX]
FLDLN2
MOV RAX,U4 FC_LOGE_2
FSTP U8[RAX]
FLD1
FSTP U8 -8[RBP]
CALL CP_EXP
MOV RBX,U4 FC_E
MOV U8 [RBX],RAX
ADD RSP,8
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
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;
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
SYS_SHUTDOWN_CPU::
XOR EDI,EDI
MOV EDI,U4 SYS_BOOT_BASE
MOV EDI,U4 [RDI]
XOR ESI,ESI
MOV ESI,U4 SYS_OS_32START
MOV ESI,U4 [RSI]
ADD ESI,EDI
HALT_CPU::
PUSH U4 ZERO_DS_SEL
PUSH U4 0x9C000
PUSH U4 0
PUSH U4 SYS_CS_SEL
CALL @@2
@@2: POP RAX
ADD RAX,10 //@@3-@@2
PUSH RAX
IRET
USE32
@@3:
//disable paging
DU1 0x0F,0x20,0xC0;//MOV EAX,CR0
BTR EAX,31
DU1 0x0F,0x22,0xC0;//MOV CR0,EAX
MOV ECX,IA32_EFER
XOR EDX,EDX
XOR EAX,EAX
WRMSR
MOV EBX,BOOT_CODE_RAM
OR ESI,ESI
JZ @@1
JMP ESI
@@1: HLT
USE64
SYS_SHUTDOWN_CPU_END::