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


 
;程序文件:\TC\G\GFAT16.ASM 清单 
; base on g_int.asm 
;only support one hard disk 
.MODEL HUGE 
.386P 
include \tc\g\include\g_def.asm   ; 描述符结构、常量、宏定义,清单见程序1-1 
include \tc\g\include\cos_def.asm ; 描述符结构、常量、宏定义,清单见程序1-1 
include \tc\g\include\tos_seg.asm ; 定义TOS堆栈段TOS_STACKSEG与TOS任务状态段TOS_TSSSEG 
                                  ; 清单见程序1-2 
include \tc\g\include\ps_seg.asm  ;  
TOS_CODESEG SEGMENT PARA USE16    ; TOS操作系统的代码段 
            ASSUME CS:TOS_CODESEG,DS:DATA,SS:TOS_STACKSEG 
TOS_BEGIN:    
            COS_INIT    ; TOS任务初始处理,在包含\tc\g\include\g_def.asm文件中 
            ;***********move to 2M  
            CALL SEGS_MOV_2M ;all tos_segs(6 segs) --->2M idt_m 
            CALL PGT_INIT 
            COS_PAGE_INIT   ;in cos_def 
            ;*********** HAVE ENTERED PAGE_MODE 
 
            CALL DISP_COS_HEAD   ;IN gfat_p.ASM 
            ; setup cursor 
            MOV BH,0 
            MOV DX,0000H 
            MOV AH,2 
            INT 80H 
 
TOS_BEGIN_CMD: 
            ;; begin command line mode 
            ;;;;;;            display "C:\>" 
            ; 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 AX,V_TOS_DATA_SEL  
            MOV DS,AX 
            MOV DX,OFFSET COS_FLAG 
            CALL STRDISP           ;display "C:\>" 
 
            ;;;;;;;;;;;;;;;;set "C:\" as current directory 
            CALL FILE_INIT 
            MOV AX,V_TOS_DATA_SEL  
            MOV DS,AX 
            CMP AL,1     ;AL=1 is not FAT16 
            JE  PAGE_END 
 
            ;input str    --->G_WORK (  ASCIIZ_STRING) 
            MOV AX,V_TOS_DATA_SEL   
            MOV DS,AX 
            MOV DX,OFFSET G_WORK 
            MOV AL,255     ;MAX COUNT 
            MOV AH,0AH     ;=DOS 21H0AH 
            INT 21H                ;input string in current position 
            CALL DO_CMD 
            CMP AL,0       ;=0 OK&NEXT =1 EXIT =2 ERROR  
            JE  TOS_BEGIN_CMD 
            CMP AL,1 
            JE  PAGE_END 
 
            ;=2 ERROR  display command error 
            ; 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 
            ; display ASCIIZ string 
            MOV AX,V_TOS_DATA_SEL  
            MOV DS,AX 
            MOV DX,OFFSET CMD_ERROR 
            CALL STRDISP 
            JE  PAGE_END 
 
TOS_BEGIN_CMD_R: 
 
            ;;;;;;;;;;;;;;;;;;;;;;;; copy g_work-->str 
            ;MOV AX,V_TOS_DATA_SEL  ;INPUT STRING IN CURRENT POSITION 
            ;MOV DS,AX 
            ;MOV DX,OFFSET STR1 
            ;PUSH DX 
            ;PUSH DS 
            ;MOV BX,OFFSET G_WORK 
            ;INC BX 
            ;INC BX                ;from 3 copy 
            ;PUSH BX 
            ;PUSH DS 
            ;DEC BX 
            ;MOV AL,DS:[BX] 
            ;INC AL 
            ;MOV AH,0 
            ;PUSH AX 
            ;CALL STRNCPY           ;G_WORK--->STR1 
 
            ;strcpy    ASCIIZ str1-->str2 
            ;MOV AX,V_TOS_DATA_SEL   
            ;MOV DS,AX 
            ;MOV DX,OFFSET STR2 
            ;PUSH DX 
            ;PUSH DS 
            ;MOV DX,OFFSET STR1 
            ;PUSH DX 
            ;PUSH DS 
            ;CALL STRCPY 
             
;; 
            ;MOV AX,V_TOS_DATA_SEL  ;display g_work 
            ;MOV DS,AX 
            ;MOV DX,OFFSET G_WORK 
            ;INC DX 
            ;INC DX 
            ;MOV AH,09H     ;=DOS 21H09H 
            ;INT 21H 
 
            ;MOV AX,G_VRAM_SEL 
            ;MOV ES,AX 
            ;MOV AL,41H  ;"A" 
            ;MOV AH,41H 
            ;MOV ES:500,AX 
 
COMEBACK_TO_TOS:             ; 21h---4ch return 
            JMP PAGE_END 
ERR_EXEFIL: 
            MOV AH,9 
            MOV CX,1100H  
            MOV DX,OFFSET ERR_EXEFILE 
            INT 21H     
PAGE_END:   ;*********************     should have  next 3 lines    
            DB 0EAH 
            DW OFFSET TURN_TO_REAL_MODE 
            DW TOS_CODE_SEL 
TURN_TO_REAL_MODE: 
            MOV EAX,CR0 ;  ;关闭分页模式 
            AND EAX,7FFFFFFFH 
            MOV CR0,EAX 
            JMP SHORT FROM_PAGE 
FROM_PAGE: 
            CALL TURN_TO_REAL      ;返回实模式,在\tc\g\include\tos_used.asm;中 
            include \tc\g\include\COS_USED.ASM ; 
            include \tc\g\include\V86_USED.ASM ; 
            include \tc\g\include\GFAT16_P.ASM ; 
sched       proc far                           ;not used 
            ret 
sched       endp 
make_exe    proc far                           ;not used 
            ret 
make_exe    endp 
fork        proc far                           ;not used 
            ret 
fork        endp 
TOS_CODELEN = $ 
TOS_CODESEG ENDS 
            include \tc\g\include\COS_GDT.ASM ; 
            include \tc\g\include\COS_DATA.ASM ; 
            include \tc\g\include\COS_IDT.ASM ; 
            include \tc\g\include\v86_seg.asm 
;*************************************************next DOS 
CODE        SEGMENT PARA USE16 ;PUBLIC 'CODE'  ;实模式代码段 
 
            ASSUME CS:CODE,DS:DATA,SS:STACK 
MAIN        PROC FAR 
START:       
            REAL_PAGE_INIT  ;in cos_def.asm  
            CALL V86_IDT_INIT  ;in V86_REAL.ASM 
            ;在\tc\g\include\g_def.asm中,见程序1-1 
TURN_TO_PROTECT_MODE: 
            CALL GDT_INIT       ;初始化GDT表,在\tc\g\include\g_real.asm中,见程序1-2 
 
            MOV AX,V86LDTSEG 
            CALL USER_Px_LDT_INIT ;in px_ldt.asm 
 
            cli 
            TURN_TO_PROTECT_PAGE   
            ;*****进入TOS任务,在\TC\G\INCLUDE\G_DEF.ASM中,见程序1-1 
REAL_MODE:   
            TO_DOS      ;回到DOS 在\TC\G\INCLUDE\G_DEF.ASM中,见程序1-1 
MAIN        ENDP 
            include \tc\g\include\g_real.asm 
            include \tc\g\include\V86_REAL.ASM      ;见程序1-1 
            include \tc\g\include\a20.asm      ;见程序1-1 
            include \tc\g\include\PX_LDT.ASM      ;见程序1-1 
tsrline     label byte 
CODE        ENDS 
            include \tc\g\include\DOS_DATA.ASM    
END START