源程序:
; CLOCK program ; by LuoYunBin Apr,1993 DISPLAY_COLOR EQU 0EH ;init color CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 0C0H CLOCK DB 0 MINU DB 0 SECOND DB 0 BEEP_TIME DB 0 LAST_SEC DB 0 OFF1C DW ? SEG1C DW ? DISPLAY_DATA DB 0,0,':',0,0,':',0,0 ORG 100H START: JMP INSTALL INT1C: PUSHF PUSH ES PUSH DS PUSH AX PUSH CS POP DS XOR AX,AX MOV ES,AX MOV AL,ES:[0449H] ;get display mode MOV WORD PTR V_BUFFER-2,0B800H MOV BYTE PTR CLOCK_PLACE-2,72*2 CMP AL,3 ;the clock may display JBE TEXT_COLOR ;at mode 0,1,2,3,7 CMP AL,7 JZ TEXT_MON MOV WORD PTR V_BUFFER-2,ES JMP SHORT CALU TEXT_COLOR: CMP AL,1 JA CALU MOV BYTE PTR CLOCK_PLACE-2,32*2 JMP SHORT CALU TEXT_MON: MOV WORD PTR V_BUFFER-2,0B000H CALU: PUSH BX PUSH CX PUSH DX PUSH DI PUSH SI MOV CX,ES:[046EH] ;get clock timers MOV DX,ES:[046CH] MOV AX,CX ;counter=cx:dx MOV BX,DX SHL DX,1 RCL CX,1 SHL DX,1 RCL CX,1 ADD DX,BX ADC AX,CX XCHG DX,AX ;dx:ax=cx:dx*5 MOV CX,0E90BH DIV CX ;divide by E90B*E90B MOV BX,AX XOR AX,AX DIV CX MOV DX,BX MOV CX,00C8H DIV CX CMP DL,100 JB CLOCK_0 SUB DL,100 CLOCK_0: CMC RCL AX,1 MOV DL,0 RCL DX,1 MOV CL,60 DIV CX MOV SECOND,DL DIV CL MOV MINU,AH MOV CLOCK,AL CODE1: JMP SHORT CODE2 ;when speaker on here is NOP DEC BEEP_TIME ;dec alarm time JZ TURN_SP_OFF CMP LAST_SEC,1 ;every 10 min's beep JZ DAT0 CMP LAST_SEC,59 ;59 min 59 sec's beep JNZ DAT1 MOV CL,6 MOV CH,3 MOV BX,800H JMP SHORT DAT2 DAT0: MOV CL,3 MOV CH,2 MOV BX,200H DAT2: MOV AL,BEEP_TIME XOR AH,AH DIV CL CMP AH,CH JZ SHORT SPEAK_ON1 OR AH,AH ;after 1 count off JZ DAT1 IN AL,61H AND AL,0FCH OUT 61H,AL DAT1: JMP SHORT DISP_CLOCK TURN_SP_OFF: IN AL,61H AND AL,0FCH OUT 61H,AL ;turn off the speaker MOV WORD PTR CODE1,-1 ;move code1 (jmp code2) CODE2: MOV AL,AH ;al is minute MOV AH,DL ;ah is second OR AH,AH JZ IS_SEC0 CMP AH,1 JZ IS_SEC1 CMP AL,59 ;59 min JNZ DISP_CLOCK CMP AH,59 JNZ DISP_CLOCK MOV BEEP_TIME,15 MOV BX,800H JMP SHORT SPEAK_ON IS_SEC1: MOV LAST_SEC,0FFH JMP SHORT DISP_CLOCK IS_SEC0: OR AL,AL JZ IS_MIN0 MOV CL,10 ;if is every 10 min DIV CL OR AH,AH JNZ DISP_CLOCK MOV CL,3 MUL CL DEC AL MOV BEEP_TIME,AL INC AH MOV BX,200H JMP SHORT SPEAK_ON IS_MIN0: MOV BEEP_TIME,18 MOV BX,400H SPEAK_ON: CMP LAST_SEC,AH ;then not oprate MOV LAST_SEC,AH JZ DISP_CLOCK SPEAK_ON1: MOV AL,0B6H OUT 43H,AL MOV AX,BX OUT 42H,AL MOV AL,AH OUT 42H,AL IN AL,61H ;turn on the speaker OR AL,3 OUT 61H,AL MOV WORD PTR CODE1,9090H ;move code1 (NOP) DISP_CLOCK: MOV AL,CLOCK MOV SI,OFFSET DISPLAY_DATA PUSH SI CALL HEX_TO_ASC ;turn HEX to ASC II code MOV AL,MINU CALL HEX_TO_ASC MOV AL,SECOND CALL HEX_TO_ASC POP SI CMP BYTE PTR [SI],'0' JNZ MOV_DATA MOV BYTE PTR [SI],' ' MOV_DATA: MOV AX,0B800H ;buffer segment V_BUFFER: OR AX,AX JZ I1CQUIT MOV ES,AX MOV DI,72*2 CLOCK_PLACE: MOV CX,8 CLD MOV AH,DISPLAY_COLOR ;the color is yellow CODE3: JMP SHORT IS_VGA MOV DX,3DAH M_LOOP: IN AL,DX TEST AL,8 JNZ N3 TEST AL,1 JNZ M_LOOP N2: IN AL,DX TEST AL,1 JZ N2 N3: LODSB STOSW LOOP M_LOOP JMP SHORT I1CQUIT IS_VGA: LODSB STOSW LOOP IS_VGA I1CQUIT: POP SI POP DI POP DX POP CX POP BX POP AX POP DS POP ES POPF IRET HEX_TO_ASC PROC NEAR CBW MOV CL,10 DIV CL ADD AX,'00' MOV DS:[SI],AX ADD SI,3 RET HEX_TO_ASC ENDP ; new int 9 keyboard program ; Ctrl-Alt-U to unload ; C to change clock color ; B to change clock background color INT9: PUSHF PUSH AX PUSH DS XOR AX,AX MOV DS,AX MOV AL,DS:[0417H] AND AL,0CH CMP AL,0CH JZ CTRL_ALT_DOWN ;if Ctrl-Alt press down TO_OLD9: POP DS POP AX POPF DB 0EAH OFF9 DW ? SEG9 DW ? CTRL_ALT_DOWN: IN AL,60H CMP AL,80H ;if release key JAE TO_OLD9 CMP AL,24 ;o key JZ RIGHT_KEY CMP AL,46 ;c key JZ RIGHT_KEY CMP AL,22 ;u key JZ RIGHT_KEY CMP AL,48 ;b key JNZ TO_OLD9 RIGHT_KEY: PUSH AX IN AL,61H MOV AH,AL OR AL,80H OUT 61H,AL XCHG AH,AL OUT 61H,AL ;answer the keyboard POP AX CMP AL,22 ;u key JZ UN_LOAD PUSH CS POP DS CMP AL,24 ;o key JZ KEY_O CMP AL,46 ;c key JZ KEY_C MOV AL,BYTE PTR CODE3-1 ;is "b" key:change back color MOV AH,AL AND AL,0F0H ADD AL,10H CMP AL,80H JNZ BC_1 XOR AL,AL BC_1: AND AH,0FH OR AL,AH JMP SHORT CHG_COLOR KEY_C: MOV AL,BYTE PTR CODE3-1 MOV AH,AL AND AL,0FH INC AL CMP AL,10H JNZ FC_1 XOR AL,AL FC_1: AND AH,0F0H OR AL,AH CHG_COLOR: MOV BYTE PTR CODE3-1,AL JMP SHORT KEY_IRET UN_LOAD: PUSH ES LES AX,DWORD PTR CS:OFF9 MOV DS:[0024H],AX MOV DS:[0026H],ES LES AX,DWORD PTR CS:OFF1C MOV DS:[0070H],AX MOV DS:[0072H],ES PUSH CS POP AX DEC AX MOV DS,AX MOV WORD PTR DS:[0001],0 POP ES JMP SHORT KEY_IRET KEY_O: CMP BYTE PTR INT1C,9CH ;code of PUSHF JZ TURN_OFF MOV BYTE PTR INT1C,9CH JMP SHORT KEY_IRET TURN_OFF: MOV BYTE PTR INT1C,0CFH ;code of IRET KEY_IRET: MOV AL,20H OUT 20H,AL ;send EOI command POP DS POP AX POPF IRET INSTALL: MOV BYTE PTR DISPLAY_DATA+2,':' MOV BYTE PTR DISPLAY_DATA+5,':' MOV AX,WORD PTR CODE1 MOV WORD PTR CODE2-2,AX MOV SI,81H MOV BP,OFFSET INT9 ;bp is str point CLD RE_LOAD: LODSB CMP AL,' ' JZ RE_LOAD CMP AL,0DH JZ COM_LINE_END CMP AL,'?' JZ HELP OR AL,20H CMP AL,'u' JZ NO_KEY_INT CMP AL,'h' JNZ RE_LOAD HELP: MOV DX,OFFSET D_HELP MOV AH,9 INT 21H INT 20H COM_LINE_END: CLC JMP SHORT HAVE_KEY_INT NO_KEY_INT: STC HAVE_KEY_INT: PUSHF MOV AX,351CH INT 21H MOV OFF1C,BX MOV SEG1C,ES CMP BX,OFFSET INT1C JNZ NOT_LOADED MOV DX,OFFSET D_HAS MOV AH,9 INT 21H JMP QUIT NOT_LOADED: POPF JC SKIP_KEY MOV AX,3509H INT 21H MOV OFF9,BX MOV SEG9,ES MOV DX,OFFSET INT9 MOV AX,2509H INT 21H ;set keyboard intrupter vector MOV BP,OFFSET INSTALL SKIP_KEY: MOV AX,251CH MOV DX,OFFSET INT1C INT 21H ;set clock interupter vector MOV AH,0FH ;if is MDA,color=09 INT 10H CMP AL,07H JNZ IS_COLOR MOV BYTE PTR DS:CODE3-1,09H IS_COLOR: MOV AH,1BH ;if is VGA,then not test snow XOR BX,BX PUSH CS POP ES MOV DI,OFFSET BUFFER INT 10H CMP AL,1BH JZ VGA_CARD MOV WORD PTR DS:CODE3,9090H VGA_CARD: MOV BX,BP ADD BX,000FH SHR BX,1 SHR BX,1 SHR BX,1 SHR BX,1 MOV AH,4AH INT 21H PUSH CS POP AX DEC AX MOV DS,AX MOV WORD PTR DS:[0001H],0008H QUIT: INT 20H D_HELP DB '<<< CLOCK >>> Version 1.4',0DH,0AH DB '(c)1995 By Luo Yun Bin of HuangYan post office.',0DH,0AH DB 'phone:0576-4114689',0DH,0AH DB 'BP: 0576-126 call 117654',0DH,0AH DB 'Usage:',0DH,0AH DB 9,'Ctrl-Alt-U: unload from memory.',0DH,0AH DB 9,'Ctrl-Alt-C: change color.',0DH,0AH DB 9,'Ctrl-Alt-B: change backgroud color.',0DH,0AH DB 9,'Ctrl-Alt-O: turn on/off.',0DH,0AH DB '$' D_HAS DB 'CLOCK has been installed!',0DH,0AH,'$' BUFFER EQU THIS BYTE CODE ENDS END START