Subversion Repositories pentevo

Rev

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

  1.  
  2. ; LAST UPDATE: 16.02.2025 savelij
  3.  
  4. X4DUMP          EQU 0x0C
  5. Y4DUMP          EQU 0x05
  6.  
  7. EDIT_CMOS       DI
  8.                 LD A,%01001111
  9.                 CALL CLEAR_TXTSCR
  10.                 LD H,CMOS.BYTE_00
  11.                 CALL READCMOS
  12.                 AND CMOS_ED.M_TYPE_FONT
  13.                 LD (TYPEFONT),A
  14.                 LD DE,0
  15.                 LD BC,0x5019
  16.                 CALL RAMKA4TXTSCR
  17.                 LD DE,0x2201
  18.                 LD HL,TXT_EDITCMOS2
  19.                 CALL PRTT_MSG
  20.                 LD DE,0x1217
  21.                 LD HL,TXT_EDITCMOS1
  22.                 CALL PRTT_MSG
  23.                 LD IX,0
  24.                 CALL INVERS_CUR
  25. EC02            CALL LOAD_CMOS
  26.                 CALL PRINT_DUMP
  27.                 CALL HELP_REG
  28.                 CALL TXTMODE_ON
  29. EC01            EI
  30.                 HALT
  31.                 LD H,CMOS.REG_C
  32.                 CALL READCMOS
  33.                 BIT CMOSREG.B_C_RO_UF,A
  34.                 CALL NZ,PRINT0STROKA
  35.                 BIT 5,(IY+1)
  36.                 JP Z,EC01
  37.                 RES 5,(IY+1)
  38.                 LD A,(0x5C08)
  39.                 CP 'l'
  40.                 JR Z,EC02
  41.                 CP 'x'
  42.                 JR Z,EC06
  43.                 CP 's'
  44.                 JR NZ,EC03
  45.                 CALL SAVE_CMOS
  46.                 JR EC01
  47.  
  48. EC03            CP 9
  49.                 CALL Z,CUR_RIGHT
  50.                 CP 8
  51.                 CALL Z,CUR_LEFT
  52.                 CP 0x0B
  53.                 CALL Z,CUR_UP
  54.                 CP 0x0A
  55.                 CALL Z,CUR_DOWN
  56.                 CP '0'
  57.                 JR C,EC01
  58.                 CP ':'
  59.                 JR C,EC05
  60.                 RES 5,A
  61. EC04            CP 'A'
  62.                 JR C,EC01
  63.                 CP 'G'
  64.                 JR NC,EC01
  65. EC05            CALL INPUT_HALFBYTE
  66.                 JR EC01
  67.  
  68. EC06            CALL TXTMODE_OFF
  69.                 LD A,0x10
  70.                 CALL SET_7FFD
  71.                 JP RESTART
  72.  
  73. ; рисование двойной рамки окна в текстмоде
  74. ; D-X E-Y B-H C-V
  75. RAMKA4TXTSCR    DEC B
  76.                 DEC B
  77.                 DEC C
  78.                 DEC C
  79.                 PUSH DE
  80.                 PUSH BC
  81.                 LD A,'╔'
  82.                 CALL PRTSYMTXTMODE
  83. R4TXTS1         LD A,'═'
  84.                 CALL PRTSYMTXTMODE
  85.                 DJNZ R4TXTS1
  86.                 LD A,'╗'
  87.                 CALL PRTSYMTXTMODE
  88.                 DEC D
  89.                 INC E
  90. R4TXTS2         LD A,'║'
  91.                 CALL PRTSYMTXTMODE
  92.                 DEC D
  93.                 INC E
  94.                 DEC C
  95.                 JR NZ,R4TXTS2
  96.                 POP BC
  97.                 POP DE
  98.                 INC E
  99. R4TXTS3         LD A,'║'
  100.                 CALL PRTSYMTXTMODE
  101.                 DEC D
  102.                 INC E
  103.                 DEC C
  104.                 JR NZ,R4TXTS3
  105.                 LD A,'╚'
  106.                 CALL PRTSYMTXTMODE
  107. R4TXTS4         LD A,'═'
  108.                 CALL PRTSYMTXTMODE
  109.                 DJNZ R4TXTS4
  110.                 LD A,'╝'
  111.                 JP PRTSYMTXTMODE
  112.  
  113. INPUT_HALFBYTE  SUB '0'
  114.                 CP 0x0A
  115.                 JR C,IHB1
  116.                 SUB 7
  117. IHB1            LD E,A
  118.                 LD A,IXH
  119.                 LD L,A
  120.                 LD H,0xC0
  121.                 LD A,IXL
  122.                 AND A
  123.                 JR NZ,LOW_HALF
  124.                 LD A,(HL)
  125.                 AND 0x0F
  126.                 LD D,A
  127.                 LD A,E
  128.                 RRCA
  129.                 RRCA
  130.                 RRCA
  131.                 RRCA
  132.                 OR D
  133.                 JR LOW_HALF1
  134.  
  135. LOW_HALF        LD A,(HL)
  136.                 AND 0xF0
  137.                 OR E
  138. LOW_HALF1       LD (HL),A
  139.                 LD A,L
  140.                 PUSH AF
  141.                 LD D,A
  142.                 LD E,(HL)
  143.                 EX DE,HL
  144.                 CALL WRITECMOS
  145.                 POP AF
  146.                 CALL PRINT_STROKA
  147.                 JP CUR_RIGHT
  148.  
  149. CUR_UP          PUSH AF
  150.                 CALL INVERS_CUR
  151.                 LD A,IXH
  152.                 SUB 0x10
  153.                 CP 0xF0
  154.                 JR C,CUR_UP1
  155.                 AND 0x0F
  156.                 OR 0xE0
  157. CUR_UP1         LD IXH,A
  158.                 JR ECUR_RIGHT
  159.  
  160. CUR_DOWN        PUSH AF
  161.                 CALL INVERS_CUR
  162.                 LD A,IXH
  163.                 ADD A,0x10
  164.                 CP 0xF0
  165.                 JR C,CUR_DOWN1
  166.                 AND 0x0F
  167. CUR_DOWN1       LD IXH,A
  168.                 JR ECUR_RIGHT
  169.  
  170. CUR_RIGHT       PUSH AF
  171.                 CALL INVERS_CUR
  172.                 INC IXL
  173.                 LD A,IXL
  174.                 CP 2
  175.                 JR C,ECUR_RIGHT
  176.                 INC IXH
  177.                 LD A,IXH
  178.                 CP 0xF0
  179.                 JR C,CUR_RIGHT1
  180.                 LD IXH,0
  181. CUR_RIGHT1      LD IXL,0
  182. ECUR_RIGHT      CALL HELP_REG
  183.                 CALL INVERS_CUR
  184.                 POP AF
  185.                 RET
  186.  
  187. CUR_LEFT        PUSH AF
  188.                 CALL INVERS_CUR
  189.                 DEC IXL
  190.                 JP P,ECUR_RIGHT
  191.                 LD IXL,1
  192.                 DEC IXH
  193.                 LD A,IXH
  194.                 CP 0xF0
  195.                 JR C,ECUR_RIGHT
  196.                 LD IX,CMOS.CRCHIGH << 8 + 1
  197.                 JR ECUR_RIGHT
  198.  
  199. HELP_REG        LD A,IXH
  200.                 LD HL,EMPTY_STROKA
  201.                 CP 0x12
  202.                 JR NC,HELP_REG1
  203.                 LD L,A
  204.                 LD H,0
  205.                 ADD HL,HL
  206.                 ADD HL,HL
  207.                 ADD HL,HL
  208.                 ADD HL,HL
  209.                 ADD HL,HL
  210.                 LD DE,TXT_HELPREG
  211.                 ADD HL,DE
  212. HELP_REG1       LD DE,0x1203
  213.                 JP PRTT_MSG
  214.  
  215. INVERS_CUR      LD A,0x1B
  216.                 CALL SET_7FFD
  217.                 LD A,IXH
  218.                 AND 0xF0
  219.                 RRCA
  220.                 RRCA
  221.                 RRCA
  222.                 RRCA
  223.                 ADD A,Y4DUMP
  224.                 LD L,A
  225.                 LD H,0
  226.                 LD D,H
  227.         REPT 6
  228.                 ADD HL,HL
  229.         ENDM
  230.                 LD A,IXH
  231.                 AND 0x0F
  232.                 LD E,A
  233.                 ADD A,A
  234.                 ADD A,E
  235.                 LD E,A
  236.                 LD A,IXL
  237.                 ADD A,X4DUMP+7
  238.                 ADD A,E
  239.                 LD E,A
  240.                 SRL E
  241.                 ADD HL,DE
  242.                 AND 1
  243.                 RRCA
  244.                 RRCA
  245.                 RRCA
  246.                 OR 0xC1
  247.                 LD D,A
  248.                 LD E,0xC0
  249.                 ADD HL,DE
  250.                 LD A,(HL)
  251.                 XOR %00000100
  252.                 LD (HL),A
  253.                 LD A,0x1F
  254.                 JP SET_7FFD
  255.  
  256. ; очистка текстмодного экрана
  257. CLEAR_TXTSCR    PUSH AF
  258.                 LD A,0x1F
  259.                 CALL SET_7FFD
  260.                 LD HL,0xC1C0
  261.                 LD A,' '
  262.                 CALL CLS_TXTSCR
  263.                 LD HL,0xE1C0
  264.                 CALL CLS_TXTSCR
  265.                 LD A,0x1B
  266.                 CALL SET_7FFD
  267.                 LD HL,0xC1C0
  268.                 POP AF
  269.                 CALL CLS_TXTSCR
  270.                 LD HL,0xE1C0
  271.                 CALL CLS_TXTSCR
  272.                 LD A,0x1F
  273.                 JP SET_7FFD
  274.  
  275. ; очистка кусочка текстмодного экрана
  276. CLS_TXTSCR      LD D,H
  277.                 LD E,L
  278.                 LD BC,0x63F
  279.                 LD (HL),A
  280.                 INC DE
  281.                 LDIR
  282.                 RET
  283.  
  284. ; печать текстовой строки на тестмодном экране
  285. PRTT_MSG        LD A,(HL)
  286.                 INC HL
  287.                 AND A
  288.                 RET Z
  289.                 CALL PRTSYMTXTMODE
  290.                 JR PRTT_MSG
  291.  
  292. PRINT0STROKA    LD H,CMOS.SECOND
  293.                 CALL READCMOS
  294.                 LD (0xC000),A
  295.                 LD H,CMOS.MINUTE
  296.                 CALL READCMOS
  297.                 LD (0xC002),A
  298.                 LD H,CMOS.HOUR
  299.                 CALL READCMOS
  300.                 LD (0xC004),A
  301.                 XOR A
  302.                 LD L,A
  303.                 PUSH IX
  304.                 LD IX,0
  305.                 CALL PRINT_STROKA1
  306.                 POP IX
  307.                 RET
  308.  
  309. PRINT_STROKA    LD A,IXH
  310.                 AND 0xF0
  311.                 LD L,A
  312. PRINT_STROKA1   LD B,1
  313.                 LD H,0
  314.                 RRCA
  315.                 RRCA
  316.                 RRCA
  317.                 RRCA
  318.                 ADD A,Y4DUMP
  319.                 LD E,A
  320.                 LD D,X4DUMP
  321.                 JR PRINT1STROKA
  322.  
  323. PRINT_DUMP      LD B,0x0F
  324.                 LD DE,X4DUMP*0x100+Y4DUMP
  325.                 LD HL,0
  326. PRINT1STROKA    CALL PRTT_SMESH
  327.                 LD A,0xC0
  328.                 OR H
  329.                 LD H,A
  330.                 CALL PRTT_STROKA
  331.                 LD A,H
  332.                 AND 0x3F
  333.                 LD H,A
  334.                 INC E
  335.                 LD D,X4DUMP
  336.                 DJNZ PRINT1STROKA
  337.                 RET
  338.  
  339. PRTT_STROKA     LD C,0x10
  340. PRTT_STROKA1    LD A,(HL)
  341.                 INC HL
  342.                 CALL PRTT_A_
  343.                 LD A,' '
  344.                 CALL PRTSYMTXTMODE
  345.                 DEC C
  346.                 JR NZ,PRTT_STROKA1
  347.                 RET
  348.  
  349. PRTT_SMESH      CALL PRTT_HL_
  350.                 LD A,':'
  351.                 CALL PRTSYMTXTMODE
  352.                 LD A,' '
  353.                 JR PRTSYMTXTMODE
  354.  
  355. PRTT_HL_        LD A,H
  356.                 CALL PRTT_A_
  357.                 LD A,L
  358. PRTT_A_         PUSH AF
  359.                 RRCA
  360.                 RRCA
  361.                 RRCA
  362.                 RRCA
  363.                 CALL PRTT_A_1
  364.                 POP AF
  365. PRTT_A_1        AND 0x0F
  366.                 CP 0x0A
  367.                 CCF
  368.                 ADC A,'0'
  369.                 DAA
  370.                 AND 0x7F
  371. ; печать символа на текстмодном экране
  372. ; D-X E-Y
  373. PRTSYMTXTMODE   PUSH DE
  374.                 PUSH HL
  375.                 LD L,A
  376.                 LD A,0
  377. TYPEFONT        EQU $-1
  378.                 AND A
  379.                 LD A,L
  380.                 JR NZ,.LOOP
  381.                 CP 0x80
  382.                 JR C,.LOOP
  383.                 LD HL,CONV_CP866_ATM
  384.                 PUSH BC
  385.                 RES 7,A
  386.                 LD B,0
  387.                 LD C,A
  388.                 ADD HL,BC
  389.                 LD A,(HL)
  390.                 POP BC
  391. .LOOP           PUSH AF
  392.                 LD L,E
  393.                 LD A,D
  394.                 LD H,0
  395.                 LD D,H
  396.                 ADD HL,HL
  397.                 ADD HL,HL
  398.                 ADD HL,HL
  399.                 ADD HL,HL
  400.                 ADD HL,HL
  401.                 ADD HL,HL
  402.                 LD E,A
  403.                 SRL E
  404.                 ADD HL,DE
  405.                 AND 1
  406.                 RRCA
  407.                 RRCA
  408.                 RRCA
  409.                 OR 0xC1
  410.                 LD D,A
  411.                 LD E,0xC0
  412.                 ADD HL,DE
  413.                 POP AF
  414.                 LD (HL),A
  415.                 POP HL
  416.                 POP DE
  417.                 INC D
  418.                 RET
  419.  
  420. SET_C_A         OUT (C),A
  421.                 RET
  422.  
  423. LOAD_CMOS       LD HL,0xC000
  424.                 LD D,0
  425. EDITCMOS1       EX DE,HL
  426.                 CALL READCMOS
  427.                 EX DE,HL
  428.                 LD (HL),E
  429.                 INC HL
  430.                 INC D
  431.                 LD A,0xF0
  432.                 CP D
  433.                 JR NZ,EDITCMOS1
  434.                 RET
  435.  
  436. SAVE_CMOS       LD HL,0xC000
  437.                 LD D,0
  438. SAVECMOS1       LD E,(HL)
  439.                 EX DE,HL
  440.                 CALL WRITECMOS
  441.                 EX DE,HL
  442.                 INC HL
  443.                 INC D
  444.                 LD A,0xF0
  445.                 CP D
  446.                 JR NZ,SAVECMOS1
  447.                 RET
  448.  
  449. ; на входе: H-адрес ячейки
  450. ;           L-прочитанное значение
  451. READCMOS        DI
  452.                 PUSH BC
  453.                 LD BC,PENT_CONF
  454.                 LD A,CMOS_ON                    ; разрешение доступа к кмосу
  455.                 OUT (C),A
  456.                 LD B,HIGH (CMOS_SET_ADR)
  457.                 OUT (C),H
  458.                 LD B,HIGH (CMOS_RD_WR)
  459.                 IN L,(C)
  460.                 LD A,CMOS_OFF                   ; запрет доступа к кмосу
  461.                 LD B,HIGH (PENT_CONF)
  462.                 OUT (C),A
  463.                 POP BC
  464.                 LD A,L
  465.                 AND A
  466.                 RET
  467.  
  468. ; на входе: H-адрес ячейки
  469. ;           L-что туда записать
  470. WRITECMOS
  471.         RST8 _CMOS_RW,_WRITE_CMOS
  472.                 RET
  473.  
  474. ; чтение версии FPGA или BOOTLOADER, если это пентева
  475. GET_VERS_EVO    LD C,L
  476.                 LD H,CMOS.READ_PS2
  477.                 CALL WRITECMOS                  ; пишем в адрес 0xF0 для получения версии
  478.                 CALL READCMOS                   ; читаем ответ
  479.                 CP C                            ; совпало с тем что записано, не поддерживается
  480.                 RET Z                           ; и это не пентева (или версия FPGA старая). выходим
  481.                 INC A                           ; пришел 0xFF, значит часов нету
  482.                 RET Z                           ; выходим
  483.                 DI
  484.                 DEC A                           ; возвращаем считанное значение
  485.                 PUSH DE
  486.                 LD (DE),A                       ; положили в буфер уже прочитанный байт
  487.                 INC DE
  488.                 LD B,0x0F                       ; осталось прочитать остальные еще 15 байт
  489. GVE1            INC H
  490.                 CALL READCMOS                   ; читаем байт
  491.                 LD (DE),A
  492.                 INC DE
  493.                 DJNZ GVE1                       ; читаем пока все байты не кончатся
  494.                 POP DE                          ; проверям в буфере 12 байт текста
  495.                 LD H,D
  496.                 LD L,E
  497.                 LD B,0x0C                       ; если текст короче ищем байт 0 (признак конца текста)
  498. GVE2            LD A,(DE)
  499.                 AND A
  500.                 JR Z,GVE3
  501.                 INC DE
  502.                 DJNZ GVE2
  503. GVE3            LD BC,0x0C                      ; забрали из буфера 2 байта даты в спецформате
  504.                 ADD HL,BC
  505.                 LD C,(HL)
  506.                 INC HL
  507.                 LD B,(HL)
  508.                 EX DE,HL
  509.                 LD (HL),' '                     ; добавляем к тексту пробел-разделитель
  510.                 INC HL
  511.  
  512. ;РАСПАКОВЩИК ДАТЫ
  513. UNVERS          LD A,C
  514.                 AND 0x1F                        ; нужны 5 бит-число месяца
  515.                 CALL A2TXT                      ; конверсия и укладка даты
  516.                 SRL B
  517.                 RR C                            ; сдвинули для целостности номера месяца
  518.                 LD A,C                          ; взяли биты месяца
  519.                 RRCA
  520.                 RRCA
  521.                 RRCA
  522.                 RRCA                            ; сдвинули в младшие биты
  523.                 AND 0x0F                        ; нам нужны только 4 бита месяца
  524.                 LD (HL),'.'                     ; разделительная точка
  525.                 INC HL
  526.                 CALL A2TXT                      ; конверсия и укладка месяца
  527.                 LD (HL),'.'                     ; разделительная точка
  528.                 INC HL
  529.                 LD (HL),'2'
  530.                 INC HL
  531.                 LD (HL),'0'                     ; добавили к году две циферки
  532.                 INC HL
  533.                 LD A,B                          ; взяли номер года
  534.                 AND 0x3F                        ; нужны только 6 бит
  535.                 CALL A2TXT                      ; конверсия и укладка года
  536.                 BIT 6,B                         ; если бит 6 (сдвинутый бит 7) установлен
  537.                 RET NZ                          ; то завершаем строку
  538.                 EX DE,HL                        ; иначе версия бета, о чем добавляем текст в буфер
  539.                 LD HL,TXT_BETA
  540.                 LD BC,5
  541.                 LDIR
  542.                 EX DE,HL
  543.                 RET
  544.  
  545. ; распечатка на экране времени, даты и дня недели
  546. PRINTTIME       LD A,(ERS_FLAGS)
  547.                 AND M_CLOCK_ON
  548.                 RET Z                           ; часы не обнаружены, выходим ничего не выводя
  549.                 LD H,CMOS.REG_C
  550.                 CALL READCMOS
  551.                 AND CMOSREG.M_C_RO_UF
  552.                 RET Z                           ; если время еще не обновилось, выходим ничего не выводя
  553.                 LD H,CMOS.BYTE_01
  554.                 CALL READCMOS
  555.                 AND CMOS_EC.M_CLOCK_VIEW
  556.                 JR NZ,VIDEOMODE                 ; отображение выключено, выходим ничего не выводя
  557.                 DI
  558.                 EXX
  559.                 LD BC,TXT_TIME                  ; чтение и преобразование времени
  560.                 LD H,CMOS.HOUR
  561.                 CALL READCMOS                   ; прочитали часы
  562.                 LD (SCRSAV.CURR+2),A
  563.                 CALL BYTE2TXT                   ; сконвертили часы с укладкой в буфер
  564.                 LD A,(BC)
  565.                 XOR ':'-' '                     ; конверсия мигающего двоеточия
  566.                 LD (BC),A
  567.                 INC BC
  568.                 LD H,CMOS.MINUTE
  569.                 CALL READCMOS                   ; прочитали минуты
  570.                 LD (SCRSAV.CURR+1),A
  571.                 CALL BYTE2TXT                   ; сконвертили часы с укладкой в буфер
  572.                 LD A,(BC)
  573.                 XOR ':'-' '                     ; конверсия мигающего двоеточия
  574.                 LD (BC),A
  575.                 INC BC
  576.                 LD H,CMOS.SECOND
  577.                 CALL READCMOS                   ; прочитали секунды
  578.                 LD (SCRSAV.CURR),A
  579.                 CALL BYTE2TXT
  580.                 LD BC,TXT_DATA                  ; далее чтение и преобразование даты
  581.                 LD H,CMOS.DAY_MONTH
  582.                 CALL READCMOS
  583.                 CALL BYTE2TXT
  584.                 INC BC
  585.                 LD H,CMOS.MONTH
  586.                 CALL READCMOS
  587.                 CALL BYTE2TXT
  588.                 INC BC
  589.                 LD H,CMOS.YEAR
  590.                 CALL READCMOS
  591.                 CALL BYTE2TXT
  592.                 LD HL,BUFF_TIME                 ; печатем время из буфера
  593.         RST8 _PRINT_MESSAGE
  594.                 EXX
  595.  
  596. VIDEOMODE       DI
  597.                 LD HL,CMOS.READ_PS2 << 8 + 3
  598.                 LD BC,PENT_CONF
  599.                 LD A,CMOS_ON                    ; разрешение доступа к кмосу
  600.                 OUT (C),A
  601.                 LD B,HIGH (CMOS_SET_ADR)
  602.                 OUT (C),H
  603.                 LD B,HIGH (CMOS_RD_WR)
  604.                 OUT (C),L
  605.                 LD A,CMOS_OFF                   ; запрет доступа к кмосу
  606.                 LD B,HIGH (PENT_CONF)
  607.                 OUT (C),A
  608.                 CALL READCMOS
  609.                 LD DE,TV_VGA
  610.                 PUSH AF
  611.                 AND %00110000
  612.                 RRCA
  613.                 RRCA
  614.                 LD C,A
  615.                 LD B,0
  616.                 LD HL,TXT_HZ
  617.                 ADD HL,BC
  618.                 LDI
  619.                 LDI
  620.                 LDI
  621.                 LDI
  622.                 INC DE
  623.                 POP AF
  624.                 BIT 0,A
  625.                 LD HL,TXT_TVVGA
  626.                 JR Z,VMODE1
  627.                 INC HL
  628.                 INC HL
  629.                 INC HL
  630. VMODE1          LDI
  631.                 LDI
  632.                 LDI
  633.                 LD HL,TXT_VMODE                 ; печатем текущий видео режим
  634.         RST8 _PRINT_MESSAGE
  635.                 RET
  636.  
  637. ; перевод "A" в десятичку и в текст
  638. A2TXT           PUSH HL
  639.                 LD L,A
  640.                 LD H,0
  641.                 LD DE,10
  642.                 XOR A
  643.                 DEC A
  644.                 INC A
  645.                 SBC HL,DE
  646.                 JR NC,$-3
  647.                 ADD HL,DE
  648.                 ADD A,'0'
  649.                 LD D,A
  650.                 LD A,L
  651.                 ADD A,'0'
  652.                 POP HL
  653.                 LD (HL),D
  654.                 INC HL
  655.                 LD (HL),A
  656.                 INC HL
  657.                 RET
  658.  
  659. BYTE2TXT        LD L,A
  660.                 LD H,'0'
  661.                 RRCA
  662.                 RRCA
  663.                 RRCA
  664.                 RRCA
  665.                 AND 0x0F
  666.                 ADD A,H
  667.                 LD (BC),A
  668.                 INC BC
  669.                 LD A,L
  670.                 AND 0x0F
  671.                 ADD A,H
  672.                 LD (BC),A
  673.                 INC BC
  674.                 RET
  675.  
  676. TXTMODE_ON
  677.         PEC_ON M_SHADOW_BF
  678.                 LD BC,0xFF77
  679.                 LD A,0xA6
  680.                 CALL SET_C_A
  681.         PEC_OFF M_SHADOW_BF
  682.                 RET
  683.  
  684. TXTMODE_OFF
  685.         PEC_ON M_SHADOW_BF
  686.                 LD BC,0xFF77
  687.                 LD A,0xA3
  688.                 CALL SET_C_A
  689.         PEC_OFF M_SHADOW_BF
  690.                 RET
  691.  
  692. CHECK_SCREENSAVER
  693.                 LD A,(SCRSAV.TIMEOUT)
  694.                 AND A
  695.                 RET Z
  696.                 PUSH AF
  697.                 LD HL,SCRSAV.CURR
  698.                 LD DE,(SCRSAV.START)
  699.                 LD BC,(SCRSAV.START+2)
  700.                 CALL BCDEHLM
  701.                 POP AF
  702.                 CP D
  703.                 RET NZ
  704.                 LD A,B
  705.                 OR E
  706.                 RET NZ
  707.                 CALL START_SONGLN
  708. RESET_SCREENSAVER
  709.                 LD DE,SCRSAV.START
  710.                 LD H,CMOS.SECOND
  711.                 CALL READCMOS
  712.                 LD (DE),A
  713.                 INC DE
  714.                 LD H,CMOS.MINUTE
  715.                 CALL READCMOS
  716.                 LD (DE),A
  717.                 INC DE
  718.                 LD H,CMOS.HOUR
  719.                 CALL READCMOS
  720.                 LD (DE),A
  721.                 INC DE
  722.                 XOR A
  723.                 LD (DE),A
  724.                 RET
  725.