;LAST UPDATE: 30.06.2019 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,CRCCMOSHIGH
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,CRCCMOSHIGH
CALL READCMOS ;ПРОЧИТАЛИ СТАРШИЙ БАЙТ CRC
LD C,L
LD H,CRCCMOSLOW
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,CRCCMOSHIGH
LD L,D
CALL WRITECMOS ;ЗАПИСАЛИ СТАРШИЙ БАЙТ ПОСЧИТАННОГО CRC
DEC H
LD L,E
JP WRITECMOS ;ЗАПИСАЛИ МЛАДШИЙ БАЙТ ПОСЧИТАННОГО CRC