; LAST UPDATE: 08.09.2022 savelij
X4DUMP EQU 0X0C
Y4DUMP EQU 0X05
EDIT_CMOS DI
LD A,%01001111
CALL CLEAR_TXTSCR
LD H,CMOS_BYTE_00
CALL READCMOS
AND M_TYPE_FONT
LD (TYPEFONT),A
LD DE,0
LD BC,0X5019
CALL RAMKA4TXTSCR
LD DE,0X2201
LD HL,TXT_EDITCMOS2
CALL PRTT_MSG
LD DE,0X1217
LD HL,TXT_EDITCMOS1
CALL PRTT_MSG
LD IX,0
CALL INVERS_CUR
EC02 CALL LOAD_CMOS
CALL PRINT_DUMP
CALL HELP_REG
CALL TXTMODE_ON
EC01 EI
HALT
LD H,0X0C
CALL READCMOS
BIT 4,A
CALL NZ,PRINT0STROKA
BIT 5,(IY+1)
JP Z,EC01
RES 5,(IY+1)
LD A,(0X5C08)
CP "l"
JR Z,EC02
CP "x"
JR Z,EC06
CP "s"
JR NZ,EC03
CALL SAVE_CMOS
JR EC01
EC03 CP 9
CALL Z,CUR_RIGHT
CP 8
CALL Z,CUR_LEFT
CP 0X0B
CALL Z,CUR_UP
CP 0X0A
CALL Z,CUR_DOWN
CP "0"
JR C,EC01
CP ":"
JR C,EC05
RES 5,A
EC04 CP "A"
JR C,EC01
CP "G"
JR NC,EC01
EC05 CALL INPUT_HALFBYTE
JR EC01
EC06 CALL TXTMODE_OFF
LD A,0X10
CALL SET_7FFD
JP RESTART
;РИСОВАНИЕ ДВОЙНОЙ РАМКИ ОКНА В ТЕКСТМОДЕ
;D-X E-Y B-H C-V
RAMKA4TXTSCR DEC B
DEC B
DEC C
DEC C
PUSH DE
PUSH BC
LD A,"╔"
CALL PRTSYMTXTMODE
R4TXTS1 LD A,"═"
CALL PRTSYMTXTMODE
DJNZ R4TXTS1
LD A,"╗"
CALL PRTSYMTXTMODE
DEC D
INC E
R4TXTS2 LD A,"║"
CALL PRTSYMTXTMODE
DEC D
INC E
DEC C
JR NZ,R4TXTS2
POP BC
POP DE
INC E
R4TXTS3 LD A,"║"
CALL PRTSYMTXTMODE
DEC D
INC E
DEC C
JR NZ,R4TXTS3
LD A,"╚"
CALL PRTSYMTXTMODE
R4TXTS4 LD A,"═"
CALL PRTSYMTXTMODE
DJNZ R4TXTS4
LD A,"╝"
JP PRTSYMTXTMODE
INPUT_HALFBYTE SUB "0"
CP 0X0A
JR C,IHB1
SUB 7
IHB1 LD E,A
LD A,IXH
LD L,A
LD H,0XC0
LD A,IXL
AND A
JR NZ,LOW_HALF
LD A,(HL)
AND 0X0F
LD D,A
LD A,E
RRCA
RRCA
RRCA
RRCA
OR D
JR LOW_HALF1
LOW_HALF LD A,(HL)
AND 0XF0
OR E
LOW_HALF1 LD (HL),A
LD A,L
PUSH AF
LD D,A
LD E,(HL)
EX DE,HL
CALL WRITECMOS
POP AF
CALL PRINT_STROKA
JP CUR_RIGHT
CUR_UP PUSH AF
CALL INVERS_CUR
LD A,IXH
SUB 0X10
CP 0XF0
JR C,CUR_UP1
AND 0X0F
OR 0XE0
CUR_UP1 LD IXH,A
JR ECUR_RIGHT
CUR_DOWN PUSH AF
CALL INVERS_CUR
LD A,IXH
ADD A,0X10
CP 0XF0
JR C,CUR_DOWN1
AND 0X0F
CUR_DOWN1 LD IXH,A
JR ECUR_RIGHT
CUR_RIGHT PUSH AF
CALL INVERS_CUR
INC IXL
LD A,IXL
CP 2
JR C,ECUR_RIGHT
INC IXH
LD A,IXH
CP 0XF0
JR C,CUR_RIGHT1
LD IXH,0
CUR_RIGHT1 LD IXL,0
ECUR_RIGHT CALL HELP_REG
CALL INVERS_CUR
POP AF
RET
CUR_LEFT PUSH AF
CALL INVERS_CUR
DEC IXL
JP P,ECUR_RIGHT
LD IXL,1
DEC IXH
LD A,IXH
CP 0XF0
JR C,ECUR_RIGHT
LD IX,CRCCMOSHIGH*0X100+1
JR ECUR_RIGHT
HELP_REG LD A,IXH
LD HL,EMPTY_STROKA
CP 0X12
JR NC,HELP_REG1
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE,TXT_HELPREG
ADD HL,DE
HELP_REG1 LD DE,0X1203
JP PRTT_MSG
INVERS_CUR LD A,0X1B
CALL SET_7FFD
LD A,IXH
AND 0XF0
RRCA
RRCA
RRCA
RRCA
ADD A,Y4DUMP
LD L,A
LD H,0
LD D,H
REPT 6
ADD HL,HL
ENDM
LD A,IXH
AND 0X0F
LD E,A
ADD A,A
ADD A,E
LD E,A
LD A,IXL
ADD A,X4DUMP+7
ADD A,E
LD E,A
SRL E
ADD HL,DE
AND 1
RRCA
RRCA
RRCA
OR 0XC1
LD D,A
LD E,0XC0
ADD HL,DE
LD A,(HL)
XOR %00000100
LD (HL),A
LD A,0X1F
JP SET_7FFD
;ОЧИСТКА ТЕКСТМОДНОГО ЭКРАНА
CLEAR_TXTSCR PUSH AF
LD A,0X1F
CALL SET_7FFD
LD HL,0XC1C0
LD A," "
CALL CLS_TXTSCR
LD HL,0XE1C0
CALL CLS_TXTSCR
LD A,0X1B
CALL SET_7FFD
LD HL,0XC1C0
POP AF
CALL CLS_TXTSCR
LD HL,0XE1C0
CALL CLS_TXTSCR
LD A,0X1F
JP SET_7FFD
;ОЧИСТКА КУСОЧКА ТЕКСТМОДНОГО ЭКРАНА
CLS_TXTSCR LD D,H
LD E,L
LD BC,0X63F
LD (HL),A
INC DE
LDIR
RET
;ПЕЧАТЬ ТЕКСТОВОЙ СТРОКИ НА ТЕСТМОДНОМ ЭКРАНЕ
PRTT_MSG LD A,(HL)
INC HL
AND A
RET Z
CALL PRTSYMTXTMODE
JR PRTT_MSG
PRINT0STROKA LD H,0
CALL READCMOS
LD (0XC000),A
LD H,2
CALL READCMOS
LD (0XC002),A
LD H,4
CALL READCMOS
LD (0XC004),A
XOR A
LD L,A
PUSH IX
LD IX,0
CALL PRINT_STROKA1
POP IX
RET
PRINT_STROKA LD A,IXH
AND 0XF0
LD L,A
PRINT_STROKA1 LD B,1
LD H,0
RRCA
RRCA
RRCA
RRCA
ADD A,Y4DUMP
LD E,A
LD D,X4DUMP
JR PRINT1STROKA
PRINT_DUMP
; LD DE,(X4DUMP+6)*0X100+Y4DUMP-2
; XOR A
; LD B,0X10
;PRT_ADRB PUSH AF
; CALL PRTT_A_
; LD A," "
; CALL PRTSYMTXTMODE
; POP AF
; DJNZ PRT_ADRB
LD B,0X0F
LD DE,X4DUMP*0X100+Y4DUMP
LD HL,0
PRINT1STROKA CALL PRTT_SMESH
LD A,0XC0
OR H
LD H,A
CALL PRTT_STROKA
LD A,H
AND 0X3F
LD H,A
INC E
LD D,X4DUMP
DJNZ PRINT1STROKA
RET
PRTT_STROKA LD C,0X10
PRTT_STROKA1 LD A,(HL)
INC HL
CALL PRTT_A_
LD A," "
CALL PRTSYMTXTMODE
DEC C
JR NZ,PRTT_STROKA1
RET
PRTT_SMESH CALL PRTT_HL_
LD A,":"
CALL PRTSYMTXTMODE
LD A," "
JR PRTSYMTXTMODE
PRTT_HL_ LD A,H
CALL PRTT_A_
LD A,L
PRTT_A_ PUSH AF
RRCA
RRCA
RRCA
RRCA
CALL PRTT_A_1
POP AF
PRTT_A_1 AND 0X0F
CP 0X0A
CCF
ADC A,"0"
DAA
AND 0X7F
;ПЕЧАТЬ СИМВОЛА НА ТЕКСТМОДНОМ ЭКРАНЕ
;D-X E-Y
PRTSYMTXTMODE PUSH DE
PUSH HL
LD L,A
LD A,0
TYPEFONT EQU $-1
AND A
LD A,L
JR NZ,.LOOP
CP 0X80
JR C,.LOOP
LD HL,CONV_CP866_ATM
PUSH BC
RES 7,A
LD B,0
LD C,A
ADD HL,BC
LD A,(HL)
POP BC
.LOOP PUSH AF
LD L,E
LD A,D
LD H,0
LD D,H
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD E,A
SRL E
ADD HL,DE
AND 1
RRCA
RRCA
RRCA
OR 0XC1
LD D,A
LD E,0XC0
ADD HL,DE
POP AF
LD (HL),A
POP HL
POP DE
INC D
RET
SET_C_A OUT (C),A
RET
LOAD_CMOS LD HL,0XC000
LD D,0
EDITCMOS1 EX DE,HL
CALL READCMOS
EX DE,HL
LD (HL),E
INC HL
INC D
LD A,0XF0
CP D
JR NZ,EDITCMOS1
RET
SAVE_CMOS LD HL,0XC000
LD D,0
SAVECMOS1 LD E,(HL)
EX DE,HL
CALL WRITECMOS
EX DE,HL
INC HL
INC D
LD A,0XF0
CP D
JR NZ,SAVECMOS1
RET
;НА ВХОДЕ: H-АДРЕС ЯЧЕЙКИ
; L-ПРОЧИТАННОЕ ЗНАЧЕНИЕ
READCMOS DI
PUSH BC
LD BC,PENT_CONF
LD A,CMOS_ON ;РАЗРЕШЕНИЕ ДОСТУПА К КМОСУ
OUT (C),A
LD B,HIGH (CMOS_SET_ADR)
OUT (C),H
LD B,HIGH (CMOS_RD_WR)
IN L,(C)
LD A,CMOS_OFF ;ЗАПРЕТ ДОСТУПА К КМОСУ
LD B,HIGH (PENT_CONF)
OUT (C),A
POP BC
LD A,L
AND A
RET
;НА ВХОДЕ: H-АДРЕС ЯЧЕЙКИ
; L-ЧТО ТУДА ЗАПИСАТЬ
WRITECMOS
RST8 _CMOS_RW,_WRITE_CMOS
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
;РАСПЕЧАТКА НА ЭКРАНЕ ВРЕМЕНИ, ДАТЫ И ДНЯ НЕДЕЛИ
PRINTTIME LD A,(ERS_FLAGS)
AND M_CLOCK_ON
RET Z ;ЧАСЫ НЕ ОБНАРУЖЕНЫ, ВЫХОДИМ НИЧЕГО НЕ ВЫВОДЯ
LD H,0X0C
CALL READCMOS
AND 0X10
RET Z ;ЕСЛИ ВРЕМЯ ЕЩЕ НЕ ОБНОВИЛОСЬ, ВЫХОДИМ НИЧЕГО НЕ ВЫВОДЯ
LD H,CMOS_BYTE_01
CALL READCMOS
AND M_CLOCK_VIEW
JR NZ,VIDEOMODE ;ОТОБРАЖЕНИЕ ВЫКЛЮЧЕНО, ВЫХОДИМ НИЧЕГО НЕ ВЫВОДЯ
DI
EXX
LD BC,TXT_TIME ;ЧТЕНИЕ И ПРЕОБРАЗОВАНИЕ ВРЕМЕНИ
LD H,4
CALL READCMOS ;ПРОЧИТАЛИ ЧАСЫ
LD (SCRSAV.CURR+2),A
CALL BYTE2TXT ;СКОНВЕРТИЛИ ЧАСЫ С УКЛАДКОЙ В БУФЕР
LD A,(BC)
XOR ':'-' ' ;КОНВЕРСИЯ МИГАЮЩЕГО ДВОЕТОЧИЯ
LD (BC),A
INC BC
LD H,2
CALL READCMOS ;ПРОЧИТАЛИ МИНУТЫ
LD (SCRSAV.CURR+1),A
CALL BYTE2TXT ;СКОНВЕРТИЛИ ЧАСЫ С УКЛАДКОЙ В БУФЕР
LD A,(BC)
XOR ':'-' ' ;КОНВЕРСИЯ МИГАЮЩЕГО ДВОЕТОЧИЯ
LD (BC),A
INC BC
LD H,0
CALL READCMOS ;ПРОЧИТАЛИ СЕКУНДЫ
LD (SCRSAV.CURR),A
CALL BYTE2TXT
LD BC,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,BUFF_TIME ;ПЕЧАТЕМ ВРЕМЯ ИЗ БУФЕРА
RST8 _PRINT_MESSAGE
EXX
VIDEOMODE DI
LD HL,0XF003
LD BC,PENT_CONF
LD A,CMOS_ON ;РАЗРЕШЕНИЕ ДОСТУПА К КМОСУ
OUT (C),A
LD B,HIGH (CMOS_SET_ADR)
OUT (C),H
LD B,HIGH (CMOS_RD_WR)
OUT (C),L
LD A,CMOS_OFF ;ЗАПРЕТ ДОСТУПА К КМОСУ
LD B,HIGH (PENT_CONF)
OUT (C),A
CALL READCMOS
LD DE,TV_VGA
PUSH AF
AND %00110000
RRCA
RRCA
LD C,A
LD B,0
LD HL,TXT_HZ
ADD HL,BC
LDI
LDI
LDI
LDI
INC DE
POP AF
BIT 0,A
LD HL,TXT_TVVGA
JR Z,VMODE1
INC HL
INC HL
INC HL
VMODE1 LDI
LDI
LDI
LD HL,TXT_VMODE ;ПЕЧАТЕМ ТЕКУЩИЙ ВИДЕО РЕЖИМ
RST8 _PRINT_MESSAGE
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
TXTMODE_ON
PEC_ON M_SHADOW_BF
LD BC,0XFF77
LD A,0XA6
CALL SET_C_A
PEC_OFF M_SHADOW_BF
RET
TXTMODE_OFF
PEC_ON M_SHADOW_BF
LD BC,0XFF77
LD A,0XA3
CALL SET_C_A
PEC_OFF M_SHADOW_BF
RET
CHECK_SCREENSAVER
LD A,(SCRSAV.TIMEOUT)
AND A
RET Z
PUSH AF
LD HL,SCRSAV.CURR
LD DE,(SCRSAV.START)
LD BC,(SCRSAV.START+2)
CALL BCDEHLM
POP AF
CP D
RET NZ
LD A,B
OR E
RET NZ
CALL START_SONGLN
RESET_SCREENSAVER
LD DE,SCRSAV.START
LD H,0
CALL READCMOS
LD (DE),A
INC DE
LD H,2
CALL READCMOS
LD (DE),A
INC DE
LD H,4
CALL READCMOS
LD (DE),A
INC DE
XOR A
LD (DE),A
RET