;LAST UPDATE: 12.02.2011 savelij
WR_TXT_TIME EQU BUFF4TXT+5
WR_TXT_DATA EQU BUFF4TXT+0X10
;НА ВХОДЕ: 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
;ЧТЕНИЕ ВЕРСИИ FPGA ИЛИ BOOTLOADER, ЕСЛИ ЭТО ПЕНТЕВА
GET_VERS_EVO LD C,L
LD H,0XF0
CALL WRITECMOS ;ПИШЕМ В АДРЕС 0XF0 ДЛЯ ПОЛУЧЕНИЯ ВЕРСИИ
CALL READCMOS ;ЧИТАЕМ ОТВЕТ
CP C ;СОВПАЛО С ТЕМ ЧТО ЗАПИСАНО, НЕ ПОДДЕРЖИВАЕТСЯ
RET Z ;И ЭТО НЕ ПЕНТЕВА (ИЛИ ВЕРСИЯ FPGA СТАРАЯ). ВЫХОДИМ
INC A ;ПРИШЕЛ 0XFF, ЗНАЧИТ ЧАСОВ НЕТУ
RET Z ;ВЫХОДИМ
DI
DEC A ;ВОЗВРАЩАЕМ СЧИТАННОЕ ЗНАЧЕНИЕ
PUSH DE
LD (DE),A ;ПОЛОЖИЛИ В БУФЕР УЖЕ ПРОЧИТАННЫЙ БАЙТ
INC DE
LD B,0X0F ;ОСТАЛОСЬ ПРОЧИТАТЬ ОСТАЛЬНЫЕ ЕЩЕ 15 БАЙТ
GVE1 INC H
CALL READCMOS ;ЧИТАЕМ БАЙТ
LD (DE),A
INC DE
DJNZ GVE1 ;ЧИТАЕМ ПОКА ВСЕ БАЙТЫ НЕ КОНЧАТСЯ
POP DE ;ПРОВЕРЯМ В БУФЕРЕ 12 БАЙТ ТЕКСТА
LD H,D
LD L,E
LD B,0X0C ;ЕСЛИ ТЕКСТ КОРОЧЕ ИЩЕМ БАЙТ 0 (ПРИЗНАК КОНЦА ТЕКСТА)
GVE2 LD A,(DE)
AND A
JR Z,GVE3
INC DE
DJNZ GVE2
GVE3 LD BC,0X0C ;ЗАБРАЛИ ИЗ БУФЕРА 2 БАЙТА ДАТЫ В СПЕЦФОРМАТЕ
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
EX DE,HL
LD (HL)," " ;ДОБАВЛЯЕМ К ТЕКСТУ ПРОБЕЛ-РАЗДЕЛИТЕЛЬ
INC HL
;РАСПАКОВЩИК ДАТЫ
UNVERS LD A,C
AND 0X1F ;НУЖНЫ 5 БИТ-ЧИСЛО МЕСЯЦА
CALL A2TXT ;КОНВЕРСИЯ И УКЛАДКА ДАТЫ
SRL B
RR C ;СДВИНУЛИ ДЛЯ ЦЕЛОСТНОСТИ НОМЕРА МЕСЯЦА
LD A,C ;ВЗЯЛИ БИТЫ МЕСЯЦА
RRCA
RRCA
RRCA
RRCA ;СДВИНУЛИ В МЛАДШИЕ БИТЫ
AND 0X0F ;НАМ НУЖНЫ ТОЛЬКО 4 БИТА МЕСЯЦА
LD (HL),"." ;РАЗДЕЛИТЕЛЬНАЯ ТОЧКА
INC HL
CALL A2TXT ;КОНВЕРСИЯ И УКЛАДКА МЕСЯЦА
LD (HL),"." ;РАЗДЕЛИТЕЛЬНАЯ ТОЧКА
INC HL
LD (HL),"2"
INC HL
LD (HL),"0" ;ДОБАВИЛИ К ГОДУ ДВЕ ЦИФЕРКИ
INC HL
LD A,B ;ВЗЯЛИ НОМЕР ГОДА
AND 0X3F ;НУЖНЫ ТОЛЬКО 6 БИТ
CALL A2TXT ;КОНВЕРСИЯ И УКЛАДКА ГОДА
BIT 6,B ;ЕСЛИ БИТ 6 (СДВИНУТЫЙ БИТ 7) УСТАНОВЛЕН
RET NZ ;JR NZ,GVE4 ;ТО ЗАВЕРШАЕМ СТРОКУ
EX DE,HL ;ИНАЧЕ ВЕРСИЯ БЕТА, О ЧЕМ ДОБАВЛЯЕМ ТЕКСТ В БУФЕР
LD HL,TXT_BETA
LD BC,5
LDIR
EX DE,HL
RET
;ЕСЛИ В БАЙТЕ КМОС ПО СМЕЩЕНИЮ 0X11 НЕ 0XAA ИЛИ 0X55, ТО КМОС СЧИТАЕТСЯ ЗАПОЛНЕН НЕИЗВЕСТНО ЧЕМ
;ИЛИ ЭТО ПЕРВОЕ ВКЛЮЧЕНИЯ. ЗАПИСЫВЕМ ДЕФОЛТНЫЕ ЗНАЧЕНИЯ В КМОС.
SET_CMOS_DEFAULT
LD DE,CMOS_DEFAULT
LD H,0X0A
LD B,8
SCD1 EX DE,HL
LD E,(HL)
INC HL
EX DE,HL
CALL WRITECMOS
INC H
DJNZ SCD1
RET
;РАСПЕЧАТКА НА ЭКРАНЕ ВРЕМЕНИ, ДАТЫ И ДНЯ НЕДЕЛИ
PRINTTIME LD A,(FLAGS)
AND 4
RET Z ;ЧАСЫ НЕ ОБНАРУЖЕНЫ, ВЫХОДИМ НИЧЕГО НЕ ВЫВОДЯ
LD H,0X0C
CALL READCMOS
AND 0X10
RET Z ;ЕСЛИ ВРЕМЯ ЕЩЕ НЕ ОБНОВИЛОСЬ, ВЫХОДИМ НИЧЕГО НЕ ВЫВОДЯ
LD H,0X11
CALL READCMOS
CP 0X55
RET Z ;ОТОБРАЖЕНИЕ ВЫКЛЮЧЕНО, ВЫХОДИМ НИЧЕГО НЕ ВЫВОДЯ
DI
EXX
LD HL,BUFF_TIME
LD DE,BUFF4TXT
LD BC,EBUFF_TIME-BUFF_TIME
LDIR
LD BC,WR_TXT_TIME ;ЧТЕНИЕ И ПРЕОБРАЗОВАНИЕ ВРЕМЕНИ
LD H,4
CALL READCMOS ;ПРОЧИТАЛИ ЧАСЫ
CALL BYTE2TXT ;СКОНВЕРТИЛИ ЧАСЫ С УКЛАДКОЙ В БУФЕР
LD A,(BC)
XOR 0X1A ;КОНВЕРСИЯ МИГАЮЩЕГО ДВОЕТОЧИЯ
LD (BC),A
INC BC
LD H,2
CALL READCMOS ;ПРОЧИТАЛИ МИНУТЫ
CALL BYTE2TXT ;СКОНВЕРТИЛИ ЧАСЫ С УКЛАДКОЙ В БУФЕР
LD A,(BC)
XOR 0X1A ;КОНВЕРСИЯ МИГАЮЩЕГО ДВОЕТОЧИЯ
LD (BC),A
INC BC
LD H,0
CALL READCMOS ;ПРОЧИТАЛИ СЕКУНДЫ
CALL BYTE2TXT
LD BC,WR_TXT_DATA ;ДАЛЕЕ ЧТЕНИЕ И ПРЕОБРАЗОВАНИЕ ДАТЫ
LD H,7
CALL READCMOS
CALL BYTE2TXT
INC BC
LD H,8
CALL READCMOS
CALL BYTE2TXT
INC BC
LD H,9
CALL READCMOS
CALL BYTE2TXT
LD HL,BUFF4TXT ;ПЕЧАТАЕМ ВРЕМЯ ИЗ БУФЕРА
CALL NEXT
EXX
RET
;ПЕРЕВОД "A" В ДЕСЯТИЧКУ И В ТЕКСТ
A2TXT PUSH HL
LD L,A
LD H,0
LD DE,10
XOR A
DEC A
INC A
SBC HL,DE
JR NC,$-3
ADD HL,DE
ADD A,"0"
LD D,A
LD A,L
ADD A,"0"
POP HL
LD (HL),D
INC HL
LD (HL),A
INC HL
RET
BYTE2TXT LD L,A
LD H,"0"
RRCA
RRCA
RRCA
RRCA
AND 0X0F
ADD A,H
LD (BC),A
INC BC
LD A,L
AND 0X0F
ADD A,H
LD (BC),A
INC BC
RET