庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>程序设计>汇编语言>相关源码>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

汇编的的各类源码--CLOCK

 作者:本站收集   日期:2005-8-1 15:39:21
字号选择〖 〗/ 双击滚屏 单击停止   
CGROUP	 GROUP VECTOR,CODESEG
VECTOR	 SEGMENT AT 0H
	 DB    6CH DUP(?)	    ;FILLER
TIME_LO  DW    ?		    ;DOS TIME
TIME_HI  DW    ?		    ;DOS TIME
VEC_IP	 DW			    ;CLOCK UPDATE VECTOR IP
VEC_CS	 DW			    ;CLOCK UPDATE VECTOR CS
VECTOR	 ENDS

CODESEG  SEGMENT PARA
	 ASSUME CS:CODESEG,DS:CGROUP
	 ORG   100H
CLK	 PROC  FAR
	 JMP   SETUP		    ;ATTACH TO DOS
INTRPT	 LABEL DWORD
INT_IP	 DW    0		    ;OLD UPDATE VECTOR IP
INT_CS	 DW    0		    ;OLD UPDATE VECROR CS
TICKS	 DW    0		    ;TICK COUNTER
SCR_OFF  DB    0,0		    ;SCREEN OFFSET IN BUFFER
CRT_PORT DW    0		    ;SCREEN STATUS PORT
flag	 db    0
TIME	 DB    8 DUP(':',0BH)       ;TIME SAVE AREA
CLK_INT  LABEL NEAR
	 PUSH  AX		    ;SAVE REGISTERS
	 PUSH  CX
	 PUSH  DI
	 PUSH  SI
	 PUSH  DS
	 PUSH  ES
	 PUSHF			    ; AND FLAGS
	 CALL  CS:[INTRPT]	    ;DO OLD UPDATE INTERRUPT
	 MOV   CX,0040H 	    ;GET SEGMENT OF DOS TABLE
	 MOV   DS,CX		    ;PUT IN DS
	 MOV   CX,CS:TICKS	    ;GET TICK COUNT
	 INC   CX		    ;INCREMENT IT
	 CMP   CX,20	    ;01F4H	       ;HAS A MINUTE GONE BY?
	 JB    NO_MINUTE	    ;NO, MOVE ON
	 CALL  UPDATE		    ;YES, UPDATE CLOCK AND
	 MOV   CX,0		    ; RESET TICK COUNTER
NO_MINUTE:
	 MOV   CS:TICKS,CX	    ;SAVE UPDATED TICK COUNT
	 MOV   CX,0B000H	    ;GET VIDEO SEGMENT
	 MOV   ES,CX		    ;PUT IN ES
	 MOV   DX,CS:CRT_PORT	    ;GET CRT STATUS PORT ADDR
	 MOV   DI,WORD PTR CS:SCR_OFF  ;GET SCREEN BUFFER OFFSET
	 LEA   SI,CS:TIME	    ;GET DOS TIME
	 MOV   CX,16		    ;SET UP TO MOVE 10 BYTES
	 CLI			    ;DISABLE OTHER INTERRUPTS
WAIT1:	 IN    AL,DX		    ;READ CRT STATUS
	 TEST  AL,1		    ;CHECK FOR VERTICAL RETRACE
	 JNZ   WAIT1		    ;WAIT FOR RETRACE LOW
	 MOV   AH,CS:[SI]	    ;GET FIRST BYTE TO MOVE
WAIT2:	 IN    AL,DX		    ;GET CRT STATUS
	 TEST  AL,1		    ;CHECK FOR VERTICAL RETRACE
	 JZ    WAIT2		    ;WAIT FOR RETRACE HIGH
	 MOV   ES:[DI],AH	    ;MOVE BYTE TO SCREEN
	 INC   DI		    ;INCREMENT INDEX
	 INC   SI
	 LOOP  WAIT1		    ;MOVE NEXT BYTE
	 STI			    ;ENABLE INTERRUPTS
	 POP   ES		    ;RESTORE REGISTERS
	 POP   DS
	 POP   SI
	 POP   DI
	 POP   CX
	 POP   AX
	 IRET			    ;RETURN FROM INTERRUPT
CLK	 ENDP
UPDATE	 PROC  NEAR
	 PUSH  AX		    ;SAVE REGISTERS
	 PUSH  BX
	 PUSH  CX
	 PUSH  DX
	 PUSH  DS
	 MOV   AX,0040H 	    ;GET ADDRESS OF DOS TABLE
	 MOV   DS,AX		    ;PUT IN DS
	 MOV   AX,TIME_HI	    ;GET HIGH BYTE OF DOS TIME
	 mov   flag,0		    ;am flag
HOUR:	 CMP   AX,0CH		    ;CONVERT TO HOURS
	 JLE   H1
	 mov   flag,1		    ;set to pm
	 SUB   AX,0CH
	 JMP   HOUR
H1:	 AAM			    ;CONVERT TO ASCII
	 ADD   AX,3030H
	 LEA   BX,CS:TIME	    ;GET ADDRESS OF TIME AREA
	 MOV   CS:[BX],AH	    ;SAVE HOURS FIRST DIGIT
	 MOV   CS:[BX+2],AL	    ;SAVE HOURS SECOND DIGIT
	 MOV   AX,TIME_LO	    ;GET DOS TIME LOW BYTE
	 MOV   CX,8H		    ;CONVERT TO MINUTES
	 SHR   AX,CL
	 MOV   DX,3CH
	 MUL   DL
	 SHR   AX,CL
	 AAM			    ;CONVERT TO ASCII
	 ADD   AX,3030H
	 MOV   CS:[BX+6],AH	    ;SAVE MINUTES FIRST DIGIT
	 MOV   CS:[BX+8],AL	    ;SAVE MINUTES SECOND DIGIT
	 mov   byte ptr cs:[bx+12],'a'
	 cmp   flag,0		    ;is it am?
	 jz    goahead
	 mov   byte ptr cs:[bx+12],'p'
goahead:
	 mov   byte ptr cs:[bx+14],'m'
	 POP   DS		    ;RESTORE REGISTERS
	 POP   DX
	 POP   CX
	 POP   BX
	 POP   AX
	 RET
UPDATE	 ENDP
SETUP:	 MOV   AX,0		    ;GET ADDRESS OF VECTOR TABLE
	 MOV   DS,AX		    ;PUT IN DS
	 CLI			    ;DISABLE FURTHER INTERRUPTS
	 MOV   AX,[VEC_IP]	    ;GET ADDRESS OF OLD UPDATE IP
	 MOV   CS:[INT_IP],AX	    ;SAVE IT
	 MOV   AX,[VEC_CS]	    ;GET ADDRESS OF OLD UPDATE CS
	 MOV   CS:[INT_CS],AX	    ;SAVE IT
	 MOV   VEC_IP,OFFSET CLK_INT ;PUT ADDRESS OF CLK IN VECTOR IP
	 MOV   VEC_CS,CS	    ;PUT CS OF CLK IN VECTOR CS
	 STI			    ;ENABLE INTERRUPTS
	 MOV   AH,0FH		    ;READ VIDEO STATUS
	 INT   10H
	 SUB   AH,8		    ;SUBTRACT 8 CHAR TIME FROM NCOLS
	 SHL   AH,1		    ;MULTIPLY BY 2 FOR ATTRIBUTE
	 MOV   CS:SCR_OFF,AH	    ;SAVE SCREEN TIME LOCATION
	 MOV   WORD PTR CS:CRT_PORT,03BAH  ;SAVE MONO STATUS PORT ADDR
	 TEST  AL,4		    ;CHECK FOR COLOR MONITOR
	 JNZ   MONO		    ;IF MONO, MOVE ON
	 ADD   WORD PTR CS:SCR_OFF,8000H   ;ADD COLOR OFFSET TO TIME OFFSET
	 MOV   WORD PTR CS:CRT_PORT,03DAH  ;SAVE COLOR STATUS PORT ADDR
MONO:	 CALL  UPDATE		    ;DO FIRST UPDATE & PRINT TIME
	 MOV   DX,OFFSET SETUP	    ;GET END ADDRESS OF NEW INTERRUPT
	 INT   27H		    ;TERMINATE AND REMAIN RESIDENT
	 DB    117 DUP(0)	    ;FILLER
CODESEG  ENDS
	 END   CLK

上一篇:汇编的的各类源码--CLR    下一篇:汇编的的各类源码--CLEAR  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-8-1 15:39:21
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿