www.pudn.com > czxtsycx1.zip > GPROCESS.ASM


SCHED PROC FAR 
      MOV AX,V_TOS_DATA_SEL  
      MOV DS,AX 
      MOV AX,V_PCB_SEL  
      MOV FS,AX 
 
      ; read cursor and save to PCB 
      MOV EBP,DS:[CURRENT] 
      MOV AH,03H  
      MOV BH,0 
      INT 80H 
      MOV FS:[EBP+242],DL 
      MOV FS:[EBP+243],DH 
      ; read cursor and save to PCB 
 
      CMP DS:[CURRENT],0 
      JE SCHED_NO 
 
      MOV EAX,1024 
      CMP DS:[CURRENT],EAX 
      JNE SCHED_2 
      MOV EAX,512 
SCHED_2: 
      MOV DS:[CURRENT],EAX 
      MOV EBP,EAX 
 
      ; set cursor 
      MOV DL,FS:[EBP+242] 
      MOV DH,FS:[EBP+243] 
      MOV AH,02H  
      MOV BH,0 
      INT 80H 
      ; set cursor 
;call disp_ax 
      ;; 
      ;setup user_desc:stack\tss\ldt 
      PUSH EBP 
      PUSH GS 
      PUSH CX 
      MOV  CX,32 
      MOV  BX,OFFSET V_USER_PSTSS 
      MOV  AX,V_GDT_ASDATA_SEL  
      MOV  GS,AX 
SCHED_2_2: 
      MOV  AL,FS:[EBP+306] 
      MOV  GS:[BX],AL 
      INC  BX 
      INC  EBP 
      LOOP SCHED_2_2 
      POP  CX 
      POP  GS 
      POP  EBP 
SCHED_NO: 
      ;setup user_desc:stack\tss\ldt 
 
;;;;;;3.  recover new process:    TSS in PCB---> real TSS       
      MOV AX,USER_PSTSS_D_SEL    ; 
      MOV ES,AX 
      MOV CX,104 
      MOV BX,0 
SCHED_DO: 
      MOV AL,FS:[EBP+138] 
      MOV ES:[BX],AL 
      INC BX 
      INC EBP 
      LOOP SCHED_DO 
;;;;;;3.    recover new process:    TSS in PCB---> real TSS       
      jmp SCHED_c 
SCHED_c: 
      DB 0EAH                  ;通过U.EXE的任务状态段,执行U.EXE 
      DW 0  
      DW V_USER_PSTSS_SEL 
SCHED ENDP 
 
FORK PROC FAR 
     PUSH DS 
     PUSH FS 
     PUSH EBP 
     PUSH SI 
     ; 
     MOV AX,V_TOS_DATA_SEL  
     MOV DS,AX 
     MOV AX,V_PCB_SEL  
     MOV FS,AX 
     MOV BX,OFFSET PCB_NAME 
     CMP DS:[BX],1111     ;CMD process =11111111 
     JNE  FORK_1 
     CMP DS:[BX+2],1111  
     JNE  FORK_1 
     ;   IS CMD 
     MOV FS:[122],'C' 
     MOV FS:[123],'M' 
     MOV FS:[124],'D' 
     MOV FS:[125],0 
     MOV BX,0            ;0# PROCESS 
     MOV FS:[94],BX 
     MOV EBP,0 
     JMP FORK_3 
FORK_1: 
     ; seek free PCB 
     ADD DS:[CURRENT_PCB],1 
     MOV BP,DS:[CURRENT_PCB] 
     MOVZX EBP,BP 
     SHL EBP,9 
FORK_11: 
     CMP FS:[EBP+94],0     ;free? 
     JZ FORK_12 
     ADD EBP,512 
     JMP FORK_11 
FORK_12: 
     MOV EAX,EBP 
     SHR EAX,9            ;ax=uip 
     MOV FS:[EBP+94],AX   ;uip 
 
;push ax 
;call disp_ax 
;pop ax 
; 
FORK_2: 
 
     ;setup user_desc:stack\tss\ldt 
     PUSH GS 
     PUSH EBP 
     PUSH BX 
     PUSH CX 
     MOV  CX,32 
     MOV  BX,0 
     MOV  AX,V_GDT_ASDATA_SEL  
     MOV  GS,AX 
     MOV  BX,OFFSET V_USER_PSTSS 
FORK_2_2: 
     MOV  AL,GS:[BX] 
     MOV  FS:[EBP+306],AL 
 
;mov ah,0 
;call disp_ax 
 
     INC  EBP 
     INC  BX 
     LOOP FORK_2_2 
     POP  CX 
     POP  BX 
     POP  EBP 
     POP  GS 
     ;setup user_desc:stack\tss\ldt 
 
     ; 2 links 
     ; ebp=first addr for pcb in fs 
     MOV EBX,FS:[62]      ; point to last process  
     MOV EAX,FS:[EBX+58] 
     MOV FS:[EBP+58],EAX  ; next for new 
     MOV FS:[EBX+58],EBP 
     MOV FS:[EBX+62],EBP 
     MOV FS:[EBP+62],EBX  ; prev 
 
     MOV EBX,FS:[70]      ; point to last process  
     MOV EAX,FS:[EBX+66] 
     MOV FS:[EBP+66],EAX  ; next for new 
     MOV FS:[EBX+66],EBP 
     MOV FS:[EBX+70],EBP 
     MOV FS:[EBP+70],EBX  ; prev 
 
     ; setup name 
     MOV EBX,0 
FORK_22: 
     CMP DS:[PCB_NAME+BX],0 
     JZ FORK_3 
     MOV AL,DS:[PCB_NAME+BX] 
     MOV FS:[EBP+EBX+122],AL 
     INC EBX 
     JMP FORK_22 
FORK_3: 
     ;ebp=first addr for pcb in fs 
     MOV DWORD PTR FS:[EBP+0],0   ;state 
     MOV DWORD PTR FS:[EBP+4],100   ;state 
     MOV EAX,DS:[PCB_PRIORITY] 
     MOV DWORD PTR FS:[EBP+8],EAX   ;priority 
     MOV DWORD PTR FS:[EBP+20],4    ;flag 
     ; 
     MOV DX,0101H 
     MOV FS:[EBP+242],DL 
     MOV FS:[EBP+243],DH 
     ; 
     MOV AX,DS:[PCB_TSS] 
     MOV DS,AX 
     MOV SI,0 
     MOV EBX,138 
     ADD EBX,EBP 
FORK_31: 
     MOV EAX,DS:[SI] 
     MOV FS:[EBX],AL 
     INC SI 
     INC EBX 
     CMP SI,104 
     JNZ FORK_31 
 
     POP SI 
     POP EBP 
     POP FS 
     POP DS 
     RET 
FORK ENDP 
 
 
RUN_U1      PROC FAR 
            MOV AX,V_TOS_DATA_SEL  
            MOV DS,AX  
            CALL MAKE_EXE       
            CMP AL,0 
            JNE EXE_ERROR 
;;;;mmmmmm 
            ; setup U1 process  1# 
            MOV AX,V_TOS_DATA_SEL  
            MOV DS,AX 
            MOV AX,USER_PSTSS_D_SEL 
            MOV DS:[PCB_TSS],AX 
            MOV EAX,100 
            MOV DS:[PCB_PRIORITY],EAX 
            MOV DS:[PCB_NAME],'U' 
            MOV DS:[PCB_NAME+1],'1' 
            MOV DS:[PCB_NAME+2],0 
            CALL FORK 
;;;;mmmmmm 
            ; set cursor 
            ;MOV AH,02H  
            ;MOV BH,0 
            ;MOV DX,0301H 
            ;MOV DL,0 
            ;INT 80H 
 
            MOV AX,V_TOS_DATA_SEL  
            MOV DS,AX 
            MOV DS:[CURRENT],512        ;user U1.EXE  
            ;MOV BYTE PTR DS:[NEED_RESCHED],1   ;start schedule 
            ;DB 0EAH                  ;通过U.EXE的任务状态段,执行U.EXE 
            ;DW 0  
            ;dw V_USER_PsTSS_SEL 
 
            ; set cursor 
            ;MOV AX,V_TOS_DATA_SEL  
            ;MOV DS,AX 
            ;MOV AH,02H  
            ;MOV BH,0 
            ;MOV DX,0501H 
            ;MOV DL,0 
            ;INT 80H 
            ;;;;;;            display "C:\>" 
            ;MOV DX,OFFSET COS_FLAG 
            ;CALL STRDISP           ;display "C:\>" 
            RET 
RUN_U1      ENDP 
 
MAKE_EXE    PROC FAR 
            ;;;;;;;;;;;DOS int21h 4eh 
            MOV AX,V_TOS_DATA_SEL  
            MOV DS,AX  
            PUSH FS 
 
            MOV AX,V_GDT_ASDATA_SEL 
            MOV FS,AX 
            MOV EAX,400000H 
            CMP DS:[G_BUF_PTR],EAX 
            JNE RUN_EXE_1 
            MOV DS:[G_BUF_PTR],0H 
            JMP RUN_EXE_20        ;nothing to do 
RUN_EXE_1: 
 
            MOV EDX,10000H 
            ADD DS:[G_BUF_PTR],EDX 
            MOV EDX,DS:[G_BUF_PTR] 
            ADD EDX,400000H 
;push eax 
;MOV eax,edx          ;disp 0041 
;shr eax,16 
;call disp_ax 
;mov eax,0fffffffh 
;d1111: 
;dec eax 
;jnz d1111 
;pop eax 
 
            MOV FS:[G_BUF].BASE_L,DX 
            SHR EDX,16 
            MOV FS:[G_BUF].BASE_M,DL 
RUN_EXE_20: 
            MOV EDX,400000H 
            CMP DS:[USER_SEGS_PTR],EDX 
            JNE RUN_EXE_2 
            MOV DS:[USER_SEGS_PTR],0 
            JMP RUN_EXE_3 
RUN_EXE_2: 
            MOV EDX,3000H 
            ADD DS:[USER_SEGS_PTR],EDX 
            MOV EDX,DS:[USER_SEGS_PTR] 
            ADD EDX,401000H 
            PUSH EDX 
 
            MOV FS:[V_USER_PSTSS].BASE_L,DX 
            MOV FS:[USER_PSTSS_D].BASE_L,DX 
            SHR EDX,16 
            MOV FS:[V_USER_PSTSS].BASE_M,DL 
            MOV FS:[USER_PSTSS_D].BASE_M,DL 
            POP EDX 
            ADD EDX,1000H 
            MOV FS:[V_USER_PSLDTT].BASE_L,DX 
            MOV FS:[USER_PSLDTT_ASDATA].BASE_L,DX 
            SHR EDX,16 
            MOV FS:[V_USER_PSLDTT].BASE_M,DL 
            MOV FS:[USER_PSLDTT_ASDATA].BASE_M,DL 
            ;;COPY first to user_segs_ptr 
            MOV EAX,0 
            CMP DS:[USER_SEGS_PTR],EAX 
            JE RUN_EXE_3 
            ;;MMMMMMMMMM 
            MOV AX,V_USER_SEGS_SEL 
            MOV FS,AX 
 
;push eax 
;MOV Eax,DS:[USER_SEGS_PTR] 
;SHR EAX,16 
;call disp_ax 
;MOV Eax,DS:[USER_SEGS_PTR] 
;call disp_ax 
;mov eax,02ffFffffh 
;d2222: 
;dec eax 
;jnz d2222 
;pop eax 
 
            MOV EBX,DS:[USER_SEGS_PTR] 
            MOV ESI,0 
            MOV CX,12288     
RUN_EXE_30: 
            mov AL,FS:[ESI] 
            mov FS:[EBX],AL    ;4 BYTEs one time:error 
            ADD esi,4 
            ADD EBX,4 
            loop RUN_EXE_30 
            ;;MMMMMMMMMM 
RUN_EXE_3: 
            ;;COPY first to user_segs_ptr 
            POP FS 
 
            MOV AX,V_TOS_DATA_SEL  
            MOV DS,AX  
            ;;;;;  asciiz change to upper 
            MOV SI,OFFSET G_WORK    ;FILE_NAME0 
            ADD SI,6    ;G_WORK='  run d:\ggtt\mode.txt' 
RUN_EXE1:     ;         <------------------------------------ 
            MOV AL,DS:[SI] 
            CMP AL,0 
            JE RUN_EXE_OK 
            ; upper/lower 
            CMP AL,61H 
            JL  RUN_EXE11 
            CMP AL,7AH 
            JA  RUN_EXE11 
            SUB AL,20H 
            MOV DS:[SI],AL 
RUN_EXE11:                  ; upper/lower   
            INC SI 
            LOOP RUN_EXE1 
RUN_EXE_OK: 
            ;;;;;  asciiz change to upper 
            MOV ECX,0FFFFH          ;to read count 
            MOV DX,OFFSET G_WORK    ;FILE_NAME0 
            ADD DX,6                ;ds:dx file name asciiz 
            MOV AX,G_BUF_SEL 
            MOV ES,AX               ;ES:EBX buffer 
            MOV EBX,0;              ;buf offset 1M 
            CALL READFILE3F 
            CMP AX,0                ;ax<=0 error 
            JLE RUN_EXE_END 
            ;U.EXE have been input to g_buf  ax=length of u.exe 
;nnnnnnnnnnnnn; 
            MOV BX,V_USER_PSLDT_SEL 
            LLDT BX 
            ;*** 将c_buffer(放U.EXE)中内容? g_buf 
            ;**********************开始处理 U.EXE 
            ;MOV AX,TOS_DATA_SEL      ;gggggggggggggg 
            MOV AX,V_TOS_DATA_SEL 
            MOV DS,AX             ;TOS系统数据段 
            MOV AX,G_BUF_SEL       
            MOV GS,AX             ;.exe(g_buf) 段,EXE头+程序 
;mov eax,ds:[g_buf_ptr] 
;call disp_ax 
;mov ax,0aaaah 
;call disp_ax 
            MOV AX,USER_PS_SEL    ;GDT中USER_PS的首址 
            SUB AX,04H 
            PUSH FS 
            CALL G_EXEC           ;重定位,创建段表,开始2字节<>4D5AH,则不是DOS .exe  
            POP FS 
            CMP AX,1              ;  
            JZ  RUN_EXE_ERR_EXEFIL 
            ;**********************设置U.EXE的任务状态段  
            MOV BL,DS:G_WORK[4] 
            MOV BH,DS:G_WORK[5] 
            MOV CL,DS:G_WORK[6] 
            MOV CH,DS:G_WORK[7] 
            push fs 
            mov ax,USER_PsTSS_D_SEL 
            mov fs,ax 
 
            mov fs:USER_Ps_TASK.TREIP,cx 
            mov fs:USER_Ps_TASK.TREIP+2,0 
            mov fs:USER_Ps_TASK.TRCS,USER_PS_SEL 
            mov fs:USER_Ps_TASK.TRCS+2,0 
;pop fs 
;jmp RUN_EXE_END  ;OK1 
            mov fs:USER_Ps_TASK.TREFLAG,0 ;03000h 
            mov fs:USER_Ps_TASK.TRLDT,V_USER_PsLDT_SEL 
            mov fs:USER_Ps_TASK.TRLDT+2,0 
            MOV EAX,G_PDT_ADDR           
            mov fs:USER_Ps_TASK.trcr3,eax 
            mov al,ds:g_WORK 
            mov ah,ds:g_WORK[1] 
            mov fs:USER_Ps_TASK.TRDS,1Ch 
            mov fs:USER_Ps_TASK.TRDS+2,0 
            mov fs:USER_Ps_TASK.TRES,G_VRAM_SEL 
            mov fs:USER_Ps_TASK.TRES+2,0 
            mov fs:USER_Ps_TASK.TRSS0,ax ;V_STACK0_SEL 
            mov fs:USER_Ps_TASK.TRSS0+2,0 
            mov fs:USER_Ps_TASK.TRSS,AX 
            mov fs:USER_Ps_TASK.TRSS+2,0 
            mov al,ds:g_WORK[2] 
            mov ah,ds:g_WORK[3] 
            mov fs:USER_Ps_TASK.TRESP0,ax;08FFEH 
            mov fs:USER_Ps_TASK.TRESP0+2,0 
            mov fs:USER_Ps_TASK.TRESP,AX 
            mov fs:USER_Ps_TASK.TRESP+2,0 
            mov fs:USER_Ps_TASK.TRFLAG,0 
            pop fs 
;sti 
            MOV AX,V_TOS_DATA_SEL  
            MOV DS,AX  
            MOV AX,0 
;nnnnnnnnnnnnnnn 
;test 
;push ax 
;push fs 
;push di 
;push dx 
;MOV aX,V_GDT_ASDATA_SEL 
;MOV aX,USER_PSLDTT_ASDATA_SEL 
;     ;MOV aX,V_G_PT0_SEL 
;     ;mov ax,USER_PsTSS_D_SEL 
;     ;mov fs,ax 
;     ;mov di,32 
;     ;mov dx,2 
;     ;call disp_mem 
;call disp_ldt_head 
 
;pop dx 
;pop di 
;pop fs 
;pop ax 
;jmp RUN_EXE_END  ;OK4 
;test 
            JMP RUN_EXE_END 
 
RUN_EXE_ERR_EXEFIL: 
            MOV AX,V_TOS_DATA_SEL  
            MOV DS,AX  
            MOV AH,9 
            MOV CX,1100H  
            MOV DX,OFFSET ERR_EXEFILE 
            INT 21H     
            MOV AX,1 
RUN_EXE_END: 
            RET 
MAKE_EXE    ENDP 
 
READFILE3f  PROC FAR 
            ; input ds:Dx file name asciiz string Ecx=ready to read count 
            ;       es:ebx  buffer 
            ; output ax=-1 error ax=0 empty file ax>0 real read count 
            PUSH ES 
            PUSH EBX 
 
            MOV CX,0                ;search normal file 
            MOV AH,4EH 
            INT 21H 
            ;;;;;;;;;;;DOS int21h 4eh 
            MOV AX,V_TOS_DATA_SEL  
            MOV DS,AX  
            CMP DS:DAT,0            ;get diretory to DAT 
            JNE FILEGGERROR 
            CALL FREAD_DAT          ;ax=read count 
;push ax             
; mov cx,0f26H 
; call disp_ax  ;length of u.exe 
;pop ax 
            ;MOV to es:ebx from V_FILE_BUF_SEL(DS:DX) 
            MOV CX,AX 
            POP EBX 
            POP ES 
            PUSH CX 
            MOV AX,V_FILE_BUF_SEL  
            MOV DS,AX  
            MOV DI,0 
READFILE3f1:MOV EAX,DWORD PTR DS:[DI] 
            MOV DWORD PTR ES:[EBX],EAX 
            ADD EBX,4 
            ADD DI,4 
            LOOP READFILE3f1 
 
            MOV AX,V_TOS_DATA_SEL  
            MOV DS,AX  
            POP AX                 ;OK to return READ COUNT 
            JMP FILEEND            ;OK 
FILEGGERROR: 
            POP EBX 
            POP ES 
            ; read cursor 
            MOV AH,03H  
            MOV BH,0 
            INT 80H 
            ; set cursor 
            MOV AH,02H  
            MOV BH,0 
            INC DH 
            MOV DL,0 
            INT 80H 
            MOV DX,OFFSET CMD_ERROR 
            CALL STRDISP 
FILEEND: 
            RET 
READFILE3F  ENDP 
 
SETUP_CMD   PROC FAR 
            cli 
            ;MOV AL,11111100B 
            ;OUT 21H,AL 
            ;time int 
 
            ;PCB_init 
            MOV AX,V_PCB_SEL  
            MOV DS,AX 
            MOV CX,0FFFFH      ;only do 64K*4 area 
            MOV EBX,0 
            MOV EAX,0 
SETUP_CMD_1: 
            MOV DS:[EBX],EAX 
            ADD EBX,4 
            LOOP SETUP_CMD_1 
            ;PCB_init 
 
            ;process 
            ; setup CMD process 
            MOV AX,V_TOS_DATA_SEL  
            MOV DS,AX 
            MOV BX,OFFSET PCB_TSS 
            MOV AX,V_TOS_TSSASDATA_SEL  
            MOV DS:[BX],AX 
            MOV BX,OFFSET PCB_PRIORITY 
            MOV EAX,100 
            MOV DS:[BX],EAX 
            MOV BX,OFFSET PCB_NAME 
            MOV AX,1111     ;CMD process =11111111 
            MOV DS:[BX],AX 
            MOV DS:[BX+2],AX 
            CALL FORK 
            ; modify gdt for tos_tss 
            MOV AX,GDT_ASDATA_SEL 
            MOV GS,AX 
            MOV WORD PTR GS:[V_TOS_TSS+2],138 
            MOV BYTE PTR GS:[V_TOS_TSS+4],0FEH 
            MOV BYTE PTR GS:[V_TOS_TSS+7],0FFH 
            ; modify gdt for tos_tss 
            ;MOV AX,V_TOS_DATA_SEL  
            ;MOV DS,AX 
            ;MOV BYTE PTR DS:[NEED_RESCHED],1   ;start schedule 
            ;process 
            RET 
SETUP_CMD   ENDP 
;test 
;MOV AX,G_VRAM_SEL 
;MOV ES,AX 
;MOV ECX,0FFFFFFH 
;SCHED_1: 
;MOV ES:[500],4141H           ;AAAAAAAAAAAAAAAAA 
;DEC ECX 
;CMP ECX,0 
;JNZ SCHED_1 
;test