رتبه موضوع:
  • 25 رای - 2.44 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
سورس کد ساعت (اسمبلی)
#1
کد:
ClockCGROUP  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  ENDSCODESEG  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
در صورتی که سوال دارید و سوالتون مختصر هست با شماره 09120642214 میتونید تماس بگیرید.
کسانی که دوست دارن در کانال فروشگاه ما و یا کانال انجمن عضو بشن یک پیامک در تلگرام برای من بفرستید که عضوشون میکنم.

ادرس فروشگاه :

http://www.amshop.ir



ای ام شاپ را در اینستگرام دنبال کنید

ای ام شاپ رو در کانال تلگرام دنبال کنید



This forum uses Lukasz Tkacz MyBB addons.
پاسخ


موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  سورس کد پرینت اعداد و حروف به صورت وارونه (اسمبلی ۸۰۸۶) Amin_Mansouri 0 3,152 06-09-2014، 01:15 PM
آخرین ارسال: Amin_Mansouri
  سورس کد فاکتوریل اسمبلی 8086 Amin_Mansouri 0 1,656 06-08-2014، 10:54 PM
آخرین ارسال: Amin_Mansouri
  سورس کد ماشین حساب (اسمبلی) Amin_Mansouri 0 2,653 09-04-2012، 11:48 PM
آخرین ارسال: Amin_Mansouri
  سور کد ماشین حساب (اسمبلی) Amin_Mansouri 0 2,112 05-11-2012، 05:27 PM
آخرین ارسال: Amin_Mansouri
  سورس کد نوشتن در بوت سکتور فلاپی (اسمبلی Amin_Mansouri 0 2,923 05-11-2012، 05:26 PM
آخرین ارسال: Amin_Mansouri
  ،سورس کد فرستادن ایمیل از طریق وینساک (اسمبلی) Amin_Mansouri 0 2,128 05-11-2012، 05:07 PM
آخرین ارسال: Amin_Mansouri
  منبع آموزشی اسمبلی son of wisdom 0 2,134 06-16-2011، 10:39 AM
آخرین ارسال: son of wisdom
  آموزش اسمبلی Amin_Mansouri 0 2,610 05-23-2011، 01:00 PM
آخرین ارسال: Amin_Mansouri

پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان
<------> <____> <<<<----------------->>>> <<<<--->>>>>
This forum uses Lukasz Tkacz MyBB addons.