;!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,.CheckRUS .Dec: SUB #20 RET ; .CheckRUS: CP 'а' ; русская буква а, код #A0 RET C CP 'п'+1 ; русская буква п, код #AF + 1 JR C,.Dec ; .BGUPPER: CP 'р' ; русская буква р, код #E0 RET C 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 ;----------------------------------------------------------------------; ; Запись регистров 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 ;----------------------------------------------------------------------; ;=============================================================================================================================== MACRO PRINT_LINE_KERNEL_PANIC coordY, txtString, txtStringSize, txtColor LD HL,txtString LD BC,txtColor*256 + txtStringSize LD DE,coordY * 256 + (80 - txtStringSize)/2 CALL .PRINT_LINE ENDM ; 12 bytes ; ;-----------------------[] ; HL - сообщение ; E - координата X на текстовом экране ; BC - длина сообщения KERNEL_PANIC: DI ; PUSH DE PUSH HL PUSH BC ; LD E,1 LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default RST ToBIOS ; LD HL,#2050 LD DE,0 LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN RST ToBIOS ; LD A,1 OUT (SCREEN_SWITCH),A ; set scr-2 ; PRINT_LINE_KERNEL_PANIC 13, .kernel_panic, .kernel_panic.size, +(COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.RED) PRINT_LINE_KERNEL_PANIC 18, .press_CAD, .press_CAD.size, +(COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE) ; POP BC POP HL LD DE,#A000 LD A,C LDIR ; POP DE LD D,15 LD C,BIOS.LP_SET_PLACE RST ToBIOS ; LD HL,#A000 LD DE,0*256 + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE LD B,A LD C,BIOS.LP_PRINT_LINE3 RST ToBIOS ; .loop: DI HALT JR .loop ; .PRINT_LINE: PUSH BC PUSH DE LD DE,#A000 LD B,E LD A,C LDIR ; POP DE LD C,BIOS.LP_SET_PLACE RST ToBIOS ; POP DE LD E,D LD HL,#A000 LD D,L LD B,A LD C,BIOS.LP_PRINT_LINE3 JP ToBIOS ; .kernel_panic: DZ "KERNEL PANIC!" .kernel_panic.size EQU $-.kernel_panic ; .press_CAD: DZ "Press Ctrl+Alt+Del or RESET." .press_CAD.size EQU $-.press_CAD ;-----------------------[] ;===============================================================================================================================