;PS: File Save with UFT-8========================================================== ; FCDOS - Free Chinese DOS ; fcquit.asm (卸载驻留模块) ;-------------------------------------------------------------------------------- ; 原始信息: ; 原始代码发布于: ; https://www.cn-dos.net/forum/viewthread.php?tid=24334&fpage=1 ; 作者: ; Macadd ; 中国DOS联盟论坛 https://www.cn-dos.net/forum/viewpro.php?uid=58572 ; ; https://sourceforge.net/projects/fcdos/ ; 作者: ; fc_lijian ; ; 原始版本:v1.1.0 ; 许可证: ; https://www.cn-dos.net/forum/post.php?action=reply&fid=17&tid=24334&repquote=154336 ; Macadd:都是汇编写的COM文件,文件不大,在DOS下用DEBUG看就可以了。 2006-11-27 09:37 ;-------------------------------------------------------------------------------- ; 版本:重构版 v1.0 ; 版权所有 (c) fc_lijian@users.sourceforge.net ; 重构版本 (c) 2026 Tarime Argus ; ; 本文件是FCDOS项目的汇编源码重构版。 ; 原始只有二进制COM文件,现通过反汇编恢复为可维护的汇编代码。 ; 本项目基于开源原则发布,具体许可证遵循原始项目。 ; ; 功能:退出FCDOS中文平台,清除驻留状态。 ; 使用:fcquit.com ; ; 修改历史: ; 2026-01-08 Tarime Argus 初始版本 ; 2026-02-05 Tarime Argus Ver. 1.0 ;================================================================================ ;FCQUIT.COM renew by Tarime Argus 2026-02-05 Ver. 1.0 ;Compile with JWasm v2.20 ;COMMAND: jwasmd -bin -Fo FCQUIT.COM fcquit.asm .286 .model tiny DOSint_PrintString MACRO printString MOV DX, offset printString call dosint2109h ENDM DOSint_PrintString .code org 100h start: MOV AX,CS ;初始化数据段 MOV DS,AX ;检查中断向量非空 Check_INT80h: MOV AX,3580h ;检查80h中断 INT 21h MOV AX,ES ;检查中断向量是否为空 AND AX,BX JZ Error_KNL_Not_Found ;向量空则进入错误处理 ;-------- MOV AX,8000h INT 80h ;检查80h中断是否为FCD CMP AL,80h JZ Release_FCD_KNL Error_KNL_Not_Found: INC byte ptr cs:[error_count] ;错误计数+1 DOSint_PrintString msgerr_KNL_not_found JMP Check_INT81h NOP ;此处不加NOP指令不影响程序执行 Release_FCD_KNL: MOV AX,8001h INT 80h MOV AH,49h INT 21h PUSH DS ;暂存DS LDS DX,CS:[origin_80h_vector] ;加载原INT80h向量到DS:DX MOV AX,2580h ;设定中断向量 INT 21h POP DS ;恢复DS DOSint_PrintString msg_FCD_KNL_Released ;检查中断向量非空 Check_INT81h: MOV AX,3581h INT 21h MOV AX,ES AND AX,BX JZ Error_RD_Not_Found ;-------- MOV AX,8100h INT 81h ;检查81h中断是否为FCD CMP AL,81h JZ Release_FCD_RD Error_RD_Not_Found: INC byte ptr cs:[error_count] ;错误计数+1 DOSint_PrintString msgerr_RD_not_found JMP Check_Error_Count_and_Exit NOP ;此处不加NOP指令不影响程序执行 Release_FCD_RD: MOV AX,8102h INT 81h MOV AH,49h INT 21h PUSH DS LDS DX,CS:[origin_81h_vector] MOV AX,2581h INT 21h POP DS DOSint_PrintString msg_FCD_RD_Released JMP Check_Error_Count_and_Exit NOP ;此处不加NOP指令不影响程序执行 ;========================================= dosint2109h PROC MOV AH, 09h ;调用DOS中断09h输出字符串 INT 21h RET dosint2109h ENDP ;========================================= Check_Error_Count_and_Exit: CMP byte ptr cs:[error_count],00h ;检查错误计数是否为零 JNZ PrintFCDInfo ;不为零时跳过已经退出消息 DOSint_PrintString msg_FCD_exited PrintFCDInfo: DOSint_PrintString byte ptr msg_FCD_info MOV AX,4C00h ;退出程序 INT 21h msg_FCD_info db 0dh, 0ah,"The FreeCDOS Project ", 0dh,0ah, '$' msg_FCD_exited db 0dh,0ah,"The FreeCDOS system has exited successful!", '$' msg_FCD_KNL_Released db 0dh,0ah,"[FCKNL.COM] has realeased!", '$' msg_FCD_RD_Released db 0dh,0ah,"[FCRD.COM] has realeased!", '$' msgerr_KNL_not_found db 0dh,0ah,"[FCKNL.COM] not found!", '$' msgerr_RD_not_found db 0dh,0ah,"[FCRD.COM] not found!", '$' origin_80h_vector dd 00000000h ;CS:[0265h] origin_81h_vector dd 00000000h ;CS:[0269h] error_count db 00h ;CS:[026Dh] end start