;!TODO Procedures ;----------------------------------------------------------------------; ; Закодировать время/дату ; вход: de - день/месяц ; hl - часы/минуты ; b - секунды ; ix - год ; выход: de - время ; bc - месяц/день ; ix - год ; ;INPUT: D - DAY; E - MONTH ; H - HOUR; L - MINUTE ; B - SECOND (0...59) ; IX- YEAR (0...65535) ;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 ; BC - yyyyyyymmmmddddd y - year, m - month, d - day ; (1980-2108) MK_TIME: LD A,L RLCA RLCA SLA A RL H SLA A RL H SLA A RL H SRL B OR B LD L,A LD BC,#F844 ;(-1980) ADD IX,BC LD A,E RLCA RLCA RLCA RLCA AND #F0 LD B,XL SLA A RL B OR D LD C,A EX DE,HL AND A RET ;----------------------------------------------------------------------; ;!TODO Procedures ;----------------------------------------------------------------------; ; Раскодировать время/дату ; вход: de - время ; bc - месяц/день ; ix - год ; выход: de - день/месяц ; hl - часы/минуты ; b - секунды ; ix - год ; ;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 ; BC - yyyyyyymmmmddddd y - year, m - month, d - day ; (1980-2108) ;OUTPUT: D - DAY; E - MONTH ; H - HOUR; L - MINUTE ; B - SECOND (0...59) ; IX- YEAR (0...65535) RMKTIME: EX DE,HL LD A,C AND #1F LD D,A SRL B RR C LD A,C RRCA RRCA RRCA RRCA AND #0F LD E,A LD C,B LD B,0 LD IX,1980 ADD IX,BC LD A,L AND #1F ADD A,A LD B,A SRL H RR L SRL H RR L SRL H RR L SRL L SRL L AND A RET ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ; [x] 25/01/2024 ; вход: D - день ; E - месяц ; IX - год ; выход: H - день недели (1 - воскресенье) CalcDayOfWeek: LD A,D LD (.day),A ; x = (14 ? месяц) / 12 ; y = год ? x LD A,E CP 3 LD A,0 JR NC,1F DEC IX LD A,12 1: ; y = IX ; m = месяц + 12 * x ? 2 ADD E SUB 2 ; m = A ; HL = (31 * m) LD D,0 LD E,A RLA RLA RLA LD H,D LD L,A ADD HL,HL ADD HL,HL SBC HL,DE ; (31 * m) = HL ; BC = (31 * m) / 12 LD B,H LD C,L ; D=0 LD E,12 CALL BC_Div_DE ; (31 * m) / 12 = BC LD (.m31_12),BC ; y / 4 PUSH IX POP BC ; D=0 LD E,4 CALL BC_Div_DE ; y / 4 = BC PUSH BC ; y / 100 PUSH IX POP BC ; D=0 LD E,100 CALL BC_Div_DE ; y / 100 = BC PUSH BC ; y / 400 PUSH IX POP BC LD DE,400 CALL BC_Div_DE ; y / 400 = BC ; y/400 - y/100 AND A LD H,B LD L,C POP DE SBC HL,DE ; y/400 - y/100 = HL ; y/4 ? y/100 + y/400 POP DE ADD HL,DE ; y/4 ? y/100 + y/400 + (31 * m)/12 .m31_12+1: LD DE,0 ADD HL,DE ; y + y/4 ? y/100 + y/400 + (31 * m)/12 EX DE,HL ADD IX,DE ; день + y + y/4 ? y/100 + y/400 + (31 * m)/12 LD D,0 .day+1: LD E,0 ADD IX,DE ; 7000 + (день + y + y/4 ? y/100 + y/400 + (31 * m)/12) LD DE,7000 ADD IX,DE ; (7000 + (день + y + y/4 ? y/100 + y/400 + (31 * m)/12)) mod 7 LD B,XH LD C,XL LD DE,7 CALL BC_Div_DE ; ДеньНедели = L LD H,L INC H RET ; x = (14 ? месяц) / 12 ; y = год ? x ; m = месяц + 12 * x ? 2 ; ДеньНедели = (7000 + (день + y + y/4 ? y/100 + y/400 + (31 * m)/12)) mod 7 ; Все деления целочисленные (остаток отбрасывается). ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ; a..z -> A..Z UPPER: CP 'a' RET C CP 'z' + 1 JR NC,.MDUPPER SUB #20 .NOUPPER: RET .MDUPPER: CP 'а' ; русская буква а, код #A0 JR C,.NOUPPER CP 'п' ; русская буква п, код #B0 JR NC,.BGUPPER SUB #20 RET .BGUPPER: CP 'р' ; русская буква р, код #E0 JR C,.NOUPPER CP 'Ё' ; русская буква Ё, код #F0 JR NC,.HGUPPER SUB #50 RET .HGUPPER: CP 'ё' ; русская буква ё, код #F1 RET NZ DEC A RET ;----------------------------------------------------------------------; ;!TODO hardware ;----------------------------------------------------------------------; ; Чтение регистров CMOS ; вход: d=номер регистра RCMOS: LD C,BIOS.CMOS_RD RST ToBIOS ;JP BCD2HEX ; INPUT : A - BCD ; OUTPUT: A - HEX BCD2HEX: LD E,A RRCA RRCA RRCA RRCA AND #0F LD D,A ADD A,A ADD A,A ADD A,D ADD A,A LD D,A LD A,E AND #0F ADD A,D RET ;----------------------------------------------------------------------; ;!TODO hardware ;----------------------------------------------------------------------; ;!FIXIT переделать по доке на Даллас и запись в ячейки часов ; Запись регистров CMOS ; вход: d=номер регистра WCMOS: CALL HEX2BCD LD C,BIOS.CMOS_WR JP ToBIOS ; INPUT : A - HEX ; OUTPUT: A - BCD HEX2BCD: LD BC,#0AFF .loop: INC C SUB B JR NC,.loop ADD A,B LD B,A LD A,C RLCA RLCA RLCA RLCA AND #F0 OR B RET ;----------------------------------------------------------------------; ; ; ;----------------------------------------------------------------------; ;BC/DE ==> BC, remainder in HL ; не портит DE BC_Div_DE: ld hl,0 ld a,b ld b,16 ;shift the bits from BC into HL .div_loop: sla c rla adc hl,hl sbc hl,de jr nc,.div_inc_acc add hl,de db $FE ;this begins the instruction `cp *`, so it eats the next byte. .div_inc_acc: inc c djnz .div_loop ld b,a ret ;----------------------------------------------------------------------; ; ;----------------------------------------------------------------------; ; HL:DE / A => DE:BC, H=0, L - остаток DIV_by_Shifts: LD C,A DEC A JR Z,.exit ; AND E LD B,A ; остаток LD A,C RRCA ; .loop: SRL H RR L RR D RR E RRCA JP NC,.loop LD A,B .exit: LD B,D LD C,E EX DE,HL LD H,0 LD L,A RET ;----------------------------------------------------------------------;