//////////////////////////////////////////////////////////////////////// ; Функция #21. Текущая дата и время. ; ; вход: нет ; выход: D - день ; E - месяц ; IX - год ; H - час ; L - минуты ; B - секунды ; C - день недели //////////////////////////////////////////////////////////////////////// SYSTIME: LD C,BIOS.CMOS_TEST RST ToBIOS JP C,.NOCMOS LD D,CMOS.Register.date CALL RCMOS PUSH AF LD D,CMOS.Register.month CALL RCMOS POP DE LD E,A PUSH DE LD D,CMOS.Register.hours CALL RCMOS PUSH AF LD D,CMOS.Register.minutes CALL RCMOS POP DE LD E,A PUSH DE LD D,CMOS.Register.seconds CALL RCMOS PUSH AF LD D,CMOS.Register.dayOfWeek LD C,BIOS.CMOS_RD RST ToBIOS POP DE LD E,A PUSH DE LD D,CMOS.Register.year CALL RCMOS ;READ AND CONVERT TO DECIMAL PUSH AF LD D,CMOS.Register.century LD C,BIOS.CMOS_RD RST ToBIOS LD XH,A POP AF CP 80 ;R001, TEST DECIMAL FIX PUSH AF JR C,.XXIAGE LD A,#19 CP XH JR Z,.GOODAGE JR .BADAGE .XXIAGE: LD A,#20 CP XH JR Z,.GOODAGE .BADAGE: PUSH AF LD D,CMOS.Register.century LD C,BIOS.CMOS_WR RST ToBIOS POP AF LD XH,A .GOODAGE: POP AF LD XL,A LD A,XH CALL BCD2HEX LD L,A LD H,0 LD C,L LD B,H LD XH,B ADD HL,HL ADD HL,HL ADD HL,BC ADD HL,HL ;*10 LD B,H LD C,L ADD HL,HL ADD HL,HL ADD HL,BC ADD HL,HL ;*10(100) EX DE,HL ADD IX,DE POP BC POP HL POP DE AND A RET .NOCMOS: .NC_DAY+1: LD DE,DAY*256+MONTH ;DAY/MONTH .NC_HOUR+1: LD HL,0 ;HOUR/MINUTE .NC_SEC+1: LD BC,1 ;SECOND/WEEKDAY .NC_YEAR+2: LD IX,YEAR ;YEAR AND A RET ; //////////////////////////////////////////////////////////////////////// ; Функция #22. Установить текущую дату и время. ; ; вход: D - день ; E - месяц ; IX - год ; H - час ; L - минуты ; B - секунды ; выход: A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// SETTIME: PUSH IX PUSH BC PUSH HL PUSH DE ; ; [ ] 25/01/2024 CALL CalcDayOfWeek PUSH HL ; LD C,BIOS.CMOS_TEST RST ToBIOS JR C,.NOCMOS2 ; ; [ ] 25/01/2024 POP AF LD D,CMOS.Register.dayOfWeek LD C,BIOS.CMOS_WR RST ToBIOS ; POP AF PUSH AF LD D,CMOS.Register.date CALL WCMOS POP BC LD A,C LD D,CMOS.Register.month CALL WCMOS POP AF PUSH AF LD D,CMOS.Register.hours CALL WCMOS POP BC LD A,C LD D,CMOS.Register.minutes CALL WCMOS POP AF ;PUSH AF ; [ ] баг с установкой дня недели из регистра C. Нашел Hard LD D,CMOS.Register.seconds CALL WCMOS ; [ ] баг с установкой дня недели из регистра C. Нашел Hard ;POP BC ;LD A,C ;LD D,CMOS.Register.dayOfWeek ;LD C,BIOS.CMOS_WR ;RST ToBIOS ; POP HL XOR A LD DE,100 .YR: INC A SBC HL,DE JR NC,.YR ADD HL,DE DEC A PUSH HL LD D,CMOS.Register.century CALL WCMOS POP BC LD A,C LD D,CMOS.Register.year CALL WCMOS AND A RET ; !FIXIT новый биос выставляет время, если с ним что-то не так. .NOCMOS2: POP AF POP DE POP HL POP BC POP IX LD C,A ; LD (SYSTIME.NC_DAY),DE ;DAY/MONTH LD (SYSTIME.NC_HOUR),HL ;HOUR/MINUTE LD (SYSTIME.NC_SEC),BC ;SECOND/WEEKDAY LD (SYSTIME.NC_YEAR),IX ;YEAR AND A RET ;