  ;第一部分
  ;功能：⑴修改1c号中断向量
  ;      ⑵新的1c中断服务程序将当前时间存入coms中
  ;第二部分
  ;功能：⑴取上次关机时、分、秒；
  ;      ⑵取本次开机日期、时间；
  ;      ⑶存入 c:\timercd.sys 。
  ;日期：1990.07.22,93.11.24
COSEG    SEGMENT
         ORG 100H      ; .COM 格式
         ASSUME CS:COSEG,DS:COSEG
START:   JMP START1
OFFSET1C DW 0000H      ;放原1C中断入口偏移量
SEG1C    DW 0000H      ;放原1C中断入口段地址

LIR      PROC FAR      ;新的1c中断服务程序
         PUSH AX       ;保护现场
         PUSH BX
         PUSH CX
         PUSH DX
         PUSH SI
         PUSH DI
         PUSH DS
         PUSH ES
         PUSHF
         CALL DWORD PTR CS:OFFSET1C ;调原来 1C 中断
         CLI     ;禁止中断
         MOV AH,02H
         INT 1AH ;读当前实时钟(CH时CL分DH秒,BCD码)
         PUSH DX     ;保存DH值
         MOV DX,70H  ;COMS索引寄存器地址
         MOV AL,01H
         OUT DX,AL   ;选择秒报时寄存器
         INC DX
         POP AX
         XCHG AH,AL  ;当前秒=>AL
         OUT DX,AL   ;存入秒报时寄存器
         MOV DX,70H
         MOV AL,03H
         OUT DX,AL   ;选择分报时寄存器
         INC DX
         MOV AL,CL   ;分
         OUT DX,AL   ;存入分报时寄存器
         MOV DX,70H
         MOV AL,05H
         OUT DX,AL   ;选择时报时寄存器
         INC DX
         MOV AL,CH   ;时
         OUT DX,AL   ;存入时报时寄存器
         STI         ;开中断
         POP ES      ;恢复现场
         POP DS
         POP DI
         POP SI
         POP DX
         POP CX
         POP BX
         POP AX
         IRET
LIR      ENDP

FILENAME DB "C:\TIMERCD.SYS",00H  ;文件名   
BEGINTM  DB 14 DUP(0)         ;本次开机日期、时间
ENDTM    DB 6 DUP(0),0DH,0AH  ;上次关机时间

STOH     PROC NEAR
         MOV AX,CS
         MOV DS,AX
         MOV ES,AX            ;使ds=es=cs
         MOV BX,OFFSET ENDTM  ;关机时间缓冲区
         MOV DX,70H
         MOV AL,05
         OUT DX,AL       ;选择时报时寄存器
         INC DX
         IN AL,DX        ;取关机时
         CALL BCDTOASC   ;bcd码转换为ascii码
         MOV [BX+0],DH
         MOV [BX+1],DL
         MOV DX,70H
         MOV AL,03
         OUT DX,AL       ;选择分报时寄存器
         INC DX
         IN AL,DX        ;取关机分
         CALL BCDTOASC   ;bcd码转换为ascii码
         MOV [BX+2],DH
         MOV [BX+3],DL
         MOV DX,70H
         MOV AL,01
         OUT DX,AL       ;选择秒报时寄存器
         INC DX
         IN AL,DX        ;取关机秒
         CALL BCDTOASC   ;bcd码转换为ascii码
         MOV [BX+4],DH
         MOV [BX+5],DL
         MOV BX,OFFSET BEGINTM ;开机日期时间缓冲区
         MOV AH,4
         INT 1AH         ;取当前日期
         PUSH DX
         MOV AL,CH       ;世纪
         CALL BCDTOASC
         MOV [BX+0],DH
         MOV [BX+1],DL
         MOV AL,CL       ;年
         CALL BCDTOASC
         MOV [BX+2],DH
         MOV [BX+3],DL
         POP DX
         MOV AL,DH       ;月
         PUSH DX
         CALL BCDTOASC
         MOV [BX+4],DH
         MOV [BX+5],DL
         POP DX
         MOV AL,DL       ;日
         CALL BCDTOASC
         MOV [BX+6],DH
         MOV [BX+7],DL
         MOV AH,02
         INT 1AH         ;读当前实时钟
         PUSH DX
         MOV AL,CH       ;时
         CALL BCDTOASC
         MOV [BX+8],DH
         MOV [BX+9],DL
         MOV AL,CL       ;分
         CALL BCDTOASC
         MOV [BX+10],DH
         MOV [BX+11],DL
         POP DX
         MOV AL,DH       ;秒
         CALL BCDTOASC
         MOV [BX+12],DH
         MOV [BX+13],DL
         MOV AH,3DH
         MOV AL,1
         LEA DX,FILENAME
         INT 21H         ;打开文件，写
         MOV BX,AX       ;存文件标记
         MOV CX,0
         MOV DX,0
         MOV AL,2
         MOV AH,42H
         INT 21H         ;指针移到文件尾
         MOV AH,40H
         MOV CX,8
         LEA DX,ENDTM
         INT 21H         ;上次关机时间存入文件
         MOV CX,14
         MOV AH,40H
         LEA DX,BEGINTM
         INT 21H         ;本次开机日期、时间存入文件
         MOV AH,3EH
         INT 21H         ;关闭文件
         RET
STOH     ENDP

;bcd码转换为ascii码子程序
;调用参数：AL(两位bcd码)
;返回参数：DH(高位),DL(低位)
BCDTOASC PROC NEAR    
         PUSH CX
         MOV CL,AL
         AND AL,0FH
         OR AL,30H
         MOV DL,AL  ;低位
         MOV AL,CL
         MOV CL,04H
         SHR AL,CL
         OR AL,30H
         MOV DH,AL  ;高位
         POP CX
         RET
BCDTOASC ENDP

START1:  CALL STOH
         MOV AX,0000H  ;指定段地址
         MOV DS,AX 
         CLI           ;关中断
         MOV AX,WORD PTR DS:[0070H]          
         MOV WORD PTR CS:OFFSET1C,AX ;(1CH*4=70H)  
         MOV AX,WORD PTR DS:[0072H]  ;原IC中断段地址转移
         MOV WORD PTR CS:SEG1C,AX
         MOV WORD PTR DS:[0070H],OFFSET LIR  
         MOV WORD PTR DS:[0072H],CS          
         STI                         ;开中断
         LEA DX,FILENAME             ;自由空间首址
         INT 27H                     ;驻留内存 
COSEG    ENDS
         END START

