Rio444 писал(а): ↑02.01.2023,16:43
А кто будет писать драйвер? Собственно сама утилита, которая просто при старте будет копировать содержимое RTC в RAM это наверное мелочи. Хоть на бейсике можно сделать.
Ну нужна же ещё будет программа, которая будет задавать время в RTC. Желательно с нормальным, человеческим интерфейсом, а не из командной строки.
Драйвер я могу написать (это особый тип драйвера - CLOCK), но программа иногда
даже лучше, тк не ест память. А чем плох CLI интерфейс? Там всего два основных ключа -
- установить DOS время по времени внутри часов (обычно из autoxec.bat вызывается) и
наоборот (время в RTC по DOS времени). Те ставим время и дату в DOS любым способом
и вызываем программу. Те задавать время и дату для самой программы каким-то
нестандартным способом не надо.
Относительно IRQ8 - похоже, не особо он нужен
► Показать
;--- HARDWARE INT 70 H -- ( IRQ LEVEL 8 ) ------------------------------------
; ALARM INTERRUPT HANDLER (RTC) :
; THIS ROUTINE HANDLES THE PERIODIC AND ALARM INTERRUPTS FROM THE CMOS :
; TIMER. INPUT FREQUENCY IS 1.024 KHZ OR APPROXIMATELY 1024 INTERRUPTS :
; EVERY SECOND FOR THE PERIODIC INTERRUPT. FOR THE ALARM FUNCTION, :
; THE INTERRUPT WILL OCCUR AT THE DESIGNATED TIME. :
; :
; INTERRUPTS ARE ENABLED WHEN THE EVENT OR ALARM FUNCTION IS ACTIVATED. :
; FOR THE EVENT INTERRUPT, THE HANDLER WILL DECREMENT THE WAIT COUNTER :
; AND WHEN IT EXPIRES WILL SET THE DESIGNATED LOCATION TO 80H. FOR :
; THE ALARM INTERRUPT. THE USER MUST PROVIDE A ROUTINE TO INTERCEPT :
; THE CORRECT ADDRESS FROM THE VECTOR TABLE INVOKED BY INTERRUPT 4AH :
; PRIOR TO SETTING THE REAL TIME CLOCK ALARM (INT 1AH, AH= 06H). :
;-------------------------------------------------------------------------------
RTC_INT PROC FAR ; ALARM INTERRUPT
PUSH DS ; LEAVE INTERRUPTS DISABLED
PUSH AX ; SAVE REGISTERS
PUSH DI
RTC_I_1: ; CHECK FOR SECOND INTERRUPT
MOV AX,(CMOS_REG_B+NMI)*H+CMOS_REG_C+NMI ; ALARM AND STATUS
OUT CMOS_PORT,AL ; WRITE ALARM FLAG MASK ADDRESS
NOP ; I/O DELAY
IN AL,CMOS_DATA ; READ AND RESET INTERRUPT REQUEST FLAGS
TEST AL,01100000B ; CHECK FOR EITHER INTERRUPT PENDING
JZ RTC_I_9 ; EXIT IF NOT A VALID RTC INTERRUPT
XCHG AH,AL ; SAVE FLAGS AND GET ENABLE ADDRESS
OUT CMOS_PORT,AL ; WRITE ALARM ENABLE MASK ADDRESS
NOP ; I/O DELAY
IN AL,CMOS_DATA ; READ CURRENT ALARM ENABLE MASK
AND AL,AH ; ALLOW ONLY SOURCES THAT ARE ENABLED
TEST AL,01000000B ; CHECK FOR PERIODIC INTERRUPT
JZ RTC_I_5 ; SKIP IF NOT A PERIODIC INTERRUPT
;----- DECREMENT WAIT COUNT BY INTERRUPT INTERVAL
CALL DDS ; ESTABLISH DATA SEGMENT ADDRESSABILITY
SUB @RTC_LOW,0976 ; DECREMENT COUNT LOW BY 1/1024
SBB @RTC_HIGH,0 ; ADJUST HIGH WORD FOR LOW WORD BORROW
JNC RTC_I_5 ; SKIP TILL 32 BIT WORD LESS THAN ZERO
;----- TURN OFF PERIODIC INTERRUPT ENABLE
PUSH AX ; SAVE INTERRUPT FLAG MASK
MOV AX,X*(CMOS_REG_B+NMI) ; INTERRUPT ENABLE REGISTER
OUT CMOS_PORT,AL ; WRITE ADDRESS TO CMOS CLOCK
NOP ; I/O DELAY
IN AL,CMOS_DATA ; READ CURRENT ENABLES
AND AL,0BFH ; TURN OFF PIE
XCHG AL,AH ; GET CMOS ADDRESS AND SAVE VALUE
OUT CMOS_PORT,AL ; ADDRESS REGISTER B
XCHG AL,AH ; GET NEW INTERRUPT ENABLE MASK
OUT CMOS_DATA,AL ; SET MASK IN INTERRUPT ENABLE REGISTER
MOV @RTC_WAIT_FLAG,0 ; SET FUNCTION ACTIVE FLAG OFF
LDS DI,DWORD PTR @USER_FLAG ; SET UP (DS:DI) TO POINT TO USER FLAG
MOV BYTE PTR [DI],80H ; TURN ON USERS FLAG
POP AX ; GET INTERRUPT SOURCE BACK
RTC_I_5:
TEST AL,00100000B ; TEST FOR ALARM INTERRUPT
JZ RTC_I_7 ; SKIP USER INTERRUPT CALL IF NOT ALARM
MOV AL,CMOS_REG_D ; POINT TO DEFAULT READ ONLY REGISTER
OUT CMOS_PORT,AL ; ENABLE NMI AND CMOS ADDRESS TO DEFAULT
STI ; INTERRUPTS BACK ON NOW
PUSH DX
INT 4AH ; TRANSFER TO USER ROUTINE
POP DX
CLI ; BLOCK INTERRUPT FOR RETRY
RTC_I_7: ; RESTART ROUTINE TO HANDLE DELAYED
JMP RTC_I_1 ; ENTRY AND SECOND EVENT BEFORE DONE
RTC_I_9: ; EXIT - NO PENDING INTERRUPTS
MOV AL,CMOS_REG_D ; POINT TO DEFAULT READ ONLY REGISTER
OUT CMOS_PORT,AL ; ENABLE NMI AND CMOS ADDRESS TO DEFAULT
MOV AL,EOI ; END OF INTERRUPT MASK TO 8259 - 2
OUT INTB00,AL ; TO 8259 - 2
OUT INTA00,AL ; TO 8259 - 1
POP DI ; RESTORE REGISTERS
POP AX
POP DS
IRET ; END OF INTERRUPT
RTC_INT ENDP