2025-04-27 07:49:33 -04:00

306 lines
11 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PAGE 109,132
TITLE MS-DOS 5.0 TIME.ASM
;************************************************************************
;* *
;* *
;* MODULE: TIME.ASM *
;* *
;* *
;* COPYRIGHT (C) NEC CORPORATION 1990 *
;* *
;* NEC CONFIDENTIAL AND PROPRIETARY *
;* *
;* All rights reserved by NEC Corporation. *
;* this program must be used solely for *
;* the purpose for which it was furnished *
;* by NEC Corporation. No past of this program *
;* may be reproduced or disclosed to others, *
;* in any form, without the prior written *
;* permission of NEC Corporation. *
;* Use of copyright notice does not evidence *
;* publication of this program. *
;* *
;************************************************************************
;
; This file defines the segment structure of the BIOS.
; It should be included at the beginning of each source file.
; All further segment declarations in the file can then be done by just
; by specifying the segment name, with no attribute, class, or align type.
datagrp group Bios_Data,Bios_Data_Init
Bios_Data segment word public 'Bios_Data'
Bios_Data ends
Bios_Data_Init segment word public 'Bios_Data_Init'
Bios_Data_Init ends
Filler segment para public 'Filler'
Filler ends
Bios_Code segment word public 'Bios_Code'
Bios_Code ends
Filler2 segment para public 'Filler2'
Filler2 ends
SysInitSeg segment word public 'system_init'
SysInitSeg ends
Bios_Data segment word public 'Bios_Data'
ASSUME CS:BIOS_CODE,DS:DATAGRP
EXTRN BIOS_FLAG:BYTE
EXTRN CAL_TBL:ABS
EXTRN T_YEAR:BYTE,T_MONTH:BYTE,T_DAY:BYTE
EXTRN T_HOUR:BYTE,T_MIN:BYTE,T_SEC:BYTE
EXTRN MONTH_TBL:BYTE
EXTRN YEAR:WORD,MONTH:WORD,DAY:WORD
Bios_Data ends
Bios_Code segment word public 'Bios_Code'
ASSUME CS:BIOS_CODE,DS:DATAGRP
EXTRN STOP_CHK:NEAR
Bios_Code ends
Bios_Code segment word public 'Bios_Code'
ASSUME CS:BIOS_CODE,DS:DATAGRP
PUBLIC TIME_CODE_START
PUBLIC TIME_CODE_END
PUBLIC TIME_END
PUBLIC SETDATE,SETTIME,GETDATE
TIME_CODE_START:
PAGE
;
;TIME AND DATE
;
GETDATE:
PUSH ES ; SAVE ES
PUSH DS ; @DOS5
POP ES ; ES <- DS
PUSH BX ;SAVE BX
MOV BIOS_FLAG,1
MOV BX,OFFSET CAL_TBL
XOR AH,AH ;SET GET COMMAND
INT 1CH ;GET DATE FROM ROM BIO
MOV AL,T_YEAR ;GET YEAR (BCD)
CALL S_HEX
CMP AX,80 ;AX >= 80 ?
JAE SKP_T ;JUMP IF SO
ADD AX,100
SKP_T:
ADD AX,1900 ;COMPUTE YEAR
MOV YEAR,AX ;SAVE YEAR
XOR AH,AH
MOV AL,T_MONTH ;GET MONTH (HEX OF HIGH 4BITS)
MOV CL,4
SHR AL,CL ;GET MONTH
MOV MONTH,AX ;SAVE MONTH
MOV AL,T_DAY ;GET DATE (BCD)
CALL S_HEX
MOV DAY,AX ;SAVE DATE
;COMPUTE NUMBER OF DAYS FROM 1/1/80
MOV BX,1980 ;SET STARTING YEAR
XOR AX,AX
LOOP1:
CALL YEAR_CHK ;CHECK LEAP-YEAR
CMP BX,YEAR ;SAME YEAR?
JE G_MONTH ;JUMP IF SO
ADD AX,DX ;COMPUTE NUMBER OF DAYS
INC BX ;INCREASE YEAR
JMP SHORT LOOP1
G_MONTH:
XOR BX,BX ;CLEAR TABLE'S POINTER
XOR CH,CH
DEC WORD PTR MONTH
LOOP2:
CMP BX,MONTH ;SAME MONTH?
JE G_DAY ;JUMP IF SO
MOV CL,MONTH_TBL[BX] ;GET DAYS OF A MONTH
ADD AX,CX ;COMPUTE DAYS
INC BX ;INCREASE POINTER
JMP SHORT LOOP2
G_DAY:
ADD AX,DAY
DEC AX ;GET NUMBER OF DAYS
PUSH AX ;SAVE AX
MOV AL,T_HOUR ;GET HOUR (BCD)
CALL S_HEX
MOV CH,AL ;SET HOUR
MOV AL,T_MIN ;GET MINUTE (BCD)
CALL S_HEX
MOV CL,AL ;SET MINUTE
MOV AL,T_SEC ;GET SECOND (BCD)
CALL S_HEX
MOV DH,AL ;SET SECOND
XOR DL,DL ;SET 0 FOR SEC/100
POP AX ;RESTORE AX
POP BX ;RESTORE BX
POP ES ; RESTORE ES
CALL STOP_CHK
RET
SETTIME:
MOV BIOS_FLAG,1
MOV AL,CH ;GET HOUR
CALL CONV_BCD ;CONVERT TO BCD
MOV T_HOUR,AL ;SET HOUR
MOV AL,CL ;GET MINUTE
CALL CONV_BCD ;CONVERT TO BCD
MOV T_MIN,AL ;SET MINUTE
MOV AL,DH ;GET SECOND
CALL CONV_BCD ;CONVERT TO BCD
MOV T_SEC,AL ;SET SECOND
PUSH ES ;SAVE ES
PUSH BX ;SAVE BX
MOV AX,ds
MOV ES,AX ;ES <= ds @dos5
MOV BX,OFFSET CAL_TBL
MOV AH,01H ;SET SET COMMAND
INT 1CH ;SET TIME
CALL STOP_CHK
POP BX ;RESTORE BX
POP ES ;RESTORE ES
RET
SETDATE:
PUSH ES
PUSH DS ; @DOS5
POP ES ;ES <- DS
PUSH CX
PUSH DX
PUSH BX
PUSH AX
CALL GETDATE
POP AX
MOV BIOS_FLAG,1
PUSH AX
MOV BX,1980 ;SET STARTING YEAR
MOV WORD PTR MONTH,1 ;SET STARTING MONTH
LOOP3:
CALL YEAR_CHK ;CHECK LEAP-YEAR
CMP AX,DX
JB S_YEAR ;JUMP IF AX < DX
INC BX ;INCREASE YEAR
SUB AX,DX
JMP SHORT LOOP3
S_YEAR:
XCHG AX,BX
SUB AX,1900
CMP AX,100
JB NOT_SUB
SUB AX,100
NOT_SUB:
CALL CONV_BCD ;CONVERT TO BCD
MOV T_YEAR,AL
MOV AX,BX
XOR BX,BX ;CLEAR TABLE'S POINTER
XOR CH,CH
LOOP4:
MOV CL,MONTH_TBL[BX] ;GET DAYS OF A MONTH
CMP AX,CX
JB S_MD ;JUMP IF AX < CX
INC WORD PTR MONTH ;INCREASE MONTH
SUB AX,CX
INC BX ;INCREASE POINTER
JMP SHORT LOOP4
S_MD:
INC AL
CALL CONV_BCD ;CONVERT TO BCD
MOV T_DAY,AL ;SET DAY
MOV AX,MONTH
MOV CL,4
SHL AL,CL
MOV T_MONTH,AL ;SET MONTH
MOV BX,OFFSET CAL_TBL
MOV AH,01H ;SET SET COMMAND
INT 1CH ;SET DATE
CALL STOP_CHK
POP AX ;RESTORE AX
POP BX ;RESTORE BX
POP DX ;RESTORE DX
POP CX ;RESTORE CX
POP ES
RET
YEAR_CHK:
PUSH AX ;SAVE AX
PUSH BX ;SAVE BX
XOR DX,DX
MOV AX,BX
MOV CX,4
DIV CX
OR DX,DX
JNZ COMN_Y ;JUMP IF COMMON-YEAR
MOV AX,BX
MOV CX,100
DIV CX
OR DX,DX
JNZ LEAP_Y ;JUMP IF LEAP-YEAR
MOV AX,BX
MOV CX,400
DIV CX
OR DX,DX
JNZ COMN_Y ;JUMP IF COMMON-YEAR
LEAP_Y:
MOV DX,366 ;SET DAYS OF YEAR
MOV AL,29 ;SET DAYS OF FEB.
JMP SHORT S_FEB
COMN_Y:
MOV DX,365 ;SET DAYS OF YEAR
MOV AL,28 ;SET DAYS OF FEB.
S_FEB:
MOV BX,1
MOV MONTH_TBL[BX],AL ;SET FEB.
POP BX ;RESTORE BX
POP AX ;RESTORE AX
RET
CONV_BCD:
PUSH CX ;SAVE CX
AAM ;CONVERT TO UNPACK BCD
MOV CL,4
SHL AL,CL
SHR AX,CL
POP CX ;RESTORE CX
RET
S_HEX:
PUSH CX
XOR AH,AH
MOV CL,4
SHL AX,CL
SHR AL,CL
AAD
XOR AH,AH
POP CX
RET
;
;DATA OF TIME ROUTINE
;
;CAL_TBL EQU $
;T_YEAR DB 0
;T_MONTH DB 0
;T_DAY DB 0
;T_HOUR DB 0
;T_MIN DB 0
;T_SEC DB 0
;MONTH_TBL DB 31,28,31,30,31,30,31,31,30,31,30,31
; EVEN
;YEAR DW 0
;MONTH DW 0
;DAY DW 0
TIME_CODE_END:
TIME_END:
BIOS_CODE ENDS
END