; LAST UPDATE: 13.02.2025 savelij
; на входе: H-адрес ячейки
; L-прочитанное значение
READCMOS DI
PUSH BC
LD BC,CMOSD_SET_ADR
OUT (C),H
LD B,HIGH (CMOSD_RD_WR)
IN L,(C)
JR OFF_CMOS
; на входе: H-адрес ячейки
; L-что туда записать
WRITECMOS DI
PUSH BC
LD BC,CMOSD_SET_ADR
OUT (C),H
LD B,HIGH (CMOSD_RD_WR)
OUT (C),L
OFF_CMOS POP BC
LD A,L
AND A
RET
CMOS_RW
ROMCALL P5_READ_BYTE,ROM_RST83
LD A,(NEXTBYTERST8)
ADD A,A
ADD A,LOW (CMOSRW_TAB)
LD L,A
ADC A,HIGH (CMOSRW_TAB)
SUB L
LD H,A
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
JP (HL)
CMOSRW_TAB DW INIT_CMOS ; проверка CRC CMOS и инициализация при ошибке
DW EREAD_CMOS ; чтение ячейки CMOS
DW EWRITE_CMOS ; запись ячейки CMOS с пересчетом CRC
DW CLEAR_CMOS ; принудительный сброс значений CMOS
; чтение ячеек защищаемых CRC16 и подсчет CRC
; на выходе: HL=CRC16 блока
READCMOS2BUF PUSH DE
LD DE,CMOS4CRC16
PUSH DE
LD H,CMOS.BYTE_00
LD B,ECMOS_DEFAULT-CMOS_DEFAULT
RDCMOS2BUF1 CALL READCMOS
LD (DE),A
INC DE
DEC H
DJNZ RDCMOS2BUF1
POP HL
PUSH HL
POP IX ; IX=адрес где байты для счета CRC
EX DE,HL
AND A
SBC HL,DE ; HL=количество ячеек для счета
ROMCALL CRC16_FAST,ROM_RST81
POP DE
RET
; внешний вызов чтения CMOS
EREAD_CMOS LD HL,(RREG_L) ; H=адрес ячейки кмос откуда читать
CALL READCMOS
LD (RREG_L),HL ; вернули прочитанное в регистр L
PUSH AF
POP HL
LD (RREG_F),HL ; вернули прочитанное в регистр A вместе с флагами
RET
; внешний вызов записи в CMOS с пересчетом CRC
EWRITE_CMOS LD HL,(RREG_L)
; внутренний вызов записи в CMOS с пересчетом CRC
IWRITECMOS PUSH IX
PUSH DE
CALL WRITECMOS
CALL READCMOS2BUF
EX DE,HL
LD H,CMOS.CRCHIGH
LD L,D
CALL WRITECMOS
DEC H
LD L,E
CALL WRITECMOS
POP DE
POP IX
RET
INIT_CMOS CALL READCMOS2BUF ; буфер для чтения ячеек из CMOS
EX DE,HL ; CRC спрятали в DE
LD H,CMOS.CRCHIGH
CALL READCMOS ; прочитали старший байт CRC
LD C,L
LD H,CMOS.CRCLOW
CALL READCMOS ; прочитали младший байт CRC
LD H,C
AND A
SBC HL,DE ; сравнили
RET Z ; если совпало, то выход
CLEAR_CMOS LD HL,CMOS_DEFAULT ; откуда брать дефолтные значения
LD DE,CMOS4CRC16 ; куда положить
PUSH DE
LD BC,ECMOS_DEFAULT-CMOS_DEFAULT
LDIR ; перенесли в буфер дефолтные значения
POP DE
PUSH DE
LD H,CMOS.BYTE_00
LD B,ECMOS_DEFAULT-CMOS_DEFAULT
INITCMOS3 LD A,(DE)
INC DE
LD L,A
CALL WRITECMOS
DEC H
DJNZ INITCMOS3 ; пишем ячейки в CMOS
POP HL
PUSH HL
POP IX
EX DE,HL
AND A
SBC HL,DE
ROMCALL CRC16_FAST,ROM_RST81
EX DE,HL
LD H,CMOS.CRCHIGH
LD L,D
CALL WRITECMOS ; записали старший байт посчитанного CRC
DEC H
LD L,E
JP WRITECMOS ; записали младший байт посчитанного CRC