Subversion Repositories pentevo

Rev

Rev 831 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. ; LAST UPDATE: 13.02.2025 savelij
  3.  
  4. ; на входе: H-адрес ячейки
  5. ;           L-прочитанное значение
  6. READCMOS        DI
  7.                 PUSH BC
  8.                 LD BC,CMOSD_SET_ADR
  9.                 OUT (C),H
  10.                 LD B,HIGH (CMOSD_RD_WR)
  11.                 IN L,(C)
  12.                 JR OFF_CMOS
  13.  
  14. ; на входе: H-адрес ячейки
  15. ;           L-что туда записать
  16. WRITECMOS       DI
  17.                 PUSH BC
  18.                 LD BC,CMOSD_SET_ADR
  19.                 OUT (C),H
  20.                 LD B,HIGH (CMOSD_RD_WR)
  21.                 OUT (C),L
  22. OFF_CMOS        POP BC
  23.                 LD A,L
  24.                 AND A
  25.                 RET
  26.  
  27. CMOS_RW
  28.         ROMCALL P5_READ_BYTE,ROM_RST83
  29.                 LD A,(NEXTBYTERST8)
  30.                 ADD A,A
  31.                 ADD A,LOW (CMOSRW_TAB)
  32.                 LD L,A
  33.                 ADC A,HIGH (CMOSRW_TAB)
  34.                 SUB L
  35.                 LD H,A
  36.                 LD A,(HL)
  37.                 INC HL
  38.                 LD H,(HL)
  39.                 LD L,A
  40.                 JP (HL)
  41.  
  42. CMOSRW_TAB      DW INIT_CMOS                    ; проверка CRC CMOS и инициализация при ошибке
  43.                 DW EREAD_CMOS                   ; чтение ячейки CMOS
  44.                 DW EWRITE_CMOS                  ; запись ячейки CMOS с пересчетом CRC
  45.                 DW CLEAR_CMOS                   ; принудительный сброс значений CMOS
  46.  
  47. ; чтение ячеек защищаемых CRC16 и подсчет CRC
  48. ; на выходе: HL=CRC16 блока
  49. READCMOS2BUF    PUSH DE
  50.                 LD DE,CMOS4CRC16
  51.                 PUSH DE
  52.                 LD H,CMOS.BYTE_00
  53.                 LD B,ECMOS_DEFAULT-CMOS_DEFAULT
  54. RDCMOS2BUF1     CALL READCMOS
  55.                 LD (DE),A
  56.                 INC DE
  57.                 DEC H
  58.                 DJNZ RDCMOS2BUF1
  59.                 POP HL
  60.                 PUSH HL
  61.                 POP IX                          ; IX=адрес где байты для счета CRC
  62.                 EX DE,HL
  63.                 AND A
  64.                 SBC HL,DE                       ; HL=количество ячеек для счета
  65.         ROMCALL CRC16_FAST,ROM_RST81
  66.                 POP DE
  67.                 RET
  68.  
  69. ; внешний вызов чтения CMOS
  70. EREAD_CMOS      LD HL,(RREG_L)                  ; H=адрес ячейки кмос откуда читать
  71.                 CALL READCMOS
  72.                 LD (RREG_L),HL                  ; вернули прочитанное в регистр L
  73.                 PUSH AF
  74.                 POP HL
  75.                 LD (RREG_F),HL                  ; вернули прочитанное в регистр A вместе с флагами
  76.                 RET
  77.  
  78. ; внешний вызов записи в CMOS с пересчетом CRC
  79. EWRITE_CMOS     LD HL,(RREG_L)
  80. ; внутренний вызов записи в CMOS с пересчетом CRC
  81. IWRITECMOS      PUSH IX
  82.                 PUSH DE
  83.                 CALL WRITECMOS
  84.                 CALL READCMOS2BUF
  85.                 EX DE,HL
  86.                 LD H,CMOS.CRCHIGH
  87.                 LD L,D
  88.                 CALL WRITECMOS
  89.                 DEC H
  90.                 LD L,E
  91.                 CALL WRITECMOS
  92.                 POP DE
  93.                 POP IX
  94.                 RET
  95.  
  96. INIT_CMOS       CALL READCMOS2BUF               ; буфер для чтения ячеек из CMOS
  97.                 EX DE,HL                        ; CRC спрятали в DE
  98.                 LD H,CMOS.CRCHIGH
  99.                 CALL READCMOS                   ; прочитали старший байт CRC
  100.                 LD C,L
  101.                 LD H,CMOS.CRCLOW
  102.                 CALL READCMOS                   ; прочитали младший байт CRC
  103.                 LD H,C
  104.                 AND A
  105.                 SBC HL,DE                       ; сравнили
  106.                 RET Z                           ; если совпало, то выход
  107. CLEAR_CMOS      LD HL,CMOS_DEFAULT              ; откуда брать дефолтные значения
  108.                 LD DE,CMOS4CRC16                ; куда положить
  109.                 PUSH DE
  110.                 LD BC,ECMOS_DEFAULT-CMOS_DEFAULT
  111.                 LDIR                            ; перенесли в буфер дефолтные значения
  112.                 POP DE
  113.                 PUSH DE
  114.                 LD H,CMOS.BYTE_00
  115.                 LD B,ECMOS_DEFAULT-CMOS_DEFAULT
  116. INITCMOS3       LD A,(DE)
  117.                 INC DE
  118.                 LD L,A
  119.                 CALL WRITECMOS
  120.                 DEC H
  121.                 DJNZ INITCMOS3                  ; пишем ячейки в CMOS
  122.                 POP HL
  123.                 PUSH HL
  124.                 POP IX
  125.                 EX DE,HL
  126.                 AND A
  127.                 SBC HL,DE
  128.         ROMCALL CRC16_FAST,ROM_RST81
  129.                 EX DE,HL
  130.                 LD H,CMOS.CRCHIGH
  131.                 LD L,D
  132.                 CALL WRITECMOS                  ; записали старший байт посчитанного CRC
  133.                 DEC H
  134.                 LD L,E
  135.                 JP WRITECMOS                    ; записали младший байт посчитанного CRC
  136.