showing time + date from dos interupt 
Author Message
 showing time + date from dos interupt

Hi all,

I want to display the time and date by calling a dos interupt (1A,4 &
1A,2)...
Calling the interupt isnt the problem. Displaying it in decimals is :)

Can someone help by with some code to translate a register value to decimal
values?

Tnx, Joffrey



Thu, 21 Feb 2002 03:00:00 GMT  
 showing time + date from dos interupt
Hi Joffrey,
It's BCD
Maybe you can use some of this code.
See you, Eric
--

Eric P. van Westendorp  Tel: +31(0252)210579
Reigerslaan 22  2215NN Voorhout  Netherlands

                TITLE   SCRCLOCK.ASM

;TSR Displays clock on Dos screen

;MASM 6.1A used ML /AT SCRCLOCK.ASM

;------------------------------------------------------------------------------
CODE            SEGMENT 'CODE'
                ASSUME  DS:CODE,SS:CODE
                ORG     0100H                   ;Code loaded at offset 0100H
                .RADIX  10H                     ;Default all HEX
                .386

;Jump over interrupt handler
MAIN            PROC    FAR
                JMP     INSTALL

;User timer interrupt handler
NEWINT1C        PROC                            ;Called 18.2 times each second
                PUSHF
                INC     CS:[TICK_COUNTER]       ;Count ticks
                CMP     CS:[TICK_COUNTER],12    ;Each 18 ticks action
                JNZ     CONT_OLD1C              ;No action required now
                MOV     CS:[TICK_COUNTER],00    ;Clear ticks, start over
                CALL    UPDATE                  ;Update clock display

;Continue interrupt
CONT_OLD1C:     POPF                            ;No
                DB      0EA                     ;JMP FAR
OLDINT1C_OFS    DW      0000                    ;Continue old interrupt
OLDINT1C_SEG    DW      0000
NEWINT1C        ENDP

;Displays clock
UPDATE          PROC    NEAR
                PUSHA                           ;Save used registers
                PUSH    DS
                PUSH    ES

;Ensure CS and DS point to current segment which is in CS
                PUSH    CS                      ;Set DS to current segment
                POP     DS
                PUSH    CS                      ;Set ES to current segment
                POP     ES

;Get time from RTC
READ_TIME:      MOV     AH,02                   ;Read Real Time Clock Time
                INT     1A                      ;Bios
                JC      READ_TIME               ;Update CMOS in progress

;Time is now in CX:DX as follows (BCD):
;               CH hours   00 -  23
;               CL minutes 00 to 59
;               DH seconds 00 to 59

;Decipher hours
                MOV     AL,CH                   ;Year
                CALL    BCD2ASCII               ;Make ASCII
                MOV     [HOURS],AX              ;Insert into string

 ;Decipher minutes
                MOV     AL,CL
                CALL    BCD2ASCII               ;Make ASCII
                MOV     [MINS],AX               ;Insert into string

;Decipher seconds
                MOV     AL,DH
                CALL    BCD2ASCII               ;Make ASCII
                MOV     [SECONDS],AX            ;Insert into string

;Print string to screen
                MOV     BP,OFFSET TIME_STR      ;Point to string
                MOV     BL,0E                   ;Text attribute bright yellow
DO_SHOW:        MOV     BH,[VPAGE]              ;Video page
                MOV     CX,SHOW_LEN             ;Length string
                XOR     DH,DH                   ;Row 0
                MOV     DL,[LEFT_OFS]           ;Offset from left
                MOV     AX,1300                 ;Write string
                INT     10                      ;Bios

                POP     ES
                POP     DS
                POPA                            ;Restore old values
                RET
UPDATE          ENDP

;Subroutine to unpack BCD numbers
;The next line equals "AAM 010"
BCD2ASCII       PROC    NEAR
                DB      0D4,10
                ADD     AX,"00"
                XCHG    AH,AL
                RET
BCD2ASCII       ENDP

;---------------
TICK_COUNTER    DB      11                      ;Initial tick count

LEFT_OFS        DB      00                      ;Left offset for string

VPAGE           DB      00                      ;Default video page
TIME_STR        DB      " "
HOURS           DW      "00"
                DB      ":"
MINS            DW      "00"
                DB      ":"
SECONDS         DW      "00"
                DB      " "
SHOW_LEN        EQU     $ - OFFSET TIME_STR     ;Length of string

INSTALLED       DB      0A,0D,"SCREENCLOCK installed$"

;---------------
INSTALL:        MOV     AH,0F                   ;Return video status, get cols
                INT     10
                SUB     AH,SHOW_LEN             ;Number of colums - string len
                MOV     [LEFT_OFS],AH           ;Store offset
                MOV     [VPAGE],BH              ;Store video page

;Get user timer tick interrupt vector, move into new handler
                PUSH    ES                      ;Save original value
                MOV     AX,351C
                INT     21
                MOV     [OLDINT1C_OFS],BX
                MOV     [OLDINT1C_SEG],ES
                POP     ES                      ;Restore

MOV_BYTES       EQU     OFFSET INSTALLED - 0100 ;Bytes to move forward

;Move code to be resident to offset 0060 in PSP in order to save space
                CLD
                MOV     SI,0100                 ;Start of program
                MOV     DI,0060                 ;Offset in PSP
                MOV     CX,MOV_BYTES            ;Number of bytes to move
                REP     MOVSB

;Revector timer tick interrupt to new routine with a new DS
                PUSH    DS                      ;Save present DS
                MOV     AX,DS
                SUB     AX,(0100 - 0060) SHR 04 ;Subtract para's moved forward
                MOV     DS,AX
                MOV     AX,251C                 ;Revector INT 1C to routine
                MOV     DX,OFFSET NEWINT1C
                INT     21
                POP     DS                      ;Restore DS

;Print installed message
                MOV     AH,09
                MOV     DX,OFFSET INSTALLED
                INT     21

;Free environment block
                MOV     AH,49                   ;Free allocated memory
                MOV     ES,DS:[002C]            ;Segment environment
                INT     21

RES_BYTES       EQU     OFFSET INSTALLED - 0100 + 006F

;Stay resident
                MOV     AX,3100                 ;Keep program
                MOV     DX,RES_BYTES            ;Bytes to stay resident
                MOV     CL,04                   ;Divide by 16
                SHR     DX,CL                   ;Get para's
                INT     21                      ;Dos

                MAIN    ENDP

CODE            ENDS
                END     MAIN

Quote:

> Hi all,

> I want to display the time and date by calling a dos interupt (1A,4 &
> 1A,2)...
> Calling the interupt isnt the problem. Displaying it in decimals is :)

> Can someone help by with some code to translate a register value to decimal
> values?

> Tnx, Joffrey



Thu, 21 Feb 2002 03:00:00 GMT  
 showing time + date from dos interupt
->Calling the interupt isnt the problem. Displaying it in decimals is :)

function BcdToByte(const Value: Byte): Byte;
{Result := ((Value shr 4) shl 3) + ((Value shr 4) shl 1) +
           (Value and $0F);}
asm
       MOV CL, AL
       SHR CL, 4        { CL := T := Value shr 4; }
       MOV CH, CL
       SHL CH, 3        { CH := Z1 := T shl 3 }
       MOV DH, CL
       SHL DH, 1        { DH := Z2 := T shl 1 }
       MOV DL, AL
       AND DL, $0F      { DL := Z3 := Value and $0F}
       XOR EAX, EAX     { Result := 0 }
       ADD AL, CH       { Result := Result + Z1 }
       ADD AL, DH       { Result := Result + Z2 }
       ADD AL, DL       { Result := Result + Z3 }
end;



Fri, 22 Feb 2002 03:00:00 GMT  
 showing time + date from dos interupt
->Calling the interupt isnt the problem. Displaying it in decimals is :)

function BcdToByte(const Value: Byte): Byte;
{Result := ((Value shr 4) shl 3) + ((Value shr 4) shl 1) +
           (Value and $0F);}
asm
       MOV CL, AL
       SHR CL, 4        { CL := T := Value shr 4; }
       MOV CH, CL
       SHL CH, 3        { CH := Z1 := T shl 3 }
       MOV DH, CL
       SHL DH, 1        { DH := Z2 := T shl 1 }
       MOV DL, AL
       AND DL, $0F      { DL := Z3 := Value and $0F}
       XOR EAX, EAX     { Result := 0 }
       ADD AL, CH       { Result := Result + Z1 }
       ADD AL, DH       { Result := Result + Z2 }
       ADD AL, DL       { Result := Result + Z3 }
end;



Fri, 22 Feb 2002 03:00:00 GMT  
 
 [ 4 post ] 

 Relevant Pages 

1. DOS compressed date/time into real date/time

2. TIME&DATE in HTML shows TIME

3. Create Time / date or Modified Time / date of a txt file

4. convert labview date/time to excel date/time

5. how to do dos date and time commands

6. Dos Date & time to clarion date & time

7. Clarion Date (Long) -> Access Date\Time

8. print to screen without using dos interupts?

9. Displaying text without a DOS interupt

10. DOS Interupts...

11. can 32bit executable use Dos interupt?

12. __asm (dos) interupts crash my program

 

 
Powered by phpBB® Forum Software