TITLE GETDTTM
PAGE 60, 132
;   This
program retrieve the system date and time,
;   converts
it to ASCII, and displays it to the screen
;   Define
constants
;
CR      EQU
0DH ;define carriage return
LF      EQU
0AH ;define line feed
EOM     EQU
'$' ;define end of message marker
NULL    EQU
00H ;define NULL byte
;
;   Define
variables
;
JMP START
PROMPT 
DB  CR, LF, "The current time
is: ",EOM
PROMPT2 DB 
CR, LF, "The date is: ",EOM
TIME   
DB  "00:00:00", CR, LF,
EOM
DATE   
DB  "00/00/0000", CR,
LF, EOM
;
;   Program
code
;
START:  
CALL GET_TIME  
;call function to get system time
CALL GET_DATE  
;call function to get system date
LEA DX, PROMPT 
;print time prompt to screen
MOV AH, 09H
INT 21H
LEA DX, TIME   
;print time
MOV AH, 09H
INT 21H
LEA DX, PROMPT2 ;print date prompt to screen
MOV AH, 09H
INT 21H
LEA DX, DATE   
;print date
MOV AH, 09H
INT 21H
CVT_TIME:  
;converts the time to ASCII
CALL CVT_HR
CALL CVT_MIN
CALL CVT_SEC
RET
CVT_HR:
MOV BH, CH 
;copy contents of hours to BH
SHR CH,4   
;convert high char to low order bits
ADD CH, 30H ;add 30H to convert to ASCII
MOV [TIME], CH 
;save it
AND BH, 0FH ;isolate lower 4 bits
ADD BH, 30H ;convert to ASCII
MOV [TIME+1], BH   
;save it
RET
CVT_MIN:
MOV BH, CL 
;copy contents of minutes to BH
SHR CL, 4  
;convert high char to low order bits
ADD CL, 30H ;add 30H to convert to ASCII
MOV [TIME+3], CL   
;save it
AND BH, 0FH ;isolate lower 4 bits
ADD BH, 30H ; convert to ASCII
MOV[TIME+4], BH ;save it
CVT_SEC:
MOV BH, DH 
;copy contents of seconds to BH
SHR DH, 4  
;convert high char to low order bits
ADD DH, 30H ;add 30H to convert to ASCII
MOV [TIME+6], DH   
;save it
AND BH, 0FH ;isolate lower 4 bits
ADD BH, 30H ;convert to ASCII
MOV[TIME+7], BH ;save it
GET_DATE:  
;get date from the system
    MOV AH,
04H    ;BIOS function to read date
    INT 1AH        ;call to BIOS, run 04H
    CALL
CVT_DATE
    RET
;CH = Century
;CL = Year
;DH = Month
;DL = Day
;CF = 0 if clock is running, otherwise 1
CVT_DATE:
    CALL
CVT_MO
    CALL
CVT_DAY
    CALL
CVT_YR
    CALL
CVT_CT
    RET
CVT_MO:    
;convert the month to ASCII
MOV BH, DH 
;copy month to BH
SHR BH, 4  
;convert high char to low order bits
ADD BH, 30H ;add 30H to convert to ASCII
MOV [DATE], BH 
;save in DATE string
MOV BH, DH 
;copy month to BH
AND BH, 0FH ;isolate lower 4 bits
ADD BH, 30H ;convert lower bits to ASCII
MOV [DATE+1], BH;save in DATE string
RET
CVT_DAY:   
;convert the day to ASCII
MOV BH, DL 
;copy days to BH
SHR BH, 4  
;convert high char to low order bits
ADD BH, 30H ;add 30H to convert to ASCII
MOV [DATE+3], BH   
;save in DATE string
MOV BH, DL 
;copy days to BH
AND BH, 0FH ;isolate lower 4 bits
ADD BH, 30H ;convert lower bits to ASCII
MOV [DATE+4], BH;save in DATE string
RET
CVT_YR:    
;convert the year to ASCII
MOV BH, CL     
;copy year to BH
SHR BH, 4      
;convert high char to low order bits
ADD BH, 30H    
;convert to ASCII
MOV [DATE+8], BH   
;save it
MOV BH, CL     
;copy year to BH
AND BH, 0FH    
;isolate low order bits
ADD BH, 30H    
;convert to ASCII
MOV [DATE+9], BH   
;save in DATE string
RET
CVT_CT:     ;convert the century to ASCII
MOV BH, CH     
;copy century to BH
SHR BH, 4      
;convert high char to low order bits
ADD BH, 30H    
;convert to ASCII
MOV [DATE+6], BH   
;save it
MOV BH, CH     
;copy century to BH
AND BH, 0FH    
;isolate low order bits
ADD BH, 30H    
;convert to ASCII
MOV [DATE+7], BH   
;save it
RET
;
;Program End
;
End
Upendra
ReplyDeleteIt is very bad that I can not copy it all. It will be very difficult to type it manually. I am so impressed of people who know it by heart. This is so cool, I think.
ReplyDeleteI was surfing the Internet and I have found similar codes, but they all have some differences. I wonder which one is correct?
ReplyDelete