Files
TempleOS-Rijn/LT/OSMain/OSMAIN.ASZ
T
2018-09-08 21:45:17 +02:00

361 lines
6.7 KiB
Plaintext

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