STRUC        0
BPT_NEXT:                DU8        ?;
BPT_ADDRESS:                DU8        ?;
BPT_FLAGS:                DU4        ?;
BPT_U1:                        DU1        ?;
             ENDS

             STRUC 0 $LK+BK,"Redundent C+ Struct","FF:/LT/OSMain/AdamK.HPZ,class TssStruct"$
TSS_ADDRESS:                DU8        ?;
TSS_TASK_FLAGS:         DU8        ?;
TSS_DISPLAY_FLAGS:        DU8        ?;
TSS_WAKE_TIME:                DU8        ?;

TSS_CODE_HEAP:                 DU8        ?;
TSS_DATA_HEAP:                 DU8        ?;

TSS_CUR_LTF:                 DU8        ?;
TSS_AUX_LTF:                DU8        ?;
TSS_WIN_LEFT:                DU8        ?;
TSS_WIN_RIGHT:                DU8        ?;
TSS_WIN_TOP:                 DU8        ?;
TSS_WIN_BOTTOM:                DU8        ?;

TSS_CUR_PARTITION:        DU8        ?;
TSS_CUR_DIR:                 DU8        ?;

TSS_PARENT_TSS:         DU8        ?;
TSS_NEXT_TSS:                DU8        ?;        //ABSOLUTE ADDRESS OF NEXT TSS
TSS_LAST_TSS:                DU8        ?;        //ABSOLUTE ADDRESS OF LAST TSS
TSS_NEXT_INPUT_FILTER_TSS:        DU8        ?;
TSS_LAST_INPUT_FILTER_TSS:        DU8        ?;
TSS_NEXT_SIBLING_TSS:        DU8        ?;
TSS_LAST_SIBLING_TSS:        DU8        ?;
TSS_NEXT_CHILD_TSS:        DU8        ?;
TSS_LAST_CHILD_TSS:        DU8        ?;

//These are derived
TSS_WIN_WIDTH:                DU8        ?;
TSS_WIN_HEIGHT:                DU8        ?;
TSS_WIN_PIXEL_LEFT:        DU8        ?;
TSS_WIN_PIXEL_RIGHT:        DU8        ?;
TSS_WIN_PIXEL_WIDTH:        DU8        ?;
TSS_WIN_PIXEL_TOP:        DU8        ?;
TSS_WIN_PIXEL_BOTTOM:        DU8        ?;
TSS_WIN_PIXEL_HEIGHT:        DU8        ?;
TSS_WIN_BORDER_PIXEL_LEFT:        DU8        ?; //These are derived
TSS_WIN_BORDER_PIXEL_RIGHT:         DU8        ?;
TSS_WIN_BORDER_PIXEL_TOP:        DU8        ?;
TSS_WIN_BORDER_PIXEL_BOTTOM:         DU8        ?;

TSS_RIP:                DU8        ?;
TSS_RFLAGS:                DU8        ?;
TSS_RAX:                DU8        ?;
TSS_RCX:                DU8        ?;
TSS_RDX:                DU8        ?;
TSS_RBX:                DU8        ?;
TSS_RSP:                DU8        ?;
TSS_RBP:                DU8        ?;
TSS_RSI:                DU8        ?;
TSS_RDI:                DU8        ?;
TSS_R8:                        DU8        ?;
TSS_R9:                        DU8        ?;
TSS_R10:                DU8        ?;
TSS_R11:                DU8        ?;
TSS_R12:                DU8        ?;
TSS_R13:                DU8        ?;
TSS_R14:                DU8        ?;
TSS_R15:                DU8        ?;
TSS_GS:                 DU8        ?;

TSS_FPU:                DU1        112 DUP(?);
TSS_TIME_SLICE_START:        DU8        ?;
TSS_TOTAL_TIME:                DU8        ?;
TSS_SWAP_CNTER:                DU8        ?;

TSS_UPDATE_WIN:                DU8        ?;
TSS_DRAW_IT:                DU8        ?;
TSS_TASK_DESCRIPTOR:        DU1        TSS_DESC_LENGTH+1 DUP (?);
TSS_TASK_DESCRIPTOR2:        DU1        TSS_DESC_LENGTH+1 DUP (?);
TSS_WALLPAPER_DATA:        DU1        TSS_WALLPAPER_DATA_SIZE DUP (?);
TSS_DOUBLE_BUF_CUR_LTF:        DU8        ?;
TSS_DOUBLE_BUF_AUX_LTF:        DU8        ?;
TSS_SCROLL_SPEED:        DU4        ?;
TSS_TEXT_ATTR:                DU1        ?;
TSS_BORDER_ATTR:        DU1        ?;
                                             DU2        ?;  //Unused
TSS_STACK_BASE:                DU8        ?;
TSS_STACK_SIZE:                DU8        ?;
TSS_NEXT_EXCEPT:        DU8        ?;
TSS_LAST_EXCEPT:        DU8        ?;
TSS_EXCEPT_RBP:                DU8        ?;
TSS_EXCEPT_ARGC:        DU8        ?;
TSS_EXCEPT_ARGV:        DU8        ?;
TSS_CATCH_EXCEPT:        DU1        ?;
TSS_IGNORE_EXCEPT:        DU1        ?;
                                             DU1        6 DUP(?);
TSS_BPT_LIST:                DU8        ?;
TSS_NEXT_CTRL:                DU8        ?;
TSS_LAST_CTRL:                DU8        ?;
TSS_NEXT_ODE:                DU8        ?;
TSS_LAST_ODE:                DU8        ?;
TSS_LAST_ODE_TIME:        DU8        ?;
TSS_HASH_TABLE:         DU8        ?;
TSS_ACCT:                DU8        ?;
TSS_NEXT_SERVANT_CMD:        DU8        ?;
TSS_LAST_SERVANT_CMD:        DU8        ?;
TSS_NEXT_MASTER_CMD:        DU8        ?;
TSS_LAST_MASTER_CMD:        DU8        ?;
TSS_NEXT_LEX:                DU8        ?;
TSS_LAST_LEX:                DU8        ?;

TSS_WIN_OLD_LEFT:        DU8        ?;
TSS_WIN_OLD_RIGHT:        DU8        ?;
TSS_WIN_OLD_TOP:         DU8        ?;
TSS_WIN_OLD_BOTTOM:        DU8        ?;

TSS_END_TASK_CB:        DU8        ?;
TSS_USER_NUM:                DU4        ?;
TSS_FAULT_NUM:                DU4        ?;
TSS_ANSWERS:                DU8        8 DUP(?);
TSS_DOUBLE_ANSWERS:        DU8        8 DUP(?);
TSS_ANSWERS_TYPES:        DU4        8 DUP(?);
TSS_ANSWERS_DISPLAYED:        DU4        ?;
TSS_IN_QUEUE_SIGNATURE:        DU4        ?;
TSS_DBG:                DU8        ?;
TSS_POPUP:                DU8        ?;
TSS_LOCALCHNL:                DU8        ?;
TSS_RMTCHNL:                DU8        ?;
TSS_HORZ_SCROLL:        DU1        32 DUP(?);
TSS_VERT_SCROLL:        DU1        32 DUP(?);
TSS_MP:                        DU8        ?;
TSS_SLAVE_TASK_DATA0:        DU8        ?;
TSS_SLAVE_TASK_DATA1:        DU8        ?;
TSS_SLAVE_TASK_DATA2:        DU8        ?;
TSS_SLAVE_TASK_DATA3:        DU8        ?;
TSS_USER_DATA0:                DU8        ?;
TSS_USER_DATA1:                DU8        ?;
TSS_USER_DATA2:                DU8        ?;
TSS_USER_DATA3:                DU8        ?;
TSS_STRUCT_SIZE:
             ENDS
$PJ,"Project: OSMain","/LT/OSMain/OS.SPZ"$
////**************************PROCEDURE*************************
IDLE_START::
SAVE_CONTEXT::
             PUSH        EAX
             PUSHFD
             XOR        EAX,EAX
             MOV        RAX,FS:TSS_ADDRESS[RAX]
             POP        U8 TSS_RFLAGS[RAX]
             MOV        U8 TSS_RBX[RAX],RBX
             MOV        U8 TSS_RCX[RAX],RCX
             MOV        U8 TSS_RDX[RAX],RDX
             MOV        U8 TSS_RSI[RAX],RSI
             MOV        U8 TSS_RDI[RAX],RDI
             MOV        U8 TSS_RBP[RAX],RBP
             MOV        U8 TSS_R8[RAX],R8
             MOV        U8 TSS_R9[RAX],R9
             MOV        U8 TSS_R10[RAX],R10
             MOV        U8 TSS_R11[RAX],R11
             MOV        U8 TSS_R12[RAX],R12
             MOV        U8 TSS_R13[RAX],R13
             MOV        U8 TSS_R14[RAX],R14
             MOV        U8 TSS_R15[RAX],R15
             POP        U8 TSS_RAX[RAX]

             MOV        RSI,RAX
             XOR        EAX,EAX
             RDTSC
             SHL        RDX,32
             ADD        RAX,RDX
             MOV        RBX,RAX
             SUB        RBX,U8 TSS_TIME_SLICE_START[RSI]
             ADD        U8 TSS_TOTAL_TIME[RSI],RBX

             FSAVE        U4 TSS_FPU[RSI]

             MOV        RDX,U8 TSS_BPT_LIST[RSI]
@@3:        OR        RDX,RDX
             JZ        @@4
             MOV        RDI,U8 BPT_ADDRESS[RDX]
             MOV        AL,U1 BPT_U1[RDX]
             MOV        U1 [RDI],AL
             MOV        RDX,U8 BPT_NEXT[RDX]
             JMP        @@3
@@4:        BTR        U8 TSS_TASK_FLAGS[RSI],TSSf_CURRENTLY_RUNNING
             BTS        U8 TSS_TASK_FLAGS[RSI],TSSf_HAS_BEEN_SWAPPED
             RET
////**************************PROCEDURE*************************
RESTORE_CONTEXT::
             XOR        EAX,EAX
             INC        U8 GS:CPU_SWAP_CNTER[RAX]
             XOR        EAX,EAX
             MOV        RSI,FS:TSS_ADDRESS[RAX]
             BTS        U8 TSS_TASK_FLAGS[RSI],TSSf_CURRENTLY_RUNNING
             BT        U8 TSS_TASK_FLAGS[RSI],TSSf_DISABLE_BPTS
             JC        @@4
             MOV        RDX,U8 TSS_BPT_LIST[RSI]
@@3:        OR        RDX,RDX
             JZ        @@4
             MOV        RDI,U8 BPT_ADDRESS[RDX]
             BTR        U8 BPT_FLAGS[RDX],SBPTf_DISABLE
             JC        @@6
             MOV        AL,U1 [RDI]
             MOV        U1 BPT_U1[RDX],AL
             MOV        U1 [RDI],0xCC
@@6:        MOV        RDX,U8 BPT_NEXT[RDX]
             JMP        @@3

@@4:        INC        U8 TSS_SWAP_CNTER[RSI]

             FRSTOR        U4 TSS_FPU[RSI]

             XOR        EAX,EAX
             RDTSC
             SHL        RDX,32
             ADD        RAX,RDX
             MOV        RBX,RAX
             MOV        U8 TSS_TIME_SLICE_START[RSI],RBX

             MOV        RBX,U8 TSS_RBX[RSI]
             MOV        RCX,U8 TSS_RCX[RSI]
             MOV        RDX,U8 TSS_RDX[RSI]
             MOV        RDI,U8 TSS_RDI[RSI]
             MOV        RBP,U8 TSS_RBP[RSI]
             MOV        R8,U8 TSS_R8[RSI]
             MOV        R9,U8 TSS_R9[RSI]
             MOV        R10,U8 TSS_R10[RSI]
             MOV        R11,U8 TSS_R11[RSI]
             MOV        R12,U8 TSS_R12[RSI]
             MOV        R13,U8 TSS_R13[RSI]
             MOV        R14,U8 TSS_R14[RSI]
             MOV        R15,U8 TSS_R15[RSI]

             MOV        RAX,U8 TSS_RAX[RSI]
             PUSH        ZERO_DS_SEL
             PUSH        U8 TSS_RSP[RSI]
             PUSH        U8 TSS_RFLAGS[RSI]
             PUSH        SYS_CS64_SEL
             PUSH        U8 TSS_RIP[RSI]
             MOV        RSI,U8 TSS_RSI[RSI]
             IRET
////**************************PROCEDURE*************************
END_RSI_TASK:
             MOV        RAX,RSI
             CALL        SET_FS_BASE
END_TASK_NOW::
             CALL        END_TASK
             MOV        RSI,RAX
             CALL        SET_FS_BASE
             JMP        RESTORE_RSI_TASK_WITH_KEY_CHECK

RESTORE_RSI_NO_PREEMPT_TASK:
             BT        U8 [SYS_FLAGS],SYSf_CTRL_ALT_DEL
             JC        I4 HANDLE_SWAP_KEY_EVENT
             JMP        RESTORE_RSI_TASK_NO_KEY_CHECK

SAVE_CONTEXT_SWAP_IN_NEXT::
             PUSHFD
             PUSH        EAX
             MOV        RAX,SYS_SEMAS
             BT        U4 SYS_SEMA_SINGLE_USER*SEMA_STRUCT_SIZE[RAX],0
             JC        @@4
             POP        EAX

             CLI
             PUSH        ESI
             XOR        ESI,ESI
             MOV        RSI,FS:TSS_ADDRESS[RSI]
             CMP        U8 TSS_NEXT_TSS[RSI],RSI
             JNE        @@0

             PUSH        EAX
             PUSH        EDX
             XOR        EAX,EAX
             RDTSC
             SHL        RDX,32
             ADD        RAX,RDX
             CMP        U8 TSS_WAKE_TIME[RSI],RAX
             JA        @@0A

             POP        EDX
             POP        EAX
             POP        ESI
             POPFD
             RET

@@4:        POP        EAX
             POPFD
             RET

@@0A:        POP        EDX
             POP        EAX
@@0:        POP        ESI
             CALL        SAVE_CONTEXT

             XOR        ESI,ESI
             MOV        RSI,FS:TSS_ADDRESS[RSI]
             MOV        RBX,U4 IDLE_POINT
             MOV        U8 TSS_RIP[RSI],RBX
             POP        U8 TSS_RFLAGS[RSI]
             MOV        U8 TSS_RSP[RSI],RSP

RESTORE_NEXT_RSI_TASK:
             MOV        RSI,U8 TSS_NEXT_TSS[RSI]

RESTORE_RSI_TASK_WITH_KEY_CHECK:
             TEST        U4 [SYS_FLAGS],1<<SYSf_CTRL_ALT_DEL|1<<SYSf_CTRL_ALT_ESC|
1<<SYSf_CTRL_ALT_TAB|1<<SYSf_CTRL_ALT_X|1<<SYSf_CTRL_ALT_C
             JNZ        HANDLE_SWAP_KEY_EVENT

RESTORE_RSI_TASK_NO_KEY_CHECK:
             XOR        EAX,EAX
             MOV        U8 GS:CPU_SWAP_LOOP_TSS[RAX],RSI

@@1:        BT        U8 TSS_TASK_FLAGS[RSI],TSSf_KILL_TASK
             JC        I4 END_RSI_TASK
             TEST        U8
TSS_TASK_FLAGS[RSI],1<<TSSf_AWAITING_MSG|1<<TSSf_SUSPENDED|1<<TSSf_PAUSED
             JNZ        @@2

             XOR        EAX,EAX
             RDTSC
             SHL        RDX,32
             ADD        RAX,RDX
             CMP        U8 TSS_WAKE_TIME[RSI],RAX
             JA        @@2

             CMP        U4 TSS_IN_QUEUE_SIGNATURE[RSI],TSSS_IN_QUEUE_SIGNATURE
             JNE        SWAP_IN_SETH_TASK
             MOV        RAX,RSI
             CALL        SET_FS_BASE
             JMP        I4 RESTORE_CONTEXT

@@2:        MOV        RSI,U8 TSS_NEXT_TSS[RSI]
             XOR        EAX,EAX
             CMP        U8 GS:CPU_SWAP_LOOP_TSS[RAX],RSI
             JNE        @@1
             MOV        RAX,U8 GS:CPU_IDLE_TSS[RAX]
             CALL        SET_FS_BASE
             STI
             NOP
             CLI
             JMP        RESTORE_RSI_TASK_WITH_KEY_CHECK

SWAP_IN_SETH_TASK:
             XOR        EAX,EAX
             MOV        RSI,GS:CPU_SETH_TSS[RAX]
             JMP        RESTORE_RSI_TASK_WITH_KEY_CHECK

IDLE_POINT::
             RET

IDLE_END::

HANDLE_SWAP_KEY_EVENT:
             MOV        RAX,RSI
             CALL        SET_FS_BASE
             XOR        EAX,EAX
             MOV        RAX,GS:CPU_NUM[RAX]
             OR        RAX,RAX
             JNZ        I4 RESTORE_RSI_TASK_NO_KEY_CHECK

             MOV        RAX,U4 SYS_FLAGS
             BTR        U4 [RAX],SYSf_CTRL_ALT_DEL
             JC        I4 CP_REBOOT

             BTR        U4 [RAX],SYSf_CTRL_ALT_ESC
             JNC        @@2
             CALL        SPAWN_USER_AND_FOCUS
             JMP        I4 RESTORE_FS_TASK_WITH_KEY_CHECK

@@2:        BTR        U4 [RAX],SYSf_CTRL_ALT_TAB
             JNC        @@3
             PUSH        ESI
             MOV        RSI,U8 [SYS_CUR_FOCUS_TASK]
             MOV        U8 [SYS_CUR_FOCUS_TASK],0
             CALL        FOCUS_RSI_NEXT_USER
             POP        ESI
             JMP        I4 RESTORE_FS_TASK_WITH_KEY_CHECK

@@3:        BTR        U4 [RAX],SYSf_CTRL_ALT_X
             JC        END_FOCUS_USER
             BTR        U4 [RAX],SYSf_CTRL_ALT_C
             JNC        I4 RESTORE_RSI_TASK_WITH_KEY_CHECK

BREAK_FOCUS_USER:
             MOV        RSI,U8 [SYS_CUR_FOCUS_TASK]
             OR        RSI,RSI
             JZ        I4 SWAP_IN_SETH_TASK
             BT        U8 TSS_TASK_FLAGS[RSI],TSSf_LOCAL_USER
             JNC        I4 RESTORE_RSI_TASK_NO_KEY_CHECK
             BTR        U8 TSS_TASK_FLAGS[RSI],TSSf_BREAK_LOCKED
             JNC        @@1
             BTS        U8 TSS_TASK_FLAGS[RSI],TSSf_PENDING_BREAK
             JMP        I4 RESTORE_RSI_TASK_NO_KEY_CHECK

@@1:        MOV        RAX,CP_BREAK
             MOV        U8 TSS_RIP[RSI],RAX
             BT        U8 TSS_TASK_FLAGS[RSI],TSSf_BREAK_TO_CTRLQ
             JC        @@4

//We do these two now, in case interrupt happens
             MOV        U8 TSS_WAKE_TIME[RSI],0
             BTR        U8 TSS_TASK_FLAGS[RSI],TSSf_AWAITING_MSG

@@4:        JMP        I4 RESTORE_RSI_TASK_NO_KEY_CHECK

END_FOCUS_USER:
             MOV        RSI,U8 [SYS_CUR_FOCUS_TASK]
             MOV        U8 [SYS_CUR_FOCUS_TASK],0
             PUSH        ESI
             CALL        FOCUS_RSI_NEXT_USER
             POP        ESI
             OR        RSI,RSI
             JZ        I4 SWAP_IN_SETH_TASK
             MOV        RAX,RSI
             CALL        SET_FS_BASE
             BT        U8 TSS_TASK_FLAGS[RSI],TSSf_LOCAL_USER
             JNC        I4 RESTORE_RSI_TASK_WITH_KEY_CHECK
             BTS        U8 TSS_TASK_FLAGS[RSI],TSSf_KILL_TASK
             JMP        I4 END_RSI_TASK

RESTORE_FS_TASK_WITH_KEY_CHECK:
             XOR        ESI,ESI
             MOV        RSI,FS:TSS_ADDRESS[RSI]
             JMP        I4 RESTORE_RSI_TASK_WITH_KEY_CHECK

SPAWN_USER_AND_FOCUS:
             MOV        U8 [SYS_CUR_FOCUS_TASK],0
             PUSH        TRUE                //add to queue
             PUSH        DEFAULT_STACK
             PUSH        0                ///use adam acct
             PUSH        0                //Adam is parent
             PUSH        NULL                //desc
             PUSH        0
             PUSH        U4 CP_USER_CMD_LINE
             CALL        CP_SPAWN_TASK
             ADD        RSP,56
             PUSH        EAX
             MOV        RAX,U8 [SYS_EXTERN_TABLE]
             MOV        RAX,U8 EXT_WIN_TO_TOP*8[RAX]
             OR        RAX,RAX
             JZ        @@10
             CALL        RAX
@@10:        ADD        RSP,8
             RET

FOCUS_RSI_NEXT_USER:
             OR        RSI,RSI
             JNZ        @@11
             MOV        RSI,U4 SYS_ADAM_TSS
@@11:        MOV        RDI,RSI
             MOV        RSI,U8 TSS_NEXT_TSS[RSI]
@@14:        BT        U8 TSS_TASK_FLAGS[ESI],TSSf_LOCAL_USER
             JNC        @@19
             CMP        U8 [SYS_CUR_FOCUS_TASK],RSI
             JE        @@19
             MOV        U8 [SYS_CUR_FOCUS_TASK],RSI
             MOV        RAX,U8 [SYS_EXTERN_TABLE]
             MOV        RAX,U8 EXT_WIN_TO_TOP*8[RAX]
             OR        RAX,RAX
             JZ        @@19B
             PUSH        ESI
             CALL        RAX
             ADD        RSP,8
             JMP        @@19B
@@19:        MOV        RSI,U8 TSS_NEXT_TSS[RSI]
             CMP        RSI,RDI
             JNE        @@14
             MOV        U8 [SYS_CUR_FOCUS_TASK],0
@@19B:        RET
Scheduler
Home

Kernel
StartUp
Scheduler
Memory
MultiCore
Interrupts
BitMaps
Screen
Plot
Compiler Frontend
Compiler Mid
Compiler Backend