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